VirtualBox

Changeset 7320 in vbox


Ignore:
Timestamp:
Mar 6, 2008 1:46:50 PM (17 years ago)
Author:
vboxsync
Message:

pcnet: fix for r28728

File:
1 edited

Legend:

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

    r7317 r7320  
    601601 * @param addr          physical address of the descriptor
    602602 * @param fRetIfNotOwn  return immediately after reading the own flag if we don't own the descriptor
    603  */
    604 DECLINLINE(void) pcnetTmdLoad(PCNetState *pData, TMD *tmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
     603 * @return              true if we own the descriptor, false otherwise
     604 */
     605DECLINLINE(bool) pcnetTmdLoad(PCNetState *pData, TMD *tmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
    605606{
    606607    PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pData);
     
    613614        PDMDevHlpPhysRead(pDevIns, addr+3, &ownbyte, 1);
    614615        if (!(ownbyte & 0x80) && fRetIfNotOwn)
    615             return;
     616            return false;
    616617        PDMDevHlpPhysRead(pDevIns, addr, (void*)&xda[0], sizeof(xda));
    617618        ((uint32_t *)tmd)[0] = (uint32_t)xda[0] | ((uint32_t)(xda[1] & 0x00ff) << 16);
     
    624625        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
    625626        if (!(ownbyte & 0x80) && fRetIfNotOwn)
    626             return;
     627            return false;
    627628        PDMDevHlpPhysRead(pDevIns, addr, (void*)tmd, 16);
    628629    }
     
    632633        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
    633634        if (!(ownbyte & 0x80) && fRetIfNotOwn)
    634             return;
     635            return false;
    635636        PDMDevHlpPhysRead(pDevIns, addr, (void*)&xda[0], sizeof(xda));
    636637        ((uint32_t *)tmd)[0] = xda[2];
     
    646647    if (!(ownbyte & 0x80))
    647648        tmd->tmd1.own = 0;
     649
     650    return !!tmd->tmd1.own;
    648651}
    649652
     
    697700 * @param addr          physical address of the descriptor
    698701 * @param fRetIfNotOwn  return immediately after reading the own flag if we don't own the descriptor
    699  */
    700 DECLINLINE(void) pcnetRmdLoad(PCNetState *pData, RMD *rmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
     702 * @return              true if we own the descriptor, false otherwise
     703 */
     704DECLINLINE(int) pcnetRmdLoad(PCNetState *pData, RMD *rmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
    701705{
    702706    PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pData);
     
    708712        PDMDevHlpPhysRead(pDevIns, addr+3, &ownbyte, 1);
    709713        if ((!ownbyte & 0x80) && fRetIfNotOwn)
    710             return;
     714            return false;
    711715        PDMDevHlpPhysRead(pDevIns, addr, (void*)&rda[0], sizeof(rda));
    712716        ((uint32_t *)rmd)[0] = (uint32_t)rda[0] | ((rda[1] & 0x00ff) << 16);
     
    719723        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
    720724        if ((!ownbyte & 0x80) && fRetIfNotOwn)
    721             return;
     725            return false;
    722726        PDMDevHlpPhysRead(pDevIns, addr, (void*)rmd, 16);
    723727    }
     
    727731        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
    728732        if ((!ownbyte & 0x80) && fRetIfNotOwn)
    729             return;
     733            return false;
    730734        PDMDevHlpPhysRead(pDevIns, addr, (void*)&rda[0], sizeof(rda));
    731735        ((uint32_t *)rmd)[0] = rda[2];
     
    741745    if (!(ownbyte & 0x80))
    742746        rmd->rmd1.own = 0;
     747
     748    return !!rmd->rmd1.own;
    743749}
    744750
     
    15201526        {
    15211527            addr = pcnetRdraAddr(pData, i);
    1522             pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true);
    15231528            CSR_CRDA(pData) = CSR_CRBA(pData) = 0;
    15241529            CSR_CRBC(pData) = CSR_CRST(pData) = 0;
    1525             if (!rmd.rmd1.own)
     1530            if (!pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true))
    15261531            {
    15271532                STAM_PROFILE_ADV_STOP(&pData->CTXSUFF(StatRdtePoll), a);
     
    15591564            i = CSR_RCVRL(pData);
    15601565        addr = pcnetRdraAddr(pData, i);
    1561         pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true);
    15621566        CSR_NRDA(pData) = CSR_NRBA(pData) = 0;
    15631567        CSR_NRBC(pData) = 0;
    1564         if (!rmd.rmd1.own)
     1568        if (!pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true))
    15651569        {
    15661570            STAM_PROFILE_ADV_STOP(&pData->CTXSUFF(StatRdtePoll), a);
     
    16061610        RTGCPHYS32 cxda = pcnetTdraAddr(pData, CSR_XMTRC(pData));
    16071611
    1608         pcnetTmdLoad(pData, tmd, PHYSADDR(pData, cxda), true);
    1609 
    1610         if (!tmd->tmd1.own)
     1612        if (!pcnetTmdLoad(pData, tmd, PHYSADDR(pData, cxda), true))
    16111613        {
    16121614            STAM_PROFILE_ADV_STOP(&pData->CTXSUFF(StatTdtePoll), a);
     
    17661768                    i = CSR_RCVRL(pData);
    17671769                next_crda = pcnetRdraAddr(pData, i);
    1768                 pcnetRmdLoad(pData, &next_rmd, PHYSADDR(pData, next_crda), true);
    17691770
    17701771                /* Check next descriptor's own bit. If we don't own it, we have
    17711772                 * to quit and write error status into the last descriptor we own.
    17721773                 */
    1773                 if (!next_rmd.rmd1.own)
     1774                if (!pcnetRmdLoad(pData, &next_rmd, PHYSADDR(pData, next_crda), true))
    17741775                    break;
    17751776
     
    21302131        /*
    21312132         * The typical case - a complete packet.
    2132          * This can be performed with zero copy in Ring-3.
    21332133         */
    21342134        if (tmd.tmd1.stp && tmd.tmd1.enp)
     
    47074707    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatXmitSkipCurrent,    STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES,    "",                                    "/Devices/PCNet%d/Xmit/Skipped", iInstance, i + 1);
    47084708
    4709     PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatInterrupt,          STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling PCNet interrupt checks",   "/Devices/PCNet%d/Interrupt", iInstance);
     4709    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatInterrupt,          STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling PCNet interrupt checks",   "/Devices/PCNet%d/UpdateIRQ", iInstance);
    47104710    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatPollTimer,          STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling PCNet poll timer",         "/Devices/PCNet%d/PollTimer", iInstance);
    47114711    PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatMIIReads,           STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES,     "Number of MII reads",                "/Devices/PCNet%d/MIIReads", iInstance);
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