Commit d3183447 authored by Jon Hunter's avatar Jon Hunter Committed by Vinod Koul

dmaengine: tegra-apb: Return the actual descriptor status

Commit 71f7e6cc ('dmaengine: tegra20-apb-dma: Only calculate residue
if txstate exists') changed the tegra_dma_tx_status() function to only
calculate the residue if there is a valid 'txstate' pointer for storing
the residue. Although this makes sense, this changed the behaviour of
the function tegra_dma_tx_status() such that if the pointer 'txstate' is
not valid, then we will return whatever state is returned by
dma_cookie_status() and no longer return the state by looking up the DMA
descriptor and returning it's state.

Please note that dma_cookie_status() will either return DMA_COMPLETE or
DMA_IN_PROGRESS. However, if dma_cookie_status() returns DMA_IN_PROGRESS
the actual status could be DMA_ERROR which will only be seen from
checking the descriptor status. Therefore, even if 'txstate' is not
valid, still check to see if there is a valid descriptor for the cookie
in question and if so return the descriptor state. Finally, ensure the
residue is still not calculated if the 'txstate' is not valid.
Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent 004f614e
...@@ -811,7 +811,7 @@ static enum dma_status tegra_dma_tx_status(struct dma_chan *dc, ...@@ -811,7 +811,7 @@ static enum dma_status tegra_dma_tx_status(struct dma_chan *dc,
unsigned int residual; unsigned int residual;
ret = dma_cookie_status(dc, cookie, txstate); ret = dma_cookie_status(dc, cookie, txstate);
if (ret == DMA_COMPLETE || !txstate) if (ret == DMA_COMPLETE)
return ret; return ret;
spin_lock_irqsave(&tdc->lock, flags); spin_lock_irqsave(&tdc->lock, flags);
...@@ -837,7 +837,7 @@ static enum dma_status tegra_dma_tx_status(struct dma_chan *dc, ...@@ -837,7 +837,7 @@ static enum dma_status tegra_dma_tx_status(struct dma_chan *dc,
dma_desc = NULL; dma_desc = NULL;
found: found:
if (dma_desc) { if (dma_desc && txstate) {
residual = dma_desc->bytes_requested - residual = dma_desc->bytes_requested -
(dma_desc->bytes_transferred % (dma_desc->bytes_transferred %
dma_desc->bytes_requested); dma_desc->bytes_requested);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment