Поделиться через


Использование DMA с одной передачей

По умолчанию WDF иногда разделяет одну транзакцию DMA на несколько передач DMA. Однако некоторые устройства не могут обрабатывать фрагментированную транзакцию и должны получать все данные в рамках одной операции DMA. Например, некоторым сетевым контроллерам PCI требуется по одному сетевому пакету за раз, так как у них нет оборудования для кэширования и повторного сбора частичных данных.

Начиная с KMDF версии 1.19 драйвер KMDF, использующий DMA версии 3, может указать, что ему требуются транзакции DMA с одной передачей. Драйвер может указать одну передачу только для одной транзакции DMA или одну передачу для всех транзакций DMA, созданных с помощью указанного средства включения DMA.

Настройка одной передачи для определенной транзакции DMA

Чтобы задать одну передачу для одной транзакции, используйте следующую последовательность:

  1. Вызовите WdfDmaTransactionCreate или WdfDmaTransactionRelease.
  2. Вызовите WdfDmaTransactionSetSingleTransferRequirement.
  3. Вызовите WdfDmaTransactionInitialize.
    Если инициализация завершается сбоем из-за фрагментации транзакций, драйвер может завершить запрос ввода-вывода или переупорядочить буферы памяти транзакции и повторно инициализировать транзакцию.
  4. Вызовите WdfDmaTransactionExecute.

При отладке драйвера можно использовать расширение !wdfkd.wdfdmatransaction , чтобы определить, задана ли одна передача для заданного объекта транзакции.

Установка требования к одной передаче для всех транзакций DMA, созданных с помощью определенного включения DMA

Чтобы задать одну передачу для всех транзакций, созданных с помощью заданного включения, укажите флаг WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER в WDF_DMA_ENABLER_CONFIG_FLAGS при вызове WdfDmaEnablerCreate.

Драйвер, использующий этот флаг, не должен вызывать WdfDmaTransactionSetSingleTransferRequirement при каждом создании или повторном использовании объекта транзакции.

Этот параметр также сохраняется, если драйвер повторно использует объект транзакции.

При отладке используйте расширение !wdfkd.wdfdmaenabler , чтобы определить, задана ли одна передача для заданного объекта включения DMA.

Сведения о порядке, в котором WDF вызывает функции обратного вызова событий DMA драйвера, см. в разделе Обработка запросов ввода-вывода в драйвере KMDF для Bus-Master устройства DMA.