ef956220f8541087ba058563dae887bda42f3ebb
[safe/jmp/linux-2.6] / drivers / usb / host / ehci-hub.c
1 /*
2  * Copyright (C) 2001-2004 by David Brownell
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the
6  * Free Software Foundation; either version 2 of the License, or (at your
7  * option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 /* this file is part of ehci-hcd.c */
20
21 /*-------------------------------------------------------------------------*/
22
23 /*
24  * EHCI Root Hub ... the nonsharable stuff
25  *
26  * Registers don't need cpu_to_le32, that happens transparently
27  */
28
29 /*-------------------------------------------------------------------------*/
30
31 #define PORT_WAKE_BITS  (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
32
33 #ifdef  CONFIG_PM
34
35 static int ehci_hub_control(
36         struct usb_hcd  *hcd,
37         u16             typeReq,
38         u16             wValue,
39         u16             wIndex,
40         char            *buf,
41         u16             wLength
42 );
43
44 /* After a power loss, ports that were owned by the companion must be
45  * reset so that the companion can still own them.
46  */
47 static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
48 {
49         u32 __iomem     *reg;
50         u32             status;
51         int             port;
52         __le32          buf;
53         struct usb_hcd  *hcd = ehci_to_hcd(ehci);
54
55         if (!ehci->owned_ports)
56                 return;
57
58         /* Give the connections some time to appear */
59         msleep(20);
60
61         port = HCS_N_PORTS(ehci->hcs_params);
62         while (port--) {
63                 if (test_bit(port, &ehci->owned_ports)) {
64                         reg = &ehci->regs->port_status[port];
65                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
66
67                         /* Port already owned by companion? */
68                         if (status & PORT_OWNER)
69                                 clear_bit(port, &ehci->owned_ports);
70                         else if (test_bit(port, &ehci->companion_ports))
71                                 ehci_writel(ehci, status & ~PORT_PE, reg);
72                         else
73                                 ehci_hub_control(hcd, SetPortFeature,
74                                                 USB_PORT_FEAT_RESET, port + 1,
75                                                 NULL, 0);
76                 }
77         }
78
79         if (!ehci->owned_ports)
80                 return;
81         msleep(90);             /* Wait for resets to complete */
82
83         port = HCS_N_PORTS(ehci->hcs_params);
84         while (port--) {
85                 if (test_bit(port, &ehci->owned_ports)) {
86                         ehci_hub_control(hcd, GetPortStatus,
87                                         0, port + 1,
88                                         (char *) &buf, sizeof(buf));
89
90                         /* The companion should now own the port,
91                          * but if something went wrong the port must not
92                          * remain enabled.
93                          */
94                         reg = &ehci->regs->port_status[port];
95                         status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
96                         if (status & PORT_OWNER)
97                                 ehci_writel(ehci, status | PORT_CSC, reg);
98                         else {
99                                 ehci_dbg(ehci, "failed handover port %d: %x\n",
100                                                 port + 1, status);
101                                 ehci_writel(ehci, status & ~PORT_PE, reg);
102                         }
103                 }
104         }
105
106         ehci->owned_ports = 0;
107 }
108
109 static int ehci_bus_suspend (struct usb_hcd *hcd)
110 {
111         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
112         int                     port;
113         int                     mask;
114         u32 __iomem             *hostpc_reg = NULL;
115
116         ehci_dbg(ehci, "suspend root hub\n");
117
118         if (time_before (jiffies, ehci->next_statechange))
119                 msleep(5);
120         del_timer_sync(&ehci->watchdog);
121         del_timer_sync(&ehci->iaa_watchdog);
122
123         spin_lock_irq (&ehci->lock);
124
125         /* Once the controller is stopped, port resumes that are already
126          * in progress won't complete.  Hence if remote wakeup is enabled
127          * for the root hub and any ports are in the middle of a resume or
128          * remote wakeup, we must fail the suspend.
129          */
130         if (hcd->self.root_hub->do_remote_wakeup) {
131                 port = HCS_N_PORTS(ehci->hcs_params);
132                 while (port--) {
133                         if (ehci->reset_done[port] != 0) {
134                                 spin_unlock_irq(&ehci->lock);
135                                 ehci_dbg(ehci, "suspend failed because "
136                                                 "port %d is resuming\n",
137                                                 port + 1);
138                                 return -EBUSY;
139                         }
140                 }
141         }
142
143         /* stop schedules, clean any completed work */
144         if (HC_IS_RUNNING(hcd->state)) {
145                 ehci_quiesce (ehci);
146                 hcd->state = HC_STATE_QUIESCING;
147         }
148         ehci->command = ehci_readl(ehci, &ehci->regs->command);
149         ehci_work(ehci);
150
151         /* Unlike other USB host controller types, EHCI doesn't have
152          * any notion of "global" or bus-wide suspend.  The driver has
153          * to manually suspend all the active unsuspended ports, and
154          * then manually resume them in the bus_resume() routine.
155          */
156         ehci->bus_suspended = 0;
157         ehci->owned_ports = 0;
158         port = HCS_N_PORTS(ehci->hcs_params);
159         while (port--) {
160                 u32 __iomem     *reg = &ehci->regs->port_status [port];
161                 u32             t1 = ehci_readl(ehci, reg) & ~PORT_RWC_BITS;
162                 u32             t2 = t1;
163
164                 if (ehci->has_hostpc)
165                         hostpc_reg = (u32 __iomem *)((u8 *)ehci->regs
166                                 + HOSTPC0 + 4 * (port & 0xff));
167                 /* keep track of which ports we suspend */
168                 if (t1 & PORT_OWNER)
169                         set_bit(port, &ehci->owned_ports);
170                 else if ((t1 & PORT_PE) && !(t1 & PORT_SUSPEND)) {
171                         t2 |= PORT_SUSPEND;
172                         set_bit(port, &ehci->bus_suspended);
173                 }
174
175                 /* enable remote wakeup on all ports */
176                 if (hcd->self.root_hub->do_remote_wakeup) {
177                         /* only enable appropriate wake bits, otherwise the
178                          * hardware can not go phy low power mode. If a race
179                          * condition happens here(connection change during bits
180                          * set), the port change detection will finally fix it.
181                          */
182                         if (t1 & PORT_CONNECT) {
183                                 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
184                                 t2 &= ~PORT_WKCONN_E;
185                         } else {
186                                 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
187                                 t2 &= ~PORT_WKDISC_E;
188                         }
189                 } else
190                         t2 &= ~PORT_WAKE_BITS;
191
192                 if (t1 != t2) {
193                         ehci_vdbg (ehci, "port %d, %08x -> %08x\n",
194                                 port + 1, t1, t2);
195                         ehci_writel(ehci, t2, reg);
196                         if (hostpc_reg) {
197                                 u32     t3;
198
199                                 spin_unlock_irq(&ehci->lock);
200                                 msleep(5);/* 5ms for HCD enter low pwr mode */
201                                 spin_lock_irq(&ehci->lock);
202                                 t3 = ehci_readl(ehci, hostpc_reg);
203                                 ehci_writel(ehci, t3 | HOSTPC_PHCD, hostpc_reg);
204                                 t3 = ehci_readl(ehci, hostpc_reg);
205                                 ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
206                                         port, (t3 & HOSTPC_PHCD) ?
207                                         "succeeded" : "failed");
208                         }
209                 }
210         }
211
212         /* Apparently some devices need a >= 1-uframe delay here */
213         if (ehci->bus_suspended)
214                 udelay(150);
215
216         /* turn off now-idle HC */
217         ehci_halt (ehci);
218         hcd->state = HC_STATE_SUSPENDED;
219
220         if (ehci->reclaim)
221                 end_unlink_async(ehci);
222
223         /* allow remote wakeup */
224         mask = INTR_MASK;
225         if (!hcd->self.root_hub->do_remote_wakeup)
226                 mask &= ~STS_PCD;
227         ehci_writel(ehci, mask, &ehci->regs->intr_enable);
228         ehci_readl(ehci, &ehci->regs->intr_enable);
229
230         ehci->next_statechange = jiffies + msecs_to_jiffies(10);
231         spin_unlock_irq (&ehci->lock);
232
233         /* ehci_work() may have re-enabled the watchdog timer, which we do not
234          * want, and so we must delete any pending watchdog timer events.
235          */
236         del_timer_sync(&ehci->watchdog);
237         return 0;
238 }
239
240
241 /* caller has locked the root hub, and should reset/reinit on error */
242 static int ehci_bus_resume (struct usb_hcd *hcd)
243 {
244         struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
245         u32                     temp;
246         u32                     power_okay;
247         int                     i;
248         u8                      resume_needed = 0;
249
250         if (time_before (jiffies, ehci->next_statechange))
251                 msleep(5);
252         spin_lock_irq (&ehci->lock);
253         if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
254                 spin_unlock_irq(&ehci->lock);
255                 return -ESHUTDOWN;
256         }
257
258         if (unlikely(ehci->debug)) {
259                 if (!dbgp_reset_prep())
260                         ehci->debug = NULL;
261                 else
262                         dbgp_external_startup();
263         }
264
265         /* Ideally and we've got a real resume here, and no port's power
266          * was lost.  (For PCI, that means Vaux was maintained.)  But we
267          * could instead be restoring a swsusp snapshot -- so that BIOS was
268          * the last user of the controller, not reset/pm hardware keeping
269          * state we gave to it.
270          */
271         power_okay = ehci_readl(ehci, &ehci->regs->intr_enable);
272         ehci_dbg(ehci, "resume root hub%s\n",
273                         power_okay ? "" : " after power loss");
274
275         /* at least some APM implementations will try to deliver
276          * IRQs right away, so delay them until we're ready.
277          */
278         ehci_writel(ehci, 0, &ehci->regs->intr_enable);
279
280         /* re-init operational registers */
281         ehci_writel(ehci, 0, &ehci->regs->segment);
282         ehci_writel(ehci, ehci->periodic_dma, &ehci->regs->frame_list);
283         ehci_writel(ehci, (u32) ehci->async->qh_dma, &ehci->regs->async_next);
284
285         /* restore CMD_RUN, framelist size, and irq threshold */
286         ehci_writel(ehci, ehci->command, &ehci->regs->command);
287
288         /* Some controller/firmware combinations need a delay during which
289          * they set up the port statuses.  See Bugzilla #8190. */
290         spin_unlock_irq(&ehci->lock);
291         msleep(8);
292         spin_lock_irq(&ehci->lock);
293
294         /* manually resume the ports we suspended during bus_suspend() */
295         i = HCS_N_PORTS (ehci->hcs_params);
296         while (i--) {
297                 /* clear phy low power mode before resume */
298                 if (ehci->has_hostpc) {
299                         u32 __iomem     *hostpc_reg =
300                                 (u32 __iomem *)((u8 *)ehci->regs
301                                 + HOSTPC0 + 4 * (i & 0xff));
302                         temp = ehci_readl(ehci, hostpc_reg);
303                         ehci_writel(ehci, temp & ~HOSTPC_PHCD,
304                                 hostpc_reg);
305                         mdelay(5);
306                 }
307                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
308                 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
309                 if (test_bit(i, &ehci->bus_suspended) &&
310                                 (temp & PORT_SUSPEND)) {
311                         temp |= PORT_RESUME;
312                         resume_needed = 1;
313                 }
314                 ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
315         }
316
317         /* msleep for 20ms only if code is trying to resume port */
318         if (resume_needed) {
319                 spin_unlock_irq(&ehci->lock);
320                 msleep(20);
321                 spin_lock_irq(&ehci->lock);
322         }
323
324         i = HCS_N_PORTS (ehci->hcs_params);
325         while (i--) {
326                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
327                 if (test_bit(i, &ehci->bus_suspended) &&
328                                 (temp & PORT_SUSPEND)) {
329                         temp &= ~(PORT_RWC_BITS | PORT_RESUME);
330                         ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
331                         ehci_vdbg (ehci, "resumed port %d\n", i + 1);
332                 }
333         }
334         (void) ehci_readl(ehci, &ehci->regs->command);
335
336         /* maybe re-activate the schedule(s) */
337         temp = 0;
338         if (ehci->async->qh_next.qh)
339                 temp |= CMD_ASE;
340         if (ehci->periodic_sched)
341                 temp |= CMD_PSE;
342         if (temp) {
343                 ehci->command |= temp;
344                 ehci_writel(ehci, ehci->command, &ehci->regs->command);
345         }
346
347         ehci->next_statechange = jiffies + msecs_to_jiffies(5);
348         hcd->state = HC_STATE_RUNNING;
349
350         /* Now we can safely re-enable irqs */
351         ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable);
352
353         spin_unlock_irq (&ehci->lock);
354         ehci_handover_companion_ports(ehci);
355         return 0;
356 }
357
358 #else
359
360 #define ehci_bus_suspend        NULL
361 #define ehci_bus_resume         NULL
362
363 #endif  /* CONFIG_PM */
364
365 /*-------------------------------------------------------------------------*/
366
367 /* Display the ports dedicated to the companion controller */
368 static ssize_t show_companion(struct device *dev,
369                               struct device_attribute *attr,
370                               char *buf)
371 {
372         struct ehci_hcd         *ehci;
373         int                     nports, index, n;
374         int                     count = PAGE_SIZE;
375         char                    *ptr = buf;
376
377         ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
378         nports = HCS_N_PORTS(ehci->hcs_params);
379
380         for (index = 0; index < nports; ++index) {
381                 if (test_bit(index, &ehci->companion_ports)) {
382                         n = scnprintf(ptr, count, "%d\n", index + 1);
383                         ptr += n;
384                         count -= n;
385                 }
386         }
387         return ptr - buf;
388 }
389
390 /*
391  * Sets the owner of a port
392  */
393 static void set_owner(struct ehci_hcd *ehci, int portnum, int new_owner)
394 {
395         u32 __iomem             *status_reg;
396         u32                     port_status;
397         int                     try;
398
399         status_reg = &ehci->regs->port_status[portnum];
400
401         /*
402          * The controller won't set the OWNER bit if the port is
403          * enabled, so this loop will sometimes require at least two
404          * iterations: one to disable the port and one to set OWNER.
405          */
406         for (try = 4; try > 0; --try) {
407                 spin_lock_irq(&ehci->lock);
408                 port_status = ehci_readl(ehci, status_reg);
409                 if ((port_status & PORT_OWNER) == new_owner
410                                 || (port_status & (PORT_OWNER | PORT_CONNECT))
411                                         == 0)
412                         try = 0;
413                 else {
414                         port_status ^= PORT_OWNER;
415                         port_status &= ~(PORT_PE | PORT_RWC_BITS);
416                         ehci_writel(ehci, port_status, status_reg);
417                 }
418                 spin_unlock_irq(&ehci->lock);
419                 if (try > 1)
420                         msleep(5);
421         }
422 }
423
424 /*
425  * Dedicate or undedicate a port to the companion controller.
426  * Syntax is "[-]portnum", where a leading '-' sign means
427  * return control of the port to the EHCI controller.
428  */
429 static ssize_t store_companion(struct device *dev,
430                                struct device_attribute *attr,
431                                const char *buf, size_t count)
432 {
433         struct ehci_hcd         *ehci;
434         int                     portnum, new_owner;
435
436         ehci = hcd_to_ehci(bus_to_hcd(dev_get_drvdata(dev)));
437         new_owner = PORT_OWNER;         /* Owned by companion */
438         if (sscanf(buf, "%d", &portnum) != 1)
439                 return -EINVAL;
440         if (portnum < 0) {
441                 portnum = - portnum;
442                 new_owner = 0;          /* Owned by EHCI */
443         }
444         if (portnum <= 0 || portnum > HCS_N_PORTS(ehci->hcs_params))
445                 return -ENOENT;
446         portnum--;
447         if (new_owner)
448                 set_bit(portnum, &ehci->companion_ports);
449         else
450                 clear_bit(portnum, &ehci->companion_ports);
451         set_owner(ehci, portnum, new_owner);
452         return count;
453 }
454 static DEVICE_ATTR(companion, 0644, show_companion, store_companion);
455
456 static inline void create_companion_file(struct ehci_hcd *ehci)
457 {
458         int     i;
459
460         /* with integrated TT there is no companion! */
461         if (!ehci_is_TDI(ehci))
462                 i = device_create_file(ehci_to_hcd(ehci)->self.controller,
463                                        &dev_attr_companion);
464 }
465
466 static inline void remove_companion_file(struct ehci_hcd *ehci)
467 {
468         /* with integrated TT there is no companion! */
469         if (!ehci_is_TDI(ehci))
470                 device_remove_file(ehci_to_hcd(ehci)->self.controller,
471                                    &dev_attr_companion);
472 }
473
474
475 /*-------------------------------------------------------------------------*/
476
477 static int check_reset_complete (
478         struct ehci_hcd *ehci,
479         int             index,
480         u32 __iomem     *status_reg,
481         int             port_status
482 ) {
483         if (!(port_status & PORT_CONNECT))
484                 return port_status;
485
486         /* if reset finished and it's still not enabled -- handoff */
487         if (!(port_status & PORT_PE)) {
488
489                 /* with integrated TT, there's nobody to hand it to! */
490                 if (ehci_is_TDI(ehci)) {
491                         ehci_dbg (ehci,
492                                 "Failed to enable port %d on root hub TT\n",
493                                 index+1);
494                         return port_status;
495                 }
496
497                 ehci_dbg (ehci, "port %d full speed --> companion\n",
498                         index + 1);
499
500                 // what happens if HCS_N_CC(params) == 0 ?
501                 port_status |= PORT_OWNER;
502                 port_status &= ~PORT_RWC_BITS;
503                 ehci_writel(ehci, port_status, status_reg);
504
505                 /* ensure 440EPX ohci controller state is operational */
506                 if (ehci->has_amcc_usb23)
507                         set_ohci_hcfs(ehci, 1);
508         } else {
509                 ehci_dbg (ehci, "port %d high speed\n", index + 1);
510                 /* ensure 440EPx ohci controller state is suspended */
511                 if (ehci->has_amcc_usb23)
512                         set_ohci_hcfs(ehci, 0);
513         }
514
515         return port_status;
516 }
517
518 /*-------------------------------------------------------------------------*/
519
520
521 /* build "status change" packet (one or two bytes) from HC registers */
522
523 static int
524 ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
525 {
526         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
527         u32             temp, status = 0;
528         u32             mask;
529         int             ports, i, retval = 1;
530         unsigned long   flags;
531
532         /* if !USB_SUSPEND, root hub timers won't get shut down ... */
533         if (!HC_IS_RUNNING(hcd->state))
534                 return 0;
535
536         /* init status to no-changes */
537         buf [0] = 0;
538         ports = HCS_N_PORTS (ehci->hcs_params);
539         if (ports > 7) {
540                 buf [1] = 0;
541                 retval++;
542         }
543
544         /* Some boards (mostly VIA?) report bogus overcurrent indications,
545          * causing massive log spam unless we completely ignore them.  It
546          * may be relevant that VIA VT8235 controllers, where PORT_POWER is
547          * always set, seem to clear PORT_OCC and PORT_CSC when writing to
548          * PORT_POWER; that's surprising, but maybe within-spec.
549          */
550         if (!ignore_oc)
551                 mask = PORT_CSC | PORT_PEC | PORT_OCC;
552         else
553                 mask = PORT_CSC | PORT_PEC;
554         // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND
555
556         /* no hub change reports (bit 0) for now (power, ...) */
557
558         /* port N changes (bit N)? */
559         spin_lock_irqsave (&ehci->lock, flags);
560         for (i = 0; i < ports; i++) {
561                 temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
562
563                 /*
564                  * Return status information even for ports with OWNER set.
565                  * Otherwise khubd wouldn't see the disconnect event when a
566                  * high-speed device is switched over to the companion
567                  * controller by the user.
568                  */
569
570                 if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
571                                 || (ehci->reset_done[i] && time_after_eq(
572                                         jiffies, ehci->reset_done[i]))) {
573                         if (i < 7)
574                             buf [0] |= 1 << (i + 1);
575                         else
576                             buf [1] |= 1 << (i - 7);
577                         status = STS_PCD;
578                 }
579         }
580         /* FIXME autosuspend idle root hubs */
581         spin_unlock_irqrestore (&ehci->lock, flags);
582         return status ? retval : 0;
583 }
584
585 /*-------------------------------------------------------------------------*/
586
587 static void
588 ehci_hub_descriptor (
589         struct ehci_hcd                 *ehci,
590         struct usb_hub_descriptor       *desc
591 ) {
592         int             ports = HCS_N_PORTS (ehci->hcs_params);
593         u16             temp;
594
595         desc->bDescriptorType = 0x29;
596         desc->bPwrOn2PwrGood = 10;      /* ehci 1.0, 2.3.9 says 20ms max */
597         desc->bHubContrCurrent = 0;
598
599         desc->bNbrPorts = ports;
600         temp = 1 + (ports / 8);
601         desc->bDescLength = 7 + 2 * temp;
602
603         /* two bitmaps:  ports removable, and usb 1.0 legacy PortPwrCtrlMask */
604         memset (&desc->bitmap [0], 0, temp);
605         memset (&desc->bitmap [temp], 0xff, temp);
606
607         temp = 0x0008;                  /* per-port overcurrent reporting */
608         if (HCS_PPC (ehci->hcs_params))
609                 temp |= 0x0001;         /* per-port power control */
610         else
611                 temp |= 0x0002;         /* no power switching */
612 #if 0
613 // re-enable when we support USB_PORT_FEAT_INDICATOR below.
614         if (HCS_INDICATOR (ehci->hcs_params))
615                 temp |= 0x0080;         /* per-port indicators (LEDs) */
616 #endif
617         desc->wHubCharacteristics = cpu_to_le16(temp);
618 }
619
620 /*-------------------------------------------------------------------------*/
621
622 static int ehci_hub_control (
623         struct usb_hcd  *hcd,
624         u16             typeReq,
625         u16             wValue,
626         u16             wIndex,
627         char            *buf,
628         u16             wLength
629 ) {
630         struct ehci_hcd *ehci = hcd_to_ehci (hcd);
631         int             ports = HCS_N_PORTS (ehci->hcs_params);
632         u32 __iomem     *status_reg = &ehci->regs->port_status[
633                                 (wIndex & 0xff) - 1];
634         u32 __iomem     *hostpc_reg = NULL;
635         u32             temp, temp1, status;
636         unsigned long   flags;
637         int             retval = 0;
638         unsigned        selector;
639
640         /*
641          * FIXME:  support SetPortFeatures USB_PORT_FEAT_INDICATOR.
642          * HCS_INDICATOR may say we can change LEDs to off/amber/green.
643          * (track current state ourselves) ... blink for diagnostics,
644          * power, "this is the one", etc.  EHCI spec supports this.
645          */
646
647         if (ehci->has_hostpc)
648                 hostpc_reg = (u32 __iomem *)((u8 *)ehci->regs
649                                 + HOSTPC0 + 4 * ((wIndex & 0xff) - 1));
650         spin_lock_irqsave (&ehci->lock, flags);
651         switch (typeReq) {
652         case ClearHubFeature:
653                 switch (wValue) {
654                 case C_HUB_LOCAL_POWER:
655                 case C_HUB_OVER_CURRENT:
656                         /* no hub-wide feature/status flags */
657                         break;
658                 default:
659                         goto error;
660                 }
661                 break;
662         case ClearPortFeature:
663                 if (!wIndex || wIndex > ports)
664                         goto error;
665                 wIndex--;
666                 temp = ehci_readl(ehci, status_reg);
667
668                 /*
669                  * Even if OWNER is set, so the port is owned by the
670                  * companion controller, khubd needs to be able to clear
671                  * the port-change status bits (especially
672                  * USB_PORT_STAT_C_CONNECTION).
673                  */
674
675                 switch (wValue) {
676                 case USB_PORT_FEAT_ENABLE:
677                         ehci_writel(ehci, temp & ~PORT_PE, status_reg);
678                         break;
679                 case USB_PORT_FEAT_C_ENABLE:
680                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_PEC,
681                                         status_reg);
682                         break;
683                 case USB_PORT_FEAT_SUSPEND:
684                         if (temp & PORT_RESET)
685                                 goto error;
686                         if (ehci->no_selective_suspend)
687                                 break;
688                         if (temp & PORT_SUSPEND) {
689                                 if ((temp & PORT_PE) == 0)
690                                         goto error;
691                                 /* clear phy low power mode before resume */
692                                 if (hostpc_reg) {
693                                         temp1 = ehci_readl(ehci, hostpc_reg);
694                                         ehci_writel(ehci, temp1 & ~HOSTPC_PHCD,
695                                                 hostpc_reg);
696                                         mdelay(5);
697                                 }
698                                 /* resume signaling for 20 msec */
699                                 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
700                                 ehci_writel(ehci, temp | PORT_RESUME,
701                                                 status_reg);
702                                 ehci->reset_done [wIndex] = jiffies
703                                                 + msecs_to_jiffies (20);
704                         }
705                         break;
706                 case USB_PORT_FEAT_C_SUSPEND:
707                         clear_bit(wIndex, &ehci->port_c_suspend);
708                         break;
709                 case USB_PORT_FEAT_POWER:
710                         if (HCS_PPC (ehci->hcs_params))
711                                 ehci_writel(ehci,
712                                           temp & ~(PORT_RWC_BITS | PORT_POWER),
713                                           status_reg);
714                         break;
715                 case USB_PORT_FEAT_C_CONNECTION:
716                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_CSC,
717                                         status_reg);
718                         break;
719                 case USB_PORT_FEAT_C_OVER_CURRENT:
720                         ehci_writel(ehci, (temp & ~PORT_RWC_BITS) | PORT_OCC,
721                                         status_reg);
722                         break;
723                 case USB_PORT_FEAT_C_RESET:
724                         /* GetPortStatus clears reset */
725                         break;
726                 default:
727                         goto error;
728                 }
729                 ehci_readl(ehci, &ehci->regs->command); /* unblock posted write */
730                 break;
731         case GetHubDescriptor:
732                 ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
733                         buf);
734                 break;
735         case GetHubStatus:
736                 /* no hub-wide feature/status flags */
737                 memset (buf, 0, 4);
738                 //cpu_to_le32s ((u32 *) buf);
739                 break;
740         case GetPortStatus:
741                 if (!wIndex || wIndex > ports)
742                         goto error;
743                 wIndex--;
744                 status = 0;
745                 temp = ehci_readl(ehci, status_reg);
746
747                 // wPortChange bits
748                 if (temp & PORT_CSC)
749                         status |= USB_PORT_STAT_C_CONNECTION << 16;
750                 if (temp & PORT_PEC)
751                         status |= USB_PORT_STAT_C_ENABLE << 16;
752
753                 if ((temp & PORT_OCC) && !ignore_oc){
754                         status |= USB_PORT_STAT_C_OVERCURRENT << 16;
755
756                         /*
757                          * Hubs should disable port power on over-current.
758                          * However, not all EHCI implementations do this
759                          * automatically, even if they _do_ support per-port
760                          * power switching; they're allowed to just limit the
761                          * current.  khubd will turn the power back on.
762                          */
763                         if (HCS_PPC (ehci->hcs_params)){
764                                 ehci_writel(ehci,
765                                         temp & ~(PORT_RWC_BITS | PORT_POWER),
766                                         status_reg);
767                         }
768                 }
769
770                 /* whoever resumes must GetPortStatus to complete it!! */
771                 if (temp & PORT_RESUME) {
772
773                         /* Remote Wakeup received? */
774                         if (!ehci->reset_done[wIndex]) {
775                                 /* resume signaling for 20 msec */
776                                 ehci->reset_done[wIndex] = jiffies
777                                                 + msecs_to_jiffies(20);
778                                 /* check the port again */
779                                 mod_timer(&ehci_to_hcd(ehci)->rh_timer,
780                                                 ehci->reset_done[wIndex]);
781                         }
782
783                         /* resume completed? */
784                         else if (time_after_eq(jiffies,
785                                         ehci->reset_done[wIndex])) {
786                                 clear_bit(wIndex, &ehci->suspended_ports);
787                                 set_bit(wIndex, &ehci->port_c_suspend);
788                                 ehci->reset_done[wIndex] = 0;
789
790                                 /* stop resume signaling */
791                                 temp = ehci_readl(ehci, status_reg);
792                                 ehci_writel(ehci,
793                                         temp & ~(PORT_RWC_BITS | PORT_RESUME),
794                                         status_reg);
795                                 retval = handshake(ehci, status_reg,
796                                            PORT_RESUME, 0, 2000 /* 2msec */);
797                                 if (retval != 0) {
798                                         ehci_err(ehci,
799                                                 "port %d resume error %d\n",
800                                                 wIndex + 1, retval);
801                                         goto error;
802                                 }
803                                 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
804                         }
805                 }
806
807                 /* whoever resets must GetPortStatus to complete it!! */
808                 if ((temp & PORT_RESET)
809                                 && time_after_eq(jiffies,
810                                         ehci->reset_done[wIndex])) {
811                         status |= USB_PORT_STAT_C_RESET << 16;
812                         ehci->reset_done [wIndex] = 0;
813
814                         /* force reset to complete */
815                         ehci_writel(ehci, temp & ~(PORT_RWC_BITS | PORT_RESET),
816                                         status_reg);
817                         /* REVISIT:  some hardware needs 550+ usec to clear
818                          * this bit; seems too long to spin routinely...
819                          */
820                         retval = handshake(ehci, status_reg,
821                                         PORT_RESET, 0, 1000);
822                         if (retval != 0) {
823                                 ehci_err (ehci, "port %d reset error %d\n",
824                                         wIndex + 1, retval);
825                                 goto error;
826                         }
827
828                         /* see what we found out */
829                         temp = check_reset_complete (ehci, wIndex, status_reg,
830                                         ehci_readl(ehci, status_reg));
831                 }
832
833                 if (!(temp & (PORT_RESUME|PORT_RESET)))
834                         ehci->reset_done[wIndex] = 0;
835
836                 /* transfer dedicated ports to the companion hc */
837                 if ((temp & PORT_CONNECT) &&
838                                 test_bit(wIndex, &ehci->companion_ports)) {
839                         temp &= ~PORT_RWC_BITS;
840                         temp |= PORT_OWNER;
841                         ehci_writel(ehci, temp, status_reg);
842                         ehci_dbg(ehci, "port %d --> companion\n", wIndex + 1);
843                         temp = ehci_readl(ehci, status_reg);
844                 }
845
846                 /*
847                  * Even if OWNER is set, there's no harm letting khubd
848                  * see the wPortStatus values (they should all be 0 except
849                  * for PORT_POWER anyway).
850                  */
851
852                 if (temp & PORT_CONNECT) {
853                         status |= USB_PORT_STAT_CONNECTION;
854                         // status may be from integrated TT
855                         if (ehci->has_hostpc) {
856                                 temp1 = ehci_readl(ehci, hostpc_reg);
857                                 status |= ehci_port_speed(ehci, temp1);
858                         } else
859                                 status |= ehci_port_speed(ehci, temp);
860                 }
861                 if (temp & PORT_PE)
862                         status |= USB_PORT_STAT_ENABLE;
863
864                 /* maybe the port was unsuspended without our knowledge */
865                 if (temp & (PORT_SUSPEND|PORT_RESUME)) {
866                         status |= USB_PORT_STAT_SUSPEND;
867                 } else if (test_bit(wIndex, &ehci->suspended_ports)) {
868                         clear_bit(wIndex, &ehci->suspended_ports);
869                         ehci->reset_done[wIndex] = 0;
870                         if (temp & PORT_PE)
871                                 set_bit(wIndex, &ehci->port_c_suspend);
872                 }
873
874                 if (temp & PORT_OC)
875                         status |= USB_PORT_STAT_OVERCURRENT;
876                 if (temp & PORT_RESET)
877                         status |= USB_PORT_STAT_RESET;
878                 if (temp & PORT_POWER)
879                         status |= USB_PORT_STAT_POWER;
880                 if (test_bit(wIndex, &ehci->port_c_suspend))
881                         status |= USB_PORT_STAT_C_SUSPEND << 16;
882
883 #ifndef VERBOSE_DEBUG
884         if (status & ~0xffff)   /* only if wPortChange is interesting */
885 #endif
886                 dbg_port (ehci, "GetStatus", wIndex + 1, temp);
887                 put_unaligned_le32(status, buf);
888                 break;
889         case SetHubFeature:
890                 switch (wValue) {
891                 case C_HUB_LOCAL_POWER:
892                 case C_HUB_OVER_CURRENT:
893                         /* no hub-wide feature/status flags */
894                         break;
895                 default:
896                         goto error;
897                 }
898                 break;
899         case SetPortFeature:
900                 selector = wIndex >> 8;
901                 wIndex &= 0xff;
902                 if (unlikely(ehci->debug)) {
903                         /* If the debug port is active any port
904                          * feature requests should get denied */
905                         if (wIndex == HCS_DEBUG_PORT(ehci->hcs_params) &&
906                             (readl(&ehci->debug->control) & DBGP_ENABLED)) {
907                                 retval = -ENODEV;
908                                 goto error_exit;
909                         }
910                 }
911                 if (!wIndex || wIndex > ports)
912                         goto error;
913                 wIndex--;
914                 temp = ehci_readl(ehci, status_reg);
915                 if (temp & PORT_OWNER)
916                         break;
917
918                 temp &= ~PORT_RWC_BITS;
919                 switch (wValue) {
920                 case USB_PORT_FEAT_SUSPEND:
921                         if (ehci->no_selective_suspend)
922                                 break;
923                         if ((temp & PORT_PE) == 0
924                                         || (temp & PORT_RESET) != 0)
925                                 goto error;
926
927                         /* After above check the port must be connected.
928                          * Set appropriate bit thus could put phy into low power
929                          * mode if we have hostpc feature
930                          */
931                         temp &= ~PORT_WKCONN_E;
932                         temp |= PORT_WKDISC_E | PORT_WKOC_E;
933                         ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
934                         if (hostpc_reg) {
935                                 spin_unlock_irqrestore(&ehci->lock, flags);
936                                 msleep(5);/* 5ms for HCD enter low pwr mode */
937                                 spin_lock_irqsave(&ehci->lock, flags);
938                                 temp1 = ehci_readl(ehci, hostpc_reg);
939                                 ehci_writel(ehci, temp1 | HOSTPC_PHCD,
940                                         hostpc_reg);
941                                 temp1 = ehci_readl(ehci, hostpc_reg);
942                                 ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
943                                         wIndex, (temp1 & HOSTPC_PHCD) ?
944                                         "succeeded" : "failed");
945                         }
946                         set_bit(wIndex, &ehci->suspended_ports);
947                         break;
948                 case USB_PORT_FEAT_POWER:
949                         if (HCS_PPC (ehci->hcs_params))
950                                 ehci_writel(ehci, temp | PORT_POWER,
951                                                 status_reg);
952                         break;
953                 case USB_PORT_FEAT_RESET:
954                         if (temp & PORT_RESUME)
955                                 goto error;
956                         /* line status bits may report this as low speed,
957                          * which can be fine if this root hub has a
958                          * transaction translator built in.
959                          */
960                         if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
961                                         && !ehci_is_TDI(ehci)
962                                         && PORT_USB11 (temp)) {
963                                 ehci_dbg (ehci,
964                                         "port %d low speed --> companion\n",
965                                         wIndex + 1);
966                                 temp |= PORT_OWNER;
967                         } else {
968                                 ehci_vdbg (ehci, "port %d reset\n", wIndex + 1);
969                                 temp |= PORT_RESET;
970                                 temp &= ~PORT_PE;
971
972                                 /*
973                                  * caller must wait, then call GetPortStatus
974                                  * usb 2.0 spec says 50 ms resets on root
975                                  */
976                                 ehci->reset_done [wIndex] = jiffies
977                                                 + msecs_to_jiffies (50);
978                         }
979                         ehci_writel(ehci, temp, status_reg);
980                         break;
981
982                 /* For downstream facing ports (these):  one hub port is put
983                  * into test mode according to USB2 11.24.2.13, then the hub
984                  * must be reset (which for root hub now means rmmod+modprobe,
985                  * or else system reboot).  See EHCI 2.3.9 and 4.14 for info
986                  * about the EHCI-specific stuff.
987                  */
988                 case USB_PORT_FEAT_TEST:
989                         if (!selector || selector > 5)
990                                 goto error;
991                         ehci_quiesce(ehci);
992                         ehci_halt(ehci);
993                         temp |= selector << 16;
994                         ehci_writel(ehci, temp, status_reg);
995                         break;
996
997                 default:
998                         goto error;
999                 }
1000                 ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
1001                 break;
1002
1003         default:
1004 error:
1005                 /* "stall" on error */
1006                 retval = -EPIPE;
1007         }
1008 error_exit:
1009         spin_unlock_irqrestore (&ehci->lock, flags);
1010         return retval;
1011 }
1012
1013 static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
1014 {
1015         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1016
1017         if (ehci_is_TDI(ehci))
1018                 return;
1019         set_owner(ehci, --portnum, PORT_OWNER);
1020 }
1021
1022 static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum)
1023 {
1024         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1025         u32 __iomem             *reg;
1026
1027         if (ehci_is_TDI(ehci))
1028                 return 0;
1029         reg = &ehci->regs->port_status[portnum - 1];
1030         return ehci_readl(ehci, reg) & PORT_OWNER;
1031 }