Ticket #7449: ehci.patch

File ehci.patch, 2.8 KB (added by gabriel.hartmann, 13 years ago)
  • home/gabe/haiku/haiku/src/add-ons/kernel/busses/usb/ehci.cpp

     
    379379    TRACE("starting EHCI host controller\n");
    380380    TRACE("usbcmd: 0x%08lx; usbsts: 0x%08lx\n", ReadOpReg(EHCI_USBCMD), ReadOpReg(EHCI_USBSTS));
    381381
     382    bool running = false;
     383
    382384    uint32 frameListSize = (ReadOpReg(EHCI_USBCMD) >> EHCI_USBCMD_FLS_SHIFT)
    383385        & EHCI_USBCMD_FLS_MASK;
    384     WriteOpReg(EHCI_USBCMD, ReadOpReg(EHCI_USBCMD) | EHCI_USBCMD_RUNSTOP
    385         | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE
    386         | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
    387         | (1 << EHCI_USBCMD_ITC_SHIFT));
    388386
    389     bool running = false;
    390     for (int32 i = 0; i < 10; i++) {
    391         uint32 status = ReadOpReg(EHCI_USBSTS);
    392         TRACE("try %ld: status 0x%08lx\n", i, status);
     387    uint32 asyncParkCapable = ReadCapReg32(EHCI_HCCPARAMS)
     388        & EHCI_HCCPARAMS_ASPM_MASK;
    393389
    394         if (status & EHCI_USBSTS_HCHALTED) {
    395             snooze(10000);
     390    // frameListSizes defined by values between 00b and 10b. 11b is Reserved
     391    if (frameListSize < 3) {
     392        if (asyncParkCapable) {
     393            WriteOpReg(EHCI_USBCMD, ReadOpReg(EHCI_USBCMD) | EHCI_USBCMD_RUNSTOP
     394                | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE | EHCI_USBCMD_ASPME
     395                | (0x03 << EHCI_USBCMD_ASPMC_SHIFT)
     396                | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
     397                | (1 << EHCI_USBCMD_ITC_SHIFT));
    396398        } else {
    397             running = true;
    398             break;
     399            WriteOpReg(EHCI_USBCMD, ReadOpReg(EHCI_USBCMD) | EHCI_USBCMD_RUNSTOP
     400                | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE
     401                | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
     402                | (1 << EHCI_USBCMD_ITC_SHIFT));
    399403        }
     404
     405        for (int32 i = 0; i < 10; i++) {
     406            uint32 status = ReadOpReg(EHCI_USBSTS);
     407            TRACE("try %ld: status 0x%08lx\n", i, status);
     408
     409            if (status & EHCI_USBSTS_HCHALTED) {
     410                snooze(10000);
     411            } else {
     412                running = true;
     413                break;
     414            }
     415        }
    400416    }
    401417
    402418    if (!running) {
     
    404420        return B_ERROR;
    405421    }
    406422
     423
    407424    // route all ports to us
    408425    WriteOpReg(EHCI_CONFIGFLAG, EHCI_CONFIGFLAG_FLAG);
    409426    snooze(10000);
  • home/gabe/haiku/haiku/src/add-ons/kernel/busses/usb/ehci_hardware.h

     
    1414#define EHCI_HCIVERSION         0x02        // Interface Version Number
    1515#define EHCI_HCSPARAMS          0x04        // Structural Parameters
    1616#define EHCI_HCCPARAMS          0x08        // Capability Parameters
     17#define EHCI_HCCPARAMS_ASPM_MASK    0x04        // Asynchronous Schedule Park Mode
    1718#define EHCI_HCSP_PORTROUTE     0x0c        // Companion Port Route Description
    1819
    1920