mmc: sdhci: fix error conditions for controller reset
authorAndrew Gabbasov <andrew_gabbasov@mentor.com>
Wed, 1 Oct 2014 12:14:08 +0000 (07:14 -0500)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 10 Nov 2014 11:40:27 +0000 (12:40 +0100)
Add the case of SET_BLOCK_COUNT command error to the error conditions
check for making a controller reset at request handling finish.
Otherwise, if the SET_BLOCK_COUNT command failed, e.g. with a timeout,
the controller state was not reset, and the next command failed too.

In the case of data error the controller reset is already done in
finish_data() function before sending stop command (if present),
so the finish tasklet should make a reset after data error only
if no stop command existed in the request.

Also, fix the indentation of this condition check to make it more logical.

Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c

index 179ce06eec732eaec918228d7309da5c68c726bd..062222abf3dfa31d8836f15c6c2690ff8762d6c0 100644 (file)
@@ -2144,9 +2144,10 @@ static void sdhci_tasklet_finish(unsigned long param)
         */
        if (!(host->flags & SDHCI_DEVICE_DEAD) &&
            ((mrq->cmd && mrq->cmd->error) ||
-                (mrq->data && (mrq->data->error ||
-                 (mrq->data->stop && mrq->data->stop->error))) ||
-                  (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {
+            (mrq->sbc && mrq->sbc->error) ||
+            (mrq->data && ((mrq->data->error && !mrq->data->stop) ||
+                           (mrq->data->stop && mrq->data->stop->error))) ||
+            (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {
 
                /* Some controllers need this kick or reset won't work here */
                if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET)