diff --git a/src/add-ons/kernel/bus_managers/pci/pci.cpp b/src/add-ons/kernel/bus_managers/pci/pci.cpp index f608476a0e..b71093331a 100644 --- a/src/add-ons/kernel/bus_managers/pci/pci.cpp +++ b/src/add-ons/kernel/bus_managers/pci/pci.cpp @@ -381,13 +381,17 @@ PCI::CreateVirtualBus(int domain, uint8 bus, uint8 *virtualBus) uint16 value = domain << 8 | bus; - // XXX iterate through entries 0 to fNextVirtualBus - // XXX and check if value is already present, return - // XXX key if found instead of inserting a new one + for (VirtualBusMap::Iterator it = fVirtualBusMap.Begin(); it != fVirtualBusMap.End(); ++it) { + if (it->Value() == value) { + *virtualBus = it->Key(); + FLOW("PCI::CreateVirtualBus: domain %d, bus %d already in map => virtualBus %d\n", domain, bus, *virtualBus); + return B_OK; + } + } *virtualBus = fNextVirtualBus++; - dprintf("CreateVirtualBus domain %d, bus %d => virtualBus %d\n", domain, bus, *virtualBus); + FLOW("PCI::CreateVirtualBus: domain %d, bus %d => virtualBus %d\n", domain, bus, *virtualBus); return fVirtualBusMap.Insert(*virtualBus, value); diff --git a/src/add-ons/kernel/bus_managers/pci/pci.h b/src/add-ons/kernel/bus_managers/pci/pci.h index 189a55db08..089ce4f260 100644 --- a/src/add-ons/kernel/bus_managers/pci/pci.h +++ b/src/add-ons/kernel/bus_managers/pci/pci.h @@ -119,7 +119,9 @@ class PCI { int fDomainCount; bool fBusEnumeration; - VectorMap fVirtualBusMap; + typedef VectorMap VirtualBusMap; + + VirtualBusMap fVirtualBusMap; int fNextVirtualBus; };