diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/core/hub.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index a220a5e7f4a5..4a4b41f2665a 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -492,6 +492,23 @@ static int hub_hub_status(struct usb_hub *hub, | |||
492 | return ret; | 492 | return ret; |
493 | } | 493 | } |
494 | 494 | ||
495 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
496 | { | ||
497 | struct usb_device *hdev = hub->hdev; | ||
498 | int ret; | ||
499 | |||
500 | if (hdev->children[port1-1] && set_state) { | ||
501 | usb_set_device_state(hdev->children[port1-1], | ||
502 | USB_STATE_NOTATTACHED); | ||
503 | } | ||
504 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
505 | if (ret) | ||
506 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
507 | port1, ret); | ||
508 | |||
509 | return ret; | ||
510 | } | ||
511 | |||
495 | static int hub_configure(struct usb_hub *hub, | 512 | static int hub_configure(struct usb_hub *hub, |
496 | struct usb_endpoint_descriptor *endpoint) | 513 | struct usb_endpoint_descriptor *endpoint) |
497 | { | 514 | { |
@@ -717,15 +734,12 @@ static void hub_disconnect(struct usb_interface *intf) | |||
717 | struct usb_hub *hub = usb_get_intfdata (intf); | 734 | struct usb_hub *hub = usb_get_intfdata (intf); |
718 | struct usb_device *hdev; | 735 | struct usb_device *hdev; |
719 | 736 | ||
720 | if (!hub) | 737 | usb_set_intfdata (intf, NULL); |
721 | return; | ||
722 | hdev = hub->hdev; | 738 | hdev = hub->hdev; |
723 | 739 | ||
724 | if (hdev->speed == USB_SPEED_HIGH) | 740 | if (hdev->speed == USB_SPEED_HIGH) |
725 | highspeed_hubs--; | 741 | highspeed_hubs--; |
726 | 742 | ||
727 | usb_set_intfdata (intf, NULL); | ||
728 | |||
729 | hub_quiesce(hub); | 743 | hub_quiesce(hub); |
730 | usb_free_urb(hub->urb); | 744 | usb_free_urb(hub->urb); |
731 | hub->urb = NULL; | 745 | hub->urb = NULL; |
@@ -1430,23 +1444,6 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
1430 | return status; | 1444 | return status; |
1431 | } | 1445 | } |
1432 | 1446 | ||
1433 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
1434 | { | ||
1435 | struct usb_device *hdev = hub->hdev; | ||
1436 | int ret; | ||
1437 | |||
1438 | if (hdev->children[port1-1] && set_state) { | ||
1439 | usb_set_device_state(hdev->children[port1-1], | ||
1440 | USB_STATE_NOTATTACHED); | ||
1441 | } | ||
1442 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
1443 | if (ret) | ||
1444 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
1445 | port1, ret); | ||
1446 | |||
1447 | return ret; | ||
1448 | } | ||
1449 | |||
1450 | /* | 1447 | /* |
1451 | * Disable a port and mark a logical connnect-change event, so that some | 1448 | * Disable a port and mark a logical connnect-change event, so that some |
1452 | * time later khubd will disconnect() any existing usb_device on the port | 1449 | * time later khubd will disconnect() any existing usb_device on the port |