Gestione delle richieste di alimentazione alle periferiche di archiviazione

Un driver della classe di archiviazione è responsabile dell'emissione di comandi specifici del dispositivo per gestire le richieste di alimentazione. In genere, un driver di classe di archiviazione:

  • Blocca l'I/O sul dispositivo in risposta a una query di gestione dell'energia (IRP_MJ_POWER con IRP_MN_QUERY_POWER) se la gestione di tali operazioni di I/O potrebbe impedire al driver di completare una richiesta di impostazione della potenza in un periodo di tempo ragionevole

  • Imposta lo stato di alimentazione del dispositivo in risposta a una richiesta di impostazione della potenza (IRP_MJ_POWER con IRP_MN_SET_POWER)

  • Riavvia l'I/O sul dispositivo in risposta a una richiesta di attivazione dell'alimentazione per accendere il dispositivo

  • Inoltra le richieste di alimentazione al driver inferiore successivo.

Si noti che un driver deve chiamare PoStartNextPowerIrp e PoCallDriver, non IoCallDriver, per inviare richieste di alimentazione.

A meno che il driver di classe di archiviazione non abbia una routine StartIo, dovrebbe bloccare la coda specifica del driver della porta di archiviazione (IRP_MJ_SCSI con SRB_FUNCTION_LOCK_QUEUE) prima di impostare lo stato di alimentazione del dispositivo, al fine di bloccare eventuali operazioni non sincronizzate, fino al completamento dell'operazione di alimentazione che può coinvolgere diversi passaggi. Eventuali SBS emessi per gestire l'operazione di alimentazione devono impostare SRB_FLAGS_BYPASS_LOCKED_QUEUE per assicurarsi che raggiungano il driver di porta. Al termine dell'impostazione dello stato di alimentazione del dispositivo, il driver dovrebbe sbloccare la coda (IRP_MJ_SCSI con SRB_FUNCTION_UNLOCK_QUEUE e SRB_FLAGS_BYPASS_LOCKED_QUEUE) in modo che il driver della porta possa riprendere l'invio di IRP in coda al dispositivo dopo che il dispositivo è stato alimentato.

Se un driver della classe di archiviazione ha una routine StartIo , questa routine gestisce la sincronizzazione in modo che il driver di classe non debba bloccare e sbloccare in modo esplicito la coda specifica del driver di porta.

Un driver di classe non deve tentare di bypassare una coda bloccata da un altro driver.