From: Matthias Schiffer Date: Thu, 30 Apr 2015 02:10:54 +0200 Subject: mpc85xx: gianfar: add add mtd-mac-address support diff --git a/target/linux/mpc85xx/patches-3.10/101-NET-add-of_get_mac_address_mtd.patch b/target/linux/mpc85xx/patches-3.10/101-NET-add-of_get_mac_address_mtd.patch new file mode 100644 index 0000000..cd88d2b --- /dev/null +++ b/target/linux/mpc85xx/patches-3.10/101-NET-add-of_get_mac_address_mtd.patch @@ -0,0 +1,76 @@ +From 92f38460229a8816404408f036f0a374f1013d0e Mon Sep 17 00:00:00 2001 +From: John Crispin +Date: Sun, 27 Jul 2014 09:40:01 +0100 +Subject: NET: add of_get_mac_address_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 +network interface. The new property points at a mtd partition with an offset +where the mac address can be found. + +Signed-off-by: John Crispin +--- + drivers/of/of_net.c | 37 +++++++++++++++++++++++++++++++++++++ + include/linux/of_net.h | 1 + + 2 files changed, 38 insertions(+) + +--- a/drivers/of/of_net.c ++++ b/drivers/of/of_net.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + /** + * It maps 'enum phy_interface_t' found in include/linux/phy.h +@@ -92,3 +93,39 @@ const void *of_get_mac_address(struct de + return NULL; + } + EXPORT_SYMBOL(of_get_mac_address); ++ ++int of_get_mac_address_mtd(struct device_node *np, void *mac) ++{ ++ struct device_node *mtd_np = NULL; ++ size_t retlen; ++ int size, ret; ++ struct mtd_info *mtd; ++ const char *part; ++ const __be32 *list; ++ phandle phandle; ++ ++ list = of_get_property(np, "mtd-mac-address", &size); ++ if (!list || (size != (2 * sizeof(*list)))) ++ return -ENOENT; ++ ++ phandle = be32_to_cpup(list++); ++ if (phandle) ++ mtd_np = of_find_node_by_phandle(phandle); ++ ++ if (!mtd_np) ++ return -ENOENT; ++ ++ part = of_get_property(mtd_np, "label", NULL); ++ if (!part) ++ part = mtd_np->name; ++ ++ mtd = get_mtd_device_nm(part); ++ if (IS_ERR(mtd)) ++ return PTR_ERR(mtd); ++ ++ ret = mtd_read(mtd, be32_to_cpup(list), 6, &retlen, (u_char *) mac); ++ put_mtd_device(mtd); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(of_get_mac_address_mtd); +--- a/include/linux/of_net.h ++++ b/include/linux/of_net.h +@@ -11,6 +11,7 @@ + #include + extern const int of_get_phy_mode(struct device_node *np); + extern const void *of_get_mac_address(struct device_node *np); ++extern int of_get_mac_address_mtd(struct device_node *np, void *mac); + #else + static inline const int of_get_phy_mode(struct device_node *np) + { diff --git a/target/linux/mpc85xx/patches-3.10/201-net-gianfar-use-mtd-mac-address.patch b/target/linux/mpc85xx/patches-3.10/201-net-gianfar-use-mtd-mac-address.patch new file mode 100644 index 0000000..1de4418 --- /dev/null +++ b/target/linux/mpc85xx/patches-3.10/201-net-gianfar-use-mtd-mac-address.patch @@ -0,0 +1,19 @@ +--- a/drivers/net/ethernet/freescale/gianfar.c ++++ b/drivers/net/ethernet/freescale/gianfar.c +@@ -741,10 +741,13 @@ static int gfar_of_init(struct platform_ + if (stash_len || stash_idx) + priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING; + +- mac_addr = of_get_mac_address(np); ++ err = of_get_mac_address_mtd(np, dev->dev_addr); ++ if (err) { ++ mac_addr = of_get_mac_address(np); + +- if (mac_addr) +- memcpy(dev->dev_addr, mac_addr, ETH_ALEN); ++ if (mac_addr) ++ memcpy(dev->dev_addr, mac_addr, ETH_ALEN); ++ } + + if (model && !strcasecmp(model, "TSEC")) + priv->device_flags = FSL_GIANFAR_DEV_HAS_GIGABIT | diff --git a/target/linux/mpc85xx/patches-3.10/220-fix_gianfar_reported_number_of_sent_bytes_to_BQL.patch b/target/linux/mpc85xx/patches-3.10/220-fix_gianfar_reported_number_of_sent_bytes_to_BQL.patch index d0380ff..0d510bc 100644 --- a/target/linux/mpc85xx/patches-3.10/220-fix_gianfar_reported_number_of_sent_bytes_to_BQL.patch +++ b/target/linux/mpc85xx/patches-3.10/220-fix_gianfar_reported_number_of_sent_bytes_to_BQL.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c -@@ -2064,7 +2064,7 @@ static int gfar_start_xmit(struct sk_buf +@@ -2067,7 +2067,7 @@ static int gfar_start_xmit(struct sk_buf int i, rq = 0, do_tstamp = 0; u32 bufaddr; unsigned long flags; @@ -9,7 +9,7 @@ /* TOE=1 frames larger than 2500 bytes may see excess delays * before start of transmission. -@@ -2130,7 +2130,10 @@ static int gfar_start_xmit(struct sk_buf +@@ -2133,7 +2133,10 @@ static int gfar_start_xmit(struct sk_buf } /* Update transmit stats */ @@ -21,7 +21,7 @@ tx_queue->stats.tx_packets++; txbdp = txbdp_start = tx_queue->cur_tx; -@@ -2150,12 +2153,13 @@ static int gfar_start_xmit(struct sk_buf +@@ -2153,12 +2156,13 @@ static int gfar_start_xmit(struct sk_buf } else { /* Place the fragment addresses and lengths into the TxBDs */ for (i = 0; i < nr_frags; i++) { @@ -37,7 +37,7 @@ BD_LFLAG(TXBD_READY); /* Handle the last BD specially */ -@@ -2165,7 +2169,7 @@ static int gfar_start_xmit(struct sk_buf +@@ -2168,7 +2172,7 @@ static int gfar_start_xmit(struct sk_buf bufaddr = skb_frag_dma_map(priv->dev, &skb_shinfo(skb)->frags[i], 0, @@ -46,7 +46,7 @@ DMA_TO_DEVICE); /* set the TxBD length and buffer pointer */ -@@ -2231,7 +2235,7 @@ static int gfar_start_xmit(struct sk_buf +@@ -2234,7 +2238,7 @@ static int gfar_start_xmit(struct sk_buf lstatus |= BD_LFLAG(TXBD_CRC | TXBD_READY) | skb_headlen(skb); } @@ -55,7 +55,7 @@ /* We can work in parallel with gfar_clean_tx_ring(), except * when modifying num_txbdfree. Note that we didn't grab the lock -@@ -2551,7 +2555,7 @@ static void gfar_clean_tx_ring(struct gf +@@ -2554,7 +2558,7 @@ static void gfar_clean_tx_ring(struct gf bdp = next_txbd(bdp, base, tx_ring_size); }