From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1425348AbcFHS4U (ORCPT ); Wed, 8 Jun 2016 14:56:20 -0400 Received: from mail-vk0-f65.google.com ([209.85.213.65]:33817 "EHLO mail-vk0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1423712AbcFHS4R (ORCPT ); Wed, 8 Jun 2016 14:56:17 -0400 MIME-Version: 1.0 In-Reply-To: References: <82c2548dffc6cfbc484b9111b1073f407c946061.1464477483.git.lukas@wunner.de> From: Yinghai Lu Date: Wed, 8 Jun 2016 11:56:14 -0700 X-Google-Sender-Auth: A4m1T03Ol1yZhVGzPScCfs0wh_s Message-ID: Subject: Re: [tip:x86/urgent] x86/quirks: Add early quirk to reset Apple AirPort card To: Ingo Molnar , Thomas Gleixner , cmilsted@redhat.com, =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= , Bjorn Helgaas , "H. Peter Anvin" , Matt Fleming , Peter Zijlstra , Linux Kernel Mailing List , lukas@wunner.de, Linus Torvalds , Matthew Garrett , m@bues.ch Cc: "linux-tip-commits@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 8, 2016 at 7:23 AM, tip-bot for Lukas Wunner wrote: > Commit-ID: 625a99d9bfd038ea492f57308555bf4e607ce591 > Gitweb: http://git.kernel.org/tip/625a99d9bfd038ea492f57308555bf4e607ce591 > Author: Lukas Wunner > AuthorDate: Sun, 29 May 2016 01:35:28 +0200 ... > --- > arch/x86/kernel/early-quirks.c | 95 ++++++++++++++++++++++++++++++++++++------ > drivers/bcma/bcma_private.h | 2 - > include/linux/bcma/bcma.h | 1 + > 3 files changed, 83 insertions(+), 15 deletions(-) > > diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c > index bca14c8..4e4e499 100644 > --- a/arch/x86/kernel/early-quirks.c > +++ b/arch/x86/kernel/early-quirks.c ... Extend bus scan range part should be in separated patch? and put apple_airport_reset() related in second patch. > -/* > - * Only works for devices on the root bus. If you add any devices > - * not on bus 0 readd another loop level in early_quirks(). But > - * be careful because at least the Nvidia quirk here relies on > - * only matching on bus 0. > - */ > static struct chipset early_qrk[] __initdata = { > { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, > PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, > @@ -638,9 +692,13 @@ static struct chipset early_qrk[] __initdata = { > */ > { PCI_VENDOR_ID_INTEL, 0x0f00, > PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, > + { PCI_VENDOR_ID_BROADCOM, 0x4331, > + PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset}, > {} > }; > > +static void __init early_pci_scan_bus(int bus); > + > /** > * check_dev_quirk - apply early quirks to a given PCI device > * @num: bus number > @@ -649,7 +707,7 @@ static struct chipset early_qrk[] __initdata = { > * > * Check the vendor & device ID against the early quirks table. > * > - * If the device is single function, let early_quirks() know so we don't > + * If the device is single function, let early_pci_scan_bus() know so we don't > * poke at this device again. > */ > static int __init check_dev_quirk(int num, int slot, int func) > @@ -658,6 +716,7 @@ static int __init check_dev_quirk(int num, int slot, int func) > u16 vendor; > u16 device; > u8 type; > + u8 sec; > int i; > > class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); > @@ -685,25 +744,35 @@ static int __init check_dev_quirk(int num, int slot, int func) > > type = read_pci_config_byte(num, slot, func, > PCI_HEADER_TYPE); > + > + if ((type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) { > + sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS); > + early_pci_scan_bus(sec); How do you know that sec is valid ? How about on the system that have one bridge that still have sec num register 0? it will be get into dead loop. > + } > + > if (!(type & 0x80)) > return -1; > > return 0; > } > > -void __init early_quirks(void) > +static void __init early_pci_scan_bus(int bus) > { > int slot, func; > > - if (!early_pci_allowed()) > - return; > - > /* Poor man's PCI discovery */ > - /* Only scan the root bus */ > for (slot = 0; slot < 32; slot++) > for (func = 0; func < 8; func++) { > /* Only probe function 0 on single fn devices */ > - if (check_dev_quirk(0, slot, func)) > + if (check_dev_quirk(bus, slot, func)) > break; > } > } > + > +void __init early_quirks(void) > +{ > + if (!early_pci_allowed()) > + return; > + > + early_pci_scan_bus(0); > +} Would just revert to scan domain 0, bus 0 to 255. Thanks Yinghai