aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2014-05-20 21:08:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-27 19:35:10 -0400
commitd99f6b41308779244662109a9c2bad09a82e8ac6 (patch)
tree0063263664d8b809eeee94061959183451bdd49d
parent9262c19d14c433a6a1ba25c3ff897cb89e412309 (diff)
usb: rename usb_port device objects
The current port name "portX" is ambiguous. Before adding more port messages rename ports to "<hub-device-name>-portX" This is an ABI change, but the suspicion is that it will go unnoticed as the port power control implementation has been broken since its introduction. If however, someone was relying on the old name we can add sysfs links from the old name to the new name. Additionally, it unifies/simplifies port dev_printk messages and modifies instances of: dev_XXX(hub->intfdev, ..."port %d"... dev_XXX(&hdev->dev, ..."port%d"... into: dev_XXX(&port_dev->dev, ... Now that the names are unique usb_port devices it would be nice if they could be included in /sys/bus/usb. However, it turns out that this breaks 'lsusb -t'. For now, create a dummy port driver so that print messages are prefixed "usb 1-1-port3" rather than the subsystem-ambiguous " 1-1-port3". Finally, it corrects an odd usage of sscanf("port%d") in usb-acpi.c. Suggested-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/core/hub.c273
-rw-r--r--drivers/usb/core/port.c10
-rw-r--r--drivers/usb/core/usb-acpi.c60
-rw-r--r--drivers/usb/core/usb.h4
4 files changed, 158 insertions, 189 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 77b91888abef..653f80c52486 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -412,30 +412,35 @@ static int set_port_feature(struct usb_device *hdev, int port1, int feature)
412 NULL, 0, 1000); 412 NULL, 0, 1000);
413} 413}
414 414
415static char *to_led_name(int selector)
416{
417 switch (selector) {
418 case HUB_LED_AMBER:
419 return "amber";
420 case HUB_LED_GREEN:
421 return "green";
422 case HUB_LED_OFF:
423 return "off";
424 case HUB_LED_AUTO:
425 return "auto";
426 default:
427 return "??";
428 }
429}
430
415/* 431/*
416 * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 432 * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7
417 * for info about using port indicators 433 * for info about using port indicators
418 */ 434 */
419static void set_port_led( 435static void set_port_led(struct usb_hub *hub, int port1, int selector)
420 struct usb_hub *hub,
421 int port1,
422 int selector
423)
424{ 436{
425 int status = set_port_feature(hub->hdev, (selector << 8) | port1, 437 struct usb_port *port_dev = hub->ports[port1 - 1];
438 int status;
439
440 status = set_port_feature(hub->hdev, (selector << 8) | port1,
426 USB_PORT_FEAT_INDICATOR); 441 USB_PORT_FEAT_INDICATOR);
427 if (status < 0) 442 dev_dbg(&port_dev->dev, "indicator %s status %d\n",
428 dev_dbg (hub->intfdev, 443 to_led_name(selector), status);
429 "port %d indicator %s status %d\n",
430 port1,
431 ({ char *s; switch (selector) {
432 case HUB_LED_AMBER: s = "amber"; break;
433 case HUB_LED_GREEN: s = "green"; break;
434 case HUB_LED_OFF: s = "off"; break;
435 case HUB_LED_AUTO: s = "auto"; break;
436 default: s = "??"; break;
437 } s; }),
438 status);
439} 444}
440 445
441#define LED_CYCLE_PERIOD ((2*HZ)/3) 446#define LED_CYCLE_PERIOD ((2*HZ)/3)
@@ -909,20 +914,20 @@ static int hub_usb3_port_disable(struct usb_hub *hub, int port1)
909 msleep(HUB_DEBOUNCE_STEP); 914 msleep(HUB_DEBOUNCE_STEP);
910 } 915 }
911 if (total_time >= HUB_DEBOUNCE_TIMEOUT) 916 if (total_time >= HUB_DEBOUNCE_TIMEOUT)
912 dev_warn(hub->intfdev, "Could not disable port %d after %d ms\n", 917 dev_warn(&hub->ports[port1 - 1]->dev,
913 port1, total_time); 918 "Could not disable after %d ms\n", total_time);
914 919
915 return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT); 920 return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT);
916} 921}
917 922
918static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) 923static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
919{ 924{
925 struct usb_port *port_dev = hub->ports[port1 - 1];
920 struct usb_device *hdev = hub->hdev; 926 struct usb_device *hdev = hub->hdev;
921 int ret = 0; 927 int ret = 0;
922 928
923 if (hub->ports[port1 - 1]->child && set_state) 929 if (port_dev->child && set_state)
924 usb_set_device_state(hub->ports[port1 - 1]->child, 930 usb_set_device_state(port_dev->child, USB_STATE_NOTATTACHED);
925 USB_STATE_NOTATTACHED);
926 if (!hub->error) { 931 if (!hub->error) {
927 if (hub_is_superspeed(hub->hdev)) 932 if (hub_is_superspeed(hub->hdev))
928 ret = hub_usb3_port_disable(hub, port1); 933 ret = hub_usb3_port_disable(hub, port1);
@@ -931,8 +936,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
931 USB_PORT_FEAT_ENABLE); 936 USB_PORT_FEAT_ENABLE);
932 } 937 }
933 if (ret && ret != -ENODEV) 938 if (ret && ret != -ENODEV)
934 dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", 939 dev_err(&port_dev->dev, "cannot disable (err = %d)\n", ret);
935 port1, ret);
936 return ret; 940 return ret;
937} 941}
938 942
@@ -943,7 +947,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
943 */ 947 */
944static void hub_port_logical_disconnect(struct usb_hub *hub, int port1) 948static void hub_port_logical_disconnect(struct usb_hub *hub, int port1)
945{ 949{
946 dev_dbg(hub->intfdev, "logical disconnect on port %d\n", port1); 950 dev_dbg(&hub->ports[port1 - 1]->dev, "logical disconnect\n");
947 hub_port_disable(hub, port1, 1); 951 hub_port_disable(hub, port1, 1);
948 952
949 /* FIXME let caller ask to power down the port: 953 /* FIXME let caller ask to power down the port:
@@ -1081,21 +1085,23 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
1081 } 1085 }
1082 init2: 1086 init2:
1083 1087
1084 /* Check each port and set hub->change_bits to let khubd know 1088 /*
1089 * Check each port and set hub->change_bits to let khubd know
1085 * which ports need attention. 1090 * which ports need attention.
1086 */ 1091 */
1087 for (port1 = 1; port1 <= hdev->maxchild; ++port1) { 1092 for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
1088 struct usb_device *udev = hub->ports[port1 - 1]->child; 1093 struct usb_port *port_dev = hub->ports[port1 - 1];
1094 struct usb_device *udev = port_dev->child;
1089 u16 portstatus, portchange; 1095 u16 portstatus, portchange;
1090 1096
1091 portstatus = portchange = 0; 1097 portstatus = portchange = 0;
1092 status = hub_port_status(hub, port1, &portstatus, &portchange); 1098 status = hub_port_status(hub, port1, &portstatus, &portchange);
1093 if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) 1099 if (udev || (portstatus & USB_PORT_STAT_CONNECTION))
1094 dev_dbg(hub->intfdev, 1100 dev_dbg(&port_dev->dev, "status %04x change %04x\n",
1095 "port %d: status %04x change %04x\n", 1101 portstatus, portchange);
1096 port1, portstatus, portchange);
1097 1102
1098 /* After anything other than HUB_RESUME (i.e., initialization 1103 /*
1104 * After anything other than HUB_RESUME (i.e., initialization
1099 * or any sort of reset), every port should be disabled. 1105 * or any sort of reset), every port should be disabled.
1100 * Unconnected ports should likewise be disabled (paranoia), 1106 * Unconnected ports should likewise be disabled (paranoia),
1101 * and so should ports for which we have no usb_device. 1107 * and so should ports for which we have no usb_device.
@@ -2571,9 +2577,9 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
2571 if (delay_time >= 2 * HUB_SHORT_RESET_TIME) 2577 if (delay_time >= 2 * HUB_SHORT_RESET_TIME)
2572 delay = HUB_LONG_RESET_TIME; 2578 delay = HUB_LONG_RESET_TIME;
2573 2579
2574 dev_dbg (hub->intfdev, 2580 dev_dbg(&hub->ports[port1 - 1]->dev,
2575 "port %d not %sreset yet, waiting %dms\n", 2581 "not %sreset yet, waiting %dms\n",
2576 port1, warm ? "warm " : "", delay); 2582 warm ? "warm " : "", delay);
2577 } 2583 }
2578 2584
2579 if ((portstatus & USB_PORT_STAT_RESET)) 2585 if ((portstatus & USB_PORT_STAT_RESET))
@@ -2657,6 +2663,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
2657{ 2663{
2658 int i, status; 2664 int i, status;
2659 u16 portchange, portstatus; 2665 u16 portchange, portstatus;
2666 struct usb_port *port_dev = hub->ports[port1 - 1];
2660 2667
2661 if (!hub_is_superspeed(hub->hdev)) { 2668 if (!hub_is_superspeed(hub->hdev)) {
2662 if (warm) { 2669 if (warm) {
@@ -2690,9 +2697,9 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
2690 if (status == -ENODEV) { 2697 if (status == -ENODEV) {
2691 ; /* The hub is gone */ 2698 ; /* The hub is gone */
2692 } else if (status) { 2699 } else if (status) {
2693 dev_err(hub->intfdev, 2700 dev_err(&port_dev->dev,
2694 "cannot %sreset port %d (err = %d)\n", 2701 "cannot %sreset (err = %d)\n",
2695 warm ? "warm " : "", port1, status); 2702 warm ? "warm " : "", status);
2696 } else { 2703 } else {
2697 status = hub_port_wait_reset(hub, port1, udev, delay, 2704 status = hub_port_wait_reset(hub, port1, udev, delay,
2698 warm); 2705 warm);
@@ -2725,21 +2732,19 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
2725 * hot or warm reset failed. Try another warm reset. 2732 * hot or warm reset failed. Try another warm reset.
2726 */ 2733 */
2727 if (!warm) { 2734 if (!warm) {
2728 dev_dbg(hub->intfdev, "hot reset failed, warm reset port %d\n", 2735 dev_dbg(&port_dev->dev,
2729 port1); 2736 "hot reset failed, warm reset\n");
2730 warm = true; 2737 warm = true;
2731 } 2738 }
2732 } 2739 }
2733 2740
2734 dev_dbg (hub->intfdev, 2741 dev_dbg(&port_dev->dev,
2735 "port %d not enabled, trying %sreset again...\n", 2742 "not enabled, trying %sreset again...\n",
2736 port1, warm ? "warm " : ""); 2743 warm ? "warm " : "");
2737 delay = HUB_LONG_RESET_TIME; 2744 delay = HUB_LONG_RESET_TIME;
2738 } 2745 }
2739 2746
2740 dev_err (hub->intfdev, 2747 dev_err(&port_dev->dev, "Cannot enable. Maybe the USB cable is bad?\n");
2741 "Cannot enable port %i. Maybe the USB cable is bad?\n",
2742 port1);
2743 2748
2744done: 2749done:
2745 if (!hub_is_superspeed(hub->hdev)) 2750 if (!hub_is_superspeed(hub->hdev))
@@ -2790,6 +2795,8 @@ static int check_port_resume_type(struct usb_device *udev,
2790 struct usb_hub *hub, int port1, 2795 struct usb_hub *hub, int port1,
2791 int status, unsigned portchange, unsigned portstatus) 2796 int status, unsigned portchange, unsigned portstatus)
2792{ 2797{
2798 struct usb_port *port_dev = hub->ports[port1 - 1];
2799
2793 /* Is the device still present? */ 2800 /* Is the device still present? */
2794 if (status || port_is_suspended(hub, portstatus) || 2801 if (status || port_is_suspended(hub, portstatus) ||
2795 !port_is_power_on(hub, portstatus) || 2802 !port_is_power_on(hub, portstatus) ||
@@ -2809,9 +2816,8 @@ static int check_port_resume_type(struct usb_device *udev,
2809 } 2816 }
2810 2817
2811 if (status) { 2818 if (status) {
2812 dev_dbg(hub->intfdev, 2819 dev_dbg(&port_dev->dev, "status %04x.%04x after resume, %d\n",
2813 "port %d status %04x.%04x after resume, %d\n", 2820 portchange, portstatus, status);
2814 port1, portchange, portstatus, status);
2815 } else if (udev->reset_resume) { 2821 } else if (udev->reset_resume) {
2816 2822
2817 /* Late port handoff can set status-change bits */ 2823 /* Late port handoff can set status-change bits */
@@ -3042,8 +3048,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
3042 status = 0; 3048 status = 0;
3043 } 3049 }
3044 if (status) { 3050 if (status) {
3045 dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", 3051 dev_dbg(&port_dev->dev, "can't suspend, status %d\n", status);
3046 port1, status);
3047 3052
3048 /* Try to enable USB3 LPM and LTM again */ 3053 /* Try to enable USB3 LPM and LTM again */
3049 usb_unlocked_enable_lpm(udev); 3054 usb_unlocked_enable_lpm(udev);
@@ -3234,8 +3239,6 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
3234 if (status == 0 && !port_is_suspended(hub, portstatus)) 3239 if (status == 0 && !port_is_suspended(hub, portstatus))
3235 goto SuspendCleared; 3240 goto SuspendCleared;
3236 3241
3237 /* dev_dbg(hub->intfdev, "resume port %d\n", port1); */
3238
3239 set_bit(port1, hub->busy_bits); 3242 set_bit(port1, hub->busy_bits);
3240 3243
3241 /* see 7.1.7.7; affects power usage, but not budgeting */ 3244 /* see 7.1.7.7; affects power usage, but not budgeting */
@@ -3245,8 +3248,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
3245 status = usb_clear_port_feature(hub->hdev, 3248 status = usb_clear_port_feature(hub->hdev,
3246 port1, USB_PORT_FEAT_SUSPEND); 3249 port1, USB_PORT_FEAT_SUSPEND);
3247 if (status) { 3250 if (status) {
3248 dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", 3251 dev_dbg(&port_dev->dev, "can't resume, status %d\n", status);
3249 port1, status);
3250 } else { 3252 } else {
3251 /* drive resume for at least 20 msec */ 3253 /* drive resume for at least 20 msec */
3252 dev_dbg(&udev->dev, "usb %sresume\n", 3254 dev_dbg(&udev->dev, "usb %sresume\n",
@@ -3347,12 +3349,11 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
3347 */ 3349 */
3348 hub->wakeup_enabled_descendants = 0; 3350 hub->wakeup_enabled_descendants = 0;
3349 for (port1 = 1; port1 <= hdev->maxchild; port1++) { 3351 for (port1 = 1; port1 <= hdev->maxchild; port1++) {
3350 struct usb_device *udev; 3352 struct usb_port *port_dev = hub->ports[port1 - 1];
3353 struct usb_device *udev = port_dev->child;
3351 3354
3352 udev = hub->ports[port1 - 1]->child;
3353 if (udev && udev->can_submit) { 3355 if (udev && udev->can_submit) {
3354 dev_warn(&intf->dev, "port %d not suspended yet\n", 3356 dev_warn(&port_dev->dev, "not suspended yet\n");
3355 port1);
3356 if (PMSG_IS_AUTO(msg)) 3357 if (PMSG_IS_AUTO(msg))
3357 return -EBUSY; 3358 return -EBUSY;
3358 } 3359 }
@@ -3892,9 +3893,10 @@ EXPORT_SYMBOL_GPL(usb_enable_ltm);
3892int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected) 3893int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected)
3893{ 3894{
3894 int ret; 3895 int ret;
3895 int total_time, stable_time = 0;
3896 u16 portchange, portstatus; 3896 u16 portchange, portstatus;
3897 unsigned connection = 0xffff; 3897 unsigned connection = 0xffff;
3898 int total_time, stable_time = 0;
3899 struct usb_port *port_dev = hub->ports[port1 - 1];
3898 3900
3899 for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { 3901 for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) {
3900 ret = hub_port_status(hub, port1, &portstatus, &portchange); 3902 ret = hub_port_status(hub, port1, &portstatus, &portchange);
@@ -3923,9 +3925,8 @@ int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected)
3923 msleep(HUB_DEBOUNCE_STEP); 3925 msleep(HUB_DEBOUNCE_STEP);
3924 } 3926 }
3925 3927
3926 dev_dbg (hub->intfdev, 3928 dev_dbg(&port_dev->dev, "debounce total %dms stable %dms status 0x%x\n",
3927 "debounce: port %d: total %dms stable %dms status 0x%x\n", 3929 total_time, stable_time, portstatus);
3928 port1, total_time, stable_time, portstatus);
3929 3930
3930 if (stable_time < HUB_DEBOUNCE_STABLE) 3931 if (stable_time < HUB_DEBOUNCE_STABLE)
3931 return -ETIMEDOUT; 3932 return -ETIMEDOUT;
@@ -3984,13 +3985,14 @@ static int hub_set_address(struct usb_device *udev, int devnum)
3984 */ 3985 */
3985static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) 3986static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev)
3986{ 3987{
3987 int connect_type; 3988 struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent);
3989 int connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN;
3988 3990
3989 if (!udev->usb2_hw_lpm_capable) 3991 if (!udev->usb2_hw_lpm_capable)
3990 return; 3992 return;
3991 3993
3992 connect_type = usb_get_hub_port_connect_type(udev->parent, 3994 if (hub)
3993 udev->portnum); 3995 connect_type = hub->ports[udev->portnum - 1]->connect_type;
3994 3996
3995 if ((udev->bos->ext_cap->bmAttributes & cpu_to_le32(USB_BESL_SUPPORT)) || 3997 if ((udev->bos->ext_cap->bmAttributes & cpu_to_le32(USB_BESL_SUPPORT)) ||
3996 connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { 3998 connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) {
@@ -4366,9 +4368,10 @@ hub_power_remaining (struct usb_hub *hub)
4366 4368
4367 remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent; 4369 remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent;
4368 for (port1 = 1; port1 <= hdev->maxchild; ++port1) { 4370 for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
4369 struct usb_device *udev = hub->ports[port1 - 1]->child; 4371 struct usb_port *port_dev = hub->ports[port1 - 1];
4370 int delta; 4372 struct usb_device *udev = port_dev->child;
4371 unsigned unit_load; 4373 unsigned unit_load;
4374 int delta;
4372 4375
4373 if (!udev) 4376 if (!udev)
4374 continue; 4377 continue;
@@ -4388,9 +4391,8 @@ hub_power_remaining (struct usb_hub *hub)
4388 else 4391 else
4389 delta = 8; 4392 delta = 8;
4390 if (delta > hub->mA_per_port) 4393 if (delta > hub->mA_per_port)
4391 dev_warn(&udev->dev, 4394 dev_warn(&port_dev->dev, "%dmA is over %umA budget!\n",
4392 "%dmA is over %umA budget for port %d!\n", 4395 delta, hub->mA_per_port);
4393 delta, hub->mA_per_port, port1);
4394 remaining -= delta; 4396 remaining -= delta;
4395 } 4397 }
4396 if (remaining < 0) { 4398 if (remaining < 0) {
@@ -4413,15 +4415,14 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4413 u16 portstatus, u16 portchange) 4415 u16 portstatus, u16 portchange)
4414{ 4416{
4415 struct usb_device *hdev = hub->hdev; 4417 struct usb_device *hdev = hub->hdev;
4416 struct device *hub_dev = hub->intfdev;
4417 struct usb_hcd *hcd = bus_to_hcd(hdev->bus); 4418 struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
4419 struct usb_port *port_dev = hub->ports[port1 - 1];
4418 struct usb_device *udev; 4420 struct usb_device *udev;
4419 int status, i; 4421 int status, i;
4420 unsigned unit_load; 4422 unsigned unit_load;
4421 4423
4422 dev_dbg (hub_dev, 4424 dev_dbg(&port_dev->dev, "status %04x, change %04x, %s\n",
4423 "port %d, status %04x, change %04x, %s\n", 4425 portstatus, portchange, portspeed(hub, portstatus));
4424 port1, portstatus, portchange, portspeed(hub, portstatus));
4425 4426
4426 if (hub->has_indicators) { 4427 if (hub->has_indicators) {
4427 set_port_led(hub, port1, HUB_LED_AUTO); 4428 set_port_led(hub, port1, HUB_LED_AUTO);
@@ -4436,7 +4437,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4436#endif 4437#endif
4437 4438
4438 /* Try to resuscitate an existing device */ 4439 /* Try to resuscitate an existing device */
4439 udev = hub->ports[port1 - 1]->child; 4440 udev = port_dev->child;
4440 if ((portstatus & USB_PORT_STAT_CONNECTION) && udev && 4441 if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&
4441 udev->state != USB_STATE_NOTATTACHED) { 4442 udev->state != USB_STATE_NOTATTACHED) {
4442 usb_lock_device(udev); 4443 usb_lock_device(udev);
@@ -4468,7 +4469,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4468 if (hcd->phy && !hdev->parent && 4469 if (hcd->phy && !hdev->parent &&
4469 !(portstatus & USB_PORT_STAT_CONNECTION)) 4470 !(portstatus & USB_PORT_STAT_CONNECTION))
4470 usb_phy_notify_disconnect(hcd->phy, udev->speed); 4471 usb_phy_notify_disconnect(hcd->phy, udev->speed);
4471 usb_disconnect(&hub->ports[port1 - 1]->child); 4472 usb_disconnect(&port_dev->child);
4472 } 4473 }
4473 clear_bit(port1, hub->change_bits); 4474 clear_bit(port1, hub->change_bits);
4474 4475
@@ -4484,8 +4485,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4484 status = hub_port_debounce_be_stable(hub, port1); 4485 status = hub_port_debounce_be_stable(hub, port1);
4485 if (status < 0) { 4486 if (status < 0) {
4486 if (status != -ENODEV && printk_ratelimit()) 4487 if (status != -ENODEV && printk_ratelimit())
4487 dev_err(hub_dev, "connect-debounce failed, " 4488 dev_err(&port_dev->dev,
4488 "port %d disabled\n", port1); 4489 "connect-debounce failed\n");
4489 portstatus &= ~USB_PORT_STAT_CONNECTION; 4490 portstatus &= ~USB_PORT_STAT_CONNECTION;
4490 } else { 4491 } else {
4491 portstatus = status; 4492 portstatus = status;
@@ -4520,9 +4521,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4520 */ 4521 */
4521 udev = usb_alloc_dev(hdev, hdev->bus, port1); 4522 udev = usb_alloc_dev(hdev, hdev->bus, port1);
4522 if (!udev) { 4523 if (!udev) {
4523 dev_err (hub_dev, 4524 dev_err(&port_dev->dev,
4524 "couldn't allocate port %d usb_device\n", 4525 "couldn't allocate usb_device\n");
4525 port1);
4526 goto done; 4526 goto done;
4527 } 4527 }
4528 4528
@@ -4604,7 +4604,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4604 if (hdev->state == USB_STATE_NOTATTACHED) 4604 if (hdev->state == USB_STATE_NOTATTACHED)
4605 status = -ENOTCONN; 4605 status = -ENOTCONN;
4606 else 4606 else
4607 hub->ports[port1 - 1]->child = udev; 4607 port_dev->child = udev;
4608 spin_unlock_irq(&device_state_lock); 4608 spin_unlock_irq(&device_state_lock);
4609 4609
4610 /* Run it through the hoops (find a driver, etc) */ 4610 /* Run it through the hoops (find a driver, etc) */
@@ -4612,7 +4612,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4612 status = usb_new_device(udev); 4612 status = usb_new_device(udev);
4613 if (status) { 4613 if (status) {
4614 spin_lock_irq(&device_state_lock); 4614 spin_lock_irq(&device_state_lock);
4615 hub->ports[port1 - 1]->child = NULL; 4615 port_dev->child = NULL;
4616 spin_unlock_irq(&device_state_lock); 4616 spin_unlock_irq(&device_state_lock);
4617 } 4617 }
4618 } 4618 }
@@ -4622,7 +4622,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
4622 4622
4623 status = hub_power_remaining(hub); 4623 status = hub_power_remaining(hub);
4624 if (status) 4624 if (status)
4625 dev_dbg(hub_dev, "%dmA power budget left\n", status); 4625 dev_dbg(hub->intfdev, "%dmA power budget left\n", status);
4626 4626
4627 return; 4627 return;
4628 4628
@@ -4640,8 +4640,8 @@ loop:
4640 !hcd->driver->port_handed_over || 4640 !hcd->driver->port_handed_over ||
4641 !(hcd->driver->port_handed_over)(hcd, port1)) { 4641 !(hcd->driver->port_handed_over)(hcd, port1)) {
4642 if (status != -ENOTCONN && status != -ENODEV) 4642 if (status != -ENOTCONN && status != -ENODEV)
4643 dev_err(hub_dev, "unable to enumerate USB device on port %d\n", 4643 dev_err(&port_dev->dev,
4644 port1); 4644 "unable to enumerate USB device\n");
4645 } 4645 }
4646 4646
4647done: 4647done:
@@ -4654,13 +4654,14 @@ done:
4654static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, 4654static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port,
4655 u16 portstatus, u16 portchange) 4655 u16 portstatus, u16 portchange)
4656{ 4656{
4657 struct usb_port *port_dev = hub->ports[port - 1];
4657 struct usb_device *hdev; 4658 struct usb_device *hdev;
4658 struct usb_device *udev; 4659 struct usb_device *udev;
4659 int connect_change = 0; 4660 int connect_change = 0;
4660 int ret; 4661 int ret;
4661 4662
4662 hdev = hub->hdev; 4663 hdev = hub->hdev;
4663 udev = hub->ports[port - 1]->child; 4664 udev = port_dev->child;
4664 if (!hub_is_superspeed(hdev)) { 4665 if (!hub_is_superspeed(hdev)) {
4665 if (!(portchange & USB_PORT_STAT_C_SUSPEND)) 4666 if (!(portchange & USB_PORT_STAT_C_SUSPEND))
4666 return 0; 4667 return 0;
@@ -4685,8 +4686,7 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port,
4685 ret = -ENODEV; 4686 ret = -ENODEV;
4686 hub_port_disable(hub, port, 1); 4687 hub_port_disable(hub, port, 1);
4687 } 4688 }
4688 dev_dbg(hub->intfdev, "resume on port %d, status %d\n", 4689 dev_dbg(&port_dev->dev, "resume, status %d\n", ret);
4689 port, ret);
4690 return connect_change; 4690 return connect_change;
4691} 4691}
4692 4692
@@ -4776,7 +4776,8 @@ static void hub_events(void)
4776 4776
4777 /* deal with port status changes */ 4777 /* deal with port status changes */
4778 for (i = 1; i <= hdev->maxchild; i++) { 4778 for (i = 1; i <= hdev->maxchild; i++) {
4779 struct usb_device *udev = hub->ports[i - 1]->child; 4779 struct usb_port *port_dev = hub->ports[i - 1];
4780 struct usb_device *udev = port_dev->child;
4780 4781
4781 if (test_bit(i, hub->busy_bits)) 4782 if (test_bit(i, hub->busy_bits))
4782 continue; 4783 continue;
@@ -4799,10 +4800,9 @@ static void hub_events(void)
4799 4800
4800 if (portchange & USB_PORT_STAT_C_ENABLE) { 4801 if (portchange & USB_PORT_STAT_C_ENABLE) {
4801 if (!connect_change) 4802 if (!connect_change)
4802 dev_dbg (hub_dev, 4803 dev_dbg(&port_dev->dev,
4803 "port %d enable change, " 4804 "enable change, status %08x\n",
4804 "status %08x\n", 4805 portstatus);
4805 i, portstatus);
4806 usb_clear_port_feature(hdev, i, 4806 usb_clear_port_feature(hdev, i,
4807 USB_PORT_FEAT_C_ENABLE); 4807 USB_PORT_FEAT_C_ENABLE);
4808 4808
@@ -4813,13 +4813,9 @@ static void hub_events(void)
4813 * Works at least with mouse driver. 4813 * Works at least with mouse driver.
4814 */ 4814 */
4815 if (!(portstatus & USB_PORT_STAT_ENABLE) 4815 if (!(portstatus & USB_PORT_STAT_ENABLE)
4816 && !connect_change 4816 && !connect_change && udev) {
4817 && hub->ports[i - 1]->child) { 4817 dev_err(&port_dev->dev,
4818 dev_err (hub_dev, 4818 "disabled by hub (EMI?), re-enabling...\n");
4819 "port %i "
4820 "disabled by hub (EMI?), "
4821 "re-enabling...\n",
4822 i);
4823 connect_change = 1; 4819 connect_change = 1;
4824 } 4820 }
4825 } 4821 }
@@ -4832,30 +4828,25 @@ static void hub_events(void)
4832 u16 status = 0; 4828 u16 status = 0;
4833 u16 unused; 4829 u16 unused;
4834 4830
4835 dev_dbg(hub_dev, "over-current change on port " 4831 dev_dbg(&port_dev->dev, "over-current change\n");
4836 "%d\n", i);
4837 usb_clear_port_feature(hdev, i, 4832 usb_clear_port_feature(hdev, i,
4838 USB_PORT_FEAT_C_OVER_CURRENT); 4833 USB_PORT_FEAT_C_OVER_CURRENT);
4839 msleep(100); /* Cool down */ 4834 msleep(100); /* Cool down */
4840 hub_power_on(hub, true); 4835 hub_power_on(hub, true);
4841 hub_port_status(hub, i, &status, &unused); 4836 hub_port_status(hub, i, &status, &unused);
4842 if (status & USB_PORT_STAT_OVERCURRENT) 4837 if (status & USB_PORT_STAT_OVERCURRENT)
4843 dev_err(hub_dev, "over-current " 4838 dev_err(&port_dev->dev,
4844 "condition on port %d\n", i); 4839 "over-current condition\n");
4845 } 4840 }
4846 4841
4847 if (portchange & USB_PORT_STAT_C_RESET) { 4842 if (portchange & USB_PORT_STAT_C_RESET) {
4848 dev_dbg (hub_dev, 4843 dev_dbg(&port_dev->dev, "reset change\n");
4849 "reset change on port %d\n",
4850 i);
4851 usb_clear_port_feature(hdev, i, 4844 usb_clear_port_feature(hdev, i,
4852 USB_PORT_FEAT_C_RESET); 4845 USB_PORT_FEAT_C_RESET);
4853 } 4846 }
4854 if ((portchange & USB_PORT_STAT_C_BH_RESET) && 4847 if ((portchange & USB_PORT_STAT_C_BH_RESET) &&
4855 hub_is_superspeed(hub->hdev)) { 4848 hub_is_superspeed(hub->hdev)) {
4856 dev_dbg(hub_dev, 4849 dev_dbg(&port_dev->dev, "warm reset change\n");
4857 "warm reset change on port %d\n",
4858 i);
4859 usb_clear_port_feature(hdev, i, 4850 usb_clear_port_feature(hdev, i,
4860 USB_PORT_FEAT_C_BH_PORT_RESET); 4851 USB_PORT_FEAT_C_BH_PORT_RESET);
4861 } 4852 }
@@ -4864,9 +4855,7 @@ static void hub_events(void)
4864 USB_PORT_FEAT_C_PORT_LINK_STATE); 4855 USB_PORT_FEAT_C_PORT_LINK_STATE);
4865 } 4856 }
4866 if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) { 4857 if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) {
4867 dev_warn(hub_dev, 4858 dev_warn(&port_dev->dev, "config error\n");
4868 "config error on port %d\n",
4869 i);
4870 usb_clear_port_feature(hub->hdev, i, 4859 usb_clear_port_feature(hub->hdev, i,
4871 USB_PORT_FEAT_C_PORT_CONFIG_ERROR); 4860 USB_PORT_FEAT_C_PORT_CONFIG_ERROR);
4872 } 4861 }
@@ -4877,7 +4866,7 @@ static void hub_events(void)
4877 if (hub_port_warm_reset_required(hub, portstatus)) { 4866 if (hub_port_warm_reset_required(hub, portstatus)) {
4878 int status; 4867 int status;
4879 4868
4880 dev_dbg(hub_dev, "warm reset port %d\n", i); 4869 dev_dbg(&port_dev->dev, "warm reset\n");
4881 if (!udev || 4870 if (!udev ||
4882 !(portstatus & USB_PORT_STAT_CONNECTION) || 4871 !(portstatus & USB_PORT_STAT_CONNECTION) ||
4883 udev->state == USB_STATE_NOTATTACHED) { 4872 udev->state == USB_STATE_NOTATTACHED) {
@@ -5478,56 +5467,26 @@ struct usb_device *usb_hub_find_child(struct usb_device *hdev,
5478} 5467}
5479EXPORT_SYMBOL_GPL(usb_hub_find_child); 5468EXPORT_SYMBOL_GPL(usb_hub_find_child);
5480 5469
5481/**
5482 * usb_set_hub_port_connect_type - set hub port connect type.
5483 * @hdev: USB device belonging to the usb hub
5484 * @port1: port num of the port
5485 * @type: connect type of the port
5486 */
5487void usb_set_hub_port_connect_type(struct usb_device *hdev, int port1,
5488 enum usb_port_connect_type type)
5489{
5490 struct usb_hub *hub = usb_hub_to_struct_hub(hdev);
5491
5492 if (hub)
5493 hub->ports[port1 - 1]->connect_type = type;
5494}
5495
5496/**
5497 * usb_get_hub_port_connect_type - Get the port's connect type
5498 * @hdev: USB device belonging to the usb hub
5499 * @port1: port num of the port
5500 *
5501 * Return: The connect type of the port if successful. Or
5502 * USB_PORT_CONNECT_TYPE_UNKNOWN if input params are invalid.
5503 */
5504enum usb_port_connect_type
5505usb_get_hub_port_connect_type(struct usb_device *hdev, int port1)
5506{
5507 struct usb_hub *hub = usb_hub_to_struct_hub(hdev);
5508
5509 if (!hub)
5510 return USB_PORT_CONNECT_TYPE_UNKNOWN;
5511
5512 return hub->ports[port1 - 1]->connect_type;
5513}
5514
5515void usb_hub_adjust_deviceremovable(struct usb_device *hdev, 5470void usb_hub_adjust_deviceremovable(struct usb_device *hdev,
5516 struct usb_hub_descriptor *desc) 5471 struct usb_hub_descriptor *desc)
5517{ 5472{
5473 struct usb_hub *hub = usb_hub_to_struct_hub(hdev);
5518 enum usb_port_connect_type connect_type; 5474 enum usb_port_connect_type connect_type;
5519 int i; 5475 int i;
5520 5476
5477 if (!hub)
5478 return;
5479
5521 if (!hub_is_superspeed(hdev)) { 5480 if (!hub_is_superspeed(hdev)) {
5522 for (i = 1; i <= hdev->maxchild; i++) { 5481 for (i = 1; i <= hdev->maxchild; i++) {
5523 connect_type = usb_get_hub_port_connect_type(hdev, i); 5482 struct usb_port *port_dev = hub->ports[i - 1];
5524 5483
5484 connect_type = port_dev->connect_type;
5525 if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { 5485 if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) {
5526 u8 mask = 1 << (i%8); 5486 u8 mask = 1 << (i%8);
5527 5487
5528 if (!(desc->u.hs.DeviceRemovable[i/8] & mask)) { 5488 if (!(desc->u.hs.DeviceRemovable[i/8] & mask)) {
5529 dev_dbg(&hdev->dev, "usb port%d's DeviceRemovable is changed to 1 according to platform information.\n", 5489 dev_dbg(&port_dev->dev, "DeviceRemovable is changed to 1 according to platform information.\n");
5530 i);
5531 desc->u.hs.DeviceRemovable[i/8] |= mask; 5490 desc->u.hs.DeviceRemovable[i/8] |= mask;
5532 } 5491 }
5533 } 5492 }
@@ -5536,14 +5495,14 @@ void usb_hub_adjust_deviceremovable(struct usb_device *hdev,
5536 u16 port_removable = le16_to_cpu(desc->u.ss.DeviceRemovable); 5495 u16 port_removable = le16_to_cpu(desc->u.ss.DeviceRemovable);
5537 5496
5538 for (i = 1; i <= hdev->maxchild; i++) { 5497 for (i = 1; i <= hdev->maxchild; i++) {
5539 connect_type = usb_get_hub_port_connect_type(hdev, i); 5498 struct usb_port *port_dev = hub->ports[i - 1];
5540 5499
5500 connect_type = port_dev->connect_type;
5541 if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { 5501 if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) {
5542 u16 mask = 1 << i; 5502 u16 mask = 1 << i;
5543 5503
5544 if (!(port_removable & mask)) { 5504 if (!(port_removable & mask)) {
5545 dev_dbg(&hdev->dev, "usb port%d's DeviceRemovable is changed to 1 according to platform information.\n", 5505 dev_dbg(&port_dev->dev, "DeviceRemovable is changed to 1 according to platform information.\n");
5546 i);
5547 port_removable |= mask; 5506 port_removable |= mask;
5548 } 5507 }
5549 } 5508 }
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index 168fa6ee3348..6a8999728cbf 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -152,6 +152,11 @@ struct device_type usb_port_device_type = {
152 .pm = &usb_port_pm_ops, 152 .pm = &usb_port_pm_ops,
153}; 153};
154 154
155static struct device_driver usb_port_driver = {
156 .name = "usb",
157 .owner = THIS_MODULE,
158};
159
155int usb_hub_create_port_device(struct usb_hub *hub, int port1) 160int usb_hub_create_port_device(struct usb_hub *hub, int port1)
156{ 161{
157 struct usb_port *port_dev = NULL; 162 struct usb_port *port_dev = NULL;
@@ -169,8 +174,9 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
169 port_dev->dev.parent = hub->intfdev; 174 port_dev->dev.parent = hub->intfdev;
170 port_dev->dev.groups = port_dev_group; 175 port_dev->dev.groups = port_dev_group;
171 port_dev->dev.type = &usb_port_device_type; 176 port_dev->dev.type = &usb_port_device_type;
172 dev_set_name(&port_dev->dev, "port%d", port1); 177 port_dev->dev.driver = &usb_port_driver;
173 178 dev_set_name(&port_dev->dev, "%s-port%d", dev_name(&hub->hdev->dev),
179 port1);
174 retval = device_register(&port_dev->dev); 180 retval = device_register(&port_dev->dev);
175 if (retval) 181 if (retval)
176 goto error_register; 182 goto error_register;
diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c
index 5ca4070b1f38..f91ef0220066 100644
--- a/drivers/usb/core/usb-acpi.c
+++ b/drivers/usb/core/usb-acpi.c
@@ -17,7 +17,7 @@
17#include <linux/pci.h> 17#include <linux/pci.h>
18#include <linux/usb/hcd.h> 18#include <linux/usb/hcd.h>
19 19
20#include "usb.h" 20#include "hub.h"
21 21
22/** 22/**
23 * usb_acpi_power_manageable - check whether usb port has 23 * usb_acpi_power_manageable - check whether usb port has
@@ -55,13 +55,18 @@ EXPORT_SYMBOL_GPL(usb_acpi_power_manageable);
55 */ 55 */
56int usb_acpi_set_power_state(struct usb_device *hdev, int index, bool enable) 56int usb_acpi_set_power_state(struct usb_device *hdev, int index, bool enable)
57{ 57{
58 struct usb_hub *hub = usb_hub_to_struct_hub(hdev);
59 struct usb_port *port_dev;
58 acpi_handle port_handle; 60 acpi_handle port_handle;
59 unsigned char state; 61 unsigned char state;
60 int port1 = index + 1; 62 int port1 = index + 1;
61 int error = -EINVAL; 63 int error = -EINVAL;
62 64
63 port_handle = (acpi_handle)usb_get_hub_port_acpi_handle(hdev, 65 if (!hub)
64 port1); 66 return -ENODEV;
67 port_dev = hub->ports[port1 - 1];
68
69 port_handle = (acpi_handle) usb_get_hub_port_acpi_handle(hdev, port1);
65 if (!port_handle) 70 if (!port_handle)
66 return error; 71 return error;
67 72
@@ -72,10 +77,9 @@ int usb_acpi_set_power_state(struct usb_device *hdev, int index, bool enable)
72 77
73 error = acpi_bus_set_power(port_handle, state); 78 error = acpi_bus_set_power(port_handle, state);
74 if (!error) 79 if (!error)
75 dev_dbg(&hdev->dev, "The power of hub port %d was set to %d\n", 80 dev_dbg(&port_dev->dev, "acpi: power was set to %d\n", enable);
76 port1, enable);
77 else 81 else
78 dev_dbg(&hdev->dev, "The power of hub port failed to be set\n"); 82 dev_dbg(&port_dev->dev, "acpi: power failed to be set\n");
79 83
80 return error; 84 return error;
81} 85}
@@ -84,12 +88,17 @@ EXPORT_SYMBOL_GPL(usb_acpi_set_power_state);
84static int usb_acpi_check_port_connect_type(struct usb_device *hdev, 88static int usb_acpi_check_port_connect_type(struct usb_device *hdev,
85 acpi_handle handle, int port1) 89 acpi_handle handle, int port1)
86{ 90{
87 acpi_status status; 91 enum usb_port_connect_type connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN;
88 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 92 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
89 union acpi_object *upc; 93 struct usb_hub *hub = usb_hub_to_struct_hub(hdev);
90 struct acpi_pld_info *pld; 94 struct acpi_pld_info *pld;
95 union acpi_object *upc;
96 acpi_status status;
91 int ret = 0; 97 int ret = 0;
92 98
99 if (!hub)
100 return 0;
101
93 /* 102 /*
94 * According to ACPI Spec 9.13. PLD indicates whether usb port is 103 * According to ACPI Spec 9.13. PLD indicates whether usb port is
95 * user visible and _UPC indicates whether it is connectable. If 104 * user visible and _UPC indicates whether it is connectable. If
@@ -112,13 +121,12 @@ static int usb_acpi_check_port_connect_type(struct usb_device *hdev,
112 121
113 if (upc->package.elements[0].integer.value) 122 if (upc->package.elements[0].integer.value)
114 if (pld->user_visible) 123 if (pld->user_visible)
115 usb_set_hub_port_connect_type(hdev, port1, 124 connect_type = USB_PORT_CONNECT_TYPE_HOT_PLUG;
116 USB_PORT_CONNECT_TYPE_HOT_PLUG);
117 else 125 else
118 usb_set_hub_port_connect_type(hdev, port1, 126 connect_type = USB_PORT_CONNECT_TYPE_HARD_WIRED;
119 USB_PORT_CONNECT_TYPE_HARD_WIRED);
120 else if (!pld->user_visible) 127 else if (!pld->user_visible)
121 usb_set_hub_port_connect_type(hdev, port1, USB_PORT_NOT_USED); 128 connect_type = USB_PORT_NOT_USED;
129 hub->ports[port1 - 1]->connect_type = connect_type;
122 130
123out: 131out:
124 ACPI_FREE(pld); 132 ACPI_FREE(pld);
@@ -128,9 +136,9 @@ out:
128 136
129static struct acpi_device *usb_acpi_find_companion(struct device *dev) 137static struct acpi_device *usb_acpi_find_companion(struct device *dev)
130{ 138{
139 int port1;
131 struct usb_device *udev; 140 struct usb_device *udev;
132 acpi_handle *parent_handle; 141 acpi_handle *parent_handle;
133 int port_num;
134 142
135 /* 143 /*
136 * In the ACPI DSDT table, only usb root hub and usb ports are 144 * In the ACPI DSDT table, only usb root hub and usb ports are
@@ -147,16 +155,16 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)
147 */ 155 */
148 if (is_usb_device(dev)) { 156 if (is_usb_device(dev)) {
149 udev = to_usb_device(dev); 157 udev = to_usb_device(dev);
158 port1 = udev->portnum;
150 if (udev->parent) { 159 if (udev->parent) {
151 enum usb_port_connect_type type; 160 struct usb_hub *hub;
152 161
162 hub = usb_hub_to_struct_hub(udev->parent);
153 /* 163 /*
154 * According usb port's connect type to set usb device's 164 * According usb port's connect type to set usb device's
155 * removability. 165 * removability.
156 */ 166 */
157 type = usb_get_hub_port_connect_type(udev->parent, 167 switch (hub->ports[port1 - 1]->connect_type) {
158 udev->portnum);
159 switch (type) {
160 case USB_PORT_CONNECT_TYPE_HOT_PLUG: 168 case USB_PORT_CONNECT_TYPE_HOT_PLUG:
161 udev->removable = USB_DEVICE_REMOVABLE; 169 udev->removable = USB_DEVICE_REMOVABLE;
162 break; 170 break;
@@ -173,13 +181,14 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)
173 181
174 /* root hub's parent is the usb hcd. */ 182 /* root hub's parent is the usb hcd. */
175 return acpi_find_child_device(ACPI_COMPANION(dev->parent), 183 return acpi_find_child_device(ACPI_COMPANION(dev->parent),
176 udev->portnum, false); 184 port1, false);
177 } else if (is_usb_port(dev)) { 185 } else if (is_usb_port(dev)) {
186 struct usb_port *port_dev = to_usb_port(dev);
178 struct acpi_device *adev = NULL; 187 struct acpi_device *adev = NULL;
179 188
180 sscanf(dev_name(dev), "port%d", &port_num);
181 /* Get the struct usb_device point of port's hub */ 189 /* Get the struct usb_device point of port's hub */
182 udev = to_usb_device(dev->parent->parent); 190 udev = to_usb_device(dev->parent->parent);
191 port1 = port_dev->portnum;
183 192
184 /* 193 /*
185 * The root hub ports' parent is the root hub. The non-root-hub 194 * The root hub ports' parent is the root hub. The non-root-hub
@@ -188,12 +197,11 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)
188 */ 197 */
189 if (!udev->parent) { 198 if (!udev->parent) {
190 struct usb_hcd *hcd = bus_to_hcd(udev->bus); 199 struct usb_hcd *hcd = bus_to_hcd(udev->bus);
191 int raw_port_num; 200 int raw;
192 201
193 raw_port_num = usb_hcd_find_raw_port_number(hcd, 202 raw = usb_hcd_find_raw_port_number(hcd, port1);
194 port_num);
195 adev = acpi_find_child_device(ACPI_COMPANION(&udev->dev), 203 adev = acpi_find_child_device(ACPI_COMPANION(&udev->dev),
196 raw_port_num, false); 204 raw, false);
197 if (!adev) 205 if (!adev)
198 return NULL; 206 return NULL;
199 } else { 207 } else {
@@ -204,11 +212,11 @@ static struct acpi_device *usb_acpi_find_companion(struct device *dev)
204 return NULL; 212 return NULL;
205 213
206 acpi_bus_get_device(parent_handle, &adev); 214 acpi_bus_get_device(parent_handle, &adev);
207 adev = acpi_find_child_device(adev, port_num, false); 215 adev = acpi_find_child_device(adev, port1, false);
208 if (!adev) 216 if (!adev)
209 return NULL; 217 return NULL;
210 } 218 }
211 usb_acpi_check_port_connect_type(udev, adev->handle, port_num); 219 usb_acpi_check_port_connect_type(udev, adev->handle, port1);
212 return adev; 220 return adev;
213 } 221 }
214 222
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 75bf649da82d..69bfc253a7b8 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -175,10 +175,6 @@ extern void usb_notify_add_device(struct usb_device *udev);
175extern void usb_notify_remove_device(struct usb_device *udev); 175extern void usb_notify_remove_device(struct usb_device *udev);
176extern void usb_notify_add_bus(struct usb_bus *ubus); 176extern void usb_notify_add_bus(struct usb_bus *ubus);
177extern void usb_notify_remove_bus(struct usb_bus *ubus); 177extern void usb_notify_remove_bus(struct usb_bus *ubus);
178extern enum usb_port_connect_type
179 usb_get_hub_port_connect_type(struct usb_device *hdev, int port1);
180extern void usb_set_hub_port_connect_type(struct usb_device *hdev, int port1,
181 enum usb_port_connect_type type);
182extern void usb_hub_adjust_deviceremovable(struct usb_device *hdev, 178extern void usb_hub_adjust_deviceremovable(struct usb_device *hdev,
183 struct usb_hub_descriptor *desc); 179 struct usb_hub_descriptor *desc);
184 180