mtd: nand: Request strength instead of bytes for soft BCH
authorAaron Sierra <asierra@xes-inc.com>
Wed, 14 Jan 2015 23:41:31 +0000 (17:41 -0600)
committerBrian Norris <computersforpeace@gmail.com>
Mon, 2 Feb 2015 05:10:58 +0000 (21:10 -0800)
Previously, we requested that drivers pass ecc.size and ecc.bytes when
using NAND_ECC_SOFT_BCH. However, a driver is likely to only know the ECC
strength required for its NAND, so each driver would need to perform a
strength-to-bytes calculation.

Avoid duplicating this calculation in each driver by asking drivers to
pass ecc.size and ecc.strength so that the strength-to-bytes calculation
need only be implemented once.

This reverts/generalizes this commit:
    mtd: nand: Base BCH ECC bytes on required strength

Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nandsim.c
drivers/mtd/nand/sunxi_nand.c

index 3f24b587304f035a3c43253e7cfe4144c40ee8ef..f6af96926f005915164ce27e15b5b9598957a30c 100644 (file)
@@ -4037,22 +4037,24 @@ int nand_scan_tail(struct mtd_info *mtd)
                ecc->read_oob = nand_read_oob_std;
                ecc->write_oob = nand_write_oob_std;
                /*
-                * Board driver should supply ecc.size and ecc.bytes values to
-                * select how many bits are correctable; see nand_bch_init()
-                * for details. Otherwise, default to 4 bits for large page
-                * devices.
+                * Board driver should supply ecc.size and ecc.strength values
+                * to select how many bits are correctable. Otherwise, default
+                * to 4 bits for large page devices.
                 */
                if (!ecc->size && (mtd->oobsize >= 64)) {
                        ecc->size = 512;
-                       ecc->bytes = DIV_ROUND_UP(13 * ecc->strength, 8);
+                       ecc->strength = 4;
                }
+
+               /* See nand_bch_init() for details. */
+               ecc->bytes = DIV_ROUND_UP(
+                               ecc->strength * fls(8 * ecc->size), 8);
                ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes,
                                               &ecc->layout);
                if (!ecc->priv) {
                        pr_warn("BCH ECC initialization failed!\n");
                        BUG();
                }
-               ecc->strength = ecc->bytes * 8 / fls(8 * ecc->size);
                break;
 
        case NAND_ECC_NONE:
index a8fa8dad9b23aebfc4600197864a905fce4560b1..f2324271b94e9d19cc39aafae95cc0ccf934fc42 100644 (file)
@@ -2337,6 +2337,7 @@ static int __init ns_init_module(void)
                }
                chip->ecc.mode = NAND_ECC_SOFT_BCH;
                chip->ecc.size = 512;
+               chip->ecc.strength = bch;
                chip->ecc.bytes = eccbytes;
                NS_INFO("using %u-bit/%u bytes BCH ECC\n", bch, chip->ecc.size);
        }
index ccaa8e28338855effbf10724f9b6fae2df215466..6f93b2990d250e76007ee355aed8054752aa33f9 100644 (file)
@@ -1110,8 +1110,6 @@ static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc,
 
        switch (ecc->mode) {
        case NAND_ECC_SOFT_BCH:
-               ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * ecc->size),
-                                         8);
                break;
        case NAND_ECC_HW:
                ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc, np);