diff options
author | Bryan Wu <bryan.wu@analog.com> | 2008-01-30 04:18:18 -0500 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2008-02-03 02:55:16 -0500 |
commit | 5eb91034f3d825f43b3c8ace7b69f94752b7deda (patch) | |
tree | c823f041b73f415b35f6c42f63861f3fdd152e86 /drivers/mtd/nand/bf5xx_nand.c | |
parent | f4dda0914e76feb1ff5ec349cc68f319f6a4e40f (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.c | 16 |
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 | ||