Matt:
Daniel reports that the patch to change the length of the
cache-determination MODE-SENSE worked (patch included below). Here is the
relevant part of the system log. It turns out that only the first 11
bytes of the cache page are needed...
On 30 Jul 2003, Daniel St�ckner wrote:
> It works! Here the log when connecting the device:
>
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: queuecommand called
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: *** thread awakened.
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Command MODE_SENSE_10 (10 bytes)
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: 5a 08 08 00 00 00 00 00 08 00
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk command S 0x43425355 T 0x5 Trg 0
> LUN 0 L 8 F 128 CL 10
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 31
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 31/31
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk command transfer result=0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 8
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 8/8
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk data transfer result 0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Attempting to get CSW...
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 13
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 13/13
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk status result = 0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk status Sig 0x53425355 T 0x5 R 0
> Stat 0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: scsi cmd done, result=0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: *** thread sleeping.
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: queuecommand called
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: *** thread awakened.
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Command MODE_SENSE_10 (10 bytes)
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: 5a 08 08 00 00 00 00 00 0b 00
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk command S 0x43425355 T 0x6 Trg 0
> LUN 0 L 11 F 128 CL 10
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 31
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 31/31
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk command transfer result=0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 11
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 11/11
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk data transfer result 0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Attempting to get CSW...
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 13
> bytes
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Status code 0; transferred 13/13
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: -- transfer complete
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk status result = 0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: Bulk status Sig 0x53425355 T 0x6 R 0
> Stat 0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: scsi cmd done, result=0x0
> Jul 30 00:30:15 lapp31000 kernel: usb-storage: *** thread sleeping.
> Jul 30 00:30:15 lapp31000 kernel: SCSI device sda: drive cache: write through
> Jul 30 00:30:15 lapp31000 kernel: sda:
Do you think I should submit this to James Bottomley? The way I see it,
the code should be fine either way, for conformant devices. At least one
device (Daniel's) works with the patch but not without it. I'm worried
that other devices might turn out to do exactly the opposite.
Maybe a better approach would be:
len = data.length;
if (len > 512)
len = data.header_length + data.block_descriptor_length + 3;
(I don't know why the original code tests against 128.) What's your
advice?
Alan Stern
===== sd.c 1.52 vs edited =====
--- 1.52/drivers/scsi/sd.c Tue Jul 1 17:54:19 2003
+++ edited/drivers/scsi/sd.c Tue Jul 29 10:44:21 2003
@@ -1124,7 +1124,7 @@
struct scsi_request *SRpnt, unsigned char *buffer) {
int len = 0, res;
- const int dbd = 0; /* DBD */
+ const int dbd = 0x08; /* DBD */
const int modepage = 0x08; /* current values, cache page */
struct scsi_mode_data data;
@@ -1134,11 +1134,12 @@
if (scsi_status_is_good(res)) {
/* that went OK, now ask for the proper length */
- len = data.length;
- if (len > 128)
- len = 128;
- res = sd_do_mode_sense(SRpnt, dbd, modepage, buffer,
+ len = data.header_length + data.block_descriptor_length + 3;
+ if (len <= 512)
+ res = sd_do_mode_sense(SRpnt, dbd, modepage, buffer,
len, &data);
+ else
+ res = SAM_STAT_BUSY;
}
if (scsi_status_is_good(res)) {
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel