ChangeSet 1.1318.4.4, 2003/06/16 14:53:43-07:00, mdharm-usb@one-eyed-alien.net [PATCH] USB storage: unusual_devs fixups This patch implements US_PR_DEVICE and US_SC_DEVICE, which have the meaning 'use the device's value -- no override'. This should make maintance easier, and also allow for those few devices that change their descriptors depending on what they are connected to. This will also print a message to help us identify entries that can be pruned. Finally, it removes a couple of dead flags. drivers/usb/storage/protocol.h | 2 drivers/usb/storage/transport.h | 8 +-- drivers/usb/storage/unusual_devs.h | 96 ++++++++++--------------------------- drivers/usb/storage/usb.c | 47 +++++++++++++++--- drivers/usb/storage/usb.h | 2 5 files changed, 73 insertions(+), 82 deletions(-) diff -Nru a/drivers/usb/storage/protocol.h b/drivers/usb/storage/protocol.h --- a/drivers/usb/storage/protocol.h Wed Jun 18 11:15:22 2003 +++ b/drivers/usb/storage/protocol.h Wed Jun 18 11:15:22 2003 @@ -57,6 +57,8 @@ #define US_SC_MIN US_SC_RBC #define US_SC_MAX US_SC_ISD200 +#define US_SC_DEVICE 0xff /* Use device's value */ + extern void usb_stor_ATAPI_command(Scsi_Cmnd*, struct us_data*); extern void usb_stor_qic157_command(Scsi_Cmnd*, struct us_data*); extern void usb_stor_ufi_command(Scsi_Cmnd*, struct us_data*); diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h --- a/drivers/usb/storage/transport.h Wed Jun 18 11:15:22 2003 +++ b/drivers/usb/storage/transport.h Wed Jun 18 11:15:22 2003 @@ -63,16 +63,18 @@ #define US_PR_DPCM_USB 0xf0 /* Combination CB/SDDR09 */ #ifdef CONFIG_USB_STORAGE_FREECOM -#define US_PR_FREECOM 0xf1 /* Freecom */ +#define US_PR_FREECOM 0xf1 /* Freecom */ #endif #ifdef CONFIG_USB_STORAGE_DATAFAB -#define US_PR_DATAFAB 0xf2 /* Datafab chipsets */ +#define US_PR_DATAFAB 0xf2 /* Datafab chipsets */ #endif #ifdef CONFIG_USB_STORAGE_JUMPSHOT -#define US_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ +#define US_PR_JUMPSHOT 0xf3 /* Lexar Jumpshot */ #endif + +#define US_PR_DEVICE 0xff /* Use device's value */ /* * Bulk only data structures diff -Nru a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h --- a/drivers/usb/storage/unusual_devs.h Wed Jun 18 11:15:22 2003 +++ b/drivers/usb/storage/unusual_devs.h Wed Jun 18 11:15:22 2003 @@ -75,28 +75,26 @@ /* Deduced by Jonathan Woithe * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message - * always fails and confuses drive; without US_FL_START_STOP, drive accesses - * (read or write) all fail. + * always fails and confuses drive. */ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113, "Buffalo", "DUB-P40G HDD", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_FIX_INQUIRY | US_FL_START_STOP), + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY ), #ifdef CONFIG_USB_STORAGE_DPCM UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100, "Microtech", "CameraMate (DPCM_USB)", - US_SC_SCSI, US_PR_DPCM_USB, NULL, - US_FL_START_STOP ), + US_SC_SCSI, US_PR_DPCM_USB, NULL, 0 ), #endif /* Made with the help of Edd Dumbill */ UNUSUAL_DEV( 0x0451, 0x5409, 0x0001, 0x0001, "Frontier Labs", "Nex II Digital", - US_SC_SCSI, US_PR_BULK, NULL, US_FL_START_STOP), + US_SC_SCSI, US_PR_BULK, NULL, 0), /* Patch submitted by Philipp Friedrich */ UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100, @@ -124,15 +122,6 @@ "785EPX Storage", US_SC_SCSI, US_PR_BULK, NULL, US_FL_SINGLE_LUN), -/* Reported by Jan Willamowius - * The device needs the flags only. - */ -UNUSUAL_DEV( 0x04c8, 0x0723, 0x0000, 0x9999, - "Konica", - "KD-200Z", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_START_STOP), - UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, "Fujifilm", "FinePix 1400Zoom", @@ -144,7 +133,7 @@ UNUSUAL_DEV( 0x04ce, 0x0002, 0x0074, 0x0074, "ScanLogic", "SL11R-IDE", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), /* Reported by Kriston Fincher @@ -183,14 +172,14 @@ "Sandisk", "ImageMate SDDR09", US_SC_SCSI, US_PR_EUSB_SDDR09, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP ), + US_FL_SINGLE_LUN ), /* This entry is from Andries.Brouwer@cwi.nl */ UNUSUAL_DEV( 0x04e6, 0x0005, 0x0100, 0x0208, "SCM Microsystems", "eUSB SmartMedia / CompactFlash Adapter", US_SC_SCSI, US_PR_DPCM_USB, sddr09_init, - US_FL_START_STOP), + 0), #endif UNUSUAL_DEV( 0x04e6, 0x0006, 0x0100, 0x0205, @@ -247,40 +236,40 @@ "Iomega", "USB Clik! 40", US_SC_8070, US_PR_BULK, NULL, - US_FL_FIX_INQUIRY | US_FL_START_STOP ), + US_FL_FIX_INQUIRY ), /* This entry is needed because the device reports Sub=ff */ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, "Sony", "DSC-S30/S70/S75/505V/F505/F707/F717/P8", US_SC_SCSI, US_PR_CB, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP | US_FL_MODE_XLATE ), + US_FL_SINGLE_LUN | US_FL_MODE_XLATE ), /* Reported by wim@geeks.nl */ UNUSUAL_DEV( 0x054c, 0x0025, 0x0100, 0x0100, "Sony", "Memorystick NW-MS7", US_SC_UFI, US_PR_CB, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP ), + US_FL_SINGLE_LUN ), 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 ), + US_FL_SINGLE_LUN ), /* Submitted by Klaus Mueller */ UNUSUAL_DEV( 0x054c, 0x002e, 0x0106, 0x0310, "Sony", "Handycam", US_SC_SCSI, US_PR_CB, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP | US_FL_MODE_XLATE), + US_FL_SINGLE_LUN | US_FL_MODE_XLATE), UNUSUAL_DEV( 0x054c, 0x0032, 0x0000, 0x9999, "Sony", "Memorystick MSC-U01N", US_SC_UFI, US_PR_CB, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP ), + US_FL_SINGLE_LUN ), /* Submitted by Nathan Babb */ UNUSUAL_DEV( 0x054c, 0x006d, 0x0000, 0x9999, @@ -316,7 +305,7 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000, "Pentax", "Optio 2/3/400", - US_SC_8070, US_PR_CBI, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), /* Submitted by Per Winkvist */ @@ -380,7 +369,7 @@ UNUSUAL_DEV( 0x05e3, 0x0700, 0x0000, 0xffff, "SIIG", "CompactFlash Card Reader", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), /* Reported by Peter Marks @@ -393,7 +382,7 @@ UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0x0001, "EagleTec", "External Hard Disk", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), UNUSUAL_DEV( 0x05e3, 0x0700, 0x0000, 0x9999, @@ -412,25 +401,9 @@ "Olympus", "Camedia MAUSB-2", US_SC_SCSI, US_PR_EUSB_SDDR09, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP ), + US_FL_SINGLE_LUN ), #endif -/* Submitted by kedar@centillium - * Needed for START_STOP flag, but that is unconfirmed */ -UNUSUAL_DEV( 0x0686, 0x4006, 0x0001, 0x0001, - "Minolta", - "Dimage S304", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_START_STOP ), - -/* Submitted by f.brugmans@hccnet.nl - * Needed for START_STOP flag */ -UNUSUAL_DEV( 0x0686, 0x4007, 0x0001, 0x0001, - "Minolta", - "Dimage S304", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_START_STOP ), - UNUSUAL_DEV( 0x0693, 0x0002, 0x0100, 0x0100, "Hagiwara", "FlashGate SmartMedia", @@ -445,13 +418,12 @@ "Sandisk", "ImageMate SDDR-05a", US_SC_SCSI, US_PR_CB, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP), + US_FL_SINGLE_LUN ), UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x0009, "Sandisk", "ImageMate SDDR-31", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_IGNORE_SER), + US_SC_SCSI, US_PR_BULK, NULL, 0 ), UNUSUAL_DEV( 0x0781, 0x0100, 0x0100, 0x0100, "Sandisk", @@ -464,7 +436,7 @@ "Sandisk", "ImageMate SDDR-09", US_SC_SCSI, US_PR_EUSB_SDDR09, NULL, - US_FL_SINGLE_LUN | US_FL_START_STOP ), + US_FL_SINGLE_LUN ), #endif #ifdef CONFIG_USB_STORAGE_FREECOM @@ -490,8 +462,7 @@ UNUSUAL_DEV( 0x07af, 0x0006, 0x0100, 0x0100, "Microtech", "CameraMate (DPCM_USB)", - US_SC_SCSI, US_PR_DPCM_USB, NULL, - US_FL_START_STOP ), + US_SC_SCSI, US_PR_DPCM_USB, NULL, 0 ), #endif #ifdef CONFIG_USB_STORAGE_DATAFAB @@ -568,7 +539,7 @@ UNUSUAL_DEV( 0x07c4, 0xa400, 0x0000, 0xffff, "Datafab", "KECF-USB", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), /* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant @@ -629,20 +600,7 @@ "Global Channel Solutions", "EasyDisk EDxxxx", US_SC_SCSI, US_PR_BULK, NULL, - US_FL_MODE_XLATE | US_FL_START_STOP | US_FL_FIX_INQUIRY ), - -/* Submitted by Brian Hall - * Needed for START_STOP flag */ -UNUSUAL_DEV( 0x0c76, 0x0003, 0x0100, 0x0100, - "JMTek", - "USBDrive", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_START_STOP ), -UNUSUAL_DEV( 0x0c76, 0x0005, 0x0100, 0x0100, - "JMTek", - "USBDrive", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_START_STOP ), + US_FL_MODE_XLATE | US_FL_FIX_INQUIRY ), /* Reported by Dan Pilone * The device needs the flags only. @@ -652,8 +610,8 @@ UNUSUAL_DEV( 0x1065, 0x2136, 0x0000, 0x9999, "CCYU TECHNOLOGY", "EasyDisk Portable Device", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_MODE_XLATE | US_FL_START_STOP), + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_MODE_XLATE ), #ifdef CONFIG_USB_STORAGE_SDDR55 UNUSUAL_DEV( 0x55aa, 0xa103, 0x0000, 0x9999, @@ -670,5 +628,5 @@ "AIPTEK", "PocketCAM 3Mega", US_SC_SCSI, US_PR_BULK, NULL, - US_FL_MODE_XLATE | US_FL_START_STOP), + US_FL_MODE_XLATE ), diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c --- a/drivers/usb/storage/usb.c Wed Jun 18 11:15:22 2003 +++ b/drivers/usb/storage/usb.c Wed Jun 18 11:15:22 2003 @@ -102,8 +102,6 @@ /* The entries in this table, except for final ones here * (USB_MASS_STORAGE_CLASS and the empty entry), correspond, * line for line with the entries of us_unsuaul_dev_list[]. - * For now, we duplicate idVendor and idProduct in us_unsual_dev_list, - * just to avoid alignment bugs. */ #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ @@ -353,7 +351,7 @@ */ else if (us->srb->device->id && !(us->flags & US_FL_SCM_MULT_TARG)) { - US_DEBUGP("Bad target number (%d/%d)\n", + US_DEBUGP("Bad target number (%d:%d)\n", us->srb->device->id, us->srb->device->lun); us->srb->result = DID_BAD_TARGET << 16; } @@ -424,10 +422,13 @@ ***********************************************************************/ /* Get the unusual_devs entries and the string descriptors */ -static void get_device_info(struct us_data *us, - struct us_unusual_dev *unusual_dev) +static void get_device_info(struct us_data *us, int id_index) { struct usb_device *dev = us->pusb_dev; + struct usb_host_interface *altsetting = + &us->pusb_intf->altsetting[us->pusb_intf->act_altsetting]; + struct us_unusual_dev *unusual_dev = &us_unusual_dev_list[id_index]; + struct usb_device_id *id = &storage_usb_ids[id_index]; if (unusual_dev->vendorName) US_DEBUGP("Vendor: %s\n", unusual_dev->vendorName); @@ -436,10 +437,40 @@ /* Store the entries */ us->unusual_dev = unusual_dev; - us->subclass = unusual_dev->useProtocol; - us->protocol = unusual_dev->useTransport; + us->subclass = (unusual_dev->useProtocol == US_SC_DEVICE) ? + altsetting->desc.bInterfaceSubClass : + unusual_dev->useProtocol; + us->protocol = (unusual_dev->useTransport == US_PR_DEVICE) ? + altsetting->desc.bInterfaceProtocol : + unusual_dev->useTransport; us->flags = unusual_dev->flags; + /* Log a message if a non-generic unusual_dev entry contains an + * unnecessary subclass or protocol override. This may stimulate + * reports from users that will help us remove unneeded entries + * from the unusual_devs.h table. + */ + if (id->idVendor || id->idProduct) { + static char *msgs[3] = { + "an unneeded SubClass entry", + "an unneeded Protocol entry", + "unneeded SubClass and Protocol entries"}; + int msg = -1; + + if (unusual_dev->useProtocol != US_SC_DEVICE && + us->subclass == altsetting->desc.bInterfaceSubClass) + msg += 1; + if (unusual_dev->useTransport != US_PR_DEVICE && + us->protocol == altsetting->desc.bInterfaceProtocol) + msg += 2; + if (msg >= 0) + printk(KERN_NOTICE USB_STORAGE "This device " + "(%04x,%04x) has %s in unusual_devs.h\n" + " Please send a copy of this message to " + "\n", + id->idVendor, id->idProduct, msgs[msg]); + } + /* Read the device's string descriptors */ if (dev->descriptor.iManufacturer) usb_string(dev, dev->descriptor.iManufacturer, @@ -843,7 +874,7 @@ * of the match from the usb_device_id table, so we can find the * corresponding entry in the private table. */ - get_device_info(us, &us_unusual_dev_list[id_index]); + get_device_info(us, id_index); #ifdef CONFIG_USB_STORAGE_SDDR09 if (us->protocol == US_PR_EUSB_SDDR09 || diff -Nru a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h --- a/drivers/usb/storage/usb.h Wed Jun 18 11:15:22 2003 +++ b/drivers/usb/storage/usb.h Wed Jun 18 11:15:22 2003 @@ -71,8 +71,6 @@ #define US_FL_SINGLE_LUN 0x00000001 /* allow access to only LUN 0 */ #define US_FL_MODE_XLATE 0x00000002 /* translate _6 to _10 commands for Win/MacOS compatibility */ -#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 US_FL_FIX_CAPACITY 0x00000080 /* READ CAPACITY response too big */