kernel: fold of_get_mac_address_mtd into of_get_mac_address

This makes it easier to keep drivers in sync with upstream

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 48026
This commit is contained in:
Felix Fietkau 2016-01-01 18:57:29 +00:00
parent 22693a9086
commit 46519964ff
3 changed files with 112 additions and 94 deletions

View File

@ -1,6 +1,6 @@
From: John Crispin <blogic@openwrt.org> From: John Crispin <blogic@openwrt.org>
Date: Sun, 27 Jul 2014 09:40:01 +0100 Date: Sun, 27 Jul 2014 09:40:01 +0100
Subject: NET: add of_get_mac_address_mtd() Subject: NET: add mtd-mac-address support to of_get_mac_address()
Many embedded devices have information such as mac addresses stored inside mtd Many embedded devices have information such as mac addresses stored inside mtd
devices. This patch allows us to add a property inside a node describing a devices. This patch allows us to add a property inside a node describing a
@ -8,6 +8,7 @@ network interface. The new property points at a mtd partition with an offset
where the mac address can be found. where the mac address can be found.
Signed-off-by: John Crispin <blogic@openwrt.org> Signed-off-by: John Crispin <blogic@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- ---
drivers/of/of_net.c | 37 +++++++++++++++++++++++++++++++++++++ drivers/of/of_net.c | 37 +++++++++++++++++++++++++++++++++++++
include/linux/of_net.h | 1 + include/linux/of_net.h | 1 +
@ -23,15 +24,15 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
/** /**
* of_get_phy_mode - Get phy mode for given device_node * of_get_phy_mode - Get phy mode for given device_node
@@ -80,3 +81,45 @@ const void *of_get_mac_address(struct de @@ -47,6 +48,66 @@ static const void *of_get_mac_addr(struc
return of_get_mac_addr(np, "address"); return NULL;
} }
EXPORT_SYMBOL(of_get_mac_address);
+ +static const void *of_get_mac_address_mtd(struct device_node *np)
+#ifdef CONFIG_MTD
+int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac)
+{ +{
+#ifdef CONFIG_MTD
+ struct device_node *mtd_np = NULL; + struct device_node *mtd_np = NULL;
+ struct property *prop;
+ size_t retlen; + size_t retlen;
+ int size, ret; + int size, ret;
+ struct mtd_info *mtd; + struct mtd_info *mtd;
@ -39,17 +40,18 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ const __be32 *list; + const __be32 *list;
+ phandle phandle; + phandle phandle;
+ u32 mac_inc = 0; + u32 mac_inc = 0;
+ u8 mac[ETH_ALEN];
+ +
+ list = of_get_property(np, "mtd-mac-address", &size); + list = of_get_property(np, "mtd-mac-address", &size);
+ if (!list || (size != (2 * sizeof(*list)))) + if (!list || (size != (2 * sizeof(*list))))
+ return -ENOENT; + return NULL;
+ +
+ phandle = be32_to_cpup(list++); + phandle = be32_to_cpup(list++);
+ if (phandle) + if (phandle)
+ mtd_np = of_find_node_by_phandle(phandle); + mtd_np = of_find_node_by_phandle(phandle);
+ +
+ if (!mtd_np) + if (!mtd_np)
+ return -ENOENT; + return NULL;
+ +
+ part = of_get_property(mtd_np, "label", NULL); + part = of_get_property(mtd_np, "label", NULL);
+ if (!part) + if (!part)
@ -57,7 +59,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
+ mtd = get_mtd_device_nm(part); + mtd = get_mtd_device_nm(part);
+ if (IS_ERR(mtd)) + if (IS_ERR(mtd))
+ return PTR_ERR(mtd); + return NULL;
+ +
+ ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, mac); + ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, mac);
+ put_mtd_device(mtd); + put_mtd_device(mtd);
@ -65,24 +67,49 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ if (!of_property_read_u32(np, "mtd-mac-address-increment", &mac_inc)) + if (!of_property_read_u32(np, "mtd-mac-address-increment", &mac_inc))
+ mac[5] += mac_inc; + mac[5] += mac_inc;
+ +
+ return ret; + if (!is_valid_ether_addr(mac))
+} + return NULL;
+EXPORT_SYMBOL_GPL(of_get_mac_address_mtd); +
+ prop = kzalloc(sizeof(*prop), GFP_KERNEL);
+ if (!prop)
+ return NULL;
+
+ prop->name = "mac-address";
+ prop->length = ETH_ALEN;
+ prop->value = kmemdup(mac, ETH_ALEN, GFP_KERNEL);
+ if (!prop->value || of_add_property(np, prop))
+ goto free;
+
+ return prop->value;
+free:
+ kfree(prop->value);
+ kfree(prop);
+#endif +#endif
--- a/include/linux/of_net.h + return NULL;
+++ b/include/linux/of_net.h
@@ -13,6 +13,14 @@
struct net_device;
extern int of_get_phy_mode(struct device_node *np);
extern const void *of_get_mac_address(struct device_node *np);
+#ifdef CONFIG_MTD
+extern int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac);
+#else
+static inline int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac)
+{
+ return -ENOENT;
+} +}
+#endif +
extern struct net_device *of_find_net_device_by_node(struct device_node *np); /**
#else * Search the device tree for the best MAC address to use. 'mac-address' is
static inline int of_get_phy_mode(struct device_node *np) * checked first, because that is supposed to contain to "most recent" MAC
@@ -64,6 +125,9 @@ static const void *of_get_mac_addr(struc
* addresses. Some older U-Boots only initialized 'local-mac-address'. In
* this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
* but is all zeros.
+ *
+ * If a mtd-mac-address property exists, try to fetch the MAC address from the
+ * specified mtd device, and store it as a 'mac-address' property
*/
const void *of_get_mac_address(struct device_node *np)
{
@@ -77,6 +141,10 @@ const void *of_get_mac_address(struct de
if (addr)
return addr;
- return of_get_mac_addr(np, "address");
+ addr = of_get_mac_addr(np, "address");
+ if (addr)
+ return addr;
+
+ return of_get_mac_address_mtd(np);
}
EXPORT_SYMBOL(of_get_mac_address);

View File

@ -1,6 +1,6 @@
From: John Crispin <blogic@openwrt.org> From: John Crispin <blogic@openwrt.org>
Date: Sun, 27 Jul 2014 09:40:01 +0100 Date: Sun, 27 Jul 2014 09:40:01 +0100
Subject: NET: add of_get_mac_address_mtd() Subject: NET: add mtd-mac-address support to of_get_mac_address()
Many embedded devices have information such as mac addresses stored inside mtd Many embedded devices have information such as mac addresses stored inside mtd
devices. This patch allows us to add a property inside a node describing a devices. This patch allows us to add a property inside a node describing a
@ -8,6 +8,7 @@ network interface. The new property points at a mtd partition with an offset
where the mac address can be found. where the mac address can be found.
Signed-off-by: John Crispin <blogic@openwrt.org> Signed-off-by: John Crispin <blogic@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- ---
drivers/of/of_net.c | 37 +++++++++++++++++++++++++++++++++++++ drivers/of/of_net.c | 37 +++++++++++++++++++++++++++++++++++++
include/linux/of_net.h | 1 + include/linux/of_net.h | 1 +
@ -23,15 +24,15 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
/** /**
* of_get_phy_mode - Get phy mode for given device_node * of_get_phy_mode - Get phy mode for given device_node
@@ -80,3 +81,45 @@ const void *of_get_mac_address(struct de @@ -47,6 +48,66 @@ static const void *of_get_mac_addr(struc
return of_get_mac_addr(np, "address"); return NULL;
} }
EXPORT_SYMBOL(of_get_mac_address);
+ +static const void *of_get_mac_address_mtd(struct device_node *np)
+#ifdef CONFIG_MTD
+int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac)
+{ +{
+#ifdef CONFIG_MTD
+ struct device_node *mtd_np = NULL; + struct device_node *mtd_np = NULL;
+ struct property *prop;
+ size_t retlen; + size_t retlen;
+ int size, ret; + int size, ret;
+ struct mtd_info *mtd; + struct mtd_info *mtd;
@ -39,17 +40,18 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ const __be32 *list; + const __be32 *list;
+ phandle phandle; + phandle phandle;
+ u32 mac_inc = 0; + u32 mac_inc = 0;
+ u8 mac[ETH_ALEN];
+ +
+ list = of_get_property(np, "mtd-mac-address", &size); + list = of_get_property(np, "mtd-mac-address", &size);
+ if (!list || (size != (2 * sizeof(*list)))) + if (!list || (size != (2 * sizeof(*list))))
+ return -ENOENT; + return NULL;
+ +
+ phandle = be32_to_cpup(list++); + phandle = be32_to_cpup(list++);
+ if (phandle) + if (phandle)
+ mtd_np = of_find_node_by_phandle(phandle); + mtd_np = of_find_node_by_phandle(phandle);
+ +
+ if (!mtd_np) + if (!mtd_np)
+ return -ENOENT; + return NULL;
+ +
+ part = of_get_property(mtd_np, "label", NULL); + part = of_get_property(mtd_np, "label", NULL);
+ if (!part) + if (!part)
@ -57,7 +59,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ +
+ mtd = get_mtd_device_nm(part); + mtd = get_mtd_device_nm(part);
+ if (IS_ERR(mtd)) + if (IS_ERR(mtd))
+ return PTR_ERR(mtd); + return NULL;
+ +
+ ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, mac); + ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, mac);
+ put_mtd_device(mtd); + put_mtd_device(mtd);
@ -65,24 +67,49 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
+ if (!of_property_read_u32(np, "mtd-mac-address-increment", &mac_inc)) + if (!of_property_read_u32(np, "mtd-mac-address-increment", &mac_inc))
+ mac[5] += mac_inc; + mac[5] += mac_inc;
+ +
+ return ret; + if (!is_valid_ether_addr(mac))
+} + return NULL;
+EXPORT_SYMBOL_GPL(of_get_mac_address_mtd); +
+ prop = kzalloc(sizeof(*prop), GFP_KERNEL);
+ if (!prop)
+ return NULL;
+
+ prop->name = "mac-address";
+ prop->length = ETH_ALEN;
+ prop->value = kmemdup(mac, ETH_ALEN, GFP_KERNEL);
+ if (!prop->value || of_add_property(np, prop))
+ goto free;
+
+ return prop->value;
+free:
+ kfree(prop->value);
+ kfree(prop);
+#endif +#endif
--- a/include/linux/of_net.h + return NULL;
+++ b/include/linux/of_net.h
@@ -13,6 +13,14 @@
struct net_device;
extern int of_get_phy_mode(struct device_node *np);
extern const void *of_get_mac_address(struct device_node *np);
+#ifdef CONFIG_MTD
+extern int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac);
+#else
+static inline int of_get_mac_address_mtd(struct device_node *np, unsigned char *mac)
+{
+ return -ENOENT;
+} +}
+#endif +
extern struct net_device *of_find_net_device_by_node(struct device_node *np); /**
#else * Search the device tree for the best MAC address to use. 'mac-address' is
static inline int of_get_phy_mode(struct device_node *np) * checked first, because that is supposed to contain to "most recent" MAC
@@ -64,6 +125,9 @@ static const void *of_get_mac_addr(struc
* addresses. Some older U-Boots only initialized 'local-mac-address'. In
* this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
* but is all zeros.
+ *
+ * If a mtd-mac-address property exists, try to fetch the MAC address from the
+ * specified mtd device, and store it as a 'mac-address' property
*/
const void *of_get_mac_address(struct device_node *np)
{
@@ -77,6 +141,10 @@ const void *of_get_mac_address(struct de
if (addr)
return addr;
- return of_get_mac_addr(np, "address");
+ addr = of_get_mac_addr(np, "address");
+ if (addr)
+ return addr;
+
+ return of_get_mac_address_mtd(np);
}
EXPORT_SYMBOL(of_get_mac_address);

View File

@ -1,36 +0,0 @@
From fce0d89383e0a2a694723989da608df1a464bae4 Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Sun, 13 Dec 2015 17:45:19 +0100
Subject: [PATCH 1/2] net: mediatek: add of_get_mac_address_mtd() support
Signed-off-by: John Crispin <blogic@openwrt.org>
---
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index fb435fa..9999768 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1273,7 +1273,6 @@ static int __init fe_init(struct net_device *dev)
{
struct fe_priv *priv = netdev_priv(dev);
struct device_node *port;
- const char *mac_addr;
int err;
priv->soc->reset_fe();
@@ -1281,9 +1280,7 @@ static int __init fe_init(struct net_device *dev)
if (priv->soc->switch_init)
priv->soc->switch_init(priv);
- mac_addr = of_get_mac_address(priv->device->of_node);
- if (mac_addr)
- ether_addr_copy(dev->dev_addr, mac_addr);
+ of_get_mac_address_mtd(priv->device->of_node, dev->dev_addr);
/*If the mac address is invalid, use random mac address */
if (!is_valid_ether_addr(dev->dev_addr)) {
--
1.7.10.4