# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.551   -> 1.552  
#       drivers/usb/core/usb.c  1.54    -> 1.55   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/16      [EMAIL PROTECTED]  1.552
# Change to the USB core to retry failed devices on startup.
# 
# Based on a patch from Georg Acher <[EMAIL PROTECTED]>
# --------------------------------------------
#
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c    Fri May 17 15:16:21 2002
+++ b/drivers/usb/core/usb.c    Fri May 17 15:16:21 2002
@@ -2583,9 +2583,13 @@
  * Only hub drivers (including virtual root hub drivers for host
  * controllers) should ever call this.
  */
+#define NEW_DEVICE_RETRYS      2
+#define SET_ADDRESS_RETRYS     2
 int usb_new_device(struct usb_device *dev)
 {
        int err;
+       int i;
+       int j;
 
        /* USB v1.1 5.5.3 */
        /* We read the first 8 bytes from the device descriptor to get to */
@@ -2594,18 +2598,30 @@
        dev->epmaxpacketin [0] = 8;
        dev->epmaxpacketout[0] = 8;
 
-       err = usb_set_address(dev);
-       if (err < 0) {
-               err("USB device not accepting new address=%d (error=%d)",
-                       dev->devnum, err);
-               clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-               dev->devnum = -1;
-               return 1;
-       }
+       for (i = 0; i < NEW_DEVICE_RETRYS; ++i) {
+
+               for (j = 0; j < SET_ADDRESS_RETRYS; ++j) {
+                       err = usb_set_address(dev);
+                       if (err >= 0)
+                               break;
+                       wait_ms(200);
+               }
+               if (err < 0) {
+                       err("USB device not accepting new address=%d (error=%d)",
+                               dev->devnum, err);
+                       clear_bit(dev->devnum, dev->bus->devmap.devicemap);
+                       dev->devnum = -1;
+                       return 1;
+               }
 
-       wait_ms(10);    /* Let the SET_ADDRESS settle */
+               wait_ms(10);    /* Let the SET_ADDRESS settle */
+
+               err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
+               if (err >= 8)
+                       break;
+               wait_ms(100);
+       }
 
-       err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
        if (err < 8) {
                if (err < 0)
                        err("USB device not responding, giving up (error=%d)", err);

_______________________________________________________________

Hundreds of nodes, one monster rendering program.
Now that�s a super model! Visit http://clustering.foundries.sf.net/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to