📄 ixethaccmac.c
字号:
IX_ETH_ACC_MAC_ADDR_1 + i*sizeof(UINT32), macAddr->macAddress[i]); } return IX_ETH_ACC_SUCCESS;}PRIVATE IxEthAccStatusixEthAccPortMulticastMacFilterGet (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], IX_ETH_ACC_MAC_ADDR_MASK_1 + i*sizeof(UINT32), macAddr->macAddress[i]); } return IX_ETH_ACC_SUCCESS;}IxEthAccStatusixEthAccPortMulticastAddressJoinPriv (IxEthAccPortId portId, IxEthAccMacAddr *macAddr){ UINT32 i; IxEthAccMacAddr broadcastAddr = {{0xff,0xff,0xff,0xff,0xff,0xff}}; /*Check that the port parameter is valid*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /*Check that the mac address is valid*/ if(macAddr == NULL) { return IX_ETH_ACC_FAIL; } /* Check that this is a multicast address */ if (!(macAddr->macAddress[0] & IX_ETH_ACC_ETH_MAC_BCAST_MCAST_BIT)) { return IX_ETH_ACC_FAIL; } /* We don't add the Broadcast address */ if(ixEthAccMacEqual(&broadcastAddr, macAddr)) { return IX_ETH_ACC_FAIL; } for (i = 0; i<ixEthAccMacState[portId].mcastAddrIndex; i++) { /*Check if the current entry already match an existing matches*/ if(ixEthAccMacEqual(&ixEthAccMacState[portId].mcastAddrsTable[i], macAddr)) { /* Address found in the list and already configured, * return a success status */ return IX_ETH_ACC_SUCCESS; } } /* check for availability at the end of the current table */ if(ixEthAccMacState[portId].mcastAddrIndex >= IX_ETH_ACC_MAX_MULTICAST_ADDRESSES) { return IX_ETH_ACC_FAIL; } /*First add the address to the multicast table for the specified port*/ i=ixEthAccMacState[portId].mcastAddrIndex; memcpy(&ixEthAccMacState[portId].mcastAddrsTable[i], &macAddr->macAddress, IX_IEEE803_MAC_ADDRESS_SIZE); /*Increment the index into the table, this must be done here as MulticastAddressSet below needs to know about the latest entry. */ ixEthAccMacState[portId].mcastAddrIndex++; /*Then calculate the new value to be written to the address and address mask registers*/ ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatusixEthAccPortMulticastAddressJoinAllPriv (IxEthAccPortId portId){ IxEthAccMacAddr mcastMacAddr = {{0x1,0x0,0x0,0x0,0x0,0x0}}; /*Check that the port parameter is valid*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /* remove all entries from the database and * insert a multicast entry */ memcpy(&ixEthAccMacState[portId].mcastAddrsTable[0], &mcastMacAddr.macAddress, IX_IEEE803_MAC_ADDRESS_SIZE); ixEthAccMacState[portId].mcastAddrIndex = 1; ixEthAccMacState[portId].joinAll = TRUE; ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatusixEthAccPortMulticastAddressLeavePriv (IxEthAccPortId portId, IxEthAccMacAddr *macAddr){ UINT32 i; IxEthAccMacAddr mcastMacAddr = {{0x1,0x0,0x0,0x0,0x0,0x0}}; /*Check that the port parameter is valid*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /*Check that the mac address is valid*/ if(macAddr == NULL) { return IX_ETH_ACC_FAIL; } /* Remove this mac address from the mask for the specified port * we copy down all entries above the blanked entry, and * decrement the index */ i=0; while(i<ixEthAccMacState[portId].mcastAddrIndex) { /*Check if the current entry matches*/ if(ixEthAccMacEqual(&ixEthAccMacState[portId].mcastAddrsTable[i], macAddr)) { if(ixEthAccMacEqual(macAddr, &mcastMacAddr)) { ixEthAccMacState[portId].joinAll = FALSE; } /*Decrement the index into the multicast address table for the current port*/ ixEthAccMacState[portId].mcastAddrIndex--; /*Copy down all entries above the current entry*/ while(i<ixEthAccMacState[portId].mcastAddrIndex) { memcpy(&ixEthAccMacState[portId].mcastAddrsTable[i], &ixEthAccMacState[portId].mcastAddrsTable[i+1], IX_IEEE803_MAC_ADDRESS_SIZE); i++; } /*recalculate the mask and write it to the MAC*/ ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS; } /* search the next entry */ i++; } /* no matching entry found */ return IX_ETH_ACC_NO_SUCH_ADDR;}IxEthAccStatusixEthAccPortMulticastAddressLeaveAllPriv (IxEthAccPortId portId){ /*Check that the port parameter is valid*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } ixEthAccMacState[portId].mcastAddrIndex = 0; ixEthAccMacState[portId].joinAll = FALSE; ixEthAccMulticastAddressSet(portId); return IX_ETH_ACC_SUCCESS;}IxEthAccStatusixEthAccPortUnicastAddressShowPriv (IxEthAccPortId portId){ IxEthAccMacAddr macAddr; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } /*Get the MAC (UINICAST) address from hardware*/ if(ixEthAccPortUnicastMacAddressGetPriv(portId, &macAddr) != IX_ETH_ACC_SUCCESS) { IX_ETH_ACC_WARNING_LOG("EthAcc: MAC address uninitialised port %u\n", (INT32)portId,0,0,0,0,0); return IX_ETH_ACC_MAC_UNINITIALIZED; } /*print it out*/ ixEthAccMacPrint(&macAddr); printf("\n"); return IX_ETH_ACC_SUCCESS;}voidixEthAccPortMulticastAddressShowPriv(IxEthAccPortId portId){ IxEthAccMacAddr macAddr; UINT32 i; if(!IX_ETH_ACC_IS_PORT_VALID(portId)) { return; } if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return; } printf("Multicast MAC: "); /*Get the MAC (MULTICAST) address from hardware*/ ixEthAccPortMulticastMacAddressGet(portId, &macAddr); /*print it out*/ ixEthAccMacPrint(&macAddr); /*Get the MAC (MULTICAST) filter from hardware*/ ixEthAccPortMulticastMacFilterGet(portId, &macAddr); /*print it out*/ printf(" ( "); ixEthAccMacPrint(&macAddr); printf(" )\n"); printf("Constituent Addresses:\n"); for(i=0;i<ixEthAccMacState[portId].mcastAddrIndex;i++) { ixEthAccMacPrint(&ixEthAccMacState[portId].mcastAddrsTable[i]); printf("\n"); } return;}/*Set the duplex mode*/IxEthAccStatus ixEthAccPortDuplexModeSetPriv (IxEthAccPortId portId, IxEthAccDuplexMode mode){ UINT32 txregval; UINT32 rxregval; /*This is bit 1 of the transmit control reg, set to 1 for half duplex, 0 for full duplex*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, txregval); REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, rxregval); if (mode == IX_ETH_ACC_FULL_DUPLEX) { /*Clear half duplex bit in TX*/ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, txregval & ~IX_ETH_ACC_TX_CNTRL1_DUPLEX); /*We must set the pause enable in the receive logic when in full duplex mode*/ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, rxregval | IX_ETH_ACC_RX_CNTRL1_PAUSE_EN); ixEthAccMacState[portId].fullDuplex = TRUE; } else if (mode == IX_ETH_ACC_HALF_DUPLEX) { /*Set half duplex bit in TX*/ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, txregval | IX_ETH_ACC_TX_CNTRL1_DUPLEX); /*We must clear pause enable in the receive logic when in half duplex mode*/ REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_RX_CNTRL1, rxregval & ~IX_ETH_ACC_RX_CNTRL1_PAUSE_EN); ixEthAccMacState[portId].fullDuplex = FALSE; } else { return IX_ETH_ACC_FAIL; } return IX_ETH_ACC_SUCCESS; }IxEthAccStatus ixEthAccPortDuplexModeGetPriv (IxEthAccPortId portId, IxEthAccDuplexMode *mode){ /*Return the duplex mode for the specified port*/ UINT32 regval; /*This is bit 1 of the transmit control reg, set to 1 for half duplex, 0 for full duplex*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } if (mode == NULL) { return (IX_ETH_ACC_FAIL); } REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); if( regval & IX_ETH_ACC_TX_CNTRL1_DUPLEX) { *mode = IX_ETH_ACC_HALF_DUPLEX; } else { *mode = IX_ETH_ACC_FULL_DUPLEX; } return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortTxFrameAppendPaddingEnablePriv (IxEthAccPortId portId){ UINT32 regval; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval | IX_ETH_ACC_TX_CNTRL1_PAD_EN); ixEthAccMacState[portId].txPADAppend = TRUE; return IX_ETH_ACC_SUCCESS; }IxEthAccStatus ixEthAccPortTxFrameAppendPaddingDisablePriv (IxEthAccPortId portId){ UINT32 regval; IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval & ~IX_ETH_ACC_TX_CNTRL1_PAD_EN); ixEthAccMacState[portId].txPADAppend = FALSE; return IX_ETH_ACC_SUCCESS; }IxEthAccStatus ixEthAccPortTxFrameAppendFCSEnablePriv (IxEthAccPortId portId){ UINT32 regval; /*Enable FCS computation by the MAC and appending to the frame*/ IX_ETH_ACC_VALIDATE_PORT_ID(portId); if (!IX_ETH_IS_PORT_INITIALIZED(portId)) { return (IX_ETH_ACC_PORT_UNINITIALIZED); } REG_READ(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval); REG_WRITE(ixEthAccMacBase[portId], IX_ETH_ACC_MAC_TX_CNTRL1, regval | IX_ETH_ACC_TX_CNTRL1_FCS_EN); ixEthAccMacState[portId].txFCSAppend = TRUE; return IX_ETH_ACC_SUCCESS; }IxEthAccStatus ixEthAccPortTxFrameAppendFCSDisablePriv (IxEthAccPortId portId){ UINT32 regval;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -