aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2011-06-15 16:29:16 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-06-15 20:44:56 -0400
commitcbb330045e5df8f665ac60227ff898421fc8fb92 (patch)
tree905598ff170b0fde21c72ad7edde2674ac5fdad1 /drivers
parent578333ab95f70db13951d30a9ad6b565b61639a9 (diff)
USB: don't let the hub driver prevent system sleep
This patch (as1465) continues implementation of the policy that errors during suspend or hibernation should not prevent the system from going to sleep. In this case, failure to turn on the Suspend feature for a hub port shouldn't be reported as an error. There are situations where this does actually occur (such as when the device plugged into that port was disconnected in the recent past), and it turns out to be harmless. There's no reason for it to prevent a system sleep. Also, don't allow the hub driver to fail a system suspend if the downstream ports aren't all suspended. This is also harmless (and should never happen, given the change mentioned above); printing a warning message in the kernel log is all we really need to do. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> CC: <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/core/hub.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 90ae1753dda1..c2ac08755f27 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2362,6 +2362,10 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
2362 USB_DEVICE_REMOTE_WAKEUP, 0, 2362 USB_DEVICE_REMOTE_WAKEUP, 0,
2363 NULL, 0, 2363 NULL, 0,
2364 USB_CTRL_SET_TIMEOUT); 2364 USB_CTRL_SET_TIMEOUT);
2365
2366 /* System sleep transitions should never fail */
2367 if (!(msg.event & PM_EVENT_AUTO))
2368 status = 0;
2365 } else { 2369 } else {
2366 /* device has up to 10 msec to fully suspend */ 2370 /* device has up to 10 msec to fully suspend */
2367 dev_dbg(&udev->dev, "usb %ssuspend\n", 2371 dev_dbg(&udev->dev, "usb %ssuspend\n",
@@ -2611,16 +2615,15 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
2611 struct usb_device *hdev = hub->hdev; 2615 struct usb_device *hdev = hub->hdev;
2612 unsigned port1; 2616 unsigned port1;
2613 2617
2614 /* fail if children aren't already suspended */ 2618 /* Warn if children aren't already suspended */
2615 for (port1 = 1; port1 <= hdev->maxchild; port1++) { 2619 for (port1 = 1; port1 <= hdev->maxchild; port1++) {
2616 struct usb_device *udev; 2620 struct usb_device *udev;
2617 2621
2618 udev = hdev->children [port1-1]; 2622 udev = hdev->children [port1-1];
2619 if (udev && udev->can_submit) { 2623 if (udev && udev->can_submit) {
2620 if (!(msg.event & PM_EVENT_AUTO)) 2624 dev_warn(&intf->dev, "port %d nyet suspended\n", port1);
2621 dev_dbg(&intf->dev, "port %d nyet suspended\n", 2625 if (msg.event & PM_EVENT_AUTO)
2622 port1); 2626 return -EBUSY;
2623 return -EBUSY;
2624 } 2627 }
2625 } 2628 }
2626 2629