2021-04-15 00:32:41

by Michael Walle

[permalink] [raw]
Subject: [PATCH net-next 0/3] net: add support for an offset of a nvmem provided MAC address

Boards with multiple ethernet ports might store their MAC addresses not
individually per port but just store one base MAC address. To get the
MAC address of a specific network port we have to add an offset.

This series adds a new device tree property "nvmem-mac-address-offset".

Michael Walle (3):
dt-bindings: net: add nvmem-mac-address-offset property
net: add helper eth_addr_add()
net: implement nvmem-mac-address-offset DT property

.../bindings/net/ethernet-controller.yaml | 6 ++++++
drivers/of/of_net.c | 4 ++++
include/linux/etherdevice.h | 14 ++++++++++++++
net/ethernet/eth.c | 5 +++++
4 files changed, 29 insertions(+)

--
2.20.1


2021-04-15 00:33:24

by Michael Walle

[permalink] [raw]
Subject: [PATCH net-next 3/3] net: implement nvmem-mac-address-offset DT property

The MAC address fetched by an NVMEM provider might have an offset to it.
Add the support for it in nvmem_get_mac_address().

Signed-off-by: Michael Walle <[email protected]>
---
drivers/of/of_net.c | 4 ++++
net/ethernet/eth.c | 5 +++++
2 files changed, 9 insertions(+)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index dbac3a172a11..60c6048a823a 100644
--- a/drivers/of/of_net.c
+++ b/drivers/of/of_net.c
@@ -63,6 +63,7 @@ static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
struct nvmem_cell *cell;
const void *mac;
size_t len;
+ u32 offset;
int ret;

/* Try lookup by device first, there might be a nvmem_cell_lookup
@@ -92,6 +93,9 @@ static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
memcpy(addr, mac, ETH_ALEN);
kfree(mac);

+ if (!of_property_read_u32(np, "nvmem-mac-address-offset", &offset))
+ eth_addr_add(addr, offset);
+
return 0;
}

diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
index 9cce612e8976..fe5311f614fe 100644
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
@@ -541,6 +541,7 @@ int nvmem_get_mac_address(struct device *dev, void *addrbuf)
{
struct nvmem_cell *cell;
const void *mac;
+ u32 offset;
size_t len;

cell = nvmem_cell_get(dev, "mac-address");
@@ -561,6 +562,10 @@ int nvmem_get_mac_address(struct device *dev, void *addrbuf)
ether_addr_copy(addrbuf, mac);
kfree(mac);

+ if (!device_property_read_u32(dev, "nvmem-mac-address-offset",
+ &offset))
+ eth_addr_add(addrbuf, offset);
+
return 0;
}
EXPORT_SYMBOL(nvmem_get_mac_address);
--
2.20.1