aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorMatt Reimer <mreimer@vpop.net>2007-10-18 21:02:43 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2008-01-26 08:11:38 -0500
commitd0bf37932ac98cc793da2164ac1a4656fbf34bbc (patch)
tree916208746df847c350d93704e9df5d2e281193dc /drivers/mtd
parent4fac9f698404a5cd50b978fbdb7e54235353c215 (diff)
[MTD] [NAND] fix s3c2410 error correction
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> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nand/s3c2410.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 21a2cc8636df..d31cb7b3feeb 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -366,23 +366,21 @@ static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat,
366 ((diff2 ^ (diff2 >> 1)) & 0x55) == 0x55) { 366 ((diff2 ^ (diff2 >> 1)) & 0x55) == 0x55) {
367 /* calculate the bit position of the error */ 367 /* calculate the bit position of the error */
368 368
369 bit = (diff2 >> 2) & 1; 369 bit = ((diff2 >> 3) & 1) |
370 bit |= (diff2 >> 3) & 2; 370 ((diff2 >> 4) & 2) |
371 bit |= (diff2 >> 4) & 4; 371 ((diff2 >> 5) & 4);
372 372
373 /* calculate the byte position of the error */ 373 /* calculate the byte position of the error */
374 374
375 byte = (diff1 << 1) & 0x80; 375 byte = ((diff2 << 7) & 0x100) |
376 byte |= (diff1 << 2) & 0x40; 376 ((diff1 << 0) & 0x80) |
377 byte |= (diff1 << 3) & 0x20; 377 ((diff1 << 1) & 0x40) |
378 byte |= (diff1 << 4) & 0x10; 378 ((diff1 << 2) & 0x20) |
379 379 ((diff1 << 3) & 0x10) |
380 byte |= (diff0 >> 3) & 0x08; 380 ((diff0 >> 4) & 0x08) |
381 byte |= (diff0 >> 2) & 0x04; 381 ((diff0 >> 3) & 0x04) |
382 byte |= (diff0 >> 1) & 0x02; 382 ((diff0 >> 2) & 0x02) |
383 byte |= (diff0 >> 0) & 0x01; 383 ((diff0 >> 1) & 0x01);
384
385 byte |= (diff2 << 8) & 0x100;
386 384
387 dev_dbg(info->device, "correcting error bit %d, byte %d\n", 385 dev_dbg(info->device, "correcting error bit %d, byte %d\n",
388 bit, byte); 386 bit, byte);