From david-b@pacbell.net Wed Aug 31 11:05:47 2005
From: David Brownell <david-b@pacbell.net>
Subject: USB: relax usbcore reset timings
Date: Wed, 31 Aug 2005 10:41:44 -0700
Cc: Greg KH <greg@kroah.com>
Message-Id: <200508311041.44489.david-b@pacbell.net>

This appears to help some folk, please merge.
This patch relaxes reset timings.  There are some reports that it
helps make enumeration work better on some high speed devices.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/usb/core/hub.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

--- gregkh-2.6.orig/drivers/usb/core/hub.c	2005-09-12 11:01:57.000000000 -0700
+++ gregkh-2.6/drivers/usb/core/hub.c	2005-09-12 11:02:06.000000000 -0700
@@ -435,6 +435,7 @@ void usb_hub_tt_clear_buffer (struct usb
 static void hub_power_on(struct usb_hub *hub)
 {
 	int port1;
+	unsigned pgood_delay = hub->descriptor->bPwrOn2PwrGood * 2;
 
 	/* if hub supports power switching, enable power on each port */
 	if ((hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) < 2) {
@@ -444,8 +445,8 @@ static void hub_power_on(struct usb_hub 
 					USB_PORT_FEAT_POWER);
 	}
 
-	/* Wait for power to be enabled */
-	msleep(hub->descriptor->bPwrOn2PwrGood * 2);
+	/* Wait at least 100 msec for power to become stable */
+	msleep(max(pgood_delay, (unsigned) 100));
 }
 
 static void hub_quiesce(struct usb_hub *hub)
@@ -1469,8 +1470,8 @@ static int hub_port_reset(struct usb_hub
 		/* return on disconnect or reset */
 		switch (status) {
 		case 0:
-			/* TRSTRCY = 10 ms */
-			msleep(10);
+			/* TRSTRCY = 10 ms; plus some extra */
+			msleep(10 + 40);
 			/* FALL THROUGH */
 		case -ENOTCONN:
 		case -ENODEV: