When there is no PCI bus uclass_first_device will return no bus and no
error which will result in pci_find_first_device calling
skip_to_next_device with no bus, and the bus is only checked at the end
of the while cycle, not the beginning.

Also stop dealing with the return value of
uclass_first_device/uclass_next_device - once the iteration is fixed to
continue after an error there is nothing meaningful to get anymore.

Fixes: 76c3fbcd3d ("dm: pci: Add a way to iterate through all PCI devices")
Signed-off-by: Michal Suchanek <msucha...@suse.de>
---
 drivers/pci/pci-uclass.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index 16a6a699f9..00e3828d95 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -1211,22 +1211,19 @@ static int pci_bridge_write_config(struct udevice *bus, 
pci_dev_t bdf,
 static int skip_to_next_device(struct udevice *bus, struct udevice **devp)
 {
        struct udevice *dev;
-       int ret = 0;
 
        /*
         * Scan through all the PCI controllers. On x86 there will only be one
         * but that is not necessarily true on other hardware.
         */
-       do {
+       while (bus) {
                device_find_first_child(bus, &dev);
                if (dev) {
                        *devp = dev;
                        return 0;
                }
-               ret = uclass_next_device(&bus);
-               if (ret)
-                       return ret;
-       } while (bus);
+               uclass_next_device(&bus);
+       }
 
        return 0;
 }
@@ -1235,7 +1232,6 @@ int pci_find_next_device(struct udevice **devp)
 {
        struct udevice *child = *devp;
        struct udevice *bus = child->parent;
-       int ret;
 
        /* First try all the siblings */
        *devp = NULL;
@@ -1248,9 +1244,7 @@ int pci_find_next_device(struct udevice **devp)
        }
 
        /* We ran out of siblings. Try the next bus */
-       ret = uclass_next_device(&bus);
-       if (ret)
-               return ret;
+       uclass_next_device(&bus);
 
        return bus ? skip_to_next_device(bus, devp) : 0;
 }
@@ -1258,12 +1252,9 @@ int pci_find_next_device(struct udevice **devp)
 int pci_find_first_device(struct udevice **devp)
 {
        struct udevice *bus;
-       int ret;
 
        *devp = NULL;
-       ret = uclass_first_device(UCLASS_PCI, &bus);
-       if (ret)
-               return ret;
+       uclass_first_device(UCLASS_PCI, &bus);
 
        return skip_to_next_device(bus, devp);
 }
-- 
2.37.3

Reply via email to