Commit 0434d271 authored by Ralph Campbell's avatar Ralph Campbell Committed by Roland Dreier

IB/ipath: Fix QP error completion queue entries

When switching to the QP error state, the completion queue entries
(error or flush) were not being generated correctly.
Signed-off-by: default avatarBryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 39c0d0b9
...@@ -361,7 +361,7 @@ static void ipath_reset_qp(struct ipath_qp *qp) ...@@ -361,7 +361,7 @@ static void ipath_reset_qp(struct ipath_qp *qp)
* @err: the receive completion error to signal if a RWQE is active * @err: the receive completion error to signal if a RWQE is active
* *
* Flushes both send and receive work queues. * Flushes both send and receive work queues.
* QP s_lock should be held and interrupts disabled. * The QP s_lock should be held and interrupts disabled.
*/ */
void ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) void ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
...@@ -393,6 +393,8 @@ void ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) ...@@ -393,6 +393,8 @@ void ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
wc.port_num = 0; wc.port_num = 0;
if (qp->r_wrid_valid) { if (qp->r_wrid_valid) {
qp->r_wrid_valid = 0; qp->r_wrid_valid = 0;
wc.wr_id = qp->r_wr_id;
wc.opcode = IB_WC_RECV;
wc.status = err; wc.status = err;
ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1); ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1);
} }
...@@ -972,7 +974,7 @@ int ipath_init_qp_table(struct ipath_ibdev *idev, int size) ...@@ -972,7 +974,7 @@ int ipath_init_qp_table(struct ipath_ibdev *idev, int size)
* @wc: the WC responsible for putting the QP in this state * @wc: the WC responsible for putting the QP in this state
* *
* Flushes the send work queue. * Flushes the send work queue.
* The QP s_lock should be held. * The QP s_lock should be held and interrupts disabled.
*/ */
void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc) void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc)
...@@ -998,12 +1000,12 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc) ...@@ -998,12 +1000,12 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc)
wc->status = IB_WC_WR_FLUSH_ERR; wc->status = IB_WC_WR_FLUSH_ERR;
while (qp->s_last != qp->s_head) { while (qp->s_last != qp->s_head) {
wqe = get_swqe_ptr(qp, qp->s_last);
wc->wr_id = wqe->wr.wr_id; wc->wr_id = wqe->wr.wr_id;
wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
if (++qp->s_last >= qp->s_size) if (++qp->s_last >= qp->s_size)
qp->s_last = 0; qp->s_last = 0;
wqe = get_swqe_ptr(qp, qp->s_last);
} }
qp->s_cur = qp->s_tail = qp->s_head; qp->s_cur = qp->s_tail = qp->s_head;
qp->state = IB_QPS_SQE; qp->state = IB_QPS_SQE;
......
...@@ -895,8 +895,10 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode) ...@@ -895,8 +895,10 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode];
wc.vendor_err = 0; wc.vendor_err = 0;
wc.byte_len = wqe->length; wc.byte_len = wqe->length;
wc.imm_data = 0;
wc.qp = &qp->ibqp; wc.qp = &qp->ibqp;
wc.src_qp = qp->remote_qpn; wc.src_qp = qp->remote_qpn;
wc.wc_flags = 0;
wc.pkey_index = 0; wc.pkey_index = 0;
wc.slid = qp->remote_ah_attr.dlid; wc.slid = qp->remote_ah_attr.dlid;
wc.sl = qp->remote_ah_attr.sl; wc.sl = qp->remote_ah_attr.sl;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment