|
@@ -44,6 +44,8 @@
|
|
|
#include <linux/prefetch.h>
|
|
|
#include <linux/debugfs.h>
|
|
|
#include <linux/mii.h>
|
|
|
+#include <linux/of_device.h>
|
|
|
+#include <linux/of_net.h>
|
|
|
|
|
|
#include <asm/irq.h>
|
|
|
|
|
@@ -4748,6 +4750,7 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
|
|
|
{
|
|
|
struct sky2_port *sky2;
|
|
|
struct net_device *dev = alloc_etherdev(sizeof(*sky2));
|
|
|
+ const void *iap;
|
|
|
|
|
|
if (!dev)
|
|
|
return NULL;
|
|
@@ -4805,8 +4808,16 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
|
|
|
|
|
|
dev->features |= dev->hw_features;
|
|
|
|
|
|
- /* read the mac address */
|
|
|
- memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN);
|
|
|
+ /* try to get mac address in the following order:
|
|
|
+ * 1) from device tree data
|
|
|
+ * 2) from internal registers set by bootloader
|
|
|
+ */
|
|
|
+ iap = of_get_mac_address(hw->pdev->dev.of_node);
|
|
|
+ if (iap)
|
|
|
+ memcpy(dev->dev_addr, iap, ETH_ALEN);
|
|
|
+ else
|
|
|
+ memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
|
|
|
+ ETH_ALEN);
|
|
|
|
|
|
return dev;
|
|
|
}
|