diff options
author | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> | 2010-03-27 00:09:56 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-03-27 00:09:56 -0400 |
commit | 7f809e1f8e2f46c486bfe529579a16a28daacd62 (patch) | |
tree | 3fbfbddbb6e219f7f5a511a8d239f04c8b6aa4c3 | |
parent | 220bf991b0366cc50a94feede3d7341fa5710ee4 (diff) |
of/flattree: Fix unhandled OF_DT_NOP tag when unflattening the device tree
NOPs within the property section are skipped, but NOPs between
OF_DT_END_NODE and OF_DT_BEGIN_NODE were not. My firmware NOPs out
entire nodes depending on various environment parameters.
of_scan_flat_dt already handles NOP more generally.
Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
-rw-r--r-- | drivers/of/fdt.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 406757a9d7ea..dee4fb56b094 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -376,8 +376,11 @@ unsigned long __init unflatten_dt_node(unsigned long mem, | |||
376 | if (!np->type) | 376 | if (!np->type) |
377 | np->type = "<NULL>"; | 377 | np->type = "<NULL>"; |
378 | } | 378 | } |
379 | while (tag == OF_DT_BEGIN_NODE) { | 379 | while (tag == OF_DT_BEGIN_NODE || tag == OF_DT_NOP) { |
380 | mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); | 380 | if (tag == OF_DT_NOP) |
381 | *p += 4; | ||
382 | else | ||
383 | mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); | ||
381 | tag = be32_to_cpup((__be32 *)(*p)); | 384 | tag = be32_to_cpup((__be32 *)(*p)); |
382 | } | 385 | } |
383 | if (tag != OF_DT_END_NODE) { | 386 | if (tag != OF_DT_END_NODE) { |