All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
@ 2007-02-13 23:10 Timur Tabi
  2007-02-14  0:00 ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 11+ messages in thread
From: Timur Tabi @ 2007-02-13 23:10 UTC (permalink / raw)
  To: linuxppc-dev, paulus, sshtylyov, galak; +Cc: Timur Tabi

Add function of_get_mac_address(), which obtains the best MAC address to use
from the device tree by checking various properties in order.  The order is: 
'mac-address', then 'local-mac-address', then 'address'.  It also skips
properties that were not initialized by U-Boot.

Update gfar_of_init() and fs_enet_of_init() in fsl_soc.c to call 
of_get_mac_address().

Signed-off-by: Timur Tabi <timur@freescale.com>
---

See the comment for function of_get_mac_address() for a detailed description
of what it does.

After this patch is applied, the next step is to update the various
OF-enabled Ethernet drivers to use of_get_mac_address().

 arch/powerpc/kernel/prom.c    |   45 ++++++++++++++++++++++++++++++++++------
 arch/powerpc/sysdev/fsl_soc.c |   19 ++++++-----------
 include/asm-powerpc/prom.h    |    2 +
 3 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 3e86e6e..4826f01 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -3,9 +3,9 @@
  *
  * Paul Mackerras	August 1996.
  * Copyright (C) 1996-2005 Paul Mackerras.
- * 
+ *
  *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
- *    {engebret|bergner}@us.ibm.com 
+ *    {engebret|bergner}@us.ibm.com
  *
  *      This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
@@ -111,7 +111,7 @@ int __init of_scan_flat_dt(int (*it)(uns
 	do {
 		u32 tag = *((u32 *)p);
 		char *pathp;
-		
+
 		p += 4;
 		if (tag == OF_DT_END_NODE) {
 			depth --;
@@ -148,7 +148,7 @@ int __init of_scan_flat_dt(int (*it)(uns
 		}
 		rc = it(p, pathp, depth, data);
 		if (rc != 0)
-			break;		
+			break;
 	} while(1);
 
 	return rc;
@@ -791,7 +791,7 @@ static int __init early_init_dt_scan_roo
 	prop = of_get_flat_dt_prop(node, "#address-cells", NULL);
 	dt_root_addr_cells = (prop == NULL) ? 2 : *prop;
 	DBG("dt_root_addr_cells = %x\n", dt_root_addr_cells);
-	
+
 	/* break now */
 	return 1;
 }
@@ -927,7 +927,7 @@ static void __init early_reserve_mem(voi
 	lmb_reserve(self_base, self_size);
 
 #ifdef CONFIG_PPC32
-	/* 
+	/*
 	 * Handle the case where we might be booting from an old kexec
 	 * image that setup the mem_rsvmap as pairs of 32-bit values
 	 */
@@ -1613,13 +1613,44 @@ const void *get_property(const struct de
 EXPORT_SYMBOL(get_property);
 
 /*
+ * Search the device tree for the best MAC address to use.  'mac-address' is
+ * checked first, because that is supposed to contain to "most recent" MAC
+ * address. If that isn't set, then 'local-mac-address' is checked next,
+ * because that is the default address.  If that isn't set, then the obsolete
+ * 'address' is checked, just in case we're using an old device tree.
+ *
+ * All-zero MAC addresses are rejected, because those could be properties that
+ * exist in the device tree, but were not set by U-Boot.  For example, the
+ * DTS could define 'mac-address' and 'local-mac-address', with zero MAC
+ * 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.
+*/
+const void *of_get_mac_address(struct device_node *np)
+{
+	static const u8 null_mac_address[6] = { 0 };
+	const void *mac_addr;
+
+	mac_addr = get_property(np, "mac-address", NULL);
+	if (mac_addr && (memcmp(mac_addr, null_mac_address, 6) != 0))
+		return mac_addr;
+
+	mac_addr = get_property(np, "local-mac-address", NULL);
+	if (mac_addr && (memcmp(mac_addr, null_mac_address, 6) != 0))
+		return mac_addr;
+
+	return get_property(np, "address", NULL);
+}
+EXPORT_SYMBOL(of_get_mac_address);
+
+/*
  * Add a property to a node
  */
 int prom_add_property(struct device_node* np, struct property* prop)
 {
 	struct property **next;
 
-	prop->next = NULL;	
+	prop->next = NULL;
 	write_lock(&devtree_lock);
 	next = &np->properties;
 	while (*next) {
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
index 34161bc..d20f029 100644
--- a/arch/powerpc/sysdev/fsl_soc.c
+++ b/arch/powerpc/sysdev/fsl_soc.c
@@ -233,14 +233,7 @@ static int __init gfar_of_init(void)
 			goto err;
 		}
 
-		mac_addr = get_property(np, "local-mac-address", NULL);
-		if (mac_addr == NULL)
-			mac_addr = get_property(np, "mac-address", NULL);
-		if (mac_addr == NULL) {
-			/* Obsolete */
-			mac_addr = get_property(np, "address", NULL);
-		}
-
+		mac_addr = of_get_mac_address(np);
 		if (mac_addr)
 			memcpy(gfar_data.mac_addr, mac_addr, 6);
 
@@ -646,8 +639,9 @@ static int __init fs_enet_of_init(void)
 			goto unreg;
 		}
 
-		mac_addr = get_property(np, "mac-address", NULL);
-		memcpy(fs_enet_data.macaddr, mac_addr, 6);
+		mac_addr = of_get_mac_address(np);
+		if (mac_addr)
+			memcpy(fs_enet_data.macaddr, mac_addr, 6);
 
 		ph = get_property(np, "phy-handle", NULL);
 		phy = of_find_node_by_phandle(*ph);
@@ -931,8 +925,9 @@ static int __init fs_enet_of_init(void)
 			goto err;
 		r[0].name = enet_regs;
 
-		mac_addr = (void *)get_property(np, "mac-address", NULL);
-		memcpy(fs_enet_data.macaddr, mac_addr, 6);
+		mac_addr = of_get_mac_address(np);
+		if (mac_addr)
+			memcpy(fs_enet_data.macaddr, mac_addr, 6);
 
 		ph = (phandle *) get_property(np, "phy-handle", NULL);
 		if (ph != NULL)
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h
index 0afee17..020ed01 100644
--- a/include/asm-powerpc/prom.h
+++ b/include/asm-powerpc/prom.h
@@ -255,6 +255,8 @@ extern void kdump_move_device_tree(void)
 /* CPU OF node matching */
 struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
 
+/* Get the MAC address */
+extern const void *of_get_mac_address(struct device_node *np);
 
 /*
  * OF interrupt mapping
-- 
1.4.4

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-13 23:10 [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it Timur Tabi
@ 2007-02-14  0:00 ` Benjamin Herrenschmidt
  2007-02-14  0:21   ` Olof Johansson
                     ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2007-02-14  0:00 UTC (permalink / raw)
  To: Timur Tabi; +Cc: linuxppc-dev, paulus


> +	return get_property(np, "address", NULL);

Since there is so much room for confusion with "address", please at
least do some basic sanity checking, like check that it's size is 6
bytes and maybe that the multicast bit isn't set.

Ben.

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  0:00 ` Benjamin Herrenschmidt
@ 2007-02-14  0:21   ` Olof Johansson
  2007-02-14  5:17   ` Timur Tabi
  2007-02-15 20:47   ` Segher Boessenkool
  2 siblings, 0 replies; 11+ messages in thread
From: Olof Johansson @ 2007-02-14  0:21 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, paulus, Timur Tabi

On Wed, Feb 14, 2007 at 11:00:19AM +1100, Benjamin Herrenschmidt wrote:
> 
> > +	return get_property(np, "address", NULL);
> 
> Since there is so much room for confusion with "address", please at
> least do some basic sanity checking, like check that it's size is 6
> bytes and maybe that the multicast bit isn't set.

No need to reinvent the wheel, is_valid_ether_addr() is easy to use.

Might still want to check the property length though.


-Olof

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  0:00 ` Benjamin Herrenschmidt
  2007-02-14  0:21   ` Olof Johansson
@ 2007-02-14  5:17   ` Timur Tabi
  2007-02-14  5:28     ` Benjamin Herrenschmidt
  2007-02-14 14:09     ` Sergei Shtylyov
  2007-02-15 20:47   ` Segher Boessenkool
  2 siblings, 2 replies; 11+ messages in thread
From: Timur Tabi @ 2007-02-14  5:17 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, paulus

Benjamin Herrenschmidt wrote:
>> +	return get_property(np, "address", NULL);
> 
> Since there is so much room for confusion with "address", please at
> least do some basic sanity checking, like check that it's size is 6
> bytes and maybe that the multicast bit isn't set.

Are you saying that some device trees have something *other* than a MAC 
address in the 'address' property?

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  5:17   ` Timur Tabi
@ 2007-02-14  5:28     ` Benjamin Herrenschmidt
  2007-02-14  5:30       ` Timur Tabi
  2007-02-14 14:09     ` Sergei Shtylyov
  1 sibling, 1 reply; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2007-02-14  5:28 UTC (permalink / raw)
  To: Timur Tabi; +Cc: linuxppc-dev, paulus

On Tue, 2007-02-13 at 23:17 -0600, Timur Tabi wrote:
> Benjamin Herrenschmidt wrote:
> >> +	return get_property(np, "address", NULL);
> > 
> > Since there is so much room for confusion with "address", please at
> > least do some basic sanity checking, like check that it's size is 6
> > bytes and maybe that the multicast bit isn't set.
> 
> Are you saying that some device trees have something *other* than a MAC 
> address in the 'address' property?

Yes, old Apple gear in some nodes, though I don't think in network
devices...

Ben.

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  5:28     ` Benjamin Herrenschmidt
@ 2007-02-14  5:30       ` Timur Tabi
  0 siblings, 0 replies; 11+ messages in thread
From: Timur Tabi @ 2007-02-14  5:30 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, paulus

Benjamin Herrenschmidt wrote:

>> Are you saying that some device trees have something *other* than a MAC 
>> address in the 'address' property?
> 
> Yes, old Apple gear in some nodes, though I don't think in network
> devices...

Ok, then I will respin the patch with some more error checking.  Do you 
want me to just check the 'address' property, or all of the properties?

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  5:17   ` Timur Tabi
  2007-02-14  5:28     ` Benjamin Herrenschmidt
@ 2007-02-14 14:09     ` Sergei Shtylyov
  1 sibling, 0 replies; 11+ messages in thread
From: Sergei Shtylyov @ 2007-02-14 14:09 UTC (permalink / raw)
  To: Timur Tabi; +Cc: paulus, linuxppc-dev

Hello.

Timur Tabi wrote:

>>> +    return get_property(np, "address", NULL);

>> Since there is so much room for confusion with "address", please at
>> least do some basic sanity checking, like check that it's size is 6
>> bytes and maybe that the multicast bit isn't set.

> Are you saying that some device trees have something *other* than a MAC 
> address in the 'address' property?

    'address' property was originally defined to hold a virtual address of the 
device registers (with 'reg' holding the physical address) until FSL decided 
to "reinvent" the property. :-)

WBR, Sergei

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-14  0:00 ` Benjamin Herrenschmidt
  2007-02-14  0:21   ` Olof Johansson
  2007-02-14  5:17   ` Timur Tabi
@ 2007-02-15 20:47   ` Segher Boessenkool
  2007-02-15 20:55     ` Timur Tabi
  2 siblings, 1 reply; 11+ messages in thread
From: Segher Boessenkool @ 2007-02-15 20:47 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, paulus, Timur Tabi

>> +	return get_property(np, "address", NULL);
>
> Since there is so much room for confusion with "address", please at
> least do some basic sanity checking, like check that it's size is 6
> bytes and maybe that the multicast bit isn't set.

Preferably, don't use "address" at all -- there shouldn't
be any trees in the wild that use it.  If there actually
are some, the should use a quirk to change it to "local-
mac-address" instead.

This holds in general: workarounds for gross errors in
device trees should be applied much more selectively
than is done now, it just doesn't scale this way.


Segher

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-15 20:47   ` Segher Boessenkool
@ 2007-02-15 20:55     ` Timur Tabi
  2007-02-16 13:25       ` Segher Boessenkool
  0 siblings, 1 reply; 11+ messages in thread
From: Timur Tabi @ 2007-02-15 20:55 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: paulus, linuxppc-dev

Segher Boessenkool wrote:
>>> +    return get_property(np, "address", NULL);
>>
>> Since there is so much room for confusion with "address", please at
>> least do some basic sanity checking, like check that it's size is 6
>> bytes and maybe that the multicast bit isn't set.
> 
> Preferably, don't use "address" at all -- there shouldn't

Unfortunately, I really don't have that luxury.  I *must* support 'address'.

> be any trees in the wild that use it.  If there actually
> are some, the should use a quirk to change it to "local-
> mac-address" instead.

The whole point behind checking for 'address' is to support older device trees 
that have only that property.  We have a problem where some installations use 
'address', and if we don't support it here in the kernel, then the kernel won't 
boot.

> This holds in general: workarounds for gross errors in
> device trees should be applied much more selectively
> than is done now, it just doesn't scale this way.

There are trees in the kernel today that have 'address' in them.  Before I can 
fix the trees, though, I need to update U-Boot and the kernel to support 
local-mac-address *without* breaking support for older trees.  That's why this 
patch is written the way it is.

I have patches for U-Boot already out there, although currently none of the 
U-Boot maintainers have indicated a willingness to apply them.

This whole local-mac-address mess needs to be fixed in an iterative process. 
One day, we can remove the check for 'address' from of_get_mac_address(), but 
not yet.

I've implemented all the other suggestion so far.  I *really* need this patch to 
go in as is.

-- 
Timur Tabi
Linux Kernel Developer @ Freescale

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-15 20:55     ` Timur Tabi
@ 2007-02-16 13:25       ` Segher Boessenkool
  2007-02-16 14:38         ` Timur Tabi
  0 siblings, 1 reply; 11+ messages in thread
From: Segher Boessenkool @ 2007-02-16 13:25 UTC (permalink / raw)
  To: Timur Tabi; +Cc: linuxppc-dev, paulus

> There are trees in the kernel today that have 'address' in them.  
> Before I can fix the trees, though, I need to update U-Boot and the 
> kernel to support local-mac-address *without* breaking support for 
> older trees.  That's why this patch is written the way it is.

Yes I understand.  My suggestion was to somehow recognise
those trees and only for those try the "address" thing.

Not too important in this case I guess, since almost all
correct trees will have a "local-mac-address" property,
and the correct (standard-conform) use of "address" is
pretty much obsoleted.

Since you are planning to at a later date (hopefully soon :-) )
remove this handling of "address" completely again, I'm sure I
can live with it -- objection withdrawn ;-)


Segher

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

* Re: [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it
  2007-02-16 13:25       ` Segher Boessenkool
@ 2007-02-16 14:38         ` Timur Tabi
  0 siblings, 0 replies; 11+ messages in thread
From: Timur Tabi @ 2007-02-16 14:38 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: linuxppc-dev, paulus

Segher Boessenkool wrote:

> Since you are planning to at a later date (hopefully soon :-) )
> remove this handling of "address" completely again, I'm sure I
> can live with it -- objection withdrawn ;-)

Thank you.  Once U-Boot and the kernel is updated with my patches, the 
next step is to fix all of the DTS files to only define local-mac-address.

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

end of thread, other threads:[~2007-02-16 14:38 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-13 23:10 [PATCH] powerpc: add of_get_mac_address() and update fsl_soc.c to use it Timur Tabi
2007-02-14  0:00 ` Benjamin Herrenschmidt
2007-02-14  0:21   ` Olof Johansson
2007-02-14  5:17   ` Timur Tabi
2007-02-14  5:28     ` Benjamin Herrenschmidt
2007-02-14  5:30       ` Timur Tabi
2007-02-14 14:09     ` Sergei Shtylyov
2007-02-15 20:47   ` Segher Boessenkool
2007-02-15 20:55     ` Timur Tabi
2007-02-16 13:25       ` Segher Boessenkool
2007-02-16 14:38         ` Timur Tabi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.