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; 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 > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/