Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ohci-hub.c
Go to the documentation of this file.
1 /*
2  * OHCI HCD (Host Controller Driver) for USB.
3  *
4  * (C) Copyright 1999 Roman Weissgaerber <[email protected]>
5  * (C) Copyright 2000-2004 David Brownell <[email protected]>
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 {
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;
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)
316  return rc;
317 }
318 
319 /* Carry out the final steps of resuming the controller device */
320 static void __maybe_unused 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) &
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 +
403  } else if (time_after_eq(jiffies,
404  ohci->next_statechange)
405  && !ohci->ed_rm_list
406  && !(ohci->hc_control &
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) &
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);
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) {
732  temp = RH_PS_CCS;
733  break;
735  temp = RH_PS_PESC;
736  break;
738  temp = RH_PS_POCI;
739  break;
741  temp = RH_PS_PSSC;
742  break;
743  case USB_PORT_FEAT_POWER:
744  temp = RH_PS_LSDA;
745  break;
747  temp = RH_PS_CSC;
748  break;
750  temp = RH_PS_OCIC;
751  break;
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) {
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