2016-05-03 7 views
0

Mein Gerätetreiber für einen PCIe FPGA auf 7600.16385.1 basiert \ src \ general \ PLX9x5xBegrenzung für NumberOfElements in Scatter/Gather-Liste

Nach ReadFile- in der Anwendung wird PLxEvtIoRead genannt:

// 
// 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)); 

} 

Das Problem: Ich möchte eine große Menge von Daten über diese Scatter/Gather-Liste (ca. 1 GB) übertragen, aber NumberOfElements scheint durch etwas begrenzt, irgendwie ist die große Übertragung 1MB (255 Element in der Liste, je 4k). i geändert MaximumTransfecrLength in Funktion unten zu 500MB:

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

aber immer noch kann ich nicht mehr als 1 MB übertragen. Was ist die Sache, die NumberOfElements begrenzt und wie ich es lösen kann?

Antwort

0

Ich musste den zweiten Parameter in der Funktion WDF_DMA_ENABLER_CONFIG_INIT zu WdfDmaProfileScatterGather64 ändern, und natürlich müssen wir sicherstellen, dass die Hardware (FPGA oder irgendetwas auf der anderen Seite des PCIE-Endpunkts) den 64-Bit-Adressierungsmodus unterstützt.

ich meinen Code wie unten ändern:

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