diff options
Diffstat (limited to 'drivers/infiniband/ulp/iser/iscsi_iser.h')
-rw-r--r-- | drivers/infiniband/ulp/iser/iscsi_iser.h | 97 |
1 files changed, 47 insertions, 50 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 9d529cae1f0d..036934cdcb92 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
@@ -102,9 +102,9 @@ | |||
102 | #define ISER_MAX_TX_MISC_PDUS 6 /* NOOP_OUT(2), TEXT(1), * | 102 | #define ISER_MAX_TX_MISC_PDUS 6 /* NOOP_OUT(2), TEXT(1), * |
103 | * SCSI_TMFUNC(2), LOGOUT(1) */ | 103 | * SCSI_TMFUNC(2), LOGOUT(1) */ |
104 | 104 | ||
105 | #define ISER_QP_MAX_RECV_DTOS (ISCSI_DEF_XMIT_CMDS_MAX + \ | 105 | #define ISER_QP_MAX_RECV_DTOS (ISCSI_DEF_XMIT_CMDS_MAX) |
106 | ISER_MAX_RX_MISC_PDUS + \ | 106 | |
107 | ISER_MAX_TX_MISC_PDUS) | 107 | #define ISER_MIN_POSTED_RX (ISCSI_DEF_XMIT_CMDS_MAX >> 2) |
108 | 108 | ||
109 | /* the max TX (send) WR supported by the iSER QP is defined by * | 109 | /* the max TX (send) WR supported by the iSER QP is defined by * |
110 | * max_send_wr = T * (1 + D) + C ; D is how many inflight dataouts we expect * | 110 | * max_send_wr = T * (1 + D) + C ; D is how many inflight dataouts we expect * |
@@ -132,6 +132,12 @@ struct iser_hdr { | |||
132 | __be64 read_va; | 132 | __be64 read_va; |
133 | } __attribute__((packed)); | 133 | } __attribute__((packed)); |
134 | 134 | ||
135 | /* Constant PDU lengths calculations */ | ||
136 | #define ISER_HEADERS_LEN (sizeof(struct iser_hdr) + sizeof(struct iscsi_hdr)) | ||
137 | |||
138 | #define ISER_RECV_DATA_SEG_LEN 128 | ||
139 | #define ISER_RX_PAYLOAD_SIZE (ISER_HEADERS_LEN + ISER_RECV_DATA_SEG_LEN) | ||
140 | #define ISER_RX_LOGIN_SIZE (ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN) | ||
135 | 141 | ||
136 | /* Length of an object name string */ | 142 | /* Length of an object name string */ |
137 | #define ISER_OBJECT_NAME_SIZE 64 | 143 | #define ISER_OBJECT_NAME_SIZE 64 |
@@ -187,51 +193,43 @@ struct iser_regd_buf { | |||
187 | struct iser_mem_reg reg; /* memory registration info */ | 193 | struct iser_mem_reg reg; /* memory registration info */ |
188 | void *virt_addr; | 194 | void *virt_addr; |
189 | struct iser_device *device; /* device->device for dma_unmap */ | 195 | struct iser_device *device; /* device->device for dma_unmap */ |
190 | u64 dma_addr; /* if non zero, addr for dma_unmap */ | ||
191 | enum dma_data_direction direction; /* direction for dma_unmap */ | 196 | enum dma_data_direction direction; /* direction for dma_unmap */ |
192 | unsigned int data_size; | 197 | unsigned int data_size; |
193 | atomic_t ref_count; /* refcount, freed when dec to 0 */ | ||
194 | }; | ||
195 | |||
196 | #define MAX_REGD_BUF_VECTOR_LEN 2 | ||
197 | |||
198 | struct iser_dto { | ||
199 | struct iscsi_iser_task *task; | ||
200 | struct iser_conn *ib_conn; | ||
201 | int notify_enable; | ||
202 | |||
203 | /* vector of registered buffers */ | ||
204 | unsigned int regd_vector_len; | ||
205 | struct iser_regd_buf *regd[MAX_REGD_BUF_VECTOR_LEN]; | ||
206 | |||
207 | /* offset into the registered buffer may be specified */ | ||
208 | unsigned int offset[MAX_REGD_BUF_VECTOR_LEN]; | ||
209 | |||
210 | /* a smaller size may be specified, if 0, then full size is used */ | ||
211 | unsigned int used_sz[MAX_REGD_BUF_VECTOR_LEN]; | ||
212 | }; | 198 | }; |
213 | 199 | ||
214 | enum iser_desc_type { | 200 | enum iser_desc_type { |
215 | ISCSI_RX, | ||
216 | ISCSI_TX_CONTROL , | 201 | ISCSI_TX_CONTROL , |
217 | ISCSI_TX_SCSI_COMMAND, | 202 | ISCSI_TX_SCSI_COMMAND, |
218 | ISCSI_TX_DATAOUT | 203 | ISCSI_TX_DATAOUT |
219 | }; | 204 | }; |
220 | 205 | ||
221 | struct iser_desc { | 206 | struct iser_tx_desc { |
222 | struct iser_hdr iser_header; | 207 | struct iser_hdr iser_header; |
223 | struct iscsi_hdr iscsi_header; | 208 | struct iscsi_hdr iscsi_header; |
224 | struct iser_regd_buf hdr_regd_buf; | ||
225 | void *data; /* used by RX & TX_CONTROL */ | ||
226 | struct iser_regd_buf data_regd_buf; /* used by RX & TX_CONTROL */ | ||
227 | enum iser_desc_type type; | 209 | enum iser_desc_type type; |
228 | struct iser_dto dto; | 210 | u64 dma_addr; |
211 | /* sg[0] points to iser/iscsi headers, sg[1] optionally points to either | ||
212 | of immediate data, unsolicited data-out or control (login,text) */ | ||
213 | struct ib_sge tx_sg[2]; | ||
214 | int num_sge; | ||
229 | }; | 215 | }; |
230 | 216 | ||
217 | #define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \ | ||
218 | sizeof(u64) + sizeof(struct ib_sge))) | ||
219 | struct iser_rx_desc { | ||
220 | struct iser_hdr iser_header; | ||
221 | struct iscsi_hdr iscsi_header; | ||
222 | char data[ISER_RECV_DATA_SEG_LEN]; | ||
223 | u64 dma_addr; | ||
224 | struct ib_sge rx_sg; | ||
225 | char pad[ISER_RX_PAD_SIZE]; | ||
226 | } __attribute__((packed)); | ||
227 | |||
231 | struct iser_device { | 228 | struct iser_device { |
232 | struct ib_device *ib_device; | 229 | struct ib_device *ib_device; |
233 | struct ib_pd *pd; | 230 | struct ib_pd *pd; |
234 | struct ib_cq *cq; | 231 | struct ib_cq *rx_cq; |
232 | struct ib_cq *tx_cq; | ||
235 | struct ib_mr *mr; | 233 | struct ib_mr *mr; |
236 | struct tasklet_struct cq_tasklet; | 234 | struct tasklet_struct cq_tasklet; |
237 | struct list_head ig_list; /* entry in ig devices list */ | 235 | struct list_head ig_list; /* entry in ig devices list */ |
@@ -250,15 +248,18 @@ struct iser_conn { | |||
250 | struct ib_fmr_pool *fmr_pool; /* pool of IB FMRs */ | 248 | struct ib_fmr_pool *fmr_pool; /* pool of IB FMRs */ |
251 | int disc_evt_flag; /* disconn event delivered */ | 249 | int disc_evt_flag; /* disconn event delivered */ |
252 | wait_queue_head_t wait; /* waitq for conn/disconn */ | 250 | wait_queue_head_t wait; /* waitq for conn/disconn */ |
253 | atomic_t post_recv_buf_count; /* posted rx count */ | 251 | int post_recv_buf_count; /* posted rx count */ |
254 | atomic_t post_send_buf_count; /* posted tx count */ | 252 | atomic_t post_send_buf_count; /* posted tx count */ |
255 | atomic_t unexpected_pdu_count;/* count of received * | ||
256 | * unexpected pdus * | ||
257 | * not yet retired */ | ||
258 | char name[ISER_OBJECT_NAME_SIZE]; | 253 | char name[ISER_OBJECT_NAME_SIZE]; |
259 | struct iser_page_vec *page_vec; /* represents SG to fmr maps* | 254 | struct iser_page_vec *page_vec; /* represents SG to fmr maps* |
260 | * maps serialized as tx is*/ | 255 | * maps serialized as tx is*/ |
261 | struct list_head conn_list; /* entry in ig conn list */ | 256 | struct list_head conn_list; /* entry in ig conn list */ |
257 | |||
258 | char *login_buf; | ||
259 | u64 login_dma; | ||
260 | unsigned int rx_desc_head; | ||
261 | struct iser_rx_desc *rx_descs; | ||
262 | struct ib_recv_wr rx_wr[ISER_MIN_POSTED_RX]; | ||
262 | }; | 263 | }; |
263 | 264 | ||
264 | struct iscsi_iser_conn { | 265 | struct iscsi_iser_conn { |
@@ -267,7 +268,7 @@ struct iscsi_iser_conn { | |||
267 | }; | 268 | }; |
268 | 269 | ||
269 | struct iscsi_iser_task { | 270 | struct iscsi_iser_task { |
270 | struct iser_desc desc; | 271 | struct iser_tx_desc desc; |
271 | struct iscsi_iser_conn *iser_conn; | 272 | struct iscsi_iser_conn *iser_conn; |
272 | enum iser_task_status status; | 273 | enum iser_task_status status; |
273 | int command_sent; /* set if command sent */ | 274 | int command_sent; /* set if command sent */ |
@@ -275,6 +276,7 @@ struct iscsi_iser_task { | |||
275 | struct iser_regd_buf rdma_regd[ISER_DIRS_NUM];/* regd rdma buf */ | 276 | struct iser_regd_buf rdma_regd[ISER_DIRS_NUM];/* regd rdma buf */ |
276 | struct iser_data_buf data[ISER_DIRS_NUM]; /* orig. data des*/ | 277 | struct iser_data_buf data[ISER_DIRS_NUM]; /* orig. data des*/ |
277 | struct iser_data_buf data_copy[ISER_DIRS_NUM];/* contig. copy */ | 278 | struct iser_data_buf data_copy[ISER_DIRS_NUM];/* contig. copy */ |
279 | int headers_initialized; | ||
278 | }; | 280 | }; |
279 | 281 | ||
280 | struct iser_page_vec { | 282 | struct iser_page_vec { |
@@ -322,22 +324,17 @@ void iser_conn_put(struct iser_conn *ib_conn); | |||
322 | 324 | ||
323 | void iser_conn_terminate(struct iser_conn *ib_conn); | 325 | void iser_conn_terminate(struct iser_conn *ib_conn); |
324 | 326 | ||
325 | void iser_rcv_completion(struct iser_desc *desc, | 327 | void iser_rcv_completion(struct iser_rx_desc *desc, |
326 | unsigned long dto_xfer_len); | 328 | unsigned long dto_xfer_len, |
329 | struct iser_conn *ib_conn); | ||
327 | 330 | ||
328 | void iser_snd_completion(struct iser_desc *desc); | 331 | void iser_snd_completion(struct iser_tx_desc *desc, struct iser_conn *ib_conn); |
329 | 332 | ||
330 | void iser_task_rdma_init(struct iscsi_iser_task *task); | 333 | void iser_task_rdma_init(struct iscsi_iser_task *task); |
331 | 334 | ||
332 | void iser_task_rdma_finalize(struct iscsi_iser_task *task); | 335 | void iser_task_rdma_finalize(struct iscsi_iser_task *task); |
333 | 336 | ||
334 | void iser_dto_buffs_release(struct iser_dto *dto); | 337 | void iser_free_rx_descriptors(struct iser_conn *ib_conn); |
335 | |||
336 | int iser_regd_buff_release(struct iser_regd_buf *regd_buf); | ||
337 | |||
338 | void iser_reg_single(struct iser_device *device, | ||
339 | struct iser_regd_buf *regd_buf, | ||
340 | enum dma_data_direction direction); | ||
341 | 338 | ||
342 | void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *task, | 339 | void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *task, |
343 | enum iser_data_dir cmd_dir); | 340 | enum iser_data_dir cmd_dir); |
@@ -356,11 +353,9 @@ int iser_reg_page_vec(struct iser_conn *ib_conn, | |||
356 | 353 | ||
357 | void iser_unreg_mem(struct iser_mem_reg *mem_reg); | 354 | void iser_unreg_mem(struct iser_mem_reg *mem_reg); |
358 | 355 | ||
359 | int iser_post_recv(struct iser_desc *rx_desc); | 356 | int iser_post_recvl(struct iser_conn *ib_conn); |
360 | int iser_post_send(struct iser_desc *tx_desc); | 357 | int iser_post_recvm(struct iser_conn *ib_conn, int count); |
361 | 358 | int iser_post_send(struct iser_conn *ib_conn, struct iser_tx_desc *tx_desc); | |
362 | int iser_conn_state_comp(struct iser_conn *ib_conn, | ||
363 | enum iser_ib_conn_state comp); | ||
364 | 359 | ||
365 | int iser_dma_map_task_data(struct iscsi_iser_task *iser_task, | 360 | int iser_dma_map_task_data(struct iscsi_iser_task *iser_task, |
366 | struct iser_data_buf *data, | 361 | struct iser_data_buf *data, |
@@ -368,4 +363,6 @@ int iser_dma_map_task_data(struct iscsi_iser_task *iser_task, | |||
368 | enum dma_data_direction dma_dir); | 363 | enum dma_data_direction dma_dir); |
369 | 364 | ||
370 | void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task); | 365 | void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task); |
366 | int iser_initialize_task_headers(struct iscsi_task *task, | ||
367 | struct iser_tx_desc *tx_desc); | ||
371 | #endif | 368 | #endif |