Commit 8d4548f2b ("IB/qib: Default some module parameters optimally") introduced an issue with older root complexes. They cannot handle the pcie_caps of 0x51.
A typical diagnostic in this situation reported by syslog contains the text: [PCIe Poisoned TLP][Send DMA memory read] Insure the 0x51 is not used on the suspect chip sets. Reviewed-by: Mark Debbage <mark.debb...@qlogic.com> Signed-off-by: Mike Marciniszyn <mike.marcinis...@qlogic.com> --- drivers/infiniband/hw/qib/qib_pcie.c | 19 ++++++++++++++----- 1 files changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/hw/qib/qib_pcie.c b/drivers/infiniband/hw/qib/qib_pcie.c index 0de55c0..bb23ba0 100644 --- a/drivers/infiniband/hw/qib/qib_pcie.c +++ b/drivers/infiniband/hw/qib/qib_pcie.c @@ -577,7 +577,7 @@ static int qib_tune_pcie_coalesce(struct qib_devdata *dd) * BIOS may not set PCIe bus-utilization parameters for best performance. * Check and optionally adjust them to maximize our throughput. */ -static int qib_pcie_caps = 0x51; +static int qib_pcie_caps; module_param_named(pcie_caps, qib_pcie_caps, int, S_IRUGO); MODULE_PARM_DESC(pcie_caps, "Max PCIe tuning: Payload (0..3), ReadReq (4..7)"); @@ -589,6 +589,7 @@ static int qib_tune_pcie_caps(struct qib_devdata *dd) u16 pcaps, pctl, ecaps, ectl; int rc_sup, ep_sup; int rc_cur, ep_cur; + int caps = 0x51; /* may be overridden below */ /* Find out supported and configured values for parent (root) */ parent = dd->pcidev->bus->self; @@ -609,6 +610,14 @@ static int qib_tune_pcie_caps(struct qib_devdata *dd) pci_read_config_word(dd->pcidev, epos + PCI_EXP_DEVCTL, &ectl); } else goto bail; + if (!qib_pcie_caps) { + u16 devid = parent->device; + if ((devid >= 0x25e2 && devid <= 0x25fa) || + (devid >= 0x65e2 && devid <= 0x65fa) || + (devid >= 0x4021 && devid <= 0x402e)) + caps = 0; + } else + caps = qib_pcie_caps; ret = 0; /* Find max payload supported by root, endpoint */ rc_sup = fld2val(pcaps, PCI_EXP_DEVCAP_PAYLOAD); @@ -620,8 +629,8 @@ static int qib_tune_pcie_caps(struct qib_devdata *dd) ep_cur = fld2val(ectl, PCI_EXP_DEVCTL_PAYLOAD); /* If Supported greater than limit in module param, limit it */ - if (rc_sup > (qib_pcie_caps & 7)) - rc_sup = qib_pcie_caps & 7; + if (rc_sup > (caps & 7)) + rc_sup = caps & 7; /* If less than (allowed, supported), bump root payload */ if (rc_sup > rc_cur) { rc_cur = rc_sup; @@ -643,8 +652,8 @@ static int qib_tune_pcie_caps(struct qib_devdata *dd) * which is code '5' (log2(4096) - 7) */ rc_sup = 5; - if (rc_sup > ((qib_pcie_caps >> 4) & 7)) - rc_sup = (qib_pcie_caps >> 4) & 7; + if (rc_sup > ((caps >> 4) & 7)) + rc_sup = (caps >> 4) & 7; rc_cur = fld2val(pctl, PCI_EXP_DEVCTL_READRQ); ep_cur = fld2val(ectl, PCI_EXP_DEVCTL_READRQ); -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html