Commit 15650a2f authored by Jesse Barnes's avatar Jesse Barnes Committed by Jesse Barnes

x86/PCI: fixup early quirk probing

On x86, we do early PCI probing to apply some quirks for chipset bugs.
However, in a recent cleanup (7bcbc78d) 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: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent d8f3de0d
...@@ -133,7 +133,18 @@ static struct chipset early_qrk[] __initdata = { ...@@ -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 class;
u16 vendor; u16 vendor;
...@@ -144,7 +155,7 @@ static void __init check_dev_quirk(int num, int slot, int func) ...@@ -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); class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE);
if (class == 0xffff) if (class == 0xffff)
return; return -1; /* no class, treat as single function */
vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID); 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) ...@@ -167,7 +178,9 @@ static void __init check_dev_quirk(int num, int slot, int func)
type = read_pci_config_byte(num, slot, func, type = read_pci_config_byte(num, slot, func,
PCI_HEADER_TYPE); PCI_HEADER_TYPE);
if (!(type & 0x80)) if (!(type & 0x80))
return; return -1;
return 0;
} }
void __init early_quirks(void) void __init early_quirks(void)
...@@ -180,6 +193,9 @@ void __init early_quirks(void) ...@@ -180,6 +193,9 @@ void __init early_quirks(void)
/* Poor man's PCI discovery */ /* Poor man's PCI discovery */
for (num = 0; num < 32; num++) for (num = 0; num < 32; num++)
for (slot = 0; slot < 32; slot++) for (slot = 0; slot < 32; slot++)
for (func = 0; func < 8; func++) for (func = 0; func < 8; func++) {
check_dev_quirk(num, slot, func); /* Only probe function 0 on single fn devices */
if (check_dev_quirk(num, slot, func))
break;
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment