ограничение для NumberOfElements в списке разброса/сбора

Мой драйвер устройства для 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 ГБ), но кажется, что NumberOfElements чем-то ограничен, каким-то образом большая передача составляет 1 МБ (255 элементов в списке, каждый 4k). я изменил MaximumTransfecrLength в функции ниже на 500 МБ:

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

но все же я не могу передать более 1 МБ. что ограничивает NumberOfElements и как я могу это решить?


person Mahnaz    schedule 03.05.2016    source источник


Ответы (1)


Мне нужно было изменить второй параметр в функции WDF_DMA_ENABLER_CONFIG_INIT на WdfDmaProfileScatterGather64, и, конечно же, мы должны убедиться, что аппаратное обеспечение (FPGA или что-то другое на другой стороне конечной точки PCIE) может поддерживать 64-битный режим адресации.

Я просто меняю свой код, как показано ниже:

WDF_DMA_ENABLER_CONFIG_INIT(&dmaConfig,
            WdfDmaProfileScatterGather64,
            deviceContext->MaximumTransferLength);
person Mahnaz    schedule 17.04.2017