Bryce, Here is how I fixed it. Please search for "~cpw" to find my comments (three of them). I stumbled across the bug with a chipset whose PCI bridge is a multifunction device. Best regards, Chih-Pin Wu ************************************************************* Extracted from common_bridge.c, libpciaccess 0.12.0 int pci_device_get_bridge_buses(struct pci_device * dev, int *primary_bus, int *secondary_bus, int *subordinate_bus) { struct pci_device_private * priv = (struct pci_device_private *) dev; /* If the device isn't a bridge, return an error. */ if (((dev->device_class >> 16) & 0x0ff) != 0x06) { return ENODEV; } //~cpw Removed the following three statements // priv->bridge.pci is invalid since it is initialized to null; // As a result, the function always returns ENODEV. // // if (!priv->bridge.pci) { // return ENODEV; // } switch ((dev->device_class >> 8) & 0x0ff) { case 0x00: /* What to do for host bridges? I'm pretty sure this isn't right. */ *primary_bus = dev->bus; *secondary_bus = -1; *subordinate_bus = -1; break; case 0x01: case 0x02: case 0x03: *primary_bus = dev->bus; *secondary_bus = -1; *subordinate_bus = -1; break; case 0x04: if (priv->bridge.pci == NULL) read_bridge_info(priv); //~cpw Mask bit7 of header type since it is a multi-function device // indicator; Bridge itself could be a multi-function device and // the comparison should be against 0x01 and 0x81 // if (priv->header_type == 0x01) { if ((priv->header_type & 0x7f) == 0x01) { *primary_bus = priv->bridge.pci->primary_bus; *secondary_bus = priv->bridge.pci->secondary_bus; *subordinate_bus = priv->bridge.pci->subordinate_bus; } else { *primary_bus = dev->bus; *secondary_bus = -1; *subordinate_bus = -1; } break; case 0x07: if (priv->bridge.pcmcia == NULL) read_bridge_info(priv); //~cpw Mask bit7 of header type since it is a multi-function device // indicator; Bridge itself could be a multi-function device and // the comparison should be against 0x02 and 0x82 // if (priv->header_type == 0x02) { if ((priv->header_type & 0x7f) == 0x02) { *primary_bus = priv->bridge.pcmcia->primary_bus; *secondary_bus = priv->bridge.pcmcia->card_bus; *subordinate_bus = priv->bridge.pcmcia->subordinate_bus; } else { *primary_bus = dev->bus; *secondary_bus = -1; *subordinate_bus = -1; } break; } return 0; } -----Original Message----- From: