aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2006-10-27 15:12:02 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2006-10-27 15:12:02 -0400
commit63a1423763c6c38eeeaf6dc8cee986514ab67aed (patch)
tree06eaad2dac5bcca712280a95630c4ccc74bf91b1
parent7608194c4ae454fab23b8d940986eeb9c58c3478 (diff)
[MTD] NAND: Remove empty block ECC workaround
They fixed the hardware so that ECC doesn't fail on reading an empty block. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
-rw-r--r--drivers/mtd/nand/cafe.c28
1 files changed, 1 insertions, 27 deletions
diff --git a/drivers/mtd/nand/cafe.c b/drivers/mtd/nand/cafe.c
index d894c7286aab..887040c6c2d6 100644
--- a/drivers/mtd/nand/cafe.c
+++ b/drivers/mtd/nand/cafe.c
@@ -356,26 +356,6 @@ static int cafe_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
356 * The hw generator calculates the error syndrome automatically. Therefor 356 * The hw generator calculates the error syndrome automatically. Therefor
357 * we need a special oob layout and handling. 357 * we need a special oob layout and handling.
358 */ 358 */
359
360static unsigned short cafe_empty_syndromes[8] = { 4095, 748, 2629, 2920, 875, 1454, 51, 1456 };
361
362static int is_all_ff(unsigned char *buf, int len)
363{
364 unsigned long *lbuf = (void *)buf;
365 int i;
366
367 for (i=0; i < (len/sizeof(long)); i++) {
368 if (lbuf[i] != ~0UL)
369 return 0;
370 }
371 i *= sizeof(long);
372 for (; i< len; i++) {
373 if (buf[i] != 0xff)
374 return 0;
375 }
376 return 1;
377}
378
379static int cafe_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip, 359static int cafe_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
380 uint8_t *buf) 360 uint8_t *buf)
381{ 361{
@@ -398,13 +378,7 @@ static int cafe_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
398 syn[i+1] = (tmp >> 16) & 0xfff; 378 syn[i+1] = (tmp >> 16) & 0xfff;
399 } 379 }
400 380
401 /* FIXME: http://dev.laptop.org/ticket/215 */ 381 if ((i = cafe_correct_ecc(buf, syn)) < 0) {
402 if (!memcmp(syn, cafe_empty_syndromes, sizeof(syn))
403 && is_all_ff(chip->oob_poi, 14)
404 && is_all_ff(buf, mtd->writesize)) {
405 dev_dbg(&cafe->pdev->dev, "ECC error reported on empty block\n");
406 /* It was an empty block. Nothing to fix here except the hardware */
407 } else if ((i = cafe_correct_ecc(buf, syn)) < 0) {
408 dev_dbg(&cafe->pdev->dev, "Failed to correct ECC\n"); 382 dev_dbg(&cafe->pdev->dev, "Failed to correct ECC\n");
409 mtd->ecc_stats.failed++; 383 mtd->ecc_stats.failed++;
410 } else { 384 } else {