aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/core/driver.c54
-rw-r--r--drivers/usb/core/hub.c27
-rw-r--r--drivers/usb/core/message.c38
-rw-r--r--include/linux/usb.h2
4 files changed, 120 insertions, 1 deletions
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index f6f81c85c5cf..f536aebc958e 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -288,6 +288,7 @@ static int usb_probe_interface(struct device *dev)
288 struct usb_device *udev = interface_to_usbdev(intf); 288 struct usb_device *udev = interface_to_usbdev(intf);
289 const struct usb_device_id *id; 289 const struct usb_device_id *id;
290 int error = -ENODEV; 290 int error = -ENODEV;
291 int lpm_disable_error;
291 292
292 dev_dbg(dev, "%s\n", __func__); 293 dev_dbg(dev, "%s\n", __func__);
293 294
@@ -324,6 +325,25 @@ static int usb_probe_interface(struct device *dev)
324 if (driver->supports_autosuspend) 325 if (driver->supports_autosuspend)
325 pm_runtime_enable(dev); 326 pm_runtime_enable(dev);
326 327
328 /* If the new driver doesn't allow hub-initiated LPM, and we can't
329 * disable hub-initiated LPM, then fail the probe.
330 *
331 * Otherwise, leaving LPM enabled should be harmless, because the
332 * endpoint intervals should remain the same, and the U1/U2 timeouts
333 * should remain the same.
334 *
335 * If we need to install alt setting 0 before probe, or another alt
336 * setting during probe, that should also be fine. usb_set_interface()
337 * will attempt to disable LPM, and fail if it can't disable it.
338 */
339 lpm_disable_error = usb_unlocked_disable_lpm(udev);
340 if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
341 dev_err(&intf->dev, "%s Failed to disable LPM for driver %s\n.",
342 __func__, driver->name);
343 error = lpm_disable_error;
344 goto err;
345 }
346
327 /* Carry out a deferred switch to altsetting 0 */ 347 /* Carry out a deferred switch to altsetting 0 */
328 if (intf->needs_altsetting0) { 348 if (intf->needs_altsetting0) {
329 error = usb_set_interface(udev, intf->altsetting[0]. 349 error = usb_set_interface(udev, intf->altsetting[0].
@@ -338,6 +358,11 @@ static int usb_probe_interface(struct device *dev)
338 goto err; 358 goto err;
339 359
340 intf->condition = USB_INTERFACE_BOUND; 360 intf->condition = USB_INTERFACE_BOUND;
361
362 /* If the LPM disable succeeded, balance the ref counts. */
363 if (!lpm_disable_error)
364 usb_unlocked_enable_lpm(udev);
365
341 usb_autosuspend_device(udev); 366 usb_autosuspend_device(udev);
342 return error; 367 return error;
343 368
@@ -361,7 +386,7 @@ static int usb_unbind_interface(struct device *dev)
361 struct usb_driver *driver = to_usb_driver(dev->driver); 386 struct usb_driver *driver = to_usb_driver(dev->driver);
362 struct usb_interface *intf = to_usb_interface(dev); 387 struct usb_interface *intf = to_usb_interface(dev);
363 struct usb_device *udev; 388 struct usb_device *udev;
364 int error, r; 389 int error, r, lpm_disable_error;
365 390
366 intf->condition = USB_INTERFACE_UNBINDING; 391 intf->condition = USB_INTERFACE_UNBINDING;
367 392
@@ -369,6 +394,13 @@ static int usb_unbind_interface(struct device *dev)
369 udev = interface_to_usbdev(intf); 394 udev = interface_to_usbdev(intf);
370 error = usb_autoresume_device(udev); 395 error = usb_autoresume_device(udev);
371 396
397 /* Hub-initiated LPM policy may change, so attempt to disable LPM until
398 * the driver is unbound. If LPM isn't disabled, that's fine because it
399 * wouldn't be enabled unless all the bound interfaces supported
400 * hub-initiated LPM.
401 */
402 lpm_disable_error = usb_unlocked_disable_lpm(udev);
403
372 /* Terminate all URBs for this interface unless the driver 404 /* Terminate all URBs for this interface unless the driver
373 * supports "soft" unbinding. 405 * supports "soft" unbinding.
374 */ 406 */
@@ -402,6 +434,10 @@ static int usb_unbind_interface(struct device *dev)
402 intf->condition = USB_INTERFACE_UNBOUND; 434 intf->condition = USB_INTERFACE_UNBOUND;
403 intf->needs_remote_wakeup = 0; 435 intf->needs_remote_wakeup = 0;
404 436
437 /* Attempt to re-enable USB3 LPM, if the disable succeeded. */
438 if (!lpm_disable_error)
439 usb_unlocked_enable_lpm(udev);
440
405 /* Unbound interfaces are always runtime-PM-disabled and -suspended */ 441 /* Unbound interfaces are always runtime-PM-disabled and -suspended */
406 if (driver->supports_autosuspend) 442 if (driver->supports_autosuspend)
407 pm_runtime_disable(dev); 443 pm_runtime_disable(dev);
@@ -442,17 +478,29 @@ int usb_driver_claim_interface(struct usb_driver *driver,
442 struct usb_interface *iface, void *priv) 478 struct usb_interface *iface, void *priv)
443{ 479{
444 struct device *dev = &iface->dev; 480 struct device *dev = &iface->dev;
481 struct usb_device *udev;
445 int retval = 0; 482 int retval = 0;
483 int lpm_disable_error;
446 484
447 if (dev->driver) 485 if (dev->driver)
448 return -EBUSY; 486 return -EBUSY;
449 487
488 udev = interface_to_usbdev(iface);
489
450 dev->driver = &driver->drvwrap.driver; 490 dev->driver = &driver->drvwrap.driver;
451 usb_set_intfdata(iface, priv); 491 usb_set_intfdata(iface, priv);
452 iface->needs_binding = 0; 492 iface->needs_binding = 0;
453 493
454 iface->condition = USB_INTERFACE_BOUND; 494 iface->condition = USB_INTERFACE_BOUND;
455 495
496 /* Disable LPM until this driver is bound. */
497 lpm_disable_error = usb_unlocked_disable_lpm(udev);
498 if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
499 dev_err(&iface->dev, "%s Failed to disable LPM for driver %s\n.",
500 __func__, driver->name);
501 return -ENOMEM;
502 }
503
456 /* Claimed interfaces are initially inactive (suspended) and 504 /* Claimed interfaces are initially inactive (suspended) and
457 * runtime-PM-enabled, but only if the driver has autosuspend 505 * runtime-PM-enabled, but only if the driver has autosuspend
458 * support. Otherwise they are marked active, to prevent the 506 * support. Otherwise they are marked active, to prevent the
@@ -471,6 +519,10 @@ int usb_driver_claim_interface(struct usb_driver *driver,
471 if (device_is_registered(dev)) 519 if (device_is_registered(dev))
472 retval = device_bind_driver(dev); 520 retval = device_bind_driver(dev);
473 521
522 /* Attempt to re-enable USB3 LPM, if the disable was successful. */
523 if (!lpm_disable_error)
524 usb_unlocked_enable_lpm(udev);
525
474 return retval; 526 return retval;
475} 527}
476EXPORT_SYMBOL_GPL(usb_driver_claim_interface); 528EXPORT_SYMBOL_GPL(usb_driver_claim_interface);
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index fd1ec481aec1..fcc244e9056f 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2702,6 +2702,12 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
2702 if (udev->usb2_hw_lpm_enabled == 1) 2702 if (udev->usb2_hw_lpm_enabled == 1)
2703 usb_set_usb2_hardware_lpm(udev, 0); 2703 usb_set_usb2_hardware_lpm(udev, 0);
2704 2704
2705 if (usb_unlocked_disable_lpm(udev)) {
2706 dev_err(&udev->dev, "%s Failed to disable LPM before suspend\n.",
2707 __func__);
2708 return -ENOMEM;
2709 }
2710
2705 /* see 7.1.7.6 */ 2711 /* see 7.1.7.6 */
2706 if (hub_is_superspeed(hub->hdev)) 2712 if (hub_is_superspeed(hub->hdev))
2707 status = set_port_feature(hub->hdev, 2713 status = set_port_feature(hub->hdev,
@@ -2725,6 +2731,9 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
2725 if (udev->usb2_hw_lpm_capable == 1) 2731 if (udev->usb2_hw_lpm_capable == 1)
2726 usb_set_usb2_hardware_lpm(udev, 1); 2732 usb_set_usb2_hardware_lpm(udev, 1);
2727 2733
2734 /* Try to enable USB3 LPM again */
2735 usb_unlocked_enable_lpm(udev);
2736
2728 /* System sleep transitions should never fail */ 2737 /* System sleep transitions should never fail */
2729 if (!PMSG_IS_AUTO(msg)) 2738 if (!PMSG_IS_AUTO(msg))
2730 status = 0; 2739 status = 0;
@@ -2922,6 +2931,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
2922 /* Try to enable USB2 hardware LPM */ 2931 /* Try to enable USB2 hardware LPM */
2923 if (udev->usb2_hw_lpm_capable == 1) 2932 if (udev->usb2_hw_lpm_capable == 1)
2924 usb_set_usb2_hardware_lpm(udev, 1); 2933 usb_set_usb2_hardware_lpm(udev, 1);
2934
2935 /* Try to enable USB3 LPM */
2936 usb_unlocked_enable_lpm(udev);
2925 } 2937 }
2926 2938
2927 return status; 2939 return status;
@@ -4681,11 +4693,22 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
4681 goto done; 4693 goto done;
4682 4694
4683 mutex_lock(hcd->bandwidth_mutex); 4695 mutex_lock(hcd->bandwidth_mutex);
4696 /* Disable LPM while we reset the device and reinstall the alt settings.
4697 * Device-initiated LPM settings, and system exit latency settings are
4698 * cleared when the device is reset, so we have to set them up again.
4699 */
4700 ret = usb_disable_lpm(udev);
4701 if (ret) {
4702 dev_err(&udev->dev, "%s Failed to disable LPM\n.", __func__);
4703 mutex_unlock(hcd->bandwidth_mutex);
4704 goto done;
4705 }
4684 ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL); 4706 ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL);
4685 if (ret < 0) { 4707 if (ret < 0) {
4686 dev_warn(&udev->dev, 4708 dev_warn(&udev->dev,
4687 "Busted HC? Not enough HCD resources for " 4709 "Busted HC? Not enough HCD resources for "
4688 "old configuration.\n"); 4710 "old configuration.\n");
4711 usb_enable_lpm(udev);
4689 mutex_unlock(hcd->bandwidth_mutex); 4712 mutex_unlock(hcd->bandwidth_mutex);
4690 goto re_enumerate; 4713 goto re_enumerate;
4691 } 4714 }
@@ -4697,6 +4720,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
4697 dev_err(&udev->dev, 4720 dev_err(&udev->dev,
4698 "can't restore configuration #%d (error=%d)\n", 4721 "can't restore configuration #%d (error=%d)\n",
4699 udev->actconfig->desc.bConfigurationValue, ret); 4722 udev->actconfig->desc.bConfigurationValue, ret);
4723 usb_enable_lpm(udev);
4700 mutex_unlock(hcd->bandwidth_mutex); 4724 mutex_unlock(hcd->bandwidth_mutex);
4701 goto re_enumerate; 4725 goto re_enumerate;
4702 } 4726 }
@@ -4735,10 +4759,13 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
4735 desc->bInterfaceNumber, 4759 desc->bInterfaceNumber,
4736 desc->bAlternateSetting, 4760 desc->bAlternateSetting,
4737 ret); 4761 ret);
4762 usb_unlocked_enable_lpm(udev);
4738 goto re_enumerate; 4763 goto re_enumerate;
4739 } 4764 }
4740 } 4765 }
4741 4766
4767 /* Now that the alt settings are re-installed, enable LPM. */
4768 usb_unlocked_enable_lpm(udev);
4742done: 4769done:
4743 return 0; 4770 return 0;
4744 4771
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index ca717da3be95..b548cf1dbc62 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1308,10 +1308,19 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1308 * Remove the current alt setting and add the new alt setting. 1308 * Remove the current alt setting and add the new alt setting.
1309 */ 1309 */
1310 mutex_lock(hcd->bandwidth_mutex); 1310 mutex_lock(hcd->bandwidth_mutex);
1311 /* Disable LPM, and re-enable it once the new alt setting is installed,
1312 * so that the xHCI driver can recalculate the U1/U2 timeouts.
1313 */
1314 if (usb_disable_lpm(dev)) {
1315 dev_err(&iface->dev, "%s Failed to disable LPM\n.", __func__);
1316 mutex_unlock(hcd->bandwidth_mutex);
1317 return -ENOMEM;
1318 }
1311 ret = usb_hcd_alloc_bandwidth(dev, NULL, iface->cur_altsetting, alt); 1319 ret = usb_hcd_alloc_bandwidth(dev, NULL, iface->cur_altsetting, alt);
1312 if (ret < 0) { 1320 if (ret < 0) {
1313 dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n", 1321 dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n",
1314 alternate); 1322 alternate);
1323 usb_enable_lpm(dev);
1315 mutex_unlock(hcd->bandwidth_mutex); 1324 mutex_unlock(hcd->bandwidth_mutex);
1316 return ret; 1325 return ret;
1317 } 1326 }
@@ -1334,6 +1343,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1334 } else if (ret < 0) { 1343 } else if (ret < 0) {
1335 /* Re-instate the old alt setting */ 1344 /* Re-instate the old alt setting */
1336 usb_hcd_alloc_bandwidth(dev, NULL, alt, iface->cur_altsetting); 1345 usb_hcd_alloc_bandwidth(dev, NULL, alt, iface->cur_altsetting);
1346 usb_enable_lpm(dev);
1337 mutex_unlock(hcd->bandwidth_mutex); 1347 mutex_unlock(hcd->bandwidth_mutex);
1338 return ret; 1348 return ret;
1339 } 1349 }
@@ -1354,6 +1364,9 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1354 1364
1355 iface->cur_altsetting = alt; 1365 iface->cur_altsetting = alt;
1356 1366
1367 /* Now that the interface is installed, re-enable LPM. */
1368 usb_unlocked_enable_lpm(dev);
1369
1357 /* If the interface only has one altsetting and the device didn't 1370 /* If the interface only has one altsetting and the device didn't
1358 * accept the request, we attempt to carry out the equivalent action 1371 * accept the request, we attempt to carry out the equivalent action
1359 * by manually clearing the HALT feature for each endpoint in the 1372 * by manually clearing the HALT feature for each endpoint in the
@@ -1437,6 +1450,14 @@ int usb_reset_configuration(struct usb_device *dev)
1437 config = dev->actconfig; 1450 config = dev->actconfig;
1438 retval = 0; 1451 retval = 0;
1439 mutex_lock(hcd->bandwidth_mutex); 1452 mutex_lock(hcd->bandwidth_mutex);
1453 /* Disable LPM, and re-enable it once the configuration is reset, so
1454 * that the xHCI driver can recalculate the U1/U2 timeouts.
1455 */
1456 if (usb_disable_lpm(dev)) {
1457 dev_err(&dev->dev, "%s Failed to disable LPM\n.", __func__);
1458 mutex_unlock(hcd->bandwidth_mutex);
1459 return -ENOMEM;
1460 }
1440 /* Make sure we have enough bandwidth for each alternate setting 0 */ 1461 /* Make sure we have enough bandwidth for each alternate setting 0 */
1441 for (i = 0; i < config->desc.bNumInterfaces; i++) { 1462 for (i = 0; i < config->desc.bNumInterfaces; i++) {
1442 struct usb_interface *intf = config->interface[i]; 1463 struct usb_interface *intf = config->interface[i];
@@ -1465,6 +1486,7 @@ reset_old_alts:
1465 usb_hcd_alloc_bandwidth(dev, NULL, 1486 usb_hcd_alloc_bandwidth(dev, NULL,
1466 alt, intf->cur_altsetting); 1487 alt, intf->cur_altsetting);
1467 } 1488 }
1489 usb_enable_lpm(dev);
1468 mutex_unlock(hcd->bandwidth_mutex); 1490 mutex_unlock(hcd->bandwidth_mutex);
1469 return retval; 1491 return retval;
1470 } 1492 }
@@ -1502,6 +1524,8 @@ reset_old_alts:
1502 create_intf_ep_devs(intf); 1524 create_intf_ep_devs(intf);
1503 } 1525 }
1504 } 1526 }
1527 /* Now that the interfaces are installed, re-enable LPM. */
1528 usb_unlocked_enable_lpm(dev);
1505 return 0; 1529 return 0;
1506} 1530}
1507EXPORT_SYMBOL_GPL(usb_reset_configuration); 1531EXPORT_SYMBOL_GPL(usb_reset_configuration);
@@ -1763,8 +1787,18 @@ free_interfaces:
1763 * this call fails, the device state is unchanged. 1787 * this call fails, the device state is unchanged.
1764 */ 1788 */
1765 mutex_lock(hcd->bandwidth_mutex); 1789 mutex_lock(hcd->bandwidth_mutex);
1790 /* Disable LPM, and re-enable it once the new configuration is
1791 * installed, so that the xHCI driver can recalculate the U1/U2
1792 * timeouts.
1793 */
1794 if (usb_disable_lpm(dev)) {
1795 dev_err(&dev->dev, "%s Failed to disable LPM\n.", __func__);
1796 mutex_unlock(hcd->bandwidth_mutex);
1797 return -ENOMEM;
1798 }
1766 ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); 1799 ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL);
1767 if (ret < 0) { 1800 if (ret < 0) {
1801 usb_enable_lpm(dev);
1768 mutex_unlock(hcd->bandwidth_mutex); 1802 mutex_unlock(hcd->bandwidth_mutex);
1769 usb_autosuspend_device(dev); 1803 usb_autosuspend_device(dev);
1770 goto free_interfaces; 1804 goto free_interfaces;
@@ -1784,6 +1818,7 @@ free_interfaces:
1784 if (!cp) { 1818 if (!cp) {
1785 usb_set_device_state(dev, USB_STATE_ADDRESS); 1819 usb_set_device_state(dev, USB_STATE_ADDRESS);
1786 usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); 1820 usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
1821 usb_enable_lpm(dev);
1787 mutex_unlock(hcd->bandwidth_mutex); 1822 mutex_unlock(hcd->bandwidth_mutex);
1788 usb_autosuspend_device(dev); 1823 usb_autosuspend_device(dev);
1789 goto free_interfaces; 1824 goto free_interfaces;
@@ -1838,6 +1873,9 @@ free_interfaces:
1838 !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) 1873 !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
1839 cp->string = usb_cache_string(dev, cp->desc.iConfiguration); 1874 cp->string = usb_cache_string(dev, cp->desc.iConfiguration);
1840 1875
1876 /* Now that the interfaces are installed, re-enable LPM. */
1877 usb_unlocked_enable_lpm(dev);
1878
1841 /* Now that all the interfaces are set up, register them 1879 /* Now that all the interfaces are set up, register them
1842 * to trigger binding of drivers to interfaces. probe() 1880 * to trigger binding of drivers to interfaces. probe()
1843 * routines may install different altsettings and may 1881 * routines may install different altsettings and may
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 40439dfd81a7..c19297a8779c 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -526,6 +526,7 @@ struct usb_device {
526 unsigned lpm_capable:1; 526 unsigned lpm_capable:1;
527 unsigned usb2_hw_lpm_capable:1; 527 unsigned usb2_hw_lpm_capable:1;
528 unsigned usb2_hw_lpm_enabled:1; 528 unsigned usb2_hw_lpm_enabled:1;
529 unsigned usb3_lpm_enabled:1;
529 int string_langid; 530 int string_langid;
530 531
531 /* static strings from the device */ 532 /* static strings from the device */
@@ -555,6 +556,7 @@ struct usb_device {
555 struct usb3_lpm_parameters u1_params; 556 struct usb3_lpm_parameters u1_params;
556 struct usb3_lpm_parameters u2_params; 557 struct usb3_lpm_parameters u2_params;
557 unsigned lpm_disable_count; 558 unsigned lpm_disable_count;
559 unsigned hub_initiated_lpm_disable_count;
558}; 560};
559#define to_usb_device(d) container_of(d, struct usb_device, dev) 561#define to_usb_device(d) container_of(d, struct usb_device, dev)
560 562