dmaengine: idma64: improve residue estimation
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 14 Sep 2015 08:55:36 +0000 (11:55 +0300)
committerVinod Koul <vinod.koul@intel.com>
Fri, 25 Sep 2015 02:21:16 +0000 (07:51 +0530)
commit0b23a1ece9be2c3e04c3b8d3594a1ada1fa1ae50
treeb72250d28adee020ab9ca2ec7c135466ddbf15a4
parentc1492b4c541e3a382b60f1b5879cd3c4d246ad31
dmaengine: idma64: improve residue estimation

The residue calculation may provide a wrong estimation when the transfer is
started. There are possible scenarios we have to separate:

1) the transfer is not started yet; residue is equal to the total
   length;

2) the transfer is just started (first chunk is ongoing); residue is
   equal to the total length without already transfered bytes;

3) the transfer is ongoing and we already sent few chunks of data;
   residue is equal to the total length without fully transfered chunks
   and already sent bytes.

Mistakenly the calculation in cases 2) and 3) was done in the similar way and
the result is equal to -bytes that have been transfered, i.e. quite big since
size_t type can't keep negative values.

Rewrite the calculation algorithm to be one pass and have a correct result.

Besides above in case user asks for a status of the active DMA descriptor
without pausing an ongoing transfer the residue will be estimated based on the
register value, though it's still racy. Since the transfer is active the value
is continuously being changed. Here we have to read two registers at a time. To
minimize an error make those reads close to each other.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/idma64.c