Message ID | 20190523145950.7030-1-jbrunet@baylibre.com |
---|---|
State | New |
Headers | show |
Series | mmc: meson-gx: fix irq ack | expand |
Jerome Brunet <jbrunet@baylibre.com> writes: > While cleaning the ISR of the meson-gx and acking only raised irqs, > the ack of the irq was moved at the very last stage of the function. > > This was stable during the initial tests but it triggered issues with > hs200, under specific loads (like booting android). Acking the irqs > after calling the mmc_request_done() causes the problem. > > Moving the ack back to the original place solves the issue. Since the > irq is edge triggered, it does not hurt to ack irq even earlier, so > let's do it early in the ISR. > > Fixes: 9c5fdb07a28d ("mmc: meson-gx: ack only raised irq") > Tested-by: Neil Armstrong <narmstrong@baylibre.com> > Tested-by: Kevin Hilman <khilman@baylibre.com> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Kevin Hilman <khilman@baylibre.com> And to be clear, this fix should go into v5.2-rc. My Tested-by is already above, but just for the benefit of the archives... tested this on mainline, and also on a v4.19 backport with Android and it fixes issues see there. Kevin
On 24/05/2019 12:59 am, Jerome Brunet wrote: > While cleaning the ISR of the meson-gx and acking only raised irqs, > the ack of the irq was moved at the very last stage of the function. > > This was stable during the initial tests but it triggered issues with > hs200, under specific loads (like booting android). Acking the irqs > after calling the mmc_request_done() causes the problem. > > Moving the ack back to the original place solves the issue. Since the > irq is edge triggered, it does not hurt to ack irq even earlier, so > let's do it early in the ISR. > > Fixes: 9c5fdb07a28d ("mmc: meson-gx: ack only raised irq") > Tested-by: Neil Armstrong <narmstrong@baylibre.com> > Tested-by: Kevin Hilman <khilman@baylibre.com> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> > --- > drivers/mmc/host/meson-gx-mmc.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c > index 6ef465304052..cb3f6811d69a 100644 > --- a/drivers/mmc/host/meson-gx-mmc.c > +++ b/drivers/mmc/host/meson-gx-mmc.c > @@ -873,6 +873,9 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) > if (WARN_ON(!host) || WARN_ON(!host->cmd)) > return IRQ_NONE; > > + /* ack all raised interrupts */ > + writel(status, host->regs + SD_EMMC_STATUS); > + > cmd = host->cmd; > data = cmd->data; > cmd->error = 0; > @@ -919,9 +922,6 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) > if (ret == IRQ_HANDLED) > meson_mmc_request_done(host->mmc, cmd->mrq); > > - /* ack all raised interrupts */ > - writel(status, host->regs + SD_EMMC_STATUS); > - > return ret; > } > > This patch resolves issues I was having with hung tasks waiting for emmc & sd cards on the odroid N2. Tested-by: Brad Harper <bjharper@gmail.com>
On Thu, 23 May 2019 at 16:59, Jerome Brunet <jbrunet@baylibre.com> wrote: > > While cleaning the ISR of the meson-gx and acking only raised irqs, > the ack of the irq was moved at the very last stage of the function. > > This was stable during the initial tests but it triggered issues with > hs200, under specific loads (like booting android). Acking the irqs > after calling the mmc_request_done() causes the problem. > > Moving the ack back to the original place solves the issue. Since the > irq is edge triggered, it does not hurt to ack irq even earlier, so > let's do it early in the ISR. > > Fixes: 9c5fdb07a28d ("mmc: meson-gx: ack only raised irq") > Tested-by: Neil Armstrong <narmstrong@baylibre.com> > Tested-by: Kevin Hilman <khilman@baylibre.com> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Applied for fixes, thanks! Kind regards Uffe > --- > drivers/mmc/host/meson-gx-mmc.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c > index 6ef465304052..cb3f6811d69a 100644 > --- a/drivers/mmc/host/meson-gx-mmc.c > +++ b/drivers/mmc/host/meson-gx-mmc.c > @@ -873,6 +873,9 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) > if (WARN_ON(!host) || WARN_ON(!host->cmd)) > return IRQ_NONE; > > + /* ack all raised interrupts */ > + writel(status, host->regs + SD_EMMC_STATUS); > + > cmd = host->cmd; > data = cmd->data; > cmd->error = 0; > @@ -919,9 +922,6 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) > if (ret == IRQ_HANDLED) > meson_mmc_request_done(host->mmc, cmd->mrq); > > - /* ack all raised interrupts */ > - writel(status, host->regs + SD_EMMC_STATUS); > - > return ret; > } > > -- > 2.20.1 >
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c index 6ef465304052..cb3f6811d69a 100644 --- a/drivers/mmc/host/meson-gx-mmc.c +++ b/drivers/mmc/host/meson-gx-mmc.c @@ -873,6 +873,9 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) if (WARN_ON(!host) || WARN_ON(!host->cmd)) return IRQ_NONE; + /* ack all raised interrupts */ + writel(status, host->regs + SD_EMMC_STATUS); + cmd = host->cmd; data = cmd->data; cmd->error = 0; @@ -919,9 +922,6 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) if (ret == IRQ_HANDLED) meson_mmc_request_done(host->mmc, cmd->mrq); - /* ack all raised interrupts */ - writel(status, host->regs + SD_EMMC_STATUS); - return ret; }