aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2007-05-13 23:13:57 -0400
committerPaul Mackerras <paulus@samba.org>2007-05-17 07:11:13 -0400
commit7c40542ffaa20e361f5f37d112aba41a725fc759 (patch)
treebc2908cedab914c0c78584cac66ee618b4ae35f2
parente3d67b663b5ededac1b2c552b4f0b4fbe94d7ac3 (diff)
[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.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/arch/powerpc/boot/flatdevtree.c b/arch/powerpc/boot/flatdevtree.c
index d00fbd92a458..b732644788db 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,
891 struct ft_atom atom; 891 struct ft_atom atom;
892 void *node; 892 void *node;
893 char *p, *next; 893 char *p, *next;
894 int nextra, depth; 894 int nextra;
895 895
896 node = ft_node_ph2node(cxt, phandle); 896 node = ft_node_ph2node(cxt, phandle);
897 if (node == NULL) 897 if (node == NULL)
898 return -1; 898 return -1;
899 899
900 depth = 0; 900 next = ft_next(cxt, node, &atom);
901 p = node; 901 if (atom.tag != OF_DT_BEGIN_NODE)
902 /* phandle didn't point to a node */
903 return -1;
904 p = next;
902 905
903 while ((next = ft_next(cxt, p, &atom)) != NULL) { 906 while ((next = ft_next(cxt, p, &atom)) != NULL) {
904 switch (atom.tag) { 907 switch (atom.tag) {
905 case OF_DT_BEGIN_NODE: 908 case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
906 ++depth;
907 break;
908 case OF_DT_END_NODE: 909 case OF_DT_END_NODE:
909 if (--depth > 0)
910 break;
911 /* haven't found the property, insert here */ 910 /* haven't found the property, insert here */
912 cxt->p = p; 911 cxt->p = p;
913 return ft_prop(cxt, propname, buf, buflen); 912 return ft_prop(cxt, propname, buf, buflen);
914 case OF_DT_PROP: 913 case OF_DT_PROP:
915 if ((depth != 1) || strcmp(atom.name, propname)) 914 if (strcmp(atom.name, propname))
916 break; 915 break;
917 /* found an existing property, overwrite it */ 916 /* found an existing property, overwrite it */
918 nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4); 917 nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);