diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2016-03-18 14:26:33 +0200 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2016-04-04 09:41:43 -0700 |
commit | a197f3c7d48c0c1f45076ea47533a76ba9b1a959 (patch) | |
tree | 15a03b790467c8d417e5bfe6714d686b0122d1c9 | |
parent | 080edf75d337d35faa6fc3df99342b10d2848d16 (diff) | |
download | linux-a197f3c7d48c0c1f45076ea47533a76ba9b1a959.tar.gz linux-a197f3c7d48c0c1f45076ea47533a76ba9b1a959.tar.bz2 linux-a197f3c7d48c0c1f45076ea47533a76ba9b1a959.zip |
dmaengine: hsu: correct residue calculation of active descriptor
The commit f0579c8ceaf1 ("dmaengine: hsu: speed up residue calculation")
speeded up calculation of the queued descriptor but broke the initial residue
value for active descriptor.
In accordance with documentation the hardware descriptor is updated each time
DMA transfered some bytes. It means we have to calculate a sum of lengths of
non-submitted hardware descriptors and whatever current values in the hardware.
Do this straightforward.
Fixes: f0579c8ceaf1 ("dmaengine: hsu: speed up residue calculation")
Cc: stable@vger.kernel.org
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r-- | drivers/dma/hsu/hsu.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c index c7643e022578..b3b212146620 100644 --- a/drivers/dma/hsu/hsu.c +++ b/drivers/dma/hsu/hsu.c @@ -254,10 +254,13 @@ static void hsu_dma_issue_pending(struct dma_chan *chan) static size_t hsu_dma_active_desc_size(struct hsu_dma_chan *hsuc) { struct hsu_dma_desc *desc = hsuc->desc; - size_t bytes = desc->length; + size_t bytes = 0; int i; - i = desc->active % HSU_DMA_CHAN_NR_DESC; + for (i = desc->active; i < desc->nents; i++) + bytes += desc->sg[i].len; + + i = HSU_DMA_CHAN_NR_DESC - 1; do { bytes += hsu_chan_readl(hsuc, HSU_CH_DxTSR(i)); } while (--i >= 0); |