Patch "PCI: Use function 0 VPD for identical functions, regular VPD for others" has been added to the 4.2-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
PCI: Use function 0 VPD for identical functions, regular VPD for others
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
pci-use-function-0-vpd-for-identical-functions-regular-vpd-for-others.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
da2d03ea27f6ed9d2005a67b20dd021ddacf1e4dMon Sep 17 00:00:00 2001
From: Alex Williamson <[email protected]>
Date: Tue, 15 Sep 2015 22:24:46 -0600
Subject: PCI: Use function 0 VPD for identical functions, regular VPD for others
From: Alex Williamson <[email protected]>
commit da2d03ea27f6ed9d2005a67b20dd021ddacf1e4d upstream.
932c435caba8 ("PCI: Add dev_flags bit to access VPD through function 0") added PCI_DEV_FLAGS_VPD_REF_F0. Previously, we set the flag on every non-zero function of quirked devices. If a function turned out to be different from function 0, i.e., it had a different class, vendor ID, or device ID, the flag remained set but we didn't make VPD accessible at all.
Flip this around so we only set PCI_DEV_FLAGS_VPD_REF_F0 for functions that are identical to function 0, and allow regular VPD access for any other functions.
--- drivers/pci/access.c | 22 ---------------------- drivers/pci/quirks.c | 20 ++++++++++++++++++-- 2 files changed, 18 insertions(+), 24 deletions(-)
drivers/pci/access.c +0 -22
@@ -475,23 +475,6 @@ static const struct pci_vpd_ops pci_vpd_ .release = pci_vpd_pci22_release, }; -static int pci_vpd_f0_dev_check (struct pci_dev *dev) -{ -struct pci_dev *tdev =pci_get_slot (dev->bus, -PCI_DEVFN (PCI_SLOT (dev->devfn),0 )); -int ret =0 ; - -if (!tdev) -return -ENODEV ; -if (!tdev->vpd || !tdev->multifunction || - dev->class != tdev->class || dev->vendor != tdev->vendor || - dev->device != tdev->device) - ret = -ENODEV ; - -pci_dev_put (tdev); -return ret; -} -int pci_vpd_pci22_init (struct pci_dev *dev) {struct pci_vpd_pci22 *vpd;
@@ -500,12 +483,7 @@ int pci_vpd_pci22_init(struct pci_dev *d cap =pci_find_capability (dev,PCI_CAP_ID_VPD );if (!cap)return -ENODEV ; -if (dev->dev_flags &PCI_DEV_FLAGS_VPD_REF_F0 ) { -int ret =pci_vpd_f0_dev_check (dev); -if (ret) -return ret; - } vpd =kzalloc (sizeof (*vpd),GFP_ATOMIC );if (!vpd)return -ENOMEM ;
drivers/pci/quirks.c +18 -2
@@ -1906,11 +1906,27 @@ static void quirk_netmos(struct pci_devDECLARE_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 ; + + f0 =pci_get_slot (dev->bus,PCI_DEVFN (PCI_SLOT (dev->devfn),0 )); +if (!f0)return ; - dev->dev_flags |=PCI_DEV_FLAGS_VPD_REF_F0 ; + +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);
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/pci-use-function-0-vpd-for-identical-functions-regular-vpd-for-others.patch queue-4.2/pci-fix-devfn-for-vpd-access-through-function-0.patch