VirtualBox

Changeset 69947 in vbox


Ignore:
Timestamp:
Dec 6, 2017 9:49:46 AM (7 years ago)
Author:
vboxsync
Message:

OHCI: Reduced the number of port status bit definition sets from 3 to 1.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/DevOHCI.cpp

    r69944 r69947  
    683683/** CCS - CurrentConnectionStatus - 0 = no device, 1 = device. */
    684684#define OHCI_PORT_CCS       RT_BIT(0)
     685/** ClearPortEnable (when writing CCS). */
     686#define OHCI_PORT_CLRPE     OHCI_PORT_CCS
    685687/** PES - PortEnableStatus. */
    686688#define OHCI_PORT_PES       RT_BIT(1)
     
    689691/** POCI- PortOverCurrentIndicator. */
    690692#define OHCI_PORT_POCI      RT_BIT(3)
     693/** ClearSuspendStatus (when writing POCI). */
     694#define OHCI_PORT_CLRSS     OHCI_PORT_POCI
    691695/** PRS - PortResetStatus */
    692696#define OHCI_PORT_PRS       RT_BIT(4)
     
    695699/** LSDA - LowSpeedDeviceAttached */
    696700#define OHCI_PORT_LSDA      RT_BIT(9)
     701/** ClearPortPower (when writing LSDA). */
     702#define OHCI_PORT_CLRPP     OHCI_PORT_LSDA
    697703/** CSC  - ConnectStatusChange */
    698704#define OHCI_PORT_CSC       RT_BIT(16)
     
    705711/** PRSC - PortResetStatusChange */
    706712#define OHCI_PORT_PRSC      RT_BIT(20)
    707 /** @} */
    708 
    709 
    710 /** @name HcRhPortStatus[n] - Root Hub Port Status Registers - read.
    711  * @{ */
    712 /** CCS - CurrentConnectStatus - 0 = no device, 1 = device. */
    713 #define OHCI_PORT_R_CURRENT_CONNECT_STATUS      RT_BIT(0)
    714 /** PES - PortEnableStatus. */
    715 #define OHCI_PORT_R_ENABLE_STATUS               RT_BIT(1)
    716 /** PSS - PortSuspendStatus */
    717 #define OHCI_PORT_R_SUSPEND_STATUS              RT_BIT(2)
    718 /** POCI- PortOverCurrentIndicator. */
    719 #define OHCI_PORT_R_OVER_CURRENT_INDICATOR      RT_BIT(3)
    720 /** PRS - PortResetStatus */
    721 #define OHCI_PORT_R_RESET_STATUS                RT_BIT(4)
    722 /** PPS - PortPowerStatus */
    723 #define OHCI_PORT_R_POWER_STATUS                RT_BIT(8)
    724 /** LSDA - LowSpeedDeviceAttached */
    725 #define OHCI_PORT_R_LOW_SPEED_DEVICE_ATTACHED   RT_BIT(9)
    726 /** CSC  - ConnectStatusChange */
    727 #define OHCI_PORT_R_CONNECT_STATUS_CHANGE       RT_BIT(16)
    728 /** PESC - PortEnableStatusChange */
    729 #define OHCI_PORT_R_ENABLE_STATUS_CHANGE        RT_BIT(17)
    730 /** PSSC - PortSuspendStatusChange */
    731 #define OHCI_PORT_R_SUSPEND_STATUS_CHANGE       RT_BIT(18)
    732 /** OCIC - OverCurrentIndicatorChange */
    733 #define OHCI_PORT_R_OVER_CURRENT_INDICATOR_CHANGE   RT_BIT(19)
    734 /** PRSC - PortResetStatusChange */
    735 #define OHCI_PORT_R_RESET_STATUS_CHANGE         RT_BIT(20)
    736 /** @} */
    737 
    738 /** @name HcRhPortStatus[n] - Root Hub Port Status Registers - write.
    739  * @{ */
    740 /** CCS - ClearPortEnable. */
    741 #define OHCI_PORT_W_CLEAR_ENABLE                RT_BIT(0)
    742 /** PES - SetPortEnable. */
    743 #define OHCI_PORT_W_SET_ENABLE                  RT_BIT(1)
    744 /** PSS - SetPortSuspend */
    745 #define OHCI_PORT_W_SET_SUSPEND                 RT_BIT(2)
    746 /** POCI- ClearSuspendStatus. */
    747 #define OHCI_PORT_W_CLEAR_SUSPEND_STATUS        RT_BIT(3)
    748 /** PRS - SetPortReset */
    749 #define OHCI_PORT_W_SET_RESET                   RT_BIT(4)
    750 /** PPS - SetPortPower */
    751 #define OHCI_PORT_W_SET_POWER                   RT_BIT(8)
    752 /** LSDA - ClearPortPower */
    753 #define OHCI_PORT_W_CLEAR_POWER                 RT_BIT(9)
    754 /** CSC  - ClearConnectStatusChange */
    755 #define OHCI_PORT_W_CLEAR_CSC                   RT_BIT(16)
    756 /** PESC - PortEnableStatusChange */
    757 #define OHCI_PORT_W_CLEAR_PESC                  RT_BIT(17)
    758 /** PSSC - PortSuspendStatusChange */
    759 #define OHCI_PORT_W_CLEAR_PSSC                  RT_BIT(18)
    760 /** OCIC - OverCurrentIndicatorChange */
    761 #define OHCI_PORT_W_CLEAR_OCIC                  RT_BIT(19)
    762 /** PRSC - PortResetStatusChange */
    763 #define OHCI_PORT_W_CLEAR_PRSC                  RT_BIT(20)
    764 /** The mask of bit which are used to clear themselves. */
    765 #define OHCI_PORT_W_CLEAR_CHANGE_MASK           (  OHCI_PORT_W_CLEAR_CSC  | OHCI_PORT_W_CLEAR_PESC | OHCI_PORT_W_CLEAR_PSSC \
    766                                                  | OHCI_PORT_W_CLEAR_OCIC | OHCI_PORT_W_CLEAR_PRSC)
     713/** The mask of RW1C bits. */
     714#define OHCI_PORT_CLEAR_CHANGE_MASK     (OHCI_PORT_CSC | OHCI_PORT_PESC | OHCI_PORT_PSSC | OHCI_PORT_OCIC | OHCI_PORT_PRSC)
    767715/** @} */
    768716
     
    1046994     * Attach it.
    1047995     */
    1048     pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_R_CURRENT_CONNECT_STATUS | OHCI_PORT_R_CONNECT_STATUS_CHANGE;
     996    pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_CCS | OHCI_PORT_CSC;
    1049997    pThis->RootHub.aPorts[uPort].pDev = pDev;
    1050998    ohciR3RhPortPower(&pThis->RootHub, uPort, 1 /* power on */);
     
    10841032    pThis->RootHub.aPorts[uPort].pDev = NULL;
    10851033    if (pThis->RootHub.aPorts[uPort].fReg & OHCI_PORT_PES)
    1086         pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_R_CONNECT_STATUS_CHANGE | OHCI_PORT_PESC;
     1034        pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_CSC | OHCI_PORT_PESC;
    10871035    else
    1088         pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_R_CONNECT_STATUS_CHANGE;
     1036        pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_CSC;
    10891037
    10901038    ohciR3RemoteWakeup(pThis);
     
    11511099        if (pThis->RootHub.aPorts[iPort].pDev)
    11521100        {
    1153             pThis->RootHub.aPorts[iPort].fReg = OHCI_PORT_R_CURRENT_CONNECT_STATUS | OHCI_PORT_R_CONNECT_STATUS_CHANGE | OHCI_PORT_PPS;
     1101            pThis->RootHub.aPorts[iPort].fReg = OHCI_PORT_CCS | OHCI_PORT_CSC | OHCI_PORT_PPS;
    11541102            if (fResetOnLinux)
    11551103            {
     
    42584206        /* power up */
    42594207        if (pPort->pDev)
    4260             pPort->fReg |= OHCI_PORT_R_CURRENT_CONNECT_STATUS;
    4261         if (pPort->fReg & OHCI_PORT_R_CURRENT_CONNECT_STATUS)
    4262             pPort->fReg |= OHCI_PORT_R_POWER_STATUS;
     4208            pPort->fReg |= OHCI_PORT_CCS;
     4209        if (pPort->fReg & OHCI_PORT_CCS)
     4210            pPort->fReg |= OHCI_PORT_PPS;
    42634211        if (pPort->pDev && !fOldPPS)
    42644212            VUSBIDevPowerOn(pPort->pDev);
     
    42674215    {
    42684216        /* power down */
    4269         pPort->fReg &= ~(  OHCI_PORT_R_POWER_STATUS
    4270                          | OHCI_PORT_R_CURRENT_CONNECT_STATUS
    4271                          | OHCI_PORT_R_SUSPEND_STATUS
    4272                          | OHCI_PORT_R_RESET_STATUS);
     4217        pPort->fReg &= ~(OHCI_PORT_PPS | OHCI_PORT_CCS | OHCI_PORT_PSS | OHCI_PORT_PRS);
    42734218        if (pPort->pDev && fOldPPS)
    42744219            VUSBIDevPowerOff(pPort->pDev);
     
    50765021{
    50775022    const unsigned i = iReg - 21;
    5078     uint32_t val = pThis->RootHub.aPorts[i].fReg | OHCI_PORT_R_POWER_STATUS; /* PortPowerStatus: see todo on power in _w function. */
    5079     if (val & OHCI_PORT_R_RESET_STATUS)
     5023    uint32_t val = pThis->RootHub.aPorts[i].fReg | OHCI_PORT_PPS; /* PortPowerStatus: see todo on power in _w function. */
     5024    if (val & OHCI_PORT_PRS)
    50805025    {
    50815026#ifdef IN_RING3
     
    50865031#endif
    50875032    }
    5088     if (val & (OHCI_PORT_R_RESET_STATUS | OHCI_PORT_CSC | OHCI_PORT_PESC | OHCI_PORT_PSSC | OHCI_PORT_OCIC | OHCI_PORT_PRSC))
     5033    if (val & (OHCI_PORT_PRS | OHCI_PORT_CLEAR_CHANGE_MASK))
    50895034        Log2(("HcRhPortStatus_r(): port %u: -> %#010x - CCS=%d PES=%d PSS=%d POCI=%d RRS=%d PPS=%d LSDA=%d CSC=%d PESC=%d PSSC=%d OCIC=%d PRSC=%d\n",
    50905035              i, val, val & 1, (val >> 1) & 1, (val >> 2) & 1, (val >> 3) & 1, (val >> 4) & 1, (val >> 8) & 1, (val >> 9) & 1,
     
    51265071         */
    51275072        Log2(("ohciR3PortResetDone: Reset completed.\n"));
    5128         pPort->fReg &= ~(OHCI_PORT_R_RESET_STATUS | OHCI_PORT_R_SUSPEND_STATUS | OHCI_PORT_R_SUSPEND_STATUS_CHANGE);
    5129         pPort->fReg |= OHCI_PORT_R_ENABLE_STATUS | OHCI_PORT_R_RESET_STATUS_CHANGE;
     5073        pPort->fReg &= ~(OHCI_PORT_PRS | OHCI_PORT_PSS | OHCI_PORT_PSSC);
     5074        pPort->fReg |= OHCI_PORT_PES | OHCI_PORT_PRSC;
    51305075    }
    51315076    else
     
    51405085             */
    51415086            Log2(("ohciR3PortResetDone: The reset failed (rc=%Rrc)!!! Pretending reconnect at the speed of light.\n", rc));
    5142             pPort->fReg = OHCI_PORT_R_CURRENT_CONNECT_STATUS | OHCI_PORT_R_CONNECT_STATUS_CHANGE;
     5087            pPort->fReg = OHCI_PORT_CCS | OHCI_PORT_CSC;
    51435088        }
    51445089        else
     
    51485093             */
    51495094            Log2(("ohciR3PortResetDone: Disconnected (rc=%Rrc)!!!\n", rc));
    5150             pPort->fReg &= ~(OHCI_PORT_R_RESET_STATUS | OHCI_PORT_R_SUSPEND_STATUS | OHCI_PORT_R_SUSPEND_STATUS_CHANGE | OHCI_PORT_R_RESET_STATUS_CHANGE);
    5151             pPort->fReg |= OHCI_PORT_R_CONNECT_STATUS_CHANGE;
     5095            pPort->fReg &= ~(OHCI_PORT_PRS | OHCI_PORT_PSS | OHCI_PORT_PSSC | OHCI_PORT_PRSC);
     5096            pPort->fReg |= OHCI_PORT_CSC;
    51525097        }
    51535098    }
     
    51755120     * If CurrentConnectStatus is cleared we set ConnectStatusChange.
    51765121     */
    5177     if (!(pRh->aPorts[iPort].fReg & OHCI_PORT_R_CURRENT_CONNECT_STATUS))
    5178     {
    5179         pRh->aPorts[iPort].fReg |= OHCI_PORT_R_CONNECT_STATUS_CHANGE;
     5122    if (!(pRh->aPorts[iPort].fReg & OHCI_PORT_CCS))
     5123    {
     5124        pRh->aPorts[iPort].fReg |= OHCI_PORT_CSC;
    51805125        ohciR3SetInterrupt(pRh->pOhci, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
    51815126        return false;
     
    52245169
    52255170    /* Write to clear any of the change bits: CSC, PESC, PSSC, OCIC and PRSC */
    5226     if (val & OHCI_PORT_W_CLEAR_CHANGE_MASK)
    5227         p->fReg &= ~(val & OHCI_PORT_W_CLEAR_CHANGE_MASK);
    5228 
    5229     if (val & OHCI_PORT_W_CLEAR_ENABLE)
    5230     {
    5231         p->fReg &= ~OHCI_PORT_R_ENABLE_STATUS;
     5171    if (val & OHCI_PORT_CLEAR_CHANGE_MASK)
     5172        p->fReg &= ~(val & OHCI_PORT_CLEAR_CHANGE_MASK);
     5173
     5174    if (val & OHCI_PORT_CLRPE)
     5175    {
     5176        p->fReg &= ~OHCI_PORT_PES;
    52325177        Log2(("HcRhPortStatus_w(): port %u: DISABLE\n", i));
    52335178    }
    52345179
    5235     if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_W_SET_ENABLE))
     5180    if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_PES))
    52365181        Log2(("HcRhPortStatus_w(): port %u: ENABLE\n", i));
    52375182
    5238     if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_W_SET_SUSPEND))
     5183    if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_PSS))
    52395184        Log2(("HcRhPortStatus_w(): port %u: SUSPEND - not implemented correctly!!!\n", i));
    52405185
    5241     if (val & OHCI_PORT_W_SET_RESET)
    5242     {
    5243         if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_W_SET_RESET))
     5186    if (val & OHCI_PORT_PRS)
     5187    {
     5188        if (ohciR3RhPortSetIfConnected(&pThis->RootHub, i, val & OHCI_PORT_PRS))
    52445189        {
    52455190            PVM pVM = PDMDevHlpGetVM(pThis->CTX_SUFF(pDevIns));
    5246             p->fReg &= ~OHCI_PORT_R_RESET_STATUS_CHANGE;
     5191            p->fReg &= ~OHCI_PORT_PRSC;
    52475192            VUSBIDevReset(p->pDev, false /* don't reset on linux */, ohciR3PortResetDone, pThis, pVM);
    52485193        }
    5249         else if (p->fReg & OHCI_PORT_R_RESET_STATUS)
     5194        else if (p->fReg & OHCI_PORT_PRS)
    52505195        {
    52515196            /* the guest is getting impatient. */
     
    52615206         * sure it isn't gang powered
    52625207         */
    5263         if (val & OHCI_PORT_W_CLEAR_POWER)
     5208        if (val & OHCI_PORT_CLRPP)
    52645209            ohciR3RhPortPower(&pThis->RootHub, i, false /* power down */);
    5265         if (val & OHCI_PORT_W_SET_POWER)
     5210        if (val & OHCI_PORT_PPS)
    52665211            ohciR3RhPortPower(&pThis->RootHub, i, true /* power up */);
    52675212    }
    52685213
    52695214    /** @todo r=frank:  ClearSuspendStatus. Timing? */
    5270     if (val & OHCI_PORT_W_CLEAR_SUSPEND_STATUS)
     5215    if (val & OHCI_PORT_CLRSS)
    52715216    {
    52725217        ohciR3RhPortPower(&pThis->RootHub, i, true /* power up */);
    5273         pThis->RootHub.aPorts[i].fReg &= ~OHCI_PORT_R_SUSPEND_STATUS;
    5274         pThis->RootHub.aPorts[i].fReg |= OHCI_PORT_R_SUSPEND_STATUS_CHANGE;
     5218        pThis->RootHub.aPorts[i].fReg &= ~OHCI_PORT_PSS;
     5219        pThis->RootHub.aPorts[i].fReg |= OHCI_PORT_PSSC;
    52755220        ohciR3SetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
    52765221    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette