diff options
author | David Brownell <david-b@pacbell.net> | 2006-01-20 16:55:14 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-20 17:49:55 -0500 |
commit | f8aeb3bb8657b207895aa10f75e63f2c48d08985 (patch) | |
tree | a752ed44de17a3f0315cffeddfb944cb33c778aa /drivers/usb/host/ehci-hub.c | |
parent | 4186ecf8ad16dd05759a09594de6a87e48759ba6 (diff) |
[PATCH] USB: EHCI and NF2 quirk
This teaches the EHCI driver about a quirk seen in older NForce2 chips,
adding a workaround to ignore selective suspend requests. Bus-wide
(so-called "global") suspend still works, as does USB wakeup of a
root hub that's globally suspended.
There's still a hole in this support though. Strictly speaking, this
should _fail_ selective suspend requests, rather than ignoring them,
since doing it this way means that devices which should be able to issue
remote wakeup are not going to be able to do that. For now, we'll just
live with that problem ... since usbcore expects to do selective suspend
on the way towards a full bus suspend, and usbcore needs to be able to
do full bus suspend.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/ehci-hub.c')
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 69b0b9be7a64..d03e3cad5ca8 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -359,6 +359,8 @@ static int ehci_hub_control ( | |||
359 | case USB_PORT_FEAT_SUSPEND: | 359 | case USB_PORT_FEAT_SUSPEND: |
360 | if (temp & PORT_RESET) | 360 | if (temp & PORT_RESET) |
361 | goto error; | 361 | goto error; |
362 | if (ehci->no_selective_suspend) | ||
363 | break; | ||
362 | if (temp & PORT_SUSPEND) { | 364 | if (temp & PORT_SUSPEND) { |
363 | if ((temp & PORT_PE) == 0) | 365 | if ((temp & PORT_PE) == 0) |
364 | goto error; | 366 | goto error; |
@@ -514,6 +516,8 @@ static int ehci_hub_control ( | |||
514 | temp &= ~PORT_RWC_BITS; | 516 | temp &= ~PORT_RWC_BITS; |
515 | switch (wValue) { | 517 | switch (wValue) { |
516 | case USB_PORT_FEAT_SUSPEND: | 518 | case USB_PORT_FEAT_SUSPEND: |
519 | if (ehci->no_selective_suspend) | ||
520 | break; | ||
517 | if ((temp & PORT_PE) == 0 | 521 | if ((temp & PORT_PE) == 0 |
518 | || (temp & PORT_RESET) != 0) | 522 | || (temp & PORT_RESET) != 0) |
519 | goto error; | 523 | goto error; |