mmc: sdhci: Correct the tuning command handle for PIO mode
authorHaibo Chen <haibo.chen@nxp.com>
Fri, 13 Aug 2021 12:34:01 +0000 (20:34 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 24 Aug 2021 13:05:03 +0000 (15:05 +0200)
If sdhci use PIO mode, and use mmc_send_tuning() to send the tuning
command, system will stuck because of the storm irq of sdhci. For PIO mode,
use mmc_send_tuning(), it will trigger buffer_read_ready interrupt and data
transfer complete interrupt.  In current code logic, it will directly
return in sdhci_data_irq, can not call the sdhci_transfer_pio(). So the
buffer_read_ready interrupt storm happen. So for standard tuning method,
need to exclude this case.

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/1628858041-1911-1-git-send-email-haibo.chen@nxp.com
[Ulf: Dropped redundant parenthesis in an expression]
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index 36f15f81a6af7ffd626604c82d145e5794a3692c..8eefa7d5fe85e405da0d978709dabcc097f18e20 100644 (file)
@@ -3279,8 +3279,14 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 {
        u32 command;
 
-       /* CMD19 generates _only_ Buffer Read Ready interrupt */
-       if (intmask & SDHCI_INT_DATA_AVAIL) {
+       /*
+        * CMD19 generates _only_ Buffer Read Ready interrupt if
+        * use sdhci_send_tuning.
+        * Need to exclude this case: PIO mode and use mmc_send_tuning,
+        * If not, sdhci_transfer_pio will never be called, make the
+        * SDHCI_INT_DATA_AVAIL always there, stuck in irq storm.
+        */
+       if (intmask & SDHCI_INT_DATA_AVAIL && !host->data) {
                command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
                if (command == MMC_SEND_TUNING_BLOCK ||
                    command == MMC_SEND_TUNING_BLOCK_HS200) {