Ticket #7449: ehci.3.patch

File ehci.3.patch, 2.6 KB (added by gabriel.hartmann, 8 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;
     387    uint32 asyncParkCapable = ReadCapReg32(EHCI_HCCPARAMS)
     388        & EHCI_HCCPARAMS_ASPM_MASK;
     389
     390    uint32 opRegInput = ReadOpReg(EHCI_USBCMD);
     391
     392    // frameListSizes defined by values between 00b and 10b. 11b is Reserved
     393    if (frameListSize > 2) {
     394        TRACE("host controller didn't start: invalid frame list size\n");
     395        return B_ERROR;
     396    }
     397
     398    opRegInput = opRegInput | EHCI_USBCMD_RUNSTOP
     399            | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE
     400            | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
     401            | (1 << EHCI_USBCMD_ITC_SHIFT);
     402
     403    if (asyncParkCapable) {
     404        opRegInput = opRegInput | EHCI_USBCMD_ASPME
     405            | (0x03 << EHCI_USBCMD_ASPMC_SHIFT);
     406        opRegInput = opRegInput & EHCI_USBCMD_ASPMC_MASK;
     407    }
     408
     409    opRegInput = opRegInput & EHCI_USBCMD_ITC_MASK;
     410    WriteOpReg(EHCI_USBCMD, opRegInput);
     411
    390412    for (int32 i = 0; i < 10; i++) {
    391413        uint32 status = ReadOpReg(EHCI_USBSTS);
     414
    392415        TRACE("try %ld: status 0x%08lx\n", i, status);
    393 
    394416        if (status & EHCI_USBSTS_HCHALTED) {
    395417            snooze(10000);
    396418        } else {
     
    399421        }
    400422    }
    401423
     424
    402425    if (!running) {
    403426        TRACE("host controller didn't start\n");
    404427        return B_ERROR;
    405428    }
    406429
     430
    407431    // route all ports to us
    408432    WriteOpReg(EHCI_CONFIGFLAG, EHCI_CONFIGFLAG_FLAG);
    409433    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