diff options
Diffstat (limited to 'arch/x86/kernel/early-quirks.c')
| -rw-r--r-- | arch/x86/kernel/early-quirks.c | 26 | 
1 files changed, 21 insertions, 5 deletions
| diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index a4665f37cfc5..a0e11c0cc872 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -120,7 +120,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; @@ -131,7 +142,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); @@ -154,7 +165,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) @@ -167,6 +180,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; +			}  } |