Author: wmb Date: 2008-01-06 00:37:48 +0100 (Sun, 06 Jan 2008) New Revision: 769
Modified: dev/olpc/cafenand/badblock.fth dev/olpc/cafenand/redboot.fth Log: OLPC trac 5870 - More NAND error handling improvements.
Modified: dev/olpc/cafenand/badblock.fth =================================================================== --- dev/olpc/cafenand/badblock.fth 2008-01-05 22:43:38 UTC (rev 768) +++ dev/olpc/cafenand/badblock.fth 2008-01-05 23:37:48 UTC (rev 769) @@ -27,6 +27,7 @@
\ Returns true if the block containing page# is bad : block-bad? ( page# -- flag ) + bbt 0= if drop false exit then >bbt ( adr mask ) tuck swap c@ and ( mask masked-byte ) <> @@ -184,6 +185,9 @@ bbt0 if bbt0 read-bbt-pages 0= if exit then then bbt1 if bbt1 read-bbt-pages 0= if exit then then
+ bbt0 bbt1 or if + ." Both bad block tables are unreadable" cr + then release-bbt ;
@@ -234,7 +238,7 @@ \ Get the existing bad block table, or make a new one if necessary : get-bbt ( -- ) get-existing-bbt - bbt 0= if + bbt0 bbt1 or 0= if ." No bad block table; making one" cr make-bbt then @@ -306,7 +310,7 @@ : (wipe) ( 'show-bad 'show-erased 'show-bbt -- ) partition# 0= if get-existing-bbt - bbt 0= if + bbt0 bbt1 or 0= if \ If there is no existing bad block table, make one from factory info make-bbt then ( 'show-bad 'show-erased 'show-bbt )
Modified: dev/olpc/cafenand/redboot.fth =================================================================== --- dev/olpc/cafenand/redboot.fth 2008-01-05 22:43:38 UTC (rev 768) +++ dev/olpc/cafenand/redboot.fth 2008-01-05 23:37:48 UTC (rev 769) @@ -17,23 +17,12 @@ d# 256 constant /partition-entry d# 8 constant max#partitions
-: partition-map-page# ( -- page# ) -[ifdef] notdef - bbt1 if - bbt1 bbt0 if bbt0 min then ( bbtn ) - else ( ) - bbt0 dup 0= abort" No Bad Block Table" ( bbt0 ) - then ( last-bbt-page# ) - begin pages/eblock - dup while ( part-page# ) - dup block-bad? 0= if exit then ( part-page# ) - repeat -[else] +: partition-map-page# ( -- true | page# false ) h# 10 pages/eblock * 0 do - i block-bad? 0= if i unloop exit then + i block-bad? 0= if i false unloop exit then pages/eblock +loop -[then] - - true abort" No place for partition map" + ." No place for partition map" + true ;
: (#partitions) ( adr -- n ) @@ -55,11 +44,11 @@
0 instance value #partitions : read-partmap ( -- ) - part-buf partition-map-page# + part-buf partition-map-page# if exit then partition-start >r 0 to partition-start read-page r> to partition-start - if true exit then + if exit then part-buf (#partitions) to #partitions ;