1 /*
2  * Copyright (c) 2025 Basalte bv
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/ztest.h>
8 #include <zephyr/device.h>
9 #include <zephyr/devicetree.h>
10 #include <zephyr/kernel.h>
11 #include <zephyr/net/ethernet.h>
12 
13 #include "eth_test_priv.h"
14 
ZTEST(ethernet_mac_config,test_eth_mac_local)15 ZTEST(ethernet_mac_config, test_eth_mac_local)
16 {
17 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_local));
18 	const struct vnd_ethernet_config *cfg = dev->config;
19 	struct vnd_ethernet_data *data = dev->data;
20 	const uint8_t addr[NET_ETH_ADDR_LEN] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
21 
22 	zexpect_equal(data->mac_addr_load_result, 0);
23 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_STATIC);
24 	zexpect_equal(cfg->mcfg.addr_len, NET_ETH_ADDR_LEN);
25 	zexpect_mem_equal(cfg->mcfg.addr, addr, NET_ETH_ADDR_LEN);
26 	zexpect_mem_equal(data->mac_addr, addr, NET_ETH_ADDR_LEN);
27 }
28 
ZTEST(ethernet_mac_config,test_eth_mac_random)29 ZTEST(ethernet_mac_config, test_eth_mac_random)
30 {
31 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_random));
32 	const struct vnd_ethernet_config *cfg = dev->config;
33 	struct vnd_ethernet_data *data = dev->data;
34 
35 	zexpect_equal(data->mac_addr_load_result, 0);
36 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_RANDOM);
37 	zexpect_equal(cfg->mcfg.addr_len, 0);
38 	zexpect_equal(data->mac_addr[0] & 0x02, 0x02, "Missing LAA bit");
39 	zexpect_equal(data->mac_addr[0] & 0x01, 0x00, "Erroneous I/G bit");
40 }
41 
ZTEST(ethernet_mac_config,test_eth_mac_random_prefix)42 ZTEST(ethernet_mac_config, test_eth_mac_random_prefix)
43 {
44 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_random_prefix));
45 	const struct vnd_ethernet_config *cfg = dev->config;
46 	struct vnd_ethernet_data *data = dev->data;
47 	uint8_t prefix[] = {0x00, 0x22, 0x44};
48 
49 	zexpect_equal(data->mac_addr_load_result, 0);
50 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_RANDOM);
51 	zexpect_equal(cfg->mcfg.addr_len, 3);
52 	zexpect_mem_equal(cfg->mcfg.addr, prefix, sizeof(prefix));
53 
54 	/* NOTE: Prefix with LAA bit set */
55 	prefix[0] |= 0x02;
56 	zexpect_mem_equal(data->mac_addr, prefix, sizeof(prefix));
57 }
58 
ZTEST(ethernet_mac_config,test_eth_mac_nvmem)59 ZTEST(ethernet_mac_config, test_eth_mac_nvmem)
60 {
61 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_nvmem));
62 	const struct vnd_ethernet_config *cfg = dev->config;
63 	struct vnd_ethernet_data *data = dev->data;
64 
65 	zexpect_equal(data->mac_addr_load_result, 0);
66 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_NVMEM);
67 	zexpect_equal(cfg->mcfg.addr_len, 0);
68 
69 	zexpect_equal_ptr(cfg->mcfg.cell.dev, DEVICE_DT_GET(DT_NODELABEL(eeprom0)));
70 	zexpect_equal(cfg->mcfg.cell.offset, DT_REG_ADDR(DT_NODELABEL(cell0)));
71 	zexpect_equal(cfg->mcfg.cell.size, DT_REG_SIZE(DT_NODELABEL(cell0)));
72 }
73 
ZTEST(ethernet_mac_config,test_eth_mac_nvmem_prefix)74 ZTEST(ethernet_mac_config, test_eth_mac_nvmem_prefix)
75 {
76 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_nvmem_prefix));
77 	const struct vnd_ethernet_config *cfg = dev->config;
78 	struct vnd_ethernet_data *data = dev->data;
79 	uint8_t prefix[] = {0x00, 0x33, 0x66};
80 
81 	zexpect_equal(data->mac_addr_load_result, 0);
82 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_NVMEM);
83 	zexpect_equal(cfg->mcfg.addr_len, 3);
84 	zexpect_mem_equal(cfg->mcfg.addr, prefix, sizeof(prefix));
85 
86 	/* NOTE: No LAA bit set in this case */
87 	zexpect_mem_equal(data->mac_addr, prefix, sizeof(prefix));
88 
89 	zexpect_equal_ptr(cfg->mcfg.cell.dev, DEVICE_DT_GET(DT_NODELABEL(eeprom0)));
90 	zexpect_equal(cfg->mcfg.cell.offset, DT_REG_ADDR(DT_NODELABEL(cell6)));
91 	zexpect_equal(cfg->mcfg.cell.size, DT_REG_SIZE(DT_NODELABEL(cell6)));
92 }
93 
ZTEST(ethernet_mac_config,test_eth_mac_none)94 ZTEST(ethernet_mac_config, test_eth_mac_none)
95 {
96 	const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(eth_mac_none));
97 	const struct vnd_ethernet_config *cfg = dev->config;
98 	struct vnd_ethernet_data *data = dev->data;
99 
100 	zexpect_equal(data->mac_addr_load_result, -ENODATA);
101 	zexpect_equal(cfg->mcfg.type, NET_ETH_MAC_DEFAULT);
102 	zexpect_equal(cfg->mcfg.addr_len, 0);
103 }
104 
105 ZTEST_SUITE(ethernet_mac_config, NULL, NULL, NULL, NULL, NULL);
106