diff options
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ehci-pci.c | 14 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hcd.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ohci-q.c | 2 |
4 files changed, 19 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 40e8240b7851..4e065e556e4b 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -135,8 +135,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
135 | hcd->state = HC_STATE_QUIESCING; | 135 | hcd->state = HC_STATE_QUIESCING; |
136 | } | 136 | } |
137 | ehci->command = ehci_readl(ehci, &ehci->regs->command); | 137 | ehci->command = ehci_readl(ehci, &ehci->regs->command); |
138 | if (ehci->reclaim) | ||
139 | end_unlink_async(ehci); | ||
140 | ehci_work(ehci); | 138 | ehci_work(ehci); |
141 | 139 | ||
142 | /* Unlike other USB host controller types, EHCI doesn't have | 140 | /* Unlike other USB host controller types, EHCI doesn't have |
@@ -180,6 +178,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
180 | ehci_halt (ehci); | 178 | ehci_halt (ehci); |
181 | hcd->state = HC_STATE_SUSPENDED; | 179 | hcd->state = HC_STATE_SUSPENDED; |
182 | 180 | ||
181 | if (ehci->reclaim) | ||
182 | end_unlink_async(ehci); | ||
183 | |||
183 | /* allow remote wakeup */ | 184 | /* allow remote wakeup */ |
184 | mask = INTR_MASK; | 185 | mask = INTR_MASK; |
185 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) | 186 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 3ba01664f821..72ccd56e36dd 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -152,6 +152,20 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
152 | break; | 152 | break; |
153 | } | 153 | } |
154 | break; | 154 | break; |
155 | case PCI_VENDOR_ID_VIA: | ||
156 | if (pdev->device == 0x3104 && (pdev->revision & 0xf0) == 0x60) { | ||
157 | u8 tmp; | ||
158 | |||
159 | /* The VT6212 defaults to a 1 usec EHCI sleep time which | ||
160 | * hogs the PCI bus *badly*. Setting bit 5 of 0x4B makes | ||
161 | * that sleep time use the conventional 10 usec. | ||
162 | */ | ||
163 | pci_read_config_byte(pdev, 0x4b, &tmp); | ||
164 | if (tmp & 0x20) | ||
165 | break; | ||
166 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); | ||
167 | } | ||
168 | break; | ||
155 | } | 169 | } |
156 | 170 | ||
157 | ehci_reset(ehci); | 171 | ehci_reset(ehci); |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index dd4798ee028e..33f1c1c32edf 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -467,7 +467,7 @@ static void unlink_watchdog_func(unsigned long _ohci) | |||
467 | out: | 467 | out: |
468 | kfree(seen); | 468 | kfree(seen); |
469 | if (ohci->eds_scheduled) | 469 | if (ohci->eds_scheduled) |
470 | mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ)); | 470 | mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ)); |
471 | done: | 471 | done: |
472 | spin_unlock_irqrestore(&ohci->lock, flags); | 472 | spin_unlock_irqrestore(&ohci->lock, flags); |
473 | } | 473 | } |
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index 51817322232b..9c9f3b59186f 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
@@ -169,7 +169,7 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed) | |||
169 | if (quirk_zfmicro(ohci) | 169 | if (quirk_zfmicro(ohci) |
170 | && (ed->type == PIPE_INTERRUPT) | 170 | && (ed->type == PIPE_INTERRUPT) |
171 | && !(ohci->eds_scheduled++)) | 171 | && !(ohci->eds_scheduled++)) |
172 | mod_timer(&ohci->unlink_watchdog, round_jiffies_relative(HZ)); | 172 | mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ)); |
173 | wmb (); | 173 | wmb (); |
174 | 174 | ||
175 | /* we care about rm_list when setting CLE/BLE in case the HC was at | 175 | /* we care about rm_list when setting CLE/BLE in case the HC was at |