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