Skip to content

Commit

Permalink
of: net: support NVMEM cells with MAC in text format
Browse files Browse the repository at this point in the history
Some NVMEM devices have text based cells. In such cases MAC is stored in
a XX:XX:XX:XX:XX:XX format. Use mac_pton() to parse such data and
support those NVMEM cells. This is required to support e.g. a very
popular U-Boot and its environment variables.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Rafał Miłecki authored and David S. Miller committed Dec 29, 2021
1 parent 271d3be commit 9ed319e
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions net/core/of_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
{
struct platform_device *pdev = of_find_device_by_node(np);
struct nvmem_cell *cell;
const void *mac;
const void *buf;
size_t len;
int ret;

Expand All @@ -78,21 +78,32 @@ static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
if (IS_ERR(cell))
return PTR_ERR(cell);

mac = nvmem_cell_read(cell, &len);
buf = 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;
if (IS_ERR(buf))
return PTR_ERR(buf);

ret = 0;
if (len == ETH_ALEN) {
if (is_valid_ether_addr(buf))
memcpy(addr, buf, ETH_ALEN);
else
ret = -EINVAL;
} else if (len == 3 * ETH_ALEN - 1) {
u8 mac[ETH_ALEN];

if (mac_pton(buf, mac))
memcpy(addr, mac, ETH_ALEN);
else
ret = -EINVAL;
} else {
ret = -EINVAL;
}

memcpy(addr, mac, ETH_ALEN);
kfree(mac);
kfree(buf);

return 0;
return ret;
}

/**
Expand Down

0 comments on commit 9ed319e

Please sign in to comment.