Condividi tramite


Uso di DMA a trasferimento singolo

Per impostazione predefinita, WDF suddivide a volte una singola transazione DMA in più trasferimenti DMA. Tuttavia, alcuni dispositivi non possono gestire una transazione frammentata e devono invece ricevere tutti i dati in una singola operazione DMA. Ad esempio, alcuni controller di rete PCI richiedono un pacchetto di rete alla volta perché non dispongono dell'hardware per memorizzare nella cache e riassemblare i dati parziali.

A partire da KMDF versione 1.19, un driver KMDF che usa DMA v3 può specificare che richiede transazioni DMA a trasferimento singolo. Il driver può specificare un trasferimento singolo solo per una singola transazione DMA oppure può specificare un singolo trasferimento per tutte le transazioni DMA create usando un abilitatore DMA specificato.

Impostazione del trasferimento singolo per una transazione DMA specifica

Per impostare il trasferimento singolo per una singola transazione, usare la sequenza seguente:

  1. Chiamare WdfDmaTransactionCreate o WdfDmaTransactionRelease.
  2. Chiamare WdfDmaTransactionSetSingleTransferRequirement.
  3. Chiamare WdfDmaTransactionInitialize.
    Se l'inizializzazione non riesce a causa della frammentazione delle transazioni, un driver può non riuscire la richiesta di I/O oppure può riorganizzare i buffer di memoria della transazione e reinizializzare la transazione.
  4. Chiamare WdfDmaTransactionExecute.

Quando si esegue il debug del driver, è possibile usare l'estensione !wdfkd.wdfdmatransaction per determinare se il trasferimento singolo è impostato per un determinato oggetto transazione.

Impostazione del requisito di trasferimento singolo per tutte le transazioni DMA create con un abilitatore DMA specifico

Per impostare il trasferimento singolo per tutte le transazioni create con un determinato abilitatore, specificare il flag WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER in WDF_DMA_ENABLER_CONFIG_FLAGS quando si chiama WdfDmaEnablerCreate.

Un driver che usa questo flag non deve chiamare WdfDmaTransactionSetSingleTransferRequirement ogni volta che crea o riutilizza un oggetto transazione.

Questa impostazione viene mantenuta anche se il driver riutilizza l'oggetto transazione.

Durante il debug, usare l'estensione !wdfkd.wdfdmaenabler per determinare se il trasferimento singolo è impostato per un determinato oggetto abilitatore DMA.

Per informazioni sull'ordine in cui WDF chiama le funzioni di callback degli eventi DMA del driver, vedere Gestione delle richieste di I/O in un driver KMDF per un dispositivo DMA Bus-Master.