linux-openzaurus: added 2 MMC patches from RMK - should help with timeouts a bit
authorMarcin Juszkiewicz <hrw@openembedded.org>
Tue, 2 May 2006 19:37:56 +0000 (19:37 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Tue, 2 May 2006 19:37:56 +0000 (19:37 +0000)
packages/linux/linux-openzaurus-2.6.16/rmk-mmc1.patch [new file with mode: 0644]
packages/linux/linux-openzaurus-2.6.16/rmk-mmc2.patch [new file with mode: 0644]
packages/linux/linux-openzaurus_2.6.16.bb

diff --git a/packages/linux/linux-openzaurus-2.6.16/rmk-mmc1.patch b/packages/linux/linux-openzaurus-2.6.16/rmk-mmc1.patch
new file mode 100644 (file)
index 0000000..054b48d
--- /dev/null
@@ -0,0 +1,61 @@
+
+The CSD contains a "read2write factor" which determines the multiplier to
+be applied to the read timeout to obtain the write timeout.  We were
+ignoring this parameter, resulting in the possibility for writes being
+timed out too early.
+
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+
+diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
+--- a/drivers/mmc/mmc.c
++++ b/drivers/mmc/mmc.c
+@@ -549,6 +549,7 @@ static void mmc_decode_csd(struct mmc_ca
+               csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
+               csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
+               csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
++              csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
+               csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
+               csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
+       } else {
+@@ -583,6 +584,7 @@ static void mmc_decode_csd(struct mmc_ca
+               csd->read_partial = UNSTUFF_BITS(resp, 79, 1);
+               csd->write_misalign = UNSTUFF_BITS(resp, 78, 1);
+               csd->read_misalign = UNSTUFF_BITS(resp, 77, 1);
++              csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
+               csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
+               csd->write_partial = UNSTUFF_BITS(resp, 21, 1);
+       }
+diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c
+--- a/drivers/mmc/mmc_block.c
++++ b/drivers/mmc/mmc_block.c
+@@ -187,6 +187,12 @@ static int mmc_blk_issue_rq(struct mmc_q
+                       brq.cmd.opcode = MMC_WRITE_BLOCK;
+                       brq.data.flags |= MMC_DATA_WRITE;
+                       brq.data.blocks = 1;
++
++                      /*
++                       * Scale up the timeout by the r2w factor
++                       */
++                      brq.data.timeout_ns <<= card->csd.r2w_factor;
++                      brq.data.timeout_clks <<= card->csd.r2w_factor;
+               }
+               if (brq.data.blocks > 1) {
+diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
+--- a/include/linux/mmc/card.h
++++ b/include/linux/mmc/card.h
+@@ -28,6 +28,7 @@ struct mmc_csd {
+       unsigned short          cmdclass;
+       unsigned short          tacc_clks;
+       unsigned int            tacc_ns;
++      unsigned int            r2w_factor;
+       unsigned int            max_dtr;
+       unsigned int            read_blkbits;
+       unsigned int            write_blkbits;
+
+
+-------------------------------------------------------------------
+List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
+FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
+Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php
+
diff --git a/packages/linux/linux-openzaurus-2.6.16/rmk-mmc2.patch b/packages/linux/linux-openzaurus-2.6.16/rmk-mmc2.patch
new file mode 100644 (file)
index 0000000..cef0243
--- /dev/null
@@ -0,0 +1,26 @@
+
+Always send a stop command at the end of a data transfer.  If we avoid
+sending the stop command, some cards remain in data transfer mode, and
+refuse to accept further read/write commands.
+
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+
+diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c
+--- a/drivers/mmc/pxamci.c
++++ b/drivers/mmc/pxamci.c
+@@ -291,7 +291,7 @@ static int pxamci_data_done(struct pxamc
+       pxamci_disable_irq(host, DATA_TRAN_DONE);
+       host->data = NULL;
+-      if (host->mrq->stop && data->error == MMC_ERR_NONE) {
++      if (host->mrq->stop) {
+               pxamci_stop_clock(host);
+               pxamci_start_cmd(host, host->mrq->stop, 0);
+       } else {
+
+
+-------------------------------------------------------------------
+List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
+FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
+Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php
+
index b62bcba..ad293b8 100644 (file)
@@ -1,6 +1,6 @@
 include linux-openzaurus.inc
 
-PR = "r15"
+PR = "r19"
 
 # Handy URLs
 # git://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \
@@ -13,6 +13,8 @@ PR = "r15"
 # Patches submitted upstream are towards top of this list 
 # Hacks should clearly named and at the bottom
 SRC_URI = "http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.bz2 \
+           file://rmk-mmc1.patch;patch=1 \
+           file://rmk-mmc2.patch;patch=1 \
            ${RPSRC}/led_core-r15.patch;patch=1 \
            ${RPSRC}/led_triggers-r14.patch;patch=1 \
            ${RPSRC}/led_trig_timer-r8.patch;patch=1 \