📄 txc_envoy_mac_real.c
字号:
/* 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 = ®Data[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 (®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 = 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 + -