summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-04-23 23:44:11 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2014-04-23 23:44:11 +0200
commit25ecbc5432de99a5c20d84e22f764465babb70e4 (patch)
tree2b761d942af28c288201b046febfe3a72713b415
parent54dd77a5f83a0d923e62b782104d69a769f59dbe (diff)
downloadrockbox-25ecbc5.tar.gz
rockbox-25ecbc5.tar.bz2
rockbox-25ecbc5.zip
imx233: fix typos and sdmmc bug regarding write buffer
The write buffer should not be modified but the current code does and then forget to restore it to its original content. I'm not sure if any code relies to the write buffer to not be modifies by the write function but this seems like a reasonable assumption in general so it's better not to break it. Change-Id: I449a01db2ec51d2273e59b69c59db0e7d2eed3db
-rw-r--r--firmware/target/arm/imx233/sdmmc-imx233.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/firmware/target/arm/imx233/sdmmc-imx233.c b/firmware/target/arm/imx233/sdmmc-imx233.c
index e42842d3f7..f552246245 100644
--- a/firmware/target/arm/imx233/sdmmc-imx233.c
+++ b/firmware/target/arm/imx233/sdmmc-imx233.c
@@ -648,14 +648,15 @@ static int transfer_sectors(int drive, unsigned long start, int count, void *buf
* Read transfers:
* If the buffer is already aligned, transfer everything at once.
* Otherwise, transfer all sectors but one to the sub-buffer starting
- * on the next cache ligned and then move the data. Then transfer the
+ * on the next cache line and then move the data. Then transfer the
* last sector to the aligned_buffer and then copy to the buffer.
*
* Write transfers:
* If the buffer is already aligned, transfer everything at once.
* Otherwise, copy the first sector to the aligned_buffer and transfer.
* Then move all other sectors within the buffer to make it cache
- * aligned and transfer it.
+ * aligned and transfer it. Then move data to pretend the buffer was
+ * never modified.
*/
if(read)
{
@@ -689,6 +690,9 @@ static int transfer_sectors(int drive, unsigned long start, int count, void *buf
// move within the buffer and transfer
memmove(ptr, buf + 512, 512 * (count - 1));
ret = __xfer_sectors(drive, start + 1, count - 1, ptr, read);
+ // move back
+ memmove(buf + 512, ptr, 512 * (count - 1));
+ memcpy(buf, aligned_buffer[drive], 512);
}
}
else