Re: [PATCH] MTD: fix s3c2410 error correction

Matt Reimer
2007-10-25T18:17:11Z

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@gmail.com> wrote:
> From: Matt Reimer <mreimer@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@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/
>