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