USB: remove LPM management from usb_driver_claim_interface()
usb_driver_claim_interface() disables and re-enables Link Power
Management, but it shouldn't do either one, for the reasons listed
below. This patch removes the two LPM-related function calls from the
routine.
The reason for disabling LPM in the analogous function
usb_probe_interface() is so that drivers won't have to deal with
unwanted LPM transitions in their probe routine. But
usb_driver_claim_interface() doesn't call the driver's probe routine
(or any other callbacks), so that reason doesn't apply here.
Furthermore, no driver other than usbfs will ever call
usb_driver_claim_interface() unless it is already bound to another
interface in the same device, which means disabling LPM here would be
redundant. usbfs doesn't interact with LPM at all.
Lastly, the error return from usb_unlocked_disable_lpm() isn't handled
properly; the code doesn't clean up its earlier actions before
returning.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Fixes: 8306095fd2
("USB: Disable USB 3.0 LPM in critical sections.")
CC: <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
81e0403b26
commit
c183813fce
@ -512,7 +512,6 @@ int usb_driver_claim_interface(struct usb_driver *driver,
|
|||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
int lpm_disable_error = -ENODEV;
|
|
||||||
|
|
||||||
if (!iface)
|
if (!iface)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -533,16 +532,6 @@ int usb_driver_claim_interface(struct usb_driver *driver,
|
|||||||
|
|
||||||
iface->condition = USB_INTERFACE_BOUND;
|
iface->condition = USB_INTERFACE_BOUND;
|
||||||
|
|
||||||
/* 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
|
/* Claimed interfaces are initially inactive (suspended) and
|
||||||
* runtime-PM-enabled, but only if the driver has autosuspend
|
* runtime-PM-enabled, but only if the driver has autosuspend
|
||||||
* support. Otherwise they are marked active, to prevent the
|
* support. Otherwise they are marked active, to prevent the
|
||||||
@ -561,10 +550,6 @@ int usb_driver_claim_interface(struct usb_driver *driver,
|
|||||||
if (device_is_registered(dev))
|
if (device_is_registered(dev))
|
||||||
retval = device_bind_driver(dev);
|
retval = device_bind_driver(dev);
|
||||||
|
|
||||||
/* Attempt to re-enable USB3 LPM, if the disable was successful. */
|
|
||||||
if (!lpm_disable_error)
|
|
||||||
usb_unlocked_enable_lpm(udev);
|
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_driver_claim_interface);
|
EXPORT_SYMBOL_GPL(usb_driver_claim_interface);
|
||||||
|
Loading…
Reference in New Issue
Block a user