Skip to content

Commit

Permalink
mtd: rawnand: Always store info about bad block markers in chip struct
Browse files Browse the repository at this point in the history
The information about where the manufacturer puts the bad block
markers inside the bad block and in the OOB data is stored in
different places. Let's move this information to nand_chip.options
and nand_chip.badblockpos.

As this chip-specific information is not directly related to the
bad block table (BBT), we also rename the flags to NAND_BBM_*.

Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
  • Loading branch information
Frieder Schrempf authored and Miquel Raynal committed Apr 18, 2019
1 parent 39e0195 commit 04649ec
Show file tree
Hide file tree
Showing 11 changed files with 34 additions and 20 deletions.
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/nand_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,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->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

return 0;
}
Expand Down
12 changes: 6 additions & 6 deletions drivers/mtd/nand/raw/nand_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -295,11 +295,11 @@ static int nand_block_bad(struct nand_chip *chip, loff_t ofs)
int page, page_end, res;
u8 bad;

if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
if (chip->options & NAND_BBM_LASTPAGE)
ofs += mtd->erasesize - mtd->writesize;

page = (int)(ofs >> chip->page_shift) & chip->pagemask;
page_end = page + (chip->bbt_options & NAND_BBT_SCAN2NDPAGE ? 2 : 1);
page_end = page + ((chip->options & NAND_BBM_SECONDPAGE) ? 2 : 1);

for (; page < page_end; page++) {
res = chip->ecc.read_oob(chip, page);
Expand Down Expand Up @@ -507,7 +507,7 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs)
ops.mode = MTD_OPS_PLACE_OOB;

/* Write to first/last page(s) if necessary */
if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
if (chip->options & NAND_BBM_LASTPAGE)
ofs += mtd->erasesize - mtd->writesize;
do {
res = nand_do_write_oob(chip, ofs, &ops);
Expand All @@ -516,7 +516,7 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs)

i++;
ofs += mtd->writesize;
} while ((chip->bbt_options & NAND_BBT_SCAN2NDPAGE) && i < 2);
} while ((chip->options & NAND_BBM_SECONDPAGE) && i < 2);

return ret;
}
Expand Down Expand Up @@ -4513,9 +4513,9 @@ static void nand_decode_bbm_options(struct nand_chip *chip)

/* Set the bad block position */
if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16))
chip->badblockpos = NAND_LARGE_BADBLOCK_POS;
chip->badblockpos = NAND_BBM_POS_LARGE;
else
chip->badblockpos = NAND_SMALL_BADBLOCK_POS;
chip->badblockpos = NAND_BBM_POS_SMALL;
}

static inline bool is_full_id_nand(struct nand_flash_dev *type)
Expand Down
4 changes: 2 additions & 2 deletions drivers/mtd/nand/raw/nand_bbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf,

pr_info("Scanning device for bad blocks\n");

if (bd->options & NAND_BBT_SCAN2NDPAGE)
if (this->options & NAND_BBM_SECONDPAGE)
numpages = 2;
else
numpages = 1;
Expand All @@ -489,7 +489,7 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf,
from = (loff_t)startblock << this->bbt_erase_shift;
}

if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
if (this->options & NAND_BBM_LASTPAGE)
from += mtd->erasesize - (mtd->writesize * numpages);

for (i = startblock; i < numblocks; i++) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/nand_esmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

return 0;
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/mtd/nand/raw/nand_hynix.c
Original file line number Diff line number Diff line change
Expand Up @@ -688,9 +688,9 @@ static int hynix_nand_init(struct nand_chip *chip)
int ret;

if (!nand_is_slc(chip))
chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
chip->options |= NAND_BBM_LASTPAGE;
else
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

hynix = kzalloc(sizeof(*hynix), GFP_KERNEL);
if (!hynix)
Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/nand_macronix.c
Original file line number Diff line number Diff line change
Expand Up @@ -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->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

macronix_nand_fix_broken_get_timings(chip);

Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/nand_micron.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ static int micron_nand_init(struct nand_chip *chip)
goto err_free_manuf_data;

if (mtd->writesize == 2048)
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

ondie = micron_supports_on_die_ecc(chip);

Expand Down
4 changes: 2 additions & 2 deletions drivers/mtd/nand/raw/nand_samsung.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ static int samsung_nand_init(struct nand_chip *chip)
chip->options |= NAND_SAMSUNG_LP_OPTIONS;

if (!nand_is_slc(chip))
chip->bbt_options |= NAND_BBT_SCANLASTPAGE;
chip->options |= NAND_BBM_LASTPAGE;
else
chip->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= NAND_BBM_SECONDPAGE;

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/mtd/nand/raw/nand_toshiba.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,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->bbt_options |= NAND_BBT_SCAN2NDPAGE;
chip->options |= 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 &&
Expand Down
4 changes: 2 additions & 2 deletions drivers/mtd/nand/raw/sh_flctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,12 @@ static const struct mtd_ooblayout_ops flctl_4secc_oob_largepage_ops = {
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };

static struct nand_bbt_descr flctl_4secc_smallpage = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 11,
.len = 1,
.pattern = scan_ff_pattern,
};

static struct nand_bbt_descr flctl_4secc_largepage = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 0,
.len = 2,
.pattern = scan_ff_pattern,
Expand Down Expand Up @@ -1179,6 +1177,8 @@ static int flctl_probe(struct platform_device *pdev)
if (pdata->flcmncr_val & SEL_16BIT)
nand->options |= NAND_BUSWIDTH_16;

nand->options |= NAND_BBM_SECONDPAGE;

pm_runtime_enable(&pdev->dev);
pm_runtime_resume(&pdev->dev);

Expand Down
16 changes: 15 additions & 1 deletion include/linux/mtd/rawnand.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,20 @@ enum nand_ecc_algo {
/* Macros to identify the above */
#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))

/*
* There are different places where the manufacturer stores the factory bad
* block markers.
*
* Position within the block: Each of these pages needs to be checked for a
* bad block marking pattern.
*/
#define NAND_BBM_SECONDPAGE 0x02000000
#define NAND_BBM_LASTPAGE 0x04000000

/* Position within the OOB data of the page */
#define NAND_BBM_POS_SMALL 5
#define NAND_BBM_POS_LARGE 0

/* Non chip related options */
/* This option skips the bbt scan during initialization. */
#define NAND_SKIP_BBTSCAN 0x00010000
Expand Down Expand Up @@ -1055,7 +1069,7 @@ struct nand_chip {

int subpagesize;
int onfi_timing_mode_default;
int badblockpos;
unsigned int badblockpos;
int badblockbits;

struct nand_id id;
Expand Down

0 comments on commit 04649ec

Please sign in to comment.