From 6af5db20f4a932cc256d39f2a0bf769ef9e4dc72 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sun, 17 Feb 2008 14:44:33 +0000 Subject: [PATCH] Reuse virtual bus numbers when a mapping already exists. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23981 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/pci/pci.cpp | 12 ++++++++---- src/add-ons/kernel/bus_managers/pci/pci.h | 4 +++- 2 files changed, 11 insertions(+), 5 deletions(-) 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; };