Commit c8f5a57c authored by Tyrel Datwyler's avatar Tyrel Datwyler Committed by Benjamin Herrenschmidt

powerpc/pseries: Fix parsing of initial node path in update_dt_node

On the first call to ibm,update-properties for a node the first property
returned is the full node path. Currently this is not parsed correctly by the
update_dt_node function. Commit 2e9b7b02 attempted to fix this, but was
incorrect as it made a wrong assumption about the layout of the first
property in the work area. Further, if ibm,update-properties must be called
multiple times for the same node this special property should only be skipped
after the initial call. The first property descriptor returned consists of
the property name, property value length, and property value. The property
name is an empty string, property length is encoded in 4 byte integer, and
the property value is the node path.
Signed-off-by: default avatarTyrel Datwyler <tyreld@linux.vnet.ibm.com>
Acked-by: default avatarNathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent d0ef4403
...@@ -161,18 +161,19 @@ static int update_dt_node(u32 phandle, s32 scope) ...@@ -161,18 +161,19 @@ static int update_dt_node(u32 phandle, s32 scope)
prop_data = rtas_buf + sizeof(*upwa); prop_data = rtas_buf + sizeof(*upwa);
/* The first element of the buffer is the path of the node /* On the first call to ibm,update-properties for a node the
* being updated in the form of a 8 byte string length * the first property value descriptor contains an empty
* followed by the string. Skip past this to get to the * property name, the property value length encoded as u32,
* properties being updated. * and the property value is the node path being updated.
*/ */
vd = *prop_data++; if (*prop_data == 0) {
prop_data += vd; prop_data++;
vd = *(u32 *)prop_data;
prop_data += vd + sizeof(vd);
upwa->nprops--;
}
/* The path we skipped over is counted as one of the elements for (i = 0; i < upwa->nprops; i++) {
* returned so start counting at one.
*/
for (i = 1; i < upwa->nprops; i++) {
char *prop_name; char *prop_name;
prop_name = prop_data; prop_name = prop_data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment