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

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to