[kernel] r13720 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series
Martin Michlmayr
tbm at alioth.debian.org
Wed Jun 3 20:53:44 UTC 2009
Author: tbm
Date: Wed Jun 3 20:53:42 2009
New Revision: 13720
Log:
replace with better fix
Added:
dists/trunk/linux-2.6/debian/patches/bugfix/all/mvsdio-config-failure.patch
Deleted:
dists/trunk/linux-2.6/debian/patches/bugfix/all/mmc-sd-udelay-switch.patch
Modified:
dists/trunk/linux-2.6/debian/patches/series/base
Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/mvsdio-config-failure.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/mvsdio-config-failure.patch Wed Jun 3 20:53:42 2009 (r13720)
@@ -0,0 +1,60 @@
+From: Nicolas Pitre <nico at cam.org>
+Date: Tue, 26 May 2009 23:09:39 +0000 (-0400)
+Subject: [MMC] mvsdio: fix config failure with some high speed SDHC cards
+X-Git-Url: http://git.marvell.com/?p=orion.git;a=commitdiff_plain;h=cbd9524f28b10662bd5d81e734e35737aeabb7a9
+
+[MMC] mvsdio: fix config failure with some high speed SDHC cards
+
+Especially with Sandisk SDHC cards, the second SWITCH command was failing
+with a timeout and the card was not recognized at all. However if the
+system was busy, or debugging was enabled, or a udelay(100) was inserted
+before the second SWITCH command in the core code, then the timing was
+so that the card started to work.
+
+With some unusual block sizes, the data FIFO status doesn't indicate a
+"empty" state right away when the data transfer is done. Queuing another
+data transfer in that condition results in a transfer timeout.
+
+The empty FIFO bit eventually get set by itself in less than 50 usecs
+when it is not set right away. So let's just poll for that bit before
+configuring the controller with a new data transfer.
+
+Signed-off-by: Nicolas Pitre <nico at marvell.com>
+---
+
+diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
+index 9d3cfa9..b56d72f 100644
+--- a/drivers/mmc/host/mvsdio.c
++++ b/drivers/mmc/host/mvsdio.c
+@@ -64,6 +64,31 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
+ unsigned int tmout;
+ int tmout_index;
+
++ /*
++ * Hardware weirdness. The FIFO_EMPTY bit of the HW_STATE
++ * register is sometimes not set before a while when some
++ * "unusual" data block sizes are used (such as with the SWITCH
++ * command), even despite the fact that the XFER_DONE interrupt
++ * was raised. And if another data transfer starts before
++ * this bit comes to good sense (which eventually happens by
++ * itself) then the new transfer simply fails with a timeout.
++ */
++ if (!(mvsd_read(MVSD_HW_STATE) & (1 << 13))) {
++ unsigned long t = jiffies + HZ;
++ unsigned int hw_state, count = 0;
++ do {
++ if (time_after(jiffies, t)) {
++ dev_warn(host->dev, "FIFO_EMPTY bit missing\n");
++ break;
++ }
++ hw_state = mvsd_read(MVSD_HW_STATE);
++ count++;
++ } while (!(hw_state & (1 << 13)));
++ dev_dbg(host->dev, "*** wait for FIFO_EMPTY bit "
++ "(hw=0x%04x, count=%d, jiffies=%ld)\n",
++ hw_state, count, jiffies - (t - HZ));
++ }
++
+ /* If timeout=0 then maximum timeout index is used. */
+ tmout = DIV_ROUND_UP(data->timeout_ns, host->ns_per_clk);
+ tmout += data->timeout_clks;
Modified: dists/trunk/linux-2.6/debian/patches/series/base
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/base Wed Jun 3 18:14:25 2009 (r13719)
+++ dists/trunk/linux-2.6/debian/patches/series/base Wed Jun 3 20:53:42 2009 (r13720)
@@ -28,10 +28,10 @@
+ features/arm/allow-alternative-copy-user.patch
+ features/arm/alternative-copy-user.patch
+ bugfix/all/mvsdio-platform.patch
-+ bugfix/all/mmc-sd-udelay-switch.patch
++ bugfix/all/mvsdio-ignore-high-speed.patch
++ bugfix/all/mvsdio-config-failure.patch
+ features/arm/kirkwood-cpu-idle.patch
+ bugfix/sparc/arch-zimage-target.patch
-+ bugfix/all/mvsdio-ignore-high-speed.patch
+ features/all/bnx2x-Separated-FW-from-the-source.patch
+ features/all/bnx2x-driver-version-1.48.105-1.patch
- debian/dfsg/drivers-net-bnx2x-disable.patch
More information about the Kernel-svn-changes
mailing list