mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
dmaengine: dw: Move check for paused channel to dwc_get_residue()
Move check for paused channel to dwc_get_residue() and rename the latter to dwc_get_residue_and_status(). This improves data integrity as residue and DMA channel status are set in the same function under the same conditions. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20230130151747.20704-1-andriy.shevchenko@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
9284699861
commit
255ccd8b16
@ -889,7 +889,8 @@ static struct dw_desc *dwc_find_desc(struct dw_dma_chan *dwc, dma_cookie_t c)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static u32 dwc_get_residue(struct dw_dma_chan *dwc, dma_cookie_t cookie)
|
||||
static u32 dwc_get_residue_and_status(struct dw_dma_chan *dwc, dma_cookie_t cookie,
|
||||
enum dma_status *status)
|
||||
{
|
||||
struct dw_desc *desc;
|
||||
unsigned long flags;
|
||||
@ -903,6 +904,8 @@ static u32 dwc_get_residue(struct dw_dma_chan *dwc, dma_cookie_t cookie)
|
||||
residue = desc->residue;
|
||||
if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags) && residue)
|
||||
residue -= dwc_get_sent(dwc);
|
||||
if (test_bit(DW_DMA_IS_PAUSED, &dwc->flags))
|
||||
*status = DMA_PAUSED;
|
||||
} else {
|
||||
residue = desc->total_len;
|
||||
}
|
||||
@ -932,11 +935,7 @@ dwc_tx_status(struct dma_chan *chan,
|
||||
if (ret == DMA_COMPLETE)
|
||||
return ret;
|
||||
|
||||
dma_set_residue(txstate, dwc_get_residue(dwc, cookie));
|
||||
|
||||
if (test_bit(DW_DMA_IS_PAUSED, &dwc->flags) && ret == DMA_IN_PROGRESS)
|
||||
return DMA_PAUSED;
|
||||
|
||||
dma_set_residue(txstate, dwc_get_residue_and_status(dwc, cookie, &ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user