|
@@ -1187,13 +1187,22 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
|
|
|
for (i = n - 1; i >= 0; --i) {
|
|
|
intf = udev->actconfig->interface[i];
|
|
|
status = usb_suspend_interface(udev, intf, msg);
|
|
|
+
|
|
|
+ /* Ignore errors during system sleep transitions */
|
|
|
+ if (!(msg.event & PM_EVENT_AUTO))
|
|
|
+ status = 0;
|
|
|
if (status != 0)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if (status == 0)
|
|
|
+ if (status == 0) {
|
|
|
status = usb_suspend_device(udev, msg);
|
|
|
|
|
|
+ /* Again, ignore errors during system sleep transitions */
|
|
|
+ if (!(msg.event & PM_EVENT_AUTO))
|
|
|
+ status = 0;
|
|
|
+ }
|
|
|
+
|
|
|
/* If the suspend failed, resume interfaces that did get suspended */
|
|
|
if (status != 0) {
|
|
|
msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME);
|