Linux MIPS Architecture development
 help / color / mirror / Atom feed
* [PATCH v2 0/3] MIPS: OCTEON: fill mac addresses with appended DTB
@ 2016-02-23 22:52 Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 1/3] MIPS: OCTEON: device_tree_init: use separate pass to fill mac addresses Aaro Koskinen
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Aaro Koskinen @ 2016-02-23 22:52 UTC (permalink / raw)
  To: Ralf Baechle, David Daney, linux-mips; +Cc: Aaro Koskinen

Hi,

When using appended DTB, the MAC addresses should be filled in
from the bootinfo.

v2:	Use is_valid_ether_addr()
	Added Acked-bys.

A.

Aaro Koskinen (3):
  MIPS: OCTEON: device_tree_init: use separate pass to fill mac
    addresses
  MIPS: OCTEON: device_tree_init: don't fill mac if already set
  MIPS: OCTEON: device_tree_init: fill mac addresses when using appended
    dtb

 arch/mips/cavium-octeon/octeon-platform.c | 94 +++++++++++++++++++++++++------
 arch/mips/cavium-octeon/setup.c           |  8 +++
 2 files changed, 86 insertions(+), 16 deletions(-)

-- 
2.4.0

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/3] MIPS: OCTEON: device_tree_init: use separate pass to fill mac addresses
  2016-02-23 22:52 [PATCH v2 0/3] MIPS: OCTEON: fill mac addresses with appended DTB Aaro Koskinen
@ 2016-02-23 22:52 ` Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 3/3] MIPS: OCTEON: device_tree_init: fill mac addresses when using appended dtb Aaro Koskinen
  2 siblings, 0 replies; 6+ messages in thread
From: Aaro Koskinen @ 2016-02-23 22:52 UTC (permalink / raw)
  To: Ralf Baechle, David Daney, linux-mips; +Cc: Aaro Koskinen

Use separate pass to fill MAC addresses. This is needed because we want
to do this also for the appended DTB.

Acked-by: David Daney <david.daney@cavium.com>
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
 arch/mips/cavium-octeon/octeon-platform.c | 86 +++++++++++++++++++++++++------
 arch/mips/cavium-octeon/setup.c           |  2 +
 2 files changed, 72 insertions(+), 16 deletions(-)

diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
index d113c8d..a7d9f07 100644
--- a/arch/mips/cavium-octeon/octeon-platform.c
+++ b/arch/mips/cavium-octeon/octeon-platform.c
@@ -560,7 +560,7 @@ static void __init octeon_fdt_rm_ethernet(int node)
 	fdt_nop_node(initial_boot_params, node);
 }
 
-static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pmac)
+static void __init octeon_fdt_pip_port(int iface, int i, int p, int max)
 {
 	char name_buffer[20];
 	int eth;
@@ -583,10 +583,9 @@ static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pm
 
 	phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
 	octeon_fdt_set_phy(eth, phy_addr);
-	octeon_fdt_set_mac_addr(eth, pmac);
 }
 
-static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac)
+static void __init octeon_fdt_pip_iface(int pip, int idx)
 {
 	char name_buffer[20];
 	int iface;
@@ -602,7 +601,73 @@ static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac)
 		count = cvmx_helper_ports_on_interface(idx);
 
 	for (p = 0; p < 16; p++)
-		octeon_fdt_pip_port(iface, idx, p, count - 1, pmac);
+		octeon_fdt_pip_port(iface, idx, p, count - 1);
+}
+
+void __init octeon_fill_mac_addresses(void)
+{
+	const char *alias_prop;
+	char name_buffer[20];
+	u64 mac_addr_base;
+	int aliases;
+	int pip;
+	int i;
+
+	aliases = fdt_path_offset(initial_boot_params, "/aliases");
+	if (aliases < 0)
+		return;
+
+	mac_addr_base =
+		((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
+		((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
+		((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
+		((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
+		((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
+		 (octeon_bootinfo->mac_addr_base[5] & 0xffull);
+
+	for (i = 0; i < 2; i++) {
+		int mgmt;
+
+		snprintf(name_buffer, sizeof(name_buffer), "mix%d", i);
+		alias_prop = fdt_getprop(initial_boot_params, aliases,
+					 name_buffer, NULL);
+		if (!alias_prop)
+			continue;
+		mgmt = fdt_path_offset(initial_boot_params, alias_prop);
+		if (mgmt < 0)
+			continue;
+		octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
+	}
+
+	alias_prop = fdt_getprop(initial_boot_params, aliases, "pip", NULL);
+	if (!alias_prop)
+		return;
+
+	pip = fdt_path_offset(initial_boot_params, alias_prop);
+	if (pip < 0)
+		return;
+
+	for (i = 0; i <= 4; i++) {
+		int iface;
+		int p;
+
+		snprintf(name_buffer, sizeof(name_buffer), "interface@%d", i);
+		iface = fdt_subnode_offset(initial_boot_params, pip,
+					   name_buffer);
+		if (iface < 0)
+			continue;
+		for (p = 0; p < 16; p++) {
+			int eth;
+
+			snprintf(name_buffer, sizeof(name_buffer),
+				 "ethernet@%x", p);
+			eth = fdt_subnode_offset(initial_boot_params, iface,
+						 name_buffer);
+			if (eth < 0)
+				continue;
+			octeon_fdt_set_mac_addr(eth, &mac_addr_base);
+		}
+	}
 }
 
 int __init octeon_prune_device_tree(void)
@@ -612,7 +677,6 @@ int __init octeon_prune_device_tree(void)
 	const char *alias_prop;
 	char name_buffer[20];
 	int aliases;
-	u64 mac_addr_base;
 
 	if (fdt_check_header(initial_boot_params))
 		panic("Corrupt Device Tree.");
@@ -623,15 +687,6 @@ int __init octeon_prune_device_tree(void)
 		return -EINVAL;
 	}
 
-
-	mac_addr_base =
-		((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
-		((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
-		((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
-		((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
-		((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
-		(octeon_bootinfo->mac_addr_base[5] & 0xffull);
-
 	if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
 		max_port = 2;
 	else if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN68XX))
@@ -660,7 +715,6 @@ int __init octeon_prune_device_tree(void)
 			} else {
 				int phy_addr = cvmx_helper_board_get_mii_address(CVMX_HELPER_BOARD_MGMT_IPD_PORT + i);
 				octeon_fdt_set_phy(mgmt, phy_addr);
-				octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
 			}
 		}
 	}
@@ -670,7 +724,7 @@ int __init octeon_prune_device_tree(void)
 		int pip = fdt_path_offset(initial_boot_params, pip_path);
 		if (pip	 >= 0)
 			for (i = 0; i <= 4; i++)
-				octeon_fdt_pip_iface(pip, i, &mac_addr_base);
+				octeon_fdt_pip_iface(pip, i);
 	}
 
 	/* I2C */
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index cd7101f..ed3063f 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -1079,6 +1079,7 @@ void __init prom_free_prom_memory(void)
 	}
 }
 
+void __init octeon_fill_mac_addresses(void);
 int octeon_prune_device_tree(void);
 
 extern const char __appended_dtb;
@@ -1114,6 +1115,7 @@ void __init device_tree_init(void)
 
 	if (do_prune) {
 		octeon_prune_device_tree();
+		octeon_fill_mac_addresses();
 		pr_info("Using internal Device Tree.\n");
 	}
 	unflatten_and_copy_device_tree();
-- 
2.4.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set
  2016-02-23 22:52 [PATCH v2 0/3] MIPS: OCTEON: fill mac addresses with appended DTB Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 1/3] MIPS: OCTEON: device_tree_init: use separate pass to fill mac addresses Aaro Koskinen
@ 2016-02-23 22:52 ` Aaro Koskinen
  2016-02-24 10:25   ` Sergei Shtylyov
  2016-02-23 22:52 ` [PATCH v2 3/3] MIPS: OCTEON: device_tree_init: fill mac addresses when using appended dtb Aaro Koskinen
  2 siblings, 1 reply; 6+ messages in thread
From: Aaro Koskinen @ 2016-02-23 22:52 UTC (permalink / raw)
  To: Ralf Baechle, David Daney, linux-mips; +Cc: Aaro Koskinen

Don't fill MAC address if it's already set. This allows DTB to
override the bootinfo.

Acked-by: David Daney <david.daney@cavium.com>
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
 arch/mips/cavium-octeon/octeon-platform.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
index a7d9f07..7aeafed 100644
--- a/arch/mips/cavium-octeon/octeon-platform.c
+++ b/arch/mips/cavium-octeon/octeon-platform.c
@@ -13,6 +13,7 @@
 #include <linux/i2c.h>
 #include <linux/usb.h>
 #include <linux/dma-mapping.h>
+#include <linux/etherdevice.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
@@ -525,10 +526,17 @@ static void __init octeon_fdt_set_phy(int eth, int phy_addr)
 
 static void __init octeon_fdt_set_mac_addr(int n, u64 *pmac)
 {
+	const u8 *old_mac;
+	int old_len;
 	u8 new_mac[6];
 	u64 mac = *pmac;
 	int r;
 
+	old_mac = fdt_getprop(initial_boot_params, n, "local-mac-address",
+			      &old_len);
+	if (!old_mac || old_len != 6 || is_valid_ether_addr(old_mac))
+		return;
+
 	new_mac[0] = (mac >> 40) & 0xff;
 	new_mac[1] = (mac >> 32) & 0xff;
 	new_mac[2] = (mac >> 24) & 0xff;
-- 
2.4.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] MIPS: OCTEON: device_tree_init: fill mac addresses when using appended dtb
  2016-02-23 22:52 [PATCH v2 0/3] MIPS: OCTEON: fill mac addresses with appended DTB Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 1/3] MIPS: OCTEON: device_tree_init: use separate pass to fill mac addresses Aaro Koskinen
  2016-02-23 22:52 ` [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set Aaro Koskinen
@ 2016-02-23 22:52 ` Aaro Koskinen
  2 siblings, 0 replies; 6+ messages in thread
From: Aaro Koskinen @ 2016-02-23 22:52 UTC (permalink / raw)
  To: Ralf Baechle, David Daney, linux-mips; +Cc: Aaro Koskinen

Fill MAC addresses from bootinfo when using appended DTB.

Acked-by: David Daney <david.daney@cavium.com>
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
 arch/mips/cavium-octeon/setup.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index ed3063f..f2df1d9 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -1089,11 +1089,13 @@ void __init device_tree_init(void)
 {
 	const void *fdt;
 	bool do_prune;
+	bool fill_mac;
 
 #ifdef CONFIG_MIPS_ELF_APPENDED_DTB
 	if (!fdt_check_header(&__appended_dtb)) {
 		fdt = &__appended_dtb;
 		do_prune = false;
+		fill_mac = true;
 		pr_info("Using appended Device Tree.\n");
 	} else
 #endif
@@ -1102,22 +1104,26 @@ void __init device_tree_init(void)
 		if (fdt_check_header(fdt))
 			panic("Corrupt Device Tree passed to kernel.");
 		do_prune = false;
+		fill_mac = false;
 		pr_info("Using passed Device Tree.\n");
 	} else if (OCTEON_IS_MODEL(OCTEON_CN68XX)) {
 		fdt = &__dtb_octeon_68xx_begin;
 		do_prune = true;
+		fill_mac = true;
 	} else {
 		fdt = &__dtb_octeon_3xxx_begin;
 		do_prune = true;
+		fill_mac = true;
 	}
 
 	initial_boot_params = (void *)fdt;
 
 	if (do_prune) {
 		octeon_prune_device_tree();
-		octeon_fill_mac_addresses();
 		pr_info("Using internal Device Tree.\n");
 	}
+	if (fill_mac)
+		octeon_fill_mac_addresses();
 	unflatten_and_copy_device_tree();
 }
 
-- 
2.4.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set
  2016-02-23 22:52 ` [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set Aaro Koskinen
@ 2016-02-24 10:25   ` Sergei Shtylyov
  2016-02-24 18:35     ` Aaro Koskinen
  0 siblings, 1 reply; 6+ messages in thread
From: Sergei Shtylyov @ 2016-02-24 10:25 UTC (permalink / raw)
  To: Aaro Koskinen, Ralf Baechle, David Daney, linux-mips

Hello.

On 2/24/2016 1:52 AM, Aaro Koskinen wrote:

> Don't fill MAC address if it's already set. This allows DTB to
> override the bootinfo.
>
> Acked-by: David Daney <david.daney@cavium.com>
> Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
> ---
>   arch/mips/cavium-octeon/octeon-platform.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
>
> diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
> index a7d9f07..7aeafed 100644
> --- a/arch/mips/cavium-octeon/octeon-platform.c
> +++ b/arch/mips/cavium-octeon/octeon-platform.c
> @@ -13,6 +13,7 @@
>   #include <linux/i2c.h>
>   #include <linux/usb.h>
>   #include <linux/dma-mapping.h>
> +#include <linux/etherdevice.h>
>   #include <linux/module.h>
>   #include <linux/mutex.h>
>   #include <linux/slab.h>
> @@ -525,10 +526,17 @@ static void __init octeon_fdt_set_phy(int eth, int phy_addr)
>
>   static void __init octeon_fdt_set_mac_addr(int n, u64 *pmac)
>   {
> +	const u8 *old_mac;
> +	int old_len;
>   	u8 new_mac[6];
>   	u64 mac = *pmac;
>   	int r;
>
> +	old_mac = fdt_getprop(initial_boot_params, n, "local-mac-address",
> +			      &old_len);
> +	if (!old_mac || old_len != 6 || is_valid_ether_addr(old_mac))
> +		return;

    So if there's no such prop or the length is not 6, you just return?

[...]

MBR, Sergei

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set
  2016-02-24 10:25   ` Sergei Shtylyov
@ 2016-02-24 18:35     ` Aaro Koskinen
  0 siblings, 0 replies; 6+ messages in thread
From: Aaro Koskinen @ 2016-02-24 18:35 UTC (permalink / raw)
  To: Sergei Shtylyov; +Cc: Ralf Baechle, David Daney, linux-mips

Hi,

On Wed, Feb 24, 2016 at 01:25:51PM +0300, Sergei Shtylyov wrote:
> On 2/24/2016 1:52 AM, Aaro Koskinen wrote:
> >+	old_mac = fdt_getprop(initial_boot_params, n, "local-mac-address",
> >+			      &old_len);
> >+	if (!old_mac || old_len != 6 || is_valid_ether_addr(old_mac))
> >+		return;
> 
>    So if there's no such prop or the length is not 6, you just return?

Yes, in that case the network drivers will silently switch to use a
random address. This is the same behaviour as with "normal" DT boot.

A.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-02-24 18:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-23 22:52 [PATCH v2 0/3] MIPS: OCTEON: fill mac addresses with appended DTB Aaro Koskinen
2016-02-23 22:52 ` [PATCH v2 1/3] MIPS: OCTEON: device_tree_init: use separate pass to fill mac addresses Aaro Koskinen
2016-02-23 22:52 ` [PATCH v2 2/3] MIPS: OCTEON: device_tree_init: don't fill mac if already set Aaro Koskinen
2016-02-24 10:25   ` Sergei Shtylyov
2016-02-24 18:35     ` Aaro Koskinen
2016-02-23 22:52 ` [PATCH v2 3/3] MIPS: OCTEON: device_tree_init: fill mac addresses when using appended dtb Aaro Koskinen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox