iscsi_iser.h 22.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*
 * iSER transport for the Open iSCSI Initiator & iSER transport internals
 *
 * Copyright (C) 2004 Dmitry Yusupov
 * Copyright (C) 2004 Alex Aizman
 * Copyright (C) 2005 Mike Christie
 * based on code maintained by open-iscsi@googlegroups.com
 *
 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.
 * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved.
11
 * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.
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 41 42 43 44 45
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *	- Redistributions of source code must retain the above
 *	  copyright notice, this list of conditions and the following
 *	  disclaimer.
 *
 *	- Redistributions in binary form must reproduce the above
 *	  copyright notice, this list of conditions and the following
 *	  disclaimer in the documentation and/or other materials
 *	  provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef __ISCSI_ISER_H__
#define __ISCSI_ISER_H__

#include <linux/types.h>
#include <linux/net.h>
46
#include <linux/printk.h>
47 48
#include <scsi/libiscsi.h>
#include <scsi/scsi_transport_iscsi.h>
49 50
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
51

52
#include <linux/interrupt.h>
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/mutex.h>
#include <linux/mempool.h>
#include <linux/uio.h>

#include <linux/socket.h>
#include <linux/in.h>
#include <linux/in6.h>

#include <rdma/ib_verbs.h>
#include <rdma/ib_fmr_pool.h>
#include <rdma/rdma_cm.h>

#define DRV_NAME	"iser"
#define PFX		DRV_NAME ": "
S
Sagi Grimberg 已提交
72
#define DRV_VER		"1.6"
73

74 75
#define iser_dbg(fmt, arg...)				 \
	do {						 \
76
		if (unlikely(iser_debug_level > 2))	 \
77 78
			printk(KERN_DEBUG PFX "%s: " fmt,\
				__func__ , ## arg);	 \
79 80 81
	} while (0)

#define iser_warn(fmt, arg...)				\
82
	do {						\
83
		if (unlikely(iser_debug_level > 0))	\
84
			pr_warn(PFX "%s: " fmt,		\
85 86 87 88
				__func__ , ## arg);	\
	} while (0)

#define iser_info(fmt, arg...)				\
89
	do {						\
90
		if (unlikely(iser_debug_level > 1))	\
91
			pr_info(PFX "%s: " fmt,		\
92 93 94
				__func__ , ## arg);	\
	} while (0)

95 96
#define iser_err(fmt, arg...) \
	pr_err(PFX "%s: " fmt, __func__ , ## arg)
97

98
#define SHIFT_4K	12
99
#define SIZE_4K	(1ULL << SHIFT_4K)
100
#define MASK_4K	(~(SIZE_4K-1))
101 102 103 104 105 106 107

/* Default support is 512KB I/O size */
#define ISER_DEF_MAX_SECTORS		1024
#define ISCSI_ISER_DEF_SG_TABLESIZE	((ISER_DEF_MAX_SECTORS * 512) >> SHIFT_4K)
/* Maximum support is 8MB I/O size */
#define ISCSI_ISER_MAX_SG_TABLESIZE	((16384 * 512) >> SHIFT_4K)

108 109 110 111 112 113 114
#define ISER_DEF_XMIT_CMDS_DEFAULT		512
#if ISCSI_DEF_XMIT_CMDS_MAX > ISER_DEF_XMIT_CMDS_DEFAULT
	#define ISER_DEF_XMIT_CMDS_MAX		ISCSI_DEF_XMIT_CMDS_MAX
#else
	#define ISER_DEF_XMIT_CMDS_MAX		ISER_DEF_XMIT_CMDS_DEFAULT
#endif
#define ISER_DEF_CMD_PER_LUN		ISER_DEF_XMIT_CMDS_MAX
115 116 117 118 119 120 121 122

/* QP settings */
/* Maximal bounds on received asynchronous PDUs */
#define ISER_MAX_RX_MISC_PDUS		4 /* NOOP_IN(2) , ASYNC_EVENT(2)   */

#define ISER_MAX_TX_MISC_PDUS		6 /* NOOP_OUT(2), TEXT(1),         *
					   * SCSI_TMFUNC(2), LOGOUT(1) */

123
#define ISER_QP_MAX_RECV_DTOS		(ISER_DEF_XMIT_CMDS_MAX)
124

125
#define ISER_MIN_POSTED_RX		(ISER_DEF_XMIT_CMDS_MAX >> 2)
126 127 128 129 130 131 132 133 134

/* the max TX (send) WR supported by the iSER QP is defined by                 *
 * max_send_wr = T * (1 + D) + C ; D is how many inflight dataouts we expect   *
 * to have at max for SCSI command. The tx posting & completion handling code  *
 * supports -EAGAIN scheme where tx is suspended till the QP has room for more *
 * send WR. D=8 comes from 64K/8K                                              */

#define ISER_INFLIGHT_DATAOUTS		8

135
#define ISER_QP_MAX_REQ_DTOS		(ISER_DEF_XMIT_CMDS_MAX *    \
136 137 138 139
					(1 + ISER_INFLIGHT_DATAOUTS) + \
					ISER_MAX_TX_MISC_PDUS        + \
					ISER_MAX_RX_MISC_PDUS)

140 141 142 143 144 145 146 147 148
/* Max registration work requests per command */
#define ISER_MAX_REG_WR_PER_CMD		5

/* For Signature we don't support DATAOUTs so no need to make room for them */
#define ISER_QP_SIG_MAX_REQ_DTOS	(ISER_DEF_XMIT_CMDS_MAX	*       \
					(1 + ISER_MAX_REG_WR_PER_CMD) + \
					ISER_MAX_TX_MISC_PDUS         + \
					ISER_MAX_RX_MISC_PDUS)

149 150 151 152 153
#define ISER_GET_MAX_XMIT_CMDS(send_wr) ((send_wr			\
					 - ISER_MAX_TX_MISC_PDUS	\
					 - ISER_MAX_RX_MISC_PDUS) /	\
					 (1 + ISER_INFLIGHT_DATAOUTS))

154
#define ISER_WC_BATCH_COUNT   16
155
#define ISER_SIGNAL_CMD_COUNT 32
156

157 158 159 160
#define ISER_VER			0x10
#define ISER_WSV			0x08
#define ISER_RSV			0x04

161
#define ISER_FASTREG_LI_WRID		0xffffffffffffffffULL
162
#define ISER_BEACON_WRID		0xfffffffffffffffeULL
163

164 165 166 167 168 169 170 171 172 173
/**
 * struct iser_hdr - iSER header
 *
 * @flags:        flags support (zbva, remote_inv)
 * @rsvd:         reserved
 * @write_stag:   write rkey
 * @write_va:     write virtual address
 * @reaf_stag:    read rkey
 * @read_va:      read virtual address
 */
174 175 176
struct iser_hdr {
	u8      flags;
	u8      rsvd[3];
177
	__be32  write_stag;
178
	__be64  write_va;
179
	__be32  read_stag;
180 181 182
	__be64  read_va;
} __attribute__((packed));

183 184 185 186 187 188 189 190 191

#define ISER_ZBVA_NOT_SUPPORTED		0x80
#define ISER_SEND_W_INV_NOT_SUPPORTED	0x40

struct iser_cm_hdr {
	u8      flags;
	u8      rsvd[3];
} __packed;

192 193 194 195 196 197
/* Constant PDU lengths calculations */
#define ISER_HEADERS_LEN  (sizeof(struct iser_hdr) + sizeof(struct iscsi_hdr))

#define ISER_RECV_DATA_SEG_LEN	128
#define ISER_RX_PAYLOAD_SIZE	(ISER_HEADERS_LEN + ISER_RECV_DATA_SEG_LEN)
#define ISER_RX_LOGIN_SIZE	(ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN)
198 199 200 201

/* Length of an object name string */
#define ISER_OBJECT_NAME_SIZE		    64

202
enum iser_conn_state {
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	ISER_CONN_INIT,		   /* descriptor allocd, no conn          */
	ISER_CONN_PENDING,	   /* in the process of being established */
	ISER_CONN_UP,		   /* up and running                      */
	ISER_CONN_TERMINATING,	   /* in the process of being terminated  */
	ISER_CONN_DOWN,		   /* shut down                           */
	ISER_CONN_STATES_NUM
};

enum iser_task_status {
	ISER_TASK_STATUS_INIT = 0,
	ISER_TASK_STATUS_STARTED,
	ISER_TASK_STATUS_COMPLETED
};

enum iser_data_dir {
	ISER_DIR_IN = 0,	   /* to initiator */
	ISER_DIR_OUT,		   /* from initiator */
	ISER_DIRS_NUM
};

223 224 225
/**
 * struct iser_data_buf - iSER data buffer
 *
226
 * @sg:           pointer to the sg list
227 228 229 230
 * @size:         num entries of this sg
 * @data_len:     total beffer byte len
 * @dma_nents:    returned by dma_map_sg
 */
231
struct iser_data_buf {
232
	struct scatterlist *sg;
233
	int                size;
234 235
	unsigned long      data_len;
	unsigned int       dma_nents;
236
};
237 238 239

/* fwd declarations */
struct iser_device;
240
struct iscsi_iser_task;
241
struct iscsi_endpoint;
242
struct iser_reg_resources;
243

244 245 246
/**
 * struct iser_mem_reg - iSER memory registration info
 *
247 248
 * @sge:          memory region sg element
 * @rkey:         memory region remote key
249 250
 * @mem_h:        pointer to registration context (FMR/Fastreg)
 */
251
struct iser_mem_reg {
252 253 254
	struct ib_sge	 sge;
	u32		 rkey;
	void		*mem_h;
255 256 257 258 259 260 261 262
};

enum iser_desc_type {
	ISCSI_TX_CONTROL ,
	ISCSI_TX_SCSI_COMMAND,
	ISCSI_TX_DATAOUT
};

263 264 265 266 267 268 269 270
/* Maximum number of work requests per task:
 * Data memory region local invalidate + fast registration
 * Protection memory region local invalidate + fast registration
 * Signature memory region local invalidate + fast registration
 * PDU send
 */
#define ISER_MAX_WRS 7

271 272 273 274 275 276 277 278 279 280 281
/**
 * struct iser_tx_desc - iSER TX descriptor (for send wr_id)
 *
 * @iser_header:   iser header
 * @iscsi_header:  iscsi header
 * @type:          command/control/dataout
 * @dam_addr:      header buffer dma_address
 * @tx_sg:         sg[0] points to iser/iscsi headers
 *                 sg[1] optionally points to either of immediate data
 *                 unsolicited data-out or control
 * @num_sge:       number sges used on this TX task
282
 * @mapped:        Is the task header mapped
283 284 285 286 287
 * @wr_idx:        Current WR index
 * @wrs:           Array of WRs per task
 * @data_reg:      Data buffer registration details
 * @prot_reg:      Protection buffer registration details
 * @sig_attrs:     Signature attributes
288
 */
289
struct iser_tx_desc {
290 291 292
	struct iser_hdr              iser_header;
	struct iscsi_hdr             iscsi_header;
	enum   iser_desc_type        type;
293 294 295
	u64		             dma_addr;
	struct ib_sge		     tx_sg[2];
	int                          num_sge;
296
	bool			     mapped;
297
	u8                           wr_idx;
C
Christoph Hellwig 已提交
298 299
	union iser_wr {
		struct ib_send_wr		send;
300
		struct ib_reg_wr		fast_reg;
C
Christoph Hellwig 已提交
301 302
		struct ib_sig_handover_wr	sig;
	} wrs[ISER_MAX_WRS];
303 304 305
	struct iser_mem_reg          data_reg;
	struct iser_mem_reg          prot_reg;
	struct ib_sig_attrs          sig_attrs;
306 307
};

308 309
#define ISER_RX_PAD_SIZE	(256 - (ISER_RX_PAYLOAD_SIZE + \
					sizeof(u64) + sizeof(struct ib_sge)))
310 311 312 313 314 315 316 317 318 319
/**
 * struct iser_rx_desc - iSER RX descriptor (for recv wr_id)
 *
 * @iser_header:   iser header
 * @iscsi_header:  iscsi header
 * @data:          received data segment
 * @dma_addr:      receive buffer dma address
 * @rx_sg:         ib_sge of receive buffer
 * @pad:           for sense data TODO: Modify to maximum sense length supported
 */
320 321 322 323 324 325 326 327 328
struct iser_rx_desc {
	struct iser_hdr              iser_header;
	struct iscsi_hdr             iscsi_header;
	char		             data[ISER_RECV_DATA_SEG_LEN];
	u64		             dma_addr;
	struct ib_sge		     rx_sg;
	char		             pad[ISER_RX_PAD_SIZE];
} __attribute__((packed));

329
struct iser_conn;
S
Sagi Grimberg 已提交
330
struct ib_conn;
331 332
struct iscsi_iser_task;

333 334 335 336
/**
 * struct iser_comp - iSER completion context
 *
 * @device:     pointer to device handle
337
 * @cq:         completion queue
338
 * @wcs:        work completion array
339 340 341 342 343 344
 * @tasklet:    Tasklet handle
 * @active_qps: Number of active QPs attached
 *              to completion context
 */
struct iser_comp {
	struct iser_device      *device;
345
	struct ib_cq		*cq;
346
	struct ib_wc		 wcs[ISER_WC_BATCH_COUNT];
347 348 349 350
	struct tasklet_struct	 tasklet;
	int                      active_qps;
};

S
Sagi Grimberg 已提交
351 352 353 354 355 356
/**
 * struct iser_device - Memory registration operations
 *     per-device registration schemes
 *
 * @alloc_reg_res:     Allocate registration resources
 * @free_reg_res:      Free registration resources
357 358
 * @fast_reg_mem:      Register memory buffers
 * @unreg_mem:         Un-register memory buffers
359 360
 * @reg_desc_get:      Get a registration descriptor for pool
 * @reg_desc_put:      Get a registration descriptor to pool
S
Sagi Grimberg 已提交
361 362 363
 */
struct iser_reg_ops {
	int            (*alloc_reg_res)(struct ib_conn *ib_conn,
364 365
					unsigned cmds_max,
					unsigned int size);
S
Sagi Grimberg 已提交
366
	void           (*free_reg_res)(struct ib_conn *ib_conn);
367 368 369 370 371 372
	int            (*reg_mem)(struct iscsi_iser_task *iser_task,
				  struct iser_data_buf *mem,
				  struct iser_reg_resources *rsc,
				  struct iser_mem_reg *reg);
	void           (*unreg_mem)(struct iscsi_iser_task *iser_task,
				    enum iser_data_dir cmd_dir);
373 374 375
	struct iser_fr_desc * (*reg_desc_get)(struct ib_conn *ib_conn);
	void           (*reg_desc_put)(struct ib_conn *ib_conn,
				       struct iser_fr_desc *desc);
S
Sagi Grimberg 已提交
376 377
};

378 379 380 381 382 383 384 385 386 387 388 389 390
/**
 * struct iser_device - iSER device handle
 *
 * @ib_device:     RDMA device
 * @pd:            Protection Domain for this device
 * @dev_attr:      Device attributes container
 * @mr:            Global DMA memory region
 * @event_handler: IB events handle routine
 * @ig_list:	   entry in devices list
 * @refcount:      Reference counter, dominated by open iser connections
 * @comps_used:    Number of completion contexts used, Min between online
 *                 cpus and device max completion vectors
 * @comps:         Dinamically allocated array of completion handlers
S
Sagi Grimberg 已提交
391
 * @reg_ops:       Registration ops
392
 */
393 394 395
struct iser_device {
	struct ib_device             *ib_device;
	struct ib_pd	             *pd;
396
	struct ib_device_attr	     dev_attr;
397
	struct ib_mr	             *mr;
398
	struct ib_event_handler      event_handler;
399
	struct list_head             ig_list;
400
	int                          refcount;
401
	int			     comps_used;
402
	struct iser_comp	     *comps;
S
Sagi Grimberg 已提交
403
	struct iser_reg_ops          *reg_ops;
404 405
};

406 407 408 409
#define ISER_CHECK_GUARD	0xc0
#define ISER_CHECK_REFTAG	0x0f
#define ISER_CHECK_APPTAG	0x30

410 411 412 413
/**
 * struct iser_reg_resources - Fast registration recources
 *
 * @mr:         memory region
414 415
 * @fmr_pool:   pool of fmrs
 * @page_vec:   fast reg page list used by fmr pool
416 417 418
 * @mr_valid:   is mr valid indicator
 */
struct iser_reg_resources {
419 420 421 422
	union {
		struct ib_mr             *mr;
		struct ib_fmr_pool       *fmr_pool;
	};
423
	struct iser_page_vec             *page_vec;
424
	u8				  mr_valid:1;
425 426
};

427 428 429
/**
 * struct iser_pi_context - Protection information context
 *
430 431 432 433
 * @rsc:             protection buffer registration resources
 * @sig_mr:          signature enable memory region
 * @sig_mr_valid:    is sig_mr valid indicator
 * @sig_protected:   is region protected indicator
434
 */
435
struct iser_pi_context {
436
	struct iser_reg_resources	rsc;
437
	struct ib_mr                   *sig_mr;
438 439
	u8                              sig_mr_valid:1;
	u8                              sig_protected:1;
440 441
};

442
/**
443
 * struct iser_fr_desc - Fast registration descriptor
444 445
 *
 * @list:           entry in connection fastreg pool
446
 * @rsc:            data buffer registration resources
447 448
 * @pi_ctx:         protection information context
 */
449
struct iser_fr_desc {
450
	struct list_head		  list;
451
	struct iser_reg_resources	  rsc;
452
	struct iser_pi_context		 *pi_ctx;
453 454
};

455 456 457
/**
 * struct iser_fr_pool: connection fast registration pool
 *
458
 * @list:                list of fastreg descriptors
459
 * @lock:                protects fmr/fastreg pool
460
 * @size:                size of the pool
461 462
 */
struct iser_fr_pool {
463 464 465
	struct list_head        list;
	spinlock_t              lock;
	int                     size;
466 467
};

S
Sagi Grimberg 已提交
468 469 470 471 472 473
/**
 * struct ib_conn - Infiniband related objects
 *
 * @cma_id:              rdma_cm connection maneger handle
 * @qp:                  Connection Queue-pair
 * @post_recv_buf_count: post receive counter
M
Max Gurtovoy 已提交
474
 * @sig_count:           send work request signal count
S
Sagi Grimberg 已提交
475 476
 * @rx_wr:               receive work request for batch posts
 * @device:              reference to iser device
477
 * @comp:                iser completion context
S
Sagi Grimberg 已提交
478
 * @pi_support:          Indicate device T10-PI support
479
 * @beacon:              beacon send wr to signal all flush errors were drained
480
 * @flush_comp:          completes when all connection completions consumed
481
 * @fr_pool:             connection fast registration poool
S
Sagi Grimberg 已提交
482 483 484 485 486
 */
struct ib_conn {
	struct rdma_cm_id           *cma_id;
	struct ib_qp	            *qp;
	int                          post_recv_buf_count;
M
Max Gurtovoy 已提交
487
	u8                           sig_count;
S
Sagi Grimberg 已提交
488 489
	struct ib_recv_wr	     rx_wr[ISER_MIN_POSTED_RX];
	struct iser_device          *device;
490
	struct iser_comp	    *comp;
S
Sagi Grimberg 已提交
491
	bool			     pi_support;
492
	struct ib_send_wr	     beacon;
493
	struct completion	     flush_comp;
494
	struct iser_fr_pool          fr_pool;
S
Sagi Grimberg 已提交
495 496
};

497 498 499 500 501 502 503 504 505 506 507
/**
 * struct iser_conn - iSER connection context
 *
 * @ib_conn:          connection RDMA resources
 * @iscsi_conn:       link to matching iscsi connection
 * @ep:               transport handle
 * @state:            connection logical state
 * @qp_max_recv_dtos: maximum number of data outs, corresponds
 *                    to max number of post recvs
 * @qp_max_recv_dtos_mask: (qp_max_recv_dtos - 1)
 * @min_posted_rx:    (qp_max_recv_dtos >> 2)
508
 * @max_cmds:         maximum cmds allowed for this connection
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
 * @name:             connection peer portal
 * @release_work:     deffered work for release job
 * @state_mutex:      protects iser onnection state
 * @stop_completion:  conn_stop completion
 * @ib_completion:    RDMA cleanup completion
 * @up_completion:    connection establishment completed
 *                    (state is ISER_CONN_UP)
 * @conn_list:        entry in ig conn list
 * @login_buf:        login data buffer (stores login parameters)
 * @login_req_buf:    login request buffer
 * @login_req_dma:    login request buffer dma address
 * @login_resp_buf:   login response buffer
 * @login_resp_dma:   login response buffer dma address
 * @rx_desc_head:     head of rx_descs cyclic buffer
 * @rx_descs:         rx buffers array (cyclic buffer)
 * @num_rx_descs:     number of rx descriptors
525 526
 * @scsi_sg_tablesize: scsi host sg_tablesize
 * @scsi_max_sectors: scsi host max sectors
527
 */
528
struct iser_conn {
S
Sagi Grimberg 已提交
529
	struct ib_conn		     ib_conn;
530
	struct iscsi_conn	     *iscsi_conn;
531
	struct iscsi_endpoint	     *ep;
532 533 534 535
	enum iser_conn_state	     state;
	unsigned		     qp_max_recv_dtos;
	unsigned		     qp_max_recv_dtos_mask;
	unsigned		     min_posted_rx;
536
	u16                          max_cmds;
537
	char 			     name[ISER_OBJECT_NAME_SIZE];
538
	struct work_struct	     release_work;
539
	struct mutex		     state_mutex;
540 541
	struct completion	     stop_completion;
	struct completion	     ib_completion;
542
	struct completion	     up_completion;
543
	struct list_head	     conn_list;
544 545

	char  			     *login_buf;
546 547
	char			     *login_req_buf, *login_resp_buf;
	u64			     login_req_dma, login_resp_dma;
548 549
	unsigned int 		     rx_desc_head;
	struct iser_rx_desc	     *rx_descs;
550
	u32                          num_rx_descs;
551 552
	unsigned short               scsi_sg_tablesize;
	unsigned int                 scsi_max_sectors;
553 554
};

555 556 557 558 559 560 561 562 563
/**
 * struct iscsi_iser_task - iser task context
 *
 * @desc:     TX descriptor
 * @iser_conn:        link to iser connection
 * @status:           current task status
 * @sc:               link to scsi command
 * @command_sent:     indicate if command was sent
 * @dir:              iser data direction
564
 * @rdma_reg:         task rdma registration desc
565 566 567
 * @data:             iser data buffer desc
 * @prot:             iser protection buffer desc
 */
568
struct iscsi_iser_task {
569
	struct iser_tx_desc          desc;
570
	struct iser_conn	     *iser_conn;
571
	enum iser_task_status 	     status;
572
	struct scsi_cmnd	     *sc;
573 574
	int                          command_sent;
	int                          dir[ISER_DIRS_NUM];
575
	struct iser_mem_reg          rdma_reg[ISER_DIRS_NUM];
576 577
	struct iser_data_buf         data[ISER_DIRS_NUM];
	struct iser_data_buf         prot[ISER_DIRS_NUM];
578 579 580 581 582 583 584 585 586
};

struct iser_page_vec {
	u64 *pages;
	int length;
	int offset;
	int data_size;
};

587 588 589 590 591 592 593 594 595
/**
 * struct iser_global: iSER global context
 *
 * @device_list_mutex:    protects device_list
 * @device_list:          iser devices global list
 * @connlist_mutex:       protects connlist
 * @connlist:             iser connections global list
 * @desc_cache:           kmem cache for tx dataout
 */
596
struct iser_global {
597 598
	struct mutex      device_list_mutex;
	struct list_head  device_list;
599
	struct mutex      connlist_mutex;
600
	struct list_head  connlist;
601
	struct kmem_cache *desc_cache;
602 603 604 605
};

extern struct iser_global ig;
extern int iser_debug_level;
606 607
extern bool iser_pi_enable;
extern int iser_pi_guard;
608
extern unsigned int iser_max_sectors;
609
extern bool iser_always_reg;
610

S
Sagi Grimberg 已提交
611 612
int iser_assign_reg_ops(struct iser_device *device);

613
int iser_send_control(struct iscsi_conn *conn,
614
		      struct iscsi_task *task);
615

616
int iser_send_command(struct iscsi_conn *conn,
617
		      struct iscsi_task *task);
618

619
int iser_send_data_out(struct iscsi_conn *conn,
620
		       struct iscsi_task *task,
621
		       struct iscsi_data *hdr);
622 623

void iscsi_iser_recv(struct iscsi_conn *conn,
624 625 626
		     struct iscsi_hdr *hdr,
		     char *rx_data,
		     int rx_data_len);
627

628
void iser_conn_init(struct iser_conn *iser_conn);
629

630
void iser_conn_release(struct iser_conn *iser_conn);
631

632
int iser_conn_terminate(struct iser_conn *iser_conn);
633

634 635
void iser_release_work(struct work_struct *work);

636
void iser_rcv_completion(struct iser_rx_desc *desc,
637
			 unsigned long dto_xfer_len,
S
Sagi Grimberg 已提交
638
			 struct ib_conn *ib_conn);
639

640
void iser_snd_completion(struct iser_tx_desc *desc,
S
Sagi Grimberg 已提交
641
			 struct ib_conn *ib_conn);
642

643
void iser_task_rdma_init(struct iscsi_iser_task *task);
644

645
void iser_task_rdma_finalize(struct iscsi_iser_task *task);
646

647
void iser_free_rx_descriptors(struct iser_conn *iser_conn);
648

649 650 651
void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,
				     struct iser_data_buf *mem,
				     enum iser_data_dir cmd_dir);
652

653 654 655 656
int iser_reg_rdma_mem(struct iscsi_iser_task *task,
		      enum iser_data_dir dir);
void iser_unreg_rdma_mem(struct iscsi_iser_task *task,
			 enum iser_data_dir dir);
657

658 659 660 661
int  iser_connect(struct iser_conn *iser_conn,
		  struct sockaddr *src_addr,
		  struct sockaddr *dst_addr,
		  int non_blocking);
662

663 664
void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
			enum iser_data_dir cmd_dir);
665 666
void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
			    enum iser_data_dir cmd_dir);
667

668 669
int  iser_post_recvl(struct iser_conn *iser_conn);
int  iser_post_recvm(struct iser_conn *iser_conn, int count);
670 671
int  iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
		    bool signal);
672

673
int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
674 675 676
			   struct iser_data_buf *data,
			   enum iser_data_dir iser_dir,
			   enum dma_data_direction dma_dir);
677

678
void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
679 680 681
			      struct iser_data_buf *data,
			      enum dma_data_direction dir);

682 683
int  iser_initialize_task_headers(struct iscsi_task *task,
			struct iser_tx_desc *tx_desc);
684 685
int iser_alloc_rx_descriptors(struct iser_conn *iser_conn,
			      struct iscsi_session *session);
686 687 688
int iser_alloc_fmr_pool(struct ib_conn *ib_conn,
			unsigned cmds_max,
			unsigned int size);
S
Sagi Grimberg 已提交
689
void iser_free_fmr_pool(struct ib_conn *ib_conn);
690 691 692
int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
			    unsigned cmds_max,
			    unsigned int size);
S
Sagi Grimberg 已提交
693
void iser_free_fastreg_pool(struct ib_conn *ib_conn);
694 695
u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
			     enum iser_data_dir cmd_dir, sector_t *sector);
696
struct iser_fr_desc *
697
iser_reg_desc_get_fr(struct ib_conn *ib_conn);
698
void
699 700 701 702 703 704 705
iser_reg_desc_put_fr(struct ib_conn *ib_conn,
		     struct iser_fr_desc *desc);
struct iser_fr_desc *
iser_reg_desc_get_fmr(struct ib_conn *ib_conn);
void
iser_reg_desc_put_fmr(struct ib_conn *ib_conn,
		      struct iser_fr_desc *desc);
706 707 708 709

static inline struct ib_send_wr *
iser_tx_next_wr(struct iser_tx_desc *tx_desc)
{
C
Christoph Hellwig 已提交
710
	struct ib_send_wr *cur_wr = &tx_desc->wrs[tx_desc->wr_idx].send;
711 712 713
	struct ib_send_wr *last_wr;

	if (tx_desc->wr_idx) {
C
Christoph Hellwig 已提交
714
		last_wr = &tx_desc->wrs[tx_desc->wr_idx - 1].send;
715 716 717 718 719 720 721
		last_wr->next = cur_wr;
	}
	tx_desc->wr_idx++;

	return cur_wr;
}

722
#endif