]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/usb/host/ohci-hub.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lliubbo...
[karo-tx-linux.git] / drivers / usb / host / ohci-hub.c
1 /*
2  * OHCI HCD (Host Controller Driver) for USB.
3  *
4  * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
5  * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
6  *
7  * This file is licenced under GPL
8  */
9
10 /*-------------------------------------------------------------------------*/
11
12 /*
13  * OHCI Root Hub ... the nonsharable stuff
14  */
15
16 #define dbg_port(hc,label,num,value) \
17         ohci_dbg (hc, \
18                 "%s roothub.portstatus [%d] " \
19                 "= 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \
20                 label, num, temp, \
21                 (temp & RH_PS_PRSC) ? " PRSC" : "", \
22                 (temp & RH_PS_OCIC) ? " OCIC" : "", \
23                 (temp & RH_PS_PSSC) ? " PSSC" : "", \
24                 (temp & RH_PS_PESC) ? " PESC" : "", \
25                 (temp & RH_PS_CSC) ? " CSC" : "", \
26                 \
27                 (temp & RH_PS_LSDA) ? " LSDA" : "", \
28                 (temp & RH_PS_PPS) ? " PPS" : "", \
29                 (temp & RH_PS_PRS) ? " PRS" : "", \
30                 (temp & RH_PS_POCI) ? " POCI" : "", \
31                 (temp & RH_PS_PSS) ? " PSS" : "", \
32                 \
33                 (temp & RH_PS_PES) ? " PES" : "", \
34                 (temp & RH_PS_CCS) ? " CCS" : "" \
35                 );
36
37 /*-------------------------------------------------------------------------*/
38
39 #define OHCI_SCHED_ENABLES \
40         (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE)
41
42 static void dl_done_list (struct ohci_hcd *);
43 static void finish_unlinks (struct ohci_hcd *, u16);
44
45 #ifdef  CONFIG_PM
46 static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop)
47 __releases(ohci->lock)
48 __acquires(ohci->lock)
49 {
50         int                     status = 0;
51
52         ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
53         switch (ohci->hc_control & OHCI_CTRL_HCFS) {
54         case OHCI_USB_RESUME:
55                 ohci_dbg (ohci, "resume/suspend?\n");
56                 ohci->hc_control &= ~OHCI_CTRL_HCFS;
57                 ohci->hc_control |= OHCI_USB_RESET;
58                 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
59                 (void) ohci_readl (ohci, &ohci->regs->control);
60                 /* FALL THROUGH */
61         case OHCI_USB_RESET:
62                 status = -EBUSY;
63                 ohci_dbg (ohci, "needs reinit!\n");
64                 goto done;
65         case OHCI_USB_SUSPEND:
66                 if (!ohci->autostop) {
67                         ohci_dbg (ohci, "already suspended\n");
68                         goto done;
69                 }
70         }
71         ohci_dbg (ohci, "%s root hub\n",
72                         autostop ? "auto-stop" : "suspend");
73
74         /* First stop any processing */
75         if (!autostop && (ohci->hc_control & OHCI_SCHED_ENABLES)) {
76                 ohci->hc_control &= ~OHCI_SCHED_ENABLES;
77                 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
78                 ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
79                 ohci_writel (ohci, OHCI_INTR_SF, &ohci->regs->intrstatus);
80
81                 /* sched disables take effect on the next frame,
82                  * then the last WDH could take 6+ msec
83                  */
84                 ohci_dbg (ohci, "stopping schedules ...\n");
85                 ohci->autostop = 0;
86                 spin_unlock_irq (&ohci->lock);
87                 msleep (8);
88                 spin_lock_irq (&ohci->lock);
89         }
90         dl_done_list (ohci);
91         finish_unlinks (ohci, ohci_frame_no(ohci));
92
93         /* maybe resume can wake root hub */
94         if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) {
95                 ohci->hc_control |= OHCI_CTRL_RWE;
96         } else {
97                 ohci_writel(ohci, OHCI_INTR_RHSC | OHCI_INTR_RD,
98                                 &ohci->regs->intrdisable);
99                 ohci->hc_control &= ~OHCI_CTRL_RWE;
100         }
101
102         /* Suspend hub ... this is the "global (to this bus) suspend" mode,
103          * which doesn't imply ports will first be individually suspended.
104          */
105         ohci->hc_control &= ~OHCI_CTRL_HCFS;
106         ohci->hc_control |= OHCI_USB_SUSPEND;
107         ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
108         (void) ohci_readl (ohci, &ohci->regs->control);
109
110         /* no resumes until devices finish suspending */
111         if (!autostop) {
112                 ohci->next_statechange = jiffies + msecs_to_jiffies (5);
113                 ohci->autostop = 0;
114                 ohci->rh_state = OHCI_RH_SUSPENDED;
115         }
116
117 done:
118         return status;
119 }
120
121 static inline struct ed *find_head (struct ed *ed)
122 {
123         /* for bulk and control lists */
124         while (ed->ed_prev)
125                 ed = ed->ed_prev;
126         return ed;
127 }
128
129 /* caller has locked the root hub */
130 static int ohci_rh_resume (struct ohci_hcd *ohci)
131 __releases(ohci->lock)
132 __acquires(ohci->lock)
133 {
134         struct usb_hcd          *hcd = ohci_to_hcd (ohci);
135         u32                     temp, enables;
136         int                     status = -EINPROGRESS;
137         int                     autostopped = ohci->autostop;
138
139         ohci->autostop = 0;
140         ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
141
142         if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
143                 /* this can happen after resuming a swsusp snapshot */
144                 if (ohci->rh_state != OHCI_RH_RUNNING) {
145                         ohci_dbg (ohci, "BIOS/SMM active, control %03x\n",
146                                         ohci->hc_control);
147                         status = -EBUSY;
148                 /* this happens when pmcore resumes HC then root */
149                 } else {
150                         ohci_dbg (ohci, "duplicate resume\n");
151                         status = 0;
152                 }
153         } else switch (ohci->hc_control & OHCI_CTRL_HCFS) {
154         case OHCI_USB_SUSPEND:
155                 ohci->hc_control &= ~(OHCI_CTRL_HCFS|OHCI_SCHED_ENABLES);
156                 ohci->hc_control |= OHCI_USB_RESUME;
157                 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
158                 (void) ohci_readl (ohci, &ohci->regs->control);
159                 ohci_dbg (ohci, "%s root hub\n",
160                                 autostopped ? "auto-start" : "resume");
161                 break;
162         case OHCI_USB_RESUME:
163                 /* HCFS changes sometime after INTR_RD */
164                 ohci_dbg(ohci, "%swakeup root hub\n",
165                                 autostopped ? "auto-" : "");
166                 break;
167         case OHCI_USB_OPER:
168                 /* this can happen after resuming a swsusp snapshot */
169                 ohci_dbg (ohci, "snapshot resume? reinit\n");
170                 status = -EBUSY;
171                 break;
172         default:                /* RESET, we lost power */
173                 ohci_dbg (ohci, "lost power\n");
174                 status = -EBUSY;
175         }
176         if (status == -EBUSY) {
177                 if (!autostopped) {
178                         spin_unlock_irq (&ohci->lock);
179                         (void) ohci_init (ohci);
180                         status = ohci_restart (ohci);
181
182                         usb_root_hub_lost_power(hcd->self.root_hub);
183
184                         spin_lock_irq (&ohci->lock);
185                 }
186                 return status;
187         }
188         if (status != -EINPROGRESS)
189                 return status;
190         if (autostopped)
191                 goto skip_resume;
192         spin_unlock_irq (&ohci->lock);
193
194         /* Some controllers (lucent erratum) need extra-long delays */
195         msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1);
196
197         temp = ohci_readl (ohci, &ohci->regs->control);
198         temp &= OHCI_CTRL_HCFS;
199         if (temp != OHCI_USB_RESUME) {
200                 ohci_err (ohci, "controller won't resume\n");
201                 spin_lock_irq(&ohci->lock);
202                 return -EBUSY;
203         }
204
205         /* disable old schedule state, reinit from scratch */
206         ohci_writel (ohci, 0, &ohci->regs->ed_controlhead);
207         ohci_writel (ohci, 0, &ohci->regs->ed_controlcurrent);
208         ohci_writel (ohci, 0, &ohci->regs->ed_bulkhead);
209         ohci_writel (ohci, 0, &ohci->regs->ed_bulkcurrent);
210         ohci_writel (ohci, 0, &ohci->regs->ed_periodcurrent);
211         ohci_writel (ohci, (u32) ohci->hcca_dma, &ohci->regs->hcca);
212
213         /* Sometimes PCI D3 suspend trashes frame timings ... */
214         periodic_reinit (ohci);
215
216         /* the following code is executed with ohci->lock held and
217          * irqs disabled if and only if autostopped is true
218          */
219
220 skip_resume:
221         /* interrupts might have been disabled */
222         ohci_writel (ohci, OHCI_INTR_INIT, &ohci->regs->intrenable);
223         if (ohci->ed_rm_list)
224                 ohci_writel (ohci, OHCI_INTR_SF, &ohci->regs->intrenable);
225
226         /* Then re-enable operations */
227         ohci_writel (ohci, OHCI_USB_OPER, &ohci->regs->control);
228         (void) ohci_readl (ohci, &ohci->regs->control);
229         if (!autostopped)
230                 msleep (3);
231
232         temp = ohci->hc_control;
233         temp &= OHCI_CTRL_RWC;
234         temp |= OHCI_CONTROL_INIT | OHCI_USB_OPER;
235         ohci->hc_control = temp;
236         ohci_writel (ohci, temp, &ohci->regs->control);
237         (void) ohci_readl (ohci, &ohci->regs->control);
238
239         /* TRSMRCY */
240         if (!autostopped) {
241                 msleep (10);
242                 spin_lock_irq (&ohci->lock);
243         }
244         /* now ohci->lock is always held and irqs are always disabled */
245
246         /* keep it alive for more than ~5x suspend + resume costs */
247         ohci->next_statechange = jiffies + STATECHANGE_DELAY;
248
249         /* maybe turn schedules back on */
250         enables = 0;
251         temp = 0;
252         if (!ohci->ed_rm_list) {
253                 if (ohci->ed_controltail) {
254                         ohci_writel (ohci,
255                                         find_head (ohci->ed_controltail)->dma,
256                                         &ohci->regs->ed_controlhead);
257                         enables |= OHCI_CTRL_CLE;
258                         temp |= OHCI_CLF;
259                 }
260                 if (ohci->ed_bulktail) {
261                         ohci_writel (ohci, find_head (ohci->ed_bulktail)->dma,
262                                 &ohci->regs->ed_bulkhead);
263                         enables |= OHCI_CTRL_BLE;
264                         temp |= OHCI_BLF;
265                 }
266         }
267         if (hcd->self.bandwidth_isoc_reqs || hcd->self.bandwidth_int_reqs)
268                 enables |= OHCI_CTRL_PLE|OHCI_CTRL_IE;
269         if (enables) {
270                 ohci_dbg (ohci, "restarting schedules ... %08x\n", enables);
271                 ohci->hc_control |= enables;
272                 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
273                 if (temp)
274                         ohci_writel (ohci, temp, &ohci->regs->cmdstatus);
275                 (void) ohci_readl (ohci, &ohci->regs->control);
276         }
277
278         ohci->rh_state = OHCI_RH_RUNNING;
279         return 0;
280 }
281
282 static int ohci_bus_suspend (struct usb_hcd *hcd)
283 {
284         struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
285         int                     rc;
286
287         spin_lock_irq (&ohci->lock);
288
289         if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
290                 rc = -ESHUTDOWN;
291         else
292                 rc = ohci_rh_suspend (ohci, 0);
293         spin_unlock_irq (&ohci->lock);
294         return rc;
295 }
296
297 static int ohci_bus_resume (struct usb_hcd *hcd)
298 {
299         struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
300         int                     rc;
301
302         if (time_before (jiffies, ohci->next_statechange))
303                 msleep(5);
304
305         spin_lock_irq (&ohci->lock);
306
307         if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
308                 rc = -ESHUTDOWN;
309         else
310                 rc = ohci_rh_resume (ohci);
311         spin_unlock_irq (&ohci->lock);
312
313         /* poll until we know a device is connected or we autostop */
314         if (rc == 0)
315                 usb_hcd_poll_rh_status(hcd);
316         return rc;
317 }
318
319 /* Carry out the final steps of resuming the controller device */
320 static void ohci_finish_controller_resume(struct usb_hcd *hcd)
321 {
322         struct ohci_hcd         *ohci = hcd_to_ohci(hcd);
323         int                     port;
324         bool                    need_reinit = false;
325
326         /* See if the controller is already running or has been reset */
327         ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
328         if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
329                 need_reinit = true;
330         } else {
331                 switch (ohci->hc_control & OHCI_CTRL_HCFS) {
332                 case OHCI_USB_OPER:
333                 case OHCI_USB_RESET:
334                         need_reinit = true;
335                 }
336         }
337
338         /* If needed, reinitialize and suspend the root hub */
339         if (need_reinit) {
340                 spin_lock_irq(&ohci->lock);
341                 ohci_rh_resume(ohci);
342                 ohci_rh_suspend(ohci, 0);
343                 spin_unlock_irq(&ohci->lock);
344         }
345
346         /* Normally just turn on port power and enable interrupts */
347         else {
348                 ohci_dbg(ohci, "powerup ports\n");
349                 for (port = 0; port < ohci->num_ports; port++)
350                         ohci_writel(ohci, RH_PS_PPS,
351                                         &ohci->regs->roothub.portstatus[port]);
352
353                 ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
354                 ohci_readl(ohci, &ohci->regs->intrenable);
355                 msleep(20);
356         }
357
358         usb_hcd_resume_root_hub(hcd);
359 }
360
361 /* Carry out polling-, autostop-, and autoresume-related state changes */
362 static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
363                 int any_connected, int rhsc_status)
364 {
365         int     poll_rh = 1;
366         int     rhsc_enable;
367
368         /* Some broken controllers never turn off RHSC in the interrupt
369          * status register.  For their sake we won't re-enable RHSC
370          * interrupts if the interrupt bit is already active.
371          */
372         rhsc_enable = ohci_readl(ohci, &ohci->regs->intrenable) &
373                         OHCI_INTR_RHSC;
374
375         switch (ohci->hc_control & OHCI_CTRL_HCFS) {
376         case OHCI_USB_OPER:
377                 /* If no status changes are pending, enable RHSC interrupts. */
378                 if (!rhsc_enable && !rhsc_status && !changed) {
379                         rhsc_enable = OHCI_INTR_RHSC;
380                         ohci_writel(ohci, rhsc_enable, &ohci->regs->intrenable);
381                 }
382
383                 /* Keep on polling until we know a device is connected
384                  * and RHSC is enabled, or until we autostop.
385                  */
386                 if (!ohci->autostop) {
387                         if (any_connected ||
388                                         !device_may_wakeup(&ohci_to_hcd(ohci)
389                                                 ->self.root_hub->dev)) {
390                                 if (rhsc_enable)
391                                         poll_rh = 0;
392                         } else {
393                                 ohci->autostop = 1;
394                                 ohci->next_statechange = jiffies + HZ;
395                         }
396
397                 /* if no devices have been attached for one second, autostop */
398                 } else {
399                         if (changed || any_connected) {
400                                 ohci->autostop = 0;
401                                 ohci->next_statechange = jiffies +
402                                                 STATECHANGE_DELAY;
403                         } else if (time_after_eq(jiffies,
404                                                 ohci->next_statechange)
405                                         && !ohci->ed_rm_list
406                                         && !(ohci->hc_control &
407                                                 OHCI_SCHED_ENABLES)) {
408                                 ohci_rh_suspend(ohci, 1);
409                                 if (rhsc_enable)
410                                         poll_rh = 0;
411                         }
412                 }
413                 break;
414
415         case OHCI_USB_SUSPEND:
416         case OHCI_USB_RESUME:
417                 /* if there is a port change, autostart or ask to be resumed */
418                 if (changed) {
419                         if (ohci->autostop)
420                                 ohci_rh_resume(ohci);
421                         else
422                                 usb_hcd_resume_root_hub(ohci_to_hcd(ohci));
423
424                 /* If remote wakeup is disabled, stop polling */
425                 } else if (!ohci->autostop &&
426                                 !ohci_to_hcd(ohci)->self.root_hub->
427                                         do_remote_wakeup) {
428                         poll_rh = 0;
429
430                 } else {
431                         /* If no status changes are pending,
432                          * enable RHSC interrupts
433                          */
434                         if (!rhsc_enable && !rhsc_status) {
435                                 rhsc_enable = OHCI_INTR_RHSC;
436                                 ohci_writel(ohci, rhsc_enable,
437                                                 &ohci->regs->intrenable);
438                         }
439                         /* Keep polling until RHSC is enabled */
440                         if (rhsc_enable)
441                                 poll_rh = 0;
442                 }
443                 break;
444         }
445         return poll_rh;
446 }
447
448 #else   /* CONFIG_PM */
449
450 static inline int ohci_rh_resume(struct ohci_hcd *ohci)
451 {
452         return 0;
453 }
454
455 /* Carry out polling-related state changes.
456  * autostop isn't used when CONFIG_PM is turned off.
457  */
458 static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
459                 int any_connected, int rhsc_status)
460 {
461         /* If RHSC is enabled, don't poll */
462         if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC)
463                 return 0;
464
465         /* If status changes are pending, continue polling.
466          * Conversely, if no status changes are pending but the RHSC
467          * status bit was set, then RHSC may be broken so continue polling.
468          */
469         if (changed || rhsc_status)
470                 return 1;
471
472         /* It's safe to re-enable RHSC interrupts */
473         ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable);
474         return 0;
475 }
476
477 #endif  /* CONFIG_PM */
478
479 /*-------------------------------------------------------------------------*/
480
481 /* build "status change" packet (one or two bytes) from HC registers */
482
483 static int
484 ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
485 {
486         struct ohci_hcd *ohci = hcd_to_ohci (hcd);
487         int             i, changed = 0, length = 1;
488         int             any_connected = 0;
489         int             rhsc_status;
490         unsigned long   flags;
491
492         spin_lock_irqsave (&ohci->lock, flags);
493         if (!HCD_HW_ACCESSIBLE(hcd))
494                 goto done;
495
496         /* undocumented erratum seen on at least rev D */
497         if ((ohci->flags & OHCI_QUIRK_AMD756)
498                         && (roothub_a (ohci) & RH_A_NDP) > MAX_ROOT_PORTS) {
499                 ohci_warn (ohci, "bogus NDP, rereads as NDP=%d\n",
500                           ohci_readl (ohci, &ohci->regs->roothub.a) & RH_A_NDP);
501                 /* retry later; "should not happen" */
502                 goto done;
503         }
504
505         /* init status */
506         if (roothub_status (ohci) & (RH_HS_LPSC | RH_HS_OCIC))
507                 buf [0] = changed = 1;
508         else
509                 buf [0] = 0;
510         if (ohci->num_ports > 7) {
511                 buf [1] = 0;
512                 length++;
513         }
514
515         /* Clear the RHSC status flag before reading the port statuses */
516         ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrstatus);
517         rhsc_status = ohci_readl(ohci, &ohci->regs->intrstatus) &
518                         OHCI_INTR_RHSC;
519
520         /* look at each port */
521         for (i = 0; i < ohci->num_ports; i++) {
522                 u32     status = roothub_portstatus (ohci, i);
523
524                 /* can't autostop if ports are connected */
525                 any_connected |= (status & RH_PS_CCS);
526
527                 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
528                                 | RH_PS_OCIC | RH_PS_PRSC)) {
529                         changed = 1;
530                         if (i < 7)
531                             buf [0] |= 1 << (i + 1);
532                         else
533                             buf [1] |= 1 << (i - 7);
534                 }
535         }
536
537         if (ohci_root_hub_state_changes(ohci, changed,
538                         any_connected, rhsc_status))
539                 set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
540         else
541                 clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
542
543
544 done:
545         spin_unlock_irqrestore (&ohci->lock, flags);
546
547         return changed ? length : 0;
548 }
549
550 /*-------------------------------------------------------------------------*/
551
552 static void
553 ohci_hub_descriptor (
554         struct ohci_hcd                 *ohci,
555         struct usb_hub_descriptor       *desc
556 ) {
557         u32             rh = roothub_a (ohci);
558         u16             temp;
559
560         desc->bDescriptorType = 0x29;
561         desc->bPwrOn2PwrGood = (rh & RH_A_POTPGT) >> 24;
562         desc->bHubContrCurrent = 0;
563
564         desc->bNbrPorts = ohci->num_ports;
565         temp = 1 + (ohci->num_ports / 8);
566         desc->bDescLength = 7 + 2 * temp;
567
568         temp = 0;
569         if (rh & RH_A_NPS)              /* no power switching? */
570             temp |= 0x0002;
571         if (rh & RH_A_PSM)              /* per-port power switching? */
572             temp |= 0x0001;
573         if (rh & RH_A_NOCP)             /* no overcurrent reporting? */
574             temp |= 0x0010;
575         else if (rh & RH_A_OCPM)        /* per-port overcurrent reporting? */
576             temp |= 0x0008;
577         desc->wHubCharacteristics = (__force __u16)cpu_to_hc16(ohci, temp);
578
579         /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
580         rh = roothub_b (ohci);
581         memset(desc->u.hs.DeviceRemovable, 0xff,
582                         sizeof(desc->u.hs.DeviceRemovable));
583         desc->u.hs.DeviceRemovable[0] = rh & RH_B_DR;
584         if (ohci->num_ports > 7) {
585                 desc->u.hs.DeviceRemovable[1] = (rh & RH_B_DR) >> 8;
586                 desc->u.hs.DeviceRemovable[2] = 0xff;
587         } else
588                 desc->u.hs.DeviceRemovable[1] = 0xff;
589 }
590
591 /*-------------------------------------------------------------------------*/
592
593 #ifdef  CONFIG_USB_OTG
594
595 static int ohci_start_port_reset (struct usb_hcd *hcd, unsigned port)
596 {
597         struct ohci_hcd *ohci = hcd_to_ohci (hcd);
598         u32                     status;
599
600         if (!port)
601                 return -EINVAL;
602         port--;
603
604         /* start port reset before HNP protocol times out */
605         status = ohci_readl(ohci, &ohci->regs->roothub.portstatus [port]);
606         if (!(status & RH_PS_CCS))
607                 return -ENODEV;
608
609         /* khubd will finish the reset later */
610         ohci_writel(ohci, RH_PS_PRS, &ohci->regs->roothub.portstatus [port]);
611         return 0;
612 }
613
614 #else
615
616 #define ohci_start_port_reset           NULL
617
618 #endif
619
620 /*-------------------------------------------------------------------------*/
621
622
623 /* See usb 7.1.7.5:  root hubs must issue at least 50 msec reset signaling,
624  * not necessarily continuous ... to guard against resume signaling.
625  * The short timeout is safe for non-root hubs, and is backward-compatible
626  * with earlier Linux hosts.
627  */
628 #ifdef  CONFIG_USB_SUSPEND
629 #define PORT_RESET_MSEC         50
630 #else
631 #define PORT_RESET_MSEC         10
632 #endif
633
634 /* this timer value might be vendor-specific ... */
635 #define PORT_RESET_HW_MSEC      10
636
637 /* wrap-aware logic morphed from <linux/jiffies.h> */
638 #define tick_before(t1,t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
639
640 /* called from some task, normally khubd */
641 static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
642 {
643         __hc32 __iomem *portstat = &ohci->regs->roothub.portstatus [port];
644         u32     temp = 0;
645         u16     now = ohci_readl(ohci, &ohci->regs->fmnumber);
646         u16     reset_done = now + PORT_RESET_MSEC;
647         int     limit_1 = DIV_ROUND_UP(PORT_RESET_MSEC, PORT_RESET_HW_MSEC);
648
649         /* build a "continuous enough" reset signal, with up to
650          * 3msec gap between pulses.  scheduler HZ==100 must work;
651          * this might need to be deadline-scheduled.
652          */
653         do {
654                 int limit_2;
655
656                 /* spin until any current reset finishes */
657                 limit_2 = PORT_RESET_HW_MSEC * 2;
658                 while (--limit_2 >= 0) {
659                         temp = ohci_readl (ohci, portstat);
660                         /* handle e.g. CardBus eject */
661                         if (temp == ~(u32)0)
662                                 return -ESHUTDOWN;
663                         if (!(temp & RH_PS_PRS))
664                                 break;
665                         udelay (500);
666                 }
667
668                 /* timeout (a hardware error) has been observed when
669                  * EHCI sets CF while this driver is resetting a port;
670                  * presumably other disconnect paths might do it too.
671                  */
672                 if (limit_2 < 0) {
673                         ohci_dbg(ohci,
674                                 "port[%d] reset timeout, stat %08x\n",
675                                 port, temp);
676                         break;
677                 }
678
679                 if (!(temp & RH_PS_CCS))
680                         break;
681                 if (temp & RH_PS_PRSC)
682                         ohci_writel (ohci, RH_PS_PRSC, portstat);
683
684                 /* start the next reset, sleep till it's probably done */
685                 ohci_writel (ohci, RH_PS_PRS, portstat);
686                 msleep(PORT_RESET_HW_MSEC);
687                 now = ohci_readl(ohci, &ohci->regs->fmnumber);
688         } while (tick_before(now, reset_done) && --limit_1 >= 0);
689
690         /* caller synchronizes using PRSC ... and handles PRS
691          * still being set when this returns.
692          */
693
694         return 0;
695 }
696
697 static int ohci_hub_control (
698         struct usb_hcd  *hcd,
699         u16             typeReq,
700         u16             wValue,
701         u16             wIndex,
702         char            *buf,
703         u16             wLength
704 ) {
705         struct ohci_hcd *ohci = hcd_to_ohci (hcd);
706         int             ports = ohci->num_ports;
707         u32             temp;
708         int             retval = 0;
709
710         if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
711                 return -ESHUTDOWN;
712
713         switch (typeReq) {
714         case ClearHubFeature:
715                 switch (wValue) {
716                 case C_HUB_OVER_CURRENT:
717                         ohci_writel (ohci, RH_HS_OCIC,
718                                         &ohci->regs->roothub.status);
719                 case C_HUB_LOCAL_POWER:
720                         break;
721                 default:
722                         goto error;
723                 }
724                 break;
725         case ClearPortFeature:
726                 if (!wIndex || wIndex > ports)
727                         goto error;
728                 wIndex--;
729
730                 switch (wValue) {
731                 case USB_PORT_FEAT_ENABLE:
732                         temp = RH_PS_CCS;
733                         break;
734                 case USB_PORT_FEAT_C_ENABLE:
735                         temp = RH_PS_PESC;
736                         break;
737                 case USB_PORT_FEAT_SUSPEND:
738                         temp = RH_PS_POCI;
739                         break;
740                 case USB_PORT_FEAT_C_SUSPEND:
741                         temp = RH_PS_PSSC;
742                         break;
743                 case USB_PORT_FEAT_POWER:
744                         temp = RH_PS_LSDA;
745                         break;
746                 case USB_PORT_FEAT_C_CONNECTION:
747                         temp = RH_PS_CSC;
748                         break;
749                 case USB_PORT_FEAT_C_OVER_CURRENT:
750                         temp = RH_PS_OCIC;
751                         break;
752                 case USB_PORT_FEAT_C_RESET:
753                         temp = RH_PS_PRSC;
754                         break;
755                 default:
756                         goto error;
757                 }
758                 ohci_writel (ohci, temp,
759                                 &ohci->regs->roothub.portstatus [wIndex]);
760                 // ohci_readl (ohci, &ohci->regs->roothub.portstatus [wIndex]);
761                 break;
762         case GetHubDescriptor:
763                 ohci_hub_descriptor (ohci, (struct usb_hub_descriptor *) buf);
764                 break;
765         case GetHubStatus:
766                 temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE);
767                 put_unaligned_le32(temp, buf);
768                 break;
769         case GetPortStatus:
770                 if (!wIndex || wIndex > ports)
771                         goto error;
772                 wIndex--;
773                 temp = roothub_portstatus (ohci, wIndex);
774                 put_unaligned_le32(temp, buf);
775
776 #ifndef OHCI_VERBOSE_DEBUG
777         if (*(u16*)(buf+2))     /* only if wPortChange is interesting */
778 #endif
779                 dbg_port (ohci, "GetStatus", wIndex, temp);
780                 break;
781         case SetHubFeature:
782                 switch (wValue) {
783                 case C_HUB_OVER_CURRENT:
784                         // FIXME:  this can be cleared, yes?
785                 case C_HUB_LOCAL_POWER:
786                         break;
787                 default:
788                         goto error;
789                 }
790                 break;
791         case SetPortFeature:
792                 if (!wIndex || wIndex > ports)
793                         goto error;
794                 wIndex--;
795                 switch (wValue) {
796                 case USB_PORT_FEAT_SUSPEND:
797 #ifdef  CONFIG_USB_OTG
798                         if (hcd->self.otg_port == (wIndex + 1)
799                                         && hcd->self.b_hnp_enable)
800                                 ohci->start_hnp(ohci);
801                         else
802 #endif
803                         ohci_writel (ohci, RH_PS_PSS,
804                                 &ohci->regs->roothub.portstatus [wIndex]);
805                         break;
806                 case USB_PORT_FEAT_POWER:
807                         ohci_writel (ohci, RH_PS_PPS,
808                                 &ohci->regs->roothub.portstatus [wIndex]);
809                         break;
810                 case USB_PORT_FEAT_RESET:
811                         retval = root_port_reset (ohci, wIndex);
812                         break;
813                 default:
814                         goto error;
815                 }
816                 break;
817
818         default:
819 error:
820                 /* "protocol stall" on error */
821                 retval = -EPIPE;
822         }
823         return retval;
824 }
825