分散/收集列表中NumberOfElements的限制

时间:2016-05-03 11:46:09

标签: driver device dma pci-e wdf

我的PCIe FPGA设备驱动程序基于7600.16385.1 \ src \ general \ PLX9x5x

在应用程序中的ReadFile上,调用PLxEvtIoRead:

//
// Initialize this new DmaTransaction.
//
status = WdfDmaTransactionInitializeUsingRequest(
                                              devExt->ReadDmaTransaction,
                                              Request,
                                              PLxEvtProgramReadDma,
                                              WdfDmaDirectionReadFromDevice );

//
// Execute this DmaTransaction.
//

status = WdfDmaTransactionExecute( devExt->ReadDmaTransaction, 
                                           WDF_NO_CONTEXT);

....

Upon calling to WdfDmaTransactionExecute, PLxEvtProgramReadDma is called. 

BOOLEAN
PLxEvtProgramReadDma(
    IN  WDFDMATRANSACTION       Transaction,
    IN  WDFDEVICE               Device,
    IN  WDFCONTEXT              Context,
    IN  WDF_DMA_DIRECTION       Direction,
    IN  PSCATTER_GATHER_LIST    SgList
    )
{
    KdPrint ((???SgList->NumberOfElements = %d\n???,SgList->NumberOfElements));

}

问题: 我想通过这个Scatter / Gather列表(大约1 GB)传输大量数据,但似乎NumberOfElements受某些东西限制,不知何故大型传输是1MB(列表中255个元素,每个4k)。我将下面函数中的MaximumTransfecrLength更改为500MB:

WDF_DMA_ENABLER_CONFIG_INIT(&dmaConfig,
                         WdfDmaProfileScatterGatherDuplex,
                         deviceContext->MaximumTransferLength);

但我仍然无法转移超过1MB。 什么是限制NumberOfElements以及我如何解决它?

1 个答案:

答案 0 :(得分:0)

我需要将WDF_DMA_ENABLER_CONFIG_INIT函数中的第二个参数更改为WdfDmaProfileScatterGather64,当然我们必须确保硬件(FPGA或PCIE端点另一端的任何内容)都能支持64位寻址模式。

我只需更改我的代码如下:

WDF_DMA_ENABLER_CONFIG_INIT(&dmaConfig,
            WdfDmaProfileScatterGather64,
            deviceContext->MaximumTransferLength);