📄 txc_envoy_fifo_real.c
字号:
CAVEATS: None.
REVISION HISTORY:
Rev Date Author Description
----- ------- ------------ -----------------
0.5.0 6/03/04 F. Giannella Initial release (beta)
*--------------------------------------------------------------------------*/
TXC_U16BIT ENVOY_SetFifoPortCtrlReal (TXC_U16BIT handle, TXC_U16BIT port,
ENVOY_FIFO_PORT_CTRL_STRUCT *fifoPortCtrlPtr)
{
TXC_U16BIT error = TXC_NO_ERR;
TXC_U16BIT deviceType;
TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
TXC_REG_ACCESS_32BIT_STRUCT regData[2];
TXC_REG_32 * baseAddr;
ENVOY_IFIFO_PORT_CTRL_STRUCT *fifoIngressCtrlPtr;
ENVOY_EFIFO_PORT_CTRL_STRUCT *fifoEgressCtrlPtr;
/* First, fill the batch platform header. This function requires 2
registers to be written */
memset (®Data[0], 0, (2 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
batchData.regDataPtr = ®Data[0];
batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
batchData.semId = TXC_NULL;
batchData.regCount = 2;
/* First, get the device type. */
deviceType = ENVOY_DbGetDeviceType (handle);
if ((deviceType != ENVOY_CE2) && (deviceType != ENVOY_CE4) )
{
return TXC_DEVICE_NOT_FOUND_ERR;
}
if (port == ENVOY_MAC_ALL_PORTS)
{
if (deviceType == ENVOY_CE2)
{
regData[0].mask = 0xFFFF; /* reg0: input; reg1: output */
regData[1].mask = 0xFFFF;
}
else /* that is, deviceType == ENVOY_CE4 */
{
regData[0].mask = 0xFFFFFFFF; /* reg0: input; reg1: output */
regData[1].mask = 0xFFFFFFFF;
}
}
else
{
regData[0].mask = 1 << port; /* reg0: input; reg1: output */
regData[1].mask = 1 << port;
}
/* determine the base address of the device */
baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
fifoIngressCtrlPtr = (ENVOY_IFIFO_PORT_CTRL_STRUCT *) (baseAddr + ENVOY_IFIFO_PORT_CTRL_OFFSET);
regData[0].addr = (TXC_REG_32 *) &fifoIngressCtrlPtr->iFifoPortCtrlReg;
fifoEgressCtrlPtr = (ENVOY_EFIFO_PORT_CTRL_STRUCT *) (baseAddr + ENVOY_EFIFO_PORT_CTRL_OFFSET);
regData[1].addr = (TXC_REG_32 *) &fifoEgressCtrlPtr->eFifoPortCtrlReg;
/* Set Port Status */
switch (fifoPortCtrlPtr->fifoPortEnableMode)
{
case ENVOY_FIFO_NO_DIR_ENABLED:
regData[0].data = 0;
regData[1].data = 0;
break;
case ENVOY_FIFO_BOTH_DIR_ENABLED:
regData[0].data = regData[0].mask;
regData[1].data = regData[1].mask;
break;
case ENVOY_FIFO_INGRESS_ENABLED_ONLY:
regData[0].data = regData[0].mask;
regData[1].data = 0;
break;
case ENVOY_FIFO_EGRESS_ENABLED_ONLY:
regData[0].data = 0;
regData[1].data = regData[1].mask;
break;
default:
return error = TXC_GEN_ERR; /* added so that lint will be happy */
break; /* however, it should never get here */
}
error = TXC_BatchReg32BitWrite (&batchData);
/* release the semaphore */
return error;
}
/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************
FUNCTION: ENVOY_GetFifoPortCtrlReal
DESCRIPTION: This function actually processess the TXC_ENVOY_FifoPortCtrlGet
API function.
INPUTS: Same as TXC_ENVOY_FifoPortCtrlSet
RETURNS: TXC_NO_ERR or an appropriate specific error code listed in
appendix.
CAVEATS: None.
REVISION HISTORY:
Rev Date Author Description
----- ------- ------------ -----------------
0.5.0 6/03/04 F. Giannella Initial release (beta)
*--------------------------------------------------------------------------*/
TXC_U16BIT ENVOY_GetFifoPortCtrlReal (TXC_U16BIT handle, TXC_U16BIT port,
ENVOY_FIFO_PORT_CTRL_STRUCT *fifoPortCtrlPtr)
{
TXC_U16BIT error = TXC_NO_ERR;
TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
TXC_REG_ACCESS_32BIT_STRUCT regData[4];
TXC_REG_32 *baseAddr;
ENVOY_IFIFO_PORT_CTRL_STRUCT *fifoIngressCtrlPtr;
ENVOY_EFIFO_PORT_CTRL_STRUCT *fifoEgressCtrlPtr;
/* First, fill the batch platform header. This function requires 5
registers to be read */
memset (®Data[0], 0, (2 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
batchData.regDataPtr = ®Data[0];
batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
batchData.semId = ENVOY_DbGetSemId();
batchData.regCount = 2;
/* determine the base address of the device */
baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
/* Setup the addresses and masks to read for FIFO interface */
fifoIngressCtrlPtr = (ENVOY_IFIFO_PORT_CTRL_STRUCT *) (baseAddr + ENVOY_IFIFO_PORT_CTRL_OFFSET);
regData[0].addr = (TXC_REG_32 *) &fifoIngressCtrlPtr->iFifoPortCtrlReg;
fifoEgressCtrlPtr = (ENVOY_EFIFO_PORT_CTRL_STRUCT *) (baseAddr + ENVOY_EFIFO_PORT_CTRL_OFFSET);
regData[1].addr = (TXC_REG_32 *) &fifoEgressCtrlPtr->eFifoPortCtrlReg;
/* reg0: input; reg1: output */
regData[0].mask = 1 << port;
regData[1].mask = 1 << port;
/* Read the registers and return the data */
error = TXC_BatchReg32BitRead (&batchData);
if (error == TXC_NO_ERR)
{
if ((regData[0].data == 0 ) && (regData[1].data == 0))
{
fifoPortCtrlPtr->fifoPortEnableMode = ENVOY_FIFO_NO_DIR_ENABLED;
}
else if ((regData[0].data != 0 ) && (regData[1].data != 0))
{
fifoPortCtrlPtr->fifoPortEnableMode = ENVOY_FIFO_BOTH_DIR_ENABLED;
}
else if ((regData[0].data != 0 ) && (regData[1].data == 0))
{
fifoPortCtrlPtr->fifoPortEnableMode = ENVOY_FIFO_INGRESS_ENABLED_ONLY;
}
else
{
fifoPortCtrlPtr->fifoPortEnableMode = ENVOY_FIFO_EGRESS_ENABLED_ONLY;
}
}
return error;
}
/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************
FUNCTION: ENVOY_RtrvFifoPortStatisticsReal
DESCRIPTION: This function actually processess the TXC_ENVOY_FifoPortStatisticsRtrv
API function.
INPUTS: Same as TXC_ENVOY_FifoPortStatisticsRtrv
RETURNS: TXC_NO_ERR or an appropriate specific error code listed in
appendix.
CAVEATS: None
REVISION HISTORY:
Rev Date Author Description
----- ------- ------------ -----------------
0.5.0 6/03/04 F. Giannella Initial release (beta)
*--------------------------------------------------------------------------*/
TXC_U16BIT ENVOY_RtrvFifoPortStatisticsReal (TXC_U16BIT handle, TXC_U16BIT port,
ENVOY_FIFO_PORT_STATISTICS_STRUCT *fifoPortStatisticsDataPtr)
{
TXC_U16BIT error = TXC_NO_ERR;
TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
TXC_REG_ACCESS_32BIT_STRUCT regData[2];
TXC_REG_32 *baseAddr;
TXC_U16BIT portIdx;
TXC_U16BIT startPort;
TXC_U16BIT endPort;
TXC_U16BIT portInc;
ENVOY_IFIFO_PORT_CNT_STRUCT *iFifoPortCntPtr;
ENVOY_EFIFO_PORT_CNT_STRUCT *eFifoPortCntPtr;
/* determine if one FIFO port is being reset or all ports */
GetFifoPortRange(handle, port, &startPort, &endPort, &portInc);
/* First, fill the batch platform header. This function requires 5
registers to be read */
memset (®Data[0], 0, (sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
batchData.regDataPtr = ®Data[0];
batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
batchData.semId = ENVOY_DbGetSemId();
batchData.regCount = 2;
/* MASKs */
regData[0].mask = 0xFFFFFFFF; /* reg0 (IFIFO): 2600 through 26FC */
regData[1].mask = 0xFFFFFFFF; /* reg1 (EFIFO): 2400 through 24FC */
/* determine the base address of the device */
baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
iFifoPortCntPtr = (ENVOY_IFIFO_PORT_CNT_STRUCT *) (baseAddr + ENVOY_IFIFO_PORT_CNT_OFFSET);
eFifoPortCntPtr = (ENVOY_EFIFO_PORT_CNT_STRUCT *) (baseAddr + ENVOY_EFIFO_PORT_CNT_OFFSET);
for (portIdx = startPort; portIdx < endPort; )
{
regData[0].addr = (TXC_REG_32 *) &iFifoPortCntPtr->iFifoPortCntReg[portIdx];
regData[1].addr = (TXC_REG_32 *) &eFifoPortCntPtr->eFifoPortCntReg[portIdx];
/* Read the registers and return the data */
error = TXC_BatchReg32BitRead (&batchData);
if (error == TXC_NO_ERR)
{
fifoPortStatisticsDataPtr->ingressFifoDroppedPktCounter[portIdx] = regData[0].data;
fifoPortStatisticsDataPtr->egressFifoDroppedPktCounter[portIdx] = regData[1].data;
}
portIdx += portInc;
}
return error;
}
/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************
FUNCTION: ENVOY_RtrvFifoStatusReal
DESCRIPTION: This function actually processess the TXC_ENVOY_FifoStatusRtrv
API function.
INPUTS: Same as TXC_ENVOY_FifoPortStatisticsRtrv
RETURNS: TXC_NO_ERR or an appropriate specific error code listed in
appendix.
CAVEATS: None
REVISION HISTORY:
Rev Date Author Description
----- ------- ------------ -----------------
0.5.0 6/03/04 F. Giannella Initial release (beta)
*--------------------------------------------------------------------------*/
TXC_U16BIT ENVOY_RtrvFifoStatusReal (TXC_U16BIT handle, TXC_U16BIT port,
ENVOY_FIFO_STATUS_STRUCT *fifoStatusDataPtr)
{
TXC_U16BIT error = TXC_NO_ERR;
TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
TXC_U16BIT deviceType;
TXC_REG_ACCESS_32BIT_STRUCT regData[5];
TXC_REG_32 *baseAddr;
TXC_U16BIT portIdx;
TXC_U16BIT startPort;
TXC_U16BIT endPort;
TXC_U16BIT portInc;
ENVOY_IFIFO_STATUS_STRUCT *iFifoStatusPtr;
ENVOY_EFIFO_STATUS_STRUCT *eFifoStatusPtr;
/* determine if one FIFO port is being reset or all ports */
GetFifoPortRange(handle, port, &startPort, &endPort, &portInc);
/* First, fill the batch platform header. This function requires 5
registers to be read */
memset (®Data[0], 0, (5 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
batchData.regDataPtr = ®Data[0];
batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
batchData.semId = ENVOY_DbGetSemId();
batchData.regCount = 5;
/* First, get the device type. */
deviceType = ENVOY_DbGetDeviceType (handle);
if ((deviceType != ENVOY_CE2) && (deviceType != ENVOY_CE4) )
{
return TXC_DEVICE_NOT_FOUND_ERR;
}
if (port == ENVOY_MAC_ALL_PORTS)
{
if (deviceType == ENVOY_CE2)
{
regData[0].mask = 0xFFFF; /* reg0: input; reg1: output */
regData[1].mask = 0xFFFF;
regData[2].mask = 0xFFFF;
regData[3].mask = 0xFFFF;
regData[4].mask = 0xFFFF;
}
else /* that is, deviceType == ENVOY_CE4 */
{
regData[0].mask = 0xFFFFFFFF; /* reg0: input; reg1: output */
regData[1].mask = 0xFFFFFFFF;
regData[2].mask = 0xFFFFFFFF;
regData[3].mask = 0xFFFFFFFF;
regData[4].mask = 0xFFFFFFFF;
}
}
else
{
regData[0].mask = 1 << port; /* reg0: input; reg1: output */
regData[1].mask = 1 << port;
regData[2].mask = 1 << port;
regData[3].mask = 1 << port;
regData[4].mask = 1 << port;
}
/* determine the base address of the device */
baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
iFifoStatusPtr = (ENVOY_IFIFO_STATUS_STRUCT *) (baseAddr + ENVOY_IFIFO_STATUS_OFFSET);
eFifoStatusPtr = (ENVOY_EFIFO_STATUS_STRUCT *) (baseAddr + ENVOY_EFIFO_STATUS_OFFSET);
regData[0].addr = (TXC_REG_32 *) &iFifoStatusPtr->iFifoFullStatusReg;
regData[1].addr = (TXC_REG_32 *) &iFifoStatusPtr->iFifoNearFullStatusReg;
regData[2].addr = (TXC_REG_32 *) &eFifoStatusPtr->eFifoFullStatusReg;
regData[3].addr = (TXC_REG_32 *) &eFifoStatusPtr->eFifoDisabledErrStatusReg;
regData[4].addr = (TXC_REG_32 *) &eFifoStatusPtr->eFifoSopErrStatusReg;
for (portIdx = startPort; portIdx < endPort; )
{
/* Read the registers and return the data */
error = TXC_BatchReg32BitRead (&batchData);
if (error == TXC_NO_ERR)
{
fifoStatusDataPtr->ingressFifoFullStatus[portIdx] = (regData[0].data) >> portIdx;
fifoStatusDataPtr->ingressFifoNearFullStatus[portIdx] = (regData[1].data) >> portIdx;
fifoStatusDataPtr->egressFifoFullStatus[portIdx] = (regData[2].data) >> portIdx;
fifoStatusDataPtr->egressFifoDisabledErrorStatus[portIdx] = (regData[3].data) >> portIdx;
fifoStatusDataPtr->egressFifoSopErrorStatus[portIdx] = (regData[4].data) >> portIdx;
}
portIdx += portInc;
}
return error;
}
#endif /* ENVOY_VIRTUAL_DEVICE_MODE */
/****************************************************************************
** End of Module **
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -