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

📄 dot3ah_api.c

📁 在freescale 的ne64上开发的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}
		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, &regVal);
			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, &regVal);
		}
		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, &regVal);
			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, &regVal);
			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 + -