Message ID | 1326859991-7469-1-git-send-email-prabhakar@freescale.com |
---|---|
State | New, archived |
Headers | show |
On 01/17/2012 10:13 PM, Prabhakar Kushwaha wrote: > + for (i = sector; i <= sector_end; i++) { > + errors = check_read_ecc(mtd, ctrl, eccstat, i); > + > + if (errors == 15) { > + /* > + * Uncorrectable error. > + * OK only if the whole page is blank. > + * > + * We disable ECCER reporting due to... s/due to.../due to/ Otherwise looks good. -Scott
On Wed, 2012-01-18 at 09:43 +0530, Prabhakar Kushwaha wrote: > Freescale IFC NAND Machine calculates ECC on 512byte sector and same is used in > fsl_ifc_run_command() during ECC status verification. Also this sector is passed > to is_blank() for blank checking. It is wrong at first place because > is_blank()'s implementation checks for Page size and OOB area size. > is_blank() should be called per page for main and OOB area verification. > > Variables name are redefined to avoid confusion between buffer and ecc sector. > > Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com> > Signed-off-by: Scott Wood <scottwood@freescale.com> > Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com> The driver is not in 3.3-rc1, so I skip this patch.
> -----Original Message----- > From: Artem Bityutskiy [mailto:dedekind1@gmail.com] > Sent: Friday, January 27, 2012 6:46 PM > To: Kushwaha Prabhakar-B32579 > Cc: linuxppc-dev@lists.ozlabs.org; linux-mtd@lists.infradead.org; Wood > Scott-B07421; Aggrwal Poonam-B10812 > Subject: Re: [PATCH] mtd/nand:Fix wrong usage of is_blank() in > fsl_ifc_run_command > > On Wed, 2012-01-18 at 09:43 +0530, Prabhakar Kushwaha wrote: > > Freescale IFC NAND Machine calculates ECC on 512byte sector and same > > is used in > > fsl_ifc_run_command() during ECC status verification. Also this sector > > is passed to is_blank() for blank checking. It is wrong at first place > > because is_blank()'s implementation checks for Page size and OOB area > size. > > is_blank() should be called per page for main and OOB area > verification. > > > > Variables name are redefined to avoid confusion between buffer and ecc > sector. > > > > Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com> > > Signed-off-by: Scott Wood <scottwood@freescale.com> > > Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com> > > The driver is not in 3.3-rc1, so I skip this patch. > This patch is squashed in Linux NAND driver patch. It will be provided by galak's tree "NAND Machine support for Integrated Flash Controller" http://patchwork.ozlabs.org/patch/137024/ --Prabhakar
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c index 854fe95..33b55d2 100644 --- a/drivers/mtd/nand/fsl_ifc_nand.c +++ b/drivers/mtd/nand/fsl_ifc_nand.c @@ -1,7 +1,7 @@ /* * Freescale Integrated Flash Controller NAND driver * - * Copyright 2011 Freescale Semiconductor, Inc + * Copyright 2011,2012 Freescale Semiconductor, Inc * * Author: Dipen Dudhat <Dipen.Dudhat@freescale.com> * @@ -216,24 +216,11 @@ static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl, u32 *eccstat, unsigned int bufnum) { u32 reg = eccstat[bufnum / 4]; - int errors = (reg >> ((3 - bufnum % 4) * 8)) & 15; + int errors; - if (errors == 15) { /* uncorrectable */ - /* Blank pages fail hw ECC checks */ - if (is_blank(mtd, bufnum)) - return 1; + errors = (reg >> ((3 - bufnum % 4) * 8)) & 15; - /* - * We disable ECCER reporting in hardware due to - * erratum IFC-A002770 -- so report it now if we - * see an uncorrectable error in ECCSTAT. - */ - ctrl->nand_stat |= IFC_NAND_EVTER_STAT_ECCER; - } else if (errors > 0) { - mtd->ecc_stats.corrected += errors; - } - - return 0; + return errors; } /* @@ -273,16 +260,33 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) dev_err(priv->dev, "NAND Flash Write Protect Error\n"); if (nctrl->eccread) { - int bufperpage = mtd->writesize / 512; - int bufnum = (nctrl->page & priv->bufnum_mask) * bufperpage; - int bufnum_end = bufnum + bufperpage - 1; + int errors; + int bufnum = nctrl->page & priv->bufnum_mask; + int sector = bufnum * chip->ecc.steps; + int sector_end = sector + chip->ecc.steps - 1; - for (i = bufnum / 4; i <= bufnum_end / 4; i++) + for (i = sector / 4; i <= sector_end / 4; i++) eccstat[i] = in_be32(&ifc->ifc_nand.nand_eccstat[i]); - for (i = bufnum; i <= bufnum_end; i++) { - if (check_read_ecc(mtd, ctrl, eccstat, i)) + for (i = sector; i <= sector_end; i++) { + errors = check_read_ecc(mtd, ctrl, eccstat, i); + + if (errors == 15) { + /* + * Uncorrectable error. + * OK only if the whole page is blank. + * + * We disable ECCER reporting due to... + * erratum IFC-A002770 -- so report it now if we + * see an uncorrectable error in ECCSTAT. + */ + if (!is_blank(mtd, bufnum)) + ctrl->nand_stat |= + IFC_NAND_EVTER_STAT_ECCER; break; + } + + mtd->ecc_stats.corrected += errors; } nctrl->eccread = 0;