From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from bhuna.collabora.co.uk ([46.235.227.227]:57753 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752048AbdAZBXn (ORCPT ); Wed, 25 Jan 2017 20:23:43 -0500 From: Gabriel Krisman Bertazi To: stable@vger.kernel.org Subject: [PATCH] mmc: sdhci: Ignore unexpected CARD_INT interrupts Date: Wed, 25 Jan 2017 23:23:35 -0200 Message-Id: <20170126012335.28878-1-krisman@collabora.co.uk> Sender: stable-owner@vger.kernel.org List-ID: Hi Greg, The following patch prevents an illegal command from getting sent to SD cards, which in turn avoids a lock-up during boot. Can you please apply to the 4.9 and 4.4 stable trees? The patch was generated against the 4.9 and there will be a trivial context conflict when applying to the 4.4.y branch. If you prefer, I can resend another version against that branch. Thanks! -- >8 -- commit 5b19196de18e1522630326c80a40a64181c78a1c 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 Signed-off-by: Gabriel Krisman Bertazi Acked-by: Adrian Hunter Signed-off-by: Ulf Hansson (cherry picked from commit 5b19196de18e1522630326c80a40a64181c78a1c) --- drivers/mmc/host/sdhci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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) if (intmask & SDHCI_INT_RETUNE) mmc_retune_needed(host->mmc); - if (intmask & SDHCI_INT_CARD_INT) { + if ((intmask & SDHCI_INT_CARD_INT) && + (host->ier & SDHCI_INT_CARD_INT)) { sdhci_enable_sdio_irq_nolock(host, false); host->thread_isr |= SDHCI_INT_CARD_INT; result = IRQ_WAKE_THREAD; -- 2.11.0