diff options
| -rw-r--r-- | drivers/pci/bus.c | 36 | 
1 files changed, 11 insertions, 25 deletions
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 7c07a141e877..8491e9c7f058 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c @@ -389,37 +389,23 @@ void pci_bus_add_devices(const struct pci_bus *bus)  }  EXPORT_SYMBOL(pci_bus_add_devices); -static void __pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *), -			   void *userdata) +static int __pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *), +			  void *userdata)  {  	struct pci_dev *dev; -	struct pci_bus *bus; -	struct list_head *next; -	int retval; +	int ret = 0; -	bus = top; -	next = top->devices.next; -	for (;;) { -		if (next == &bus->devices) { -			/* end of this bus, go up or finish */ -			if (bus == top) +	list_for_each_entry(dev, &top->devices, bus_list) { +		ret = cb(dev, userdata); +		if (ret) +			break; +		if (dev->subordinate) { +			ret = __pci_walk_bus(dev->subordinate, cb, userdata); +			if (ret)  				break; -			next = bus->self->bus_list.next; -			bus = bus->self->bus; -			continue;  		} -		dev = list_entry(next, struct pci_dev, bus_list); -		if (dev->subordinate) { -			/* this is a pci-pci bridge, do its devices next */ -			next = dev->subordinate->devices.next; -			bus = dev->subordinate; -		} else -			next = dev->bus_list.next; - -		retval = cb(dev, userdata); -		if (retval) -			break;  	} +	return ret;  }  /**  | 
