Поделиться через


Обработка запросов на питание к периферийным устройствам хранилища

Драйвер класса хранения отвечает за выдачу команд, относящихся к устройству, для обработки запросов на питание. Чаще всего драйвер класса хранения:

  • Блокирует ввод-вывод на устройство в ответ на запрос на питание запроса (IRP_MJ_POWER с IRP_MN_QUERY_POWER), если обработка таких операций ввода-вывода может помешать драйверу выполнить запрос на настройку питания в разумный промежуток времени.

  • Задает состояние питания устройства в ответ на запрос set-power (IRP_MJ_POWER с IRP_MN_SET_POWER)

  • Перезапускает устройство ввода-вывода в ответ на запрос на включение питания устройства.

  • Перенаправит запросы на питание следующему ниже драйверу.

Обратите внимание, что драйвер должен вызывать PoStartNextPowerIrp и PoCallDriver, а не IoCallDriver, чтобы отправлять запросы на питание.

Если драйвер класса хранения не имеет подпрограммы StartIo , он должен заблокировать очередь драйвера порта хранения данных (IRP_MJ_SCSI с SRB_FUNCTION_LOCK_QUEUE) перед настройкой состояния питания устройства, чтобы блокировать несинхронизированные операции до завершения операции питания (которая может включать несколько шагов). Все SSP, выданные для обработки операции питания, должны задавать SRB_FLAGS_BYPASS_LOCKED_QUEUE, чтобы убедиться, что они достигают драйвера порта. После завершения настройки состояния питания драйвер должен разблокировать очередь (IRP_MJ_SCSI с SRB_FUNCTION_UNLOCK_QUEUE и SRB_FLAGS_BYPASS_LOCKED_QUEUE), чтобы драйвер порта смог возобновить отправку очередей irP на устройство после включения.

Если в драйвере класса хранения есть подпрограмма StartIo , эта подпрограмма обрабатывает синхронизацию, поэтому драйверу класса не нужно явно блокировать и разблокировать очередь LU драйвера порта.

Драйвер класса не должен пытаться обойти очередь, заблокированную другим драйвером.