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