Author: wmb Date: 2009-08-21 11:26:26 +0200 (Fri, 21 Aug 2009) New Revision: 1314
Modified: dev/ide/atapi.fth dev/ide/build/node.hex dev/ide/generic.fth dev/ide/idedisk.fth Log: IDE driver - don't hang under various drive fault conditions.
Modified: dev/ide/atapi.fth =================================================================== --- dev/ide/atapi.fth 2009-08-21 09:25:46 UTC (rev 1313) +++ dev/ide/atapi.fth 2009-08-21 09:26:26 UTC (rev 1314) @@ -13,16 +13,16 @@ loop ;
-: atapi-get-drive-parms ( -- ) +: atapi-get-drive-parms ( -- found? ) h# a1 r-csr! \ send identify command
waitonbusy \ The busy bit can be set even if there's no slave drive
- r-csr@ dup 0= swap h# ff = or if exit then + r-csr@ dup 0= swap h# ff = or if false exit then
true atapi-drive?!
- scratchbuf d# 512 pio-rblock drop + scratchbuf d# 512 pio-rblock if false exit then
scratchbuf 1+ c@ h# 1f and dup drive-type! ( type ) 5 = if d# 2048 else d# 512 then /block! @@ -35,6 +35,7 @@ \ 2Vi, which do not have the drive-type in the right byte. 5 drive-type! [then] + true ;
: waitfordrq ( -- timeout? )
Modified: dev/ide/build/node.hex =================================================================== --- dev/ide/build/node.hex 2009-08-21 09:25:46 UTC (rev 1313) +++ dev/ide/build/node.hex 2009-08-21 09:26:26 UTC (rev 1314) @@ -1,4 +1,4 @@ -" "(f1 03 0e 30 00 00 03 48 12 04 64 69 73 6b 02 01 12 05 62 6c 6f 63 6b 01 1a a5 c0 b6 06 2f 62 6c 6f 63 6b 08 00 b8 a5 c0 b6 09 64 65 62 6c 6f 63 6b 65 72 08 01 b8 b6 0e 69 6e 69 74 2d 64 65 62 6c 6f 63 6b 65 72 08 02 b7 12 00 12 09 64 65 62 )" $, +" "(f1 03 10 19 00 00 03 50 12 04 64 69 73 6b 02 01 12 05 62 6c 6f 63 6b 01 1a a5 c0 b6 06 2f 62 6c 6f 63 6b 08 00 b8 a5 c0 b6 09 64 65 62 6c 6f 63 6b 65 72 08 01 b8 b6 0e 69 6e 69 74 2d 64 65 62 6c 6f 63 6b 65 72 08 02 b7 12 00 12 09 64 65 62 )" $, " "(6c 6f 63 6b 65 72 02 0f c3 08 01 08 01 14 00 07 a4 13 00 25 b2 12 1c 43 61 6e 27 74 20 6f 70 65 6e 20 64 65 62 6c 6f 63 6b 65 72 20 70 61 63 6b 61 67 65 90 92 a5 b2 c2 a5 c0 b6 0a 6f 66 66 73 65 74 2d 6c 6f 77 08 03 b8 a5 c0 b6 0b 6f 66 66 )" $, " "(73 65 74 2d 68 69 67 68 08 04 b8 a5 c0 b6 0d 6c 61 62 65 6c 2d 70 61 63 6b 61 67 65 08 05 b8 b6 12 69 6e 69 74 2d 6c 61 62 65 6c 2d 70 61 63 6b 61 67 65 08 06 b7 a5 c3 08 04 a5 c3 08 03 02 02 12 0a 64 69 73 6b 2d 6c 61 62 65 6c 02 0f c3 08 )" $, " "(05 08 05 14 00 1b a5 a5 12 06 6f 66 66 73 65 74 08 05 02 0e c3 08 04 c3 08 03 a4 13 00 26 b2 12 1d 43 61 6e 27 74 20 6f 70 65 6e 20 64 69 73 6b 20 6c 61 62 65 6c 20 70 61 63 6b 61 67 65 90 92 a5 b2 c2 ca 09 64 6d 61 2d 61 6c 6c 6f 63 08 07 )" $, @@ -6,6 +6,6 @@ " "(c3 08 00 c2 ca 07 23 62 6c 6f 63 6b 73 08 0a b7 12 07 23 62 6c 6f 63 6b 73 02 09 c2 ca 0c 6d 61 78 2d 74 72 61 6e 73 66 65 72 08 0b b7 12 0c 6d 61 78 2d 74 72 61 6e 73 66 65 72 02 09 c2 ca 0b 72 65 61 64 2d 62 6c 6f 63 6b 73 08 0c b7 12 0b )" $, " "(72 65 61 64 2d 62 6c 6f 63 6b 73 02 09 c2 ca 0c 77 72 69 74 65 2d 62 6c 6f 63 6b 73 08 0d b7 12 0c 77 72 69 74 65 2d 62 6c 6f 63 6b 73 02 09 c2 a5 c0 ca 08 23 77 72 69 74 74 65 6e 08 0e b8 ca 12 77 72 69 74 65 2d 62 6c 6f 63 6b 73 2d 73 74 )" $, " "(61 72 74 08 0f b7 12 0c 77 72 69 74 65 2d 62 6c 6f 63 6b 73 02 09 c3 08 0e c2 ca 13 77 72 69 74 65 2d 62 6c 6f 63 6b 73 2d 66 69 6e 69 73 68 08 10 b7 08 0e c2 ca 04 6f 70 65 6e 08 11 b7 02 0d 47 a8 3b 14 00 06 52 a5 33 b2 12 0b 73 65 74 2d )" $, -" "(61 64 64 72 65 73 73 02 09 12 0b 69 64 65 2d 69 6e 71 75 69 72 79 02 09 14 00 07 46 13 00 06 b2 a5 33 b2 08 09 50 34 14 00 05 a5 33 b2 c3 08 00 08 02 34 14 00 05 a5 33 b2 08 06 34 14 00 09 08 01 02 06 a5 33 b2 a4 c2 ca 05 63 6c 6f 73 65 08 )" $, -" "(12 b7 08 05 02 06 08 01 02 06 c2 ca 04 73 65 65 6b 08 13 b7 08 03 08 04 d8 12 04 73 65 65 6b 08 01 02 0e c2 ca 04 72 65 61 64 08 14 b7 12 04 72 65 61 64 08 01 02 0e c2 ca 05 77 72 69 74 65 08 15 b7 12 05 77 72 69 74 65 08 01 02 0e c2 ca 04 )" $, -" "(6c 6f 61 64 08 16 b7 12 04 6c 6f 61 64 08 05 02 0e c2 ca 04 73 69 7a 65 08 17 b7 12 04 73 69 7a 65 08 05 02 0e c2 00 00 )" $, +" "(61 64 64 72 65 73 73 02 09 12 0b 69 64 65 2d 69 6e 71 75 69 72 79 02 09 14 00 07 46 13 00 06 b2 a5 33 b2 08 09 50 34 14 00 05 a5 33 b2 c3 08 00 08 0a 34 14 00 05 a5 33 b2 08 02 34 14 00 05 a5 33 b2 08 06 34 14 00 09 08 01 02 06 a5 33 b2 a4 )" $, +" "(c2 ca 05 63 6c 6f 73 65 08 12 b7 08 05 02 06 08 01 02 06 c2 ca 04 73 65 65 6b 08 13 b7 08 03 08 04 d8 12 04 73 65 65 6b 08 01 02 0e c2 ca 04 72 65 61 64 08 14 b7 12 04 72 65 61 64 08 01 02 0e c2 ca 05 77 72 69 74 65 08 15 b7 12 05 77 72 69 )" $, +" "(74 65 08 01 02 0e c2 ca 04 6c 6f 61 64 08 16 b7 12 04 6c 6f 61 64 08 05 02 0e c2 ca 04 73 69 7a 65 08 17 b7 12 04 73 69 7a 65 08 05 02 0e c2 00 )" $,
Modified: dev/ide/generic.fth =================================================================== --- dev/ide/generic.fth 2009-08-21 09:25:46 UTC (rev 1313) +++ dev/ide/generic.fth 2009-08-21 09:26:26 UTC (rev 1314) @@ -78,23 +78,19 @@ : r-dor! ( val -- ) dor-magic or dor rb! ;
\ Spin until BSY == 0, RDY == 1, indicating registers can be touched -: wait-while-busy ( -- ) - get-msecs ( start-time ) +: wait-while-busy ( -- timeout? ) + get-msecs d# 5000 + ( end-time ) begin - r-csr@ ( start-time csr ) - dup 0<> ( start-time csr flag ) - over h# ff <> and ( start-time csr flag ) - swap h# c0 and h# 40 <> and ( start-time csr=0|ff|4x? ) - while ( start-time ) - get-msecs over - ( start-time delta ) - d# 5000 < ( start-time timeout? ) - while ( start-time ) - repeat - then ( start-time ) - drop ( ) + r-csr@ dup 0= ( end-time csr flag ) + over h# ff = or ( end-time csr flag ) + swap h# c0 and h# 40 = or ( end-time csr=0|ff|4x? ) \ !BSY (80), DRDY (40) + if drop false exit then ( end-time ) + dup get-msecs - ( end-time remaining-time ) + 0<= until ( end-time ) + drop true ( true ) ;
-: reg! ( data reg# -- ) wait-while-busy chip-base + rb! ; +: reg! ( data reg# -- ) wait-while-busy drop chip-base + rb! ;
: r-data! ( data -- ) chip-base w! ; : r-features! ( data -- ) 1 reg! ; @@ -131,15 +127,43 @@ \ 91 constant set-drive-parms-cmd \ ec constant identify-cmd
-: wait-until-drq ( -- ) - begin - r-csr@ - dup 1 and if ." IDE data error: " r-error@ . cr abort then - h# c8 and h# 48 = - until +: wait-until-drq ( -- error? ) + get-msecs d# 5000 + ( end-time ) + begin ( end-time ) + r-csr@ ( end-time csr ) + + dup h# c8 and h# 48 = if ( end-time csr ) \ !BSY (80), DRDY (40), DRQ (8) + 2drop false exit + then ( end-time csr ) + + h# 21 and if ( end-time ) \ DF (20; fault), ERR (1) + ." IDE data error: " r-error@ . cr + drop true exit + then ( end-time ) + dup get-msecs - ( end-time remaining-time ) + until ( end-time ) + drop true ( true ) ; -: wait-until-ready ( -- ) begin r-csr@ h# 50 = until ;
+: wait-until-ready ( -- error? ) + get-msecs d# 10000 + ( end-time ) + begin ( end-time ) + r-csr@ ( end-time csr ) + + dup h# 50 = if ( end-time csr ) \ DRDY (40), DSC (10; seek complete) + 2drop false exit + then ( end-time ) + + h# 21 and if ( end-time ) \ DF (20; fault), ERR (1) + ." IDE Drive Error" cr + drop true exit + then ( end-time ) + + dup get-msecs - ( end-time remaining-time ) + 0<= until ( end-time ) + drop true +; + : lblk>cyl-head-sect ( block# -- cyl# head# sect# ) /secs /mod ( sect# residue ) /heads /mod swap rot 1+ ( cyl# head# sect# ) @@ -149,7 +173,7 @@ defer pio-end-hack ' noop to pio-end-hack defer pio-start-hack ' noop to pio-start-hack : pio-rblock ( adr len -- error? ) - wait-until-drq + wait-until-drq if 2drop true exit then pio-start-hack chip-base io-blk-w@ false pio-end-hack @@ -172,28 +196,24 @@ ' pio-rblocks to rblocks
: pio-wblock ( adr len -- error? ) - wait-until-drq + wait-until-drq if 2drop true exit then pio-start-hack - chip-base io-blk-w! false + chip-base io-blk-w! pio-end-hack + false ;
-: pio-wblocks ( addr #blks -- actual# | error ) - over >r ( addr #blks ) ( R: addr ) - h# 30 r-csr! +: pio-wblocks ( addr #blks -- actual# | 0 ) + h# 30 r-csr! ( addr #blks ) + + tuck 0 ?do ( #blks addr ) + dup /block@ pio-wblock if ( #blks addr ) + 2drop i unloop exit + then ( #blks addr )
- begin - wait-until-drq - swap ( #blks addr ) ( R: addr ) - - pio-start-hack - dup /block@ chip-base io-blk-w! - pio-end-hack - - /block@ + ( #blks addr' ) ( R: addr ) - swap 1- ?dup 0= - until - r> - /block@ / + /block@ + ( #blks addr' ) + loop ( #blks addr ) + drop ( actual# ) ; defer wblocks ' pio-wblocks to wblocks @@ -217,7 +237,7 @@ then r> r> if rblocks else wblocks then ( actual# | error )
- dup 0= if + dup 0<= if ." Failed to transfer any blocks" cr \ XXX trouble then ( actual# ) @@ -235,20 +255,20 @@
: le-w@ ( adr -- w ) dup c@ swap ca1+ c@ bwjoin ;
-: ide-get-drive-parms ( -- ) +: ide-get-drive-parms ( -- found? ) d# 512 /block!
false atapi-drive?! 0 drive-type!
- wait-while-busy + wait-while-busy if false exit then 2 r-dor! \ Turn off IRQ14
0 drive r-head!
h# ec r-csr! \ Identify command
- scratchbuf d# 512 pio-rblock drop + scratchbuf d# 512 pio-rblock if false exit then
scratchbuf 1 wa+ le-w@ /cyls! scratchbuf 3 wa+ le-w@ /heads! @@ -260,15 +280,17 @@ scratchbuf d# 61 wa+ le-w@ wljoin /lba! then + + true ;
-: get-drive-parms ( -- ) +: get-drive-parms ( -- found? ) \ Reset this string (primary or secondary) on the first time through, \ in order to clear any errors that might be hanging around from uses \ of the drive by previous software. drive 0= if 4 r-dor! 0 r-dor! then
- wait-while-busy + wait-while-busy if false exit then 0 drive r-head! \ select drive 0 r-dor! \ flush ISA bus 6 reg@ h# a0 drive 4 lshift or = if @@ -277,13 +299,21 @@ \ Unfortunately, the vl-reset on the Shark does not seem to fully \ reset the ATAPI drive, therefore, we are doing it here. atapi-reset \ atapi soft reset - atapi-get-drive-parms + atapi-get-drive-parms ( found? ) else r-csr@ 0<> r-csr@ h# ff <> and if - drive 0= if wait-until-ready then \ wait until spin-up - r-csr@ h# f0 and h# 50 = if ide-get-drive-parms then + drive 0= if + wait-until-ready if false exit then + then \ wait until spin-up + r-csr@ h# f0 and h# 50 = if + ide-get-drive-parms ( found? ) + else + false ( found? ) + then then then + else + false ( found? ) then ;
@@ -361,7 +391,7 @@
first-open? if max#drives 0 do - 0 i set-address get-drive-parms set-drive-cfg loop + 0 i set-address get-drive-parms if set-drive-cfg then loop false to first-open? then
Modified: dev/ide/idedisk.fth =================================================================== --- dev/ide/idedisk.fth 2009-08-21 09:25:46 UTC (rev 1313) +++ dev/ide/idedisk.fth 2009-08-21 09:26:26 UTC (rev 1314) @@ -81,6 +81,8 @@
block-size ?dup 0= if false exit then to /block
+ #blocks 0= if false exit then + init-deblocker 0= if false exit then
init-label-package 0= if