mtd: pxa3xx_nand: add single-bit error corrections reporting
authorYeasah Pell <yeasah@comrex.com>
Wed, 1 Jul 2009 15:11:35 +0000 (18:11 +0300)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Sat, 19 Sep 2009 20:13:08 +0000 (13:13 -0700)
Acked-by: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: Yeasah Pell <yeasah@comrex.com>
Signed-off-by: Mike Rapoport <mike@compulab.co.il>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/pxa3xx_nand.c

index 30a8ce6d3e69bcdc1f0429daafacd06115baf06e..6ea520ae2410a9113690641670d488321ac3da23 100644 (file)
@@ -102,6 +102,7 @@ enum {
        ERR_SENDCMD     = -2,
        ERR_DBERR       = -3,
        ERR_BBERR       = -4,
+       ERR_SBERR       = -5,
 };
 
 enum {
@@ -564,11 +565,13 @@ static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
 
        status = nand_readl(info, NDSR);
 
-       if (status & (NDSR_RDDREQ | NDSR_DBERR)) {
+       if (status & (NDSR_RDDREQ | NDSR_DBERR | NDSR_SBERR)) {
                if (status & NDSR_DBERR)
                        info->retcode = ERR_DBERR;
+               else if (status & NDSR_SBERR)
+                       info->retcode = ERR_SBERR;
 
-               disable_int(info, NDSR_RDDREQ | NDSR_DBERR);
+               disable_int(info, NDSR_RDDREQ | NDSR_DBERR | NDSR_SBERR);
 
                if (info->use_dma) {
                        info->state = STATE_DMA_READING;
@@ -670,7 +673,7 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
                if (prepare_read_prog_cmd(info, cmdset->read1, column, page_addr))
                        break;
 
-               pxa3xx_nand_do_cmd(info, NDSR_RDDREQ | NDSR_DBERR);
+               pxa3xx_nand_do_cmd(info, NDSR_RDDREQ | NDSR_DBERR | NDSR_SBERR);
 
                /* We only are OOB, so if the data has error, does not matter */
                if (info->retcode == ERR_DBERR)
@@ -687,7 +690,7 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
                if (prepare_read_prog_cmd(info, cmdset->read1, column, page_addr))
                        break;
 
-               pxa3xx_nand_do_cmd(info, NDSR_RDDREQ | NDSR_DBERR);
+               pxa3xx_nand_do_cmd(info, NDSR_RDDREQ | NDSR_DBERR | NDSR_SBERR);
 
                if (info->retcode == ERR_DBERR) {
                        /* for blank page (all 0xff), HW will calculate its ECC as
@@ -861,8 +864,12 @@ static int pxa3xx_nand_ecc_correct(struct mtd_info *mtd,
         * consider it as a ecc error which will tell the caller the
         * read fail We have distinguish all the errors, but the
         * nand_read_ecc only check this function return value
+        *
+        * Corrected (single-bit) errors must also be noted.
         */
-       if (info->retcode != ERR_NONE)
+       if (info->retcode == ERR_SBERR)
+               return 1;
+       else if (info->retcode != ERR_NONE)
                return -1;
 
        return 0;