Delen via


Een set Power Request verwerken

Een tussenliggend stuurprogramma moet aanvragen verwerken om energie in te stellen op de werkstatus (een netwerkapparaatstroomstatus van D0) en slaaptoestanden (een netwerkapparaatstroomstatus van D1, D2 of D3). Het tussenliggende stuurprogramma moet ook energiestatusvariabelen en een StandBy-vlag onderhouden. Deze problemen worden verder besproken in dit onderwerp.

Voor voorbeelden van tussenliggende stuurprogramma's voor energiemanagement, zie de stuurprogramma-voorbeeld van de NDIS MUX Intermediate Driver en Notify Object in de Windows driver samples repository op GitHub.

In de slaapstand verwerken van een ingestelde poweraanvraag

Er zijn twee gevallen waarin een tussenliggend stuurprogramma een ingestelde energieaanvraag moet afhandelen voor een slaapstatus:

  • NDIS verzoekt dat de bovenkant van de virtuele minipoort van het tussenliggende stuurprogramma naar een slaaptoestand gaat.

  • De onderrand van het tussenliggende stuurprogrammaprotocol verwerkt de overgang van het onderliggende miniportstuurprogramma naar een slaapstatus wanneer er een PnP-gebeurtenismelding (Plug and Play) wordt ontvangen.

Deze gebeurtenissen kunnen in elke volgorde plaatsvinden en één gebeurtenis staat niet noodzakelijkerwijs bij de andere.

Wanneer de virtuele miniport bovenrand van het tussenliggende stuurprogramma een aanvraag ontvangt om energie in te stellen op een slaapstatus, is de volgorde van gebeurtenissen voor het verwerken van de aanvraag als volgt:

  1. NDIS roept de ProtocolNetPnPEvent--functie aan van elk protocolstuurprogramma dat is gebonden aan de virtuele minipoort. De aanroep van ProtocolNetPnPEvent- geeft een NetEventSetPower gebeurtenis op voor een slaapstatus. Protocolstuurprogramma's die zijn gebonden aan het tussenliggende stuurprogramma stoppen met het verzenden van netwerkgegevens en het indienen van OID-aanvragen naar de virtuele minipoort van het tussenliggende stuurprogramma. Het protocol onderrand van het tussenliggende stuurprogramma kan netwerkgegevens blijven verzenden en aanvragen naar beneden verzenden totdat NDIS aangeeft dat het onderliggende minipoortstuurprogramma de overgang naar een slaapstatus maakt.

  2. NDIS onderbreekt de overliggende stuurprogramma's en vervolgens de virtuele minipoort na het uitgeven van de gebeurtenis NetEventSetPower. De opgegeven reden voor de pauze is een overgang naar een status met een laag vermogen. Zie Het onderbreken van een adaptervoor meer informatie over het onderbreken van een virtuele minipoort.

    Opmerking Er kunnen geen OID-aanvragen worden verzonden naar de virtuele minipoort terwijl deze een lage energiestatus heeft, met uitzondering van OID_PNP_SET_POWER.

  3. NDIS doet een OID_PNP_SET_POWER verzoek aan de virtuele minipoort van het tussenliggende stuurprogramma. Het tussenliggende stuurprogramma accepteert de aanvraag door NDIS_STATUS_SUCCESS terug te geven. Het tussenliggende stuurprogramma mag de OID_PNP_SET_POWER aanvraag niet doorgeven aan het onderliggende minipoortstuurprogramma. Nadat het tussenliggende stuurprogramma deze aanvraag heeft voltooid, mag deze geen meer ontvangen netwerkgegevens aangeven of de status aangeven, zelfs als het netwerkgegevens en statusaanduidingen van het onderliggende minipoortstuurprogramma blijft ontvangen.

Wanneer de lagere laag van het protocol aan de tussenliggende stuurprogramma het onderliggende minipoortstuurprogramma naar een slaapmodus overzet, is de volgorde van gebeurtenissen voor het afhandelen van de overgang als volgt:

  1. NDIS roept de ProtocolNetPnPEvent- functie aan van de onderste rand van het tussenliggende stuurprogrammaprotocol. De aanroep van ProtocolNetPnPEvent- geeft een NetEventSetPower gebeurtenis op voor een slaapstatus. Het tussenliggende stuurprogramma moet stoppen met het verzenden van netwerkgegevens en het indienen van OID-aanvragen naar het onderliggende minipoortstuurprogramma. Als er openstaande aanvragen of verzonden items zijn, moet het tussenliggende stuurprogramma NDIS_STATUS_PENDING retourneren vanuit de aanroep naar ProtocolNetPnPEvent. Het tussenliggende stuurprogramma roept NdisCompleteNetPnPEvent- aan om de aanroep naar ProtocolNetPnPEvent-te voltooien. De protocolinterface van een tussenliggend stuurprogramma kan nog steeds pakket- en statusmeldingen ontvangen van het onderliggende minipoortstuurprogramma. Ontvangen netwerkgegevens kunnen worden genegeerd. Als de implementatie van een tussenliggend stuurprogramma afhankelijk is van het controleren van de status van het onderliggende minipoortstuurprogramma, moeten statusindicaties nog steeds worden bewaakt.

  2. NDIS pauzeert de protocolrand van het tussenliggende stuurprogramma en pauzeert vervolgens de onderliggende minipoortadapter nadat de gebeurtenis NetEventSetPower is uitgegeven. De opgegeven reden voor de pauze is een overgang naar een status met een laag vermogen. Zie Een binding onderbrekenvoor meer informatie over het onderbreken van een protocolbinding.

    Opmerking Er kunnen geen OID-aanvragen worden verzonden naar de onderliggende minipoortadapter terwijl deze een laag vermogen heeft, met uitzondering van OID_PNP_SET_POWER.

  3. NDIS geeft een OID_PNP_SET_POWER verzoek aan de onderliggende miniport driver. Als het onderliggende minipoortstuurprogramma echter geen ondersteuning biedt voor energiebeheer, wordt het gestopt. In dit geval, zelfs als NDIS het onderliggende minipoortstuurprogramma stopt, verzoekt het niet dat het tussenliggende stuurprogrammaprotocol de binding met het onderliggende minipoortstuurprogramma en de NIC ongedaan maakt. Nadat het onderliggende minipoortstuurprogramma de OID heeft verwerkt (of het minipoortstuurprogramma is gestopt), worden er geen netwerkgegevens of -status meer aangegeven.

Het verwerken van een vastgelegde energieaanvraag in de werkstatus

Er zijn twee gevallen waarin een tussenliggend stuurprogramma een vastgestelde energieaanvraag afhandelt in de werkstatus:

  • NDIS vraagt dat de bovenkant van de virtuele minipoort van het intermediate stuurprogramma naar de werkende staat gaat.

  • De onderrand van het tussenliggende stuurprogrammaprotocol verwerkt de overgang van het onderliggende miniportstuurprogramma naar de werkstatus wanneer er een PnP-gebeurtenismelding (Plug and Play) wordt ontvangen.

Deze gebeurtenissen kunnen zich in elke volgorde voordoen en één gebeurtenis staat niet noodzakelijkerwijs bij de andere.

Wanneer de virtuele minipoort bovenrand van het tussenliggende stuurprogramma een aanvraag ontvangt om energie in te stellen op een werkstatus, is de volgorde van gebeurtenissen voor het verwerken van de aanvraag als volgt:

  1. De NDIS geeft een OID_PNP_SET_POWER aan de virtuele minipoort van de tussenliggende driver. Het tussenliggende stuurprogramma retourneert NDIS_STATUS_SUCCESS naar de ingestelde energieaanvraag. Het tussenliggende stuurprogramma mag de OID_PNP_SET_POWER aanvraag niet doorgeven aan het onderliggende minipoortstuurprogramma.

  2. NDIS start de virtuele minipoort opnieuw op en start vervolgens de stuurprogramma's opnieuw op na het uitgeven van de ingestelde energie-OID. Zie Een adapter startenvoor meer informatie over het opnieuw opstarten van een virtuele minipoort.

  3. NDIS roept de ProtocolNetPnPEvent-functie van de overliggende protocolstuurprogramma's aan. De aanroep van ProtocolNetPnPEvent- geeft een NetEventSetPower gebeurtenis op om de werkstatus (D0) in te stellen. Afhankelijke protocolstuurprogramma's kunnen beginnen met het verzenden van netwerkgegevens naar de virtuele minipoort van het tussenliggende stuurprogramma.

Wanneer het protocol onderrand van het tussenliggende stuurprogramma het onderliggende minipoortstuurprogramma overzet naar een werkende status, is de volgorde van gebeurtenissen voor het afhandelen van de overgang als volgt:

  1. NDIS geeft een OID_PNP_SET_POWER aan het onderliggende minipoortstuurprogramma of roept de bijbehorende MiniportInitializeEx handler aan als het stuurprogramma is gepauzeerd.

  2. NDIS start het onderliggende minipoortstuurprogramma opnieuw op en vervolgens de protocolrand van de tussenliggende NDIS en de onderliggende minipoortadapter nadat de OID is uitgegeven. Zie Een binding opnieuw opstartenvoor meer informatie over het onderbreken van een protocolbinding.

  3. NDIS roept de functie ProtocolNetPnPEvent van het tussenliggende stuurprogramma aan. De aanroep van ProtocolNetPnPEvent- geeft een NetEventSetPower gebeurtenis op om de werkstatus (D0) in te stellen. Het tussenliggende stuurprogramma kan beginnen met het verzenden van netwerkgegevens naar het onderliggende minipoortstuurprogramma.

Energietoestanden en de standby-vlag

Het tussenliggende stuurprogramma moet een afzonderlijke energiestatusvariabele onderhouden voor elk exemplaar van de virtuele minipoort en voor elk onderliggend minipoortstuurprogramma waaraan het stuurprogramma is gebonden. Het tussenliggende stuurprogramma moet ook een StandingBy-vlag onderhouden voor elke virtuele minipoort die:

  • Ingesteld op TRUE wanneer de energiestatus van de virtuele minipoort of het onderliggende miniportstuurprogramma de D0-status verlaat.

  • Ingesteld op FALSE wanneer de energiestatus van de virtuele minipoort of het onderliggende minipoortstuurprogramma terugkeert naar D0.

Opmerking Voor MUX-tussenstuurprogramma's kunnen er meerdere virtuele minipoorten zijn gekoppeld aan een onderliggend minipoortstuurprogramma of meerdere onderliggende minipoorten die aan elke virtuele minipoort zijn gekoppeld. Wanneer de energiestatus van een minipoortadapter verandert, wordt ook het gedrag van alle bijbehorende minipoorten beïnvloed. Hoe het gedrag wordt beïnvloed, is implementatiespecifiek. Een stuurprogramma dat bijvoorbeeld een LBFO-oplossing (Load Balancing Failover) implementeert, kan de virtuele miniports niet deactiveren wanneer één onderliggend minipoortstuurprogramma wordt gedeactiveerd. Voor een implementatie van stuurprogramma's die afhankelijk zijn van alle onderliggende minipoortstuurprogramma's, is echter het deactiveren van virtuele minipoorten vereist wanneer een onderliggend minipoortstuurprogramma wordt gedeactiveerd.

Het tussenliggende stuurprogramma moet de StandingBy-vlag en power state-variabelen gebruiken bij het verwerken van aanvragen als volgt:

  • De MiniportSendNetBufferLists-functie van het stuurprogramma moet mislukken, tenzij de virtuele minipoort en de onderliggende minipoortadapter beide in D0 staan.

  • De miniportOidRequest-functie van het stuurprogramma moet altijd OID_PNP_QUERY_POWER met succes uitvoeren, zodat het stuurprogramma de volgende OID_PNP_SET_POWER-aanvragen ontvangt.

  • De MiniportOidRequest-functie van het stuurprogramma moet mislukken als de virtuele minipoort zich niet in D0 bevindt of als StandingBy TRUEis. Anders moet er één aanvraag in de wachtrij worden geplaatst als het onderliggende minipoortstuurprogramma zich niet in D0 bevindt. Een verzoek in de wachtrij moet worden verwerkt zodra de status van het onderliggende minipoortstuurprogramma D0 wordt.

  • De virtuele minipoort van het tussenliggende stuurprogramma moet alleen de status rapporteren als zowel het onderliggende minipoortstuurprogramma als de virtuele minipoort zich in D0 bevinden.