On Sat, Mar 03, 2001 at 11:57:25PM -0800, Matthew Dharm wrote:
> Nope.  Search on the web for the SCSI-II command spec for the info.

Found a copy.  Wow, everything makes a lot more sense now. :)

> Close, but I'd rather head it off in the control thread.  Look for the
> special case code for devices that can't handle START_STOP.

Found it.  Ah, this would definately be a lot cleaner.  

> > Am I getting closer?
> 
> Yes. :)

I have created a new patch, which is much smaller than my first attempt.
This patch is against linux-2.4.1.  I decided to work on my workstation
and didn't want to reboot.  Here's what I did this time.

- Added an 8-byte array to struct us_unusual_dev which it the start of
  the faked inquiry response.  I modeled this after sddr09.c.  

- Added a block in usb_stor_control_thread() just after the START_STOP
  check to check for INQUIRY.  I create the fake response using a local
  buffer, the new array in unusual_dev and a call to
  fill_inquiry_response().  I fake the command just like the block for
  START_STOP.  

- Updated the UNUSUAL_DEV marcos to reflect the new structure.

This works for me.  I like the idea of the 8-byte array, but having NULL
characters in there bothers me.  I hope that's just a person stigma.

So how is this patch?

diff -ur linux-2.4.1/drivers/usb/storage/unusual_devs.h 
linux-2.4.1-taz/drivers/usb/storage/unusual_devs.h
--- linux-2.4.1/drivers/usb/storage/unusual_devs.h      Sun Feb  4 22:42:42 2001
+++ linux-2.4.1-taz/drivers/usb/storage/unusual_devs.h  Sun Mar  4 12:08:35 2001
@@ -40,28 +40,39 @@
 UNUSUAL_DEV(  0x03ee, 0x0000, 0x0000, 0x0245, 
                "Mitsumi",
                "CD-R/RW Drive",
+               "",
                US_SC_8020, US_PR_CBI, NULL, 0), 
 
 UNUSUAL_DEV(  0x03f0, 0x0107, 0x0200, 0x0200, 
                "HP",
                "CD-Writer+",
+               "",
                US_SC_8070, US_PR_CB, NULL, 0), 
 
 #ifdef CONFIG_USB_STORAGE_HP8200e
 UNUSUAL_DEV(  0x03f0, 0x0207, 0x0001, 0x0001, 
                "HP",
                "CD-Writer+ 8200e",
+               "",
                US_SC_8070, US_PR_SCM_ATAPI, init_8200e, 0), 
 #endif
 
+UNUSUAL_DEV(  0x04cb, 0x0100, 0x0000, 0x2210,
+               "Fujifilm",
+               "FinePix 1400Zoom",
+               "\x00\x80\x02\x02\x1f\x00\x00\x00",
+               US_SC_8070, US_PR_CBI, NULL, US_FL_FIX_INQUIRY),
+
 UNUSUAL_DEV(  0x04e6, 0x0001, 0x0200, 0x0200, 
                "Matshita",
                "LS-120",
+               "",
                US_SC_8020, US_PR_CB, NULL, 0),
 
 UNUSUAL_DEV(  0x04e6, 0x0002, 0x0100, 0x0100, 
                "Shuttle",
                "eUSCSI Bridge",
+               "",
                US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, 
                US_FL_SCM_MULT_TARG ), 
 
@@ -69,6 +80,7 @@
 UNUSUAL_DEV(  0x04e6, 0x0003, 0x0000, 0x9999, 
                "Sandisk",
                "ImageMate SDDR09",
+               "",
                US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP ),
 #endif
@@ -77,6 +89,7 @@
 UNUSUAL_DEV(  0x0436, 0x0005, 0x0100, 0x0100,
                "Microtech",
                "CameraMate (DPCM_USB)",
+               "",
                US_SC_SCSI, US_PR_DPCM_USB, NULL,
                US_FL_START_STOP ),
 #endif
@@ -84,85 +97,100 @@
 UNUSUAL_DEV(  0x04e6, 0x0006, 0x0100, 0x0200, 
                "Shuttle",
                "eUSB MMC Adapter",
+               "",
                US_SC_SCSI, US_PR_CB, NULL, 
                US_FL_SINGLE_LUN), 
 
 UNUSUAL_DEV(  0x04e6, 0x0007, 0x0100, 0x0200, 
                "Sony",
                "Hifd",
+               "",
                US_SC_SCSI, US_PR_CB, NULL, 
                US_FL_SINGLE_LUN), 
 
 UNUSUAL_DEV(  0x04e6, 0x0009, 0x0200, 0x0200, 
                "Shuttle",
                "eUSB ATA/ATAPI Adapter",
+               "",
                US_SC_8020, US_PR_CB, NULL, 0),
 
 UNUSUAL_DEV(  0x04e6, 0x000a, 0x0200, 0x0200, 
                "Shuttle",
                "eUSB CompactFlash Adapter",
+               "",
                US_SC_8020, US_PR_CB, NULL, 0),
 
 UNUSUAL_DEV(  0x04e6, 0x000B, 0x0100, 0x0100, 
                "Shuttle",
                "eUSCSI Bridge",
+               "",
                US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, 
                US_FL_SCM_MULT_TARG ), 
 
 UNUSUAL_DEV(  0x04e6, 0x000C, 0x0100, 0x0100, 
                "Shuttle",
                "eUSCSI Bridge",
+               "",
                US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, 
                US_FL_SCM_MULT_TARG ), 
 
 UNUSUAL_DEV(  0x04e6, 0x0101, 0x0200, 0x0200, 
                "Shuttle",
                "CD-RW Device",
+               "",
                US_SC_8020, US_PR_CB, NULL, 0),
 
 UNUSUAL_DEV(  0x054c, 0x0010, 0x0106, 0x0210, 
                "Sony",
                "DSC-S30/S70/505V/F505", 
+               "",
                US_SC_SCSI, US_PR_CB, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP | US_FL_MODE_XLATE ),
 
 UNUSUAL_DEV(  0x054c, 0x002d, 0x0100, 0x0100, 
                "Sony",
                "Memorystick MSAC-US1",
+               "",
                US_SC_UFI, US_PR_CB, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP ),
 
 UNUSUAL_DEV(  0x057b, 0x0000, 0x0000, 0x0299, 
                "Y-E Data",
                "Flashbuster-U",
+               "",
                US_SC_UFI,  US_PR_CB, NULL,
                US_FL_SINGLE_LUN),
 
 UNUSUAL_DEV(  0x057b, 0x0000, 0x0300, 0x9999, 
                "Y-E Data",
                "Flashbuster-U",
+               "",
                US_SC_UFI,  US_PR_CBI, NULL,
                US_FL_SINGLE_LUN),
 
 UNUSUAL_DEV(  0x059f, 0xa601, 0x0200, 0x0200, 
                "LaCie",
                "USB Hard Disk",
+               "",
                US_SC_RBC, US_PR_CB, NULL, 0 ), 
 
 UNUSUAL_DEV(  0x05ab, 0x0031, 0x0100, 0x0100, 
                "In-System",
                "USB/IDE Bridge (ATAPI ONLY!)",
+               "",
                US_SC_8070, US_PR_BULK, NULL, 0 ), 
 
 UNUSUAL_DEV(  0x0644, 0x0000, 0x0100, 0x0100, 
                "TEAC",
                "Floppy Drive",
+               "",
                US_SC_UFI, US_PR_CB, NULL, 0 ), 
 
 #ifdef CONFIG_USB_STORAGE_SDDR09
 UNUSUAL_DEV(  0x066b, 0x0105, 0x0100, 0x0100, 
                "Olympus",
                "Camedia MAUSB-2",
+               "",
                US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP ),
 #endif
@@ -170,22 +198,26 @@
 UNUSUAL_DEV(  0x0693, 0x0002, 0x0100, 0x0100, 
                "Hagiwara",
                "FlashGate SmartMedia",
+               "",
                US_SC_SCSI, US_PR_BULK, NULL, 0 ),
 
 UNUSUAL_DEV(  0x0693, 0x0005, 0x0100, 0x0100,
                "Hagiwara",
                "Flashgate",
+               "",
                US_SC_SCSI, US_PR_BULK, NULL, 0 ), 
 
 UNUSUAL_DEV(  0x0781, 0x0001, 0x0200, 0x0200, 
                "Sandisk",
                "ImageMate SDDR-05a",
+               "",
                US_SC_SCSI, US_PR_CB, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP),
 
 UNUSUAL_DEV( 0x0781, 0x0100, 0x0100, 0x0100,
                 "Sandisk",
                 "ImageMate SDDR-12",
+               "",
                 US_SC_SCSI, US_PR_CB, NULL,
                 US_FL_SINGLE_LUN ),
 
@@ -193,6 +225,7 @@
 UNUSUAL_DEV(  0x0781, 0x0200, 0x0100, 0x0100, 
                "Sandisk",
                "ImageMate SDDR-09",
+               "",
                US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
                US_FL_SINGLE_LUN | US_FL_START_STOP ),
 #endif
@@ -200,12 +233,14 @@
 UNUSUAL_DEV(  0x0781, 0x0002, 0x0009, 0x0009, 
                "Sandisk",
                "ImageMate SDDR-31",
+               "",
                US_SC_SCSI, US_PR_BULK, NULL,
                US_FL_IGNORE_SER),
 
 UNUSUAL_DEV(  0x07af, 0x0004, 0x0100, 0x0100, 
                "Microtech",
                "USB-SCSI-DB25",
+               "",
                US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init,
                US_FL_SCM_MULT_TARG ), 
 
@@ -213,12 +248,14 @@
 UNUSUAL_DEV( 0x07ab, 0xfc01, 0x0000, 0x9999,
                 "Freecom",
                 "USB-IDE",
+               "",
                 US_SC_QIC, US_PR_FREECOM, freecom_init, 0),
 #endif
 
 UNUSUAL_DEV(  0x07af, 0x0005, 0x0100, 0x0100, 
                "Microtech",
                "USB-SCSI-HD50",
+               "",
                US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init,
                US_FL_SCM_MULT_TARG ), 
 
@@ -226,6 +263,7 @@
 UNUSUAL_DEV(  0x07af, 0x0006, 0x0100, 0x0100,
                "Microtech",
                "CameraMate (DPCM_USB)",
+               "",
                US_SC_SCSI, US_PR_DPCM_USB, NULL,
                US_FL_START_STOP ),
 #endif
diff -ur linux-2.4.1/drivers/usb/storage/usb.c 
linux-2.4.1-taz/drivers/usb/storage/usb.c
--- linux-2.4.1/drivers/usb/storage/usb.c       Sun Feb  4 22:42:42 2001
+++ linux-2.4.1-taz/drivers/usb/storage/usb.c   Sun Mar  4 12:01:26 2001
@@ -109,8 +109,8 @@
  */
 
 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
-                   vendorName, productName,useProtocol, useTransport, \
-                   initFunction, flags) \
+                   vendorName, productName, inquiryResponse, \
+                   useProtocol, useTransport, initFunction, flags) \
 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
 
 static struct usb_device_id storage_usb_ids [] = {
@@ -160,11 +160,12 @@
 
 #undef UNUSUAL_DEV
 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
-                   vendor_name, product_name, use_protocol, use_transport, \
-                   init_function, Flags) \
+                   vendor_name, product_name, inquiry_response, \
+                   use_protocol, use_transport, init_function, Flags) \
 { \
        vendorName: vendor_name,        \
        productName: product_name,      \
+       inquiryResponse: inquiry_response, \
        useProtocol: use_protocol,      \
        useTransport: use_transport,    \
        initFunction : init_function,   \
@@ -377,6 +378,22 @@
                                us->srb = NULL;
                                break;
                        }
+
+                       if ((us->srb->cmnd[0] == INQUIRY) &&
+                           (us->flags & US_FL_FIX_INQUIRY)) {
+                               char data_ptr[36];
+                               US_DEBUGP("Faking INQUIRY command\n");
+                               memcpy(data_ptr, 
+                                       us->unusual_dev->inquiryResponse, 8);
+                               fill_inquiry_response(us, data_ptr, 36);
+                               us->srb->result = GOOD << 1;
+
+                               set_current_state(TASK_INTERRUPTIBLE);
+                               us->srb->scsi_done(us->srb);
+                               us->srb = NULL;
+                               break;
+                       }
+                               
 
                        /* lock the device pointers */
                        down(&(us->dev_semaphore));
diff -ur linux-2.4.1/drivers/usb/storage/usb.h 
linux-2.4.1-taz/drivers/usb/storage/usb.h
--- linux-2.4.1/drivers/usb/storage/usb.h       Sun Feb  4 22:42:42 2001
+++ linux-2.4.1-taz/drivers/usb/storage/usb.h   Sun Mar  4 11:55:43 2001
@@ -86,6 +86,7 @@
 struct us_unusual_dev {
        const char* vendorName;
        const char* productName;
+       const char inquiryResponse[8];  
        __u8  useProtocol;
        __u8  useTransport;
        int (*initFunction)(struct us_data *);
@@ -99,6 +100,7 @@
 #define US_FL_START_STOP      0x00000004 /* ignore START_STOP commands     */
 #define US_FL_IGNORE_SER      0x00000010 /* Ignore the serial number given  */
 #define US_FL_SCM_MULT_TARG   0x00000020 /* supports multiple targets */
+#define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs fixing */
 
 #define USB_STOR_STRING_LEN 32
 

_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
http://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to