On Mon, 18 Feb 2019 at 18:45, Sergei Shtylyov
<[email protected]> wrote:
>
> I have encountered an interrupt storm during the eMMC chip probing (and
> the chip finally didn't get detected). It turned out that U-Boot left
> the DMAC interrupts enabled while the Linux driver didn't use those.
> The SDHI driver's interrupt handler somehow assumes that, even if an
> SDIO interrupt didn't happen, it should return IRQ_HANDLED. I think
> that if none of the enabled interrupts happened and got handled, we
> should return IRQ_NONE -- that way the kernel IRQ code recoginizes
> a spurious interrupt and masks it off pretty quickly...
>
> Fixes: 7729c7a232a9 ("mmc: tmio: Provide separate interrupt handlers")
> Signed-off-by: Sergei Shtylyov <[email protected]>
Applied for fixes and by adding a stable tag, thanks!
Kind regards
Uffe
>
> ---
> The patch is against Ulf Hansson's 'mmc.git' repo's 'fixes' branch.
>
> Changes in version 3:
> - simplified the final *return* statement in __tmio_mmc_sdio_irq();
> - added the "Fixes:" tag;
> - cleaned up the whitespace in the patch description.
>
> Changes in version 2:
> - refreshed the patch;
> - fixed an article and whitespace in the patch description.
>
> drivers/mmc/host/tmio_mmc_core.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> Index: mmc/drivers/mmc/host/tmio_mmc_core.c
> ===================================================================
> --- mmc.orig/drivers/mmc/host/tmio_mmc_core.c
> +++ mmc/drivers/mmc/host/tmio_mmc_core.c
> @@ -629,7 +629,7 @@ static bool __tmio_mmc_sdcard_irq(struct
> return false;
> }
>
> -static void __tmio_mmc_sdio_irq(struct tmio_mmc_host *host)
> +static bool __tmio_mmc_sdio_irq(struct tmio_mmc_host *host)
> {
> struct mmc_host *mmc = host->mmc;
> struct tmio_mmc_data *pdata = host->pdata;
> @@ -637,7 +637,7 @@ static void __tmio_mmc_sdio_irq(struct t
> unsigned int sdio_status;
>
> if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
> - return;
> + return false;
>
> status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
> ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdio_irq_mask;
> @@ -650,6 +650,8 @@ static void __tmio_mmc_sdio_irq(struct t
>
> if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
> mmc_signal_sdio_irq(mmc);
> +
> + return ireg;
> }
>
> irqreturn_t tmio_mmc_irq(int irq, void *devid)
> @@ -668,9 +670,10 @@ irqreturn_t tmio_mmc_irq(int irq, void *
> if (__tmio_mmc_sdcard_irq(host, ireg, status))
> return IRQ_HANDLED;
>
> - __tmio_mmc_sdio_irq(host);
> + if (__tmio_mmc_sdio_irq(host))
> + return IRQ_HANDLED;
>
> - return IRQ_HANDLED;
> + return IRQ_NONE;
> }
> EXPORT_SYMBOL_GPL(tmio_mmc_irq);
>