diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2007-05-13 23:13:57 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-05-17 07:11:13 -0400 |
commit | 7c40542ffaa20e361f5f37d112aba41a725fc759 (patch) | |
tree | bc2908cedab914c0c78584cac66ee618b4ae35f2 | |
parent | e3d67b663b5ededac1b2c552b4f0b4fbe94d7ac3 (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.c | 17 |
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); |