blob: 7cb40c2539544847cd1fa7b9f24948cb77e98585 [file] [log] [blame]
\ This file is meant to be included by SCSI hosts to provide
\ probing helpers - scsi-find-disks
: wrapped-inquiry ( -- true | false )
inquiry 0= IF false EXIT THEN
\ Skip devices with PQ != 0
sector inquiry-data>peripheral c@ e0 and 0 =
;
: scsi-read-lun ( addr -- lun true | false )
dup c@ C0 AND CASE
40 OF w@-be 3FFF AND TRUE ENDOF
0 OF w@-be TRUE ENDOF
dup dup OF ." Unsupported LUN format = " . cr FALSE ENDOF
ENDCASE
;
: vscsi-report-luns ( -- array ndev )
\ array of pointers, up to 8 devices
dev-max-target 3 << alloc-mem dup
0 ( devarray devcur ndev )
dev-max-target 0 DO
i 0 dev-generate-srplun (set-target)
report-luns nip IF
sector l@ ( devarray devcur ndev size )
sector 8 + swap ( devarray devcur ndev lunarray size )
dup 8 + dup alloc-mem ( devarray devcur ndev lunarray size size+ mem )
dup rot 0 fill ( devarray devcur ndev lunarray size mem )
dup >r swap move r> ( devarray devcur ndev mem )
dup sector l@ 3 >> 0 DO ( devarray devcur ndev mem memcur )
dup dup scsi-read-lun IF
j swap dev-generate-srplun swap x! 8 +
ELSE
2drop
THEN
LOOP drop
rot ( devarray ndev mem devcur )
dup >r x! r> 8 + ( devarray ndev devcur )
swap 1 +
THEN
LOOP
nip
;
8 CONSTANT MAX-ALIAS
0 VALUE srplun
: make-media-alias ( $name srplun -- )
TO srplun
2dup find-alias IF
drop MAX-ALIAS 1 DO
i $cathex 2dup find-alias 0= IF
strdup srplun make-disk-alias UNLOOP EXIT
ELSE drop THEN
LOOP
ELSE
srplun make-disk-alias
THEN
;
: scsi-find-disks ( -- )
." SCSI: Looking for devices" cr
vscsi-report-luns
0 ?DO
dup x@
BEGIN
dup x@
dup 0= IF drop TRUE ELSE
(set-target) wrapped-inquiry IF
." " current-target (u.) type ." "
\ XXX FIXME: Check top bits to ignore unsupported units
\ and maybe provide better printout & more cases
\ XXX FIXME: Actually check for LUNs
sector inquiry-data>peripheral c@ CASE
0 OF ." DISK : " " disk" current-target make-media-alias ENDOF
5 OF ." CD-ROM : " " cdrom" current-target make-media-alias ENDOF
7 OF ." OPTICAL : " " cdrom" current-target make-media-alias ENDOF
e OF ." RED-BLOCK: " " disk" current-target make-media-alias ENDOF
dup dup OF ." ? (" . 8 emit 29 emit 5 spaces ENDOF
ENDCASE
sector .inquiry-text cr
THEN
8 + FALSE
THEN
UNTIL drop
8 +
LOOP drop
;