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 /drivers/of/fdt.c | |
| 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>
Diffstat (limited to 'drivers/of/fdt.c')
| -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) { |
