[PATCH v7 4/7] PCI: pci_alloc_child_bus() return NULL if ->add_bus() returns -ENOLINK

From: Jim Quinlan
Date: Wed Nov 03 2021 - 14:50:06 EST


Currently, if the call to the pci_ops add_bus() method returns an error, a
WARNING and dev_err() occurs. We keep this behavior for all errors except
-ENOLINK; for -ENOLINK we want to skip the WARNING and immediately return
NULL. The argument for this case is that one does not want to continue
enumerating if pcie-link has not been established. The real reason is that
without doing this the pcie-brcmstb.c driver panics when the dev/id is
read, as this controller panics on such accesses rather than returning
0xffffffff.

It appears that there are only a few uses of the pci_ops add_bus() method
in the kernel and none of them currently return -ENOLINK so it should be
safe to do this.

Signed-off-by: Jim Quinlan <jim2101024@xxxxxxxxx>
---
drivers/pci/probe.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index d9fc02a71baa..fdc3f42634b7 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1122,6 +1122,9 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,

if (child->ops->add_bus) {
ret = child->ops->add_bus(child);
+ /* Don't return the child if w/o pcie link-up */
+ if (ret == -ENOLINK)
+ return NULL;
if (WARN_ON(ret < 0))
dev_err(&child->dev, "failed to add bus: %d\n", ret);
}
--
2.17.1