Be more paranoid about reading bridge info (#20786)
authorDarren Smith <darren.smith@juno.com>
Tue, 14 Apr 2009 14:46:26 +0000 (10:46 -0400)
committerAdam Jackson <ajax@redhat.com>
Tue, 14 Apr 2009 14:46:26 +0000 (10:46 -0400)
src/common_bridge.c

index ec1eddd..2480ba8 100644 (file)
@@ -270,10 +270,6 @@ pci_device_get_bridge_buses(struct pci_device * dev, int *primary_bus,
        return ENODEV;
     }
 
-    if (priv->bridge.pci == NULL) {
-       read_bridge_info(priv);
-    }
-
     switch ((dev->device_class >> 8) & 0x0ff) {
     case 0x00:
        /* What to do for host bridges?  I'm pretty sure this isn't right.
@@ -292,15 +288,31 @@ pci_device_get_bridge_buses(struct pci_device * dev, int *primary_bus,
        break;
 
     case 0x04:
+    if (priv->bridge.pci == NULL)
+        read_bridge_info(priv);
+    if (priv->header_type == 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);
+    if (priv->header_type == 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;
     }