changeset 3383:060772fa9bb3

nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
author Ross Younger <wry@ecoscentric.com>
date Sat, 14 Jun 2014 19:11:12 +1200
parents 61b1701f733f
children 1229083b0af1
files packages/io/nand/current/ChangeLog packages/io/nand/current/tests/nand_rwbenchmark.c
diffstat 2 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/packages/io/nand/current/ChangeLog
+++ b/packages/io/nand/current/ChangeLog
@@ -2,6 +2,10 @@ 2014-08-11  Ross Younger  <wry@ecoscentr
 
 	* nand.c nand_bbt.c nand_synth.c: Make build with recent gcc
 
+2014-06-14  Ross Younger  <wry@ecoscentric.com>
+    * tests/nand_rwbenchmark.c: Fix infinite loop when all
+	blocks are marked bad.
+
 2013-09-06  Jonathan Larmour  <jifl@eCosCentric.com>
 
 	* src/nand_bbt.c (LOCK_PAGEBUF, UNLOCK_PAGEBUF, bbti_incorporate_one,
--- a/packages/io/nand/current/tests/nand_rwbenchmark.c
+++ b/packages/io/nand/current/tests/nand_rwbenchmark.c
@@ -337,7 +337,10 @@ cyg_nand_block_addr find_spare_block(cyg
     int i,rv;
     cyg_nand_block_addr b;
 
-    for (b=CYG_NAND_PARTITION_NBLOCKS(part)-1; b>=0; b--) {
+    for (b=CYG_NAND_PARTITION_NBLOCKS(part)-1; b>=1; b--) {
+		/* Testing for b>=1 means we don't check block 0 for
+		 * availability, but if we get there then realistically
+		 * the device is worn out anyway. So fail the test. */
         cyg_nand_page_addr pg = CYG_NAND_BLOCK2PAGEADDR(part->dev, b);
         rv = cyg_nandp_read_page(part, pg, 0, oob, oobz);
         if (rv != 0) continue; // bad block?
@@ -352,7 +355,7 @@ next:
         ;
     }
 
-    CYG_TEST_FAIL_EXIT("can't find an untagged block");
+    CYG_TEST_FAIL_EXIT("can't find an untagged block - device worn out?");
 }
 
 CYG_BYTE databuf[CYGNUM_NAND_PAGEBUFFER], testbuf[CYGNUM_NAND_PAGEBUFFER];