This is _way_ to device specific.

We have the strings in the unusual device structure for just this reason.
A better fix would be to have a scsiglue.c function which could turn these
strings into an INQUIRY response, based on a flag set in the flag field.

Matt

On Sat, Mar 03, 2001 at 06:03:49PM -0600, [EMAIL PROTECTED] wrote:
> There was some discussion on this digital camera a few months back, but
> I haven't seen anything since.  The last message was from Steve Kann and
> included some instructions on the fix he proposed.  Thanks Steve, the
> first part works.  Here is my implementation, it's not great, but it
> works.  
> 
> Here's what I did:
>  1. Added a function inquiryFixup() to the us_unusual_dev structure
>  2. Changed the fix_inquiry_data() to use this function
>  3. Added a function to fix the FP-1400Z's inquiry response.
>  4. Cleaned up all function calls and unusual device declarations to use
>     the new structures.  
> 
> The inquiry response isn't perfectly clean yet.  I need to find the SCSI
> spec so I know what's supposed to be there.  Comments and professional
> cleanup welcome.
> 
> If you have everything modularized you will have to load:
>  1. usbcore
>  2. (usb-uhci | usb-ohci | uhci )
>  3. usb-storage
>  4. sd_mod
>  5. msdos
> 
> Then just mount the created SCSI partition as msdos and copy the
> pictures out.  
> 
> Without further ado, the patch.
> 
> Nate

> diff -ruN linux/drivers/usb/storage/Makefile linux-2.4.2/drivers/usb/storage/Makefile
> --- linux/drivers/usb/storage/Makefile        Fri Dec 29 16:07:23 2000
> +++ linux-2.4.2/drivers/usb/storage/Makefile  Sat Mar  3 12:53:53 2001
> @@ -21,7 +21,7 @@
>  usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM)   += dpcm.o
>  
>  usb-storage-objs :=  scsiglue.o protocol.o transport.o usb.o \
> -                     initializers.o $(usb-storage-obj-y)
> +                     initializers.o fixups.o $(usb-storage-obj-y)
>  
>  include $(TOPDIR)/Rules.make
>  
> diff -ruN linux/drivers/usb/storage/fixups.c linux-2.4.2/drivers/usb/storage/fixups.c
> --- linux/drivers/usb/storage/fixups.c        Wed Dec 31 18:00:00 1969
> +++ linux-2.4.2/drivers/usb/storage/fixups.c  Sat Mar  3 12:50:51 2001
> @@ -0,0 +1,46 @@
> +/* Special Fixups for certain USB Mass Storage devices
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2, or (at your option) any
> + * later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 675 Mass Ave, Cambridge, MA 02139, USA.
> + */
> +
> +#include "fixups.h"
> +#include "debug.h"
> +
> +
> +/* Fix for FujiFilm FinePix 1400Zoom which doesn't return anything on INQUIRY
> + */
> +int usb_finepix1400_fixup(struct us_data *us, Scsi_Cmnd *srb)
> +{
> +     unsigned char *data_ptr;
> +
> +     /* verify that it's an INQUIRY command */
> +     if (srb->cmnd[0] != INQUIRY)
> +             return;
> +
> +     US_DEBUGP("Fixing INQUIRY data FujiFilm FinePix 1400Zoom\n");
> +
> +     /* find the location of the data */
> +     if (srb->use_sg) {
> +             struct scatterlist *sg;
> +
> +             sg = (struct scatterlist *) srb->request_buffer;
> +             data_ptr = (unsigned char *) sg[0].address;
> +     } else
> +             data_ptr = (unsigned char *)srb->request_buffer;
> +
> +     /* supposed to clear the SCSI type so it is set to Direct-Access */
> +     data_ptr[0] &= 0xf0;
> +
> +}
> diff -ruN linux/drivers/usb/storage/fixups.h linux-2.4.2/drivers/usb/storage/fixups.h
> --- linux/drivers/usb/storage/fixups.h        Wed Dec 31 18:00:00 1969
> +++ linux-2.4.2/drivers/usb/storage/fixups.h  Sat Mar  3 12:52:39 2001
> @@ -0,0 +1,22 @@
> +/* Header file for Special Fixups for certain USB Mass Storage devices
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2, or (at your option) any
> + * later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 675 Mass Ave, Cambridge, MA 02139, USA.
> + */
> +
> +#include "usb.h"
> +
> +/* Fix for FujiFilm FinePix 1400Zoom which doesn't return anything on INQUIRY
> + */
> +int usb_finepix1400_fixup(struct us_data *us, Scsi_Cmnd *srb);
> diff -ruN linux/drivers/usb/storage/protocol.c 
>linux-2.4.2/drivers/usb/storage/protocol.c
> --- linux/drivers/usb/storage/protocol.c      Tue Nov 28 23:50:07 2000
> +++ linux-2.4.2/drivers/usb/storage/protocol.c        Sat Mar  3 12:50:53 2001
> @@ -56,7 +56,7 @@
>  /* Fix-up the return data from an INQUIRY command to show 
>   * ANSI SCSI rev 2 so we don't confuse the SCSI layers above us
>   */
> -void fix_inquiry_data(Scsi_Cmnd *srb)
> +void fix_inquiry_data(Scsi_Cmnd *srb, struct us_data *us)
>  {
>       unsigned char *data_ptr;
>  
> @@ -76,7 +76,11 @@
>               data_ptr = (unsigned char *)srb->request_buffer;
>  
>       /* Change the SCSI revision number */
> +     data_ptr[2] &= 0xf8;
>       data_ptr[2] |= 0x2;
> +     if (us->unusual_dev && us->unusual_dev->inquiryFixup) {
> +             us->unusual_dev->inquiryFixup(us, srb);
> +     }
>  }
>  
>  /***********************************************************************
> @@ -99,7 +103,7 @@
>       usb_stor_invoke_transport(srb, us);
>  
>       /* fix the INQUIRY data if necessary */
> -     fix_inquiry_data(srb);
> +     fix_inquiry_data(srb, us);
>  }
>  
>  void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
> @@ -174,7 +178,7 @@
>               usb_stor_scsiSense10to6(srb);
>  
>       /* fix the INQUIRY data if necessary */
> -     fix_inquiry_data(srb);
> +     fix_inquiry_data(srb, us);
>  }
>  
>  
> @@ -269,7 +273,7 @@
>               usb_stor_scsiSense10to6(srb);
>  
>       /* Fix the data for an INQUIRY, if necessary */
> -     fix_inquiry_data(srb);
> +     fix_inquiry_data(srb, us);
>  }
>  
>  void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
> @@ -341,6 +345,5 @@
>       usb_stor_invoke_transport(srb, us);
>  
>       /* fix the INQUIRY data if necessary */
> -     fix_inquiry_data(srb);
> +     fix_inquiry_data(srb, us);
>  }
> -
> diff -ruN linux/drivers/usb/storage/unusual_devs.h 
>linux-2.4.2/drivers/usb/storage/unusual_devs.h
> --- linux/drivers/usb/storage/unusual_devs.h  Wed Feb 21 18:11:24 2001
> +++ linux-2.4.2/drivers/usb/storage/unusual_devs.h    Sat Mar  3 12:53:30 2001
> @@ -40,36 +40,40 @@
>  UNUSUAL_DEV(  0x03ee, 0x0000, 0x0000, 0x0245, 
>               "Mitsumi",
>               "CD-R/RW Drive",
> -             US_SC_8020, US_PR_CBI, NULL, 0), 
> +             US_SC_8020, US_PR_CBI, NULL, NULL, 0), 
>  
>  UNUSUAL_DEV(  0x03f0, 0x0107, 0x0200, 0x0200, 
>               "HP",
>               "CD-Writer+",
> -             US_SC_8070, US_PR_CB, NULL, 0), 
> +             US_SC_8070, US_PR_CB, NULL, 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), 
> +             US_SC_8070, US_PR_SCM_ATAPI, init_8200e, NULL, 0), 
>  #endif
> +UNUSUAL_DEV(  0x04cb, 0x0100, 0x0000, 0x2210,
> +             "Fujifilm",
> +             "FinePix 1400Zoom",
> +             US_SC_8070, US_PR_CBI, NULL, usb_finepix1400_fixup, 0),
>  
>  UNUSUAL_DEV(  0x04e6, 0x0001, 0x0200, 0x0200, 
>               "Matshita",
>               "LS-120",
> -             US_SC_8020, US_PR_CB, NULL, 0),
> +             US_SC_8020, US_PR_CB, NULL, NULL, 0),
>  
>  UNUSUAL_DEV(  0x04e6, 0x0002, 0x0100, 0x0100, 
>               "Shuttle",
>               "eUSCSI Bridge",
> -             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, 
> +             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, NULL, 
>               US_FL_SCM_MULT_TARG ), 
>  
>  #ifdef CONFIG_USB_STORAGE_SDDR09
>  UNUSUAL_DEV(  0x04e6, 0x0003, 0x0000, 0x9999, 
>               "Sandisk",
>               "ImageMate SDDR09",
> -             US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
> +             US_SC_SCSI, US_PR_EUSB_SDDR09, NULL, NULL, 
>               US_FL_SINGLE_LUN | US_FL_START_STOP ),
>  #endif
>  
> @@ -77,156 +81,156 @@
>  UNUSUAL_DEV(  0x0436, 0x0005, 0x0100, 0x0100,
>               "Microtech",
>               "CameraMate (DPCM_USB)",
> -             US_SC_SCSI, US_PR_DPCM_USB, NULL,
> +             US_SC_SCSI, US_PR_DPCM_USB, NULL, NULL, 
>               US_FL_START_STOP ),
>  #endif
>  
>  UNUSUAL_DEV(  0x04e6, 0x0006, 0x0100, 0x0200, 
>               "Shuttle",
>               "eUSB MMC Adapter",
> -             US_SC_SCSI, US_PR_CB, NULL, 
> +             US_SC_SCSI, US_PR_CB, NULL, NULL, 
>               US_FL_SINGLE_LUN), 
>  
>  UNUSUAL_DEV(  0x04e6, 0x0007, 0x0100, 0x0200, 
>               "Sony",
>               "Hifd",
> -             US_SC_SCSI, US_PR_CB, NULL, 
> +             US_SC_SCSI, US_PR_CB, NULL, NULL, 
>               US_FL_SINGLE_LUN), 
>  
>  UNUSUAL_DEV(  0x04e6, 0x0009, 0x0200, 0x0200, 
>               "Shuttle",
>               "eUSB ATA/ATAPI Adapter",
> -             US_SC_8020, US_PR_CB, NULL, 0),
> +             US_SC_8020, US_PR_CB, NULL, NULL, 0),
>  
>  UNUSUAL_DEV(  0x04e6, 0x000a, 0x0200, 0x0200, 
>               "Shuttle",
>               "eUSB CompactFlash Adapter",
> -             US_SC_8020, US_PR_CB, NULL, 0),
> +             US_SC_8020, US_PR_CB, NULL, NULL, 0),
>  
>  UNUSUAL_DEV(  0x04e6, 0x000B, 0x0100, 0x0100, 
>               "Shuttle",
>               "eUSCSI Bridge",
> -             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, 
> +             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, NULL, 
>               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_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, NULL, 
>               US_FL_SCM_MULT_TARG ), 
>  
>  UNUSUAL_DEV(  0x04e6, 0x0101, 0x0200, 0x0200, 
>               "Shuttle",
>               "CD-RW Device",
> -             US_SC_8020, US_PR_CB, NULL, 0),
> +             US_SC_8020, US_PR_CB, NULL, NULL, 0),
>  
>  UNUSUAL_DEV(  0x054c, 0x0010, 0x0106, 0x0210, 
>               "Sony",
>               "DSC-S30/S70/505V/F505", 
> -             US_SC_SCSI, US_PR_CB, NULL,
> +             US_SC_SCSI, US_PR_CB, NULL, 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_SC_UFI, US_PR_CB, NULL, 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_SC_UFI,  US_PR_CB, NULL, NULL,
>               US_FL_SINGLE_LUN),
>  
>  UNUSUAL_DEV(  0x057b, 0x0000, 0x0300, 0x9999, 
>               "Y-E Data",
>               "Flashbuster-U",
> -             US_SC_UFI,  US_PR_CBI, NULL,
> +             US_SC_UFI,  US_PR_CBI, NULL, NULL,
>               US_FL_SINGLE_LUN),
>  
>  UNUSUAL_DEV(  0x059f, 0xa601, 0x0200, 0x0200, 
>               "LaCie",
>               "USB Hard Disk",
> -             US_SC_RBC, US_PR_CB, NULL, 0 ), 
> +             US_SC_RBC, US_PR_CB, NULL, NULL, 0 ), 
>  
>  UNUSUAL_DEV(  0x05ab, 0x0031, 0x0100, 0x0100, 
>               "In-System",
>               "USB/IDE Bridge (ATAPI ONLY!)",
> -             US_SC_8070, US_PR_BULK, NULL, 0 ), 
> +             US_SC_8070, US_PR_BULK, NULL, NULL, 0 ), 
>  
>  UNUSUAL_DEV(  0x0644, 0x0000, 0x0100, 0x0100, 
>               "TEAC",
>               "Floppy Drive",
> -             US_SC_UFI, US_PR_CB, NULL, 0 ), 
> +             US_SC_UFI, US_PR_CB, NULL, 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_SC_SCSI, US_PR_EUSB_SDDR09, NULL, NULL,
>               US_FL_SINGLE_LUN | US_FL_START_STOP ),
>  #endif
>  
>  UNUSUAL_DEV(  0x0693, 0x0002, 0x0100, 0x0100, 
>               "Hagiwara",
>               "FlashGate SmartMedia",
> -             US_SC_SCSI, US_PR_BULK, NULL, 0 ),
> +             US_SC_SCSI, US_PR_BULK, NULL, NULL, 0 ),
>  
>  UNUSUAL_DEV(  0x0693, 0x0005, 0x0100, 0x0100,
>               "Hagiwara",
>               "Flashgate",
> -             US_SC_SCSI, US_PR_BULK, NULL, 0 ), 
> +             US_SC_SCSI, US_PR_BULK, NULL, NULL, 0 ), 
>  
>  UNUSUAL_DEV(  0x0781, 0x0001, 0x0200, 0x0200, 
>               "Sandisk",
>               "ImageMate SDDR-05a",
> -             US_SC_SCSI, US_PR_CB, NULL,
> +             US_SC_SCSI, US_PR_CB, NULL, 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_SC_SCSI, US_PR_CB, NULL, NULL,
>                  US_FL_SINGLE_LUN ),
>  
>  #ifdef CONFIG_USB_STORAGE_SDDR09
>  UNUSUAL_DEV(  0x0781, 0x0200, 0x0100, 0x0100, 
>               "Sandisk",
>               "ImageMate SDDR-09",
> -             US_SC_SCSI, US_PR_EUSB_SDDR09, NULL,
> +             US_SC_SCSI, US_PR_EUSB_SDDR09, NULL, NULL,
>               US_FL_SINGLE_LUN | US_FL_START_STOP ),
>  #endif
>  
>  UNUSUAL_DEV(  0x0781, 0x0002, 0x0009, 0x0009, 
>               "Sandisk",
>               "ImageMate SDDR-31",
> -             US_SC_SCSI, US_PR_BULK, NULL,
> +             US_SC_SCSI, US_PR_BULK, NULL, 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_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, NULL,
>               US_FL_SCM_MULT_TARG ), 
>  
>  #ifdef CONFIG_USB_STORAGE_FREECOM
>  UNUSUAL_DEV( 0x07ab, 0xfc01, 0x0000, 0x9999,
>                  "Freecom",
>                  "USB-IDE",
> -                US_SC_QIC, US_PR_FREECOM, freecom_init, 0),
> +                US_SC_QIC, US_PR_FREECOM, freecom_init, NULL, 0),
>  #endif
>  
>  UNUSUAL_DEV(  0x07af, 0x0005, 0x0100, 0x0100, 
>               "Microtech",
>               "USB-SCSI-HD50",
> -             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init,
> +             US_SC_SCSI, US_PR_BULK, usb_stor_euscsi_init, NULL,
>               US_FL_SCM_MULT_TARG ), 
>  
>  #ifdef CONFIG_USB_STORAGE_DPCM
>  UNUSUAL_DEV(  0x07af, 0x0006, 0x0100, 0x0100,
>               "Microtech",
>               "CameraMate (DPCM_USB)",
> -             US_SC_SCSI, US_PR_DPCM_USB, NULL,
> +             US_SC_SCSI, US_PR_DPCM_USB, NULL, NULL,
>               US_FL_START_STOP ),
>  #endif
>  
> diff -ruN linux/drivers/usb/storage/usb.c linux-2.4.2/drivers/usb/storage/usb.c
> --- linux/drivers/usb/storage/usb.c   Fri Feb  9 13:30:23 2001
> +++ linux-2.4.2/drivers/usb/storage/usb.c     Sat Mar  3 12:58:55 2001
> @@ -53,6 +53,7 @@
>  #include "protocol.h"
>  #include "debug.h"
>  #include "initializers.h"
> +#include "fixups.h"
>  #ifdef CONFIG_USB_STORAGE_HP8200e
>  #include "shuttle_usbat.h"
>  #endif
> @@ -110,7 +111,7 @@
>  
>  #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
>                   vendorName, productName,useProtocol, useTransport, \
> -                 initFunction, flags) \
> +                 initFunction, inquiry_fixup, flags) \
>  { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
>  
>  static struct usb_device_id storage_usb_ids [] = {
> @@ -161,13 +162,14 @@
>  #undef UNUSUAL_DEV
>  #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
>                   vendor_name, product_name, use_protocol, use_transport, \
> -                 init_function, Flags) \
> +                 init_function, inquiry_fixup, Flags) \
>  { \
>       vendorName: vendor_name,        \
>       productName: product_name,      \
>       useProtocol: use_protocol,      \
>       useTransport: use_transport,    \
>       initFunction : init_function,   \
> +     inquiryFixup: inquiry_fixup,    \
>       flags: Flags, \
>  }
>  
> diff -ruN linux/drivers/usb/storage/usb.h linux-2.4.2/drivers/usb/storage/usb.h
> --- linux/drivers/usb/storage/usb.h   Wed Feb 21 18:11:24 2001
> +++ linux-2.4.2/drivers/usb/storage/usb.h     Fri Mar  2 20:35:35 2001
> @@ -89,6 +89,7 @@
>       __u8  useProtocol;
>       __u8  useTransport;
>       int (*initFunction)(struct us_data *);
> +     int (*inquiryFixup)(struct us_data *, Scsi_Cmnd *);
>       unsigned int flags;
>  };
>  


-- 
Matthew Dharm                              Home: [EMAIL PROTECTED] 
Maintainer, Linux USB Mass Storage Driver

I'm just trying to think of a way to say "up yours" without getting fired.
                                        -- Stef
User Friendly, 10/8/1998

PGP signature

Reply via email to