--- linux-2.4.22/drivers/usb/storage/transport.c Fri Jul 9 10:56:27 2004 +++ linux-2.4.22/drivers/usb/storage/transport.c Fri Jul 9 11:51:14 2004 @@ -1170,6 +1170,12 @@ /* if the command transfered well, then we go to the data stage */ if (result == 0) { + + /* Genesys Logic interface chips need a 100us delay between + * the command phase and the data phase */ + if (us->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS) + udelay(100); + /* send/receive data payload, if there is any */ if (bcb->DataTransferLength) { usb_stor_transfer(srb, us); --- linux-2.4.22/drivers/usb/storage/usb.c Fri Jul 9 11:44:53 2004 +++ linux-2.4.22/drivers/usb/storage/usb.c Fri Jul 9 11:49:44 2004 @@ -996,6 +996,15 @@ */ (struct us_data *)ss->htmplt.proc_dir = ss; + /* According to the technical support people at Genesys Logic, + * devices using their chips have problems transferring more + * than 32 KB at a time. In practice people have found that + * 64 KB works okay and that's what Windows does. But we'll + * be conservative. + */ + if (ss->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS) + ss->htmplt.max_sectors = 64; + /* Just before we start our control thread, initialize * the device if it needs initialization */ if (unusual_dev && unusual_dev->initFunction) --- linux-2.4.22/drivers/usb/storage/usb.h Fri Jul 9 10:56:03 2004 +++ linux-2.4.22/drivers/usb/storage/usb.h Fri Jul 9 11:45:49 2004 @@ -193,4 +193,7 @@ /* Function to fill an inquiry response. See usb.c for details */ extern void fill_inquiry_response(struct us_data *us, unsigned char *data, unsigned int data_len); + +/* Vendor ID list for devices that require special handling */ +#define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */ #endif