diff options
author | Jason <r64343@freescale.com> | 2009-08-06 11:11:42 +0800 |
---|---|---|
committer | Rob Herring <r.herring@freescale.com> | 2009-08-07 09:47:39 -0500 |
commit | aab080f6135efa3e3bc533b9dd7bc7f6d6b64574 (patch) | |
tree | 3d61ea71d0ff2a1633b2e8b1c0dd7140e7374fa6 /drivers | |
parent | 8fa81de4b23e5da086e5917b75c540cb1c867e6f (diff) |
ENGR00114880 Data abort on NFC memory byte access
Data abort on NFC memory byte access
Signed-off-by:Jason Liu <r64343@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/nand/mxc_nd2.c | 36 |
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; } |