70 lines
1.9 KiB
Diff
70 lines
1.9 KiB
Diff
|
From: Tim Harvey <tharvey@gateworks.com>
|
||
|
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 <tharvey@gateworks.com>
|
||
|
---
|
||
|
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 <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_netd
|
||
|
{
|
||
|
struct sky2_port *sky2;
|
||
|
struct net_device *dev = alloc_etherdev(sizeof(*sky2));
|
||
|
+ unsigned char *iap, tmpaddr[ETH_ALEN];
|
||
|
|
||
|
if (!dev)
|
||
|
return NULL;
|
||
|
@@ -4805,8 +4808,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;
|
||
|
}
|