> OK,guys,I can discribe this question in the other way. > When I download the program image to the nand flash in the uboot. > At firist, I need to erase the nand flash by running the command of "nand > erase" or "nand scrub" in the cmdline. But sometimes this step will be > failed because one block of this flash is bad, and this command will > return "Failed erase".
Scrub wont, but it's stupid to use. Nand erase should mark the block bad into BBT. Anyway, what version of uboot do you use? > > Guys what would you do when you got this problem? Do I need to mrak this > block as bad block and add it to the bad block table with software? how > to do this ? Thank you ! > > At 2011-11-25 16:51:17,"Marek Vasut" <marek.va...@gmail.com> wrote: > >> Hi, guys I got a problem. I move a part of source code of > >> linux/driver/mtd/nand to the u-boot. But I found that the u-boot can not > >> mark the phsical bad block . when I run nand_erase() or nand_scrub(), it > >> return error num as below: linux/driver/mtd/nand/nand_base.c > >> > >> 2589 chip->erase_cmd(mtd, page & chip->pagemask); > >> 2590 > >> > >> status = chip->waitfunc(mtd, chip); 2592 > >> /* > >> > >> 2593 * See if operation failed and additional status > >> > >> checks are 2594 * available > >> > >> 2595 */ > >> 2596 if ((status & NAND_STATUS_FAIL) && > >> > >> (chip->errstat)) 2597 status = > >> chip->errstat(mtd, chip, FL_ERASING, 2598 > >> status, page); 2600 /* See if block erase succeeded */ > >> > >> 2601 if (status & NAND_STATUS_FAIL) { > >> 2602 DEBUG(MTD_DEBUG_LEVEL0, "%s: Failed > >> erase, > >> > >> " 2603 "page 0x%08x\n", > >> __func__, page); 2604 instr->state = > >> MTD_ERASE_FAILED; > >> > >> 2605 instr->fail_addr = > >> 2606 ((loff_t)page << > >> > >> chip->page_shift); 2607 goto erase_exit; > >> > >> 2608 } > >> > >> you can find that if block erase is failed(status==-1), it only > >> > >> mark the instr(we will not use the instr later), and go to the > >> erase_exit. So there is no code to mark the oob of the phisical bad > >> block, neither add it to the bad block table. so ,I add the code of > >> writing oob of the phisical bad block when it is erased failed, such as > >> below: > >> chip->erase_cmd(mtd, page & chip->pagemask);2589 > >> > >> - Ignored: > >> 2590 status = chip->waitfunc(mtd, chip); > >> 2592 /* > >> 2593 * See if operation failed and additional status > >> > >> checks are 2594 * available > >> > >> 2595 */ > >> 2596 if ((status & NAND_STATUS_FAIL) && > >> > >> (chip->errstat)) 2597 status = > >> chip->errstat(mtd, chip, FL_ERASING, 2598 > >> status, page); 2600 /* See if block erase succeeded */ > >> > >> 2601 if (status & NAND_STATUS_FAIL) { > >> 2602 DEBUG(MTD_DEBUG_LEVEL0, "%s: Failed > >> erase, > >> > >> " 2603 "page 0x%08x\n", > >> __func__, page); 2604 instr->state = > >> MTD_ERASE_FAILED; > >> > >> 2605 instr->fail_addr = > >> 2606 ((loff_t)page << > >> > >> chip->page_shift); nand_write_oob(addr); > >> > >> 2607 goto erase_exit; > >> 2608 } > >> > >> Guys, what do you think of it , and what would you to if you got > >> > >> this problem. > > > >Can you please fix your mailer and send this stuff again? It's really hard > >to decode what you're asking please. > > > >M _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot