📄 swport.c
字号:
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 + -