162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2018 Intel Corporation. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef HFI1_TID_RDMA_H 762306a36Sopenharmony_ci#define HFI1_TID_RDMA_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/circ_buf.h> 1062306a36Sopenharmony_ci#include "common.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* Add a convenience helper */ 1362306a36Sopenharmony_ci#define CIRC_ADD(val, add, size) (((val) + (add)) & ((size) - 1)) 1462306a36Sopenharmony_ci#define CIRC_NEXT(val, size) CIRC_ADD(val, 1, size) 1562306a36Sopenharmony_ci#define CIRC_PREV(val, size) CIRC_ADD(val, -1, size) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define TID_RDMA_MIN_SEGMENT_SIZE BIT(18) /* 256 KiB (for now) */ 1862306a36Sopenharmony_ci#define TID_RDMA_MAX_SEGMENT_SIZE BIT(18) /* 256 KiB (for now) */ 1962306a36Sopenharmony_ci#define TID_RDMA_MAX_PAGES (BIT(18) >> PAGE_SHIFT) 2062306a36Sopenharmony_ci#define TID_RDMA_SEGMENT_SHIFT 18 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * Bit definitions for priv->s_flags. 2462306a36Sopenharmony_ci * These bit flags overload the bit flags defined for the QP's s_flags. 2562306a36Sopenharmony_ci * Due to the fact that these bit fields are used only for the QP priv 2662306a36Sopenharmony_ci * s_flags, there are no collisions. 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * HFI1_S_TID_WAIT_INTERLCK - QP is waiting for requester interlock 2962306a36Sopenharmony_ci * HFI1_R_TID_WAIT_INTERLCK - QP is waiting for responder interlock 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci#define HFI1_S_TID_BUSY_SET BIT(0) 3262306a36Sopenharmony_ci/* BIT(1) reserved for RVT_S_BUSY. */ 3362306a36Sopenharmony_ci#define HFI1_R_TID_RSC_TIMER BIT(2) 3462306a36Sopenharmony_ci/* BIT(3) reserved for RVT_S_RESP_PENDING. */ 3562306a36Sopenharmony_ci/* BIT(4) reserved for RVT_S_ACK_PENDING. */ 3662306a36Sopenharmony_ci#define HFI1_S_TID_WAIT_INTERLCK BIT(5) 3762306a36Sopenharmony_ci#define HFI1_R_TID_WAIT_INTERLCK BIT(6) 3862306a36Sopenharmony_ci/* BIT(7) - BIT(15) reserved for RVT_S_WAIT_*. */ 3962306a36Sopenharmony_ci/* BIT(16) reserved for RVT_S_SEND_ONE */ 4062306a36Sopenharmony_ci#define HFI1_S_TID_RETRY_TIMER BIT(17) 4162306a36Sopenharmony_ci/* BIT(18) reserved for RVT_S_ECN. */ 4262306a36Sopenharmony_ci#define HFI1_R_TID_SW_PSN BIT(19) 4362306a36Sopenharmony_ci/* BIT(26) reserved for HFI1_S_WAIT_HALT */ 4462306a36Sopenharmony_ci/* BIT(27) reserved for HFI1_S_WAIT_TID_RESP */ 4562306a36Sopenharmony_ci/* BIT(28) reserved for HFI1_S_WAIT_TID_SPACE */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* 4862306a36Sopenharmony_ci * Unlike regular IB RDMA VERBS, which do not require an entry 4962306a36Sopenharmony_ci * in the s_ack_queue, TID RDMA WRITE requests do because they 5062306a36Sopenharmony_ci * generate responses. 5162306a36Sopenharmony_ci * Therefore, the s_ack_queue needs to be extended by a certain 5262306a36Sopenharmony_ci * amount. The key point is that the queue needs to be extended 5362306a36Sopenharmony_ci * without letting the "user" know so they user doesn't end up 5462306a36Sopenharmony_ci * using these extra entries. 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci#define HFI1_TID_RDMA_WRITE_CNT 8 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct tid_rdma_params { 5962306a36Sopenharmony_ci struct rcu_head rcu_head; 6062306a36Sopenharmony_ci u32 qp; 6162306a36Sopenharmony_ci u32 max_len; 6262306a36Sopenharmony_ci u16 jkey; 6362306a36Sopenharmony_ci u8 max_read; 6462306a36Sopenharmony_ci u8 max_write; 6562306a36Sopenharmony_ci u8 timeout; 6662306a36Sopenharmony_ci u8 urg; 6762306a36Sopenharmony_ci u8 version; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct tid_rdma_qp_params { 7162306a36Sopenharmony_ci struct work_struct trigger_work; 7262306a36Sopenharmony_ci struct tid_rdma_params local; 7362306a36Sopenharmony_ci struct tid_rdma_params __rcu *remote; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* Track state for each hardware flow */ 7762306a36Sopenharmony_cistruct tid_flow_state { 7862306a36Sopenharmony_ci u32 generation; 7962306a36Sopenharmony_ci u32 psn; 8062306a36Sopenharmony_ci u8 index; 8162306a36Sopenharmony_ci u8 last_index; 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cienum tid_rdma_req_state { 8562306a36Sopenharmony_ci TID_REQUEST_INACTIVE = 0, 8662306a36Sopenharmony_ci TID_REQUEST_INIT, 8762306a36Sopenharmony_ci TID_REQUEST_INIT_RESEND, 8862306a36Sopenharmony_ci TID_REQUEST_ACTIVE, 8962306a36Sopenharmony_ci TID_REQUEST_RESEND, 9062306a36Sopenharmony_ci TID_REQUEST_RESEND_ACTIVE, 9162306a36Sopenharmony_ci TID_REQUEST_QUEUED, 9262306a36Sopenharmony_ci TID_REQUEST_SYNC, 9362306a36Sopenharmony_ci TID_REQUEST_RNR_NAK, 9462306a36Sopenharmony_ci TID_REQUEST_COMPLETE, 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct tid_rdma_request { 9862306a36Sopenharmony_ci struct rvt_qp *qp; 9962306a36Sopenharmony_ci struct hfi1_ctxtdata *rcd; 10062306a36Sopenharmony_ci union { 10162306a36Sopenharmony_ci struct rvt_swqe *swqe; 10262306a36Sopenharmony_ci struct rvt_ack_entry *ack; 10362306a36Sopenharmony_ci } e; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci struct tid_rdma_flow *flows; /* array of tid flows */ 10662306a36Sopenharmony_ci struct rvt_sge_state ss; /* SGE state for TID RDMA requests */ 10762306a36Sopenharmony_ci u16 n_flows; /* size of the flow buffer window */ 10862306a36Sopenharmony_ci u16 setup_head; /* flow index we are setting up */ 10962306a36Sopenharmony_ci u16 clear_tail; /* flow index we are clearing */ 11062306a36Sopenharmony_ci u16 flow_idx; /* flow index most recently set up */ 11162306a36Sopenharmony_ci u16 acked_tail; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci u32 seg_len; 11462306a36Sopenharmony_ci u32 total_len; 11562306a36Sopenharmony_ci u32 r_ack_psn; /* next expected ack PSN */ 11662306a36Sopenharmony_ci u32 r_flow_psn; /* IB PSN of next segment start */ 11762306a36Sopenharmony_ci u32 r_last_acked; /* IB PSN of last ACK'ed packet */ 11862306a36Sopenharmony_ci u32 s_next_psn; /* IB PSN of next segment start for read */ 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci u32 total_segs; /* segments required to complete a request */ 12162306a36Sopenharmony_ci u32 cur_seg; /* index of current segment */ 12262306a36Sopenharmony_ci u32 comp_seg; /* index of last completed segment */ 12362306a36Sopenharmony_ci u32 ack_seg; /* index of last ack'ed segment */ 12462306a36Sopenharmony_ci u32 alloc_seg; /* index of next segment to be allocated */ 12562306a36Sopenharmony_ci u32 isge; /* index of "current" sge */ 12662306a36Sopenharmony_ci u32 ack_pending; /* num acks pending for this request */ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci enum tid_rdma_req_state state; 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* 13262306a36Sopenharmony_ci * When header suppression is used, PSNs associated with a "flow" are 13362306a36Sopenharmony_ci * relevant (and not the PSNs maintained by verbs). Track per-flow 13462306a36Sopenharmony_ci * PSNs here for a TID RDMA segment. 13562306a36Sopenharmony_ci * 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_cistruct flow_state { 13862306a36Sopenharmony_ci u32 flags; 13962306a36Sopenharmony_ci u32 resp_ib_psn; /* The IB PSN of the response for this flow */ 14062306a36Sopenharmony_ci u32 generation; /* generation of flow */ 14162306a36Sopenharmony_ci u32 spsn; /* starting PSN in TID space */ 14262306a36Sopenharmony_ci u32 lpsn; /* last PSN in TID space */ 14362306a36Sopenharmony_ci u32 r_next_psn; /* next PSN to be received (in TID space) */ 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* For tid rdma read */ 14662306a36Sopenharmony_ci u32 ib_spsn; /* starting PSN in Verbs space */ 14762306a36Sopenharmony_ci u32 ib_lpsn; /* last PSn in Verbs space */ 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistruct tid_rdma_pageset { 15162306a36Sopenharmony_ci dma_addr_t addr : 48; /* Only needed for the first page */ 15262306a36Sopenharmony_ci u8 idx: 8; 15362306a36Sopenharmony_ci u8 count : 7; 15462306a36Sopenharmony_ci u8 mapped: 1; 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci/** 15862306a36Sopenharmony_ci * kern_tid_node - used for managing TID's in TID groups 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * @grp_idx: rcd relative index to tid_group 16162306a36Sopenharmony_ci * @map: grp->map captured prior to programming this TID group in HW 16262306a36Sopenharmony_ci * @cnt: Only @cnt of available group entries are actually programmed 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_cistruct kern_tid_node { 16562306a36Sopenharmony_ci struct tid_group *grp; 16662306a36Sopenharmony_ci u8 map; 16762306a36Sopenharmony_ci u8 cnt; 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/* Overall info for a TID RDMA segment */ 17162306a36Sopenharmony_cistruct tid_rdma_flow { 17262306a36Sopenharmony_ci /* 17362306a36Sopenharmony_ci * While a TID RDMA segment is being transferred, it uses a QP number 17462306a36Sopenharmony_ci * from the "KDETH section of QP numbers" (which is different from the 17562306a36Sopenharmony_ci * QP number that originated the request). Bits 11-15 of these QP 17662306a36Sopenharmony_ci * numbers identify the "TID flow" for the segment. 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_ci struct flow_state flow_state; 17962306a36Sopenharmony_ci struct tid_rdma_request *req; 18062306a36Sopenharmony_ci u32 tid_qpn; 18162306a36Sopenharmony_ci u32 tid_offset; 18262306a36Sopenharmony_ci u32 length; 18362306a36Sopenharmony_ci u32 sent; 18462306a36Sopenharmony_ci u8 tnode_cnt; 18562306a36Sopenharmony_ci u8 tidcnt; 18662306a36Sopenharmony_ci u8 tid_idx; 18762306a36Sopenharmony_ci u8 idx; 18862306a36Sopenharmony_ci u8 npagesets; 18962306a36Sopenharmony_ci u8 npkts; 19062306a36Sopenharmony_ci u8 pkt; 19162306a36Sopenharmony_ci u8 resync_npkts; 19262306a36Sopenharmony_ci struct kern_tid_node tnode[TID_RDMA_MAX_PAGES]; 19362306a36Sopenharmony_ci struct tid_rdma_pageset pagesets[TID_RDMA_MAX_PAGES]; 19462306a36Sopenharmony_ci u32 tid_entry[TID_RDMA_MAX_PAGES]; 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cienum tid_rnr_nak_state { 19862306a36Sopenharmony_ci TID_RNR_NAK_INIT = 0, 19962306a36Sopenharmony_ci TID_RNR_NAK_SEND, 20062306a36Sopenharmony_ci TID_RNR_NAK_SENT, 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cibool tid_rdma_conn_req(struct rvt_qp *qp, u64 *data); 20462306a36Sopenharmony_cibool tid_rdma_conn_reply(struct rvt_qp *qp, u64 data); 20562306a36Sopenharmony_cibool tid_rdma_conn_resp(struct rvt_qp *qp, u64 *data); 20662306a36Sopenharmony_civoid tid_rdma_conn_error(struct rvt_qp *qp); 20762306a36Sopenharmony_civoid tid_rdma_opfn_init(struct rvt_qp *qp, struct tid_rdma_params *p); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ciint hfi1_kern_exp_rcv_init(struct hfi1_ctxtdata *rcd, int reinit); 21062306a36Sopenharmony_ciint hfi1_kern_exp_rcv_setup(struct tid_rdma_request *req, 21162306a36Sopenharmony_ci struct rvt_sge_state *ss, bool *last); 21262306a36Sopenharmony_ciint hfi1_kern_exp_rcv_clear(struct tid_rdma_request *req); 21362306a36Sopenharmony_civoid hfi1_kern_exp_rcv_clear_all(struct tid_rdma_request *req); 21462306a36Sopenharmony_civoid __trdma_clean_swqe(struct rvt_qp *qp, struct rvt_swqe *wqe); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/** 21762306a36Sopenharmony_ci * trdma_clean_swqe - clean flows for swqe if large send queue 21862306a36Sopenharmony_ci * @qp: the qp 21962306a36Sopenharmony_ci * @wqe: the send wqe 22062306a36Sopenharmony_ci */ 22162306a36Sopenharmony_cistatic inline void trdma_clean_swqe(struct rvt_qp *qp, struct rvt_swqe *wqe) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci if (!wqe->priv) 22462306a36Sopenharmony_ci return; 22562306a36Sopenharmony_ci __trdma_clean_swqe(qp, wqe); 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_civoid hfi1_kern_read_tid_flow_free(struct rvt_qp *qp); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ciint hfi1_qp_priv_init(struct rvt_dev_info *rdi, struct rvt_qp *qp, 23162306a36Sopenharmony_ci struct ib_qp_init_attr *init_attr); 23262306a36Sopenharmony_civoid hfi1_qp_priv_tid_free(struct rvt_dev_info *rdi, struct rvt_qp *qp); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_civoid hfi1_tid_rdma_flush_wait(struct rvt_qp *qp); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ciint hfi1_kern_setup_hw_flow(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp); 23762306a36Sopenharmony_civoid hfi1_kern_clear_hw_flow(struct hfi1_ctxtdata *rcd, struct rvt_qp *qp); 23862306a36Sopenharmony_civoid hfi1_kern_init_ctxt_generations(struct hfi1_ctxtdata *rcd); 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistruct cntr_entry; 24162306a36Sopenharmony_ciu64 hfi1_access_sw_tid_wait(const struct cntr_entry *entry, 24262306a36Sopenharmony_ci void *context, int vl, int mode, u64 data); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_read_packet(struct rvt_swqe *wqe, 24562306a36Sopenharmony_ci struct ib_other_headers *ohdr, 24662306a36Sopenharmony_ci u32 *bth1, u32 *bth2, u32 *len); 24762306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_read_req(struct rvt_qp *qp, struct rvt_swqe *wqe, 24862306a36Sopenharmony_ci struct ib_other_headers *ohdr, u32 *bth1, 24962306a36Sopenharmony_ci u32 *bth2, u32 *len); 25062306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_read_req(struct hfi1_packet *packet); 25162306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_read_resp(struct rvt_qp *qp, struct rvt_ack_entry *e, 25262306a36Sopenharmony_ci struct ib_other_headers *ohdr, u32 *bth0, 25362306a36Sopenharmony_ci u32 *bth1, u32 *bth2, u32 *len, bool *last); 25462306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_read_resp(struct hfi1_packet *packet); 25562306a36Sopenharmony_cibool hfi1_handle_kdeth_eflags(struct hfi1_ctxtdata *rcd, 25662306a36Sopenharmony_ci struct hfi1_pportdata *ppd, 25762306a36Sopenharmony_ci struct hfi1_packet *packet); 25862306a36Sopenharmony_civoid hfi1_tid_rdma_restart_req(struct rvt_qp *qp, struct rvt_swqe *wqe, 25962306a36Sopenharmony_ci u32 *bth2); 26062306a36Sopenharmony_civoid hfi1_qp_kern_exp_rcv_clear_all(struct rvt_qp *qp); 26162306a36Sopenharmony_cibool hfi1_tid_rdma_wqe_interlock(struct rvt_qp *qp, struct rvt_swqe *wqe); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_civoid setup_tid_rdma_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe); 26462306a36Sopenharmony_cistatic inline void hfi1_setup_tid_rdma_wqe(struct rvt_qp *qp, 26562306a36Sopenharmony_ci struct rvt_swqe *wqe) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci if (wqe->priv && 26862306a36Sopenharmony_ci (wqe->wr.opcode == IB_WR_RDMA_READ || 26962306a36Sopenharmony_ci wqe->wr.opcode == IB_WR_RDMA_WRITE) && 27062306a36Sopenharmony_ci wqe->length >= TID_RDMA_MIN_SEGMENT_SIZE) 27162306a36Sopenharmony_ci setup_tid_rdma_wqe(qp, wqe); 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_write_req(struct rvt_qp *qp, struct rvt_swqe *wqe, 27562306a36Sopenharmony_ci struct ib_other_headers *ohdr, 27662306a36Sopenharmony_ci u32 *bth1, u32 *bth2, u32 *len); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_write_req(struct hfi1_packet *packet); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_write_resp(struct rvt_qp *qp, struct rvt_ack_entry *e, 28162306a36Sopenharmony_ci struct ib_other_headers *ohdr, u32 *bth1, 28262306a36Sopenharmony_ci u32 bth2, u32 *len, 28362306a36Sopenharmony_ci struct rvt_sge_state **ss); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_civoid hfi1_del_tid_reap_timer(struct rvt_qp *qp); 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_write_resp(struct hfi1_packet *packet); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cibool hfi1_build_tid_rdma_packet(struct rvt_swqe *wqe, 29062306a36Sopenharmony_ci struct ib_other_headers *ohdr, 29162306a36Sopenharmony_ci u32 *bth1, u32 *bth2, u32 *len); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_write_data(struct hfi1_packet *packet); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_write_ack(struct rvt_qp *qp, struct rvt_ack_entry *e, 29662306a36Sopenharmony_ci struct ib_other_headers *ohdr, u16 iflow, 29762306a36Sopenharmony_ci u32 *bth1, u32 *bth2); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_ack(struct hfi1_packet *packet); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_civoid hfi1_add_tid_retry_timer(struct rvt_qp *qp); 30262306a36Sopenharmony_civoid hfi1_del_tid_retry_timer(struct rvt_qp *qp); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ciu32 hfi1_build_tid_rdma_resync(struct rvt_qp *qp, struct rvt_swqe *wqe, 30562306a36Sopenharmony_ci struct ib_other_headers *ohdr, u32 *bth1, 30662306a36Sopenharmony_ci u32 *bth2, u16 fidx); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_civoid hfi1_rc_rcv_tid_rdma_resync(struct hfi1_packet *packet); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistruct hfi1_pkt_state; 31162306a36Sopenharmony_ciint hfi1_make_tid_rdma_pkt(struct rvt_qp *qp, struct hfi1_pkt_state *ps); 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_civoid _hfi1_do_tid_send(struct work_struct *work); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cibool hfi1_schedule_tid_send(struct rvt_qp *qp); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cibool hfi1_tid_rdma_ack_interlock(struct rvt_qp *qp, struct rvt_ack_entry *e); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci#endif /* HFI1_TID_RDMA_H */ 320