[U-Boot] [PATCH v3 7/8] usb: hub: Reset only usb 2.0 ports

Vivek Gautam gautam.vivek at samsung.com
Fri Apr 12 13:04:39 CEST 2013


As per XHCI specifications USB 3.0 protocol ports attempt
to advance to 'Enabled' state; however USB 2.0 protocol ports
require software reset to advance them to 'Enabled' state.
Thereby, inferring that software need to reset USB 2.0 protocol
ports invariably (as per EHCI spec or xHCI spec).

Signed-off-by: Vivek Gautam <gautam.vivek at samsung.com>
---

This patch added in V3(current-version) of this patch-series.

 common/usb_hub.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/common/usb_hub.c b/common/usb_hub.c
index 1e225e6..eedbcf2 100644
--- a/common/usb_hub.c
+++ b/common/usb_hub.c
@@ -233,6 +233,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
 	struct usb_device *usb;
 	ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
 	unsigned short portstatus;
+	uint32_t do_port_reset = 1;
 
 	/* Check status */
 	if (usb_get_port_status(dev, port + 1, portsts) < 0) {
@@ -246,6 +247,9 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
 	      le16_to_cpu(portsts->wPortChange),
 	      portspeed(portstatus));
 
+	if (portstatus & (1 << USB_PORT_FEAT_SUPERSPEED))
+		do_port_reset = 0;
+
 	/* Clear the connection change status */
 	usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_CONNECTION);
 
@@ -259,10 +263,21 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
 	}
 	mdelay(200);
 
-	/* Reset the port */
-	if (hub_port_reset(dev, port, &portstatus) < 0) {
-		printf("cannot reset port %i!?\n", port + 1);
-		return;
+	/*
+	 * Reset the port:
+	 * As per xHCI protocol, USB 3.0 devices do not require
+	 * a port reset, however USB 2.0 device do require the same
+	 * to let ports proceed to 'enabled' state
+	 *
+	 * XXX: Will this break EHCI ??
+	 * probably not, above condition for 'do_port_reset' checks for
+	 * speed, and for EHCI it can't reach Super speed anyways.
+	 */
+	if (do_port_reset) {
+		if (hub_port_reset(dev, port, &portstatus) < 0) {
+			printf("cannot reset port %i!?\n", port + 1);
+			return;
+		}
 	}
 
 	mdelay(200);
-- 
1.7.6.5



More information about the U-Boot mailing list