This patch fixes sddr09 and sddr55 to suppor the MODE_SENSE_10 commands, which are the only variants used by sd.c
Greg, please apply.
Matt
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2004/01/11 15:49:43-08:00 [EMAIL PROTECTED]
# Fix mode-sense handling to support MODE_SENSE_10
#
# drivers/usb/storage/sddr55.c
# 2004/01/11 15:49:29-08:00 [EMAIL PROTECTED] +8 -10
# Fix mode-sense handling to support MODE_SENSE_10
#
# drivers/usb/storage/sddr09.c
# 2004/01/11 15:49:29-08:00 [EMAIL PROTECTED] +9 -7
# Fix mode-sense handling to support MODE_SENSE_10
#
diff -Nru a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c
--- a/drivers/usb/storage/sddr09.c Sun Jan 11 15:51:01 2004
+++ b/drivers/usb/storage/sddr09.c Sun Jan 11 15:51:01 2004
@@ -1387,8 +1387,9 @@
0x00, 0x80, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00
};
- static unsigned char mode_page_01[16] = {
- 0x0F, 0x00, 0, 0x00,
+ /* note: no block descriptor support */
+ static unsigned char mode_page_01[19] = {
+ 0x00, 0x0F, 0x00, 0x0, 0x0, 0x0, 0x00,
0x01, 0x0A,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
@@ -1466,7 +1467,7 @@
return USB_STOR_TRANSPORT_GOOD;
}
- if (srb->cmnd[0] == MODE_SENSE) {
+ if (srb->cmnd[0] == MODE_SENSE_10) {
int modepage = (srb->cmnd[2] & 0x3F);
/* They ask for the Read/Write error recovery page,
@@ -1477,8 +1478,8 @@
"mode page 0x%x\n", modepage);
memcpy(ptr, mode_page_01, sizeof(mode_page_01));
- ptr[0] = sizeof(mode_page_01) - 1;
- ptr[2] = (info->flags & SDDR09_WP) ? 0x80 : 0;
+ ((u16*)ptr)[0] = sizeof(mode_page_01) - 2;
+ ptr[3] = (info->flags & SDDR09_WP) ? 0x80 : 0;
usb_stor_set_xfer_buf(ptr, sizeof(mode_page_01), srb);
return USB_STOR_TRANSPORT_GOOD;
}
@@ -1519,8 +1520,9 @@
return sddr09_write_data(us, page, pages);
}
- // Pass TEST_UNIT_READY and REQUEST_SENSE through
-
+ /* catch-all for all other commands, except
+ * pass TEST_UNIT_READY and REQUEST_SENSE through
+ */
if (srb->cmnd[0] != TEST_UNIT_READY &&
srb->cmnd[0] != REQUEST_SENSE) {
sensekey = 0x05; /* illegal request */
diff -Nru a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c
--- a/drivers/usb/storage/sddr55.c Sun Jan 11 15:51:02 2004
+++ b/drivers/usb/storage/sddr55.c Sun Jan 11 15:51:02 2004
@@ -740,8 +740,9 @@
static unsigned char inquiry_response[8] = {
0x00, 0x80, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00
};
- static unsigned char mode_page_01[16] = { // write-protected for now
- 0x03, 0x00, 0x80, 0x00,
+ // write-protected for now, no block descriptor support
+ static unsigned char mode_page_01[20] = {
+ 0x0, 0x12, 0x00, 0x80, 0x0, 0x0, 0x0, 0x0,
0x01, 0x0A,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
@@ -826,7 +827,8 @@
* the fact that only 250 out of every 256 are used */
info->max_log_blks = ((info->capacity >> (info->pageshift +
info->blockshift)) / 256) * 250;
- /* Last page in the card, adjust as we only use 250 out of every 256
pages */
+ /* Last page in the card, adjust as we only use 250 out of
+ * every 256 pages */
capacity = (capacity / 256) * 250;
capacity /= PAGESIZE;
@@ -841,28 +843,24 @@
return USB_STOR_TRANSPORT_GOOD;
}
- if (srb->cmnd[0] == MODE_SENSE) {
+ if (srb->cmnd[0] == MODE_SENSE_10) {
memcpy(ptr, mode_page_01, sizeof mode_page_01);
- ptr[2] = (info->read_only || info->force_read_only) ? 0x80 : 0;
+ ptr[3] = (info->read_only || info->force_read_only) ? 0x80 : 0;
+ usb_stor_set_xfer_buf(ptr, sizeof(mode_page_01), srb);
if ( (srb->cmnd[2] & 0x3F) == 0x01 ) {
-
US_DEBUGP(
"SDDR55: Dummy up request for mode page 1\n");
-
return USB_STOR_TRANSPORT_GOOD;
} else if ( (srb->cmnd[2] & 0x3F) == 0x3F ) {
-
US_DEBUGP(
"SDDR55: Dummy up request for all mode pages\n");
-
return USB_STOR_TRANSPORT_GOOD;
}
set_sense_info (5, 0x24, 0); /* invalid field in command */
-
return USB_STOR_TRANSPORT_FAILED;
}
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
Sir, for the hundreth time, we do NOT carry 600-round boxes of belt-fed
suction darts!
-- Salesperson to Greg
User Friendly, 12/30/1997
pgp00000.pgp
Description: PGP signature
