I/O-aanvragen coördineren met powerstatus van onderdelen

[Alleen van toepassing op KMDF]

Een KMDF-stuurprogramma voor een apparaat met meerdere onderdelen mag alleen aanvragen verzenden naar onderdelen die actief zijn. Normaal gesproken wijst het stuurprogramma I/O-wachtrijen toe aan onderdelen of sets onderdelen.

Overweeg eerst een wachtrij die is toegewezen aan één onderdeel. Het stuurprogramma start de wachtrij wanneer het onderdeel actief wordt en stopt de wachtrij wanneer het onderdeel inactief wordt. Zodra KMDF een aanvraaghandler voor de wachtrij aanroept, bevindt het apparaat zich in de volledig ingeschakelde toestand (D0) en is het vereiste onderdeel actief. De aanvraaghandler heeft veilig toegang tot onderdeelhardware.

Hetzelfde concept is van toepassing op een wachtrij die is toegewezen aan een set onderdelen. In dit geval start het stuurprogramma de wachtrij wanneer alle onderdelen in de set actief zijn. Het stuurprogramma stopt de wachtrij wanneer een van de onderdelen inactief wordt.

In dit onderwerp wordt beschreven hoe een KMDF-stuurprogramma voor een apparaat met meerdere onderdelen dergelijke ondersteuning kan implementeren in een situatie met betrekking tot meerdere aanvraagtypen waarvoor verschillende combinaties van onderdelen zijn vereist.

Voorbeeld

Identificeer de vereiste onderdelen voor elk aanvraagtype dat door het stuurprogramma wordt ondersteund. Denk bijvoorbeeld aan een apparaat met drie onderdelen: 0, 1 en 2, waarvoor het stuurprogramma drie typen aanvragen ontvangt: A, B en C. De onderdeelvereisten van de aanvragen zijn als volgt:

Aanvraagtype Onderdelen die nodig zijn
A 0,2
B 1
C 0,1,2

In dit voorbeeld zijn er drie afzonderlijke sets onderdelen, één voor elk aanvraagtype. Het stuurprogramma levert één standaard I/O-wachtrij met energiebeheer voor het apparaat, evenals één extra, door energie beheerde wachtrij die overeenkomt met elke set onderdelen. In het bovenstaande voorbeeld maakt het stuurprogramma één primaire wachtrij en drie secundaire wachtrijen, één die overeenkomt met elke onderdelenset. Deze wachtrijconfiguratie wordt weergegeven in het volgende diagram:

Diagram met de implementatie van de wachtrij voor een apparaat met meerdere onderdelen met aanvraagtypen A, B en C.

Het stuurprogramma onderhoudt een bitmasker voor elke onderdelenset. Elke bit in het bitmasker vertegenwoordigt de actieve/niet-actieve status van een van de onderdelen. Als de bit is ingesteld, is het onderdeel actief. Als de bit is gewist, is het onderdeel inactief.

Wanneer een aanvraag binnenkomt, bepaalt een aanvraaghandler voor de wachtrij op het hoogste niveau welke onderdelen de aanvraag nodig heeft en roept PoFxActivateComponent aan voor elk exemplaar. De aanvraaghandler stuurt de aanvraag vervolgens door naar de secundaire I/O-wachtrij die overeenkomt met de set van dat onderdeel.

Wanneer een onderdeel actief wordt, roept het energiebeheerframework (PoFx) de routine ComponentActiveConditionCallback van het stuurprogramma aan. In deze callback stelt het stuurprogramma de bit in die overeenkomt met het opgegeven onderdeel, in elke bitmasker waarin dat onderdeel wordt weergegeven. Als alle bits in een bepaalde bitmasker zijn ingesteld, zijn alle onderdelen in de bijbehorende set actief. Voor elke onderdelenset die volledig actief is, roept het stuurprogramma WdfIoQueueStart aan om de bijbehorende secundaire I/O-wachtrij te starten.

Denk bijvoorbeeld aan het bovenstaande hypothetische apparaat. Stel dat onderdeel 0 actief is, terwijl onderdelen 1 en 2 niet actief zijn. Wanneer onderdeel 2 actief wordt, roept PoFx de ComponentActiveConditionCallback-routine van dat onderdeel aan. Aanvraagtypen A en C maken gebruik van onderdeel 2, dus het stuurprogramma bewerkt de bitmaskers voor deze twee aanvraagtypen. Omdat alle bits in het bitmasker voor aanvraagtype A nu zijn ingesteld, start het stuurprogramma de wachtrij voor aanvraagtype A. Niet alle bits zijn echter ingesteld voor aanvraagtype C (onderdeel 1 is nog steeds inactief). Het stuurprogramma start de wachtrij voor aanvraagtype C niet.

Wanneer een secundaire I/O-wachtrij wordt gestart, begint het framework met het leveren van de aanvragen die zijn opgeslagen in de wachtrij. In de aanvraaghandler voor de secundaire I/O-wachtrij kan het stuurprogramma de aanvragen veilig verwerken omdat het onderdeel actief is en er een energieverwijzing is uitgevoerd voor elk van de aanvragen.

Wanneer het stuurprogramma klaar is met het verwerken van een aanvraag, roept het PoFxIdleComponent aan voor elk onderdeel dat de aanvraag heeft gebruikt en voltooit het de aanvraag. Wanneer er geen aanvragen meer zijn met behulp van een onderdeel, roept het power framework de ComponentIdleConditionCallback-routine van het stuurprogramma aan.

In deze callback wist het stuurprogramma het bit dat overeenkomt met het opgegeven onderdeel, in elk bitmasker waarin het onderdeel wordt weergegeven. Als een bepaald bitmasker aangeeft dat het onderdeel de eerste in de bijbehorende set is om over te stappen op de niet-actieve voorwaarde, roept het stuurprogramma WdfIoQueueStop aan om de bijbehorende secundaire I/O-wachtrij te stoppen. Hierdoor zorgt het stuurprogramma ervoor dat de wachtrij geen aanvragen verzendt, tenzij alle onderdelen in de bijbehorende set actief zijn.

Bekijk nogmaals het bovenstaande voorbeeld. Stel dat alle onderdelen actief zijn en daarom alle wachtrijen worden gestart. Wanneer onderdeel 1 inactief wordt, roept PoFx de ComponentIdleConditionCallback-routine aan voor onderdeel 1. In deze callback bewerkt het stuurprogramma de bitmaskers voor aanvraagtypen B en C omdat ze onderdeel 1 gebruiken. Omdat onderdeel 1 het eerste onderdeel is dat inactief wordt voor beide aanvraagtypen, stopt het stuurprogramma de wachtrijen voor aanvraagtypen B en C.

Stel dat component 0 op dit moment inactief wordt. In componentIdleConditionCallback voor onderdeel 0 bewerkt het stuurprogramma de bitmaskers voor aanvraagtypen A en C. Omdat onderdeel 0 het eerste onderdeel is dat niet actief wordt voor aanvraagtype A (onderdeel 2 is nog actief), stopt het stuurprogramma de wachtrij voor aanvraagtype A. Voor aanvraagtype C is onderdeel 0 echter niet het eerste onderdeel dat inactief wordt. Het stuurprogramma stopt de wachtrij voor aanvraagtype C niet (dit is eerder gedaan).

Als u de techniek wilt gebruiken die in dit voorbeeld wordt beschreven, moet het stuurprogramma ook een EvtIoCanceledOnQueue callbackfunctie registreren voor iedere secundaire wachtrij. Als een aanvraag werd geannuleerd in de secundaire wachtrij, kan het stuurprogramma deze callback gebruiken om PoFxIdleComponent voor elk bijbehorend onderdeel aan te roepen. Als u dit doet, wordt de vermogensreferentie vrijgegeven die de aanvraaghandler heeft gebruikt toen de functie PoFxActivateComponent werd aangeroepen voordat de bewerking naar de secundaire wachtrij werd doorgestuurd.