aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2013-09-24 15:09:29 +0530
committerNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2013-10-04 12:01:20 +0530
commit2ddd78d4bea9fe2ed8ae84bf325453558b236317 (patch)
tree20054bcc4f77629b5867cef89fc0558d3575db89
parent50302c3eb9933d1ba122be58cdf65001dd3bf028 (diff)
downloadSLOF-2ddd78d4bea9fe2ed8ae84bf325453558b236317.zip
SLOF-2ddd78d4bea9fe2ed8ae84bf325453558b236317.tar.gz
SLOF-2ddd78d4bea9fe2ed8ae84bf325453558b236317.tar.bz2
scsi: make probe more error resilient
* Some usb devices do not like report-luns, assume it as single lun device and move further. * Make inquiry of the device first for 36bytes and then determine what is the additional size to read. Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
-rw-r--r--slof/fs/scsi-disk.fs20
-rw-r--r--slof/fs/scsi-host-helpers.fs15
-rw-r--r--slof/fs/scsi-probe-helpers.fs14
3 files changed, 36 insertions, 13 deletions
diff --git a/slof/fs/scsi-disk.fs b/slof/fs/scsi-disk.fs
index 1d1539f..1978471 100644
--- a/slof/fs/scsi-disk.fs
+++ b/slof/fs/scsi-disk.fs
@@ -90,19 +90,23 @@ CREATE cdb 10 allot
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
+: (inquiry) ( size -- buffer | NULL )
+ dup 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
+ scratch swap scsi-dir-read cdb scsi-param-size 10 retry-scsi-command
\ Success ?
0= IF scratch ELSE 2drop 0 THEN
;
+: inquiry ( -- buffer | NULL )
+ scsi-disk-debug? IF
+ ." SCSI-DISK: inquiry " .s cr
+ THEN
+ d# 36 (inquiry) 0= IF 0 EXIT THEN
+ scratch inquiry-data>add-length c@ 5 +
+ (inquiry)
+;
+
: read-capacity ( -- blocksize #blocks )
\ Now issue the read-capacity command
scsi-disk-debug? IF
diff --git a/slof/fs/scsi-host-helpers.fs b/slof/fs/scsi-host-helpers.fs
index 9ff3613..579ce37 100644
--- a/slof/fs/scsi-host-helpers.fs
+++ b/slof/fs/scsi-host-helpers.fs
@@ -92,16 +92,21 @@
CREATE sector d# 512 allot
CREATE cdb 10 allot
-: inquiry ( -- buffer | NULL )
- \ 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
+: (inquiry) ( size -- buffer | NULL )
+ dup cdb scsi-build-inquiry
\ 16 retries for inquiry to flush out any UAs
- sector ff scsi-dir-read cdb scsi-param-size 10 retry-scsi-command
+ sector swap scsi-dir-read cdb scsi-param-size 10 retry-scsi-command
\ Success ?
0= IF sector ELSE 2drop 0 THEN
;
+\ Read the initial 36bytes and then decide how much more is to be read
+: inquiry ( -- buffer | NULL )
+ d# 36 (inquiry) 0= IF 0 EXIT THEN
+ sector inquiry-data>add-length c@ 5 +
+ (inquiry)
+;
+
: report-luns ( -- [ sector ] true | false )
200 cdb scsi-build-report-luns
\ 16 retries to flush out any UAs
diff --git a/slof/fs/scsi-probe-helpers.fs b/slof/fs/scsi-probe-helpers.fs
index 7cb40c2..307838f 100644
--- a/slof/fs/scsi-probe-helpers.fs
+++ b/slof/fs/scsi-probe-helpers.fs
@@ -37,6 +37,20 @@
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