mmc: sdhci: Clear pointers when a request finishes
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 29 Jun 2016 13:24:30 +0000 (16:24 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 25 Jul 2016 08:34:41 +0000 (10:34 +0200)
Several pointers are used to identify when interrupts are expected. Namely,
host->cmd, host->data_cmd and host->data. Ensure those are cleared when
a request finishes. That tidies the case when a request is errored out
before normal processing has completed, ensuring any interrupts that occur
subsequently are not acted upon.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index 320c294..dce31b7 100644 (file)
@@ -935,6 +935,15 @@ static bool sdhci_needs_reset(struct sdhci_host *host, struct mmc_request *mrq)
 
 static void sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
 {
+       if (host->cmd && host->cmd->mrq == mrq)
+               host->cmd = NULL;
+
+       if (host->data_cmd && host->data_cmd->mrq == mrq)
+               host->data_cmd = NULL;
+
+       if (host->data && host->data->mrq == mrq)
+               host->data = NULL;
+
        if (sdhci_needs_reset(host, mrq))
                host->pending_reset = true;
 
@@ -2240,9 +2249,6 @@ static void sdhci_tasklet_finish(unsigned long param)
        }
 
        host->mrq = NULL;
-       host->cmd = NULL;
-       host->data = NULL;
-       host->data_cmd = NULL;
 
        sdhci_led_deactivate(host);