static void sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
 {
+       if (sdhci_needs_reset(host, mrq))
+               host->pending_reset = true;
+
        tasklet_schedule(&host->finish_tasklet);
 }
 
                   controllers do not like that. */
                sdhci_do_reset(host, SDHCI_RESET_CMD);
                sdhci_do_reset(host, SDHCI_RESET_DATA);
+
+               host->pending_reset = false;
        }
 
        host->mrq = NULL;
 static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask)
 {
        if (!host->cmd) {
+               /*
+                * SDHCI recovers from errors by resetting the cmd and data
+                * circuits.  Until that is done, there very well might be more
+                * interrupts, so ignore them in that case.
+                */
+               if (host->pending_reset)
+                       return;
                pr_err("%s: Got command interrupt 0x%08x even though no command operation was in progress.\n",
                       mmc_hostname(host->mmc), (unsigned)intmask);
                sdhci_dumpregs(host);
                        }
                }
 
+               /*
+                * SDHCI recovers from errors by resetting the cmd and data
+                * circuits. Until that is done, there very well might be more
+                * interrupts, so ignore them in that case.
+                */
+               if (host->pending_reset)
+                       return;
+
                pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
                       mmc_hostname(host->mmc), (unsigned)intmask);
                sdhci_dumpregs(host);
 
        bool runtime_suspended; /* Host is runtime suspended */
        bool bus_on;            /* Bus power prevents runtime suspend */
        bool preset_enabled;    /* Preset is enabled */
+       bool pending_reset;     /* Cmd/data reset is pending */
 
        struct mmc_request *mrq;        /* Current request */
        struct mmc_command *cmd;        /* Current command */