vscsi: Sanitize interface between scsi-disk.fs and vio-vscsi.fs
We now exclusively use the proper SCSI command interface to vio-vscsi.fs and move all of the higher level command building from vio-vscsi.fs to scsi-disk.fs with the exception of the ones used during probe. [ Even those could be moved out by in large part by opening/closing the device and letting it print its own inquiry data but that's less urgent. In fact we could have a generic "Probe SCSI bus" helper ] Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
d4b8196c1e
commit
942bca954f
|
@ -25,31 +25,230 @@ false VALUE scsi-disk-debug?
|
||||||
\ Get SCSI bits
|
\ Get SCSI bits
|
||||||
scsi-open
|
scsi-open
|
||||||
|
|
||||||
\ Required interface for deblocker
|
\ Send SCSI commands to controller
|
||||||
|
|
||||||
|
: execute-scsi-command ( buf-addr buf-len dir cmd-addr cmd-len -- ... )
|
||||||
|
( ... [ sense-buf sense-len ] stat )
|
||||||
|
" execute-scsi-command" $call-parent
|
||||||
|
;
|
||||||
|
|
||||||
|
: retry-scsi-command ( buf-addr buf-len dir cmd-addr cmd-len #retries -- ... )
|
||||||
|
( ... 0 | [ sense-buf sense-len ] stat )
|
||||||
|
" retry-scsi-command" $call-parent
|
||||||
|
;
|
||||||
|
|
||||||
|
\ ---------------------------------\
|
||||||
|
\ Common SCSI Commands and helpers \
|
||||||
|
\ ---------------------------------\
|
||||||
|
|
||||||
0 INSTANCE VALUE block-size
|
0 INSTANCE VALUE block-size
|
||||||
0 INSTANCE VALUE max-block-num
|
|
||||||
0 INSTANCE VALUE max-transfer
|
0 INSTANCE VALUE max-transfer
|
||||||
|
0 INSTANCE VALUE max-block-num
|
||||||
0 INSTANCE VALUE is_cdrom
|
0 INSTANCE VALUE is_cdrom
|
||||||
INSTANCE VARIABLE deblocker
|
INSTANCE VARIABLE deblocker
|
||||||
|
|
||||||
|
\ This scratch area is made global for now as we only
|
||||||
|
\ use it for small temporary commands such as inquiry
|
||||||
|
\ read-capacity or media events
|
||||||
|
CREATE scratch 100 allot
|
||||||
|
CREATE cdb 10 allot
|
||||||
|
|
||||||
|
: dump-scsi-error ( sense-buf sense-len stat name namelen -- )
|
||||||
|
." SCSI-DISK: " my-self instance>path type ." ," type ." failed" cr
|
||||||
|
." SCSI-DISK: Status " dup . .status-text
|
||||||
|
0<> IF
|
||||||
|
." Sense " scsi-get-sense-data dup . .sense-text
|
||||||
|
." ASC " . ." ASCQ " . cr
|
||||||
|
ELSE drop THEN
|
||||||
|
;
|
||||||
|
|
||||||
: read-blocks ( addr block# #blocks -- #read )
|
: read-blocks ( addr block# #blocks -- #read )
|
||||||
block-size " dev-read-blocks" $call-parent
|
scsi-disk-debug? IF
|
||||||
not IF
|
." SCSI-DISK: read-blocks " .s cr
|
||||||
." SCSI-DISK: Read blocks failed !" cr -1 throw
|
THEN
|
||||||
|
dup block-size * ( addr block# #blocks len )
|
||||||
|
>r rot r> ( block# #blocks addr len )
|
||||||
|
2swap ( addr len block# #blocks )
|
||||||
|
dup >r
|
||||||
|
cdb scsi-build-read-10 ( addr len )
|
||||||
|
r> -rot ( #blocks addr len )
|
||||||
|
scsi-dir-read cdb scsi-param-size 10
|
||||||
|
retry-scsi-command
|
||||||
|
( #blocks [ sense-buf sense-len ] stat )
|
||||||
|
dup 0<> IF " read-blocks" dump-scsi-error -65 throw ELSE drop THEN
|
||||||
|
;
|
||||||
|
|
||||||
|
: inquiry ( -- buffer | NULL )
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." SCSI-DISK: inquiry " .s cr
|
||||||
|
THEN
|
||||||
|
\ WARNING: ATAPI devices with libata seem to ignore the MSB of
|
||||||
|
\ the allocation length... let's only ask for ff bytes
|
||||||
|
ff cdb scsi-build-inquiry
|
||||||
|
\ 16 retries for inquiry to flush out any UAs
|
||||||
|
scratch ff scsi-dir-read cdb scsi-param-size 10 retry-scsi-command
|
||||||
|
\ Success ?
|
||||||
|
0= IF scratch ELSE 2drop 0 THEN
|
||||||
|
;
|
||||||
|
|
||||||
|
: read-capacity ( -- blocksize #blocks )
|
||||||
|
\ Now issue the read-capacity command
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." SCSI-DISK: read-capacity " .s cr
|
||||||
|
THEN
|
||||||
|
\ Make sure that there are zeros in the buffer in case something goes wrong:
|
||||||
|
scratch 10 erase
|
||||||
|
cdb scsi-build-read-cap-10 scratch scsi-length-read-cap-10-data scsi-dir-read
|
||||||
|
cdb scsi-param-size 1 retry-scsi-command
|
||||||
|
\ Success ?
|
||||||
|
dup 0<> IF " read-capacity" dump-scsi-error 0 0 EXIT THEN
|
||||||
|
drop scratch scsi-get-capacity-10
|
||||||
|
;
|
||||||
|
|
||||||
|
100 CONSTANT test-unit-retries
|
||||||
|
|
||||||
|
\ SCSI test-unit-read
|
||||||
|
: test-unit-ready ( true | [ ascq asc sense-key false ] )
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." SCSI-DISK: test-unit-ready " .s cr
|
||||||
|
THEN
|
||||||
|
cdb scsi-build-test-unit-ready
|
||||||
|
0 0 0 cdb scsi-param-size test-unit-retries retry-scsi-command
|
||||||
|
\ stat == 0, return
|
||||||
|
0= IF true EXIT THEN
|
||||||
|
\ check sense len, no sense -> return HW error
|
||||||
|
0= IF drop 0 0 4 false EXIT THEN
|
||||||
|
\ get sense
|
||||||
|
scsi-get-sense-data false
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
: start-stop-unit ( state# -- true | false )
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." SCSI-DISK: start-stop-unit " .s cr
|
||||||
|
THEN
|
||||||
|
cdb scsi-build-start-stop-unit
|
||||||
|
0 0 0 cdb scsi-param-size 10 retry-scsi-command
|
||||||
|
\ Success ?
|
||||||
|
0= IF true ELSE 2drop false THEN
|
||||||
|
;
|
||||||
|
|
||||||
|
: compare-sense ( ascq asc key ascq2 asc2 key2 -- true | false )
|
||||||
|
3 pick = ( ascq asc key ascq2 asc2 keycmp )
|
||||||
|
swap 4 pick = ( ascq asc key ascq2 keycmp asccmp )
|
||||||
|
rot 5 pick = ( ascq asc key keycmp asccmp ascqcmp )
|
||||||
|
and and nip nip nip
|
||||||
|
;
|
||||||
|
|
||||||
|
\ -------------------------\
|
||||||
|
\ CDROM specific functions \
|
||||||
|
\ -------------------------\
|
||||||
|
|
||||||
|
0 CONSTANT CDROM-READY
|
||||||
|
1 CONSTANT CDROM-NOT-READY
|
||||||
|
2 CONSTANT CDROM-NO-DISK
|
||||||
|
3 CONSTANT CDROM-TRAY-OPEN
|
||||||
|
4 CONSTANT CDROM-INIT-REQUIRED
|
||||||
|
5 CONSTANT CDROM-TRAY-MAYBE-OPEN
|
||||||
|
|
||||||
|
: cdrom-try-close-tray ( -- )
|
||||||
|
scsi-const-load start-stop-unit drop
|
||||||
|
;
|
||||||
|
|
||||||
|
: cdrom-must-close-tray ( -- )
|
||||||
|
scsi-const-load start-stop-unit not IF
|
||||||
|
." Tray open !" cr -65 throw
|
||||||
THEN
|
THEN
|
||||||
;
|
;
|
||||||
|
|
||||||
|
: get-media-event ( -- true | false )
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." SCSI-DISK: get-media-event " .s cr
|
||||||
|
THEN
|
||||||
|
cdb scsi-build-get-media-event
|
||||||
|
scratch scsi-length-media-event scsi-dir-read cdb scsi-param-size 1 retry-scsi-command
|
||||||
|
\ Success ?
|
||||||
|
0= IF true ELSE 2drop false THEN
|
||||||
|
;
|
||||||
|
|
||||||
|
: cdrom-status ( -- status )
|
||||||
|
test-unit-ready
|
||||||
|
IF CDROM-READY EXIT THEN
|
||||||
|
|
||||||
|
scsi-disk-debug? IF
|
||||||
|
." TestUnitReady sense: " 3dup . . . cr
|
||||||
|
THEN
|
||||||
|
|
||||||
|
3dup 1 4 2 compare-sense IF
|
||||||
|
3drop CDROM-NOT-READY EXIT
|
||||||
|
THEN
|
||||||
|
|
||||||
|
get-media-event IF
|
||||||
|
scratch w@ 4 >= IF
|
||||||
|
scratch 2 + c@ 04 = IF
|
||||||
|
scratch 5 + c@
|
||||||
|
dup 02 and 0<> IF drop 3drop CDROM-READY EXIT THEN
|
||||||
|
dup 01 and 0<> IF drop 3drop CDROM-TRAY-OPEN EXIT THEN
|
||||||
|
drop 3drop CDROM-NO-DISK EXIT
|
||||||
|
THEN
|
||||||
|
THEN
|
||||||
|
THEN
|
||||||
|
|
||||||
|
3dup 2 4 2 compare-sense IF
|
||||||
|
3drop CDROM-INIT-REQUIRED EXIT
|
||||||
|
THEN
|
||||||
|
over 4 = over 2 = and IF
|
||||||
|
\ Format in progress... what do we do ? Just ignore
|
||||||
|
3drop CDROM-READY EXIT
|
||||||
|
THEN
|
||||||
|
over 3a = IF
|
||||||
|
3drop CDROM-NO-DISK EXIT
|
||||||
|
THEN
|
||||||
|
|
||||||
|
\ Other error...
|
||||||
|
3drop CDROM-TRAY-MAYBE-OPEN
|
||||||
|
;
|
||||||
|
|
||||||
|
: prep-cdrom ( -- ready? )
|
||||||
|
5 0 DO
|
||||||
|
cdrom-status CASE
|
||||||
|
CDROM-READY OF UNLOOP true EXIT ENDOF
|
||||||
|
CDROM-NO-DISK OF ." No medium !" cr false EXIT ENDOF
|
||||||
|
CDROM-TRAY-OPEN OF cdrom-must-close-tray ENDOF
|
||||||
|
CDROM-INIT-REQUIRED OF cdrom-try-close-tray ENDOF
|
||||||
|
CDROM-TRAY-MAYBE-OPEN OF cdrom-try-close-tray ENDOF
|
||||||
|
ENDCASE
|
||||||
|
d# 1000 ms
|
||||||
|
LOOP
|
||||||
|
." Drive not ready !" cr false
|
||||||
|
;
|
||||||
|
|
||||||
|
\ ------------------------\
|
||||||
|
\ Disk specific functions \
|
||||||
|
\ ------------------------\
|
||||||
|
|
||||||
|
: prep-disk ( -- ready? )
|
||||||
|
test-unit-ready not IF
|
||||||
|
." SCSI-DISK: Disk not ready ! "
|
||||||
|
." Sense " dup .sense-text ." [" . ." ]"
|
||||||
|
." ASC " . ." ASCQ " . cr
|
||||||
|
false EXIT THEN true
|
||||||
|
;
|
||||||
|
|
||||||
|
\ --------------------------\
|
||||||
|
\ Standard device interface \
|
||||||
|
\ --------------------------\
|
||||||
|
|
||||||
: open ( -- true | false )
|
: open ( -- true | false )
|
||||||
scsi-disk-debug? IF
|
scsi-disk-debug? IF
|
||||||
." SCSI-DISK: open [" .s ." ] unit is " my-unit . . ." [" .s ." ]" cr
|
." SCSI-DISK: open [" .s ." ] unit is " my-unit . . ." [" .s ." ]" cr
|
||||||
THEN
|
THEN
|
||||||
my-unit " set-address" $call-parent
|
my-unit " set-address" $call-parent
|
||||||
|
|
||||||
" inquiry" $call-parent dup 0= IF drop false EXIT THEN
|
inquiry dup 0= IF drop false EXIT THEN
|
||||||
scsi-disk-debug? IF
|
scsi-disk-debug? IF
|
||||||
." ---- inquiry: ----" cr
|
." ---- inquiry: ----" cr
|
||||||
dup 200 dump cr
|
dup 100 dump cr
|
||||||
." ------------------" cr
|
." ------------------" cr
|
||||||
THEN
|
THEN
|
||||||
|
|
||||||
|
@ -72,13 +271,13 @@ INSTANCE VARIABLE deblocker
|
||||||
THEN
|
THEN
|
||||||
THEN
|
THEN
|
||||||
|
|
||||||
is_cdrom IF " dev-prep-cdrom" ELSE " dev-prep-disk" THEN $call-parent
|
is_cdrom IF prep-cdrom ELSE prep-disk THEN
|
||||||
not IF false EXIT THEN
|
not IF false EXIT THEN
|
||||||
|
|
||||||
" max-transfer" $call-parent to max-transfer
|
" max-transfer" $call-parent to max-transfer
|
||||||
|
|
||||||
" dev-get-capacity" $call-parent to max-block-num to block-size
|
read-capacity to max-block-num to block-size
|
||||||
max-block-num 0= block-size 0= OR IF
|
max-block-num 0= block-size 0= OR IF
|
||||||
." SCSI-DISK: Failed to get disk capacity!" cr
|
." SCSI-DISK: Failed to get disk capacity!" cr
|
||||||
FALSE EXIT
|
FALSE EXIT
|
||||||
THEN
|
THEN
|
||||||
|
|
|
@ -350,8 +350,6 @@ CREATE srp 100 allot
|
||||||
\ A sense buffer is returned whenever the status is non-0 however
|
\ A sense buffer is returned whenever the status is non-0 however
|
||||||
\ if sense-len is 0 then no sense data is actually present
|
\ if sense-len is 0 then no sense data is actually present
|
||||||
\
|
\
|
||||||
true CONSTANT scsi-dir-read
|
|
||||||
false CONSTANT scsi-dir-write
|
|
||||||
|
|
||||||
: execute-scsi-command ( buf-addr buf-len dir cmd-addr cmd-len -- ... )
|
: execute-scsi-command ( buf-addr buf-len dir cmd-addr cmd-len -- ... )
|
||||||
( ... [ sense-buf sense-len ] stat )
|
( ... [ sense-buf sense-len ] stat )
|
||||||
|
@ -433,15 +431,20 @@ false CONSTANT scsi-dir-write
|
||||||
( ... 0 | [ sense-buf sense-len ] stat )
|
( ... 0 | [ sense-buf sense-len ] stat )
|
||||||
>r \ stash #retries
|
>r \ stash #retries
|
||||||
to rcmd-cmd-len to rcmd-cmd-addr to rcmd-dir to rcmd-buf-len to rcmd-buf-addr
|
to rcmd-cmd-len to rcmd-cmd-addr to rcmd-dir to rcmd-buf-len to rcmd-buf-addr
|
||||||
0 0 0 \ dummy status & semse
|
0 \ dummy status & sense
|
||||||
r> \ retreive #retries ( stat #retries )
|
r> \ retreive #retries ( stat #retries )
|
||||||
0 DO
|
0 DO
|
||||||
3drop \ drop previous status & sense
|
\ drop previous status & sense
|
||||||
|
0<> IF 2drop THEN
|
||||||
|
|
||||||
|
\ Restore arguments
|
||||||
rcmd-buf-addr
|
rcmd-buf-addr
|
||||||
rcmd-buf-len
|
rcmd-buf-len
|
||||||
rcmd-dir
|
rcmd-dir
|
||||||
rcmd-cmd-addr
|
rcmd-cmd-addr
|
||||||
rcmd-cmd-len
|
rcmd-cmd-len
|
||||||
|
|
||||||
|
\ Send command
|
||||||
execute-scsi-command ( [ sense-buf sense-len ] stat )
|
execute-scsi-command ( [ sense-buf sense-len ] stat )
|
||||||
|
|
||||||
\ Success ?
|
\ Success ?
|
||||||
|
@ -476,16 +479,6 @@ CREATE sector d# 512 allot
|
||||||
TRUE VALUE first-time-init?
|
TRUE VALUE first-time-init?
|
||||||
0 VALUE open-count
|
0 VALUE open-count
|
||||||
CREATE cdb 10 allot
|
CREATE cdb 10 allot
|
||||||
100 CONSTANT test-unit-retries
|
|
||||||
|
|
||||||
\ SCSI test-unit-read
|
|
||||||
: test-unit-ready ( -- 0 | [ sense-buf sense-len ] stat )
|
|
||||||
vscsi-debug? IF
|
|
||||||
." VSCSI: test-unit-ready " current-target . cr
|
|
||||||
THEN
|
|
||||||
cdb scsi-build-test-unit-ready
|
|
||||||
0 0 0 cdb scsi-param-size test-unit-retries retry-scsi-command
|
|
||||||
;
|
|
||||||
|
|
||||||
: inquiry ( -- buffer | NULL )
|
: inquiry ( -- buffer | NULL )
|
||||||
vscsi-debug? IF
|
vscsi-debug? IF
|
||||||
|
@ -511,52 +504,6 @@ CREATE cdb 10 allot
|
||||||
0= IF true ELSE 2drop false THEN
|
0= IF true ELSE 2drop false THEN
|
||||||
;
|
;
|
||||||
|
|
||||||
: read-capacity ( -- true | false )
|
|
||||||
vscsi-debug? IF
|
|
||||||
." VSCSI: read-capacity " current-target . cr
|
|
||||||
THEN
|
|
||||||
cdb scsi-build-read-cap-10
|
|
||||||
sector scsi-length-read-cap-10-data scsi-dir-read
|
|
||||||
cdb scsi-param-size 1 retry-scsi-command
|
|
||||||
\ Success ?
|
|
||||||
0= IF true ELSE 2drop false THEN
|
|
||||||
;
|
|
||||||
|
|
||||||
: start-stop-unit ( state# -- true | false )
|
|
||||||
vscsi-debug? IF
|
|
||||||
." VSCSI: start-stop-unit " current-target . cr
|
|
||||||
THEN
|
|
||||||
cdb scsi-build-start-stop-unit
|
|
||||||
0 0 0 cdb scsi-param-size 10 retry-scsi-command
|
|
||||||
\ Success ?
|
|
||||||
0= IF true ELSE 2drop false THEN
|
|
||||||
;
|
|
||||||
|
|
||||||
: get-media-event ( -- true | false )
|
|
||||||
vscsi-debug? IF
|
|
||||||
." VSCSI: get-media-event " current-target . cr
|
|
||||||
THEN
|
|
||||||
cdb scsi-build-get-media-event
|
|
||||||
sector scsi-length-media-event scsi-dir-read cdb scsi-param-size 1 retry-scsi-command
|
|
||||||
\ Success ?
|
|
||||||
0= IF true ELSE 2drop false THEN
|
|
||||||
;
|
|
||||||
|
|
||||||
: read-blocks ( -- addr block# #blocks blksz -- [ #read-blocks true ] | false )
|
|
||||||
vscsi-debug? IF
|
|
||||||
." VSCSI: read-blocks " current-target . cr
|
|
||||||
THEN
|
|
||||||
over * ( addr block# #blocks len )
|
|
||||||
>r rot r> ( block# #blocks addr len )
|
|
||||||
2swap ( addr len block# #blocks )
|
|
||||||
dup >r
|
|
||||||
cdb scsi-build-read-10 ( addr len )
|
|
||||||
r> -rot ( #blocks addr len )
|
|
||||||
scsi-dir-read cdb scsi-param-size 10 retry-scsi-command
|
|
||||||
( #blocks [ sense-buf sense-len ] stat )
|
|
||||||
0= IF true ELSE 3drop false THEN
|
|
||||||
;
|
|
||||||
|
|
||||||
\ Cleanup behind us
|
\ Cleanup behind us
|
||||||
: vscsi-cleanup
|
: vscsi-cleanup
|
||||||
vscsi-debug? IF ." VSCSI: Cleaning up" cr THEN
|
vscsi-debug? IF ." VSCSI: Cleaning up" cr THEN
|
||||||
|
@ -657,113 +604,6 @@ CREATE cdb 10 allot
|
||||||
10000 \ Larger value seem to have problems with some CDROMs
|
10000 \ Larger value seem to have problems with some CDROMs
|
||||||
;
|
;
|
||||||
|
|
||||||
: dev-get-capacity ( -- blocksize #blocks )
|
|
||||||
\ Make sure that there are zeros in the buffer in case something goes wrong:
|
|
||||||
sector 10 erase
|
|
||||||
\ Now issue the read-capacity command
|
|
||||||
read-capacity not IF
|
|
||||||
0 0 EXIT
|
|
||||||
THEN
|
|
||||||
sector scsi-get-capacity-10
|
|
||||||
;
|
|
||||||
|
|
||||||
: dev-read-blocks ( -- addr block# #blocks blksize -- #read-blocks )
|
|
||||||
read-blocks
|
|
||||||
;
|
|
||||||
|
|
||||||
: initial-test-unit-ready ( -- true | [ ascq asc sense-key false ] )
|
|
||||||
test-unit-ready
|
|
||||||
\ stat == 0, return
|
|
||||||
0= IF true EXIT THEN
|
|
||||||
\ check sense len, no sense -> return HW error
|
|
||||||
0= IF drop 0 0 4 false EXIT THEN
|
|
||||||
\ get sense
|
|
||||||
scsi-get-sense-data false
|
|
||||||
;
|
|
||||||
|
|
||||||
: compare-sense ( ascq asc key ascq2 asc2 key2 -- true | false )
|
|
||||||
3 pick = ( ascq asc key ascq2 asc2 keycmp )
|
|
||||||
swap 4 pick = ( ascq asc key ascq2 keycmp asccmp )
|
|
||||||
rot 5 pick = ( ascq asc key keycmp asccmp ascqcmp )
|
|
||||||
and and nip nip nip
|
|
||||||
;
|
|
||||||
|
|
||||||
0 CONSTANT CDROM-READY
|
|
||||||
1 CONSTANT CDROM-NOT-READY
|
|
||||||
2 CONSTANT CDROM-NO-DISK
|
|
||||||
3 CONSTANT CDROM-TRAY-OPEN
|
|
||||||
4 CONSTANT CDROM-INIT-REQUIRED
|
|
||||||
5 CONSTANT CDROM-TRAY-MAYBE-OPEN
|
|
||||||
|
|
||||||
: cdrom-status ( -- status )
|
|
||||||
initial-test-unit-ready
|
|
||||||
IF CDROM-READY EXIT THEN
|
|
||||||
|
|
||||||
vscsi-debug? IF
|
|
||||||
." TestUnitReady sense: " 3dup . . . cr
|
|
||||||
THEN
|
|
||||||
|
|
||||||
3dup 1 4 2 compare-sense IF
|
|
||||||
3drop CDROM-NOT-READY EXIT
|
|
||||||
THEN
|
|
||||||
|
|
||||||
get-media-event IF
|
|
||||||
sector w@ 4 >= IF
|
|
||||||
sector 2 + c@ 04 = IF
|
|
||||||
sector 5 + c@
|
|
||||||
dup 02 and 0<> IF drop 3drop CDROM-READY EXIT THEN
|
|
||||||
dup 01 and 0<> IF drop 3drop CDROM-TRAY-OPEN EXIT THEN
|
|
||||||
drop 3drop CDROM-NO-DISK EXIT
|
|
||||||
THEN
|
|
||||||
THEN
|
|
||||||
THEN
|
|
||||||
|
|
||||||
3dup 2 4 2 compare-sense IF
|
|
||||||
3drop CDROM-INIT-REQUIRED EXIT
|
|
||||||
THEN
|
|
||||||
over 4 = over 2 = and IF
|
|
||||||
\ Format in progress... what do we do ? Just ignore
|
|
||||||
3drop CDROM-READY EXIT
|
|
||||||
THEN
|
|
||||||
over 3a = IF
|
|
||||||
3drop CDROM-NO-DISK EXIT
|
|
||||||
THEN
|
|
||||||
|
|
||||||
\ Other error...
|
|
||||||
3drop CDROM-TRAY-MAYBE-OPEN
|
|
||||||
;
|
|
||||||
|
|
||||||
: cdrom-try-close-tray ( -- )
|
|
||||||
scsi-const-load start-stop-unit drop
|
|
||||||
;
|
|
||||||
|
|
||||||
: cdrom-must-close-tray ( -- )
|
|
||||||
scsi-const-load start-stop-unit not IF
|
|
||||||
." Tray open !" cr -65 throw
|
|
||||||
THEN
|
|
||||||
;
|
|
||||||
|
|
||||||
: dev-prep-cdrom ( -- ready? )
|
|
||||||
5 0 DO
|
|
||||||
cdrom-status CASE
|
|
||||||
CDROM-READY OF UNLOOP true EXIT ENDOF
|
|
||||||
CDROM-NO-DISK OF ." No medium !" cr false EXIT ENDOF
|
|
||||||
CDROM-TRAY-OPEN OF cdrom-must-close-tray ENDOF
|
|
||||||
CDROM-INIT-REQUIRED OF cdrom-try-close-tray ENDOF
|
|
||||||
CDROM-TRAY-MAYBE-OPEN OF cdrom-try-close-tray ENDOF
|
|
||||||
ENDCASE
|
|
||||||
d# 1000 ms
|
|
||||||
LOOP
|
|
||||||
." Drive not ready !" cr false
|
|
||||||
;
|
|
||||||
|
|
||||||
: dev-prep-disk ( -- ready? )
|
|
||||||
initial-test-unit-ready not IF
|
|
||||||
." Disk not ready! Sense key :" . ." ASC,ASCQ: " . . cr
|
|
||||||
false EXIT
|
|
||||||
THEN true
|
|
||||||
;
|
|
||||||
|
|
||||||
: vscsi-create-disk ( srplun -- )
|
: vscsi-create-disk ( srplun -- )
|
||||||
" disk" find-alias 0<> IF drop THEN
|
" disk" find-alias 0<> IF drop THEN
|
||||||
get-node node>path
|
get-node node>path
|
||||||
|
|
|
@ -778,6 +778,12 @@ CONSTANT scsi-length-media-event
|
||||||
d# 0 to scsi-param-errors \ local errors (param limits)
|
d# 0 to scsi-param-errors \ local errors (param limits)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
\ ***************************************************************************
|
||||||
|
\ Constants used by SCSI controller's execute-scsi-command
|
||||||
|
\ ***************************************************************************
|
||||||
|
true CONSTANT scsi-dir-read
|
||||||
|
false CONSTANT scsi-dir-write
|
||||||
|
|
||||||
|
|
||||||
\ ***************************************************************************
|
\ ***************************************************************************
|
||||||
\ scsi loader
|
\ scsi loader
|
||||||
|
|
Loading…
Reference in New Issue