Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / drivers / usb / core / driver.c
index 56593a9..dadd1e8 100644 (file)
@@ -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
@@ -502,11 +506,15 @@ static int usb_unbind_interface(struct device *dev)
 int usb_driver_claim_interface(struct usb_driver *driver,
                                struct usb_interface *iface, void *priv)
 {
-       struct device *dev = &iface->dev;
+       struct device *dev;
        struct usb_device *udev;
        int retval = 0;
-       int lpm_disable_error;
+       int lpm_disable_error = -ENODEV;
 
+       if (!iface)
+               return -ENODEV;
+
+       dev = &iface->dev;
        if (dev->driver)
                return -EBUSY;
 
@@ -522,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