NAND: Really ignore bad blocks when scrubbing

Signed-off-by: Marek 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: Scott Wood <scottwood@freescale.com>
This commit is contained in:
Marek Vasut 2011-09-12 06:04:06 +02:00 committed by Scott Wood
parent dc7cd8e59b
commit 6d41419f0b
3 changed files with 10 additions and 22 deletions

View File

@ -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 ! * 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)) { chip->page_shift, 0, allowbbt)) {
printk(KERN_WARNING "nand_erase: attempt to erase a " printk(KERN_WARNING "nand_erase: attempt to erase a "
"bad block at page 0x%08x\n", page); "bad block at page 0x%08x\n", page);

View File

@ -57,12 +57,6 @@ typedef struct mtd_info mtd_info_t;
#define cpu_to_je16(x) (x) #define cpu_to_je16(x) (x)
#define cpu_to_je32(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 * nand_erase_opts: - erase NAND flash with support for various options
* (jffs2 formating) * (jffs2 formating)
@ -82,7 +76,6 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
int bbtest = 1; int bbtest = 1;
int result; int result;
int percent_complete = -1; int percent_complete = -1;
int (*nand_block_bad_old)(struct mtd_info *, loff_t, int) = NULL;
const char *mtd_device = meminfo->name; const char *mtd_device = meminfo->name;
struct mtd_oob_ops oob_opts; struct mtd_oob_ops oob_opts;
struct nand_chip *chip = meminfo->priv; 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. * and disable bad block table while erasing.
*/ */
if (opts->scrub) { if (opts->scrub) {
struct nand_chip *priv_nand = meminfo->priv; erase.scrub = opts->scrub;
/*
nand_block_bad_old = priv_nand->block_bad; * We don't need the bad block table anymore...
priv_nand->block_bad = nand_block_bad_scrub;
/* we don't need the bad block table anymore...
* after scrub, there are no bad blocks left! * after scrub, there are no bad blocks left!
*/ */
if (priv_nand->bbt) { if (chip->bbt) {
kfree(priv_nand->bbt); kfree(chip->bbt);
} }
priv_nand->bbt = NULL; chip->bbt = NULL;
} }
for (erased_length = 0; 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) if (!opts->quiet)
printf("\n"); printf("\n");
if (nand_block_bad_old) { if (opts->scrub)
struct nand_chip *priv_nand = meminfo->priv; chip->scan_bbt(meminfo);
priv_nand->block_bad = nand_block_bad_old;
priv_nand->scan_bbt(meminfo);
}
return 0; return 0;
} }

View File

@ -55,6 +55,7 @@ struct erase_info {
u_long priv; u_long priv;
u_char state; u_char state;
struct erase_info *next; struct erase_info *next;
int scrub;
}; };
struct mtd_erase_region_info { struct mtd_erase_region_info {