Delen via


DMA met één overdracht gebruiken

Standaard splitst WDF soms één DMA-transactie in meerdere DMA-overdrachten. Sommige apparaten kunnen echter geen gefragmenteerde transactie verwerken en moeten in plaats daarvan alle gegevens in één DMA-bewerking ontvangen. Voor sommige PCI-netwerkcontrollers is bijvoorbeeld één netwerkpakket tegelijk vereist, omdat ze niet over de hardware beschikken om gedeeltelijke gegevens in de cache op te cachen en opnieuw op te halen.

Vanaf KMDF versie 1.19 kan een KMDF-stuurprogramma met behulp van DMA v3 opgeven dat voor één overdracht DMA-transacties vereist is. Het stuurprogramma kan slechts één overdracht opgeven voor één DMA-transactie of kan één overdracht opgeven voor alle DMA-transacties die zijn gemaakt met behulp van een opgegeven DMA-enabler.

Eén overdracht instellen voor een specifieke DMA-transactie

Als u één overdracht voor één transactie wilt instellen, gebruikt u de volgende reeks:

  1. Roep het WdfDmaTransactionCreate of het WdfDmaTransactionReleaseaan.
  2. Roep WdfDmaTransactionSetSingleTransferRequirementaan.
  3. Roep WdfDmaTransactionInitializeaan.
    Als initialisatie mislukt vanwege transactiefragmentatie, kan een stuurprogramma de I/O-aanvraag mislukken of de geheugenbuffers van de transactie opnieuw rangschikken en de transactie opnieuw initialiseren.
  4. Roep WdfDmaTransactionExecute-aan.

Wanneer u fouten in uw stuurprogramma opspoort, kunt u de extensie !wdfkd.wdfdmatransaction gebruiken om te bepalen of één overdracht is ingesteld voor een bepaald transactieobject.

De vereiste voor één overdracht instellen voor alle DMA-transacties die zijn gemaakt met een bepaalde DMA-enabler

Als u één overdracht wilt instellen voor alle transacties die zijn gemaakt met een bepaalde enabler, geeft u de vlag WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER op in WDF_DMA_ENABLER_CONFIG_FLAGS bij het aanroepen van WdfDmaEnablerCreate.

Een stuurprogramma dat deze vlag gebruikt, hoeft geen WdfDmaTransactionSetSingleTransferRequirement aan te roepen telkens wanneer het een transactieobject maakt of opnieuw gebruikt.

Deze instelling blijft ook behouden als het stuurprogramma het transactieobject opnieuw gebruikt.

Gebruik bij foutopsporing de !wdfkd.wdfdmaenabler extensie om te bepalen of één overdracht is ingesteld voor een bepaald DMA-enabler-object.

Voor informatie over de volgorde waarin WDF de DMA-evenement-callbackfuncties van uw stuurprogramma aanroept, zie I/O-aanvragen verwerken in een KMDF-stuurprogramma voor een Bus-Master DMA-apparaat.