blob: 106c329b4c7e783edc629cb00647f12ad3bf57d1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
--- 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
|