Utilisation d’un DMA à transfert unique
Par défaut, WDF fractionne parfois une seule transaction DMA en plusieurs transferts DMA. Toutefois, certains appareils ne peuvent pas gérer une transaction fragmentée et doivent recevoir toutes les données dans une seule opération DMA. Par exemple, certains contrôleurs réseau PCI nécessitent un paquet réseau à la fois, car ils ne disposent pas du matériel nécessaire pour mettre en cache et réassembler des données partielles.
À compter de KMDF version 1.19, un pilote KMDF utilisant DMA v3 peut spécifier qu’il nécessite des transactions DMA de transfert unique. Le pilote peut spécifier un transfert unique pour une seule transaction DMA uniquement, ou il peut spécifier un transfert unique pour toutes les transactions DMA créées à l’aide d’un enabler DMA spécifié.
Définition d’un transfert unique pour une transaction DMA spécifique
Pour définir un transfert unique pour une seule transaction, utilisez la séquence suivante :
- Appelez WdfDmaTransactionCreate ou WdfDmaTransactionRelease.
- Appelez WdfDmaTransactionSetSingleTransferRequirement.
- Appelez WdfDmaTransactionInitialize.
Si l’initialisation échoue en raison de la fragmentation des transactions, un pilote peut échouer la demande d’E/S ou il peut réorganiser les mémoires tampons de la transaction et réinitialiser la transaction. - Appelez WdfDmaTransactionExecute.
Lors du débogage de votre pilote, vous pouvez utiliser l’extension !wdfkd.wdfdmatransaction pour déterminer si un transfert unique est défini pour un objet de transaction donné.
Définition de l’exigence de transfert unique pour toutes les transactions DMA créées avec un enabler DMA particulier
Pour définir un transfert unique pour toutes les transactions créées avec un enabler donné, spécifiez l’indicateur WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER dans WDF_DMA_ENABLER_CONFIG_FLAGS lors de l’appel de WdfDmaEnablerCreate.
Un pilote qui utilise cet indicateur n’a pas besoin d’appeler WdfDmaTransactionSetSingleTransferRequirement chaque fois qu’il crée ou réutilise un objet transaction.
Ce paramètre est également conservé si le pilote réutilise l’objet transaction.
Lors du débogage, utilisez l’extension !wdfkd.wdfdmaenabler pour déterminer si un transfert unique est défini pour un objet d’activation DMA donné.
Pour plus d’informations sur l’ordre dans lequel WDF appelle les fonctions de rappel d’événement DMA de votre pilote, consultez Gestion des demandes d’E/S dans un pilote KMDF pour un périphérique DMA Bus-Master.