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