From b2db28babe0e64e08b1a754b65dd7e437f8d82a9 Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Thu, 22 Nov 2012 11:18:19 +0100 Subject: libpayload: Detach devices behind removed USB hubs When a USB hub got removed, we should also remove all devices that were attached to it. Change-Id: I73c0da1b7570f1af9726925ca222781b3d752557 Signed-off-by: Nico Huber Reviewed-on: http://review.coreboot.org/1903 Reviewed-by: Patrick Georgi Tested-by: build bot (Jenkins) --- payloads/libpayload/drivers/usb/usbhub.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'payloads/libpayload/drivers') diff --git a/payloads/libpayload/drivers/usb/usbhub.c b/payloads/libpayload/drivers/usb/usbhub.c index 47215fcf10..90e08dbde4 100644 --- a/payloads/libpayload/drivers/usb/usbhub.c +++ b/payloads/libpayload/drivers/usb/usbhub.c @@ -53,6 +53,17 @@ typedef struct { static void usb_hub_destroy (usbdev_t *dev) { + int i; + + /* First, detach all devices behind this hub. */ + int *const ports = HUB_INST (dev)->ports; + for (i = 1; i <= HUB_INST (dev)->num_ports; i++) { + if (ports[i] != -1) { + usb_detach_device(dev->controller, ports[i]); + ports[i] = -1; + } + } + free (HUB_INST (dev)->ports); free (HUB_INST (dev)->descriptor); free (HUB_INST (dev)); -- cgit v1.2.3