diff options
author | Matteo Croce <matteo@openwrt.org> | 2008-06-26 13:02:02 +0000 |
---|---|---|
committer | Matteo Croce <matteo@openwrt.org> | 2008-06-26 13:02:02 +0000 |
commit | 94ee03ca812e51a4fb86c3e34340fb813eed1433 (patch) | |
tree | d6e148ab4565e23222e81c57a5df112426f814ef | |
parent | 7fa79cc35b0652b6dd0aeb389d5a57ffa397258e (diff) | |
download | upstream-94ee03ca812e51a4fb86c3e34340fb813eed1433.tar.gz upstream-94ee03ca812e51a4fb86c3e34340fb813eed1433.tar.bz2 upstream-94ee03ca812e51a4fb86c3e34340fb813eed1433.zip |
avr32: fix a bug in the MMC driver
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11580 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | target/linux/avr32/patches/120-fast_sd_cards_fix.patch | 43 |
1 files changed, 43 insertions, 0 deletions
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 |