Inicialização rápida de um estado de Low-Power
Para obter uma inicialização rápida de um estado de baixa potência, um driver para um dispositivo de nó folha deve lidar com um IRP de energia S0 (ou seja, um IRP IRP_MN_SET_POWER para o estado de energia do sistema S0). Os dispositivos que são nós folha na hierarquia do dispositivo não têm dispositivos filho. Como um dispositivo de nó folha não tem dependências em dispositivos filho, o driver funcional do dispositivo pode reinicializar o dispositivo como uma tarefa em segundo plano para evitar causar atrasos desnecessários ao sistema operacional ou a outros drivers. Por outro lado, os drivers de barramento têm dependências que exigem lógica de sincronização adicional para coordenar sequências de ativação com seus dispositivos filho.
Use as seguintes etapas para obter a inicialização rápida de um dispositivo de nó folha de um estado de baixa potência:
Defina uma rotina de conclusão para o IRP de energia S0.
Envie o IRP de energia S0 para baixo na pilha do dispositivo.
Conclua o IRP de energia S0 imediatamente em vez de aguardar até que o IRP de energia D0 seja concluído. Quando a rotina de conclusão do IRP de energia S0 for executada, faça o seguinte:
Solicite um IRP de energia D0 (ou seja, um IRP IRP_MN_SET_POWER para o estado de energia do dispositivo D0).
Retorne STATUS_SUCCESS à rotina de conclusão do IRP de energia S0.
O driver deve enfileirar todas as solicitações de E/S recebidas, mas adiar o tratamento de qualquer uma dessas solicitações até concluir o processamento do IRP de energia D0.
Quando a rotina de conclusão do IRP de energia D0 for executada, inicialize o dispositivo, mas limite essa rotina ao que é necessário para deixar o dispositivo pronto para uso.
Depois que as etapas anteriores forem concluídas, o driver poderá começar a lidar com solicitações de E/S, incluindo quaisquer solicitações de E/S que já possam estar na fila.
Nota As etapas anteriores não se aplicam à manipulação de IRPs de energia para qualquer estado de energia diferente de PowerSystemWorking (S0). Essas etapas se aplicam especificamente à manipulação de IRPs de energia para transições de um estado de baixa potência para o estado de ativação (S0).
Uma inicialização do sistema é concluída depois que todos os dispositivos tiverem concluído seus IRPs de energia S0. Esses dispositivos não são necessários, na conclusão da inicialização do sistema, ter concluído seus IRPs de energia D0 ou estar funcionando totalmente. O gerenciador de energia do kernel tem um conjunto limitado de filas de expedição de IRP e deve usar essas filas para notificar todos os dispositivos no sistema do retorno ao estado S0. Os drivers que não conseguem concluir rapidamente seus IRPs de energia S0 impedem que os drivers de outros dispositivos recebam seus IRPs de energia S0. Assim, os drivers mal projetados prejudicam o desempenho geral de inicialização do sistema, fazendo com que as operações de driver que devem ser executadas simultaneamente sejam executadas em série.
Depois que um driver concluir seu IRP de energia S0, ele poderá receber solicitações de E/S de aplicativos que abriram identificadores para o dispositivo. Os drivers nunca devem falhar nessas solicitações de E/S porque isso pode fazer com que os aplicativos parem de responder e produzam mensagens de erro de tempo limite. Em vez disso, os drivers devem enfileirar solicitações de E/S até que o dispositivo esteja pronto para processá-las.
Um motorista de ônibus pode obter uma inicialização rápida de um estado de baixa potência usando uma técnica semelhante à que acabou de ser descrita para o driver de um dispositivo de nó folha. Um motorista de ônibus deve atender a um requisito adicional, que é garantir que todas as solicitações de dispositivos filho para entrar no estado D0 sejam marcadas como pendentes e não sejam concluídas pelo motorista do ônibus até que o dispositivo de ônibus entre no estado D0.
Por exemplo, quando o driver de barramento de um hub USB recebe um IRP de energia S0, o driver solicita um IRP de energia D0 e conclui o IRP de energia S0 após receber o IRP de energia D0 solicitado. No entanto, depois que o IRP de energia S0 for concluído, é provável que os dispositivos filho do hub comecem a receber seus IRPs de energia S0 e solicitar IRPs de energia D0. O driver do barramento deve impedir que os dispositivos filho insiram D0 até que o dispositivo hub insira D0. Portanto, o motorista do barramento deve marcar todos os IRPs de energia D0 de dispositivos filho como pendentes e aguardar para concluir esses IRPs até que o motorista do ônibus termine de lidar com o IRP de energia D0 para o hub e o dispositivo hub seja totalmente inicializado.
Para obter mais informações sobre o power IRPs, consulte os seguintes tópicos:
Manipulando IRP_MN_SET_POWER para estados de energia do sistema
Manipulando IRP_MN_SET_POWER para estados de energia do dispositivo