📄 hw_api.c
字号:
locSpeedStat[1] = u16val;
}
}
void hwLfpRecover(void)
{
if(locLFPChkDone == 1)
{
locLFPChkDone = 0;
if(locPortStat[0] == 1)
hwLfpSetPortStat(1, 1);
if(locPortStat[1] == 1)
hwLfpSetPortStat(2, 1);
LED_FEF = LED_OFF;
init_timer(locLfpTimer,800);
}
}
/*
* Function:
* hwLfpMonitor()
* Purpose:
* Monitor the local and remote link
* status and do the LFP config
* Parameters:
* None.
* Returns:
* None.
* Notes:
* None.
*/
void hwLfpMonitor(void)
{
if(check_timer(locLfpTimer) != 0)
return;
/*if no LFP done, check LFP*/
if(locLFPChkDone==0)
{
if(locLFPen==1)
{
if(localOAMPort==8/*FX or FX2 port*/)
{
/*local FX link down-->Power down local TP*/
if(locLink[1]==0)
{
/*Power down local TP-ethernet*/
hwLfpSetPortStat(1, 0);
locLFPChkDone = 1;
locLFPChkPoint = 0;
if(locFEFen==1)
LED_FEF = LED_ON;
}
/*local TP link down*/
else if(locLink[0]==0)
{
if(locFEFen==1)
hwLfpSetPortStat(2, 0);
locLFPChkPoint = 1;
locLFPChkDone = 1;
}
/*remote TP link down && remote device exist*/
else if((remoteDTEExist==1)&&(remoteTPLink==0))
{
/*Power down TP-ethernet*/
hwLfpSetPortStat(1, 0);
locLFPChkPoint = 2;
locLFPChkDone = 1;
}
}
else
{
/*local FX2 link down-->Power down local FX1*/
if(locLink[1]==0)
{
if(locFEFen==1)
hwLfpSetPortStat(1, 0);
locLFPChkPoint = 0;
locLFPChkDone = 1;
}
/*local FX1 link down*/
else if(locLink[0]==0)
{
hwLfpSetPortStat(2, 0);
locLFPChkPoint = 1;
locLFPChkDone = 1;
if(locFEFen==1)
LED_FEF = LED_ON;
}
/*remote TP link down && remote device exist*/
else if((remoteDTEExist==1)&&(remoteTPLink==0))
{
/*Power down TP-ethernet*/
hwLfpSetPortStat(2, 0);
locLFPChkPoint = 2;
locLFPChkDone = 1;
}
}
}
}
/*check LFP done, recover LFP*/
else
{
if(localOAMPort==8/*FX or FX2 port*/)
{
/*fault point:local FX*/
if(locLFPChkPoint==0)
{
/*local FX link up,or LFP disable*/
if((locLink[1]==1) || (locLFPen==0))
{
if(locPortStat[0]==1)
hwLfpSetPortStat(1, 1);
locLFPChkDone = 0;
if(locFEFen==1)
LED_FEF = LED_OFF;
}
}
/*fault point:local TP*/
else if(locLFPChkPoint==1)
{
/*FEF disable,or LFP disable,or local TP link up*/
if((locLFPen==0)||(locLink[0]==1))
{
if(locFEFen==1)
{
if(locPortStat[1]==1)
hwLfpSetPortStat(2, 1);
}
locLFPChkDone = 0;
}
}
/*fault point:remote TP*/
else if(locLFPChkPoint==2)
{
/*remote TP link up,or remote not exist,or remote FEF enable,or LFP disable*/
if((remoteTPLink==1)||(remoteDTEExist==0)||(locLFPen==0))
{
if(locPortStat[0]==1)
hwLfpSetPortStat(1, 1);
locLFPChkDone = 0;
}
}
}
else
{
/*fault point:local FX2*/
if(locLFPChkPoint==0)
{
/*local FX2 link up,or LFP disable*/
if((locLink[1]==1) || (locLFPen==0))
{
if(locFEFen==1)
{
if(locPortStat[0]==1)
hwLfpSetPortStat(1, 1);
}
locLFPChkDone = 0;
}
}
/*fault point:local TP*/
else if(locLFPChkPoint==1)
{
/*FEF disable,or LFP disable,or local TP link up*/
if((locLFPen==0)||(locLink[0]==1))
{
if(locPortStat[1]==1)
hwLfpSetPortStat(2, 1);
locLFPChkDone = 0;
if(locFEFen==1)
LED_FEF = LED_OFF;
}
}
/*fault point:remote TP*/
else if(locLFPChkPoint==2)
{
/*remote TP link up,or remote not exist,or remote FEF enable,or LFP disable*/
if((remoteTPLink==1)||(remoteDTEExist==0)||(locLFPen==0))
{
if(locPortStat[1]==1)
hwLfpSetPortStat(2, 1);
locLFPChkDone = 0;
}
}
}
if(locLFPChkDone==0)
init_timer(locLfpTimer,800);
}
}
/*
* Function:
* hwMacAdd()
* Purpose:
* Add a mac address to switch chip
* Parameters:
* pbm -- port bit map
* mac -- mac address
* prio -- mac address priority
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwMacAdd(UINT16 pbm, UINT8 *mac, UINT8 prio)
{
UINT16 regVal;
UINT8 entryState,i;
/*Wait until ATU is not BUSY*/
regVal = 0x8000;
while(regVal & 0x8000)
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, ®Val);
entryState = 0x0F; /*add static mac*/
regVal = (entryState&0x0F) | ((pbm&0x07FF)<<4);
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_DATA_REG, regVal);
for(i=0; i<3; i++)
{
regVal = ((*(mac+2*i)<<8) | (*(mac+2*i+1)));
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_MAC_BASE+i, regVal);
}
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, ®Val);
regVal &= 0x0FFF;
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, regVal);
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, ®Val);
regVal &= 0x08F0;
regVal |= (0xB000 | ((prio&0x7)<<8));
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, regVal);
return OK;
}
/*
* Function:
* hwChipReset()
* Purpose:
* Reset the 88E6095 and 88E1111
* Parameters:
* None.
* Returns:
* None.
* Notes:
* None.
*/
void hwChipReset(void)
{
UINT8 tmpTimer;
tmpTimer = get_timer();
init_timer(tmpTimer, 40);
MCU_RST_OUT = 0;
while(check_timer(tmpTimer) != 0);
MCU_RST_OUT = 1;
init_timer(tmpTimer, 40);
while(check_timer(tmpTimer) != 0);
free_timer(tmpTimer);
}
/*
* Function:
* hwMacDel()
* Purpose:
* Del a mac address from switch chip
* Parameters:
* mac -- mac address
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwMacDel(UINT8 *mac)
{
UINT16 regVal;
UINT8 entryState,i;
/*wait until ATU is not busy*/
regVal = 0x8000;
while(regVal & 0x8000)
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, ®Val);
entryState = 0x0; /*del static mac*/
regVal = (entryState & 0x0F);
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_DATA_REG, regVal);
for(i=0;i<3;i++)
{
regVal = ((*(mac+2*i)<<8) | (*(mac+2*i+1)));
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_MAC_BASE+i, regVal);
}
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, ®Val);
regVal &= 0x0FFF;
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, regVal);
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, ®Val);
regVal &= 0x08F0;
regVal |= 0xB000;
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, regVal);
return OK;
}
void hwRunLedFlash(void)
{
if(check_timer(locRunLedTimer) != 0)
return;
init_timer(locRunLedTimer, 66);
locRunLedStat ^= 1;
LED_FX_FX_RUN = locRunLedStat;
}
UINT8 hwIoInit(void)
{
/*Enable digital input buffer to PTADx*/
/*
*PAD0-1: hardware version
*PAD2: 1-TP<->FX converter; 0-FX<->FX
*PAD3: 1-TP auto enable; 0-diable
*PAD4: 1-TP full; 0-half
*PAD6-5: 11-TP 1000M; 01-100M; 10-10M
*PAD7: 1-LFP disable; 0-enable
*/
ATDDIEN = 0xFF;
/*FEF LED(Far end fault)*/
DDRL_DDRL2 = 1; /*output*/
PTL_PTL2 = 1; /*turn off*/
/*TP 1000M LED (RUN LED when two FX ports used)*/
DDRL_DDRL4 = 1; /*output*/
PTL_PTL4 = 1; /*turn off*/
/*FX1 powerdown control*/
DDRL_DDRL1 = 1; /*output*/
PTL_PTL1 = 1; /*PowerUp*/
/*FX2 powerdown control*/
DDRL_DDRL3 = 1; /*output*/
PTL_PTL3 = 1; /*PowerUp*/
/*MCU reset output*/
DDRS_DDRS4 = 1; /*output*/
PTS_PTS4 = 1; /*normal state*/
/*DIP-switch input*/
/*
*PT5: 1-FEF disable; 0-enable
*PT6: 1-FlowCtrl diable; 0-enable
*PT7: 1-FX port auto enable; 0-disable
*/
DDRT_DDRT5 = 0;
DDRT_DDRT6 = 0;
DDRT_DDRT7 = 0;
}
/*
* Function:
* hwInit()
* Purpose:
* Init the hardware
* Parameters:
* None.
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwInit(void)
{
UINT16 regVal,index;
UINT32 val;
/*read the device type info*/
if(DEVICE_TYPE == 1)
localDTEType = OL100CR_X4X_V5; /*TP-FX converter*/
else
localDTEType = OL100CR_GE_V5; /*FX-FX converter*/
memset(locAutoCfg,1,sizeof(locAutoCfg));
memset(locDuplexCfg,1,sizeof(locDuplexCfg));
memset(locSpeedCfg,1000,sizeof(locSpeedCfg));
memset(locLink,0,sizeof(locLink));
memset(locDuplexStat,0,sizeof(locDuplexStat));
memset(locSpeedStat,10,sizeof(locSpeedStat));
memset(locPortStat,1,sizeof(locPortStat));
memset(sysLog,0,SYS_LOG_MAX*24);
localNoamPortLnkStat = 0;
localOamPortLnkFault = 1;
localHWVersion = HW_VERSION;
hwChipReset();
/*read the 88E6095 Identifier, be sure it is up*/
index=0;
MIIread(SWITCH_PORT10_ADDRESS, QD_REG_SWITCH_ID, ®Val);
while((regVal&0xFFF0)!=0x0950)
{
MIIread(SWITCH_PORT8_ADDRESS, QD_REG_SWITCH_ID, ®Val);
index++;
if(index > 60000)
return ERROR;
}
/*read the 88E1111 Identifier, be sure it is up*/
index=0;
if(localDTEType == OL100CR_X4X_V5)
{
disPPU(SWITCH_GLOBAL1_ADDRESS);
MIIread(EXTL_PHY_ADDRESS, MII_PHY_ID0_REG, ®Val);
while(regVal != 0x0141)
{
MIIread(EXTL_PHY_ADDRESS, MII_PHY_ID0_REG, ®Val);
index++;
if(index > 60000)
return ERROR;
}
enPPU(SWITCH_GLOBAL1_ADDRESS);
}
/*set max packet len to 1632 bytes*/
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_GLOBAL_CONTROL, ®Val);
regVal |= 0x0400;
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_GLOBAL_CONTROL, regVal);
/*power down port 0-7 to save power*/
disPPU(SWITCH_GLOBAL1_ADDRESS);
for(index=0; index<8; index++)
{
MIIread(index, QD_PHY_CONTROL_REG, ®Val);
regVal = (regVal | 0x0800);
MIIwrite(index, QD_PHY_CONTROL_REG, regVal);
}
enPPU(SWITCH_GLOBAL1_ADDRESS);
/*get port statistic to avoid 64_127 count tx pakts*/
hwGetPortCounter(1,0,&val);
hwGetPortCounter(2,0,&val);
/*init MII port(port 9)*/
/*set PHYDetect*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_STATUS, ®Val);
regVal = (regVal | 0x1000);
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_STATUS, regVal);
/*set forwarding*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, ®Val);
regVal = (regVal | 0x0003);
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
/*force link up,full duplex,100M*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PCS_CONTROL, ®Val);
regVal |= (0x00FF);
regVal &= (~0x0002);
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PCS_CONTROL, regVal);
/*set Marvell_TAG*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, ®Val);
regVal |= 0x0100;
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
/*set CPU port*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, ®Val);
regVal &=0xFFF0;
regVal |= 0x0009;
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
#if 1
/*set vlan */
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, ®Val);
regVal |= 0x0400;
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
#endif
/*set no forward unknown unicast pkts*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, ®Val);
regVal &= (~0x0004);
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
/*set no forward unknown multicast pkts*/
MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, ®Val);
regVal &= (~0x0040);
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
/*set bcast egress broacast rate limit to 64k*/
MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_EGRESS_RATE_CTRL, 0xffff);
/*init FX or FX2 port(port 8)*/
/*set PHYDetect*/
MIIread(SWITCH_PORT8_ADDRESS, QD_REG_PORT_STATUS, ®Val);
regVal = (regVal | 0x1000);
MIIwrite(SWITCH_PORT8_ADDRESS, QD_REG_PORT_STATUS, regVal);
/*set forwarding*/
MIIread(SWITCH_PORT8_ADDRESS, QD_REG_PORT_CONTROL, ®Val);
regVal = (regVal | 0x0003);
MIIwrite(SWITCH_PORT8_ADDRESS, QD_REG_PORT_CONTROL, regVal);
/*init TP or FX1 Port(port 10)*/
/*set PHYDetect*/
MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_STATUS, ®Val);
regVal = (regVal | 0x1000);
MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_STATUS, regVal);
/*set forwarding*/
MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL, ®Val);
regVal = (regVal | 0x0003);
MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL, regVal);
#if 0
/*set vlan */
MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL2, ®Val);
regVal |= 0x0400;
MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
#endif
if(localDTEType == OL100CR_X4X_V5)
{
/*init external phy 88E1111*/
disPPU(SWITCH_GLOBAL1_ADDRESS);
/*set PHY(88E1111) LED mode*/
regVal = 0x2201;
MIIwrite(EXTL_PHY_ADDRESS, MII_AUX_REG, regVal);
/*disable phy copper/fiber auto-selection*/
MIIread(EXTL_PHY_ADDRESS, MII_EXTN_STAT_REG, ®Val);
regVal |= 0x8000;
MIIwrite(EXTL_PHY_ADDRESS, MII_EXTN_STAT_REG, regVal);
/*reset phy to update config*/
MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, ®Val);
regVal |= MII_CTRL_RESET;
MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);
enPPU(SWITCH_GLOBAL1_ADDRESS);
delay(100);
}
/*do dip-switch config*/
if(localDTEType == OL100CR_X4X_V5)
{
if(DIP_TP_SPEED_CFG == DIP_TP_SPEED_1000)
hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 1000);
else if(DIP_TP_SPEED_CFG == DIP_TP_SPEED_100)
hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 100);
else
hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 10);
localOAMPort = 8;
}
else
{
hwSetPortCfg(1, DIP_TP_AUTO_EN, 1, 1000);
if(DIP_DOT3AH_FX2_PORT)
localOAMPort = 8;
else
localOAMPort = 10;
LED_FX_FX_RUN = LED_ON;
}
hwSetPortCfg(2, DIP_FX_AUTO_EN, 1, 1000);
hwSetPortFlowCtrl(1, !DIP_FLOW_CTRL_DISABLE);
hwSetPortFlowCtrl(2, !DIP_FLOW_CTRL_DISABLE);
hwSetLfp(!DIP_LFP_DISABLE);
hwSetFef(!DIP_FEF_DISABLE);
locLfpTimer = get_timer();
init_timer(locLfpTimer, 100);
locRunLedTimer = get_timer();
init_timer(locRunLedTimer, 66);
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -