# HG changeset patch # User Ross Younger # Date 1403347964 -43200 # Node ID 1229083b0af10c1dad2d7d5619ea92b1ea37ebfc # Parent 060772fa9bb37a4df99f4a6e86195df8cd9318df cdl/nand.cdl src/nand.c utils/erasenand.c: Create CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD. diff --git a/packages/io/nand/current/ChangeLog b/packages/io/nand/current/ChangeLog --- a/packages/io/nand/current/ChangeLog +++ b/packages/io/nand/current/ChangeLog @@ -2,6 +2,10 @@ 2014-08-11 Ross Younger + * cdl/nand.cdl src/nand.c utils/erasenand.c: Create + CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD. + 2014-06-14 Ross Younger * tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad. diff --git a/packages/io/nand/current/cdl/nand.cdl b/packages/io/nand/current/cdl/nand.cdl --- a/packages/io/nand/current/cdl/nand.cdl +++ b/packages/io/nand/current/cdl/nand.cdl @@ -182,7 +182,7 @@ cdl_package CYGPKG_IO_NAND { writes to NAND devices." } - cdl_option CYGSEM_IO_NAND_USE_BBT { + cdl_component CYGSEM_IO_NAND_USE_BBT { display "NAND layer uses bad-block tables" flavor bool default_value 1 @@ -191,6 +191,15 @@ cdl_package CYGPKG_IO_NAND { a Bad Block Table to keep track of blocks marked bad at the factory and any bad blocks which may develop during the life of the device. This is strongly recommended." + + cdl_option CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD { + flavor bool + default_value 0 + display "Allow worn-bad blocks to be erased" + description "Normally, if a block is marked as worn-bad + in the Bad Block Table, it cannot be read, written + or erased. This option allows such blocks to be erased." + } } cdl_option CYGNUM_NAND_PAGEBUFFER { diff --git a/packages/io/nand/current/src/nand.c b/packages/io/nand/current/src/nand.c --- a/packages/io/nand/current/src/nand.c +++ b/packages/io/nand/current/src/nand.c @@ -667,7 +667,7 @@ int cyg_nandp_erase_block(cyg_nand_parti #else PARTITION_CHECK(prt); cyg_nand_device *dev = prt->dev; - int rv; + int rv, state; DEV_INIT_CHECK(dev); cyg_nand_block_addr blk = BLOCK_P_TO_D(prt, pblk); @@ -677,7 +677,12 @@ int cyg_nandp_erase_block(cyg_nand_parti EG(valid_block_addr(prt, blk)); #ifdef CYGSEM_IO_NAND_USE_BBT - if (cyg_nand_bbti_query(dev, blk) != CYG_NAND_BBT_OK) { + state = cyg_nand_bbti_query(dev, blk); + if ( (state != CYG_NAND_BBT_OK) +#ifdef CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD + && (state != CYG_NAND_BBT_WORNBAD) +#endif + ) { NAND_CHATTER(1,dev,"Asked to erase bad block %u\n", blk); EG(-EINVAL); } diff --git a/packages/io/nand/current/utils/erasenand.c b/packages/io/nand/current/utils/erasenand.c --- a/packages/io/nand/current/utils/erasenand.c +++ b/packages/io/nand/current/utils/erasenand.c @@ -80,6 +80,15 @@ void cyg_user_start(void) int progmod = (prt->last - prt->first + 1) / 73 + 1; +#if 0 // Used for testing during development + { + int stx = cyg_nandp_bbt_markbad(prt, 42); + if (stx<0) { + diag_printf("mark bad 42 error %d\n", stx); + } + } +#endif + for (blk=0; blk < CYG_NAND_PARTITION_NBLOCKS(prt); blk++) { #ifdef CYGSEM_IO_NAND_USE_BBT int st = cyg_nandp_bbt_query(prt, blk); @@ -92,12 +101,17 @@ void cyg_user_start(void) const char *msg = 0; switch(st) { case CYG_NAND_BBT_OK: +#ifdef CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD + case CYG_NAND_BBT_WORNBAD: +#endif rv = cyg_nandp_erase_block(prt, blk); if (rv != 0) diag_printf("Block %d: error %d\n", blk, -rv); break; +#ifndef CYGSEM_IO_NAND_ALLOW_ERASE_WORNBAD case CYG_NAND_BBT_WORNBAD: msg="worn bad"; break; +#endif case CYG_NAND_BBT_FACTORY_BAD: msg="factory bad"; break;