Ticket #7449: ehci.2.patch

File ehci.2.patch, 2.8 KB (added by gabriel.hartmann, 13 years ago)

EHCI driver patch

  • 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);
    396         } else {
    397             running = true;
    398             break;
     390    uint32 opRegInput = ReadOpReg(EHCI_USBCMD);
     391
     392    // frameListSizes defined by values between 00b and 10b. 11b is Reserved
     393    if (frameListSize < 3) {
     394        opRegInput = opRegInput | EHCI_USBCMD_RUNSTOP
     395                | EHCI_USBCMD_ASENABLE | EHCI_USBCMD_PSENABLE
     396                | (frameListSize << EHCI_USBCMD_FLS_SHIFT)
     397                | (1 << EHCI_USBCMD_ITC_SHIFT);
     398
     399        if (asyncParkCapable) {
     400            opRegInput = opRegInput | EHCI_USBCMD_ASPME
     401                | (0x03 << EHCI_USBCMD_ASPMC_SHIFT);
     402            opRegInput = opRegInput & EHCI_USBCMD_ASPMC_MASK;
     403        }
     404
     405        opRegInput = opRegInput & EHCI_USBCMD_ITC_MASK;
     406        WriteOpReg(EHCI_USBCMD, opRegInput);
     407
     408        for (int32 i = 0; i < 10; i++) {
     409            uint32 status = ReadOpReg(EHCI_USBSTS);
     410            TRACE("try %ld: status 0x%08lx\n", i, status);
     411
     412            if (status & EHCI_USBSTS_HCHALTED) {
     413                snooze(10000);
     414            } else {
     415                running = true;
     416                break;
     417            }
    399418        }
    400419    }
    401420
     
    404423        return B_ERROR;
    405424    }
    406425
     426
    407427    // route all ports to us
    408428    WriteOpReg(EHCI_CONFIGFLAG, EHCI_CONFIGFLAG_FLAG);
    409429    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