Bagikan melalui


Menggunakan DMA Transfer Tunggal

Secara default, WDF terkadang membagi satu transaksi DMA menjadi beberapa transfer DMA. Namun, beberapa perangkat tidak dapat menangani transaksi terfragmentasi dan sebaliknya harus menerima semua data dalam satu operasi DMA. Misalnya, beberapa pengontrol jaringan PCI memerlukan satu paket jaringan pada satu waktu karena tidak memiliki perangkat keras untuk di-cache dan menyusun ulang data parsial.

Mulai dari KMDF versi 1.19, driver KMDF yang menggunakan DMA v3 dapat menentukan bahwa ia memerlukan transaksi DMA transfer tunggal. Driver hanya dapat menentukan transfer tunggal untuk satu transaksi DMA, atau dapat menentukan transfer tunggal untuk semua transaksi DMA yang dibuat menggunakan pengaktif DMA tertentu.

Mengatur transfer tunggal untuk transaksi DMA tertentu

Untuk mengatur transfer tunggal untuk satu transaksi, gunakan urutan berikut:

  1. Panggil WdfDmaTransactionCreate atau WdfDmaTransactionRelease.
  2. Panggil WdfDmaTransactionSetSingleTransferRequirement.
  3. Panggil WdfDmaTransactionInitialize.
    Jika inisialisasi gagal karena fragmentasi transaksi, driver dapat menggagalkan permintaan I/O atau dapat mengatur ulang buffer memori transaksi dan menginisialisasi ulang transaksi.
  4. Panggil WdfDmaTransactionExecute.

Saat men-debug driver, Anda dapat menggunakan ekstensi !wdfkd.wdfdmatransaction untuk menentukan apakah transfer tunggal diatur untuk objek transaksi tertentu.

Mengatur persyaratan transfer tunggal untuk semua transaksi DMA yang dibuat dengan pengaktif DMA tertentu

Untuk mengatur transfer tunggal untuk semua transaksi yang dibuat dengan pengaktif tertentu, tentukan bendera WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER di WDF_DMA_ENABLER_CONFIG_FLAGS saat memanggil WdfDmaEnablerCreate.

Driver yang menggunakan bendera ini tidak perlu memanggil WdfDmaTransactionSetSingleTransferRequirement setiap kali membuat atau menggunakan kembali objek transaksi.

Pengaturan ini juga berlanjut jika driver menggunakan kembali objek transaksi.

Saat penelusuran kesalahan, gunakan ekstensi !wdfkd.wdfdmaenabler untuk menentukan apakah transfer tunggal diatur untuk objek pengaktif DMA tertentu.

Untuk informasi tentang urutan WDF memanggil fungsi panggilan balik peristiwa DMA driver Anda, lihat Menangani Permintaan I/O di Driver KMDF untuk Perangkat DMA Bus-Master.