diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2008-03-03 15:15:36 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-04-25 00:16:32 -0400 |
commit | 3bb1af5243d41af9518728445e9c9bd30dd47237 (patch) | |
tree | 83a82f0bb1ca4ab268b49a9d1e06548bb33e52ef /drivers/usb/host | |
parent | 8f7f85e9f9561507b009d26395c53e70758695ec (diff) |
USB: EHCI: carry out port handover during each root-hub resume
This patch (as1044) causes EHCI port handover for non-high-speed
devices to occur during every root-hub resume, not just in cases where
the controller lost power or was reset. This is necessary because:
When some machines go into suspend, they remove power from
on-board USB devices while retaining suspend current for USB
controllers.
The user might well unplug a USB device while the system is
suspended and then plug it back in before resuming.
A corresponding change is made to the core resume routine; now
high-speed root hubs will always be resumed when the system wakes up,
even if they were suspended before the system went to sleep. If this
weren't done then EHCI port handover wouldn't work, since it is called
when the EHCI root hub is resumed.
Finally, a comment is added to the hub driver explaining the khubd has
to be freezable; if it weren't frozen then it could interfere with
port handover.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/ehci-pci.c | 1 |
2 files changed, 1 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 4e065e556e4b..8d513a15d0cd 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -281,9 +281,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
281 | ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable); | 281 | ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable); |
282 | 282 | ||
283 | spin_unlock_irq (&ehci->lock); | 283 | spin_unlock_irq (&ehci->lock); |
284 | 284 | ehci_handover_companion_ports(ehci); | |
285 | if (!power_okay) | ||
286 | ehci_handover_companion_ports(ehci); | ||
287 | return 0; | 285 | return 0; |
288 | } | 286 | } |
289 | 287 | ||
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 72ccd56e36dd..040bd8632eb3 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -329,7 +329,6 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
329 | 329 | ||
330 | /* here we "know" root ports should always stay powered */ | 330 | /* here we "know" root ports should always stay powered */ |
331 | ehci_port_power(ehci, 1); | 331 | ehci_port_power(ehci, 1); |
332 | ehci_handover_companion_ports(ehci); | ||
333 | 332 | ||
334 | hcd->state = HC_STATE_SUSPENDED; | 333 | hcd->state = HC_STATE_SUSPENDED; |
335 | return 0; | 334 | return 0; |