Message ID | 20240916-brcmnand-fixes-v2-4-08632f64c8ec@linaro.org |
---|---|
State | New |
Headers | show |
Series | mtd: nand: brcmnand: Backported fixes from Linux | expand |
> -----Original Message----- > From: Linus Walleij <linus.walleij@linaro.org> > Sent: Monday, September 16, 2024 2:59 AM > To: u-boot@lists.denx.de; Dario Binacchi > <dario.binacchi@amarulasolutions.com>; Michael Trimarchi > <michael@amarulasolutions.com>; Anand Gore > <anand.gore@broadcom.com>; William Zhang > <william.zhang@broadcom.com>; Kursad Oney > <kursad.oney@broadcom.com>; Philippe Reynes > <philippe.reynes@softathome.com> > Cc: Linus Walleij <linus.walleij@linaro.org>; Miquel Raynal > <miquel.raynal@bootlin.com> > Subject: [PATCH v2 4/7] mtd: rawnand: brcmnand: Fix mtd oobsize > > From: William Zhang <william.zhang@broadcom.com> > > Backport from upstream Linux > commit 60177390fa061c62d156f4a546e3efd90df3c183 > "mtd: rawnand: brcmnand: Fix mtd oobsize" > > brcmnand controller can only access the flash spare area up to certain > bytes based on the ECC level. It can be less than the actual flash spare > area size. For example, for many NAND chip supporting ECC BCH-8, it has > 226 bytes spare area. But controller can only uses 218 bytes. So brcmand > driver overrides the mtd oobsize with the controller's accessible spare > area size. When the nand base driver utilizes the nand_device object, it > resets the oobsize back to the actual flash spare aprea size from > nand_memory_organization structure and controller may not able to > access > all the oob area as mtd advises. > > This change fixes the issue by overriding the oobsize in the > nand_memory_organization structure to the controller's accessible spare > area size. > > Fixes: a7ab085d7c16 ("mtd: rawnand: Initialize the nand_device object") > Signed-off-by: William Zhang <william.zhang@broadcom.com> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> > Link: https://lore.kernel.org/linux-mtd/20230706182909.79151-6- > william.zhang@broadcom.com > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > drivers/mtd/nand/raw/brcmnand/brcmnand.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c > b/drivers/mtd/nand/raw/brcmnand/brcmnand.c > index 60d34bd21f53..552b239b95ae 100644 > --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c > +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c > @@ -25,6 +25,7 @@ > #include <linux/completion.h> > #include <linux/errno.h> > #include <linux/log2.h> > +#include <linux/mtd/nand.h> > #include <linux/mtd/rawnand.h> > #include <asm/processor.h> > #include <dm.h> > @@ -2304,6 +2305,8 @@ static int brcmnand_setup_dev(struct > brcmnand_host *host) > { > struct mtd_info *mtd = nand_to_mtd(&host->chip); > struct nand_chip *chip = &host->chip; > + struct nand_device *nanddev = mtd_to_nanddev(mtd); > + struct nand_memory_organization *memorg = > nanddev_get_memorg(nanddev); > struct brcmnand_controller *ctrl = host->ctrl; > struct brcmnand_cfg *cfg = &host->hwcfg; > char msg[128]; > @@ -2331,10 +2334,11 @@ static int brcmnand_setup_dev(struct > brcmnand_host *host) > if (cfg->spare_area_size > ctrl->max_oob) > cfg->spare_area_size = ctrl->max_oob; > /* > - * Set oobsize to be consistent with controller's spare_area_size, as > - * the rest is inaccessible. > + * Set mtd and memorg oobsize to be consistent with controller's > + * spare_area_size, as the rest is inaccessible. > */ > mtd->oobsize = cfg->spare_area_size * (mtd->writesize >> > FC_SHIFT); > + memorg->oobsize = mtd->oobsize; > > cfg->device_size = mtd->size; > cfg->block_size = mtd->erasesize; > > -- > 2.46.0 Reviewed-by: William Zhang <william.zhang@broadcom.com>
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c index 60d34bd21f53..552b239b95ae 100644 --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c @@ -25,6 +25,7 @@ #include <linux/completion.h> #include <linux/errno.h> #include <linux/log2.h> +#include <linux/mtd/nand.h> #include <linux/mtd/rawnand.h> #include <asm/processor.h> #include <dm.h> @@ -2304,6 +2305,8 @@ static int brcmnand_setup_dev(struct brcmnand_host *host) { struct mtd_info *mtd = nand_to_mtd(&host->chip); struct nand_chip *chip = &host->chip; + struct nand_device *nanddev = mtd_to_nanddev(mtd); + struct nand_memory_organization *memorg = nanddev_get_memorg(nanddev); struct brcmnand_controller *ctrl = host->ctrl; struct brcmnand_cfg *cfg = &host->hwcfg; char msg[128]; @@ -2331,10 +2334,11 @@ static int brcmnand_setup_dev(struct brcmnand_host *host) if (cfg->spare_area_size > ctrl->max_oob) cfg->spare_area_size = ctrl->max_oob; /* - * Set oobsize to be consistent with controller's spare_area_size, as - * the rest is inaccessible. + * Set mtd and memorg oobsize to be consistent with controller's + * spare_area_size, as the rest is inaccessible. */ mtd->oobsize = cfg->spare_area_size * (mtd->writesize >> FC_SHIFT); + memorg->oobsize = mtd->oobsize; cfg->device_size = mtd->size; cfg->block_size = mtd->erasesize;