blob: b81dfe07ce62272872a293d525f256961cfffd2d [file] [log] [blame]
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -08001#include <linux/socket.h>
2#include <linux/in.h>
3#include <linux/in6.h>
4#include <rdma/ib_verbs.h>
5#include <rdma/rdma_cm.h>
6
Sagi Grimberg24f412d2014-12-07 13:12:02 +02007#define DRV_NAME "isert"
8#define PFX DRV_NAME ": "
9
10#define isert_dbg(fmt, arg...) \
11 do { \
12 if (unlikely(isert_debug_level > 2)) \
13 printk(KERN_DEBUG PFX "%s: " fmt,\
14 __func__ , ## arg); \
15 } while (0)
16
17#define isert_warn(fmt, arg...) \
18 do { \
19 if (unlikely(isert_debug_level > 0)) \
20 pr_warn(PFX "%s: " fmt, \
21 __func__ , ## arg); \
22 } while (0)
23
24#define isert_info(fmt, arg...) \
25 do { \
26 if (unlikely(isert_debug_level > 1)) \
27 pr_info(PFX "%s: " fmt, \
28 __func__ , ## arg); \
29 } while (0)
30
31#define isert_err(fmt, arg...) \
32 pr_err(PFX "%s: " fmt, __func__ , ## arg)
33
Vu Pham59464ef2013-08-28 23:23:35 +030034#define ISCSI_ISER_SG_TABLESIZE 256
Nicholas Bellinger9bb4ca62014-02-27 07:02:48 -080035#define ISER_FASTREG_LI_WRID 0xffffffffffffffffULL
Sagi Grimbergbdf20e72014-12-02 16:57:43 +020036#define ISER_BEACON_WRID 0xfffffffffffffffeULL
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080037
38enum isert_desc_type {
39 ISCSI_TX_CONTROL,
40 ISCSI_TX_DATAIN
41};
42
43enum iser_ib_op_code {
44 ISER_IB_RECV,
45 ISER_IB_SEND,
46 ISER_IB_RDMA_WRITE,
47 ISER_IB_RDMA_READ,
48};
49
50enum iser_conn_state {
51 ISER_CONN_INIT,
52 ISER_CONN_UP,
Sagi Grimberg128e9cc2014-12-02 16:57:20 +020053 ISER_CONN_FULL_FEATURE,
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080054 ISER_CONN_TERMINATING,
55 ISER_CONN_DOWN,
56};
57
58struct iser_rx_desc {
59 struct iser_hdr iser_header;
60 struct iscsi_hdr iscsi_header;
61 char data[ISER_RECV_DATA_SEG_LEN];
62 u64 dma_addr;
63 struct ib_sge rx_sg;
64 char pad[ISER_RX_PAD_SIZE];
65} __packed;
66
67struct iser_tx_desc {
68 struct iser_hdr iser_header;
69 struct iscsi_hdr iscsi_header;
70 enum isert_desc_type type;
71 u64 dma_addr;
72 struct ib_sge tx_sg[2];
73 int num_sge;
74 struct isert_cmd *isert_cmd;
75 struct ib_send_wr send_wr;
76} __packed;
77
Sagi Grimbergd3e125d2014-02-19 17:50:23 +020078enum isert_indicator {
79 ISERT_PROTECTED = 1 << 0,
80 ISERT_DATA_KEY_VALID = 1 << 1,
81 ISERT_PROT_KEY_VALID = 1 << 2,
82 ISERT_SIG_KEY_VALID = 1 << 3,
83};
84
85struct pi_context {
86 struct ib_mr *prot_mr;
87 struct ib_fast_reg_page_list *prot_frpl;
88 struct ib_mr *sig_mr;
89};
90
Vu Pham59464ef2013-08-28 23:23:35 +030091struct fast_reg_descriptor {
Sagi Grimbergd3e125d2014-02-19 17:50:23 +020092 struct list_head list;
93 struct ib_mr *data_mr;
94 struct ib_fast_reg_page_list *data_frpl;
95 u8 ind;
96 struct pi_context *pi_ctx;
Vu Pham59464ef2013-08-28 23:23:35 +030097};
98
Sagi Grimberge3d7e4c2014-02-19 17:50:22 +020099struct isert_data_buf {
100 struct scatterlist *sg;
101 int nents;
102 u32 sg_off;
103 u32 len; /* cur_rdma_length */
104 u32 offset;
105 unsigned int dma_nents;
106 enum dma_data_direction dma_dir;
107};
108
Sagi Grimberg570db172014-12-02 16:57:31 +0200109enum {
110 DATA = 0,
111 PROT = 1,
112 SIG = 2,
113};
114
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800115struct isert_rdma_wr {
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800116 struct isert_cmd *isert_cmd;
117 enum iser_ib_op_code iser_ib_op;
118 struct ib_sge *ib_sge;
Vu Pham59464ef2013-08-28 23:23:35 +0300119 struct ib_sge s_ib_sge;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800120 int send_wr_num;
121 struct ib_send_wr *send_wr;
Vu Pham59464ef2013-08-28 23:23:35 +0300122 struct ib_send_wr s_send_wr;
Sagi Grimberg570db172014-12-02 16:57:31 +0200123 struct ib_sge ib_sg[3];
Sagi Grimberge3d7e4c2014-02-19 17:50:22 +0200124 struct isert_data_buf data;
Sagi Grimberg9e961ae2014-02-19 17:50:25 +0200125 struct isert_data_buf prot;
Vu Pham59464ef2013-08-28 23:23:35 +0300126 struct fast_reg_descriptor *fr_desc;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800127};
128
129struct isert_cmd {
130 uint32_t read_stag;
131 uint32_t write_stag;
132 uint64_t read_va;
133 uint64_t write_va;
Nicholas Bellingerdbbc5d12013-07-03 19:39:37 -0700134 u64 pdu_buf_dma;
135 u32 pdu_buf_len;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800136 struct isert_conn *conn;
Nicholas Bellingerd703ce22013-08-17 14:27:56 -0700137 struct iscsi_cmd *iscsi_cmd;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800138 struct iser_tx_desc tx_desc;
139 struct isert_rdma_wr rdma_wr;
140 struct work_struct comp_work;
141};
142
143struct isert_device;
144
145struct isert_conn {
146 enum iser_conn_state state;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800147 int post_recv_buf_count;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800148 u32 responder_resources;
149 u32 initiator_depth;
Sagi Grimberg23a548e2014-12-02 16:57:35 +0200150 bool pi_support;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800151 u32 max_sge;
152 char *login_buf;
153 char *login_req_buf;
154 char *login_rsp_buf;
155 u64 login_req_dma;
Sagi Grimberg2371e5d2014-12-02 16:57:21 +0200156 int login_req_len;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800157 u64 login_rsp_dma;
Sagi Grimbergdac6ab32015-03-29 15:52:19 +0300158 unsigned int rx_desc_head;
159 struct iser_rx_desc *rx_descs;
160 struct ib_recv_wr rx_wr[ISERT_MIN_POSTED_RX];
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800161 struct iscsi_conn *conn;
Jenny Derzhavetzbd379222015-09-06 14:52:24 +0300162 struct list_head node;
Sagi Grimbergdac6ab32015-03-29 15:52:19 +0300163 struct completion login_comp;
Sagi Grimberg2371e5d2014-12-02 16:57:21 +0200164 struct completion login_req_comp;
Sagi Grimbergdac6ab32015-03-29 15:52:19 +0300165 struct iser_tx_desc login_tx_desc;
166 struct rdma_cm_id *cm_id;
167 struct ib_qp *qp;
168 struct isert_device *device;
169 struct mutex mutex;
170 struct completion wait;
171 struct completion wait_comp_err;
172 struct kref kref;
173 struct list_head fr_pool;
174 int fr_pool_size;
Sagi Grimberga3a5a822014-01-09 18:40:50 +0200175 /* lock to protect fastreg pool */
Sagi Grimbergdac6ab32015-03-29 15:52:19 +0300176 spinlock_t pool_lock;
Sagi Grimbergb02efbf2014-12-02 16:57:29 +0200177 struct work_struct release_work;
Sagi Grimbergbdf20e72014-12-02 16:57:43 +0200178 struct ib_recv_wr beacon;
Sagi Grimberg991bb762014-12-07 13:12:01 +0200179 bool logout_posted;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800180};
181
182#define ISERT_MAX_CQ 64
183
Sagi Grimberg4a295ba2014-12-02 16:57:40 +0200184/**
185 * struct isert_comp - iSER completion context
186 *
187 * @device: pointer to device handle
Sagi Grimberg6f0fae32014-12-02 16:57:41 +0200188 * @cq: completion queue
Sagi Grimberg36ea63b2014-12-02 16:57:45 +0200189 * @wcs: work completion array
Sagi Grimberg4a295ba2014-12-02 16:57:40 +0200190 * @active_qps: Number of active QPs attached
191 * to completion context
Sagi Grimberg6f0fae32014-12-02 16:57:41 +0200192 * @work: completion work handle
Sagi Grimberg4a295ba2014-12-02 16:57:40 +0200193 */
194struct isert_comp {
Sagi Grimberg6f0fae32014-12-02 16:57:41 +0200195 struct isert_device *device;
196 struct ib_cq *cq;
Sagi Grimberg36ea63b2014-12-02 16:57:45 +0200197 struct ib_wc wcs[16];
Sagi Grimberg4a295ba2014-12-02 16:57:40 +0200198 int active_qps;
Sagi Grimberg6f0fae32014-12-02 16:57:41 +0200199 struct work_struct work;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800200};
201
202struct isert_device {
Sagi Grimberga3a5a822014-01-09 18:40:50 +0200203 int use_fastreg;
Sagi Grimbergd3e125d2014-02-19 17:50:23 +0200204 bool pi_capable;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800205 int refcount;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800206 struct ib_device *ib_device;
Sagi Grimberg67cb3942015-03-29 15:52:05 +0300207 struct ib_pd *pd;
Sagi Grimberg4a295ba2014-12-02 16:57:40 +0200208 struct isert_comp *comps;
209 int comps_used;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800210 struct list_head dev_node;
Vu Pham59464ef2013-08-28 23:23:35 +0300211 struct ib_device_attr dev_attr;
Vu Phamd40945d2013-08-28 23:23:34 +0300212 int (*reg_rdma_mem)(struct iscsi_conn *conn,
213 struct iscsi_cmd *cmd,
214 struct isert_rdma_wr *wr);
215 void (*unreg_rdma_mem)(struct isert_cmd *isert_cmd,
216 struct isert_conn *isert_conn);
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800217};
218
219struct isert_np {
Sagi Grimbergca6c1d82014-12-02 16:57:27 +0200220 struct iscsi_np *np;
Jenny Derzhavetzed8cb0a2015-09-06 14:52:23 +0300221 struct semaphore sem;
222 struct rdma_cm_id *cm_id;
223 struct mutex mutex;
Jenny Derzhavetzbd379222015-09-06 14:52:24 +0300224 struct list_head accepted;
225 struct list_head pending;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800226};