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


Реализация процедуры обратного вызова IRP бездействующих запросов USB

При вызове MiniportIdleNotification драйвер USB-минипорта вызывает IoCallDriver , чтобы выдать пакет запроса ввода-вывода (IRP) для запроса простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) базовому драйверу USB-шины. Драйвер мини-порта выдает этот IRP, чтобы сообщить драйверу шины USB о том, что сетевой адаптер находится в состоянии простоя и должен быть приостановлен.

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

Примечание После того как драйвер шины USB обрабатывает IRP бездействующего запроса USB, он вызывает подпрограмму обратного вызова либо синхронно в контексте вызова IoCallDriver , либо асинхронно после возврата MiniportIdleNotification .

Подпрограмма обратного вызова должна вызывать только NdisMIdleNotificationConfirm , чтобы уведомить NDIS о том, что она может продолжить переход состояния с низким энергопотреблением сетевого адаптера. Когда драйвер вызывает NdisMIdleNotificationConfirm, он также должен указать наименьшее состояние питания устройства, в которое может перейти сетевой адаптер.

В контексте вызова NdisMIdleNotificationConfirm NDIS выполняет действия, необходимые для перевода сетевого адаптера в состояние с низким энергопотреблением. Дополнительные сведения см. в разделе Обработка уведомления NDIS о выборочной приостановке простоя.

Ниже приведен пример процедуры обратного вызова для IRP бездействующего запроса USB.

//
// MiniportUsbIdleRequestCallback()
//
// This is the USB selective suspend idle notification.  All that is 
// needed is to inform NDIS that the USB stack is ready to go to a 
// low-power state.  Be aware that USB devices will always be requested
// to transition to a power state of NdisDeviceStateD2.
//
VOID MiniportUsbIdleRequestCallback(PVOID AdapterContext)
{
    NdisMIdleNotificationConfirm(
        AdapterContext->MiniportAdapterHandle,
        NdisDeviceStateD2
        );

    return;
}

Дополнительные сведения о процедуре обратного вызова неактивного запроса USB см. в статье Процедура обратного вызова IRP бездействуемого запроса USB.