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

📄 txc_envoy_mac_real.c

📁 TranSwitch Envoy CE2 & Envoy CE4 设备驱动及编程指南
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* MAC address is six bytes */
    regData[0].mask = 0xFFFFFFFF;
    regData[1].mask = 0xFFFF0000;
    regData[2].mask = 0x0000F037;

    /* b2bIPG and minIFG */ 
    regData[3].mask = 0x0000FF7F;
    regData[4].mask = 0x0000FFFF;

    /* Read the registers and return the data */    
    error = TXC_BatchReg32BitRead (&batchData);
    if (error == TXC_NO_ERR)
    {
        /* Copy the MAC Address */
        macIfaceDataPtr->stationAddr [0] = (regData[0].data >> 24) & 0x000000FF;
        macIfaceDataPtr->stationAddr [1] = (regData[0].data >> 16) & 0x000000FF;
        macIfaceDataPtr->stationAddr [2] = (regData[0].data >> 8) & 0x000000FF;
        macIfaceDataPtr->stationAddr [3] = regData[0].data & 0x000000FF;
        macIfaceDataPtr->stationAddr [4] = (regData[1].data >> 24) & 0x000000FF;
        macIfaceDataPtr->stationAddr [5] = (regData[1].data >> 16) & 0x000000FF;

        macIfaceDataPtr->fullDuplexEnable = (regData[2].data) & 0x1;

        macIfaceDataPtr->ingressFrameLenCheckEnable = ((regData[2].data) >> 4) & 0x1;

        macIfaceDataPtr->egressPadAndCrcAppendMode = ((regData[2].data) >> 1) & 0x3;

        macIfaceDataPtr->hugeFrameEnable = ((regData[2].data) >> 5) & 0x1;

        macIfaceDataPtr->preambleLen = ((regData[2].data) >> 12) & 0xF;

        macIfaceDataPtr->b2bIPG = (regData[3].data) & 0x7F;

        macIfaceDataPtr->minIFG = ((regData[3].data) >> 8) & 0xFF;

        macIfaceDataPtr->maxFrameLen = (regData[4].data) & 0xFFFF;
    }
    return error;
}




/*--------------------------------------------------------------------------*

   FUNCTION:  ENVOY_SetMacOperationalStateReal
                                                                             
   DESCRIPTION: This function actually processess the TXC_IfMAC_OperationalStateSet
                                                                             
   INPUTS:                              
                                                                             
   RETURNS:  TXC_NO_ERR or an appropriate specific error code listed in      
   appendix.                                                                 
                                                                             
   CAVEATS:


   REVISION HISTORY:

    Rev       Date          Author               Description
   -----    -------      ------------         -----------------
   0.5.0    6/03/04      F. Giannella         Initial release (beta)
 *--------------------------------------------------------------------------*/

TXC_U16BIT ENVOY_SetMacOperationalStateReal(TXC_U16BIT handle, TXC_U16BIT port, 
             TXC_IfMAC_OPERATIONAL_STATE_STRUCT *macOperationalStateDataPtr)
{
    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_REG_32 *portAddr;
    TXC_U16BIT portIdx;
    TXC_U16BIT endPort;  
    TXC_U16BIT startPort;
    TXC_U16BIT portInc;
    /* TXC_U16BIT deviceType; */
    ENVOY_MAC_CONFIG_STRUCT *macCfgPtr;
    
    /* First, fill the batch platform header. This function requires 4
       registers to be written */
    batchData.regDataPtr = &regData[0];
    batchData.writeVerifyFlag = TXC_WRITE_VERIFY_FLAG;
    batchData.semId = ENVOY_DbGetSemId();
    batchData.regCount = 1;

    memset ( (char *)regData, 0, sizeof(regData) );

    /* determine if one MAC port is being configured or all ports */
    GetMacPortRange(handle, port, &startPort, &endPort, &portInc); 
        
    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);

    regData[0].mask = 0x0000005;

    switch (macOperationalStateDataPtr->macTransferEnableMode)
    {
        case TXC_IfMAC_NO_DIR_ENABLED:          /* disable transmit and receive */
            regData[0].data = 0x0;            
            break;                              


        case TXC_IfMAC_INGRESS_ENABLED_ONLY:    /* enable receive, disable transmit */
            regData[0].data = 0x4;            
            break;                              


        case TXC_IfMAC_EGRESS_ENABLED_ONLY:     /* disable receive, enable transmit */
            regData[0].data = 0x1;            
            break;                              
                                                
        case TXC_IfMAC_BOTH_DIR_ENABLED:        /* enable both receive and transmit */
            regData[0].data = 0x5;            
            break;                              
                                                 
        default:
            return error = TXC_INVALID_PARM_ERR;  /* should never occur */
  
    } /* end of switch */

    /* loop thru all ports setting up the MAC interface parameters */
    for (portIdx = startPort; portIdx < endPort; )
    {
        portAddr = baseAddr + macCfgOffset[portIdx];
        macCfgPtr = (ENVOY_MAC_CONFIG_STRUCT *) portAddr;

        /* Setup the addresses to write the MAC enable/disable port */
        regData[0].addr = (TXC_REG_32 *) &(macCfgPtr->cfg1Reg);
      
        error = TXC_BatchReg32BitWrite (&batchData); 
        if (error != TXC_NO_ERR)
            return(error);

        portIdx = portIdx + portInc;
    }
    return error;
}





/*--------------------------------------------------------------------------*

   FUNCTION:  ENVOY_GetMacOperationalStateReal

   DESCRIPTION: This function actually processess the ENVOY_EthernetPortConfigRealGet

   INPUTS:  Same as ENVOY_EthernetPortConfigRealGet

   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_GetMacOperationalStateReal(TXC_U16BIT handle, TXC_U16BIT port, 
             TXC_IfMAC_OPERATIONAL_STATE_STRUCT *macOperationalStateDataPtr)
                                 
{
    TXC_U16BIT error;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT batchData;
    TXC_REG_ACCESS_32BIT_STRUCT regData[2];
    TXC_REG_32              *baseAddr;
    ENVOY_MAC_CONFIG_STRUCT *macCfgPtr;
    TXC_REG_32  tmpdata1;


    /* First, fill the batch platform header. This function requires 4
       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 = 1;  /* need to read register 0x4000 only */

    /* determine the base address of the device */
    baseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);
    macCfgPtr = (ENVOY_MAC_CONFIG_STRUCT *) (baseAddr+macCfgOffset[port] );

    /* Setup the addresses and masks to read for MAC interface */
    regData[0].addr = (TXC_REG_32 *) &(macCfgPtr->cfg1Reg);   /* reg 0x4000 */

    /* Tx enable/Rx enable: bits 0 and 2 of register 0x4000, respectively */
    regData[0].mask = 0x005;

    /* Read the registers and return the data */    
    error = TXC_BatchReg32BitRead (&batchData);
    if (error == TXC_NO_ERR)
    {
        tmpdata1 = (regData[0].data) & 0x5;
        switch (tmpdata1)
        {
            case 0:          /* disable transmit and receive */
                macOperationalStateDataPtr->macTransferEnableMode = TXC_IfMAC_NO_DIR_ENABLED;
                break;

            case 4:    /* enable receive, disable transmit */
                macOperationalStateDataPtr->macTransferEnableMode = TXC_IfMAC_INGRESS_ENABLED_ONLY;
                break;

            case 1:     /* disable receive, enable transmit */
                macOperationalStateDataPtr->macTransferEnableMode = TXC_IfMAC_EGRESS_ENABLED_ONLY;
                break;

            case 5:        /* enable both receive and transmit */
                macOperationalStateDataPtr->macTransferEnableMode = TXC_IfMAC_BOTH_DIR_ENABLED;
                break;                              
                                                 
            default:
                error = TXC_INVALID_PARM_ERR;  /* should never happen */
                break;

        } /* end of switch */
    }
    return error;
}





/*--------------------------------------------------------------------------*
                                                                             
   FUNCTION:  ENVOY_SetMacHalfDuplexReal                                                                
                                                                             
   DESCRIPTION: This function actually processess the ENVOY_SetMacHalfDuplex                                          
                                                                             
   INPUTS:  Same as ENVOY_SetMacHalfDuplex                                                                  
                                                                             
   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_SetMacHalfDuplexReal(TXC_U16BIT handle, TXC_U16BIT port,
                     TXC_IfMAC_HALF_DUPLEX_STRUCT * macHalfDuplexDataPtr)
{
    TXC_U16BIT error = TXC_NO_ERR;
    TXC_BATCH_REG_ACCESS_32BIT_STRUCT macBatchData;
    TXC_REG_ACCESS_32BIT_STRUCT macRegData[3];
    TXC_REG_32 * macBaseAddr;
    TXC_REG_32 * macPortAddr; 
    TXC_U16BIT portIdx;
    TXC_U16BIT endPort;
    TXC_U16BIT startPort;
    TXC_U16BIT portInc;
    ENVOY_MAC_CONFIG_STRUCT * macCfgPtr;

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

    /* Setup the data and mask for IPG parts 1 and 2 (register 0x4008)*/
    macRegData[0].mask = 0x7F7F0000;
    macRegData[0].data = ((macHalfDuplexDataPtr->nonB2bIPGpart1) << 24) |
                          ((macHalfDuplexDataPtr->nonB2bIPGpart2) << 16);

    macRegData[1].mask = 0x00FFF3FF;
    /* Setup the data and mask for the MAC half duplex registers */

    macRegData[1].data = 0; /* initialize it setting all Booleans to disable */

    if (macHalfDuplexDataPtr->excessiveDeferEnable == TXC_TRUE)
    {
        macRegData[1].data = 0x00010000;
    }
    if (macHalfDuplexDataPtr->noBackoffEnable == TXC_TRUE)
    {
        macRegData[1].data |= 0x00020000;
    }
    if (macHalfDuplexDataPtr->backPressureNoBackoffEnable == TXC_TRUE)
    {
        macRegData[1].data |= 0x00040000;
    }
    if (macHalfDuplexDataPtr->altBinExpBackoffTrunc == TXC_TRUE)
    {
        macRegData[1].data |= 0x00080000;
    }

    /* Add in the alt backoff truncation, collision window and retrans max values */
    macRegData[1].data |= ((macHalfDuplexDataPtr->altBinExpBackoffTrunc) << 20);
    macRegData[1].data |= (macHalfDuplexDataPtr->collisionWindow);
    macRegData[1].data |= ((macHalfDuplexDataPtr->retranMax) << 12);

    /* determine if one MAC port is being configured or all ports */
    GetMacPortRange(handle, port, &startPort, &endPort, &portInc); 
        
    /* determine the base address of the device */
    macBaseAddr = (TXC_REG_32 *) ENVOY_DbGetDeviceAddr (handle);

    /* loop thru all ports setting up the MAC interface parameters */
    for (portIdx = startPort; portIdx < endPort; )
    {
        macPortAddr = macBaseAddr + macCfgOffset[portIdx];
        macCfgPtr = (ENVOY_MAC_CONFIG_STRUCT *) macPortAddr;
        /* Setup the addresses to write the MAC interface config */
        macRegData[0].addr = (TXC_REG_32 *) &(macCfgPtr->ipgIfgReg);
        macRegData[1].addr = (TXC_REG_32 *) &(macCfgPtr->halfDplxReg);
        error = TXC_BatchReg32BitWrite (&macBatchData); 
        if (error != TXC_NO_ERR)
            break;

        portIdx = portIdx + portInc;
    }

  
    return error;
}




/*--------------------------------------------------------------------------*

   FUNCTION:  ENVOY_GetMacHalfDuplexReal

   DESCRIPTION: This function actually processess the ENVOY_GetMacHalfDuplex
                                                                             
   INPUTS:  Same as ENVOY_GetMacHalfDuplex

⌨️ 快捷键说明

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