xref: /freebsd/sys/dev/ocs_fc/ocs_utils.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  *
35ef270ab1SKenneth D. Merry  */
36ef270ab1SKenneth D. Merry 
37ef270ab1SKenneth D. Merry #ifndef __OCS_UTILS_H
38ef270ab1SKenneth D. Merry #define __OCS_UTILS_H
39ef270ab1SKenneth D. Merry 
40ef270ab1SKenneth D. Merry #include "ocs_list.h"
41ef270ab1SKenneth D. Merry typedef struct ocs_array_s ocs_array_t;
42ef270ab1SKenneth D. Merry 
43ef270ab1SKenneth D. Merry extern void ocs_array_set_slablen(uint32_t len);
44ef270ab1SKenneth D. Merry extern ocs_array_t *ocs_array_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count);
45ef270ab1SKenneth D. Merry extern void ocs_array_free(ocs_array_t *array);
46ef270ab1SKenneth D. Merry extern void *ocs_array_get(ocs_array_t *array, uint32_t idx);
47ef270ab1SKenneth D. Merry extern uint32_t ocs_array_get_count(ocs_array_t *array);
48ef270ab1SKenneth D. Merry extern uint32_t ocs_array_get_size(ocs_array_t *array);
49ef270ab1SKenneth D. Merry 
50ef270ab1SKenneth D. Merry /* Void pointer array and iterator */
51ef270ab1SKenneth D. Merry typedef struct ocs_varray_s ocs_varray_t;
52ef270ab1SKenneth D. Merry 
53ef270ab1SKenneth D. Merry extern ocs_varray_t *ocs_varray_alloc(ocs_os_handle_t os, uint32_t entry_count);
54ef270ab1SKenneth D. Merry extern void ocs_varray_free(ocs_varray_t *ai);
55ef270ab1SKenneth D. Merry extern int32_t ocs_varray_add(ocs_varray_t *ai, void *entry);
56ef270ab1SKenneth D. Merry extern void ocs_varray_iter_reset(ocs_varray_t *ai);
57ef270ab1SKenneth D. Merry extern void *ocs_varray_iter_next(ocs_varray_t *ai);
58ef270ab1SKenneth D. Merry extern void *_ocs_varray_iter_next(ocs_varray_t *ai);
59ef270ab1SKenneth D. Merry extern void ocs_varray_lock(ocs_varray_t *ai);
60ef270ab1SKenneth D. Merry extern void ocs_varray_unlock(ocs_varray_t *ai);
61ef270ab1SKenneth D. Merry extern uint32_t ocs_varray_get_count(ocs_varray_t *ai);
62ef270ab1SKenneth D. Merry 
63ef270ab1SKenneth D. Merry /***************************************************************************
64ef270ab1SKenneth D. Merry  * Circular buffer
65ef270ab1SKenneth D. Merry  *
66ef270ab1SKenneth D. Merry  */
67ef270ab1SKenneth D. Merry 
68ef270ab1SKenneth D. Merry typedef struct ocs_cbuf_s ocs_cbuf_t;
69ef270ab1SKenneth D. Merry 
70ef270ab1SKenneth D. Merry extern ocs_cbuf_t *ocs_cbuf_alloc(ocs_os_handle_t os, uint32_t entry_count);
71ef270ab1SKenneth D. Merry extern void ocs_cbuf_free(ocs_cbuf_t *cbuf);
72ef270ab1SKenneth D. Merry extern void *ocs_cbuf_get(ocs_cbuf_t *cbuf, int32_t timeout_usec);
73ef270ab1SKenneth D. Merry extern int32_t ocs_cbuf_put(ocs_cbuf_t *cbuf, void *elem);
74ef270ab1SKenneth D. Merry extern int32_t ocs_cbuf_prime(ocs_cbuf_t *cbuf, ocs_array_t *array);
75ef270ab1SKenneth D. Merry 
76ef270ab1SKenneth D. Merry typedef struct {
77ef270ab1SKenneth D. Merry         void *vaddr;
78ef270ab1SKenneth D. Merry         uint32_t length;
79ef270ab1SKenneth D. Merry } ocs_scsi_vaddr_len_t;
80ef270ab1SKenneth D. Merry 
81ef270ab1SKenneth D. Merry #define OCS_TEXTBUF_MAX_ALLOC_LEN	(256*1024)
82ef270ab1SKenneth D. Merry 
83ef270ab1SKenneth D. Merry typedef struct {
84ef270ab1SKenneth D. Merry 	ocs_list_link_t link;
85ef270ab1SKenneth D. Merry 	uint8_t user_allocated:1;
86ef270ab1SKenneth D. Merry 	uint8_t *buffer;
87ef270ab1SKenneth D. Merry 	uint32_t buffer_length;
88ef270ab1SKenneth D. Merry 	uint32_t buffer_written;
89ef270ab1SKenneth D. Merry } ocs_textbuf_segment_t;
90ef270ab1SKenneth D. Merry 
91ef270ab1SKenneth D. Merry typedef struct {
92ef270ab1SKenneth D. Merry 	ocs_t *ocs;
93ef270ab1SKenneth D. Merry 	ocs_list_t segment_list;
94ef270ab1SKenneth D. Merry 	uint8_t extendable:1;
95ef270ab1SKenneth D. Merry 	uint32_t allocation_length;
96ef270ab1SKenneth D. Merry 	uint32_t total_allocation_length;
97ef270ab1SKenneth D. Merry 	uint32_t max_allocation_length;
98ef270ab1SKenneth D. Merry } ocs_textbuf_t;
99ef270ab1SKenneth D. Merry 
100ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_alloc(ocs_t *ocs, ocs_textbuf_t *textbuf, uint32_t length);
101ef270ab1SKenneth D. Merry extern uint32_t ocs_textbuf_initialized(ocs_textbuf_t *textbuf);
102ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_init(ocs_t *ocs, ocs_textbuf_t *textbuf, void *buffer, uint32_t length);
103ef270ab1SKenneth D. Merry extern void ocs_textbuf_free(ocs_t *ocs, ocs_textbuf_t *textbuf);
104ef270ab1SKenneth D. Merry extern void ocs_textbuf_putc(ocs_textbuf_t *textbuf, uint8_t c);
105ef270ab1SKenneth D. Merry extern void ocs_textbuf_puts(ocs_textbuf_t *textbuf, char *s);
106ef270ab1SKenneth D. Merry __attribute__((format(printf,2,3)))
107ef270ab1SKenneth D. Merry extern void ocs_textbuf_printf(ocs_textbuf_t *textbuf, const char *fmt, ...);
108ef270ab1SKenneth D. Merry __attribute__((format(printf,2,0)))
109ef270ab1SKenneth D. Merry extern void ocs_textbuf_vprintf(ocs_textbuf_t *textbuf, const char *fmt, va_list ap);
110ef270ab1SKenneth D. Merry extern void ocs_textbuf_buffer(ocs_textbuf_t *textbuf, uint8_t *buffer, uint32_t buffer_length);
111ef270ab1SKenneth D. Merry extern void ocs_textbuf_copy(ocs_textbuf_t *textbuf, uint8_t *buffer, uint32_t buffer_length);
112ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_remaining(ocs_textbuf_t *textbuf);
113ef270ab1SKenneth D. Merry extern void ocs_textbuf_reset(ocs_textbuf_t *textbuf);
114ef270ab1SKenneth D. Merry extern uint8_t *ocs_textbuf_get_buffer(ocs_textbuf_t *textbuf);
115ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_get_length(ocs_textbuf_t *textbuf);
116ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_get_written(ocs_textbuf_t *textbuf);
117ef270ab1SKenneth D. Merry extern uint8_t *ocs_textbuf_ext_get_buffer(ocs_textbuf_t *textbuf, uint32_t idx);
118ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_ext_get_length(ocs_textbuf_t *textbuf, uint32_t idx);
119ef270ab1SKenneth D. Merry extern int32_t ocs_textbuf_ext_get_written(ocs_textbuf_t *textbuf, uint32_t idx);
120ef270ab1SKenneth D. Merry 
121ef270ab1SKenneth D. Merry typedef struct ocs_pool_s ocs_pool_t;
122ef270ab1SKenneth D. Merry 
123ef270ab1SKenneth D. Merry extern ocs_pool_t *ocs_pool_alloc(ocs_os_handle_t os, uint32_t size, uint32_t count, uint32_t use_lock);
124ef270ab1SKenneth D. Merry extern void ocs_pool_reset(ocs_pool_t *pool);
125ef270ab1SKenneth D. Merry extern void ocs_pool_free(ocs_pool_t *pool);
126ef270ab1SKenneth D. Merry extern void *ocs_pool_get(ocs_pool_t *pool);
127ef270ab1SKenneth D. Merry extern void ocs_pool_put(ocs_pool_t *pool, void *item);
128ef270ab1SKenneth D. Merry extern uint32_t ocs_pool_get_count(ocs_pool_t *pool);
129ef270ab1SKenneth D. Merry extern void *ocs_pool_get_instance(ocs_pool_t *pool, uint32_t idx);
130ef270ab1SKenneth D. Merry extern uint32_t ocs_pool_get_freelist_count(ocs_pool_t *pool);
131ef270ab1SKenneth D. Merry 
132ef270ab1SKenneth D. Merry /* Uncomment this line to enable logging extended queue history
133ef270ab1SKenneth D. Merry  */
134ef270ab1SKenneth D. Merry //#define OCS_DEBUG_QUEUE_HISTORY
135ef270ab1SKenneth D. Merry 
136ef270ab1SKenneth D. Merry /* Allocate maximum allowed (4M) */
137ef270ab1SKenneth D. Merry #if defined(OCS_DEBUG_QUEUE_HISTORY)
138ef270ab1SKenneth D. Merry #define OCS_Q_HIST_SIZE (1000000UL)		/* Size in words */
139ef270ab1SKenneth D. Merry #endif
140ef270ab1SKenneth D. Merry 
141ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SM_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 0)) != 0) : 0)
142ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_ELS_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 1)) != 0) : 0)
143ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SCSI_TRACE(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 2)) != 0) : 0)
144ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_SCSI_TGT_TRACE(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 3)) != 0) : 0)
145ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_DOMAIN_SM_TRACE(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 4)) != 0) : 0)
146ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_Q_FULL_BUSY_MSG(ocs)	(((ocs) != NULL) ? (((ocs)->logmask & (1U << 5)) != 0) : 0)
147ef270ab1SKenneth D. Merry #define OCS_LOG_ENABLE_IO_ERRORS(ocs)		(((ocs) != NULL) ? (((ocs)->logmask & (1U << 6)) != 0) : 0)
148ef270ab1SKenneth D. Merry 
149ef270ab1SKenneth D. Merry extern void ocs_dump32(uint32_t, ocs_os_handle_t, const char *, void *, uint32_t);
150ef270ab1SKenneth D. Merry extern void ocs_debug_enable(uint32_t mask);
151ef270ab1SKenneth D. Merry extern void ocs_debug_disable(uint32_t mask);
152ef270ab1SKenneth D. Merry extern int ocs_debug_is_enabled(uint32_t mask);
153ef270ab1SKenneth D. Merry extern void ocs_debug_attach(void *);
154ef270ab1SKenneth D. Merry extern void ocs_debug_detach(void *);
155ef270ab1SKenneth D. Merry 
156ef270ab1SKenneth D. Merry #if defined(OCS_DEBUG_QUEUE_HISTORY)
157ef270ab1SKenneth D. Merry 
158ef270ab1SKenneth D. Merry /**
159ef270ab1SKenneth D. Merry  * @brief Queue history footer
160ef270ab1SKenneth D. Merry  */
161ef270ab1SKenneth D. Merry typedef union ocs_q_hist_ftr_u {
162ef270ab1SKenneth D. Merry 	uint32_t word;
163ef270ab1SKenneth D. Merry 	struct {
164ef270ab1SKenneth D. Merry #define Q_HIST_TYPE_LEN 		3
165ef270ab1SKenneth D. Merry #define Q_HIST_MASK_LEN 		29
166ef270ab1SKenneth D. Merry 		uint32_t mask:Q_HIST_MASK_LEN,
167ef270ab1SKenneth D. Merry 			 type:Q_HIST_TYPE_LEN;
168ef270ab1SKenneth D. Merry 	} s;
169ef270ab1SKenneth D. Merry } ocs_q_hist_ftr_t;
170ef270ab1SKenneth D. Merry 
171ef270ab1SKenneth D. Merry /**
172ef270ab1SKenneth D. Merry  * @brief WQE command mask lookup
173ef270ab1SKenneth D. Merry  */
174ef270ab1SKenneth D. Merry typedef struct ocs_q_hist_wqe_mask_s {
175ef270ab1SKenneth D. Merry 	uint8_t command;
176ef270ab1SKenneth D. Merry 	uint32_t mask;
177ef270ab1SKenneth D. Merry } ocs_q_hist_wqe_mask_t;
178ef270ab1SKenneth D. Merry 
179ef270ab1SKenneth D. Merry /**
180ef270ab1SKenneth D. Merry  * @brief CQE mask lookup
181ef270ab1SKenneth D. Merry  */
182ef270ab1SKenneth D. Merry typedef struct ocs_q_hist_cqe_mask_s {
183ef270ab1SKenneth D. Merry 	uint8_t ctype;
184ef270ab1SKenneth D. Merry 	uint32_t :Q_HIST_MASK_LEN,
185ef270ab1SKenneth D. Merry 		 type:Q_HIST_TYPE_LEN;
186ef270ab1SKenneth D. Merry 	uint32_t mask;
187ef270ab1SKenneth D. Merry 	uint32_t mask_err;
188ef270ab1SKenneth D. Merry } ocs_q_hist_cqe_mask_t;
189ef270ab1SKenneth D. Merry 
190ef270ab1SKenneth D. Merry /**
191ef270ab1SKenneth D. Merry  * @brief Queue history type
192ef270ab1SKenneth D. Merry  */
193ef270ab1SKenneth D. Merry typedef enum {
194ef270ab1SKenneth D. Merry 	/* changes need to be made to ocs_queue_history_type_name() as well */
195ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_WQE = 0,
196ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_CWQE,
197ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_CXABT,
198ef270ab1SKenneth D. Merry 	OCS_Q_HIST_TYPE_MISC,
199ef270ab1SKenneth D. Merry } ocs_q_hist_type_t;
200ef270ab1SKenneth D. Merry 
201ef270ab1SKenneth D. Merry static __inline const char *
ocs_queue_history_type_name(ocs_q_hist_type_t type)202ef270ab1SKenneth D. Merry ocs_queue_history_type_name(ocs_q_hist_type_t type)
203ef270ab1SKenneth D. Merry {
204ef270ab1SKenneth D. Merry 	switch (type) {
205ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_WQE: return "wqe"; break;
206ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_CWQE: return "wcqe"; break;
207ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_CXABT: return "xacqe"; break;
208ef270ab1SKenneth D. Merry 	case OCS_Q_HIST_TYPE_MISC: return "misc"; break;
209ef270ab1SKenneth D. Merry 	default: return "unknown"; break;
210ef270ab1SKenneth D. Merry 	}
211ef270ab1SKenneth D. Merry }
212ef270ab1SKenneth D. Merry 
213ef270ab1SKenneth D. Merry typedef struct {
214ef270ab1SKenneth D. Merry 	ocs_t		*ocs;
215ef270ab1SKenneth D. Merry 	uint32_t	*q_hist;
216ef270ab1SKenneth D. Merry 	uint32_t	q_hist_index;
217ef270ab1SKenneth D. Merry 	ocs_lock_t	q_hist_lock;
218ef270ab1SKenneth D. Merry } ocs_hw_q_hist_t;
219ef270ab1SKenneth D. Merry 
220ef270ab1SKenneth D. Merry extern void ocs_queue_history_cqe(ocs_hw_q_hist_t*, uint8_t, uint32_t *, uint8_t, uint32_t, uint32_t);
221ef270ab1SKenneth D. Merry extern void ocs_queue_history_wq(ocs_hw_q_hist_t*, uint32_t *, uint32_t, uint32_t);
222ef270ab1SKenneth D. Merry extern void ocs_queue_history_misc(ocs_hw_q_hist_t*, uint32_t *, uint32_t);
223ef270ab1SKenneth D. Merry extern void ocs_queue_history_init(ocs_t *, ocs_hw_q_hist_t*);
224ef270ab1SKenneth D. Merry extern void ocs_queue_history_free(ocs_hw_q_hist_t*);
225ef270ab1SKenneth D. Merry extern uint32_t ocs_queue_history_prev_index(uint32_t);
226ef270ab1SKenneth D. Merry extern uint8_t ocs_queue_history_q_info_enabled(void);
227ef270ab1SKenneth D. Merry extern uint8_t ocs_queue_history_timestamp_enabled(void);
228ef270ab1SKenneth D. Merry #else
229ef270ab1SKenneth D. Merry #define ocs_queue_history_wq(...)
230ef270ab1SKenneth D. Merry #define ocs_queue_history_cqe(...)
231ef270ab1SKenneth D. Merry #define ocs_queue_history_misc(...)
232ef270ab1SKenneth D. Merry #define ocs_queue_history_init(...)
233ef270ab1SKenneth D. Merry #define ocs_queue_history_free(...)
234ef270ab1SKenneth D. Merry #endif
235ef270ab1SKenneth D. Merry 
236ef270ab1SKenneth D. Merry #define OCS_DEBUG_ALWAYS		(1U << 0)
237ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_MQ_DUMP	(1U << 1)
238ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_CQ_DUMP	(1U << 2)
239ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_WQ_DUMP	(1U << 3)
240ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_EQ_DUMP	(1U << 4)
241ef270ab1SKenneth D. Merry #define OCS_DEBUG_ENABLE_SPARAM_DUMP	(1U << 5)
242ef270ab1SKenneth D. Merry 
243ef270ab1SKenneth D. Merry extern void _ocs_assert(const char *cond, const char *filename, int linenum);
244ef270ab1SKenneth D. Merry 
245ef270ab1SKenneth D. Merry #define ocs_assert(cond, ...) \
246ef270ab1SKenneth D. Merry 	do { \
247ef270ab1SKenneth D. Merry 		if (!(cond)) { \
248ef270ab1SKenneth D. Merry 			_ocs_assert(#cond, __FILE__, __LINE__); \
249ef270ab1SKenneth D. Merry 			return __VA_ARGS__; \
250ef270ab1SKenneth D. Merry 		} \
251ef270ab1SKenneth D. Merry 	} while (0)
252ef270ab1SKenneth D. Merry 
253ef270ab1SKenneth D. Merry extern void ocs_dump_service_params(const char *label, void *sparms);
254ef270ab1SKenneth D. Merry extern void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams);
255ef270ab1SKenneth D. Merry 
256ef270ab1SKenneth D. Merry typedef struct {
257ef270ab1SKenneth D. Merry 	uint16_t crc;
258ef270ab1SKenneth D. Merry 	uint16_t app_tag;
259ef270ab1SKenneth D. Merry 	uint32_t ref_tag;
260ef270ab1SKenneth D. Merry } ocs_dif_t;
261ef270ab1SKenneth D. Merry 
262ef270ab1SKenneth D. Merry /* DIF guard calculations */
263ef270ab1SKenneth D. Merry extern uint16_t ocs_scsi_dif_calc_crc(const uint8_t *, uint32_t size, uint16_t crc);
264ef270ab1SKenneth D. Merry extern uint16_t ocs_scsi_dif_calc_checksum(ocs_scsi_vaddr_len_t addrlen[], uint32_t addrlen_count);
265ef270ab1SKenneth D. Merry 
266ef270ab1SKenneth D. Merry /**
267ef270ab1SKenneth D. Merry  * @brief Power State change message types
268ef270ab1SKenneth D. Merry  *
269ef270ab1SKenneth D. Merry  */
270ef270ab1SKenneth D. Merry typedef enum {
271ef270ab1SKenneth D. Merry 	OCS_PM_PREPARE = 1,
272ef270ab1SKenneth D. Merry 	OCS_PM_SLEEP,
273ef270ab1SKenneth D. Merry 	OCS_PM_HIBERNATE,
274ef270ab1SKenneth D. Merry 	OCS_PM_RESUME,
275ef270ab1SKenneth D. Merry } ocs_pm_msg_e;
276ef270ab1SKenneth D. Merry 
277ef270ab1SKenneth D. Merry /**
278ef270ab1SKenneth D. Merry  * @brief Power State values
279ef270ab1SKenneth D. Merry  *
280ef270ab1SKenneth D. Merry  */
281ef270ab1SKenneth D. Merry typedef enum {
282ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S0 = 0,
283ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S1,
284ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S2,
285ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S3,
286ef270ab1SKenneth D. Merry 	OCS_PM_STATE_S4,
287ef270ab1SKenneth D. Merry } ocs_pm_state_e;
288ef270ab1SKenneth D. Merry 
289ef270ab1SKenneth D. Merry typedef struct {
290ef270ab1SKenneth D. Merry 	ocs_pm_state_e pm_state;		/*<< Current PM state */
291ef270ab1SKenneth D. Merry } ocs_pm_context_t;
292ef270ab1SKenneth D. Merry 
293ef270ab1SKenneth 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),
294ef270ab1SKenneth D. Merry 	void *arg);
295ef270ab1SKenneth D. Merry extern ocs_pm_state_e ocs_pm_get_state(ocs_t *ocs);
296ef270ab1SKenneth D. Merry extern const char *ocs_pm_get_state_string(ocs_t *ocs);
297ef270ab1SKenneth D. Merry 
298ef270ab1SKenneth D. Merry #define SPV_ROWLEN	256
299ef270ab1SKenneth D. Merry #define SPV_DIM		3
300ef270ab1SKenneth D. Merry 
301ef270ab1SKenneth D. Merry /*!
302ef270ab1SKenneth D. Merry * @defgroup spv Sparse Vector
303ef270ab1SKenneth D. Merry */
304ef270ab1SKenneth D. Merry 
305ef270ab1SKenneth D. Merry /**
306ef270ab1SKenneth D. Merry  * @brief Sparse vector structure.
307ef270ab1SKenneth D. Merry  */
308ef270ab1SKenneth D. Merry typedef struct sparse_vector_s {
309ef270ab1SKenneth D. Merry 	ocs_os_handle_t os;
310ef270ab1SKenneth D. Merry 	uint32_t max_idx;		/**< maximum index value */
311ef270ab1SKenneth D. Merry 	void **array;			/**< pointer to 3D array */
312ef270ab1SKenneth D. Merry } *sparse_vector_t;
313ef270ab1SKenneth D. Merry 
314ef270ab1SKenneth D. Merry extern void spv_del(sparse_vector_t spv);
315ef270ab1SKenneth D. Merry extern sparse_vector_t spv_new(ocs_os_handle_t os);
316ef270ab1SKenneth D. Merry extern void spv_set(sparse_vector_t sv, uint32_t idx, void *value);
317ef270ab1SKenneth D. Merry extern void *spv_get(sparse_vector_t sv, uint32_t idx);
318ef270ab1SKenneth D. Merry 
319ef270ab1SKenneth D. Merry extern unsigned short t10crc16(const unsigned char *blk_adr, unsigned long blk_len, unsigned short crc);
320ef270ab1SKenneth D. Merry 
321ef270ab1SKenneth D. Merry typedef struct ocs_ramlog_s ocs_ramlog_t;
322ef270ab1SKenneth D. Merry 
323ef270ab1SKenneth D. Merry #define OCS_RAMLOG_DEFAULT_BUFFERS              5
324ef270ab1SKenneth D. Merry 
325ef270ab1SKenneth D. Merry extern ocs_ramlog_t *ocs_ramlog_init(ocs_t *ocs, uint32_t buffer_len, uint32_t buffer_count);
326ef270ab1SKenneth D. Merry extern void ocs_ramlog_free(ocs_t *ocs, ocs_ramlog_t *ramlog);
327ef270ab1SKenneth D. Merry extern void ocs_ramlog_clear(ocs_t *ocs, ocs_ramlog_t *ramlog, int clear_start_of_day, int clear_recent);
328ef270ab1SKenneth D. Merry __attribute__((format(printf,2,3)))
329ef270ab1SKenneth D. Merry extern int32_t ocs_ramlog_printf(void *os, const char *fmt, ...);
330ef270ab1SKenneth D. Merry __attribute__((format(printf,2,0)))
331ef270ab1SKenneth D. Merry extern int32_t ocs_ramlog_vprintf(ocs_ramlog_t *ramlog, const char *fmt, va_list ap);
332ef270ab1SKenneth D. Merry extern int32_t ocs_ddump_ramlog(ocs_textbuf_t *textbuf, ocs_ramlog_t *ramlog);
333ef270ab1SKenneth D. Merry 
334ef270ab1SKenneth D. Merry #endif
335