Skip to content

Commit

Permalink
x86/PCI: fixup early quirk probing
Browse files Browse the repository at this point in the history
On x86, we do early PCI probing to apply some quirks for chipset bugs.
However, in a recent cleanup (7bcbc78) 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>
  • Loading branch information
Jesse Barnes authored and Jesse Barnes committed Jun 16, 2008
1 parent d8f3de0 commit 15650a2
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions arch/x86/kernel/early-quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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)
Expand All @@ -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;
}
}

0 comments on commit 15650a2

Please sign in to comment.