From 1b43ad7149ebae684b0cbd08d293117a7304249d Mon Sep 17 00:00:00 2001 From: Raul E Rangel Date: Tue, 17 Jul 2018 13:27:44 -0600 Subject: [PATCH] libpayload/generic_hub: Detect port disconnect after reset If a port disconnects after a reset we should abort any initialization on the port. This might mean the device has re-enumerated as a 3.0 device so the hub should be scanned again. BUG=b:76831439 TEST=Verified USB-C devices that get detected correctly in depthcharge. Change-Id: Iad899544684312df1bef08d69b5c7f41eac3a21c Signed-off-by: Raul E Rangel Reviewed-on: https://review.coreboot.org/27477 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner --- payloads/libpayload/drivers/usb/generic_hub.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/payloads/libpayload/drivers/usb/generic_hub.c b/payloads/libpayload/drivers/usb/generic_hub.c index 9f8670597e..9d444ee792 100644 --- a/payloads/libpayload/drivers/usb/generic_hub.c +++ b/payloads/libpayload/drivers/usb/generic_hub.c @@ -157,6 +157,15 @@ generic_hub_attach_dev(usbdev_t *const dev, const int port) 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 0; + } + /* after reset the port will be enabled automatically */ const int ret = generic_hub_wait_for_port( /* time out after 1,000 * 10us = 10ms */