1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at
9 * http://www.opensource.org/licenses/cddl1.txt.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 2004-2011 Emulex. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _EMLXS_EVENTS_H
28#define	_EMLXS_EVENTS_H
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34extern void emlxs_null_func();
35
36#ifdef DEF_EVENT_STRUCT
37
38#define	DEFINE_EVT(_name, _label, _mask, _timeout, _destroy) \
39	extern void _destroy(); \
40	emlxs_event_t _name = {_mask, _label, _timeout, _destroy};
41
42#else
43
44#define	DEFINE_EVT(_name, _label, _mask, _timeout, _destroy) \
45	extern void _destroy(); \
46	extern emlxs_event_t _name;
47
48#endif	/* DEF_EVENT_STRUCT */
49
50
51/* Event Mask Bits */
52#define	EVT_LINK		0x00000001	/* FC_REG_LINK_EVENT */
53#define	EVT_RSCN		0x00000002	/* FC_REG_RSCN_EVENT */
54#define	EVT_CT			0x00000004	/* FC_REG_CT_EVENT   */
55#define	EVT_MPULSE		0x00000008	/* FC_REG_MULTIPULSE_EVENT */
56#define	EVT_DUMP		0x00000010	/* FC_REG_DUMP_EVENT */
57#define	EVT_TEMP		0x00000020	/* FC_REG_TEMP_EVENT */
58#define	EVT_VPORTRSCN		0x00000040	/* FC_REG_VPORTRSCN_EVENT */
59#define	EVT_ASYNC		0x00000080	/* FC_REG_ASYNC_EVENT */
60
61#ifdef SAN_DIAG_SUPPORT
62#define	EVT_SD_ELS		0x00001000	/* FC_REG_SD_ELS_EVENT */
63#define	EVT_SD_FABRIC		0x00002000	/* FC_REG_SD_FABRIC_EVENT */
64#define	EVT_SD_SCSI		0x00004000	/* FC_REG_SD_SCSI_EVENT */
65#define	EVT_SD_BOARD		0x00008000	/* FC_REG_SD_BOARD_EVENT */
66#endif /* SAN_DIAG_SUPPORT */
67
68#define	EVT_FCOE		0x80000000	/* FC_REG_FCOE_EVENT */
69
70
71typedef struct emlxs_event
72{
73	uint32_t	mask;
74	char		label[64];
75	uint32_t 	timeout;
76	void		(*destroy)();
77
78} emlxs_event_t;
79
80
81#define	EMLXS_EVENT_PERIOD	5
82#define	EVT_TIMEOUT_DEFAULT	60
83#define	EVT_TIMEOUT_NEVER	0
84#define	EVT_DESTROY_DEFAULT	emlxs_null_func
85
86
87/* EVENT defines */
88DEFINE_EVT(emlxs_link_event, \
89	"LINK", \
90	EVT_LINK,
91	EVT_TIMEOUT_DEFAULT,
92	EVT_DESTROY_DEFAULT)
93
94DEFINE_EVT(emlxs_rscn_event, \
95	"RSCN", \
96	EVT_RSCN,
97	EVT_TIMEOUT_DEFAULT,
98	EVT_DESTROY_DEFAULT)
99
100DEFINE_EVT(emlxs_vportrscn_event, \
101	"VPORT RSCN", \
102	EVT_VPORTRSCN,
103	EVT_TIMEOUT_DEFAULT,
104	EVT_DESTROY_DEFAULT)
105
106DEFINE_EVT(emlxs_ct_event, \
107	"CT", \
108	EVT_CT,
109	EVT_TIMEOUT_DEFAULT,
110	emlxs_ct_event_destroy)
111
112DEFINE_EVT(emlxs_dump_event, \
113	"DUMP", \
114	EVT_DUMP,
115	EVT_TIMEOUT_DEFAULT,
116	EVT_DESTROY_DEFAULT)
117
118DEFINE_EVT(emlxs_temp_event, \
119	"TEMP", \
120	EVT_TEMP,
121	EVT_TIMEOUT_DEFAULT,
122	EVT_DESTROY_DEFAULT)
123
124DEFINE_EVT(emlxs_fcoe_event, \
125	"FCOE", \
126	EVT_FCOE,
127	EVT_TIMEOUT_DEFAULT,
128	EVT_DESTROY_DEFAULT)
129
130DEFINE_EVT(emlxs_async_event, \
131	"ASYNC", \
132	EVT_ASYNC,
133	EVT_TIMEOUT_DEFAULT,
134	EVT_DESTROY_DEFAULT)
135
136#ifdef SAN_DIAG_SUPPORT
137DEFINE_EVT(emlxs_sd_els_event, \
138	"SD_ELS", \
139	EVT_SD_ELS,
140	EVT_TIMEOUT_DEFAULT,
141	EVT_DESTROY_DEFAULT)
142
143DEFINE_EVT(emlxs_sd_fabric_event, \
144	"SD_FC", \
145	EVT_SD_FABRIC,
146	EVT_TIMEOUT_DEFAULT,
147	EVT_DESTROY_DEFAULT)
148
149DEFINE_EVT(emlxs_sd_scsi_event, \
150	"SD_SCSI", \
151	EVT_SD_SCSI,
152	EVT_TIMEOUT_DEFAULT,
153	EVT_DESTROY_DEFAULT)
154
155DEFINE_EVT(emlxs_sd_board_event, \
156	"SD_BOARD", \
157	EVT_SD_BOARD,
158	EVT_TIMEOUT_DEFAULT,
159	EVT_DESTROY_DEFAULT)
160#endif /* SAN_DIAG_SUPPORT */
161
162#define	MAX_LOG_INFO_LENGTH	96
163
164typedef struct emlxs_event_entry
165{
166	struct emlxs_event_entry	*next;
167	struct emlxs_event_entry	*prev;
168
169	uint32_t	id;
170	uint32_t	timestamp;
171	uint32_t	timer;
172
173	emlxs_event_t	*evt;
174
175	void *port;
176
177	void		*bp;			/* Context buffer */
178						/* pointer */
179	uint32_t	size;			/* Context buffer */
180						/* size */
181	uint32_t	flag;
182#define	EMLXS_DFC_EVENT_DONE	0x00000001
183#define	EMLXS_SD_EVENT_DONE	0x00000002
184
185} emlxs_event_entry_t;
186
187
188typedef struct emlxs_event_queue
189{
190	kmutex_t		lock;
191	kcondvar_t		lock_cv;
192
193	uint32_t		last_id[32]; /* per event */
194	uint32_t		next_id;
195	uint32_t		count;
196
197	emlxs_event_entry_t	*first;
198	emlxs_event_entry_t	*last;
199
200} emlxs_event_queue_t;
201
202#ifdef	__cplusplus
203}
204#endif
205
206#endif	/* _EMLXS_EVENTS_H */
207