Loading drivers/mtd/nand/nand_base.c +15 −0 Original line number Diff line number Diff line Loading @@ -4294,6 +4294,21 @@ int nand_scan_tail(struct mtd_info *mtd) ecc->strength = 4; } /* * if no ecc placement scheme was provided pickup the default * large page one. */ if (!mtd->ooblayout) { /* handle large page devices only */ if (mtd->oobsize < 64) { WARN(1, "OOB layout is required when using software BCH on small pages\n"); ret = -EINVAL; goto err_free; } mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops); } /* See nand_bch_init() for details. */ ecc->bytes = 0; ecc->priv = nand_bch_init(mtd); Loading drivers/mtd/nand/nand_bch.c +11 −30 Original line number Diff line number Diff line Loading @@ -32,13 +32,11 @@ /** * struct nand_bch_control - private NAND BCH control structure * @bch: BCH control structure * @ecclayout: private ecc layout for this BCH configuration * @errloc: error location array * @eccmask: XOR ecc mask, allows erased pages to be decoded as valid */ struct nand_bch_control { struct bch_control *bch; struct nand_ecclayout ecclayout; unsigned int *errloc; unsigned char *eccmask; }; Loading Loading @@ -124,7 +122,6 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd) { struct nand_chip *nand = mtd_to_nand(mtd); unsigned int m, t, eccsteps, i; struct nand_ecclayout *layout = nand->ecc.layout; struct nand_bch_control *nbc = NULL; unsigned char *erased_page; unsigned int eccsize = nand->ecc.size; Loading Loading @@ -161,35 +158,19 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd) eccsteps = mtd->writesize/eccsize; /* if no ecc placement scheme was provided, build one */ if (!layout) { /* handle large page devices only */ if (mtd->oobsize < 64) { printk(KERN_WARNING "must provide an oob scheme for " "oobsize %d\n", mtd->oobsize); goto fail; } layout = &nbc->ecclayout; layout->eccbytes = eccsteps*eccbytes; /* * Rely on the default ecclayout to ooblayout wrapper provided by MTD * core if ecc.layout is not NULL. * FIXME: this should be removed when all callers have moved to the * mtd_ooblayout_ops approach. */ mtd_set_ecclayout(mtd, nand->ecc.layout); /* reserve 2 bytes for bad block marker */ if (layout->eccbytes+2 > mtd->oobsize) { printk(KERN_WARNING "no suitable oob scheme available " "for oobsize %d eccbytes %u\n", mtd->oobsize, eccbytes); /* Check that we have an oob layout description. */ if (!mtd->ooblayout) { pr_warn("missing oob scheme"); goto fail; } /* put ecc bytes at oob tail */ for (i = 0; i < layout->eccbytes; i++) layout->eccpos[i] = mtd->oobsize-layout->eccbytes+i; layout->oobfree[0].offset = 2; layout->oobfree[0].length = mtd->oobsize-2-layout->eccbytes; nand->ecc.layout = layout; } /* sanity checks */ if (8*(eccsize+eccbytes) >= (1 << m)) { Loading Loading
drivers/mtd/nand/nand_base.c +15 −0 Original line number Diff line number Diff line Loading @@ -4294,6 +4294,21 @@ int nand_scan_tail(struct mtd_info *mtd) ecc->strength = 4; } /* * if no ecc placement scheme was provided pickup the default * large page one. */ if (!mtd->ooblayout) { /* handle large page devices only */ if (mtd->oobsize < 64) { WARN(1, "OOB layout is required when using software BCH on small pages\n"); ret = -EINVAL; goto err_free; } mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops); } /* See nand_bch_init() for details. */ ecc->bytes = 0; ecc->priv = nand_bch_init(mtd); Loading
drivers/mtd/nand/nand_bch.c +11 −30 Original line number Diff line number Diff line Loading @@ -32,13 +32,11 @@ /** * struct nand_bch_control - private NAND BCH control structure * @bch: BCH control structure * @ecclayout: private ecc layout for this BCH configuration * @errloc: error location array * @eccmask: XOR ecc mask, allows erased pages to be decoded as valid */ struct nand_bch_control { struct bch_control *bch; struct nand_ecclayout ecclayout; unsigned int *errloc; unsigned char *eccmask; }; Loading Loading @@ -124,7 +122,6 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd) { struct nand_chip *nand = mtd_to_nand(mtd); unsigned int m, t, eccsteps, i; struct nand_ecclayout *layout = nand->ecc.layout; struct nand_bch_control *nbc = NULL; unsigned char *erased_page; unsigned int eccsize = nand->ecc.size; Loading Loading @@ -161,35 +158,19 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd) eccsteps = mtd->writesize/eccsize; /* if no ecc placement scheme was provided, build one */ if (!layout) { /* handle large page devices only */ if (mtd->oobsize < 64) { printk(KERN_WARNING "must provide an oob scheme for " "oobsize %d\n", mtd->oobsize); goto fail; } layout = &nbc->ecclayout; layout->eccbytes = eccsteps*eccbytes; /* * Rely on the default ecclayout to ooblayout wrapper provided by MTD * core if ecc.layout is not NULL. * FIXME: this should be removed when all callers have moved to the * mtd_ooblayout_ops approach. */ mtd_set_ecclayout(mtd, nand->ecc.layout); /* reserve 2 bytes for bad block marker */ if (layout->eccbytes+2 > mtd->oobsize) { printk(KERN_WARNING "no suitable oob scheme available " "for oobsize %d eccbytes %u\n", mtd->oobsize, eccbytes); /* Check that we have an oob layout description. */ if (!mtd->ooblayout) { pr_warn("missing oob scheme"); goto fail; } /* put ecc bytes at oob tail */ for (i = 0; i < layout->eccbytes; i++) layout->eccpos[i] = mtd->oobsize-layout->eccbytes+i; layout->oobfree[0].offset = 2; layout->oobfree[0].length = mtd->oobsize-2-layout->eccbytes; nand->ecc.layout = layout; } /* sanity checks */ if (8*(eccsize+eccbytes) >= (1 << m)) { Loading