summaryrefslogtreecommitdiff
path: root/packages/linux/unslung-kernel/gl811e.patch
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