|
@@ -284,7 +284,7 @@ static int usb_probe_interface(struct device *dev)
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
const struct usb_device_id *id;
|
|
|
int error = -ENODEV;
|
|
|
- int lpm_disable_error;
|
|
|
+ int lpm_disable_error = -ENODEV;
|
|
|
|
|
|
dev_dbg(dev, "%s\n", __func__);
|
|
|
|
|
@@ -336,12 +336,14 @@ static int usb_probe_interface(struct device *dev)
|
|
|
* setting during probe, that should also be fine. usb_set_interface()
|
|
|
* will attempt to disable LPM, and fail if it can't disable it.
|
|
|
*/
|
|
|
- lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
- if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
|
|
|
- dev_err(&intf->dev, "%s Failed to disable LPM for driver %s\n.",
|
|
|
- __func__, driver->name);
|
|
|
- error = lpm_disable_error;
|
|
|
- goto err;
|
|
|
+ if (driver->disable_hub_initiated_lpm) {
|
|
|
+ lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
+ if (lpm_disable_error) {
|
|
|
+ dev_err(&intf->dev, "%s Failed to disable LPM for driver %s\n.",
|
|
|
+ __func__, driver->name);
|
|
|
+ error = lpm_disable_error;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Carry out a deferred switch to altsetting 0 */
|
|
@@ -391,7 +393,8 @@ static int usb_unbind_interface(struct device *dev)
|
|
|
struct usb_interface *intf = to_usb_interface(dev);
|
|
|
struct usb_host_endpoint *ep, **eps = NULL;
|
|
|
struct usb_device *udev;
|
|
|
- int i, j, error, r, lpm_disable_error;
|
|
|
+ int i, j, error, r;
|
|
|
+ int lpm_disable_error = -ENODEV;
|
|
|
|
|
|
intf->condition = USB_INTERFACE_UNBINDING;
|
|
|
|
|
@@ -399,12 +402,13 @@ static int usb_unbind_interface(struct device *dev)
|
|
|
udev = interface_to_usbdev(intf);
|
|
|
error = usb_autoresume_device(udev);
|
|
|
|
|
|
- /* Hub-initiated LPM policy may change, so attempt to disable LPM until
|
|
|
+ /* If hub-initiated LPM policy may change, attempt to disable LPM until
|
|
|
* the driver is unbound. If LPM isn't disabled, that's fine because it
|
|
|
* wouldn't be enabled unless all the bound interfaces supported
|
|
|
* hub-initiated LPM.
|
|
|
*/
|
|
|
- lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
+ if (driver->disable_hub_initiated_lpm)
|
|
|
+ lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
|
|
|
/*
|
|
|
* Terminate all URBs for this interface unless the driver
|
|
@@ -505,7 +509,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
|
|
|
struct device *dev;
|
|
|
struct usb_device *udev;
|
|
|
int retval = 0;
|
|
|
- int lpm_disable_error;
|
|
|
+ int lpm_disable_error = -ENODEV;
|
|
|
|
|
|
if (!iface)
|
|
|
return -ENODEV;
|
|
@@ -526,12 +530,14 @@ int usb_driver_claim_interface(struct usb_driver *driver,
|
|
|
|
|
|
iface->condition = USB_INTERFACE_BOUND;
|
|
|
|
|
|
- /* Disable LPM until this driver is bound. */
|
|
|
- lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
- if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
|
|
|
- dev_err(&iface->dev, "%s Failed to disable LPM for driver %s\n.",
|
|
|
- __func__, driver->name);
|
|
|
- return -ENOMEM;
|
|
|
+ /* See the comment about disabling LPM in usb_probe_interface(). */
|
|
|
+ if (driver->disable_hub_initiated_lpm) {
|
|
|
+ lpm_disable_error = usb_unlocked_disable_lpm(udev);
|
|
|
+ if (lpm_disable_error) {
|
|
|
+ dev_err(&iface->dev, "%s Failed to disable LPM for driver %s\n.",
|
|
|
+ __func__, driver->name);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Claimed interfaces are initially inactive (suspended) and
|