⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txc_envoy_fifo_real.c

📁 TranSwitch Envoy CE2 & Envoy CE4 设备驱动及编程指南
💻 C
📖 第 1 页 / 共 3 页
字号:

   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 (&regData[0], 0, (2 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[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 (&regData[0], 0, (2 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[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 (&regData[0], 0, (sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[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 (&regData[0], 0, (5 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[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 + -