On Thu, 20 Aug 2009 17:19:17 -0700 Feng Kan <f...@amcc.com> wrote: > Fix ECC Correction bug where the byte offset location were double > fliped causing correction routine to toggle the wrong byte location > in the ECC segment. The ndfc_calculate_ecc routine change the order > of getting the ECC code. > /* The NDFC uses Smart Media (SMC) bytes order */ > ecc_code[0] = p[2]; > ecc_code[1] = p[1]; > ecc_code[2] = p[3]; > But in the Correction algorithm when calculating the byte offset > location, the b1 is used as the upper part of the address. Which > again reverse the order making the final byte offset address > location incorrect. > byte_addr = (addressbits[b1] << 4) + addressbits[b0]; > The order is change to read it in straight and let the correction > function to revert it to SMC order. > > Signed-off-by: Feng Kan <f...@amcc.com> > Acked-by: Victor Gallardo <vgalla...@amcc.com> > Acked-by: Prodyut Hazarika <phazar...@amcc.com> > --- > drivers/mtd/nand/ndfc.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c > index 5906c40..d9d3e6e 100644 > --- a/drivers/mtd/nand/ndfc.c > +++ b/drivers/mtd/nand/ndfc.c > @@ -101,8 +101,8 @@ static int ndfc_calculate_ecc(struct mtd_info > *mtd, wmb(); > ecc = in_be32(ndfc->ndfcbase + NDFC_ECC); > /* The NDFC uses Smart Media (SMC) bytes order */ > - ecc_code[0] = p[2]; > - ecc_code[1] = p[1]; > + ecc_code[0] = p[1]; > + ecc_code[1] = p[2]; > ecc_code[2] = p[3]; > > return 0;
Acked-by: Sean MacLennan <smaclen...@pikatech.com> Cheers, Sean _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev