aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/imx6/patches-3.10/020-marvell-sky2-macdt.patch
blob: e1639d6223fe70f615e52ece99b597bba9a87832 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
--- 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;
@@ -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;
 }