From 0ff0f48af54d4855be22540bff8b77cf054fc7c8 Mon Sep 17 00:00:00 2001 From: matteo Date: Thu, 26 Jun 2008 13:02:02 +0000 Subject: avr32: fix a bug in the MMC driver git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11580 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../avr32/patches/120-fast_sd_cards_fix.patch | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 target/linux/avr32/patches/120-fast_sd_cards_fix.patch (limited to 'target/linux') diff --git a/target/linux/avr32/patches/120-fast_sd_cards_fix.patch b/target/linux/avr32/patches/120-fast_sd_cards_fix.patch new file mode 100644 index 0000000000..2d79b9de05 --- /dev/null +++ b/target/linux/avr32/patches/120-fast_sd_cards_fix.patch @@ -0,0 +1,43 @@ +--- a/drivers/mmc/host/atmel-mci.c ++++ b/drivers/mmc/host/atmel-mci.c +@@ -77,6 +77,7 @@ struct atmel_mci { + struct clk *mck; + struct platform_device *pdev; + ++ int pending_stop; + #ifdef CONFIG_DEBUG_FS + struct dentry *debugfs_root; + struct dentry *debugfs_regs; +@@ -866,6 +867,12 @@ static void atmci_tasklet_func(unsigned long priv) + data->bytes_xfered = data->blocks * data->blksz; + atmci_data_complete(host, data); + } ++ /* See if there is a pending STOP which can be sent */ ++ if (host->pending_stop && mci_cmd_is_complete(host)) { ++ host->pending_stop = 0; ++ if (mrq->stop && !mci_set_stop_sent_is_completed(host)) ++ send_stop_cmd(host->mmc, mrq->data, 0); ++ } + } + + static void atmci_cmd_interrupt(struct mmc_host *mmc, u32 status) +@@ -918,9 +925,16 @@ static void atmci_xfer_complete(struct dma_request *_req) + * drivers) or when interrupts are disabled for a long time. + */ + mci_set_dma_complete(host); +- if (data->stop && mci_cmd_is_complete(host) +- && !mci_set_stop_sent_is_completed(host)) +- send_stop_cmd(host->mmc, data, 0); ++ ++ if (data->stop) { ++ if (!mci_cmd_is_complete(host)) { ++ /* Just remember a STOP must be sent */ ++ host->pending_stop = 1; ++ } else if (!mci_set_stop_sent_is_completed(host)) { ++ send_stop_cmd(host->mmc, data, 0); ++ host->pending_stop = 0; ++ } ++ } + + /* + * Regardless of what the documentation says, we have to wait -- cgit v1.2.3