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-2012 Emulex. All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _EMLXS_FCIO_H
28 #define	_EMLXS_FCIO_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * FCIO_REV: 1 - Initial implementation 2 - Added EMLXS_GET_FCIO_REV support
36  */
37 #define	FCIO_REV	2
38 
39 
40 /* Emulex ULP Diag Codes */
41 #define	EMLXS_DIAG			('E'<< 8)
42 
43 #define	EMLXS_DIAG_BIU			(EMLXS_DIAG | 100)
44 #define	EMLXS_DIAG_POST			(EMLXS_DIAG | 101)
45 #define	EMLXS_DIAG_ECHO			(EMLXS_DIAG | 102)
46 
47 #define	EMLXS_PARM_GET_NUM		(EMLXS_DIAG | 200)
48 #define	EMLXS_PARM_GET_LIST		(EMLXS_DIAG | 201)
49 #define	EMLXS_PARM_GET			(EMLXS_DIAG | 202)
50 #define	EMLXS_PARM_SET			(EMLXS_DIAG | 203)
51 #define	EMLXS_GET_BOOT_REV		(EMLXS_DIAG | 204)
52 #define	EMLXS_DOWNLOAD_BOOT		(EMLXS_DIAG | 205)
53 #define	EMLXS_DOWNLOAD_CFL		(EMLXS_DIAG | 206)
54 #define	EMLXS_VPD_GET   		(EMLXS_DIAG | 207)
55 #define	EMLXS_GET_FCIO_REV   		(EMLXS_DIAG | 208)
56 #define	EMLXS_SET_BOOT_STATE_old	(EMLXS_DIAG | 209)
57 #define	EMLXS_GET_BOOT_STATE_old	(EMLXS_DIAG | 210)
58 #define	EMLXS_DFC_COMMAND		(EMLXS_DIAG | 211)
59 #define	EMLXS_SET_BOOT_STATE		(EMLXS_DIAG | 212)
60 #define	EMLXS_GET_BOOT_STATE		(EMLXS_DIAG | 213)
61 #define	EMLXS_GET_DFC_REV		(EMLXS_DIAG | 214)
62 #define	EMLXS_PHY_GET			(EMLXS_DIAG | 215)
63 #define	EMLXS_SET_THROTTLE		(EMLXS_DIAG | 216)
64 #define	EMLXS_GET_THROTTLE		(EMLXS_DIAG | 217)
65 #define	EMLXS_VPD_GET_V2   		(EMLXS_DIAG | 218)
66 
67 #define	EMLXS_BAR_IO			(EMLXS_DIAG | 253)
68 #define	EMLXS_TEST_CODE   		(EMLXS_DIAG | 254)
69 #define	EMLXS_HW_ERROR_TEST   		(EMLXS_DIAG | 255)
70 #define	EMLXS_MB_TIMEOUT_TEST		(EMLXS_DIAG | 256)
71 
72 #define	EMLXS_LOG_GET			(EMLXS_DIAG | 300)
73 
74 
75 /* DUMP file ids */
76 #define	EMLXS_TXT_FILE_ID			1
77 #define	EMLXS_DMP_FILE_ID			2
78 #define	EMLXS_CEE_FILE_ID			3
79 #define	EMLXS_FAT_FILE_ID			4
80 
81 
82 /* Emulex specific error codes */
83 #define	EMLXS_ERRNO_START		0x100
84 #define	EMLXS_TEST_FAILED		(EMLXS_ERRNO_START + 0)	/* Diagnostic */
85 								/* test fail */
86 #define	EMLXS_IMAGE_BAD			(EMLXS_ERRNO_START + 1)	/* Image has */
87 								/* bad data */
88 #define	EMLXS_IMAGE_INCOMPATIBLE	(EMLXS_ERRNO_START + 2)	/* Image not */
89 								/* compatible */
90 								/* with H/W */
91 #define	EMLXS_IMAGE_FAILED		(EMLXS_ERRNO_START + 3)	/* Image */
92 								/* download */
93 								/* failed */
94 #define	EMLXS_OFFLINE_FAILED		(EMLXS_ERRNO_START + 4)	/* Unable to */
95 								/* take HBA */
96 								/* offline */
97 #define	EMLXS_NO_BOOT_CODE		(EMLXS_ERRNO_START + 5)	/* No boot */
98 								/* code image */
99 #define	EMLXS_OP_NOT_SUP		(EMLXS_ERRNO_START + 6)	/* Operation */
100 								/* not supp */
101 #define	EMLXS_REBOOT_REQUIRED		(EMLXS_ERRNO_START + 7)	/* Reboot */
102 								/* required */
103 #define	EMLXS_ERRNO_END			(EMLXS_ERRNO_START + 7)
104 
105 
106 typedef struct emlxs_parm
107 {
108 	char		label[32];
109 	uint32_t	min;
110 	uint32_t	max;
111 	uint32_t	def;
112 	uint32_t	current;
113 	uint32_t	flags;
114 	char		help[128];
115 } emlxs_parm_t;
116 
117 /* emlxs_parm_t flags */
118 #define	PARM_DYNAMIC	0x00000001	/* Reboot not required */
119 #define	PARM_BOOLEAN	0x00000002
120 #define	PARM_HEX	0x00000004
121 
122 /* PARM_DYNAMIC subtypes */
123 #define	PARM_DYNAMIC_RESET	(PARM_DYNAMIC | 0x00000010)	/* Hard reset */
124 								/* required */
125 #define	PARM_DYNAMIC_LINK	(PARM_DYNAMIC | 0x00000020)	/* Link reset */
126 								/* required */
127 
128 typedef struct emlxs_vpd_desc
129 {
130 	char	id[80];
131 	char	part_num[32];
132 	char	eng_change[32];
133 	char	manufacturer[80];
134 	char	serial_num[32];
135 	char	model[32];
136 	char	model_desc[80];
137 	char	port_num[4];
138 	char	prog_types[80];
139 } emlxs_vpd_desc_t;
140 
141 typedef struct emlxs_vpd_desc_v2
142 {
143 	char	id[256];
144 	char	part_num[256];
145 	char	eng_change[256];
146 	char	manufacturer[256];
147 	char	serial_num[256];
148 	char	model[256];
149 	char	model_desc[256];
150 	char	port_num[256];
151 	char	prog_types[256];
152 } emlxs_vpd_desc_v2_t;
153 
154 typedef struct emlxs_phy_desc
155 {
156 	uint32_t phy_type;
157 	uint32_t interface_type;
158 	uint32_t misc_params;
159 	uint32_t rsvd[4];
160 
161 } emlxs_phy_desc_t;
162 
163 typedef struct emlxs_throttle_desc
164 {
165 	uint8_t wwpn[8];
166 	uint32_t throttle;
167 
168 } emlxs_throttle_desc_t;
169 
170 typedef struct emlxs_log_req
171 {
172 	uint32_t	first;	/* First msg id requested */
173 	uint32_t	count;	/* Maximum number of messages */
174 				/* capable of receiving */
175 				/* This value can be set to zero */
176 				/* to receive just log stats */
177 } emlxs_log_req_t;
178 
179 
180 typedef struct emlxs_log_resp
181 {
182 	uint32_t	first;	/* Actual starting msg id in resp buffer */
183 				/* This represents the first available */
184 				/* msg id >= first id requested */
185 	uint32_t	last;	/* Current last msg id in log file */
186 	uint32_t	count;	/* Total number of messages in resp buffer */
187 				/* This value will be <= the max count */
188 				/* requested */
189 
190 				/* If count > 0, then the response buffer */
191 				/* will immediately follow this structure */
192 				/* The response buffer will be an array of */
193 				/* string buffers MAX_MSG_LENGTH in size */
194 #define	MAX_LOG_MSG_LENGTH	160
195 } emlxs_log_resp_t;
196 
197 typedef struct FCIO_EQ_DESC
198 {
199 	uint32_t	host_index;
200 	uint32_t	max_index;
201 	uint32_t	qid;
202 	uint32_t	msix_vector;
203 
204 	uint32_t	phys;	/* specifies physical buffer pointer */
205 	uint32_t	virt;	/* specifies virtual buffer pointer */
206 	uint32_t	virt_hi; /* specifies virtual buffer pointer */
207 
208 	/* Statistics */
209 	uint32_t	max_proc;
210 	uint32_t	isr_count;
211 	uint32_t	num_proc;
212 } FCIO_EQ_DESC_t;
213 
214 
215 typedef struct FCIO_CQ_DESC
216 {
217 	uint32_t	host_index;
218 	uint32_t	max_index;
219 	uint32_t	qid;
220 	uint32_t	eqid;
221 	uint32_t	type;
222 
223 	uint32_t	phys;	/* specifies physical buffer pointer */
224 	uint32_t	virt;	/* specifies virtual buffer pointer */
225 	uint32_t	virt_hi; /* specifies virtual buffer pointer */
226 
227 	/* Statistics */
228 	uint32_t	max_proc;
229 	uint32_t	isr_count;
230 	uint32_t	num_proc;
231 	uint32_t	rsvd;
232 } FCIO_CQ_DESC_t;
233 
234 
235 typedef struct FCIO_WQ_DESC
236 {
237 	uint32_t	host_index;
238 	uint32_t	max_index;
239 	uint32_t	port_index;
240 	uint32_t	release_depth;
241 	uint32_t	qid;
242 	uint32_t	cqid;
243 
244 	uint32_t	phys;	/* specifies physical buffer pointer */
245 	uint32_t	virt;	/* specifies virtual buffer pointer */
246 	uint32_t	virt_hi; /* specifies virtual buffer pointer */
247 
248 	/* Statistics */
249 	uint32_t	num_proc;
250 	uint32_t	num_busy;
251 	uint32_t	rsvd;
252 } FCIO_WQ_DESC_t;
253 
254 
255 typedef struct FCIO_RQ_DESC
256 {
257 	uint32_t	host_index;
258 	uint32_t	max_index;
259 	uint32_t	qid;
260 	uint32_t	cqid;
261 
262 	uint32_t	phys;	/* specifies physical buffer pointer */
263 	uint32_t	virt;	/* specifies virtual buffer pointer */
264 	uint32_t	virt_hi; /* specifies virtual buffer pointer */
265 
266 	/* Statistics */
267 	uint32_t	num_proc;
268 } FCIO_RQ_DESC_t;
269 
270 
271 #define	FCIO_MSI_MAX_INTRS	8
272 #define	FCIO_MAX_WQS_PER_EQ	4
273 #define	FCIO_MAX_EQS	FCIO_MSI_MAX_INTRS
274 #define	FCIO_MAX_WQS	FCIO_MAX_WQS_PER_EQ * FCIO_MAX_EQS
275 #define	FCIO_MAX_RQS	2	/* ONLY 1 pair is allowed */
276 
277 /* One CQ for each WQ & (RQ pair) plus one for the MQ */
278 #define	FCIO_MAX_CQS	(FCIO_MAX_WQS + (FCIO_MAX_RQS/2) + 1)
279 
280 typedef struct FCIO_Q_STAT
281 {
282 	FCIO_EQ_DESC_t	eq[FCIO_MAX_EQS];
283 	FCIO_CQ_DESC_t	cq[FCIO_MAX_CQS];
284 	FCIO_WQ_DESC_t	wq[FCIO_MAX_WQS];
285 	FCIO_RQ_DESC_t	rq[FCIO_MAX_RQS];
286 	uint32_t	que_start_timer;
287 	uint32_t	que_current_timer;
288 	uint32_t	intr_count;
289 } FCIO_Q_STAT_t;
290 
291 
292 #ifdef	__cplusplus
293 }
294 #endif
295 
296 #endif	/* _EMLXS_FCIO_H */
297