⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swport.c

📁 VIA VT6524 8口网管交换机源码
💻 C
📖 第 1 页 / 共 2 页
字号:



    if (bAuto == 0 && byPortAbl == PORT_SPDPX_AUTO)
        return PORT_OP_WRONG_AUTO_ABY;

    if (bIfTBIPort) {
        // TBI mode only supports auto, force-1000F and force-1000H.
        if (byPortAbl == PORT_SPDPX_AUTO) {
            SWREG_vBitsOn(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_NWAY);
            SWREG_vWriteB(PHY_TBI_RST_EN_G1 + byPortId - SWITCH_MEGA_PORT_NUM, TRUE);
            return OP_OK;
        }

        // If TBI force mode, it must be 1000Full / 1000Half
        if ( (bAuto == 0) && (byPortAbl != PORT_SPDPX_1000M_FULL) && (byPortAbl != PORT_SPDPX_1000M_HALF) )
            return OP_OK;

        SWREG_vBitsOff(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_NWAY);
        // then goto force mode to set ability
    }
    // set special Nway ability for via octo-phy only
    else if (PHY_VIA_MEGA == SWMII_byGetPhyType(byPortId) && byPortId < SWITCH_MEGA_PORT_NUM) {
        // via phy 130
        if (SWMII_bIsRegBitsOff(byPortId, MII_REG_PHYID2, PTN_VIA_PHY_130)) {
            if ((bAuto) && (byPortAbl != PORT_SPDPX_AUTO))    // nway-force only
                SWMII_bRegBitsOn(byPortId, MII_REG_VIA_NWAYFRC, PTN_VIA_NWAYFRC_ABL);
            else
                SWMII_bRegBitsOff(byPortId, MII_REG_VIA_NWAYFRC, PTN_VIA_NWAYFRC_ABL);
        }
        // via phy 233
        else {
            if ((bAuto) && (byPortAbl != PORT_SPDPX_AUTO))    // nway-force only
                SWMII_bRegBitsOn(byPortId, MII_REG_VIA_NWAYFRC, (0x0100 << ((byPortId % 8))));
            else
                SWMII_bRegBitsOff(byPortId, MII_REG_VIA_NWAYFRC, (0x0100 << ((byPortId % 8))));
        }
    }

    // Set port auto port ability
    if (byPortAbl == PORT_SPDPX_AUTO) {
        SWMII_bRegBitsOn(byPortId, MII_REG_ANAR, PTN_PHY_ANAR_ABL_MEGA);

        if (byPortId >= SWITCH_GIGA_PORT_ID_BASE)
            SWMII_bRegBitsOn(byPortId, MII_REG_GBTCR, PTN_PHY_GBTCR_ABL_GIGA);

        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_AUTO | BMCR_REAUTO);
    }
    // Set Nway forced port ability
    else if (bAuto) {
        SWMII_bRegBitsOff(byPortId, MII_REG_ANAR, PTN_PHY_ANAR_ABL_MEGA);

        if (byPortId >= SWITCH_GIGA_PORT_ID_BASE)
            SWMII_bRegBitsOff(byPortId, MII_REG_GBTCR, PTN_PHY_GBTCR_ABL_GIGA);

        if ((byPortId >= SWITCH_GIGA_PORT_ID_BASE) &&
            (byPortAbl == PORT_SPDPX_1000M_FULL || byPortAbl == PORT_SPDPX_1000M_HALF))
            SWMII_bRegBitsOn(byPortId, MII_REG_GBTCR, s_awSpdDpxPtn[byPortAbl - 1]);
        else
            SWMII_bRegBitsOn(byPortId, MII_REG_ANAR, s_awSpdDpxPtn[byPortAbl - 1]);

        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_AUTO|BMCR_REAUTO);
    }
    // force mode
    else {
        SWREG_vBitsOn((PHY_PORT_ABL_BASE+byPortId), s_abyFrcSpdDpxBitOn[byPortAbl - 1]);
        SWREG_vBitsOff((PHY_PORT_ABL_BASE+byPortId), s_abyFrcSpdDpxBitOff[byPortAbl - 1]);

        if (!bIfTBIPort) {
            SWMII_bRegBitsOff(byPortId, MII_REG_BMCR, s_awFrcSpdDpxMiiVal[0]);
            SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, s_awFrcSpdDpxMiiVal[byPortAbl]);

            // link down then link up to trigger remote port to change mode
            // note: some phy may not work or phy registers will be reset.
            // if port enable
            if (SWMII_bIsRegBitsOff(byPortId, MII_REG_BMCR, BMCR_PD)) {
                SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_PD);
                PLATvDelay(200);    // delay 200ms
                SWMII_bRegBitsOff(byPortId, MII_REG_BMCR, BMCR_PD);
            }
        }
    }
    return OP_OK;
}


void SWPORT_vSetFlowCtrlEn(UINT8 byPortId, BOOL bFC) DIRECT_FUNTYPE_REENT
{
    if (bFC) {
        // Set flow control ability
        SWREG_vSpecBitOn(PHY_FLOW_CTRL_ABL, byPortId * 2);
        SWREG_vSpecBitOn(PHY_FLOW_CTRL_ABL, byPortId * 2 + 1);
        // Set back pressure ability
        SWREG_vSpecBitOff(PHY_BACK_PRESSURE_DIS, byPortId);
    }
    else {
        // Set flow control ability
        SWREG_vSpecBitOff(PHY_FLOW_CTRL_ABL, byPortId * 2);
        SWREG_vSpecBitOff(PHY_FLOW_CTRL_ABL, byPortId * 2 + 1);
        // Set back pressure ability
        SWREG_vSpecBitOn (PHY_BACK_PRESSURE_DIS, byPortId);
    }

    // check if NWay ability is on
    // If TBI mode port
    if (SWPORT_bIfTbiPort(byPortId)) {
        // if auto mode
        if (SWREG_bIfBitsOn(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_NWAY)) {
            if (bFC)
                SWREG_vBitsOn(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_FLWCTL);
            else
                SWREG_vBitsOff(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_FLWCTL);
                
            SWREG_vWriteB(PHY_TBI_RST_EN_G1 + byPortId - SWITCH_MEGA_PORT_NUM, TRUE);
        }
        // force mode
        else {
            if (bFC)
                SWREG_vBitsOff(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_FLWCTL);
            else
                SWREG_vBitsOn(PHY_TBI_ABL_G1 + byPortId - SWITCH_MEGA_PORT_NUM, PTN_PHY_TBI_ABL_FLWCTL);
        }

        return;
    }


    // If Auto/Nway-force mode
    if (SWMII_bIsRegBitsOn(byPortId, MII_REG_BMCR, BMCR_AUTO))
        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_REAUTO);
}


#else // VT6524


void SWPORT_vSetPortEn (UINT8 byPortId, BOOL bPortEn) DIRECT_FUNTYPE_REENT
{
    if (bPortEn)
        SWMII_bRegBitsOff(byPortId, MII_REG_BMCR, BMCR_PD);
    else
        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_PD);
}


UINT8 SWPORT_byGetSpdDpx (UINT8 byPortId) DIRECT_FUNTYPE_REENT
{
    if (SWREG_bIfBitsOn((UINT16)(PHY_PORT_ABL_BASE + byPortId), PTN_PHY_PORT_ABL_HALF_DPX)) {
        if (SWREG_bIfBitsOn((UINT16)(PHY_PORT_ABL_BASE + byPortId), PTN_PHY_PORT_ABL_SPD10))
            return PORT_SPDPX_10M_HALF;
        else
            return PORT_SPDPX_100M_HALF;
    }
    else {
        if (SWREG_bIfBitsOn((UINT16)(PHY_PORT_ABL_BASE + byPortId), PTN_PHY_PORT_ABL_SPD10))
            return PORT_SPDPX_10M_FULL;
        else
            return PORT_SPDPX_100M_FULL;
    }
}


BYTE SWPORT_bySetSpdDpx(UINT8 byPortId, BOOL bAuto, UINT8 byPortAbl) DIRECT_FUNTYPE_REENT
{
    if (bAuto == 0 && byPortAbl == PORT_SPDPX_AUTO)
        return PORT_OP_WRONG_AUTO_ABY;

    // set special Nway ability for via octo-phy only
    // via phy 130
    if (SWMII_bIsRegBitsOff(byPortId, MII_REG_PHYID2, PTN_VIA_PHY_130)) {
        if ((bAuto) && (byPortAbl != PORT_SPDPX_AUTO))    // nway-force only
            SWMII_bRegBitsOn(byPortId, MII_REG_VIA_NWAYFRC, PTN_VIA_NWAYFRC_ABL);
        else
            SWMII_bRegBitsOff(byPortId, MII_REG_VIA_NWAYFRC, PTN_VIA_NWAYFRC_ABL);
    }
    // via phy 233
    else {
        if ((bAuto) && (byPortAbl != PORT_SPDPX_AUTO))    // nway-force only
            SWMII_bRegBitsOn(byPortId, MII_REG_VIA_NWAYFRC, (0x0100 << ((byPortId % 8))));
        else
            SWMII_bRegBitsOff(byPortId, MII_REG_VIA_NWAYFRC, (0x0100 << ((byPortId % 8))));
    }

    if (bAuto) {
        if (byPortAbl != PORT_SPDPX_AUTO)   // Nway force
            SWMII_bRegBitsOff(byPortId, MII_REG_ANAR, PTN_PHY_ANAR_ABL_MEGA);

        SWMII_bRegBitsOn(byPortId, MII_REG_ANAR, s_awSpdDpxPtn[byPortAbl]);
        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_AUTO|BMCR_REAUTO);
    }
    // force mode
    else {
        SWREG_vBitsOn ((PHY_PORT_ABL_BASE+byPortId), s_abyFrcSpdDpxBitOn[byPortAbl-1]);
        SWREG_vBitsOff((PHY_PORT_ABL_BASE+byPortId), s_abyFrcSpdDpxBitOff[byPortAbl-1]);

        SWMII_bRegBitsOff(byPortId, MII_REG_BMCR, s_awFrcSpdDpxMiiVal[0]);
        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, s_awFrcSpdDpxMiiVal[byPortAbl]);

        // link down then link up to trigger remote port to change mode
        // if port enable
        if (SWMII_bIsRegBitsOff(byPortId, MII_REG_BMCR, BMCR_PD)) {
            SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_PD);
            PLATvDelay(200);    // delay 200ms
            SWMII_bRegBitsOff(byPortId, MII_REG_BMCR, BMCR_PD);
        }
    }
    return OP_OK;
}


void SWPORT_vSetFlowCtrlEn(UINT8 byPortId, BOOL bFC) DIRECT_FUNTYPE_REENT
{
    if (bFC) {
        // Set flow control ability
        SWREG_vSpecBitOn(PHY_FLOW_CTRL_ABL, byPortId*2);
        SWREG_vSpecBitOn(PHY_FLOW_CTRL_ABL, byPortId*2 + 1);
        // Set back pressure ability
        SWREG_vSpecBitOff(PHY_BACK_PRESSURE_DIS, byPortId);
    }
    else {
        // Set flow control ability
        SWREG_vSpecBitOff(PHY_FLOW_CTRL_ABL, byPortId*2);
        SWREG_vSpecBitOff(PHY_FLOW_CTRL_ABL, byPortId*2 + 1);
        // Set back pressure ability
        SWREG_vSpecBitOn (PHY_BACK_PRESSURE_DIS, byPortId);
    }

    // check if NWay ability is on
    // If Auto/Nway-force mode
    if (SWMII_bIsRegBitsOn(byPortId, MII_REG_BMCR, BMCR_AUTO)) {
        SWMII_bRegBitsOn(byPortId, MII_REG_BMCR, BMCR_REAUTO);
    }
    // If non-Nway force mode, set port ability reg manually
    else {
        if (bFC)
            SWREG_vBitsOff(PHY_PORT_ABL_BASE + byPortId, 0x18);
        else
            SWREG_vBitsOn (PHY_PORT_ABL_BASE + byPortId, 0x18);
    }
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -