From: Tim Harvey Subject: [PATCH] sky2: allow mac to come from dt The driver reads the mac address from the device registers which would need to have been programmed by the bootloader. This patch adds the ability to pull the mac from devicetree via the aliases/sky2 node. Signed-off-by: Tim Harvey --- drivers/net/ethernet/marvell/sky2.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include @@ -4748,6 +4750,7 @@ static struct net_device *sky2_init_netd { struct sky2_port *sky2; struct net_device *dev = alloc_etherdev(sizeof(*sky2)); + unsigned char *iap, tmpaddr[ETH_ALEN]; if (!dev) return NULL; @@ -4802,8 +4805,36 @@ static struct net_device *sky2_init_netd dev->features |= dev->hw_features; + /* + * try to get mac address in the following order: + * 1) from device tree data + * 2) from internal registers set by bootloader + */ + iap = NULL; + if (IS_ENABLED(CONFIG_OF)) { + struct device_node *np; + np = of_find_node_by_path("/aliases"); + if (np) { + const char *path = of_get_property(np, "sky2", NULL); + if (path) + np = of_find_node_by_path(path); + if (np) + path = of_get_mac_address(np); + if (path) + iap = (unsigned char *) path; + } + } + + /* + * 2) mac registers set by bootloader + */ + if (!iap || !is_valid_ether_addr(iap)) { + memcpy_fromio(&tmpaddr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); + iap = &tmpaddr[0]; + } + /* read the mac address */ - memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); + memcpy(dev->dev_addr, iap, ETH_ALEN); return dev; }