aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/bf5xx_nand.c
diff options
context:
space:
mode:
authorBryan Wu <bryan.wu@analog.com>2008-01-30 04:18:18 -0500
committerDavid Woodhouse <dwmw2@infradead.org>2008-02-03 02:55:16 -0500
commit5eb91034f3d825f43b3c8ace7b69f94752b7deda (patch)
treec823f041b73f415b35f6c42f63861f3fdd152e86 /drivers/mtd/nand/bf5xx_nand.c
parentf4dda0914e76feb1ff5ec349cc68f319f6a4e40f (diff)
[MTD] [NAND] Fix Blackfin NFC ECC calculating bug with page size 512 bytes
Signed-off-by: Bryan Wu <bryan.wu@analog.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd/nand/bf5xx_nand.c')
-rw-r--r--drivers/mtd/nand/bf5xx_nand.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c
index 2fe9678e7545..7d6ac6a7d9a7 100644
--- a/drivers/mtd/nand/bf5xx_nand.c
+++ b/drivers/mtd/nand/bf5xx_nand.c
@@ -293,7 +293,6 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
293 u16 ecc0, ecc1; 293 u16 ecc0, ecc1;
294 u32 code[2]; 294 u32 code[2];
295 u8 *p; 295 u8 *p;
296 int bytes = 3, i;
297 296
298 /* first 4 bytes ECC code for 256 page size */ 297 /* first 4 bytes ECC code for 256 page size */
299 ecc0 = bfin_read_NFC_ECC0(); 298 ecc0 = bfin_read_NFC_ECC0();
@@ -303,19 +302,24 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
303 302
304 dev_dbg(info->device, "returning ecc 0x%08x\n", code[0]); 303 dev_dbg(info->device, "returning ecc 0x%08x\n", code[0]);
305 304
305 /* first 3 bytes in ecc_code for 256 page size */
306 p = (u8 *) code;
307 memcpy(ecc_code, p, 3);
308
306 /* second 4 bytes ECC code for 512 page size */ 309 /* second 4 bytes ECC code for 512 page size */
307 if (page_size == 512) { 310 if (page_size == 512) {
308 ecc0 = bfin_read_NFC_ECC2(); 311 ecc0 = bfin_read_NFC_ECC2();
309 ecc1 = bfin_read_NFC_ECC3(); 312 ecc1 = bfin_read_NFC_ECC3();
310 code[1] = (ecc0 & 0x3FF) | ((ecc1 & 0x3FF) << 11); 313 code[1] = (ecc0 & 0x3FF) | ((ecc1 & 0x3FF) << 11);
311 bytes = 6; 314
315 /* second 3 bytes in ecc_code for second 256
316 * bytes of 512 page size
317 */
318 p = (u8 *) (code + 1);
319 memcpy((ecc_code + 3), p, 3);
312 dev_dbg(info->device, "returning ecc 0x%08x\n", code[1]); 320 dev_dbg(info->device, "returning ecc 0x%08x\n", code[1]);
313 } 321 }
314 322
315 p = (u8 *)code;
316 for (i = 0; i < bytes; i++)
317 ecc_code[i] = p[i];
318
319 return 0; 323 return 0;
320} 324}
321 325