Ticket #7449: ehci.5.patch

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

     
    381381
    382382    uint32 frameListSize = (ReadOpReg(EHCI_USBCMD) >> EHCI_USBCMD_FLS_SHIFT)
    383383        & 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));
     384    // frameListSizes defined by values between 00b and 10b. 11b is Reserved
     385    if (frameListSize > 2) {
     386        TRACE_ERROR("unsupported frame list size (%lu)\n", frameListSize);
     387        return B_ERROR;
     388    }
    388389
     390    uint32 opRegInput = ReadOpReg(EHCI_USBCMD);
     391    opRegInput = opRegInput & ~(EHCI_USBCMD_ITC_MASK << EHCI_USBCMD_ITC_SHIFT);
     392    opRegInput = opRegInput | EHCI_USBCMD_RUNSTOP
     393            | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE
     394            | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
     395            | (1 << EHCI_USBCMD_ITC_SHIFT);
     396
     397    bool asyncParkCapable = (ReadCapReg32(EHCI_HCCPARAMS)
     398        & EHCI_HCCPARAMS_ASPM_MASK) != 0;
     399    if (asyncParkCapable) {
     400        opRegInput = opRegInput
     401            & ~(EHCI_USBCMD_ASPMC_MASK << EHCI_USBCMD_ASPMC_SHIFT);
     402        opRegInput = opRegInput | EHCI_USBCMD_ASPME
     403            | (0x03 << EHCI_USBCMD_ASPMC_SHIFT);
     404    }
     405
     406    WriteOpReg(EHCI_USBCMD, opRegInput);
     407
    389408    bool running = false;
    390409    for (int32 i = 0; i < 10; i++) {
    391410        uint32 status = ReadOpReg(EHCI_USBSTS);
     
    400419    }
    401420
    402421    if (!running) {
    403         TRACE("host controller didn't start\n");
     422        TRACE_ERROR("host controller didn't start\n");
    404423        return B_ERROR;
    405424    }
    406425
  • 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