From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Thu, 10 Mar 2016 19:51:13 +0100 Subject: [U-Boot] [PATCH 1/6] usb: legacy_hub_port_reset(): Speedup hub reset handling In-Reply-To: <1457625012-1268-2-git-send-email-sr@denx.de> References: <1457625012-1268-1-git-send-email-sr@denx.de> <1457625012-1268-2-git-send-email-sr@denx.de> Message-ID: <56E1C221.3030403@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 10-03-16 16:50, Stefan Roese wrote: > Start with a short USB hub reset delay of 10ms. This can be enough for > some configurations. > > The 2nd delay at the 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 > Cc: Simon Glass > Cc: Hans de Goede > Cc: Stephen Warren > Cc: Marek Vasut Since this is good enough for the kernel it should be good enough for us: Acked-by: Hans de Goede Regards, Hans > --- > > common/usb_hub.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/common/usb_hub.c b/common/usb_hub.c > index e1de813..10fdd3c 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 10 > +#define HUB_LONG_RESET_TIME 200 > + > /* TODO(sjg at 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) { >