[coreboot-gerrit] Change in coreboot[master]: libpayload/generic_hub: Detect port disconnect after reset

Raul Rangel (Code Review) gerrit at coreboot.org
Fri Jul 13 23:17:05 CEST 2018


Raul Rangel has uploaded this change for review. ( https://review.coreboot.org/27477


Change subject: libpayload/generic_hub: Detect port disconnect after reset
......................................................................

libpayload/generic_hub: Detect port disconnect after reset

If a port disconnects after a reset we should abort any initialization
on the port. At the same time this might mean the device has
re-enumerated as a 3.0 device so we should rescan all the ports.

I decided to not add a return status enum since that would require a lot
of changes. I opted to just return 2 as the magic reenum value.

BUG=b:76831439
TEST=Verified USB-C devices that get detected correctly in depthcharge.

Change-Id: Iad899544684312df1bef08d69b5c7f41eac3a21c
Signed-off-by: Raul E Rangel <rrangel at chromium.org>
---
M payloads/libpayload/drivers/usb/generic_hub.c
1 file changed, 26 insertions(+), 8 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/77/27477/1

diff --git a/payloads/libpayload/drivers/usb/generic_hub.c b/payloads/libpayload/drivers/usb/generic_hub.c
index 89da934..a2aea7c 100644
--- a/payloads/libpayload/drivers/usb/generic_hub.c
+++ b/payloads/libpayload/drivers/usb/generic_hub.c
@@ -157,6 +157,15 @@
 	if (hub->ops->reset_port) {
 		if (hub->ops->reset_port(dev, port) < 0)
 			return -1;
+
+		if (!hub->ops->port_connected(dev, port)) {
+			usb_debug(
+				"generic_hub: Port %d disconnected after "
+				"reset. Possibly upgraded, rescan required.\n",
+				port);
+			return 2;
+		}
+
 		/* after reset the port will be enabled automatically */
 		const int ret = generic_hub_wait_for_port(
 			/* time out after 1,000 * 10us = 10ms */
@@ -214,15 +223,24 @@
 			hub->ops->hub_status_changed(dev) != 1)
 		return;
 
-	int port;
-	for (port = 1; port <= hub->num_ports; ++port) {
-		const int ret = hub->ops->port_status_changed(dev, port);
-		if (ret < 0) {
-			return;
-		} else if (ret == 1) {
-			usb_debug("generic_hub: Port change at %d\n", port);
-			if (generic_hub_scanport(dev, port) < 0)
+	int reenum_limit = 1;
+	for (int i = 0; i < reenum_limit && i < 2; ++i) {
+		for (int port = 1; port <= hub->num_ports; ++port) {
+			const int ret =
+				hub->ops->port_status_changed(dev, port);
+			if (ret < 0) {
 				return;
+			} else if (ret == 1) {
+				usb_debug("generic_hub: Port change at %d\n",
+					  port);
+				int rtn = generic_hub_scanport(dev, port);
+				if (rtn == 2) {
+					reenum_limit++;
+					continue;
+				} else if (rtn < 0) {
+					return;
+				}
+			}
 		}
 	}
 }

-- 
To view, visit https://review.coreboot.org/27477
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iad899544684312df1bef08d69b5c7f41eac3a21c
Gerrit-Change-Number: 27477
Gerrit-PatchSet: 1
Gerrit-Owner: Raul Rangel <rrangel at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180713/8d40775b/attachment.html>


More information about the coreboot-gerrit mailing list