From 05dcfbdd8751f9212087b6e6669e4731b8043137 Mon Sep 17 00:00:00 2001 From: Matthieu Herrb Date: Mon, 10 Dec 2007 06:35:25 +0000 Subject: Fix logic error in the new dynamic array of pci devices that made xf86scanpci() exit early if pciInit() had been called already. Fix tested by krw@. --- xserver/hw/xfree86/os-support/bus/Pci.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'xserver') diff --git a/xserver/hw/xfree86/os-support/bus/Pci.c b/xserver/hw/xfree86/os-support/bus/Pci.c index b80371d83..2fdfa78bf 100644 --- a/xserver/hw/xfree86/os-support/bus/Pci.c +++ b/xserver/hw/xfree86/os-support/bus/Pci.c @@ -232,14 +232,14 @@ _X_EXPORT int pciNumBuses = 0; /* Actual number of PCI buses */ int pciMaxBusNum = MAX_PCI_BUSES; static Bool inProbe = FALSE; -static pciConfigPtr pci_devp[MAX_PCI_DEVICES + 1] = {NULL, }; +static pciConfigPtr *pci_devp = NULL; static int readPciBios( PCITAG Tag, CARD8* tmp, ADDRESS hostbase, unsigned char * buf, int len, PciBiosType BiosType ); static int (*pciOSHandleBIOS)(PCITAG Tag, int basereg, unsigned char *buf, int len); -int xf86MaxPciDevs = MAX_PCI_DEVICES; +int xf86MaxPciDevs = 0; /* * Platform specific PCI function pointers. @@ -272,6 +272,14 @@ pciInit() if (pciNumBuses <= 0) ARCH_PCI_OS_INIT(); #endif + if (xf86MaxPciDevs == 0) { + xf86Msg(X_WARNING, + "OS did not count PCI devices, guessing wildly\n"); + xf86MaxPciDevs = MAX_PCI_DEVICES; + } + if (pci_devp) + xfree(pci_devp); + pci_devp = xnfcalloc(xf86MaxPciDevs + 1, sizeof(pciConfigPtr)); } void pciSetOSBIOSPtr(int (*bios_fn)(PCITAG Tag, int basereg, unsigned char * buf, int len)) @@ -920,7 +928,7 @@ xf86scanpci(int flags) * result in an endless recursion if platform/OS specific PCI * bus probing code calls this function from with in it. */ - if (done || pci_devp[0]) + if (done || (pci_devp && pci_devp[0])) return pci_devp; done = TRUE; @@ -1085,7 +1093,7 @@ xf86GetPciConfigFromTag(PCITAG Tag) pciConfigPtr pDev; int i = 0; - for (i = 0 ; (pDev = pci_devp[i]) && i <= MAX_PCI_DEVICES; i++) { + for (i = 0 ; (pDev = pci_devp[i]) && i <= xf86MaxPciDevs; i++) { if (Tag == pDev->tag) return pDev; } -- cgit v1.2.3