aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/sdhci.c
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2007-07-25 17:15:27 -0400
committerPierre Ossman <drzeus@drzeus.cx>2007-07-25 19:53:01 -0400
commit43b58b36b7e6554b8a96be6b9f63542c583c06e5 (patch)
tree5a8cdcfc2bb018a75c2d12d894d85e1835eed69a /drivers/mmc/host/sdhci.c
parentb8c1c5da1520977cb55a358f20fc09567d40cad9 (diff)
mmc: check error bits before command completion
Some controllers signal "command complete" even on failures (which they are allowed to do according to the spec). Make sure we check the error bits first so we don't get any false positives. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
-rw-r--r--drivers/mmc/host/sdhci.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 4a24db028d87..56de4c48ec80 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -922,20 +922,17 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
922 return; 922 return;
923 } 923 }
924 924
925 if (intmask & SDHCI_INT_RESPONSE) 925 if (intmask & SDHCI_INT_TIMEOUT)
926 sdhci_finish_command(host); 926 host->cmd->error = MMC_ERR_TIMEOUT;
927 else { 927 else if (intmask & SDHCI_INT_CRC)
928 if (intmask & SDHCI_INT_TIMEOUT) 928 host->cmd->error = MMC_ERR_BADCRC;
929 host->cmd->error = MMC_ERR_TIMEOUT; 929 else if (intmask & (SDHCI_INT_END_BIT | SDHCI_INT_INDEX))
930 else if (intmask & SDHCI_INT_CRC) 930 host->cmd->error = MMC_ERR_FAILED;
931 host->cmd->error = MMC_ERR_BADCRC; 931
932 else if (intmask & (SDHCI_INT_END_BIT | SDHCI_INT_INDEX)) 932 if (host->cmd->error != MMC_ERR_NONE)
933 host->cmd->error = MMC_ERR_FAILED;
934 else
935 host->cmd->error = MMC_ERR_INVALID;
936
937 tasklet_schedule(&host->finish_tasklet); 933 tasklet_schedule(&host->finish_tasklet);
938 } 934 else if (intmask & SDHCI_INT_RESPONSE)
935 sdhci_finish_command(host);
939} 936}
940 937
941static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) 938static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)