xref: /OK3568_Linux_fs/kernel/drivers/infiniband/ulp/isert/ib_isert.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #include <linux/socket.h>
3*4882a593Smuzhiyun #include <linux/in.h>
4*4882a593Smuzhiyun #include <linux/in6.h>
5*4882a593Smuzhiyun #include <rdma/ib_verbs.h>
6*4882a593Smuzhiyun #include <rdma/rdma_cm.h>
7*4882a593Smuzhiyun #include <rdma/rw.h>
8*4882a593Smuzhiyun #include <scsi/iser.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define DRV_NAME	"isert"
12*4882a593Smuzhiyun #define PFX		DRV_NAME ": "
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define isert_dbg(fmt, arg...)				 \
15*4882a593Smuzhiyun 	do {						 \
16*4882a593Smuzhiyun 		if (unlikely(isert_debug_level > 2))	 \
17*4882a593Smuzhiyun 			printk(KERN_DEBUG PFX "%s: " fmt,\
18*4882a593Smuzhiyun 				__func__ , ## arg);	 \
19*4882a593Smuzhiyun 	} while (0)
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define isert_warn(fmt, arg...)				\
22*4882a593Smuzhiyun 	do {						\
23*4882a593Smuzhiyun 		if (unlikely(isert_debug_level > 0))	\
24*4882a593Smuzhiyun 			pr_warn(PFX "%s: " fmt,         \
25*4882a593Smuzhiyun 				__func__ , ## arg);	\
26*4882a593Smuzhiyun 	} while (0)
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define isert_info(fmt, arg...)				\
29*4882a593Smuzhiyun 	do {						\
30*4882a593Smuzhiyun 		if (unlikely(isert_debug_level > 1))	\
31*4882a593Smuzhiyun 			pr_info(PFX "%s: " fmt,         \
32*4882a593Smuzhiyun 				__func__ , ## arg);	\
33*4882a593Smuzhiyun 	} while (0)
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define isert_err(fmt, arg...) \
36*4882a593Smuzhiyun 	pr_err(PFX "%s: " fmt, __func__ , ## arg)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* Constant PDU lengths calculations */
39*4882a593Smuzhiyun #define ISER_HEADERS_LEN	(sizeof(struct iser_ctrl) + \
40*4882a593Smuzhiyun 				 sizeof(struct iscsi_hdr))
41*4882a593Smuzhiyun #define ISER_RX_PAYLOAD_SIZE	(ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* QP settings */
44*4882a593Smuzhiyun /* Maximal bounds on received asynchronous PDUs */
45*4882a593Smuzhiyun #define ISERT_MAX_TX_MISC_PDUS	4 /* NOOP_IN(2) , ASYNC_EVENT(2)   */
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define ISERT_MAX_RX_MISC_PDUS	6 /*
48*4882a593Smuzhiyun 				   * NOOP_OUT(2), TEXT(1),
49*4882a593Smuzhiyun 				   * SCSI_TMFUNC(2), LOGOUT(1)
50*4882a593Smuzhiyun 				   */
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define ISCSI_DEF_XMIT_CMDS_MAX 128 /* from libiscsi.h, must be power of 2 */
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define ISERT_QP_MAX_RECV_DTOS	(ISCSI_DEF_XMIT_CMDS_MAX)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define ISERT_MIN_POSTED_RX	(ISCSI_DEF_XMIT_CMDS_MAX >> 2)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define ISERT_QP_MAX_REQ_DTOS	(ISCSI_DEF_XMIT_CMDS_MAX +    \
59*4882a593Smuzhiyun 				ISERT_MAX_TX_MISC_PDUS	+ \
60*4882a593Smuzhiyun 				ISERT_MAX_RX_MISC_PDUS)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun  * RX size is default of 8k plus headers, but data needs to align to
64*4882a593Smuzhiyun  * 512 boundary, so use 1024 to have the extra space for alignment.
65*4882a593Smuzhiyun  */
66*4882a593Smuzhiyun #define ISER_RX_SIZE		(ISCSI_DEF_MAX_RECV_SEG_LEN + 1024)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Minimum I/O size is 512KB */
69*4882a593Smuzhiyun #define ISCSI_ISER_MIN_SG_TABLESIZE 128
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* Maximum support is 16MB I/O size */
72*4882a593Smuzhiyun #define ISCSI_ISER_MAX_SG_TABLESIZE	4096
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun enum isert_desc_type {
75*4882a593Smuzhiyun 	ISCSI_TX_CONTROL,
76*4882a593Smuzhiyun 	ISCSI_TX_DATAIN
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun enum iser_conn_state {
80*4882a593Smuzhiyun 	ISER_CONN_INIT,
81*4882a593Smuzhiyun 	ISER_CONN_UP,
82*4882a593Smuzhiyun 	ISER_CONN_BOUND,
83*4882a593Smuzhiyun 	ISER_CONN_FULL_FEATURE,
84*4882a593Smuzhiyun 	ISER_CONN_TERMINATING,
85*4882a593Smuzhiyun 	ISER_CONN_DOWN,
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun struct iser_rx_desc {
89*4882a593Smuzhiyun 	char		buf[ISER_RX_SIZE];
90*4882a593Smuzhiyun 	u64		dma_addr;
91*4882a593Smuzhiyun 	struct ib_sge	rx_sg;
92*4882a593Smuzhiyun 	struct ib_cqe	rx_cqe;
93*4882a593Smuzhiyun 	bool		in_use;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
cqe_to_rx_desc(struct ib_cqe * cqe)96*4882a593Smuzhiyun static inline struct iser_rx_desc *cqe_to_rx_desc(struct ib_cqe *cqe)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	return container_of(cqe, struct iser_rx_desc, rx_cqe);
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
isert_get_iser_hdr(struct iser_rx_desc * desc)101*4882a593Smuzhiyun static void *isert_get_iser_hdr(struct iser_rx_desc *desc)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun 	return PTR_ALIGN(desc->buf + ISER_HEADERS_LEN, 512) - ISER_HEADERS_LEN;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
isert_get_hdr_offset(struct iser_rx_desc * desc)106*4882a593Smuzhiyun static size_t isert_get_hdr_offset(struct iser_rx_desc *desc)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	return isert_get_iser_hdr(desc) - (void *)desc->buf;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
isert_get_iscsi_hdr(struct iser_rx_desc * desc)111*4882a593Smuzhiyun static void *isert_get_iscsi_hdr(struct iser_rx_desc *desc)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	return isert_get_iser_hdr(desc) + sizeof(struct iser_ctrl);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
isert_get_data(struct iser_rx_desc * desc)116*4882a593Smuzhiyun static void *isert_get_data(struct iser_rx_desc *desc)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun 	void *data = isert_get_iser_hdr(desc) + ISER_HEADERS_LEN;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	WARN_ON((uintptr_t)data & 511);
121*4882a593Smuzhiyun 	return data;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct iser_tx_desc {
125*4882a593Smuzhiyun 	struct iser_ctrl iser_header;
126*4882a593Smuzhiyun 	struct iscsi_hdr iscsi_header;
127*4882a593Smuzhiyun 	enum isert_desc_type type;
128*4882a593Smuzhiyun 	u64		dma_addr;
129*4882a593Smuzhiyun 	struct ib_sge	tx_sg[2];
130*4882a593Smuzhiyun 	struct ib_cqe	tx_cqe;
131*4882a593Smuzhiyun 	int		num_sge;
132*4882a593Smuzhiyun 	struct ib_send_wr send_wr;
133*4882a593Smuzhiyun } __packed;
134*4882a593Smuzhiyun 
cqe_to_tx_desc(struct ib_cqe * cqe)135*4882a593Smuzhiyun static inline struct iser_tx_desc *cqe_to_tx_desc(struct ib_cqe *cqe)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	return container_of(cqe, struct iser_tx_desc, tx_cqe);
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun struct isert_cmd {
141*4882a593Smuzhiyun 	uint32_t		read_stag;
142*4882a593Smuzhiyun 	uint32_t		write_stag;
143*4882a593Smuzhiyun 	uint64_t		read_va;
144*4882a593Smuzhiyun 	uint64_t		write_va;
145*4882a593Smuzhiyun 	uint32_t		inv_rkey;
146*4882a593Smuzhiyun 	u64			pdu_buf_dma;
147*4882a593Smuzhiyun 	u32			pdu_buf_len;
148*4882a593Smuzhiyun 	struct isert_conn	*conn;
149*4882a593Smuzhiyun 	struct iscsi_cmd	*iscsi_cmd;
150*4882a593Smuzhiyun 	struct iser_tx_desc	tx_desc;
151*4882a593Smuzhiyun 	struct iser_rx_desc	*rx_desc;
152*4882a593Smuzhiyun 	struct rdma_rw_ctx	rw;
153*4882a593Smuzhiyun 	struct work_struct	comp_work;
154*4882a593Smuzhiyun 	struct scatterlist	sg;
155*4882a593Smuzhiyun 	bool			ctx_init_done;
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
tx_desc_to_cmd(struct iser_tx_desc * desc)158*4882a593Smuzhiyun static inline struct isert_cmd *tx_desc_to_cmd(struct iser_tx_desc *desc)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun 	return container_of(desc, struct isert_cmd, tx_desc);
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun struct isert_device;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct isert_conn {
166*4882a593Smuzhiyun 	enum iser_conn_state	state;
167*4882a593Smuzhiyun 	u32			responder_resources;
168*4882a593Smuzhiyun 	u32			initiator_depth;
169*4882a593Smuzhiyun 	bool			pi_support;
170*4882a593Smuzhiyun 	struct iser_rx_desc	*login_desc;
171*4882a593Smuzhiyun 	char			*login_rsp_buf;
172*4882a593Smuzhiyun 	int			login_req_len;
173*4882a593Smuzhiyun 	u64			login_rsp_dma;
174*4882a593Smuzhiyun 	struct iser_rx_desc	*rx_descs;
175*4882a593Smuzhiyun 	struct ib_recv_wr	rx_wr[ISERT_QP_MAX_RECV_DTOS];
176*4882a593Smuzhiyun 	struct iscsi_conn	*conn;
177*4882a593Smuzhiyun 	struct list_head	node;
178*4882a593Smuzhiyun 	struct completion	login_comp;
179*4882a593Smuzhiyun 	struct completion	login_req_comp;
180*4882a593Smuzhiyun 	struct iser_tx_desc	login_tx_desc;
181*4882a593Smuzhiyun 	struct rdma_cm_id	*cm_id;
182*4882a593Smuzhiyun 	struct ib_qp		*qp;
183*4882a593Smuzhiyun 	struct ib_cq		*cq;
184*4882a593Smuzhiyun 	u32			cq_size;
185*4882a593Smuzhiyun 	struct isert_device	*device;
186*4882a593Smuzhiyun 	struct mutex		mutex;
187*4882a593Smuzhiyun 	struct kref		kref;
188*4882a593Smuzhiyun 	struct work_struct	release_work;
189*4882a593Smuzhiyun 	bool                    logout_posted;
190*4882a593Smuzhiyun 	bool                    snd_w_inv;
191*4882a593Smuzhiyun 	wait_queue_head_t	rem_wait;
192*4882a593Smuzhiyun 	bool			dev_removed;
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct isert_device {
196*4882a593Smuzhiyun 	bool			pi_capable;
197*4882a593Smuzhiyun 	int			refcount;
198*4882a593Smuzhiyun 	struct ib_device	*ib_device;
199*4882a593Smuzhiyun 	struct ib_pd		*pd;
200*4882a593Smuzhiyun 	struct isert_comp	*comps;
201*4882a593Smuzhiyun 	int                     comps_used;
202*4882a593Smuzhiyun 	struct list_head	dev_node;
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun struct isert_np {
206*4882a593Smuzhiyun 	struct iscsi_np         *np;
207*4882a593Smuzhiyun 	struct semaphore	sem;
208*4882a593Smuzhiyun 	struct rdma_cm_id	*cm_id;
209*4882a593Smuzhiyun 	struct mutex		mutex;
210*4882a593Smuzhiyun 	struct list_head	accepted;
211*4882a593Smuzhiyun 	struct list_head	pending;
212*4882a593Smuzhiyun };
213