📄 ixethaccmac.c
字号:
IX_ETH_ACC_MAC_SLOT_TIME_DEFAULT); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_INT_CLK_THRESH, IX_ETH_ACC_MAC_INT_CLK_THRESH_DEFAULT); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_BUF_SIZE_TX, IX_ETH_ACC_MAC_BUF_SIZE_TX_DEFAULT); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, IX_ETH_ACC_TX_CNTRL1_DEFAULT); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, IX_ETH_ACC_RX_CNTRL1_DEFAULT); /* set the global state */ ixEthAccMacState[portId].portDisableState = ACTIVE; ixEthAccMacState[portId].enabled = TRUE; /* Update MAC State */ ixEthAccMacStateUpdate(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortLoopbackEnable(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* read register */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); /* update register */ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval | IX_ETH_ACC_RX_CNTRL1_LOOP_EN); return IX_ETH_ACC_SUCCESS;}PRIVATE voidixEthAccNpeLoopbackMessageCallback (IxNpeMhNpeId npeId, IxNpeMhMessage msg){ IxEthAccPortId portId = IX_ETHNPE_NODE_AND_PORT_TO_PHYSICAL_ID(npeId,0);#ifndef NDEBUG /* Prudent to at least check the port is within range */ if (portId >= IX_ETH_ACC_NUMBER_OF_PORTS) { IX_ETH_ACC_FATAL_LOG("IXETHACC:ixEthAccNpeLoopbackMessageCallback: Illegal port: %u\n", (UINT32) portId, 0, 0, 0, 0, 0); return; }#endif /* unlock message reception mutex */ ixOsalMutexUnlock(&ixEthAccMacState[portId].npeLoopbackMessageLock);}IxEthAccStatus ixEthAccNpeLoopbackEnablePriv(IxEthAccPortId portId){ IX_STATUS npeMhStatus; IxNpeMhMessage message; IxEthAccStatus status = IX_ETH_ACC_SUCCESS; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* enable NPE loopback (lsb of the message contains the value 1) */ message.data[0] = (IX_ETHNPE_SETLOOPBACK_MODE << IX_ETH_ACC_MAC_MSGID_SHL) | (IX_ETHNPE_PHYSICAL_ID_TO_LOGICAL_ID(portId) << IX_ETH_ACC_MAC_PORTID_SHL) | 0x01; message.data[1] = 0; npeMhStatus = ixNpeMhMessageWithResponseSend(IX_ETHNPE_PHYSICAL_ID_TO_NODE(portId), message, IX_ETHNPE_SETLOOPBACK_MODE_ACK, ixEthAccNpeLoopbackMessageCallback, IX_NPEMH_SEND_RETRIES_DEFAULT); if (npeMhStatus != IX_SUCCESS) { status = IX_ETH_ACC_FAIL; } else { /* wait for NPE loopbackEnable response */ if (ixOsalMutexLock(&ixEthAccMacState[portId].npeLoopbackMessageLock, IX_ETH_ACC_PORT_DISABLE_DELAY_MSECS) != IX_SUCCESS) { status = IX_ETH_ACC_FAIL; } } return status;}IxEthAccStatus ixEthAccPortTxEnablePriv(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* read register */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); /* update register */ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval | IX_ETH_ACC_TX_CNTRL1_TX_EN); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortRxEnablePriv(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* read register */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); /* update register */ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval | IX_ETH_ACC_RX_CNTRL1_RX_EN); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortLoopbackDisable(IxEthAccPortId portId){ UINT32 regval; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /*disable MAC loopabck */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, (regval & ~IX_ETH_ACC_RX_CNTRL1_LOOP_EN)); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccNpeLoopbackDisablePriv(IxEthAccPortId portId){ IX_STATUS npeMhStatus; IxNpeMhMessage message; IxEthAccStatus status = IX_ETH_ACC_SUCCESS; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* disable NPE loopback (lsb of the message contains the value 0) */ message.data[0] = (IX_ETHNPE_SETLOOPBACK_MODE << IX_ETH_ACC_MAC_MSGID_SHL) | (IX_ETHNPE_PHYSICAL_ID_TO_LOGICAL_ID(portId) << IX_ETH_ACC_MAC_PORTID_SHL); message.data[1] = 0; npeMhStatus = ixNpeMhMessageWithResponseSend(IX_ETHNPE_PHYSICAL_ID_TO_NODE(portId), message, IX_ETHNPE_SETLOOPBACK_MODE_ACK, ixEthAccNpeLoopbackMessageCallback, IX_NPEMH_SEND_RETRIES_DEFAULT); if (npeMhStatus != IX_SUCCESS) { status = IX_ETH_ACC_FAIL; } else { /* wait for NPE loopbackEnable response */ if (ixOsalMutexLock(&ixEthAccMacState[portId].npeLoopbackMessageLock, IX_ETH_ACC_PORT_DISABLE_DELAY_MSECS) != IX_SUCCESS) { status = IX_ETH_ACC_FAIL; } } return status;}IxEthAccStatus ixEthAccPortTxDisablePriv(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* read register */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); /* update register */ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, (regval & ~IX_ETH_ACC_TX_CNTRL1_TX_EN)); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortRxDisablePriv(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* read register */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); /* update register */ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, (regval & ~IX_ETH_ACC_RX_CNTRL1_RX_EN)); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortPromiscuousModeClearPriv(IxEthAccPortId portId){ UINT32 regval; /* Turn off promiscuous mode */ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /*set bit 5 of Rx control 1 - enable address filtering*/ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval | IX_ETH_ACC_RX_CNTRL1_ADDR_FLTR_EN); ixEthAccMacState[portId].promiscuous = FALSE; ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortPromiscuousModeSetPriv(IxEthAccPortId portId){ UINT32 regval; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* * Set bit 5 of Rx control 1 - We enable address filtering even in * promiscuous mode because we want the MAC to set the appropriate * bits in m_flags which doesn't happen if we turn off filtering. */ REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, regval | IX_ETH_ACC_RX_CNTRL1_ADDR_FLTR_EN); ixEthAccMacState[portId].promiscuous = TRUE; ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortUnicastMacAddressSetPriv (IxEthAccPortId portId, IxEthAccMacAddr *macAddr){ UINT32 i; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } if (macAddr == NULL) { return IX_ETH_ACC_FAIL; } if ( macAddr->macAddress[0] & IX_ETH_ACC_ETH_MAC_BCAST_MCAST_BIT ) { /* This is a multicast/broadcast address cant set it ! */ return IX_ETH_ACC_FAIL; } if ( macAddr->macAddress[0] == 0 && macAddr->macAddress[1] == 0 && macAddr->macAddress[2] == 0 && macAddr->macAddress[3] == 0 && macAddr->macAddress[4] == 0 && macAddr->macAddress[5] == 0 ) { /* This is an invalid mac address cant set it ! */ return IX_ETH_ACC_FAIL; } /* update the MAC address in the ethernet database */ if (ixEthDBPortAddressSet(portId, (IxEthDBMacAddr *) macAddr) != IX_ETH_DB_SUCCESS) { return IX_ETH_ACC_FAIL; } /*Set the Unicast MAC to the specified value*/ for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++) { REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_UNI_ADDR_1 + i*sizeof(UINT32), macAddr->macAddress[i]); } ixEthAccMacState[portId].initDone = TRUE; return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortUnicastMacAddressGetPriv (IxEthAccPortId portId, IxEthAccMacAddr *macAddr){ /*Return the current value of the Unicast MAC from h/w for the specified port*/ UINT32 i; if (macAddr == NULL) { return IX_ETH_ACC_FAIL; } else { /* always zero out the address */ IX_ETH_ACC_MEMSET(macAddr, 0, IX_IEEE803_MAC_ADDRESS_SIZE); } IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_MAC_UNINITIALIZED); } if(!ixEthAccMacState[portId].initDone) { return (IX_ETH_ACC_MAC_UNINITIALIZED); } for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++) { REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_UNI_ADDR_1 + i*sizeof(UINT32), macAddr->macAddress[i]); } return IX_ETH_ACC_SUCCESS;}PRIVATE IxEthAccStatusixEthAccPortMulticastMacAddressGet (IxEthAccPortId portId, IxEthAccMacAddr *macAddr){ /*Return the current value of the Multicast MAC from h/w for the specified port*/ UINT32 i; for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++) { REG_READ(ixEthAccMacBase[portId],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -