From: matteo Date: Thu, 26 Jun 2008 13:02:02 +0000 (+0000) Subject: avr32: fix a bug in the MMC driver X-Git-Url: http://git.ozo.com/?a=commitdiff_plain;h=0ff0f48af54d4855be22540bff8b77cf054fc7c8;p=openwrt-10.03%2F.git avr32: fix a bug in the MMC driver git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11580 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- 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 000000000..2d79b9de0 --- /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