Fix detection of multi-function cards
authorBryce Harrington <bryce@canonical.com>
Tue, 14 Dec 2010 17:03:48 +0000 (12:03 -0500)
committerAdam Jackson <ajax@redhat.com>
Tue, 14 Dec 2010 17:03:48 +0000 (12:03 -0500)
Bit 7 of the pci device header type is an indicator of multi-function
devices, so needs to be masked when examining the bridge type.
Thanks go to Chih-Pin Wu for finding the bug and its fix.

https://bugs.launchpad.net/ubuntu/+source/libpciaccess/+bug/681207

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Bryce Harrington <bryce@canonical.com>
src/common_bridge.c

index 2609d7c..871c1f6 100644 (file)
@@ -290,7 +290,7 @@ pci_device_get_bridge_buses(struct pci_device * dev, int *primary_bus,
     case 0x04:
     if (priv->bridge.pci == NULL)
         read_bridge_info(priv);
-    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;
@@ -304,7 +304,7 @@ pci_device_get_bridge_buses(struct pci_device * dev, int *primary_bus,
     case 0x07:
     if (priv->bridge.pcmcia == NULL)
         read_bridge_info(priv);
-    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;