Lines Matching refs:qp
46 int qib_make_uc_req(struct qib_qp *qp) in qib_make_uc_req() argument
54 u32 pmtu = qp->pmtu; in qib_make_uc_req()
57 spin_lock_irqsave(&qp->s_lock, flags); in qib_make_uc_req()
59 if (!(ib_qib_state_ops[qp->state] & QIB_PROCESS_SEND_OK)) { in qib_make_uc_req()
60 if (!(ib_qib_state_ops[qp->state] & QIB_FLUSH_SEND)) in qib_make_uc_req()
63 if (qp->s_last == qp->s_head) in qib_make_uc_req()
66 if (atomic_read(&qp->s_dma_busy)) { in qib_make_uc_req()
67 qp->s_flags |= QIB_S_WAIT_DMA; in qib_make_uc_req()
70 wqe = get_swqe_ptr(qp, qp->s_last); in qib_make_uc_req()
71 qib_send_complete(qp, wqe, IB_WC_WR_FLUSH_ERR); in qib_make_uc_req()
75 ohdr = &qp->s_hdr->u.oth; in qib_make_uc_req()
76 if (qp->remote_ah_attr.ah_flags & IB_AH_GRH) in qib_make_uc_req()
77 ohdr = &qp->s_hdr->u.l.oth; in qib_make_uc_req()
84 wqe = get_swqe_ptr(qp, qp->s_cur); in qib_make_uc_req()
85 qp->s_wqe = NULL; in qib_make_uc_req()
86 switch (qp->s_state) { in qib_make_uc_req()
88 if (!(ib_qib_state_ops[qp->state] & in qib_make_uc_req()
92 if (qp->s_cur == qp->s_head) in qib_make_uc_req()
97 wqe->psn = qp->s_next_psn; in qib_make_uc_req()
98 qp->s_psn = qp->s_next_psn; in qib_make_uc_req()
99 qp->s_sge.sge = wqe->sg_list[0]; in qib_make_uc_req()
100 qp->s_sge.sg_list = wqe->sg_list + 1; in qib_make_uc_req()
101 qp->s_sge.num_sge = wqe->wr.num_sge; in qib_make_uc_req()
102 qp->s_sge.total_len = wqe->length; in qib_make_uc_req()
104 qp->s_len = len; in qib_make_uc_req()
109 qp->s_state = OP(SEND_FIRST); in qib_make_uc_req()
114 qp->s_state = OP(SEND_ONLY); in qib_make_uc_req()
116 qp->s_state = in qib_make_uc_req()
124 qp->s_wqe = wqe; in qib_make_uc_req()
125 if (++qp->s_cur >= qp->s_size) in qib_make_uc_req()
126 qp->s_cur = 0; in qib_make_uc_req()
138 qp->s_state = OP(RDMA_WRITE_FIRST); in qib_make_uc_req()
143 qp->s_state = OP(RDMA_WRITE_ONLY); in qib_make_uc_req()
145 qp->s_state = in qib_make_uc_req()
153 qp->s_wqe = wqe; in qib_make_uc_req()
154 if (++qp->s_cur >= qp->s_size) in qib_make_uc_req()
155 qp->s_cur = 0; in qib_make_uc_req()
164 qp->s_state = OP(SEND_MIDDLE); in qib_make_uc_req()
167 len = qp->s_len; in qib_make_uc_req()
173 qp->s_state = OP(SEND_LAST); in qib_make_uc_req()
175 qp->s_state = OP(SEND_LAST_WITH_IMMEDIATE); in qib_make_uc_req()
182 qp->s_wqe = wqe; in qib_make_uc_req()
183 if (++qp->s_cur >= qp->s_size) in qib_make_uc_req()
184 qp->s_cur = 0; in qib_make_uc_req()
188 qp->s_state = OP(RDMA_WRITE_MIDDLE); in qib_make_uc_req()
191 len = qp->s_len; in qib_make_uc_req()
197 qp->s_state = OP(RDMA_WRITE_LAST); in qib_make_uc_req()
199 qp->s_state = in qib_make_uc_req()
207 qp->s_wqe = wqe; in qib_make_uc_req()
208 if (++qp->s_cur >= qp->s_size) in qib_make_uc_req()
209 qp->s_cur = 0; in qib_make_uc_req()
212 qp->s_len -= len; in qib_make_uc_req()
213 qp->s_hdrwords = hwords; in qib_make_uc_req()
214 qp->s_cur_sge = &qp->s_sge; in qib_make_uc_req()
215 qp->s_cur_size = len; in qib_make_uc_req()
216 qib_make_ruc_header(qp, ohdr, bth0 | (qp->s_state << 24), in qib_make_uc_req()
217 qp->s_next_psn++ & QIB_PSN_MASK); in qib_make_uc_req()
223 qp->s_flags &= ~QIB_S_BUSY; in qib_make_uc_req()
225 spin_unlock_irqrestore(&qp->s_lock, flags); in qib_make_uc_req()
243 int has_grh, void *data, u32 tlen, struct qib_qp *qp) in qib_uc_rcv() argument
251 u32 pmtu = qp->pmtu; in qib_uc_rcv()
265 if (qib_ruc_check_hdr(ibp, hdr, has_grh, qp, opcode)) in qib_uc_rcv()
272 if (unlikely(qib_cmp24(psn, qp->r_psn) != 0)) { in qib_uc_rcv()
277 qp->r_psn = psn; in qib_uc_rcv()
279 if (qp->r_state == OP(SEND_FIRST) || in qib_uc_rcv()
280 qp->r_state == OP(SEND_MIDDLE)) { in qib_uc_rcv()
281 set_bit(QIB_R_REWIND_SGE, &qp->r_aflags); in qib_uc_rcv()
282 qp->r_sge.num_sge = 0; in qib_uc_rcv()
284 qib_put_ss(&qp->r_sge); in qib_uc_rcv()
285 qp->r_state = OP(SEND_LAST); in qib_uc_rcv()
303 switch (qp->r_state) { in qib_uc_rcv()
331 if (qp->state == IB_QPS_RTR && !(qp->r_flags & QIB_R_COMM_EST)) { in qib_uc_rcv()
332 qp->r_flags |= QIB_R_COMM_EST; in qib_uc_rcv()
333 if (qp->ibqp.event_handler) { in qib_uc_rcv()
336 ev.device = qp->ibqp.device; in qib_uc_rcv()
337 ev.element.qp = &qp->ibqp; in qib_uc_rcv()
339 qp->ibqp.event_handler(&ev, qp->ibqp.qp_context); in qib_uc_rcv()
349 if (test_and_clear_bit(QIB_R_REWIND_SGE, &qp->r_aflags)) in qib_uc_rcv()
350 qp->r_sge = qp->s_rdma_read_sge; in qib_uc_rcv()
352 ret = qib_get_rwqe(qp, 0); in qib_uc_rcv()
361 qp->s_rdma_read_sge = qp->r_sge; in qib_uc_rcv()
363 qp->r_rcv_len = 0; in qib_uc_rcv()
373 qp->r_rcv_len += pmtu; in qib_uc_rcv()
374 if (unlikely(qp->r_rcv_len > qp->r_len)) in qib_uc_rcv()
376 qib_copy_sge(&qp->r_sge, data, pmtu, 0); in qib_uc_rcv()
398 wc.byte_len = tlen + qp->r_rcv_len; in qib_uc_rcv()
399 if (unlikely(wc.byte_len > qp->r_len)) in qib_uc_rcv()
402 qib_copy_sge(&qp->r_sge, data, tlen, 0); in qib_uc_rcv()
403 qib_put_ss(&qp->s_rdma_read_sge); in qib_uc_rcv()
405 wc.wr_id = qp->r_wr_id; in qib_uc_rcv()
407 wc.qp = &qp->ibqp; in qib_uc_rcv()
408 wc.src_qp = qp->remote_qpn; in qib_uc_rcv()
409 wc.slid = qp->remote_ah_attr.dlid; in qib_uc_rcv()
410 wc.sl = qp->remote_ah_attr.sl; in qib_uc_rcv()
417 qib_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, in qib_uc_rcv()
426 if (unlikely(!(qp->qp_access_flags & in qib_uc_rcv()
432 qp->r_len = be32_to_cpu(reth->length); in qib_uc_rcv()
433 qp->r_rcv_len = 0; in qib_uc_rcv()
434 qp->r_sge.sg_list = NULL; in qib_uc_rcv()
435 if (qp->r_len != 0) { in qib_uc_rcv()
441 ok = qib_rkey_ok(qp, &qp->r_sge.sge, qp->r_len, in qib_uc_rcv()
445 qp->r_sge.num_sge = 1; in qib_uc_rcv()
447 qp->r_sge.num_sge = 0; in qib_uc_rcv()
448 qp->r_sge.sge.mr = NULL; in qib_uc_rcv()
449 qp->r_sge.sge.vaddr = NULL; in qib_uc_rcv()
450 qp->r_sge.sge.length = 0; in qib_uc_rcv()
451 qp->r_sge.sge.sge_length = 0; in qib_uc_rcv()
464 qp->r_rcv_len += pmtu; in qib_uc_rcv()
465 if (unlikely(qp->r_rcv_len > qp->r_len)) in qib_uc_rcv()
467 qib_copy_sge(&qp->r_sge, data, pmtu, 1); in qib_uc_rcv()
484 if (unlikely(tlen + qp->r_rcv_len != qp->r_len)) in qib_uc_rcv()
486 if (test_and_clear_bit(QIB_R_REWIND_SGE, &qp->r_aflags)) in qib_uc_rcv()
487 qib_put_ss(&qp->s_rdma_read_sge); in qib_uc_rcv()
489 ret = qib_get_rwqe(qp, 1); in qib_uc_rcv()
495 wc.byte_len = qp->r_len; in qib_uc_rcv()
497 qib_copy_sge(&qp->r_sge, data, tlen, 1); in qib_uc_rcv()
498 qib_put_ss(&qp->r_sge); in qib_uc_rcv()
511 if (unlikely(tlen + qp->r_rcv_len != qp->r_len)) in qib_uc_rcv()
513 qib_copy_sge(&qp->r_sge, data, tlen, 1); in qib_uc_rcv()
514 qib_put_ss(&qp->r_sge); in qib_uc_rcv()
521 qp->r_psn++; in qib_uc_rcv()
522 qp->r_state = opcode; in qib_uc_rcv()
526 set_bit(QIB_R_REWIND_SGE, &qp->r_aflags); in qib_uc_rcv()
527 qp->r_sge.num_sge = 0; in qib_uc_rcv()
533 qib_rc_error(qp, IB_WC_LOC_QP_OP_ERR); in qib_uc_rcv()