Share via


Verwenden von Single Transfer DMA

Standardmäßig teilt WDF manchmal eine einzelne DMA-Transaktion in mehrere DMA-Übertragungen auf. Einige Geräte können jedoch keine fragmentierte Transaktion verarbeiten und müssen stattdessen alle Daten in einem einzelnen DMA-Vorgang empfangen. Beispielsweise benötigen einige PCI-Netzwerkcontroller jeweils ein Netzwerkpaket, da sie nicht über die Hardware zum Zwischenspeichern und Zusammensetzen partieller Daten verfügen.

Ab KMDF-Version 1.19 kann ein KMDF-Treiber mit DMA v3 angeben, dass DMA-Transaktionen für einzelne Übertragungen erforderlich sind. Der Treiber kann nur eine einzelne Übertragung für eine einzelne DMA-Transaktion angeben, oder er kann eine einzelne Übertragung für alle DMA-Transaktionen angeben, die mit einem angegebenen DMA-Enabler erstellt wurden.

Festlegen einer einzelnen Übertragung für eine bestimmte DMA-Transaktion

Verwenden Sie die folgende Sequenz, um die einzelne Übertragung für eine einzelne Transaktion festzulegen:

  1. Rufen Sie WdfDmaTransactionCreate oder WdfDmaTransactionRelease auf.
  2. Rufen Sie WdfDmaTransactionSetSingleTransferRequirement auf.
  3. Rufen Sie WdfDmaTransactionInitialize auf.
    Wenn die Initialisierung aufgrund der Transaktionsfragmentierung fehlschlägt, kann ein Treiber die E/A-Anforderung fehlschlagen oder die Speicherpuffer der Transaktion neu anordnen und die Transaktion neu initialisieren.
  4. Rufen Sie WdfDmaTransactionExecute auf.

Beim Debuggen Ihres Treibers können Sie die Erweiterung !wdfkd.wdfdmatransaction verwenden, um zu bestimmen, ob die einzelne Übertragung für ein bestimmtes Transaktionsobjekt festgelegt ist.

Festlegen der Einzelübertragungsanforderung für alle DMA-Transaktionen, die mit einem bestimmten DMA-Enabler erstellt wurden

Wenn Sie die einmalige Übertragung für alle Transaktionen festlegen möchten, die mit einem bestimmten Enabler erstellt wurden, geben Sie beim Aufrufen von WdfDmaEnablerCreate das flag WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER in WDF_DMA_ENABLER_CONFIG_FLAGS an.

Ein Treiber, der dieses Flag verwendet, muss WdfDmaTransactionSetSingleTransferRequirement nicht jedes Mal aufrufen, wenn er ein Transaktionsobjekt erstellt oder wiederverwendet.

Diese Einstellung bleibt auch dann erhalten, wenn der Treiber das Transaktionsobjekt wiederverwendet.

Verwenden Sie beim Debuggen die Erweiterung !wdfkd.wdfdmaenabler , um zu bestimmen, ob die einzelne Übertragung für ein bestimmtes DMA-Enabler-Objekt festgelegt ist.

Informationen zur Reihenfolge, in der WDF die DMA-Ereignisrückruffunktionen Ihres Treibers aufruft, finden Sie unter Behandeln von E/A-Anforderungen in einem KMDF-Treiber für ein Bus-Master DMA-Gerät.