単一転送 DMA の使用
デフォルトでは、WDF は 1 つの DMA トランザクションを複数の DMA 転送に分割することがあります。 ただし、一部のデバイスではフラグメント化されたトランザクションを処理できず、代わりに 1 回の DMA 操作ですべてのデータを受信する必要があります。 たとえば、一部の PCI ネットワーク コントローラーには、部分的なデータをキャッシュして再アセンブルするハードウェアがないため、一度に 1 つのネットワーク パケットが必要です。
KMDF バージョン 1.19 以降では、DMA v3 を使用する KMDF ドライバーで、単一転送 DMA トランザクションが必要であることを指定できます。 ドライバーは、単一の DMA トランザクションに対してのみ単一転送を指定することも、指定した DMA イネーブラーを使用して作成されたすべての DMA トランザクションに対して単一転送を指定することもできます。
特定の DMA トランザクションに対する単一転送の設定
1 つのトランザクションに対して単一転送を設定するには、次の順序を実行します。
- WdfDmaTransactionCreate または WdfDmaTransactionRelease を呼び出します。
- WdfDmaTransactionSetSingleTransferRequirement を呼び出す。
- WdfDmaTransactionInitialize を呼び出す。
トランザクションの断片化によって初期化が失敗した場合、ドライバーは I/O 要求を失敗させるか、トランザクションのメモリ バッファーを再配置してトランザクションを再初期化できます。 - WdfDmaTransactionExecute を呼び出す。
ドライバーをデバッグするときに、!wdfkd.wdfdmatransaction 拡張機能を使用して、特定のトランザクション オブジェクトに対して単一転送が設定されているかどうかを判断できます。
特定の DMA イネーブラーを使用して作成されたすべての DMA トランザクションに対する単一転送要件の設定
特定のイネーブラーで作成されたすべてのトランザクションに対して単一転送を設定するには、WdfDmaEnablerCreate を呼び出すときに WDF_DMA_ENABLER_CONFIG_FLAGS でWDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER フラグを指定します。
このフラグを使用するドライバーは、トランザクション オブジェクトを作成または再利用するたびに WdfDmaTransactionSetSingleTransferRequirement を呼び出す必要はありません。
この設定は、ドライバーがトランザクション オブジェクトを再利用する場合にも保持されます。
デバッグ時には、!wdfkd.wdfdmaenabler 拡張機能を使用して、特定の DMA イネーブラー オブジェクトに対して単一転送が設定されているかどうかを判断します。
WDF がドライバーの DMA イベント コールバック関数を呼び出す順序については、「バス マスター DMA デバイスの KMDF ドライバーでの I/O 要求の処理」を参照してください。