summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason <r64343@freescale.com>2009-08-06 11:11:42 +0800
committerJustin Waters <justin.waters@timesys.com>2009-10-13 11:04:59 -0400
commit4e539ddd1ed4dc18d7047e414feefb4ce7897963 (patch)
tree3d61ea71d0ff2a1633b2e8b1c0dd7140e7374fa6
parent7c54d0b953d4fcc3a5937a1c4cdc8f471e8e45ad (diff)
ENGR00114880 Data abort on NFC memory byte access
Data abort on NFC memory byte access Signed-off-by:Jason Liu <r64343@freescale.com>
-rw-r--r--drivers/mtd/nand/mxc_nd2.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/mtd/nand/mxc_nd2.c b/drivers/mtd/nand/mxc_nd2.c
index 78a4f5678802..eb24a75f6d16 100644
--- a/drivers/mtd/nand/mxc_nd2.c
+++ b/drivers/mtd/nand/mxc_nd2.c
@@ -120,6 +120,28 @@ static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
+static void nfc_memcpy(void *dest, void *src, int len)
+{
+ u8 *d = dest;
+ u8 *s = src;
+
+ while (len > 0) {
+ if (len >= 4) {
+ *(u32 *)d = *(u32 *)s;
+ d += 4;
+ s += 4;
+ len -= 4;
+ } else {
+ *(u16 *)d = *(u16 *)s;
+ len -= 2;
+ break;
+ }
+ }
+
+ if (len)
+ BUG();
+}
+
/*
* Functions to transfer data to/from spare erea.
*/
@@ -140,16 +162,16 @@ copy_spare(struct mtd_info *mtd, void *pbuf, void *pspare, int len, bool bfrom)
if (bfrom) {
for (i = 0; i < n - 1; i++)
- memcpy(&d[i * j], &s[i * t], j);
+ nfc_memcpy(&d[i * j], &s[i * t], j);
/* the last section */
- memcpy(&d[i * j], &s[i * t], len - i * j);
+ nfc_memcpy(&d[i * j], &s[i * t], len - i * j);
} else {
for (i = 0; i < n - 1; i++)
- memcpy(&s[i * t], &d[i * j], j);
+ nfc_memcpy(&s[i * t], &d[i * j], j);
/* the last section */
- memcpy(&s[i * t], &d[i * j], len - i * j);
+ nfc_memcpy(&s[i * t], &d[i * j], len - i * j);
}
}
@@ -909,7 +931,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
* byte alignment, so we can use
* memcpy safely
*/
- memcpy(MAIN_AREA0, data_buf, mtd->writesize);
+ nfc_memcpy(MAIN_AREA0, data_buf, mtd->writesize);
copy_spare(mtd, oob_buf, SPARE_AREA0, mtd->oobsize, false);
#endif
@@ -965,7 +987,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
* byte alignment, so we can use
* memcpy safely
*/
- memcpy(data_buf, MAIN_AREA0, mtd->writesize);
+ nfc_memcpy(data_buf, MAIN_AREA0, mtd->writesize);
copy_spare(mtd, oob_buf, SPARE_AREA0, mtd->oobsize, true);
#endif
@@ -974,7 +996,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
case NAND_CMD_READID:
send_read_id();
g_nandfc_info.colAddr = column;
- memcpy(data_buf, MAIN_AREA0, 2048);
+ nfc_memcpy(data_buf, MAIN_AREA0, 2048);
break;
}