7.5 二层交换机代码实现续
推荐给好友
打印
加入收藏
更新于2008-10-13 15:53:15

xx-xx-xx-xx-xx-xx为源MAC地址;yy-yy是特殊的opcode。0001保留给IEEE802.3流控。0002到0006保留给IEEE802.3ah EPON标准。0012用作LHB包
7.3.2.2 配置链路失效转移
LHB能被所有的RMAC端口(0-7)使能。使能链路失效转移功能,要分别将ECR3[7] 和ECR4[6]置位。LHB的opcode在LHBReg1(612h)和LHBReg0(611h)寄存器中被设置。失效时间在LHBTimer寄存器(610h)中设置。例如:当LHBTimer寄存器的内容被置成10,LHB计时器将自动将100M和10M端口的超时时间设为51.2us和512us。当100M和10M端口分别超过20.6us和206us没有包发送,则自动发送LHB包。
7.3.2.3 相关寄存器
LHBTimer寄存器
在时隙时间内(512 bit time)。如果在在一定时间内没有数据包的传送,则LHB包将被发送到远端设备。在一定时间内没有接收到数据包,接收器将触发LHB超时中断。
LHBReg0, LHBReg1 - Link Heart Beat OpCode
LHB帧使用MAC控制帧格式(和流控帧相同)。
Interrupt Status
当LHB计时器超时,中断信号就发送到CPU。LHB状态可以由bit[36:34]观察到
Bit[34]: LHB状态变化
Bit[35]: LHB帧被侦测到
Bit[36]: LHB接收超时
清除LHB超时状态,控制器要将LHB RECEIVING ENABLE(ECR4[6])清零。
7.3.2.4初始化链路失效转移配置
处理链路失效的方法有两种。第一种方式是从以太网PHY(交换芯片MAC与物理线路之间)侦测到。以太网PHY状态寄存器提供链路状态bit(1 链路up;0 链路down)。第二种方式就是通过LHB相关寄存器获得链路状态信息。本交换机采用的是第一种方法

      

本模块代码实现

/*****************************************************************

/*函数名称: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;

                }

               // bufferEEPROM或硬件

                else

//其他两种情况 RATE_OP_BUF_TO_HWRATE_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;

}

}

<<上一节

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.