| \ 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 + |
| ELSE |
| dev-max-target 1 = IF |
| \ Some USB MSC devices do not implement report |
| \ luns. That will stall the bulk pipe. These devices are |
| \ single lun devices, report it accordingly |
| |
| ( devarray devcur ndev ) |
| 16 alloc-mem ( devarray devcur ndev mem ) |
| dup 16 0 fill ( devarray devcur ndev mem ) |
| dup 0 0 dev-generate-srplun swap x! ( devarray devcur ndev mem ) |
| rot x! ( devarray ndev ) |
| 1 + |
| UNLOOP EXIT |
| THEN |
| THEN |
| LOOP |
| nip |
| ; |
| |
| : make-media-alias ( $name srplun -- ) |
| >r |
| get-next-alias ?dup IF |
| r> make-disk-alias |
| ELSE |
| r> drop |
| 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 |
| ; |