diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2007-05-14 13:13:57 +1000 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-05-17 21:11:13 +1000 |
commit | 7c40542ffaa20e361f5f37d112aba41a725fc759 (patch) | |
tree | bc2908cedab914c0c78584cac66ee618b4ae35f2 | |
parent | e3d67b663b5ededac1b2c552b4f0b4fbe94d7ac3 (diff) | |
download | op-kernel-dev-7c40542ffaa20e361f5f37d112aba41a725fc759.zip op-kernel-dev-7c40542ffaa20e361f5f37d112aba41a725fc759.tar.gz |
[POWERPC] Fix bug adding properties with flatdevtree.c's ft_set_prop()
ft_set_prop() from flatdevtree.c in the zImage wrapper will either
replace an existing property in the flat device tree, or add a new
property definiion if the given property isn't present.
However, when adding properties, it adds the property definition
immediately before the node's END_NODE tag, potentially after any
subnode definitions for the node. This confuses the kernel flat tree
parser in prom.c which assumes that all property definitions for a
node come before all subnode definitions.
This patch corrects ft_set_prop() so that it adds new properties
before the first subnode, instead of before the END_NODE tag.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Scott Wood <scottwood@freescale.com>
Acked-by: Mark A. Greer <mgreer@mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/boot/flatdevtree.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/arch/powerpc/boot/flatdevtree.c b/arch/powerpc/boot/flatdevtree.c index d00fbd9..b732644 100644 --- a/arch/powerpc/boot/flatdevtree.c +++ b/arch/powerpc/boot/flatdevtree.c @@ -891,28 +891,27 @@ int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, struct ft_atom atom; void *node; char *p, *next; - int nextra, depth; + int nextra; node = ft_node_ph2node(cxt, phandle); if (node == NULL) return -1; - depth = 0; - p = node; + next = ft_next(cxt, node, &atom); + if (atom.tag != OF_DT_BEGIN_NODE) + /* phandle didn't point to a node */ + return -1; + p = next; while ((next = ft_next(cxt, p, &atom)) != NULL) { switch (atom.tag) { - case OF_DT_BEGIN_NODE: - ++depth; - break; + case OF_DT_BEGIN_NODE: /* properties must go before subnodes */ case OF_DT_END_NODE: - if (--depth > 0) - break; /* haven't found the property, insert here */ cxt->p = p; return ft_prop(cxt, propname, buf, buflen); case OF_DT_PROP: - if ((depth != 1) || strcmp(atom.name, propname)) + if (strcmp(atom.name, propname)) break; /* found an existing property, overwrite it */ nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4); |