Re: [PATCH v3] mmc: tmio_mmc_core: don't claim spurious interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 18 Feb 2019 at 18:45, Sergei Shtylyov
<sergei.shtylyov@xxxxxxxxxxxxxxxxxx> 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 <sergei.shtylyov@xxxxxxxxxxxxxxxxxx>

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);
>



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux