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