aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/quirks.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2015-10-12 09:51:18 +0200
committerIngo Molnar <mingo@kernel.org>2015-10-12 09:51:18 +0200
commitb9f27c0f4f7db9e5a4ba59228442a75d3177470c (patch)
tree49ab61b7e06a5a592f3541e84d1b5908a1d8030f /drivers/pci/quirks.c
parent9fc4468d546b6eb55b0aa5b04b0c36238ebf57e7 (diff)
parent25cb62b76430a91cc6195f902e61c2cb84ade622 (diff)
downloadkernel_replicant_linux-b9f27c0f4f7db9e5a4ba59228442a75d3177470c.tar.gz
kernel_replicant_linux-b9f27c0f4f7db9e5a4ba59228442a75d3177470c.tar.bz2
kernel_replicant_linux-b9f27c0f4f7db9e5a4ba59228442a75d3177470c.zip
Merge tag 'v4.3-rc5' into timers/core, to pick up fixes before applying new changes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r--drivers/pci/quirks.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 6a30252cd79f..b03373fd05ca 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1907,11 +1907,27 @@ static void quirk_netmos(struct pci_dev *dev)
DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID,
PCI_CLASS_COMMUNICATION_SERIAL, 8, quirk_netmos);
+/*
+ * Quirk non-zero PCI functions to route VPD access through function 0 for
+ * devices that share VPD resources between functions. The functions are
+ * expected to be identical devices.
+ */
static void quirk_f0_vpd_link(struct pci_dev *dev)
{
- if (!dev->multifunction || !PCI_FUNC(dev->devfn))
+ struct pci_dev *f0;
+
+ if (!PCI_FUNC(dev->devfn))
return;
- dev->dev_flags |= PCI_DEV_FLAGS_VPD_REF_F0;
+
+ f0 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
+ if (!f0)
+ return;
+
+ if (f0->vpd && dev->class == f0->class &&
+ dev->vendor == f0->vendor && dev->device == f0->device)
+ dev->dev_flags |= PCI_DEV_FLAGS_VPD_REF_F0;
+
+ pci_dev_put(f0);
}
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
PCI_CLASS_NETWORK_ETHERNET, 8, quirk_f0_vpd_link);