From david-b@pacbell.net Wed Aug 31 11:05:47 2005 From: David Brownell Subject: USB: relax usbcore reset timings Date: Wed, 31 Aug 2005 10:41:44 -0700 Cc: Greg KH 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 Signed-off-by: Greg Kroah-Hartman --- 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: