Message ID | AANLkTimc37=azh11sYYi6x7gTE=0ybud5tXgxa1TDUMT@mail.gmail.com |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On Thu, 24 Feb 2011 23:06:06 -0700 Grant Likely <grant.likely@secretlab.ca> wrote: > On Thu, Feb 24, 2011 at 1:01 PM, Andres Salomon <dilinger@queued.net> > wrote: > > On Thu, 24 Feb 2011 12:42:34 -0700 > > Grant Likely <grant.likely@secretlab.ca> wrote: > >> If firmware is buggy, then pkg2path must deal with it. It is not > >> okay for it to return NULL. (I know that pkg2path is an OFW > >> command, but in this context it really means the linux wrapper to > >> pkg2path which has the semantics, "give me the unique, full and > >> accurate path for this node"). If OFW pkg2path doesn't work, then > >> the platform code must work around it. I'm pushing back on this > >> because I do not want to see platform workarounds in the common > >> code. > > > > I'm fine with that, I just don't want to see BUG() happening that > > early. I think a workaround should be handled in common code. I > > agree that heroic workarounds for firmware bugs should be handled in > > arch-specific pkg2path hooks, but a simple workaround in common code > > is better than just crashing early in boot (imo). > > Alright, you've swayed me a bit. I've made this change and pushed it > out to devicetree/experimental. I've also picked up your other patch. > Let me know if it works for you. Thanks, that looks good. Feel free to push into next. -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c index 5ab3bd5..4d87b5d 100644 --- a/drivers/of/pdt.c +++ b/drivers/of/pdt.c @@ -65,17 +65,25 @@ static inline void irq_trans_init(struct device_node *dp) { static char * __init of_pdt_build_full_name(struct device_node *dp) { + static int failsafe_id = 0; /* for generating unique names on failure */ char *buf; int len; if (of_pdt_prom_ops->pkg2path(dp->phandle, NULL, 0, &len)) - BUG(); + goto failsafe; buf = prom_early_alloc(len + 1); - if (!buf) - BUG(); if (of_pdt_prom_ops->pkg2path(dp->phandle, buf, len, &len)) - BUG(); + goto failsafe; + return buf; + + failsafe: + buf = prom_early_alloc(strlen(dp->parent->full_name) + + strlen(dp->name) + 16); + sprintf(buf, "%s/%s@unknown%i", + of_node_is_root(dp->parent) ? "" : dp->parent->full_name, + dp->name, failsafe_id++); + pr_err("%s: pkg2path failed; assigning %s\n", __func__, buf); return buf; }