18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright(c) 2018 Intel Corporation. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef HFI1_RC_H 88c2ecf20Sopenharmony_ci#define HFI1_RC_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* cut down ridiculously long IB macro names */ 118c2ecf20Sopenharmony_ci#define OP(x) IB_OPCODE_RC_##x 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic inline void update_ack_queue(struct rvt_qp *qp, unsigned int n) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci unsigned int next; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci next = n + 1; 188c2ecf20Sopenharmony_ci if (next > rvt_size_atomic(ib_to_rvt(qp->ibqp.device))) 198c2ecf20Sopenharmony_ci next = 0; 208c2ecf20Sopenharmony_ci qp->s_tail_ack_queue = next; 218c2ecf20Sopenharmony_ci qp->s_acked_ack_queue = next; 228c2ecf20Sopenharmony_ci qp->s_ack_state = OP(ACKNOWLEDGE); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic inline void rc_defered_ack(struct hfi1_ctxtdata *rcd, 268c2ecf20Sopenharmony_ci struct rvt_qp *qp) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci if (list_empty(&qp->rspwait)) { 298c2ecf20Sopenharmony_ci qp->r_flags |= RVT_R_RSP_NAK; 308c2ecf20Sopenharmony_ci rvt_get_qp(qp); 318c2ecf20Sopenharmony_ci list_add_tail(&qp->rspwait, &rcd->qp_wait_list); 328c2ecf20Sopenharmony_ci } 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic inline u32 restart_sge(struct rvt_sge_state *ss, struct rvt_swqe *wqe, 368c2ecf20Sopenharmony_ci u32 psn, u32 pmtu) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci u32 len; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci len = delta_psn(psn, wqe->psn) * pmtu; 418c2ecf20Sopenharmony_ci return rvt_restart_sge(ss, wqe, len); 428c2ecf20Sopenharmony_ci} 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic inline void release_rdma_sge_mr(struct rvt_ack_entry *e) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci if (e->rdma_sge.mr) { 478c2ecf20Sopenharmony_ci rvt_put_mr(e->rdma_sge.mr); 488c2ecf20Sopenharmony_ci e->rdma_sge.mr = NULL; 498c2ecf20Sopenharmony_ci } 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct rvt_ack_entry *find_prev_entry(struct rvt_qp *qp, u32 psn, u8 *prev, 538c2ecf20Sopenharmony_ci u8 *prev_ack, bool *scheduled); 548c2ecf20Sopenharmony_ciint do_rc_ack(struct rvt_qp *qp, u32 aeth, u32 psn, int opcode, u64 val, 558c2ecf20Sopenharmony_ci struct hfi1_ctxtdata *rcd); 568c2ecf20Sopenharmony_cistruct rvt_swqe *do_rc_completion(struct rvt_qp *qp, struct rvt_swqe *wqe, 578c2ecf20Sopenharmony_ci struct hfi1_ibport *ibp); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#endif /* HFI1_RC_H */ 60