ib_srp.h 7.7 KB
Newer Older
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
/*
 * Copyright (c) 2005 Cisco Systems.  All rights reserved.
 *
 * 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 IB_SRP_H
#define IB_SRP_H

#include <linux/types.h>
#include <linux/list.h>
38
#include <linux/mutex.h>
39
#include <linux/scatterlist.h>
40 41 42 43 44 45 46

#include <scsi/scsi_host.h>
#include <scsi/scsi_cmnd.h>

#include <rdma/ib_verbs.h>
#include <rdma/ib_sa.h>
#include <rdma/ib_cm.h>
47
#include <rdma/ib_fmr_pool.h>
48 49 50 51 52 53 54

enum {
	SRP_PATH_REC_TIMEOUT_MS	= 1000,
	SRP_ABORT_TIMEOUT_MS	= 5000,

	SRP_PORT_REDIRECT	= 1,
	SRP_DLID_REDIRECT	= 2,
D
David Dillow 已提交
55
	SRP_STALE_CONN		= 3,
56

R
Roland Dreier 已提交
57
	SRP_MAX_LUN		= 512,
58
	SRP_DEF_SG_TABLESIZE	= 12,
59

60
	SRP_DEFAULT_QUEUE_SIZE	= 1 << 6,
61 62
	SRP_RSP_SQ_SIZE		= 1,
	SRP_TSK_MGMT_SQ_SIZE	= 1,
63 64
	SRP_DEFAULT_CMD_SQ_SIZE = SRP_DEFAULT_QUEUE_SIZE - SRP_RSP_SQ_SIZE -
				  SRP_TSK_MGMT_SQ_SIZE,
65

66 67
	SRP_TAG_NO_REQ		= ~0U,
	SRP_TAG_TSK_MGMT	= 1U << 31,
68

69
	SRP_MAX_PAGES_PER_MR	= 512,
70

71 72
	LOCAL_INV_WR_ID_MASK	= 1,
	FAST_REG_WR_ID_MASK	= 2,
73 74

	SRP_LAST_WR_ID		= 0xfffffffcU,
75 76 77
};

enum srp_target_state {
78
	SRP_TARGET_SCANNING,
79
	SRP_TARGET_LIVE,
80
	SRP_TARGET_REMOVED,
81 82
};

83 84 85 86
enum srp_iu_type {
	SRP_IU_CMD,
	SRP_IU_TSK_MGMT,
	SRP_IU_RSP,
87 88
};

89 90 91 92 93 94
/*
 * @mr_page_mask: HCA memory registration page mask.
 * @mr_page_size: HCA memory registration page size.
 * @mr_max_size: Maximum size in bytes of a single FMR / FR registration
 *   request.
 */
95 96
struct srp_device {
	struct list_head	dev_list;
97 98 99
	struct ib_device       *dev;
	struct ib_pd	       *pd;
	struct ib_mr	       *mr;
100 101 102 103
	u64			mr_page_mask;
	int			mr_page_size;
	int			mr_max_size;
	int			max_pages_per_mr;
104
	bool			has_fmr;
105 106
	bool			has_fr;
	bool			use_fast_reg;
107 108 109
};

struct srp_host {
110
	struct srp_device      *srp_dev;
111
	u8			port;
112
	struct device		dev;
113
	struct list_head	target_list;
114
	spinlock_t		target_lock;
115 116
	struct completion	released;
	struct list_head	list;
117
	struct mutex		add_target_mutex;
118 119 120 121 122
};

struct srp_request {
	struct scsi_cmnd       *scmnd;
	struct srp_iu	       *cmd;
123 124 125 126
	union {
		struct ib_pool_fmr **fmr_list;
		struct srp_fr_desc **fr_list;
	};
127
	u64		       *map_page;
128 129
	struct srp_direct_buf  *indirect_desc;
	dma_addr_t		indirect_dma_addr;
130
	short			nmdesc;
131 132
};

133 134 135 136 137
/**
 * struct srp_rdma_ch
 * @comp_vector: Completion vector used by this RDMA channel.
 */
struct srp_rdma_ch {
138 139 140 141 142 143
	/* These are RW in the hot path, and commonly used together */
	struct list_head	free_tx;
	spinlock_t		lock;
	s32			req_lim;

	/* These are read-only in the hot path */
144 145
	struct srp_target_port *target ____cacheline_aligned_in_smp;
	struct ib_cq	       *send_cq;
146 147
	struct ib_cq	       *recv_cq;
	struct ib_qp	       *qp;
148 149 150 151
	union {
		struct ib_fmr_pool     *fmr_pool;
		struct srp_fr_pool     *fr_pool;
	};
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

	/* Everything above this point is used in the hot path of
	 * command processing. Try to keep them packed into cachelines.
	 */

	struct completion	done;
	int			status;

	struct ib_sa_path_rec	path;
	struct ib_sa_query     *path_query;
	int			path_query_id;

	struct ib_cm_id	       *cm_id;
	struct srp_iu	      **tx_ring;
	struct srp_iu	      **rx_ring;
	struct srp_request     *req_ring;
	int			max_ti_iu_len;
	int			comp_vector;

	struct completion	tsk_mgmt_done;
	u8			tsk_mgmt_status;
};

/**
 * struct srp_target_port
 * @comp_vector: Completion vector used by the first RDMA channel created for
 *   this target port.
 */
struct srp_target_port {
	/* read and written in the hot path */
	spinlock_t		lock;

	/* read only in the hot path */
B
Bart Van Assche 已提交
185 186
	struct srp_rdma_ch	*ch;
	u32			ch_count;
187 188 189
	u32			lkey;
	u32			rkey;
	enum srp_target_state	state;
190 191
	unsigned int		max_iu_len;
	unsigned int		cmd_sg_cnt;
192 193
	unsigned int		indirect_size;
	bool			allow_ext_sg;
194

195
	/* other member variables */
196
	union ib_gid		sgid;
197 198 199
	__be64			id_ext;
	__be64			ioc_guid;
	__be64			service_id;
200
	__be64			initiator_ext;
201
	u16			io_class;
202 203
	struct srp_host	       *srp_host;
	struct Scsi_Host       *scsi_host;
204
	struct srp_rport       *rport;
205 206
	char			target_name[32];
	unsigned int		scsi_id;
207
	unsigned int		sg_tablesize;
208 209
	int			queue_size;
	int			req_ring_size;
210
	int			comp_vector;
211
	int			tl_retry_count;
212

213 214
	union ib_gid		orig_dgid;
	__be16			pkey;
215

216
	u32			rq_tmo_jiffies;
217
	bool			connected;
218

219 220
	int			zero_req_lim;

221
	struct work_struct	tl_err_work;
222
	struct work_struct	remove_work;
223 224

	struct list_head	list;
225
	bool			qp_in_error;
226 227 228
};

struct srp_iu {
229
	struct list_head	list;
230
	u64			dma;
231 232 233 234 235
	void		       *buf;
	size_t			size;
	enum dma_data_direction	direction;
};

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
/**
 * struct srp_fr_desc - fast registration work request arguments
 * @entry: Entry in srp_fr_pool.free_list.
 * @mr:    Memory region.
 * @frpl:  Fast registration page list.
 */
struct srp_fr_desc {
	struct list_head		entry;
	struct ib_mr			*mr;
	struct ib_fast_reg_page_list	*frpl;
};

/**
 * struct srp_fr_pool - pool of fast registration descriptors
 *
 * An entry is available for allocation if and only if it occurs in @free_list.
 *
 * @size:      Number of descriptors in this pool.
 * @max_page_list_len: Maximum fast registration work request page list length.
 * @lock:      Protects free_list.
 * @free_list: List of free descriptors.
 * @desc:      Fast registration descriptor pool.
 */
struct srp_fr_pool {
	int			size;
	int			max_page_list_len;
	spinlock_t		lock;
	struct list_head	free_list;
	struct srp_fr_desc	desc[0];
};

/**
 * struct srp_map_state - per-request DMA memory mapping state
 * @desc:	    Pointer to the element of the SRP buffer descriptor array
 *		    that is being filled in.
 * @pages:	    Array with DMA addresses of pages being considered for
 *		    memory registration.
 * @base_dma_addr:  DMA address of the first page that has not yet been mapped.
 * @dma_len:	    Number of bytes that will be registered with the next
 *		    FMR or FR memory registration call.
 * @total_len:	    Total number of bytes in the sg-list being mapped.
 * @npages:	    Number of page addresses in the pages[] array.
 * @nmdesc:	    Number of FMR or FR memory descriptors used for mapping.
 * @ndesc:	    Number of SRP buffer descriptors that have been filled in.
 * @unmapped_sg:    First element of the sg-list that is mapped via FMR or FR.
 * @unmapped_index: Index of the first element mapped via FMR or FR.
 * @unmapped_addr:  DMA address of the first element mapped via FMR or FR.
 */
284
struct srp_map_state {
285 286 287 288
	union {
		struct ib_pool_fmr **next_fmr;
		struct srp_fr_desc **next_fr;
	};
289 290 291
	struct srp_direct_buf  *desc;
	u64		       *pages;
	dma_addr_t		base_dma_addr;
292
	u32			dma_len;
293 294
	u32			total_len;
	unsigned int		npages;
295
	unsigned int		nmdesc;
296 297 298 299 300 301
	unsigned int		ndesc;
	struct scatterlist     *unmapped_sg;
	int			unmapped_index;
	dma_addr_t		unmapped_addr;
};

302
#endif /* IB_SRP_H */