📄 hw_api.c
字号:
{
regVal |= QD_RATECTRL_LMT_BCAST;
}
else if(type == STORM_TYPE_MBCAST)
{
regVal |= QD_RATECTRL_LMT_MBCAST;
}
else
{
regVal |= QD_RATECTRL_LMT_MBDCAST;
}
MIIwrite(phyAddr, QD_REG_EGRESS_RATE_CTRL, regVal);
MIIread(phyAddr, QD_REG_INGRESS_RATE_CTRL, ®Val);
regVal &= (~QD_RATECTRL_LMT_RATEf);
regVal += (UINT16)(hwRateLmtValGet(rateTmp));
MIIwrite(phyAddr, QD_REG_INGRESS_RATE_CTRL, regVal);
return OK;
}
/*
* Function:
* hwGetPortStorm()
* Purpose:
* Get the port RX storm control limit
* Parameters:
* port -- port number,1-2
* type -- storm limit type, 0:Bcast;1:M-Bcast;2:M-B-DlfCast
* rate -- rate value, 0 to disable, n*64K
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwGetPortStorm(UINT8 port, UINT8 *type, UINT16 *rate)
{
UINT8 phyAddr,portTmp;
UINT16 regVal;
UINT32 rateTmp;
if(portInvalid(port,&portTmp))
return ERROR;
phyAddr = portTmp + 0x10;
MIIread(phyAddr, QD_REG_EGRESS_RATE_CTRL, ®Val);
switch(regVal & QD_RATECTRL_LMT_MODEf)
{
case QD_RATECTRL_LMT_BCAST:
*type = STORM_TYPE_BCAST;
break;
case QD_RATECTRL_LMT_MBCAST:
*type = STORM_TYPE_MBCAST;
break;
case QD_RATECTRL_LMT_MBDCAST:
*type = STORM_TYPE_MBDCAST;
break;
default:
*type = STORM_TYPE_ALL;
break;
}
MIIread(phyAddr, QD_REG_INGRESS_RATE_CTRL, ®Val);
if((regVal & QD_RATECTRL_LMT_RATEf) == 0)
*rate = 0;
else
{
rateTmp = (regVal & QD_RATECTRL_LMT_RATEf);
rateTmp = hwRateLmtValGet(rateTmp);
rateTmp = (rateTmp/64 + ((rateTmp%64)?1:0));
*rate = (UINT16)rateTmp;
}
return OK;
}
/*
* Function:
* hwSetPortFlowCtrl()
* Purpose:
* Set the port flow control
* Parameters:
* port -- port number,1-2
* enable -- 1-enable; 0-disable
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwSetPortFlowCtrl(UINT8 port, UINT8 enable)
{
UINT8 phyAddr,portTmp;
UINT16 regVal;
if(portInvalid(port,&portTmp))
return ERROR;
phyAddr = portTmp + 0x10;
MIIread(phyAddr, QD_REG_PCS_CONTROL, ®Val);
if(enable)
regVal |= (QD_PCS_FL_FORCE | QD_PCS_FL_ENABLE);
else
{
regVal |= QD_PCS_FL_FORCE;
regVal &= (~QD_PCS_FL_ENABLE);
}
MIIwrite(phyAddr, QD_REG_PCS_CONTROL, regVal);
if(localDTEType == OL100CR_X4X_V5)
{
if(portTmp == PORT_NUM_TP)
{
disPPU(SWITCH_GLOBAL1_ADDRESS);
/*set auto advertise*/
MIIread(EXTL_PHY_ADDRESS, MII_ANA_REG, ®Val);
if(enable)
regVal |= MII_ANA_PAUSE;
else
regVal &= (~MII_ANA_PAUSE);
MIIwrite(EXTL_PHY_ADDRESS, MII_ANA_REG, regVal);
/*restart the auto-negotiation*/
MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, ®Val);
if(regVal & MII_CTRL_AE)
{
regVal |= MII_CTRL_RAN;
MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);
}
enPPU(SWITCH_GLOBAL1_ADDRESS);
}
}
else
{
/*restart the auto-negotiation*/
if(regVal & QD_PCS_AN_ENABLE)
{
regVal |= QD_PCS_AN_RESTART;
MIIwrite(phyAddr, QD_REG_PCS_CONTROL, regVal);
}
}
return OK;
}
/*
* Function:
* hwGetPortFlowCtrl()
* Purpose:
* Get the port flow control
* Parameters:
* port -- port number,1-2
* enable -- 1-enable; 0-disable
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwGetPortFlowCtrl(UINT8 port, UINT8 *enable)
{
UINT8 phyAddr,portTmp;
UINT16 regVal;
if(portInvalid(port,&portTmp))
return ERROR;
phyAddr = portTmp + 0x10;
MIIread(phyAddr, QD_REG_PCS_CONTROL, ®Val);
if(regVal & QD_PCS_FL_ENABLE)
*enable = 1;
else
*enable = 0;
return OK;
}
/*
* Function:
* hwSetCos()
* Purpose:
* Set the device cos status
* Parameters:
* enable -- 1-enable; 0-disable
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwSetCos(UINT8 enable)
{
return OK;
}
/*
* Function:
* hwGetCos()
* Purpose:
* Get the device cos status
* Parameters:
* enable -- 1-enable; 0-disable
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwGetCos(UINT8 *enable)
{
*enable = 0;
return OK;
}
/*
* Function:
* hwGetPortCounter()
* Purpose:
* Get the port statistics
* Parameters:
* port -- port number,1-2
* type -- statistics type
* val -- value
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwGetPortCounter(UINT8 port, GT_STATS_COUNTERS type, UINT32 *val)
{
UINT8 portTmp;
UINT16 regVal;
if(portInvalid(port,&portTmp))
return ERROR;
/*capture the port's counter*/
/*wait if busy*/
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, ®Val);
while(regVal & GT_STATS_BUSY)
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, ®Val);
regVal = 0x0000;
regVal = (GT_STATS_BUSY | (GT_STATS_CAPTURE_PORT<<12) | (GT_STATS_HSTGRM_RX<<10) | (portTmp&0x3F));
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, regVal);
/*read the port's counter*/
/*wait if busy*/
while(regVal & GT_STATS_BUSY)
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, ®Val);
regVal = 0x0000;
regVal = (GT_STATS_BUSY | (GT_STATS_READ_COUNTER<<12) | (GT_STATS_HSTGRM_RX<<10) | (type&0x3F));
MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, regVal);
/*wait if busy*/
while(regVal & GT_STATS_BUSY)
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_OPERATION, ®Val);
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_COUNTER3_2, ®Val);
*val = regVal;
*val <<= 16;
MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_STATS_COUNTER1_0, ®Val);
*val += regVal;
return OK;
}
void hwGetPortCntStr(ePORT_STATISTIC type, INT8 *str)
{
switch(type)
{
case RxBytes:
sprintf(str,"RxBytes");
break;
case RxPkts:
sprintf(str,"RxPkts");
break;
case RxUniPkts:
sprintf(str,"RxUniPkts");
break;
case RxMcastPkts:
sprintf(str,"RxMcastPkts");
break;
case RxBcastPkts:
sprintf(str,"RxBcastPkts");
break;
case RxDropPkts:
sprintf(str,"RxDropPkts");
break;
case RxErrPkts:
sprintf(str,"RxErrPkts");
break;
case RxCRCErrPkts:
sprintf(str,"RxCRCErrPkts");
break;
case RxFragmentErrPkts:
sprintf(str,"RxFragmentErrPkts");
break;
case RxOversizePkts:
sprintf(str,"RxOversizePkts");
break;
case RxUndersizePkts:
sprintf(str,"RxUndersizePkts");
break;
case RxJabberPkts:
sprintf(str,"RxJabberPkts");
break;
case RxPausePkts:
sprintf(str,"RxPausePkts");
break;
case Rx64BytesPkts:
sprintf(str,"Rx64BytesPkts");
break;
case Rx65to127BytesPkts:
sprintf(str,"Rx65to127BytesPkts");
break;
case Rx128to255BytesPkts:
sprintf(str,"Rx128to255BytesPkts");
break;
case Rx256to511BytesPkts:
sprintf(str,"Rx256to511BytesPkts");
break;
case Rx512to1023BytesPkts:
sprintf(str,"Rx512to1023BytesPkts");
break;
case Rx1024to1522BytesPkts:
sprintf(str,"Rx1024to1522BytesPkts");
break;
case TxBytes:
sprintf(str,"TxBytes");
break;
case TxPkts:
sprintf(str,"TxPkts");
break;
case TxUniPkts:
sprintf(str,"TxUniPkts");
break;
case TxMcastPkts:
sprintf(str,"TxMcastPkts");
break;
case TxBcastPkts:
sprintf(str,"TxBcastPkts");
break;
case TxPausePkts:
sprintf(str,"TxPausePkts");
break;
case TxCollisionPkts:
sprintf(str,"TxCollisionPkts");
break;
case TxLateColPkts:
sprintf(str,"TxLateColPkts");
break;
case TxExcessiveColPkts:
sprintf(str,"TxExcessiveColPkts");
break;
case TxSingleColPkts:
sprintf(str,"TxSingleColPkts");
break;
case TxMultiColPkts:
sprintf(str,"TxMultiColPkts");
break;
case TxDropPkts:
sprintf(str,"TxDropPkts");
break;
default:
sprintf(str,"Unknown");
break;
}
}
UINT8 hwGetPortCnt(UINT8 port, ePORT_STATISTIC type, UINT32 *valHigh, UINT32 *valLow)
{
UINT32 cntTmp1,cntTmp2;
*valHigh = 0;
*valLow = 0;
switch(type)
{
case RxBytes:
hwGetPortCounter(port, InGoodOctetsHi, valHigh);
hwGetPortCounter(port, InGoodOctetsLo, &cntTmp1);
hwGetPortCounter(port, InBadOctets, &cntTmp2);
*valLow = cntTmp1 + cntTmp2;
if((*valLow<cntTmp1) || (*valLow<cntTmp2))
*valHigh += 1;
break;
case RxPkts:
hwGetPortCounter(port, InUnicasts, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, InBroadcasts, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, InMulticasts, &cntTmp1);
*valLow += cntTmp1;
break;
case RxUniPkts:
hwGetPortCounter(port, InUnicasts, valLow);
break;
case RxMcastPkts:
hwGetPortCounter(port, InMulticasts, valLow);
break;
case RxBcastPkts:
hwGetPortCounter(port, InBroadcasts, valLow);
break;
case RxDropPkts:
return ERROR;
break;
case RxErrPkts:
hwGetPortCounter(port, InFCSErr, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, InFragments, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, InOversize, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, InUndersize, &cntTmp1);
*valLow += cntTmp1;
break;
case RxCRCErrPkts:
hwGetPortCounter(port, InFCSErr, valLow);
break;
case RxFragmentErrPkts:
hwGetPortCounter(port, InFragments, valLow);
break;
case RxOversizePkts:
hwGetPortCounter(port, InOversize, valLow);
break;
case RxUndersizePkts:
hwGetPortCounter(port, InUndersize, valLow);
break;
case RxJabberPkts:
hwGetPortCounter(port, InJabber, valLow);
break;
case RxPausePkts:
hwGetPortCounter(port, InPause, valLow);
break;
case Rx64BytesPkts:
hwGetPortCounter(port, InOctets64, valLow);
break;
case Rx65to127BytesPkts:
hwGetPortCounter(port, InOctets127, valLow);
break;
case Rx128to255BytesPkts:
hwGetPortCounter(port, InOctets255, valLow);
break;
case Rx256to511BytesPkts:
hwGetPortCounter(port, InOctets511, valLow);
break;
case Rx512to1023BytesPkts:
hwGetPortCounter(port, InOctets1023, valLow);
break;
case Rx1024to1522BytesPkts:
hwGetPortCounter(port, InOctetsMax, valLow);
break;
case TxBytes:
hwGetPortCounter(port, OutOctetsLo, valLow);
hwGetPortCounter(port, OutOctetsHi, valHigh);
break;
case TxPkts:
hwGetPortCounter(port, OutUnicasts, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, OutMulticasts, &cntTmp1);
*valLow += cntTmp1;
hwGetPortCounter(port, OutBroadcasts, &cntTmp1);
*valLow += cntTmp1;
break;
case TxUniPkts:
hwGetPortCounter(port, OutUnicasts, valLow);
break;
case TxMcastPkts:
hwGetPortCounter(port, OutMulticasts, valLow);
break;
case TxBcastPkts:
hwGetPortCounter(port, OutBroadcasts, valLow);
break;
case TxPausePkts:
hwGetPortCounter(port, OutPause, valLow);
break;
case TxCollisionPkts:
hwGetPortCounter(port, OutCollisions, valLow);
break;
case TxLateColPkts:
hwGetPortCounter(port, OutLate, valLow);
break;
case TxExcessiveColPkts:
hwGetPortCounter(port, OutExcessive, valLow);
break;
case TxSingleColPkts:
hwGetPortCounter(port, OutSingle, valLow);
break;
case TxMultiColPkts:
hwGetPortCounter(port, OutMultiple, valLow);
break;
case TxDropPkts:
hwGetPortCounter(port, OutFCSErr, valLow);
break;
default:
return ERROR;;
break;
}
return OK;
}
/*
* Function:
* hwSetReg()
* Purpose:
* Set the device chip register
* Parameters:
* chip -- 0-siwtch chip;1-phy;2-mcu
* addr -- address
* val -- wirite value
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwSetReg(UINT8 phyAddr, UINT8 addr, UINT16 val)
{
if(phyAddr <= EXTL_PHY_ADDRESS)
{
disPPU(SWITCH_GLOBAL1_ADDRESS);
MIIwrite(phyAddr, addr, val);
enPPU(SWITCH_GLOBAL1_ADDRESS);
}
else
{
MIIwrite(phyAddr, addr, val);
}
return OK;
}
/*
* Function:
* hwGetReg()
* Purpose:
* Get the device chip register
* Parameters:
* chip -- 0-siwtch chip;1-phy;2-mcu
* addr -- address
* val -- wirite value
* Returns:
* OK or ERROR.
* Notes:
* None.
*/
UINT8 hwGetReg(UINT8 phyAddr, UINT8 addr, UINT16 *val)
{
if(phyAddr <= EXTL_PHY_ADDRESS)
{
disPPU(SWITCH_GLOBAL1_ADDRESS);
MIIread(phyAddr, addr, val);
enPPU(SWITCH_GLOBAL1_ADDRESS);
}
else
{
MIIread(phyAddr, addr, val);
}
return OK;
}
/*
* Function:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -