diff options
author | Mike Dunn <mikedunn@newsguy.com> | 2012-03-11 17:21:11 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-03-26 19:56:46 -0400 |
commit | 6a918bade9dab40aaef80559bd1169c69e8d69cb (patch) | |
tree | 1be69789f9b6c6e064a36f4ef6e142a8ec0058b5 /drivers/mtd/nand/nand_base.c | |
parent | 1d0b95b0834087ba3653f69c24483d63a26d51a7 (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.c | 7 |
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) |