📄 dot3ah_api.c
字号:
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtFxTpBcastLmtEn)
{
u16Tmp = tlv_ptr->rmtPktLmt.rmtFxTpBcastLmt;
hwSetPortStorm(2, 0, (u16Tmp<<3));
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtFxTpBcastLmtdis)
{
hwSetPortStorm(2, 0, 0);
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtTpFxMcastLmtEn)
{
u16Tmp = tlv_ptr->rmtPktLmt.rmtTpFxMcastLmt;
hwSetPortStorm(1, 1, (u16Tmp<<3));
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtTpFxMcastLmtdis)
{
hwSetPortStorm(1, 1, 0);
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtFxTpMcastLmtEn)
{
u16Tmp = tlv_ptr->rmtPktLmt.rmtFxTpMcastLmt;
hwSetPortStorm(2, 1, (u16Tmp<<3));
}
if(tlv_ptr->rmtPktLmt.rmtPktLmtCtrl.Bits.rmtFxTpMcastLmtdis)
{
hwSetPortStorm(2, 1, 0);
}
}
}
void spec_tlv_rate_get_req(tSPEC_RATELMT_GET_RES_TLV *tlv_ptr)
{
UINT8 u8Tmp;
UINT16 u16Tmp;
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_rate_get_req\n\r");
#endif
tlv_ptr->specTlvType = SPEC_TYPE_RATELMT_GET_RES;
tlv_ptr->specTlvDataLen = SPEC_RATELMT_GET_RES_LEN;
hwGetPortRate(2, 1, &tlv_ptr->rmtTpFxSpdLmt);
tlv_ptr->rmtTpFxSpdLmt <<= 1;
hwGetPortRate(1, 1, &tlv_ptr->rmtFxTpSpdLmt);
tlv_ptr->rmtFxTpSpdLmt <<= 1;
hwGetPortStorm(1, &u8Tmp, &u16Tmp);
if(u8Tmp == 0)
{
if(u16Tmp == 0)
tlv_ptr->rmtTpFxBcastLmt = 0;
else
{
if(u16Tmp >= 8/*512k*/)
{
u16Tmp >>= 3;
if(u16Tmp > 0xff)
tlv_ptr->rmtTpFxBcastLmt = 0xff;
else
tlv_ptr->rmtTpFxBcastLmt = u16Tmp;
}
else
tlv_ptr->rmtTpFxBcastLmt = 1;
}
tlv_ptr->rmtTpFxMcastLmt=0;
}
else if(u8Tmp == 1)
{
if(u16Tmp == 0)
{
tlv_ptr->rmtTpFxBcastLmt = 0;
tlv_ptr->rmtTpFxMcastLmt = 0;
}
else
{
if(u16Tmp >= 8/*512k*/)
{
u16Tmp >>= 3;
if(u16Tmp > 0xff)
{
tlv_ptr->rmtTpFxBcastLmt = 0xff;
tlv_ptr->rmtTpFxMcastLmt = 0xff;
}
else
{
tlv_ptr->rmtTpFxBcastLmt = u16Tmp;
tlv_ptr->rmtTpFxMcastLmt = u16Tmp;
}
}
else
{
tlv_ptr->rmtTpFxBcastLmt = 1;
tlv_ptr->rmtTpFxMcastLmt = 1;
}
}
}
hwGetPortStorm(2, &u8Tmp, &u16Tmp);
if(u8Tmp == 0)
{
if(u16Tmp == 0)
tlv_ptr->rmtFxTpBcastLmt = 0;
else
{
if(u16Tmp >= 8/*512k*/)
{
u16Tmp >>= 3;
if(u16Tmp > 0xff)
tlv_ptr->rmtFxTpBcastLmt = 0xff;
else
tlv_ptr->rmtFxTpBcastLmt = u16Tmp;
}
else
tlv_ptr->rmtFxTpBcastLmt = 1;
}
tlv_ptr->rmtFxTpMcastLmt=0;
}
else if(u8Tmp == 1)
{
if(u16Tmp == 0)
{
tlv_ptr->rmtFxTpBcastLmt = 0;
tlv_ptr->rmtFxTpMcastLmt = 0;
}
else
{
if(u16Tmp >= 8/*512k*/)
{
u16Tmp >>= 3;
if(u16Tmp > 0xff)
{
tlv_ptr->rmtFxTpBcastLmt = 0xff;
tlv_ptr->rmtFxTpMcastLmt = 0xff;
}
else
{
tlv_ptr->rmtFxTpBcastLmt = u16Tmp;
tlv_ptr->rmtFxTpMcastLmt = u16Tmp;
}
}
else
{
tlv_ptr->rmtFxTpBcastLmt = 1;
tlv_ptr->rmtFxTpMcastLmt = 1;
}
}
}
}
void spec_tlv_rate_get_res(UINT8 *data_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_rate_get_res\n\r");
#endif
}
void spec_tlv_statis_get_req(tSPEC_STATISTIC_GET_RES_TLV *tlv_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_statis_get_req\n\r");
#endif
#if 0
tlv_ptr->specTlvType=SPEC_TYPE_STATISTIC_GET_RES;
tlv_ptr->specTlvDataLen=SPEC_STATISTIC_GET_REQ_LEN;
if(tlv_ptr->rmtStatisticSubType.Bits.rmtStatisticGetPort)/*1-TP port, 0-Fiber port*/
{
switch(tlv_ptr->rmtStatisticSubType.Bits.rmtStatisticGetType)
{
case RMT_RXBYTES:
tlv_ptr->rmtStatHigh_First =localTPRcvByteCntLo;
tlv_ptr->rmtStatLow_Second =localTPRcvByteCntHi;
break;
case RMT_RXSPD_RXPKTS:
tlv_ptr->rmtStatHigh_First =localTPRcvSpeedCnt;
tlv_ptr->rmtStatLow_Second =localTPRcvPacketCnt;
break;
case RMT_TXBYTES:
tlv_ptr->rmtStatHigh_First =localTPRcvByteCntLo;
tlv_ptr->rmtStatLow_Second =localTPRcvByteCntHi;
break;
case RMT_TX_TXUNIPKTS:
tlv_ptr->rmtStatHigh_First =localTPTxPacketCnt;
tlv_ptr->rmtStatLow_Second =localTPTxUniPacketCnt;
break;
case RMT_TXDROPPKTS_TXSPD:
tlv_ptr->rmtStatHigh_First =localTPTxDropPacketCnt;
tlv_ptr->rmtStatLow_Second =localTPTxSpeedCnt;
break;
default:
tlv_ptr->rmtStatHigh_First =0;
tlv_ptr->rmtStatLow_Second =0;
break;
}
}
else
{
switch(tlv_ptr->rmtStatisticSubType.Bits.rmtStatisticGetType)
{
case RMT_RXBYTES:
tlv_ptr->rmtStatHigh_First =localFXRcvByteCntLo;
tlv_ptr->rmtStatLow_Second =localFXRcvByteCntHi;
break;
case RMT_RXSPD_RXPKTS:
tlv_ptr->rmtStatHigh_First =localFXRcvSpeedCnt;
tlv_ptr->rmtStatLow_Second =localFXRcvPacketCnt;
break;
case RMT_TXBYTES:
tlv_ptr->rmtStatHigh_First =localFXRcvByteCntLo;
tlv_ptr->rmtStatLow_Second =localFXRcvByteCntHi;
break;
case RMT_TX_TXUNIPKTS:
tlv_ptr->rmtStatHigh_First =localFXTxPacketCnt;
tlv_ptr->rmtStatLow_Second =localFXTxUniPacketCnt;
break;
case RMT_TXDROPPKTS_TXSPD:
tlv_ptr->rmtStatHigh_First =localFXTxDropPacketCnt;
tlv_ptr->rmtStatLow_Second =localFXTxSpeedCnt;
break;
default:
tlv_ptr->rmtStatHigh_First =0;
tlv_ptr->rmtStatLow_Second =0;
break;
}
}
#endif
}
void spec_tlv_statis_get_res(UINT8 *data_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_statis_get_res\n\r");
#endif
}
void spec_tlv_reg_rw_req(UINT8 *data_ptr, tSPEC_REG_RW_TLV *tlv_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_reg_rw_req\n\r");
#endif
#if 0
UINT16 *regAdd;
UINT16 regVal;
tSPEC_REG_RW_TLV *tlv_ptr;
tSPEC_REG_RW_TLV temp;
tlv_ptr=&temp;
tlv_ptr->specTlvType=SPEC_TYPE_REG_RW_RES;
tlv_ptr->specTlvDataLen=SPEC_REG_RW_LEN;
tlv_ptr->rmtRegSubType.rmtRegRwCtrlVal =((tSPEC_REG_RW_TLV *)working_ptr)->rmtRegSubType.rmtRegRwCtrlVal;
tlv_ptr->rmtRegAddr =((tSPEC_REG_RW_TLV *)working_ptr)->rmtRegAddr;
if(tlv_ptr->rmtRegSubType.Bits.rmtRegRW)//write
{
if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_CPU)/*CPU register*/
{
regAdd=(tU16 *)tlv_ptr->rmtRegAddr;
(*regAdd)=(tU16)tlv_ptr->rmtRegVal&0x0000FFFF;
regVal = (*regAdd);
}
else if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_PHY)/*PHY register*/
{
DisPPU(SWITCH_GLOBAL1_ADDRESS);//disable PPU
MIIwrite(PHY_ADDRESS, tlv_ptr->rmtRegAddr, (tU16)tlv_ptr->rmtRegVal&0x0000FFFF);
MIIread(PHY_ADDRESS, tlv_ptr->rmtRegAddr, ®Val);
EnPPU(SWITCH_GLOBAL1_ADDRESS);//Enable PPU
}
else if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_SW)/*Switch register*/
{
MIIwrite(SWITCH_PORT8_ADDRESS/*port:n(n=8 or 10)address*/, tlv_ptr->rmtRegAddr, (tU16)tlv_ptr->rmtRegVal&0x0000FFFF);
MIIread(SWITCH_PORT8_ADDRESS/*port:n(n=8 or 10)address*/, tlv_ptr->rmtRegAddr, ®Val);
}
tlv_ptr->rmtRegVal=regVal;
}
else//read
{
if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_CPU)/*CPU register*/
{
regAdd=(tU16 *)tlv_ptr->rmtRegAddr;
tlv_ptr->rmtRegVal=(tU32)(*regAdd);
}
else if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_PHY)/*PHY register*/
{
MIIread(PHY_ADDRESS, tlv_ptr->rmtRegAddr, ®Val);
tlv_ptr->rmtRegVal=(tU32)regVal;
}
else if(tlv_ptr->rmtRegSubType.Bits.rmtRegType==RMT_REG_SW)/*Switch register*/
{
MIIread(SWITCH_PORT8_ADDRESS/*port:n(n=8 or 10)address*/, tlv_ptr->rmtRegAddr, ®Val);
tlv_ptr->rmtRegVal=(tU32)regVal;
}
}
#endif
}
void spec_tlv_reg_rw_res(UINT8 *data_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_reg_rw_res\n\r");
#endif
#if 0
tSPEC_REG_RW_TLV *tlv_ptr=(tSPEC_REG_RW_TLV*)working_ptr;
tU16 *regAdd;
if(tlv_ptr->rmtRegSubType.Bits.rmtRegRW)//write
{
/* debug function display here*/
}
else//read
{
/* debug function display here*/
}
#endif
}
void spec_tlv_fx_info_req(tSPEC_FX_INFO_GET_RES_TLV* tlv_ptr)
{
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi spec_tlv_fx_info_req\n\r");
#endif
tlv_ptr->specTlvType = SPEC_TYPE_FX_INFO_GET_RES;
tlv_ptr->specTlvDataLen = SPEC_FX_INFO_GET_RES_LEN;
get_port_info(1,&tlv_ptr->rmtPort1Type, &tlv_ptr->rmtPort1Mode, &tlv_ptr->rmtPort1Cnctr, &tlv_ptr->rmtPort1Distance);
get_wave_info(1,&tlv_ptr->rmtPort1TxWaveLen, &tlv_ptr->rmtPort1RxWaveLen);
get_port_info(2,&tlv_ptr->rmtPort2Type, &tlv_ptr->rmtPort2Mode, &tlv_ptr->rmtPort2Cnctr, &tlv_ptr->rmtPort2Distance);
get_wave_info(2,&tlv_ptr->rmtPort2TxWaveLen, &tlv_ptr->rmtPort2RxWaveLen);
}
void process_oam_spec_tlv(UINT8* working_ptr, UINT16 dataLen)
{
UINT8 tempByte,justSetCmdFlag;
UINT16 tempWord;
#if debugDOT3AH
DOT3AH_API_DEBUGOUT("Dot3ahApi process_oam_spec_tlv\n\r");
#endif
while(dataLen > 0)
{
/*get the specific TLV type*/
tempByte = *working_ptr;
justSetCmdFlag = 0;
switch(tempByte)
{
case SPEC_TYPE_CFG_SET_REQ:
{
spec_tlv_cfg_set_req(working_ptr);
working_ptr += (SPEC_CFG_SET_REQ_LEN + 2);
dataLen -= (SPEC_CFG_SET_REQ_LEN + 2);
justSetCmdFlag = 1;
}
case SPEC_TYPE_STAT_GET_REQ:
{
tSPEC_STAT_GET_RES_TLV tlv_ptr;
spec_tlv_stat_get_req(&tlv_ptr);
dot3ah_send_spec((void *)&tlv_ptr, SPEC_STAT_GET_RES_LEN+2);
if(justSetCmdFlag == 0)
{
working_ptr += (SPEC_STAT_GET_REQ_LEN + 2);
dataLen -= (SPEC_STAT_GET_REQ_LEN + 2);
}
justSetCmdFlag = 0;
break;
}
case SPEC_TYPE_STAT_GET_RES:
{
spec_tlv_stat_get_res(working_ptr);
working_ptr += (SPEC_STAT_GET_RES_LEN + 2);
dataLen -= (SPEC_STAT_GET_RES_LEN + 2);
break;
}
case SPEC_TYPE_RATELMT_SET_REQ:
{
spec_tlv_rate_set_req(working_ptr);
justSetCmdFlag = 1;
working_ptr += (SPEC_RATELMT_SET_REQ_LEN + 2);
dataLen -= (SPEC_RATELMT_SET_REQ_LEN + 2);
}
case SPEC_TYPE_RATELMT_GET_REQ:
{
tSPEC_RATELMT_GET_RES_TLV tlv_ptr;
spec_tlv_rate_get_req(&tlv_ptr);
dot3ah_send_spec((void *)&tlv_ptr, SPEC_RATELMT_GET_RES_LEN+2);
if(justSetCmdFlag == 0)
{
working_ptr += (SPEC_RATELMT_GET_REQ_LEN + 2);
dataLen -= (SPEC_RATELMT_GET_REQ_LEN + 2);
}
justSetCmdFlag=0;
break;
}
case SPEC_TYPE_RATELMT_GET_RES:
{
spec_tlv_rate_get_res(working_ptr);
working_ptr +=(SPEC_RATELMT_GET_RES_LEN + 2);
dataLen -= (SPEC_RATELMT_GET_RES_LEN + 2);
break;
}
case SPEC_TYPE_STATISTIC_GET_REQ:
{
tSPEC_STATISTIC_GET_RES_TLV tlv_ptr;
spec_tlv_statis_get_req(&tlv_ptr);
dot3ah_send_spec((void *)&tlv_ptr, SPEC_STATISTIC_GET_REQ_LEN+2);
working_ptr += (SPEC_STATISTIC_GET_REQ_LEN + 2);
dataLen -= (SPEC_STATISTIC_GET_REQ_LEN + 2);
break;
}
case SPEC_TYPE_STATISTIC_GET_RES:
{
spec_tlv_statis_get_res(working_ptr);
working_ptr += (SPEC_STATISTIC_GET_RES_LEN + 2);
dataLen -= (SPEC_STATISTIC_GET_RES_LEN + 2);
break;
}
case SPEC_TYPE_REG_RW_REQ:
{
tSPEC_REG_RW_TLV tlv_ptr;
spec_tlv_reg_rw_req(working_ptr, &tlv_ptr);
dot3ah_send_spec((void *)&tlv_ptr, SPEC_REG_RW_LEN+2);
working_ptr += (SPEC_REG_RW_LEN + 2);
dataLen -= (SPEC_REG_RW_LEN + 2);
break;
}
case SPEC_TYPE_REG_RW_RES:
{
spec_tlv_reg_rw_res(working_ptr);
working_ptr += (SPEC_REG_RW_LEN + 2);
dataLen -= (SPEC_REG_RW_LEN + 2);
break;
}
case SPEC_TYPE_FX_INFO_GET_REQ:
{
tSPEC_FX_INFO_GET_RES_TLV tlv_ptr;
spec_tlv_fx_info_req(&tlv_ptr);
dot3ah_send_spec((void *)&tlv_ptr, SPEC_FX_INFO_GET_RES_LEN+2);
working_ptr += (SPEC_FX_INFO_GET_REQ_LEN + 2);
dataLen -= (SPEC_FX_INFO_GET_REQ_LEN + 2);
break;
}
case SPEC_TYPE_FX_INFO_GET_RES:
{
working_ptr += (SPEC_FX_INFO_GET_RES_LEN + 2);
dataLen -= (SPEC_FX_INFO_GET_RES_LEN + 2);
break;
}
default:
dataLen = 0;
break;
}
}
}
void dot3ahOAMMacAddrSet(UINT16 pbm)
{
UINT8 slow_addr[6]={0x01,0x80,0xc2,0x00,0x00,0x02};
hwMacAdd(pbm, slow_addr, 7);
if(hard_addr[0] != 0xff)
hwMacAdd((0x1<<9) | (0x1<<10) | (0x1<<8), hard_addr, 7);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -