summaryrefslogtreecommitdiff
path: root/packages/linux/linux-openzaurus-2.6.16
diff options
context:
space:
mode:
authorMichael Lauer <mickey@vanille-media.de>2006-05-03 09:27:44 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2006-05-03 09:27:44 +0000
commit305c96accc768078c5898218f9a0765cc84d4fbe (patch)
tree0625a83fb7bf3a27c99d1ec9afc09c6634210394 /packages/linux/linux-openzaurus-2.6.16
parent0be70ca64fd3b78a35382c44ffd03160ae4be3e4 (diff)
parent9c6456bf405f2c84166d0557155c294faed51c96 (diff)
merge of 06d21bcf828a008844c92e310530a3d845183621
and efe6276728025a594e625fdef00f7703a0dd4229
Diffstat (limited to 'packages/linux/linux-openzaurus-2.6.16')
-rw-r--r--packages/linux/linux-openzaurus-2.6.16/rmk-mmc1.patch61
-rw-r--r--packages/linux/linux-openzaurus-2.6.16/rmk-mmc2.patch26
2 files changed, 87 insertions, 0 deletions
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
index 0000000000..054b48d28d
--- /dev/null
+++ b/packages/linux/linux-openzaurus-2.6.16/rmk-mmc1.patch
@@ -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
index 0000000000..cef02436d6
--- /dev/null
+++ b/packages/linux/linux-openzaurus-2.6.16/rmk-mmc2.patch
@@ -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
+