]> git.openfabrics.org - ~aditr/compat-rdma.git/commitdiff
Added RHEL7.5 support for qedr
authorMichal Kalderon <michal.kalderon@cavium.com>
Sun, 8 Jul 2018 17:08:37 +0000 (20:08 +0300)
committerVladimir Sokolovsky <vlad@mellanox.com>
Mon, 9 Jul 2018 15:36:04 +0000 (10:36 -0500)
Signed-off-by: Michal Kalderon <michal.kalderon@cavium.com>
patches/0007-BACKPORT-qedr.patch [new file with mode: 0644]

diff --git a/patches/0007-BACKPORT-qedr.patch b/patches/0007-BACKPORT-qedr.patch
new file mode 100644 (file)
index 0000000..acfaf9d
--- /dev/null
@@ -0,0 +1,77 @@
+diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c
+index f4cb60b..e0e8230 100644
+--- a/drivers/infiniband/hw/qedr/main.c
++++ b/drivers/infiniband/hw/qedr/main.c
+@@ -425,6 +425,7 @@ static void qedr_remove_sysfiles(struct qedr_dev *dev)
+               device_remove_file(&dev->ibdev.dev, qedr_attributes[i]);
+ }
++#ifdef HAVE_PCI_ENABLE_ATOMIC
+ static void qedr_pci_set_atomic(struct qedr_dev *dev, struct pci_dev *pdev)
+ {
+       int rc = pci_enable_atomic_ops_to_root(pdev,
+@@ -438,6 +439,64 @@ static void qedr_pci_set_atomic(struct qedr_dev *dev, struct pci_dev *pdev)
+               DP_DEBUG(dev, QEDR_MSG_INIT, "Atomic capability enabled\n");
+       }
+ }
++#else
++static void qedr_pci_set_atomic(struct qedr_dev *dev, struct pci_dev *pdev)
++{
++      struct pci_dev *bridge;
++      u32 ctl2, cap2;
++      u16 flags;
++      int rc;
++
++      bridge = pdev->bus->self;
++      if (!bridge)
++              goto disable;
++
++      /* Check atomic routing support all the way to root complex */
++      while (bridge->bus->parent) {
++              rc = pcie_capability_read_word(bridge, PCI_EXP_FLAGS, &flags);
++              if (rc || ((flags & PCI_EXP_FLAGS_VERS) < 2))
++                      goto disable;
++
++              rc = pcie_capability_read_dword(bridge, PCI_EXP_DEVCAP2, &cap2);
++              if (rc)
++                      goto disable;
++
++              rc = pcie_capability_read_dword(bridge, PCI_EXP_DEVCTL2, &ctl2);
++              if (rc)
++                      goto disable;
++
++              if (!(cap2 & PCI_EXP_DEVCAP2_ATOMIC_ROUTE) ||
++                  (ctl2 & PCI_EXP_DEVCTL2_ATOMIC_EGRESS_BLOCK))
++                      goto disable;
++              bridge = bridge->bus->parent->self;
++      }
++
++      rc = pcie_capability_read_word(bridge, PCI_EXP_FLAGS, &flags);
++      if (rc || ((flags & PCI_EXP_FLAGS_VERS) < 2))
++              goto disable;
++
++      rc = pcie_capability_read_dword(bridge, PCI_EXP_DEVCAP2, &cap2);
++      if (rc || !(cap2 & PCI_EXP_DEVCAP2_ATOMIC_COMP64))
++              goto disable;
++
++      /* Set atomic operations */
++      pcie_capability_set_word(pdev, PCI_EXP_DEVCTL2,
++                               PCI_EXP_DEVCTL2_ATOMIC_REQ);
++      dev->atomic_cap = IB_ATOMIC_GLOB;
++
++      DP_DEBUG(dev, QEDR_MSG_INIT, "Atomic capability enabled\n");
++
++      return;
++
++disable:
++      pcie_capability_clear_word(pdev, PCI_EXP_DEVCTL2,
++                                 PCI_EXP_DEVCTL2_ATOMIC_REQ);
++      dev->atomic_cap = IB_ATOMIC_NONE;
++
++      DP_DEBUG(dev, QEDR_MSG_INIT, "Atomic capability disabled\n");
++
++}
++#endif
+ static const struct qed_rdma_ops *qed_ops;