mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
PCI: Use function 0 VPD for identical functions, regular VPD for others
932c435cab
("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. [bhelgaas: changelog, stable tag] Fixes:932c435cab
("PCI: Add dev_flags bit to access VPD through function 0") Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Bjorn Helgaas <helgaas@kernel.org> Acked-by: Myron Stowe <myron.stowe@redhat.com> Acked-by: Mark Rustad <mark.d.rustad@intel.com> CC: stable@vger.kernel.org
This commit is contained in:
parent
9d9240756e
commit
da2d03ea27
2 changed files with 18 additions and 24 deletions
|
@ -475,23 +475,6 @@ static const struct pci_vpd_ops pci_vpd_f0_ops = {
|
|||
.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 *dev)
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue