diff mbox

[U-Boot,v5,1/4] usb: legacy_hub_port_reset(): Speedup hub reset handling

Message ID 1458046755-15934-2-git-send-email-sr@denx.de
State Deferred
Delegated to: Marek Vasut
Headers show

Commit Message

Stefan Roese March 15, 2016, 12:59 p.m. UTC
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(-)

Comments

Bin Meng March 16, 2016, 2:29 a.m. UTC | #1
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 mbox

Patch

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) {