]> err.no Git - linux-2.6/commitdiff
x86/PCI: fixup early quirk probing
authorJesse Barnes <jbarnes@hobbes.lan>
Mon, 16 Jun 2008 22:29:45 +0000 (15:29 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Mon, 16 Jun 2008 22:29:45 +0000 (15:29 -0700)
On x86, we do early PCI probing to apply some quirks for chipset bugs.
However, in a recent cleanup (7bcbc78dea92fdf0947fa48e248da3c993a5690f) a
thinko was introduced that causes us to probe all subfunctions of even single
function devices (a function was factored out of an inner loop and a "break"
became a "return").  Fix that up by making check_dev_quirk() return a value so
we can keep the factored code intact.

Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
arch/x86/kernel/early-quirks.c

index 9f51e1ea9e8225e919ccb69ad6b4bc315c6f38cc..8566fea647eb6abfae9ce264ad0f5b23cce4441c 100644 (file)
@@ -133,7 +133,18 @@ static struct chipset early_qrk[] __initdata = {
        {}
 };
 
-static void __init check_dev_quirk(int num, int slot, int func)
+/**
+ * check_dev_quirk - apply early quirks to a given PCI device
+ * @num: bus number
+ * @slot: slot number
+ * @func: PCI function
+ *
+ * Check the vendor & device ID against the early quirks table.
+ *
+ * If the device is single function, let early_quirks() know so we don't
+ * poke at this device again.
+ */
+static int __init check_dev_quirk(int num, int slot, int func)
 {
        u16 class;
        u16 vendor;
@@ -144,7 +155,7 @@ static void __init check_dev_quirk(int num, int slot, int func)
        class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE);
 
        if (class == 0xffff)
-               return;
+               return -1; /* no class, treat as single function */
 
        vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID);
 
@@ -167,7 +178,9 @@ static void __init check_dev_quirk(int num, int slot, int func)
        type = read_pci_config_byte(num, slot, func,
                                    PCI_HEADER_TYPE);
        if (!(type & 0x80))
-               return;
+               return -1;
+
+       return 0;
 }
 
 void __init early_quirks(void)
@@ -180,6 +193,9 @@ void __init early_quirks(void)
        /* Poor man's PCI discovery */
        for (num = 0; num < 32; num++)
                for (slot = 0; slot < 32; slot++)
-                       for (func = 0; func < 8; func++)
-                               check_dev_quirk(num, slot, func);
+                       for (func = 0; func < 8; func++) {
+                               /* Only probe function 0 on single fn devices */
+                               if (check_dev_quirk(num, slot, func))
+                                       break;
+                       }
 }