VirtualBox

Changeset 7065 in vbox


Ignore:
Timestamp:
Feb 20, 2008 9:50:40 PM (17 years ago)
Author:
vboxsync
Message:

pcnet: implemented the software timer interrupt (fixes nexenta and probably *BSD guests)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevPCNet.cpp

    r7044 r7065  
    9797#define PCNET_PNPMMIO_SIZE              0x20
    9898
    99 #define PCNET_SAVEDSTATE_VERSION        7
     99#define PCNET_SAVEDSTATE_VERSION        8
    100100
    101101#define BCR_MAX_RAP                     50
     
    131131    GCPTRTYPE(PTMTIMER)                 pTimerPollGC;
    132132#endif
     133    /** Software Interrupt timer (address for host context) */
     134    R3R0PTRTYPE(PTMTIMER)               pTimerSoftIntHC;
     135    /** Software Interrupt timer (address for guest context) */
     136    GCPTRTYPE(PTMTIMER)                 pTimerSoftIntGC;
    133137    /** Register Address Pointer */
    134138    uint32_t                            u32RAP;
     
    348352#define CSR_STRT(S)      !!((S)->aCSR[0] & 0x0002)  /**< Start assertion */
    349353#define CSR_STOP(S)      !!((S)->aCSR[0] & 0x0004)  /**< Stop assertion */
    350 #define CSR_TDMD(S)      !!((S)->aCSR[0] & 0x0008)  /**< Transmit demand. (perform xmit poll now
    351                                                          (readable, settable, not clearable) */
     354#define CSR_TDMD(S)      !!((S)->aCSR[0] & 0x0008)  /**< Transmit demand. (perform xmit poll now (readable, settable, not clearable) */
    352355#define CSR_TXON(S)      !!((S)->aCSR[0] & 0x0010)  /**< Transmit on (readonly) */
    353356#define CSR_RXON(S)      !!((S)->aCSR[0] & 0x0020)  /**< Receive On */
    354357#define CSR_INEA(S)      !!((S)->aCSR[0] & 0x0040)  /**< Interrupt Enable */
    355358#define CSR_LAPPEN(S)    !!((S)->aCSR[3] & 0x0020)  /**< Look Ahead Packet Processing Enable */
    356 #define CSR_DXSUFLO(S)   !!((S)->aCSR[3] & 0x0040)  /**< Disable Transmit Stop on
    357                                                            Underflow error */
     359#define CSR_DXSUFLO(S)   !!((S)->aCSR[3] & 0x0040)  /**< Disable Transmit Stop on Underflow error */
    358360#define CSR_ASTRP_RCV(S) !!((S)->aCSR[4] & 0x0400)  /**< Auto Strip Receive */
    359361#define CSR_DPOLL(S)     !!((S)->aCSR[4] & 0x1000)  /**< Disable Transmit Polling */
     
    361363#define CSR_LTINTEN(S)   !!((S)->aCSR[5] & 0x4000)  /**< Last Transmit Interrupt Enable */
    362364#define CSR_TOKINTD(S)   !!((S)->aCSR[5] & 0x8000)  /**< Transmit OK Interrupt Disable */
     365
     366#define CSR_STINT        !!((S)->aCSR[7] & 0x0800)  /**< Software Timer Interrupt */
     367#define CSR_STINTE       !!((S)->aCSR[7] & 0x0400)  /**< Software Timer Interrupt Enable */
     368
    363369#define CSR_DRX(S)       !!((S)->aCSR[15] & 0x0001) /**< Disable Receiver */
    364370#define CSR_DTX(S)       !!((S)->aCSR[15] & 0x0002) /**< Disable Transmit */
     
    12381244    }
    12391245
     1246    if ((pData->aCSR[7] & 0x0C00) == 0x0C00)
     1247        iISR = 1;
     1248
    12401249    pData->aCSR[0] = csr0;
    12411250
     
    24252434                    pcnetTransmit(pData);
    24262435
     2436                return rc;
     2437            }
     2438        case 7:
     2439            {
     2440                uint16_t csr7 = pData->aCSR[7];
     2441                csr7 &=        ~0x0400 ;
     2442                csr7 &= ~(val & 0x0800);
     2443                csr7 |=  (val & 0x0400);
     2444                pData->aCSR[7] = csr7;
    24272445                return rc;
    24282446            }
     
    26262644    }
    26272645#ifdef PCNET_DEBUG_CSR
    2628     Log(("#%d pcnetCSRReadU16: u32RAP=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
     2646    Log(("#%d pcnetCSRReadU16: rap=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
    26292647         u32RAP, val));
    26302648#endif
     
    26372655    u32RAP &= 0x7f;
    26382656#ifdef PCNET_DEBUG_BCR
    2639     Log2(("#%d pcnetBCRWriteU16: u32RAP=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
     2657    Log2(("#%d pcnetBCRWriteU16: rap=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
    26402658         u32RAP, val));
    26412659#endif
     
    26892707            break;
    26902708
     2709        case BCR_STVAL:
     2710            val &= 0xffff;
     2711            pData->aBCR[BCR_STVAL] = val;
     2712            if (pData->fAm79C973)
     2713                TMTimerSet(pData->CTXSUFF(pTimerSoftInt), (uint64_t)12800 * val);
     2714            break;
     2715
    26912716        case BCR_MIIMDR:
    26922717            LOG_REGISTER(("PCNet#%d: WRITE MII%d, %#06x\n",
    26932718                         PCNETSTATE_2_DEVINS(pData)->iInstance, u32RAP, val));
    26942719            pData->aMII[pData->aBCR[BCR_MIIADDR] & 0x1f] = val;
     2720#ifdef PCNET_DEBUG_MII
     2721            Log(("#%d pcnet: mii write %d <- %#x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
     2722                   pData->aBCR[BCR_MIIADDR] & 0x1f, val));
     2723#endif
    26952724            break;
    26962725
     
    27072736    STAM_COUNTER_INC(&pData->StatMIIReads);
    27082737
    2709     autoneg = (pData->aBCR[BCR_MIICAS] & 0x20) != 0;
     2738    autoneg = (pData->aBCR[BCR_MIICAS] & 0x20) != 0 /*|| (pData->aMII[0] & 0x1000)*/;
    27102739    duplex  = (pData->aBCR[BCR_MIICAS] & 0x10) != 0;
    27112740    fast    = (pData->aBCR[BCR_MIICAS] & 0x08) != 0;
     
    27212750                val |= 0x2000;  /* 100 Mbps */
    27222751            if (duplex) /* Full duplex forced */
    2723                 val |= 0x0010;  /* Full duplex */
     2752                val |= 0x0100;  /* Full duplex */
    27242753            break;
    27252754
     
    28522881    }
    28532882#ifdef PCNET_DEBUG_BCR
    2854     Log2(("#%d pcnetBCRReadU16: u32RAP=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
     2883    Log2(("#%d pcnetBCRReadU16: rap=%d val=%#06x\n", PCNETSTATE_2_DEVINS(pData)->iInstance,
    28552884         u32RAP, val));
    28562885#endif
     
    28862915    pData->aBCR[BCR_BSBC ] = 0x9001;
    28872916    pData->aBCR[BCR_EECAS] = 0x0002;
     2917    pData->aBCR[BCR_STVAL] = 0xffff;
    28882918    pData->aCSR[58       ] = /* CSR58 is an alias for BCR20 */
    28892919    pData->aBCR[BCR_SWS  ] = 0x0200;
     
    34573487    PDMCritSectLeave(&pData->CritSect);
    34583488    STAM_PROFILE_ADV_STOP(&pData->StatTimer, a);
     3489}
     3490
     3491/**
     3492 * Software interrupt timer callback function.
     3493 *
     3494 * @param   pDevIns         Device instance of the device which registered the timer.
     3495 * @param   pTimer          The timer handle.
     3496 * @thread  EMT
     3497 */
     3498static DECLCALLBACK(void) pcnetTimerSoftInt(PPDMDEVINS pDevIns, PTMTIMER pTimer)
     3499{
     3500    PCNetState *pData = PDMINS2DATA(pDevIns, PCNetState *);
     3501
     3502    pData->aCSR[7] |= 0x0800;
     3503    pcnetUpdateIrq(pData);
     3504    TMTimerSet(pData->CTXSUFF(pTimerSoftInt), (uint64_t)12800 * (pData->aBCR[BCR_STVAL] & 0xffff));
    34593505}
    34603506
     
    38513897{
    38523898    PCNetState *pData = PDMINS2DATA(pDevIns, PCNetState *);
     3899    int rc = VINF_SUCCESS;
    38533900
    38543901    SSMR3PutBool(pSSMHandle, pData->fLinkUp);
     
    38703917    return VINF_SUCCESS;
    38713918#else
    3872     return TMR3TimerSave(pData->CTXSUFF(pTimerPoll), pSSMHandle);
    3873 #endif
     3919    rc = TMR3TimerSave(pData->CTXSUFF(pTimerPoll), pSSMHandle);
     3920    if (VBOX_FAILURE(rc))
     3921        return rc;
     3922#endif
     3923    if (pData->fAm79C973)
     3924        rc = TMR3TimerSave(pData->CTXSUFF(pTimerSoftInt), pSSMHandle);
     3925    return rc;
    38743926}
    38753927
     
    39053957    PCNetState *pData = PDMINS2DATA(pDevIns, PCNetState *);
    39063958    PDMMAC      Mac;
    3907     if (u32Version != PCNET_SAVEDSTATE_VERSION)
     3959    if (SSM_VERSION_MAJOR_CHANGED(u32Version, PCNET_SAVEDSTATE_VERSION))
    39083960        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    39093961
     
    39293981    TMR3TimerLoad(pData->CTXSUFF(pTimerPoll), pSSMHandle);
    39303982#endif
     3983    if (pData->fAm79C973)
     3984    {
     3985        if (   SSM_VERSION_MAJOR(u32Version) >  0
     3986            || SSM_VERSION_MINOR(u32Version) >= 8)
     3987            TMR3TimerLoad(pData->CTXSUFF(pTimerSoftInt), pSSMHandle);
     3988    }
    39313989
    39323990    pData->iLog2DescSize = BCR_SWSTYLE(pData)
     
    41844242    pData->pTimerPollGC  = TMTimerGCPtr(pData->pTimerPollHC);
    41854243#endif
     4244    pData->pTimerSoftIntGC = TMTimerGCPtr(pData->pTimerSoftIntHC);
    41864245}
    41874246
     
    43824441    if (VBOX_FAILURE(rc))
    43834442    {
    4384         AssertMsgFailed(("pfnTMTimerCreate -> %Vrc\n", rc));
     4443        AssertMsgFailed(("pfnTMTimerCreate pcnetTimer -> %Vrc\n", rc));
    43854444        return rc;
    43864445    }
    43874446#endif
     4447    if (pData->fAm79C973)
     4448    {
     4449        /* Software Interrupt timer */
     4450        rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, pcnetTimerSoftInt,
     4451                                   "PCNet SoftInt Timer", &pData->pTimerSoftIntHC);
     4452        if (VBOX_FAILURE(rc))
     4453        {
     4454            AssertMsgFailed(("pfnTMTimerCreate pcnetTimerSoftInt -> %Vrc\n", rc));
     4455            return rc;
     4456        }
     4457    }
    43884458    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, pcnetTimerRestore,
    43894459                                "PCNet Restore Timer", &pData->pTimerRestore);
    43904460    if (VBOX_FAILURE(rc))
    43914461    {
    4392         AssertMsgFailed(("pfnTMTimerCreate -> %Vrc\n", rc));
     4462        AssertMsgFailed(("pfnTMTimerCreate pcnetTimerRestore -> %Vrc\n", rc));
    43934463        return rc;
    43944464    }
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