diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 17:40:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 17:40:30 -0400 |
| commit | 1f9bd4c96a8e918a86e083706e0d3eb7f030b9a3 (patch) | |
| tree | a840b35ca8c193cb0ec5579de3fac4e4e7f47f11 /drivers/usb/host/uhci-hub.c | |
| parent | 00463c1633b6d6a2178d2dc794c0a70ac2f9ce6b (diff) | |
| parent | 7f38aa0f04259d37f26e1e906607f1ebb39c0c5c (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6: (129 commits)
[PATCH] USB Storage: fix Rio Karma eject support build error
USB: Airprime driver improvements to allow full speed EvDO transfers
USB: remove OTG build warning
USB: EHCI update VIA workaround
USB: force root hub resume after power loss
USB: ohci_usb can oops on shutdown
USB: Dealias -110 code (more complete)
USB: Remove unneeded void * casts in core files
USB: u132-hcd: host controller driver for ELAN U132 adapter
USB: ftdi-elan: client driver for ELAN Uxxx adapters
usb serial: support Alcor Micro Corp. USB 2.0 TO RS-232 through pl2303 driver
USB: Moschip 7840 USB-Serial Driver
USB: add PlayStation 2 Trance Vibrator driver
USB: Add ADU support for Ontrak ADU devices
aircable: fix printk format warnings
Add AIRcable USB Bluetooth Dongle Driver
cypress_m8: implement graceful failure handling
cypress_m8: improve control endpoint error handling
cypress_m8: use usb_fill_int_urb where appropriate
cypress_m8: use appropriate URB polling interval
...
Diffstat (limited to 'drivers/usb/host/uhci-hub.c')
| -rw-r--r-- | drivers/usb/host/uhci-hub.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index c545ef92fe29..16fb72eb6fc9 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c | |||
| @@ -84,6 +84,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 84 | unsigned long port_addr) | 84 | unsigned long port_addr) |
| 85 | { | 85 | { |
| 86 | int status; | 86 | int status; |
| 87 | int i; | ||
| 87 | 88 | ||
| 88 | if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) { | 89 | if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) { |
| 89 | CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); | 90 | CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); |
| @@ -92,9 +93,14 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 92 | 93 | ||
| 93 | /* The controller won't actually turn off the RD bit until | 94 | /* The controller won't actually turn off the RD bit until |
| 94 | * it has had a chance to send a low-speed EOP sequence, | 95 | * it has had a chance to send a low-speed EOP sequence, |
| 95 | * which takes 3 bit times (= 2 microseconds). We'll delay | 96 | * which is supposed to take 3 bit times (= 2 microseconds). |
| 96 | * slightly longer for good luck. */ | 97 | * Experiments show that some controllers take longer, so |
| 97 | udelay(4); | 98 | * we'll poll for completion. */ |
| 99 | for (i = 0; i < 10; ++i) { | ||
| 100 | if (!(inw(port_addr) & USBPORTSC_RD)) | ||
| 101 | break; | ||
| 102 | udelay(1); | ||
| 103 | } | ||
| 98 | } | 104 | } |
| 99 | clear_bit(port, &uhci->resuming_ports); | 105 | clear_bit(port, &uhci->resuming_ports); |
| 100 | } | 106 | } |
