On Wed, Nov 24, 2010 at 12:59:43PM +0200, Michael S. Tsirkin wrote: > > > @@ -1552,20 +1562,21 @@ PCIBus *pci_find_bus(PCIBus *bus, int bus_num) > > > return bus; > > > } > > > > > > + /* Consider all bus numbers in range for the host pci bridge. */ > > > + if (bus->parent_dev && > > > + !pci_secondary_bus_in_range(bus->parent_dev, bus_num)) { > > > + return NULL; > > > + } > > > + > > > /* try child bus */ > > > - if (!bus->parent_dev /* host pci bridge */ || > > > - (bus->parent_dev->config[PCI_SECONDARY_BUS] < bus_num && > > > - bus_num <= bus->parent_dev->config[PCI_SUBORDINATE_BUS])) { > > > - for (; bus; bus = sec) { > > > - QLIST_FOREACH(sec, &bus->child, sibling) { > > > - assert(sec->parent_dev); > > > - if (sec->parent_dev->config[PCI_SECONDARY_BUS] == > > > bus_num) { > > > - return sec; > > > - } > > > - if (sec->parent_dev->config[PCI_SECONDARY_BUS] < bus_num > > > && > > > - bus_num <= > > > sec->parent_dev->config[PCI_SUBORDINATE_BUS]) { > > > - break; > > > - } > > > + for (; bus; bus = sec) { > > > + QLIST_FOREACH(sec, &bus->child, sibling) { > > > + assert(sec->parent_dev); > > > + if (sec->parent_dev->config[PCI_SECONDARY_BUS] == bus_num) { > > > + return sec; > > > + } > > > + if (pci_secondary_bus_in_range(sec->parent_dev, bus_num)) { > > > > This condition should be "if (!pci_...)" > > Why? We are looking for a device on the given bus that claims the given > bus_num. If we find one, break out of the inner loop and walk down to > the child.
You're right. Sorry for noise. -- yamahata