diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-08 14:31:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-08 14:31:16 -0400 |
commit | 3f17ea6dea8ba5668873afa54628a91aaa3fb1c0 (patch) | |
tree | afbeb2accd4c2199ddd705ae943995b143a0af02 /drivers/usb/core/hub.c | |
parent | 1860e379875dfe7271c649058aeddffe5afd9d0d (diff) | |
parent | 1a5700bc2d10cd379a795fd2bb377a190af5acd4 (diff) |
Merge branch 'next' (accumulated 3.16 merge window patches) into master
Now that 3.15 is released, this merges the 'next' branch into 'master',
bringing us to the normal situation where my 'master' branch is the
merge window.
* accumulated work in next: (6809 commits)
ufs: sb mutex merge + mutex_destroy
powerpc: update comments for generic idle conversion
cris: update comments for generic idle conversion
idle: remove cpu_idle() forward declarations
nbd: zero from and len fields in NBD_CMD_DISCONNECT.
mm: convert some level-less printks to pr_*
MAINTAINERS: adi-buildroot-devel is moderated
MAINTAINERS: add linux-api for review of API/ABI changes
mm/kmemleak-test.c: use pr_fmt for logging
fs/dlm/debug_fs.c: replace seq_printf by seq_puts
fs/dlm/lockspace.c: convert simple_str to kstr
fs/dlm/config.c: convert simple_str to kstr
mm: mark remap_file_pages() syscall as deprecated
mm: memcontrol: remove unnecessary memcg argument from soft limit functions
mm: memcontrol: clean up memcg zoneinfo lookup
mm/memblock.c: call kmemleak directly from memblock_(alloc|free)
mm/mempool.c: update the kmemleak stack trace for mempool allocations
lib/radix-tree.c: update the kmemleak stack trace for radix tree allocations
mm: introduce kmemleak_update_trace()
mm/kmemleak.c: use %u to print ->checksum
...
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r-- | drivers/usb/core/hub.c | 956 |
1 files changed, 511 insertions, 445 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 229a73f64304..879b66e13370 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -36,11 +36,6 @@ | |||
36 | #define USB_VENDOR_GENESYS_LOGIC 0x05e3 | 36 | #define USB_VENDOR_GENESYS_LOGIC 0x05e3 |
37 | #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 | 37 | #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 |
38 | 38 | ||
39 | static inline int hub_is_superspeed(struct usb_device *hdev) | ||
40 | { | ||
41 | return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS); | ||
42 | } | ||
43 | |||
44 | /* Protect struct usb_device->state and ->children members | 39 | /* Protect struct usb_device->state and ->children members |
45 | * Note: Both are also protected by ->dev.sem, except that ->state can | 40 | * Note: Both are also protected by ->dev.sem, except that ->state can |
46 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ | 41 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ |
@@ -55,6 +50,9 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | |||
55 | 50 | ||
56 | static struct task_struct *khubd_task; | 51 | static struct task_struct *khubd_task; |
57 | 52 | ||
53 | /* synchronize hub-port add/remove and peering operations */ | ||
54 | DEFINE_MUTEX(usb_port_peer_mutex); | ||
55 | |||
58 | /* cycle leds on hubs that aren't blinking for attention */ | 56 | /* cycle leds on hubs that aren't blinking for attention */ |
59 | static bool blinkenlights = 0; | 57 | static bool blinkenlights = 0; |
60 | module_param (blinkenlights, bool, S_IRUGO); | 58 | module_param (blinkenlights, bool, S_IRUGO); |
@@ -412,30 +410,35 @@ static int set_port_feature(struct usb_device *hdev, int port1, int feature) | |||
412 | NULL, 0, 1000); | 410 | NULL, 0, 1000); |
413 | } | 411 | } |
414 | 412 | ||
413 | static char *to_led_name(int selector) | ||
414 | { | ||
415 | switch (selector) { | ||
416 | case HUB_LED_AMBER: | ||
417 | return "amber"; | ||
418 | case HUB_LED_GREEN: | ||
419 | return "green"; | ||
420 | case HUB_LED_OFF: | ||
421 | return "off"; | ||
422 | case HUB_LED_AUTO: | ||
423 | return "auto"; | ||
424 | default: | ||
425 | return "??"; | ||
426 | } | ||
427 | } | ||
428 | |||
415 | /* | 429 | /* |
416 | * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 | 430 | * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 |
417 | * for info about using port indicators | 431 | * for info about using port indicators |
418 | */ | 432 | */ |
419 | static void set_port_led( | 433 | static 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 | { | 434 | { |
425 | int status = set_port_feature(hub->hdev, (selector << 8) | port1, | 435 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
436 | int status; | ||
437 | |||
438 | status = set_port_feature(hub->hdev, (selector << 8) | port1, | ||
426 | USB_PORT_FEAT_INDICATOR); | 439 | USB_PORT_FEAT_INDICATOR); |
427 | if (status < 0) | 440 | dev_dbg(&port_dev->dev, "indicator %s status %d\n", |
428 | dev_dbg (hub->intfdev, | 441 | 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 | } | 442 | } |
440 | 443 | ||
441 | #define LED_CYCLE_PERIOD ((2*HZ)/3) | 444 | #define LED_CYCLE_PERIOD ((2*HZ)/3) |
@@ -743,16 +746,20 @@ int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub, | |||
743 | int port1, bool set) | 746 | int port1, bool set) |
744 | { | 747 | { |
745 | int ret; | 748 | int ret; |
746 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
747 | 749 | ||
748 | if (set) | 750 | if (set) |
749 | ret = set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); | 751 | ret = set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); |
750 | else | 752 | else |
751 | ret = usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_POWER); | 753 | ret = usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_POWER); |
752 | 754 | ||
753 | if (!ret) | 755 | if (ret) |
754 | port_dev->power_is_on = set; | 756 | return ret; |
755 | return ret; | 757 | |
758 | if (set) | ||
759 | set_bit(port1, hub->power_bits); | ||
760 | else | ||
761 | clear_bit(port1, hub->power_bits); | ||
762 | return 0; | ||
756 | } | 763 | } |
757 | 764 | ||
758 | /** | 765 | /** |
@@ -810,16 +817,9 @@ int usb_hub_clear_tt_buffer(struct urb *urb) | |||
810 | } | 817 | } |
811 | EXPORT_SYMBOL_GPL(usb_hub_clear_tt_buffer); | 818 | EXPORT_SYMBOL_GPL(usb_hub_clear_tt_buffer); |
812 | 819 | ||
813 | /* If do_delay is false, return the number of milliseconds the caller | 820 | static void hub_power_on(struct usb_hub *hub, bool do_delay) |
814 | * needs to delay. | ||
815 | */ | ||
816 | static unsigned hub_power_on(struct usb_hub *hub, bool do_delay) | ||
817 | { | 821 | { |
818 | int port1; | 822 | int port1; |
819 | unsigned pgood_delay = hub->descriptor->bPwrOn2PwrGood * 2; | ||
820 | unsigned delay; | ||
821 | u16 wHubCharacteristics = | ||
822 | le16_to_cpu(hub->descriptor->wHubCharacteristics); | ||
823 | 823 | ||
824 | /* Enable power on each port. Some hubs have reserved values | 824 | /* Enable power on each port. Some hubs have reserved values |
825 | * of LPSM (> 2) in their descriptors, even though they are | 825 | * of LPSM (> 2) in their descriptors, even though they are |
@@ -827,23 +827,19 @@ static unsigned hub_power_on(struct usb_hub *hub, bool do_delay) | |||
827 | * but only emulate it. In all cases, the ports won't work | 827 | * but only emulate it. In all cases, the ports won't work |
828 | * unless we send these messages to the hub. | 828 | * unless we send these messages to the hub. |
829 | */ | 829 | */ |
830 | if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) | 830 | if (hub_is_port_power_switchable(hub)) |
831 | dev_dbg(hub->intfdev, "enabling power on all ports\n"); | 831 | dev_dbg(hub->intfdev, "enabling power on all ports\n"); |
832 | else | 832 | else |
833 | dev_dbg(hub->intfdev, "trying to enable port power on " | 833 | dev_dbg(hub->intfdev, "trying to enable port power on " |
834 | "non-switchable hub\n"); | 834 | "non-switchable hub\n"); |
835 | for (port1 = 1; port1 <= hub->hdev->maxchild; port1++) | 835 | for (port1 = 1; port1 <= hub->hdev->maxchild; port1++) |
836 | if (hub->ports[port1 - 1]->power_is_on) | 836 | if (test_bit(port1, hub->power_bits)) |
837 | set_port_feature(hub->hdev, port1, USB_PORT_FEAT_POWER); | 837 | set_port_feature(hub->hdev, port1, USB_PORT_FEAT_POWER); |
838 | else | 838 | else |
839 | usb_clear_port_feature(hub->hdev, port1, | 839 | usb_clear_port_feature(hub->hdev, port1, |
840 | USB_PORT_FEAT_POWER); | 840 | USB_PORT_FEAT_POWER); |
841 | |||
842 | /* Wait at least 100 msec for power to become stable */ | ||
843 | delay = max(pgood_delay, (unsigned) 100); | ||
844 | if (do_delay) | 841 | if (do_delay) |
845 | msleep(delay); | 842 | msleep(hub_power_on_good_delay(hub)); |
846 | return delay; | ||
847 | } | 843 | } |
848 | 844 | ||
849 | static int hub_hub_status(struct usb_hub *hub, | 845 | static int hub_hub_status(struct usb_hub *hub, |
@@ -911,20 +907,20 @@ static int hub_usb3_port_disable(struct usb_hub *hub, int port1) | |||
911 | msleep(HUB_DEBOUNCE_STEP); | 907 | msleep(HUB_DEBOUNCE_STEP); |
912 | } | 908 | } |
913 | if (total_time >= HUB_DEBOUNCE_TIMEOUT) | 909 | if (total_time >= HUB_DEBOUNCE_TIMEOUT) |
914 | dev_warn(hub->intfdev, "Could not disable port %d after %d ms\n", | 910 | dev_warn(&hub->ports[port1 - 1]->dev, |
915 | port1, total_time); | 911 | "Could not disable after %d ms\n", total_time); |
916 | 912 | ||
917 | return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT); | 913 | return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT); |
918 | } | 914 | } |
919 | 915 | ||
920 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | 916 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) |
921 | { | 917 | { |
918 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
922 | struct usb_device *hdev = hub->hdev; | 919 | struct usb_device *hdev = hub->hdev; |
923 | int ret = 0; | 920 | int ret = 0; |
924 | 921 | ||
925 | if (hub->ports[port1 - 1]->child && set_state) | 922 | if (port_dev->child && set_state) |
926 | usb_set_device_state(hub->ports[port1 - 1]->child, | 923 | usb_set_device_state(port_dev->child, USB_STATE_NOTATTACHED); |
927 | USB_STATE_NOTATTACHED); | ||
928 | if (!hub->error) { | 924 | if (!hub->error) { |
929 | if (hub_is_superspeed(hub->hdev)) | 925 | if (hub_is_superspeed(hub->hdev)) |
930 | ret = hub_usb3_port_disable(hub, port1); | 926 | ret = hub_usb3_port_disable(hub, port1); |
@@ -933,8 +929,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | |||
933 | USB_PORT_FEAT_ENABLE); | 929 | USB_PORT_FEAT_ENABLE); |
934 | } | 930 | } |
935 | if (ret && ret != -ENODEV) | 931 | if (ret && ret != -ENODEV) |
936 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | 932 | dev_err(&port_dev->dev, "cannot disable (err = %d)\n", ret); |
937 | port1, ret); | ||
938 | return ret; | 933 | return ret; |
939 | } | 934 | } |
940 | 935 | ||
@@ -945,7 +940,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | |||
945 | */ | 940 | */ |
946 | static void hub_port_logical_disconnect(struct usb_hub *hub, int port1) | 941 | static void hub_port_logical_disconnect(struct usb_hub *hub, int port1) |
947 | { | 942 | { |
948 | dev_dbg(hub->intfdev, "logical disconnect on port %d\n", port1); | 943 | dev_dbg(&hub->ports[port1 - 1]->dev, "logical disconnect\n"); |
949 | hub_port_disable(hub, port1, 1); | 944 | hub_port_disable(hub, port1, 1); |
950 | 945 | ||
951 | /* FIXME let caller ask to power down the port: | 946 | /* FIXME let caller ask to power down the port: |
@@ -1048,7 +1043,9 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
1048 | * for HUB_POST_RESET, but it's easier not to. | 1043 | * for HUB_POST_RESET, but it's easier not to. |
1049 | */ | 1044 | */ |
1050 | if (type == HUB_INIT) { | 1045 | if (type == HUB_INIT) { |
1051 | delay = hub_power_on(hub, false); | 1046 | unsigned delay = hub_power_on_good_delay(hub); |
1047 | |||
1048 | hub_power_on(hub, false); | ||
1052 | INIT_DELAYED_WORK(&hub->init_work, hub_init_func2); | 1049 | INIT_DELAYED_WORK(&hub->init_work, hub_init_func2); |
1053 | queue_delayed_work(system_power_efficient_wq, | 1050 | queue_delayed_work(system_power_efficient_wq, |
1054 | &hub->init_work, | 1051 | &hub->init_work, |
@@ -1083,21 +1080,23 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
1083 | } | 1080 | } |
1084 | init2: | 1081 | init2: |
1085 | 1082 | ||
1086 | /* Check each port and set hub->change_bits to let khubd know | 1083 | /* |
1084 | * Check each port and set hub->change_bits to let khubd know | ||
1087 | * which ports need attention. | 1085 | * which ports need attention. |
1088 | */ | 1086 | */ |
1089 | for (port1 = 1; port1 <= hdev->maxchild; ++port1) { | 1087 | for (port1 = 1; port1 <= hdev->maxchild; ++port1) { |
1090 | struct usb_device *udev = hub->ports[port1 - 1]->child; | 1088 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
1089 | struct usb_device *udev = port_dev->child; | ||
1091 | u16 portstatus, portchange; | 1090 | u16 portstatus, portchange; |
1092 | 1091 | ||
1093 | portstatus = portchange = 0; | 1092 | portstatus = portchange = 0; |
1094 | status = hub_port_status(hub, port1, &portstatus, &portchange); | 1093 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
1095 | if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) | 1094 | if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) |
1096 | dev_dbg(hub->intfdev, | 1095 | dev_dbg(&port_dev->dev, "status %04x change %04x\n", |
1097 | "port %d: status %04x change %04x\n", | 1096 | portstatus, portchange); |
1098 | port1, portstatus, portchange); | ||
1099 | 1097 | ||
1100 | /* After anything other than HUB_RESUME (i.e., initialization | 1098 | /* |
1099 | * After anything other than HUB_RESUME (i.e., initialization | ||
1101 | * or any sort of reset), every port should be disabled. | 1100 | * or any sort of reset), every port should be disabled. |
1102 | * Unconnected ports should likewise be disabled (paranoia), | 1101 | * Unconnected ports should likewise be disabled (paranoia), |
1103 | * and so should ports for which we have no usb_device. | 1102 | * and so should ports for which we have no usb_device. |
@@ -1173,15 +1172,13 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
1173 | set_bit(port1, hub->change_bits); | 1172 | set_bit(port1, hub->change_bits); |
1174 | 1173 | ||
1175 | } else if (udev->persist_enabled) { | 1174 | } else if (udev->persist_enabled) { |
1176 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
1177 | |||
1178 | #ifdef CONFIG_PM | 1175 | #ifdef CONFIG_PM |
1179 | udev->reset_resume = 1; | 1176 | udev->reset_resume = 1; |
1180 | #endif | 1177 | #endif |
1181 | /* Don't set the change_bits when the device | 1178 | /* Don't set the change_bits when the device |
1182 | * was powered off. | 1179 | * was powered off. |
1183 | */ | 1180 | */ |
1184 | if (port_dev->power_is_on) | 1181 | if (test_bit(port1, hub->power_bits)) |
1185 | set_bit(port1, hub->change_bits); | 1182 | set_bit(port1, hub->change_bits); |
1186 | 1183 | ||
1187 | } else { | 1184 | } else { |
@@ -1276,12 +1273,22 @@ static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type) | |||
1276 | flush_work(&hub->tt.clear_work); | 1273 | flush_work(&hub->tt.clear_work); |
1277 | } | 1274 | } |
1278 | 1275 | ||
1276 | static void hub_pm_barrier_for_all_ports(struct usb_hub *hub) | ||
1277 | { | ||
1278 | int i; | ||
1279 | |||
1280 | for (i = 0; i < hub->hdev->maxchild; ++i) | ||
1281 | pm_runtime_barrier(&hub->ports[i]->dev); | ||
1282 | } | ||
1283 | |||
1279 | /* caller has locked the hub device */ | 1284 | /* caller has locked the hub device */ |
1280 | static int hub_pre_reset(struct usb_interface *intf) | 1285 | static int hub_pre_reset(struct usb_interface *intf) |
1281 | { | 1286 | { |
1282 | struct usb_hub *hub = usb_get_intfdata(intf); | 1287 | struct usb_hub *hub = usb_get_intfdata(intf); |
1283 | 1288 | ||
1284 | hub_quiesce(hub, HUB_PRE_RESET); | 1289 | hub_quiesce(hub, HUB_PRE_RESET); |
1290 | hub->in_reset = 1; | ||
1291 | hub_pm_barrier_for_all_ports(hub); | ||
1285 | return 0; | 1292 | return 0; |
1286 | } | 1293 | } |
1287 | 1294 | ||
@@ -1290,6 +1297,8 @@ static int hub_post_reset(struct usb_interface *intf) | |||
1290 | { | 1297 | { |
1291 | struct usb_hub *hub = usb_get_intfdata(intf); | 1298 | struct usb_hub *hub = usb_get_intfdata(intf); |
1292 | 1299 | ||
1300 | hub->in_reset = 0; | ||
1301 | hub_pm_barrier_for_all_ports(hub); | ||
1293 | hub_activate(hub, HUB_POST_RESET); | 1302 | hub_activate(hub, HUB_POST_RESET); |
1294 | return 0; | 1303 | return 0; |
1295 | } | 1304 | } |
@@ -1307,6 +1316,7 @@ static int hub_configure(struct usb_hub *hub, | |||
1307 | char *message = "out of memory"; | 1316 | char *message = "out of memory"; |
1308 | unsigned unit_load; | 1317 | unsigned unit_load; |
1309 | unsigned full_load; | 1318 | unsigned full_load; |
1319 | unsigned maxchild; | ||
1310 | 1320 | ||
1311 | hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_KERNEL); | 1321 | hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_KERNEL); |
1312 | if (!hub->buffer) { | 1322 | if (!hub->buffer) { |
@@ -1345,12 +1355,11 @@ static int hub_configure(struct usb_hub *hub, | |||
1345 | goto fail; | 1355 | goto fail; |
1346 | } | 1356 | } |
1347 | 1357 | ||
1348 | hdev->maxchild = hub->descriptor->bNbrPorts; | 1358 | maxchild = hub->descriptor->bNbrPorts; |
1349 | dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild, | 1359 | dev_info(hub_dev, "%d port%s detected\n", maxchild, |
1350 | (hdev->maxchild == 1) ? "" : "s"); | 1360 | (maxchild == 1) ? "" : "s"); |
1351 | 1361 | ||
1352 | hub->ports = kzalloc(hdev->maxchild * sizeof(struct usb_port *), | 1362 | hub->ports = kzalloc(maxchild * sizeof(struct usb_port *), GFP_KERNEL); |
1353 | GFP_KERNEL); | ||
1354 | if (!hub->ports) { | 1363 | if (!hub->ports) { |
1355 | ret = -ENOMEM; | 1364 | ret = -ENOMEM; |
1356 | goto fail; | 1365 | goto fail; |
@@ -1371,11 +1380,11 @@ static int hub_configure(struct usb_hub *hub, | |||
1371 | int i; | 1380 | int i; |
1372 | char portstr[USB_MAXCHILDREN + 1]; | 1381 | char portstr[USB_MAXCHILDREN + 1]; |
1373 | 1382 | ||
1374 | for (i = 0; i < hdev->maxchild; i++) | 1383 | for (i = 0; i < maxchild; i++) |
1375 | portstr[i] = hub->descriptor->u.hs.DeviceRemovable | 1384 | portstr[i] = hub->descriptor->u.hs.DeviceRemovable |
1376 | [((i + 1) / 8)] & (1 << ((i + 1) % 8)) | 1385 | [((i + 1) / 8)] & (1 << ((i + 1) % 8)) |
1377 | ? 'F' : 'R'; | 1386 | ? 'F' : 'R'; |
1378 | portstr[hdev->maxchild] = 0; | 1387 | portstr[maxchild] = 0; |
1379 | dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr); | 1388 | dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr); |
1380 | } else | 1389 | } else |
1381 | dev_dbg(hub_dev, "standalone hub\n"); | 1390 | dev_dbg(hub_dev, "standalone hub\n"); |
@@ -1487,7 +1496,7 @@ static int hub_configure(struct usb_hub *hub, | |||
1487 | if (hcd->power_budget > 0) | 1496 | if (hcd->power_budget > 0) |
1488 | hdev->bus_mA = hcd->power_budget; | 1497 | hdev->bus_mA = hcd->power_budget; |
1489 | else | 1498 | else |
1490 | hdev->bus_mA = full_load * hdev->maxchild; | 1499 | hdev->bus_mA = full_load * maxchild; |
1491 | if (hdev->bus_mA >= full_load) | 1500 | if (hdev->bus_mA >= full_load) |
1492 | hub->mA_per_port = full_load; | 1501 | hub->mA_per_port = full_load; |
1493 | else { | 1502 | else { |
@@ -1502,7 +1511,7 @@ static int hub_configure(struct usb_hub *hub, | |||
1502 | hub->descriptor->bHubContrCurrent); | 1511 | hub->descriptor->bHubContrCurrent); |
1503 | hub->limited_power = 1; | 1512 | hub->limited_power = 1; |
1504 | 1513 | ||
1505 | if (remaining < hdev->maxchild * unit_load) | 1514 | if (remaining < maxchild * unit_load) |
1506 | dev_warn(hub_dev, | 1515 | dev_warn(hub_dev, |
1507 | "insufficient power available " | 1516 | "insufficient power available " |
1508 | "to use all downstream ports\n"); | 1517 | "to use all downstream ports\n"); |
@@ -1570,15 +1579,19 @@ static int hub_configure(struct usb_hub *hub, | |||
1570 | if (hub->has_indicators && blinkenlights) | 1579 | if (hub->has_indicators && blinkenlights) |
1571 | hub->indicator[0] = INDICATOR_CYCLE; | 1580 | hub->indicator[0] = INDICATOR_CYCLE; |
1572 | 1581 | ||
1573 | for (i = 0; i < hdev->maxchild; i++) { | 1582 | mutex_lock(&usb_port_peer_mutex); |
1583 | for (i = 0; i < maxchild; i++) { | ||
1574 | ret = usb_hub_create_port_device(hub, i + 1); | 1584 | ret = usb_hub_create_port_device(hub, i + 1); |
1575 | if (ret < 0) { | 1585 | if (ret < 0) { |
1576 | dev_err(hub->intfdev, | 1586 | dev_err(hub->intfdev, |
1577 | "couldn't create port%d device.\n", i + 1); | 1587 | "couldn't create port%d device.\n", i + 1); |
1578 | hdev->maxchild = i; | 1588 | break; |
1579 | goto fail_keep_maxchild; | ||
1580 | } | 1589 | } |
1581 | } | 1590 | } |
1591 | hdev->maxchild = i; | ||
1592 | mutex_unlock(&usb_port_peer_mutex); | ||
1593 | if (ret < 0) | ||
1594 | goto fail; | ||
1582 | 1595 | ||
1583 | usb_hub_adjust_deviceremovable(hdev, hub->descriptor); | 1596 | usb_hub_adjust_deviceremovable(hdev, hub->descriptor); |
1584 | 1597 | ||
@@ -1586,8 +1599,6 @@ static int hub_configure(struct usb_hub *hub, | |||
1586 | return 0; | 1599 | return 0; |
1587 | 1600 | ||
1588 | fail: | 1601 | fail: |
1589 | hdev->maxchild = 0; | ||
1590 | fail_keep_maxchild: | ||
1591 | dev_err (hub_dev, "config failed, %s (err %d)\n", | 1602 | dev_err (hub_dev, "config failed, %s (err %d)\n", |
1592 | message, ret); | 1603 | message, ret); |
1593 | /* hub_disconnect() frees urb and descriptor */ | 1604 | /* hub_disconnect() frees urb and descriptor */ |
@@ -1623,6 +1634,8 @@ static void hub_disconnect(struct usb_interface *intf) | |||
1623 | hub->error = 0; | 1634 | hub->error = 0; |
1624 | hub_quiesce(hub, HUB_DISCONNECT); | 1635 | hub_quiesce(hub, HUB_DISCONNECT); |
1625 | 1636 | ||
1637 | mutex_lock(&usb_port_peer_mutex); | ||
1638 | |||
1626 | /* Avoid races with recursively_mark_NOTATTACHED() */ | 1639 | /* Avoid races with recursively_mark_NOTATTACHED() */ |
1627 | spin_lock_irq(&device_state_lock); | 1640 | spin_lock_irq(&device_state_lock); |
1628 | port1 = hdev->maxchild; | 1641 | port1 = hdev->maxchild; |
@@ -1633,6 +1646,8 @@ static void hub_disconnect(struct usb_interface *intf) | |||
1633 | for (; port1 > 0; --port1) | 1646 | for (; port1 > 0; --port1) |
1634 | usb_hub_remove_port_device(hub, port1); | 1647 | usb_hub_remove_port_device(hub, port1); |
1635 | 1648 | ||
1649 | mutex_unlock(&usb_port_peer_mutex); | ||
1650 | |||
1636 | if (hub->hdev->speed == USB_SPEED_HIGH) | 1651 | if (hub->hdev->speed == USB_SPEED_HIGH) |
1637 | highspeed_hubs--; | 1652 | highspeed_hubs--; |
1638 | 1653 | ||
@@ -2035,6 +2050,18 @@ static void hub_free_dev(struct usb_device *udev) | |||
2035 | hcd->driver->free_dev(hcd, udev); | 2050 | hcd->driver->free_dev(hcd, udev); |
2036 | } | 2051 | } |
2037 | 2052 | ||
2053 | static void hub_disconnect_children(struct usb_device *udev) | ||
2054 | { | ||
2055 | struct usb_hub *hub = usb_hub_to_struct_hub(udev); | ||
2056 | int i; | ||
2057 | |||
2058 | /* Free up all the children before we remove this device */ | ||
2059 | for (i = 0; i < udev->maxchild; i++) { | ||
2060 | if (hub->ports[i]->child) | ||
2061 | usb_disconnect(&hub->ports[i]->child); | ||
2062 | } | ||
2063 | } | ||
2064 | |||
2038 | /** | 2065 | /** |
2039 | * usb_disconnect - disconnect a device (usbcore-internal) | 2066 | * usb_disconnect - disconnect a device (usbcore-internal) |
2040 | * @pdev: pointer to device being disconnected | 2067 | * @pdev: pointer to device being disconnected |
@@ -2053,9 +2080,10 @@ static void hub_free_dev(struct usb_device *udev) | |||
2053 | */ | 2080 | */ |
2054 | void usb_disconnect(struct usb_device **pdev) | 2081 | void usb_disconnect(struct usb_device **pdev) |
2055 | { | 2082 | { |
2056 | struct usb_device *udev = *pdev; | 2083 | struct usb_port *port_dev = NULL; |
2057 | struct usb_hub *hub = usb_hub_to_struct_hub(udev); | 2084 | struct usb_device *udev = *pdev; |
2058 | int i; | 2085 | struct usb_hub *hub; |
2086 | int port1; | ||
2059 | 2087 | ||
2060 | /* mark the device as inactive, so any further urb submissions for | 2088 | /* mark the device as inactive, so any further urb submissions for |
2061 | * this device (and any of its children) will fail immediately. | 2089 | * this device (and any of its children) will fail immediately. |
@@ -2067,11 +2095,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
2067 | 2095 | ||
2068 | usb_lock_device(udev); | 2096 | usb_lock_device(udev); |
2069 | 2097 | ||
2070 | /* Free up all the children before we remove this device */ | 2098 | hub_disconnect_children(udev); |
2071 | for (i = 0; i < udev->maxchild; i++) { | ||
2072 | if (hub->ports[i]->child) | ||
2073 | usb_disconnect(&hub->ports[i]->child); | ||
2074 | } | ||
2075 | 2099 | ||
2076 | /* deallocate hcd/hardware state ... nuking all pending urbs and | 2100 | /* deallocate hcd/hardware state ... nuking all pending urbs and |
2077 | * cleaning up all state associated with the current configuration | 2101 | * cleaning up all state associated with the current configuration |
@@ -2082,16 +2106,19 @@ void usb_disconnect(struct usb_device **pdev) | |||
2082 | usb_hcd_synchronize_unlinks(udev); | 2106 | usb_hcd_synchronize_unlinks(udev); |
2083 | 2107 | ||
2084 | if (udev->parent) { | 2108 | if (udev->parent) { |
2085 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); | 2109 | port1 = udev->portnum; |
2086 | struct usb_port *port_dev = hub->ports[udev->portnum - 1]; | 2110 | hub = usb_hub_to_struct_hub(udev->parent); |
2111 | port_dev = hub->ports[port1 - 1]; | ||
2087 | 2112 | ||
2088 | sysfs_remove_link(&udev->dev.kobj, "port"); | 2113 | sysfs_remove_link(&udev->dev.kobj, "port"); |
2089 | sysfs_remove_link(&port_dev->dev.kobj, "device"); | 2114 | sysfs_remove_link(&port_dev->dev.kobj, "device"); |
2090 | 2115 | ||
2091 | if (!port_dev->did_runtime_put) | 2116 | /* |
2092 | pm_runtime_put(&port_dev->dev); | 2117 | * As usb_port_runtime_resume() de-references udev, make |
2093 | else | 2118 | * sure no resumes occur during removal |
2094 | port_dev->did_runtime_put = false; | 2119 | */ |
2120 | if (!test_and_set_bit(port1, hub->child_usage_bits)) | ||
2121 | pm_runtime_get_sync(&port_dev->dev); | ||
2095 | } | 2122 | } |
2096 | 2123 | ||
2097 | usb_remove_ep_devs(&udev->ep0); | 2124 | usb_remove_ep_devs(&udev->ep0); |
@@ -2113,6 +2140,9 @@ void usb_disconnect(struct usb_device **pdev) | |||
2113 | *pdev = NULL; | 2140 | *pdev = NULL; |
2114 | spin_unlock_irq(&device_state_lock); | 2141 | spin_unlock_irq(&device_state_lock); |
2115 | 2142 | ||
2143 | if (port_dev && test_and_clear_bit(port1, hub->child_usage_bits)) | ||
2144 | pm_runtime_put(&port_dev->dev); | ||
2145 | |||
2116 | hub_free_dev(udev); | 2146 | hub_free_dev(udev); |
2117 | 2147 | ||
2118 | put_device(&udev->dev); | 2148 | put_device(&udev->dev); |
@@ -2300,6 +2330,22 @@ static void set_usb_port_removable(struct usb_device *udev) | |||
2300 | udev->removable = USB_DEVICE_REMOVABLE; | 2330 | udev->removable = USB_DEVICE_REMOVABLE; |
2301 | else | 2331 | else |
2302 | udev->removable = USB_DEVICE_FIXED; | 2332 | udev->removable = USB_DEVICE_FIXED; |
2333 | |||
2334 | /* | ||
2335 | * Platform firmware may have populated an alternative value for | ||
2336 | * removable. If the parent port has a known connect_type use | ||
2337 | * that instead. | ||
2338 | */ | ||
2339 | switch (hub->ports[udev->portnum - 1]->connect_type) { | ||
2340 | case USB_PORT_CONNECT_TYPE_HOT_PLUG: | ||
2341 | udev->removable = USB_DEVICE_REMOVABLE; | ||
2342 | break; | ||
2343 | case USB_PORT_CONNECT_TYPE_HARD_WIRED: | ||
2344 | udev->removable = USB_DEVICE_FIXED; | ||
2345 | break; | ||
2346 | default: /* use what was set above */ | ||
2347 | break; | ||
2348 | } | ||
2303 | } | 2349 | } |
2304 | 2350 | ||
2305 | /** | 2351 | /** |
@@ -2369,11 +2415,7 @@ int usb_new_device(struct usb_device *udev) | |||
2369 | 2415 | ||
2370 | device_enable_async_suspend(&udev->dev); | 2416 | device_enable_async_suspend(&udev->dev); |
2371 | 2417 | ||
2372 | /* | 2418 | /* check whether the hub or firmware marks this port as non-removable */ |
2373 | * check whether the hub marks this port as non-removable. Do it | ||
2374 | * now so that platform-specific data can override it in | ||
2375 | * device_add() | ||
2376 | */ | ||
2377 | if (udev->parent) | 2419 | if (udev->parent) |
2378 | set_usb_port_removable(udev); | 2420 | set_usb_port_removable(udev); |
2379 | 2421 | ||
@@ -2390,7 +2432,8 @@ int usb_new_device(struct usb_device *udev) | |||
2390 | /* Create link files between child device and usb port device. */ | 2432 | /* Create link files between child device and usb port device. */ |
2391 | if (udev->parent) { | 2433 | if (udev->parent) { |
2392 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); | 2434 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); |
2393 | struct usb_port *port_dev = hub->ports[udev->portnum - 1]; | 2435 | int port1 = udev->portnum; |
2436 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
2394 | 2437 | ||
2395 | err = sysfs_create_link(&udev->dev.kobj, | 2438 | err = sysfs_create_link(&udev->dev.kobj, |
2396 | &port_dev->dev.kobj, "port"); | 2439 | &port_dev->dev.kobj, "port"); |
@@ -2404,7 +2447,8 @@ int usb_new_device(struct usb_device *udev) | |||
2404 | goto fail; | 2447 | goto fail; |
2405 | } | 2448 | } |
2406 | 2449 | ||
2407 | pm_runtime_get_sync(&port_dev->dev); | 2450 | if (!test_and_set_bit(port1, hub->child_usage_bits)) |
2451 | pm_runtime_get_sync(&port_dev->dev); | ||
2408 | } | 2452 | } |
2409 | 2453 | ||
2410 | (void) usb_create_ep_devs(&udev->dev, &udev->ep0, udev); | 2454 | (void) usb_create_ep_devs(&udev->dev, &udev->ep0, udev); |
@@ -2572,9 +2616,9 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | |||
2572 | if (delay_time >= 2 * HUB_SHORT_RESET_TIME) | 2616 | if (delay_time >= 2 * HUB_SHORT_RESET_TIME) |
2573 | delay = HUB_LONG_RESET_TIME; | 2617 | delay = HUB_LONG_RESET_TIME; |
2574 | 2618 | ||
2575 | dev_dbg (hub->intfdev, | 2619 | dev_dbg(&hub->ports[port1 - 1]->dev, |
2576 | "port %d not %sreset yet, waiting %dms\n", | 2620 | "not %sreset yet, waiting %dms\n", |
2577 | port1, warm ? "warm " : "", delay); | 2621 | warm ? "warm " : "", delay); |
2578 | } | 2622 | } |
2579 | 2623 | ||
2580 | if ((portstatus & USB_PORT_STAT_RESET)) | 2624 | if ((portstatus & USB_PORT_STAT_RESET)) |
@@ -2658,6 +2702,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
2658 | { | 2702 | { |
2659 | int i, status; | 2703 | int i, status; |
2660 | u16 portchange, portstatus; | 2704 | u16 portchange, portstatus; |
2705 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
2661 | 2706 | ||
2662 | if (!hub_is_superspeed(hub->hdev)) { | 2707 | if (!hub_is_superspeed(hub->hdev)) { |
2663 | if (warm) { | 2708 | if (warm) { |
@@ -2691,9 +2736,9 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
2691 | if (status == -ENODEV) { | 2736 | if (status == -ENODEV) { |
2692 | ; /* The hub is gone */ | 2737 | ; /* The hub is gone */ |
2693 | } else if (status) { | 2738 | } else if (status) { |
2694 | dev_err(hub->intfdev, | 2739 | dev_err(&port_dev->dev, |
2695 | "cannot %sreset port %d (err = %d)\n", | 2740 | "cannot %sreset (err = %d)\n", |
2696 | warm ? "warm " : "", port1, status); | 2741 | warm ? "warm " : "", status); |
2697 | } else { | 2742 | } else { |
2698 | status = hub_port_wait_reset(hub, port1, udev, delay, | 2743 | status = hub_port_wait_reset(hub, port1, udev, delay, |
2699 | warm); | 2744 | warm); |
@@ -2726,21 +2771,19 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
2726 | * hot or warm reset failed. Try another warm reset. | 2771 | * hot or warm reset failed. Try another warm reset. |
2727 | */ | 2772 | */ |
2728 | if (!warm) { | 2773 | if (!warm) { |
2729 | dev_dbg(hub->intfdev, "hot reset failed, warm reset port %d\n", | 2774 | dev_dbg(&port_dev->dev, |
2730 | port1); | 2775 | "hot reset failed, warm reset\n"); |
2731 | warm = true; | 2776 | warm = true; |
2732 | } | 2777 | } |
2733 | } | 2778 | } |
2734 | 2779 | ||
2735 | dev_dbg (hub->intfdev, | 2780 | dev_dbg(&port_dev->dev, |
2736 | "port %d not enabled, trying %sreset again...\n", | 2781 | "not enabled, trying %sreset again...\n", |
2737 | port1, warm ? "warm " : ""); | 2782 | warm ? "warm " : ""); |
2738 | delay = HUB_LONG_RESET_TIME; | 2783 | delay = HUB_LONG_RESET_TIME; |
2739 | } | 2784 | } |
2740 | 2785 | ||
2741 | dev_err (hub->intfdev, | 2786 | dev_err(&port_dev->dev, "Cannot enable. Maybe the USB cable is bad?\n"); |
2742 | "Cannot enable port %i. Maybe the USB cable is bad?\n", | ||
2743 | port1); | ||
2744 | 2787 | ||
2745 | done: | 2788 | done: |
2746 | if (!hub_is_superspeed(hub->hdev)) | 2789 | if (!hub_is_superspeed(hub->hdev)) |
@@ -2765,6 +2808,20 @@ static int port_is_power_on(struct usb_hub *hub, unsigned portstatus) | |||
2765 | return ret; | 2808 | return ret; |
2766 | } | 2809 | } |
2767 | 2810 | ||
2811 | static void usb_lock_port(struct usb_port *port_dev) | ||
2812 | __acquires(&port_dev->status_lock) | ||
2813 | { | ||
2814 | mutex_lock(&port_dev->status_lock); | ||
2815 | __acquire(&port_dev->status_lock); | ||
2816 | } | ||
2817 | |||
2818 | static void usb_unlock_port(struct usb_port *port_dev) | ||
2819 | __releases(&port_dev->status_lock) | ||
2820 | { | ||
2821 | mutex_unlock(&port_dev->status_lock); | ||
2822 | __release(&port_dev->status_lock); | ||
2823 | } | ||
2824 | |||
2768 | #ifdef CONFIG_PM | 2825 | #ifdef CONFIG_PM |
2769 | 2826 | ||
2770 | /* Check if a port is suspended(USB2.0 port) or in U3 state(USB3.0 port) */ | 2827 | /* Check if a port is suspended(USB2.0 port) or in U3 state(USB3.0 port) */ |
@@ -2791,6 +2848,8 @@ static int check_port_resume_type(struct usb_device *udev, | |||
2791 | struct usb_hub *hub, int port1, | 2848 | struct usb_hub *hub, int port1, |
2792 | int status, unsigned portchange, unsigned portstatus) | 2849 | int status, unsigned portchange, unsigned portstatus) |
2793 | { | 2850 | { |
2851 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
2852 | |||
2794 | /* Is the device still present? */ | 2853 | /* Is the device still present? */ |
2795 | if (status || port_is_suspended(hub, portstatus) || | 2854 | if (status || port_is_suspended(hub, portstatus) || |
2796 | !port_is_power_on(hub, portstatus) || | 2855 | !port_is_power_on(hub, portstatus) || |
@@ -2810,9 +2869,8 @@ static int check_port_resume_type(struct usb_device *udev, | |||
2810 | } | 2869 | } |
2811 | 2870 | ||
2812 | if (status) { | 2871 | if (status) { |
2813 | dev_dbg(hub->intfdev, | 2872 | dev_dbg(&port_dev->dev, "status %04x.%04x after resume, %d\n", |
2814 | "port %d status %04x.%04x after resume, %d\n", | 2873 | portchange, portstatus, status); |
2815 | port1, portchange, portstatus, status); | ||
2816 | } else if (udev->reset_resume) { | 2874 | } else if (udev->reset_resume) { |
2817 | 2875 | ||
2818 | /* Late port handoff can set status-change bits */ | 2876 | /* Late port handoff can set status-change bits */ |
@@ -2986,6 +3044,8 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
2986 | int status; | 3044 | int status; |
2987 | bool really_suspend = true; | 3045 | bool really_suspend = true; |
2988 | 3046 | ||
3047 | usb_lock_port(port_dev); | ||
3048 | |||
2989 | /* enable remote wakeup when appropriate; this lets the device | 3049 | /* enable remote wakeup when appropriate; this lets the device |
2990 | * wake up the upstream hub (including maybe the root hub). | 3050 | * wake up the upstream hub (including maybe the root hub). |
2991 | * | 3051 | * |
@@ -3043,8 +3103,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
3043 | status = 0; | 3103 | status = 0; |
3044 | } | 3104 | } |
3045 | if (status) { | 3105 | if (status) { |
3046 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", | 3106 | dev_dbg(&port_dev->dev, "can't suspend, status %d\n", status); |
3047 | port1, status); | ||
3048 | 3107 | ||
3049 | /* Try to enable USB3 LPM and LTM again */ | 3108 | /* Try to enable USB3 LPM and LTM again */ |
3050 | usb_unlocked_enable_lpm(udev); | 3109 | usb_unlocked_enable_lpm(udev); |
@@ -3075,12 +3134,13 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
3075 | usb_set_device_state(udev, USB_STATE_SUSPENDED); | 3134 | usb_set_device_state(udev, USB_STATE_SUSPENDED); |
3076 | } | 3135 | } |
3077 | 3136 | ||
3078 | if (status == 0 && !udev->do_remote_wakeup && udev->persist_enabled) { | 3137 | if (status == 0 && !udev->do_remote_wakeup && udev->persist_enabled |
3138 | && test_and_clear_bit(port1, hub->child_usage_bits)) | ||
3079 | pm_runtime_put_sync(&port_dev->dev); | 3139 | pm_runtime_put_sync(&port_dev->dev); |
3080 | port_dev->did_runtime_put = true; | ||
3081 | } | ||
3082 | 3140 | ||
3083 | usb_mark_last_busy(hub->hdev); | 3141 | usb_mark_last_busy(hub->hdev); |
3142 | |||
3143 | usb_unlock_port(port_dev); | ||
3084 | return status; | 3144 | return status; |
3085 | } | 3145 | } |
3086 | 3146 | ||
@@ -3220,9 +3280,8 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3220 | int status; | 3280 | int status; |
3221 | u16 portchange, portstatus; | 3281 | u16 portchange, portstatus; |
3222 | 3282 | ||
3223 | if (port_dev->did_runtime_put) { | 3283 | if (!test_and_set_bit(port1, hub->child_usage_bits)) { |
3224 | status = pm_runtime_get_sync(&port_dev->dev); | 3284 | status = pm_runtime_get_sync(&port_dev->dev); |
3225 | port_dev->did_runtime_put = false; | ||
3226 | if (status < 0) { | 3285 | if (status < 0) { |
3227 | dev_dbg(&udev->dev, "can't resume usb port, status %d\n", | 3286 | dev_dbg(&udev->dev, "can't resume usb port, status %d\n", |
3228 | status); | 3287 | status); |
@@ -3230,15 +3289,13 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3230 | } | 3289 | } |
3231 | } | 3290 | } |
3232 | 3291 | ||
3292 | usb_lock_port(port_dev); | ||
3293 | |||
3233 | /* Skip the initial Clear-Suspend step for a remote wakeup */ | 3294 | /* Skip the initial Clear-Suspend step for a remote wakeup */ |
3234 | status = hub_port_status(hub, port1, &portstatus, &portchange); | 3295 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
3235 | if (status == 0 && !port_is_suspended(hub, portstatus)) | 3296 | if (status == 0 && !port_is_suspended(hub, portstatus)) |
3236 | goto SuspendCleared; | 3297 | goto SuspendCleared; |
3237 | 3298 | ||
3238 | /* dev_dbg(hub->intfdev, "resume port %d\n", port1); */ | ||
3239 | |||
3240 | set_bit(port1, hub->busy_bits); | ||
3241 | |||
3242 | /* see 7.1.7.7; affects power usage, but not budgeting */ | 3299 | /* see 7.1.7.7; affects power usage, but not budgeting */ |
3243 | if (hub_is_superspeed(hub->hdev)) | 3300 | if (hub_is_superspeed(hub->hdev)) |
3244 | status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U0); | 3301 | status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U0); |
@@ -3246,8 +3303,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3246 | status = usb_clear_port_feature(hub->hdev, | 3303 | status = usb_clear_port_feature(hub->hdev, |
3247 | port1, USB_PORT_FEAT_SUSPEND); | 3304 | port1, USB_PORT_FEAT_SUSPEND); |
3248 | if (status) { | 3305 | if (status) { |
3249 | dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", | 3306 | dev_dbg(&port_dev->dev, "can't resume, status %d\n", status); |
3250 | port1, status); | ||
3251 | } else { | 3307 | } else { |
3252 | /* drive resume for at least 20 msec */ | 3308 | /* drive resume for at least 20 msec */ |
3253 | dev_dbg(&udev->dev, "usb %sresume\n", | 3309 | dev_dbg(&udev->dev, "usb %sresume\n", |
@@ -3278,8 +3334,6 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3278 | } | 3334 | } |
3279 | } | 3335 | } |
3280 | 3336 | ||
3281 | clear_bit(port1, hub->busy_bits); | ||
3282 | |||
3283 | status = check_port_resume_type(udev, | 3337 | status = check_port_resume_type(udev, |
3284 | hub, port1, status, portchange, portstatus); | 3338 | hub, port1, status, portchange, portstatus); |
3285 | if (status == 0) | 3339 | if (status == 0) |
@@ -3297,16 +3351,18 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3297 | usb_unlocked_enable_lpm(udev); | 3351 | usb_unlocked_enable_lpm(udev); |
3298 | } | 3352 | } |
3299 | 3353 | ||
3354 | usb_unlock_port(port_dev); | ||
3355 | |||
3300 | return status; | 3356 | return status; |
3301 | } | 3357 | } |
3302 | 3358 | ||
3303 | #ifdef CONFIG_PM_RUNTIME | 3359 | #ifdef CONFIG_PM_RUNTIME |
3304 | 3360 | ||
3305 | /* caller has locked udev */ | ||
3306 | int usb_remote_wakeup(struct usb_device *udev) | 3361 | int usb_remote_wakeup(struct usb_device *udev) |
3307 | { | 3362 | { |
3308 | int status = 0; | 3363 | int status = 0; |
3309 | 3364 | ||
3365 | usb_lock_device(udev); | ||
3310 | if (udev->state == USB_STATE_SUSPENDED) { | 3366 | if (udev->state == USB_STATE_SUSPENDED) { |
3311 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); | 3367 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); |
3312 | status = usb_autoresume_device(udev); | 3368 | status = usb_autoresume_device(udev); |
@@ -3315,9 +3371,59 @@ int usb_remote_wakeup(struct usb_device *udev) | |||
3315 | usb_autosuspend_device(udev); | 3371 | usb_autosuspend_device(udev); |
3316 | } | 3372 | } |
3317 | } | 3373 | } |
3374 | usb_unlock_device(udev); | ||
3318 | return status; | 3375 | return status; |
3319 | } | 3376 | } |
3320 | 3377 | ||
3378 | /* Returns 1 if there was a remote wakeup and a connect status change. */ | ||
3379 | static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, | ||
3380 | u16 portstatus, u16 portchange) | ||
3381 | __must_hold(&port_dev->status_lock) | ||
3382 | { | ||
3383 | struct usb_port *port_dev = hub->ports[port - 1]; | ||
3384 | struct usb_device *hdev; | ||
3385 | struct usb_device *udev; | ||
3386 | int connect_change = 0; | ||
3387 | int ret; | ||
3388 | |||
3389 | hdev = hub->hdev; | ||
3390 | udev = port_dev->child; | ||
3391 | if (!hub_is_superspeed(hdev)) { | ||
3392 | if (!(portchange & USB_PORT_STAT_C_SUSPEND)) | ||
3393 | return 0; | ||
3394 | usb_clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); | ||
3395 | } else { | ||
3396 | if (!udev || udev->state != USB_STATE_SUSPENDED || | ||
3397 | (portstatus & USB_PORT_STAT_LINK_STATE) != | ||
3398 | USB_SS_PORT_LS_U0) | ||
3399 | return 0; | ||
3400 | } | ||
3401 | |||
3402 | if (udev) { | ||
3403 | /* TRSMRCY = 10 msec */ | ||
3404 | msleep(10); | ||
3405 | |||
3406 | usb_unlock_port(port_dev); | ||
3407 | ret = usb_remote_wakeup(udev); | ||
3408 | usb_lock_port(port_dev); | ||
3409 | if (ret < 0) | ||
3410 | connect_change = 1; | ||
3411 | } else { | ||
3412 | ret = -ENODEV; | ||
3413 | hub_port_disable(hub, port, 1); | ||
3414 | } | ||
3415 | dev_dbg(&port_dev->dev, "resume, status %d\n", ret); | ||
3416 | return connect_change; | ||
3417 | } | ||
3418 | |||
3419 | #else | ||
3420 | |||
3421 | static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, | ||
3422 | u16 portstatus, u16 portchange) | ||
3423 | { | ||
3424 | return 0; | ||
3425 | } | ||
3426 | |||
3321 | #endif | 3427 | #endif |
3322 | 3428 | ||
3323 | static int check_ports_changed(struct usb_hub *hub) | 3429 | static int check_ports_changed(struct usb_hub *hub) |
@@ -3348,12 +3454,11 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
3348 | */ | 3454 | */ |
3349 | hub->wakeup_enabled_descendants = 0; | 3455 | hub->wakeup_enabled_descendants = 0; |
3350 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 3456 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
3351 | struct usb_device *udev; | 3457 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
3458 | struct usb_device *udev = port_dev->child; | ||
3352 | 3459 | ||
3353 | udev = hub->ports[port1 - 1]->child; | ||
3354 | if (udev && udev->can_submit) { | 3460 | if (udev && udev->can_submit) { |
3355 | dev_warn(&intf->dev, "port %d not suspended yet\n", | 3461 | dev_warn(&port_dev->dev, "not suspended yet\n"); |
3356 | port1); | ||
3357 | if (PMSG_IS_AUTO(msg)) | 3462 | if (PMSG_IS_AUTO(msg)) |
3358 | return -EBUSY; | 3463 | return -EBUSY; |
3359 | } | 3464 | } |
@@ -3872,6 +3977,12 @@ EXPORT_SYMBOL_GPL(usb_disable_ltm); | |||
3872 | void usb_enable_ltm(struct usb_device *udev) { } | 3977 | void usb_enable_ltm(struct usb_device *udev) { } |
3873 | EXPORT_SYMBOL_GPL(usb_enable_ltm); | 3978 | EXPORT_SYMBOL_GPL(usb_enable_ltm); |
3874 | 3979 | ||
3980 | static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, | ||
3981 | u16 portstatus, u16 portchange) | ||
3982 | { | ||
3983 | return 0; | ||
3984 | } | ||
3985 | |||
3875 | #endif /* CONFIG_PM */ | 3986 | #endif /* CONFIG_PM */ |
3876 | 3987 | ||
3877 | 3988 | ||
@@ -3893,9 +4004,10 @@ EXPORT_SYMBOL_GPL(usb_enable_ltm); | |||
3893 | int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected) | 4004 | int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected) |
3894 | { | 4005 | { |
3895 | int ret; | 4006 | int ret; |
3896 | int total_time, stable_time = 0; | ||
3897 | u16 portchange, portstatus; | 4007 | u16 portchange, portstatus; |
3898 | unsigned connection = 0xffff; | 4008 | unsigned connection = 0xffff; |
4009 | int total_time, stable_time = 0; | ||
4010 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
3899 | 4011 | ||
3900 | for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { | 4012 | for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { |
3901 | ret = hub_port_status(hub, port1, &portstatus, &portchange); | 4013 | ret = hub_port_status(hub, port1, &portstatus, &portchange); |
@@ -3924,9 +4036,8 @@ int hub_port_debounce(struct usb_hub *hub, int port1, bool must_be_connected) | |||
3924 | msleep(HUB_DEBOUNCE_STEP); | 4036 | msleep(HUB_DEBOUNCE_STEP); |
3925 | } | 4037 | } |
3926 | 4038 | ||
3927 | dev_dbg (hub->intfdev, | 4039 | dev_dbg(&port_dev->dev, "debounce total %dms stable %dms status 0x%x\n", |
3928 | "debounce: port %d: total %dms stable %dms status 0x%x\n", | 4040 | total_time, stable_time, portstatus); |
3929 | port1, total_time, stable_time, portstatus); | ||
3930 | 4041 | ||
3931 | if (stable_time < HUB_DEBOUNCE_STABLE) | 4042 | if (stable_time < HUB_DEBOUNCE_STABLE) |
3932 | return -ETIMEDOUT; | 4043 | return -ETIMEDOUT; |
@@ -3985,13 +4096,14 @@ static int hub_set_address(struct usb_device *udev, int devnum) | |||
3985 | */ | 4096 | */ |
3986 | static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) | 4097 | static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) |
3987 | { | 4098 | { |
3988 | int connect_type; | 4099 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); |
4100 | int connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN; | ||
3989 | 4101 | ||
3990 | if (!udev->usb2_hw_lpm_capable) | 4102 | if (!udev->usb2_hw_lpm_capable) |
3991 | return; | 4103 | return; |
3992 | 4104 | ||
3993 | connect_type = usb_get_hub_port_connect_type(udev->parent, | 4105 | if (hub) |
3994 | udev->portnum); | 4106 | connect_type = hub->ports[udev->portnum - 1]->connect_type; |
3995 | 4107 | ||
3996 | if ((udev->bos->ext_cap->bmAttributes & cpu_to_le32(USB_BESL_SUPPORT)) || | 4108 | if ((udev->bos->ext_cap->bmAttributes & cpu_to_le32(USB_BESL_SUPPORT)) || |
3997 | connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { | 4109 | connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { |
@@ -4019,16 +4131,15 @@ static int hub_enable_device(struct usb_device *udev) | |||
4019 | * Returns device in USB_STATE_ADDRESS, except on error. | 4131 | * Returns device in USB_STATE_ADDRESS, except on error. |
4020 | * | 4132 | * |
4021 | * If this is called for an already-existing device (as part of | 4133 | * If this is called for an already-existing device (as part of |
4022 | * usb_reset_and_verify_device), the caller must own the device lock. For a | 4134 | * usb_reset_and_verify_device), the caller must own the device lock and |
4023 | * newly detected device that is not accessible through any global | 4135 | * the port lock. For a newly detected device that is not accessible |
4024 | * pointers, it's not necessary to lock the device. | 4136 | * through any global pointers, it's not necessary to lock the device, |
4137 | * but it is still necessary to lock the port. | ||
4025 | */ | 4138 | */ |
4026 | static int | 4139 | static int |
4027 | hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | 4140 | hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, |
4028 | int retry_counter) | 4141 | int retry_counter) |
4029 | { | 4142 | { |
4030 | static DEFINE_MUTEX(usb_address0_mutex); | ||
4031 | |||
4032 | struct usb_device *hdev = hub->hdev; | 4143 | struct usb_device *hdev = hub->hdev; |
4033 | struct usb_hcd *hcd = bus_to_hcd(hdev->bus); | 4144 | struct usb_hcd *hcd = bus_to_hcd(hdev->bus); |
4034 | int i, j, retval; | 4145 | int i, j, retval; |
@@ -4051,7 +4162,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
4051 | if (oldspeed == USB_SPEED_LOW) | 4162 | if (oldspeed == USB_SPEED_LOW) |
4052 | delay = HUB_LONG_RESET_TIME; | 4163 | delay = HUB_LONG_RESET_TIME; |
4053 | 4164 | ||
4054 | mutex_lock(&usb_address0_mutex); | 4165 | mutex_lock(&hdev->bus->usb_address0_mutex); |
4055 | 4166 | ||
4056 | /* Reset the device; full speed may morph to high speed */ | 4167 | /* Reset the device; full speed may morph to high speed */ |
4057 | /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ | 4168 | /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ |
@@ -4328,7 +4439,7 @@ fail: | |||
4328 | hub_port_disable(hub, port1, 0); | 4439 | hub_port_disable(hub, port1, 0); |
4329 | update_devnum(udev, devnum); /* for disconnect processing */ | 4440 | update_devnum(udev, devnum); /* for disconnect processing */ |
4330 | } | 4441 | } |
4331 | mutex_unlock(&usb_address0_mutex); | 4442 | mutex_unlock(&hdev->bus->usb_address0_mutex); |
4332 | return retval; | 4443 | return retval; |
4333 | } | 4444 | } |
4334 | 4445 | ||
@@ -4369,9 +4480,10 @@ hub_power_remaining (struct usb_hub *hub) | |||
4369 | 4480 | ||
4370 | remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent; | 4481 | remaining = hdev->bus_mA - hub->descriptor->bHubContrCurrent; |
4371 | for (port1 = 1; port1 <= hdev->maxchild; ++port1) { | 4482 | for (port1 = 1; port1 <= hdev->maxchild; ++port1) { |
4372 | struct usb_device *udev = hub->ports[port1 - 1]->child; | 4483 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
4373 | int delta; | 4484 | struct usb_device *udev = port_dev->child; |
4374 | unsigned unit_load; | 4485 | unsigned unit_load; |
4486 | int delta; | ||
4375 | 4487 | ||
4376 | if (!udev) | 4488 | if (!udev) |
4377 | continue; | 4489 | continue; |
@@ -4391,9 +4503,8 @@ hub_power_remaining (struct usb_hub *hub) | |||
4391 | else | 4503 | else |
4392 | delta = 8; | 4504 | delta = 8; |
4393 | if (delta > hub->mA_per_port) | 4505 | if (delta > hub->mA_per_port) |
4394 | dev_warn(&udev->dev, | 4506 | dev_warn(&port_dev->dev, "%dmA is over %umA budget!\n", |
4395 | "%dmA is over %umA budget for port %d!\n", | 4507 | delta, hub->mA_per_port); |
4396 | delta, hub->mA_per_port, port1); | ||
4397 | remaining -= delta; | 4508 | remaining -= delta; |
4398 | } | 4509 | } |
4399 | if (remaining < 0) { | 4510 | if (remaining < 0) { |
@@ -4404,78 +4515,23 @@ hub_power_remaining (struct usb_hub *hub) | |||
4404 | return remaining; | 4515 | return remaining; |
4405 | } | 4516 | } |
4406 | 4517 | ||
4407 | /* Handle physical or logical connection change events. | 4518 | static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, |
4408 | * This routine is called when: | 4519 | u16 portchange) |
4409 | * a port connection-change occurs; | ||
4410 | * a port enable-change occurs (often caused by EMI); | ||
4411 | * usb_reset_and_verify_device() encounters changed descriptors (as from | ||
4412 | * a firmware download) | ||
4413 | * caller already locked the hub | ||
4414 | */ | ||
4415 | static void hub_port_connect_change(struct usb_hub *hub, int port1, | ||
4416 | u16 portstatus, u16 portchange) | ||
4417 | { | 4520 | { |
4418 | struct usb_device *hdev = hub->hdev; | ||
4419 | struct device *hub_dev = hub->intfdev; | ||
4420 | struct usb_hcd *hcd = bus_to_hcd(hdev->bus); | ||
4421 | unsigned wHubCharacteristics = | ||
4422 | le16_to_cpu(hub->descriptor->wHubCharacteristics); | ||
4423 | struct usb_device *udev; | ||
4424 | int status, i; | 4521 | int status, i; |
4425 | unsigned unit_load; | 4522 | unsigned unit_load; |
4426 | 4523 | struct usb_device *hdev = hub->hdev; | |
4427 | dev_dbg (hub_dev, | 4524 | struct usb_hcd *hcd = bus_to_hcd(hdev->bus); |
4428 | "port %d, status %04x, change %04x, %s\n", | 4525 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
4429 | port1, portstatus, portchange, portspeed(hub, portstatus)); | 4526 | struct usb_device *udev = port_dev->child; |
4430 | |||
4431 | if (hub->has_indicators) { | ||
4432 | set_port_led(hub, port1, HUB_LED_AUTO); | ||
4433 | hub->indicator[port1-1] = INDICATOR_AUTO; | ||
4434 | } | ||
4435 | |||
4436 | #ifdef CONFIG_USB_OTG | ||
4437 | /* during HNP, don't repeat the debounce */ | ||
4438 | if (hdev->bus->is_b_host) | ||
4439 | portchange &= ~(USB_PORT_STAT_C_CONNECTION | | ||
4440 | USB_PORT_STAT_C_ENABLE); | ||
4441 | #endif | ||
4442 | |||
4443 | /* Try to resuscitate an existing device */ | ||
4444 | udev = hub->ports[port1 - 1]->child; | ||
4445 | if ((portstatus & USB_PORT_STAT_CONNECTION) && udev && | ||
4446 | udev->state != USB_STATE_NOTATTACHED) { | ||
4447 | usb_lock_device(udev); | ||
4448 | if (portstatus & USB_PORT_STAT_ENABLE) { | ||
4449 | status = 0; /* Nothing to do */ | ||
4450 | |||
4451 | #ifdef CONFIG_PM_RUNTIME | ||
4452 | } else if (udev->state == USB_STATE_SUSPENDED && | ||
4453 | udev->persist_enabled) { | ||
4454 | /* For a suspended device, treat this as a | ||
4455 | * remote wakeup event. | ||
4456 | */ | ||
4457 | status = usb_remote_wakeup(udev); | ||
4458 | #endif | ||
4459 | |||
4460 | } else { | ||
4461 | status = -ENODEV; /* Don't resuscitate */ | ||
4462 | } | ||
4463 | usb_unlock_device(udev); | ||
4464 | |||
4465 | if (status == 0) { | ||
4466 | clear_bit(port1, hub->change_bits); | ||
4467 | return; | ||
4468 | } | ||
4469 | } | ||
4470 | 4527 | ||
4471 | /* Disconnect any existing devices under this port */ | 4528 | /* Disconnect any existing devices under this port */ |
4472 | if (udev) { | 4529 | if (udev) { |
4473 | if (hcd->phy && !hdev->parent && | 4530 | if (hcd->phy && !hdev->parent && |
4474 | !(portstatus & USB_PORT_STAT_CONNECTION)) | 4531 | !(portstatus & USB_PORT_STAT_CONNECTION)) |
4475 | usb_phy_notify_disconnect(hcd->phy, udev->speed); | 4532 | usb_phy_notify_disconnect(hcd->phy, udev->speed); |
4476 | usb_disconnect(&hub->ports[port1 - 1]->child); | 4533 | usb_disconnect(&port_dev->child); |
4477 | } | 4534 | } |
4478 | clear_bit(port1, hub->change_bits); | ||
4479 | 4535 | ||
4480 | /* We can forget about a "removed" device when there's a physical | 4536 | /* We can forget about a "removed" device when there's a physical |
4481 | * disconnect or the connect status changes. | 4537 | * disconnect or the connect status changes. |
@@ -4489,8 +4545,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4489 | status = hub_port_debounce_be_stable(hub, port1); | 4545 | status = hub_port_debounce_be_stable(hub, port1); |
4490 | if (status < 0) { | 4546 | if (status < 0) { |
4491 | if (status != -ENODEV && printk_ratelimit()) | 4547 | if (status != -ENODEV && printk_ratelimit()) |
4492 | dev_err(hub_dev, "connect-debounce failed, " | 4548 | dev_err(&port_dev->dev, |
4493 | "port %d disabled\n", port1); | 4549 | "connect-debounce failed\n"); |
4494 | portstatus &= ~USB_PORT_STAT_CONNECTION; | 4550 | portstatus &= ~USB_PORT_STAT_CONNECTION; |
4495 | } else { | 4551 | } else { |
4496 | portstatus = status; | 4552 | portstatus = status; |
@@ -4504,7 +4560,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4504 | test_bit(port1, hub->removed_bits)) { | 4560 | test_bit(port1, hub->removed_bits)) { |
4505 | 4561 | ||
4506 | /* maybe switch power back on (e.g. root hub was reset) */ | 4562 | /* maybe switch power back on (e.g. root hub was reset) */ |
4507 | if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2 | 4563 | if (hub_is_port_power_switchable(hub) |
4508 | && !port_is_power_on(hub, portstatus)) | 4564 | && !port_is_power_on(hub, portstatus)) |
4509 | set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); | 4565 | set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); |
4510 | 4566 | ||
@@ -4525,9 +4581,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4525 | */ | 4581 | */ |
4526 | udev = usb_alloc_dev(hdev, hdev->bus, port1); | 4582 | udev = usb_alloc_dev(hdev, hdev->bus, port1); |
4527 | if (!udev) { | 4583 | if (!udev) { |
4528 | dev_err (hub_dev, | 4584 | dev_err(&port_dev->dev, |
4529 | "couldn't allocate port %d usb_device\n", | 4585 | "couldn't allocate usb_device\n"); |
4530 | port1); | ||
4531 | goto done; | 4586 | goto done; |
4532 | } | 4587 | } |
4533 | 4588 | ||
@@ -4549,7 +4604,9 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4549 | } | 4604 | } |
4550 | 4605 | ||
4551 | /* reset (non-USB 3.0 devices) and get descriptor */ | 4606 | /* reset (non-USB 3.0 devices) and get descriptor */ |
4607 | usb_lock_port(port_dev); | ||
4552 | status = hub_port_init(hub, udev, port1, i); | 4608 | status = hub_port_init(hub, udev, port1, i); |
4609 | usb_unlock_port(port_dev); | ||
4553 | if (status < 0) | 4610 | if (status < 0) |
4554 | goto loop; | 4611 | goto loop; |
4555 | 4612 | ||
@@ -4601,6 +4658,8 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4601 | */ | 4658 | */ |
4602 | status = 0; | 4659 | status = 0; |
4603 | 4660 | ||
4661 | mutex_lock(&usb_port_peer_mutex); | ||
4662 | |||
4604 | /* We mustn't add new devices if the parent hub has | 4663 | /* We mustn't add new devices if the parent hub has |
4605 | * been disconnected; we would race with the | 4664 | * been disconnected; we would race with the |
4606 | * recursively_mark_NOTATTACHED() routine. | 4665 | * recursively_mark_NOTATTACHED() routine. |
@@ -4609,16 +4668,19 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4609 | if (hdev->state == USB_STATE_NOTATTACHED) | 4668 | if (hdev->state == USB_STATE_NOTATTACHED) |
4610 | status = -ENOTCONN; | 4669 | status = -ENOTCONN; |
4611 | else | 4670 | else |
4612 | hub->ports[port1 - 1]->child = udev; | 4671 | port_dev->child = udev; |
4613 | spin_unlock_irq(&device_state_lock); | 4672 | spin_unlock_irq(&device_state_lock); |
4673 | mutex_unlock(&usb_port_peer_mutex); | ||
4614 | 4674 | ||
4615 | /* Run it through the hoops (find a driver, etc) */ | 4675 | /* Run it through the hoops (find a driver, etc) */ |
4616 | if (!status) { | 4676 | if (!status) { |
4617 | status = usb_new_device(udev); | 4677 | status = usb_new_device(udev); |
4618 | if (status) { | 4678 | if (status) { |
4679 | mutex_lock(&usb_port_peer_mutex); | ||
4619 | spin_lock_irq(&device_state_lock); | 4680 | spin_lock_irq(&device_state_lock); |
4620 | hub->ports[port1 - 1]->child = NULL; | 4681 | port_dev->child = NULL; |
4621 | spin_unlock_irq(&device_state_lock); | 4682 | spin_unlock_irq(&device_state_lock); |
4683 | mutex_unlock(&usb_port_peer_mutex); | ||
4622 | } | 4684 | } |
4623 | } | 4685 | } |
4624 | 4686 | ||
@@ -4627,7 +4689,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4627 | 4689 | ||
4628 | status = hub_power_remaining(hub); | 4690 | status = hub_power_remaining(hub); |
4629 | if (status) | 4691 | if (status) |
4630 | dev_dbg(hub_dev, "%dmA power budget left\n", status); | 4692 | dev_dbg(hub->intfdev, "%dmA power budget left\n", status); |
4631 | 4693 | ||
4632 | return; | 4694 | return; |
4633 | 4695 | ||
@@ -4645,56 +4707,200 @@ loop: | |||
4645 | !hcd->driver->port_handed_over || | 4707 | !hcd->driver->port_handed_over || |
4646 | !(hcd->driver->port_handed_over)(hcd, port1)) { | 4708 | !(hcd->driver->port_handed_over)(hcd, port1)) { |
4647 | if (status != -ENOTCONN && status != -ENODEV) | 4709 | if (status != -ENOTCONN && status != -ENODEV) |
4648 | dev_err(hub_dev, "unable to enumerate USB device on port %d\n", | 4710 | dev_err(&port_dev->dev, |
4649 | port1); | 4711 | "unable to enumerate USB device\n"); |
4650 | } | 4712 | } |
4651 | 4713 | ||
4652 | done: | 4714 | done: |
4653 | hub_port_disable(hub, port1, 1); | 4715 | hub_port_disable(hub, port1, 1); |
4654 | if (hcd->driver->relinquish_port && !hub->hdev->parent) | 4716 | if (hcd->driver->relinquish_port && !hub->hdev->parent) |
4655 | hcd->driver->relinquish_port(hcd, port1); | 4717 | hcd->driver->relinquish_port(hcd, port1); |
4718 | |||
4656 | } | 4719 | } |
4657 | 4720 | ||
4658 | /* Returns 1 if there was a remote wakeup and a connect status change. */ | 4721 | /* Handle physical or logical connection change events. |
4659 | static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, | 4722 | * This routine is called when: |
4660 | u16 portstatus, u16 portchange) | 4723 | * a port connection-change occurs; |
4724 | * a port enable-change occurs (often caused by EMI); | ||
4725 | * usb_reset_and_verify_device() encounters changed descriptors (as from | ||
4726 | * a firmware download) | ||
4727 | * caller already locked the hub | ||
4728 | */ | ||
4729 | static void hub_port_connect_change(struct usb_hub *hub, int port1, | ||
4730 | u16 portstatus, u16 portchange) | ||
4731 | __must_hold(&port_dev->status_lock) | ||
4661 | { | 4732 | { |
4662 | struct usb_device *hdev; | 4733 | struct usb_port *port_dev = hub->ports[port1 - 1]; |
4663 | struct usb_device *udev; | 4734 | struct usb_device *udev = port_dev->child; |
4664 | int connect_change = 0; | 4735 | int status = -ENODEV; |
4665 | int ret; | ||
4666 | 4736 | ||
4667 | hdev = hub->hdev; | 4737 | dev_dbg(&port_dev->dev, "status %04x, change %04x, %s\n", portstatus, |
4668 | udev = hub->ports[port - 1]->child; | 4738 | portchange, portspeed(hub, portstatus)); |
4669 | if (!hub_is_superspeed(hdev)) { | 4739 | |
4670 | if (!(portchange & USB_PORT_STAT_C_SUSPEND)) | 4740 | if (hub->has_indicators) { |
4671 | return 0; | 4741 | set_port_led(hub, port1, HUB_LED_AUTO); |
4672 | usb_clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); | 4742 | hub->indicator[port1-1] = INDICATOR_AUTO; |
4673 | } else { | ||
4674 | if (!udev || udev->state != USB_STATE_SUSPENDED || | ||
4675 | (portstatus & USB_PORT_STAT_LINK_STATE) != | ||
4676 | USB_SS_PORT_LS_U0) | ||
4677 | return 0; | ||
4678 | } | 4743 | } |
4679 | 4744 | ||
4680 | if (udev) { | 4745 | #ifdef CONFIG_USB_OTG |
4681 | /* TRSMRCY = 10 msec */ | 4746 | /* during HNP, don't repeat the debounce */ |
4682 | msleep(10); | 4747 | if (hub->hdev->bus->is_b_host) |
4748 | portchange &= ~(USB_PORT_STAT_C_CONNECTION | | ||
4749 | USB_PORT_STAT_C_ENABLE); | ||
4750 | #endif | ||
4751 | |||
4752 | /* Try to resuscitate an existing device */ | ||
4753 | if ((portstatus & USB_PORT_STAT_CONNECTION) && udev && | ||
4754 | udev->state != USB_STATE_NOTATTACHED) { | ||
4755 | if (portstatus & USB_PORT_STAT_ENABLE) { | ||
4756 | status = 0; /* Nothing to do */ | ||
4757 | #ifdef CONFIG_PM_RUNTIME | ||
4758 | } else if (udev->state == USB_STATE_SUSPENDED && | ||
4759 | udev->persist_enabled) { | ||
4760 | /* For a suspended device, treat this as a | ||
4761 | * remote wakeup event. | ||
4762 | */ | ||
4763 | usb_unlock_port(port_dev); | ||
4764 | status = usb_remote_wakeup(udev); | ||
4765 | usb_lock_port(port_dev); | ||
4766 | #endif | ||
4767 | } else { | ||
4768 | /* Don't resuscitate */; | ||
4769 | } | ||
4770 | } | ||
4771 | clear_bit(port1, hub->change_bits); | ||
4772 | |||
4773 | /* successfully revalidated the connection */ | ||
4774 | if (status == 0) | ||
4775 | return; | ||
4776 | |||
4777 | usb_unlock_port(port_dev); | ||
4778 | hub_port_connect(hub, port1, portstatus, portchange); | ||
4779 | usb_lock_port(port_dev); | ||
4780 | } | ||
4781 | |||
4782 | static void port_event(struct usb_hub *hub, int port1) | ||
4783 | __must_hold(&port_dev->status_lock) | ||
4784 | { | ||
4785 | int connect_change, reset_device = 0; | ||
4786 | struct usb_port *port_dev = hub->ports[port1 - 1]; | ||
4787 | struct usb_device *udev = port_dev->child; | ||
4788 | struct usb_device *hdev = hub->hdev; | ||
4789 | u16 portstatus, portchange; | ||
4790 | |||
4791 | connect_change = test_bit(port1, hub->change_bits); | ||
4792 | clear_bit(port1, hub->event_bits); | ||
4793 | clear_bit(port1, hub->wakeup_bits); | ||
4794 | |||
4795 | if (hub_port_status(hub, port1, &portstatus, &portchange) < 0) | ||
4796 | return; | ||
4797 | |||
4798 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | ||
4799 | usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_CONNECTION); | ||
4800 | connect_change = 1; | ||
4801 | } | ||
4802 | |||
4803 | if (portchange & USB_PORT_STAT_C_ENABLE) { | ||
4804 | if (!connect_change) | ||
4805 | dev_dbg(&port_dev->dev, "enable change, status %08x\n", | ||
4806 | portstatus); | ||
4807 | usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_ENABLE); | ||
4808 | |||
4809 | /* | ||
4810 | * EM interference sometimes causes badly shielded USB devices | ||
4811 | * to be shutdown by the hub, this hack enables them again. | ||
4812 | * Works at least with mouse driver. | ||
4813 | */ | ||
4814 | if (!(portstatus & USB_PORT_STAT_ENABLE) | ||
4815 | && !connect_change && udev) { | ||
4816 | dev_err(&port_dev->dev, "disabled by hub (EMI?), re-enabling...\n"); | ||
4817 | connect_change = 1; | ||
4818 | } | ||
4819 | } | ||
4820 | |||
4821 | if (portchange & USB_PORT_STAT_C_OVERCURRENT) { | ||
4822 | u16 status = 0, unused; | ||
4823 | |||
4824 | dev_dbg(&port_dev->dev, "over-current change\n"); | ||
4825 | usb_clear_port_feature(hdev, port1, | ||
4826 | USB_PORT_FEAT_C_OVER_CURRENT); | ||
4827 | msleep(100); /* Cool down */ | ||
4828 | hub_power_on(hub, true); | ||
4829 | hub_port_status(hub, port1, &status, &unused); | ||
4830 | if (status & USB_PORT_STAT_OVERCURRENT) | ||
4831 | dev_err(&port_dev->dev, "over-current condition\n"); | ||
4832 | } | ||
4833 | |||
4834 | if (portchange & USB_PORT_STAT_C_RESET) { | ||
4835 | dev_dbg(&port_dev->dev, "reset change\n"); | ||
4836 | usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_RESET); | ||
4837 | } | ||
4838 | if ((portchange & USB_PORT_STAT_C_BH_RESET) | ||
4839 | && hub_is_superspeed(hdev)) { | ||
4840 | dev_dbg(&port_dev->dev, "warm reset change\n"); | ||
4841 | usb_clear_port_feature(hdev, port1, | ||
4842 | USB_PORT_FEAT_C_BH_PORT_RESET); | ||
4843 | } | ||
4844 | if (portchange & USB_PORT_STAT_C_LINK_STATE) { | ||
4845 | dev_dbg(&port_dev->dev, "link state change\n"); | ||
4846 | usb_clear_port_feature(hdev, port1, | ||
4847 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
4848 | } | ||
4849 | if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) { | ||
4850 | dev_warn(&port_dev->dev, "config error\n"); | ||
4851 | usb_clear_port_feature(hdev, port1, | ||
4852 | USB_PORT_FEAT_C_PORT_CONFIG_ERROR); | ||
4853 | } | ||
4854 | |||
4855 | /* skip port actions that require the port to be powered on */ | ||
4856 | if (!pm_runtime_active(&port_dev->dev)) | ||
4857 | return; | ||
4683 | 4858 | ||
4859 | if (hub_handle_remote_wakeup(hub, port1, portstatus, portchange)) | ||
4860 | connect_change = 1; | ||
4861 | |||
4862 | /* | ||
4863 | * Warm reset a USB3 protocol port if it's in | ||
4864 | * SS.Inactive state. | ||
4865 | */ | ||
4866 | if (hub_port_warm_reset_required(hub, portstatus)) { | ||
4867 | dev_dbg(&port_dev->dev, "do warm reset\n"); | ||
4868 | if (!udev || !(portstatus & USB_PORT_STAT_CONNECTION) | ||
4869 | || udev->state == USB_STATE_NOTATTACHED) { | ||
4870 | if (hub_port_reset(hub, port1, NULL, | ||
4871 | HUB_BH_RESET_TIME, true) < 0) | ||
4872 | hub_port_disable(hub, port1, 1); | ||
4873 | } else | ||
4874 | reset_device = 1; | ||
4875 | } | ||
4876 | |||
4877 | /* | ||
4878 | * On disconnect USB3 protocol ports transit from U0 to | ||
4879 | * SS.Inactive to Rx.Detect. If this happens a warm- | ||
4880 | * reset is not needed, but a (re)connect may happen | ||
4881 | * before khubd runs and sees the disconnect, and the | ||
4882 | * device may be an unknown state. | ||
4883 | * | ||
4884 | * If the port went through SS.Inactive without khubd | ||
4885 | * seeing it the C_LINK_STATE change flag will be set, | ||
4886 | * and we reset the dev to put it in a known state. | ||
4887 | */ | ||
4888 | if (reset_device || (udev && hub_is_superspeed(hub->hdev) | ||
4889 | && (portchange & USB_PORT_STAT_C_LINK_STATE) | ||
4890 | && (portstatus & USB_PORT_STAT_CONNECTION))) { | ||
4891 | usb_unlock_port(port_dev); | ||
4684 | usb_lock_device(udev); | 4892 | usb_lock_device(udev); |
4685 | ret = usb_remote_wakeup(udev); | 4893 | usb_reset_device(udev); |
4686 | usb_unlock_device(udev); | 4894 | usb_unlock_device(udev); |
4687 | if (ret < 0) | 4895 | usb_lock_port(port_dev); |
4688 | connect_change = 1; | 4896 | connect_change = 0; |
4689 | } else { | ||
4690 | ret = -ENODEV; | ||
4691 | hub_port_disable(hub, port, 1); | ||
4692 | } | 4897 | } |
4693 | dev_dbg(hub->intfdev, "resume on port %d, status %d\n", | 4898 | |
4694 | port, ret); | 4899 | if (connect_change) |
4695 | return connect_change; | 4900 | hub_port_connect_change(hub, port1, portstatus, portchange); |
4696 | } | 4901 | } |
4697 | 4902 | ||
4903 | |||
4698 | static void hub_events(void) | 4904 | static void hub_events(void) |
4699 | { | 4905 | { |
4700 | struct list_head *tmp; | 4906 | struct list_head *tmp; |
@@ -4704,10 +4910,7 @@ static void hub_events(void) | |||
4704 | struct device *hub_dev; | 4910 | struct device *hub_dev; |
4705 | u16 hubstatus; | 4911 | u16 hubstatus; |
4706 | u16 hubchange; | 4912 | u16 hubchange; |
4707 | u16 portstatus; | ||
4708 | u16 portchange; | ||
4709 | int i, ret; | 4913 | int i, ret; |
4710 | int connect_change, wakeup_change; | ||
4711 | 4914 | ||
4712 | /* | 4915 | /* |
4713 | * We restart the list every time to avoid a deadlock with | 4916 | * We restart the list every time to avoid a deadlock with |
@@ -4781,146 +4984,28 @@ static void hub_events(void) | |||
4781 | 4984 | ||
4782 | /* deal with port status changes */ | 4985 | /* deal with port status changes */ |
4783 | for (i = 1; i <= hdev->maxchild; i++) { | 4986 | for (i = 1; i <= hdev->maxchild; i++) { |
4784 | struct usb_device *udev = hub->ports[i - 1]->child; | 4987 | struct usb_port *port_dev = hub->ports[i - 1]; |
4785 | |||
4786 | if (test_bit(i, hub->busy_bits)) | ||
4787 | continue; | ||
4788 | connect_change = test_bit(i, hub->change_bits); | ||
4789 | wakeup_change = test_and_clear_bit(i, hub->wakeup_bits); | ||
4790 | if (!test_and_clear_bit(i, hub->event_bits) && | ||
4791 | !connect_change && !wakeup_change) | ||
4792 | continue; | ||
4793 | |||
4794 | ret = hub_port_status(hub, i, | ||
4795 | &portstatus, &portchange); | ||
4796 | if (ret < 0) | ||
4797 | continue; | ||
4798 | |||
4799 | if (portchange & USB_PORT_STAT_C_CONNECTION) { | ||
4800 | usb_clear_port_feature(hdev, i, | ||
4801 | USB_PORT_FEAT_C_CONNECTION); | ||
4802 | connect_change = 1; | ||
4803 | } | ||
4804 | |||
4805 | if (portchange & USB_PORT_STAT_C_ENABLE) { | ||
4806 | if (!connect_change) | ||
4807 | dev_dbg (hub_dev, | ||
4808 | "port %d enable change, " | ||
4809 | "status %08x\n", | ||
4810 | i, portstatus); | ||
4811 | usb_clear_port_feature(hdev, i, | ||
4812 | USB_PORT_FEAT_C_ENABLE); | ||
4813 | 4988 | ||
4989 | if (test_bit(i, hub->event_bits) | ||
4990 | || test_bit(i, hub->change_bits) | ||
4991 | || test_bit(i, hub->wakeup_bits)) { | ||
4814 | /* | 4992 | /* |
4815 | * EM interference sometimes causes badly | 4993 | * The get_noresume and barrier ensure that if |
4816 | * shielded USB devices to be shutdown by | 4994 | * the port was in the process of resuming, we |
4817 | * the hub, this hack enables them again. | 4995 | * flush that work and keep the port active for |
4818 | * Works at least with mouse driver. | 4996 | * the duration of the port_event(). However, |
4997 | * if the port is runtime pm suspended | ||
4998 | * (powered-off), we leave it in that state, run | ||
4999 | * an abbreviated port_event(), and move on. | ||
4819 | */ | 5000 | */ |
4820 | if (!(portstatus & USB_PORT_STAT_ENABLE) | 5001 | pm_runtime_get_noresume(&port_dev->dev); |
4821 | && !connect_change | 5002 | pm_runtime_barrier(&port_dev->dev); |
4822 | && hub->ports[i - 1]->child) { | 5003 | usb_lock_port(port_dev); |
4823 | dev_err (hub_dev, | 5004 | port_event(hub, i); |
4824 | "port %i " | 5005 | usb_unlock_port(port_dev); |
4825 | "disabled by hub (EMI?), " | 5006 | pm_runtime_put_sync(&port_dev->dev); |
4826 | "re-enabling...\n", | ||
4827 | i); | ||
4828 | connect_change = 1; | ||
4829 | } | ||
4830 | } | ||
4831 | |||
4832 | if (hub_handle_remote_wakeup(hub, i, | ||
4833 | portstatus, portchange)) | ||
4834 | connect_change = 1; | ||
4835 | |||
4836 | if (portchange & USB_PORT_STAT_C_OVERCURRENT) { | ||
4837 | u16 status = 0; | ||
4838 | u16 unused; | ||
4839 | |||
4840 | dev_dbg(hub_dev, "over-current change on port " | ||
4841 | "%d\n", i); | ||
4842 | usb_clear_port_feature(hdev, i, | ||
4843 | USB_PORT_FEAT_C_OVER_CURRENT); | ||
4844 | msleep(100); /* Cool down */ | ||
4845 | hub_power_on(hub, true); | ||
4846 | hub_port_status(hub, i, &status, &unused); | ||
4847 | if (status & USB_PORT_STAT_OVERCURRENT) | ||
4848 | dev_err(hub_dev, "over-current " | ||
4849 | "condition on port %d\n", i); | ||
4850 | } | ||
4851 | |||
4852 | if (portchange & USB_PORT_STAT_C_RESET) { | ||
4853 | dev_dbg (hub_dev, | ||
4854 | "reset change on port %d\n", | ||
4855 | i); | ||
4856 | usb_clear_port_feature(hdev, i, | ||
4857 | USB_PORT_FEAT_C_RESET); | ||
4858 | } | ||
4859 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && | ||
4860 | hub_is_superspeed(hub->hdev)) { | ||
4861 | dev_dbg(hub_dev, | ||
4862 | "warm reset change on port %d\n", | ||
4863 | i); | ||
4864 | usb_clear_port_feature(hdev, i, | ||
4865 | USB_PORT_FEAT_C_BH_PORT_RESET); | ||
4866 | } | ||
4867 | if (portchange & USB_PORT_STAT_C_LINK_STATE) { | ||
4868 | usb_clear_port_feature(hub->hdev, i, | ||
4869 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
4870 | } | ||
4871 | if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) { | ||
4872 | dev_warn(hub_dev, | ||
4873 | "config error on port %d\n", | ||
4874 | i); | ||
4875 | usb_clear_port_feature(hub->hdev, i, | ||
4876 | USB_PORT_FEAT_C_PORT_CONFIG_ERROR); | ||
4877 | } | 5007 | } |
4878 | 5008 | } | |
4879 | /* Warm reset a USB3 protocol port if it's in | ||
4880 | * SS.Inactive state. | ||
4881 | */ | ||
4882 | if (hub_port_warm_reset_required(hub, portstatus)) { | ||
4883 | int status; | ||
4884 | |||
4885 | dev_dbg(hub_dev, "warm reset port %d\n", i); | ||
4886 | if (!udev || | ||
4887 | !(portstatus & USB_PORT_STAT_CONNECTION) || | ||
4888 | udev->state == USB_STATE_NOTATTACHED) { | ||
4889 | status = hub_port_reset(hub, i, | ||
4890 | NULL, HUB_BH_RESET_TIME, | ||
4891 | true); | ||
4892 | if (status < 0) | ||
4893 | hub_port_disable(hub, i, 1); | ||
4894 | } else { | ||
4895 | usb_lock_device(udev); | ||
4896 | status = usb_reset_device(udev); | ||
4897 | usb_unlock_device(udev); | ||
4898 | connect_change = 0; | ||
4899 | } | ||
4900 | /* | ||
4901 | * On disconnect USB3 protocol ports transit from U0 to | ||
4902 | * SS.Inactive to Rx.Detect. If this happens a warm- | ||
4903 | * reset is not needed, but a (re)connect may happen | ||
4904 | * before khubd runs and sees the disconnect, and the | ||
4905 | * device may be an unknown state. | ||
4906 | * | ||
4907 | * If the port went through SS.Inactive without khubd | ||
4908 | * seeing it the C_LINK_STATE change flag will be set, | ||
4909 | * and we reset the dev to put it in a known state. | ||
4910 | */ | ||
4911 | } else if (udev && hub_is_superspeed(hub->hdev) && | ||
4912 | (portchange & USB_PORT_STAT_C_LINK_STATE) && | ||
4913 | (portstatus & USB_PORT_STAT_CONNECTION)) { | ||
4914 | usb_lock_device(udev); | ||
4915 | usb_reset_device(udev); | ||
4916 | usb_unlock_device(udev); | ||
4917 | connect_change = 0; | ||
4918 | } | ||
4919 | |||
4920 | if (connect_change) | ||
4921 | hub_port_connect_change(hub, i, | ||
4922 | portstatus, portchange); | ||
4923 | } /* end for i */ | ||
4924 | 5009 | ||
4925 | /* deal with hub status changes */ | 5010 | /* deal with hub status changes */ |
4926 | if (test_and_clear_bit(0, hub->event_bits) == 0) | 5011 | if (test_and_clear_bit(0, hub->event_bits) == 0) |
@@ -5155,15 +5240,18 @@ static int descriptors_changed(struct usb_device *udev, | |||
5155 | * if the reset wasn't even attempted. | 5240 | * if the reset wasn't even attempted. |
5156 | * | 5241 | * |
5157 | * Note: | 5242 | * Note: |
5158 | * The caller must own the device lock. For example, it's safe to use | 5243 | * The caller must own the device lock and the port lock, the latter is |
5159 | * this from a driver probe() routine after downloading new firmware. | 5244 | * taken by usb_reset_device(). For example, it's safe to use |
5160 | * For calls that might not occur during probe(), drivers should lock | 5245 | * usb_reset_device() from a driver probe() routine after downloading |
5161 | * the device using usb_lock_device_for_reset(). | 5246 | * new firmware. For calls that might not occur during probe(), drivers |
5247 | * should lock the device using usb_lock_device_for_reset(). | ||
5162 | * | 5248 | * |
5163 | * Locking exception: This routine may also be called from within an | 5249 | * Locking exception: This routine may also be called from within an |
5164 | * autoresume handler. Such usage won't conflict with other tasks | 5250 | * autoresume handler. Such usage won't conflict with other tasks |
5165 | * holding the device lock because these tasks should always call | 5251 | * holding the device lock because these tasks should always call |
5166 | * usb_autopm_resume_device(), thereby preventing any unwanted autoresume. | 5252 | * usb_autopm_resume_device(), thereby preventing any unwanted |
5253 | * autoresume. The autoresume handler is expected to have already | ||
5254 | * acquired the port lock before calling this routine. | ||
5167 | */ | 5255 | */ |
5168 | static int usb_reset_and_verify_device(struct usb_device *udev) | 5256 | static int usb_reset_and_verify_device(struct usb_device *udev) |
5169 | { | 5257 | { |
@@ -5182,11 +5270,9 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
5182 | return -EINVAL; | 5270 | return -EINVAL; |
5183 | } | 5271 | } |
5184 | 5272 | ||
5185 | if (!parent_hdev) { | 5273 | if (!parent_hdev) |
5186 | /* this requires hcd-specific logic; see ohci_restart() */ | ||
5187 | dev_dbg(&udev->dev, "%s for root hub!\n", __func__); | ||
5188 | return -EISDIR; | 5274 | return -EISDIR; |
5189 | } | 5275 | |
5190 | parent_hub = usb_hub_to_struct_hub(parent_hdev); | 5276 | parent_hub = usb_hub_to_struct_hub(parent_hdev); |
5191 | 5277 | ||
5192 | /* Disable USB2 hardware LPM. | 5278 | /* Disable USB2 hardware LPM. |
@@ -5215,7 +5301,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
5215 | goto re_enumerate; | 5301 | goto re_enumerate; |
5216 | } | 5302 | } |
5217 | 5303 | ||
5218 | set_bit(port1, parent_hub->busy_bits); | ||
5219 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { | 5304 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { |
5220 | 5305 | ||
5221 | /* ep0 maxpacket size may change; let the HCD know about it. | 5306 | /* ep0 maxpacket size may change; let the HCD know about it. |
@@ -5225,7 +5310,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
5225 | if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV) | 5310 | if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV) |
5226 | break; | 5311 | break; |
5227 | } | 5312 | } |
5228 | clear_bit(port1, parent_hub->busy_bits); | ||
5229 | 5313 | ||
5230 | if (ret < 0) | 5314 | if (ret < 0) |
5231 | goto re_enumerate; | 5315 | goto re_enumerate; |
@@ -5346,7 +5430,9 @@ int usb_reset_device(struct usb_device *udev) | |||
5346 | int ret; | 5430 | int ret; |
5347 | int i; | 5431 | int i; |
5348 | unsigned int noio_flag; | 5432 | unsigned int noio_flag; |
5433 | struct usb_port *port_dev; | ||
5349 | struct usb_host_config *config = udev->actconfig; | 5434 | struct usb_host_config *config = udev->actconfig; |
5435 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); | ||
5350 | 5436 | ||
5351 | if (udev->state == USB_STATE_NOTATTACHED || | 5437 | if (udev->state == USB_STATE_NOTATTACHED || |
5352 | udev->state == USB_STATE_SUSPENDED) { | 5438 | udev->state == USB_STATE_SUSPENDED) { |
@@ -5355,6 +5441,14 @@ int usb_reset_device(struct usb_device *udev) | |||
5355 | return -EINVAL; | 5441 | return -EINVAL; |
5356 | } | 5442 | } |
5357 | 5443 | ||
5444 | if (!udev->parent) { | ||
5445 | /* this requires hcd-specific logic; see ohci_restart() */ | ||
5446 | dev_dbg(&udev->dev, "%s for root hub!\n", __func__); | ||
5447 | return -EISDIR; | ||
5448 | } | ||
5449 | |||
5450 | port_dev = hub->ports[udev->portnum - 1]; | ||
5451 | |||
5358 | /* | 5452 | /* |
5359 | * Don't allocate memory with GFP_KERNEL in current | 5453 | * Don't allocate memory with GFP_KERNEL in current |
5360 | * context to avoid possible deadlock if usb mass | 5454 | * context to avoid possible deadlock if usb mass |
@@ -5388,7 +5482,9 @@ int usb_reset_device(struct usb_device *udev) | |||
5388 | } | 5482 | } |
5389 | } | 5483 | } |
5390 | 5484 | ||
5485 | usb_lock_port(port_dev); | ||
5391 | ret = usb_reset_and_verify_device(udev); | 5486 | ret = usb_reset_and_verify_device(udev); |
5487 | usb_unlock_port(port_dev); | ||
5392 | 5488 | ||
5393 | if (config) { | 5489 | if (config) { |
5394 | for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) { | 5490 | for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) { |
@@ -5483,56 +5579,26 @@ struct usb_device *usb_hub_find_child(struct usb_device *hdev, | |||
5483 | } | 5579 | } |
5484 | EXPORT_SYMBOL_GPL(usb_hub_find_child); | 5580 | EXPORT_SYMBOL_GPL(usb_hub_find_child); |
5485 | 5581 | ||
5486 | /** | ||
5487 | * usb_set_hub_port_connect_type - set hub port connect type. | ||
5488 | * @hdev: USB device belonging to the usb hub | ||
5489 | * @port1: port num of the port | ||
5490 | * @type: connect type of the port | ||
5491 | */ | ||
5492 | void usb_set_hub_port_connect_type(struct usb_device *hdev, int port1, | ||
5493 | enum usb_port_connect_type type) | ||
5494 | { | ||
5495 | struct usb_hub *hub = usb_hub_to_struct_hub(hdev); | ||
5496 | |||
5497 | if (hub) | ||
5498 | hub->ports[port1 - 1]->connect_type = type; | ||
5499 | } | ||
5500 | |||
5501 | /** | ||
5502 | * usb_get_hub_port_connect_type - Get the port's connect type | ||
5503 | * @hdev: USB device belonging to the usb hub | ||
5504 | * @port1: port num of the port | ||
5505 | * | ||
5506 | * Return: The connect type of the port if successful. Or | ||
5507 | * USB_PORT_CONNECT_TYPE_UNKNOWN if input params are invalid. | ||
5508 | */ | ||
5509 | enum usb_port_connect_type | ||
5510 | usb_get_hub_port_connect_type(struct usb_device *hdev, int port1) | ||
5511 | { | ||
5512 | struct usb_hub *hub = usb_hub_to_struct_hub(hdev); | ||
5513 | |||
5514 | if (!hub) | ||
5515 | return USB_PORT_CONNECT_TYPE_UNKNOWN; | ||
5516 | |||
5517 | return hub->ports[port1 - 1]->connect_type; | ||
5518 | } | ||
5519 | |||
5520 | void usb_hub_adjust_deviceremovable(struct usb_device *hdev, | 5582 | void usb_hub_adjust_deviceremovable(struct usb_device *hdev, |
5521 | struct usb_hub_descriptor *desc) | 5583 | struct usb_hub_descriptor *desc) |
5522 | { | 5584 | { |
5585 | struct usb_hub *hub = usb_hub_to_struct_hub(hdev); | ||
5523 | enum usb_port_connect_type connect_type; | 5586 | enum usb_port_connect_type connect_type; |
5524 | int i; | 5587 | int i; |
5525 | 5588 | ||
5589 | if (!hub) | ||
5590 | return; | ||
5591 | |||
5526 | if (!hub_is_superspeed(hdev)) { | 5592 | if (!hub_is_superspeed(hdev)) { |
5527 | for (i = 1; i <= hdev->maxchild; i++) { | 5593 | for (i = 1; i <= hdev->maxchild; i++) { |
5528 | connect_type = usb_get_hub_port_connect_type(hdev, i); | 5594 | struct usb_port *port_dev = hub->ports[i - 1]; |
5529 | 5595 | ||
5596 | connect_type = port_dev->connect_type; | ||
5530 | if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { | 5597 | if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { |
5531 | u8 mask = 1 << (i%8); | 5598 | u8 mask = 1 << (i%8); |
5532 | 5599 | ||
5533 | if (!(desc->u.hs.DeviceRemovable[i/8] & mask)) { | 5600 | if (!(desc->u.hs.DeviceRemovable[i/8] & mask)) { |
5534 | dev_dbg(&hdev->dev, "usb port%d's DeviceRemovable is changed to 1 according to platform information.\n", | 5601 | dev_dbg(&port_dev->dev, "DeviceRemovable is changed to 1 according to platform information.\n"); |
5535 | i); | ||
5536 | desc->u.hs.DeviceRemovable[i/8] |= mask; | 5602 | desc->u.hs.DeviceRemovable[i/8] |= mask; |
5537 | } | 5603 | } |
5538 | } | 5604 | } |
@@ -5541,14 +5607,14 @@ void usb_hub_adjust_deviceremovable(struct usb_device *hdev, | |||
5541 | u16 port_removable = le16_to_cpu(desc->u.ss.DeviceRemovable); | 5607 | u16 port_removable = le16_to_cpu(desc->u.ss.DeviceRemovable); |
5542 | 5608 | ||
5543 | for (i = 1; i <= hdev->maxchild; i++) { | 5609 | for (i = 1; i <= hdev->maxchild; i++) { |
5544 | connect_type = usb_get_hub_port_connect_type(hdev, i); | 5610 | struct usb_port *port_dev = hub->ports[i - 1]; |
5545 | 5611 | ||
5612 | connect_type = port_dev->connect_type; | ||
5546 | if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { | 5613 | if (connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { |
5547 | u16 mask = 1 << i; | 5614 | u16 mask = 1 << i; |
5548 | 5615 | ||
5549 | if (!(port_removable & mask)) { | 5616 | if (!(port_removable & mask)) { |
5550 | dev_dbg(&hdev->dev, "usb port%d's DeviceRemovable is changed to 1 according to platform information.\n", | 5617 | dev_dbg(&port_dev->dev, "DeviceRemovable is changed to 1 according to platform information.\n"); |
5551 | i); | ||
5552 | port_removable |= mask; | 5618 | port_removable |= mask; |
5553 | } | 5619 | } |
5554 | } | 5620 | } |