This is needed for a later command to scrub away bad blocks. ONLY USE THIS FEATURE WHEN YOU KNOW WHAT YOU ARE DOING!
Signed-off-by: Wolfram Sang <w.s...@pengutronix.de> --- drivers/mtd/core.c | 3 ++- drivers/mtd/nand/nand_write.c | 37 ++++++++++++++++++++----------------- include/linux/mtd/mtd-abi.h | 1 + 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 8601787..95db1d6 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -18,6 +18,7 @@ #include <common.h> #include <linux/mtd/nand.h> #include <linux/mtd/mtd.h> +#include <linux/mtd/mtd-abi.h> #include <init.h> #include <xfuncs.h> #include <driver.h> @@ -32,7 +33,7 @@ static LIST_HEAD(mtd_register_hooks); int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) { - if (!mtd->block_isbad) + if (!mtd->block_isbad || mtd->flags & MTD_IGNORE_BB) return 0; if (ofs < 0 || ofs > mtd->size) return -EINVAL; diff --git a/drivers/mtd/nand/nand_write.c b/drivers/mtd/nand/nand_write.c index 5ed04ce..a1fa5f7 100644 --- a/drivers/mtd/nand/nand_write.c +++ b/drivers/mtd/nand/nand_write.c @@ -567,6 +567,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, struct nand_chip *chip = mtd->priv; int rewrite_bbt[NAND_MAX_CHIPS]={0}; unsigned int bbt_masked_page = 0xffffffff; + bool do_scrub = mtd->flags & MTD_IGNORE_BB; MTD_DEBUG(MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%08x, len = %i\n", (unsigned int)instr->addr, (unsigned int)instr->len); @@ -627,9 +628,9 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, while (len) { /* - * heck if we have a bad block, we do not erase bad blocks ! + * Check if we have a bad block, if desired */ - if (nand_block_checkbad(mtd, ((loff_t) page) << + if (!do_scrub && nand_block_checkbad(mtd, ((loff_t) page) << chip->page_shift, 0, allowbbt)) { printk(KERN_WARNING "nand_erase: attempt to erase a " "bad block at page 0x%08x\n", page); @@ -657,22 +658,24 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, status = chip->errstat(mtd, chip, FL_ERASING, status, page); - /* See if block erase succeeded */ - if (status & NAND_STATUS_FAIL) { - MTD_DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " - "Failed erase, page 0x%08x\n", page); - instr->state = MTD_ERASE_FAILED; - instr->fail_addr = (page << chip->page_shift); - goto erase_exit; - } + if (!do_scrub) { + /* See if block erase succeeded */ + if (status & NAND_STATUS_FAIL) { + MTD_DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: " + "Failed erase, page 0x%08x\n", page); + instr->state = MTD_ERASE_FAILED; + instr->fail_addr = (page << chip->page_shift); + goto erase_exit; + } - /* - * If BBT requires refresh, set the BBT rewrite flag to the - * page being erased - */ - if (bbt_masked_page != 0xffffffff && - (page & BBT_PAGE_MASK) == bbt_masked_page) - rewrite_bbt[chipnr] = (page << chip->page_shift); + /* + * If BBT requires refresh, set the BBT rewrite flag to the + * page being erased + */ + if (bbt_masked_page != 0xffffffff && + (page & BBT_PAGE_MASK) == bbt_masked_page) + rewrite_bbt[chipnr] = (page << chip->page_shift); + } /* Increment page address and decrement length */ len -= (1 << chip->phys_erase_shift); diff --git a/include/linux/mtd/mtd-abi.h b/include/linux/mtd/mtd-abi.h index 90dee7e..49eb8e6 100644 --- a/include/linux/mtd/mtd-abi.h +++ b/include/linux/mtd/mtd-abi.h @@ -32,6 +32,7 @@ struct mtd_oob_buf { #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ #define MTD_NO_ERASE 0x1000 /* No erase necessary */ #define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */ +#define MTD_IGNORE_BB 0x8000 /* Ignore BadBlocks, treat them normally (DANGEROUS!) */ // Some common devices / combinations of capabilities #define MTD_CAP_ROM 0 -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox