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_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 (ehci->has_ppcd && !(ppcd & (1 << i)))
 632                        continue;
 633                temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
 634
 635                /*
 636                 * Return status information even for ports with OWNER set.
 637                 * Otherwise khubd wouldn't see the disconnect event when a
 638                 * high-speed device is switched over to the companion
 639                 * controller by the user.
 640                 */
 641
 642                if ((temp & mask) != 0 || test_bit(i, &ehci->port_c_suspend)
 643                                || (ehci->reset_done[i] && time_after_eq(
 644                                        jiffies, ehci->reset_done[i]))) {
 645                        if (i < 7)
 646                            buf [0] |= 1 << (i + 1);
 647                        else
 648                            buf [1] |= 1 << (i - 7);
 649                        status = STS_PCD;
 650                }
 651        }
 652
 653        /* If a resume is in progress, make sure it can finish */
 654        if (ehci->resuming_ports)
 655                mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25));
 656
 657        spin_unlock_irqrestore (&ehci->lock, flags);
 658        return status ? retval : 0;
 659}
 660
 661/*-------------------------------------------------------------------------*/
 662
 663static void
 664ehci_hub_descriptor (
 665        struct ehci_hcd                 *ehci,
 666        struct usb_hub_descriptor       *desc
 667) {
 668        int             ports = HCS_N_PORTS (ehci->hcs_params);
 669        u16             temp;
 670
 671        desc->bDescriptorType = 0x29;
 672        desc->bPwrOn2PwrGood = 10;      /* ehci 1.0, 2.3.9 says 20ms max */
 673        desc->bHubContrCurrent = 0;
 674
 675        desc->bNbrPorts = ports;
 676        temp = 1 + (ports / 8);
 677        desc->bDescLength = 7 + 2 * temp;
 678
 679        /* two bitmaps:  ports removable, and usb 1.0 legacy PortPwrCtrlMask */
 680        memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
 681        memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
 682
 683        temp = 0x0008;                  /* per-port overcurrent reporting */
 684        if (HCS_PPC (ehci->hcs_params))
 685                temp |= 0x0001;         /* per-port power control */
 686        else
 687                temp |= 0x0002;         /* no power switching */
 688#if 0
 689// re-enable when we support USB_PORT_FEAT_INDICATOR below.
 690        if (HCS_INDICATOR (ehci->hcs_params))
 691                temp |= 0x0080;         /* per-port indicators (LEDs) */
 692#endif
 693        desc->wHubCharacteristics = cpu_to_le16(temp);
 694}
 695
 696/*-------------------------------------------------------------------------*/
 697
 698static int ehci_hub_control (
 699        struct usb_hcd  *hcd,
 700        u16             typeReq,
 701        u16             wValue,
 702        u16             wIndex,
 703        char            *buf,
 704        u16             wLength
 705) {
 706        struct ehci_hcd *ehci = hcd_to_ehci (hcd);
 707        int             ports = HCS_N_PORTS (ehci->hcs_params);
 708        u32 __iomem     *status_reg = &ehci->regs->port_status[
 709                                (wIndex & 0xff) - 1];
 710        u32 __iomem     *hostpc_reg = &ehci->regs->hostpc[(wIndex & 0xff) - 1];
 711        u32             temp, temp1, status;
 712        unsigned long   flags;
 713        int             retval = 0;
 714        unsigned        selector;
 715
 716        /*
 717         * FIXME:  support SetPortFeatures USB_PORT_FEAT_INDICATOR.
 718         * HCS_INDICATOR may say we can change LEDs to off/amber/green.
 719         * (track current state ourselves) ... blink for diagnostics,
 720         * power, "this is the one", etc.  EHCI spec supports this.
 721         */
 722
 723        spin_lock_irqsave (&ehci->lock, flags);
 724        switch (typeReq) {
 725        case ClearHubFeature:
 726                switch (wValue) {
 727                case C_HUB_LOCAL_POWER:
 728                case C_HUB_OVER_CURRENT:
 729                        /* no hub-wide feature/status flags */
 730                        break;
 731                default:
 732                        goto error;
 733                }
 734                break;
 735        case ClearPortFeature:
 736                if (!wIndex || wIndex > ports)
 737                        goto error;
 738                wIndex--;
 739                temp = ehci_readl(ehci, status_reg);
 740                temp &= ~PORT_RWC_BITS;
 741
 742                /*
 743                 * Even if OWNER is set, so the port is owned by the
 744                 * companion controller, khubd needs to be able to clear
 745                 * the port-change status bits (especially
 746                 * USB_PORT_STAT_C_CONNECTION).
 747                 */
 748
 749                switch (wValue) {
 750                case USB_PORT_FEAT_ENABLE:
 751                        ehci_writel(ehci, temp & ~PORT_PE, status_reg);
 752                        break;
 753                case USB_PORT_FEAT_C_ENABLE:
 754                        ehci_writel(ehci, temp | PORT_PEC, status_reg);
 755                        break;
 756                case USB_PORT_FEAT_SUSPEND:
 757                        if (temp & PORT_RESET)
 758                                goto error;
 759                        if (ehci->no_selective_suspend)
 760                                break;
 761#ifdef CONFIG_USB_OTG
 762                        if ((hcd->self.otg_port == (wIndex + 1))
 763                            && hcd->self.b_hnp_enable) {
 764                                otg_start_hnp(hcd->phy->otg);
 765                                break;
 766                        }
 767#endif
 768                        if (!(temp & PORT_SUSPEND))
 769                                break;
 770                        if ((temp & PORT_PE) == 0)
 771                                goto error;
 772
 773                        /* clear phy low-power mode before resume */
 774                        if (ehci->has_hostpc) {
 775                                temp1 = ehci_readl(ehci, hostpc_reg);
 776                                ehci_writel(ehci, temp1 & ~HOSTPC_PHCD,
 777                                                hostpc_reg);
 778                                spin_unlock_irqrestore(&ehci->lock, flags);
 779                                msleep(5);/* wait to leave low-power mode */
 780                                spin_lock_irqsave(&ehci->lock, flags);
 781                        }
 782                        /* resume signaling for 20 msec */
 783                        temp &= ~PORT_WAKE_BITS;
 784                        ehci_writel(ehci, temp | PORT_RESUME, status_reg);
 785                        ehci->reset_done[wIndex] = jiffies
 786                                        + msecs_to_jiffies(20);
 787                        break;
 788                case USB_PORT_FEAT_C_SUSPEND:
 789                        clear_bit(wIndex, &ehci->port_c_suspend);
 790                        break;
 791                case USB_PORT_FEAT_POWER:
 792                        if (HCS_PPC (ehci->hcs_params))
 793                                ehci_writel(ehci, temp & ~PORT_POWER,
 794                                                status_reg);
 795                        break;
 796                case USB_PORT_FEAT_C_CONNECTION:
 797                        ehci_writel(ehci, temp | PORT_CSC, status_reg);
 798                        break;
 799                case USB_PORT_FEAT_C_OVER_CURRENT:
 800                        ehci_writel(ehci, temp | PORT_OCC, status_reg);
 801                        break;
 802                case USB_PORT_FEAT_C_RESET:
 803                        /* GetPortStatus clears reset */
 804                        break;
 805                default:
 806                        goto error;
 807                }
 808                ehci_readl(ehci, &ehci->regs->command); /* unblock posted write */
 809                break;
 810        case GetHubDescriptor:
 811                ehci_hub_descriptor (ehci, (struct usb_hub_descriptor *)
 812                        buf);
 813                break;
 814        case GetHubStatus:
 815                /* no hub-wide feature/status flags */
 816                memset (buf, 0, 4);
 817                //cpu_to_le32s ((u32 *) buf);
 818                break;
 819        case GetPortStatus:
 820                if (!wIndex || wIndex > ports)
 821                        goto error;
 822                wIndex--;
 823                status = 0;
 824                temp = ehci_readl(ehci, status_reg);
 825
 826                // wPortChange bits
 827                if (temp & PORT_CSC)
 828                        status |= USB_PORT_STAT_C_CONNECTION << 16;
 829                if (temp & PORT_PEC)
 830                        status |= USB_PORT_STAT_C_ENABLE << 16;
 831
 832                if ((temp & PORT_OCC) && !ignore_oc){
 833                        status |= USB_PORT_STAT_C_OVERCURRENT << 16;
 834
 835                        /*
 836                         * Hubs should disable port power on over-current.
 837                         * However, not all EHCI implementations do this
 838                         * automatically, even if they _do_ support per-port
 839                         * power switching; they're allowed to just limit the
 840                         * current.  khubd will turn the power back on.
 841                         */
 842                        if ((temp & PORT_OC) && HCS_PPC(ehci->hcs_params)) {
 843                                ehci_writel(ehci,
 844                                        temp & ~(PORT_RWC_BITS | PORT_POWER),
 845                                        status_reg);
 846                                temp = ehci_readl(ehci, status_reg);
 847                        }
 848                }
 849
 850                /* whoever resumes must GetPortStatus to complete it!! */
 851                if (temp & PORT_RESUME) {
 852
 853                        /* Remote Wakeup received? */
 854                        if (!ehci->reset_done[wIndex]) {
 855                                /* resume signaling for 20 msec */
 856                                ehci->reset_done[wIndex] = jiffies
 857                                                + msecs_to_jiffies(20);
 858                                usb_hcd_start_port_resume(&hcd->self, wIndex);
 859                                /* check the port again */
 860                                mod_timer(&ehci_to_hcd(ehci)->rh_timer,
 861                                                ehci->reset_done[wIndex]);
 862                        }
 863
 864                        /* resume completed? */
 865                        else if (time_after_eq(jiffies,
 866                                        ehci->reset_done[wIndex])) {
 867                                clear_bit(wIndex, &ehci->suspended_ports);
 868                                set_bit(wIndex, &ehci->port_c_suspend);
 869                                ehci->reset_done[wIndex] = 0;
 870                                usb_hcd_end_port_resume(&hcd->self, wIndex);
 871
 872                                /* stop resume signaling */
 873                                temp = ehci_readl(ehci, status_reg);
 874                                ehci_writel(ehci,
 875                                        temp & ~(PORT_RWC_BITS | PORT_RESUME),
 876                                        status_reg);
 877                                clear_bit(wIndex, &ehci->resuming_ports);
 878                                retval = handshake(ehci, status_reg,
 879                                           PORT_RESUME, 0, 2000 /* 2msec */);
 880                                if (retval != 0) {
 881                                        ehci_err(ehci,
 882                                                "port %d resume error %d\n",
 883                                                wIndex + 1, retval);
 884                                        goto error;
 885                                }
 886                                temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
 887                        }
 888                }
 889
 890                /* whoever resets must GetPortStatus to complete it!! */
 891                if ((temp & PORT_RESET)
 892                                && time_after_eq(jiffies,
 893                                        ehci->reset_done[wIndex])) {
 894                        status |= USB_PORT_STAT_C_RESET << 16;
 895                        ehci->reset_done [wIndex] = 0;
 896                        clear_bit(wIndex, &ehci->resuming_ports);
 897
 898                        /* force reset to complete */
 899                        ehci_writel(ehci, temp & ~(PORT_RWC_BITS | PORT_RESET),
 900                                        status_reg);
 901                        /* REVISIT:  some hardware needs 550+ usec to clear
 902                         * this bit; seems too long to spin routinely...
 903                         */
 904                        retval = handshake(ehci, status_reg,
 905                                        PORT_RESET, 0, 1000);
 906                        if (retval != 0) {
 907                                ehci_err (ehci, "port %d reset error %d\n",
 908                                        wIndex + 1, retval);
 909                                goto error;
 910                        }
 911
 912                        /* see what we found out */
 913                        temp = check_reset_complete (ehci, wIndex, status_reg,
 914                                        ehci_readl(ehci, status_reg));
 915                }
 916
 917                if (!(temp & (PORT_RESUME|PORT_RESET))) {
 918                        ehci->reset_done[wIndex] = 0;
 919                        clear_bit(wIndex, &ehci->resuming_ports);
 920                }
 921
 922                /* transfer dedicated ports to the companion hc */
 923                if ((temp & PORT_CONNECT) &&
 924                                test_bit(wIndex, &ehci->companion_ports)) {
 925                        temp &= ~PORT_RWC_BITS;
 926                        temp |= PORT_OWNER;
 927                        ehci_writel(ehci, temp, status_reg);
 928                        ehci_dbg(ehci, "port %d --> companion\n", wIndex + 1);
 929                        temp = ehci_readl(ehci, status_reg);
 930                }
 931
 932                /*
 933                 * Even if OWNER is set, there's no harm letting khubd
 934                 * see the wPortStatus values (they should all be 0 except
 935                 * for PORT_POWER anyway).
 936                 */
 937
 938                if (temp & PORT_CONNECT) {
 939                        status |= USB_PORT_STAT_CONNECTION;
 940                        // status may be from integrated TT
 941                        if (ehci->has_hostpc) {
 942                                temp1 = ehci_readl(ehci, hostpc_reg);
 943                                status |= ehci_port_speed(ehci, temp1);
 944                        } else
 945                                status |= ehci_port_speed(ehci, temp);
 946                }
 947                if (temp & PORT_PE)
 948                        status |= USB_PORT_STAT_ENABLE;
 949
 950                /* maybe the port was unsuspended without our knowledge */
 951                if (temp & (PORT_SUSPEND|PORT_RESUME)) {
 952                        status |= USB_PORT_STAT_SUSPEND;
 953                } else if (test_bit(wIndex, &ehci->suspended_ports)) {
 954                        clear_bit(wIndex, &ehci->suspended_ports);
 955                        clear_bit(wIndex, &ehci->resuming_ports);
 956                        ehci->reset_done[wIndex] = 0;
 957                        if (temp & PORT_PE)
 958                                set_bit(wIndex, &ehci->port_c_suspend);
 959                        usb_hcd_end_port_resume(&hcd->self, wIndex);
 960                }
 961
 962                if (temp & PORT_OC)
 963                        status |= USB_PORT_STAT_OVERCURRENT;
 964                if (temp & PORT_RESET)
 965                        status |= USB_PORT_STAT_RESET;
 966                if (temp & PORT_POWER)
 967                        status |= USB_PORT_STAT_POWER;
 968                if (test_bit(wIndex, &ehci->port_c_suspend))
 969                        status |= USB_PORT_STAT_C_SUSPEND << 16;
 970
 971#ifndef VERBOSE_DEBUG
 972        if (status & ~0xffff)   /* only if wPortChange is interesting */
 973#endif
 974                dbg_port (ehci, "GetStatus", wIndex + 1, temp);
 975                put_unaligned_le32(status, buf);
 976                break;
 977        case SetHubFeature:
 978                switch (wValue) {
 979                case C_HUB_LOCAL_POWER:
 980                case C_HUB_OVER_CURRENT:
 981                        /* no hub-wide feature/status flags */
 982                        break;
 983                default:
 984                        goto error;
 985                }
 986                break;
 987        case SetPortFeature:
 988                selector = wIndex >> 8;
 989                wIndex &= 0xff;
 990                if (unlikely(ehci->debug)) {
 991                        /* If the debug port is active any port
 992                         * feature requests should get denied */
 993                        if (wIndex == HCS_DEBUG_PORT(ehci->hcs_params) &&
 994                            (readl(&ehci->debug->control) & DBGP_ENABLED)) {
 995                                retval = -ENODEV;
 996                                goto error_exit;
 997                        }
 998                }
 999                if (!wIndex || wIndex > ports)
1000                        goto error;
1001                wIndex--;
1002                temp = ehci_readl(ehci, status_reg);
1003                if (temp & PORT_OWNER)
1004                        break;
1005
1006                temp &= ~PORT_RWC_BITS;
1007                switch (wValue) {
1008                case USB_PORT_FEAT_SUSPEND:
1009                        if (ehci->no_selective_suspend)
1010                                break;
1011                        if ((temp & PORT_PE) == 0
1012                                        || (temp & PORT_RESET) != 0)
1013                                goto error;
1014
1015                        /* After above check the port must be connected.
1016                         * Set appropriate bit thus could put phy into low power
1017                         * mode if we have hostpc feature
1018                         */
1019                        temp &= ~PORT_WKCONN_E;
1020                        temp |= PORT_WKDISC_E | PORT_WKOC_E;
1021                        ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
1022                        if (ehci->has_hostpc) {
1023                                spin_unlock_irqrestore(&ehci->lock, flags);
1024                                msleep(5);/* 5ms for HCD enter low pwr mode */
1025                                spin_lock_irqsave(&ehci->lock, flags);
1026                                temp1 = ehci_readl(ehci, hostpc_reg);
1027                                ehci_writel(ehci, temp1 | HOSTPC_PHCD,
1028                                        hostpc_reg);
1029                                temp1 = ehci_readl(ehci, hostpc_reg);
1030                                ehci_dbg(ehci, "Port%d phy low pwr mode %s\n",
1031                                        wIndex, (temp1 & HOSTPC_PHCD) ?
1032                                        "succeeded" : "failed");
1033                        }
1034                        set_bit(wIndex, &ehci->suspended_ports);
1035                        break;
1036                case USB_PORT_FEAT_POWER:
1037                        if (HCS_PPC (ehci->hcs_params))
1038                                ehci_writel(ehci, temp | PORT_POWER,
1039                                                status_reg);
1040                        break;
1041                case USB_PORT_FEAT_RESET:
1042                        if (temp & PORT_RESUME)
1043                                goto error;
1044                        /* line status bits may report this as low speed,
1045                         * which can be fine if this root hub has a
1046                         * transaction translator built in.
1047                         */
1048                        if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
1049                                        && !ehci_is_TDI(ehci)
1050                                        && PORT_USB11 (temp)) {
1051                                ehci_dbg (ehci,
1052                                        "port %d low speed --> companion\n",
1053                                        wIndex + 1);
1054                                temp |= PORT_OWNER;
1055                        } else {
1056                                ehci_vdbg (ehci, "port %d reset\n", wIndex + 1);
1057                                temp |= PORT_RESET;
1058                                temp &= ~PORT_PE;
1059
1060                                /*
1061                                 * caller must wait, then call GetPortStatus
1062                                 * usb 2.0 spec says 50 ms resets on root
1063                                 */
1064                                ehci->reset_done [wIndex] = jiffies
1065                                                + msecs_to_jiffies (50);
1066                        }
1067                        ehci_writel(ehci, temp, status_reg);
1068                        break;
1069
1070                /* For downstream facing ports (these):  one hub port is put
1071                 * into test mode according to USB2 11.24.2.13, then the hub
1072                 * must be reset (which for root hub now means rmmod+modprobe,
1073                 * or else system reboot).  See EHCI 2.3.9 and 4.14 for info
1074                 * about the EHCI-specific stuff.
1075                 */
1076                case USB_PORT_FEAT_TEST:
1077                        if (!selector || selector > 5)
1078                                goto error;
1079                        spin_unlock_irqrestore(&ehci->lock, flags);
1080                        ehci_quiesce(ehci);
1081                        spin_lock_irqsave(&ehci->lock, flags);
1082
1083                        /* Put all enabled ports into suspend */
1084                        while (ports--) {
1085                                u32 __iomem *sreg =
1086                                                &ehci->regs->port_status[ports];
1087
1088                                temp = ehci_readl(ehci, sreg) & ~PORT_RWC_BITS;
1089                                if (temp & PORT_PE)
1090                                        ehci_writel(ehci, temp | PORT_SUSPEND,
1091                                                        sreg);
1092                        }
1093
1094                        spin_unlock_irqrestore(&ehci->lock, flags);
1095                        ehci_halt(ehci);
1096                        spin_lock_irqsave(&ehci->lock, flags);
1097
1098                        temp = ehci_readl(ehci, status_reg);
1099                        temp |= selector << 16;
1100                        ehci_writel(ehci, temp, status_reg);
1101                        break;
1102
1103                default:
1104                        goto error;
1105                }
1106                ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
1107                break;
1108
1109        default:
1110error:
1111                /* "stall" on error */
1112                retval = -EPIPE;
1113        }
1114error_exit:
1115        spin_unlock_irqrestore (&ehci->lock, flags);
1116        return retval;
1117}
1118
1119static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
1120{
1121        struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1122
1123        if (ehci_is_TDI(ehci))
1124                return;
1125        set_owner(ehci, --portnum, PORT_OWNER);
1126}
1127
1128static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum)
1129{
1130        struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
1131        u32 __iomem             *reg;
1132
1133        if (ehci_is_TDI(ehci))
1134                return 0;
1135        reg = &ehci->regs->port_status[portnum - 1];
1136        return ehci_readl(ehci, reg) & PORT_OWNER;
1137}
1138