diff options
Diffstat (limited to 'target/linux/imx6/patches-3.12/0050-sky2-allow-mac-to-come-from-dt.patch')
-rw-r--r-- | target/linux/imx6/patches-3.12/0050-sky2-allow-mac-to-come-from-dt.patch | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/target/linux/imx6/patches-3.12/0050-sky2-allow-mac-to-come-from-dt.patch b/target/linux/imx6/patches-3.12/0050-sky2-allow-mac-to-come-from-dt.patch new file mode 100644 index 0000000000..54743a5d99 --- /dev/null +++ b/target/linux/imx6/patches-3.12/0050-sky2-allow-mac-to-come-from-dt.patch @@ -0,0 +1,69 @@ +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; +@@ -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; ++ 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; + } |