xref: /freebsd/sys/dev/ocs_fc/ocs_scsi.h (revision 95ee2897)
1ef270ab1SKenneth D. Merry /*-
2ef270ab1SKenneth D. Merry  * Copyright (c) 2017 Broadcom. All rights reserved.
3ef270ab1SKenneth D. Merry  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4ef270ab1SKenneth D. Merry  *
5ef270ab1SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6ef270ab1SKenneth D. Merry  * modification, are permitted provided that the following conditions are met:
7ef270ab1SKenneth D. Merry  *
8ef270ab1SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright notice,
9ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer.
10ef270ab1SKenneth D. Merry  *
11ef270ab1SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright notice,
12ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer in the documentation
13ef270ab1SKenneth D. Merry  *    and/or other materials provided with the distribution.
14ef270ab1SKenneth D. Merry  *
15ef270ab1SKenneth D. Merry  * 3. Neither the name of the copyright holder nor the names of its contributors
16ef270ab1SKenneth D. Merry  *    may be used to endorse or promote products derived from this software
17ef270ab1SKenneth D. Merry  *    without specific prior written permission.
18ef270ab1SKenneth D. Merry  *
19ef270ab1SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20ef270ab1SKenneth D. Merry  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21ef270ab1SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22ef270ab1SKenneth D. Merry  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23ef270ab1SKenneth D. Merry  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24ef270ab1SKenneth D. Merry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25ef270ab1SKenneth D. Merry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26ef270ab1SKenneth D. Merry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27ef270ab1SKenneth D. Merry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28ef270ab1SKenneth D. Merry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29ef270ab1SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGE.
30ef270ab1SKenneth D. Merry  */
31ef270ab1SKenneth D. Merry 
32ef270ab1SKenneth D. Merry /**
33ef270ab1SKenneth D. Merry  * @file
34ef270ab1SKenneth D. Merry  * OCS SCSI API declarations
35ef270ab1SKenneth D. Merry  *
36ef270ab1SKenneth D. Merry  */
37ef270ab1SKenneth D. Merry 
38ef270ab1SKenneth D. Merry #if !defined(__OCS_SCSI_H__)
39ef270ab1SKenneth D. Merry #define __OCS_SCSI_H__
40ef270ab1SKenneth D. Merry 
41ef270ab1SKenneth D. Merry #include "ocs_ddump.h"
42ef270ab1SKenneth D. Merry #include "ocs_mgmt.h"
43ef270ab1SKenneth D. Merry #include "ocs_utils.h"
44ef270ab1SKenneth D. Merry 
45ef270ab1SKenneth D. Merry /* ocs_scsi_rcv_cmd() ocs_scsi_rcv_tmf() flags */
46ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_DIR_IN		(1U << 0)
47ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_DIR_OUT		(1U << 1)
48ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_SIMPLE		(1U << 2)
49ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_HEAD_OF_QUEUE	(1U << 3)
50ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_ORDERED		(1U << 4)
51ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_UNTAGGED		(1U << 5)
52ef270ab1SKenneth D. Merry #define OCS_SCSI_CMD_ACA		(1U << 6)
53ef270ab1SKenneth D. Merry #define OCS_SCSI_FIRST_BURST_ERR	(1U << 7)
54ef270ab1SKenneth D. Merry #define OCS_SCSI_FIRST_BURST_ABORTED	(1U << 8)
5588364968SAlexander Motin #define OCS_SCSI_PRIORITY_MASK		0xf0000
5688364968SAlexander Motin #define OCS_SCSI_PRIORITY_SHIFT		16
57ef270ab1SKenneth D. Merry 
58ef270ab1SKenneth D. Merry /* ocs_scsi_send_rd_data/recv_wr_data/send_resp flags */
59ef270ab1SKenneth D. Merry #define OCS_SCSI_LAST_DATAPHASE		(1U << 0)
60ef270ab1SKenneth D. Merry #define OCS_SCSI_NO_AUTO_RESPONSE	(1U << 1)
61ef270ab1SKenneth D. Merry #define OCS_SCSI_LOW_LATENCY		(1U << 2)
62ef270ab1SKenneth D. Merry 
63ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_STEERING_SHIFT	(16)
64ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_STEERING_MASK	(0xf << OCS_SCSI_WQ_STEERING_SHIFT)
65ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_STEERING_CLASS	(0 << OCS_SCSI_WQ_STEERING_SHIFT)
66ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_STEERING_REQUEST	(1 << OCS_SCSI_WQ_STEERING_SHIFT)
67ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_STEERING_CPU	(2 << OCS_SCSI_WQ_STEERING_SHIFT)
68ef270ab1SKenneth D. Merry 
69ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_CLASS_SHIFT		(20)
70ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_CLASS_MASK		(0xf << OCS_SCSI_WQ_CLASS_SHIFT)
71ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_CLASS(x)		((x & OCS_SCSI_WQ_CLASS_MASK) << OCS_SCSI_WQ_CLASS_SHIFT)
72ef270ab1SKenneth D. Merry 
73ef270ab1SKenneth D. Merry #define OCS_SCSI_WQ_CLASS_LOW_LATENCY	(1)
74ef270ab1SKenneth D. Merry 
75ef270ab1SKenneth D. Merry /*!
76ef270ab1SKenneth D. Merry  * @defgroup scsi_api_base SCSI Base Target/Initiator
77ef270ab1SKenneth D. Merry  * @defgroup scsi_api_target SCSI Target
78ef270ab1SKenneth D. Merry  * @defgroup scsi_api_initiator SCSI Initiator
79ef270ab1SKenneth D. Merry  */
80ef270ab1SKenneth D. Merry 
81ef270ab1SKenneth D. Merry /**
82ef270ab1SKenneth D. Merry  * @brief SCSI command response.
83ef270ab1SKenneth D. Merry  *
84ef270ab1SKenneth D. Merry  * This structure is used by target-servers to specify SCSI status and
85ef270ab1SKenneth D. Merry  * sense data.  In this case all but the @b residual element are used. For
86ef270ab1SKenneth D. Merry  * initiator-clients, this structure is used by the SCSI API to convey the
87ef270ab1SKenneth D. Merry  * response data for issued commands, including the residual element.
88ef270ab1SKenneth D. Merry  */
89ef270ab1SKenneth D. Merry typedef struct {
90ef270ab1SKenneth D. Merry 	uint8_t scsi_status;			/**< SCSI status */
91ef270ab1SKenneth D. Merry 	uint16_t scsi_status_qualifier;		/**< SCSI status qualifier */
92ef270ab1SKenneth D. Merry 	uint8_t *response_data;			/**< pointer to response data buffer */
93ef270ab1SKenneth D. Merry 	uint32_t response_data_length;		/**< length of response data buffer (bytes) */
94ef270ab1SKenneth D. Merry 	uint8_t *sense_data;			/**< pointer to sense data buffer */
95ef270ab1SKenneth D. Merry 	uint32_t sense_data_length;		/**< length of sense data buffer (bytes) */
96ef270ab1SKenneth D. Merry 	int32_t residual;			/**< command residual (not used for target), positive value
97ef270ab1SKenneth D. Merry 						  *  indicates an underflow, negative value indicates overflow
98ef270ab1SKenneth D. Merry 						  */
99ef270ab1SKenneth D. Merry 	uint32_t response_wire_length;		/**< Command response length received in wcqe */
100ef270ab1SKenneth D. Merry } ocs_scsi_cmd_resp_t;
101ef270ab1SKenneth D. Merry 
102ef270ab1SKenneth D. Merry /* Status values returned by IO callbacks */
103ef270ab1SKenneth D. Merry typedef enum {
104ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_GOOD = 0,
105ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_ABORTED,
106ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_ERROR,
107ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_DIF_GUARD_ERROR,
108ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_DIF_REF_TAG_ERROR,
109ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_DIF_APP_TAG_ERROR,
110ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_DIF_UNKNOWN_ERROR,
111ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_PROTOCOL_CRC_ERROR,
112ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_NO_IO,
113ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_ABORT_IN_PROGRESS,
114ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_CHECK_RESPONSE,
115ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_COMMAND_TIMEOUT,
116ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_TIMEDOUT_AND_ABORTED,
117ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_SHUTDOWN,
118ef270ab1SKenneth D. Merry 	OCS_SCSI_STATUS_NEXUS_LOST,
119ef270ab1SKenneth D. Merry 
120ef270ab1SKenneth D. Merry } ocs_scsi_io_status_e;
121ef270ab1SKenneth D. Merry 
122ef270ab1SKenneth D. Merry /* SCSI command status */
123ef270ab1SKenneth D. Merry #define SCSI_STATUS_GOOD				0x00
124ef270ab1SKenneth D. Merry #define SCSI_STATUS_CHECK_CONDITION			0x02
125ef270ab1SKenneth D. Merry #define SCSI_STATUS_CONDITION_MET			0x04
126ef270ab1SKenneth D. Merry #define SCSI_STATUS_BUSY				0x08
127ef270ab1SKenneth D. Merry #define SCSI_STATUS_RESERVATION_CONFLICT		0x18
128ef270ab1SKenneth D. Merry #define SCSI_STATUS_TASK_SET_FULL			0x28
129ef270ab1SKenneth D. Merry #define SCSI_STATUS_ACA_ACTIVE				0x30
130ef270ab1SKenneth D. Merry #define SCSI_STATUS_TASK_ABORTED			0x40
131ef270ab1SKenneth D. Merry 
132ef270ab1SKenneth D. Merry /* Callback used by send_rd_data(), recv_wr_data(), send_resp() */
133ef270ab1SKenneth D. Merry typedef int32_t (*ocs_scsi_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, uint32_t flags,
134ef270ab1SKenneth D. Merry 	void *arg);
135ef270ab1SKenneth D. Merry 
136ef270ab1SKenneth D. Merry /* Callback used by send_rd_io(), send_wr_io() */
137ef270ab1SKenneth D. Merry 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,
138ef270ab1SKenneth D. Merry 	uint32_t flags, void *arg);
139ef270ab1SKenneth D. Merry 
140ef270ab1SKenneth D. Merry /* ocs_scsi_cb_t flags */
141ef270ab1SKenneth D. Merry #define OCS_SCSI_IO_CMPL		(1U << 0)	/* IO completed */
142ef270ab1SKenneth D. Merry #define OCS_SCSI_IO_CMPL_RSP_SENT	(1U << 1)	/* IO completed, response sent */
143ef270ab1SKenneth D. Merry #define OCS_SCSI_IO_ABORTED		(1U << 2)	/* IO was aborted */
144ef270ab1SKenneth D. Merry 
145ef270ab1SKenneth D. Merry /* ocs_scsi_recv_tmf() request values */
146ef270ab1SKenneth D. Merry typedef enum {
147ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_ABORT_TASK = 1,
148ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_QUERY_TASK_SET,
149ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_ABORT_TASK_SET,
150ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_CLEAR_TASK_SET,
151ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_QUERY_ASYNCHRONOUS_EVENT,
152ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_LOGICAL_UNIT_RESET,
153ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_CLEAR_ACA,
154ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_TARGET_RESET,
155ef270ab1SKenneth D. Merry } ocs_scsi_tmf_cmd_e;
156ef270ab1SKenneth D. Merry 
157ef270ab1SKenneth D. Merry /* ocs_scsi_send_tmf_resp() response values */
158ef270ab1SKenneth D. Merry typedef enum {
159ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_FUNCTION_COMPLETE = 1,
160ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_FUNCTION_SUCCEEDED,
161ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_FUNCTION_IO_NOT_FOUND,
162ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_FUNCTION_REJECTED,
163ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER,
164ef270ab1SKenneth D. Merry 	OCS_SCSI_TMF_SERVICE_DELIVERY,
165ef270ab1SKenneth D. Merry } ocs_scsi_tmf_resp_e;
166ef270ab1SKenneth D. Merry 
167ef270ab1SKenneth D. Merry /**
168ef270ab1SKenneth D. Merry  * @brief property names for ocs_scsi_get_property() functions
169ef270ab1SKenneth D. Merry  */
170ef270ab1SKenneth D. Merry 
171ef270ab1SKenneth D. Merry typedef enum {
172ef270ab1SKenneth D. Merry 	OCS_SCSI_MAX_SGE,
173ef270ab1SKenneth D. Merry 	OCS_SCSI_MAX_SGL,
174ef270ab1SKenneth D. Merry 	OCS_SCSI_WWNN,
175ef270ab1SKenneth D. Merry 	OCS_SCSI_WWPN,
176ef270ab1SKenneth D. Merry 	OCS_SCSI_SERIALNUMBER,
177ef270ab1SKenneth D. Merry 	OCS_SCSI_PARTNUMBER,
178ef270ab1SKenneth D. Merry 	OCS_SCSI_PORTNUM,
179ef270ab1SKenneth D. Merry 	OCS_SCSI_BIOS_VERSION_STRING,
180ef270ab1SKenneth D. Merry 	OCS_SCSI_MAX_IOS,
181ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_CAPABLE,
182ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_MULTI_SEPARATE,
183ef270ab1SKenneth D. Merry 	OCS_SCSI_MAX_FIRST_BURST,
184ef270ab1SKenneth D. Merry 	OCS_SCSI_ENABLE_TASK_SET_FULL,
185ef270ab1SKenneth D. Merry } ocs_scsi_property_e;
186ef270ab1SKenneth D. Merry 
187ef270ab1SKenneth D. Merry #define DIF_SIZE		8
188ef270ab1SKenneth D. Merry 
189ef270ab1SKenneth D. Merry /**
190ef270ab1SKenneth D. Merry  * @brief T10 DIF operations
191ef270ab1SKenneth D. Merry  *
192ef270ab1SKenneth D. Merry  *	WARNING: do not reorder or insert to this list without making appropriate changes in ocs_dif.c
193ef270ab1SKenneth D. Merry  */
194ef270ab1SKenneth D. Merry typedef enum {
195ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_DISABLED,
196ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_NODIF_OUT_CRC,
197ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CRC_OUT_NODIF,
198ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_NODIF_OUT_CHKSUM,
199ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CHKSUM_OUT_NODIF,
200ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CRC_OUT_CRC,
201ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CHKSUM_OUT_CHKSUM,
202ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CRC_OUT_CHKSUM,
203ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_CHKSUM_OUT_CRC,
204ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_OPER_IN_RAW_OUT_RAW,
205ef270ab1SKenneth D. Merry } ocs_scsi_dif_oper_e;
206ef270ab1SKenneth D. Merry #define OCS_SCSI_DIF_OPER_PASS_THRU	OCS_SCSI_DIF_OPER_IN_CRC_OUT_CRC
207ef270ab1SKenneth D. Merry #define OCS_SCSI_DIF_OPER_STRIP		OCS_SCSI_DIF_OPER_IN_CRC_OUT_NODIF
208ef270ab1SKenneth D. Merry #define OCS_SCSI_DIF_OPER_INSERT	OCS_SCSI_DIF_OPER_IN_NODIF_OUT_CRC
209ef270ab1SKenneth D. Merry 
210ef270ab1SKenneth D. Merry /**
211ef270ab1SKenneth D. Merry  * @brief T10 DIF block sizes
212ef270ab1SKenneth D. Merry  */
213ef270ab1SKenneth D. Merry typedef enum {
214ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_512,
215ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_1024,
216ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_2048,
217ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_4096,
218ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_520,
219ef270ab1SKenneth D. Merry 	OCS_SCSI_DIF_BK_SIZE_4104
220ef270ab1SKenneth D. Merry } ocs_scsi_dif_blk_size_e;
221ef270ab1SKenneth D. Merry 
222ef270ab1SKenneth D. Merry /**
223ef270ab1SKenneth D. Merry  * @brief generic scatter-gather list structure
224ef270ab1SKenneth D. Merry  */
225ef270ab1SKenneth D. Merry 
226ef270ab1SKenneth D. Merry typedef struct ocs_scsi_sgl_s {
227ef270ab1SKenneth D. Merry 	uintptr_t	addr;			/**< physical address */
228ef270ab1SKenneth D. Merry 	uintptr_t	dif_addr;		/**< address of DIF segment, zero if DIF is interleaved */
229ef270ab1SKenneth D. Merry 	size_t		len;			/**< length */
230ef270ab1SKenneth D. Merry } ocs_scsi_sgl_t;
231ef270ab1SKenneth D. Merry 
232ef270ab1SKenneth D. Merry /**
233ef270ab1SKenneth D. Merry  * @brief T10 DIF information passed to the transport
234ef270ab1SKenneth D. Merry  */
235ef270ab1SKenneth D. Merry 
236ef270ab1SKenneth D. Merry typedef struct ocs_scsi_dif_info_s {
237ef270ab1SKenneth D. Merry 	ocs_scsi_dif_oper_e dif_oper;
238ef270ab1SKenneth D. Merry 	ocs_scsi_dif_blk_size_e blk_size;
239ef270ab1SKenneth D. Merry 	uint32_t ref_tag;
240ef270ab1SKenneth D. Merry 	uint32_t app_tag:16,
241ef270ab1SKenneth D. Merry 		check_ref_tag:1,
242ef270ab1SKenneth D. Merry 		check_app_tag:1,
243ef270ab1SKenneth D. Merry 		check_guard:1,
244ef270ab1SKenneth D. Merry 		dif_separate:1,
245ef270ab1SKenneth D. Merry 
246ef270ab1SKenneth D. Merry 		/* If the APP TAG is 0xFFFF, disable checking the REF TAG and CRC fields */
247ef270ab1SKenneth D. Merry 		disable_app_ffff:1,
248ef270ab1SKenneth D. Merry 
249ef270ab1SKenneth D. Merry 		/* if the APP TAG is 0xFFFF and REF TAG is 0xFFFF_FFFF, disable checking the received CRC field. */
250ef270ab1SKenneth D. Merry 		disable_app_ref_ffff:1,
251ef270ab1SKenneth D. Merry 		:10;
252ef270ab1SKenneth D. Merry 	uint64_t lba;
253ef270ab1SKenneth D. Merry } ocs_scsi_dif_info_t;
254ef270ab1SKenneth D. Merry 
255ef270ab1SKenneth D. Merry /* Return values for calls from base driver to target-server/initiator-client */
256ef270ab1SKenneth D. Merry #define OCS_SCSI_CALL_COMPLETE	0 /* All work is done */
257ef270ab1SKenneth D. Merry #define OCS_SCSI_CALL_ASYNC	1 /* Work will be completed asynchronously */
258ef270ab1SKenneth D. Merry 
259ef270ab1SKenneth D. Merry /* Calls from target/initiator to base driver */
260ef270ab1SKenneth D. Merry 
261ef270ab1SKenneth D. Merry typedef enum {
262ef270ab1SKenneth D. Merry 	OCS_SCSI_IO_ROLE_ORIGINATOR,
263ef270ab1SKenneth D. Merry 	OCS_SCSI_IO_ROLE_RESPONDER,
264ef270ab1SKenneth D. Merry } ocs_scsi_io_role_e;
265ef270ab1SKenneth D. Merry 
266ef270ab1SKenneth D. Merry extern void ocs_scsi_io_alloc_enable(ocs_node_t *node);
267ef270ab1SKenneth D. Merry extern void ocs_scsi_io_alloc_disable(ocs_node_t *node);
268ef270ab1SKenneth D. Merry extern ocs_io_t *ocs_scsi_io_alloc(ocs_node_t *node, ocs_scsi_io_role_e role);
269ef270ab1SKenneth D. Merry extern void ocs_scsi_io_free(ocs_io_t *io);
270ef270ab1SKenneth D. Merry extern ocs_io_t *ocs_io_get_instance(ocs_t *ocs, uint32_t index);
271ef270ab1SKenneth D. Merry 
272ef270ab1SKenneth D. Merry extern void ocs_scsi_register_bounce(ocs_t *ocs, void(*fctn)(void(*fctn)(void *arg), void *arg,
273ef270ab1SKenneth D. Merry 							     uint32_t s_id, uint32_t d_id, uint32_t ox_id));
274ef270ab1SKenneth D. Merry 
275ef270ab1SKenneth D. Merry /* Calls from base driver to target-server */
276ef270ab1SKenneth D. Merry 
277ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_driver_init(void);
278ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_driver_exit(void);
279ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_io_init(ocs_io_t *io);
280ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_io_exit(ocs_io_t *io);
281ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_new_device(ocs_t *ocs);
282ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_del_device(ocs_t *ocs);
283ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_new_domain(ocs_domain_t *domain);
284ef270ab1SKenneth D. Merry extern void ocs_scsi_tgt_del_domain(ocs_domain_t *domain);
285ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_new_sport(ocs_sport_t *sport);
286ef270ab1SKenneth D. Merry extern void ocs_scsi_tgt_del_sport(ocs_sport_t *sport);
287ef270ab1SKenneth D. Merry extern void ocs_scsi_sport_deleted(ocs_sport_t *sport);
288ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_validate_initiator(ocs_node_t *node);
289ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_new_initiator(ocs_node_t *node);
290ef270ab1SKenneth D. Merry typedef enum {
291ef270ab1SKenneth D. Merry 	OCS_SCSI_INITIATOR_DELETED,
292ef270ab1SKenneth D. Merry 	OCS_SCSI_INITIATOR_MISSING,
293ef270ab1SKenneth D. Merry } ocs_scsi_del_initiator_reason_e;
294ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_del_initiator(ocs_node_t *node, ocs_scsi_del_initiator_reason_e reason);
295ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint64_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags);
296ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_recv_cmd_first_burst(ocs_io_t *io, uint64_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags,
297ef270ab1SKenneth D. Merry 	ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes);
298ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_recv_tmf(ocs_io_t *tmfio, uint64_t lun, ocs_scsi_tmf_cmd_e cmd, ocs_io_t *abortio,
299ef270ab1SKenneth D. Merry 	uint32_t flags);
300ef270ab1SKenneth D. Merry extern ocs_sport_t *ocs_sport_get_instance(ocs_domain_t *domain, uint32_t index);
301ef270ab1SKenneth D. Merry extern ocs_domain_t *ocs_domain_get_instance(ocs_t *ocs, uint32_t index);
302ef270ab1SKenneth D. Merry 
303ef270ab1SKenneth D. Merry /* Calls from target-server to base driver */
304ef270ab1SKenneth D. Merry 
305ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_rd_data(ocs_io_t *io, uint32_t flags,
306ef270ab1SKenneth D. Merry 	ocs_scsi_dif_info_t *dif_info,
307ef270ab1SKenneth D. Merry 	ocs_scsi_sgl_t *sgl, uint32_t sgl_count,
308ef270ab1SKenneth D. Merry 	uint32_t wire_len, ocs_scsi_io_cb_t cb, void *arg);
309ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_recv_wr_data(ocs_io_t *io, uint32_t flags,
310ef270ab1SKenneth D. Merry 	ocs_scsi_dif_info_t *dif_info,
311ef270ab1SKenneth D. Merry 	ocs_scsi_sgl_t *sgl, uint32_t sgl_count,
312ef270ab1SKenneth D. Merry 	uint32_t wire_len, ocs_scsi_io_cb_t cb, void *arg);
313ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_resp(ocs_io_t *io, uint32_t flags, ocs_scsi_cmd_resp_t *rsp,
314ef270ab1SKenneth D. Merry 		ocs_scsi_io_cb_t cb, void *arg);
315ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_tmf_resp(ocs_io_t *io, ocs_scsi_tmf_resp_e rspcode, uint8_t addl_rsp_info[3],
316ef270ab1SKenneth D. Merry 		ocs_scsi_io_cb_t cb, void *arg);
317ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_tgt_abort_io(ocs_io_t *io, ocs_scsi_io_cb_t cb, void *arg);
318ef270ab1SKenneth D. Merry extern void ocs_scsi_io_complete(ocs_io_t *io);
319ef270ab1SKenneth D. Merry extern uint32_t ocs_scsi_get_property(ocs_t *ocs, ocs_scsi_property_e prop);
320ef270ab1SKenneth D. Merry extern void *ocs_scsi_get_property_ptr(ocs_t *ocs, ocs_scsi_property_e prop);
321ef270ab1SKenneth D. Merry 
322ef270ab1SKenneth D. Merry extern void ocs_scsi_del_initiator_complete(ocs_node_t *node);
323ef270ab1SKenneth D. Merry 
324ef270ab1SKenneth D. Merry extern void ocs_scsi_update_first_burst_transferred(ocs_io_t *io, uint32_t transferred);
325ef270ab1SKenneth D. Merry 
326ef270ab1SKenneth D. Merry /* Calls from base driver to initiator-client */
327ef270ab1SKenneth D. Merry 
328ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_driver_init(void);
329ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_driver_exit(void);
330ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_io_init(ocs_io_t *io);
331ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_io_exit(ocs_io_t *io);
332ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_new_device(ocs_t *ocs);
333ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_del_device(ocs_t *ocs);
334ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_new_domain(ocs_domain_t *domain);
335ef270ab1SKenneth D. Merry extern void ocs_scsi_ini_del_domain(ocs_domain_t *domain);
336ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_ini_new_sport(ocs_sport_t *sport);
337ef270ab1SKenneth D. Merry extern void ocs_scsi_ini_del_sport(ocs_sport_t *sport);
338ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_new_target(ocs_node_t *node);
339ef270ab1SKenneth D. Merry 
340ef270ab1SKenneth D. Merry typedef enum {
341ef270ab1SKenneth D. Merry 	OCS_SCSI_TARGET_DELETED,
342ef270ab1SKenneth D. Merry 	OCS_SCSI_TARGET_MISSING,
343ef270ab1SKenneth D. Merry } ocs_scsi_del_target_reason_e;
344ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_e reason);
345ef270ab1SKenneth D. Merry 
346ef270ab1SKenneth D. Merry /* Calls from the initiator-client to the base driver */
347ef270ab1SKenneth D. Merry 
348ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
349ef270ab1SKenneth D. Merry 	ocs_scsi_dif_info_t *dif_info,
35088364968SAlexander Motin 	ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
351ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
352ef270ab1SKenneth D. Merry 	ocs_scsi_dif_info_t *dif_info,
35388364968SAlexander Motin 	ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
354ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
355ef270ab1SKenneth D. Merry 	ocs_scsi_dif_info_t *dif_info,
356ef270ab1SKenneth D. Merry 	ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
35788364968SAlexander Motin 	ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
358ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint64_t lun,
359ef270ab1SKenneth D. Merry 	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);
36088364968SAlexander Motin extern int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint64_t lun, void *cdb, uint32_t cdb_len,
36188364968SAlexander Motin 	ocs_scsi_rsp_io_cb_t cb, void *arg, uint32_t flags);
362ef270ab1SKenneth D. Merry extern void ocs_scsi_del_target_complete(ocs_node_t *node);
363ef270ab1SKenneth D. Merry 
364ef270ab1SKenneth D. Merry typedef enum {
365ef270ab1SKenneth D. Merry 	OCS_SCSI_DDUMP_DEVICE,
366ef270ab1SKenneth D. Merry 	OCS_SCSI_DDUMP_DOMAIN,
367ef270ab1SKenneth D. Merry 	OCS_SCSI_DDUMP_SPORT,
368ef270ab1SKenneth D. Merry 	OCS_SCSI_DDUMP_NODE,
369ef270ab1SKenneth D. Merry 	OCS_SCSI_DDUMP_IO,
370ef270ab1SKenneth D. Merry } ocs_scsi_ddump_type_e;
371ef270ab1SKenneth D. Merry 
372ef270ab1SKenneth D. Merry /* base driver to target/initiator */
373ef270ab1SKenneth D. Merry 
374ef270ab1SKenneth D. Merry struct ocs_scsi_vaddr_len_s {
375ef270ab1SKenneth D. Merry 	void *vaddr;
376ef270ab1SKenneth D. Merry 	uint32_t length;
377ef270ab1SKenneth D. Merry } ;
378ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_get_block_vaddr(ocs_io_t *io, uint64_t blocknumber, ocs_scsi_vaddr_len_t addrlen[],
379ef270ab1SKenneth D. Merry 	uint32_t max_addrlen, void **dif_vaddr);
380ef270ab1SKenneth D. Merry 
381ef270ab1SKenneth D. Merry extern void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj);
382ef270ab1SKenneth D. Merry extern void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj);
383ef270ab1SKenneth D. Merry 
384ef270ab1SKenneth D. Merry /* Calls within base driver */
385ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_io_dispatch(ocs_io_t *io, void *cb);
386ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_io_dispatch_abort(ocs_io_t *io, void *cb);
387ef270ab1SKenneth D. Merry extern void ocs_scsi_check_pending(ocs_t *ocs);
388ef270ab1SKenneth D. Merry 
389ef270ab1SKenneth D. Merry extern uint32_t ocs_scsi_dif_blocksize(ocs_scsi_dif_info_t *dif_info);
390ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_dif_set_blocksize(ocs_scsi_dif_info_t *dif_info, uint32_t blocksize);
391ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_dif_mem_blocksize(ocs_scsi_dif_info_t *dif_info, int wiretomem);
392ef270ab1SKenneth D. Merry extern int32_t ocs_scsi_dif_wire_blocksize(ocs_scsi_dif_info_t *dif_info, int wiretomem);
393ef270ab1SKenneth D. Merry 
394ef270ab1SKenneth D. Merry uint32_t ocs_get_crn(ocs_node_t *node, uint8_t *crn, uint64_t lun);
395ef270ab1SKenneth D. Merry void ocs_del_crn(ocs_node_t *node);
396ef270ab1SKenneth D. Merry void ocs_reset_crn(ocs_node_t *node, uint64_t lun);
397ef270ab1SKenneth D. Merry 
398ef270ab1SKenneth D. Merry /**
399ef270ab1SKenneth D. Merry  * @brief Notification from base driver that domain is in force-free path.
400ef270ab1SKenneth D. Merry  *
401ef270ab1SKenneth D. Merry  * @par Description Domain is forcefully going away.  Cleanup any resources associated with it.
402ef270ab1SKenneth D. Merry  *
403ef270ab1SKenneth D. Merry  * @param domain Pointer to domain being free'd.
404ef270ab1SKenneth D. Merry  *
405ef270ab1SKenneth D. Merry  * @return None.
406ef270ab1SKenneth D. Merry  */
407ef270ab1SKenneth D. Merry 
408ef270ab1SKenneth D. Merry static inline void
ocs_scsi_notify_domain_force_free(ocs_domain_t * domain)409ef270ab1SKenneth D. Merry ocs_scsi_notify_domain_force_free(ocs_domain_t *domain)
410ef270ab1SKenneth D. Merry {
411ef270ab1SKenneth D. Merry 	/* Nothing to do */
412ef270ab1SKenneth D. Merry 	return;
413ef270ab1SKenneth D. Merry }
414ef270ab1SKenneth D. Merry 
415ef270ab1SKenneth D. Merry /**
416ef270ab1SKenneth D. Merry  * @brief Notification from base driver that sport is in force-free path.
417ef270ab1SKenneth D. Merry  *
418ef270ab1SKenneth D. Merry  * @par Description Sport is forcefully going away.  Cleanup any resources associated with it.
419ef270ab1SKenneth D. Merry  *
420ef270ab1SKenneth D. Merry  * @param sport Pointer to sport being free'd.
421ef270ab1SKenneth D. Merry  *
422ef270ab1SKenneth D. Merry  * @return None.
423ef270ab1SKenneth D. Merry  */
424ef270ab1SKenneth D. Merry 
425ef270ab1SKenneth D. Merry static inline void
ocs_scsi_notify_sport_force_free(ocs_sport_t * sport)426ef270ab1SKenneth D. Merry ocs_scsi_notify_sport_force_free(ocs_sport_t *sport)
427ef270ab1SKenneth D. Merry {
428ef270ab1SKenneth D. Merry 	/* Nothing to do */
429ef270ab1SKenneth D. Merry 	return;
430ef270ab1SKenneth D. Merry }
431ef270ab1SKenneth D. Merry 
432ef270ab1SKenneth D. Merry /**
433ef270ab1SKenneth D. Merry  * @brief Notification from base driver that node is in force-free path.
434ef270ab1SKenneth D. Merry  *
435ef270ab1SKenneth D. Merry  * @par Description Node is forcefully going away.  Cleanup any resources associated with it.
436ef270ab1SKenneth D. Merry  *
437ef270ab1SKenneth D. Merry  * @param node Pointer to node being free'd.
438ef270ab1SKenneth D. Merry  *
439ef270ab1SKenneth D. Merry  * @return None.
440ef270ab1SKenneth D. Merry  */
441ef270ab1SKenneth D. Merry 
442ef270ab1SKenneth D. Merry static inline void
ocs_scsi_notify_node_force_free(ocs_node_t * node)443ef270ab1SKenneth D. Merry ocs_scsi_notify_node_force_free(ocs_node_t *node)
444ef270ab1SKenneth D. Merry {
445ef270ab1SKenneth D. Merry 	/* Nothing to do */
446ef270ab1SKenneth D. Merry 	return;
447ef270ab1SKenneth D. Merry }
448ef270ab1SKenneth D. Merry #endif /* __OCS_SCSI_H__ */
449