Partilhar via


Usando o DMA de Transferência Única

Por padrão, o WDF às vezes divide uma única transação de DMA em várias transferências de DMA. No entanto, alguns dispositivos não podem lidar com uma transação fragmentada e, em vez disso, devem receber todos os dados em uma única operação de DMA. Por exemplo, alguns controladores de rede PCI exigem um pacote de rede por vez porque não têm o hardware para armazenar em cache e remontar dados parciais.

A partir do KMDF versão 1.19, um driver KMDF usando o DMA v3 pode especificar que ele requer transações de DMA de transferência única. O driver pode especificar apenas a transferência única para uma única transação de DMA ou especificar a transferência única para todas as transações de DMA criadas usando um habilitador de DMA especificado.

Configurando a transferência única para uma transação de DMA específica

Para definir a transferência única para uma única transação, use a seguinte sequência:

  1. Chame WdfDmaTransactionCreate ou WdfDmaTransactionRelease.
  2. Chame WdfDmaTransactionSetSingleTransferRequirement.
  3. Chame WdfDmaTransactionInitialize.
    Se a inicialização falhar devido à fragmentação da transação, um driver poderá falhar na solicitação de E/S ou reorganizar os buffers de memória da transação e reinicializar a transação.
  4. Chame WdfDmaTransactionExecute.

Ao depurar o driver, você pode usar a extensão !wdfkd.wdfdmatransaction para determinar se a transferência única está definida para um determinado objeto de transação.

Definir o requisito de transferência única para todas as transações de DMA criadas com um habilitador de DMA específico

Para definir a transferência única para todas as transações criadas com um determinado habilitador, especifique o sinalizador WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER em WDF_DMA_ENABLER_CONFIG_FLAGS ao chamar WdfDmaEnablerCreate.

Um driver que usa esse sinalizador não precisa chamar WdfDmaTransactionSetSingleTransferRequirement sempre que cria ou reutiliza um objeto de transação.

Essa configuração também persistirá se o driver reutilizar o objeto de transação.

Ao depurar, use a extensão !wdfkd.wdfdmaenabler para determinar se a transferência única está definida para um determinado objeto de habilitador de DMA.

Para obter informações sobre a ordem na qual o WDF chama as funções de retorno de chamada de evento DMA do driver, consulte Manipulando solicitações de E/S em um driver KMDF para um dispositivo DMA Bus-Master.