Message ID | 1458046755-15934-2-git-send-email-sr@denx.de |
---|---|
State | Deferred |
Delegated to: | Marek Vasut |
Headers | show |
On Tue, Mar 15, 2016 at 8:59 PM, Stefan Roese <sr@denx.de> wrote: > Start with a short USB hub reset delay of 20ms. This can be enough for > some configurations. > > The 2nd delay at the end of the loop is completely removed. Since the > delay hasn't been long enough, a longer delay time of 200ms is assigned > and will be used in the next loop round. > > This hub reset handling is also used in the v4.4 Linux USB driver, > hub_port_reset(). > > Signed-off-by: Stefan Roese <sr@denx.de> > Cc: Simon Glass <sjg@chromium.org> > Acked-by: Hans de Goede <hdegoede@redhat.com> > Tested-by: Stephen Warren <swarren@nvidia.com> > Cc: Marek Vasut <marex@denx.de> > > --- > > Changes in v5: None > Changes in v4: > - Minor rewording / fixes of the commit text > > Changes in v3: > - Changed small timeout from 10ms to 20ms as this results in a > much faster USB scanning time (10ms too small and 20ms enough > in many cases) > > Changes in v2: > - Add Acked-by / Tested-by from Hans and Stephen > > common/usb_hub.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > Tested-by: Bin Meng <bmeng.cn@gmail.com>
diff --git a/common/usb_hub.c b/common/usb_hub.c index e1de813..2089e20 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -46,6 +46,9 @@ DECLARE_GLOBAL_DATA_PTR; #define USB_BUFSIZ 512 +#define HUB_SHORT_RESET_TIME 20 +#define HUB_LONG_RESET_TIME 200 + /* TODO(sjg@chromium.org): Remove this when CONFIG_DM_USB is defined */ static struct usb_hub_device hub_dev[USB_MAX_HUB]; static int usb_hub_index; @@ -164,6 +167,7 @@ int legacy_hub_port_reset(struct usb_device *dev, int port, int err, tries; ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1); unsigned short portstatus, portchange; + int delay = HUB_SHORT_RESET_TIME; /* start with short reset delay */ #ifdef CONFIG_DM_USB debug("%s: resetting '%s' port %d...\n", __func__, dev->dev->name, @@ -176,7 +180,7 @@ int legacy_hub_port_reset(struct usb_device *dev, int port, if (err < 0) return err; - mdelay(200); + mdelay(delay); if (usb_get_port_status(dev, port + 1, portsts) < 0) { debug("get_port_status failed status %lX\n", @@ -215,7 +219,8 @@ int legacy_hub_port_reset(struct usb_device *dev, int port, if (portstatus & USB_PORT_STAT_ENABLE) break; - mdelay(200); + /* Switch to long reset delay for the next round */ + delay = HUB_LONG_RESET_TIME; } if (tries == MAX_TRIES) {