diff options
Diffstat (limited to 'drivers/mtd/nand/nand_base.c')
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 3f24b587304f..f6af96926f00 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -4037,22 +4037,24 @@ int nand_scan_tail(struct mtd_info *mtd) | |||
4037 | ecc->read_oob = nand_read_oob_std; | 4037 | ecc->read_oob = nand_read_oob_std; |
4038 | ecc->write_oob = nand_write_oob_std; | 4038 | ecc->write_oob = nand_write_oob_std; |
4039 | /* | 4039 | /* |
4040 | * Board driver should supply ecc.size and ecc.bytes values to | 4040 | * Board driver should supply ecc.size and ecc.strength values |
4041 | * select how many bits are correctable; see nand_bch_init() | 4041 | * to select how many bits are correctable. Otherwise, default |
4042 | * for details. Otherwise, default to 4 bits for large page | 4042 | * to 4 bits for large page devices. |
4043 | * devices. | ||
4044 | */ | 4043 | */ |
4045 | if (!ecc->size && (mtd->oobsize >= 64)) { | 4044 | if (!ecc->size && (mtd->oobsize >= 64)) { |
4046 | ecc->size = 512; | 4045 | ecc->size = 512; |
4047 | ecc->bytes = DIV_ROUND_UP(13 * ecc->strength, 8); | 4046 | ecc->strength = 4; |
4048 | } | 4047 | } |
4048 | |||
4049 | /* See nand_bch_init() for details. */ | ||
4050 | ecc->bytes = DIV_ROUND_UP( | ||
4051 | ecc->strength * fls(8 * ecc->size), 8); | ||
4049 | ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes, | 4052 | ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes, |
4050 | &ecc->layout); | 4053 | &ecc->layout); |
4051 | if (!ecc->priv) { | 4054 | if (!ecc->priv) { |
4052 | pr_warn("BCH ECC initialization failed!\n"); | 4055 | pr_warn("BCH ECC initialization failed!\n"); |
4053 | BUG(); | 4056 | BUG(); |
4054 | } | 4057 | } |
4055 | ecc->strength = ecc->bytes * 8 / fls(8 * ecc->size); | ||
4056 | break; | 4058 | break; |
4057 | 4059 | ||
4058 | case NAND_ECC_NONE: | 4060 | case NAND_ECC_NONE: |