Skip to content

Commit

Permalink
mtd: nand: ecc-bch: Stop exporting the private structure
Browse files Browse the repository at this point in the history
The NAND BCH control structure has nothing to do outside of this
driver, all users of the nand_bch_init/free() functions just save it
to chip->ecc.priv so do it in this driver directly and return a
regular error code instead.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20200929230124.31491-5-miquel.raynal@bootlin.com
  • Loading branch information
Miquel Raynal committed Nov 30, 2020
1 parent 8c5c209 commit 3c0fe36
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 37 deletions.
38 changes: 21 additions & 17 deletions drivers/mtd/nand/ecc-sw-bch.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ EXPORT_SYMBOL(nand_bch_correct_data);

/**
* nand_bch_init - Initialize software BCH ECC engine
* @mtd: MTD device
* @chip: NAND chip object
*
* Returns: a pointer to a new NAND BCH control structure, or NULL upon failure
*
Expand All @@ -105,32 +105,34 @@ EXPORT_SYMBOL(nand_bch_correct_data);
* @eccsize = 512 (thus, m = 13 is the smallest integer such that 2^m - 1 > 512 * 8)
* @eccbytes = 7 (7 bytes are required to store m * t = 13 * 4 = 52 bits)
*/
struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
int nand_bch_init(struct nand_chip *chip)
{
struct nand_chip *nand = mtd_to_nand(mtd);
struct mtd_info *mtd = nand_to_mtd(chip);
unsigned int m, t, eccsteps, i;
struct nand_bch_control *nbc = NULL;
unsigned char *erased_page;
unsigned int eccsize = nand->ecc.size;
unsigned int eccbytes = nand->ecc.bytes;
unsigned int eccstrength = nand->ecc.strength;
unsigned int eccsize = chip->ecc.size;
unsigned int eccbytes = chip->ecc.bytes;
unsigned int eccstrength = chip->ecc.strength;

if (!eccbytes && eccstrength) {
eccbytes = DIV_ROUND_UP(eccstrength * fls(8 * eccsize), 8);
nand->ecc.bytes = eccbytes;
chip->ecc.bytes = eccbytes;
}

if (!eccsize || !eccbytes) {
pr_warn("ecc parameters not supplied\n");
goto fail;
return -EINVAL;
}

m = fls(1+8*eccsize);
t = (eccbytes*8)/m;

nbc = kzalloc(sizeof(*nbc), GFP_KERNEL);
if (!nbc)
goto fail;
return -ENOMEM;

chip->ecc.priv = nbc;

nbc->bch = bch_init(m, t, 0, false);
if (!nbc->bch)
Expand Down Expand Up @@ -165,9 +167,9 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
* FIXME: we should probably rework the sequencing in nand_scan_tail()
* to avoid setting those fields twice.
*/
nand->ecc.steps = eccsteps;
nand->ecc.total = eccsteps * eccbytes;
nand->base.ecc.ctx.total = nand->ecc.total;
chip->ecc.steps = eccsteps;
chip->ecc.total = eccsteps * eccbytes;
nand->base.ecc.ctx.total = chip->ecc.total;
if (mtd_ooblayout_count_eccbytes(mtd) != (eccsteps*eccbytes)) {
pr_warn("invalid ecc layout\n");
goto fail;
Expand All @@ -193,21 +195,23 @@ struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
nbc->eccmask[i] ^= 0xff;

if (!eccstrength)
nand->ecc.strength = (eccbytes * 8) / fls(8 * eccsize);
chip->ecc.strength = (eccbytes * 8) / fls(8 * eccsize);

return nbc;
return 0;
fail:
nand_bch_free(nbc);
return NULL;
nand_bch_free(chip);
return -EINVAL;
}
EXPORT_SYMBOL(nand_bch_init);

/**
* nand_bch_free - Release NAND BCH ECC resources
* @nbc: NAND BCH control structure
*/
void nand_bch_free(struct nand_bch_control *nbc)
void nand_bch_free(struct nand_chip *chip)
{
struct nand_bch_control *nbc = chip->ecc.priv;

if (nbc) {
bch_free(nbc->bch);
kfree(nbc->errloc);
Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/fsmc_nand.c
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,7 @@ static int fsmc_nand_attach_chip(struct nand_chip *nand)

/*
* Don't set layout for BCH4 SW ECC. This will be
* generated later in nand_bch_init() later.
* generated later during BCH initialization.
*/
if (nand->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) {
switch (mtd->oobsize) {
Expand Down
12 changes: 7 additions & 5 deletions drivers/mtd/nand/raw/nand_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -5203,6 +5203,7 @@ static int nand_set_ecc_soft_ops(struct nand_chip *chip)
struct mtd_info *mtd = nand_to_mtd(chip);
struct nand_device *nanddev = mtd_to_nanddev(mtd);
struct nand_ecc_ctrl *ecc = &chip->ecc;
int ret;

if (WARN_ON(ecc->engine_type != NAND_ECC_ENGINE_TYPE_SOFT))
return -EINVAL;
Expand Down Expand Up @@ -5289,13 +5290,14 @@ static int nand_set_ecc_soft_ops(struct nand_chip *chip)
ecc->strength = bytes * 8 / fls(8 * ecc->size);
}

/* See nand_bch_init() for details. */
/* See the software BCH ECC initialization for details */
ecc->bytes = 0;
ecc->priv = nand_bch_init(mtd);
if (!ecc->priv) {
ret = nand_bch_init(chip);
if (ret) {
WARN(1, "BCH ECC initialization failed!\n");
return -EINVAL;
return ret;
}

return 0;
default:
WARN(1, "Unsupported ECC algorithm!\n");
Expand Down Expand Up @@ -5955,7 +5957,7 @@ void nand_cleanup(struct nand_chip *chip)
{
if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_SOFT &&
chip->ecc.algo == NAND_ECC_ALGO_BCH)
nand_bch_free((struct nand_bch_control *)chip->ecc.priv);
nand_bch_free(chip);

nanddev_cleanup(&chip->base);

Expand Down
16 changes: 8 additions & 8 deletions drivers/mtd/nand/raw/omap2.c
Original file line number Diff line number Diff line change
Expand Up @@ -2047,10 +2047,10 @@ static int omap_nand_attach_chip(struct nand_chip *chip)
/* Reserve one byte for the OMAP marker */
oobbytes_per_step = chip->ecc.bytes + 1;
/* Software BCH library is used for locating errors */
chip->ecc.priv = nand_bch_init(mtd);
if (!chip->ecc.priv) {
err = nand_bch_init(chip);
if (err) {
dev_err(dev, "Unable to use BCH library\n");
return -EINVAL;
return err;
}
break;

Expand Down Expand Up @@ -2089,10 +2089,10 @@ static int omap_nand_attach_chip(struct nand_chip *chip)
/* Reserve one byte for the OMAP marker */
oobbytes_per_step = chip->ecc.bytes + 1;
/* Software BCH library is used for locating errors */
chip->ecc.priv = nand_bch_init(mtd);
if (!chip->ecc.priv) {
err = nand_bch_init(chip);
if (err) {
dev_err(dev, "unable to use BCH library\n");
return -EINVAL;
return err;
}
break;

Expand Down Expand Up @@ -2272,7 +2272,7 @@ static int omap_nand_probe(struct platform_device *pdev)
if (!IS_ERR_OR_NULL(info->dma))
dma_release_channel(info->dma);
if (nand_chip->ecc.priv) {
nand_bch_free(nand_chip->ecc.priv);
nand_bch_free(nand_chip);
nand_chip->ecc.priv = NULL;
}
return err;
Expand All @@ -2286,7 +2286,7 @@ static int omap_nand_remove(struct platform_device *pdev)
int ret;

if (nand_chip->ecc.priv) {
nand_bch_free(nand_chip->ecc.priv);
nand_bch_free(nand_chip);
nand_chip->ecc.priv = NULL;
}
if (info->dma)
Expand Down
11 changes: 5 additions & 6 deletions include/linux/mtd/nand-ecc-sw-bch.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

struct mtd_info;
struct nand_chip;
struct nand_bch_control;

#if IS_ENABLED(CONFIG_MTD_NAND_ECC_SW_BCH)

Expand All @@ -30,11 +29,11 @@ int nand_bch_correct_data(struct nand_chip *chip, u_char *dat,
/*
* Initialize BCH encoder/decoder
*/
struct nand_bch_control *nand_bch_init(struct mtd_info *mtd);
int nand_bch_init(struct nand_chip *chip);
/*
* Release BCH encoder/decoder resources
*/
void nand_bch_free(struct nand_bch_control *nbc);
void nand_bch_free(struct nand_chip *chip);

#else /* !CONFIG_MTD_NAND_ECC_SW_BCH */

Expand All @@ -54,12 +53,12 @@ nand_bch_correct_data(struct nand_chip *chip, unsigned char *buf,
return -ENOTSUPP;
}

static inline struct nand_bch_control *nand_bch_init(struct mtd_info *mtd)
static inline int nand_bch_init(struct nand_chip *chip)
{
return NULL;
return -ENOTSUPP;
}

static inline void nand_bch_free(struct nand_bch_control *nbc) {}
static inline void nand_bch_free(struct nand_chip *chip) {}

#endif /* CONFIG_MTD_NAND_ECC_SW_BCH */

Expand Down

0 comments on commit 3c0fe36

Please sign in to comment.