Hello, Schrempf Frieder <frieder.schrempf@xxxxxxxxxx> wrote on Thu, 19 Sep 2019 13:15:08 +0000: > On 19.09.19 14:58, Miquel Raynal wrote: > > Hi Piotr, > > > > Piotr Sroka <piotrs@xxxxxxxxxxx> wrote on Thu, 19 Sep 2019 13:41:35 > > +0100: > > > >> Change calculating of position page containing BBM > >> > >> If none of BBM flags is set then function nand_bbm_get_next_page > >> reports EINVAL. It causes that BBM is not read at all during scanning > >> factory bad blocks. The result is that the BBT table is build without > >> checking factory BBM at all. For Micron flash memories none of this > >> flag is set if page size is different than 2048 bytes. > > I wonder if it wouldn't be better to fix the Micron driver instead: > > --- a/drivers/mtd/nand/raw/nand_micron.c > +++ b/drivers/mtd/nand/raw/nand_micron.c > @@ -448,6 +448,8 @@ static int micron_nand_init(struct nand_chip *chip) > > if (mtd->writesize == 2048) > chip->options |= NAND_BBM_FIRSTPAGE | > NAND_BBM_SECONDPAGE; > + else > + chip->options |= NAND_BBM_FIRSTPAGE; That's what I forgot in my last answer to this thread, I think I only told Piotr privately: I would like both. I think it is important to fix the bbm_get_next_page function but for clarity, setting the FIRSTPAGE flag in Micron's driver seems also pertinent. > > ondie = micron_supports_on_die_ecc(chip); > > > > > > "none of these flags are set" > > > >> > >> This patch changes the nand_bbm_get_next_page function. > > > > "Address this regression by changing the > > nand_bbm_get_next_page_function." > > > >> It will return 0 if none of BBM flag is set and page parameter is 0. > > > > no BBM flag is set > > > >> After that modification way of discovering factory bad blocks will work > >> similar as in kernel version 5.1. > >> > > > > Fixes + stable tags would be great! > > > >> Signed-off-by: Piotr Sroka <piotrs@xxxxxxxxxxx> > >> --- > >> drivers/mtd/nand/raw/nand_base.c | 8 ++++++-- > >> 1 file changed, 6 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c > >> index 5c2c30a7dffa..f64e3b6605c6 100644 > >> --- a/drivers/mtd/nand/raw/nand_base.c > >> +++ b/drivers/mtd/nand/raw/nand_base.c > >> @@ -292,12 +292,16 @@ int nand_bbm_get_next_page(struct nand_chip *chip, int page) > >> struct mtd_info *mtd = nand_to_mtd(chip); > >> int last_page = ((mtd->erasesize - mtd->writesize) >> > >> chip->page_shift) & chip->pagemask; > >> + unsigned int bbm_flags = NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE > >> + | NAND_BBM_LASTPAGE; > >> > >> + if (page == 0 && !(chip->options & bbm_flags)) > >> + return 0; > >> if (page == 0 && chip->options & NAND_BBM_FIRSTPAGE) > >> return 0; > >> - else if (page <= 1 && chip->options & NAND_BBM_SECONDPAGE) > >> + if (page <= 1 && chip->options & NAND_BBM_SECONDPAGE) > >> return 1; > >> - else if (page <= last_page && chip->options & NAND_BBM_LASTPAGE) > >> + if (page <= last_page && chip->options & NAND_BBM_LASTPAGE) > >> return last_page; > >> > >> return -EINVAL; > > > > Lookgs good otherwise. > > > > Thanks, > > Miquèl > > Thanks, Miquèl ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/