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