From 8585756342caa6d27008d1ad0c18023e4211a40a Mon Sep 17 00:00:00 2001 From: OpenWrt community Date: Wed, 13 Jul 2022 12:22:48 +0200 Subject: [PATCH] of/of_net: write back netdev MAC-address to device-tree The label-mac logic relies on the mac-address property of a netdev devices of-node. However, the mac address can also be stored as a different property or read from e.g. an mtd device. Create this node when reading a mac-address from OF if it does not already exist and copy the mac-address used for the device to this property. This way, the MAC address can be accessed using procfs. --- net/core/of_net.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) --- a/net/core/of_net.c +++ b/net/core/of_net.c @@ -95,6 +95,27 @@ static int of_get_mac_addr_nvmem(struct } EXPORT_SYMBOL(of_get_mac_address_nvmem); +static int of_add_mac_address(struct device_node *np, u8* addr) +{ + struct property *prop; + + prop = kzalloc(sizeof(*prop), GFP_KERNEL); + if (!prop) + return -ENOMEM; + + prop->name = "mac-address"; + prop->length = ETH_ALEN; + prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL); + if (!prop->value || of_update_property(np, prop)) + goto free; + + return 0; +free: + kfree(prop->value); + kfree(prop); + return -ENOMEM; +} + /** * of_get_mac_address() * @np: Caller's Device Node @@ -130,17 +151,23 @@ int of_get_mac_address(struct device_nod ret = of_get_mac_addr(np, "mac-address", addr); if (!ret) - return 0; + goto found; ret = of_get_mac_addr(np, "local-mac-address", addr); if (!ret) - return 0; + goto found; ret = of_get_mac_addr(np, "address", addr); if (!ret) - return 0; + goto found; - return of_get_mac_address_nvmem(np, addr); + ret = of_get_mac_address_nvmem(np, addr); + if (ret) + return ret; + +found: + ret = of_add_mac_address(np, addr); + return ret; } EXPORT_SYMBOL(of_get_mac_address);