DMA 트랜잭션 완료

[KMDF에만 적용]

드라이버의 디바이스가 DMA 전송을 완료할 때마다 드라이버는 WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength 또는 WdfDmaTransactionDmaCompletedFinal을 호출한 다음 반환 값을 검사 합니다.

반환 값이 TRUE이면 DMA 트랜잭션에 더 이상 전송이 필요하지 않으며 드라이버는 DMA 트랜잭션을 완료해야 합니다. 일반적으로 드라이버는 EvtInterruptDpc 콜백 함수에서 아직 반환되지 않았습니다. 따라서 이 콜백 함수는 다음을 통해 DMA 트랜잭션을 완료합니다.

  1. WdfObjectDelete를 호출하여 트랜잭션 개체를 삭제하거나 드라이버가 DMA 트랜잭션 개체를 다시 사용하는 경우 WdfDmaTransactionRelease를 호출합니다.

  2. 트랜잭션이 프레임워크 요청 개체와 연결된 경우 WdfRequestComplete 또는 WdfRequestCompleteWithInformation을 호출합니다.

드라이버가 WdfRequestCompleteWithInformation을 호출하는 경우 일반적으로 먼저 WdfDmaTransactionGetBytesTransferred 를 호출하여 모든 트랜잭션 전송의 총 길이(바이트 수)를 가져옵니다.

이러한 단계는 Isrdpc.c 파일의 PLX9x5x 샘플 EvtInterruptDpc 콜백 함수에서 가져온 다음 코드 예제에 설명되어 있습니다.

if (readComplete) {
    BOOLEAN              transactionComplete;
    WDFDMATRANSACTION    dmaTransaction;
    size_t               bytesTransferred;

    // Get the current Read DmaTransaction.
    dmaTransaction = devExt->CurrentReadDmaTransaction;

    // Indicate that this DMA operation has completed:
    // This may start the transfer on the next packet if 
    // there is still data to be transferred.
    transactionComplete = 
          WdfDmaTransactionDmaCompleted( dmaTransaction, &status ); 
    if (transactionComplete) {
        // Complete the DmaTransaction and the request.
        devExt->CurrentReadDmaTransaction = NULL;
        bytesTransferred =  
               ((NT_SUCCESS(status)) ? 
               WdfDmaTransactionGetBytesTransferred(dmaTransaction): 0 );
        WdfDmaTransactionRelease(dmaTransaction);
        WdfRequestCompleteWithInformation(request, status, bytesTransferred);
    }
}