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 891