diff options
| author | matteo <matteo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2008-06-26 13:02:02 +0000 | 
|---|---|---|
| committer | matteo <matteo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2008-06-26 13:02:02 +0000 | 
| commit | 0ff0f48af54d4855be22540bff8b77cf054fc7c8 (patch) | |
| tree | d6e148ab4565e23222e81c57a5df112426f814ef | |
| parent | 1f0de6b5cc22d435b9080267e3883fb1cb55b02c (diff) | |
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 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 | 
