aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/nand_base.c
diff options
context:
space:
mode:
authorMike Dunn <mikedunn@newsguy.com>2012-03-11 17:21:11 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-03-26 19:56:46 -0400
commit6a918bade9dab40aaef80559bd1169c69e8d69cb (patch)
tree1be69789f9b6c6e064a36f4ef6e142a8ec0058b5 /drivers/mtd/nand/nand_base.c
parent1d0b95b0834087ba3653f69c24483d63a26d51a7 (diff)
mtd: flash drivers set ecc strength
Flash device drivers initialize 'ecc_strength' in struct mtd_info, which is the maximum number of bit errors that can be corrected in one writesize region. Drivers using the nand interface intitialize 'strength' in struct nand_ecc_ctrl, which is the maximum number of bit errors that can be corrected in one ecc step. Nand infrastructure code translates this to 'ecc_strength'. Also for nand drivers, the nand infrastructure code sets ecc.strength for ecc modes NAND_ECC_SOFT, NAND_ECC_SOFT_BCH, and NAND_ECC_NONE. It is set in the driver for all other modes. Signed-off-by: Mike Dunn <mikedunn@newsguy.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand/nand_base.c')
-rw-r--r--drivers/mtd/nand/nand_base.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 1e907dc8638a..8008853756c9 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -3350,6 +3350,7 @@ int nand_scan_tail(struct mtd_info *mtd)
3350 if (!chip->ecc.size) 3350 if (!chip->ecc.size)
3351 chip->ecc.size = 256; 3351 chip->ecc.size = 256;
3352 chip->ecc.bytes = 3; 3352 chip->ecc.bytes = 3;
3353 chip->ecc.strength = 1;
3353 break; 3354 break;
3354 3355
3355 case NAND_ECC_SOFT_BCH: 3356 case NAND_ECC_SOFT_BCH:
@@ -3384,6 +3385,8 @@ int nand_scan_tail(struct mtd_info *mtd)
3384 pr_warn("BCH ECC initialization failed!\n"); 3385 pr_warn("BCH ECC initialization failed!\n");
3385 BUG(); 3386 BUG();
3386 } 3387 }
3388 chip->ecc.strength =
3389 chip->ecc.bytes*8 / fls(8*chip->ecc.size);
3387 break; 3390 break;
3388 3391
3389 case NAND_ECC_NONE: 3392 case NAND_ECC_NONE:
@@ -3397,6 +3400,7 @@ int nand_scan_tail(struct mtd_info *mtd)
3397 chip->ecc.write_oob = nand_write_oob_std; 3400 chip->ecc.write_oob = nand_write_oob_std;
3398 chip->ecc.size = mtd->writesize; 3401 chip->ecc.size = mtd->writesize;
3399 chip->ecc.bytes = 0; 3402 chip->ecc.bytes = 0;
3403 chip->ecc.strength = 0;
3400 break; 3404 break;
3401 3405
3402 default: 3406 default:
@@ -3478,8 +3482,9 @@ int nand_scan_tail(struct mtd_info *mtd)
3478 mtd->_block_markbad = nand_block_markbad; 3482 mtd->_block_markbad = nand_block_markbad;
3479 mtd->writebufsize = mtd->writesize; 3483 mtd->writebufsize = mtd->writesize;
3480 3484
3481 /* propagate ecc.layout to mtd_info */ 3485 /* propagate ecc info to mtd_info */
3482 mtd->ecclayout = chip->ecc.layout; 3486 mtd->ecclayout = chip->ecc.layout;
3487 mtd->ecc_strength = chip->ecc.strength * chip->ecc.steps;
3483 3488
3484 /* Check, if we should skip the bad block table scan */ 3489 /* Check, if we should skip the bad block table scan */
3485 if (chip->options & NAND_SKIP_BBTSCAN) 3490 if (chip->options & NAND_SKIP_BBTSCAN)