]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/core/driver.c
USB: skip Set-Interface(0) if already in altsetting 0
[linux-2.6-omap-h63xx.git] / drivers / usb / core / driver.c
index 5a7fa6f099584206536c40b21dde9117b79cd5e1..8c081308b0e2d8bf2349d6b9e9703de0548213ac 100644 (file)
@@ -279,7 +279,9 @@ static int usb_unbind_interface(struct device *dev)
         * altsetting means creating new endpoint device entries).
         * When either of these happens, defer the Set-Interface.
         */
-       if (!error && intf->dev.power.status == DPM_ON)
+       if (intf->cur_altsetting->desc.bAlternateSetting == 0)
+               ;       /* Already in altsetting 0 so skip Set-Interface */
+       else if (!error && intf->dev.power.status == DPM_ON)
                usb_set_interface(udev, intf->altsetting[0].
                                desc.bInterfaceNumber, 0);
        else
@@ -1070,7 +1072,8 @@ static int autosuspend_check(struct usb_device *udev, int reschedule)
                                struct usb_driver *driver;
 
                                driver = to_usb_driver(intf->dev.driver);
-                               if (!driver->reset_resume)
+                               if (!driver->reset_resume ||
+                                   intf->needs_remote_wakeup)
                                        return -EOPNOTSUPP;
                        }
                }
@@ -1609,7 +1612,8 @@ int usb_external_resume_device(struct usb_device *udev)
        status = usb_resume_both(udev);
        udev->last_busy = jiffies;
        usb_pm_unlock(udev);
-       do_unbind_rebind(udev, DO_REBIND);
+       if (status == 0)
+               do_unbind_rebind(udev, DO_REBIND);
 
        /* Now that the device is awake, we can start trying to autosuspend
         * it again. */