--- 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; +#ifdef 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; + } +#endif + + /* + * 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; }