[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>
This commit is contained in:
David Gibson 2007-05-14 13:13:57 +10:00 committed by Paul Mackerras
parent e3d67b663b
commit 7c40542ffa

View file

@ -891,28 +891,27 @@ int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
struct ft_atom atom; struct ft_atom atom;
void *node; void *node;
char *p, *next; char *p, *next;
int nextra, depth; int nextra;
node = ft_node_ph2node(cxt, phandle); node = ft_node_ph2node(cxt, phandle);
if (node == NULL) if (node == NULL)
return -1; return -1;
depth = 0; next = ft_next(cxt, node, &atom);
p = node; 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) { while ((next = ft_next(cxt, p, &atom)) != NULL) {
switch (atom.tag) { switch (atom.tag) {
case OF_DT_BEGIN_NODE: case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
++depth;
break;
case OF_DT_END_NODE: case OF_DT_END_NODE:
if (--depth > 0)
break;
/* haven't found the property, insert here */ /* haven't found the property, insert here */
cxt->p = p; cxt->p = p;
return ft_prop(cxt, propname, buf, buflen); return ft_prop(cxt, propname, buf, buflen);
case OF_DT_PROP: case OF_DT_PROP:
if ((depth != 1) || strcmp(atom.name, propname)) if (strcmp(atom.name, propname))
break; break;
/* found an existing property, overwrite it */ /* found an existing property, overwrite it */
nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4); nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);