diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 38c3dd2a44e092515fc9fbbd2fa68d3416f66dda..63d47946e3dbac5025f1f4f3efe4a9f0610d1dc9 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -1050,8 +1050,15 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) break; } } - if (status == 0) + if (status == 0) { + + /* Non-root devices don't need to do anything for FREEZE + * or PRETHAW. */ + if (udev->parent && (msg.event == PM_EVENT_FREEZE || + msg.event == PM_EVENT_PRETHAW)) + goto done; status = usb_suspend_device(udev, msg); + } /* If the suspend failed, resume interfaces that did get suspended */ if (status != 0) { diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 9bbcb20e2d94c3bf5ca96f77d0c1050d87d14eb2..e7ec9b6b7a9323f18939f4fadbc9e6b45d81100a 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c @@ -193,10 +193,6 @@ static void generic_disconnect(struct usb_device *udev) static int generic_suspend(struct usb_device *udev, pm_message_t msg) { - /* USB devices enter SUSPEND state through their hubs, but can be - * marked for FREEZE as soon as their children are already idled. - * But those semantics are useless, so we equate the two (sigh). - */ return usb_port_suspend(udev); }