diff options
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c b/target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c index 6b3ab96749..a82728df91 100644 --- a/target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c +++ b/target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c @@ -644,6 +644,30 @@ static int bcm47xx_sprom_getenv(const struct bcm47xx_sprom_fill *fill, /* FIXME: This should not be static, but some callback argument */ static struct platform_device *sprom_pdev = NULL; +static char prefix[20]; + +static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_len) +{ + size_t needle_len = strlen(prefix) - 1; + char nvram_var[10]; + char buf[20]; + int i; + + if (needle_len <= 0 || prefix[needle_len] != '/') + return; + + for (i = 0; i < 3; i++) { + if (snprintf(nvram_var, sizeof(nvram_var), "devpath%d", i) <= 0) + continue; + if (bcm47xx_nvram_getenv(nvram_var, buf, sizeof(buf)) < 0) + continue; + if (strlen(buf) == needle_len && !strncmp(buf, prefix, needle_len)) { + snprintf(prefix, prefix_len, "%d:", i); + return; + } + } +} + /* * This function has to be called in a very precise moment. It has to be done: * 1) After bcma registers flash cores, so we can read NVRAM. @@ -674,6 +698,13 @@ static int bcm47xx_sprom_init(struct bcma_bus *bus, struct ssb_sprom *out) return -ENOMEM; switch (bus->hosttype) { + case BCMA_HOSTTYPE_PCI: + snprintf(prefix, sizeof(prefix), "pci/%u/%u/", + pci_domain_nr(bus->host_pci->bus) + 1, + bus->host_pci->bus->number); + bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix)); + fill.prefix = prefix; + break; case BCMA_HOSTTYPE_SOC: fill.prefix = of_get_property(np, "prefix", NULL); break; |