@@ -8,6 +8,7 @@
#include <linux/etherdevice.h>
#include <linux/kernel.h>
#include <linux/of_net.h>
+#include <linux/of_platform.h>
#include <linux/phy.h>
#include <linux/export.h>
@@ -47,12 +48,45 @@ static const void *of_get_mac_addr(struct device_node *np, const char *name)
return NULL;
}
+static const void *of_get_mac_addr_nvmem(struct device_node *np)
+{
+ int r;
+ u8 mac[ETH_ALEN];
+ struct property *pp;
+ struct platform_device *pdev = of_find_device_by_node(np);
+
+ if (!pdev)
+ return NULL;
+
+ r = nvmem_get_mac_address(&pdev->dev, &mac);
+ if (r < 0)
+ return NULL;
+
+ pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+ if (!pp)
+ return NULL;
+
+ pp->name = "nvmem-mac-address";
+ pp->length = ETH_ALEN;
+ pp->value = kmemdup(mac, ETH_ALEN, GFP_KERNEL);
+ if (!pp->value || of_add_property(np, pp))
+ goto free;
+
+ return pp->value;
+free:
+ kfree(pp->value);
+ kfree(pp);
+
+ return NULL;
+}
+
/**
- * Search the device tree for the best MAC address to use. 'mac-address' is
- * checked first, because that is supposed to contain to "most recent" MAC
- * address. If that isn't set, then 'local-mac-address' is checked next,
- * because that is the default address. If that isn't set, then the obsolete
- * 'address' is checked, just in case we're using an old device tree.
+ * Search the device tree for the best MAC address to use. Check NVME first as
+ * it should contain the proper MAC address, then 'mac-address' is checked
+ * next, because that is supposed to contain to "most recent" MAC address. If
+ * that isn't set, then 'local-mac-address' is checked next, because that is
+ * the default address. If that isn't set, then the obsolete 'address' is
+ * checked, just in case we're using an old device tree.
*
* Note that the 'address' property is supposed to contain a virtual address of
* the register set, but some DTS files have redefined that property to be the
@@ -69,6 +103,10 @@ const void *of_get_mac_address(struct device_node *np)
{
const void *addr;
+ addr = of_get_mac_addr_nvmem(np);
+ if (addr)
+ return addr;
+
addr = of_get_mac_addr(np, "mac-address");
if (addr)
return addr;