mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			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;
 | 
						|
 }
 |