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

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

NDIS вызывает функцию обработчика MiniportIdleNotification , чтобы уведомить драйвер о том, что базовый сетевой адаптер неактивен. После выдачи уведомления о бездействии NDIS отменяет ожидающее уведомление о простое, если выполняется одно или несколько из следующих условий:

NDIS отменяет уведомление о простое, вызывая функцию обработчика MiniportCancelIdleNotification базового драйвера минипорта. При вызове этой функции драйвер мини-порта должен завершить уведомление о бездействии, чтобы возобновить работу адаптера в состояние полного питания. Рекомендации по этому процессу см. в разделе Завершение уведомления о выборочной приостановке простоя NDIS.

Дополнительные сведения о реализации функции обработчика MiniportCancelIdleNotification см. в разделе Реализация функции обработчика MiniportCancelIdleNotification.

Отмена уведомления о простое из-за превышения активности драйвера

Мониторы NDIS отправляют запросы и запросы OID, которые выдаются драйверу мини-порта, сетевой адаптер которого приостановлен и находится в низком энергопотреблении. В этом случае NDIS отменяет незавершенное уведомление о простое, чтобы сетевой адаптер смог вернуться в состояние полного питания.

При отмене уведомления об отмене простоя NDIS и драйвер мини-порта выполните следующие действия.

  1. NDIS вызывает функцию обработчика MiniportCancelIdleNotification , чтобы отменить незавершенное уведомление о простое. При вызове этой функции обработчика драйвер мини-порта должен отменить все пакеты запросов ввода-вывода, относящиеся к шине, которые он мог выдать ранее для уведомления о простое.

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

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

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

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

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

  2. После того как водитель минипорта отменяет все зависящие от шины 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.

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

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

Отмена уведомления о простое из-за событий пробуждения

Перед переходом сетевого адаптера в состояние с низким энергопотреблением NDIS отправляет запрос на набор OID OID_PM_PARAMETERS сетевому адаптеру. Этот запрос OID определяет типы событий пробуждения, которые адаптер может сигнализировать о возобновлении работы в полнофункциональное состояние. Для выборочной приостановки NDIS адаптер настроен так, чтобы сигнализировать о любом из следующих событий пробуждения:

  • Получение пакета, соответствующего фильтру, который ранее был настроен с помощью запроса на набор OID OID_PM_ADD_WOL_PATTERN или OID_GEN_CURRENT_PACKET_FILTER.

  • Изменение состояния подключения к мультимедиа на адаптере.

NDIS и драйвер минипорта выполните следующие действия, когда NDIS отменяет уведомление о простое из-за сигнала пробуждения, созданного сетевым адаптером:

  1. Водитель автобуса завершает IRP_MN_WAIT_WAKE , выданный NDIS, перед переходом адаптера в маломощное состояние. Завершив IRP, водитель шины уведомляет NDIS о том, что сетевой адаптер создал сигнал пробуждения.

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

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

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