
本模块代码实现
/*****************************************************************
/*函数名称:FailOver_PROTECT
/*函数功能:链路失效转移处理函数
/*参数:无
/*返回值:无
/*作者:李朋铜
/*完成时间:2008-4
/*函数调用关系:[main()>FailOver_PROTECT()]
/*****************************************************************/
void FailOver_PROTECT (void)
{
//因为函数有可能随时由链路失效转移而触发执行,trunk配置buffer必须是local //buffer
CFG_RATE RATE;
CFG_TRUNK TRUNK;
U8 PhyID;
U32 LnkChgMsk = 0, PhyPortMsk = 0x01;
//读取link_satus
Hw_read_regU32 (PHY_LINK_STATUS_CHANGE, &LnkChgMsk );
if (LnkChgMsk ){
SetEEP_TO_SW (&TRUNK);
//根据链路速率,设置出口速率
SetRate (&SPageBuf.RATE, RATE_OP_EEP_TO_BUF);
for (PhyID = 0; PhyID < SWITCH_PORT_NUM; PhyID++)
{
if ((PhyPortMsk& LnkChgMsk ) )
SetRateCtrlExt(PhyID,*((PU16)((PU8)RATE.Rate+(PhyID* EEP_RATE_PORT_OFF )) ),
(*((PU16)((PU8)SPageBuf.RATE.Rate+(PhyID*
EEP_RATE_PORT_OFF)+RATE_SIZE)))*1000 );
PhyPortMsk <<= 1;
}
}
}
/*****************************************************************
/*函数名称:SetRate
/*函数功能:操作buffer,EEPROM和硬件相关
/*参数:pRa_Cfg:速率配置信息
/* byOp:操作码
/*返回值:无
/*作者:李朋铜
/*完成时间:2008-4
/*函数调用关系:[main()>FailOver_PROTECT()>SetRate ()]
/*****************************************************************
U8 SetRate (CFG_RATE* pRa_Cfg, U8 byOp)
{
U32 PhyPortMsk ;
U8 PhyPID, LogPortI=0;
for (LogPortI=0; LogPortI<g_byLogIdNum; LogPortI++)
{
PhyPortMsk = PIPORTMP_dwLogIdToPhyMsk(g_arrLogIdList[LogPortI]);
for (PhyPID=0; PhyPID<SWITCH_PORT_NUM; PhyPID++)
{
if (PhyPortMsk & 0x00000001)
{
if (byOp == RATE_OP_EEP_TO_BUF)
{
GetCfg_Eep(EEP_AD_RATEg+PhyPID*EEP_RATE_PORT_OFF, EEP_RATE_PORT_OFF ,
(PU8)(pRa_Cfg->Rate)+LogPortI*EEP_RATE_PORT _OFF);
break;
}
// buffer到EEPROM或硬件
else
//其他两种情况 RATE_OP_BUF_TO_HW或RATE_OP_BUF_TO_EEP
{ // 检查值是否合法
if (PhyPID < SWITCH_MEGA_PORT_NUM){
if(*((PU16)((PU8)(pRa_Cfg->Rate)+LogPortI*EEP_RATE_PORT_OFF))> 100
||*((PU16)((PU8)(pRa_Cfg->Rate)+LogPortI*EEP_RATE_PORT_OFF +RATE_SIZE)) >100
)
return WR_RATE_OP;
}
else{
if (*((PU16)((PU8)(pRa_Cfg->Rate)+
LogPortI*EEP_RATE_PORT_OFF ))>1000
||*((PU16)((PU8)(pRa_Cfg->Rate)+
LogPortI*EEP_RATE_PORT_OFF +
RATE_SIZE)) > 1000 )
return WR_RATE_OP;
}
// 设置硬件
SetRateCtrlExt(PhyPID, *((PU16)((PU8)(pRa_Cfg->Rate)+LogPortI*EEP_RATE_PORT_OFF)), (*((PU16)((PU8)(pRa_Cfg->Rate)+LogPortI*EEP_RATE_PORT_OFF +RATE_SIZE)))*1000 );
// 将配置信息存储在EEPROM中
if (byOp == RATE_OP_BUF_TO_EEP)
COPY_STR(g_pu8NVRSwCache+(EEP_AD_RATEg+PhyPID*
EEP_RA_PORT_OFF-NVAD_DATA_BE),
(PU8)pRa_Cfg->Rate+LogPort_index*
EEPRATE_PORT_ OFFSET,
EEPRATE_PORT_ OFFSET);
}
}
}
}
if (byOp == RATE_OP_BUF_TO_EEP) {
//写flash并且更新checksum
SetCfg2EEP(g_pu8NVRSwCache+15,
EEP_AD_RATEg,
EEP_SIZE_RATE_CFG);
NVR_UpdateChsm(255);}
return OP_OK;
}
}


