Uso de DMA de transferencia única
De forma predeterminada, WDF a veces divide una sola transacción DMA en varias transferencias de DMA. Sin embargo, algunos dispositivos no pueden controlar una transacción fragmentada y, en su lugar, deben recibir todos los datos en una sola operación DMA. Por ejemplo, algunos controladores de red PCI requieren un paquete de red a la vez porque no tienen el hardware para almacenar en caché y volver a ensamblar datos parciales.
A partir de la versión 1.19 de KMDF, un controlador KMDF que usa DMA v3 puede especificar que requiere transacciones DMA de transferencia única. El controlador puede especificar una sola transferencia para una sola transacción DMA, o bien puede especificar una única transferencia para todas las transacciones DMA creadas mediante un habilitador DMA especificado.
Establecimiento de una transferencia única para una transacción DMA específica
Para establecer una transferencia única para una sola transacción, use la siguiente secuencia:
- Llame a WdfDmaTransactionCreate o WdfDmaTransactionRelease.
- Llame a WdfDmaTransactionSetSingleTransferRequirement.
- Llame a WdfDmaTransactionInitialize.
Si se produce un error en la inicialización debido a la fragmentación de transacciones, un controlador puede producir un error en la solicitud de E/S o puede reorganizar los búferes de memoria de la transacción y reinicializar la transacción. - Llame a WdfDmaTransactionExecute.
Al depurar el controlador, puede usar la extensión !wdfkd.wdfdmatransaction para determinar si se establece una transferencia única para un objeto de transacción determinado.
Establecimiento del requisito de transferencia única para todas las transacciones de DMA creadas con un habilitador de DMA determinado
Para establecer una transferencia única para todas las transacciones creadas con un habilitador determinado, especifique la marca WDF_DMA_ENABLER_CONFIG_REQUIRE_SINGLE_TRANSFER en WDF_DMA_ENABLER_CONFIG_FLAGS al llamar a WdfDmaEnablerCreate.
Un controlador que usa esta marca no necesita llamar a WdfDmaTransactionSetSingleTransferRequirement cada vez que crea o reutiliza un objeto de transacción.
Esta configuración también persiste si el controlador reutiliza el objeto de transacción.
Al depurar, use la extensión !wdfkd.wdfdmaenabler para determinar si se establece una transferencia única para un objeto habilitador DMA determinado.
Para obtener información sobre el orden en que WDF llama a las funciones de devolución de llamada de eventos DMA del controlador, consulte Control de solicitudes de E/S en un controlador KMDF para un dispositivo DMA de Bus-Master.