Port nvmem help to read mac-address from nvmem cell linked to the ethernet node. This function was ported from kernel 5.8-rc1. Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> --- include/net.h | 4 ++++ net/eth.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/net.h b/include/net.h index 54db8a179a..a5bfe9e7f8 100644 --- a/include/net.h +++ b/include/net.h @@ -97,9 +97,13 @@ static inline void of_eth_register_ethaddr(struct device_node *node, const char *ethaddr) { } +static inline int nvmem_get_mac_address(struct device_d *dev, void *addrbuf) +{ +} #else void eth_register_ethaddr(int ethid, const char *ethaddr); void of_eth_register_ethaddr(struct device_node *node, const char *ethaddr); +int nvmem_get_mac_address(struct device_d *dev, void *addrbuf); #endif /* * Ethernet header diff --git a/net/eth.c b/net/eth.c index e3d0d06efe..b33ef5fe1f 100644 --- a/net/eth.c +++ b/net/eth.c @@ -29,6 +29,7 @@ #include <globalvar.h> #include <environment.h> #include <linux/ctype.h> +#include <linux/nvmem-consumer.h> #include <linux/stat.h> static uint64_t last_link_check; @@ -152,6 +153,43 @@ void of_eth_register_ethaddr(struct device_node *node, const char *ethaddr) list_add_tail(&addr->list, ðaddr_list); } +/** + * Obtain the MAC address from an nvmem cell named 'mac-address' associated + * with given device. + * + * @dev: Device with which the mac-address cell is associated. + * @addrbuf: Buffer to which the MAC address will be copied on success. + * + * Returns 0 on success or a negative error number on failure. + */ +int nvmem_get_mac_address(struct device_d *dev, void *addrbuf) +{ + struct nvmem_cell *cell; + const void *mac; + size_t len; + + cell = nvmem_cell_get(dev, "mac-address"); + if (IS_ERR(cell)) + return PTR_ERR(cell); + + mac = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + + if (IS_ERR(mac)) + return PTR_ERR(mac); + + if (len != ETH_ALEN || !is_valid_ether_addr(mac)) { + kfree(mac); + return -EINVAL; + } + + memcpy(addrbuf, mac, ETH_ALEN); + kfree(mac); + + return 0; +} +EXPORT_SYMBOL(nvmem_get_mac_address); + struct eth_device *eth_get_byname(const char *ethname) { struct eth_device *edev; -- 2.27.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox