How to get actual received data size on DMAEngine ?

From: Kuninori Morimoto
Date: Mon Jun 24 2013 - 04:11:38 EST



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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/