diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index e5c54f7c99c155a56a546b2c5f0bb50efeca2786..ead5b3cfef452abaf3c2fc49b660f96d4b45bdba 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -53,8 +53,6 @@ static int blinkenlights = 0; module_param (blinkenlights, bool, S_IRUGO); MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs"); -static int hub_port_disable(struct usb_device *hdev, int port); - #ifdef DEBUG static inline char *portspeed (int portstatus) @@ -623,30 +621,12 @@ static int hub_configure(struct usb_hub *hub, return ret; } -static void hub_remove_children_work(void *__hub) -{ - struct usb_hub *hub = __hub; - struct usb_device *hdev = hub->hdev; - int i; - - kfree(hub); - - usb_lock_device(hdev); - for (i = 0; i < hdev->maxchild; ++i) { - if (hdev->children[i]) - usb_disconnect(&hdev->children[i]); - } - usb_unlock_device(hdev); - usb_put_dev(hdev); -} - static unsigned highspeed_hubs; static void hub_disconnect(struct usb_interface *intf) { struct usb_hub *hub = usb_get_intfdata (intf); struct usb_device *hdev; - int i, n; if (!hub) return; @@ -689,27 +669,8 @@ static void hub_disconnect(struct usb_interface *intf) hub->buffer = NULL; } - /* If there are any children then this is unbind only, not a - * physical disconnection. The active ports must be disabled - * and later on we must call usb_disconnect(). We can't call - * it here because we already own the usb bus writelock. - */ - n = 0; - for (i = 0; i < hdev->maxchild; ++i) { - if (hdev->children[i]) { - ++n; - hub_port_disable(hdev, i); - } - } - - if (n == 0) - kfree(hub); - else { - /* Reuse hub->leds to disconnect the children */ - INIT_WORK(&hub->leds, hub_remove_children_work, hub); - schedule_work(&hub->leds); - usb_get_dev(hdev); - } + /* Free the memory */ + kfree(hub); } static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)