xref: /freebsd/sys/dev/ocs_fc/ocs_utils.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*ef270ab1SKenneth D. Merry /*-
2*ef270ab1SKenneth D. Merry  * Copyright (c) 2017 Broadcom. All rights reserved.
3*ef270ab1SKenneth D. Merry  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4*ef270ab1SKenneth D. Merry  *
5*ef270ab1SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6*ef270ab1SKenneth D. Merry  * modification, are permitted provided that the following conditions are met:
7*ef270ab1SKenneth D. Merry  *
8*ef270ab1SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright notice,
9*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer.
10*ef270ab1SKenneth D. Merry  *
11*ef270ab1SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer in the documentation
13*ef270ab1SKenneth D. Merry  *    and/or other materials provided with the distribution.
14*ef270ab1SKenneth D. Merry  *
15*ef270ab1SKenneth D. Merry  * 3. Neither the name of the copyright holder nor the names of its contributors
16*ef270ab1SKenneth D. Merry  *    may be used to endorse or promote products derived from this software
17*ef270ab1SKenneth D. Merry  *    without specific prior written permission.
18*ef270ab1SKenneth D. Merry  *
19*ef270ab1SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*ef270ab1SKenneth D. Merry  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*ef270ab1SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*ef270ab1SKenneth D. Merry  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*ef270ab1SKenneth D. Merry  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*ef270ab1SKenneth D. Merry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*ef270ab1SKenneth D. Merry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*ef270ab1SKenneth D. Merry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*ef270ab1SKenneth D. Merry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*ef270ab1SKenneth D. Merry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*ef270ab1SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGE.
30*ef270ab1SKenneth D. Merry  */
31*ef270ab1SKenneth D. Merry 
32*ef270ab1SKenneth D. Merry /**
33*ef270ab1SKenneth D. Merry  * @file
34*ef270ab1SKenneth D. Merry  *
35*ef270ab1SKenneth D. Merry  */
36*ef270ab1SKenneth D. Merry 
37*ef270ab1SKenneth D. Merry #ifndef __OCS_UTILS_H
38*ef270ab1SKenneth D. Merry #define __OCS_UTILS_H
39*ef270ab1SKenneth D. Merry 
40*ef270ab1SKenneth D. Merry #include "ocs_list.h"
41*ef270ab1SKenneth D. Merry typedef struct ocs_array_s ocs_array_t;
42*ef270ab1SKenneth D. Merry 
43*ef270ab1SKenneth D. Merry extern void ocs_array_set_slablen(uint32_t len);
44*ef270ab1SKenneth D. Merry extern ocs_array_t *ocs_array_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count);
45*ef270ab1SKenneth D. Merry extern void ocs_array_free(ocs_array_t *array);
46*ef270ab1SKenneth D. Merry extern void *ocs_array_get(ocs_array_t *array, uint32_t idx);
47*ef270ab1SKenneth D. Merry extern uint32_t ocs_array_get_count(ocs_array_t *array);
48*ef270ab1SKenneth D. Merry extern uint32_t ocs_array_get_size(ocs_array_t *array);
49*ef270ab1SKenneth D. Merry 
50*ef270ab1SKenneth D. Merry /* Void pointer array and iterator */
51*ef270ab1SKenneth D. Merry typedef struct ocs_varray_s ocs_varray_t;
52*ef270ab1SKenneth D. Merry 
53*ef270ab1SKenneth D. Merry extern ocs_varray_t *ocs_varray_alloc(ocs_os_handle_t os, uint32_t entry_count);
54*ef270ab1SKenneth D. Merry extern void ocs_varray_free(ocs_varray_t *ai);
55*ef270ab1SKenneth D. Merry extern int32_t ocs_varray_add(ocs_varray_t *ai, void *entry);
56*ef270ab1SKenneth D. Merry extern void ocs_varray_iter_reset(ocs_varray_t *ai);
57*ef270ab1SKenneth D. Merry extern void *ocs_varray_iter_next(ocs_varray_t *ai);
58*ef270ab1SKenneth D. Merry extern void *_ocs_varray_iter_next(ocs_varray_t *ai);
59*ef270ab1SKenneth D. Merry extern void ocs_varray_lock(ocs_varray_t *ai);
60*ef270ab1SKenneth D. Merry extern void ocs_varray_unlock(ocs_varray_t *ai);
61*ef270ab1SKenneth D. Merry extern uint32_t ocs_varray_get_count(ocs_varray_t *ai);
62*ef270ab1SKenneth D. Merry 
63*ef270ab1SKenneth D. Merry /***************************************************************************
64*ef270ab1SKenneth D. Merry  * Circular buffer
65*ef270ab1SKenneth D. Merry  *
66*ef270ab1SKenneth D. Merry  */
67*ef270ab1SKenneth D. Merry 
68*ef270ab1SKenneth D. Merry typedef struct ocs_cbuf_s ocs_cbuf_t;
69*ef270ab1SKenneth D. Merry 
70*ef270ab1SKenneth D. Merry extern ocs_cbuf_t *ocs_cbuf_alloc(ocs_os_handle_t os, uint32_t entry_count);
71*ef270ab1SKenneth D. Merry extern void ocs_cbuf_free(ocs_cbuf_t *cbuf);
72*ef270ab1SKenneth D. Merry extern void *ocs_cbuf_get(ocs_cbuf_t *cbuf, int32_t timeout_usec);
73*ef270ab1SKenneth D. Merry extern int32_t ocs_cbuf_put(ocs_cbuf_t *cbuf, void *elem);
74*ef270ab1SKenneth D. Merry extern int32_t ocs_cbuf_prime(ocs_cbuf_t *cbuf, ocs_array_t *array);
75*ef270ab1SKenneth D. Merry 
76*ef270ab1SKenneth D. Merry typedef struct {
77*ef270ab1SKenneth D. Merry         void *vaddr;
78*ef270ab1SKenneth D. Merry         uint32_t length;
79*ef270ab1SKenneth D. Merry } ocs_scsi_vaddr_len_t;
80*ef270ab1SKenneth D. Merry 
81*ef270ab1SKenneth D. Merry #define OCS_TEXTBUF_MAX_ALLOC_LEN	(256*1024)
82*ef270ab1SKenneth D. Merry 
83*ef270ab1SKenneth D. Merry typedef struct {
84*ef270ab1SKenneth D. Merry 	ocs_list_link_t link;
85*ef270ab1SKenneth D. Merry 	uint8_t user_allocated:1;
86*ef270ab1SKenneth D. Merry 	uint8_t *buffer;
87*ef270ab1SKenneth D. Merry 	uint32_t buffer_length;
88*ef270ab1SKenneth D. Merry 	uint32_t buffer_written;
89*ef270ab1SKenneth D. Merry } ocs_textbuf_segment_t;
90*ef270ab1SKenneth D. Merry 
91*ef270ab1SKenneth D. Merry typedef struct {
92*ef270ab1SKenneth D. Merry 	ocs_t *ocs;
93*ef270ab1SKenneth D. Merry 	ocs_list_t segment_list;
94*ef270ab1SKenneth D. Merry 	uint8_t extendable:1;
95*ef270ab1SKenneth D. Merry 	uint32_t allocation_length;
96*ef270ab1SKenneth D. Merry 	uint32_t total_allocation_length;
97*ef270ab1SKenneth D. Merry 	uint32_t max_allocation_length;
98*ef270ab1SKenneth D. Merry } ocs_textbuf_t;
99*ef270ab1SKenneth D. Merry 
100*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_alloc(ocs_t *ocs, ocs_textbuf_t *textbuf, uint32_t length);
101*ef270ab1SKenneth D. Merry extern uint32_t ocs_textbuf_initialized(ocs_textbuf_t *textbuf);
102*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_init(ocs_t *ocs, ocs_textbuf_t *textbuf, void *buffer, uint32_t length);
103*ef270ab1SKenneth D. Merry extern void ocs_textbuf_free(ocs_t *ocs, ocs_textbuf_t *textbuf);
104*ef270ab1SKenneth D. Merry extern void ocs_textbuf_putc(ocs_textbuf_t *textbuf, uint8_t c);
105*ef270ab1SKenneth D. Merry extern void ocs_textbuf_puts(ocs_textbuf_t *textbuf, char *s);
106*ef270ab1SKenneth D. Merry __attribute__((format(printf,2,3)))
107*ef270ab1SKenneth D. Merry extern void ocs_textbuf_printf(ocs_textbuf_t *textbuf, const char *fmt, ...);
108*ef270ab1SKenneth D. Merry __attribute__((format(printf,2,0)))
109*ef270ab1SKenneth D. Merry extern void ocs_textbuf_vprintf(ocs_textbuf_t *textbuf, const char *fmt, va_list ap);
110*ef270ab1SKenneth D. Merry extern void ocs_textbuf_buffer(ocs_textbuf_t *textbuf, uint8_t *buffer, uint32_t buffer_length);
111*ef270ab1SKenneth D. Merry extern void ocs_textbuf_copy(ocs_textbuf_t *textbuf, uint8_t *buffer, uint32_t buffer_length);
112*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_remaining(ocs_textbuf_t *textbuf);
113*ef270ab1SKenneth D. Merry extern void ocs_textbuf_reset(ocs_textbuf_t *textbuf);
114*ef270ab1SKenneth D. Merry extern uint8_t *ocs_textbuf_get_buffer(ocs_textbuf_t *textbuf);
115*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_get_length(ocs_textbuf_t *textbuf);
116*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_get_written(ocs_textbuf_t *textbuf);
117*ef270ab1SKenneth D. Merry extern uint8_t *ocs_textbuf_ext_get_buffer(ocs_textbuf_t *textbuf, uint32_t idx);
118*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_ext_get_length(ocs_textbuf_t *textbuf, uint32_t idx);
119*ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_ext_get_written(ocs_textbuf_t *textbuf, uint32_t idx);
120*ef270ab1SKenneth D. Merry 
121*ef270ab1SKenneth D. Merry typedef struct ocs_pool_s ocs_pool_t;
122*ef270ab1SKenneth D. Merry 
123*ef270ab1SKenneth D. Merry extern ocs_pool_t *ocs_pool_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count, uint32_t use_lock);
124*ef270ab1SKenneth D. Merry extern void ocs_pool_reset(ocs_pool_t *pool);
125*ef270ab1SKenneth D. Merry extern void ocs_pool_free(ocs_pool_t *pool);
126*ef270ab1SKenneth D. Merry extern void *ocs_pool_get(ocs_pool_t *pool);
127*ef270ab1SKenneth D. Merry extern void ocs_pool_put(ocs_pool_t *pool, void *item);
128*ef270ab1SKenneth D. Merry extern uint32_t ocs_pool_get_count(ocs_pool_t *pool);
129*ef270ab1SKenneth D. Merry extern void *ocs_pool_get_instance(ocs_pool_t *pool, uint32_t idx);
130*ef270ab1SKenneth D. Merry extern uint32_t ocs_pool_get_freelist_count(ocs_pool_t *pool);
131*ef270ab1SKenneth D. Merry 
132*ef270ab1SKenneth D. Merry /* Uncomment this line to enable logging extended queue history
133*ef270ab1SKenneth D. Merry  */
134*ef270ab1SKenneth D. Merry //#define OCS_DEBUG_QUEUE_HISTORY
135*ef270ab1SKenneth D. Merry 
136*ef270ab1SKenneth D. Merry /* Allocate maximum allowed (4M) */
137*ef270ab1SKenneth D. Merry #if defined(OCS_DEBUG_QUEUE_HISTORY)
138*ef270ab1SKenneth D. Merry #define OCS_Q_HIST_SIZE (1000000UL)		/* Size in words */
139*ef270ab1SKenneth D. Merry #endif
140*ef270ab1SKenneth D. Merry 
141*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SM_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 0)) != 0) : 0)
142*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_ELS_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 1)) != 0) : 0)
143*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SCSI_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 2)) != 0) : 0)
144*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SCSI_TGT_TRACE(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 3)) != 0) : 0)
145*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_DOMAIN_SM_TRACE(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 4)) != 0) : 0)
146*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_Q_FULL_BUSY_MSG(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 5)) != 0) : 0)
147*ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_IO_ERRORS(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 6)) != 0) : 0)
148*ef270ab1SKenneth D. Merry 
149*ef270ab1SKenneth D. Merry extern void ocs_dump32(uint32_t, ocs_os_handle_t, const char *, void *, uint32_t);
150*ef270ab1SKenneth D. Merry extern void ocs_debug_enable(uint32_t mask);
151*ef270ab1SKenneth D. Merry extern void ocs_debug_disable(uint32_t mask);
152*ef270ab1SKenneth D. Merry extern int ocs_debug_is_enabled(uint32_t mask);
153*ef270ab1SKenneth D. Merry extern void ocs_debug_attach(void *);
154*ef270ab1SKenneth D. Merry extern void ocs_debug_detach(void *);
155*ef270ab1SKenneth D. Merry 
156*ef270ab1SKenneth D. Merry #if defined(OCS_DEBUG_QUEUE_HISTORY)
157*ef270ab1SKenneth D. Merry 
158*ef270ab1SKenneth D. Merry /**
159*ef270ab1SKenneth D. Merry  * @brief Queue history footer
160*ef270ab1SKenneth D. Merry  */
161*ef270ab1SKenneth D. Merry typedef union ocs_q_hist_ftr_u {
162*ef270ab1SKenneth D. Merry 	uint32_t word;
163*ef270ab1SKenneth D. Merry 	struct {
164*ef270ab1SKenneth D. Merry #define Q_HIST_TYPE_LEN 		3
165*ef270ab1SKenneth D. Merry #define Q_HIST_MASK_LEN 		29
166*ef270ab1SKenneth D. Merry 		uint32_t mask:Q_HIST_MASK_LEN,
167*ef270ab1SKenneth D. Merry 			 type:Q_HIST_TYPE_LEN;
168*ef270ab1SKenneth D. Merry 	} s;
169*ef270ab1SKenneth D. Merry } ocs_q_hist_ftr_t;
170*ef270ab1SKenneth D. Merry 
171*ef270ab1SKenneth D. Merry /**
172*ef270ab1SKenneth D. Merry  * @brief WQE command mask lookup
173*ef270ab1SKenneth D. Merry  */
174*ef270ab1SKenneth D. Merry typedef struct ocs_q_hist_wqe_mask_s {
175*ef270ab1SKenneth D. Merry 	uint8_t command;
176*ef270ab1SKenneth D. Merry 	uint32_t mask;
177*ef270ab1SKenneth D. Merry } ocs_q_hist_wqe_mask_t;
178*ef270ab1SKenneth D. Merry 
179*ef270ab1SKenneth D. Merry /**
180*ef270ab1SKenneth D. Merry  * @brief CQE mask lookup
181*ef270ab1SKenneth D. Merry  */
182*ef270ab1SKenneth D. Merry typedef struct ocs_q_hist_cqe_mask_s {
183*ef270ab1SKenneth D. Merry 	uint8_t ctype;
184*ef270ab1SKenneth D. Merry 	uint32_t :Q_HIST_MASK_LEN,
185*ef270ab1SKenneth D. Merry 		 type:Q_HIST_TYPE_LEN;
186*ef270ab1SKenneth D. Merry 	uint32_t mask;
187*ef270ab1SKenneth D. Merry 	uint32_t mask_err;
188*ef270ab1SKenneth D. Merry } ocs_q_hist_cqe_mask_t;
189*ef270ab1SKenneth D. Merry 
190*ef270ab1SKenneth D. Merry /**
191*ef270ab1SKenneth D. Merry  * @brief Queue history type
192*ef270ab1SKenneth D. Merry  */
193*ef270ab1SKenneth D. Merry typedef enum {
194*ef270ab1SKenneth D. Merry 	/* changes need to be made to ocs_queue_history_type_name() as well */
195*ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_WQE = 0,
196*ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_CWQE,
197*ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_CXABT,
198*ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_MISC,
199*ef270ab1SKenneth D. Merry } ocs_q_hist_type_t;
200*ef270ab1SKenneth D. Merry 
201*ef270ab1SKenneth D. Merry static __inline const char *
ocs_queue_history_type_name(ocs_q_hist_type_t type)202*ef270ab1SKenneth D. Merry ocs_queue_history_type_name(ocs_q_hist_type_t type)
203*ef270ab1SKenneth D. Merry {
204*ef270ab1SKenneth D. Merry 	switch (type) {
205*ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_WQE: return "wqe"; break;
206*ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_CWQE: return "wcqe"; break;
207*ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_CXABT: return "xacqe"; break;
208*ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_MISC: return "misc"; break;
209*ef270ab1SKenneth D. Merry 	default: return "unknown"; break;
210*ef270ab1SKenneth D. Merry 	}
211*ef270ab1SKenneth D. Merry }
212*ef270ab1SKenneth D. Merry 
213*ef270ab1SKenneth D. Merry typedef struct {
214*ef270ab1SKenneth D. Merry 	ocs_t		*ocs;
215*ef270ab1SKenneth D. Merry 	uint32_t	*q_hist;
216*ef270ab1SKenneth D. Merry 	uint32_t	q_hist_index;
217*ef270ab1SKenneth D. Merry 	ocs_lock_t	q_hist_lock;
218*ef270ab1SKenneth D. Merry } ocs_hw_q_hist_t;
219*ef270ab1SKenneth D. Merry 
220*ef270ab1SKenneth D. Merry extern void ocs_queue_history_cqe(ocs_hw_q_hist_t*, uint8_t, uint32_t *, uint8_t, uint32_t, uint32_t);
221*ef270ab1SKenneth D. Merry extern void ocs_queue_history_wq(ocs_hw_q_hist_t*, uint32_t *, uint32_t, uint32_t);
222*ef270ab1SKenneth D. Merry extern void ocs_queue_history_misc(ocs_hw_q_hist_t*, uint32_t *, uint32_t);
223*ef270ab1SKenneth D. Merry extern void ocs_queue_history_init(ocs_t *, ocs_hw_q_hist_t*);
224*ef270ab1SKenneth D. Merry extern void ocs_queue_history_free(ocs_hw_q_hist_t*);
225*ef270ab1SKenneth D. Merry extern uint32_t ocs_queue_history_prev_index(uint32_t);
226*ef270ab1SKenneth D. Merry extern uint8_t ocs_queue_history_q_info_enabled(void);
227*ef270ab1SKenneth D. Merry extern uint8_t ocs_queue_history_timestamp_enabled(void);
228*ef270ab1SKenneth D. Merry #else
229*ef270ab1SKenneth D. Merry #define ocs_queue_history_wq(...)
230*ef270ab1SKenneth D. Merry #define ocs_queue_history_cqe(...)
231*ef270ab1SKenneth D. Merry #define ocs_queue_history_misc(...)
232*ef270ab1SKenneth D. Merry #define ocs_queue_history_init(...)
233*ef270ab1SKenneth D. Merry #define ocs_queue_history_free(...)
234*ef270ab1SKenneth D. Merry #endif
235*ef270ab1SKenneth D. Merry 
236*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ALWAYS		(1U << 0)
237*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_MQ_DUMP	(1U << 1)
238*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_CQ_DUMP	(1U << 2)
239*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_WQ_DUMP	(1U << 3)
240*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_EQ_DUMP	(1U << 4)
241*ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_SPARAM_DUMP	(1U << 5)
242*ef270ab1SKenneth D. Merry 
243*ef270ab1SKenneth D. Merry extern void _ocs_assert(const char *cond, const char *filename, int linenum);
244*ef270ab1SKenneth D. Merry 
245*ef270ab1SKenneth D. Merry #define ocs_assert(cond, ...) \
246*ef270ab1SKenneth D. Merry 	do { \
247*ef270ab1SKenneth D. Merry 		if (!(cond)) { \
248*ef270ab1SKenneth D. Merry 			_ocs_assert(#cond, __FILE__, __LINE__); \
249*ef270ab1SKenneth D. Merry 			return __VA_ARGS__; \
250*ef270ab1SKenneth D. Merry 		} \
251*ef270ab1SKenneth D. Merry 	} while (0)
252*ef270ab1SKenneth D. Merry 
253*ef270ab1SKenneth D. Merry extern void ocs_dump_service_params(const char *label, void *sparms);
254*ef270ab1SKenneth D. Merry extern void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams);
255*ef270ab1SKenneth D. Merry 
256*ef270ab1SKenneth D. Merry typedef struct {
257*ef270ab1SKenneth D. Merry 	uint16_t crc;
258*ef270ab1SKenneth D. Merry 	uint16_t app_tag;
259*ef270ab1SKenneth D. Merry 	uint32_t ref_tag;
260*ef270ab1SKenneth D. Merry } ocs_dif_t;
261*ef270ab1SKenneth D. Merry 
262*ef270ab1SKenneth D. Merry /* DIF guard calculations */
263*ef270ab1SKenneth D. Merry extern uint16_t ocs_scsi_dif_calc_crc(const uint8_t *, uint32_t size, uint16_t crc);
264*ef270ab1SKenneth D. Merry extern uint16_t ocs_scsi_dif_calc_checksum(ocs_scsi_vaddr_len_t addrlen[], uint32_t addrlen_count);
265*ef270ab1SKenneth D. Merry 
266*ef270ab1SKenneth D. Merry /**
267*ef270ab1SKenneth D. Merry  * @brief Power State change message types
268*ef270ab1SKenneth D. Merry  *
269*ef270ab1SKenneth D. Merry  */
270*ef270ab1SKenneth D. Merry typedef enum {
271*ef270ab1SKenneth D. Merry 	OCS_PM_PREPARE = 1,
272*ef270ab1SKenneth D. Merry 	OCS_PM_SLEEP,
273*ef270ab1SKenneth D. Merry 	OCS_PM_HIBERNATE,
274*ef270ab1SKenneth D. Merry 	OCS_PM_RESUME,
275*ef270ab1SKenneth D. Merry } ocs_pm_msg_e;
276*ef270ab1SKenneth D. Merry 
277*ef270ab1SKenneth D. Merry /**
278*ef270ab1SKenneth D. Merry  * @brief Power State values
279*ef270ab1SKenneth D. Merry  *
280*ef270ab1SKenneth D. Merry  */
281*ef270ab1SKenneth D. Merry typedef enum {
282*ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S0 = 0,
283*ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S1,
284*ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S2,
285*ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S3,
286*ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S4,
287*ef270ab1SKenneth D. Merry } ocs_pm_state_e;
288*ef270ab1SKenneth D. Merry 
289*ef270ab1SKenneth D. Merry typedef struct {
290*ef270ab1SKenneth D. Merry 	ocs_pm_state_e pm_state;		/*<< Current PM state */
291*ef270ab1SKenneth D. Merry } ocs_pm_context_t;
292*ef270ab1SKenneth D. Merry 
293*ef270ab1SKenneth D. Merry extern int32_t ocs_pm_request(ocs_t *ocs, ocs_pm_msg_e msg, int32_t (*callback)(ocs_t *ocs, int32_t status, void *arg),
294*ef270ab1SKenneth D. Merry 	void *arg);
295*ef270ab1SKenneth D. Merry extern ocs_pm_state_e ocs_pm_get_state(ocs_t *ocs);
296*ef270ab1SKenneth D. Merry extern const char *ocs_pm_get_state_string(ocs_t *ocs);
297*ef270ab1SKenneth D. Merry 
298*ef270ab1SKenneth D. Merry #define SPV_ROWLEN	256
299*ef270ab1SKenneth D. Merry #define SPV_DIM		3
300*ef270ab1SKenneth D. Merry 
301*ef270ab1SKenneth D. Merry /*!
302*ef270ab1SKenneth D. Merry * @defgroup spv Sparse Vector
303*ef270ab1SKenneth D. Merry */
304*ef270ab1SKenneth D. Merry 
305*ef270ab1SKenneth D. Merry /**
306*ef270ab1SKenneth D. Merry  * @brief Sparse vector structure.
307*ef270ab1SKenneth D. Merry  */
308*ef270ab1SKenneth D. Merry typedef struct sparse_vector_s {
309*ef270ab1SKenneth D. Merry 	ocs_os_handle_t os;
310*ef270ab1SKenneth D. Merry 	uint32_t max_idx;		/**< maximum index value */
311*ef270ab1SKenneth D. Merry 	void **array;			/**< pointer to 3D array */
312*ef270ab1SKenneth D. Merry } *sparse_vector_t;
313*ef270ab1SKenneth D. Merry 
314*ef270ab1SKenneth D. Merry extern void spv_del(sparse_vector_t spv);
315*ef270ab1SKenneth D. Merry extern sparse_vector_t spv_new(ocs_os_handle_t os);
316*ef270ab1SKenneth D. Merry extern void spv_set(sparse_vector_t sv, uint32_t idx, void *value);
317*ef270ab1SKenneth D. Merry extern void *spv_get(sparse_vector_t sv, uint32_t idx);
318*ef270ab1SKenneth D. Merry 
319*ef270ab1SKenneth D. Merry extern unsigned short t10crc16(const unsigned char *blk_adr, unsigned long blk_len, unsigned short crc);
320*ef270ab1SKenneth D. Merry 
321*ef270ab1SKenneth D. Merry typedef struct ocs_ramlog_s ocs_ramlog_t;
322*ef270ab1SKenneth D. Merry 
323*ef270ab1SKenneth D. Merry #define OCS_RAMLOG_DEFAULT_BUFFERS              5
324*ef270ab1SKenneth D. Merry 
325*ef270ab1SKenneth D. Merry extern ocs_ramlog_t *ocs_ramlog_init(ocs_t *ocs, uint32_t buffer_len, uint32_t buffer_count);
326*ef270ab1SKenneth D. Merry extern void ocs_ramlog_free(ocs_t *ocs, ocs_ramlog_t *ramlog);
327*ef270ab1SKenneth D. Merry extern void ocs_ramlog_clear(ocs_t *ocs, ocs_ramlog_t *ramlog, int clear_start_of_day, int clear_recent);
328*ef270ab1SKenneth D. Merry __attribute__((format(printf,2,3)))
329*ef270ab1SKenneth D. Merry extern int32_t ocs_ramlog_printf(void *os, const char *fmt, ...);
330*ef270ab1SKenneth D. Merry __attribute__((format(printf,2,0)))
331*ef270ab1SKenneth D. Merry extern int32_t ocs_ramlog_vprintf(ocs_ramlog_t *ramlog, const char *fmt, va_list ap);
332*ef270ab1SKenneth D. Merry extern int32_t ocs_ddump_ramlog(ocs_textbuf_t *textbuf, ocs_ramlog_t *ramlog);
333*ef270ab1SKenneth D. Merry 
334*ef270ab1SKenneth D. Merry #endif
335