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

📄 txc_envoy_spi3_real.c

📁 TranSwitch Envoy CE2 & Envoy CE4 设备驱动及编程指南
💻 C
📖 第 1 页 / 共 5 页
字号:
   -----    -------      ------------         ----------------------
   0.5.0    6/03/04      F. Giannella         Initial release (beta)
 *--------------------------------------------------------------------------*/

TXC_U16BIT ENVOY_RtrvSpi3ExtGlobalCountersReal (TXC_U16BIT handle,
           TXC_IfSPI3_EXT_GLBL_CTR_STRUCT *spi3ExtGlobalCountersDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[3];
    TXC_REG_32 *baseAddr;
    ENVOY_ISPI_GLBL_CNT_STRUCT *spi3InputGlobalCtrsPtr;

    /* First, fill the batch platform header. This function requires 5
       registers to be read */
    memset (&regData[0], 0, (3 * sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[0];
    batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
    batchData.semId = ENVOY_DbGetSemId();
    batchData.regCount = 3;

    /* MASKs */
    regData[0].mask = 0xFFFFFFFF;    /* reg0: 2060 */
    regData[1].mask = 0xFFFFFFFF;    /* reg1: 2064 */
    regData[2].mask = 0xFFFFFFFF;    /* reg2: 2068 */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
    spi3InputGlobalCtrsPtr = (ENVOY_ISPI_GLBL_CNT_STRUCT *) (baseAddr + ENVOY_ISPI_GLBL_CNT_OFFSET);

    regData[0].addr = (TXC_REG_32 *) &spi3InputGlobalCtrsPtr->iSpi3GlblParErrCntReg;
    regData[1].addr = (TXC_REG_32 *) &spi3InputGlobalCtrsPtr->iSpi3GlblSopErrCntReg;
    regData[2].addr = (TXC_REG_32 *) &spi3InputGlobalCtrsPtr->iSpi3GlblDiscardCntReg;

    /* Read the registers and return the data */

    error = TXC_BatchReg32BitRead (&batchData);

    if (error == TXC_NO_ERR)
    {
        spi3ExtGlobalCountersDataPtr->globalCtrDeviceExtension.envoyCe2Ce4GlobalCtrAttr.inputSpi3ParityCheckErrorCounter = regData[0].data;
        spi3ExtGlobalCountersDataPtr->globalCtrDeviceExtension.envoyCe2Ce4GlobalCtrAttr.inputSpi3SopErrorCounter = regData[1].data;
        spi3ExtGlobalCountersDataPtr->globalCtrDeviceExtension.envoyCe2Ce4GlobalCtrAttr.inputSpi3DiscardCounter = regData[2].data;
    }
    return error;
}


/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************

   FUNCTION:  ENVOY_RtrvSpi3InputGlobalStatusReal

   DESCRIPTION: This function actually processess the TXC_IfSPI3_Ext_InputGlobalStatusRtrv
                API function.

   INPUTS:  Same as TXC_IfSPI3_Ext_InputGlobalStatusRtrv except for the interfaceId

   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_RtrvSpi3InputGlobalStatusReal (TXC_U16BIT handle,
        TXC_IfSPI3_EXT_INPUT_GLBL_STATUS_STRUCT *spi3InputGlobalStatusDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[1];
    TXC_REG_32 *baseAddr;
    ENVOY_ISPI_GLBL_STATUS_STRUCT *spi3InputGlobalStatusPtr;

    /* 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 = 1;

    /* MASKs */
    regData[0].mask = 0xFF;    /* reg0: 2040 */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
    spi3InputGlobalStatusPtr = (ENVOY_ISPI_GLBL_STATUS_STRUCT *) (baseAddr + ENVOY_ISPI_GLBL_STATUS_OFFSET);

    regData[0].addr = (TXC_REG_32 *) &spi3InputGlobalStatusPtr->iSpi3StatusReg;

    /* Read the registers and return the data */

    error = TXC_BatchReg32BitRead (&batchData);

    if (error == TXC_NO_ERR)
    {
        spi3InputGlobalStatusDataPtr->globalStatusDeviceExtension.envoyCe2Ce4GlobalStatusAttr.inputSpi3OverflowDropStatus = (regData[0].data) & 0x1;
        spi3InputGlobalStatusDataPtr->globalStatusDeviceExtension.envoyCe2Ce4GlobalStatusAttr.inputSpi3ParityCheckErrorStatus = (regData[0].data >> 1) & 0x1;
        spi3InputGlobalStatusDataPtr->globalStatusDeviceExtension.envoyCe2Ce4GlobalStatusAttr.inputSpi3PacketErrorStatus = (regData[0].data >> 2) & 0x1;
        spi3InputGlobalStatusDataPtr->globalStatusDeviceExtension.envoyCe2Ce4GlobalStatusAttr.inputSpi3SopErrorStatus = (regData[0].data >>3) & 0x1;
    }
    return error;
}



/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************/
/*--------------------------------------------------------------------------*

   FUNCTION:  ENVOY_SetSpi3OutputPortCfgReal

   DESCRIPTION: This function actually processess the TXC_IfSPI3_Ext_OutputPortCfgSet
                API function.

   INPUTS:  Same as TXC_IfSPI3_Ext_OutputPortCfgSet except for the interfaceId

   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_SetSpi3OutputPortCfgReal (TXC_U16BIT handle, TXC_U16BIT port,
                          TXC_IfSPI3_EXT_OUTPUT_PORT_CFG_STRUCT  *spi3OutputPortCfgDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[1];
    TXC_REG_32 * baseAddr;
    TXC_U16BIT portIdx;
    TXC_U16BIT startPort;
    TXC_U16BIT endPort;
    TXC_U16BIT portInc;
    TXC_SEM_ID semId;
    TXC_U16BIT rtosError;
    ENVOY_OSPI_AGGR_TAG_STRUCT *spi3OutputTagPtr;

    /* determine if one SPI-3 port is being reset or all ports */
    GetSpi3PortRange(handle, port, &startPort, &endPort, &portInc); 


    /* First, fill the batch platform header. This function requires 2
       registers to be written */
    memset (&regData[0], 0, (sizeof(TXC_REG_ACCESS_32BIT_STRUCT) ) );
    batchData.regDataPtr = &regData[0];
    batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
    batchData.semId = TXC_NULL;
    batchData.regCount = 1;

    regData[0].mask = 0xFFFFFFFF;      /* reg0: 2280 through 22FC */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);

    spi3OutputTagPtr = (ENVOY_OSPI_AGGR_TAG_STRUCT *) (baseAddr + ENVOY_OSPI_AGGR_TAG_OFFSET);

        /* loop thru all ports setting, then clearing the appropriate reset bit */
    for (portIdx = startPort; portIdx < endPort; )
    {
        regData[0].addr = (TXC_REG_32 *) &spi3OutputTagPtr->oSpi3PortAggrTagReg[portIdx];

        regData[0].data = spi3OutputPortCfgDataPtr->outputPortDeviceExtension.envoyCe2Ce4OutputPortAttr.outputSpi3AggrTag;

        /* Semaphore protect the writing of the device POS phy config and the
           writing of the L3 emulation block registers. */
        semId = ENVOY_DbGetSemId();
        rtosError = TXC_SemWait (semId, TXC_OS_SEM_WAIT_FOREVER);
        if (rtosError != TXC_NO_ERR)
        {
            return TXC_OS_RESOURCE_ERR;
        }
        error = TXC_BatchReg32BitWrite (&batchData);
        /* release the semaphore */
        rtosError = TXC_SemPost (semId);
        if (rtosError != TXC_NO_ERR)
        {
            return TXC_OS_RESOURCE_ERR;
        }
        portIdx = portIdx + portInc;
    }
    return error;
}



/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************

   FUNCTION:  ENVOY_GetSpi3OutputPortCfgReal

   DESCRIPTION: This function actually processess the TXC_IfSPI3_Ext_OutputPortCfgGet
                API function.

   INPUTS:  Same as TXC_IfSPI3_Ext_OutputPortCfgGet except for the interfaceId

   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_GetSpi3OutputPortCfgReal (TXC_U16BIT handle,TXC_U16BIT port,
                          TXC_IfSPI3_EXT_OUTPUT_PORT_CFG_STRUCT  *spi3OutputPortCfgDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[1];
    TXC_REG_32            *baseAddr;
    ENVOY_OSPI_AGGR_TAG_STRUCT *spi3OutputTagPtr;

    /* First, fill the batch platform header. This function requires 1
       register 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 = 1;

    /* MASKs */
    regData[0].mask = 0xFFFFFFFF;      /* reg0: 2280 through 22FC */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
    spi3OutputTagPtr = (ENVOY_OSPI_AGGR_TAG_STRUCT *) (baseAddr + ENVOY_OSPI_AGGR_TAG_OFFSET);

    regData[0].addr = (TXC_REG_32 *) &spi3OutputTagPtr->oSpi3PortAggrTagReg[port];

    /* Read the registers and return the data */

    error = TXC_BatchReg32BitRead (&batchData);

    if (error == TXC_NO_ERR)
    {
        spi3OutputPortCfgDataPtr->outputPortDeviceExtension.envoyCe2Ce4OutputPortAttr.outputSpi3AggrTag = regData[0].data;
    }
    return error;
}



/************************************************************************************/
/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/
/************************************************************************************

   FUNCTION:  ENVOY_RtrvSpi3PortStatisticsReal

   DESCRIPTION: This function actually processess the TXC_IfSPI3_PortStatisticsRtrv
                API function.

   INPUTS:  Same as TXC_IfSPI3_PortStatisticsRtrv except for the interfaceId

   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_RtrvSpi3PortStatisticsReal (TXC_U16BIT handle, TXC_U16BIT port,
                         TXC_IfSPI3_PORT_STATISTICS_STRUCT *spi3PortStatisticsDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[1];
    TXC_REG_32 *baseAddr;
    TXC_U16BIT portIdx;
    TXC_U16BIT startPort;
    TXC_U16BIT endPort;
    TXC_U16BIT portInc;
    ENVOY_ISPI_PORT_CNT_STRUCT *spi3InputPortCntPtr;

    /* determine if one SPI-3 port is being reset or all ports */
    GetSpi3PortRange(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 = 1;

    /* MASKs */
    regData[0].mask = 0xFFFFFFFF;    /* reg0: 2080 through 20FC */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
    spi3InputPortCntPtr = (ENVOY_ISPI_PORT_CNT_STRUCT *) (baseAddr + ENVOY_ISPI_PER_PORT_CNT_OFFSET);

    for (portIdx = startPort; portIdx < endPort; )
    {
        regData[0].addr = (TXC_REG_32 *) &spi3InputPortCntPtr->iSpi3PktErrPortCntReg[portIdx];

        /* Read the registers and return the data */

        error = TXC_BatchReg32BitRead (&batchData);

        if (error == TXC_NO_ERR)
        {
            spi3PortStatisticsDataPtr->inputSpi3ErroredPktCounter[portIdx] = regData[0].data;
            spi3PortStatisticsDataPtr->inputSpi3UnerroredPktCounter[portIdx] = 0;
            spi3PortStatisticsDataPtr->inputSpi3DiscardPktCounter[portIdx] = 0;
            spi3PortStatisticsDataPtr->outputSpi3PktCounter[portIdx] = 0;
            spi3PortStatisticsDataPtr->outputSpi3DiscardPktCounter[portIdx] = 0;
        }
        portIdx += portInc;
    }
    return error;
}



#endif /* not ENVOY_VIRTUAL_DEVICE_MODE */
/****************************************************************************
 **                              End of Module                             **
 ****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -