1
0
Fork 0

MLK-22909 dmaengine: fsl-edma-v3: clear interrupt coming after channel terminated

Clear EDMA_CH_INT in case dma done interrupt comes after channel terminated
instead of channel free-ed, otherwise, RCU maybe caught because it's
ignored without interrupt status cleared as Android team report in Monkey
test.

Signed-off-by: Robin Gong <yibin.gong@nxp.com>
Acked-by: Fugang Duan <fugang.duan@nxp.com>
(cherry picked from commit ef91ff6ed465cebe2fe6483a480351abba36e237)
(cherry picked from commit 56ee55c71c5f3ef254acb4dee581e68f79ef13a5)
5.4-rM2-2.2.x-imx-squashed
Robin Gong 2019-11-05 21:32:22 +08:00 committed by Dong Aisheng
parent 3f8b89fadd
commit 5882a6f8ef
1 changed files with 6 additions and 2 deletions

View File

@ -710,8 +710,8 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id)
spin_lock(&fsl_chan->vchan.lock);
/* Ignore this interrupt since channel has been disabled already */
if (!fsl_chan->edesc)
/* Ignore this interrupt since channel has been freeed with power off */
if (!fsl_chan->edesc && !fsl_chan->tcd_pool)
goto irq_handled;
base_addr = fsl_chan->membase;
@ -722,6 +722,10 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id)
writel(1, base_addr + EDMA_CH_INT);
/* Ignore this interrupt since channel has been disabled already */
if (!fsl_chan->edesc)
goto irq_handled;
if (!fsl_chan->edesc->iscyclic) {
fsl_edma3_get_realcnt(fsl_chan);
list_del(&fsl_chan->edesc->vdesc.node);