|
@@ -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;
|
|
|
+ }
|
|
|
}
|