Завершение уведомления о выборочной приостановке простоя NDIS
NDIS вызывает функцию обработчика MiniportIdleNotification , чтобы уведомить драйвер о том, что базовый сетевой адаптер неактивен. Дополнительные сведения об этой операции см. в разделе Обработка уведомления о выборочной приостановке простоя NDIS.
После выдачи уведомления о бездействии драйвер мини-порта завершает уведомление о выборочной приостановке простоя NDIS при следующих условиях:
NDIS отменяет уведомление о простое, вызывая функцию обработчика MiniportCancelIdleNotification базового драйвера минипорта.
Драйвер минипорта самостоятельно завершает уведомление о простое. Причины этого зависят от конструкции и требований драйвера и адаптера. Например, драйвер может завершить уведомление о бездействии, если обнаружит действие приема в сетевом адаптере.
Примечание Драйвер мини-порта не может явным образом отменить уведомление о бездействии. Когда NDIS отменяет уведомление о бездействии, драйвер мини-порта должен завершить уведомление, как описано в этом разделе. Дополнительные сведения см. в разделе Отмена уведомления о выборочной приостановке простоя NDIS.
В любом случае драйвер мини-порта должен завершить уведомление о бездействии, чтобы вернуть адаптер в состояние полного питания. Чтобы завершить уведомление о бездействии, водитель минипорта должен отменить все пакеты запросов ввода-вывода, относящиеся к шине, которые ранее были выданы для уведомления о простое. Наконец, драйвер вызывает NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что сетевой адаптер может быть переведен в состояние полной мощности.
Например, драйвер мини-порта для сетевого адаптера USB завершает уведомление о бездействии, выполнив следующие действия.
Драйвер минипорта отменяет ожидающий запрос на простой USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP. Драйвер мини-порта ранее выдал этот IRP базовому драйверу шины USB, когда NDIS вызвал функцию MiniportIdleNotification водителя. Драйвер минипорта отменяет этот IRP, вызывая IoCancelIrp.
Когда водитель автобуса отменяет IRP-запрос бездействия USB, он вызывает подпрограмму завершения водителя минипорта для IRP. Этот вызов уведомляет драйвер о том, что IRP завершен и сетевой адаптер может перейти в состояние полного питания. В контексте процедуры завершения драйвер вызывает NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что сетевой адаптер может быть переведен в состояние полного питания.
Дополнительные сведения о том, как реализовать подпрограмму завершения IRP запроса простоя USB, см. в разделе Реализация процедуры завершения IRP бездействующих запросов USB.
Примечание В зависимости от зависимостей для отмены запросов бездействия для конкретной шины драйвер мини-порта вызывает NdisMIdleNotificationComplete либо синхронно в контексте вызова MiniportCancelIdleNotification , либо асинхронно после возврата MiniportCancelIdleNotification .
После того как водитель минипорта отменяет все зависящие от шины IRP для уведомления о простое, он вызывает NdisMIdleNotificationComplete. Этот вызов уведомляет NDIS о том, что уведомление о бездействии завершено. Затем NDIS завершает операцию выборочной приостановки, переводя сетевой адаптер в состояние полной мощности.
При вызове NdisMIdleNotificationComplete NDIS выполняет следующие действия:
Проблемы NDIS IRP_MN_SET_POWER базовому водителю автобуса. Этот IRP запрашивает у драйвера шины состояние питания сетевого адаптера PowerDeviceD0.
NDIS выдает запрос на набор идентификатора объекта (OID) OID_PNP_SET_POWER драйверу мини-порта. В этом запросе OID NDIS указывает, что сетевой адаптер теперь переходит в состояние полной мощности NdisDeviceStateD0.
При обработке этого запроса на набор OID драйвер подготавливает адаптер к работе с полной мощностью. Сюда входит восстановление обработчиков приема и отправки в том же состоянии, в которое они находились до перехода в маломощное состояние. Затем драйвер завершает запрос OID с NDIS_STATUS_SUCCESS.
На следующем рисунке показаны действия, которые необходимо выполнить, когда драйвер мини-порта завершает уведомление о бездействии сетевого адаптера USB.
Примечание Когда драйвер мини-порта завершает уведомление о бездействии, он не должен вызывать NdisMIdleNotificationConfirm для уведомления о простое, которое ранее было завершено с помощью вызова NdisMIdleNotificationComplete.