Emulex Logo
OneCoreā„¢ Storage SDK Release 11.2
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ocs_scsi.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2015, Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  */
32 
33 /**
34  * @file
35  * OCS SCSI API declarations
36  *
37  */
38 
39 #if !defined(__OCS_SCSI_H__)
40 #define __OCS_SCSI_H__
41 
42 #include "ocs_ddump.h"
43 #include "ocs_mgmt.h"
44 
45 
46 /* ocs_scsi_rcv_cmd() ocs_scsi_rcv_tmf() flags */
47 #define OCS_SCSI_CMD_DIR_IN (1U << 0)
48 #define OCS_SCSI_CMD_DIR_OUT (1U << 1)
49 #define OCS_SCSI_CMD_SIMPLE (1U << 2)
50 #define OCS_SCSI_CMD_HEAD_OF_QUEUE (1U << 3)
51 #define OCS_SCSI_CMD_ORDERED (1U << 4)
52 #define OCS_SCSI_CMD_UNTAGGED (1U << 5)
53 #define OCS_SCSI_CMD_ACA (1U << 6)
54 #define OCS_SCSI_FIRST_BURST_ERR (1U << 7)
55 #define OCS_SCSI_FIRST_BURST_ABORTED (1U << 8)
56 
57 /* ocs_scsi_send_rd_data/recv_wr_data/send_resp flags */
58 #define OCS_SCSI_LAST_DATAPHASE (1U << 0)
59 #define OCS_SCSI_NO_AUTO_RESPONSE (1U << 1)
60 #define OCS_SCSI_LOW_LATENCY (1U << 2)
61 
62 #define OCS_SCSI_MAX_CDB_LEN 128
63 #define OCS_SCSI_SNS_BUF_VALID(sense) ((sense) && (0x70 == (((const uint8_t *)(sense))[0] & 0x70)))
64 
65 #define OCS_SCSI_WQ_STEERING_SHIFT (16)
66 #define OCS_SCSI_WQ_STEERING_MASK (0xf << OCS_SCSI_WQ_STEERING_SHIFT)
67 #define OCS_SCSI_WQ_STEERING_CLASS (0 << OCS_SCSI_WQ_STEERING_SHIFT)
68 #define OCS_SCSI_WQ_STEERING_REQUEST (1 << OCS_SCSI_WQ_STEERING_SHIFT)
69 #define OCS_SCSI_WQ_STEERING_CPU (2 << OCS_SCSI_WQ_STEERING_SHIFT)
70 
71 #define OCS_SCSI_WQ_CLASS_SHIFT (20)
72 #define OCS_SCSI_WQ_CLASS_MASK (0xf << OCS_SCSI_WQ_CLASS_SHIFT)
73 #define OCS_SCSI_WQ_CLASS(x) ((x & OCS_SCSI_WQ_CLASS_MASK) << OCS_SCSI_WQ_CLASS_SHIFT)
74 
75 #define OCS_SCSI_WQ_CLASS_LOW_LATENCY (1)
76 
77 /*!
78  * @defgroup scsi_api_base SCSI Base Target/Initiator
79  * @defgroup scsi_api_target SCSI Target
80  * @defgroup scsi_api_initiator SCSI Initiator
81  */
82 
83 /**
84  * @brief SCSI command response.
85  *
86  * This structure is used by target-servers to specify SCSI status and
87  * sense data. In this case all but the @b residual element are used. For
88  * initiator-clients, this structure is used by the SCSI API to convey the
89  * response data for issued commands, including the residual element.
90  */
91 typedef struct {
92  uint8_t scsi_status; /**< SCSI status */
93  uint16_t scsi_status_qualifier; /**< SCSI status qualifier */
94  uint8_t *response_data; /**< pointer to response data buffer */
95  uint32_t response_data_length; /**< length of response data buffer (bytes) */
96  uint8_t *sense_data; /**< pointer to sense data buffer */
97  uint32_t sense_data_length; /**< length of sense data buffer (bytes) */
98  int32_t residual; /**< command residual (not used for target), positive value
99  * indicates an underflow, negative value indicates overflow
100  */
101  uint32_t response_wire_length; /**< Command response length received in wcqe */
103 
104 /* Status values returned by IO callbacks */
105 typedef enum {
121 
123 
124 /* Callback used by send_rd_data(), recv_wr_data(), send_resp() */
125 typedef int32_t (*ocs_scsi_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, uint32_t flags,
126  void *arg);
127 
128 /* Callback used by send_rd_io(), send_wr_io() */
129 typedef int32_t (*ocs_scsi_rsp_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, ocs_scsi_cmd_resp_t *rsp,
130  uint32_t flags, void *arg);
131 
132 /* ocs_scsi_cb_t flags */
133 #define OCS_SCSI_IO_CMPL (1U << 0) /* IO completed */
134 #define OCS_SCSI_IO_CMPL_RSP_SENT (1U << 1) /* IO completed, response sent */
135 #define OCS_SCSI_IO_ABORTED (1U << 2) /* IO was aborted */
136 
137 /* ocs_scsi_recv_tmf() request values */
138 typedef enum {
148 
149 /* ocs_scsi_send_tmf_resp() response values */
150 typedef enum {
158 
159 /**
160  * @brief property names for ocs_scsi_get_property() functions
161  */
162 
163 typedef enum {
178 
179 #define DIF_SIZE 8
180 
181 /**
182  * @brief T10 DIF operations
183  *
184  * WARNING: do not reorder or insert to this list without making appropriate changes in ocs_dif.c
185  */
186 typedef enum {
198 #define OCS_SCSI_DIF_OPER_PASS_THRU OCS_SCSI_DIF_OPER_IN_CRC_OUT_CRC
199 #define OCS_SCSI_DIF_OPER_STRIP OCS_SCSI_DIF_OPER_IN_CRC_OUT_NODIF
200 #define OCS_SCSI_DIF_OPER_INSERT OCS_SCSI_DIF_OPER_IN_NODIF_OUT_CRC
201 
202 /**
203  * @brief T10 DIF block sizes
204  */
205 typedef enum {
213 
214 /**
215  * @brief generic scatter-gather list structure
216  */
217 
218 typedef struct ocs_scsi_sgl_s {
219  uintptr_t addr; /**< physical address */
220  uintptr_t dif_addr; /**< address of DIF segment, zero if DIF is interleaved */
221  size_t len; /**< length */
223 
224 
225 /**
226  * @brief T10 DIF information passed to the transport
227  */
228 
229 typedef struct {
232  uint32_t ref_tag;
233  uint32_t app_tag:16,
234  check_ref_tag:1,
235  check_app_tag:1,
236  check_guard:1,
237  dif_separate:1,
238 
239  /* If the APP TAG is 0xFFFF, disable checking the REF TAG and CRC fields */
240  disable_app_ffff:1,
241 
242  /* if the APP TAG is 0xFFFF and REF TAG is 0xFFFF_FFFF, disable checking the received CRC field. */
243  disable_app_ref_ffff:1,
244  :10;
245  uint64_t lba;
247 
248 /* Return values for calls from base driver to target-server/initiator-client */
249 #define OCS_SCSI_CALL_COMPLETE 0 // All work is done
250 #define OCS_SCSI_CALL_ASYNC 1 // Work will be completed asynchronously
251 
252 /* Calls from target/initiator to base driver */
253 
254 typedef enum {
258 
259 extern void ocs_scsi_io_alloc_enable(ocs_node_t *node);
260 extern void ocs_scsi_io_alloc_disable(ocs_node_t *node);
261 extern int32_t ocs_scsi_io_alloc_enabled(ocs_node_t *node);
262 extern ocs_io_t *ocs_scsi_io_alloc(ocs_node_t *node, ocs_scsi_io_role_e role);
263 extern void ocs_scsi_io_free(ocs_io_t *io);
264 extern ocs_io_t *ocs_io_get_instance(ocs_t *ocs, uint32_t index);
265 
266 extern void ocs_scsi_register_bounce(ocs_t *ocs, void(*fctn)(void(*fctn)(void *arg), void *arg,
267  uint32_t s_id, uint32_t d_id, uint32_t ox_id));
268 
269 /* Calls from base driver to target-server */
270 
271 extern int32_t ocs_scsi_tgt_driver_init(void);
272 extern int32_t ocs_scsi_tgt_driver_exit(void);
273 extern uint32_t ocs_scsi_tgt_io_state(ocs_io_t *io);
274 extern int32_t ocs_scsi_tgt_io_init(ocs_io_t *io);
275 extern int32_t ocs_scsi_tgt_io_exit(ocs_io_t *io);
276 extern int32_t ocs_scsi_tgt_new_device(ocs_t *ocs);
277 extern int32_t ocs_scsi_tgt_del_device(ocs_t *ocs);
278 extern int32_t ocs_scsi_tgt_new_domain(ocs_domain_t *domain);
279 extern void ocs_scsi_tgt_del_domain(ocs_domain_t *domain);
280 extern int32_t ocs_scsi_tgt_new_sport(ocs_sport_t *sport);
281 extern void ocs_scsi_tgt_del_sport(ocs_sport_t *sport);
282 extern int32_t ocs_scsi_validate_initiator(ocs_node_t *node);
283 extern int32_t ocs_scsi_new_initiator(ocs_node_t *node);
284 typedef enum {
288 extern int32_t ocs_scsi_del_initiator(ocs_node_t *node, ocs_scsi_del_initiator_reason_e reason);
289 extern int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags);
290 extern int32_t ocs_scsi_recv_cmd_first_burst(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags,
291  ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes);
292 extern int32_t ocs_scsi_recv_tmf(ocs_io_t *tmfio, uint32_t lun, ocs_scsi_tmf_cmd_e cmd, ocs_io_t *abortio,
293  uint32_t flags);
294 extern ocs_sport_t *ocs_sport_get_instance(ocs_domain_t *domain, uint32_t index);
295 extern ocs_domain_t *ocs_domain_get_instance(ocs_t *ocs, uint32_t index);
296 
297 
298 /* Calls from target-server to base driver */
299 
300 extern int32_t ocs_scsi_send_rd_data(ocs_io_t *io, uint32_t flags,
301  ocs_scsi_dif_info_t *dif_info,
302  ocs_scsi_sgl_t *sgl, uint32_t sgl_count,
303  uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg);
304 extern int32_t ocs_scsi_recv_wr_data(ocs_io_t *io, uint32_t flags,
305  ocs_scsi_dif_info_t *dif_info,
306  ocs_scsi_sgl_t *sgl, uint32_t sgl_count,
307  uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg);
308 extern int32_t ocs_scsi_send_resp(ocs_io_t *io, uint32_t flags, ocs_scsi_cmd_resp_t *rsp,
309  ocs_scsi_io_cb_t cb, void *arg);
310 extern int32_t ocs_scsi_send_tmf_resp(ocs_io_t *io, ocs_scsi_tmf_resp_e rspcode, uint8_t addl_rsp_info[3],
311  ocs_scsi_io_cb_t cb, void *arg);
312 extern int32_t ocs_scsi_tgt_abort_io(ocs_io_t *io, bool send_abts, ocs_scsi_io_cb_t cb, void *arg);
313 extern void ocs_scsi_io_complete(ocs_io_t *io);
314 extern uint32_t ocs_scsi_get_property(ocs_t *ocs, ocs_scsi_property_e prop);
315 extern void *ocs_scsi_get_property_ptr(ocs_t *ocs, ocs_scsi_property_e prop);
316 
317 extern void ocs_scsi_del_initiator_complete(ocs_node_t *node);
318 
319 extern void ocs_scsi_update_first_burst_transferred(ocs_io_t *io, uint32_t transferred);
320 
321 /* Calls from base driver to initiator-client */
322 
323 extern int32_t ocs_scsi_ini_driver_init(int32_t initiator);
324 extern int32_t ocs_scsi_ini_driver_exit(int32_t initiator);
325 extern int32_t ocs_scsi_ini_io_init(ocs_io_t *io);
326 extern int32_t ocs_scsi_ini_io_exit(ocs_io_t *io);
327 extern int32_t ocs_scsi_ini_new_device(ocs_t *ocs);
328 extern int32_t ocs_scsi_host_ml_registered(ocs_t *ocs);
329 extern int32_t ocs_scsi_ini_del_device(ocs_t *ocs);
330 extern int32_t ocs_scsi_ini_new_domain(ocs_domain_t *domain);
331 extern int32_t ocs_scsi_host_update_supported_speed(ocs_t *ocs);
332 extern void ocs_scsi_ini_del_domain(ocs_domain_t *domain);
333 extern int32_t ocs_scsi_ini_new_sport(ocs_sport_t *sport);
334 extern void ocs_scsi_ini_del_sport(ocs_sport_t *sport);
335 extern int32_t ocs_scsi_new_target(ocs_node_t *node);
336 
337 extern void ocs_get_os_host_name(ocs_t *ocs, void *os_ver_name_str, size_t size);
338 extern void
339 ocs_get_os_version_and_name(ocs_t *ocs, void *os_ver_name_str, size_t size);
340 extern void
341 ocs_scsi_get_host_name(ocs_t *ocs, void *host_name, size_t size);
342 
343 typedef enum {
347 extern int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_e reason);
348 
349 /* Calls from the initiator-client to the base driver */
350 
351 extern int32_t ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len,
352  ocs_scsi_dif_info_t *dif_info,
353  ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
354 extern int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len,
355  ocs_scsi_dif_info_t *dif_info,
356  ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
357 extern int32_t ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len,
358  ocs_scsi_dif_info_t *dif_info,
359  ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
360  ocs_scsi_rsp_io_cb_t cb, void *arg);
361 extern int32_t ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint32_t lun,
362  ocs_scsi_tmf_cmd_e tmf, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t len, ocs_scsi_rsp_io_cb_t cb, void *arg);
363 extern int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_rsp_io_cb_t cb, void *arg);
364 extern void ocs_scsi_del_target_complete(ocs_node_t *node);
365 
366 typedef enum {
373 
374 /* base driver to target/initiator */
375 
376 typedef struct {
377  void *vaddr;
378  uint32_t length;
380 extern int32_t ocs_scsi_get_block_vaddr(ocs_io_t *io, uint64_t blocknumber, ocs_scsi_vaddr_len_t addrlen[],
381  uint32_t max_addrlen, void **dif_vaddr);
382 
383 extern void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj);
384 extern void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj);
385 
386 void ocs_scsi_tgt_cancel_io(ocs_t *ocs);
387 void ocs_scsi_tgt_sess_del_wait(ocs_sport_t *sport);
388 void ocs_scsi_tgt_vport_node_shutdown(ocs_sport_t *sport);
389 void ocs_scsi_tgt_count_sessions(ocs_t *ocs, uint64_t wwpn);
390 int32_t ocs_scsi_tgt_port_online(ocs_t *ocs);
391 
392 #endif // __OCS_SCSI_H__
int32_t ocs_scsi_host_update_supported_speed(ocs_t *ocs)
Definition: ocs_ini_stub.c:175
int32_t ocs_scsi_tgt_port_online(ocs_t *ocs)
uint32_t uint64_t lba
Definition: ocs_scsi.h:233
ocs_sport_t * ocs_sport_get_instance(ocs_domain_t *domain, uint32_t index)
Return a SLI port object, given an instance index.
Definition: ocs_sport.c:336
uint8_t scsi_status
Definition: ocs_scsi.h:92
ocs_scsi_tmf_cmd_e
Definition: ocs_scsi.h:138
void ocs_scsi_tgt_vport_node_shutdown(ocs_sport_t *sport)
ocs_scsi_tmf_resp_e
Definition: ocs_scsi.h:150
int32_t ocs_scsi_tgt_io_exit(ocs_io_t *io)
Un-initialize SCSI IO.
Definition: ocs_ramd.c:450
int32_t ocs_scsi_recv_tmf(ocs_io_t *tmfio, uint32_t lun, ocs_scsi_tmf_cmd_e cmd, ocs_io_t *abortio, uint32_t flags)
Receive a TMF command IO.
Definition: ocs_ramd.c:2682
int32_t ocs_scsi_tgt_del_device(ocs_t *ocs)
Tears down the target members of the ocs structure.
Definition: ocs_ramd.c:836
int32_t ocs_scsi_tgt_new_device(ocs_t *ocs)
Initializes any target fields on the ocs structure.
Definition: ocs_ramd.c:753
int32_t ocs_scsi_tgt_driver_init(void)
Driver-wide initialization for the target-server.
Definition: ocs_ramd.c:354
int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_e reason)
Delete a SCSI target node.
Definition: ocs_ini_stub.c:258
int32_t ocs_scsi_ini_driver_init(int32_t initiator)
Initialize initiator client.
Definition: ocs_ini_stub.c:51
int32_t ocs_scsi_tgt_io_init(ocs_io_t *io)
Initialize SCSI IO.
Definition: ocs_ramd.c:433
uint32_t ocs_scsi_tgt_io_state(ocs_io_t *io)
Set SCST IO state.
Definition: ocs_ramd.c:415
T10 DIF information passed to the transport.
Definition: ocs_scsi.h:229
ocs_domain_t * ocs_domain_get_instance(ocs_t *ocs, uint32_t index)
Return a pointer to the domain, given the instance index.
Definition: ocs_domain.c:414
uintptr_t addr
Definition: ocs_scsi.h:219
ocs_scsi_dif_oper_e
T10 DIF operations.
Definition: ocs_scsi.h:186
ocs_scsi_ddump_type_e
Definition: ocs_scsi.h:366
void ocs_scsi_tgt_count_sessions(ocs_t *ocs, uint64_t wwpn)
int32_t ocs_scsi_tgt_driver_exit(void)
Driver-wide clean-up for the target-server.
Definition: ocs_ramd.c:401
ocs_scsi_dif_blk_size_e
T10 DIF block sizes.
Definition: ocs_scsi.h:205
int32_t ocs_scsi_ini_new_device(ocs_t *ocs)
Initializes any initiator fields on the ocs structure.
Definition: ocs_ini_stub.c:121
int32_t ocs_scsi_tgt_new_sport(ocs_sport_t *sport)
Accept a new SLI Port notification.
Definition: ocs_ramd.c:924
uint32_t sense_data_length
Definition: ocs_scsi.h:97
void ocs_scsi_tgt_del_domain(ocs_domain_t *domain)
Accept a domain lost notification.
Definition: ocs_ramd.c:902
generic scatter-gather list structure
Definition: ocs_scsi.h:218
int32_t(* ocs_scsi_rsp_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, ocs_scsi_cmd_resp_t *rsp, uint32_t flags, void *arg)
Definition: ocs_scsi.h:129
int32_t ocs_scsi_del_initiator(ocs_node_t *node, ocs_scsi_del_initiator_reason_e reason)
Delete a SCSI initiator node.
Definition: ocs_ramd.c:1092
void ocs_scsi_io_free(ocs_io_t *io)
Free a SCSI IO context.
Definition: ocs_scsi.c:317
int32_t ocs_scsi_ini_io_exit(ocs_io_t *io)
Uninitialize SCSI IO.
Definition: ocs_ini_stub.c:85
int32_t ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator write IO.
Definition: ocs_scsi.c:2412
ocs_scsi_del_initiator_reason_e
Definition: ocs_scsi.h:284
int32_t ocs_scsi_ini_io_init(ocs_io_t *io)
Initialize SCSI IO.
Definition: ocs_ini_stub.c:69
int32_t ocs_scsi_recv_wr_data(ocs_io_t *io, uint32_t flags, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg)
Definition: ocs_scsi.c:1639
void ocs_get_os_version_and_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
void ocs_scsi_tgt_del_sport(ocs_sport_t *sport)
Accept a SLI Port gone notification.
Definition: ocs_ramd.c:974
void ocs_scsi_io_alloc_disable(ocs_node_t *node)
Disable IO allocation.
Definition: ocs_scsi.c:144
int32_t ocs_scsi_new_target(ocs_node_t *node)
receive notification of a new SCSI target node
Definition: ocs_ini_stub.c:232
SCSI command response.
Definition: ocs_scsi.h:91
int32_t ocs_scsi_send_rd_data(ocs_io_t *io, uint32_t flags, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg)
Definition: ocs_scsi.c:1629
int32_t ocs_scsi_get_block_vaddr(ocs_io_t *io, uint64_t blocknumber, ocs_scsi_vaddr_len_t addrlen[], uint32_t max_addrlen, void **dif_vaddr)
Return address of data and DIF data given a block in the target.
Definition: ocs_ramd.c:1269
int32_t ocs_scsi_ini_new_domain(ocs_domain_t *domain)
accept new domain notification
Definition: ocs_ini_stub.c:166
void ocs_scsi_update_first_burst_transferred(ocs_io_t *io, uint32_t transferred)
Update transferred count.
Definition: ocs_scsi.c:3006
void ocs_scsi_ini_del_sport(ocs_sport_t *sport)
Definition: ocs_ini_stub.c:209
ocs_scsi_dif_blk_size_e blk_size
Definition: ocs_scsi.h:231
void ocs_scsi_register_bounce(ocs_t *ocs, void(*fctn)(void(*fctn)(void *arg), void *arg, uint32_t s_id, uint32_t d_id, uint32_t ox_id))
Register bounce callback for multi-threading.
Definition: ocs_scsi.c:3023
ocs_io_t * ocs_io_get_instance(ocs_t *ocs, uint32_t index)
Return IO context given the instance index.
Definition: ocs_io.c:366
uint32_t response_data_length
Definition: ocs_scsi.h:95
int32_t ocs_scsi_tgt_new_domain(ocs_domain_t *domain)
Accept a new domain notification.
Definition: ocs_ramd.c:880
int32_t ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator read IO.
Definition: ocs_scsi.c:2332
int32_t ocs_scsi_new_initiator(ocs_node_t *node)
Receive notification of a new SCSI initiator node.
Definition: ocs_ramd.c:1027
int32_t ocs_scsi_host_ml_registered(ocs_t *ocs)
int32_t(* ocs_scsi_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, uint32_t flags, void *arg)
Definition: ocs_scsi.h:125
ocs_scsi_io_role_e
Definition: ocs_scsi.h:254
int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags)
uint8_t * sense_data
Definition: ocs_scsi.h:96
int32_t ocs_scsi_ini_new_sport(ocs_sport_t *sport)
Definition: ocs_ini_stub.c:203
ocs_scsi_del_target_reason_e
Definition: ocs_scsi.h:343
void ocs_scsi_io_alloc_enable(ocs_node_t *node)
Enable IO allocation.
Definition: ocs_scsi.c:122
uintptr_t dif_addr
Definition: ocs_scsi.h:220
uint8_t * response_data
Definition: ocs_scsi.h:94
void ocs_scsi_tgt_cancel_io(ocs_t *ocs)
int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator SCSI command with no data.
Definition: ocs_scsi.c:2445
ocs_scsi_property_e
property names for ocs_scsi_get_property() functions
Definition: ocs_scsi.h:163
int32_t ocs_scsi_ini_driver_exit(int32_t initiator)
initiator client exit
Definition: ocs_ini_stub.c:103
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
Definition: ocs_ramd.c:6580
int32_t ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint32_t lun, ocs_scsi_tmf_cmd_e tmf, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator task management operation.
Definition: ocs_scsi.c:2482
size_t len
Definition: ocs_scsi.h:221
int32_t ocs_scsi_tgt_abort_io(ocs_io_t *io, bool send_abts, ocs_scsi_io_cb_t cb, void *arg)
Abort a target IO.
Definition: ocs_scsi.c:1989
int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator write IO.
Definition: ocs_scsi.c:2371
void ocs_scsi_ini_del_domain(ocs_domain_t *domain)
accept domain lost notification
Definition: ocs_ini_stub.c:197
int32_t residual
Definition: ocs_scsi.h:98
int32_t ocs_scsi_ini_del_device(ocs_t *ocs)
Tears down target members of ocs structure.
Definition: ocs_ini_stub.c:139
uint16_t scsi_status_qualifier
Definition: ocs_scsi.h:93
int32_t ocs_scsi_send_resp(ocs_io_t *io, uint32_t flags, ocs_scsi_cmd_resp_t *rsp, ocs_scsi_io_cb_t cb, void *arg)
Send response data.
Definition: ocs_scsi.c:1688
void ocs_scsi_tgt_sess_del_wait(ocs_sport_t *sport)
int32_t ocs_scsi_validate_initiator(ocs_node_t *node)
Validate a new initiator.
Definition: ocs_ramd.c:1002
void ocs_scsi_del_initiator_complete(ocs_node_t *node)
Notify that delete initiator is complete.
Definition: ocs_scsi.c:2964
uint32_t response_wire_length
Definition: ocs_scsi.h:101
void ocs_scsi_get_host_name(ocs_t *ocs, void *host_name, size_t size)
uint32_t ref_tag
Definition: ocs_scsi.h:232
int32_t ocs_scsi_send_tmf_resp(ocs_io_t *io, ocs_scsi_tmf_resp_e rspcode, uint8_t addl_rsp_info[3], ocs_scsi_io_cb_t cb, void *arg)
Send TMF response data.
Definition: ocs_scsi.c:1815
ocs_io_t * ocs_scsi_io_alloc(ocs_node_t *node, ocs_scsi_io_role_e role)
Allocate a SCSI IO context.
Definition: ocs_scsi.c:192
ocs_scsi_io_status_e
Definition: ocs_scsi.h:105
int32_t ocs_scsi_recv_cmd_first_burst(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags, ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes)
Receive an FCP SCSI command with the first burst data.
Definition: ocs_ramd.c:1230
void * ocs_scsi_get_property_ptr(ocs_t *ocs, ocs_scsi_property_e prop)
Return a property pointer.
Definition: ocs_scsi.c:2871
void ocs_get_os_host_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
void ocs_scsi_del_target_complete(ocs_node_t *node)
Notify that delete target is complete.
Definition: ocs_scsi.c:2985
ocs_scsi_dif_oper_e dif_oper
Definition: ocs_scsi.h:230
int32_t ocs_scsi_io_alloc_enabled(ocs_node_t *node)
Get state of IO allocation.
Definition: ocs_scsi.c:160
uint32_t ocs_scsi_get_property(ocs_t *ocs, ocs_scsi_property_e prop)
Return SCSI API integer valued property.
Definition: ocs_scsi.c:2799
void ocs_scsi_io_complete(ocs_io_t *io)
Notify the base driver that the IO is complete.
Definition: ocs_scsi.c:2158
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
Definition: ocs_ini_stub.c:266