123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- 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 <blogic@openwrt.org>
- +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 <blogic@openwrt.org>
- +---
- + 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 <linux/of_net.h>
- + #include <linux/phy.h>
- + #include <linux/export.h>
- ++#include <linux/mtd/mtd.h>
- +
- + /**
- + * 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 <linux/of.h>
- + 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);
- }
-
|