On Thu, 28 Jul 2022 at 10:01, Wenbin Mei <wenbin.mei@xxxxxxxxxxxx> wrote: > > Currently we don't clear MSDC interrupts when cqe off/disable, which led > to the data complete interrupt will be reserved for the next command. > If the next command with data transfer after cqe off/disable, we process > the CMD ready interrupt and trigger DMA start for data, but the data > complete interrupt is already exists, then SW assume that the data transfer > is complete, SW will trigger DMA stop, but the data may not be transmitted > yet or is transmitting, so we may encounter the following error: > mtk-msdc 11230000.mmc: CMD bus busy detected. > > Signed-off-by: Wenbin Mei <wenbin.mei@xxxxxxxxxxxx> Applied for fixes and by adding the below tags, thanks! Fixes: 88bd652b3c74 ("mmc: mediatek: command queue support") Cc: stable@xxxxxxxxxxxxxxx Kind regards Uffe > --- > drivers/mmc/host/mtk-sd.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index 4ff73d1883de..69d78604d1fc 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -2446,6 +2446,9 @@ static void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) > /* disable busy check */ > sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > > + val = readl(host->base + MSDC_INT); > + writel(val, host->base + MSDC_INT); > + > if (recovery) { > sdr_set_field(host->base + MSDC_DMA_CTRL, > MSDC_DMA_CTRL_STOP, 1); > @@ -2932,11 +2935,14 @@ static int __maybe_unused msdc_suspend(struct device *dev) > struct mmc_host *mmc = dev_get_drvdata(dev); > struct msdc_host *host = mmc_priv(mmc); > int ret; > + u32 val; > > if (mmc->caps2 & MMC_CAP2_CQE) { > ret = cqhci_suspend(mmc); > if (ret) > return ret; > + val = readl(host->base + MSDC_INT); > + writel(val, host->base + MSDC_INT); > } > > /* > -- > 2.25.1 >