[PATCH] MTD: fix s3c2410 error correction

Matt Reimer mattjreimer at gmail.com
Tue Nov 6 12:09:00 EST 2007


ping

On 10/25/07, Matt Reimer <mattjreimer at gmail.com> wrote:
> Anybody willing to ACK this patch? It definitely fixes the problem I'm
> seeing on a s3c2440a. For more information, compare the s3c2440a or
> s3c2410 manuals with page 8 of the following documentation:
>
> http://www.samsung.com/global/business/semiconductor/products/flash/downloads/applicationnote/ecc_algorithm_for_web_512b.pdf
>
> Matt
>
>
> On 10/18/07, Matt Reimer <mattjreimer at gmail.com> wrote:
> > From: Matt Reimer <mreimer at vpop.net>
> >
> > The single-bit error correction was, well, incorrect. For determing which
> > bit to correct it was using P1' P2' P4' P8' instead of P1 P2 P4 P8, and
> > it was using P16' P32' P64' P128' P256' P512' P1024' P2048' instead of
> > P16 P32 P64 P128 P256 P512 P1024 P2048.
> >
> > Signed-off-by: Matt Reimer <mreimer at vpop.net>
> > ---
> >  drivers/mtd/nand/s3c2410.c |   26 ++++++++++++--------------
> >  1 files changed, 12 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
> > index 903db18..077fdcc 100644
> > --- a/drivers/mtd/nand/s3c2410.c
> > +++ b/drivers/mtd/nand/s3c2410.c
> > @@ -364,23 +364,21 @@ static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat,
> >             ((diff2 ^ (diff2 >> 1)) & 0x55) == 0x55) {
> >                 /* calculate the bit position of the error */
> >
> > -               bit  = (diff2 >> 2) & 1;
> > -               bit |= (diff2 >> 3) & 2;
> > -               bit |= (diff2 >> 4) & 4;
> > +               bit  = ((diff2 >> 3) & 1) |
> > +                      ((diff2 >> 4) & 2) |
> > +                      ((diff2 >> 5) & 4);
> >
> >                 /* calculate the byte position of the error */
> >
> > -               byte  = (diff1 << 1) & 0x80;
> > -               byte |= (diff1 << 2) & 0x40;
> > -               byte |= (diff1 << 3) & 0x20;
> > -               byte |= (diff1 << 4) & 0x10;
> > -
> > -               byte |= (diff0 >> 3) & 0x08;
> > -               byte |= (diff0 >> 2) & 0x04;
> > -               byte |= (diff0 >> 1) & 0x02;
> > -               byte |= (diff0 >> 0) & 0x01;
> > -
> > -               byte |= (diff2 << 8) & 0x100;
> > +               byte = ((diff2 << 7) & 0x100) |
> > +                      ((diff1 << 0) & 0x80)  |
> > +                      ((diff1 << 1) & 0x40)  |
> > +                      ((diff1 << 2) & 0x20)  |
> > +                      ((diff1 << 3) & 0x10)  |
> > +                      ((diff0 >> 4) & 0x08)  |
> > +                      ((diff0 >> 3) & 0x04)  |
> > +                      ((diff0 >> 2) & 0x02)  |
> > +                      ((diff0 >> 1) & 0x01);
> >
> >                 dev_dbg(info->device, "correcting error bit %d, byte %d\n",
> >                         bit, byte);
> > --
> > 1.5.3.2
> >
> >
> > ______________________________________________________
> > Linux MTD discussion mailing list
> > http://lists.infradead.org/mailman/listinfo/linux-mtd/
> >
>



More information about the linux-mtd mailing list