RDMA/nes: Use the flush code to fill in cqe error
authorDon Wood <donald.e.wood@intel.com>
Sun, 6 Sep 2009 03:36:39 +0000 (20:36 -0700)
committerRoland Dreier <rolandd@cisco.com>
Sun, 6 Sep 2009 03:36:39 +0000 (20:36 -0700)
Use the flush status to fill in cqe status when a specific error has
been identified.  Subsequent flushed completions still use the flushed
value.

Signed-off-by: Don Wood <donald.e.wood@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/nes/nes_verbs.c

index ad3c891d0f6517bb1ba76a2394725696cdbaa95a..993c1d4e0618ad11d0a25a634fe7fafa7bf648c9 100644 (file)
@@ -3655,7 +3655,16 @@ static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
                        if (cqe.cqe_words[NES_CQE_ERROR_CODE_IDX] == 0) {
                                entry->status = IB_WC_SUCCESS;
                        } else {
-                               entry->status = IB_WC_WR_FLUSH_ERR;
+                               err_code = le32_to_cpu(cqe.cqe_words[NES_CQE_ERROR_CODE_IDX]);
+                               if (NES_IWARP_CQE_MAJOR_DRV == (err_code >> 16)) {
+                                       entry->status = err_code & 0x0000ffff;
+
+                                       /* The rest of the cqe's will be marked as flushed */
+                                       nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_ERROR_CODE_IDX] =
+                                               cpu_to_le32((NES_IWARP_CQE_MAJOR_FLUSH << 16) |
+                                                           NES_IWARP_CQE_MINOR_FLUSH);
+                               } else
+                                       entry->status = IB_WC_WR_FLUSH_ERR;
                        }
 
                        entry->qp = &nesqp->ibqp;