Skip to content

Commit b47f773

Browse files
committed
drivers: ethernet: Add runtime MAC address generation
Add support to generate the random MAC if 'zephyr,random-mac-address' is set,uses 'local-mac-address' from DT if available, or falls back to a default Xilinx OUI-based MAC with zeroed bytes Signed-off-by: Venkatesh Odela <venkatesh.odela@amd.com>
1 parent ad4c3e3 commit b47f773

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

drivers/ethernet/eth_xilinx_axienet.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* SPDX-License-Identifier: Apache-2.0
66
*/
77

8+
#define DT_DRV_COMPAT xlnx_axi_ethernet_1_00_a
9+
810
#include <zephyr/logging/log.h>
911
LOG_MODULE_REGISTER(eth_xilinx_axienet, CONFIG_ETHERNET_LOG_LEVEL);
1012

@@ -16,6 +18,7 @@ LOG_MODULE_REGISTER(eth_xilinx_axienet, CONFIG_ETHERNET_LOG_LEVEL);
1618
#include <zephyr/net/phy.h>
1719
#include <zephyr/irq.h>
1820
#include <zephyr/sys/barrier.h>
21+
#include "eth.h"
1922

2023
#include "../dma/dma_xilinx_axi_dma.h"
2124

@@ -48,6 +51,11 @@ LOG_MODULE_REGISTER(eth_xilinx_axienet, CONFIG_ETHERNET_LOG_LEVEL);
4851
#define XILINX_AXIENET_UNICAST_ADDRESS_WORD_0_OFFSET 0x00000700
4952
#define XILINX_AXIENET_UNICAST_ADDRESS_WORD_1_OFFSET 0x00000704
5053

54+
/* Xilinx OUI (Organizationally Unique Identifier) for MAC */
55+
#define XILINX_OUI_BYTE_0 0x00
56+
#define XILINX_OUI_BYTE_1 0x0A
57+
#define XILINX_OUI_BYTE_2 0x35
58+
5159
#if (CONFIG_DCACHE_LINE_SIZE > 0)
5260
/* cache-line aligned to allow selective cache-line invalidation on the buffer */
5361
#define XILINX_AXIENET_ETH_ALIGN CONFIG_DCACHE_LINE_SIZE
@@ -498,6 +506,27 @@ static int xilinx_axienet_send(const struct device *dev, struct net_pkt *pkt)
498506
return setup_dma_tx_transfer(dev, config, data, pkt_len);
499507
}
500508

509+
static void xilinx_axienet_generate_mac_address(uint8_t *mac_addr)
510+
{
511+
#if DT_INST_PROP(0, zephyr_random_mac_address)
512+
/* Generate random MAC address using Xilinx OUI as vendor prefix */
513+
gen_random_mac(mac_addr, XILINX_OUI_BYTE_0, XILINX_OUI_BYTE_1, XILINX_OUI_BYTE_2);
514+
#elif DT_INST_NODE_HAS_PROP(0, local_mac_address)
515+
/* Use provided MAC address from device tree */
516+
uint8_t dt_mac[] = DT_INST_PROP(0, local_mac_address);
517+
518+
memcpy(mac_addr, dt_mac, NET_ETH_ADDR_LEN);
519+
#else
520+
/* Default fallback - use Xilinx OUI with all zeros for device-specific part */
521+
mac_addr[0] = XILINX_OUI_BYTE_0;
522+
mac_addr[1] = XILINX_OUI_BYTE_1;
523+
mac_addr[2] = XILINX_OUI_BYTE_2;
524+
mac_addr[3] = 0x00;
525+
mac_addr[4] = 0x00;
526+
mac_addr[5] = 0x00;
527+
#endif
528+
}
529+
501530
static int xilinx_axienet_probe(const struct device *dev)
502531
{
503532
const struct xilinx_axienet_config *config = dev->config;
@@ -540,6 +569,9 @@ static int xilinx_axienet_probe(const struct device *dev)
540569
LOG_INF("TX Checksum offloading %s",
541570
config->have_tx_csum_offload ? "requested" : "disabled");
542571

572+
/* Generate MAC address at runtime */
573+
xilinx_axienet_generate_mac_address(data->mac_addr);
574+
543575
xilinx_axienet_set_mac_address(config, data);
544576

545577
for (int i = 0; i < CONFIG_ETH_XILINX_AXIENET_BUFFER_NUM_RX - 1; i++) {
@@ -586,7 +618,6 @@ static const struct ethernet_api xilinx_axienet_api = {
586618
} \
587619
\
588620
static struct xilinx_axienet_data data_##inst = { \
589-
.mac_addr = DT_INST_PROP_OR(inst, local_mac_address, {0}), \
590621
.dma_is_configured_rx = false, \
591622
.dma_is_configured_tx = false}; \
592623
static const struct xilinx_axienet_config config_##inst = { \
@@ -603,5 +634,4 @@ static const struct ethernet_api xilinx_axienet_api = {
603634
&config_##inst, CONFIG_ETH_INIT_PRIORITY, \
604635
&xilinx_axienet_api, NET_ETH_MTU);
605636

606-
#define DT_DRV_COMPAT xlnx_axi_ethernet_1_00_a
607637
DT_INST_FOREACH_STATUS_OKAY(XILINX_AXIENET_INIT);

0 commit comments

Comments
 (0)