Hi Vinod, and all
Cc Guennadi

I need your opinion

Now, my USB driver is using DMAEngine,
but, in "data receive" case, it doesn't know the exact received data size
before DMA starting, since USB device doesn't know how many data will be sent.
Then, (I think) USB driver is using enough size buffer for it.

Now, our USB-DMAC will stop if
1) specified size transfer was done, or 2) if it got short packet

pseudo code is like this...

   buf = 2048 byte // enough size
   dma_start(buf, size);

   if 1) case
      actual received size was 2048 byte
   if 2) case
      actual received size was 800 byte for example

Now, I need to get this "actual received data size" somehow

Guennadi noticed that dmaengine_tx_status() can return dma_tx_state::residue.
According to the header file, residue should only be returned,
if the transfer is still in progress or has been paused.
But it can help me if we can extend this API to also allow setting
this value for completed transfers.

The pseudo code which can help me is above.
But what do you think about it ?
Or do you have any other solution ?

void dma_done()
{
     /*
      * Now DMA transfer has done
      * this struct dma_tx_state::residue means
      * "real" residue
      */
     dmaengine_tx_status(..., &status);

     if (status->residue > 0) {
         /*
          * 2) case can come here.
          * if actual transferred data was 800,
          * status->residue is (2048 - 800)
          */
     }
}

void my_dma_start()
{
    len = 2048; // for example

    desc = dmaengine_prep_slave_single(..., len, ...);

    desc->callback = dma_done;

    dmaengine_submit(desc);

}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to