Control de solicitudes de energía a periféricos de almacenamiento
Un controlador de clase de almacenamiento es responsable de emitir comandos específicos del dispositivo para controlar las solicitudes de energía. Normalmente, un controlador de clase de almacenamiento:
Bloquea la E/S a su dispositivo en respuesta a una solicitud de alimentación de consulta (IRP_MJ_POWER con IRP_MN_QUERY_POWER) si controlar dicha E/S podría impedir que el controlador realice correctamente una solicitud de energía establecida en un período de tiempo razonable.
Establece el estado de alimentación de su dispositivo en respuesta a una solicitud set-power (IRP_MJ_POWER con IRP_MN_SET_POWER)
Reinicia la E/S en su dispositivo en respuesta a una solicitud de configuración de energía para encender el dispositivo.
Reenvía las solicitudes de energía al siguiente controlador inferior.
Tenga en cuenta que un controlador debe llamar a PoStartNextPowerIrp y PoCallDriver, no IoCallDriver, para enviar solicitudes de energía.
A menos que el controlador de clase de almacenamiento tenga una rutina StartIo , debe bloquear la cola específica de LU del controlador de puerto de almacenamiento (IRP_MJ_SCSI con SRB_FUNCTION_LOCK_QUEUE) antes de establecer el estado de energía del dispositivo, para bloquear las operaciones no sincronizadas hasta que se complete la operación de alimentación (que puede implicar varios pasos). Los SRB emitidos para controlar la operación de alimentación deben establecer SRB_FLAGS_BYPASS_LOCKED_QUEUE para asegurarse de que llegan al controlador de puerto. Una vez que el controlador termine de establecer el estado de energía, debe desbloquear la cola (IRP_MJ_SCSI con SRB_FUNCTION_UNLOCK_QUEUE y SRB_FLAGS_BYPASS_LOCKED_QUEUE) para que el controlador de puerto pueda reanudar el envío de IRP en cola al dispositivo una vez que se haya encendido.
Si un controlador de clase de almacenamiento tiene una rutina StartIo , esa rutina controla la sincronización para que el controlador de clase no tenga que bloquear y desbloquear explícitamente la cola específica de LU del controlador de puerto.
Un controlador de clase no debe intentar omitir una cola bloqueada por otro controlador.