aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2007-01-08 16:42:51 +0000
committerRussell King <rmk+kernel@arm.linux.org.uk>2007-01-08 19:49:51 +0000
commite47c222b22cd53c317a5573e1dc5f9e0cbd46380 (patch)
treee9c4563c7cc425a99a52931f591a8357273ed20c /drivers/mmc
parentdb6ccbb61c1291c8aaefadcc8304444f27eeb88d (diff)
downloadkernel_samsung_smdk4412-e47c222b22cd53c317a5573e1dc5f9e0cbd46380.zip
kernel_samsung_smdk4412-e47c222b22cd53c317a5573e1dc5f9e0cbd46380.tar.gz
kernel_samsung_smdk4412-e47c222b22cd53c317a5573e1dc5f9e0cbd46380.tar.bz2
[ARM] Fix potential MMCI bug
The MMCI driver might end up aborting the initial command and leaving the data part of the command sequence still in place. Avoid this problem by ensuring that any data sequence is properly cleared out when a command completes. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/mmci.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c
index e9b80e9..ccfe656 100644
--- a/drivers/mmc/mmci.c
+++ b/drivers/mmc/mmci.c
@@ -42,6 +42,8 @@ mmci_request_end(struct mmci_host *host, struct mmc_request *mrq)
{
writel(0, host->base + MMCICOMMAND);
+ BUG_ON(host->data);
+
host->mrq = NULL;
host->cmd = NULL;
@@ -198,6 +200,8 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
}
if (!cmd->data || cmd->error != MMC_ERR_NONE) {
+ if (host->data)
+ mmci_stop_data(host);
mmci_request_end(host, cmd->mrq);
} else if (!(cmd->data->flags & MMC_DATA_READ)) {
mmci_start_data(host, cmd->data);