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.

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to