diff --git a/boards/atmel/sam/sam4e_xpro/sam4e_xpro.dts b/boards/atmel/sam/sam4e_xpro/sam4e_xpro.dts index ed75ab0e6c0d7..395c1bf23740e 100644 --- a/boards/atmel/sam/sam4e_xpro/sam4e_xpro.dts +++ b/boards/atmel/sam/sam4e_xpro/sam4e_xpro.dts @@ -201,6 +201,8 @@ pinctrl-0 = <&gmac_mii>; pinctrl-names = "default"; + /* Atmel OUI */ + local-mac-address = [00 04 25]; zephyr,random-mac-address; phy-handle = <&phy>; diff --git a/boards/atmel/sam/sam_e70_xplained/Kconfig.defconfig b/boards/atmel/sam/sam_e70_xplained/Kconfig.defconfig index 59f0676d06b57..99855536dc3e5 100644 --- a/boards/atmel/sam/sam_e70_xplained/Kconfig.defconfig +++ b/boards/atmel/sam/sam_e70_xplained/Kconfig.defconfig @@ -7,15 +7,11 @@ if ETH_SAM_GMAC # Read MAC address from AT24MAC402 EEPROM -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS - default 0x9A - -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE - default 1 +config EEPROM + default y -config ETH_SAM_GMAC_MAC_I2C_EEPROM +config NVMEM default y - select I2C endif # ETH_SAM_GMAC diff --git a/boards/atmel/sam/sam_e70_xplained/sam_e70_xplained-common.dtsi b/boards/atmel/sam/sam_e70_xplained/sam_e70_xplained-common.dtsi index e383df40b4c41..5a81e1c045cb1 100644 --- a/boards/atmel/sam/sam_e70_xplained/sam_e70_xplained-common.dtsi +++ b/boards/atmel/sam/sam_e70_xplained/sam_e70_xplained-common.dtsi @@ -81,8 +81,23 @@ pinctrl-names = "default"; eeprom: eeprom@5f { - compatible = "atmel,24mac402"; + compatible = "atmel,at24", "atmel,24mac402"; reg = <0x5f>; + size = <256>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + + nvmem-layout { + compatible = "fixed-layout"; + #address-cells = <1>; + #size-cells = <1>; + + mac_address: mac-address@9a { + reg = <0x9a 6>; + #nvmem-cell-cells = <0>; + }; + }; }; }; @@ -128,7 +143,8 @@ zephyr_udc0: &usbhs { pinctrl-0 = <&gmac_rmii>; pinctrl-names = "default"; - mac-eeprom = <&eeprom>; + nvmem-cells = <&mac_address>; + nvmem-cell-names = "mac-address"; phy-handle = <&phy>; }; diff --git a/boards/atmel/sam/sam_v71_xult/Kconfig.defconfig b/boards/atmel/sam/sam_v71_xult/Kconfig.defconfig index 5c860149dc8b9..e210cd1c0fb5b 100644 --- a/boards/atmel/sam/sam_v71_xult/Kconfig.defconfig +++ b/boards/atmel/sam/sam_v71_xult/Kconfig.defconfig @@ -8,15 +8,11 @@ if ETH_SAM_GMAC # Read MAC address from AT24MAC402 EEPROM -config ETH_SAM_GMAC_MAC_I2C_EEPROM +config EEPROM default y - select I2C -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS - default 0x9A - -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE - default 1 +config NVMEM + default y endif # ETH_SAM_GMAC diff --git a/boards/atmel/sam/sam_v71_xult/sam_v71_xult-common.dtsi b/boards/atmel/sam/sam_v71_xult/sam_v71_xult-common.dtsi index de60c6c15939f..ff578d8556930 100644 --- a/boards/atmel/sam/sam_v71_xult/sam_v71_xult-common.dtsi +++ b/boards/atmel/sam/sam_v71_xult/sam_v71_xult-common.dtsi @@ -198,8 +198,23 @@ pinctrl-names = "default"; eeprom: eeprom@5f { - compatible = "atmel,24mac402"; + compatible = "atmel,at24", "atmel,24mac402"; reg = <0x5f>; + size = <256>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + + nvmem-layout { + compatible = "fixed-layout"; + #address-cells = <1>; + #size-cells = <1>; + + mac_address: mac-address@9a { + reg = <0x9a 6>; + #nvmem-cell-cells = <0>; + }; + }; }; }; @@ -253,7 +268,8 @@ zephyr_udc0: &usbhs { pinctrl-0 = <&gmac_rmii>; pinctrl-names = "default"; - mac-eeprom = <&eeprom>; + nvmem-cells = <&mac_address>; + nvmem-cell-names = "mac-address"; phy-handle = <&phy>; }; diff --git a/boards/atmel/sam0/same54_xpro/Kconfig.defconfig b/boards/atmel/sam0/same54_xpro/Kconfig.defconfig index 17f73bc5ce43f..3bb04fe748177 100644 --- a/boards/atmel/sam0/same54_xpro/Kconfig.defconfig +++ b/boards/atmel/sam0/same54_xpro/Kconfig.defconfig @@ -8,15 +8,11 @@ if ETH_SAM_GMAC # Read MAC address from AT24MAC402 EEPROM -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS - default 0x9A - -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE - default 1 +config EEPROM + default y -config ETH_SAM_GMAC_MAC_I2C_EEPROM +config NVMEM default y - select I2C endif # ETH_SAM_GMAC diff --git a/boards/atmel/sam0/same54_xpro/same54_xpro.dts b/boards/atmel/sam0/same54_xpro/same54_xpro.dts index ba942e3aa8c1d..3fd5c92799be5 100644 --- a/boards/atmel/sam0/same54_xpro/same54_xpro.dts +++ b/boards/atmel/sam0/same54_xpro/same54_xpro.dts @@ -116,8 +116,23 @@ pinctrl-names = "default"; eeprom: eeprom@5e { - compatible = "atmel,24mac402"; + compatible = "atmel,at24", "atmel,24mac402"; reg = <0x5e>; + size = <256>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + + nvmem-layout { + compatible = "fixed-layout"; + #address-cells = <1>; + #size-cells = <1>; + + mac_address: mac-address@9a { + reg = <0x9a 6>; + #nvmem-cell-cells = <0>; + }; + }; }; }; @@ -158,7 +173,8 @@ zephyr_udc0: &usb0 { pinctrl-0 = <&gmac_rmii>; pinctrl-names = "default"; - mac-eeprom = <&eeprom>; + nvmem-cells = <&mac_address>; + nvmem-cell-names = "mac-address"; phy-handle = <&phy>; }; diff --git a/drivers/ethernet/Kconfig.sam_gmac b/drivers/ethernet/Kconfig.sam_gmac index fed74b1ca40c2..a3e1d737f62d3 100644 --- a/drivers/ethernet/Kconfig.sam_gmac +++ b/drivers/ethernet/Kconfig.sam_gmac @@ -72,30 +72,6 @@ config ETH_SAM_GMAC_BUF_RX_COUNT fit at least two Ethernet frames: one being received by the GMAC module and the other being processed by the higher layer networking stack. -config ETH_SAM_GMAC_MAC_I2C_EEPROM - bool "Read from an I2C EEPROM" - help - Read MAC address from an I2C EEPROM. - -if ETH_SAM_GMAC_MAC_I2C_EEPROM - -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS - hex "I2C EEPROM internal address" - range 0 0xffffffff - help - Internal address of the EEPROM chip where the MAC address is stored. - Chips with 1 to 4 byte internal address size are supported. Address - size has to be configured in a separate Kconfig option. - -config ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE - int "I2C EEPROM internal address size" - default 1 - range 1 4 - help - Size (in bytes) of the internal EEPROM address. - -endif # ETH_SAM_GMAC_MAC_I2C_EEPROM - config PTP_CLOCK_SAM_GMAC bool "SAM GMAC PTP clock driver support" default y diff --git a/drivers/ethernet/eth.h b/drivers/ethernet/eth.h index f7e7ab79a4ad3..e01dacb8f1293 100644 --- a/drivers/ethernet/eth.h +++ b/drivers/ethernet/eth.h @@ -8,6 +8,7 @@ #define ZEPHYR_DRIVERS_ETHERNET_ETH_H_ #include +#include #include /* helper macro to return mac address octet from local_mac_address prop */ @@ -42,4 +43,37 @@ static inline void gen_random_mac(uint8_t *mac_addr, uint8_t b0, uint8_t b1, uin sys_rand_get(&mac_addr[3], 3U); } +static inline int net_eth_mac_load(const struct net_eth_mac_config *cfg, uint8_t *mac_addr) +{ + if (cfg == NULL || cfg->type == NET_ETH_MAC_DEFAULT) { + return -ENODATA; + } + + /* Copy the static part */ + memcpy(mac_addr, cfg->addr, cfg->addr_len); + + if (cfg->type == NET_ETH_MAC_STATIC && cfg->addr_len == NET_ETH_ADDR_LEN) { + /* Complete static address */ + return 0; + } + + if (cfg->type == NET_ETH_MAC_RANDOM) { + sys_rand_get(&mac_addr[cfg->addr_len], NET_ETH_ADDR_LEN - cfg->addr_len); + + /* Set MAC address locally administered, unicast (LAA) */ + mac_addr[0] |= 0x02; + + return 0; + } + +#if defined(CONFIG_NVMEM) + if (cfg->type == NET_ETH_MAC_NVMEM) { + return nvmem_cell_read(&cfg->cell, &mac_addr[cfg->addr_len], 0, + NET_ETH_ADDR_LEN - cfg->addr_len); + } +#endif + + return -ENODATA; +} + #endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_H_ */ diff --git a/drivers/ethernet/eth_sam_gmac.c b/drivers/ethernet/eth_sam_gmac.c index 52a3432418846..66654d70bcf95 100644 --- a/drivers/ethernet/eth_sam_gmac.c +++ b/drivers/ethernet/eth_sam_gmac.c @@ -33,6 +33,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include #include +#include #include #include #include @@ -1729,38 +1730,6 @@ static int eth_initialize(const struct device *dev) return retval; } -#if DT_INST_NODE_HAS_PROP(0, mac_eeprom) -static void get_mac_addr_from_i2c_eeprom(uint8_t mac_addr[6]) -{ - uint32_t iaddr = CONFIG_ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS; - int ret; - const struct i2c_dt_spec i2c = I2C_DT_SPEC_GET(DT_INST_PHANDLE(0, mac_eeprom)); - - if (!device_is_ready(i2c.bus)) { - LOG_ERR("Bus device is not ready"); - return; - } - - ret = i2c_write_read_dt(&i2c, - &iaddr, CONFIG_ETH_SAM_GMAC_MAC_I2C_INT_ADDRESS_SIZE, - mac_addr, 6); - - if (ret != 0) { - LOG_ERR("I2C: failed to read MAC addr"); - return; - } -} -#endif - -static void generate_mac(uint8_t mac_addr[6]) -{ -#if DT_INST_NODE_HAS_PROP(0, mac_eeprom) - get_mac_addr_from_i2c_eeprom(mac_addr); -#elif DT_INST_PROP(0, zephyr_random_mac_address) - gen_random_mac(mac_addr, ATMEL_OUI_B0, ATMEL_OUI_B1, ATMEL_OUI_B2); -#endif -} - static void phy_link_state_changed(const struct device *pdev, struct phy_link_state *state, void *user_data) @@ -1836,7 +1805,11 @@ static void eth0_iface_init(struct net_if *iface) return; } - generate_mac(dev_data->mac_addr); + result = net_eth_mac_load(cfg->mcfg, dev_data->mac_addr); + if (result < 0) { + LOG_ERR("Failed to load MAC (%d)", result); + return; + } LOG_INF("MAC: %02x:%02x:%02x:%02x:%02x:%02x", dev_data->mac_addr[0], dev_data->mac_addr[1], @@ -2153,6 +2126,7 @@ static void eth0_irq_config(void) } PINCTRL_DT_INST_DEFINE(0); +NET_ETH_MAC_DT_INST_DEFINE(0); static const struct eth_sam_dev_cfg eth0_config = { .regs = (Gmac *)DT_REG_ADDR(DT_INST_PARENT(0)), @@ -2161,7 +2135,8 @@ static const struct eth_sam_dev_cfg eth0_config = { .clock_cfg = SAM_DT_CLOCK_PMC_CFG(0, DT_INST_PARENT(0)), #endif .config_func = eth0_irq_config, - .phy_dev = DEVICE_DT_GET(DT_INST_PHANDLE(0, phy_handle)) + .phy_dev = DEVICE_DT_GET(DT_INST_PHANDLE(0, phy_handle)), + .mcfg = NET_ETH_MAC_DT_INST_DEV_CONFIG_GET(0), }; static struct eth_sam_dev_data eth0_data = { diff --git a/drivers/ethernet/eth_sam_gmac_priv.h b/drivers/ethernet/eth_sam_gmac_priv.h index c336268fe64ca..0ea54415d311d 100644 --- a/drivers/ethernet/eth_sam_gmac_priv.h +++ b/drivers/ethernet/eth_sam_gmac_priv.h @@ -263,6 +263,7 @@ struct eth_sam_dev_cfg { const struct pinctrl_dev_config *pcfg; void (*config_func)(void); const struct device *phy_dev; + const struct net_eth_mac_config *mcfg; }; /* Device run time data */ diff --git a/drivers/wifi/nrf_wifi/CMakeLists.txt b/drivers/wifi/nrf_wifi/CMakeLists.txt index a3662977ae55e..04ddeb0b56691 100644 --- a/drivers/wifi/nrf_wifi/CMakeLists.txt +++ b/drivers/wifi/nrf_wifi/CMakeLists.txt @@ -13,6 +13,8 @@ zephyr_include_directories( inc # for net_sprint_ll_addr ${ZEPHYR_BASE}/subsys/net/ip + # for net_eth_mac_load + ${ZEPHYR_BASE}/drivers/ethernet ) zephyr_include_directories_ifdef(CONFIG_NRF70_OFFLOADED_RAW_TX diff --git a/drivers/wifi/nrf_wifi/Kconfig.nrfwifi b/drivers/wifi/nrf_wifi/Kconfig.nrfwifi index 29f8c86250a33..ede57128af15c 100644 --- a/drivers/wifi/nrf_wifi/Kconfig.nrfwifi +++ b/drivers/wifi/nrf_wifi/Kconfig.nrfwifi @@ -532,37 +532,6 @@ config NRF70_RPU_EXTEND_TWT_SP mechanism is not used. endif # NRF_WIFI_LOW_POWER -config WIFI_FIXED_MAC_ADDRESS - string "Wi-Fi Fixed MAC address in format XX:XX:XX:XX:XX:XX" - help - This option overrides the MAC address read from OTP. It is strictly for testing purposes only. - -choice - prompt "Wi-Fi MAC address type" - default WIFI_FIXED_MAC_ADDRESS_ENABLED if WIFI_FIXED_MAC_ADDRESS != "" - default WIFI_OTP_MAC_ADDRESS - help - Select the type of MAC address to be used by the Wi-Fi driver - -config WIFI_OTP_MAC_ADDRESS - bool "Use MAC address from OTP" - help - This option uses the MAC address stored in the OTP memory of the nRF70. - -config WIFI_FIXED_MAC_ADDRESS_ENABLED - bool "fixed MAC address" - help - Enable fixed MAC address - -config WIFI_RANDOM_MAC_ADDRESS - bool "Random MAC address generation at runtime" - depends on ENTROPY_GENERATOR - help - This option enables random MAC address generation at runtime. - The random MAC address is generated using the entropy device random generator. - -endchoice - config NRF70_RSSI_STALE_TIMEOUT_MS int "RSSI stale timeout in milliseconds" default 1000 diff --git a/drivers/wifi/nrf_wifi/src/fmac_main.c b/drivers/wifi/nrf_wifi/src/fmac_main.c index 9cef8202f9ebf..e11d0dc8bcfea 100644 --- a/drivers/wifi/nrf_wifi/src/fmac_main.c +++ b/drivers/wifi/nrf_wifi/src/fmac_main.c @@ -974,16 +974,19 @@ static const struct net_wifi_mgmt_offload wifi_offload_ops = { .wifi_drv_ops = &wpa_supp_ops, #endif /* CONFIG_NRF70_STA_MODE */ }; -#endif /* CONFIG_NET_L2_ETHERNET */ - +NET_ETH_MAC_DT_INST_DEFINE(0); +#ifdef CONFIG_NRF70_ENABLE_DUAL_VIF +NET_ETH_MAC_DT_INST_DEFINE(1); +#endif +#endif /* CONFIG_NET_L2_ETHERNET */ #ifdef CONFIG_NET_L2_ETHERNET ETH_NET_DEVICE_DT_INST_DEFINE(0, nrf_wifi_drv_main_zep, /* init_fn */ NULL, /* pm_action_cb */ &rpu_drv_priv_zep.rpu_ctx_zep.vif_ctx_zep[0], /* data */ - NULL, /* cfg */ + NET_ETH_MAC_DT_INST_DEV_CONFIG_GET(0), /* cfg */ CONFIG_WIFI_INIT_PRIORITY, /* prio */ &wifi_offload_ops, /* api */ CONFIG_NRF_WIFI_IFACE_MTU); /*mtu */ @@ -993,7 +996,7 @@ ETH_NET_DEVICE_DT_INST_DEFINE(1, nrf_wifi_drv_main_zep, /* init_fn */ NULL, /* pm_action_cb */ &rpu_drv_priv_zep.rpu_ctx_zep.vif_ctx_zep[1], /* data */ - NULL, /* cfg */ + NET_ETH_MAC_DT_INST_DEV_CONFIG_GET(1), /* cfg */ CONFIG_WIFI_INIT_PRIORITY, /* prio */ &wifi_offload_ops, /* api */ CONFIG_NRF_WIFI_IFACE_MTU); /*mtu */ diff --git a/drivers/wifi/nrf_wifi/src/net_if.c b/drivers/wifi/nrf_wifi/src/net_if.c index d1fc9195dbb2f..31a5cee5e895f 100644 --- a/drivers/wifi/nrf_wifi/src/net_if.c +++ b/drivers/wifi/nrf_wifi/src/net_if.c @@ -11,10 +11,6 @@ #include -#ifdef CONFIG_WIFI_RANDOM_MAC_ADDRESS -#include -#endif - #include LOG_MODULE_DECLARE(wifi_nrf, CONFIG_WIFI_NRF70_LOG_LEVEL); @@ -29,6 +25,7 @@ LOG_MODULE_DECLARE(wifi_nrf, CONFIG_WIFI_NRF70_LOG_LEVEL); #include "fmac_main.h" #include "wpa_supp_if.h" #include "net_if.h" +#include "eth.h" extern char *net_sprint_ll_addr_buf(const uint8_t *ll, uint8_t ll_len, char *buf, int buflen); @@ -553,16 +550,12 @@ static void ip_maddr_event_handler(struct net_if *iface, } #endif /* CONFIG_NRF70_STA_MODE */ -#ifdef CONFIG_WIFI_FIXED_MAC_ADDRESS_ENABLED -BUILD_ASSERT(sizeof(CONFIG_WIFI_FIXED_MAC_ADDRESS) - 1 == ((WIFI_MAC_ADDR_LEN * 2) + 5), - "Invalid fixed MAC address length"); -#endif - enum nrf_wifi_status nrf_wifi_get_mac_addr(struct nrf_wifi_vif_ctx_zep *vif_ctx_zep) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx = NULL; struct nrf_wifi_ctx_zep *rpu_ctx_zep = NULL; + const struct net_eth_mac_config *mac_cfg = NULL; int ret; if (!vif_ctx_zep) { @@ -585,52 +578,30 @@ enum nrf_wifi_status nrf_wifi_get_mac_addr(struct nrf_wifi_vif_ctx_zep *vif_ctx_ } fmac_dev_ctx = rpu_ctx_zep->rpu_ctx; + mac_cfg = vif_ctx_zep->zep_dev_ctx->config; -#ifdef CONFIG_WIFI_FIXED_MAC_ADDRESS_ENABLED - char fixed_mac_addr[WIFI_MAC_ADDR_LEN]; - - ret = net_bytes_from_str(fixed_mac_addr, - WIFI_MAC_ADDR_LEN, - CONFIG_WIFI_FIXED_MAC_ADDRESS); - if (ret < 0) { - LOG_ERR("%s: Failed to parse MAC address: %s", - __func__, - CONFIG_WIFI_FIXED_MAC_ADDRESS); - goto unlock; - } - - memcpy(vif_ctx_zep->mac_addr.addr, - fixed_mac_addr, - WIFI_MAC_ADDR_LEN); -#elif CONFIG_WIFI_RANDOM_MAC_ADDRESS - char random_mac_addr[WIFI_MAC_ADDR_LEN]; - - sys_rand_get(random_mac_addr, WIFI_MAC_ADDR_LEN); - random_mac_addr[0] = (random_mac_addr[0] & UNICAST_MASK) | LOCAL_BIT; - - memcpy(vif_ctx_zep->mac_addr.addr, - random_mac_addr, - WIFI_MAC_ADDR_LEN); -#elif CONFIG_WIFI_OTP_MAC_ADDRESS + ret = net_eth_mac_load(mac_cfg, vif_ctx_zep->mac_addr.addr); + if (ret == -ENODATA) { #ifndef CONFIG_NRF71_ON_IPC - status = nrf_wifi_fmac_otp_mac_addr_get(fmac_dev_ctx, - vif_ctx_zep->vif_idx, - vif_ctx_zep->mac_addr.addr); - if (status != NRF_WIFI_STATUS_SUCCESS) { - LOG_ERR("%s: Fetching of MAC address from OTP failed", - __func__); - goto unlock; - } + status = nrf_wifi_fmac_otp_mac_addr_get(fmac_dev_ctx, vif_ctx_zep->vif_idx, + vif_ctx_zep->mac_addr.addr); + if (status != NRF_WIFI_STATUS_SUCCESS) { + LOG_ERR("%s: Fetching of MAC address from OTP failed", __func__); + goto unlock; + } #else - /* Set dummy MAC address */ - vif_ctx_zep->mac_addr.addr[0] = 0x00; - vif_ctx_zep->mac_addr.addr[1] = 0x00; - vif_ctx_zep->mac_addr.addr[2] = 0x5E; - vif_ctx_zep->mac_addr.addr[3] = 0x00; - vif_ctx_zep->mac_addr.addr[4] = 0x10; - vif_ctx_zep->mac_addr.addr[5] = 0x00; + /* Set dummy MAC address */ + vif_ctx_zep->mac_addr.addr[0] = 0x00; + vif_ctx_zep->mac_addr.addr[1] = 0x00; + vif_ctx_zep->mac_addr.addr[2] = 0x5E; + vif_ctx_zep->mac_addr.addr[3] = 0x00; + vif_ctx_zep->mac_addr.addr[4] = 0x10; + vif_ctx_zep->mac_addr.addr[5] = 0x00; #endif /* !CONFIG_NRF71_ON_IPC */ -#endif + } else if (ret < 0) { + LOG_ERR("%s: Loading of MAC address from config failed (%d)", __func__, ret); + goto unlock; + } if (!nrf_wifi_utils_is_mac_addr_valid(vif_ctx_zep->mac_addr.addr)) { LOG_ERR("%s: Invalid MAC address: %s", diff --git a/dts/bindings/ethernet/ethernet-controller.yaml b/dts/bindings/ethernet/ethernet-controller.yaml index 435c0fb0fcd0c..64cbb86e7aabd 100644 --- a/dts/bindings/ethernet/ethernet-controller.yaml +++ b/dts/bindings/ethernet/ethernet-controller.yaml @@ -3,7 +3,9 @@ # Common fields for Ethernet devices -include: base.yaml +include: + - name: base.yaml + - name: nvmem-consumer.yaml properties: local-mac-address: diff --git a/dts/bindings/wifi/nordic,wlan.yaml b/dts/bindings/wifi/nordic,wlan.yaml index 9c704bc9586f8..4a120f357c67f 100644 --- a/dts/bindings/wifi/nordic,wlan.yaml +++ b/dts/bindings/wifi/nordic,wlan.yaml @@ -9,3 +9,5 @@ description: | interfaces like wlan0. compatible: "nordic,wlan" + +include: wifi-interface.yaml diff --git a/dts/bindings/wifi/wifi-interface.yaml b/dts/bindings/wifi/wifi-interface.yaml new file mode 100644 index 0000000000000..11ad5c7f93b75 --- /dev/null +++ b/dts/bindings/wifi/wifi-interface.yaml @@ -0,0 +1,6 @@ +# Copyright (c) 2025, Basalte bv +# SPDX-License-Identifier: Apache-2.0 + +# Common fields for Wi-Fi interfaces + +include: ethernet-controller.yaml diff --git a/include/zephyr/net/ethernet.h b/include/zephyr/net/ethernet.h index 70a7ca40ab6e7..da9f808f2230f 100644 --- a/include/zephyr/net/ethernet.h +++ b/include/zephyr/net/ethernet.h @@ -14,6 +14,7 @@ #define ZEPHYR_INCLUDE_NET_ETHERNET_H_ #include +#include #include #include #include @@ -1287,6 +1288,75 @@ static inline bool net_eth_is_vlan_interface(struct net_if *iface) #define ETH_NET_L3_REGISTER(name, ptype, handler) \ NET_L3_REGISTER(&NET_L2_GET_NAME(ETHERNET), name, ptype, handler) +enum net_eth_mac_type { + NET_ETH_MAC_DEFAULT = 0, + NET_ETH_MAC_RANDOM, + NET_ETH_MAC_NVMEM, + NET_ETH_MAC_STATIC, +}; + +struct net_eth_mac_config { + enum net_eth_mac_type type; + uint8_t addr[NET_ETH_ADDR_LEN]; + uint8_t addr_len; + struct nvmem_cell cell; +}; + +/** @cond INTERNAL_HIDDEN */ + +/** + * @brief Obtain the variable name storing ethernet MAC config for the + * given DT node identifier. + * + * @param node_id Node identifier. + */ +#define Z_NET_ETH_MAC_DEV_CONFIG_NAME(node_id) \ + _CONCAT(__net_eth_mac_dev_config, DEVICE_DT_NAME_GET(node_id)) + +#define Z_NET_ETH_MAC_DEV_CONFIG_TYPE(node_id) \ + COND_CODE_1(DT_PROP(node_id, zephyr_random_mac_address), \ + (NET_ETH_MAC_RANDOM), \ + (COND_CODE_1(DT_NVMEM_CELLS_HAS_NAME(node_id, mac_address), \ + (NET_ETH_MAC_NVMEM), \ + (COND_CODE_1(DT_NODE_HAS_PROP(node_id, local_mac_address), \ + (NET_ETH_MAC_STATIC), \ + (NET_ETH_MAC_DEFAULT)))))) + +#define Z_NET_ETH_MAC_DEV_CONFIG_INIT(node_id) \ + { \ + .type = Z_NET_ETH_MAC_DEV_CONFIG_TYPE(node_id), \ + .addr = DT_PROP_OR(node_id, local_mac_address, {0}), \ + .addr_len = DT_PROP_LEN_OR(node_id, local_mac_address, 0), \ + .cell = NVMEM_CELL_GET_BY_NAME_OR(node_id, mac_address, {0}), \ + } + +/** @endcond */ + +#define NET_ETH_MAC_DT_DEFINE(node_id) \ + static const struct net_eth_mac_config Z_NET_ETH_MAC_DEV_CONFIG_NAME(node_id) = \ + Z_NET_ETH_MAC_DEV_CONFIG_INIT(node_id) + +#define NET_ETH_MAC_DT_INST_DEFINE(inst) NET_ETH_MAC_DT_DEFINE(DT_DRV_INST(inst)) + +/** + * @brief Obtain a reference to the ethernet MAC configuration given a node + * identifier. + * + * @param node_id Node identifier. + */ +#define NET_ETH_MAC_DT_DEV_CONFIG_GET(node_id) &Z_NET_ETH_MAC_DEV_CONFIG_NAME(node_id) + +/** + * @brief Obtain a reference to the ethernet MAC configuration given current + * compatible instance number. + * + * @param inst Instance number. + * + * @see #NET_ETH_MAC_DT_DEV_CONFIG_GET + */ +#define NET_ETH_MAC_DT_INST_DEV_CONFIG_GET(inst) \ + NET_ETH_MAC_DT_DEV_CONFIG_GET(DT_DRV_INST(inst)) + /** * @brief Inform ethernet L2 driver that ethernet carrier is detected. * This happens when cable is connected. diff --git a/samples/net/gptp/boards/sam_e70_xplained_same70q21.conf b/samples/net/gptp/boards/sam_e70_xplained_same70q21.conf index d4118583c5072..3cbf10cba5f30 100644 --- a/samples/net/gptp/boards/sam_e70_xplained_same70q21.conf +++ b/samples/net/gptp/boards/sam_e70_xplained_same70q21.conf @@ -1,4 +1,2 @@ # GMAC driver settings CONFIG_PTP_CLOCK_SAM_GMAC=y - -CONFIG_ETH_SAM_GMAC_MAC_I2C_EEPROM=y