lkml.org 
[lkml]   [2018]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 3.18 88/98] PCI: Fix devfn for VPD access through function 0
    Date
    From: Alex Williamson <alex.williamson@redhat.com>

    [ Upstream commit 9d9240756e63dd87d6cbf5da8b98ceb8f8192b55 ]

    Commit 932c435caba8 ("PCI: Add dev_flags bit to access VPD through function
    0") passes PCI_SLOT(devfn) for the devfn parameter of pci_get_slot().
    Generally this works because we're fairly well guaranteed that a PCIe
    device is at slot address 0, but for the general case, including
    conventional PCI, it's incorrect. We need to get the slot and then convert
    it back into a devfn.

    Fixes: 932c435caba8 ("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
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/access.c | 9 ++++++---
    1 file changed, 6 insertions(+), 3 deletions(-)

    diff --git a/drivers/pci/access.c b/drivers/pci/access.c
    index 7f249b9ab2ce..2f15e7bb9f44 100644
    --- a/drivers/pci/access.c
    +++ b/drivers/pci/access.c
    @@ -355,7 +355,8 @@ static const struct pci_vpd_ops pci_vpd_pci22_ops = {
    static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count,
    void *arg)
    {
    - struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
    + struct pci_dev *tdev = pci_get_slot(dev->bus,
    + PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
    ssize_t ret;

    if (!tdev)
    @@ -369,7 +370,8 @@ static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count,
    static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count,
    const void *arg)
    {
    - struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
    + struct pci_dev *tdev = pci_get_slot(dev->bus,
    + PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
    ssize_t ret;

    if (!tdev)
    @@ -388,7 +390,8 @@ static const struct pci_vpd_ops pci_vpd_f0_ops = {

    static int pci_vpd_f0_dev_check(struct pci_dev *dev)
    {
    - struct pci_dev *tdev = pci_get_slot(dev->bus, PCI_SLOT(dev->devfn));
    + struct pci_dev *tdev = pci_get_slot(dev->bus,
    + PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
    int ret = 0;

    if (!tdev)
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-25 16:26    [W:3.086 / U:1.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site