From 36fb906193f1fe9ac3345dd307459abfa91e9fd7 Mon Sep 17 00:00:00 2001 From: Knut Omang Date: Mon, 30 May 2016 14:12:39 +0200 Subject: [PATCH] sif: Fix regressions in supporting fw from release 0.1.0.4 and earlier Orabug: 23497496 This commit fixes two separate regressions in handling the old fw: 1) Teardown of the dne_qp happens only with older FWs because the newer firmwares implements the dne_qp handling in fw, so driver does not invoke the teardown code. This teardown code uses generic calls that has been implicitly amended to by the WA for Bug #4074, which also assumed that all QPs subject to that call has a valid send queue. The DNE QPs don't and this causes a null pointer exception, which is triggered both during driver unload and as a side effect of lid changes. 2) EPSC support for SL to TSL mapping was introduced in EPSC API v.0.56 but was broken - this causes the driver to set wrong values which leads to modify_qp errors. The fix is just to avoid putting the map to use unless epsc version is >= 0.57. Signed-off-by: Knut Omang --- drivers/infiniband/hw/sif/sif_hwi.c | 2 +- drivers/infiniband/hw/sif/sif_r3.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/sif/sif_hwi.c b/drivers/infiniband/hw/sif/sif_hwi.c index 0c07b45e9ce1..2a299a5085df 100644 --- a/drivers/infiniband/hw/sif/sif_hwi.c +++ b/drivers/infiniband/hw/sif/sif_hwi.c @@ -287,7 +287,7 @@ static void setup_sl2tsl_map(struct sif_dev *sdev) for (qosl = QOSL_HIGH_BANDWIDTH; qosl <= QOSL_LOW_LATENCY; ++qosl) sdev->sl2tsl[sl][port][qosl] = port ? TSL_DATA_1 : TSL_DATA; - if (eps_fw_version_lt(&sdev->es[sdev->mbox_epsc], 0, 56)) { + if (eps_fw_version_lt(&sdev->es[sdev->mbox_epsc], 0, 57)) { sif_log(sdev, SIF_INFO, "Setting up TSL per port (0.50 <= fw <= 0.56)"); return; } diff --git a/drivers/infiniband/hw/sif/sif_r3.c b/drivers/infiniband/hw/sif/sif_r3.c index 0dcd7118b1f6..5dce50c28ddf 100644 --- a/drivers/infiniband/hw/sif/sif_r3.c +++ b/drivers/infiniband/hw/sif/sif_r3.c @@ -470,6 +470,9 @@ int pre_process_wa4074(struct sif_dev *sdev, struct sif_qp *qp) u16 head; int len; + if (qp->flags & SIF_QPF_NO_EVICT) + return 0; /* do-not-evict QPs don't have any SQs */ + len = outstanding_wqes(sdev, qp, &head); if (len <= 0) return -1; -- 2.50.1