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:
parent
dc7cd8e59b
commit
6d41419f0b
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user