linux/drivers/usb/host/ohci-hub.c
<<
>>
Prefs
   1/*
   2 * OHCI HCD (Host Controller Driver) for USB.
   3 *
   4 * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
   5 * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
   6 *
   7 * This file is licenced under GPL
   8 */
   9
  10/*-------------------------------------------------------------------------*/
  11
  12/*
  13 * OHCI Root Hub ... the nonsharable stuff
  14 */
  15
  16#define dbg_port(hc,label,num,value) \
  17        ohci_dbg (hc, \
  18                "%s roothub.portstatus [%d] " \
  19                "= 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \
  20                label, num, temp, \
  21                (temp & RH_PS_PRSC) ? " PRSC" : "", \
  22                (temp & RH_PS_OCIC) ? " OCIC" : "", \
  23                (temp & RH_PS_PSSC) ? " PSSC" : "", \
  24                (temp & RH_PS_PESC) ? " PESC" : "", \
  25                (temp & RH_PS_CSC) ? " CSC" : "", \
  26                \
  27                (temp & RH_PS_LSDA) ? " LSDA" : "", \
  28                (temp & RH_PS_PPS) ? " PPS" : "", \
  29                (temp & RH_PS_PRS) ? " PRS" : "", \
  30                (temp & RH_PS_POCI) ? " POCI" : "", \
  31                (temp & RH_PS_PSS) ? " PSS" : "", \
  32                \
  33                (temp & RH_PS_PES) ? " PES" : "", \
  34                (temp & RH_PS_CCS) ? " CCS" : "" \
  35                );
  36
  37/*-------------------------------------------------------------------------*/
  38
  39#define OHCI_SCHED_ENABLES \
  40        (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE)
  41
  42static void dl_done_list (struct ohci_hcd *);
  43static void finish_unlinks (struct ohci_hcd *, u16);
  44
  45#ifdef  CONFIG_PM
  46static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop)
  47__releases(ohci->lock)
  48__acquires(ohci->lock)
  49{
  50        int                     status = 0;
  51
  52        ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
  53        switch (ohci->hc_control & OHCI_CTRL_HCFS) {
  54        case OHCI_USB_RESUME:
  55                ohci_dbg (ohci, "resume/suspend?\n");
  56                ohci->hc_control &= ~OHCI_CTRL_HCFS;
  57                ohci->hc_control |= OHCI_USB_RESET;
  58                ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
  59                (void) ohci_readl (ohci, &ohci->regs->control);
  60                /* FALL THROUGH */
  61        case OHCI_USB_RESET:
  62                status = -EBUSY;
  63                ohci_dbg (ohci, "needs reinit!\n");
  64                goto done;
  65        case OHCI_USB_SUSPEND:
  66                if (!ohci->autostop) {
  67                        ohci_dbg (ohci, "already suspended\n");
  68                        goto done;
  69                }
  70        }
  71        ohci_dbg (ohci, "%s root hub\n",
  72                        autostop ? "auto-stop" : "suspend");
  73
  74        /* First stop any processing */
  75        if (!autostop && (ohci->hc_control & OHCI_SCHED_ENABLES)) {
  76                ohci->hc_control &= ~OHCI_SCHED_ENABLES;
  77                ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
  78                ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
  79                ohci_writel (ohci, OHCI_INTR_SF, &ohci->regs->intrstatus);
  80
  81                /* sched disables take effect on the next frame,
  82                 * then the last WDH could take 6+ msec
  83                 */
  84                ohci_dbg (ohci, "stopping schedules ...\n");
  85                ohci->autostop = 0;
  86                spin_unlock_irq (&ohci->lock);
  87                msleep (8);
  88                spin_lock_irq (&ohci->lock);
  89        }
  90        dl_done_list (ohci);
  91        finish_unlinks (ohci, ohci_frame_no(ohci));
  92
  93        /* maybe resume can wake root hub */
  94        if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) {
  95                ohci->hc_control |= OHCI_CTRL_RWE;
  96        } else {
  97                ohci_writel(ohci, OHCI_INTR_RHSC | OHCI_INTR_RD,
  98                                &ohci->regs->intrdisable);
  99                ohci->hc_control &= ~OHCI_CTRL_RWE;
 100        }
 101
 102        /* Suspend hub ... this is the "global (to this bus) suspend" mode,
 103         * which doesn't imply ports will first be individually suspended.
 104         */
 105        ohci->hc_control &= ~OHCI_CTRL_HCFS;
 106        ohci->hc_control |= OHCI_USB_SUSPEND;
 107        ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
 108        (void) ohci_readl (ohci, &ohci->regs->control);
 109
 110        /* no resumes until devices finish suspending */
 111        if (!autostop) {
 112                ohci->next_statechange = jiffies + msecs_to_jiffies (5);
 113                ohci->autostop = 0;
 114                ohci->rh_state = OHCI_RH_SUSPENDED;
 115        }
 116
 117done:
 118        return status;
 119}
 120
 121static inline struct ed *find_head (struct ed *ed)
 122{
 123        /* for bulk and control lists */
 124        while (ed->ed_prev)
 125                ed = ed->ed_prev;
 126        return ed;
 127}
 128
 129/* caller has locked the root hub */
 130static int ohci_rh_resume (struct ohci_hcd *ohci)
 131__releases(ohci->lock)
 132__acquires(ohci->lock)
 133{
 134        struct usb_hcd          *hcd = ohci_to_hcd (ohci);
 135        u32                     temp, enables;
 136        int                     status = -EINPROGRESS;
 137        int                     autostopped = ohci->autostop;
 138
 139        ohci->autostop = 0;
 140        ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
 141
 142        if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
 143                /* this can happen after resuming a swsusp snapshot */
 144                if (ohci->rh_state != OHCI_RH_RUNNING) {
 145                        ohci_dbg (ohci, "BIOS/SMM active, control %03x\n",
 146                                        ohci->hc_control);
 147                        status = -EBUSY;
 148                /* this happens when pmcore resumes HC then root */
 149                } else {
 150                        ohci_dbg (ohci, "duplicate resume\n");
 151                        status = 0;
 152                }
 153        } else switch (ohci->hc_control & OHCI_CTRL_HCFS) {
 154        case OHCI_USB_SUSPEND:
 155                ohci->hc_control &= ~(OHCI_CTRL_HCFS|OHCI_SCHED_ENABLES);
 156                ohci->hc_control |= OHCI_USB_RESUME;
 157                ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
 158                (void) ohci_readl (ohci, &ohci->regs->control);
 159                ohci_dbg (ohci, "%s root hub\n",
 160                                autostopped ? "auto-start" : "resume");
 161                break;
 162        case OHCI_USB_RESUME:
 163                /* HCFS changes sometime after INTR_RD */
 164                ohci_dbg(ohci, "%swakeup root hub\n",
 165                                autostopped ? "auto-" : "");
 166                break;
 167        case OHCI_USB_OPER:
 168                /* this can happen after resuming a swsusp snapshot */
 169                ohci_dbg (ohci, "snapshot resume? reinit\n");
 170                status = -EBUSY;
 171                break;
 172        default:                /* RESET, we lost power */
 173                ohci_dbg (ohci, "lost power\n");
 174                status = -EBUSY;
 175        }
 176        if (status == -EBUSY) {
 177                if (!autostopped) {
 178                        spin_unlock_irq (&ohci->lock);
 179                        status = ohci_restart (ohci);
 180
 181                        usb_root_hub_lost_power(hcd->self.root_hub);
 182
 183                        spin_lock_irq (&ohci->lock);
 184                }
 185                return status;
 186        }
 187        if (status != -EINPROGRESS)
 188                return status;
 189        if (autostopped)
 190                goto skip_resume;
 191        spin_unlock_irq (&ohci->lock);
 192
 193        /* Some controllers (lucent erratum) need extra-long delays */
 194        msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1);
 195
 196        temp = ohci_readl (ohci, &ohci->regs->control);
 197        temp &= OHCI_CTRL_HCFS;
 198        if (temp != OHCI_USB_RESUME) {
 199                ohci_err (ohci, "controller won't resume\n");
 200                spin_lock_irq(&ohci->lock);
 201                return -EBUSY;
 202        }
 203
 204        /* disable old schedule state, reinit from scratch */
 205        ohci_writel (ohci, 0, &ohci->regs->ed_controlhead);
 206        ohci_writel (ohci, 0, &ohci->regs->ed_controlcurrent);
 207        ohci_writel (ohci, 0, &ohci->regs->ed_bulkhead);
 208        ohci_writel (ohci, 0, &ohci->regs->ed_bulkcurrent);
 209        ohci_writel (ohci, 0, &ohci->regs->ed_periodcurrent);
 210        ohci_writel (ohci, (u32) ohci->hcca_dma, &ohci->regs->hcca);
 211
 212        /* Sometimes PCI D3 suspend trashes frame timings ... */
 213        periodic_reinit (ohci);
 214
 215        /*
 216         * The following code is executed with ohci->lock held and
 217         * irqs disabled if and only if autostopped is true.  This
 218         * will cause sparse to warn about a "context imbalance".
 219         */
 220skip_resume:
 221        /* interrupts might have been disabled */
 222        ohci_writel (ohci, OHCI_INTR_INIT, &ohci->regs->intrenable);
 223        if (ohci->ed_rm_list)
 224                ohci_writel (ohci, OHCI_INTR_SF, &ohci->regs->intrenable);
 225
 226        /* Then re-enable operations */
 227        ohci_writel (ohci, OHCI_USB_OPER, &ohci->regs->control);
 228        (void) ohci_readl (ohci, &ohci->regs->control);
 229        if (!autostopped)
 230                msleep (3);
 231
 232        temp = ohci->hc_control;
 233        temp &= OHCI_CTRL_RWC;
 234        temp |= OHCI_CONTROL_INIT | OHCI_USB_OPER;
 235        ohci->hc_control = temp;
 236        ohci_writel (ohci, temp, &ohci->regs->control);
 237        (void) ohci_readl (ohci, &ohci->regs->control);
 238
 239        /* TRSMRCY */
 240        if (!autostopped) {
 241                msleep (10);
 242                spin_lock_irq (&ohci->lock);
 243        }
 244        /* now ohci->lock is always held and irqs are always disabled */
 245
 246        /* keep it alive for more than ~5x suspend + resume costs */
 247        ohci->next_statechange = jiffies + STATECHANGE_DELAY;
 248
 249        /* maybe turn schedules back on */
 250        enables = 0;
 251        temp = 0;
 252        if (!ohci->ed_rm_list) {
 253                if (ohci->ed_controltail) {
 254                        ohci_writel (ohci,
 255                                        find_head (ohci->ed_controltail)->dma,
 256                                        &ohci->regs->ed_controlhead);
 257                        enables |= OHCI_CTRL_CLE;
 258                        temp |= OHCI_CLF;
 259                }
 260                if (ohci->ed_bulktail) {
 261                        ohci_writel (ohci, find_head (ohci->ed_bulktail)->dma,
 262                                &ohci->regs->ed_bulkhead);
 263                        enables |= OHCI_CTRL_BLE;
 264                        temp |= OHCI_BLF;
 265                }
 266        }
 267        if (hcd->self.bandwidth_isoc_reqs || hcd->self.bandwidth_int_reqs)
 268                enables |= OHCI_CTRL_PLE|OHCI_CTRL_IE;
 269        if (enables) {
 270                ohci_dbg (ohci, "restarting schedules ... %08x\n", enables);
 271                ohci->hc_control |= enables;
 272                ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
 273                if (temp)
 274                        ohci_writel (ohci, temp, &ohci->regs->cmdstatus);
 275                (void) ohci_readl (ohci, &ohci->regs->control);
 276        }
 277
 278        ohci->rh_state = OHCI_RH_RUNNING;
 279        return 0;
 280}
 281
 282static int ohci_bus_suspend (struct usb_hcd *hcd)
 283{
 284        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
 285        int                     rc;
 286
 287        spin_lock_irq (&ohci->lock);
 288
 289        if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
 290                rc = -ESHUTDOWN;
 291        else
 292                rc = ohci_rh_suspend (ohci, 0);
 293        spin_unlock_irq (&ohci->lock);
 294        return rc;
 295}
 296
 297static int ohci_bus_resume (struct usb_hcd *hcd)
 298{
 299        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
 300        int                     rc;
 301
 302        if (time_before (jiffies, ohci->next_statechange))
 303                msleep(5);
 304
 305        spin_lock_irq (&ohci->lock);
 306
 307        if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
 308                rc = -ESHUTDOWN;
 309        else
 310                rc = ohci_rh_resume (ohci);
 311        spin_unlock_irq (&ohci->lock);
 312
 313        /* poll until we know a device is connected or we autostop */
 314        if (rc == 0)
 315                usb_hcd_poll_rh_status(hcd);
 316        return rc;
 317}
 318
 319/* Carry out polling-, autostop-, and autoresume-related state changes */
 320static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
 321                int any_connected, int rhsc_status)
 322{
 323        int     poll_rh = 1;
 324        int     rhsc_enable;
 325
 326        /* Some broken controllers never turn off RHSC in the interrupt
 327         * status register.  For their sake we won't re-enable RHSC
 328         * interrupts if the interrupt bit is already active.
 329         */
 330        rhsc_enable = ohci_readl(ohci, &ohci->regs->intrenable) &
 331                        OHCI_INTR_RHSC;
 332
 333        switch (ohci->hc_control & OHCI_CTRL_HCFS) {
 334        case OHCI_USB_OPER:
 335                /* If no status changes are pending, enable RHSC interrupts. */
 336                if (!rhsc_enable && !rhsc_status && !changed) {
 337                        rhsc_enable = OHCI_INTR_RHSC;
 338                        ohci_writel(ohci, rhsc_enable, &ohci->regs->intrenable);
 339                }
 340
 341                /* Keep on polling until we know a device is connected
 342                 * and RHSC is enabled, or until we autostop.
 343                 */
 344                if (!ohci->autostop) {
 345                        if (any_connected ||
 346                                        !device_may_wakeup(&ohci_to_hcd(ohci)
 347                                                ->self.root_hub->dev)) {
 348                                if (rhsc_enable)
 349                                        poll_rh = 0;
 350                        } else {
 351                                ohci->autostop = 1;
 352                                ohci->next_statechange = jiffies + HZ;
 353                        }
 354
 355                /* if no devices have been attached for one second, autostop */
 356                } else {
 357                        if (changed || any_connected) {
 358                                ohci->autostop = 0;
 359                                ohci->next_statechange = jiffies +
 360                                                STATECHANGE_DELAY;
 361                        } else if (time_after_eq(jiffies,
 362                                                ohci->next_statechange)
 363                                        && !ohci->ed_rm_list
 364                                        && !(ohci->hc_control &
 365                                                OHCI_SCHED_ENABLES)) {
 366                                ohci_rh_suspend(ohci, 1);
 367                                if (rhsc_enable)
 368                                        poll_rh = 0;
 369                        }
 370                }
 371                break;
 372
 373        case OHCI_USB_SUSPEND:
 374        case OHCI_USB_RESUME:
 375                /* if there is a port change, autostart or ask to be resumed */
 376                if (changed) {
 377                        if (ohci->autostop)
 378                                ohci_rh_resume(ohci);
 379                        else
 380                                usb_hcd_resume_root_hub(ohci_to_hcd(ohci));
 381
 382                /* If remote wakeup is disabled, stop polling */
 383                } else if (!ohci->autostop &&
 384                                !ohci_to_hcd(ohci)->self.root_hub->
 385                                        do_remote_wakeup) {
 386                        poll_rh = 0;
 387
 388                } else {
 389                        /* If no status changes are pending,
 390                         * enable RHSC interrupts
 391                         */
 392                        if (!rhsc_enable && !rhsc_status) {
 393                                rhsc_enable = OHCI_INTR_RHSC;
 394                                ohci_writel(ohci, rhsc_enable,
 395                                                &ohci->regs->intrenable);
 396                        }
 397                        /* Keep polling until RHSC is enabled */
 398                        if (rhsc_enable)
 399                                poll_rh = 0;
 400                }
 401                break;
 402        }
 403        return poll_rh;
 404}
 405
 406#else   /* CONFIG_PM */
 407
 408static inline int ohci_rh_resume(struct ohci_hcd *ohci)
 409{
 410        return 0;
 411}
 412
 413/* Carry out polling-related state changes.
 414 * autostop isn't used when CONFIG_PM is turned off.
 415 */
 416static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
 417                int any_connected, int rhsc_status)
 418{
 419        /* If RHSC is enabled, don't poll */
 420        if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC)
 421                return 0;
 422
 423        /* If status changes are pending, continue polling.
 424         * Conversely, if no status changes are pending but the RHSC
 425         * status bit was set, then RHSC may be broken so continue polling.
 426         */
 427        if (changed || rhsc_status)
 428                return 1;
 429
 430        /* It's safe to re-enable RHSC interrupts */
 431        ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable);
 432        return 0;
 433}
 434
 435#endif  /* CONFIG_PM */
 436
 437/*-------------------------------------------------------------------------*/
 438
 439/* build "status change" packet (one or two bytes) from HC registers */
 440
 441static int
 442ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
 443{
 444        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
 445        int             i, changed = 0, length = 1;
 446        int             any_connected = 0;
 447        int             rhsc_status;
 448        unsigned long   flags;
 449
 450        spin_lock_irqsave (&ohci->lock, flags);
 451        if (!HCD_HW_ACCESSIBLE(hcd))
 452                goto done;
 453
 454        /* undocumented erratum seen on at least rev D */
 455        if ((ohci->flags & OHCI_QUIRK_AMD756)
 456                        && (roothub_a (ohci) & RH_A_NDP) > MAX_ROOT_PORTS) {
 457                ohci_warn (ohci, "bogus NDP, rereads as NDP=%d\n",
 458                          ohci_readl (ohci, &ohci->regs->roothub.a) & RH_A_NDP);
 459                /* retry later; "should not happen" */
 460                goto done;
 461        }
 462
 463        /* init status */
 464        if (roothub_status (ohci) & (RH_HS_LPSC | RH_HS_OCIC))
 465                buf [0] = changed = 1;
 466        else
 467                buf [0] = 0;
 468        if (ohci->num_ports > 7) {
 469                buf [1] = 0;
 470                length++;
 471        }
 472
 473        /* Clear the RHSC status flag before reading the port statuses */
 474        ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrstatus);
 475        rhsc_status = ohci_readl(ohci, &ohci->regs->intrstatus) &
 476                        OHCI_INTR_RHSC;
 477
 478        /* look at each port */
 479        for (i = 0; i < ohci->num_ports; i++) {
 480                u32     status = roothub_portstatus (ohci, i);
 481
 482                /* can't autostop if ports are connected */
 483                any_connected |= (status & RH_PS_CCS);
 484
 485                if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
 486                                | RH_PS_OCIC | RH_PS_PRSC)) {
 487                        changed = 1;
 488                        if (i < 7)
 489                            buf [0] |= 1 << (i + 1);
 490                        else
 491                            buf [1] |= 1 << (i - 7);
 492                }
 493        }
 494
 495        if (ohci_root_hub_state_changes(ohci, changed,
 496                        any_connected, rhsc_status))
 497                set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
 498        else
 499                clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
 500
 501
 502done:
 503        spin_unlock_irqrestore (&ohci->lock, flags);
 504
 505        return changed ? length : 0;
 506}
 507
 508/*-------------------------------------------------------------------------*/
 509
 510static void
 511ohci_hub_descriptor (
 512        struct ohci_hcd                 *ohci,
 513        struct usb_hub_descriptor       *desc
 514) {
 515        u32             rh = roothub_a (ohci);
 516        u16             temp;
 517
 518        desc->bDescriptorType = 0x29;
 519        desc->bPwrOn2PwrGood = (rh & RH_A_POTPGT) >> 24;
 520        desc->bHubContrCurrent = 0;
 521
 522        desc->bNbrPorts = ohci->num_ports;
 523        temp = 1 + (ohci->num_ports / 8);
 524        desc->bDescLength = 7 + 2 * temp;
 525
 526        temp = 0;
 527        if (rh & RH_A_NPS)              /* no power switching? */
 528            temp |= 0x0002;
 529        if (rh & RH_A_PSM)              /* per-port power switching? */
 530            temp |= 0x0001;
 531        if (rh & RH_A_NOCP)             /* no overcurrent reporting? */
 532            temp |= 0x0010;
 533        else if (rh & RH_A_OCPM)        /* per-port overcurrent reporting? */
 534            temp |= 0x0008;
 535        desc->wHubCharacteristics = cpu_to_le16(temp);
 536
 537        /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
 538        rh = roothub_b (ohci);
 539        memset(desc->u.hs.DeviceRemovable, 0xff,
 540                        sizeof(desc->u.hs.DeviceRemovable));
 541        desc->u.hs.DeviceRemovable[0] = rh & RH_B_DR;
 542        if (ohci->num_ports > 7) {
 543                desc->u.hs.DeviceRemovable[1] = (rh & RH_B_DR) >> 8;
 544                desc->u.hs.DeviceRemovable[2] = 0xff;
 545        } else
 546                desc->u.hs.DeviceRemovable[1] = 0xff;
 547}
 548
 549/*-------------------------------------------------------------------------*/
 550
 551#ifdef  CONFIG_USB_OTG
 552
 553static int ohci_start_port_reset (struct usb_hcd *hcd, unsigned port)
 554{
 555        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
 556        u32                     status;
 557
 558        if (!port)
 559                return -EINVAL;
 560        port--;
 561
 562        /* start port reset before HNP protocol times out */
 563        status = ohci_readl(ohci, &ohci->regs->roothub.portstatus [port]);
 564        if (!(status & RH_PS_CCS))
 565                return -ENODEV;
 566
 567        /* khubd will finish the reset later */
 568        ohci_writel(ohci, RH_PS_PRS, &ohci->regs->roothub.portstatus [port]);
 569        return 0;
 570}
 571
 572#else
 573
 574#define ohci_start_port_reset           NULL
 575
 576#endif
 577
 578/*-------------------------------------------------------------------------*/
 579
 580
 581/* See usb 7.1.7.5:  root hubs must issue at least 50 msec reset signaling,
 582 * not necessarily continuous ... to guard against resume signaling.
 583 */
 584#define PORT_RESET_MSEC         50
 585
 586/* this timer value might be vendor-specific ... */
 587#define PORT_RESET_HW_MSEC      10
 588
 589/* wrap-aware logic morphed from <linux/jiffies.h> */
 590#define tick_before(t1,t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
 591
 592/* called from some task, normally khubd */
 593static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
 594{
 595        __hc32 __iomem *portstat = &ohci->regs->roothub.portstatus [port];
 596        u32     temp = 0;
 597        u16     now = ohci_readl(ohci, &ohci->regs->fmnumber);
 598        u16     reset_done = now + PORT_RESET_MSEC;
 599        int     limit_1 = DIV_ROUND_UP(PORT_RESET_MSEC, PORT_RESET_HW_MSEC);
 600
 601        /* build a "continuous enough" reset signal, with up to
 602         * 3msec gap between pulses.  scheduler HZ==100 must work;
 603         * this might need to be deadline-scheduled.
 604         */
 605        do {
 606                int limit_2;
 607
 608                /* spin until any current reset finishes */
 609                limit_2 = PORT_RESET_HW_MSEC * 2;
 610                while (--limit_2 >= 0) {
 611                        temp = ohci_readl (ohci, portstat);
 612                        /* handle e.g. CardBus eject */
 613                        if (temp == ~(u32)0)
 614                                return -ESHUTDOWN;
 615                        if (!(temp & RH_PS_PRS))
 616                                break;
 617                        udelay (500);
 618                }
 619
 620                /* timeout (a hardware error) has been observed when
 621                 * EHCI sets CF while this driver is resetting a port;
 622                 * presumably other disconnect paths might do it too.
 623                 */
 624                if (limit_2 < 0) {
 625                        ohci_dbg(ohci,
 626                                "port[%d] reset timeout, stat %08x\n",
 627                                port, temp);
 628                        break;
 629                }
 630
 631                if (!(temp & RH_PS_CCS))
 632                        break;
 633                if (temp & RH_PS_PRSC)
 634                        ohci_writel (ohci, RH_PS_PRSC, portstat);
 635
 636                /* start the next reset, sleep till it's probably done */
 637                ohci_writel (ohci, RH_PS_PRS, portstat);
 638                msleep(PORT_RESET_HW_MSEC);
 639                now = ohci_readl(ohci, &ohci->regs->fmnumber);
 640        } while (tick_before(now, reset_done) && --limit_1 >= 0);
 641
 642        /* caller synchronizes using PRSC ... and handles PRS
 643         * still being set when this returns.
 644         */
 645
 646        return 0;
 647}
 648
 649static int ohci_hub_control (
 650        struct usb_hcd  *hcd,
 651        u16             typeReq,
 652        u16             wValue,
 653        u16             wIndex,
 654        char            *buf,
 655        u16             wLength
 656) {
 657        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
 658        int             ports = ohci->num_ports;
 659        u32             temp;
 660        int             retval = 0;
 661
 662        if (unlikely(!HCD_HW_ACCESSIBLE(hcd)))
 663                return -ESHUTDOWN;
 664
 665        switch (typeReq) {
 666        case ClearHubFeature:
 667                switch (wValue) {
 668                case C_HUB_OVER_CURRENT:
 669                        ohci_writel (ohci, RH_HS_OCIC,
 670                                        &ohci->regs->roothub.status);
 671                case C_HUB_LOCAL_POWER:
 672                        break;
 673                default:
 674                        goto error;
 675                }
 676                break;
 677        case ClearPortFeature:
 678                if (!wIndex || wIndex > ports)
 679                        goto error;
 680                wIndex--;
 681
 682                switch (wValue) {
 683                case USB_PORT_FEAT_ENABLE:
 684                        temp = RH_PS_CCS;
 685                        break;
 686                case USB_PORT_FEAT_C_ENABLE:
 687                        temp = RH_PS_PESC;
 688                        break;
 689                case USB_PORT_FEAT_SUSPEND:
 690                        temp = RH_PS_POCI;
 691                        break;
 692                case USB_PORT_FEAT_C_SUSPEND:
 693                        temp = RH_PS_PSSC;
 694                        break;
 695                case USB_PORT_FEAT_POWER:
 696                        temp = RH_PS_LSDA;
 697                        break;
 698                case USB_PORT_FEAT_C_CONNECTION:
 699                        temp = RH_PS_CSC;
 700                        break;
 701                case USB_PORT_FEAT_C_OVER_CURRENT:
 702                        temp = RH_PS_OCIC;
 703                        break;
 704                case USB_PORT_FEAT_C_RESET:
 705                        temp = RH_PS_PRSC;
 706                        break;
 707                default:
 708                        goto error;
 709                }
 710                ohci_writel (ohci, temp,
 711                                &ohci->regs->roothub.portstatus [wIndex]);
 712                // ohci_readl (ohci, &ohci->regs->roothub.portstatus [wIndex]);
 713                break;
 714        case GetHubDescriptor:
 715                ohci_hub_descriptor (ohci, (struct usb_hub_descriptor *) buf);
 716                break;
 717        case GetHubStatus:
 718                temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE);
 719                put_unaligned_le32(temp, buf);
 720                break;
 721        case GetPortStatus:
 722                if (!wIndex || wIndex > ports)
 723                        goto error;
 724                wIndex--;
 725                temp = roothub_portstatus (ohci, wIndex);
 726                put_unaligned_le32(temp, buf);
 727
 728#ifndef OHCI_VERBOSE_DEBUG
 729        if (*(u16*)(buf+2))     /* only if wPortChange is interesting */
 730#endif
 731                dbg_port (ohci, "GetStatus", wIndex, temp);
 732                break;
 733        case SetHubFeature:
 734                switch (wValue) {
 735                case C_HUB_OVER_CURRENT:
 736                        // FIXME:  this can be cleared, yes?
 737                case C_HUB_LOCAL_POWER:
 738                        break;
 739                default:
 740                        goto error;
 741                }
 742                break;
 743        case SetPortFeature:
 744                if (!wIndex || wIndex > ports)
 745                        goto error;
 746                wIndex--;
 747                switch (wValue) {
 748                case USB_PORT_FEAT_SUSPEND:
 749#ifdef  CONFIG_USB_OTG
 750                        if (hcd->self.otg_port == (wIndex + 1)
 751                                        && hcd->self.b_hnp_enable)
 752                                ohci->start_hnp(ohci);
 753                        else
 754#endif
 755                        ohci_writel (ohci, RH_PS_PSS,
 756                                &ohci->regs->roothub.portstatus [wIndex]);
 757                        break;
 758                case USB_PORT_FEAT_POWER:
 759                        ohci_writel (ohci, RH_PS_PPS,
 760                                &ohci->regs->roothub.portstatus [wIndex]);
 761                        break;
 762                case USB_PORT_FEAT_RESET:
 763                        retval = root_port_reset (ohci, wIndex);
 764                        break;
 765                default:
 766                        goto error;
 767                }
 768                break;
 769
 770        default:
 771error:
 772                /* "protocol stall" on error */
 773                retval = -EPIPE;
 774        }
 775        return retval;
 776}
 777
 778