ipq807x: Add delay for Get descriptor
REQUEST SUMMARY
Setup Data 8006000200000900 Direction Device-to-host
Type Standard Recipient Device
bRequest GET_DESCRIPTOR wValue CONFIGURATION, Index 0
wIndex 0x0000 wLength 0x0009
DECODING INFORMATION
Field Length(bits) Offset(bits) Decoded HexValue Description
bRequest 8 8 GET_DESCRIPTOR 0x06 bRequest HexVal: 0x06
wValue 16 16 CONFIGURATION type, Index 0 0x0200 Type of Descriptor
wIndex 16 32 0x0000 0x0000 index info
DEVICE_QUALIFIER
Descriptor(128 bytes) Field Length(bits) Offset(bits) Decoded HexValue Description
bLength 8 0 0x80 0x80 Descriptor size is 128 bytes
bDescriptorType 8 8 0x06 0x06 DEVICE_QUALIFIER Descriptor Type
bcdUSB 16 16 0x0200 0x0200 USB Specification version 2.00
bDeviceClass 8 32 0x00 0x00 Each interface specifies its own class information
bDeviceSubClass 8 40 0x00 0x00 Each interface specifies its own Subclass information
bDeviceProtocol 8 48 0x09 0x09 Protocol code = 9
bMaxPacketSize0 8 56 0x00 0x00 The Maximum packet size 0 for endpoint zero is invalid! (Only 8,16,32,or 64 are valid)
bNumConfigurations 8 64 0x09 0x09 The device has 9 possible other-speed configurations
The Transcend device fails for get configuration descriptor length.
Adding a delay fixes the issue.
Change-Id: Ic337e94e6342163e57e652781544709d0c32edcc
Signed-off-by: Sham Muthayyan <smuthayy@codeaurora.org>
diff --git a/common/usb.c b/common/usb.c
index 9f67cc1..b3aff89 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -43,6 +43,9 @@
#define USB_BUFSIZ 512
+#define TRANSCEND_USB_VENDOR_ID 0x8564
+#define TRANSCEND_USB_PRODUCT_ID 0x1000
+
static int asynch_allowed;
char usb_started; /* flag for the started/stopped USB status */
@@ -1088,8 +1091,20 @@
le16_to_cpus(&dev->descriptor.idProduct);
le16_to_cpus(&dev->descriptor.bcdDevice);
+ /*The Transcend device fails for get configuration length. Adding
+ delay about 10 micro secs to fix this.*/
+ if (dev->descriptor.idVendor == TRANSCEND_USB_VENDOR_ID &&
+ dev->descriptor.idProduct == TRANSCEND_USB_PRODUCT_ID)
+ udelay(10);
/* only support for one config for now */
err = usb_get_configuration_len(dev, 0);
+
+ /*The Transcend device fails for get configuration number. Adding
+ delay about 10 micro secs to fix this.*/
+ if (dev->descriptor.idVendor == TRANSCEND_USB_VENDOR_ID &&
+ dev->descriptor.idProduct == TRANSCEND_USB_PRODUCT_ID)
+ udelay(10);
+
if (err >= 0) {
tmpbuf = (unsigned char *)malloc_cache_aligned(err);
if (!tmpbuf)