lkml.org 
[lkml]   [2018]   [Jan]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 046/146] IB/hfi: Only read capability registers if the capability exists
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Michael J. Ruhl <michael.j.ruhl@intel.com>

    commit 4c009af473b2026caaa26107e34d7cc68dad7756 upstream.

    During driver init, various registers are saved to allow restoration
    after an FLR or gen3 bump. Some of these registers are not available
    in some circumstances (i.e. Virtual machines).

    This bug makes the driver unusable when the PCI device is passed into
    a VM, it fails during probe.

    Delete unnecessary register read/write, and only access register if
    the capability exists.

    Fixes: a618b7e40af2 ("IB/hfi1: Move saving PCI values to a separate function")
    Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/infiniband/hw/hfi1/hfi.h | 1 -
    drivers/infiniband/hw/hfi1/pcie.c | 30 ++++++++++++------------------
    2 files changed, 12 insertions(+), 19 deletions(-)

    --- a/drivers/infiniband/hw/hfi1/hfi.h
    +++ b/drivers/infiniband/hw/hfi1/hfi.h
    @@ -1129,7 +1129,6 @@ struct hfi1_devdata {
    u16 pcie_lnkctl;
    u16 pcie_devctl2;
    u32 pci_msix0;
    - u32 pci_lnkctl3;
    u32 pci_tph2;

    /*
    --- a/drivers/infiniband/hw/hfi1/pcie.c
    +++ b/drivers/infiniband/hw/hfi1/pcie.c
    @@ -411,15 +411,12 @@ int restore_pci_variables(struct hfi1_de
    if (ret)
    goto error;

    - ret = pci_write_config_dword(dd->pcidev, PCIE_CFG_SPCIE1,
    - dd->pci_lnkctl3);
    - if (ret)
    - goto error;
    -
    - ret = pci_write_config_dword(dd->pcidev, PCIE_CFG_TPH2, dd->pci_tph2);
    - if (ret)
    - goto error;
    -
    + if (pci_find_ext_capability(dd->pcidev, PCI_EXT_CAP_ID_TPH)) {
    + ret = pci_write_config_dword(dd->pcidev, PCIE_CFG_TPH2,
    + dd->pci_tph2);
    + if (ret)
    + goto error;
    + }
    return 0;

    error:
    @@ -469,15 +466,12 @@ int save_pci_variables(struct hfi1_devda
    if (ret)
    goto error;

    - ret = pci_read_config_dword(dd->pcidev, PCIE_CFG_SPCIE1,
    - &dd->pci_lnkctl3);
    - if (ret)
    - goto error;
    -
    - ret = pci_read_config_dword(dd->pcidev, PCIE_CFG_TPH2, &dd->pci_tph2);
    - if (ret)
    - goto error;
    -
    + if (pci_find_ext_capability(dd->pcidev, PCI_EXT_CAP_ID_TPH)) {
    + ret = pci_read_config_dword(dd->pcidev, PCIE_CFG_TPH2,
    + &dd->pci_tph2);
    + if (ret)
    + goto error;
    + }
    return 0;

    error:

    \
     
     \ /
      Last update: 2018-01-01 16:06    [W:3.274 / U:0.004 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site