Go to the documentation of this file.
32 #define TRACE_LEVEL NIC_TRACE_LEVEL
80 interface->spiDriver->init();
83 if(interface->extIntDriver != NULL)
85 interface->extIntDriver->init();
132 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
149 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
151 if(interface->port != 0)
177 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
227 interface->nicEvent =
TRUE;
253 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
257 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
259 if(interface->port != 0)
266 context = interface->netContext;
269 for(i = 0; i < context->numInterfaces; i++)
272 virtualInterface = &context->interfaces[i];
276 if(virtualInterface == interface ||
277 virtualInterface->parent == interface)
280 port = virtualInterface->port;
289 if(linkState && !virtualInterface->linkState)
296 virtualInterface->linkState =
TRUE;
302 else if(!linkState && virtualInterface->linkState)
305 virtualInterface->linkState =
FALSE;
331 if(linkState && !interface->linkState)
338 interface->linkState =
TRUE;
344 else if(!linkState && interface->linkState)
347 interface->linkState =
FALSE;
365 if(interface->extIntDriver != NULL)
367 interface->extIntDriver->enableIrq();
380 if(interface->extIntDriver != NULL)
382 interface->extIntDriver->disableIrq();
395 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
398 interface->nicEvent =
TRUE;
432 interface->nicEvent =
TRUE;
444 interface->nicEvent =
TRUE;
456 interface->nicEvent =
TRUE;
468 interface->nicEvent =
TRUE;
509 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
625 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
627 if(interface->port != 0)
634 context = interface->netContext;
637 for(i = 0; i < context->numInterfaces; i++)
640 virtualInterface = &context->interfaces[i];
644 if(virtualInterface == interface ||
645 virtualInterface->parent == interface)
648 port = virtualInterface->port;
657 if(linkState && !virtualInterface->linkState)
664 virtualInterface->linkState =
TRUE;
670 else if(!linkState && virtualInterface->linkState)
673 virtualInterface->linkState =
FALSE;
706 interface->linkState =
TRUE;
711 interface->linkState =
FALSE;
733 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
750 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
752 if(
port != ancillary->port && ancillary->port != 0)
830 interface->spiDriver->assertCs();
835 chunk[j] = interface->spiDriver->transfer(chunk[j]);
839 interface->spiDriver->deassertCs();
850 interface->nicEvent =
TRUE;
889 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
891 if(
port != ancillary->port && ancillary->port != 0)
958 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
1000 interface->spiDriver->assertCs();
1005 chunk[i] = interface->spiDriver->transfer(chunk[i]);
1009 interface->spiDriver->deassertCs();
1081 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
1083 ancillary.port =
port;
1131 #if (ETH_PORT_TAGGING_SUPPORT == ENABLED)
1133 ancillary.port =
port;
1184 interface->macAddr.b[1]);
1188 (interface->macAddr.b[2] << 24) | (interface->macAddr.b[3] << 16) |
1189 (interface->macAddr.b[4] << 8) | interface->macAddr.b[5]);
1197 entry = &interface->macAddrFilter[i];
1218 (entry->
addr.b[2] << 24) | (entry->
addr.b[3] << 16) |
1219 (entry->
addr.b[4] << 8) | entry->
addr.b[5]);
1283 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
1311 interface->spiDriver->assertCs();
1314 interface->spiDriver->transfer((header >> 24) & 0xFF);
1315 interface->spiDriver->transfer((header >> 16) & 0xFF);
1316 interface->spiDriver->transfer((header >> 8) & 0xFF);
1317 interface->spiDriver->transfer(header & 0xFF);
1320 interface->spiDriver->transfer((
data >> 24) & 0xFF);
1321 interface->spiDriver->transfer((
data >> 16) & 0xFF);
1322 interface->spiDriver->transfer((
data >> 8) & 0xFF);
1323 interface->spiDriver->transfer(
data & 0xFF);
1325 #if (ADIN2111_PROTECTION_SUPPORT == ENABLED)
1331 interface->spiDriver->transfer((
data >> 24) & 0xFF);
1332 interface->spiDriver->transfer((
data >> 16) & 0xFF);
1333 interface->spiDriver->transfer((
data >> 8) & 0xFF);
1334 interface->spiDriver->transfer(
data & 0xFF);
1338 interface->spiDriver->transfer(0x00);
1339 interface->spiDriver->transfer(0x00);
1340 interface->spiDriver->transfer(0x00);
1341 interface->spiDriver->transfer(0x00);
1344 interface->spiDriver->deassertCs();
1347 interface->spiDriver->assertCs();
1351 interface->spiDriver->transfer(
address & 0xFF);
1354 interface->spiDriver->transfer((
data >> 24) & 0xFF);
1355 interface->spiDriver->transfer((
data >> 16) & 0xFF);
1356 interface->spiDriver->transfer((
data >> 8) & 0xFF);
1357 interface->spiDriver->transfer(
data & 0xFF);
1360 interface->spiDriver->deassertCs();
1374 #if (ADIN2111_OA_SPI_SUPPORT == ENABLED)
1403 interface->spiDriver->assertCs();
1406 interface->spiDriver->transfer((header >> 24) & 0xFF);
1407 interface->spiDriver->transfer((header >> 16) & 0xFF);
1408 interface->spiDriver->transfer((header >> 8) & 0xFF);
1409 interface->spiDriver->transfer(header & 0xFF);
1412 interface->spiDriver->transfer(0x00);
1413 interface->spiDriver->transfer(0x00);
1414 interface->spiDriver->transfer(0x00);
1415 interface->spiDriver->transfer(0x00);
1418 data = interface->spiDriver->transfer(0x00) << 24;
1419 data |= interface->spiDriver->transfer(0x00) << 16;
1420 data |= interface->spiDriver->transfer(0x00) << 8;
1421 data |= interface->spiDriver->transfer(0x00);
1423 #if (ADIN2111_PROTECTION_SUPPORT == ENABLED)
1426 interface->spiDriver->transfer(0x00);
1427 interface->spiDriver->transfer(0x00);
1428 interface->spiDriver->transfer(0x00);
1429 interface->spiDriver->transfer(0x00);
1433 interface->spiDriver->deassertCs();
1441 interface->spiDriver->assertCs();
1445 interface->spiDriver->transfer(
address & 0xFF);
1448 interface->spiDriver->transfer(0x00);
1451 data = interface->spiDriver->transfer(0x00) << 24;
1452 data |= interface->spiDriver->transfer(0x00) << 16;
1453 data |= interface->spiDriver->transfer(0x00) << 8;
1454 data |= interface->spiDriver->transfer(0x00);
1457 interface->spiDriver->deassertCs();
1475 for(i = 0; i < 256; i++)
1478 TRACE_DEBUG(
"0x%02" PRIX16
": 0x%08" PRIX32
"\r\n", i,
1571 for(i = 0; i < 32; i++)
1574 TRACE_DEBUG(
"%02" PRIu8
": 0x%04" PRIX16
"\r\n", i,
1642 uint8_t devAddr, uint16_t
regAddr)
1693 #if (ADIN2111_OA_SPI_SUPPORT == DISABLED)
1697 interface->spiDriver->assertCs();
1701 interface->spiDriver->transfer(
ADIN2111_TX & 0xFF);
1705 interface->spiDriver->transfer((header >> 8) & 0xFF);
1706 interface->spiDriver->transfer(header & 0xFF);
1709 for(i = 0; i <
length; i++)
1711 interface->spiDriver->transfer(
data[i]);
1717 interface->spiDriver->transfer(0x00);
1721 interface->spiDriver->deassertCs();
1736 uint16_t *header, uint8_t *
data,
size_t length)
1738 #if (ADIN2111_OA_SPI_SUPPORT == DISABLED)
1743 interface->spiDriver->assertCs();
1757 interface->spiDriver->transfer(
address & 0xFF);
1760 interface->spiDriver->transfer(0x00);
1764 *header = interface->spiDriver->transfer(0x00) << 16;
1765 *header |= interface->spiDriver->transfer(0x00);
1770 data[i] = interface->spiDriver->transfer(0x00);
1776 interface->spiDriver->transfer(0x00);
1782 interface->spiDriver->transfer(0x00);
1786 interface->spiDriver->deassertCs();
1809 return ~
data & 0x01;
1830 for(i = 0; i <
length; i++)
1836 for(j = 0; j < 8; j++)
1838 if((crc & 0x80) != 0)
1840 crc = (crc << 1) ^ 0x07;
bool_t osSetEventFromIsr(OsEvent *event)
Set an event object to the signaled state from an interrupt service routine.
void nicNotifyLinkChange(NetInterface *interface)
Process link state change notification.
#define ADIN2111_CONFIG0_TXCTE
#define ADIN2111_PHY_SUBSYS_IRQ_MASK_LINK_STAT_CHNG_IRQ_EN
#define ADIN2111_TX_HEADER_EBO
#define ADIN2111_CHUNK_PAYLOAD_SIZE
#define ADIN2111_STATUS1_P2_PHYINT
#define ADIN2111_CHUNK_SIZE
#define ADIN2111_CRSM_IRQ_MASK
#define ADIN2111_CONFIG2_P2_FWD_UNK2P1
#define ADIN2111_CTRL_HEADER_WNR
#define ADIN2111_RESET_SWRESET
#define ADIN2111_MDIOACC_MDIO_TRDONE
size_t netBufferRead(void *dest, const NetBuffer *src, size_t srcOffset, size_t length)
Read data from a multi-part buffer.
#define ADIN2111_IMASK0_PHYINTM
Structure describing a buffer that spans multiple chunks.
void adin2111LinkChangeEventHandler(NetInterface *interface)
ADIN2111 link status change event handler.
#define MAC_ADDR_FILTER_SIZE
uint8_t adin2111CalcCrc(const uint8_t *data, size_t length)
CRC calculation.
void adin2111WriteFifo(NetInterface *interface, uint16_t header, const uint8_t *data, size_t length)
Write TX FIFO.
#define ADIN2111_MDIOACC_MDIO_ST_CLAUSE_45
#define ADIN2111_P2_RX_FSIZE
#define ADIN2111_CTRL_HEADER_LEN
void adin2111WriteMmdReg(NetInterface *interface, uint8_t port, uint8_t devAddr, uint16_t regAddr, uint16_t data)
Write MMD register.
#define ADIN2111_PHY_SUBSYS_IRQ_MASK
uint_t refCount
Reference count for the current entry.
#define ADIN2111_CONFIG0_SYNC
void adin2111DisableIrq(NetInterface *interface)
Disable interrupts.
#define ADIN2111_TX_FIFO_OVERHEAD
#define ADIN2111_ADDR_FILT_LWRn(index)
void nicProcessPacket(NetInterface *interface, uint8_t *packet, size_t length, NetRxAncillary *ancillary)
Handle a packet received by the network controller.
#define macIsMulticastAddr(macAddr)
#define ADIN2111_ADDR_FILT_LWR_MAC_ADDR_31_0
#define ADIN2111_MDIOACC_MDIO_OP_WRITE
#define ADIN2111_LED_CNTRL_LED0_EN
bool_t adin2111GetLinkState(NetInterface *interface, uint8_t port)
Get link state.
#define ADIN2111_TX_HEADER_EV
#define ADIN2111_BUFSTS_TXC
#define ADIN2111_ADDR_FILT_UPR_MAC_ADDR_47_32
#define ADIN2111_ADDR_FILT_UPR_TO_HOST
#define ADIN2111_ADDR_FILT_UPRn(index)
bool_t adin2111IrqHandler(NetInterface *interface)
ADIN2111 interrupt service routine.
#define ADIN2111_LED_POLARITY
#define ADIN2111_MDIOACC0
error_t adin2111Init(NetInterface *interface)
ADIN2111 Ethernet switch initialization.
uint16_t adin2111ReadMmdReg(NetInterface *interface, uint8_t port, uint8_t devAddr, uint16_t regAddr)
Read MMD register.
#define ADIN2111_FRAME_HEADER_PORT2
#define ADIN2111_P1_RX_FSIZE
#define ADIN2111_FRAME_HEADER_SIZE
#define ADIN2111_PHYID_REVISION_DEFAULT
#define osMemcpy(dest, src, length)
#define ADIN2111_P2_RX_FSIZE_P2_RX_FRM_SIZE
error_t adin2111SendPacket(NetInterface *interface, const NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send a packet.
#define ADIN2111_MI_STATUS
#define ADIN2111_RX_FOOTER_RCA
#define ADIN2111_STATUS1_TX_RDY
error_t adin2111ReceivePacket(NetInterface *interface, uint8_t port)
Receive a packet.
#define ADIN2111_SPI_CMD_WRITE
const NetRxAncillary NET_DEFAULT_RX_ANCILLARY
@ ERROR_FAILURE
Generic error code.
#define ADIN2111_PHY_SUBSYS_IRQ_STATUS_LINK_STAT_CHNG_LH
const NicDriver adin2111Driver
ADIN2111 driver.
#define ADIN2111_CONFIG0_CSARFE
#define ADIN2111_RX_FOOTER_DV
#define ADIN2111_CTRL_HEADER_P
uint16_t adin2111ReadPhyReg(NetInterface *interface, uint8_t port, uint8_t address)
Read PHY register.
#define ADIN2111_MDIOACC_MDIO_ST_CLAUSE_22
#define ADIN2111_MDIOACC_MDIO_OP_ADDR
#define ADIN2111_ETH_TX_BUFFER_SIZE
uint32_t adin2111CalcParity(uint32_t data)
Calculate parity bit over a 32-bit data.
#define ADIN2111_CTRL_HEADER_ADDR
#define ADIN2111_TX_SPACE_TX_SPACE
#define ADIN2111_STATUS1_P1_RX_RDY
void adin2111ReadFifo(NetInterface *interface, uint8_t port, uint16_t *header, uint8_t *data, size_t length)
Read RX FIFO.
#define ADIN2111_TX_HEADER_NORX
#define ADIN2111_STATUS0_PHYINT
#define ADIN2111_MI_STATUS_MI_LINK_STAT_LAT
#define ADIN2111_CRSM_SFT_PD_CNTRL_CRSM_SFT_PD
#define ADIN2111_IMASK1_TX_RDY_MASK
size_t netBufferGetLength(const NetBuffer *buffer)
Get the actual length of a multi-part buffer.
#define ADIN2111_TX_HEADER_DNC
#define ADIN2111_RX_FOOTER_VS0_PORT1
#define ADIN2111_MDIOACC_MDIO_OP_READ
ADIN2111 2-port 10Base-T1L Ethernet switch driver.
#define ADIN2111_CTRL_HEADER_AID
#define ADIN2111_CRSM_IRQ_STATUS
#define ADIN2111_CONFIG0_CPS_64B
#define ADIN2111_STATUS0_RESETC
#define ADIN2111_TX_SPACE
#define ADIN2111_ETH_RX_BUFFER_SIZE
__weak_func void adin2111Tick(NetInterface *interface)
ADIN2111 timer handler.
#define ADIN2111_CHUNK_HEADER_SIZE
#define ADIN2111_STATUS1_P2_RX_RDY
#define ADIN2111_IMASK1_P1_RX_RDY_MASK
#define ADIN2111_RX_FOOTER_SV
#define ADIN2111_BUFSTS_RCA
void adin2111WriteReg(NetInterface *interface, uint16_t address, uint32_t data)
Write SPI register.
void adin2111DumpReg(NetInterface *interface)
Dump SPI registers for debugging purpose.
#define ADIN2111_LED_POLARITY_LED1_POLARITY_ACTIVE_HIGH
#define ADIN2111_ADDR_FILT_UPR_APPLY2PORT2
#define ADIN2111_IMASK1_P2_RX_RDY_MASK
#define ADIN2111_PHYID_OUI_DEFAULT
#define ADIN2111_P1_RX_FSIZE_P1_RX_FRM_SIZE
#define ADIN2111_CONFIG0_ZARFE
#define ADIN2111_LED_CNTRL
#define ADIN2111_SPI_CMD_READ
#define ADIN2111_CONFIG2_CRC_APPEND
#define ADIN2111_TX_HEADER_SV
void adin2111EnableIrq(NetInterface *interface)
Enable interrupts.
#define ADIN2111_MDIOACC_MDIO_DEVAD
#define ADIN2111_TX_HEADER_DV
#define ADIN2111_RX_FOOTER_VS0
#define ADIN2111_CONFIG0_TXCTHRESH_16_CREDITS
#define ADIN2111_TX_HEADER_VS0_PORT1
#define ADIN2111_PHYID_MODEL_DEFAULT
void osSetEvent(OsEvent *event)
Set the specified event object to the signaled state.
#define ADIN2111_ADDR_TABLE_SIZE
#define ADIN2111_TX_FSIZE
#define ADIN2111_MDIOACC1
#define ADIN2111_RX_FOOTER_EBO
#define ADIN2111_LED_CNTRL_LED0_FUNCTION_LINKUP_TXRX_ACTIVITY
#define ADIN2111_IMASK1_P2_PHYINT_MASK
#define ADIN2111_PHY_SUBSYS_IRQ_STATUS
error_t adin2111UpdateMacAddrFilter(NetInterface *interface)
Configure MAC address filtering.
#define osMemset(p, value, length)
#define ADIN2111_FRAME_HEADER_PORT1
__weak_func void adin2111InitHook(NetInterface *interface)
ADIN2111 custom configuration.
#define ADIN2111_LED_CNTRL_LED1_EN
#define ADIN2111_MDIOACC_MDIO_PRTAD
#define ADIN2111_MDIOACC_MDIO_DATA
#define ADIN2111_LED_CNTRL_LED1_FUNCTION_OFF
void adin2111WritePhyReg(NetInterface *interface, uint8_t port, uint8_t address, uint16_t data)
Write PHY register.
__weak_func void adin2111EventHandler(NetInterface *interface)
ADIN2111 event handler.
#define ADIN2111_RX_FOOTER_EV
#define ADIN2111_CONFIG2_P1_FWD_UNK2P2
#define ADIN2111_TX_HEADER_VS0_PORT2
uint32_t adin2111ReadReg(NetInterface *interface, uint16_t address)
Read SPI register.
#define ADIN2111_ADDR_FILT_UPR_APPLY2PORT1
#define ADIN2111_CTRL_HEADER_MMS
#define ADIN2111_LED_POLARITY_LED0_POLARITY_ACTIVE_HIGH
#define ADIN2111_CRSM_SFT_PD_CNTRL
#define ADIN2111_ADDR_FILT_UPR_TO_OTHER_PORT
void adin2111DumpPhyReg(NetInterface *interface, uint8_t port)
Dump PHY registers for debugging purpose.
@ NIC_TYPE_ETHERNET
Ethernet interface.
#define ADIN2111_CONFIG0_RXCTE