On Wed, 30 Jan 2019 13:01:47 +0000 Schrempf Frieder <frieder.schrempf@xxxxxxxxxx> wrote: > From: Frieder Schrempf <frieder.schrempf@xxxxxxxxxx> > > To be able to check and set bad block markers in the first and > second page of a block independently of each other, we create > separate flags for both cases. > > Previously NAND_BBM_SECONDPAGE meant, that both, the first and the > second page were used. With this patch NAND_BBM_FIRSTPAGE stands for > using the first page and NAND_BBM_SECONDPAGE for using the second > page. > > This patch is only for preparation of subsequent changes and does > not implement the logic to actually handle both flags separately. > > Signed-off-by: Frieder Schrempf <frieder.schrempf@xxxxxxxxxx> Reviewed-by: Boris Brezillon <bbrezillon@xxxxxxxxxx> > --- > drivers/mtd/nand/raw/nand_amd.c | 2 +- > drivers/mtd/nand/raw/nand_base.c | 6 ++++-- > drivers/mtd/nand/raw/nand_bbt.c | 3 ++- > drivers/mtd/nand/raw/nand_esmt.c | 2 +- > drivers/mtd/nand/raw/nand_hynix.c | 2 +- > drivers/mtd/nand/raw/nand_macronix.c | 2 +- > drivers/mtd/nand/raw/nand_micron.c | 2 +- > drivers/mtd/nand/raw/nand_samsung.c | 2 +- > drivers/mtd/nand/raw/nand_toshiba.c | 2 +- > drivers/mtd/nand/raw/sh_flctl.c | 2 +- > include/linux/mtd/rawnand.h | 1 + > 11 files changed, 15 insertions(+), 11 deletions(-) > > diff --git a/drivers/mtd/nand/raw/nand_amd.c b/drivers/mtd/nand/raw/nand_amd.c > index 6e248bdcc797..6202cbf7ee8d 100644 > --- a/drivers/mtd/nand/raw/nand_amd.c > +++ b/drivers/mtd/nand/raw/nand_amd.c > @@ -40,7 +40,7 @@ static void amd_nand_decode_id(struct nand_chip *chip) > static int amd_nand_init(struct nand_chip *chip) > { > if (nand_is_slc(chip)) > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > return 0; > } > diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c > index c6199cc68d2f..9ef7b86cdc42 100644 > --- a/drivers/mtd/nand/raw/nand_base.c > +++ b/drivers/mtd/nand/raw/nand_base.c > @@ -302,7 +302,8 @@ static int nand_block_bad(struct nand_chip *chip, loff_t ofs) > ofs += mtd->erasesize - mtd->writesize; > > page = (int)(ofs >> chip->page_shift) & chip->pagemask; > - page_end = page + ((chip->options & NAND_BBM_SECONDPAGE) ? 2 : 1); > + page_end = page + (((chip->options & NAND_BBM_FIRSTPAGE) && > + (chip->options & NAND_BBM_SECONDPAGE)) ? 2 : 1); > > for (; page < page_end; page++) { > res = chip->ecc.read_oob(chip, page); > @@ -550,7 +551,8 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs) > > i++; > ofs += mtd->writesize; > - } while ((chip->options & NAND_BBM_SECONDPAGE) && i < 2); > + } while ((chip->options & NAND_BBM_FIRSTPAGE) && > + (chip->options & NAND_BBM_SECONDPAGE) && i < 2); > > return ret; > } > diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c > index 862eaa3a0552..c095c04d566d 100644 > --- a/drivers/mtd/nand/raw/nand_bbt.c > +++ b/drivers/mtd/nand/raw/nand_bbt.c > @@ -466,7 +466,8 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf, > > pr_info("Scanning device for bad blocks\n"); > > - if (this->options & NAND_BBM_SECONDPAGE) > + if ((this->options & NAND_BBM_FIRSTPAGE) && > + (this->options & NAND_BBM_SECONDPAGE)) > numpages = 2; > else > numpages = 1; > diff --git a/drivers/mtd/nand/raw/nand_esmt.c b/drivers/mtd/nand/raw/nand_esmt.c > index 80d2d3a1b5f2..99a8092969a7 100644 > --- a/drivers/mtd/nand/raw/nand_esmt.c > +++ b/drivers/mtd/nand/raw/nand_esmt.c > @@ -36,7 +36,7 @@ static void esmt_nand_decode_id(struct nand_chip *chip) > static int esmt_nand_init(struct nand_chip *chip) > { > if (nand_is_slc(chip)) > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > return 0; > } > diff --git a/drivers/mtd/nand/raw/nand_hynix.c b/drivers/mtd/nand/raw/nand_hynix.c > index 2789bf3857c9..e685d70c1618 100644 > --- a/drivers/mtd/nand/raw/nand_hynix.c > +++ b/drivers/mtd/nand/raw/nand_hynix.c > @@ -674,7 +674,7 @@ static int hynix_nand_init(struct nand_chip *chip) > if (!nand_is_slc(chip)) > chip->options |= NAND_BBM_LASTPAGE; > else > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > hynix = kzalloc(sizeof(*hynix), GFP_KERNEL); > if (!hynix) > diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/raw/nand_macronix.c > index 6db7ced4b96b..e287e71347c5 100644 > --- a/drivers/mtd/nand/raw/nand_macronix.c > +++ b/drivers/mtd/nand/raw/nand_macronix.c > @@ -62,7 +62,7 @@ static void macronix_nand_fix_broken_get_timings(struct nand_chip *chip) > static int macronix_nand_init(struct nand_chip *chip) > { > if (nand_is_slc(chip)) > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > macronix_nand_fix_broken_get_timings(chip); > > diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c > index ea6b6e80d6f8..ca80e09783c7 100644 > --- a/drivers/mtd/nand/raw/nand_micron.c > +++ b/drivers/mtd/nand/raw/nand_micron.c > @@ -448,7 +448,7 @@ static int micron_nand_init(struct nand_chip *chip) > goto err_free_manuf_data; > > if (mtd->writesize == 2048) > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > ondie = micron_supports_on_die_ecc(chip); > > diff --git a/drivers/mtd/nand/raw/nand_samsung.c b/drivers/mtd/nand/raw/nand_samsung.c > index 3be737139210..ace50522dd19 100644 > --- a/drivers/mtd/nand/raw/nand_samsung.c > +++ b/drivers/mtd/nand/raw/nand_samsung.c > @@ -123,7 +123,7 @@ static int samsung_nand_init(struct nand_chip *chip) > if (!nand_is_slc(chip)) > chip->options |= NAND_BBM_LASTPAGE; > else > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > return 0; > } > diff --git a/drivers/mtd/nand/raw/nand_toshiba.c b/drivers/mtd/nand/raw/nand_toshiba.c > index 222a66bf0aa6..0031e6727193 100644 > --- a/drivers/mtd/nand/raw/nand_toshiba.c > +++ b/drivers/mtd/nand/raw/nand_toshiba.c > @@ -147,7 +147,7 @@ static void toshiba_nand_decode_id(struct nand_chip *chip) > static int toshiba_nand_init(struct nand_chip *chip) > { > if (nand_is_slc(chip)) > - chip->options |= NAND_BBM_SECONDPAGE; > + chip->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > /* Check that chip is BENAND and ECC mode is on-die */ > if (nand_is_slc(chip) && chip->ecc.mode == NAND_ECC_ON_DIE && > diff --git a/drivers/mtd/nand/raw/sh_flctl.c b/drivers/mtd/nand/raw/sh_flctl.c > index 2017b00fadd8..971d9afd55e5 100644 > --- a/drivers/mtd/nand/raw/sh_flctl.c > +++ b/drivers/mtd/nand/raw/sh_flctl.c > @@ -1176,7 +1176,7 @@ static int flctl_probe(struct platform_device *pdev) > if (pdata->flcmncr_val & SEL_16BIT) > nand->options |= NAND_BUSWIDTH_16; > > - nand->options |= NAND_BBM_SECONDPAGE; > + nand->options |= NAND_BBM_FIRSTPAGE | NAND_BBM_SECONDPAGE; > > pm_runtime_enable(&pdev->dev); > pm_runtime_resume(&pdev->dev); > diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h > index da785d92e26e..23ad4ad790af 100644 > --- a/include/linux/mtd/rawnand.h > +++ b/include/linux/mtd/rawnand.h > @@ -176,6 +176,7 @@ enum nand_ecc_algo { > * Position within the block: Each of these pages needs to be checked for a > * bad block marking pattern. > */ > +#define NAND_BBM_FIRSTPAGE 0x01000000 > #define NAND_BBM_SECONDPAGE 0x02000000 > #define NAND_BBM_LASTPAGE 0x04000000 > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/