Avvio rapido da uno stato di Low-Power
Per ottenere un avvio rapido da uno stato a basso consumo, un driver per un dispositivo a nodo foglia deve gestire un IRP di alimentazione S0 , ovvero un IRP_MN_SET_POWER IRP per lo stato di alimentazione del sistema S0. I dispositivi che sono nodi foglia nella gerarchia dei dispositivi non hanno dispositivi figlio. Poiché un dispositivo foglia-nodo non ha dipendenze dai dispositivi figlio, il driver funzionale per il dispositivo può reinizializzare il dispositivo come attività in background per evitare ritardi non necessari per il sistema operativo o per altri driver. Al contrario, i driver del bus hanno dipendenze che richiedono logica di sincronizzazione aggiuntiva per coordinare le sequenze di alimentazione con i dispositivi figlio.
Usare la procedura seguente per ottenere l'avvio rapido di un dispositivo a nodo foglia da uno stato a basso consumo:
Impostare una routine di completamento per L'IRP di alimentazione S0.
Inviare l'IRP di alimentazione S0 nello stack di dispositivi.
Completare immediatamente l'IRP di alimentazione S0 anziché attendere il completamento dell'IRP di alimentazione D0. Quando viene eseguita la routine di completamento per l'IRP di alimentazione S0, eseguire le operazioni seguenti:
Richiedere un IRP di alimentazione D0, ovvero un IRP_MN_SET_POWER IRP per lo stato di alimentazione del dispositivo D0.
Restituire STATUS_SUCCESS alla routine di completamento per L'IRP di alimentazione S0.
Il driver deve accodare tutte le richieste di I/O ricevute, ma posticiparne la gestione fino al termine dell'elaborazione dell'IRP di alimentazione D0.
Quando viene eseguita la routine di completamento per l'IRP di alimentazione D0, inizializzare il dispositivo, ma limitare questa routine a ciò che è necessario per rendere il dispositivo pronto per l'uso.
Al termine dei passaggi precedenti, il driver può iniziare a gestire le richieste di I/O, incluse eventuali richieste di I/O già accodate.
Nota I passaggi precedenti non si applicano alla gestione dei provider di integrazione di alimentazione per uno stato di alimentazione diverso da PowerSystemWorking (S0). Questi passaggi si applicano in modo specifico alla gestione dei runtime di integrazione di alimentazione per le transizioni da uno stato a basso consumo allo stato di accensione (S0).
L'avvio del sistema viene completato dopo che tutti i dispositivi hanno completato i runtime di integrazione di alimentazione S0. Questi dispositivi non sono necessari, al completamento dell'avvio del sistema, per aver completato i runtime di integrazione di alimentazione D0 o per funzionare completamente. Il gestore di alimentazione del kernel ha un set limitato di code di invio IRP e deve usare queste code per notificare a tutti i dispositivi nel sistema il ritorno allo stato S0. I driver che non riescono a completare rapidamente i runtime di integrazione di alimentazione S0 impediscono ai driver di altri dispositivi di ricevere i provider di integrazione di alimentazione S0. Pertanto, i driver progettati in modo non adeguato compromettono le prestazioni complessive di avvio del sistema causando l'esecuzione seriale delle operazioni del driver che devono essere eseguite simultaneamente.
Dopo che un driver ha completato l'IRP di alimentazione S0, potrebbe ricevere richieste di I/O dalle applicazioni che hanno aperto handle al dispositivo. I driver non devono mai avere esito negativo per queste richieste di I/O perché ciò potrebbe causare l'arresto delle applicazioni e la generazione di messaggi di errore di timeout. I driver devono invece accodare le richieste di I/O fino a quando il dispositivo non è pronto per elaborarli.
Un driver del bus può ottenere un avvio rapido da uno stato a basso consumo usando una tecnica simile a quella appena descritta per il driver di un dispositivo a nodo foglia. Un driver del bus deve soddisfare un requisito aggiuntivo, che consiste nel garantire che le richieste da dispositivi figlio per entrare nello stato D0 siano contrassegnate come in sospeso e non vengano completate dal driver del bus fino a quando il dispositivo bus non ha immesso lo stato D0.
Ad esempio, quando il driver del bus per un hub USB riceve un IRP di alimentazione S0, il driver richiede un IRP di alimentazione D0 e completa L'IRP di alimentazione S0 dopo aver ricevuto l'IRP di alimentazione D0 richiesta. Tuttavia, dopo il completamento dell'IRP di alimentazione S0, è probabile che i dispositivi figlio dell'hub inizino a ricevere i provider di integrazione di alimentazione S0 e richiedano IP di alimentazione D0. Il driver del bus deve impedire ai dispositivi figlio di entrare in D0 fino a quando il dispositivo hub non entra in D0. Pertanto, il driver del bus deve contrassegnare tutti i punti di integrazione di alimentazione D0 dai dispositivi figlio come in sospeso e attendere il completamento di questi IRP fino al completamento della gestione dell'IRP di alimentazione D0 per l'hub e il dispositivo hub viene completamente inizializzato.
Per altre informazioni sui runtime di integrazione di alimentazione, vedere gli argomenti seguenti:
Gestione delle IRP_MN_SET_POWER per gli stati di alimentazione del sistema
Gestione delle IRP_MN_SET_POWER per gli stati di alimentazione dei dispositivi