Отмена уведомления о выборочной приостановке простоя NDIS
Если сетевой адаптер становится неактивным в течение периода простоя, NDIS запускает операцию выборочной приостановки. Благодаря этой операции сетевой адаптер переходит в состояние с низким энергопотреблением. NDIS начинает эту операцию с отправки уведомления о бездействии драйверу мини-порта. Дополнительные сведения об этой операции см. в разделе Обработка уведомления о выборочной приостановке простоя NDIS.
NDIS вызывает функцию обработчика MiniportIdleNotification , чтобы уведомить драйвер о том, что базовый сетевой адаптер неактивен. После выдачи уведомления о бездействии NDIS отменяет ожидающее уведомление о простое, если выполняется одно или несколько из следующих условий:
Драйвер избыточного протокола или фильтра выдает запрос на отправку пакета или запрос идентификатора объекта (OID) к драйверу мини-порта.
Дополнительные сведения о том, как NDIS отменяет уведомление о простое для этого сценария, см. в разделе Отмена уведомления о простое из-за превышения активности драйвера.
Базовый адаптер сигнализирует о событии пробуждения, например о получении пакета или обнаружении изменения состояния подключения к мультимедиа.
Дополнительные сведения о том, как NDIS отменяет уведомление о простое для этого сценария, см. в разделе Отмена уведомления о простое из-за событий пробуждения.
NDIS отменяет уведомление о простое, вызывая функцию обработчика MiniportCancelIdleNotification базового драйвера минипорта. При вызове этой функции драйвер мини-порта должен завершить уведомление о бездействии, чтобы возобновить работу адаптера в состояние полного питания. Рекомендации по этому процессу см. в разделе Завершение уведомления о выборочной приостановке простоя NDIS.
Дополнительные сведения о реализации функции обработчика MiniportCancelIdleNotification см. в разделе Реализация функции обработчика MiniportCancelIdleNotification.
Отмена уведомления о простое из-за превышения активности драйвера
Мониторы NDIS отправляют запросы и запросы OID, которые выдаются драйверу мини-порта, сетевой адаптер которого приостановлен и находится в низком энергопотреблении. В этом случае NDIS отменяет незавершенное уведомление о простое, чтобы сетевой адаптер смог вернуться в состояние полного питания.
При отмене уведомления об отмене простоя NDIS и драйвер мини-порта выполните следующие действия.
NDIS вызывает функцию обработчика MiniportCancelIdleNotification , чтобы отменить незавершенное уведомление о простое. При вызове этой функции обработчика драйвер мини-порта должен отменить все пакеты запросов ввода-вывода, относящиеся к шине, которые он мог выдать ранее для уведомления о простое.
Например, при вызове MiniportCancelIdleNotification минипорт для сетевого адаптера USB выполняет следующие действия:
Драйвер минипорта отменяет ожидающий запрос на простой USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP. Драйвер мини-порта ранее выдал этот IRP базовому драйверу шины USB, когда NDIS вызвал функцию MiniportIdleNotification водителя. Драйвер минипорта отменяет этот IRP, вызывая IoCancelIrp.
Когда водитель автобуса отменяет IRP-запрос бездействия USB, он вызывает подпрограмму завершения водителя минипорта для IRP. Этот вызов уведомляет драйвер о том, что IRP завершен и сетевой адаптер может перейти в состояние полного питания. В контексте процедуры завершения драйвер вызывает NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что сетевой адаптер может быть переведен в состояние полного питания.
Примечание В зависимости от зависимостей для отмены запросов бездействия для конкретной шины драйвер мини-порта вызывает NdisMIdleNotificationComplete либо синхронно в контексте вызова MiniportCancelIdleNotification , либо асинхронно после возврата MiniportCancelIdleNotification .
Дополнительные сведения о том, как реализовать подпрограмму завершения IRP запроса простоя USB, см. в разделе Реализация процедуры завершения IRP бездействующих запросов USB.
После того как водитель минипорта отменяет все зависящие от шины 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.
На следующем рисунке показаны действия, которые выполняются при отмене NDIS уведомления о бездействии, выданного драйверу мини-порта для сетевого адаптера USB.
Отмена уведомления о простое из-за событий пробуждения
Перед переходом сетевого адаптера в состояние с низким энергопотреблением NDIS отправляет запрос на набор OID OID_PM_PARAMETERS сетевому адаптеру. Этот запрос OID определяет типы событий пробуждения, которые адаптер может сигнализировать о возобновлении работы в полнофункциональное состояние. Для выборочной приостановки NDIS адаптер настроен так, чтобы сигнализировать о любом из следующих событий пробуждения:
Получение пакета, соответствующего фильтру, который ранее был настроен с помощью запроса на набор OID OID_PM_ADD_WOL_PATTERN или OID_GEN_CURRENT_PACKET_FILTER.
Изменение состояния подключения к мультимедиа на адаптере.
NDIS и драйвер минипорта выполните следующие действия, когда NDIS отменяет уведомление о простое из-за сигнала пробуждения, созданного сетевым адаптером:
Водитель автобуса завершает IRP_MN_WAIT_WAKE , выданный NDIS, перед переходом адаптера в маломощное состояние. Завершив IRP, водитель шины уведомляет NDIS о том, что сетевой адаптер создал сигнал пробуждения.
NDIS вызывает функцию обработчика MiniportCancelIdleNotification , чтобы начать операцию отмены уведомления о простое. Действия, которые участвуют в этой операции, аналогичны действиям, описанным в разделе Отмена уведомления о простое из-за превышения активности драйвера.
Например, на следующем рисунке показаны действия, которые выполняются при отмене уведомления о простое NDIS из-за события пробуждения, сигнального сетевым адаптером USB.