|
@@ -51,6 +51,7 @@
|
|
|
#include <rdma/rdma_vt.h>
|
|
|
#include <rdma/ib_pack.h>
|
|
|
#include <rdma/ib_verbs.h>
|
|
|
+#include <rdma/rdmavt_cq.h>
|
|
|
/*
|
|
|
* Atomic bit definitions for r_aflags.
|
|
|
*/
|
|
@@ -527,7 +528,44 @@ static inline void rvt_qp_wqe_unreserve(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-extern const int ib_rvt_state_ops[];
|
|
|
+extern const enum ib_wc_opcode ib_rvt_wc_opcode[];
|
|
|
+
|
|
|
+/**
|
|
|
+ * rvt_qp_swqe_complete() - insert send completion
|
|
|
+ * @qp - the qp
|
|
|
+ * @wqe - the send wqe
|
|
|
+ * @status - completion status
|
|
|
+ *
|
|
|
+ * Insert a send completion into the completion
|
|
|
+ * queue if the qp indicates it should be done.
|
|
|
+ *
|
|
|
+ * See IBTA 10.7.3.1 for info on completion
|
|
|
+ * control.
|
|
|
+ */
|
|
|
+static inline void rvt_qp_swqe_complete(
|
|
|
+ struct rvt_qp *qp,
|
|
|
+ struct rvt_swqe *wqe,
|
|
|
+ enum ib_wc_status status)
|
|
|
+{
|
|
|
+ if (unlikely(wqe->wr.send_flags & RVT_SEND_RESERVE_USED))
|
|
|
+ return;
|
|
|
+ if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
|
|
|
+ (wqe->wr.send_flags & IB_SEND_SIGNALED) ||
|
|
|
+ status != IB_WC_SUCCESS) {
|
|
|
+ struct ib_wc wc;
|
|
|
+
|
|
|
+ memset(&wc, 0, sizeof(wc));
|
|
|
+ wc.wr_id = wqe->wr.wr_id;
|
|
|
+ wc.status = status;
|
|
|
+ wc.opcode = ib_rvt_wc_opcode[wqe->wr.opcode];
|
|
|
+ wc.qp = &qp->ibqp;
|
|
|
+ wc.byte_len = wqe->length;
|
|
|
+ rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc,
|
|
|
+ status != IB_WC_SUCCESS);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+extern const int ib_rvt_state_ops[];
|
|
|
|
|
|
struct rvt_dev_info;
|
|
|
int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err);
|