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