Завершение уведомления о выборочной приостановке простоя NDIS

NDIS вызывает функцию обработчика MiniportIdleNotification , чтобы уведомить драйвер о том, что базовый сетевой адаптер неактивен. Дополнительные сведения об этой операции см. в разделе Обработка уведомления о выборочной приостановке простоя NDIS.

После выдачи уведомления о бездействии драйвер мини-порта завершает уведомление о выборочной приостановке простоя NDIS при следующих условиях:

  • NDIS отменяет уведомление о простое, вызывая функцию обработчика MiniportCancelIdleNotification базового драйвера минипорта.

  • Драйвер минипорта самостоятельно завершает уведомление о простое. Причины этого зависят от конструкции и требований драйвера и адаптера. Например, драйвер может завершить уведомление о бездействии, если обнаружит действие приема в сетевом адаптере.

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

В любом случае драйвер мини-порта должен завершить уведомление о бездействии, чтобы вернуть адаптер в состояние полного питания. Чтобы завершить уведомление о бездействии, водитель минипорта должен отменить все пакеты запросов ввода-вывода, относящиеся к шине, которые ранее были выданы для уведомления о простое. Наконец, драйвер вызывает NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что сетевой адаптер может быть переведен в состояние полной мощности.

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

  1. Драйвер минипорта отменяет ожидающий запрос на простой USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP. Драйвер мини-порта ранее выдал этот IRP базовому драйверу шины USB, когда NDIS вызвал функцию MiniportIdleNotification водителя. Драйвер минипорта отменяет этот IRP, вызывая IoCancelIrp.

  2. Когда водитель автобуса отменяет IRP-запрос бездействия USB, он вызывает подпрограмму завершения водителя минипорта для IRP. Этот вызов уведомляет драйвер о том, что IRP завершен и сетевой адаптер может перейти в состояние полного питания. В контексте процедуры завершения драйвер вызывает NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что сетевой адаптер может быть переведен в состояние полного питания.

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

Примечание В зависимости от зависимостей для отмены запросов бездействия для конкретной шины драйвер мини-порта вызывает NdisMIdleNotificationComplete либо синхронно в контексте вызова MiniportCancelIdleNotification , либо асинхронно после возврата MiniportCancelIdleNotification .

После того как водитель минипорта отменяет все зависящие от шины IRP для уведомления о простое, он вызывает NdisMIdleNotificationComplete. Этот вызов уведомляет NDIS о том, что уведомление о бездействии завершено. Затем NDIS завершает операцию выборочной приостановки, переводя сетевой адаптер в состояние полной мощности.

При вызове NdisMIdleNotificationComplete NDIS выполняет следующие действия:

  1. Проблемы NDIS IRP_MN_SET_POWER базовому водителю автобуса. Этот IRP запрашивает у драйвера шины состояние питания сетевого адаптера PowerDeviceD0.

  2. NDIS выдает запрос на набор идентификатора объекта (OID) OID_PNP_SET_POWER драйверу мини-порта. В этом запросе OID NDIS указывает, что сетевой адаптер теперь переходит в состояние полной мощности NdisDeviceStateD0.

    При обработке этого запроса на набор OID драйвер подготавливает адаптер к работе с полной мощностью. Сюда входит восстановление обработчиков приема и отправки в том же состоянии, в которое они находились до перехода в маломощное состояние. Затем драйвер завершает запрос OID с NDIS_STATUS_SUCCESS.

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

Схема, иллюстрирующая шаги, связанные с завершением уведомления о бездействии сетевого адаптера USB.

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