aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/core/hub.c39
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
495static 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
495static int hub_configure(struct usb_hub *hub, 512static 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
1433static 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