162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/* Authors: Bernard Metzler <bmt@zurich.ibm.com> */
462306a36Sopenharmony_ci/* Copyright (c) 2008-2019, IBM Corporation */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _SIW_H
762306a36Sopenharmony_ci#define _SIW_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <rdma/ib_verbs.h>
1062306a36Sopenharmony_ci#include <rdma/restrack.h>
1162306a36Sopenharmony_ci#include <linux/socket.h>
1262306a36Sopenharmony_ci#include <linux/skbuff.h>
1362306a36Sopenharmony_ci#include <crypto/hash.h>
1462306a36Sopenharmony_ci#include <linux/crc32.h>
1562306a36Sopenharmony_ci#include <linux/crc32c.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <rdma/siw-abi.h>
1862306a36Sopenharmony_ci#include "iwarp.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define SIW_VENDOR_ID 0x626d74 /* ascii 'bmt' for now */
2162306a36Sopenharmony_ci#define SIW_VENDORT_PART_ID 0
2262306a36Sopenharmony_ci#define SIW_MAX_QP (1024 * 100)
2362306a36Sopenharmony_ci#define SIW_MAX_QP_WR (1024 * 32)
2462306a36Sopenharmony_ci#define SIW_MAX_ORD_QP 128
2562306a36Sopenharmony_ci#define SIW_MAX_IRD_QP 128
2662306a36Sopenharmony_ci#define SIW_MAX_SGE_PBL 256 /* max num sge's for PBL */
2762306a36Sopenharmony_ci#define SIW_MAX_SGE_RD 1 /* iwarp limitation. we could relax */
2862306a36Sopenharmony_ci#define SIW_MAX_CQ (1024 * 100)
2962306a36Sopenharmony_ci#define SIW_MAX_CQE (SIW_MAX_QP_WR * 100)
3062306a36Sopenharmony_ci#define SIW_MAX_MR (SIW_MAX_QP * 10)
3162306a36Sopenharmony_ci#define SIW_MAX_PD SIW_MAX_QP
3262306a36Sopenharmony_ci#define SIW_MAX_MW 0 /* to be set if MW's are supported */
3362306a36Sopenharmony_ci#define SIW_MAX_SRQ SIW_MAX_QP
3462306a36Sopenharmony_ci#define SIW_MAX_SRQ_WR (SIW_MAX_QP_WR * 10)
3562306a36Sopenharmony_ci#define SIW_MAX_CONTEXT SIW_MAX_PD
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* Min number of bytes for using zero copy transmit */
3862306a36Sopenharmony_ci#define SENDPAGE_THRESH PAGE_SIZE
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* Maximum number of frames which can be send in one SQ processing */
4162306a36Sopenharmony_ci#define SQ_USER_MAXBURST 100
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* Maximum number of consecutive IRQ elements which get served
4462306a36Sopenharmony_ci * if SQ has pending work. Prevents starving local SQ processing
4562306a36Sopenharmony_ci * by serving peer Read Requests.
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_ci#define SIW_IRQ_MAXBURST_SQ_ACTIVE 4
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct siw_dev_cap {
5062306a36Sopenharmony_ci	int max_qp;
5162306a36Sopenharmony_ci	int max_qp_wr;
5262306a36Sopenharmony_ci	int max_ord; /* max. outbound read queue depth */
5362306a36Sopenharmony_ci	int max_ird; /* max. inbound read queue depth */
5462306a36Sopenharmony_ci	int max_sge;
5562306a36Sopenharmony_ci	int max_sge_rd;
5662306a36Sopenharmony_ci	int max_cq;
5762306a36Sopenharmony_ci	int max_cqe;
5862306a36Sopenharmony_ci	int max_mr;
5962306a36Sopenharmony_ci	int max_pd;
6062306a36Sopenharmony_ci	int max_mw;
6162306a36Sopenharmony_ci	int max_srq;
6262306a36Sopenharmony_ci	int max_srq_wr;
6362306a36Sopenharmony_ci	int max_srq_sge;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct siw_pd {
6762306a36Sopenharmony_ci	struct ib_pd base_pd;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistruct siw_device {
7162306a36Sopenharmony_ci	struct ib_device base_dev;
7262306a36Sopenharmony_ci	struct net_device *netdev;
7362306a36Sopenharmony_ci	struct siw_dev_cap attrs;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	u32 vendor_part_id;
7662306a36Sopenharmony_ci	int numa_node;
7762306a36Sopenharmony_ci	char raw_gid[ETH_ALEN];
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* physical port state (only one port per device) */
8062306a36Sopenharmony_ci	enum ib_port_state state;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	spinlock_t lock;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	struct xarray qp_xa;
8562306a36Sopenharmony_ci	struct xarray mem_xa;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	struct list_head cep_list;
8862306a36Sopenharmony_ci	struct list_head qp_list;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/* active objects statistics to enforce limits */
9162306a36Sopenharmony_ci	atomic_t num_qp;
9262306a36Sopenharmony_ci	atomic_t num_cq;
9362306a36Sopenharmony_ci	atomic_t num_pd;
9462306a36Sopenharmony_ci	atomic_t num_mr;
9562306a36Sopenharmony_ci	atomic_t num_srq;
9662306a36Sopenharmony_ci	atomic_t num_ctx;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	struct work_struct netdev_down;
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistruct siw_ucontext {
10262306a36Sopenharmony_ci	struct ib_ucontext base_ucontext;
10362306a36Sopenharmony_ci	struct siw_device *sdev;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/*
10762306a36Sopenharmony_ci * The RDMA core does not define LOCAL_READ access, which is always
10862306a36Sopenharmony_ci * enabled implictely.
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_ci#define IWARP_ACCESS_MASK					\
11162306a36Sopenharmony_ci	(IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE	|	\
11262306a36Sopenharmony_ci	 IB_ACCESS_REMOTE_READ)
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci/*
11562306a36Sopenharmony_ci * siw presentation of user memory registered as source
11662306a36Sopenharmony_ci * or target of RDMA operations.
11762306a36Sopenharmony_ci */
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cistruct siw_page_chunk {
12062306a36Sopenharmony_ci	struct page **plist;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistruct siw_umem {
12462306a36Sopenharmony_ci	struct siw_page_chunk *page_chunk;
12562306a36Sopenharmony_ci	int num_pages;
12662306a36Sopenharmony_ci	bool writable;
12762306a36Sopenharmony_ci	u64 fp_addr; /* First page base address */
12862306a36Sopenharmony_ci	struct mm_struct *owning_mm;
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cistruct siw_pble {
13262306a36Sopenharmony_ci	dma_addr_t addr; /* Address of assigned buffer */
13362306a36Sopenharmony_ci	unsigned int size; /* Size of this entry */
13462306a36Sopenharmony_ci	unsigned long pbl_off; /* Total offset from start of PBL */
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistruct siw_pbl {
13862306a36Sopenharmony_ci	unsigned int num_buf;
13962306a36Sopenharmony_ci	unsigned int max_buf;
14062306a36Sopenharmony_ci	struct siw_pble pbe[];
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/*
14462306a36Sopenharmony_ci * Generic memory representation for registered siw memory.
14562306a36Sopenharmony_ci * Memory lookup always via higher 24 bit of STag (STag index).
14662306a36Sopenharmony_ci */
14762306a36Sopenharmony_cistruct siw_mem {
14862306a36Sopenharmony_ci	struct siw_device *sdev;
14962306a36Sopenharmony_ci	struct kref ref;
15062306a36Sopenharmony_ci	u64 va; /* VA of memory */
15162306a36Sopenharmony_ci	u64 len; /* length of the memory buffer in bytes */
15262306a36Sopenharmony_ci	u32 stag; /* iWarp memory access steering tag */
15362306a36Sopenharmony_ci	u8 stag_valid; /* VALID or INVALID */
15462306a36Sopenharmony_ci	u8 is_pbl; /* PBL or user space mem */
15562306a36Sopenharmony_ci	u8 is_mw; /* Memory Region or Memory Window */
15662306a36Sopenharmony_ci	enum ib_access_flags perms; /* local/remote READ & WRITE */
15762306a36Sopenharmony_ci	union {
15862306a36Sopenharmony_ci		struct siw_umem *umem;
15962306a36Sopenharmony_ci		struct siw_pbl *pbl;
16062306a36Sopenharmony_ci		void *mem_obj;
16162306a36Sopenharmony_ci	};
16262306a36Sopenharmony_ci	struct ib_pd *pd;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistruct siw_mr {
16662306a36Sopenharmony_ci	struct ib_mr base_mr;
16762306a36Sopenharmony_ci	struct siw_mem *mem;
16862306a36Sopenharmony_ci	struct rcu_head rcu;
16962306a36Sopenharmony_ci};
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/*
17262306a36Sopenharmony_ci * Error codes for local or remote
17362306a36Sopenharmony_ci * access to registered memory
17462306a36Sopenharmony_ci */
17562306a36Sopenharmony_cienum siw_access_state {
17662306a36Sopenharmony_ci	E_ACCESS_OK,
17762306a36Sopenharmony_ci	E_STAG_INVALID,
17862306a36Sopenharmony_ci	E_BASE_BOUNDS,
17962306a36Sopenharmony_ci	E_ACCESS_PERM,
18062306a36Sopenharmony_ci	E_PD_MISMATCH
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cienum siw_wr_state {
18462306a36Sopenharmony_ci	SIW_WR_IDLE,
18562306a36Sopenharmony_ci	SIW_WR_QUEUED, /* processing has not started yet */
18662306a36Sopenharmony_ci	SIW_WR_INPROGRESS /* initiated processing of the WR */
18762306a36Sopenharmony_ci};
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci/* The WQE currently being processed (RX or TX) */
19062306a36Sopenharmony_cistruct siw_wqe {
19162306a36Sopenharmony_ci	/* Copy of applications SQE or RQE */
19262306a36Sopenharmony_ci	union {
19362306a36Sopenharmony_ci		struct siw_sqe sqe;
19462306a36Sopenharmony_ci		struct siw_rqe rqe;
19562306a36Sopenharmony_ci	};
19662306a36Sopenharmony_ci	struct siw_mem *mem[SIW_MAX_SGE]; /* per sge's resolved mem */
19762306a36Sopenharmony_ci	enum siw_wr_state wr_status;
19862306a36Sopenharmony_ci	enum siw_wc_status wc_status;
19962306a36Sopenharmony_ci	u32 bytes; /* total bytes to process */
20062306a36Sopenharmony_ci	u32 processed; /* bytes processed */
20162306a36Sopenharmony_ci};
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistruct siw_cq {
20462306a36Sopenharmony_ci	struct ib_cq base_cq;
20562306a36Sopenharmony_ci	spinlock_t lock;
20662306a36Sopenharmony_ci	struct siw_cq_ctrl *notify;
20762306a36Sopenharmony_ci	struct siw_cqe *queue;
20862306a36Sopenharmony_ci	u32 cq_put;
20962306a36Sopenharmony_ci	u32 cq_get;
21062306a36Sopenharmony_ci	u32 num_cqe;
21162306a36Sopenharmony_ci	struct rdma_user_mmap_entry *cq_entry; /* mmap info for CQE array */
21262306a36Sopenharmony_ci	u32 id; /* For debugging only */
21362306a36Sopenharmony_ci};
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cienum siw_qp_state {
21662306a36Sopenharmony_ci	SIW_QP_STATE_IDLE,
21762306a36Sopenharmony_ci	SIW_QP_STATE_RTR,
21862306a36Sopenharmony_ci	SIW_QP_STATE_RTS,
21962306a36Sopenharmony_ci	SIW_QP_STATE_CLOSING,
22062306a36Sopenharmony_ci	SIW_QP_STATE_TERMINATE,
22162306a36Sopenharmony_ci	SIW_QP_STATE_ERROR,
22262306a36Sopenharmony_ci	SIW_QP_STATE_COUNT
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cienum siw_qp_flags {
22662306a36Sopenharmony_ci	SIW_RDMA_BIND_ENABLED = (1 << 0),
22762306a36Sopenharmony_ci	SIW_RDMA_WRITE_ENABLED = (1 << 1),
22862306a36Sopenharmony_ci	SIW_RDMA_READ_ENABLED = (1 << 2),
22962306a36Sopenharmony_ci	SIW_SIGNAL_ALL_WR = (1 << 3),
23062306a36Sopenharmony_ci	SIW_MPA_CRC = (1 << 4),
23162306a36Sopenharmony_ci	SIW_QP_IN_DESTROY = (1 << 5)
23262306a36Sopenharmony_ci};
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cienum siw_qp_attr_mask {
23562306a36Sopenharmony_ci	SIW_QP_ATTR_STATE = (1 << 0),
23662306a36Sopenharmony_ci	SIW_QP_ATTR_ACCESS_FLAGS = (1 << 1),
23762306a36Sopenharmony_ci	SIW_QP_ATTR_LLP_HANDLE = (1 << 2),
23862306a36Sopenharmony_ci	SIW_QP_ATTR_ORD = (1 << 3),
23962306a36Sopenharmony_ci	SIW_QP_ATTR_IRD = (1 << 4),
24062306a36Sopenharmony_ci	SIW_QP_ATTR_SQ_SIZE = (1 << 5),
24162306a36Sopenharmony_ci	SIW_QP_ATTR_RQ_SIZE = (1 << 6),
24262306a36Sopenharmony_ci	SIW_QP_ATTR_MPA = (1 << 7)
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistruct siw_srq {
24662306a36Sopenharmony_ci	struct ib_srq base_srq;
24762306a36Sopenharmony_ci	spinlock_t lock;
24862306a36Sopenharmony_ci	u32 max_sge;
24962306a36Sopenharmony_ci	u32 limit; /* low watermark for async event */
25062306a36Sopenharmony_ci	struct siw_rqe *recvq;
25162306a36Sopenharmony_ci	u32 rq_put;
25262306a36Sopenharmony_ci	u32 rq_get;
25362306a36Sopenharmony_ci	u32 num_rqe; /* max # of wqe's allowed */
25462306a36Sopenharmony_ci	struct rdma_user_mmap_entry *srq_entry; /* mmap info for SRQ array */
25562306a36Sopenharmony_ci	bool armed:1; /* inform user if limit hit */
25662306a36Sopenharmony_ci	bool is_kernel_res:1; /* true if kernel client */
25762306a36Sopenharmony_ci};
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistruct siw_qp_attrs {
26062306a36Sopenharmony_ci	enum siw_qp_state state;
26162306a36Sopenharmony_ci	u32 sq_size;
26262306a36Sopenharmony_ci	u32 rq_size;
26362306a36Sopenharmony_ci	u32 orq_size;
26462306a36Sopenharmony_ci	u32 irq_size;
26562306a36Sopenharmony_ci	u32 sq_max_sges;
26662306a36Sopenharmony_ci	u32 rq_max_sges;
26762306a36Sopenharmony_ci	enum siw_qp_flags flags;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	struct socket *sk;
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cienum siw_tx_ctx {
27362306a36Sopenharmony_ci	SIW_SEND_HDR, /* start or continue sending HDR */
27462306a36Sopenharmony_ci	SIW_SEND_DATA, /* start or continue sending DDP payload */
27562306a36Sopenharmony_ci	SIW_SEND_TRAILER, /* start or continue sending TRAILER */
27662306a36Sopenharmony_ci	SIW_SEND_SHORT_FPDU/* send whole FPDU hdr|data|trailer at once */
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cienum siw_rx_state {
28062306a36Sopenharmony_ci	SIW_GET_HDR, /* await new hdr or within hdr */
28162306a36Sopenharmony_ci	SIW_GET_DATA_START, /* start of inbound DDP payload */
28262306a36Sopenharmony_ci	SIW_GET_DATA_MORE, /* continuation of (misaligned) DDP payload */
28362306a36Sopenharmony_ci	SIW_GET_TRAILER/* await new trailer or within trailer */
28462306a36Sopenharmony_ci};
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cistruct siw_rx_stream {
28762306a36Sopenharmony_ci	struct sk_buff *skb;
28862306a36Sopenharmony_ci	int skb_new; /* pending unread bytes in skb */
28962306a36Sopenharmony_ci	int skb_offset; /* offset in skb */
29062306a36Sopenharmony_ci	int skb_copied; /* processed bytes in skb */
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	union iwarp_hdr hdr;
29362306a36Sopenharmony_ci	struct mpa_trailer trailer;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	enum siw_rx_state state;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	/*
29862306a36Sopenharmony_ci	 * For each FPDU, main RX loop runs through 3 stages:
29962306a36Sopenharmony_ci	 * Receiving protocol headers, placing DDP payload and receiving
30062306a36Sopenharmony_ci	 * trailer information (CRC + possibly padding).
30162306a36Sopenharmony_ci	 * Next two variables keep state on receive status of the
30262306a36Sopenharmony_ci	 * current FPDU part (hdr, data, trailer).
30362306a36Sopenharmony_ci	 */
30462306a36Sopenharmony_ci	int fpdu_part_rcvd; /* bytes in pkt part copied */
30562306a36Sopenharmony_ci	int fpdu_part_rem; /* bytes in pkt part not seen */
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	/*
30862306a36Sopenharmony_ci	 * Next expected DDP MSN for each QN +
30962306a36Sopenharmony_ci	 * expected steering tag +
31062306a36Sopenharmony_ci	 * expected DDP tagget offset (all HBO)
31162306a36Sopenharmony_ci	 */
31262306a36Sopenharmony_ci	u32 ddp_msn[RDMAP_UNTAGGED_QN_COUNT];
31362306a36Sopenharmony_ci	u32 ddp_stag;
31462306a36Sopenharmony_ci	u64 ddp_to;
31562306a36Sopenharmony_ci	u32 inval_stag; /* Stag to be invalidated */
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	struct shash_desc *mpa_crc_hd;
31862306a36Sopenharmony_ci	u8 rx_suspend : 1;
31962306a36Sopenharmony_ci	u8 pad : 2; /* # of pad bytes expected */
32062306a36Sopenharmony_ci	u8 rdmap_op : 4; /* opcode of current frame */
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistruct siw_rx_fpdu {
32462306a36Sopenharmony_ci	/*
32562306a36Sopenharmony_ci	 * Local destination memory of inbound RDMA operation.
32662306a36Sopenharmony_ci	 * Valid, according to wqe->wr_status
32762306a36Sopenharmony_ci	 */
32862306a36Sopenharmony_ci	struct siw_wqe wqe_active;
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	unsigned int pbl_idx; /* Index into current PBL */
33162306a36Sopenharmony_ci	unsigned int sge_idx; /* current sge in rx */
33262306a36Sopenharmony_ci	unsigned int sge_off; /* already rcvd in curr. sge */
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	char first_ddp_seg; /* this is the first DDP seg */
33562306a36Sopenharmony_ci	char more_ddp_segs; /* more DDP segs expected */
33662306a36Sopenharmony_ci	u8 prev_rdmap_op : 4; /* opcode of prev frame */
33762306a36Sopenharmony_ci};
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci/*
34062306a36Sopenharmony_ci * Shorthands for short packets w/o payload
34162306a36Sopenharmony_ci * to be transmitted more efficient.
34262306a36Sopenharmony_ci */
34362306a36Sopenharmony_cistruct siw_send_pkt {
34462306a36Sopenharmony_ci	struct iwarp_send send;
34562306a36Sopenharmony_ci	__be32 crc;
34662306a36Sopenharmony_ci};
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_cistruct siw_write_pkt {
34962306a36Sopenharmony_ci	struct iwarp_rdma_write write;
35062306a36Sopenharmony_ci	__be32 crc;
35162306a36Sopenharmony_ci};
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_cistruct siw_rreq_pkt {
35462306a36Sopenharmony_ci	struct iwarp_rdma_rreq rreq;
35562306a36Sopenharmony_ci	__be32 crc;
35662306a36Sopenharmony_ci};
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_cistruct siw_rresp_pkt {
35962306a36Sopenharmony_ci	struct iwarp_rdma_rresp rresp;
36062306a36Sopenharmony_ci	__be32 crc;
36162306a36Sopenharmony_ci};
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistruct siw_iwarp_tx {
36462306a36Sopenharmony_ci	union {
36562306a36Sopenharmony_ci		union iwarp_hdr hdr;
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci		/* Generic part of FPDU header */
36862306a36Sopenharmony_ci		struct iwarp_ctrl ctrl;
36962306a36Sopenharmony_ci		struct iwarp_ctrl_untagged c_untagged;
37062306a36Sopenharmony_ci		struct iwarp_ctrl_tagged c_tagged;
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci		/* FPDU headers */
37362306a36Sopenharmony_ci		struct iwarp_rdma_write rwrite;
37462306a36Sopenharmony_ci		struct iwarp_rdma_rreq rreq;
37562306a36Sopenharmony_ci		struct iwarp_rdma_rresp rresp;
37662306a36Sopenharmony_ci		struct iwarp_terminate terminate;
37762306a36Sopenharmony_ci		struct iwarp_send send;
37862306a36Sopenharmony_ci		struct iwarp_send_inv send_inv;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci		/* complete short FPDUs */
38162306a36Sopenharmony_ci		struct siw_send_pkt send_pkt;
38262306a36Sopenharmony_ci		struct siw_write_pkt write_pkt;
38362306a36Sopenharmony_ci		struct siw_rreq_pkt rreq_pkt;
38462306a36Sopenharmony_ci		struct siw_rresp_pkt rresp_pkt;
38562306a36Sopenharmony_ci	} pkt;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	struct mpa_trailer trailer;
38862306a36Sopenharmony_ci	/* DDP MSN for untagged messages */
38962306a36Sopenharmony_ci	u32 ddp_msn[RDMAP_UNTAGGED_QN_COUNT];
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci	enum siw_tx_ctx state;
39262306a36Sopenharmony_ci	u16 ctrl_len; /* ddp+rdmap hdr */
39362306a36Sopenharmony_ci	u16 ctrl_sent;
39462306a36Sopenharmony_ci	int burst;
39562306a36Sopenharmony_ci	int bytes_unsent; /* ddp payload bytes */
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	struct shash_desc *mpa_crc_hd;
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci	u8 do_crc : 1; /* do crc for segment */
40062306a36Sopenharmony_ci	u8 use_sendpage : 1; /* send w/o copy */
40162306a36Sopenharmony_ci	u8 tx_suspend : 1; /* stop sending DDP segs. */
40262306a36Sopenharmony_ci	u8 pad : 2; /* # pad in current fpdu */
40362306a36Sopenharmony_ci	u8 orq_fence : 1; /* ORQ full or Send fenced */
40462306a36Sopenharmony_ci	u8 in_syscall : 1; /* TX out of user context */
40562306a36Sopenharmony_ci	u8 zcopy_tx : 1; /* Use TCP_SENDPAGE if possible */
40662306a36Sopenharmony_ci	u8 gso_seg_limit; /* Maximum segments for GSO, 0 = unbound */
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	u16 fpdu_len; /* len of FPDU to tx */
40962306a36Sopenharmony_ci	unsigned int tcp_seglen; /* remaining tcp seg space */
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci	struct siw_wqe wqe_active;
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci	int pbl_idx; /* Index into current PBL */
41462306a36Sopenharmony_ci	int sge_idx; /* current sge in tx */
41562306a36Sopenharmony_ci	u32 sge_off; /* already sent in curr. sge */
41662306a36Sopenharmony_ci};
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistruct siw_qp {
41962306a36Sopenharmony_ci	struct ib_qp base_qp;
42062306a36Sopenharmony_ci	struct siw_device *sdev;
42162306a36Sopenharmony_ci	struct kref ref;
42262306a36Sopenharmony_ci	struct completion qp_free;
42362306a36Sopenharmony_ci	struct list_head devq;
42462306a36Sopenharmony_ci	int tx_cpu;
42562306a36Sopenharmony_ci	struct siw_qp_attrs attrs;
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci	struct siw_cep *cep;
42862306a36Sopenharmony_ci	struct rw_semaphore state_lock;
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	struct ib_pd *pd;
43162306a36Sopenharmony_ci	struct siw_cq *scq;
43262306a36Sopenharmony_ci	struct siw_cq *rcq;
43362306a36Sopenharmony_ci	struct siw_srq *srq;
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	struct siw_iwarp_tx tx_ctx; /* Transmit context */
43662306a36Sopenharmony_ci	spinlock_t sq_lock;
43762306a36Sopenharmony_ci	struct siw_sqe *sendq; /* send queue element array */
43862306a36Sopenharmony_ci	uint32_t sq_get; /* consumer index into sq array */
43962306a36Sopenharmony_ci	uint32_t sq_put; /* kernel prod. index into sq array */
44062306a36Sopenharmony_ci	struct llist_node tx_list;
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	struct siw_sqe *orq; /* outbound read queue element array */
44362306a36Sopenharmony_ci	spinlock_t orq_lock;
44462306a36Sopenharmony_ci	uint32_t orq_get; /* consumer index into orq array */
44562306a36Sopenharmony_ci	uint32_t orq_put; /* shared producer index for ORQ */
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	struct siw_rx_stream rx_stream;
44862306a36Sopenharmony_ci	struct siw_rx_fpdu *rx_fpdu;
44962306a36Sopenharmony_ci	struct siw_rx_fpdu rx_tagged;
45062306a36Sopenharmony_ci	struct siw_rx_fpdu rx_untagged;
45162306a36Sopenharmony_ci	spinlock_t rq_lock;
45262306a36Sopenharmony_ci	struct siw_rqe *recvq; /* recv queue element array */
45362306a36Sopenharmony_ci	uint32_t rq_get; /* consumer index into rq array */
45462306a36Sopenharmony_ci	uint32_t rq_put; /* kernel prod. index into rq array */
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci	struct siw_sqe *irq; /* inbound read queue element array */
45762306a36Sopenharmony_ci	uint32_t irq_get; /* consumer index into irq array */
45862306a36Sopenharmony_ci	uint32_t irq_put; /* producer index into irq array */
45962306a36Sopenharmony_ci	int irq_burst;
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	struct { /* information to be carried in TERMINATE pkt, if valid */
46262306a36Sopenharmony_ci		u8 valid;
46362306a36Sopenharmony_ci		u8 in_tx;
46462306a36Sopenharmony_ci		u8 layer : 4, etype : 4;
46562306a36Sopenharmony_ci		u8 ecode;
46662306a36Sopenharmony_ci	} term_info;
46762306a36Sopenharmony_ci	struct rdma_user_mmap_entry *sq_entry; /* mmap info for SQE array */
46862306a36Sopenharmony_ci	struct rdma_user_mmap_entry *rq_entry; /* mmap info for RQE array */
46962306a36Sopenharmony_ci	struct rcu_head rcu;
47062306a36Sopenharmony_ci};
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci/* helper macros */
47362306a36Sopenharmony_ci#define rx_qp(rx) container_of(rx, struct siw_qp, rx_stream)
47462306a36Sopenharmony_ci#define tx_qp(tx) container_of(tx, struct siw_qp, tx_ctx)
47562306a36Sopenharmony_ci#define tx_wqe(qp) (&(qp)->tx_ctx.wqe_active)
47662306a36Sopenharmony_ci#define rx_wqe(rctx) (&(rctx)->wqe_active)
47762306a36Sopenharmony_ci#define rx_mem(rctx) ((rctx)->wqe_active.mem[0])
47862306a36Sopenharmony_ci#define tx_type(wqe) ((wqe)->sqe.opcode)
47962306a36Sopenharmony_ci#define rx_type(wqe) ((wqe)->rqe.opcode)
48062306a36Sopenharmony_ci#define tx_flags(wqe) ((wqe)->sqe.flags)
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cistruct iwarp_msg_info {
48362306a36Sopenharmony_ci	int hdr_len;
48462306a36Sopenharmony_ci	struct iwarp_ctrl ctrl;
48562306a36Sopenharmony_ci	int (*rx_data)(struct siw_qp *qp);
48662306a36Sopenharmony_ci};
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_cistruct siw_user_mmap_entry {
48962306a36Sopenharmony_ci	struct rdma_user_mmap_entry rdma_entry;
49062306a36Sopenharmony_ci	void *address;
49162306a36Sopenharmony_ci};
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci/* Global siw parameters. Currently set in siw_main.c */
49462306a36Sopenharmony_ciextern const bool zcopy_tx;
49562306a36Sopenharmony_ciextern const bool try_gso;
49662306a36Sopenharmony_ciextern const bool loopback_enabled;
49762306a36Sopenharmony_ciextern const bool mpa_crc_required;
49862306a36Sopenharmony_ciextern const bool mpa_crc_strict;
49962306a36Sopenharmony_ciextern const bool siw_tcp_nagle;
50062306a36Sopenharmony_ciextern u_char mpa_version;
50162306a36Sopenharmony_ciextern const bool peer_to_peer;
50262306a36Sopenharmony_ciextern struct task_struct *siw_tx_thread[];
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ciextern struct crypto_shash *siw_crypto_shash;
50562306a36Sopenharmony_ciextern struct iwarp_msg_info iwarp_pktinfo[RDMAP_TERMINATE + 1];
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci/* QP general functions */
50862306a36Sopenharmony_ciint siw_qp_modify(struct siw_qp *qp, struct siw_qp_attrs *attr,
50962306a36Sopenharmony_ci		  enum siw_qp_attr_mask mask);
51062306a36Sopenharmony_ciint siw_qp_mpa_rts(struct siw_qp *qp, enum mpa_v2_ctrl ctrl);
51162306a36Sopenharmony_civoid siw_qp_llp_close(struct siw_qp *qp);
51262306a36Sopenharmony_civoid siw_qp_cm_drop(struct siw_qp *qp, int schedule);
51362306a36Sopenharmony_civoid siw_send_terminate(struct siw_qp *qp);
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_civoid siw_qp_get_ref(struct ib_qp *qp);
51662306a36Sopenharmony_civoid siw_qp_put_ref(struct ib_qp *qp);
51762306a36Sopenharmony_ciint siw_qp_add(struct siw_device *sdev, struct siw_qp *qp);
51862306a36Sopenharmony_civoid siw_free_qp(struct kref *ref);
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_civoid siw_init_terminate(struct siw_qp *qp, enum term_elayer layer,
52162306a36Sopenharmony_ci			u8 etype, u8 ecode, int in_tx);
52262306a36Sopenharmony_cienum ddp_ecode siw_tagged_error(enum siw_access_state state);
52362306a36Sopenharmony_cienum rdmap_ecode siw_rdmap_error(enum siw_access_state state);
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_civoid siw_read_to_orq(struct siw_sqe *rreq, struct siw_sqe *sqe);
52662306a36Sopenharmony_ciint siw_sqe_complete(struct siw_qp *qp, struct siw_sqe *sqe, u32 bytes,
52762306a36Sopenharmony_ci		     enum siw_wc_status status);
52862306a36Sopenharmony_ciint siw_rqe_complete(struct siw_qp *qp, struct siw_rqe *rqe, u32 bytes,
52962306a36Sopenharmony_ci		     u32 inval_stag, enum siw_wc_status status);
53062306a36Sopenharmony_civoid siw_qp_llp_data_ready(struct sock *sk);
53162306a36Sopenharmony_civoid siw_qp_llp_write_space(struct sock *sk);
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci/* QP TX path functions */
53462306a36Sopenharmony_ciint siw_create_tx_threads(void);
53562306a36Sopenharmony_civoid siw_stop_tx_threads(void);
53662306a36Sopenharmony_ciint siw_run_sq(void *arg);
53762306a36Sopenharmony_ciint siw_qp_sq_process(struct siw_qp *qp);
53862306a36Sopenharmony_ciint siw_sq_start(struct siw_qp *qp);
53962306a36Sopenharmony_ciint siw_activate_tx(struct siw_qp *qp);
54062306a36Sopenharmony_ciint siw_get_tx_cpu(struct siw_device *sdev);
54162306a36Sopenharmony_civoid siw_put_tx_cpu(int cpu);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci/* QP RX path functions */
54462306a36Sopenharmony_ciint siw_proc_send(struct siw_qp *qp);
54562306a36Sopenharmony_ciint siw_proc_rreq(struct siw_qp *qp);
54662306a36Sopenharmony_ciint siw_proc_rresp(struct siw_qp *qp);
54762306a36Sopenharmony_ciint siw_proc_write(struct siw_qp *qp);
54862306a36Sopenharmony_ciint siw_proc_terminate(struct siw_qp *qp);
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ciint siw_tcp_rx_data(read_descriptor_t *rd_desc, struct sk_buff *skb,
55162306a36Sopenharmony_ci		    unsigned int off, size_t len);
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_cistatic inline void set_rx_fpdu_context(struct siw_qp *qp, u8 opcode)
55462306a36Sopenharmony_ci{
55562306a36Sopenharmony_ci	if (opcode == RDMAP_RDMA_WRITE || opcode == RDMAP_RDMA_READ_RESP)
55662306a36Sopenharmony_ci		qp->rx_fpdu = &qp->rx_tagged;
55762306a36Sopenharmony_ci	else
55862306a36Sopenharmony_ci		qp->rx_fpdu = &qp->rx_untagged;
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci	qp->rx_stream.rdmap_op = opcode;
56162306a36Sopenharmony_ci}
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_cistatic inline struct siw_ucontext *to_siw_ctx(struct ib_ucontext *base_ctx)
56462306a36Sopenharmony_ci{
56562306a36Sopenharmony_ci	return container_of(base_ctx, struct siw_ucontext, base_ucontext);
56662306a36Sopenharmony_ci}
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_cistatic inline struct siw_qp *to_siw_qp(struct ib_qp *base_qp)
56962306a36Sopenharmony_ci{
57062306a36Sopenharmony_ci	return container_of(base_qp, struct siw_qp, base_qp);
57162306a36Sopenharmony_ci}
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_cistatic inline struct siw_cq *to_siw_cq(struct ib_cq *base_cq)
57462306a36Sopenharmony_ci{
57562306a36Sopenharmony_ci	return container_of(base_cq, struct siw_cq, base_cq);
57662306a36Sopenharmony_ci}
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_cistatic inline struct siw_srq *to_siw_srq(struct ib_srq *base_srq)
57962306a36Sopenharmony_ci{
58062306a36Sopenharmony_ci	return container_of(base_srq, struct siw_srq, base_srq);
58162306a36Sopenharmony_ci}
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_cistatic inline struct siw_device *to_siw_dev(struct ib_device *base_dev)
58462306a36Sopenharmony_ci{
58562306a36Sopenharmony_ci	return container_of(base_dev, struct siw_device, base_dev);
58662306a36Sopenharmony_ci}
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_cistatic inline struct siw_mr *to_siw_mr(struct ib_mr *base_mr)
58962306a36Sopenharmony_ci{
59062306a36Sopenharmony_ci	return container_of(base_mr, struct siw_mr, base_mr);
59162306a36Sopenharmony_ci}
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_cistatic inline struct siw_user_mmap_entry *
59462306a36Sopenharmony_cito_siw_mmap_entry(struct rdma_user_mmap_entry *rdma_mmap)
59562306a36Sopenharmony_ci{
59662306a36Sopenharmony_ci	return container_of(rdma_mmap, struct siw_user_mmap_entry, rdma_entry);
59762306a36Sopenharmony_ci}
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_cistatic inline struct siw_qp *siw_qp_id2obj(struct siw_device *sdev, int id)
60062306a36Sopenharmony_ci{
60162306a36Sopenharmony_ci	struct siw_qp *qp;
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	rcu_read_lock();
60462306a36Sopenharmony_ci	qp = xa_load(&sdev->qp_xa, id);
60562306a36Sopenharmony_ci	if (likely(qp && kref_get_unless_zero(&qp->ref))) {
60662306a36Sopenharmony_ci		rcu_read_unlock();
60762306a36Sopenharmony_ci		return qp;
60862306a36Sopenharmony_ci	}
60962306a36Sopenharmony_ci	rcu_read_unlock();
61062306a36Sopenharmony_ci	return NULL;
61162306a36Sopenharmony_ci}
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_cistatic inline u32 qp_id(struct siw_qp *qp)
61462306a36Sopenharmony_ci{
61562306a36Sopenharmony_ci	return qp->base_qp.qp_num;
61662306a36Sopenharmony_ci}
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_cistatic inline void siw_qp_get(struct siw_qp *qp)
61962306a36Sopenharmony_ci{
62062306a36Sopenharmony_ci	kref_get(&qp->ref);
62162306a36Sopenharmony_ci}
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_cistatic inline void siw_qp_put(struct siw_qp *qp)
62462306a36Sopenharmony_ci{
62562306a36Sopenharmony_ci	kref_put(&qp->ref, siw_free_qp);
62662306a36Sopenharmony_ci}
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cistatic inline int siw_sq_empty(struct siw_qp *qp)
62962306a36Sopenharmony_ci{
63062306a36Sopenharmony_ci	struct siw_sqe *sqe = &qp->sendq[qp->sq_get % qp->attrs.sq_size];
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	return READ_ONCE(sqe->flags) == 0;
63362306a36Sopenharmony_ci}
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic inline struct siw_sqe *sq_get_next(struct siw_qp *qp)
63662306a36Sopenharmony_ci{
63762306a36Sopenharmony_ci	struct siw_sqe *sqe = &qp->sendq[qp->sq_get % qp->attrs.sq_size];
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci	if (READ_ONCE(sqe->flags) & SIW_WQE_VALID)
64062306a36Sopenharmony_ci		return sqe;
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	return NULL;
64362306a36Sopenharmony_ci}
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_cistatic inline struct siw_sqe *orq_get_current(struct siw_qp *qp)
64662306a36Sopenharmony_ci{
64762306a36Sopenharmony_ci	return &qp->orq[qp->orq_get % qp->attrs.orq_size];
64862306a36Sopenharmony_ci}
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_cistatic inline struct siw_sqe *orq_get_free(struct siw_qp *qp)
65162306a36Sopenharmony_ci{
65262306a36Sopenharmony_ci	struct siw_sqe *orq_e = &qp->orq[qp->orq_put % qp->attrs.orq_size];
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	if (READ_ONCE(orq_e->flags) == 0)
65562306a36Sopenharmony_ci		return orq_e;
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	return NULL;
65862306a36Sopenharmony_ci}
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_cistatic inline int siw_orq_empty(struct siw_qp *qp)
66162306a36Sopenharmony_ci{
66262306a36Sopenharmony_ci	return qp->orq[qp->orq_get % qp->attrs.orq_size].flags == 0 ? 1 : 0;
66362306a36Sopenharmony_ci}
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_cistatic inline struct siw_sqe *irq_alloc_free(struct siw_qp *qp)
66662306a36Sopenharmony_ci{
66762306a36Sopenharmony_ci	struct siw_sqe *irq_e = &qp->irq[qp->irq_put % qp->attrs.irq_size];
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	if (READ_ONCE(irq_e->flags) == 0) {
67062306a36Sopenharmony_ci		qp->irq_put++;
67162306a36Sopenharmony_ci		return irq_e;
67262306a36Sopenharmony_ci	}
67362306a36Sopenharmony_ci	return NULL;
67462306a36Sopenharmony_ci}
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_cistatic inline __wsum siw_csum_update(const void *buff, int len, __wsum sum)
67762306a36Sopenharmony_ci{
67862306a36Sopenharmony_ci	return (__force __wsum)crc32c((__force __u32)sum, buff, len);
67962306a36Sopenharmony_ci}
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_cistatic inline __wsum siw_csum_combine(__wsum csum, __wsum csum2, int offset,
68262306a36Sopenharmony_ci				      int len)
68362306a36Sopenharmony_ci{
68462306a36Sopenharmony_ci	return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
68562306a36Sopenharmony_ci						   (__force __u32)csum2, len);
68662306a36Sopenharmony_ci}
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_cistatic inline void siw_crc_skb(struct siw_rx_stream *srx, unsigned int len)
68962306a36Sopenharmony_ci{
69062306a36Sopenharmony_ci	const struct skb_checksum_ops siw_cs_ops = {
69162306a36Sopenharmony_ci		.update = siw_csum_update,
69262306a36Sopenharmony_ci		.combine = siw_csum_combine,
69362306a36Sopenharmony_ci	};
69462306a36Sopenharmony_ci	__wsum crc = *(u32 *)shash_desc_ctx(srx->mpa_crc_hd);
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_ci	crc = __skb_checksum(srx->skb, srx->skb_offset, len, crc,
69762306a36Sopenharmony_ci			     &siw_cs_ops);
69862306a36Sopenharmony_ci	*(u32 *)shash_desc_ctx(srx->mpa_crc_hd) = crc;
69962306a36Sopenharmony_ci}
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_ci#define siw_dbg(ibdev, fmt, ...)                                               \
70262306a36Sopenharmony_ci	ibdev_dbg(ibdev, "%s: " fmt, __func__, ##__VA_ARGS__)
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci#define siw_dbg_qp(qp, fmt, ...)                                               \
70562306a36Sopenharmony_ci	ibdev_dbg(&qp->sdev->base_dev, "QP[%u] %s: " fmt, qp_id(qp), __func__, \
70662306a36Sopenharmony_ci		  ##__VA_ARGS__)
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci#define siw_dbg_cq(cq, fmt, ...)                                               \
70962306a36Sopenharmony_ci	ibdev_dbg(cq->base_cq.device, "CQ[%u] %s: " fmt, cq->id, __func__,     \
71062306a36Sopenharmony_ci		  ##__VA_ARGS__)
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci#define siw_dbg_pd(pd, fmt, ...)                                               \
71362306a36Sopenharmony_ci	ibdev_dbg(pd->device, "PD[%u] %s: " fmt, pd->res.id, __func__,         \
71462306a36Sopenharmony_ci		  ##__VA_ARGS__)
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci#define siw_dbg_mem(mem, fmt, ...)                                             \
71762306a36Sopenharmony_ci	ibdev_dbg(&mem->sdev->base_dev,                                        \
71862306a36Sopenharmony_ci		  "MEM[0x%08x] %s: " fmt, mem->stag, __func__, ##__VA_ARGS__)
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci#define siw_dbg_cep(cep, fmt, ...)                                             \
72162306a36Sopenharmony_ci	ibdev_dbg(&cep->sdev->base_dev, "CEP[0x%pK] %s: " fmt,                 \
72262306a36Sopenharmony_ci		  cep, __func__, ##__VA_ARGS__)
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_civoid siw_cq_flush(struct siw_cq *cq);
72562306a36Sopenharmony_civoid siw_sq_flush(struct siw_qp *qp);
72662306a36Sopenharmony_civoid siw_rq_flush(struct siw_qp *qp);
72762306a36Sopenharmony_ciint siw_reap_cqe(struct siw_cq *cq, struct ib_wc *wc);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci#endif
730