udev->descriptor = descriptor;  /* for disconnect() calls */
                goto re_enumerate;
        }
-  
+
+       /* Restore the device's previous configuration */
        if (!udev->actconfig)
                goto done;
-
        ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
                        USB_REQ_SET_CONFIGURATION, 0,
                        udev->actconfig->desc.bConfigurationValue, 0,
        }
        usb_set_device_state(udev, USB_STATE_CONFIGURED);
 
+       /* Put interfaces back into the same altsettings as before.
+        * Don't bother to send the Set-Interface request for interfaces
+        * that were already in altsetting 0; besides being unnecessary,
+        * many devices can't handle it.  Instead just reset the host-side
+        * endpoint state.
+        */
        for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
                struct usb_interface *intf = udev->actconfig->interface[i];
                struct usb_interface_descriptor *desc;
 
-               /* set_interface resets host side toggle even
-                * for altsetting zero.  the interface may have no driver.
-                */
                desc = &intf->cur_altsetting->desc;
-               ret = usb_set_interface(udev, desc->bInterfaceNumber,
-                       desc->bAlternateSetting);
+               if (desc->bAlternateSetting == 0) {
+                       usb_disable_interface(udev, intf, true);
+                       usb_enable_interface(udev, intf, true);
+                       ret = 0;
+               } else {
+                       ret = usb_set_interface(udev, desc->bInterfaceNumber,
+                                       desc->bAlternateSetting);
+               }
                if (ret < 0) {
                        dev_err(&udev->dev, "failed to restore interface %d "
                                "altsetting %d (error=%d)\n",