aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Dreier <rolandd@cisco.com>2006-01-07 00:50:39 +0000
committerRoland Dreier <rolandd@cisco.com>2006-11-09 19:57:04 -0800
commit1749b1a0a8219f484ea8a5daa3d9f541dde3d620 (patch)
tree097057ebffdca464f470eb8e765956602cac2047
parente9ebe4cbc6e32a0bbb2b56fa996d344a4215c42a (diff)
downloadlibmthca-1749b1a0a8219f484ea8a5daa3d9f541dde3d620.tar.gz
Fill vendor_err field for completion with error
Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--src/cq.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/cq.c b/src/cq.c
index f159382..167b173 100644
--- a/src/cq.c
+++ b/src/cq.c
@@ -112,24 +112,15 @@ struct mthca_err_cqe {
uint32_t my_qpn;
uint32_t reserved1[3];
uint8_t syndrome;
- uint8_t reserved2;
+ uint8_t vendor_err;
uint16_t db_cnt;
- uint32_t reserved3;
+ uint32_t reserved2;
uint32_t wqe;
uint8_t opcode;
- uint8_t reserved4[2];
+ uint8_t reserved3[2];
uint8_t owner;
};
-static inline int is_recv_cqe(struct mthca_cqe * cqe)
-{
- if ((cqe->opcode & MTHCA_ERROR_CQE_OPCODE_MASK) ==
- MTHCA_ERROR_CQE_OPCODE_MASK)
- return !(cqe->opcode & 0x01);
- else
- return !(cqe->is_send & 0x80);
-}
-
static inline struct mthca_cqe *get_cqe(struct mthca_cq *cq, int entry)
{
return cq->buf + entry * MTHCA_CQ_ENTRY_SIZE;
@@ -197,8 +188,8 @@ static int handle_error_cqe(struct mthca_cq *cq,
}
/*
- * For completions in error, only work request ID, status (and
- * freed resource count for RD) have to be set.
+ * For completions in error, only work request ID, status, vendor error
+ * (and freed resource count for RD) have to be set.
*/
switch (cqe->syndrome) {
case SYNDROME_LOCAL_LENGTH_ERR:
@@ -260,6 +251,8 @@ static int handle_error_cqe(struct mthca_cq *cq,
break;
}
+ wc->vendor_err = cqe->vendor_err;
+
/*
* Mem-free HCAs always generate one CQE per WQE, even in the
* error case, so we don't have to check the doorbell count, etc.
@@ -530,6 +523,15 @@ void mthca_arbel_cq_event(struct ibv_cq *cq)
to_mcq(cq)->arm_sn++;
}
+static inline int is_recv_cqe(struct mthca_cqe *cqe)
+{
+ if ((cqe->opcode & MTHCA_ERROR_CQE_OPCODE_MASK) ==
+ MTHCA_ERROR_CQE_OPCODE_MASK)
+ return !(cqe->opcode & 0x01);
+ else
+ return !(cqe->is_send & 0x80);
+}
+
void mthca_cq_clean(struct mthca_cq *cq, uint32_t qpn, struct mthca_srq *srq)
{
struct mthca_cqe *cqe;