diff options
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/Kconfig | 2 | ||||
-rw-r--r-- | drivers/usb/host/ehci-dbg.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 16 | ||||
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 104 | ||||
-rw-r--r-- | drivers/usb/host/ehci-pci.c | 40 | ||||
-rw-r--r-- | drivers/usb/host/ehci.h | 1 | ||||
-rw-r--r-- | drivers/usb/host/hc_crisv10.c | 16 | ||||
-rw-r--r-- | drivers/usb/host/ohci-dbg.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hcd.c | 40 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hub.c | 172 | ||||
-rw-r--r-- | drivers/usb/host/ohci-pnx4008.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/sl811_cs.c | 15 | ||||
-rw-r--r-- | drivers/usb/host/u132-hcd.c | 76 | ||||
-rw-r--r-- | drivers/usb/host/uhci-hcd.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/uhci-q.c | 2 |
15 files changed, 268 insertions, 224 deletions
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index cf10cbc98f80..cc60759083bf 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -153,7 +153,7 @@ config USB_U132_HCD | |||
153 | adapter will *NOT* work with PC cards that do not contain an OHCI | 153 | adapter will *NOT* work with PC cards that do not contain an OHCI |
154 | controller. | 154 | controller. |
155 | 155 | ||
156 | For those PC cards that contain multiple OHCI controllers only ther | 156 | For those PC cards that contain multiple OHCI controllers only the |
157 | first one is used. | 157 | first one is used. |
158 | 158 | ||
159 | The driver consists of two modules, the "ftdi-elan" module is a | 159 | The driver consists of two modules, the "ftdi-elan" module is a |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 34b7a31cd85b..56349d21e6ea 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -492,7 +492,7 @@ show_periodic (struct class_device *class_dev, char *buf) | |||
492 | unsigned i; | 492 | unsigned i; |
493 | __le32 tag; | 493 | __le32 tag; |
494 | 494 | ||
495 | if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, SLAB_ATOMIC))) | 495 | if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, GFP_ATOMIC))) |
496 | return 0; | 496 | return 0; |
497 | seen_count = 0; | 497 | seen_count = 0; |
498 | 498 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9030994aba98..025d33313681 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -126,6 +126,11 @@ static unsigned park = 0; | |||
126 | module_param (park, uint, S_IRUGO); | 126 | module_param (park, uint, S_IRUGO); |
127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); | 127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); |
128 | 128 | ||
129 | /* for flakey hardware, ignore overcurrent indicators */ | ||
130 | static int ignore_oc = 0; | ||
131 | module_param (ignore_oc, bool, S_IRUGO); | ||
132 | MODULE_PARM_DESC (ignore_oc, "ignore bogus hardware overcurrent indications"); | ||
133 | |||
129 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) | 134 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) |
130 | 135 | ||
131 | /*-------------------------------------------------------------------------*/ | 136 | /*-------------------------------------------------------------------------*/ |
@@ -541,9 +546,10 @@ static int ehci_run (struct usb_hcd *hcd) | |||
541 | 546 | ||
542 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); | 547 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); |
543 | ehci_info (ehci, | 548 | ehci_info (ehci, |
544 | "USB %x.%x started, EHCI %x.%02x, driver %s\n", | 549 | "USB %x.%x started, EHCI %x.%02x, driver %s%s\n", |
545 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), | 550 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), |
546 | temp >> 8, temp & 0xff, DRIVER_VERSION); | 551 | temp >> 8, temp & 0xff, DRIVER_VERSION, |
552 | ignore_oc ? ", overcurrent ignored" : ""); | ||
547 | 553 | ||
548 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ | 554 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ |
549 | 555 | ||
@@ -613,9 +619,8 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
613 | unsigned i = HCS_N_PORTS (ehci->hcs_params); | 619 | unsigned i = HCS_N_PORTS (ehci->hcs_params); |
614 | 620 | ||
615 | /* resume root hub? */ | 621 | /* resume root hub? */ |
616 | status = readl (&ehci->regs->command); | 622 | if (!(readl(&ehci->regs->command) & CMD_RUN)) |
617 | if (!(status & CMD_RUN)) | 623 | usb_hcd_resume_root_hub(hcd); |
618 | writel (status | CMD_RUN, &ehci->regs->command); | ||
619 | 624 | ||
620 | while (i--) { | 625 | while (i--) { |
621 | int pstatus = readl (&ehci->regs->port_status [i]); | 626 | int pstatus = readl (&ehci->regs->port_status [i]); |
@@ -632,7 +637,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
632 | */ | 637 | */ |
633 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 638 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
634 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); | 639 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); |
635 | usb_hcd_resume_root_hub(hcd); | ||
636 | } | 640 | } |
637 | } | 641 | } |
638 | 642 | ||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 1b20722c102b..bfe5f307cba6 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -34,6 +34,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
34 | { | 34 | { |
35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
36 | int port; | 36 | int port; |
37 | int mask; | ||
37 | 38 | ||
38 | if (time_before (jiffies, ehci->next_statechange)) | 39 | if (time_before (jiffies, ehci->next_statechange)) |
39 | msleep(5); | 40 | msleep(5); |
@@ -51,14 +52,25 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
51 | ehci->reclaim_ready = 1; | 52 | ehci->reclaim_ready = 1; |
52 | ehci_work(ehci); | 53 | ehci_work(ehci); |
53 | 54 | ||
54 | /* suspend any active/unsuspended ports, maybe allow wakeup */ | 55 | /* Unlike other USB host controller types, EHCI doesn't have |
56 | * any notion of "global" or bus-wide suspend. The driver has | ||
57 | * to manually suspend all the active unsuspended ports, and | ||
58 | * then manually resume them in the bus_resume() routine. | ||
59 | */ | ||
60 | ehci->bus_suspended = 0; | ||
55 | while (port--) { | 61 | while (port--) { |
56 | u32 __iomem *reg = &ehci->regs->port_status [port]; | 62 | u32 __iomem *reg = &ehci->regs->port_status [port]; |
57 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; | 63 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; |
58 | u32 t2 = t1; | 64 | u32 t2 = t1; |
59 | 65 | ||
60 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER)) | 66 | /* keep track of which ports we suspend */ |
67 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER) && | ||
68 | !(t1 & PORT_SUSPEND)) { | ||
61 | t2 |= PORT_SUSPEND; | 69 | t2 |= PORT_SUSPEND; |
70 | set_bit(port, &ehci->bus_suspended); | ||
71 | } | ||
72 | |||
73 | /* enable remote wakeup on all ports */ | ||
62 | if (device_may_wakeup(&hcd->self.root_hub->dev)) | 74 | if (device_may_wakeup(&hcd->self.root_hub->dev)) |
63 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; | 75 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; |
64 | else | 76 | else |
@@ -76,6 +88,13 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
76 | ehci_halt (ehci); | 88 | ehci_halt (ehci); |
77 | hcd->state = HC_STATE_SUSPENDED; | 89 | hcd->state = HC_STATE_SUSPENDED; |
78 | 90 | ||
91 | /* allow remote wakeup */ | ||
92 | mask = INTR_MASK; | ||
93 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) | ||
94 | mask &= ~STS_PCD; | ||
95 | writel(mask, &ehci->regs->intr_enable); | ||
96 | readl(&ehci->regs->intr_enable); | ||
97 | |||
79 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); | 98 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); |
80 | spin_unlock_irq (&ehci->lock); | 99 | spin_unlock_irq (&ehci->lock); |
81 | return 0; | 100 | return 0; |
@@ -88,7 +107,6 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
88 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 107 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
89 | u32 temp; | 108 | u32 temp; |
90 | int i; | 109 | int i; |
91 | int intr_enable; | ||
92 | 110 | ||
93 | if (time_before (jiffies, ehci->next_statechange)) | 111 | if (time_before (jiffies, ehci->next_statechange)) |
94 | msleep(5); | 112 | msleep(5); |
@@ -100,31 +118,30 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
100 | * the last user of the controller, not reset/pm hardware keeping | 118 | * the last user of the controller, not reset/pm hardware keeping |
101 | * state we gave to it. | 119 | * state we gave to it. |
102 | */ | 120 | */ |
121 | temp = readl(&ehci->regs->intr_enable); | ||
122 | ehci_dbg(ehci, "resume root hub%s\n", temp ? "" : " after power loss"); | ||
103 | 123 | ||
104 | /* re-init operational registers in case we lost power */ | 124 | /* at least some APM implementations will try to deliver |
105 | if (readl (&ehci->regs->intr_enable) == 0) { | 125 | * IRQs right away, so delay them until we're ready. |
106 | /* at least some APM implementations will try to deliver | 126 | */ |
107 | * IRQs right away, so delay them until we're ready. | 127 | writel(0, &ehci->regs->intr_enable); |
108 | */ | 128 | |
109 | intr_enable = 1; | 129 | /* re-init operational registers */ |
110 | writel (0, &ehci->regs->segment); | 130 | writel(0, &ehci->regs->segment); |
111 | writel (ehci->periodic_dma, &ehci->regs->frame_list); | 131 | writel(ehci->periodic_dma, &ehci->regs->frame_list); |
112 | writel ((u32)ehci->async->qh_dma, &ehci->regs->async_next); | 132 | writel((u32) ehci->async->qh_dma, &ehci->regs->async_next); |
113 | } else | ||
114 | intr_enable = 0; | ||
115 | ehci_dbg(ehci, "resume root hub%s\n", | ||
116 | intr_enable ? " after power loss" : ""); | ||
117 | 133 | ||
118 | /* restore CMD_RUN, framelist size, and irq threshold */ | 134 | /* restore CMD_RUN, framelist size, and irq threshold */ |
119 | writel (ehci->command, &ehci->regs->command); | 135 | writel (ehci->command, &ehci->regs->command); |
120 | 136 | ||
121 | /* take ports out of suspend */ | 137 | /* manually resume the ports we suspended during bus_suspend() */ |
122 | i = HCS_N_PORTS (ehci->hcs_params); | 138 | i = HCS_N_PORTS (ehci->hcs_params); |
123 | while (i--) { | 139 | while (i--) { |
124 | temp = readl (&ehci->regs->port_status [i]); | 140 | temp = readl (&ehci->regs->port_status [i]); |
125 | temp &= ~(PORT_RWC_BITS | 141 | temp &= ~(PORT_RWC_BITS |
126 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); | 142 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); |
127 | if (temp & PORT_SUSPEND) { | 143 | if (test_bit(i, &ehci->bus_suspended) && |
144 | (temp & PORT_SUSPEND)) { | ||
128 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 145 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
129 | temp |= PORT_RESUME; | 146 | temp |= PORT_RESUME; |
130 | } | 147 | } |
@@ -134,11 +151,12 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
134 | mdelay (20); | 151 | mdelay (20); |
135 | while (i--) { | 152 | while (i--) { |
136 | temp = readl (&ehci->regs->port_status [i]); | 153 | temp = readl (&ehci->regs->port_status [i]); |
137 | if ((temp & PORT_SUSPEND) == 0) | 154 | if (test_bit(i, &ehci->bus_suspended) && |
138 | continue; | 155 | (temp & PORT_SUSPEND)) { |
139 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); | 156 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); |
140 | writel (temp, &ehci->regs->port_status [i]); | 157 | writel (temp, &ehci->regs->port_status [i]); |
141 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); | 158 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); |
159 | } | ||
142 | } | 160 | } |
143 | (void) readl (&ehci->regs->command); | 161 | (void) readl (&ehci->regs->command); |
144 | 162 | ||
@@ -157,8 +175,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
157 | hcd->state = HC_STATE_RUNNING; | 175 | hcd->state = HC_STATE_RUNNING; |
158 | 176 | ||
159 | /* Now we can safely re-enable irqs */ | 177 | /* Now we can safely re-enable irqs */ |
160 | if (intr_enable) | 178 | writel(INTR_MASK, &ehci->regs->intr_enable); |
161 | writel (INTR_MASK, &ehci->regs->intr_enable); | ||
162 | 179 | ||
163 | spin_unlock_irq (&ehci->lock); | 180 | spin_unlock_irq (&ehci->lock); |
164 | return 0; | 181 | return 0; |
@@ -218,6 +235,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
218 | { | 235 | { |
219 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 236 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
220 | u32 temp, status = 0; | 237 | u32 temp, status = 0; |
238 | u32 mask; | ||
221 | int ports, i, retval = 1; | 239 | int ports, i, retval = 1; |
222 | unsigned long flags; | 240 | unsigned long flags; |
223 | 241 | ||
@@ -233,6 +251,18 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
233 | retval++; | 251 | retval++; |
234 | } | 252 | } |
235 | 253 | ||
254 | /* Some boards (mostly VIA?) report bogus overcurrent indications, | ||
255 | * causing massive log spam unless we completely ignore them. It | ||
256 | * may be relevant that VIA VT8235 controlers, where PORT_POWER is | ||
257 | * always set, seem to clear PORT_OCC and PORT_CSC when writing to | ||
258 | * PORT_POWER; that's surprising, but maybe within-spec. | ||
259 | */ | ||
260 | if (!ignore_oc) | ||
261 | mask = PORT_CSC | PORT_PEC | PORT_OCC; | ||
262 | else | ||
263 | mask = PORT_CSC | PORT_PEC; | ||
264 | // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND | ||
265 | |||
236 | /* no hub change reports (bit 0) for now (power, ...) */ | 266 | /* no hub change reports (bit 0) for now (power, ...) */ |
237 | 267 | ||
238 | /* port N changes (bit N)? */ | 268 | /* port N changes (bit N)? */ |
@@ -250,8 +280,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
250 | } | 280 | } |
251 | if (!(temp & PORT_CONNECT)) | 281 | if (!(temp & PORT_CONNECT)) |
252 | ehci->reset_done [i] = 0; | 282 | ehci->reset_done [i] = 0; |
253 | if ((temp & (PORT_CSC | PORT_PEC | PORT_OCC)) != 0 | 283 | if ((temp & mask) != 0 |
254 | // PORT_STAT_C_SUSPEND? | ||
255 | || ((temp & PORT_RESUME) != 0 | 284 | || ((temp & PORT_RESUME) != 0 |
256 | && time_after (jiffies, | 285 | && time_after (jiffies, |
257 | ehci->reset_done [i]))) { | 286 | ehci->reset_done [i]))) { |
@@ -319,6 +348,7 @@ static int ehci_hub_control ( | |||
319 | u32 temp, status; | 348 | u32 temp, status; |
320 | unsigned long flags; | 349 | unsigned long flags; |
321 | int retval = 0; | 350 | int retval = 0; |
351 | unsigned selector; | ||
322 | 352 | ||
323 | /* | 353 | /* |
324 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. | 354 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. |
@@ -417,7 +447,7 @@ static int ehci_hub_control ( | |||
417 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; | 447 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; |
418 | if (temp & PORT_PEC) | 448 | if (temp & PORT_PEC) |
419 | status |= 1 << USB_PORT_FEAT_C_ENABLE; | 449 | status |= 1 << USB_PORT_FEAT_C_ENABLE; |
420 | if (temp & PORT_OCC) | 450 | if ((temp & PORT_OCC) && !ignore_oc) |
421 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; | 451 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; |
422 | 452 | ||
423 | /* whoever resumes must GetPortStatus to complete it!! */ | 453 | /* whoever resumes must GetPortStatus to complete it!! */ |
@@ -506,6 +536,8 @@ static int ehci_hub_control ( | |||
506 | } | 536 | } |
507 | break; | 537 | break; |
508 | case SetPortFeature: | 538 | case SetPortFeature: |
539 | selector = wIndex >> 8; | ||
540 | wIndex &= 0xff; | ||
509 | if (!wIndex || wIndex > ports) | 541 | if (!wIndex || wIndex > ports) |
510 | goto error; | 542 | goto error; |
511 | wIndex--; | 543 | wIndex--; |
@@ -559,6 +591,22 @@ static int ehci_hub_control ( | |||
559 | } | 591 | } |
560 | writel (temp, &ehci->regs->port_status [wIndex]); | 592 | writel (temp, &ehci->regs->port_status [wIndex]); |
561 | break; | 593 | break; |
594 | |||
595 | /* For downstream facing ports (these): one hub port is put | ||
596 | * into test mode according to USB2 11.24.2.13, then the hub | ||
597 | * must be reset (which for root hub now means rmmod+modprobe, | ||
598 | * or else system reboot). See EHCI 2.3.9 and 4.14 for info | ||
599 | * about the EHCI-specific stuff. | ||
600 | */ | ||
601 | case USB_PORT_FEAT_TEST: | ||
602 | if (!selector || selector > 5) | ||
603 | goto error; | ||
604 | ehci_quiesce(ehci); | ||
605 | ehci_halt(ehci); | ||
606 | temp |= selector << 16; | ||
607 | writel (temp, &ehci->regs->port_status [wIndex]); | ||
608 | break; | ||
609 | |||
562 | default: | 610 | default: |
563 | goto error; | 611 | goto error; |
564 | } | 612 | } |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index e51c1ed81ac4..4bc7970ba3ef 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -257,9 +257,7 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | |||
257 | static int ehci_pci_resume(struct usb_hcd *hcd) | 257 | static int ehci_pci_resume(struct usb_hcd *hcd) |
258 | { | 258 | { |
259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
260 | unsigned port; | ||
261 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 260 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
262 | int retval = -EINVAL; | ||
263 | 261 | ||
264 | // maybe restore FLADJ | 262 | // maybe restore FLADJ |
265 | 263 | ||
@@ -269,27 +267,19 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
269 | /* Mark hardware accessible again as we are out of D3 state by now */ | 267 | /* Mark hardware accessible again as we are out of D3 state by now */ |
270 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 268 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
271 | 269 | ||
272 | /* If CF is clear, we lost PCI Vaux power and need to restart. */ | 270 | /* If CF is still set, we maintained PCI Vaux power. |
273 | if (readl(&ehci->regs->configured_flag) != FLAG_CF) | 271 | * Just undo the effect of ehci_pci_suspend(). |
274 | goto restart; | ||
275 | |||
276 | /* If any port is suspended (or owned by the companion), | ||
277 | * we know we can/must resume the HC (and mustn't reset it). | ||
278 | * We just defer that to the root hub code. | ||
279 | */ | 272 | */ |
280 | for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) { | 273 | if (readl(&ehci->regs->configured_flag) == FLAG_CF) { |
281 | u32 status; | 274 | int mask = INTR_MASK; |
282 | port--; | 275 | |
283 | status = readl(&ehci->regs->port_status [port]); | 276 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) |
284 | if (!(status & PORT_POWER)) | 277 | mask &= ~STS_PCD; |
285 | continue; | 278 | writel(mask, &ehci->regs->intr_enable); |
286 | if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) { | 279 | readl(&ehci->regs->intr_enable); |
287 | usb_hcd_resume_root_hub(hcd); | 280 | return 0; |
288 | return 0; | ||
289 | } | ||
290 | } | 281 | } |
291 | 282 | ||
292 | restart: | ||
293 | ehci_dbg(ehci, "lost power, restarting\n"); | 283 | ehci_dbg(ehci, "lost power, restarting\n"); |
294 | usb_root_hub_lost_power(hcd->self.root_hub); | 284 | usb_root_hub_lost_power(hcd->self.root_hub); |
295 | 285 | ||
@@ -307,13 +297,15 @@ restart: | |||
307 | ehci_work(ehci); | 297 | ehci_work(ehci); |
308 | spin_unlock_irq(&ehci->lock); | 298 | spin_unlock_irq(&ehci->lock); |
309 | 299 | ||
310 | /* restart; khubd will disconnect devices */ | ||
311 | retval = ehci_run(hcd); | ||
312 | |||
313 | /* here we "know" root ports should always stay powered */ | 300 | /* here we "know" root ports should always stay powered */ |
314 | ehci_port_power(ehci, 1); | 301 | ehci_port_power(ehci, 1); |
315 | 302 | ||
316 | return retval; | 303 | writel(ehci->command, &ehci->regs->command); |
304 | writel(FLAG_CF, &ehci->regs->configured_flag); | ||
305 | readl(&ehci->regs->command); /* unblock posted writes */ | ||
306 | |||
307 | hcd->state = HC_STATE_SUSPENDED; | ||
308 | return 0; | ||
317 | } | 309 | } |
318 | #endif | 310 | #endif |
319 | 311 | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index bbc3082a73d7..74dbc6c8228f 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -74,6 +74,7 @@ struct ehci_hcd { /* one per controller */ | |||
74 | 74 | ||
75 | /* per root hub port */ | 75 | /* per root hub port */ |
76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; | 76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; |
77 | unsigned long bus_suspended; | ||
77 | 78 | ||
78 | /* per-HC memory pools (could be per-bus, but ...) */ | 79 | /* per-HC memory pools (could be per-bus, but ...) */ |
79 | struct dma_pool *qh_pool; /* qh per active urb */ | 80 | struct dma_pool *qh_pool; /* qh per active urb */ |
diff --git a/drivers/usb/host/hc_crisv10.c b/drivers/usb/host/hc_crisv10.c index 87eca6aeacf2..9325e46a68c0 100644 --- a/drivers/usb/host/hc_crisv10.c +++ b/drivers/usb/host/hc_crisv10.c | |||
@@ -188,7 +188,7 @@ static DEFINE_TIMER(bulk_eot_timer, NULL, 0, 0); | |||
188 | #define CHECK_ALIGN(x) if (((__u32)(x)) & 0x00000003) \ | 188 | #define CHECK_ALIGN(x) if (((__u32)(x)) & 0x00000003) \ |
189 | {panic("Alignment check (DWORD) failed at %s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);} | 189 | {panic("Alignment check (DWORD) failed at %s:%s:%d\n", __FILE__, __FUNCTION__, __LINE__);} |
190 | 190 | ||
191 | #define SLAB_FLAG (in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL) | 191 | #define SLAB_FLAG (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL) |
192 | #define KMALLOC_FLAG (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL) | 192 | #define KMALLOC_FLAG (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL) |
193 | 193 | ||
194 | /* Most helpful debugging aid */ | 194 | /* Most helpful debugging aid */ |
@@ -275,13 +275,13 @@ static volatile USB_SB_Desc_t TxIntrSB_zout __attribute__ ((aligned (4))); | |||
275 | static int zout_buffer[4] __attribute__ ((aligned (4))); | 275 | static int zout_buffer[4] __attribute__ ((aligned (4))); |
276 | 276 | ||
277 | /* Cache for allocating new EP and SB descriptors. */ | 277 | /* Cache for allocating new EP and SB descriptors. */ |
278 | static kmem_cache_t *usb_desc_cache; | 278 | static struct kmem_cache *usb_desc_cache; |
279 | 279 | ||
280 | /* Cache for the registers allocated in the top half. */ | 280 | /* Cache for the registers allocated in the top half. */ |
281 | static kmem_cache_t *top_half_reg_cache; | 281 | static struct kmem_cache *top_half_reg_cache; |
282 | 282 | ||
283 | /* Cache for the data allocated in the isoc descr top half. */ | 283 | /* Cache for the data allocated in the isoc descr top half. */ |
284 | static kmem_cache_t *isoc_compl_cache; | 284 | static struct kmem_cache *isoc_compl_cache; |
285 | 285 | ||
286 | static struct usb_bus *etrax_usb_bus; | 286 | static struct usb_bus *etrax_usb_bus; |
287 | 287 | ||
@@ -1743,7 +1743,7 @@ static irqreturn_t etrax_usb_tx_interrupt(int irq, void *vhc) | |||
1743 | 1743 | ||
1744 | *R_DMA_CH8_SUB3_CLR_INTR = IO_STATE(R_DMA_CH8_SUB3_CLR_INTR, clr_descr, do); | 1744 | *R_DMA_CH8_SUB3_CLR_INTR = IO_STATE(R_DMA_CH8_SUB3_CLR_INTR, clr_descr, do); |
1745 | 1745 | ||
1746 | comp_data = (usb_isoc_complete_data_t*)kmem_cache_alloc(isoc_compl_cache, SLAB_ATOMIC); | 1746 | comp_data = (usb_isoc_complete_data_t*)kmem_cache_alloc(isoc_compl_cache, GFP_ATOMIC); |
1747 | assert(comp_data != NULL); | 1747 | assert(comp_data != NULL); |
1748 | 1748 | ||
1749 | INIT_WORK(&comp_data->usb_bh, etrax_usb_isoc_descr_interrupt_bottom_half, comp_data); | 1749 | INIT_WORK(&comp_data->usb_bh, etrax_usb_isoc_descr_interrupt_bottom_half, comp_data); |
@@ -3010,7 +3010,7 @@ static void etrax_usb_add_to_isoc_sb_list(struct urb *urb, int epid) | |||
3010 | if (!urb->iso_frame_desc[i].length) | 3010 | if (!urb->iso_frame_desc[i].length) |
3011 | continue; | 3011 | continue; |
3012 | 3012 | ||
3013 | next_sb_desc = (USB_SB_Desc_t*)kmem_cache_alloc(usb_desc_cache, SLAB_ATOMIC); | 3013 | next_sb_desc = (USB_SB_Desc_t*)kmem_cache_alloc(usb_desc_cache, GFP_ATOMIC); |
3014 | assert(next_sb_desc != NULL); | 3014 | assert(next_sb_desc != NULL); |
3015 | 3015 | ||
3016 | if (urb->iso_frame_desc[i].length > 0) { | 3016 | if (urb->iso_frame_desc[i].length > 0) { |
@@ -3063,7 +3063,7 @@ static void etrax_usb_add_to_isoc_sb_list(struct urb *urb, int epid) | |||
3063 | if (TxIsocEPList[epid].sub == 0) { | 3063 | if (TxIsocEPList[epid].sub == 0) { |
3064 | dbg_isoc("Isoc traffic not already running, allocating SB"); | 3064 | dbg_isoc("Isoc traffic not already running, allocating SB"); |
3065 | 3065 | ||
3066 | next_sb_desc = (USB_SB_Desc_t*)kmem_cache_alloc(usb_desc_cache, SLAB_ATOMIC); | 3066 | next_sb_desc = (USB_SB_Desc_t*)kmem_cache_alloc(usb_desc_cache, GFP_ATOMIC); |
3067 | assert(next_sb_desc != NULL); | 3067 | assert(next_sb_desc != NULL); |
3068 | 3068 | ||
3069 | next_sb_desc->command = (IO_STATE(USB_SB_command, tt, in) | | 3069 | next_sb_desc->command = (IO_STATE(USB_SB_command, tt, in) | |
@@ -3317,7 +3317,7 @@ static irqreturn_t etrax_usb_hc_interrupt_top_half(int irq, void *vhc) | |||
3317 | 3317 | ||
3318 | restore_flags(flags); | 3318 | restore_flags(flags); |
3319 | 3319 | ||
3320 | reg = (usb_interrupt_registers_t *)kmem_cache_alloc(top_half_reg_cache, SLAB_ATOMIC); | 3320 | reg = (usb_interrupt_registers_t *)kmem_cache_alloc(top_half_reg_cache, GFP_ATOMIC); |
3321 | 3321 | ||
3322 | assert(reg != NULL); | 3322 | assert(reg != NULL); |
3323 | 3323 | ||
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c index 8293c1d4be3f..0f47a57dac28 100644 --- a/drivers/usb/host/ohci-dbg.c +++ b/drivers/usb/host/ohci-dbg.c | |||
@@ -505,7 +505,7 @@ show_periodic (struct class_device *class_dev, char *buf) | |||
505 | char *next; | 505 | char *next; |
506 | unsigned i; | 506 | unsigned i; |
507 | 507 | ||
508 | if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, SLAB_ATOMIC))) | 508 | if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, GFP_ATOMIC))) |
509 | return 0; | 509 | return 0; |
510 | seen_count = 0; | 510 | seen_count = 0; |
511 | 511 | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 9be6b303e784..b28a9b602066 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -715,13 +715,6 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
715 | return IRQ_NOTMINE; | 715 | return IRQ_NOTMINE; |
716 | } | 716 | } |
717 | 717 | ||
718 | if (ints & OHCI_INTR_RHSC) { | ||
719 | ohci_vdbg (ohci, "rhsc\n"); | ||
720 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | ||
721 | ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus); | ||
722 | usb_hcd_poll_rh_status(hcd); | ||
723 | } | ||
724 | |||
725 | if (ints & OHCI_INTR_UE) { | 718 | if (ints & OHCI_INTR_UE) { |
726 | disable (ohci); | 719 | disable (ohci); |
727 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); | 720 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); |
@@ -731,9 +724,31 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
731 | ohci_usb_reset (ohci); | 724 | ohci_usb_reset (ohci); |
732 | } | 725 | } |
733 | 726 | ||
734 | if (ints & OHCI_INTR_RD) { | 727 | if (ints & OHCI_INTR_RHSC) { |
735 | ohci_vdbg (ohci, "resume detect\n"); | 728 | ohci_vdbg(ohci, "rhsc\n"); |
736 | ohci_writel (ohci, OHCI_INTR_RD, ®s->intrstatus); | 729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, | ||
731 | ®s->intrstatus); | ||
732 | |||
733 | /* NOTE: Vendors didn't always make the same implementation | ||
734 | * choices for RHSC. Many followed the spec; RHSC triggers | ||
735 | * on an edge, like setting and maybe clearing a port status | ||
736 | * change bit. With others it's level-triggered, active | ||
737 | * until khubd clears all the port status change bits. We'll | ||
738 | * always disable it here and rely on polling until khubd | ||
739 | * re-enables it. | ||
740 | */ | ||
741 | ohci_writel(ohci, OHCI_INTR_RHSC, ®s->intrdisable); | ||
742 | usb_hcd_poll_rh_status(hcd); | ||
743 | } | ||
744 | |||
745 | /* For connect and disconnect events, we expect the controller | ||
746 | * to turn on RHSC along with RD. But for remote wakeup events | ||
747 | * this might not happen. | ||
748 | */ | ||
749 | else if (ints & OHCI_INTR_RD) { | ||
750 | ohci_vdbg(ohci, "resume detect\n"); | ||
751 | ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus); | ||
737 | hcd->poll_rh = 1; | 752 | hcd->poll_rh = 1; |
738 | if (ohci->autostop) { | 753 | if (ohci->autostop) { |
739 | spin_lock (&ohci->lock); | 754 | spin_lock (&ohci->lock); |
@@ -930,7 +945,7 @@ MODULE_LICENSE ("GPL"); | |||
930 | #include "ohci-ppc-soc.c" | 945 | #include "ohci-ppc-soc.c" |
931 | #endif | 946 | #endif |
932 | 947 | ||
933 | #if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261) | 948 | #ifdef CONFIG_ARCH_AT91 |
934 | #include "ohci-at91.c" | 949 | #include "ohci-at91.c" |
935 | #endif | 950 | #endif |
936 | 951 | ||
@@ -947,8 +962,7 @@ MODULE_LICENSE ("GPL"); | |||
947 | || defined (CONFIG_ARCH_EP93XX) \ | 962 | || defined (CONFIG_ARCH_EP93XX) \ |
948 | || defined (CONFIG_SOC_AU1X00) \ | 963 | || defined (CONFIG_SOC_AU1X00) \ |
949 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ | 964 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ |
950 | || defined (CONFIG_ARCH_AT91RM9200) \ | 965 | || defined (CONFIG_ARCH_AT91) \ |
951 | || defined (CONFIG_ARCH_AT91SAM9261) \ | ||
952 | || defined (CONFIG_ARCH_PNX4008) \ | 966 | || defined (CONFIG_ARCH_PNX4008) \ |
953 | ) | 967 | ) |
954 | #error "missing bus glue for ohci-hcd" | 968 | #error "missing bus glue for ohci-hcd" |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 6f113596af66..2441642cb7b4 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -41,7 +41,11 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
41 | { | 41 | { |
42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
43 | 43 | ||
44 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | 44 | spin_lock_irq(&ohci->lock); |
45 | if (!ohci->autostop) | ||
46 | del_timer(&hcd->rh_timer); /* Prevent next poll */ | ||
47 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
48 | spin_unlock_irq(&ohci->lock); | ||
45 | } | 49 | } |
46 | 50 | ||
47 | #define OHCI_SCHED_ENABLES \ | 51 | #define OHCI_SCHED_ENABLES \ |
@@ -50,6 +54,9 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
50 | static void dl_done_list (struct ohci_hcd *); | 54 | static void dl_done_list (struct ohci_hcd *); |
51 | static void finish_unlinks (struct ohci_hcd *, u16); | 55 | static void finish_unlinks (struct ohci_hcd *, u16); |
52 | 56 | ||
57 | #ifdef CONFIG_PM | ||
58 | static int ohci_restart(struct ohci_hcd *ohci); | ||
59 | |||
53 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) | 60 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) |
54 | __releases(ohci->lock) | 61 | __releases(ohci->lock) |
55 | __acquires(ohci->lock) | 62 | __acquires(ohci->lock) |
@@ -132,8 +139,6 @@ static inline struct ed *find_head (struct ed *ed) | |||
132 | return ed; | 139 | return ed; |
133 | } | 140 | } |
134 | 141 | ||
135 | static int ohci_restart (struct ohci_hcd *ohci); | ||
136 | |||
137 | /* caller has locked the root hub */ | 142 | /* caller has locked the root hub */ |
138 | static int ohci_rh_resume (struct ohci_hcd *ohci) | 143 | static int ohci_rh_resume (struct ohci_hcd *ohci) |
139 | __releases(ohci->lock) | 144 | __releases(ohci->lock) |
@@ -169,7 +174,8 @@ __acquires(ohci->lock) | |||
169 | break; | 174 | break; |
170 | case OHCI_USB_RESUME: | 175 | case OHCI_USB_RESUME: |
171 | /* HCFS changes sometime after INTR_RD */ | 176 | /* HCFS changes sometime after INTR_RD */ |
172 | ohci_info (ohci, "wakeup\n"); | 177 | ohci_dbg(ohci, "%swakeup root hub\n", |
178 | autostopped ? "auto-" : ""); | ||
173 | break; | 179 | break; |
174 | case OHCI_USB_OPER: | 180 | case OHCI_USB_OPER: |
175 | /* this can happen after resuming a swsusp snapshot */ | 181 | /* this can happen after resuming a swsusp snapshot */ |
@@ -180,7 +186,6 @@ __acquires(ohci->lock) | |||
180 | ohci_dbg (ohci, "lost power\n"); | 186 | ohci_dbg (ohci, "lost power\n"); |
181 | status = -EBUSY; | 187 | status = -EBUSY; |
182 | } | 188 | } |
183 | #ifdef CONFIG_PM | ||
184 | if (status == -EBUSY) { | 189 | if (status == -EBUSY) { |
185 | if (!autostopped) { | 190 | if (!autostopped) { |
186 | spin_unlock_irq (&ohci->lock); | 191 | spin_unlock_irq (&ohci->lock); |
@@ -190,25 +195,12 @@ __acquires(ohci->lock) | |||
190 | } | 195 | } |
191 | return status; | 196 | return status; |
192 | } | 197 | } |
193 | #endif | ||
194 | if (status != -EINPROGRESS) | 198 | if (status != -EINPROGRESS) |
195 | return status; | 199 | return status; |
196 | if (autostopped) | 200 | if (autostopped) |
197 | goto skip_resume; | 201 | goto skip_resume; |
198 | spin_unlock_irq (&ohci->lock); | 202 | spin_unlock_irq (&ohci->lock); |
199 | 203 | ||
200 | temp = ohci->num_ports; | ||
201 | while (temp--) { | ||
202 | u32 stat = ohci_readl (ohci, | ||
203 | &ohci->regs->roothub.portstatus [temp]); | ||
204 | |||
205 | /* force global, not selective, resume */ | ||
206 | if (!(stat & RH_PS_PSS)) | ||
207 | continue; | ||
208 | ohci_writel (ohci, RH_PS_POCI, | ||
209 | &ohci->regs->roothub.portstatus [temp]); | ||
210 | } | ||
211 | |||
212 | /* Some controllers (lucent erratum) need extra-long delays */ | 204 | /* Some controllers (lucent erratum) need extra-long delays */ |
213 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); | 205 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); |
214 | 206 | ||
@@ -216,6 +208,7 @@ __acquires(ohci->lock) | |||
216 | temp &= OHCI_CTRL_HCFS; | 208 | temp &= OHCI_CTRL_HCFS; |
217 | if (temp != OHCI_USB_RESUME) { | 209 | if (temp != OHCI_USB_RESUME) { |
218 | ohci_err (ohci, "controller won't resume\n"); | 210 | ohci_err (ohci, "controller won't resume\n"); |
211 | spin_lock_irq(&ohci->lock); | ||
219 | return -EBUSY; | 212 | return -EBUSY; |
220 | } | 213 | } |
221 | 214 | ||
@@ -295,8 +288,6 @@ skip_resume: | |||
295 | return 0; | 288 | return 0; |
296 | } | 289 | } |
297 | 290 | ||
298 | #ifdef CONFIG_PM | ||
299 | |||
300 | static int ohci_bus_suspend (struct usb_hcd *hcd) | 291 | static int ohci_bus_suspend (struct usb_hcd *hcd) |
301 | { | 292 | { |
302 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 293 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
@@ -334,6 +325,83 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
334 | return rc; | 325 | return rc; |
335 | } | 326 | } |
336 | 327 | ||
328 | /* Carry out polling-, autostop-, and autoresume-related state changes */ | ||
329 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
330 | int any_connected) | ||
331 | { | ||
332 | int poll_rh = 1; | ||
333 | |||
334 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
335 | |||
336 | case OHCI_USB_OPER: | ||
337 | /* keep on polling until we know a device is connected | ||
338 | * and RHSC is enabled */ | ||
339 | if (!ohci->autostop) { | ||
340 | if (any_connected || | ||
341 | !device_may_wakeup(&ohci_to_hcd(ohci) | ||
342 | ->self.root_hub->dev)) { | ||
343 | if (ohci_readl(ohci, &ohci->regs->intrenable) & | ||
344 | OHCI_INTR_RHSC) | ||
345 | poll_rh = 0; | ||
346 | } else { | ||
347 | ohci->autostop = 1; | ||
348 | ohci->next_statechange = jiffies + HZ; | ||
349 | } | ||
350 | |||
351 | /* if no devices have been attached for one second, autostop */ | ||
352 | } else { | ||
353 | if (changed || any_connected) { | ||
354 | ohci->autostop = 0; | ||
355 | ohci->next_statechange = jiffies + | ||
356 | STATECHANGE_DELAY; | ||
357 | } else if (time_after_eq(jiffies, | ||
358 | ohci->next_statechange) | ||
359 | && !ohci->ed_rm_list | ||
360 | && !(ohci->hc_control & | ||
361 | OHCI_SCHED_ENABLES)) { | ||
362 | ohci_rh_suspend(ohci, 1); | ||
363 | } | ||
364 | } | ||
365 | break; | ||
366 | |||
367 | /* if there is a port change, autostart or ask to be resumed */ | ||
368 | case OHCI_USB_SUSPEND: | ||
369 | case OHCI_USB_RESUME: | ||
370 | if (changed) { | ||
371 | if (ohci->autostop) | ||
372 | ohci_rh_resume(ohci); | ||
373 | else | ||
374 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); | ||
375 | } else { | ||
376 | /* everything is idle, no need for polling */ | ||
377 | poll_rh = 0; | ||
378 | } | ||
379 | break; | ||
380 | } | ||
381 | return poll_rh; | ||
382 | } | ||
383 | |||
384 | #else /* CONFIG_PM */ | ||
385 | |||
386 | static inline int ohci_rh_resume(struct ohci_hcd *ohci) | ||
387 | { | ||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | /* Carry out polling-related state changes. | ||
392 | * autostop isn't used when CONFIG_PM is turned off. | ||
393 | */ | ||
394 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
395 | int any_connected) | ||
396 | { | ||
397 | int poll_rh = 1; | ||
398 | |||
399 | /* keep on polling until RHSC is enabled */ | ||
400 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) | ||
401 | poll_rh = 0; | ||
402 | return poll_rh; | ||
403 | } | ||
404 | |||
337 | #endif /* CONFIG_PM */ | 405 | #endif /* CONFIG_PM */ |
338 | 406 | ||
339 | /*-------------------------------------------------------------------------*/ | 407 | /*-------------------------------------------------------------------------*/ |
@@ -345,7 +413,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
345 | { | 413 | { |
346 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 414 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
347 | int i, changed = 0, length = 1; | 415 | int i, changed = 0, length = 1; |
348 | int any_connected = 0, rhsc_enabled = 1; | 416 | int any_connected = 0; |
349 | unsigned long flags; | 417 | unsigned long flags; |
350 | 418 | ||
351 | spin_lock_irqsave (&ohci->lock, flags); | 419 | spin_lock_irqsave (&ohci->lock, flags); |
@@ -386,66 +454,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
386 | } | 454 | } |
387 | } | 455 | } |
388 | 456 | ||
389 | /* NOTE: vendors didn't always make the same implementation | 457 | hcd->poll_rh = ohci_root_hub_state_changes(ohci, changed, |
390 | * choices for RHSC. Sometimes it triggers on an edge (like | 458 | any_connected); |
391 | * setting and maybe clearing a port status change bit); and | ||
392 | * it's level-triggered on other silicon, active until khubd | ||
393 | * clears all active port status change bits. If it's still | ||
394 | * set (level-triggered) we must disable it and rely on | ||
395 | * polling until khubd re-enables it. | ||
396 | */ | ||
397 | if (ohci_readl (ohci, &ohci->regs->intrstatus) & OHCI_INTR_RHSC) { | ||
398 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrdisable); | ||
399 | (void) ohci_readl (ohci, &ohci->regs->intrdisable); | ||
400 | rhsc_enabled = 0; | ||
401 | } | ||
402 | hcd->poll_rh = 1; | ||
403 | |||
404 | /* carry out appropriate state changes */ | ||
405 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
406 | |||
407 | case OHCI_USB_OPER: | ||
408 | /* keep on polling until we know a device is connected | ||
409 | * and RHSC is enabled */ | ||
410 | if (!ohci->autostop) { | ||
411 | if (any_connected) { | ||
412 | if (rhsc_enabled) | ||
413 | hcd->poll_rh = 0; | ||
414 | } else { | ||
415 | ohci->autostop = 1; | ||
416 | ohci->next_statechange = jiffies + HZ; | ||
417 | } | ||
418 | |||
419 | /* if no devices have been attached for one second, autostop */ | ||
420 | } else { | ||
421 | if (changed || any_connected) { | ||
422 | ohci->autostop = 0; | ||
423 | ohci->next_statechange = jiffies + | ||
424 | STATECHANGE_DELAY; | ||
425 | } else if (time_after_eq (jiffies, | ||
426 | ohci->next_statechange) | ||
427 | && !ohci->ed_rm_list | ||
428 | && !(ohci->hc_control & | ||
429 | OHCI_SCHED_ENABLES)) { | ||
430 | ohci_rh_suspend (ohci, 1); | ||
431 | } | ||
432 | } | ||
433 | break; | ||
434 | |||
435 | /* if there is a port change, autostart or ask to be resumed */ | ||
436 | case OHCI_USB_SUSPEND: | ||
437 | case OHCI_USB_RESUME: | ||
438 | if (changed) { | ||
439 | if (ohci->autostop) | ||
440 | ohci_rh_resume (ohci); | ||
441 | else | ||
442 | usb_hcd_resume_root_hub (hcd); | ||
443 | } else { | ||
444 | /* everything is idle, no need for polling */ | ||
445 | hcd->poll_rh = 0; | ||
446 | } | ||
447 | break; | ||
448 | } | ||
449 | 459 | ||
450 | done: | 460 | done: |
451 | spin_unlock_irqrestore (&ohci->lock, flags); | 461 | spin_unlock_irqrestore (&ohci->lock, flags); |
diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c index 2dbb77414905..7f26f9bdbaf1 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-pnx4008.c | |||
@@ -134,7 +134,7 @@ static int isp1301_attach(struct i2c_adapter *adap, int addr, int kind) | |||
134 | { | 134 | { |
135 | struct i2c_client *c; | 135 | struct i2c_client *c; |
136 | 136 | ||
137 | c = (struct i2c_client *)kzalloc(sizeof(*c), SLAB_KERNEL); | 137 | c = (struct i2c_client *)kzalloc(sizeof(*c), GFP_KERNEL); |
138 | 138 | ||
139 | if (!c) | 139 | if (!c) |
140 | return -ENOMEM; | 140 | return -ENOMEM; |
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index 54f554e0f0ad..ac9f11d19817 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c | |||
@@ -169,21 +169,14 @@ static int sl811_cs_config(struct pcmcia_device *link) | |||
169 | 169 | ||
170 | DBG(0, "sl811_cs_config(0x%p)\n", link); | 170 | DBG(0, "sl811_cs_config(0x%p)\n", link); |
171 | 171 | ||
172 | tuple.DesiredTuple = CISTPL_CONFIG; | ||
173 | tuple.Attributes = 0; | ||
174 | tuple.TupleData = buf; | ||
175 | tuple.TupleDataMax = sizeof(buf); | ||
176 | tuple.TupleOffset = 0; | ||
177 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); | ||
178 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); | ||
179 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); | ||
180 | link->conf.ConfigBase = parse.config.base; | ||
181 | link->conf.Present = parse.config.rmask[0]; | ||
182 | |||
183 | /* Look up the current Vcc */ | 172 | /* Look up the current Vcc */ |
184 | CS_CHECK(GetConfigurationInfo, | 173 | CS_CHECK(GetConfigurationInfo, |
185 | pcmcia_get_configuration_info(link, &conf)); | 174 | pcmcia_get_configuration_info(link, &conf)); |
186 | 175 | ||
176 | tuple.Attributes = 0; | ||
177 | tuple.TupleData = buf; | ||
178 | tuple.TupleDataMax = sizeof(buf); | ||
179 | tuple.TupleOffset = 0; | ||
187 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | 180 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; |
188 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); | 181 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
189 | while (1) { | 182 | while (1) { |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index 32c635ecbf31..a9d7119e3176 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -71,7 +71,7 @@ static int distrust_firmware = 1; | |||
71 | module_param(distrust_firmware, bool, 0); | 71 | module_param(distrust_firmware, bool, 0); |
72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" | 72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" |
73 | "t setup"); | 73 | "t setup"); |
74 | DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); | 74 | static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); |
75 | /* | 75 | /* |
76 | * u132_module_lock exists to protect access to global variables | 76 | * u132_module_lock exists to protect access to global variables |
77 | * | 77 | * |
@@ -163,7 +163,7 @@ struct u132_endp { | |||
163 | u16 queue_next; | 163 | u16 queue_next; |
164 | struct urb *urb_list[ENDP_QUEUE_SIZE]; | 164 | struct urb *urb_list[ENDP_QUEUE_SIZE]; |
165 | struct list_head urb_more; | 165 | struct list_head urb_more; |
166 | struct work_struct scheduler; | 166 | struct delayed_work scheduler; |
167 | }; | 167 | }; |
168 | struct u132_ring { | 168 | struct u132_ring { |
169 | unsigned in_use:1; | 169 | unsigned in_use:1; |
@@ -171,7 +171,7 @@ struct u132_ring { | |||
171 | u8 number; | 171 | u8 number; |
172 | struct u132 *u132; | 172 | struct u132 *u132; |
173 | struct u132_endp *curr_endp; | 173 | struct u132_endp *curr_endp; |
174 | struct work_struct scheduler; | 174 | struct delayed_work scheduler; |
175 | }; | 175 | }; |
176 | #define OHCI_QUIRK_AMD756 0x01 | 176 | #define OHCI_QUIRK_AMD756 0x01 |
177 | #define OHCI_QUIRK_SUPERIO 0x02 | 177 | #define OHCI_QUIRK_SUPERIO 0x02 |
@@ -198,20 +198,16 @@ struct u132 { | |||
198 | u32 hc_roothub_portstatus[MAX_ROOT_PORTS]; | 198 | u32 hc_roothub_portstatus[MAX_ROOT_PORTS]; |
199 | int flags; | 199 | int flags; |
200 | unsigned long next_statechange; | 200 | unsigned long next_statechange; |
201 | struct work_struct monitor; | 201 | struct delayed_work monitor; |
202 | int num_endpoints; | 202 | int num_endpoints; |
203 | struct u132_addr addr[MAX_U132_ADDRS]; | 203 | struct u132_addr addr[MAX_U132_ADDRS]; |
204 | struct u132_udev udev[MAX_U132_UDEVS]; | 204 | struct u132_udev udev[MAX_U132_UDEVS]; |
205 | struct u132_port port[MAX_U132_PORTS]; | 205 | struct u132_port port[MAX_U132_PORTS]; |
206 | struct u132_endp *endp[MAX_U132_ENDPS]; | 206 | struct u132_endp *endp[MAX_U132_ENDPS]; |
207 | }; | 207 | }; |
208 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data); | 208 | |
209 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, u8 addressofs, | ||
210 | u8 width, u32 *data); | ||
211 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, u8 addressofs, | ||
212 | u8 width, u32 data); | ||
213 | /* | 209 | /* |
214 | * these can not be inlines because we need the structure offset!! | 210 | * these cannot be inlines because we need the structure offset!! |
215 | * Does anyone have a better way????? | 211 | * Does anyone have a better way????? |
216 | */ | 212 | */ |
217 | #define u132_read_pcimem(u132, member, data) \ | 213 | #define u132_read_pcimem(u132, member, data) \ |
@@ -314,7 +310,7 @@ static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring, | |||
314 | if (delta > 0) { | 310 | if (delta > 0) { |
315 | if (queue_delayed_work(workqueue, &ring->scheduler, delta)) | 311 | if (queue_delayed_work(workqueue, &ring->scheduler, delta)) |
316 | return; | 312 | return; |
317 | } else if (queue_work(workqueue, &ring->scheduler)) | 313 | } else if (queue_delayed_work(workqueue, &ring->scheduler, 0)) |
318 | return; | 314 | return; |
319 | kref_put(&u132->kref, u132_hcd_delete); | 315 | kref_put(&u132->kref, u132_hcd_delete); |
320 | return; | 316 | return; |
@@ -393,12 +389,8 @@ static inline void u132_endp_init_kref(struct u132 *u132, | |||
393 | static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp, | 389 | static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp, |
394 | unsigned int delta) | 390 | unsigned int delta) |
395 | { | 391 | { |
396 | if (delta > 0) { | 392 | if (queue_delayed_work(workqueue, &endp->scheduler, delta)) |
397 | if (queue_delayed_work(workqueue, &endp->scheduler, delta)) | 393 | kref_get(&endp->kref); |
398 | kref_get(&endp->kref); | ||
399 | } else if (queue_work(workqueue, &endp->scheduler)) | ||
400 | kref_get(&endp->kref); | ||
401 | return; | ||
402 | } | 394 | } |
403 | 395 | ||
404 | static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp) | 396 | static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp) |
@@ -414,24 +406,14 @@ static inline void u132_monitor_put_kref(struct u132 *u132) | |||
414 | 406 | ||
415 | static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta) | 407 | static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta) |
416 | { | 408 | { |
417 | if (delta > 0) { | 409 | if (queue_delayed_work(workqueue, &u132->monitor, delta)) |
418 | if (queue_delayed_work(workqueue, &u132->monitor, delta)) { | 410 | kref_get(&u132->kref); |
419 | kref_get(&u132->kref); | ||
420 | } | ||
421 | } else if (queue_work(workqueue, &u132->monitor)) | ||
422 | kref_get(&u132->kref); | ||
423 | return; | ||
424 | } | 411 | } |
425 | 412 | ||
426 | static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta) | 413 | static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta) |
427 | { | 414 | { |
428 | if (delta > 0) { | 415 | if (!queue_delayed_work(workqueue, &u132->monitor, delta)) |
429 | if (queue_delayed_work(workqueue, &u132->monitor, delta)) | 416 | kref_put(&u132->kref, u132_hcd_delete); |
430 | return; | ||
431 | } else if (queue_work(workqueue, &u132->monitor)) | ||
432 | return; | ||
433 | kref_put(&u132->kref, u132_hcd_delete); | ||
434 | return; | ||
435 | } | 417 | } |
436 | 418 | ||
437 | static void u132_monitor_cancel_work(struct u132 *u132) | 419 | static void u132_monitor_cancel_work(struct u132 *u132) |
@@ -493,9 +475,9 @@ static int read_roothub_info(struct u132 *u132) | |||
493 | return 0; | 475 | return 0; |
494 | } | 476 | } |
495 | 477 | ||
496 | static void u132_hcd_monitor_work(void *data) | 478 | static void u132_hcd_monitor_work(struct work_struct *work) |
497 | { | 479 | { |
498 | struct u132 *u132 = data; | 480 | struct u132 *u132 = container_of(work, struct u132, monitor.work); |
499 | if (u132->going > 1) { | 481 | if (u132->going > 1) { |
500 | dev_err(&u132->platform_dev->dev, "device has been removed %d\n" | 482 | dev_err(&u132->platform_dev->dev, "device has been removed %d\n" |
501 | , u132->going); | 483 | , u132->going); |
@@ -1319,15 +1301,14 @@ static void u132_hcd_initial_setup_sent(void *data, struct urb *urb, u8 *buf, | |||
1319 | } | 1301 | } |
1320 | } | 1302 | } |
1321 | 1303 | ||
1322 | static void u132_hcd_ring_work_scheduler(void *data); | ||
1323 | static void u132_hcd_endp_work_scheduler(void *data); | ||
1324 | /* | 1304 | /* |
1325 | * this work function is only executed from the work queue | 1305 | * this work function is only executed from the work queue |
1326 | * | 1306 | * |
1327 | */ | 1307 | */ |
1328 | static void u132_hcd_ring_work_scheduler(void *data) | 1308 | static void u132_hcd_ring_work_scheduler(struct work_struct *work) |
1329 | { | 1309 | { |
1330 | struct u132_ring *ring = data; | 1310 | struct u132_ring *ring = |
1311 | container_of(work, struct u132_ring, scheduler.work); | ||
1331 | struct u132 *u132 = ring->u132; | 1312 | struct u132 *u132 = ring->u132; |
1332 | down(&u132->scheduler_lock); | 1313 | down(&u132->scheduler_lock); |
1333 | if (ring->in_use) { | 1314 | if (ring->in_use) { |
@@ -1386,10 +1367,11 @@ static void u132_hcd_ring_work_scheduler(void *data) | |||
1386 | } | 1367 | } |
1387 | } | 1368 | } |
1388 | 1369 | ||
1389 | static void u132_hcd_endp_work_scheduler(void *data) | 1370 | static void u132_hcd_endp_work_scheduler(struct work_struct *work) |
1390 | { | 1371 | { |
1391 | struct u132_ring *ring; | 1372 | struct u132_ring *ring; |
1392 | struct u132_endp *endp = data; | 1373 | struct u132_endp *endp = |
1374 | container_of(work, struct u132_endp, scheduler.work); | ||
1393 | struct u132 *u132 = endp->u132; | 1375 | struct u132 *u132 = endp->u132; |
1394 | down(&u132->scheduler_lock); | 1376 | down(&u132->scheduler_lock); |
1395 | ring = endp->ring; | 1377 | ring = endp->ring; |
@@ -1947,7 +1929,7 @@ static int create_endpoint_and_queue_int(struct u132 *u132, | |||
1947 | if (!endp) { | 1929 | if (!endp) { |
1948 | return -ENOMEM; | 1930 | return -ENOMEM; |
1949 | } | 1931 | } |
1950 | INIT_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler, (void *)endp); | 1932 | INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler); |
1951 | spin_lock_init(&endp->queue_lock.slock); | 1933 | spin_lock_init(&endp->queue_lock.slock); |
1952 | INIT_LIST_HEAD(&endp->urb_more); | 1934 | INIT_LIST_HEAD(&endp->urb_more); |
1953 | ring = endp->ring = &u132->ring[0]; | 1935 | ring = endp->ring = &u132->ring[0]; |
@@ -2036,7 +2018,7 @@ static int create_endpoint_and_queue_bulk(struct u132 *u132, | |||
2036 | if (!endp) { | 2018 | if (!endp) { |
2037 | return -ENOMEM; | 2019 | return -ENOMEM; |
2038 | } | 2020 | } |
2039 | INIT_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler, (void *)endp); | 2021 | INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler); |
2040 | spin_lock_init(&endp->queue_lock.slock); | 2022 | spin_lock_init(&endp->queue_lock.slock); |
2041 | INIT_LIST_HEAD(&endp->urb_more); | 2023 | INIT_LIST_HEAD(&endp->urb_more); |
2042 | endp->dequeueing = 0; | 2024 | endp->dequeueing = 0; |
@@ -2121,7 +2103,7 @@ static int create_endpoint_and_queue_control(struct u132 *u132, | |||
2121 | if (!endp) { | 2103 | if (!endp) { |
2122 | return -ENOMEM; | 2104 | return -ENOMEM; |
2123 | } | 2105 | } |
2124 | INIT_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler, (void *)endp); | 2106 | INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler); |
2125 | spin_lock_init(&endp->queue_lock.slock); | 2107 | spin_lock_init(&endp->queue_lock.slock); |
2126 | INIT_LIST_HEAD(&endp->urb_more); | 2108 | INIT_LIST_HEAD(&endp->urb_more); |
2127 | ring = endp->ring = &u132->ring[0]; | 2109 | ring = endp->ring = &u132->ring[0]; |
@@ -3045,7 +3027,7 @@ static struct hc_driver u132_hc_driver = { | |||
3045 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" | 3027 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" |
3046 | * is held for writing, thus this module must not call usb_remove_hcd() | 3028 | * is held for writing, thus this module must not call usb_remove_hcd() |
3047 | * synchronously - but instead should immediately stop activity to the | 3029 | * synchronously - but instead should immediately stop activity to the |
3048 | * device and ansynchronously call usb_remove_hcd() | 3030 | * device and asynchronously call usb_remove_hcd() |
3049 | */ | 3031 | */ |
3050 | static int __devexit u132_remove(struct platform_device *pdev) | 3032 | static int __devexit u132_remove(struct platform_device *pdev) |
3051 | { | 3033 | { |
@@ -3100,10 +3082,10 @@ static void u132_initialise(struct u132 *u132, struct platform_device *pdev) | |||
3100 | ring->number = rings + 1; | 3082 | ring->number = rings + 1; |
3101 | ring->length = 0; | 3083 | ring->length = 0; |
3102 | ring->curr_endp = NULL; | 3084 | ring->curr_endp = NULL; |
3103 | INIT_WORK(&ring->scheduler, u132_hcd_ring_work_scheduler, | 3085 | INIT_DELAYED_WORK(&ring->scheduler, |
3104 | (void *)ring); | 3086 | u132_hcd_ring_work_scheduler); |
3105 | } down(&u132->sw_lock); | 3087 | } down(&u132->sw_lock); |
3106 | INIT_WORK(&u132->monitor, u132_hcd_monitor_work, (void *)u132); | 3088 | INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work); |
3107 | while (ports-- > 0) { | 3089 | while (ports-- > 0) { |
3108 | struct u132_port *port = &u132->port[ports]; | 3090 | struct u132_port *port = &u132->port[ports]; |
3109 | port->u132 = u132; | 3091 | port->u132 = u132; |
@@ -3241,7 +3223,7 @@ static int u132_resume(struct platform_device *pdev) | |||
3241 | #define u132_resume NULL | 3223 | #define u132_resume NULL |
3242 | #endif | 3224 | #endif |
3243 | /* | 3225 | /* |
3244 | * this driver is loaded explicitely by ftdi_u132 | 3226 | * this driver is loaded explicitly by ftdi_u132 |
3245 | * | 3227 | * |
3246 | * the platform_driver struct is static because it is per type of module | 3228 | * the platform_driver struct is static because it is per type of module |
3247 | */ | 3229 | */ |
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 226bf3de8edd..e87692c31be4 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
@@ -81,7 +81,7 @@ MODULE_PARM_DESC(debug, "Debug level"); | |||
81 | static char *errbuf; | 81 | static char *errbuf; |
82 | #define ERRBUF_LEN (32 * 1024) | 82 | #define ERRBUF_LEN (32 * 1024) |
83 | 83 | ||
84 | static kmem_cache_t *uhci_up_cachep; /* urb_priv */ | 84 | static struct kmem_cache *uhci_up_cachep; /* urb_priv */ |
85 | 85 | ||
86 | static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state); | 86 | static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state); |
87 | static void wakeup_rh(struct uhci_hcd *uhci); | 87 | static void wakeup_rh(struct uhci_hcd *uhci); |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index 06115f22a4fa..30b88459ac7d 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -498,7 +498,7 @@ static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, | |||
498 | { | 498 | { |
499 | struct urb_priv *urbp; | 499 | struct urb_priv *urbp; |
500 | 500 | ||
501 | urbp = kmem_cache_alloc(uhci_up_cachep, SLAB_ATOMIC); | 501 | urbp = kmem_cache_alloc(uhci_up_cachep, GFP_ATOMIC); |
502 | if (!urbp) | 502 | if (!urbp) |
503 | return NULL; | 503 | return NULL; |
504 | 504 | ||