IB/mthca: memfree completion with error FW bug workaround
authorMichael S. Tsirkin <mst@mellanox.co.il>
Tue, 13 Jun 2006 14:19:42 +0000 (17:19 +0300)
committerRoland Dreier <rolandd@cisco.com>
Sun, 18 Jun 2006 03:37:20 +0000 (20:37 -0700)
Memfree firmware is in rare cases reporting WQE index == base - 1 in
receive completion with error, instead of (rq size - 1); base is 0 in
mthca.  Here is a patch to avoid kernel crash and report a correct WR
id in this case.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/mthca/mthca_cq.c

index 205854e9c662809b49576b1ea8c3eb213e44ce72..87a8f1166a3bd86c9c416a91a2c435c0cc27d67a 100644 (file)
@@ -540,8 +540,17 @@ static inline int mthca_poll_one(struct mthca_dev *dev,
                entry->wr_id = srq->wrid[wqe_index];
                mthca_free_srq_wqe(srq, wqe);
        } else {
+               s32 wqe;
                wq = &(*cur_qp)->rq;
-               wqe_index = be32_to_cpu(cqe->wqe) >> wq->wqe_shift;
+               wqe = be32_to_cpu(cqe->wqe);
+               wqe_index = wqe >> wq->wqe_shift;
+               /*
+               * WQE addr == base - 1 might be reported in receive completion
+               * with error instead of (rq size - 1) by Sinai FW 1.0.800 and
+               * Arbel FW 5.1.400.  This bug should be fixed in later FW revs.
+               */
+               if (unlikely(wqe_index < 0))
+                       wqe_index = wq->max - 1;
                entry->wr_id = (*cur_qp)->wrid[wqe_index];
        }