diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2007-06-21 16:25:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 19:34:39 -0400 |
commit | cfa59dab27d1b282886e7772a8f9548236883892 (patch) | |
tree | aaf71c0fb69d5133bfc71451d6541f1b49494dbb /drivers/usb/core | |
parent | e7e6da9eb189dfa221e3bf9c21d58f02adc8983c (diff) |
USB: Don't resume root hub if the controller is suspended
Root hubs can't be resumed if their parent controller device is still
suspended. This patch (as925) adds a check for that condition in
hcd_bus_resume() and prevents it from being treated as a fatal
controller failure.
ehci-hcd is updated to add the corresponding test. Unnecessary
debugging messages are removed from uhci-hcd and dummy-hcd. The
error return code from dummy-hcd is changed to -ESHUTDOWN, the same as
the others. ohci-hcd doesn't need any changes.
Suspend handling in the non-PCI host drivers is somewhat hit-and-miss.
This patch shouldn't have any effect on them.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/hcd.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 5254c50086a8..963520fbef90 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1291,6 +1291,7 @@ int hcd_bus_resume(struct usb_device *rhdev) | |||
1291 | { | 1291 | { |
1292 | struct usb_hcd *hcd = container_of(rhdev->bus, struct usb_hcd, self); | 1292 | struct usb_hcd *hcd = container_of(rhdev->bus, struct usb_hcd, self); |
1293 | int status; | 1293 | int status; |
1294 | int old_state = hcd->state; | ||
1294 | 1295 | ||
1295 | dev_dbg(&rhdev->dev, "usb %s%s\n", | 1296 | dev_dbg(&rhdev->dev, "usb %s%s\n", |
1296 | rhdev->auto_pm ? "auto-" : "", "resume"); | 1297 | rhdev->auto_pm ? "auto-" : "", "resume"); |
@@ -1309,9 +1310,11 @@ int hcd_bus_resume(struct usb_device *rhdev) | |||
1309 | : USB_STATE_ADDRESS); | 1310 | : USB_STATE_ADDRESS); |
1310 | hcd->state = HC_STATE_RUNNING; | 1311 | hcd->state = HC_STATE_RUNNING; |
1311 | } else { | 1312 | } else { |
1313 | hcd->state = old_state; | ||
1312 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", | 1314 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", |
1313 | "resume", status); | 1315 | "resume", status); |
1314 | usb_hc_died(hcd); | 1316 | if (status != -ESHUTDOWN) |
1317 | usb_hc_died(hcd); | ||
1315 | } | 1318 | } |
1316 | return status; | 1319 | return status; |
1317 | } | 1320 | } |