ref: 8c8149965994d4122bd22d29fbcf114282175ec9
parent: 857502c364fc281a9f5265c3192b030431768583
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Jan 3 15:46:25 EST 2013
scsi: do only 36 byte inquiry some devices freeze up with inqiry allocation length other than 36 bytes. as we do not really care about the vendor specific part of the inquiry, lets only do 36 byte inquiry for now.
--- a/sys/src/9/port/sdscsi.c
+++ b/sys/src/9/port/sdscsi.c
@@ -45,10 +45,10 @@
r->write = 0;
r->cmd[0] = 0x12;
r->cmd[1] = r->lun<<5;
- r->cmd[4] = sizeof(unit->inquiry)-1;
+ r->cmd[4] = 36;
r->clen = 6;
r->data = inquiry;
- r->dlen = sizeof(unit->inquiry)-1;
+ r->dlen = 36;
r->flags = 0;
r->status = ~0;
--- a/sys/src/cmd/nusb/disk/disk.c
+++ b/sys/src/cmd/nusb/disk/disk.c
@@ -341,7 +341,13 @@
i, lun->inquiry[0]);
continue;
}
- SRstart(lun, 1);
+
+ if(SRready(lun) < 0 && SRready(lun) < 0 && SRready(lun) < 0)
+ dprint(2, "disk: lun %d not ready\n", i);
+
+ if((lun->inquiry[0] & 0x1F) == 0)
+ SRstart(lun, 1);
+
/*
* we ignore the device type reported by inquiry.
* Some devices return a wrong value but would still work.
--- a/sys/src/cmd/nusb/disk/scsireq.c
+++ b/sys/src/cmd/nusb/disk/scsireq.c
@@ -404,12 +404,12 @@
memset(cmd, 0, sizeof cmd);
cmd[0] = ScmdInq;
- cmd[4] = sizeof rp->inquiry;
+ cmd[4] = 36;
rp->cmd.p = cmd;
rp->cmd.count = sizeof cmd;
memset(rp->inquiry, 0, sizeof rp->inquiry);
rp->data.p = rp->inquiry;
- rp->data.count = sizeof rp->inquiry;
+ rp->data.count = 36;
rp->data.write = 0;
if(SRrequest(rp) >= 0){rp->flags |= Finqok;
--
⑨