Commit 6d41419f authored by Marek Vasut's avatar Marek Vasut Committed by Scott Wood

NAND: Really ignore bad blocks when scrubbing

Signed-off-by: default avatarMarek Vasut <marek.vasut@gmail.com>
Cc: Scott Wood <scottwood@freescale.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Wolfgang Denk <wd@denx.de>
Cc: Detlev Zundel <dzu@denx.de>
[scottwood@freescale.com: use chip instead of redundant priv_nand]
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent dc7cd8e5
......@@ -2224,7 +2224,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
/*
* heck if we have a bad block, we do not erase bad blocks !
*/
if (nand_block_checkbad(mtd, ((loff_t) page) <<
if (!instr->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);
......
......@@ -57,12 +57,6 @@ typedef struct mtd_info mtd_info_t;
#define cpu_to_je16(x) (x)
#define cpu_to_je32(x) (x)
/*****************************************************************************/
static int nand_block_bad_scrub(struct mtd_info *mtd, loff_t ofs, int getchip)
{
return 0;
}
/**
* nand_erase_opts: - erase NAND flash with support for various options
* (jffs2 formating)
......@@ -82,7 +76,6 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
int bbtest = 1;
int result;
int percent_complete = -1;
int (*nand_block_bad_old)(struct mtd_info *, loff_t, int) = NULL;
const char *mtd_device = meminfo->name;
struct mtd_oob_ops oob_opts;
struct nand_chip *chip = meminfo->priv;
......@@ -110,17 +103,15 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
* and disable bad block table while erasing.
*/
if (opts->scrub) {
struct nand_chip *priv_nand = meminfo->priv;
nand_block_bad_old = priv_nand->block_bad;
priv_nand->block_bad = nand_block_bad_scrub;
/* we don't need the bad block table anymore...
erase.scrub = opts->scrub;
/*
* We don't need the bad block table anymore...
* after scrub, there are no bad blocks left!
*/
if (priv_nand->bbt) {
kfree(priv_nand->bbt);
if (chip->bbt) {
kfree(chip->bbt);
}
priv_nand->bbt = NULL;
chip->bbt = NULL;
}
for (erased_length = 0;
......@@ -204,12 +195,8 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
if (!opts->quiet)
printf("\n");
if (nand_block_bad_old) {
struct nand_chip *priv_nand = meminfo->priv;
priv_nand->block_bad = nand_block_bad_old;
priv_nand->scan_bbt(meminfo);
}
if (opts->scrub)
chip->scan_bbt(meminfo);
return 0;
}
......
......@@ -55,6 +55,7 @@ struct erase_info {
u_long priv;
u_char state;
struct erase_info *next;
int scrub;
};
struct mtd_erase_region_info {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment