Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+21 −5
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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)
	/* 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;
			}
}
}