Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[linux-2.6-block.git] / drivers / infiniband / ulp / isert / ib_isert.h
CommitLineData
b8d26b3b
NB
1#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
24f412dd
SG
7#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
59464ef4 34#define ISCSI_ISER_SG_TABLESIZE 256
9bb4ca68 35#define ISER_FASTREG_LI_WRID 0xffffffffffffffffULL
bdf20e72 36#define ISER_BEACON_WRID 0xfffffffffffffffeULL
b8d26b3b
NB
37
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,
128e9cc8 53 ISER_CONN_FULL_FEATURE,
b8d26b3b
NB
54 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
d3e125da
SG
78enum 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;
d3e125da
SG
87 struct ib_mr *sig_mr;
88};
89
59464ef4 90struct fast_reg_descriptor {
d3e125da
SG
91 struct list_head list;
92 struct ib_mr *data_mr;
d3e125da
SG
93 u8 ind;
94 struct pi_context *pi_ctx;
59464ef4
VP
95};
96
e3d7e4c3
SG
97struct isert_data_buf {
98 struct scatterlist *sg;
99 int nents;
100 u32 sg_off;
101 u32 len; /* cur_rdma_length */
102 u32 offset;
103 unsigned int dma_nents;
104 enum dma_data_direction dma_dir;
105};
106
570db170
SG
107enum {
108 DATA = 0,
109 PROT = 1,
110 SIG = 2,
111};
112
b8d26b3b 113struct isert_rdma_wr {
b8d26b3b
NB
114 struct isert_cmd *isert_cmd;
115 enum iser_ib_op_code iser_ib_op;
116 struct ib_sge *ib_sge;
59464ef4 117 struct ib_sge s_ib_sge;
e622f2f4
CH
118 int rdma_wr_num;
119 struct ib_rdma_wr *rdma_wr;
120 struct ib_rdma_wr s_rdma_wr;
570db170 121 struct ib_sge ib_sg[3];
e3d7e4c3 122 struct isert_data_buf data;
9e961ae7 123 struct isert_data_buf prot;
59464ef4 124 struct fast_reg_descriptor *fr_desc;
b8d26b3b
NB
125};
126
127struct isert_cmd {
128 uint32_t read_stag;
129 uint32_t write_stag;
130 uint64_t read_va;
131 uint64_t write_va;
dbbc5d11
NB
132 u64 pdu_buf_dma;
133 u32 pdu_buf_len;
b8d26b3b 134 struct isert_conn *conn;
d703ce2f 135 struct iscsi_cmd *iscsi_cmd;
b8d26b3b 136 struct iser_tx_desc tx_desc;
4366b19c 137 struct iser_rx_desc *rx_desc;
b8d26b3b
NB
138 struct isert_rdma_wr rdma_wr;
139 struct work_struct comp_work;
9fd60088 140 struct scatterlist sg;
b8d26b3b
NB
141};
142
143struct isert_device;
144
145struct isert_conn {
146 enum iser_conn_state state;
b8d26b3b 147 int post_recv_buf_count;
b8d26b3b
NB
148 u32 responder_resources;
149 u32 initiator_depth;
23a548ee 150 bool pi_support;
b8d26b3b
NB
151 u32 max_sge;
152 char *login_buf;
153 char *login_req_buf;
154 char *login_rsp_buf;
155 u64 login_req_dma;
2371e5da 156 int login_req_len;
b8d26b3b 157 u64 login_rsp_dma;
dac6ab30 158 struct iser_rx_desc *rx_descs;
4366b19c 159 struct ib_recv_wr rx_wr[ISERT_QP_MAX_RECV_DTOS];
b8d26b3b 160 struct iscsi_conn *conn;
bd379220 161 struct list_head node;
dac6ab30 162 struct completion login_comp;
2371e5da 163 struct completion login_req_comp;
dac6ab30
SG
164 struct iser_tx_desc login_tx_desc;
165 struct rdma_cm_id *cm_id;
166 struct ib_qp *qp;
167 struct isert_device *device;
168 struct mutex mutex;
169 struct completion wait;
170 struct completion wait_comp_err;
171 struct kref kref;
172 struct list_head fr_pool;
173 int fr_pool_size;
a3a5a826 174 /* lock to protect fastreg pool */
dac6ab30 175 spinlock_t pool_lock;
b02efbfc 176 struct work_struct release_work;
bdf20e72 177 struct ib_recv_wr beacon;
991bb764 178 bool logout_posted;
b8d26b3b
NB
179};
180
181#define ISERT_MAX_CQ 64
182
4a295bae
SG
183/**
184 * struct isert_comp - iSER completion context
185 *
186 * @device: pointer to device handle
6f0fae3d 187 * @cq: completion queue
36ea63b5 188 * @wcs: work completion array
4a295bae
SG
189 * @active_qps: Number of active QPs attached
190 * to completion context
6f0fae3d 191 * @work: completion work handle
4a295bae
SG
192 */
193struct isert_comp {
6f0fae3d
SG
194 struct isert_device *device;
195 struct ib_cq *cq;
36ea63b5 196 struct ib_wc wcs[16];
4a295bae 197 int active_qps;
6f0fae3d 198 struct work_struct work;
b8d26b3b
NB
199};
200
201struct isert_device {
a3a5a826 202 int use_fastreg;
d3e125da 203 bool pi_capable;
b8d26b3b 204 int refcount;
b8d26b3b 205 struct ib_device *ib_device;
67cb3949 206 struct ib_pd *pd;
4a295bae
SG
207 struct isert_comp *comps;
208 int comps_used;
b8d26b3b 209 struct list_head dev_node;
59464ef4 210 struct ib_device_attr dev_attr;
d40945d8
VP
211 int (*reg_rdma_mem)(struct iscsi_conn *conn,
212 struct iscsi_cmd *cmd,
213 struct isert_rdma_wr *wr);
214 void (*unreg_rdma_mem)(struct isert_cmd *isert_cmd,
215 struct isert_conn *isert_conn);
b8d26b3b
NB
216};
217
218struct isert_np {
ca6c1d82 219 struct iscsi_np *np;
ed8cb0a4
JD
220 struct semaphore sem;
221 struct rdma_cm_id *cm_id;
222 struct mutex mutex;
bd379220
JD
223 struct list_head accepted;
224 struct list_head pending;
b8d26b3b 225};