1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#ifndef __ISCSI_ISER_H__
41#define __ISCSI_ISER_H__
42
43#include <linux/types.h>
44#include <linux/net.h>
45#include <scsi/libiscsi.h>
46#include <scsi/scsi_transport_iscsi.h>
47
48#include <linux/interrupt.h>
49#include <linux/wait.h>
50#include <linux/sched.h>
51#include <linux/list.h>
52#include <linux/slab.h>
53#include <linux/dma-mapping.h>
54#include <linux/mutex.h>
55#include <linux/mempool.h>
56#include <linux/uio.h>
57
58#include <linux/socket.h>
59#include <linux/in.h>
60#include <linux/in6.h>
61
62#include <rdma/ib_verbs.h>
63#include <rdma/ib_fmr_pool.h>
64#include <rdma/rdma_cm.h>
65
66#define DRV_NAME "iser"
67#define PFX DRV_NAME ": "
68#define DRV_VER "0.1"
69#define DRV_DATE "May 7th, 2006"
70
71#define iser_dbg(fmt, arg...) \
72 do { \
73 if (iser_debug_level > 1) \
74 printk(KERN_DEBUG PFX "%s:" fmt,\
75 __func__ , ## arg); \
76 } while (0)
77
78#define iser_warn(fmt, arg...) \
79 do { \
80 if (iser_debug_level > 0) \
81 printk(KERN_DEBUG PFX "%s:" fmt,\
82 __func__ , ## arg); \
83 } while (0)
84
85#define iser_err(fmt, arg...) \
86 do { \
87 printk(KERN_ERR PFX "%s:" fmt, \
88 __func__ , ## arg); \
89 } while (0)
90
91#define SHIFT_4K 12
92#define SIZE_4K (1ULL << SHIFT_4K)
93#define MASK_4K (~(SIZE_4K-1))
94
95
96#define ISCSI_ISER_SG_TABLESIZE (0x80000 >> SHIFT_4K)
97#define ISER_DEF_CMD_PER_LUN 128
98
99
100
101#define ISER_MAX_RX_MISC_PDUS 4
102
103#define ISER_MAX_TX_MISC_PDUS 6
104
105
106#define ISER_QP_MAX_RECV_DTOS (ISCSI_DEF_XMIT_CMDS_MAX)
107
108#define ISER_MIN_POSTED_RX (ISCSI_DEF_XMIT_CMDS_MAX >> 2)
109
110
111
112
113
114
115
116#define ISER_INFLIGHT_DATAOUTS 8
117
118#define ISER_QP_MAX_REQ_DTOS (ISCSI_DEF_XMIT_CMDS_MAX * \
119 (1 + ISER_INFLIGHT_DATAOUTS) + \
120 ISER_MAX_TX_MISC_PDUS + \
121 ISER_MAX_RX_MISC_PDUS)
122
123#define ISER_VER 0x10
124#define ISER_WSV 0x08
125#define ISER_RSV 0x04
126
127struct iser_hdr {
128 u8 flags;
129 u8 rsvd[3];
130 __be32 write_stag;
131 __be64 write_va;
132 __be32 read_stag;
133 __be64 read_va;
134} __attribute__((packed));
135
136
137#define ISER_HEADERS_LEN (sizeof(struct iser_hdr) + sizeof(struct iscsi_hdr))
138
139#define ISER_RECV_DATA_SEG_LEN 128
140#define ISER_RX_PAYLOAD_SIZE (ISER_HEADERS_LEN + ISER_RECV_DATA_SEG_LEN)
141#define ISER_RX_LOGIN_SIZE (ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN)
142
143
144#define ISER_OBJECT_NAME_SIZE 64
145
146enum iser_ib_conn_state {
147 ISER_CONN_INIT,
148 ISER_CONN_PENDING,
149 ISER_CONN_UP,
150 ISER_CONN_TERMINATING,
151 ISER_CONN_DOWN,
152 ISER_CONN_STATES_NUM
153};
154
155enum iser_task_status {
156 ISER_TASK_STATUS_INIT = 0,
157 ISER_TASK_STATUS_STARTED,
158 ISER_TASK_STATUS_COMPLETED
159};
160
161enum iser_data_dir {
162 ISER_DIR_IN = 0,
163 ISER_DIR_OUT,
164 ISER_DIRS_NUM
165};
166
167struct iser_data_buf {
168 void *buf;
169 unsigned int size;
170 unsigned long data_len;
171 unsigned int dma_nents;
172 char *copy_buf;
173
174 struct scatterlist sg_single;
175
176 };
177
178
179struct iser_device;
180struct iser_cq_desc;
181struct iscsi_iser_conn;
182struct iscsi_iser_task;
183struct iscsi_endpoint;
184
185struct iser_mem_reg {
186 u32 lkey;
187 u32 rkey;
188 u64 va;
189 u64 len;
190 void *mem_h;
191 int is_fmr;
192};
193
194struct iser_regd_buf {
195 struct iser_mem_reg reg;
196 void *virt_addr;
197 struct iser_device *device;
198 enum dma_data_direction direction;
199 unsigned int data_size;
200};
201
202enum iser_desc_type {
203 ISCSI_TX_CONTROL ,
204 ISCSI_TX_SCSI_COMMAND,
205 ISCSI_TX_DATAOUT
206};
207
208struct iser_tx_desc {
209 struct iser_hdr iser_header;
210 struct iscsi_hdr iscsi_header;
211 enum iser_desc_type type;
212 u64 dma_addr;
213
214
215 struct ib_sge tx_sg[2];
216 int num_sge;
217};
218
219#define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \
220 sizeof(u64) + sizeof(struct ib_sge)))
221struct iser_rx_desc {
222 struct iser_hdr iser_header;
223 struct iscsi_hdr iscsi_header;
224 char data[ISER_RECV_DATA_SEG_LEN];
225 u64 dma_addr;
226 struct ib_sge rx_sg;
227 char pad[ISER_RX_PAD_SIZE];
228} __attribute__((packed));
229
230#define ISER_MAX_CQ 4
231
232struct iser_device {
233 struct ib_device *ib_device;
234 struct ib_pd *pd;
235 struct ib_cq *rx_cq[ISER_MAX_CQ];
236 struct ib_cq *tx_cq[ISER_MAX_CQ];
237 struct ib_mr *mr;
238 struct tasklet_struct cq_tasklet[ISER_MAX_CQ];
239 struct ib_event_handler event_handler;
240 struct list_head ig_list;
241 int refcount;
242 int cq_active_qps[ISER_MAX_CQ];
243 int cqs_used;
244 struct iser_cq_desc *cq_desc;
245};
246
247struct iser_conn {
248 struct iscsi_iser_conn *iser_conn;
249 struct iscsi_endpoint *ep;
250 enum iser_ib_conn_state state;
251 atomic_t refcount;
252 spinlock_t lock;
253 struct iser_device *device;
254 struct rdma_cm_id *cma_id;
255 struct ib_qp *qp;
256 struct ib_fmr_pool *fmr_pool;
257 wait_queue_head_t wait;
258 int post_recv_buf_count;
259 atomic_t post_send_buf_count;
260 char name[ISER_OBJECT_NAME_SIZE];
261 struct iser_page_vec *page_vec;
262
263 struct list_head conn_list;
264
265 char *login_buf;
266 char *login_req_buf, *login_resp_buf;
267 u64 login_req_dma, login_resp_dma;
268 unsigned int rx_desc_head;
269 struct iser_rx_desc *rx_descs;
270 struct ib_recv_wr rx_wr[ISER_MIN_POSTED_RX];
271};
272
273struct iscsi_iser_conn {
274 struct iscsi_conn *iscsi_conn;
275 struct iser_conn *ib_conn;
276};
277
278struct iscsi_iser_task {
279 struct iser_tx_desc desc;
280 struct iscsi_iser_conn *iser_conn;
281 enum iser_task_status status;
282 int command_sent;
283 int dir[ISER_DIRS_NUM];
284 struct iser_regd_buf rdma_regd[ISER_DIRS_NUM];
285 struct iser_data_buf data[ISER_DIRS_NUM];
286 struct iser_data_buf data_copy[ISER_DIRS_NUM];
287};
288
289struct iser_page_vec {
290 u64 *pages;
291 int length;
292 int offset;
293 int data_size;
294};
295
296struct iser_cq_desc {
297 struct iser_device *device;
298 int cq_index;
299};
300
301struct iser_global {
302 struct mutex device_list_mutex;
303 struct list_head device_list;
304 struct mutex connlist_mutex;
305 struct list_head connlist;
306
307 struct kmem_cache *desc_cache;
308};
309
310extern struct iser_global ig;
311extern int iser_debug_level;
312
313
314int iser_conn_set_full_featured_mode(struct iscsi_conn *conn);
315
316int iser_send_control(struct iscsi_conn *conn,
317 struct iscsi_task *task);
318
319int iser_send_command(struct iscsi_conn *conn,
320 struct iscsi_task *task);
321
322int iser_send_data_out(struct iscsi_conn *conn,
323 struct iscsi_task *task,
324 struct iscsi_data *hdr);
325
326void iscsi_iser_recv(struct iscsi_conn *conn,
327 struct iscsi_hdr *hdr,
328 char *rx_data,
329 int rx_data_len);
330
331void iser_conn_init(struct iser_conn *ib_conn);
332
333void iser_conn_get(struct iser_conn *ib_conn);
334
335int iser_conn_put(struct iser_conn *ib_conn, int destroy_cma_id_allowed);
336
337void iser_conn_terminate(struct iser_conn *ib_conn);
338
339void iser_rcv_completion(struct iser_rx_desc *desc,
340 unsigned long dto_xfer_len,
341 struct iser_conn *ib_conn);
342
343void iser_snd_completion(struct iser_tx_desc *desc, struct iser_conn *ib_conn);
344
345void iser_task_rdma_init(struct iscsi_iser_task *task);
346
347void iser_task_rdma_finalize(struct iscsi_iser_task *task);
348
349void iser_free_rx_descriptors(struct iser_conn *ib_conn);
350
351void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *task,
352 enum iser_data_dir cmd_dir);
353
354int iser_reg_rdma_mem(struct iscsi_iser_task *task,
355 enum iser_data_dir cmd_dir);
356
357int iser_connect(struct iser_conn *ib_conn,
358 struct sockaddr_in *src_addr,
359 struct sockaddr_in *dst_addr,
360 int non_blocking);
361
362int iser_reg_page_vec(struct iser_conn *ib_conn,
363 struct iser_page_vec *page_vec,
364 struct iser_mem_reg *mem_reg);
365
366void iser_unreg_mem(struct iser_mem_reg *mem_reg);
367
368int iser_post_recvl(struct iser_conn *ib_conn);
369int iser_post_recvm(struct iser_conn *ib_conn, int count);
370int iser_post_send(struct iser_conn *ib_conn, struct iser_tx_desc *tx_desc);
371
372int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
373 struct iser_data_buf *data,
374 enum iser_data_dir iser_dir,
375 enum dma_data_direction dma_dir);
376
377void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task);
378int iser_initialize_task_headers(struct iscsi_task *task,
379 struct iser_tx_desc *tx_desc);
380int iser_alloc_rx_descriptors(struct iser_conn *ib_conn);
381#endif
382