diff options
| author | Gabriel Krisman Bertazi <krisman@collabora.co.uk> | 2017-01-16 09:23:42 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-02-09 02:08:28 -0500 |
| commit | 04eb7db25bb1bcf4ee1631d1099fc03308929c12 (patch) | |
| tree | fbf2b11f06c0a23d08d85cb9350ca4ae6d2cc6d8 /drivers/mmc/host | |
| parent | 1d88791d5ed5dae4ff8cbbf6147e90ff95d92ba9 (diff) | |
mmc: sdhci: Ignore unexpected CARD_INT interrupts
commit 161e6d44a5e2d3f85365cb717d60e363171b39e6 upstream.
One of our kernelCI boxes hanged at boot because a faulty eSDHC device
was triggering spurious CARD_INT interrupts for SD cards, causing CMD52
reads, which are not allowed for SD devices. This adds a sanity check
to the interruption path, preventing that illegal command from getting
sent if the CARD_INT interruption should be disabled.
This quirk allows that particular machine to resume boot despite the
faulty hardware, instead of getting hung dealing with thousands of
mishandled interrupts.
Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/mmc/host')
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index e1e274a0a34f..ba637ff8aa7e 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -2719,7 +2719,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) | |||
| 2719 | if (intmask & SDHCI_INT_RETUNE) | 2719 | if (intmask & SDHCI_INT_RETUNE) |
| 2720 | mmc_retune_needed(host->mmc); | 2720 | mmc_retune_needed(host->mmc); |
| 2721 | 2721 | ||
| 2722 | if (intmask & SDHCI_INT_CARD_INT) { | 2722 | if ((intmask & SDHCI_INT_CARD_INT) && |
| 2723 | (host->ier & SDHCI_INT_CARD_INT)) { | ||
| 2723 | sdhci_enable_sdio_irq_nolock(host, false); | 2724 | sdhci_enable_sdio_irq_nolock(host, false); |
| 2724 | host->thread_isr |= SDHCI_INT_CARD_INT; | 2725 | host->thread_isr |= SDHCI_INT_CARD_INT; |
| 2725 | result = IRQ_WAKE_THREAD; | 2726 | result = IRQ_WAKE_THREAD; |
