| From 3061bbddec5be95283b8ad89d5f0269688f3f783 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 29 Aug 2018 23:32:56 +0200 |
| Subject: dmaengine: dma-jz4780: Further residue status fix |
| |
| From: Daniel Silsby <dansilsby@gmail.com> |
| |
| [ Upstream commit 83ef4fb7556b6a673f755da670cbacab7e2c7f1b ] |
| |
| Func jz4780_dma_desc_residue() expects the index to the next hw |
| descriptor as its last parameter. Caller func jz4780_dma_tx_status(), |
| however, applied modulus before passing it. When the current hw |
| descriptor was last in the list, the index passed became zero. |
| |
| The resulting excess of reported residue especially caused problems |
| with cyclic DMA transfer clients, i.e. ALSA AIC audio output, which |
| rely on this for determining current DMA location within buffer. |
| |
| Combined with the recent and related residue-reporting fixes, spurious |
| ALSA audio underruns on jz4770 hardware are now fixed. |
| |
| Signed-off-by: Daniel Silsby <dansilsby@gmail.com> |
| Signed-off-by: Paul Cercueil <paul@crapouillou.net> |
| Tested-by: Mathieu Malaterre <malat@debian.org> |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/dma/dma-jz4780.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c |
| index 987899610b461..edff93aacad36 100644 |
| --- a/drivers/dma/dma-jz4780.c |
| +++ b/drivers/dma/dma-jz4780.c |
| @@ -587,7 +587,7 @@ static enum dma_status jz4780_dma_tx_status(struct dma_chan *chan, |
| to_jz4780_dma_desc(vdesc), 0); |
| } else if (cookie == jzchan->desc->vdesc.tx.cookie) { |
| txstate->residue = jz4780_dma_desc_residue(jzchan, jzchan->desc, |
| - (jzchan->curr_hwdesc + 1) % jzchan->desc->count); |
| + jzchan->curr_hwdesc + 1); |
| } else |
| txstate->residue = 0; |
| |
| -- |
| 2.20.1 |
| |