Obsługa powiadomień o bezczynności przy selektywnym wstrzymywaniu NDIS
Usługa NDIS uruchamia selektywną operację wstrzymania, jeśli wystąpi jedno z następujących zdarzeń:
Karta sieciowa była nieaktywna przez dłuższy niż limit czasu bezczynności. Czas trwania tego okresu limitu jest określony przez wartość ustandaryzowanego słowa kluczowego INF *SSIdleTimeout. Aby uzyskać więcej informacji na temat tego słowa kluczowego, zobacz ustandaryzowane słowa kluczowe INF dotyczące selektywnego wstrzymania NDIS.
Aby uzyskać więcej informacji o tym, jak usługa NDIS określa, że karta sieciowa jest bezczynna, zobacz Jak NDIS Wykrywa Bezczynne Karty Sieciowe.
System zgodny z technologią Always On Always Connected (AOAC) jest przenoszony do stanu wstrzymania połączonego.
Dzięki selektywnej operacji wstrzymania karta sieciowa zostaje przeniesiona do stanu niskiego zasilania. NDIS rozpoczyna tę operację, wywołując funkcję obsługi MiniportIdleNotification, aby wydać bezczynne powiadomienie do sterownika miniportu.
Sterownik miniportu może wymagać wykonania czynności zależnych od magistrali, gdy obsługuje powiadomienie o bezczynności. Na poniższej ilustracji przedstawiono kroki związane z obsługą powiadomienia o bezczynności przez miniportowy sterownik karty sieciowej USB.
Ten temat zawiera następujące informacje dotyczące obsługi selektywnego powiadomienia o wstrzymaniu bezczynności usługi NDIS:
Wytyczne dotyczące obsługi wywołania dla MiniportIdleNotification
Wytyczne dotyczące wywołania do NdisMIdleNotificationConfirm
Anulowanie i kończenie selektywnego zawieszenia powiadomienia o trybie gotowości NDIS
Wskazówki dotyczące obsługi wywołania do MiniportIdleNotification
NDIS i sterownik miniportu wykonują następujące kroki, gdy NDIS wywołuje MiniportIdleNotification:
NDIS wywołuje funkcję obsługi MiniportIdleNotification, aby powiadomić sterownik, że podstawowa karta sieciowa wydaje się być bezczynna. NDIS ustawia parametr ForceIdle funkcji obsługi MiniportIdleNotification na jedną z następujących wartości:
NDIS ustawia parametr ForceIdle na FALSE, gdy karta sieciowa była nieaktywna przez dłuższy czas niż limit czasu bezczynności.
NDIS ustawia parametr ForceIdle na TRUE, gdy system zgodny z technologią Always On Always Connected (AOAC) przechodzi do stanu połączonego trybu gotowości.
Po wywołaniu MiniportIdleNotification, sterownik miniportu może zawetować powiadomienie o stanie bezczynności oraz operację selektywnego wstrzymania, zwracając NDIS_STATUS_BUSY. Na przykład sterownik może odrzucić powiadomienie o bezczynności, jeśli wykryje aktywność na adapterze sieciowym.
Jeśli sterownik miniportu zawetuje powiadomienie o bezczynności, NDIS ponownie uruchomi monitor aktywności na karcie sieciowej. Jeśli adapter ponownie stanie się nieaktywny w okresie bezczynności, NDIS wywołuje MiniportIdleNotification.
Uwaga Sterownik miniportu nie może zawetować powiadomienia bezczynności, jeśli parametr ForceIdle jest ustawiony na wartość TRUE. W takim przypadku sterownik musi kontynuować operację selektywnego wstrzymania.
Jeśli sterownik miniportu nie zawetuje powiadomienia bezczynności, musi wykonać wszelkie operacje specyficzne dla magistrali, aby przygotować kartę sieciową do selektywnej operacji wstrzymania. Na przykład sterownik miniportu dla karty sieciowej USB wykonuje następujące kroki, aby określić, czy karta sieciowa może przejść do stanu niskiego zasilania:
Sterownik miniportu wywołuje IoCallDriver w celu wystawienia pakietu żądania we/wy (IRP) dla żądania wygaszenia USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) do bazowego sterownika magistrali USB. W tym IRP sterownik miniportu musi określić procedurę zwrotną oraz zakończenia.
Sterownik magistrali USB nie kończy natychmiast protokołu IRP. Protokół IRP jest pozostawiony w stanie oczekiwania podczas przejścia w tryb niskiego zużycia energii. Kierowca autobusu kończy protokół IRP później, gdy wystąpi jedno z następujących zdarzeń:
Sterownik miniportu anuluje IRP.
Wymagana jest zmiana stanu zasilania systemu.
Urządzenie zostanie usunięte z koncentratora USB.
Gdy sterownik magistrali USB ustali, że może umieścić kartę sieciową w stanie niskiego zasilania, wywołuje procedurę wywołania zwrotnego IRP sterownika miniportu. To wywołanie potwierdza, że karta sieciowa może przejść do stanu niskiego poziomu zasilania.
Aby uzyskać wskazówki dotyczące sposobu pisania procedury wywołania zwrotnego dla protokołu IRP żądania bezczynności USB, zobacz Implementowanie procedury wywołania zwrotnego żądań bezczynności USB IRP.
Po zakończeniu przygotowywania karty sieciowej do selektywnego wstrzymania, sterownik miniport wywołuje NdisMIdleNotificationConfirm. W tym wywołaniu sterownik miniportu określa najniższy stan zasilania, do którego może przejść karta sieciowa.
W zależności od wymagań magistrali w przypadku selektywnego wstrzymania operacji, sterownik miniportowy wywołuje NdisMIdleNotificationConfirm albo synchronicznie w kontekście wywołania MiniportIdleNotification lub asynchronicznie po tym, jak MiniportIdleNotification zostanie zwrócony. Na przykład sterownik miniportu dla karty sieciowej USB wywołuje NdisMIdleNotificationConfirm w kontekście procedury wywołania zwrotnego dla żądania bezczynności USB. Sterownik magistrali USB wywołuje procedurę wywołania zwrotnego synchronicznie w kontekście wywołania IoCallDriver lub asynchronicznie, po powrocie z MiniportIdleNotification.
Jeśli karta sieciowa może zostać przeniesiona do stanu niskiego zasilania, sterownik miniportu zwraca stan NDIS_STATUS_PENDING po wywołaniu do MiniportIdleNotification.
Uwaga Sterownik miniportu zwraca NDIS_STATUS_PENDING, ponieważ powiadomienie dotyczące bezczynności nie zostanie ukończone, dopóki sterownik nie wywoła NdisMIdleNotificationComplete. Sterownik miniportu nie powinien zwracać NDIS_STATUS_SUCCESS z MiniportIdleNotification.
Sterownik miniportu powinien wykonywać następujące operacje, dopóki karta sieciowa nie zostanie zawieszona i przeniesiona do stanu niskiego zasilania:
Sterownik miniportu powinien przetworzyć odebrane pakiety i przesłać je do NDIS, wywołując NdisMIndicateReceiveNetBufferLists.
Sterownik miniportu powinien przetworzyć ukończone pakiety wysyłania i zgłosić je do NDIS, wywołując NdisMSendNetBufferListsComplete .
Uwaga NDIS nie wywoła funkcji MiniportSendNetBufferList s sterownika w celu wysyłania pakietów, jeśli MiniportIdleNotification zwraca NDIS_STATUS_PENDING.
Wskazówki dotyczące wywołania NdisMIdleNotificationConfirm
NDIS i sterownik miniportu wykonują następujące kroki, gdy sterownik miniportu wywołuje NdisMIdleNotificationConfirm:
Problemy z usługą NDIS IRP_MN_WAIT_WAKE do bazowego sterownika magistrali. Ten IRP umożliwia sterownikowi magistrali wybudzenie karty sieciowej w odpowiedzi na zewnętrzny sygnał wybudzania.
Usługa NDIS wysyła żądanie ustawienia identyfikatora obiektu (OID) OID_PM_PARAMETERS do sterownika miniportu. To żądanie identyfikatora OID jest skojarzone z strukturą NDIS_PM_PARAMETERS, która określa ustawienia, zgodnie z którymi karta sieciowa generuje zdarzenie wybudzania.
Sterownik miniportu musi postępować zgodnie z tymi wytycznymi, gdy przetwarza pola struktury NDIS_PM_PARAMETERS:
Jeśli parametr ForceIdle funkcji obsługi MiniportIdleNotification został ustawiony na FALSE, NDIS ustawia tylko flagę NDIS_PM_SELECTIVE_SUSPEND_ENABLED w składowej WakeUpFlags struktury NDIS_PM_PARAMETERS. W takim przypadku karta sieciowa może sygnalizować zdarzenie wznawiania, gdy wystąpi jedno z następujących zdarzeń:
Karta sieciowa odbiera pakiet zgodny z filtrem pakietów przychodzących. Adapter jest skonfigurowany do używania tych filtrów poprzez żądania ustawienia identyfikatorów OID OID_GEN_CURRENT_PACKET_FILTER.
Karta sieciowa wykrywa inne zdarzenia zewnętrzne, które wymagają przetwarzania przez stos sterowników sieciowych, na przykład gdy stan połączenia zmieni się na odłączenie nośnika lub połączenie nośnika.
Jeśli parametr ForceIdle funkcji obsługiMiniportIdleNotification został ustawiony na true, NDIS nie ustawia flagi NDIS_PM_SELECTIVE_SUSPEND_ENABLED w WakeUpFlags składowej struktury NDIS_PM_PARAMETERS. W takim przypadku NDIS ustawia pozostałe członkowskie elementy w strukturze NDIS_PM_PARAMETERS dla zdarzeń wybudzania, które nie są związane z selektywnym wstrzymaniem NDIS.
Uwaga NDIS ustawia parametr ForceIdle na TRUE tylko wtedy, gdy system zgodny z technologią Always On Always Connected (AOAC) przechodzi do stanu gotowości połączonej.
Sterownik kończy żądanie OID za pomocą NDIS_STATUS_SUCCESS.
Uwaga Jeśli NDIS ustawia flagę NDIS_PM_SELECTIVE_SUSPEND_ENABLED w WakeUpFlags składowej struktury NDIS_PM_PARAMETERS, wysyła żądanie ustawienia identyfikatora OID OID_PM_PARAMETERS bezpośrednio do sterownika miniportu. Dzięki temu NDIS może pominąć przetwarzanie przez sterowniki filtrujące w stosie sterowników sieciowych.
Po pomyślnym zakończeniu żądania zestawu identyfikatorów OID OID_PM_PARAMETERS usługa NDIS wysyła żądanie zestawu identyfikatorów OID OID_PNP_SET_POWER do sterownika miniportu.
Gdy obsługuje to żądanie zestawu identyfikatorów OID, sterownik przygotowuje kartę sieciową do przejścia do stanu niskiego zasilania określonego w żądaniu OID. Sterownik musi wykonać wszystkie oczekujące operacje w następujący sposób:
Sterownik miniportu czeka na zwrot wszystkich wcześniej wskazanych pakietów odbiorczych za pomocą wywołań do MiniportReturnNetBufferLists.
Sterownik miniportu czeka, aż sprzęt zakończy przetwarzanie żądań wysyłania. Po zakończeniu żądań sterownik miniportu musi wywołać NdisMSendNetBufferListsComplete.
Sterownik miniportu kończy wszystkie oczekujące żądania wysyłania, wywołując NdisMSendNetBufferListsComplete.
Sterownik miniportu musi anulować wszystkie oczekujące timery NDIS i zadania robocze. Po anulowaniu tych elementów, sterownik musi poczekać na ukończenie tych czasomierzy i elementów roboczych.
Sterownik miniportu musi umieścić kartę sieciową w stanie spoczynku. Na przykład sterownik musi anulować wszystkie czasomierze sprzętowe.
Sterownik miniportu konfiguruje podstawową kartę sieciową w celu włączenia określonych zdarzeń wznawiania, które zostały wcześniej określone w żądaniu zestawu identyfikatorów OID OID_PM_PARAMETERS. Po przygotowaniu karty sieciowej do przejścia w stan niskiego zużycia energii, sterownik miniportu kończy żądanie ustawienia identyfikatora OID OID_PNP_SET_POWER z NDIS_STATUS_SUCCESS.
NDIS wysyła IRP_MN_SET_POWER do bazowego sterownika magistrali. Ten protokół IRP żąda przejścia karty sieciowej do stanu niskiego zasilania.
Uwaga Podczas selektywnej operacji wstrzymania karta sieciowa zostanie przeniesiona do stanu zasilania urządzenia określonego w wywołaniu polecenia NdisMIdleNotificationConfirm. Sterownik miniportu określa ten stan zasilania urządzenia w parametrze IdlePowerState tej funkcji.
Po zakończeniu IRP NDIS powraca z wywołania do funkcji NdisMIdleNotificationConfirm.
Anulowanie i kończenie selektywnego powiadomienia o wstrzymaniu bezczynności usługi NDIS
Po wydaniu powiadomienia o bezczynności można je anulować i zakończyć w następujący sposób:
Usługa NDIS może anulować zaległe powiadomienie o bezczynności, jeśli spełnione są następujące warunki:
Nadrzędny protokół lub sterownik filtru wysyła żądanie wysłania pakietu lub żądanie OID do sterownika miniportu.
Adapter bazowy sygnalizuje zdarzenie wybudzenia, takie jak odbieranie pakietu zgodnego ze wzorcem wake-on-LAN (WOL) lub wykrycie zmiany stanu połączenia multimedialnego.
Usługa NDIS anuluje powiadomienie bezczynności, wywołując MiniportCancelIdleNotification. Gdy ta funkcja obsługi jest wywoływana, sterownik miniportu anuluje wszystkie IRP specyficzne dla magistrali, które mogły zostać wcześniej wydane w związku z powiadomieniem o bezczynności. Na koniec sterownik miniportu wywołuje NdisMIdleNotificationComplete, aby ukończyć powiadomienie o bezczynności.
Aby uzyskać więcej informacji o tym, jak usługa NDIS anuluje powiadomienie o bezczynności, zobacz Anulowanie powiadomienia o selektywnym wstrzymaniu bezczynności przez NDIS.
Gdy karta sieciowa jest w stanie niskiego zasilania, sterownik miniportu może ukończyć powiadomienie o bezczynności, aby przywrócić kartę do stanu pełnego zasilania. Przyczyny tego działania są specyficzne dla projektowania i wymagań sterownika i adaptera. Sterownik miniportu zakończa powiadomienie o bezczynności, wywołując NdisMIdleNotificationComplete.
Aby uzyskać więcej informacji na temat sposobu, w jaki sterownik miniportu kończy powiadomienie o bezczynności, zobacz Kończenie powiadomienia o bezczynności dla selektywnego wstrzymania NDIS.