mtd: sh_flctl: Fix hardware ECC behaviour
authorBastian Hecht <hechtb@googlemail.com>
Mon, 14 May 2012 12:14:43 +0000 (14:14 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 6 Jul 2012 17:17:03 +0000 (18:17 +0100)
The flctl uses 10 bytes ECC data for every 512 bytes sector. This patch
makes the controller write all 40 bytes instead of 10 bytes only.

Signed-off-by: Bastian Hecht <hechtb@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/sh_flctl.c

index b3666be0ccfca7369ee664f598e7ba5391993768..8633b5b98a137d4dc0da2bdcbc446c1a5702bfdd 100644 (file)
@@ -427,30 +427,20 @@ static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)
 static void execmd_read_oob(struct mtd_info *mtd, int page_addr)
 {
        struct sh_flctl *flctl = mtd_to_flctl(mtd);
+       int page_sectors = flctl->page_size ? 4 : 1;
+       int i;
 
        set_cmd_regs(mtd, NAND_CMD_READ0,
                (NAND_CMD_READSTART << 8) | NAND_CMD_READ0);
 
        empty_fifo(flctl);
-       if (flctl->page_size) {
-               int i;
-               /* In case that the page size is 2k */
-               for (i = 0; i < 16 * 3; i++)
-                       flctl->done_buff[i] = 0xFF;
-
-               set_addr(mtd, 3 * 528 + 512, page_addr);
-               writel(16, FLDTCNTR(flctl));
 
-               start_translation(flctl);
-               read_fiforeg(flctl, 16, 16 * 3);
-               wait_completion(flctl);
-       } else {
-               /* In case that the page size is 512b */
-               set_addr(mtd, 512, page_addr);
+       for (i = 0; i < page_sectors; i++) {
+               set_addr(mtd, (512 + 16) * i + 512 , page_addr);
                writel(16, FLDTCNTR(flctl));
 
                start_translation(flctl);
-               read_fiforeg(flctl, 16, 0);
+               read_fiforeg(flctl, 16, 16 * i);
                wait_completion(flctl);
        }
 }
@@ -495,18 +485,12 @@ static void execmd_write_oob(struct mtd_info *mtd)
        int page_addr = flctl->seqin_page_addr;
        int sector, page_sectors;
 
-       if (flctl->page_size) {
-               sector = 3;
-               page_sectors = 4;
-       } else {
-               sector = 0;
-               page_sectors = 1;
-       }
+       page_sectors = flctl->page_size ? 4 : 1;
 
        set_cmd_regs(mtd, NAND_CMD_PAGEPROG,
                        (NAND_CMD_PAGEPROG << 8) | NAND_CMD_SEQIN);
 
-       for (; sector < page_sectors; sector++) {
+       for (sector = 0; sector < page_sectors; sector++) {
                empty_fifo(flctl);
                set_addr(mtd, sector * 528 + 512, page_addr);
                writel(16, FLDTCNTR(flctl));    /* set read size */