]>
Commit | Line | Data |
---|---|---|
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 | |
38 | enum isert_desc_type { | |
39 | ISCSI_TX_CONTROL, | |
40 | ISCSI_TX_DATAIN | |
41 | }; | |
42 | ||
43 | enum iser_ib_op_code { | |
44 | ISER_IB_RECV, | |
45 | ISER_IB_SEND, | |
46 | ISER_IB_RDMA_WRITE, | |
47 | ISER_IB_RDMA_READ, | |
48 | }; | |
49 | ||
50 | enum 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 | ||
58 | struct 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 | ||
67 | struct 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 |
78 | enum 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 | ||
85 | struct pi_context { | |
86 | struct ib_mr *prot_mr; | |
d3e125da SG |
87 | struct ib_mr *sig_mr; |
88 | }; | |
89 | ||
59464ef4 | 90 | struct 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 |
97 | struct 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 |
107 | enum { |
108 | DATA = 0, | |
109 | PROT = 1, | |
110 | SIG = 2, | |
111 | }; | |
112 | ||
b8d26b3b | 113 | struct 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 | ||
127 | struct 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 | ||
143 | struct isert_device; | |
144 | ||
145 | struct 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 | */ |
193 | struct 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 | ||
201 | struct 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; |
d40945d8 VP |
210 | int (*reg_rdma_mem)(struct iscsi_conn *conn, |
211 | struct iscsi_cmd *cmd, | |
212 | struct isert_rdma_wr *wr); | |
213 | void (*unreg_rdma_mem)(struct isert_cmd *isert_cmd, | |
214 | struct isert_conn *isert_conn); | |
b8d26b3b NB |
215 | }; |
216 | ||
217 | struct isert_np { | |
ca6c1d82 | 218 | struct iscsi_np *np; |
ed8cb0a4 JD |
219 | struct semaphore sem; |
220 | struct rdma_cm_id *cm_id; | |
221 | struct mutex mutex; | |
bd379220 JD |
222 | struct list_head accepted; |
223 | struct list_head pending; | |
b8d26b3b | 224 | }; |