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 usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
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 /* Copyright 2009 QLogic Corporation */
23 
24 /*
25  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 #ifndef	_QL_INIT_H
30 #define	_QL_INIT_H
31 
32 /*
33  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
34  *
35  * ***********************************************************************
36  * *									**
37  * *				NOTICE					**
38  * *		COPYRIGHT (C) 1996-2009 QLOGIC CORPORATION		**
39  * *			ALL RIGHTS RESERVED				**
40  * *									**
41  * ***********************************************************************
42  *
43  */
44 
45 #ifdef	__cplusplus
46 extern "C" {
47 #endif
48 
49 /*
50  * ISP2200 NVRAM structure definition.
51  * Little endian except where noted.
52  */
53 typedef struct nvram {
54 	/*
55 	 * NVRAM header
56 	 */
57 	uint8_t	 id[4];
58 	uint8_t	 nvram_version;
59 	uint8_t	 reserved_0;
60 
61 	/*
62 	 * NVRAM RISC parameter block
63 	 */
64 	uint8_t	 parameter_block_version;
65 	uint8_t	 reserved_1;
66 
67 	/*
68 	 * LSB BIT 0  = enable_hard_loop_id
69 	 * LSB BIT 1  = enable_fairness
70 	 * LSB BIT 2  = enable_full_duplex
71 	 * LSB BIT 3  = enable_fast_posting
72 	 * LSB BIT 4  = enable_target_mode
73 	 * LSB BIT 5  = disable_initiator_mode
74 	 * LSB BIT 6  = enable_adisc
75 	 * LSB BIT 7  = enable_target_inquiry_data
76 	 *
77 	 * MSB BIT 0  = enable_port_update_ae
78 	 * MSB BIT 1  = disable_initial_lip
79 	 * MSB BIT 2  = enable_decending_soft_assign
80 	 * MSB BIT 3  = previous_assigned_addressing
81 	 * MSB BIT 4  = enable_stop_q_on_full
82 	 * MSB BIT 5  = enable_full_login_on_lip
83 	 * MSB BIT 6  = enable_node_name
84 	 * MSB BIT 7  = extended_control_block
85 	 */
86 	uint8_t	 firmware_options[2];
87 
88 	uint8_t	 max_frame_length[2];
89 	uint8_t	 max_iocb_allocation[2];
90 	uint8_t	 execution_throttle[2];
91 	uint8_t	 login_retry_count;
92 	uint8_t	 retry_delay;			/* unused */
93 	uint8_t	 port_name[8];			/* Big endian. */
94 	uint8_t	 hard_address[2];
95 	uint8_t	 inquiry;
96 	uint8_t	 login_timeout;
97 	uint8_t	 node_name[8];			/* Big endian. */
98 
99 	/*
100 	 * LSB BIT 0 = Timer operation mode bit 0
101 	 * LSB BIT 1 = Timer operation mode bit 1
102 	 * LSB BIT 2 = Timer operation mode bit 2
103 	 * LSB BIT 3 = Timer operation mode bit 3
104 	 * LSB BIT 4 = P2P Connection option bit 0
105 	 * LSB BIT 5 = P2P Connection option bit 1
106 	 * LSB BIT 6 = P2P Connection option bit 2
107 	 * LSB BIT 7 = Enable Non part on LIHA failure
108 	 *
109 	 * MSB BIT 0 = Enable class 2
110 	 * MSB BIT 1 = Enable ACK0
111 	 * MSB BIT 2 =
112 	 * MSB BIT 3 =
113 	 * MSB BIT 4 = FC Tape Enable
114 	 * MSB BIT 5 = Enable FC Confirm
115 	 * MSB BIT 6 = Enable command queuing in target mode
116 	 * MSB BIT 7 = No Logo On Link Down
117 	 */
118 	uint8_t	 add_fw_opt[2];
119 	uint8_t	 response_accumulation_timer;
120 	uint8_t	 interrupt_delay_timer;
121 
122 	/*
123 	 * LSB BIT 0 = Enable Read xfr_rdy
124 	 * LSB BIT 1 = Soft ID only
125 	 * LSB BIT 2 =
126 	 * LSB BIT 3 =
127 	 * LSB BIT 4 = FCP RSP Payload [0]
128 	 * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200
129 	 * LSB BIT 6 =
130 	 * LSB BIT 7 =
131 	 *
132 	 * MSB BIT 0 = Sbus enable - 2300
133 	 * MSB BIT 1 =
134 	 * MSB BIT 2 =
135 	 * MSB BIT 3 =
136 	 * MSB BIT 4 =
137 	 * MSB BIT 5 = Enable 50 ohm termination
138 	 * MSB BIT 6 = Data Rate (2300 only)
139 	 * MSB BIT 7 = Data Rate (2300 only)
140 	 */
141 	uint8_t	 special_options[2];
142 
143 	/* Reserved for expanded RISC parameter block */
144 	uint8_t reserved_4[26];
145 
146 	/*
147 	 * NVRAM host parameter block
148 	 *
149 	 * LSB BIT 0 = unused
150 	 * LSB BIT 1 = disable_bios
151 	 * LSB BIT 2 = disable_luns
152 	 * LSB BIT 3 = enable_selectable_boot
153 	 * LSB BIT 4 = disable_risc_code_load
154 	 * LSB BIT 5 = set_cache_line_size_1
155 	 * LSB BIT 6 = pci_parity_disable
156 	 * LSB BIT 7 = enable_extended_logging
157 	 *
158 	 * MSB BIT 0 = enable_64bit_addressing
159 	 * MSB BIT 1 = enable_lip_reset
160 	 * MSB BIT 2 = enable_lip_full_login
161 	 * MSB BIT 3 = enable_target_reset
162 	 * MSB BIT 4 = enable_database_storage
163 	 * MSB BIT 5 = unused
164 	 * MSB BIT 6 = unused
165 	 * MSB BIT 7 = unused
166 	 */
167 	uint8_t	 host_p[2];
168 
169 	uint8_t	 boot_node_name[8];
170 	uint8_t	 boot_lun_number;
171 	uint8_t	 reset_delay;
172 	uint8_t	 port_down_retry_count;
173 	uint8_t	 reserved_5;
174 
175 	uint8_t  maximum_luns_per_target[2];
176 
177 	uint8_t reserved_6[14];
178 
179 	/* Offset 100 */
180 	uint8_t reverved_7[12];
181 
182 	/* offset 112 */
183 	uint8_t adapInfo[16];	/* Sun OEM HBA's 23xx only */
184 
185 	uint8_t reserved_8[22];
186 
187 	/* Offset 150 */
188 	uint8_t reserved_9[50];
189 
190 	/* Offset 200 */
191 	uint8_t reserved_10[32];
192 
193 	/*
194 	 * NVRAM Adapter Features offset 232-239
195 	 *
196 	 * LSB BIT 0 = External GBIC
197 	 * LSB BIT 1 = Risc RAM parity
198 	 * LSB BIT 2 = Buffer Plus Module
199 	 * LSB BIT 3 = Multi Chip Adapter
200 	 * LSB BIT 4 =
201 	 * LSB BIT 5 =
202 	 * LSB BIT 6 =
203 	 * LSB BIT 7 =
204 	 *
205 	 * MSB BIT 0 =
206 	 * MSB BIT 1 =
207 	 * MSB BIT 2 =
208 	 * MSB BIT 3 =
209 	 * MSB BIT 4 =
210 	 * MSB BIT 5 =
211 	 * MSB BIT 6 =
212 	 * MSB BIT 7 =
213 	 */
214 	uint8_t adapter_features[2];
215 	uint8_t reserved_11[6];
216 
217 	/*
218 	 * Resrved for use with ISP2300 - offset 240
219 	 */
220 	uint8_t reserved_12[4];
221 
222 	/* Subsystem ID must be at offset 244 */
223 	uint8_t subsystem_vendor_id[2];
224 
225 	uint8_t reserved_13[2];
226 
227 	/* Subsystem device ID must be at offset 248 */
228 	uint8_t subsystem_device_id[2];
229 
230 	/* Subsystem vendor ID for ISP2200 */
231 	uint8_t subsystem_vendor_id_2200[2];
232 
233 	/* Subsystem device ID for ISP2200 */
234 	uint8_t subsystem_device_id_2200[2];
235 
236 	uint8_t	 reserved_14;
237 	uint8_t	 checksum;
238 } nvram_t;
239 
240 /*
241  * NVRAM structure definition.
242  */
243 typedef struct nvram_24xx {
244 	/* NVRAM header. */
245 	uint8_t id[4];
246 	uint8_t nvram_version[2];
247 	uint8_t reserved_0[2];
248 
249 	/* Firmware Initialization Control Block. */
250 	uint8_t version[2];
251 	uint8_t reserved_1[2];
252 	uint8_t max_frame_length[2];
253 	uint8_t execution_throttle[2];
254 	uint8_t exchange_count[2];
255 	uint8_t hard_address[2];
256 	uint8_t port_name[8];
257 	uint8_t node_name[8];
258 	uint8_t login_retry_count[2];
259 	uint8_t link_down_on_nos[2];
260 	uint8_t interrupt_delay_timer[2];
261 	uint8_t login_timeout[2];
262 
263 	/*
264 	 * BIT 0  = Hard Assigned Loop ID
265 	 * BIT 1  = Enable Fairness
266 	 * BIT 2  = Enable Full-Duplex
267 	 * BIT 3  = Reserved
268 	 * BIT 4  = Target Mode Enable
269 	 * BIT 5  = Initiator Mode Disable
270 	 * BIT 6  = Reserved
271 	 * BIT 7  = Reserved
272 	 *
273 	 * BIT 8  = Reserved
274 	 * BIT 9  = Disable Initial LIP
275 	 * BIT 10 = Descending Loop ID Search
276 	 * BIT 11 = Previous Assigned Loop ID
277 	 * BIT 12 = Reserved
278 	 * BIT 13 = Full Login after LIP
279 	 * BIT 14 = Node Name Option
280 	 * BIT 15 = Reserved
281 	 *
282 	 * BIT 16-31 = Reserved
283 	 */
284 	uint8_t firmware_options_1[4];
285 
286 	/*
287 	 * BIT 0  = Operation Mode bit 0
288 	 * BIT 1  = Operation Mode bit 1
289 	 * BIT 2  = Operation Mode bit 2
290 	 * BIT 3  = Operation Mode bit 3
291 	 * BIT 4  = Connection Options bit 0
292 	 * BIT 5  = Connection Options bit 1
293 	 * BIT 6  = Connection Options bit 2
294 	 * BIT 7  = Enable Non part on LIHA failure
295 	 *
296 	 * BIT 8  = Enable Class 2
297 	 * BIT 9  = Enable ACK0
298 	 * BIT 10 = Enable Virtual Fabric
299 	 * BIT 11 = Enable FC-SP Security
300 	 * BIT 12 = FC Tape Enable
301 	 * BIT 13 = Reserved
302 	 * BIT 14 = Target PRLI Control
303 	 * BIT 15 = Reserved
304 	 *
305 	 * BIT 16  = Enable Emulated MSIX
306 	 * BIT 17  = Reserved
307 	 * BIT 18  = Enable Alternate Device Number
308 	 * BIT 19  = Enable Alternate Bus Number
309 	 * BIT 20  = Enable Translated Address
310 	 * BIT 21  = Enable VM Security
311 	 * BIT 22  = Enable Interrupt Handshake
312 	 * BIT 23  = Enable Multiple Queue
313 	 *
314 	 * BIT 24  = IOCB Security
315 	 * BIT 25  = qos
316 	 * BIT 26-31 = Reserved
317 	 */
318 	uint8_t firmware_options_2[4];
319 
320 	/*
321 	 * BIT 0  = Reserved
322 	 * BIT 1  = Soft ID only
323 	 * BIT 2  = Reserved
324 	 * BIT 3  = disable split completion timeout
325 	 * BIT 4  = FCP RSP Payload bit 0
326 	 * BIT 5  = FCP RSP Payload bit 1
327 	 * BIT 6  = Enable Rec Out-of-Order data frame handling
328 	 * BIT 7  = Disable Automatic PLOGI on Local Loop
329 	 *
330 	 * BIT 8  = Reserved
331 	 * BIT 9  = Enable Out-of-Order FCP_XFER_RDY relative
332 	 *	    offset handling
333 	 * BIT 10 = Reserved
334 	 * BIT 11 = Reserved
335 	 * BIT 12 = Reserved
336 	 * BIT 13 = Data Rate bit 0
337 	 * BIT 14 = Data Rate bit 1
338 	 * BIT 15 = Data Rate bit 2
339 	 *
340 	 * BIT 16 = 75-ohm Termination Select
341 	 * BIT 17 = Enable Multiple FCFs
342 	 * BIT 18 = MAC Addressing Mode
343 	 * BIT 19 = MAC Addressing Mode
344 	 * BIT 20 = MAC Addressing Mode
345 	 * BIT 21 = Ethernet Data Rate
346 	 * BIT 22 = Ethernet Data Rate
347 	 * BIT 23 = Ethernet Data Rate
348 	 *
349 	 * BIT 24 = Ethernet Data Rate
350 	 * BIT 25 = Ethernet Data Rate
351 	 * BIT 26 = Enable Ethernet Header ATIO Queue
352 	 * BIT 27 = Enable Ethernet Header Response Queue
353 	 * BIT 28 = SPMA Selection
354 	 * BIT 29 = SPMA Selection
355 	 * BIT 30 = Reserved
356 	 * BIT 31 = Reserved
357 	 */
358 	uint8_t firmware_options_3[4];
359 
360 	union {
361 		struct {
362 			/*
363 			 * Offset 56 (38h)
364 			 * Serial Link Control
365 			 * BIT 0 = control enable
366 			 * BIT 1-15 = Reserved
367 			 */
368 			uint8_t swing_opt[2];
369 			/*
370 			 * Offset 58 (3Ah)
371 			 * Serial Link Control 1G
372 			 * BIT 0-7   = Reserved
373 			 *
374 			 * BIT 8-10  = output swing
375 			 * BIT 11-13 = output emphasis
376 			 * BIT 14-15 = Reserved
377 			 */
378 			uint8_t swing_1g[2];
379 			/*
380 			 * Offset 60 (3Ch)
381 			 * Serial Link Control 2G
382 			 * BIT 0-7   = Reserved
383 			 *
384 			 * BIT 8-10  = output swing
385 			 * BIT 11-13 = output emphasis
386 			 * BIT 14-15 = Reserved
387 			 */
388 			uint8_t swing_2g[2];
389 			/*
390 			 * Offset 62 (3Eh)
391 			 * Serial Link Control 4G
392 			 * BIT 0-7   = Reserved
393 			 *
394 			 * BIT 8-10  = output swing
395 			 * BIT 11-13 = output emphasis
396 			 * BIT 14-15 = Reserved
397 			 */
398 			uint8_t swing_4g[2];
399 
400 			/* Offset 64 (40h). */
401 			uint8_t reserved[32];
402 		} isp2400;
403 		struct {
404 			/*
405 			 * Offset 56 (38h)
406 			 * Serial Link Control
407 			 * BIT 0  = Reserved
408 			 * BIT 1  = 25xx TX control enable
409 			 * BIT 2  = 25xx RX control enable (lmtg)
410 			 * BIT 3  = 25xx RX control enable (linear)
411 			 * BIT 4  = embedded HBA
412 			 * BIT 5  = unused
413 			 * BIT 6  = 25xx E7 Addr27 Preset
414 			 * BIT 7  = 25xx E6 Addr0 Ch0 enable
415 			 *
416 			 * BIT 8-15 = 25xx E6 Addr0 Ch0
417 			 *
418 			 * BIT 16-31 = Reserved
419 			 */
420 			uint8_t swing_opt[4];
421 
422 			/*
423 			 * Offset 60 (3Ch)
424 			 * Serial Link TX Parameters
425 			 * BIT 0 = TX Amplitude
426 			 * BIT 1 = TX Amplitude
427 			 * BIT 2 = TX Amplitude
428 			 * BIT 3 = TX Amplitude
429 			 * BIT 4 = TX Amplitude
430 			 * BIT 5 = TX iPost
431 			 * BIT 6 = TX iPost
432 			 * BIT 7 = TX iPost
433 			 *
434 			 * BIT 8 = TX iPost
435 			 * BIT 9 = TX iPre
436 			 * BIT 10 = TX iPre
437 			 * BIT 11 = TX iPre
438 			 * BIT 12 = TX iPre
439 			 * BIT 13 = TX iMain
440 			 * BIT 14 = TX iMain
441 			 * BIT 15 = TX iMain
442 			 *
443 			 * BIT 16 = TX iMain
444 			 * BIT 17 = TX iMain
445 			 * BIT 18-23 = Reserved
446 			 *
447 			 * BIT 24-31 = Reserved
448 			 */
449 			uint8_t tx_8g[4];
450 			/* Offset 64 (40h) */
451 			uint8_t tx_4g[4];
452 			/* Offset 68 (44h) */
453 			uint8_t tx_2g[4];
454 
455 			/*
456 			 * Offset 72 (48h)
457 			 * Serial Link RX Parameters
458 			 * BIT 0 = RX Z1Cnt
459 			 * BIT 1 = RX Z1Cnt
460 			 * BIT 2 = RX Z1Cnt
461 			 * BIT 3 = RX Z1Cnt
462 			 * BIT 4 = RX G1Cnt
463 			 * BIT 5 = RX ZCnt
464 			 * BIT 6 = RX ZCnt
465 			 * BIT 7 = RX ZCnt
466 			 *
467 			 * BIT 8 = RX ZCnt
468 			 * BIT 9 = RX ZCnt
469 			 * BIT 10 = RX TLTH
470 			 * BIT 11 = RX TLTH
471 			 * BIT 12 = RX TLTH
472 			 * BIT 13 = RX TLTH
473 			 * BIT 14 = RX TLTH
474 			 * BIT 15 = RX TLTH
475 			 *
476 			 * BIT 16 = RX DFELTH
477 			 * BIT 17 = RX DFELTH
478 			 * BIT 18 = RX DFELTH
479 			 * BIT 19 = RX DFELTH
480 			 * BIT 20 = RX DFELTH
481 			 * BIT 21 = RX DFELTH
482 			 * BIT 22-23 = Reserved
483 			 *
484 			 * BIT 24-31 = Reserved
485 			 */
486 			uint8_t rx_limit_8g[4];
487 			/* Offset 76 (4Ch) */
488 			uint8_t rx_limit_4g[4];
489 			/* Offset 80 (50h) */
490 			uint8_t rx_limit_2g[4];
491 			/* Offset 84 (54h) */
492 			uint8_t rx_linear_8g[4];
493 			/* Offset 88 (58h) */
494 			uint8_t rx_linear_4g[4];
495 			/* Offset 92 (5Ch) */
496 			uint8_t rx_linear_2g[4];
497 		} isp2500;
498 		struct {
499 			/* Offset 56 (38h) */
500 			uint8_t reserved[8];
501 
502 			/* Offset 64 (40h). */
503 			uint8_t e_node_mac_addr[6];
504 
505 			/* Offset 70 (46h). */
506 			uint8_t reserved2[26];
507 		} isp8001;
508 	} fw;
509 
510 	/*
511 	 * Offset 96 (60h)
512 	 * BIT 0   = initiator op
513 	 * BIT 1   = target op
514 	 * BIT 2   = VI op
515 	 * BIT 3-7 = Reserved
516 	 */
517 	uint8_t oem_specific;
518 	uint8_t reserved_4[15];
519 
520 	/* Offset 112 (70h). */
521 	uint8_t reserved_5[16];
522 
523 	/*
524 	 * Offset 128 (80h).
525 	 * PCIe table entries.
526 	 * Firmware Extended Initialization Control Block.
527 	 */
528 	ql_ext_icb_8100_t	ext_blk;
529 
530 	/* Offset 192. */
531 	uint8_t reserved_6[32];
532 
533 	/* Offset 224. */
534 	uint8_t reserved_7[32];
535 
536 	/*
537 	 * BIT 0  = Enable spinup delay
538 	 * BIT 1  = Disable BIOS
539 	 * BIT 2  = Enable Memory Map BIOS
540 	 * BIT 3  = Enable Selectable Boot
541 	 * BIT 4  = Disable RISC code load
542 	 * BIT 5  = Disable serdes
543 	 * BIT 6  = Enable opt boot mode
544 	 * BIT 7  = Enable int mode BIOS
545 	 *
546 	 * BIT 8  = EV control enable
547 	 * BIT 9  = Enable lip reset
548 	 * BIT 10 = Enable lip full login
549 	 * BIT 11 = Enable target reset
550 	 * BIT 12 = Stop firmware
551 	 * BIT 13 = Default Node Name Option
552 	 * BIT 14 = Default WWPN valid
553 	 * BIT 15 = Enable alternate WWN
554 	 *
555 	 * CLP BIOS flags
556 	 *
557 	 * BIT 16 = clp lun string
558 	 * BIT 17 = clp target string
559 	 * BIT 18 = clp bios enable string
560 	 * BIT 19 = clp serdes_string
561 	 * BIT 20 = clp wwpn string
562 	 * BIT 21 = clp wwnn string
563 	 * BIT 22 = win reserverd 0
564 	 * BIT 23 = win reserverd 1
565 	 *
566 	 * BIT 24 = keep wwpn
567 	 * BIT 25 = temp wwpn
568 	 * BIT 26 = win reserverd 2
569 	 * BIT 27 = win reserverd 3
570 	 * BIT 28 = clear WBT in flash (win driver)
571 	 * BIT 29 = write WBT in flash (win driver)
572 	 * BIT 30 = load fw from flash (win driver)
573 	 * BIT 31 = enable alternate WWN (win driver)
574 	 */
575 	uint8_t host_p[4];
576 
577 	uint8_t alternate_port_name[8];
578 	uint8_t alternate_node_name[8];
579 
580 	uint8_t boot_port_name[8];
581 	uint8_t boot_lun_number[2];
582 	uint8_t reserved_8[2];
583 
584 	uint8_t alt1_boot_port_name[8];
585 	uint8_t alt1_boot_lun_number[2];
586 	uint8_t reserved_9[2];
587 
588 	uint8_t alt2_boot_port_name[8];
589 	uint8_t alt2_boot_lun_number[2];
590 	uint8_t reserved_10[2];
591 
592 	uint8_t alt3_boot_port_name[8];
593 	uint8_t alt3_boot_lun_number[2];
594 	uint8_t reserved_11[2];
595 
596 	/*
597 	 * BIT 0 = Selective Login
598 	 * BIT 1 = Alt-Boot Enable
599 	 * BIT 2 = Reserved
600 	 * BIT 3 = Enable Boot Order List
601 	 * BIT 4 = Reserved
602 	 * BIT 5 = Enable Selective LUN
603 	 * BIT 6 = Reserved
604 	 * BIT 7-31 =
605 	 */
606 	uint8_t efi_parameters[4];
607 
608 	uint8_t reset_delay;
609 	uint8_t reserved_12;
610 	uint8_t reserved_13[2];
611 
612 	uint8_t boot_id_number[2];
613 	uint8_t reserved_14[2];
614 
615 	uint8_t max_luns_per_target[2];
616 	uint8_t reserved_15[2];
617 
618 	uint8_t port_down_retry_count[2];
619 	uint8_t link_down_timeout[2];
620 
621 	/*
622 	 * FCode parameters word (offset 344)
623 	 *
624 	 * BIT 0 = Enable BIOS pathname
625 	 * BIT 1 = fcode qlc
626 	 * BIT 2 = fcode host
627 	 * BIT 3 = fcode sunid
628 	 * BIT 4-7 =
629 	 */
630 	uint8_t	fcode_p0;
631 	uint8_t reserved_16[7];
632 
633 	/*
634 	 * Offset 352 (160h).
635 	 * uint8_t prev_drv_ver_major;
636 	 * uint8_t prev_drv_ver_submajob;
637 	 * uint8_t prev_drv_ver_minor;
638 	 * uint8_t prev_drv_ver_subminor;
639 	 * uint8_t prev_bios_ver_major[2];
640 	 * uint8_t prev_bios_ver_minor[2];
641 	 * uint8_t prev_efi_ver_major[2];
642 	 * uint8_t prev_efi_ver_minor[2];
643 	 * uint8_t prev_fw_ver_major[2];
644 	 * uint8_t prev_fw_ver_minor;
645 	 * uint8_t prev_fw_ver_subminor;
646 	 * uint8_t reserved[16];
647 	 */
648 	uint8_t mac_address[6];
649 	uint8_t clp_flag[2];
650 	uint8_t reserved_18[24];
651 
652 	/* Offset 384 (180h). */
653 	uint8_t	def_port_name[8];
654 	uint8_t def_node_name[8];
655 	uint8_t clp_flag1[2];
656 	uint8_t clp_flag2[2];
657 
658 	/* Offset 404 (194h). */
659 	uint8_t default_firmware_options[2];
660 
661 	/* Offset 406 (196h). */
662 	uint8_t enhanced_features[2];
663 	uint8_t serdes_index[2];
664 	uint8_t reserved_19[6];
665 
666 	/* Offset 416 (1A0h). */
667 	uint8_t alt4_boot_port_name[8];
668 	uint8_t alt4_boot_lun_number[2];
669 	uint8_t reserved_20[2];
670 
671 	/* Offset 428 (1ACh). */
672 	uint8_t alt5_boot_port_name[8];
673 	uint8_t alt5_boot_lun_number[2];
674 	uint8_t reserved_21[2];
675 
676 	/* Offset 440 (1B8h). */
677 	uint8_t alt6_boot_port_name[8];
678 	uint8_t alt6_boot_lun_number[2];
679 	uint8_t reserved_22[2];
680 
681 	/* Offset 452 (1C4h). */
682 	uint8_t alt7_boot_port_name[8];
683 	uint8_t alt7_boot_lun_number[2];
684 	uint8_t reserved_23[2];
685 
686 	/* Offset 464 (1D0h). */
687 	uint8_t reserved_24[12];
688 
689 	/* Offset 476 (1DCh). */
690 	uint8_t	fw_table_offset[2];
691 	uint8_t fw_table_sig[2];
692 
693 	/* Offset 480 (1E0h). */
694 	int8_t  model_name[4];
695 	int8_t  model_name1[12]; /* 24xx power_table[8]. */
696 
697 	/* Offset 496 (1F0h). */
698 	uint8_t feature_mask_l[2];
699 	uint8_t feature_mask_h[2];
700 	uint8_t reserved_25[4];
701 
702 	/* Offset 504 (1F8h). */
703 	uint8_t subsystem_vendor_id[2];
704 	uint8_t subsystem_device_id[2];
705 
706 	uint8_t checksum[4];
707 } nvram_24xx_t;
708 
709 /*
710  * Firmware Dump structure definition
711  */
712 #define	QL_2200_FW_DUMP_SIZE	0x68000		/* bytes */
713 #define	QL_2300_FW_DUMP_SIZE	0xE2000		/* bytes */
714 #define	QL_6322_FW_DUMP_SIZE	0xE2000		/* bytes */
715 #define	QL_24XX_FW_DUMP_SIZE	0x0330000	/* bytes */
716 #define	QL_25XX_FW_DUMP_SIZE	0x0330000	/* bytes */
717 
718 #define	QL_24XX_VPD_SIZE	0x200		/* bytes */
719 #define	QL_24XX_SFP_SIZE	0x200		/* bytes */
720 
721 /*
722  * firmware dump struct for 2300 is a superset of firmware dump struct
723  * for 2200. Fields which are 2300 only or are enhanced for 2300 are
724  * marked below.
725  */
726 typedef struct ql_fw_dump {
727 	uint16_t pbiu_reg[8];
728 	uint16_t risc_host_reg[8];	/* 2300 only. */
729 	uint16_t mailbox_reg[16];	/* 2200 only needs 8 */
730 	uint16_t resp_dma_reg[32];	/* 2300 only. */
731 	uint16_t dma_reg[48];
732 	uint16_t risc_hdw_reg[16];
733 	uint16_t risc_gp0_reg[16];
734 	uint16_t risc_gp1_reg[16];
735 	uint16_t risc_gp2_reg[16];
736 	uint16_t risc_gp3_reg[16];
737 	uint16_t risc_gp4_reg[16];
738 	uint16_t risc_gp5_reg[16];
739 	uint16_t risc_gp6_reg[16];
740 	uint16_t risc_gp7_reg[16];
741 	uint16_t frame_buf_hdw_reg[64];	/* 2200 has only 16 */
742 	uint16_t fpm_b0_reg[64];
743 	uint16_t fpm_b1_reg[64];
744 	uint16_t risc_ram[0xf800];	/* 2200 needs only 0xf000 */
745 	uint16_t stack_ram[0x800];	/* 2300 only */
746 	uint16_t data_ram[0xf800];	/* 2300 only */
747 	uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
748 	uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
749 } ql_fw_dump_t;
750 
751 typedef struct ql_24xx_fw_dump {
752 	uint32_t hccr;
753 	uint32_t host_reg[32];
754 	uint16_t mailbox_reg[32];
755 	uint32_t xseq_gp_reg[128];
756 	uint32_t xseq_0_reg[16];
757 	uint32_t xseq_1_reg[16];
758 	uint32_t rseq_gp_reg[128];
759 	uint32_t rseq_0_reg[16];
760 	uint32_t rseq_1_reg[16];
761 	uint32_t rseq_2_reg[16];
762 	uint32_t cmd_dma_reg[16];
763 	uint32_t req0_dma_reg[15];
764 	uint32_t resp0_dma_reg[15];
765 	uint32_t req1_dma_reg[15];
766 	uint32_t xmt0_dma_reg[32];
767 	uint32_t xmt1_dma_reg[32];
768 	uint32_t xmt2_dma_reg[32];
769 	uint32_t xmt3_dma_reg[32];
770 	uint32_t xmt4_dma_reg[32];
771 	uint32_t xmt_data_dma_reg[16];
772 	uint32_t rcvt0_data_dma_reg[32];
773 	uint32_t rcvt1_data_dma_reg[32];
774 	uint32_t risc_gp_reg[128];
775 	uint32_t shadow_reg[7];
776 	uint32_t lmc_reg[112];
777 	uint32_t fpm_hdw_reg[192];
778 	uint32_t fb_hdw_reg[176];
779 	uint32_t code_ram[0x2000];
780 	uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
781 	uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
782 	uint32_t ext_trace_buf[FWEXTSIZE / 4];
783 	uint32_t fce_trace_buf[FWFCESIZE / 4];
784 	uint32_t ext_mem[1];
785 } ql_24xx_fw_dump_t;
786 
787 typedef struct ql_25xx_fw_dump {
788 	uint32_t r2h_status;
789 	uint32_t hostrisc_reg[32];
790 	uint32_t pcie_reg[4];
791 	uint32_t host_reg[32];
792 	uint16_t mailbox_reg[32];
793 	uint32_t xseq_gp_reg[128];
794 	uint32_t xseq_0_reg[48];
795 	uint32_t xseq_1_reg[16];
796 	uint32_t rseq_gp_reg[128];
797 	uint32_t rseq_0_reg[32];
798 	uint32_t rseq_1_reg[16];
799 	uint32_t rseq_2_reg[16];
800 	uint32_t aseq_gp_reg[128];
801 	uint32_t aseq_0_reg[32];
802 	uint32_t aseq_1_reg[16];
803 	uint32_t aseq_2_reg[16];
804 	uint32_t cmd_dma_reg[16];
805 	uint32_t req0_dma_reg[15];
806 	uint32_t resp0_dma_reg[15];
807 	uint32_t req1_dma_reg[15];
808 	uint32_t xmt0_dma_reg[32];
809 	uint32_t xmt1_dma_reg[32];
810 	uint32_t xmt2_dma_reg[32];
811 	uint32_t xmt3_dma_reg[32];
812 	uint32_t xmt4_dma_reg[32];
813 	uint32_t xmt_data_dma_reg[16];
814 	uint32_t rcvt0_data_dma_reg[32];
815 	uint32_t rcvt1_data_dma_reg[32];
816 	uint32_t risc_gp_reg[128];
817 	uint32_t shadow_reg[11];
818 	uint32_t risc_io;
819 	uint32_t lmc_reg[128];
820 	uint32_t fpm_hdw_reg[192];
821 	uint32_t fb_hdw_reg[192];
822 	uint32_t code_ram[0x2000];
823 	uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
824 	uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
825 	uint32_t ext_trace_buf[FWEXTSIZE / 4];
826 	uint32_t fce_trace_buf[FWFCESIZE / 4];
827 	uint32_t ext_mem[1];
828 } ql_25xx_fw_dump_t;
829 
830 typedef struct ql_81xx_fw_dump {
831 	uint32_t r2h_status;
832 	uint32_t hostrisc_reg[32];
833 	uint32_t pcie_reg[4];
834 	uint32_t host_reg[32];
835 	uint16_t mailbox_reg[32];
836 	uint32_t xseq_gp_reg[128];
837 	uint32_t xseq_0_reg[48];
838 	uint32_t xseq_1_reg[16];
839 	uint32_t rseq_gp_reg[128];
840 	uint32_t rseq_0_reg[32];
841 	uint32_t rseq_1_reg[16];
842 	uint32_t rseq_2_reg[16];
843 	uint32_t aseq_gp_reg[128];
844 	uint32_t aseq_0_reg[32];
845 	uint32_t aseq_1_reg[16];
846 	uint32_t aseq_2_reg[16];
847 	uint32_t cmd_dma_reg[16];
848 	uint32_t req0_dma_reg[15];
849 	uint32_t resp0_dma_reg[15];
850 	uint32_t req1_dma_reg[15];
851 	uint32_t xmt0_dma_reg[32];
852 	uint32_t xmt1_dma_reg[32];
853 	uint32_t xmt2_dma_reg[32];
854 	uint32_t xmt3_dma_reg[32];
855 	uint32_t xmt4_dma_reg[32];
856 	uint32_t xmt_data_dma_reg[16];
857 	uint32_t rcvt0_data_dma_reg[32];
858 	uint32_t rcvt1_data_dma_reg[32];
859 	uint32_t risc_gp_reg[128];
860 	uint32_t shadow_reg[11];
861 	uint32_t risc_io;
862 	uint32_t lmc_reg[128];
863 	uint32_t fpm_hdw_reg[224];
864 	uint32_t fb_hdw_reg[208];
865 	uint32_t code_ram[0x2000];
866 	uint32_t req_q[REQUEST_QUEUE_SIZE / 4];
867 	uint32_t rsp_q[RESPONSE_QUEUE_SIZE / 4];
868 	uint32_t ext_trace_buf[FWEXTSIZE / 4];
869 	uint32_t fce_trace_buf[FWFCESIZE / 4];
870 	uint32_t ext_mem[1];
871 } ql_81xx_fw_dump_t;
872 
873 #ifdef _KERNEL
874 
875 /*
876  * ql_lock_nvram() flags
877  */
878 #define	LNF_NVRAM_DATA	BIT_0		/* get nvram */
879 #define	LNF_VPD_DATA	BIT_1		/* get vpd data (24xx only) */
880 
881 /*
882  *  ISP product identification definitions in mailboxes after reset.
883  */
884 #define	PROD_ID_1	0x4953
885 #define	PROD_ID_2	0x0000
886 #define	PROD_ID_2a	0x5020
887 #define	PROD_ID_3	0x2020
888 
889 /*
890  * NVRAM Command values.
891  */
892 #define	NV_START_BIT	BIT_2
893 #define	NV_WRITE_OP	(BIT_26+BIT_24)
894 #define	NV_READ_OP	(BIT_26+BIT_25)
895 #define	NV_ERASE_OP	(BIT_26+BIT_25+BIT_24)
896 #define	NV_MASK_OP	(BIT_26+BIT_25+BIT_24)
897 #define	NV_DELAY_COUNT	10
898 
899 /*
900  * Deivce ID list definitions.
901  */
902 struct ql_dev_id {
903 	uint8_t		al_pa;
904 	uint8_t		area;
905 	uint8_t		domain;
906 	uint8_t		loop_id;
907 };
908 
909 struct ql_ex_dev_id {
910 	uint8_t		al_pa;
911 	uint8_t		area;
912 	uint8_t		domain;
913 	uint8_t		reserved;
914 	uint8_t		loop_id_l;
915 	uint8_t		loop_id_h;
916 };
917 
918 struct ql_24_dev_id {
919 	uint8_t		al_pa;
920 	uint8_t		area;
921 	uint8_t		domain;
922 	uint8_t		reserved;
923 	uint8_t		n_port_hdl_l;
924 	uint8_t		n_port_hdl_h;
925 	uint8_t		reserved_1[2];
926 };
927 
928 typedef union ql_dev_id_list {
929 	struct ql_dev_id	d;
930 	struct ql_ex_dev_id	d_ex;
931 	struct ql_24_dev_id	d_24;
932 } ql_dev_id_list_t;
933 
934 /* Define maximum number of device list entries.. */
935 #define	DEVICE_LIST_ENTRIES	MAX_24_FIBRE_DEVICES
936 
937 /*
938  * Global Data in ql_init.c source file.
939  */
940 
941 /*
942  * Global Function Prototypes in ql_init.c source file.
943  */
944 int ql_initialize_adapter(ql_adapter_state_t *);
945 int ql_pci_sbus_config(ql_adapter_state_t *);
946 int ql_nvram_config(ql_adapter_state_t *);
947 uint16_t ql_get_nvram_word(ql_adapter_state_t *, uint32_t);
948 void ql_nv_write(ql_adapter_state_t *, uint16_t);
949 void ql_nv_delay(void);
950 int ql_lock_nvram(ql_adapter_state_t *, uint32_t *, uint32_t);
951 void ql_release_nvram(ql_adapter_state_t *);
952 void ql_common_properties(ql_adapter_state_t *);
953 uint32_t ql_get_prop(ql_adapter_state_t *, char *);
954 int ql_load_isp_firmware(ql_adapter_state_t *);
955 int ql_start_firmware(ql_adapter_state_t *);
956 int ql_set_cache_line(ql_adapter_state_t *);
957 int ql_init_rings(ql_adapter_state_t *);
958 int ql_fw_ready(ql_adapter_state_t *, uint8_t);
959 void ql_dev_list(ql_adapter_state_t *, ql_dev_id_list_t *, uint32_t,
960     port_id_t *, uint16_t *);
961 void ql_reset_chip(ql_adapter_state_t *);
962 void ql_reset_24xx_chip(ql_adapter_state_t *);
963 int ql_abort_isp(ql_adapter_state_t *);
964 int ql_vport_control(ql_adapter_state_t *, uint8_t);
965 int ql_vport_modify(ql_adapter_state_t *, uint8_t, uint8_t);
966 int ql_vport_enable(ql_adapter_state_t *);
967 ql_adapter_state_t *ql_vport_create(ql_adapter_state_t *, uint8_t);
968 void ql_vport_destroy(ql_adapter_state_t *);
969 #endif	/* _KERNEL */
970 
971 #ifdef	__cplusplus
972 }
973 #endif
974 
975 #endif /* _QL_INIT_H */
976