xref: /freebsd/sys/dev/isp/isp.c (revision 2b2f4008d07a8fa66d60ee4013a8645fb7a58f48)
1 /*-
2  *  Copyright (c) 1997-2009 by Matthew Jacob
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions
7  *  are met:
8  *
9  *  1. Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  *  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  *  SUCH DAMAGE.
26  *
27  */
28 
29 /*
30  * Machine and OS Independent (well, as best as possible)
31  * code for the Qlogic ISP SCSI and FC-SCSI adapters.
32  */
33 
34 /*
35  * Inspiration and ideas about this driver are from Erik Moe's Linux driver
36  * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
37  * ideas dredged from the Solaris driver.
38  */
39 
40 /*
41  * Include header file appropriate for platform we're building on.
42  */
43 #ifdef	__NetBSD__
44 #include <sys/cdefs.h>
45 __KERNEL_RCSID(0, "$NetBSD$");
46 #include <dev/ic/isp_netbsd.h>
47 #endif
48 #ifdef	__FreeBSD__
49 #include <sys/cdefs.h>
50 __FBSDID("$FreeBSD$");
51 #include <dev/isp/isp_freebsd.h>
52 #endif
53 #ifdef	__OpenBSD__
54 #include <dev/ic/isp_openbsd.h>
55 #endif
56 #ifdef	__linux__
57 #include "isp_linux.h"
58 #endif
59 #ifdef	__svr4__
60 #include "isp_solaris.h"
61 #endif
62 
63 /*
64  * General defines
65  */
66 #define	MBOX_DELAY_COUNT	1000000 / 100
67 
68 /*
69  * Local static data
70  */
71 static const char notresp[] = "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
72 static const char bun[] = "bad underrun (count %d, resid %d, status %s)";
73 static const char lipd[] = "Chan %d LIP destroyed %d active commands";
74 static const char sacq[] = "unable to acquire scratch area";
75 
76 static const uint8_t alpa_map[] = {
77 	0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda,
78 	0xd9, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce,
79 	0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc7, 0xc6, 0xc5,
80 	0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, 0xb4, 0xb3,
81 	0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9,
82 	0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b,
83 	0x98, 0x97, 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81,
84 	0x80, 0x7c, 0x7a, 0x79, 0x76, 0x75, 0x74, 0x73,
85 	0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69,
86 	0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56,
87 	0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c,
88 	0x4b, 0x4a, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c,
89 	0x3a, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
90 	0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x27, 0x26,
91 	0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17,
92 	0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00
93 };
94 
95 /*
96  * Local function prototypes.
97  */
98 static int isp_parse_async(ispsoftc_t *, uint16_t);
99 static int isp_parse_async_fc(ispsoftc_t *, uint16_t);
100 static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *);
101 static void isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, long *); static void
102 isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, long *);
103 static void isp_fastpost_complete(ispsoftc_t *, uint32_t);
104 static int isp_mbox_continue(ispsoftc_t *);
105 static void isp_scsi_init(ispsoftc_t *);
106 static void isp_scsi_channel_init(ispsoftc_t *, int);
107 static void isp_fibre_init(ispsoftc_t *);
108 static void isp_fibre_init_2400(ispsoftc_t *);
109 static void isp_clear_portdb(ispsoftc_t *, int);
110 static void isp_mark_portdb(ispsoftc_t *, int);
111 static int isp_plogx(ispsoftc_t *, int, uint16_t, uint32_t, int);
112 static int isp_port_login(ispsoftc_t *, uint16_t, uint32_t);
113 static int isp_port_logout(ispsoftc_t *, uint16_t, uint32_t);
114 static int isp_getpdb(ispsoftc_t *, int, uint16_t, isp_pdb_t *);
115 static int isp_gethandles(ispsoftc_t *, int, uint16_t *, int *, int);
116 static void isp_dump_chip_portdb(ispsoftc_t *, int);
117 static uint64_t isp_get_wwn(ispsoftc_t *, int, int, int);
118 static int isp_fclink_test(ispsoftc_t *, int, int);
119 static int isp_pdb_sync(ispsoftc_t *, int);
120 static int isp_scan_loop(ispsoftc_t *, int);
121 static int isp_gid_ft_sns(ispsoftc_t *, int);
122 static int isp_gid_ft_ct_passthru(ispsoftc_t *, int);
123 static int isp_scan_fabric(ispsoftc_t *, int);
124 static int isp_login_device(ispsoftc_t *, int, uint32_t, isp_pdb_t *, uint16_t *);
125 static int isp_send_change_request(ispsoftc_t *, int);
126 static int isp_register_fc4_type(ispsoftc_t *, int);
127 static int isp_register_fc4_type_24xx(ispsoftc_t *, int);
128 static int isp_register_fc4_features_24xx(ispsoftc_t *, int);
129 static int isp_register_port_name_24xx(ispsoftc_t *, int);
130 static int isp_register_node_name_24xx(ispsoftc_t *, int);
131 static uint16_t isp_next_handle(ispsoftc_t *, uint16_t *);
132 static int isp_fw_state(ispsoftc_t *, int);
133 static void isp_mboxcmd_qnw(ispsoftc_t *, mbreg_t *, int);
134 static void isp_mboxcmd(ispsoftc_t *, mbreg_t *);
135 
136 static void isp_spi_update(ispsoftc_t *, int);
137 static void isp_setdfltsdparm(ispsoftc_t *);
138 static void isp_setdfltfcparm(ispsoftc_t *, int);
139 static int isp_read_nvram(ispsoftc_t *, int);
140 static int isp_read_nvram_2400(ispsoftc_t *, uint8_t *);
141 static void isp_rdnvram_word(ispsoftc_t *, int, uint16_t *);
142 static void isp_rd_2400_nvram(ispsoftc_t *, uint32_t, uint32_t *);
143 static void isp_parse_nvram_1020(ispsoftc_t *, uint8_t *);
144 static void isp_parse_nvram_1080(ispsoftc_t *, int, uint8_t *);
145 static void isp_parse_nvram_12160(ispsoftc_t *, int, uint8_t *);
146 static void isp_parse_nvram_2100(ispsoftc_t *, uint8_t *);
147 static void isp_parse_nvram_2400(ispsoftc_t *, uint8_t *);
148 
149 static void
150 isp_change_fw_state(ispsoftc_t *isp, int chan, int state)
151 {
152 	fcparam *fcp = FCPARAM(isp, chan);
153 
154 	if (fcp->isp_fwstate == state)
155 		return;
156 	isp_prt(isp, ISP_LOGCONFIG|ISP_LOG_SANCFG,
157 	    "Chan %d Firmware state <%s->%s>", chan,
158 	    isp_fc_fw_statename(fcp->isp_fwstate), isp_fc_fw_statename(state));
159 	fcp->isp_fwstate = state;
160 }
161 
162 /*
163  * Reset Hardware.
164  *
165  * Hit the chip over the head, download new f/w if available and set it running.
166  *
167  * Locking done elsewhere.
168  */
169 
170 void
171 isp_reset(ispsoftc_t *isp, int do_load_defaults)
172 {
173 	mbreg_t mbs;
174 	char *buf;
175 	uint64_t fwt;
176 	uint32_t code_org, val;
177 	int loops, i, dodnld = 1;
178 	const char *btype = "????";
179 	static const char dcrc[] = "Downloaded RISC Code Checksum Failure";
180 
181 	isp->isp_state = ISP_NILSTATE;
182 	if (isp->isp_dead) {
183 		isp_shutdown(isp);
184 		ISP_DISABLE_INTS(isp);
185 		return;
186 	}
187 
188 	/*
189 	 * Basic types (SCSI, FibreChannel and PCI or SBus)
190 	 * have been set in the MD code. We figure out more
191 	 * here. Possibly more refined types based upon PCI
192 	 * identification. Chip revision has been gathered.
193 	 *
194 	 * After we've fired this chip up, zero out the conf1 register
195 	 * for SCSI adapters and do other settings for the 2100.
196 	 */
197 
198 	ISP_DISABLE_INTS(isp);
199 
200 	/*
201 	 * Pick an initial maxcmds value which will be used
202 	 * to allocate xflist pointer space. It may be changed
203 	 * later by the firmware.
204 	 */
205 	if (IS_24XX(isp)) {
206 		isp->isp_maxcmds = 4096;
207 	} else if (IS_2322(isp)) {
208 		isp->isp_maxcmds = 2048;
209 	} else if (IS_23XX(isp) || IS_2200(isp)) {
210 		isp->isp_maxcmds = 1024;
211  	} else {
212 		isp->isp_maxcmds = 512;
213 	}
214 
215 	/*
216 	 * Set up DMA for the request and response queues.
217 	 *
218 	 * We do this now so we can use the request queue
219 	 * for dma to load firmware from.
220 	 */
221 	if (ISP_MBOXDMASETUP(isp) != 0) {
222 		isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
223 		return;
224 	}
225 
226 	/*
227 	 * Set up default request/response queue in-pointer/out-pointer
228 	 * register indices.
229 	 */
230 	if (IS_24XX(isp)) {
231 		isp->isp_rqstinrp = BIU2400_REQINP;
232 		isp->isp_rqstoutrp = BIU2400_REQOUTP;
233 		isp->isp_respinrp = BIU2400_RSPINP;
234 		isp->isp_respoutrp = BIU2400_RSPOUTP;
235 	} else if (IS_23XX(isp)) {
236 		isp->isp_rqstinrp = BIU_REQINP;
237 		isp->isp_rqstoutrp = BIU_REQOUTP;
238 		isp->isp_respinrp = BIU_RSPINP;
239 		isp->isp_respoutrp = BIU_RSPOUTP;
240 	} else {
241 		isp->isp_rqstinrp = INMAILBOX4;
242 		isp->isp_rqstoutrp = OUTMAILBOX4;
243 		isp->isp_respinrp = OUTMAILBOX5;
244 		isp->isp_respoutrp = INMAILBOX5;
245 	}
246 
247 	/*
248 	 * Put the board into PAUSE mode (so we can read the SXP registers
249 	 * or write FPM/FBM registers).
250 	 */
251 	if (IS_24XX(isp)) {
252 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_HOST_INT);
253 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
254 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
255 	} else {
256 		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
257 	}
258 
259 	if (IS_FC(isp)) {
260 		switch (isp->isp_type) {
261 		case ISP_HA_FC_2100:
262 			btype = "2100";
263 			break;
264 		case ISP_HA_FC_2200:
265 			btype = "2200";
266 			break;
267 		case ISP_HA_FC_2300:
268 			btype = "2300";
269 			break;
270 		case ISP_HA_FC_2312:
271 			btype = "2312";
272 			break;
273 		case ISP_HA_FC_2322:
274 			btype = "2322";
275 			break;
276 		case ISP_HA_FC_2400:
277 			btype = "2422";
278 			break;
279 		case ISP_HA_FC_2500:
280 			btype = "2532";
281 			break;
282 		case ISP_HA_FC_2600:
283 			btype = "2031";
284 			break;
285 		default:
286 			break;
287 		}
288 
289 		if (!IS_24XX(isp)) {
290 			/*
291 			 * While we're paused, reset the FPM module and FBM
292 			 * fifos.
293 			 */
294 			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
295 			ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
296 			ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
297 			ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
298 			ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
299 		}
300 	} else if (IS_1240(isp)) {
301 		sdparam *sdp;
302 
303 		btype = "1240";
304 		isp->isp_clock = 60;
305 		sdp = SDPARAM(isp, 0);
306 		sdp->isp_ultramode = 1;
307 		sdp = SDPARAM(isp, 1);
308 		sdp->isp_ultramode = 1;
309 		/*
310 		 * XXX: Should probably do some bus sensing.
311 		 */
312 	} else if (IS_ULTRA3(isp)) {
313 		sdparam *sdp = isp->isp_param;
314 
315 		isp->isp_clock = 100;
316 
317 		if (IS_10160(isp))
318 			btype = "10160";
319 		else if (IS_12160(isp))
320 			btype = "12160";
321 		else
322 			btype = "<UNKLVD>";
323 		sdp->isp_lvdmode = 1;
324 
325 		if (IS_DUALBUS(isp)) {
326 			sdp++;
327 			sdp->isp_lvdmode = 1;
328 		}
329 	} else if (IS_ULTRA2(isp)) {
330 		static const char m[] = "bus %d is in %s Mode";
331 		uint16_t l;
332 		sdparam *sdp = SDPARAM(isp, 0);
333 
334 		isp->isp_clock = 100;
335 
336 		if (IS_1280(isp))
337 			btype = "1280";
338 		else if (IS_1080(isp))
339 			btype = "1080";
340 		else
341 			btype = "<UNKLVD>";
342 
343 		l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
344 		switch (l) {
345 		case ISP1080_LVD_MODE:
346 			sdp->isp_lvdmode = 1;
347 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD");
348 			break;
349 		case ISP1080_HVD_MODE:
350 			sdp->isp_diffmode = 1;
351 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential");
352 			break;
353 		case ISP1080_SE_MODE:
354 			sdp->isp_ultramode = 1;
355 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended");
356 			break;
357 		default:
358 			isp_prt(isp, ISP_LOGERR,
359 			    "unknown mode on bus %d (0x%x)", 0, l);
360 			break;
361 		}
362 
363 		if (IS_DUALBUS(isp)) {
364 			sdp = SDPARAM(isp, 1);
365 			l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
366 			l &= ISP1080_MODE_MASK;
367 			switch (l) {
368 			case ISP1080_LVD_MODE:
369 				sdp->isp_lvdmode = 1;
370 				isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
371 				break;
372 			case ISP1080_HVD_MODE:
373 				sdp->isp_diffmode = 1;
374 				isp_prt(isp, ISP_LOGCONFIG,
375 				    m, 1, "Differential");
376 				break;
377 			case ISP1080_SE_MODE:
378 				sdp->isp_ultramode = 1;
379 				isp_prt(isp, ISP_LOGCONFIG,
380 				    m, 1, "Single-Ended");
381 				break;
382 			default:
383 				isp_prt(isp, ISP_LOGERR,
384 				    "unknown mode on bus %d (0x%x)", 1, l);
385 				break;
386 			}
387 		}
388 	} else {
389 		sdparam *sdp = SDPARAM(isp, 0);
390 		i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
391 		switch (i) {
392 		default:
393 			isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i);
394 			/* FALLTHROUGH */
395 		case 1:
396 			btype = "1020";
397 			isp->isp_type = ISP_HA_SCSI_1020;
398 			isp->isp_clock = 40;
399 			break;
400 		case 2:
401 			/*
402 			 * Some 1020A chips are Ultra Capable, but don't
403 			 * run the clock rate up for that unless told to
404 			 * do so by the Ultra Capable bits being set.
405 			 */
406 			btype = "1020A";
407 			isp->isp_type = ISP_HA_SCSI_1020A;
408 			isp->isp_clock = 40;
409 			break;
410 		case 3:
411 			btype = "1040";
412 			isp->isp_type = ISP_HA_SCSI_1040;
413 			isp->isp_clock = 60;
414 			break;
415 		case 4:
416 			btype = "1040A";
417 			isp->isp_type = ISP_HA_SCSI_1040A;
418 			isp->isp_clock = 60;
419 			break;
420 		case 5:
421 			btype = "1040B";
422 			isp->isp_type = ISP_HA_SCSI_1040B;
423 			isp->isp_clock = 60;
424 			break;
425 		case 6:
426 			btype = "1040C";
427 			isp->isp_type = ISP_HA_SCSI_1040C;
428 			isp->isp_clock = 60;
429                         break;
430 		}
431 		/*
432 		 * Now, while we're at it, gather info about ultra
433 		 * and/or differential mode.
434 		 */
435 		if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
436 			isp_prt(isp, ISP_LOGCONFIG, "Differential Mode");
437 			sdp->isp_diffmode = 1;
438 		} else {
439 			sdp->isp_diffmode = 0;
440 		}
441 		i = ISP_READ(isp, RISC_PSR);
442 		if (isp->isp_bustype == ISP_BT_SBUS) {
443 			i &= RISC_PSR_SBUS_ULTRA;
444 		} else {
445 			i &= RISC_PSR_PCI_ULTRA;
446 		}
447 		if (i != 0) {
448 			isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable");
449 			sdp->isp_ultramode = 1;
450 			/*
451 			 * If we're in Ultra Mode, we have to be 60MHz clock-
452 			 * even for the SBus version.
453 			 */
454 			isp->isp_clock = 60;
455 		} else {
456 			sdp->isp_ultramode = 0;
457 			/*
458 			 * Clock is known. Gronk.
459 			 */
460 		}
461 
462 		/*
463 		 * Machine dependent clock (if set) overrides
464 		 * our generic determinations.
465 		 */
466 		if (isp->isp_mdvec->dv_clock) {
467 			if (isp->isp_mdvec->dv_clock < isp->isp_clock) {
468 				isp->isp_clock = isp->isp_mdvec->dv_clock;
469 			}
470 		}
471 
472 	}
473 
474 	/*
475 	 * Clear instrumentation
476 	 */
477 	isp->isp_intcnt = isp->isp_intbogus = 0;
478 
479 	/*
480 	 * Do MD specific pre initialization
481 	 */
482 	ISP_RESET0(isp);
483 
484 	/*
485 	 * Hit the chip over the head with hammer,
486 	 * and give it a chance to recover.
487 	 */
488 
489 	if (IS_SCSI(isp)) {
490 		ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
491 		/*
492 		 * A slight delay...
493 		 */
494 		ISP_DELAY(100);
495 
496 		/*
497 		 * Clear data && control DMA engines.
498 		 */
499 		ISP_WRITE(isp, CDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
500 		ISP_WRITE(isp, DDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
501 
502 
503 	} else if (IS_24XX(isp)) {
504 		/*
505 		 * Stop DMA and wait for it to stop.
506 		 */
507 		ISP_WRITE(isp, BIU2400_CSR, BIU2400_DMA_STOP|(3 << 4));
508 		for (val = loops = 0; loops < 30000; loops++) {
509 			ISP_DELAY(10);
510 			val = ISP_READ(isp, BIU2400_CSR);
511 			if ((val & BIU2400_DMA_ACTIVE) == 0) {
512 				break;
513 			}
514 		}
515 		if (val & BIU2400_DMA_ACTIVE) {
516 			ISP_RESET0(isp);
517 			isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
518 			return;
519 		}
520 		/*
521 		 * Hold it in SOFT_RESET and STOP state for 100us.
522 		 */
523 		ISP_WRITE(isp, BIU2400_CSR, BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
524 		ISP_DELAY(100);
525 		for (loops = 0; loops < 10000; loops++) {
526 			ISP_DELAY(5);
527 			val = ISP_READ(isp, OUTMAILBOX0);
528 		}
529 		for (val = loops = 0; loops < 500000; loops ++) {
530 			val = ISP_READ(isp, BIU2400_CSR);
531 			if ((val & BIU2400_SOFT_RESET) == 0) {
532 				break;
533 			}
534 		}
535 		if (val & BIU2400_SOFT_RESET) {
536 			ISP_RESET0(isp);
537 			isp_prt(isp, ISP_LOGERR, "Failed to come out of reset");
538 			return;
539 		}
540 	} else {
541 		ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
542 		/*
543 		 * A slight delay...
544 		 */
545 		ISP_DELAY(100);
546 
547 		/*
548 		 * Clear data && control DMA engines.
549 		 */
550 		ISP_WRITE(isp, CDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
551 		ISP_WRITE(isp, TDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
552 		ISP_WRITE(isp, RDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
553 	}
554 
555 	/*
556 	 * Wait for ISP to be ready to go...
557 	 */
558 	loops = MBOX_DELAY_COUNT;
559 	for (;;) {
560 		if (IS_SCSI(isp)) {
561 			if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET)) {
562 				break;
563 			}
564 		} else if (IS_24XX(isp)) {
565 			if (ISP_READ(isp, OUTMAILBOX0) == 0) {
566 				break;
567 			}
568 		} else {
569 			if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
570 				break;
571 		}
572 		ISP_DELAY(100);
573 		if (--loops < 0) {
574 			ISP_DUMPREGS(isp, "chip reset timed out");
575 			ISP_RESET0(isp);
576 			return;
577 		}
578 	}
579 
580 	/*
581 	 * After we've fired this chip up, zero out the conf1 register
582 	 * for SCSI adapters and other settings for the 2100.
583 	 */
584 
585 	if (IS_SCSI(isp)) {
586 		ISP_WRITE(isp, BIU_CONF1, 0);
587 	} else if (!IS_24XX(isp)) {
588 		ISP_WRITE(isp, BIU2100_CSR, 0);
589 	}
590 
591 	/*
592 	 * Reset RISC Processor
593 	 */
594 	if (IS_24XX(isp)) {
595 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RESET);
596 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RELEASE);
597 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RESET);
598 	} else {
599 		ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
600 		ISP_DELAY(100);
601 		ISP_WRITE(isp, BIU_SEMA, 0);
602 	}
603 
604 	/*
605 	 * Post-RISC Reset stuff.
606 	 */
607 	if (IS_24XX(isp)) {
608 		for (val = loops = 0; loops < 5000000; loops++) {
609 			ISP_DELAY(5);
610 			val = ISP_READ(isp, OUTMAILBOX0);
611 			if (val == 0) {
612 				break;
613 			}
614 		}
615 		if (val != 0) {
616 			ISP_RESET0(isp);
617 			isp_prt(isp, ISP_LOGERR, "reset didn't clear");
618 			return;
619 		}
620 	} else if (IS_SCSI(isp)) {
621 		uint16_t tmp = isp->isp_mdvec->dv_conf1;
622 		/*
623 		 * Busted FIFO. Turn off all but burst enables.
624 		 */
625 		if (isp->isp_type == ISP_HA_SCSI_1040A) {
626 			tmp &= BIU_BURST_ENABLE;
627 		}
628 		ISP_SETBITS(isp, BIU_CONF1, tmp);
629 		if (tmp & BIU_BURST_ENABLE) {
630 			ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
631 			ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
632 		}
633 		if (SDPARAM(isp, 0)->isp_ptisp) {
634 			if (SDPARAM(isp, 0)->isp_ultramode) {
635 				while (ISP_READ(isp, RISC_MTR) != 0x1313) {
636 					ISP_WRITE(isp, RISC_MTR, 0x1313);
637 					ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
638 				}
639 			} else {
640 				ISP_WRITE(isp, RISC_MTR, 0x1212);
641 			}
642 			/*
643 			 * PTI specific register
644 			 */
645 			ISP_WRITE(isp, RISC_EMB, DUAL_BANK);
646 		} else {
647 			ISP_WRITE(isp, RISC_MTR, 0x1212);
648 		}
649 		ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
650 	} else {
651 		ISP_WRITE(isp, RISC_MTR2100, 0x1212);
652 		if (IS_2200(isp) || IS_23XX(isp)) {
653 			ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE);
654 		}
655 		ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
656 	}
657 
658 	ISP_WRITE(isp, isp->isp_rqstinrp, 0);
659 	ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
660 	ISP_WRITE(isp, isp->isp_respinrp, 0);
661 	ISP_WRITE(isp, isp->isp_respoutrp, 0);
662 	if (IS_24XX(isp)) {
663 		if (!IS_26XX(isp)) {
664 			ISP_WRITE(isp, BIU2400_PRI_REQINP, 0);
665 			ISP_WRITE(isp, BIU2400_PRI_REQOUTP, 0);
666 		}
667 		ISP_WRITE(isp, BIU2400_ATIO_RSPINP, 0);
668 		ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, 0);
669 	}
670 
671 	/*
672 	 * Do MD specific post initialization
673 	 */
674 	ISP_RESET1(isp);
675 
676 	/*
677 	 * Wait for everything to finish firing up.
678 	 *
679 	 * Avoid doing this on early 2312s because you can generate a PCI
680 	 * parity error (chip breakage).
681 	 */
682 	if (IS_2312(isp) && isp->isp_revision < 2) {
683 		ISP_DELAY(100);
684 	} else {
685 		loops = MBOX_DELAY_COUNT;
686 		while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
687 			ISP_DELAY(100);
688 			if (--loops < 0) {
689 				ISP_RESET0(isp);
690 				isp_prt(isp, ISP_LOGERR, "MBOX_BUSY never cleared on reset");
691 				return;
692 			}
693 		}
694 	}
695 
696 	/*
697 	 * Up until this point we've done everything by just reading or
698 	 * setting registers. From this point on we rely on at least *some*
699 	 * kind of firmware running in the card.
700 	 */
701 
702 	/*
703 	 * Do some sanity checking by running a NOP command.
704 	 * If it succeeds, the ROM firmware is now running.
705 	 */
706 	MBSINIT(&mbs, MBOX_NO_OP, MBLOGALL, 0);
707 	isp_mboxcmd(isp, &mbs);
708 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
709 		isp_prt(isp, ISP_LOGERR, "NOP command failed (%x)", mbs.param[0]);
710 		ISP_RESET0(isp);
711 		return;
712 	}
713 
714 	/*
715 	 * Do some operational tests
716 	 */
717 
718 	if (IS_SCSI(isp) || IS_24XX(isp)) {
719 		static const uint16_t patterns[MAX_MAILBOX] = {
720 			0x0000, 0xdead, 0xbeef, 0xffff,
721 			0xa5a5, 0x5a5a, 0x7f7f, 0x7ff7,
722 			0x3421, 0xabcd, 0xdcba, 0xfeef,
723 			0xbead, 0xdebe, 0x2222, 0x3333,
724 			0x5555, 0x6666, 0x7777, 0xaaaa,
725 			0xffff, 0xdddd, 0x9999, 0x1fbc,
726 			0x6666, 0x6677, 0x1122, 0x33ff,
727 			0x0000, 0x0001, 0x1000, 0x1010,
728 		};
729 		int nmbox = ISP_NMBOX(isp);
730 		if (IS_SCSI(isp))
731 			nmbox = 6;
732 		MBSINIT(&mbs, MBOX_MAILBOX_REG_TEST, MBLOGALL, 0);
733 		for (i = 1; i < nmbox; i++) {
734 			mbs.param[i] = patterns[i];
735 		}
736 		isp_mboxcmd(isp, &mbs);
737 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
738 			ISP_RESET0(isp);
739 			return;
740 		}
741 		for (i = 1; i < nmbox; i++) {
742 			if (mbs.param[i] != patterns[i]) {
743 				ISP_RESET0(isp);
744 				isp_prt(isp, ISP_LOGERR, "Register Test Failed at Register %d: should have 0x%04x but got 0x%04x", i, patterns[i], mbs.param[i]);
745 				return;
746 			}
747 		}
748 	}
749 
750 	/*
751 	 * Download new Firmware, unless requested not to do so.
752 	 * This is made slightly trickier in some cases where the
753 	 * firmware of the ROM revision is newer than the revision
754 	 * compiled into the driver. So, where we used to compare
755 	 * versions of our f/w and the ROM f/w, now we just see
756 	 * whether we have f/w at all and whether a config flag
757 	 * has disabled our download.
758 	 */
759 	if ((isp->isp_mdvec->dv_ispfw == NULL) || (isp->isp_confopts & ISP_CFG_NORELOAD)) {
760 		dodnld = 0;
761 	}
762 
763 	if (IS_24XX(isp)) {
764 		code_org = ISP_CODE_ORG_2400;
765 	} else if (IS_23XX(isp)) {
766 		code_org = ISP_CODE_ORG_2300;
767 	} else {
768 		code_org = ISP_CODE_ORG;
769 	}
770 
771 	isp->isp_loaded_fw = 0;
772 	if (dodnld && IS_24XX(isp)) {
773 		const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
774 		int wordload;
775 
776 		/*
777 		 * Keep loading until we run out of f/w.
778 		 */
779 		code_org = ptr[2];	/* 1st load address is our start addr */
780 		wordload = 0;
781 
782 		for (;;) {
783 			uint32_t la, wi, wl;
784 
785 			isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], ptr[2]);
786 
787 			wi = 0;
788 			la = ptr[2];
789 			wl = ptr[3];
790 
791 			while (wi < ptr[3]) {
792 				uint32_t *cp;
793 				uint32_t nw;
794 
795 				nw = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)) >> 2;
796 				if (nw > wl) {
797 					nw = wl;
798 				}
799 				cp = isp->isp_rquest;
800 				for (i = 0; i < nw; i++) {
801 					ISP_IOXPUT_32(isp,  ptr[wi++], &cp[i]);
802 					wl--;
803 				}
804 				MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1);
805 	again:
806 				MBSINIT(&mbs, 0, MBLOGALL, 0);
807 				if (la < 0x10000 && nw < 0x10000) {
808 					mbs.param[0] = MBOX_LOAD_RISC_RAM_2100;
809 					mbs.param[1] = la;
810 					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
811 					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
812 					mbs.param[4] = nw;
813 					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
814 					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
815 					isp_prt(isp, ISP_LOGDEBUG0, "LOAD RISC RAM 2100 %u words at load address 0x%x", nw, la);
816 				} else if (wordload) {
817 					union {
818 						const uint32_t *cp;
819 						uint32_t *np;
820 					} ucd;
821 					ucd.cp = (const uint32_t *)cp;
822 					mbs.param[0] = MBOX_WRITE_RAM_WORD_EXTENDED;
823 					mbs.param[1] = la;
824 					mbs.param[2] = (*ucd.np);
825 					mbs.param[3] = (*ucd.np) >> 16;
826 					mbs.param[8] = la >> 16;
827 					isp->isp_mbxwrk0 = nw - 1;
828 					isp->isp_mbxworkp = ucd.np+1;
829 					isp->isp_mbxwrk1 = (la + 1);
830 					isp->isp_mbxwrk8 = (la + 1) >> 16;
831 					isp_prt(isp, ISP_LOGDEBUG0, "WRITE RAM WORD EXTENDED %u words at load address 0x%x", nw, la);
832 				} else {
833 					mbs.param[0] = MBOX_LOAD_RISC_RAM;
834 					mbs.param[1] = la;
835 					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
836 					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
837 					mbs.param[4] = nw >> 16;
838 					mbs.param[5] = nw;
839 					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
840 					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
841 					mbs.param[8] = la >> 16;
842 					isp_prt(isp, ISP_LOGDEBUG0, "LOAD RISC RAM %u words at load address 0x%x", nw, la);
843 				}
844 				isp_mboxcmd(isp, &mbs);
845 				if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
846 					if (mbs.param[0] == MBOX_HOST_INTERFACE_ERROR) {
847 						isp_prt(isp, ISP_LOGERR, "switching to word load");
848 						wordload = 1;
849 						goto again;
850 					}
851 					isp_prt(isp, ISP_LOGERR, "F/W Risc Ram Load Failed");
852 					ISP_RESET0(isp);
853 					return;
854 				}
855 				la += nw;
856 			}
857 
858 			if (ptr[1] == 0) {
859 				break;
860 			}
861 			ptr += ptr[3];
862 		}
863 		isp->isp_loaded_fw = 1;
864 	} else if (dodnld && IS_23XX(isp)) {
865 		const uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
866 		uint16_t wi, wl, segno;
867 		uint32_t la;
868 
869 		la = code_org;
870 		segno = 0;
871 
872 		for (;;) {
873 			uint32_t nxtaddr;
874 
875 			isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], la);
876 
877 			wi = 0;
878 			wl = ptr[3];
879 
880 			while (wi < ptr[3]) {
881 				uint16_t *cp;
882 				uint16_t nw;
883 
884 				nw = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)) >> 1;
885 				if (nw > wl) {
886 					nw = wl;
887 				}
888 				if (nw > (1 << 15)) {
889 					nw = 1 << 15;
890 				}
891 				cp = isp->isp_rquest;
892 				for (i = 0; i < nw; i++) {
893 					ISP_IOXPUT_16(isp,  ptr[wi++], &cp[i]);
894 					wl--;
895 				}
896 				MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1);
897 				MBSINIT(&mbs, 0, MBLOGALL, 0);
898 				if (la < 0x10000) {
899 					mbs.param[0] = MBOX_LOAD_RISC_RAM_2100;
900 					mbs.param[1] = la;
901 					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
902 					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
903 					mbs.param[4] = nw;
904 					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
905 					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
906 					isp_prt(isp, ISP_LOGDEBUG1, "LOAD RISC RAM 2100 %u words at load address 0x%x\n", nw, la);
907 				} else {
908 					mbs.param[0] = MBOX_LOAD_RISC_RAM;
909 					mbs.param[1] = la;
910 					mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
911 					mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
912 					mbs.param[4] = nw;
913 					mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
914 					mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
915 					mbs.param[8] = la >> 16;
916 					isp_prt(isp, ISP_LOGDEBUG1, "LOAD RISC RAM %u words at load address 0x%x\n", nw, la);
917 				}
918 				isp_mboxcmd(isp, &mbs);
919 				if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
920 					isp_prt(isp, ISP_LOGERR, "F/W Risc Ram Load Failed");
921 					ISP_RESET0(isp);
922 					return;
923 				}
924 				la += nw;
925 			}
926 
927 			if (!IS_2322(isp)) {
928 				break;
929 			}
930 
931 			if (++segno == 3) {
932 				break;
933 			}
934 
935 			/*
936 			 * If we're a 2322, the firmware actually comes in
937 			 * three chunks. We loaded the first at the code_org
938 			 * address. The other two chunks, which follow right
939 			 * after each other in memory here, get loaded at
940 			 * addresses specfied at offset 0x9..0xB.
941 			 */
942 
943 			nxtaddr = ptr[3];
944 			ptr = &ptr[nxtaddr];
945 			la = ptr[5] | ((ptr[4] & 0x3f) << 16);
946 		}
947 		isp->isp_loaded_fw = 1;
948 	} else if (dodnld) {
949 		union {
950 			const uint16_t *cp;
951 			uint16_t *np;
952 		} ucd;
953 		ucd.cp = isp->isp_mdvec->dv_ispfw;
954 		isp->isp_mbxworkp = &ucd.np[1];
955 		isp->isp_mbxwrk0 = ucd.np[3] - 1;
956 		isp->isp_mbxwrk1 = code_org + 1;
957 		MBSINIT(&mbs, MBOX_WRITE_RAM_WORD, MBLOGNONE, 0);
958 		mbs.param[1] = code_org;
959 		mbs.param[2] = ucd.np[0];
960 		isp_prt(isp, ISP_LOGDEBUG1, "WRITE RAM %u words at load address 0x%x", ucd.np[3], code_org);
961 		isp_mboxcmd(isp, &mbs);
962 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
963 			isp_prt(isp, ISP_LOGERR, "F/W download failed at word %d", isp->isp_mbxwrk1 - code_org);
964 			ISP_RESET0(isp);
965 			return;
966 		}
967 	} else if (IS_26XX(isp)) {
968 		MBSINIT(&mbs, MBOX_LOAD_FLASH_FIRMWARE, MBLOGALL, 5000000);
969 		mbs.ibitm = 0x01;
970 		mbs.obitm = 0x07;
971 		isp_mboxcmd(isp, &mbs);
972 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
973 			isp_prt(isp, ISP_LOGERR, "Flash F/W load failed");
974 			ISP_RESET0(isp);
975 			return;
976 		}
977 	} else {
978 		isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
979 	}
980 
981 	/*
982 	 * If we loaded firmware, verify its checksum
983 	 */
984 	if (isp->isp_loaded_fw) {
985 		MBSINIT(&mbs, MBOX_VERIFY_CHECKSUM, MBLOGNONE, 0);
986 		if (IS_24XX(isp)) {
987 			mbs.param[1] = code_org >> 16;
988 			mbs.param[2] = code_org;
989 		} else {
990 			mbs.param[1] = code_org;
991 		}
992 		isp_mboxcmd(isp, &mbs);
993 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
994 			isp_prt(isp, ISP_LOGERR, dcrc);
995 			ISP_RESET0(isp);
996 			return;
997 		}
998 	}
999 
1000 	/*
1001 	 * Now start it rolling.
1002 	 *
1003 	 * If we didn't actually download f/w,
1004 	 * we still need to (re)start it.
1005 	 */
1006 
1007 
1008 	MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 5000000);
1009 	if (IS_24XX(isp)) {
1010 		mbs.param[1] = code_org >> 16;
1011 		mbs.param[2] = code_org;
1012 		if (isp->isp_loaded_fw) {
1013 			mbs.param[3] = 0;
1014 		} else {
1015 			mbs.param[3] = 1;
1016 		}
1017 	} else if (IS_2322(isp)) {
1018 		mbs.param[1] = code_org;
1019 		if (isp->isp_loaded_fw) {
1020 			mbs.param[2] = 0;
1021 		} else {
1022 			mbs.param[2] = 1;
1023 		}
1024 	} else {
1025 		mbs.param[1] = code_org;
1026 	}
1027 	isp_mboxcmd(isp, &mbs);
1028 	if (IS_2322(isp) || IS_24XX(isp)) {
1029 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1030 			ISP_RESET0(isp);
1031 			return;
1032 		}
1033 	}
1034 
1035 	if (IS_SCSI(isp)) {
1036 		/*
1037 		 * Set CLOCK RATE, but only if asked to.
1038 		 */
1039 		if (isp->isp_clock) {
1040 			MBSINIT(&mbs, MBOX_SET_CLOCK_RATE, MBLOGALL, 0);
1041 			mbs.param[1] = isp->isp_clock;
1042 			isp_mboxcmd(isp, &mbs);
1043 			/* we will try not to care if this fails */
1044 		}
1045 	}
1046 
1047 	/*
1048 	 * Ask the chip for the current firmware version.
1049 	 * This should prove that the new firmware is working.
1050 	 */
1051 	MBSINIT(&mbs, MBOX_ABOUT_FIRMWARE, MBLOGALL, 0);
1052 	isp_mboxcmd(isp, &mbs);
1053 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1054 		ISP_RESET0(isp);
1055 		return;
1056 	}
1057 
1058 	/*
1059 	 * The SBus firmware that we are using apparently does not return
1060 	 * major, minor, micro revisions in the mailbox registers, which
1061 	 * is really, really, annoying.
1062 	 */
1063 	if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) {
1064 		if (dodnld) {
1065 #ifdef	ISP_TARGET_MODE
1066 			isp->isp_fwrev[0] = 7;
1067 			isp->isp_fwrev[1] = 55;
1068 #else
1069 			isp->isp_fwrev[0] = 1;
1070 			isp->isp_fwrev[1] = 37;
1071 #endif
1072 			isp->isp_fwrev[2] = 0;
1073 		}
1074 	} else {
1075 		isp->isp_fwrev[0] = mbs.param[1];
1076 		isp->isp_fwrev[1] = mbs.param[2];
1077 		isp->isp_fwrev[2] = mbs.param[3];
1078 	}
1079 
1080 	if (IS_FC(isp)) {
1081 		/*
1082 		 * We do not believe firmware attributes for 2100 code less
1083 		 * than 1.17.0, unless it's the firmware we specifically
1084 		 * are loading.
1085 		 *
1086 		 * Note that all 22XX and later f/w is greater than 1.X.0.
1087 		 */
1088 		if ((ISP_FW_OLDER_THAN(isp, 1, 17, 1))) {
1089 #ifdef	USE_SMALLER_2100_FIRMWARE
1090 			isp->isp_fwattr = ISP_FW_ATTR_SCCLUN;
1091 #else
1092 			isp->isp_fwattr = 0;
1093 #endif
1094 		} else {
1095 			isp->isp_fwattr = mbs.param[6];
1096 		}
1097 		if (IS_24XX(isp)) {
1098 			isp->isp_fwattr |= ((uint64_t) mbs.param[15]) << 16;
1099 			if (isp->isp_fwattr & ISP2400_FW_ATTR_EXTNDED) {
1100 				isp->isp_fwattr |=
1101 				    (((uint64_t) mbs.param[16]) << 32) |
1102 				    (((uint64_t) mbs.param[17]) << 48);
1103 			}
1104 		}
1105 	} else {
1106 		isp->isp_fwattr = 0;
1107 	}
1108 
1109 	isp_prt(isp, ISP_LOGCONFIG, "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
1110 	    btype, isp->isp_revision, dodnld? "loaded" : "resident", isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
1111 
1112 	fwt = isp->isp_fwattr;
1113 	if (IS_24XX(isp)) {
1114 		buf = FCPARAM(isp, 0)->isp_scratch;
1115 		ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:");
1116 		if (fwt & ISP2400_FW_ATTR_CLASS2) {
1117 			fwt ^=ISP2400_FW_ATTR_CLASS2;
1118 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf);
1119 		}
1120 		if (fwt & ISP2400_FW_ATTR_IP) {
1121 			fwt ^=ISP2400_FW_ATTR_IP;
1122 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf);
1123 		}
1124 		if (fwt & ISP2400_FW_ATTR_MULTIID) {
1125 			fwt ^=ISP2400_FW_ATTR_MULTIID;
1126 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MultiID", buf);
1127 		}
1128 		if (fwt & ISP2400_FW_ATTR_SB2) {
1129 			fwt ^=ISP2400_FW_ATTR_SB2;
1130 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SB2", buf);
1131 		}
1132 		if (fwt & ISP2400_FW_ATTR_T10CRC) {
1133 			fwt ^=ISP2400_FW_ATTR_T10CRC;
1134 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s T10CRC", buf);
1135 		}
1136 		if (fwt & ISP2400_FW_ATTR_VI) {
1137 			fwt ^=ISP2400_FW_ATTR_VI;
1138 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf);
1139 		}
1140 		if (fwt & ISP2400_FW_ATTR_MQ) {
1141 			fwt ^=ISP2400_FW_ATTR_MQ;
1142 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MQ", buf);
1143 		}
1144 		if (fwt & ISP2400_FW_ATTR_MSIX) {
1145 			fwt ^=ISP2400_FW_ATTR_MSIX;
1146 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MSIX", buf);
1147 		}
1148 		if (fwt & ISP2400_FW_ATTR_FCOE) {
1149 			fwt ^=ISP2400_FW_ATTR_FCOE;
1150 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FCOE", buf);
1151 		}
1152 		if (fwt & ISP2400_FW_ATTR_VP0) {
1153 			fwt ^= ISP2400_FW_ATTR_VP0;
1154 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VP0_Decoupling", buf);
1155 		}
1156 		if (fwt & ISP2400_FW_ATTR_EXPFW) {
1157 			fwt ^= ISP2400_FW_ATTR_EXPFW;
1158 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (Experimental)", buf);
1159 		}
1160 		if (fwt & ISP2400_FW_ATTR_HOTFW) {
1161 			fwt ^= ISP2400_FW_ATTR_HOTFW;
1162 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s HotFW", buf);
1163 		}
1164 		fwt &= ~ISP2400_FW_ATTR_EXTNDED;
1165 		if (fwt & ISP2400_FW_ATTR_EXTVP) {
1166 			fwt ^= ISP2400_FW_ATTR_EXTVP;
1167 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ExtVP", buf);
1168 		}
1169 		if (fwt & ISP2400_FW_ATTR_VN2VN) {
1170 			fwt ^= ISP2400_FW_ATTR_VN2VN;
1171 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VN2VN", buf);
1172 		}
1173 		if (fwt & ISP2400_FW_ATTR_EXMOFF) {
1174 			fwt ^= ISP2400_FW_ATTR_EXMOFF;
1175 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s EXMOFF", buf);
1176 		}
1177 		if (fwt & ISP2400_FW_ATTR_NPMOFF) {
1178 			fwt ^= ISP2400_FW_ATTR_NPMOFF;
1179 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NPMOFF", buf);
1180 		}
1181 		if (fwt & ISP2400_FW_ATTR_DIFCHOP) {
1182 			fwt ^= ISP2400_FW_ATTR_DIFCHOP;
1183 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s DIFCHOP", buf);
1184 		}
1185 		if (fwt & ISP2400_FW_ATTR_SRIOV) {
1186 			fwt ^= ISP2400_FW_ATTR_SRIOV;
1187 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SRIOV", buf);
1188 		}
1189 		if (fwt & ISP2400_FW_ATTR_ASICTMP) {
1190 			fwt ^= ISP2400_FW_ATTR_ASICTMP;
1191 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ASICTMP", buf);
1192 		}
1193 		if (fwt & ISP2400_FW_ATTR_ATIOMQ) {
1194 			fwt ^= ISP2400_FW_ATTR_ATIOMQ;
1195 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ATIOMQ", buf);
1196 		}
1197 		if (fwt) {
1198 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf,
1199 			    (uint32_t) (fwt >> 32), (uint32_t) fwt);
1200 		}
1201 		isp_prt(isp, ISP_LOGCONFIG, "%s", buf);
1202 	} else if (IS_FC(isp)) {
1203 		buf = FCPARAM(isp, 0)->isp_scratch;
1204 		ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:");
1205 		if (fwt & ISP_FW_ATTR_TMODE) {
1206 			fwt ^=ISP_FW_ATTR_TMODE;
1207 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s TargetMode", buf);
1208 		}
1209 		if (fwt & ISP_FW_ATTR_SCCLUN) {
1210 			fwt ^=ISP_FW_ATTR_SCCLUN;
1211 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SCC-Lun", buf);
1212 		}
1213 		if (fwt & ISP_FW_ATTR_FABRIC) {
1214 			fwt ^=ISP_FW_ATTR_FABRIC;
1215 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Fabric", buf);
1216 		}
1217 		if (fwt & ISP_FW_ATTR_CLASS2) {
1218 			fwt ^=ISP_FW_ATTR_CLASS2;
1219 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf);
1220 		}
1221 		if (fwt & ISP_FW_ATTR_FCTAPE) {
1222 			fwt ^=ISP_FW_ATTR_FCTAPE;
1223 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FC-Tape", buf);
1224 		}
1225 		if (fwt & ISP_FW_ATTR_IP) {
1226 			fwt ^=ISP_FW_ATTR_IP;
1227 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf);
1228 		}
1229 		if (fwt & ISP_FW_ATTR_VI) {
1230 			fwt ^=ISP_FW_ATTR_VI;
1231 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf);
1232 		}
1233 		if (fwt & ISP_FW_ATTR_VI_SOLARIS) {
1234 			fwt ^=ISP_FW_ATTR_VI_SOLARIS;
1235 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI_SOLARIS", buf);
1236 		}
1237 		if (fwt & ISP_FW_ATTR_2KLOGINS) {
1238 			fwt ^=ISP_FW_ATTR_2KLOGINS;
1239 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s 2K-Login", buf);
1240 		}
1241 		if (fwt != 0) {
1242 			ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf,
1243 			    (uint32_t) (fwt >> 32), (uint32_t) fwt);
1244 		}
1245 		isp_prt(isp, ISP_LOGCONFIG, "%s", buf);
1246 	}
1247 
1248 	if (IS_24XX(isp)) {
1249 		MBSINIT(&mbs, MBOX_GET_RESOURCE_COUNT, MBLOGALL, 0);
1250 		isp_mboxcmd(isp, &mbs);
1251 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1252 			ISP_RESET0(isp);
1253 			return;
1254 		}
1255 		if (isp->isp_maxcmds >= mbs.param[3]) {
1256 			isp->isp_maxcmds = mbs.param[3];
1257 		}
1258 	} else {
1259 		MBSINIT(&mbs, MBOX_GET_FIRMWARE_STATUS, MBLOGALL, 0);
1260 		isp_mboxcmd(isp, &mbs);
1261 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1262 			ISP_RESET0(isp);
1263 			return;
1264 		}
1265 		if (isp->isp_maxcmds >= mbs.param[2]) {
1266 			isp->isp_maxcmds = mbs.param[2];
1267 		}
1268 	}
1269 	isp_prt(isp, ISP_LOGCONFIG, "%d max I/O command limit set", isp->isp_maxcmds);
1270 
1271 	/*
1272 	 * If we don't have Multi-ID f/w loaded, we need to restrict channels to one.
1273 	 * Only make this check for non-SCSI cards (I'm not sure firmware attributes
1274 	 * work for them).
1275 	 */
1276 	if (IS_FC(isp) && isp->isp_nchan > 1) {
1277 		if (!ISP_CAP_MULTI_ID(isp)) {
1278 			isp_prt(isp, ISP_LOGWARN, "non-MULTIID f/w loaded, "
1279 			    "only can enable 1 of %d channels", isp->isp_nchan);
1280 			isp->isp_nchan = 1;
1281 		} else if (!ISP_CAP_VP0(isp)) {
1282 			isp_prt(isp, ISP_LOGWARN, "We can not use MULTIID "
1283 			    "feature properly without VP0_Decoupling");
1284 			isp->isp_nchan = 1;
1285 		}
1286 	}
1287 	if (IS_FC(isp)) {
1288 		for (i = 0; i < isp->isp_nchan; i++)
1289 			isp_change_fw_state(isp, i, FW_CONFIG_WAIT);
1290 	}
1291 	if (isp->isp_dead) {
1292 		isp_shutdown(isp);
1293 		ISP_DISABLE_INTS(isp);
1294 		return;
1295 	}
1296 
1297 	isp->isp_state = ISP_RESETSTATE;
1298 
1299 	/*
1300 	 * Okay- now that we have new firmware running, we now (re)set our
1301 	 * notion of how many luns we support. This is somewhat tricky because
1302 	 * if we haven't loaded firmware, we sometimes do not have an easy way
1303 	 * of knowing how many luns we support.
1304 	 *
1305 	 * Expanded lun firmware gives you 32 luns for SCSI cards and
1306 	 * 16384 luns for Fibre Channel cards.
1307 	 *
1308 	 * It turns out that even for QLogic 2100s with ROM 1.10 and above
1309 	 * we do get a firmware attributes word returned in mailbox register 6.
1310 	 *
1311 	 * Because the lun is in a different position in the Request Queue
1312 	 * Entry structure for Fibre Channel with expanded lun firmware, we
1313 	 * can only support one lun (lun zero) when we don't know what kind
1314 	 * of firmware we're running.
1315 	 */
1316 	if (IS_SCSI(isp)) {
1317 		if (dodnld) {
1318 			if (IS_ULTRA2(isp) || IS_ULTRA3(isp)) {
1319 				isp->isp_maxluns = 32;
1320 			} else {
1321 				isp->isp_maxluns = 8;
1322 			}
1323 		} else {
1324 			isp->isp_maxluns = 8;
1325 		}
1326 	} else {
1327 		if (ISP_CAP_SCCFW(isp)) {
1328 			isp->isp_maxluns = 0;	/* No limit -- 2/8 bytes */
1329 		} else {
1330 			isp->isp_maxluns = 16;
1331 		}
1332 	}
1333 
1334 	/*
1335 	 * We get some default values established. As a side
1336 	 * effect, NVRAM is read here (unless overriden by
1337 	 * a configuration flag).
1338 	 */
1339 	if (do_load_defaults) {
1340 		if (IS_SCSI(isp)) {
1341 			isp_setdfltsdparm(isp);
1342 		} else {
1343 			for (i = 0; i < isp->isp_nchan; i++) {
1344 				isp_setdfltfcparm(isp, i);
1345 			}
1346 		}
1347 	}
1348 }
1349 
1350 /*
1351  * Clean firmware shutdown.
1352  */
1353 static int
1354 isp_deinit(ispsoftc_t *isp)
1355 {
1356 	mbreg_t mbs;
1357 
1358 	isp->isp_state = ISP_NILSTATE;
1359 	MBSINIT(&mbs, MBOX_STOP_FIRMWARE, MBLOGALL, 500000);
1360 	mbs.param[1] = 0;
1361 	mbs.param[2] = 0;
1362 	mbs.param[3] = 0;
1363 	mbs.param[4] = 0;
1364 	mbs.param[5] = 0;
1365 	mbs.param[6] = 0;
1366 	mbs.param[7] = 0;
1367 	mbs.param[8] = 0;
1368 	isp_mboxcmd(isp, &mbs);
1369 	return (mbs.param[0] == MBOX_COMMAND_COMPLETE ? 0 : mbs.param[0]);
1370 }
1371 
1372 /*
1373  * Initialize Parameters of Hardware to a known state.
1374  *
1375  * Locks are held before coming here.
1376  */
1377 void
1378 isp_init(ispsoftc_t *isp)
1379 {
1380 	if (IS_FC(isp)) {
1381 		if (IS_24XX(isp)) {
1382 			isp_fibre_init_2400(isp);
1383 		} else {
1384 			isp_fibre_init(isp);
1385 		}
1386 	} else {
1387 		isp_scsi_init(isp);
1388 	}
1389 	GET_NANOTIME(&isp->isp_init_time);
1390 }
1391 
1392 static void
1393 isp_scsi_init(ispsoftc_t *isp)
1394 {
1395 	sdparam *sdp_chan0, *sdp_chan1;
1396 	mbreg_t mbs;
1397 
1398 	isp->isp_state = ISP_INITSTATE;
1399 
1400 	sdp_chan0 = SDPARAM(isp, 0);
1401 	sdp_chan1 = sdp_chan0;
1402 	if (IS_DUALBUS(isp)) {
1403 		sdp_chan1 = SDPARAM(isp, 1);
1404 	}
1405 
1406 	/* First do overall per-card settings. */
1407 
1408 	/*
1409 	 * If we have fast memory timing enabled, turn it on.
1410 	 */
1411 	if (sdp_chan0->isp_fast_mttr) {
1412 		ISP_WRITE(isp, RISC_MTR, 0x1313);
1413 	}
1414 
1415 	/*
1416 	 * Set Retry Delay and Count.
1417 	 * You set both channels at the same time.
1418 	 */
1419 	MBSINIT(&mbs, MBOX_SET_RETRY_COUNT, MBLOGALL, 0);
1420 	mbs.param[1] = sdp_chan0->isp_retry_count;
1421 	mbs.param[2] = sdp_chan0->isp_retry_delay;
1422 	mbs.param[6] = sdp_chan1->isp_retry_count;
1423 	mbs.param[7] = sdp_chan1->isp_retry_delay;
1424 	isp_mboxcmd(isp, &mbs);
1425 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1426 		return;
1427 	}
1428 
1429 	/*
1430 	 * Set ASYNC DATA SETUP time. This is very important.
1431 	 */
1432 	MBSINIT(&mbs, MBOX_SET_ASYNC_DATA_SETUP_TIME, MBLOGALL, 0);
1433 	mbs.param[1] = sdp_chan0->isp_async_data_setup;
1434 	mbs.param[2] = sdp_chan1->isp_async_data_setup;
1435 	isp_mboxcmd(isp, &mbs);
1436 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1437 		return;
1438 	}
1439 
1440 	/*
1441 	 * Set ACTIVE Negation State.
1442 	 */
1443 	MBSINIT(&mbs, MBOX_SET_ACT_NEG_STATE, MBLOGNONE, 0);
1444 	mbs.param[1] =
1445 	    (sdp_chan0->isp_req_ack_active_neg << 4) |
1446 	    (sdp_chan0->isp_data_line_active_neg << 5);
1447 	mbs.param[2] =
1448 	    (sdp_chan1->isp_req_ack_active_neg << 4) |
1449 	    (sdp_chan1->isp_data_line_active_neg << 5);
1450 	isp_mboxcmd(isp, &mbs);
1451 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1452 		isp_prt(isp, ISP_LOGERR,
1453 		    "failed to set active negation state (%d,%d), (%d,%d)",
1454 		    sdp_chan0->isp_req_ack_active_neg,
1455 		    sdp_chan0->isp_data_line_active_neg,
1456 		    sdp_chan1->isp_req_ack_active_neg,
1457 		    sdp_chan1->isp_data_line_active_neg);
1458 		/*
1459 		 * But don't return.
1460 		 */
1461 	}
1462 
1463 	/*
1464 	 * Set the Tag Aging limit
1465 	 */
1466 	MBSINIT(&mbs, MBOX_SET_TAG_AGE_LIMIT, MBLOGALL, 0);
1467 	mbs.param[1] = sdp_chan0->isp_tag_aging;
1468 	mbs.param[2] = sdp_chan1->isp_tag_aging;
1469 	isp_mboxcmd(isp, &mbs);
1470 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1471 		isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
1472 		    sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
1473 		return;
1474 	}
1475 
1476 	/*
1477 	 * Set selection timeout.
1478 	 */
1479 	MBSINIT(&mbs, MBOX_SET_SELECT_TIMEOUT, MBLOGALL, 0);
1480 	mbs.param[1] = sdp_chan0->isp_selection_timeout;
1481 	mbs.param[2] = sdp_chan1->isp_selection_timeout;
1482 	isp_mboxcmd(isp, &mbs);
1483 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1484 		return;
1485 	}
1486 
1487 	/* now do per-channel settings */
1488 	isp_scsi_channel_init(isp, 0);
1489 	if (IS_DUALBUS(isp))
1490 		isp_scsi_channel_init(isp, 1);
1491 
1492 	/*
1493 	 * Now enable request/response queues
1494 	 */
1495 
1496 	if (IS_ULTRA2(isp) || IS_1240(isp)) {
1497 		MBSINIT(&mbs, MBOX_INIT_RES_QUEUE_A64, MBLOGALL, 0);
1498 		mbs.param[1] = RESULT_QUEUE_LEN(isp);
1499 		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
1500 		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
1501 		mbs.param[4] = 0;
1502 		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
1503 		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
1504 		isp_mboxcmd(isp, &mbs);
1505 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1506 			return;
1507 		}
1508 		isp->isp_residx = isp->isp_resodx = mbs.param[5];
1509 
1510 		MBSINIT(&mbs, MBOX_INIT_REQ_QUEUE_A64, MBLOGALL, 0);
1511 		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
1512 		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
1513 		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
1514 		mbs.param[5] = 0;
1515 		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
1516 		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
1517 		isp_mboxcmd(isp, &mbs);
1518 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1519 			return;
1520 		}
1521 		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
1522 	} else {
1523 		MBSINIT(&mbs, MBOX_INIT_RES_QUEUE, MBLOGALL, 0);
1524 		mbs.param[1] = RESULT_QUEUE_LEN(isp);
1525 		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
1526 		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
1527 		mbs.param[4] = 0;
1528 		isp_mboxcmd(isp, &mbs);
1529 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1530 			return;
1531 		}
1532 		isp->isp_residx = isp->isp_resodx = mbs.param[5];
1533 
1534 		MBSINIT(&mbs, MBOX_INIT_REQ_QUEUE, MBLOGALL, 0);
1535 		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
1536 		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
1537 		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
1538 		mbs.param[5] = 0;
1539 		isp_mboxcmd(isp, &mbs);
1540 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1541 			return;
1542 		}
1543 		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
1544 	}
1545 
1546 	/*
1547 	 * Turn on LVD transitions for ULTRA2 or better and other features
1548 	 *
1549 	 * Now that we have 32 bit handles, don't do any fast posting
1550 	 * any more. For Ultra2/Ultra3 cards, we can turn on 32 bit RIO
1551 	 * operation or use fast posting. To be conservative, we'll only
1552 	 * do this for Ultra3 cards now because the other cards are so
1553 	 * rare for this author to find and test with.
1554 	 */
1555 
1556 	MBSINIT(&mbs, MBOX_SET_FW_FEATURES, MBLOGALL, 0);
1557 	if (IS_ULTRA2(isp))
1558 		mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
1559 #ifdef	ISP_NO_RIO
1560 	if (IS_ULTRA3(isp))
1561 		mbs.param[1] |= FW_FEATURE_FAST_POST;
1562 #else
1563 	if (IS_ULTRA3(isp))
1564 		mbs.param[1] |= FW_FEATURE_RIO_32BIT;
1565 #endif
1566 	if (mbs.param[1] != 0) {
1567 		uint16_t sfeat = mbs.param[1];
1568 		isp_mboxcmd(isp, &mbs);
1569 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1570 			isp_prt(isp, ISP_LOGINFO,
1571 			    "Enabled FW features (0x%x)", sfeat);
1572 		}
1573 	}
1574 
1575 	isp->isp_state = ISP_RUNSTATE;
1576 }
1577 
1578 static void
1579 isp_scsi_channel_init(ispsoftc_t *isp, int chan)
1580 {
1581 	sdparam *sdp;
1582 	mbreg_t mbs;
1583 	int tgt;
1584 
1585 	sdp = SDPARAM(isp, chan);
1586 
1587 	/*
1588 	 * Set (possibly new) Initiator ID.
1589 	 */
1590 	MBSINIT(&mbs, MBOX_SET_INIT_SCSI_ID, MBLOGALL, 0);
1591 	mbs.param[1] = (chan << 7) | sdp->isp_initiator_id;
1592 	isp_mboxcmd(isp, &mbs);
1593 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1594 		return;
1595 	}
1596 	isp_prt(isp, ISP_LOGINFO, "Chan %d Initiator ID is %d",
1597 	    chan, sdp->isp_initiator_id);
1598 
1599 
1600 	/*
1601 	 * Set current per-target parameters to an initial safe minimum.
1602 	 */
1603 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1604 		int lun;
1605 		uint16_t sdf;
1606 
1607 		if (sdp->isp_devparam[tgt].dev_enable == 0) {
1608 			continue;
1609 		}
1610 #ifndef	ISP_TARGET_MODE
1611 		sdf = sdp->isp_devparam[tgt].goal_flags;
1612 		sdf &= DPARM_SAFE_DFLT;
1613 		/*
1614 		 * It is not quite clear when this changed over so that
1615 		 * we could force narrow and async for 1000/1020 cards,
1616 		 * but assume that this is only the case for loaded
1617 		 * firmware.
1618 		 */
1619 		if (isp->isp_loaded_fw) {
1620 			sdf |= DPARM_NARROW | DPARM_ASYNC;
1621 		}
1622 #else
1623 		/*
1624 		 * The !$*!)$!$)* f/w uses the same index into some
1625 		 * internal table to decide how to respond to negotiations,
1626 		 * so if we've said "let's be safe" for ID X, and ID X
1627 		 * selects *us*, the negotiations will back to 'safe'
1628 		 * (as in narrow/async). What the f/w *should* do is
1629 		 * use the initiator id settings to decide how to respond.
1630 		 */
1631 		sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT;
1632 #endif
1633 		MBSINIT(&mbs, MBOX_SET_TARGET_PARAMS, MBLOGNONE, 0);
1634 		mbs.param[1] = (chan << 15) | (tgt << 8);
1635 		mbs.param[2] = sdf;
1636 		if ((sdf & DPARM_SYNC) == 0) {
1637 			mbs.param[3] = 0;
1638 		} else {
1639 			mbs.param[3] =
1640 			    (sdp->isp_devparam[tgt].goal_offset << 8) |
1641 			    (sdp->isp_devparam[tgt].goal_period);
1642 		}
1643 		isp_prt(isp, ISP_LOGDEBUG0, "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
1644 		    chan, tgt, mbs.param[2], mbs.param[3] >> 8, mbs.param[3] & 0xff);
1645 		isp_mboxcmd(isp, &mbs);
1646 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1647 			sdf = DPARM_SAFE_DFLT;
1648 			MBSINIT(&mbs, MBOX_SET_TARGET_PARAMS, MBLOGALL, 0);
1649 			mbs.param[1] = (tgt << 8) | (chan << 15);
1650 			mbs.param[2] = sdf;
1651 			mbs.param[3] = 0;
1652 			isp_mboxcmd(isp, &mbs);
1653 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1654 				continue;
1655 			}
1656 		}
1657 
1658 		/*
1659 		 * We don't update any information directly from the f/w
1660 		 * because we need to run at least one command to cause a
1661 		 * new state to be latched up. So, we just assume that we
1662 		 * converge to the values we just had set.
1663 		 *
1664 		 * Ensure that we don't believe tagged queuing is enabled yet.
1665 		 * It turns out that sometimes the ISP just ignores our
1666 		 * attempts to set parameters for devices that it hasn't
1667 		 * seen yet.
1668 		 */
1669 		sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING;
1670 		for (lun = 0; lun < (int) isp->isp_maxluns; lun++) {
1671 			MBSINIT(&mbs, MBOX_SET_DEV_QUEUE_PARAMS, MBLOGALL, 0);
1672 			mbs.param[1] = (chan << 15) | (tgt << 8) | lun;
1673 			mbs.param[2] = sdp->isp_max_queue_depth;
1674 			mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
1675 			isp_mboxcmd(isp, &mbs);
1676 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1677 				break;
1678 			}
1679 		}
1680 	}
1681 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1682 		if (sdp->isp_devparam[tgt].dev_refresh) {
1683 			sdp->sendmarker = 1;
1684 			sdp->update = 1;
1685 			break;
1686 		}
1687 	}
1688 }
1689 
1690 /*
1691  * Fibre Channel specific initialization.
1692  */
1693 static void
1694 isp_fibre_init(ispsoftc_t *isp)
1695 {
1696 	fcparam *fcp;
1697 	isp_icb_t local, *icbp = &local;
1698 	mbreg_t mbs;
1699 
1700 	/*
1701 	 * We only support one channel on non-24XX cards
1702 	 */
1703 	fcp = FCPARAM(isp, 0);
1704 	if (fcp->role == ISP_ROLE_NONE)
1705 		return;
1706 
1707 	isp->isp_state = ISP_INITSTATE;
1708 	ISP_MEMZERO(icbp, sizeof (*icbp));
1709 	icbp->icb_version = ICB_VERSION1;
1710 	icbp->icb_fwoptions = fcp->isp_fwoptions;
1711 
1712 	/*
1713 	 * Firmware Options are either retrieved from NVRAM or
1714 	 * are patched elsewhere. We check them for sanity here
1715 	 * and make changes based on board revision, but otherwise
1716 	 * let others decide policy.
1717 	 */
1718 
1719 	/*
1720 	 * If this is a 2100 < revision 5, we have to turn off FAIRNESS.
1721 	 */
1722 	if (IS_2100(isp) && isp->isp_revision < 5) {
1723 		icbp->icb_fwoptions &= ~ICBOPT_FAIRNESS;
1724 	}
1725 
1726 	/*
1727 	 * We have to use FULL LOGIN even though it resets the loop too much
1728 	 * because otherwise port database entries don't get updated after
1729 	 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0.
1730 	 */
1731 	if (!ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
1732 		icbp->icb_fwoptions |= ICBOPT_FULL_LOGIN;
1733 	}
1734 
1735 	/*
1736 	 * Insist on Port Database Update Async notifications
1737 	 */
1738 	icbp->icb_fwoptions |= ICBOPT_PDBCHANGE_AE;
1739 
1740 	/*
1741 	 * Make sure that target role reflects into fwoptions.
1742 	 */
1743 	if (fcp->role & ISP_ROLE_TARGET) {
1744 		icbp->icb_fwoptions |= ICBOPT_TGT_ENABLE;
1745 	} else {
1746 		icbp->icb_fwoptions &= ~ICBOPT_TGT_ENABLE;
1747 	}
1748 
1749 	/*
1750 	 * For some reason my 2200 does not generate ATIOs in target mode
1751 	 * if initiator is disabled.  Extra logins are better then target
1752 	 * not working at all.
1753 	 */
1754 	if ((fcp->role & ISP_ROLE_INITIATOR) || IS_2100(isp) || IS_2200(isp)) {
1755 		icbp->icb_fwoptions &= ~ICBOPT_INI_DISABLE;
1756 	} else {
1757 		icbp->icb_fwoptions |= ICBOPT_INI_DISABLE;
1758 	}
1759 
1760 	icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp);
1761 	if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
1762 		isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM- using %d", DEFAULT_FRAMESIZE(isp), ICB_DFLT_FRMLEN);
1763 		icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
1764 	}
1765 	icbp->icb_maxalloc = fcp->isp_maxalloc;
1766 	if (icbp->icb_maxalloc < 1) {
1767 		isp_prt(isp, ISP_LOGERR, "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc);
1768 		icbp->icb_maxalloc = 16;
1769 	}
1770 	icbp->icb_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
1771 	if (icbp->icb_execthrottle < 1) {
1772 		isp_prt(isp, ISP_LOGERR, "bad execution throttle of %d- using %d", DEFAULT_EXEC_THROTTLE(isp), ICB_DFLT_THROTTLE);
1773 		icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
1774 	}
1775 	icbp->icb_retry_delay = fcp->isp_retry_delay;
1776 	icbp->icb_retry_count = fcp->isp_retry_count;
1777 	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
1778 		icbp->icb_hardaddr = fcp->isp_loopid;
1779 		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
1780 			icbp->icb_fwoptions |= ICBOPT_HARD_ADDRESS;
1781 		else
1782 			icbp->icb_fwoptions |= ICBOPT_PREV_ADDRESS;
1783 	}
1784 
1785 	/*
1786 	 * Right now we just set extended options to prefer point-to-point
1787 	 * over loop based upon some soft config options.
1788 	 *
1789 	 * NB: for the 2300, ICBOPT_EXTENDED is required.
1790 	 */
1791 	if (IS_2100(isp)) {
1792 		/*
1793 		 * We can't have Fast Posting any more- we now
1794 		 * have 32 bit handles.
1795 		 */
1796 		icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1797 	} else if (IS_2200(isp) || IS_23XX(isp)) {
1798 		icbp->icb_fwoptions |= ICBOPT_EXTENDED;
1799 
1800 		icbp->icb_xfwoptions = fcp->isp_xfwoptions;
1801 
1802 		if (ISP_CAP_FCTAPE(isp)) {
1803 			if (isp->isp_confopts & ISP_CFG_NOFCTAPE)
1804 				icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
1805 
1806 			if (isp->isp_confopts & ISP_CFG_FCTAPE)
1807 				icbp->icb_xfwoptions |= ICBXOPT_FCTAPE;
1808 
1809 			if (icbp->icb_xfwoptions & ICBXOPT_FCTAPE) {
1810 				icbp->icb_fwoptions &= ~ICBOPT_FULL_LOGIN;	/* per documents */
1811 				icbp->icb_xfwoptions |= ICBXOPT_FCTAPE_CCQ|ICBXOPT_FCTAPE_CONFIRM;
1812 				FCPARAM(isp, 0)->fctape_enabled = 1;
1813 			} else {
1814 				FCPARAM(isp, 0)->fctape_enabled = 0;
1815 			}
1816 		} else {
1817 			icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
1818 			FCPARAM(isp, 0)->fctape_enabled = 0;
1819 		}
1820 
1821 		/*
1822 		 * Prefer or force Point-To-Point instead Loop?
1823 		 */
1824 		switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
1825 		case ISP_CFG_NPORT:
1826 			icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1827 			icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
1828 			break;
1829 		case ISP_CFG_NPORT_ONLY:
1830 			icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1831 			icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
1832 			break;
1833 		case ISP_CFG_LPORT_ONLY:
1834 			icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1835 			icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
1836 			break;
1837 		default:
1838 			/*
1839 			 * Let NVRAM settings define it if they are sane
1840 			 */
1841 			switch (icbp->icb_xfwoptions & ICBXOPT_TOPO_MASK) {
1842 			case ICBXOPT_PTP_2_LOOP:
1843 			case ICBXOPT_PTP_ONLY:
1844 			case ICBXOPT_LOOP_ONLY:
1845 			case ICBXOPT_LOOP_2_PTP:
1846 				break;
1847 			default:
1848 				icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1849 				icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
1850 			}
1851 			break;
1852 		}
1853 		if (IS_2200(isp)) {
1854 			/*
1855 			 * We can't have Fast Posting any more- we now
1856 			 * have 32 bit handles.
1857 			 *
1858 			 * RIO seemed to have to much breakage.
1859 			 *
1860 			 * Just opt for safety.
1861 			 */
1862 			icbp->icb_xfwoptions &= ~ICBXOPT_RIO_16BIT;
1863 			icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1864 		} else {
1865 			/*
1866 			 * QLogic recommends that FAST Posting be turned
1867 			 * off for 23XX cards and instead allow the HBA
1868 			 * to write response queue entries and interrupt
1869 			 * after a delay (ZIO).
1870 			 */
1871 			icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1872 			if ((fcp->isp_xfwoptions & ICBXOPT_TIMER_MASK) == ICBXOPT_ZIO) {
1873 				icbp->icb_xfwoptions |= ICBXOPT_ZIO;
1874 				icbp->icb_idelaytimer = 10;
1875 			}
1876 			icbp->icb_zfwoptions = fcp->isp_zfwoptions;
1877 			if (isp->isp_confopts & ISP_CFG_1GB) {
1878 				icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1879 				icbp->icb_zfwoptions |= ICBZOPT_RATE_1GB;
1880 			} else if (isp->isp_confopts & ISP_CFG_2GB) {
1881 				icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1882 				icbp->icb_zfwoptions |= ICBZOPT_RATE_2GB;
1883 			} else {
1884 				switch (icbp->icb_zfwoptions & ICBZOPT_RATE_MASK) {
1885 				case ICBZOPT_RATE_1GB:
1886 				case ICBZOPT_RATE_2GB:
1887 				case ICBZOPT_RATE_AUTO:
1888 					break;
1889 				default:
1890 					icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1891 					icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO;
1892 					break;
1893 				}
1894 			}
1895 		}
1896 	}
1897 
1898 
1899 	/*
1900 	 * For 22XX > 2.1.26 && 23XX, set some options.
1901 	 */
1902 	if (ISP_FW_NEWER_THAN(isp, 2, 26, 0)) {
1903 		MBSINIT(&mbs, MBOX_SET_FIRMWARE_OPTIONS, MBLOGALL, 0);
1904 		mbs.param[1] = IFCOPT1_DISF7SWTCH|IFCOPT1_LIPASYNC|IFCOPT1_LIPF8;
1905 		mbs.param[2] = 0;
1906 		mbs.param[3] = 0;
1907 		if (ISP_FW_NEWER_THAN(isp, 3, 16, 0)) {
1908 			mbs.param[1] |= IFCOPT1_EQFQASYNC|IFCOPT1_CTIO_RETRY;
1909 			if (fcp->role & ISP_ROLE_TARGET) {
1910 				if (ISP_FW_NEWER_THAN(isp, 3, 25, 0)) {
1911 					mbs.param[1] |= IFCOPT1_ENAPURE;
1912 				}
1913 				mbs.param[3] = IFCOPT3_NOPRLI;
1914 			}
1915 		}
1916 		isp_mboxcmd(isp, &mbs);
1917 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1918 			return;
1919 		}
1920 	}
1921 	icbp->icb_logintime = ICB_LOGIN_TOV;
1922 
1923 #ifdef	ISP_TARGET_MODE
1924 	if (icbp->icb_fwoptions & ICBOPT_TGT_ENABLE) {
1925 		icbp->icb_lunenables = 0xffff;
1926 		icbp->icb_ccnt = 0xff;
1927 		icbp->icb_icnt = 0xff;
1928 		icbp->icb_lunetimeout = ICB_LUN_ENABLE_TOV;
1929 	}
1930 #endif
1931 	if (fcp->isp_wwnn && fcp->isp_wwpn) {
1932 		icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
1933 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn);
1934 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
1935 		isp_prt(isp, ISP_LOGDEBUG1,
1936 		    "Setting ICB Node 0x%08x%08x Port 0x%08x%08x",
1937 		    ((uint32_t) (fcp->isp_wwnn >> 32)),
1938 		    ((uint32_t) (fcp->isp_wwnn)),
1939 		    ((uint32_t) (fcp->isp_wwpn >> 32)),
1940 		    ((uint32_t) (fcp->isp_wwpn)));
1941 	} else if (fcp->isp_wwpn) {
1942 		icbp->icb_fwoptions &= ~ICBOPT_BOTH_WWNS;
1943 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
1944 		isp_prt(isp, ISP_LOGDEBUG1,
1945 		    "Setting ICB Port 0x%08x%08x",
1946 		    ((uint32_t) (fcp->isp_wwpn >> 32)),
1947 		    ((uint32_t) (fcp->isp_wwpn)));
1948 	} else {
1949 		isp_prt(isp, ISP_LOGERR, "No valid WWNs to use");
1950 		return;
1951 	}
1952 	icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
1953 	if (icbp->icb_rqstqlen < 1) {
1954 		isp_prt(isp, ISP_LOGERR, "bad request queue length");
1955 	}
1956 	icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
1957 	if (icbp->icb_rsltqlen < 1) {
1958 		isp_prt(isp, ISP_LOGERR, "bad result queue length");
1959 	}
1960 	icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
1961 	icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
1962 	icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
1963 	icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
1964 	icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
1965 	icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
1966 	icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
1967 	icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
1968 
1969 	if (FC_SCRATCH_ACQUIRE(isp, 0)) {
1970 		isp_prt(isp, ISP_LOGERR, sacq);
1971 		return;
1972 	}
1973 	isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init: fwopt 0x%x xfwopt 0x%x zfwopt 0x%x",
1974 	    icbp->icb_fwoptions, icbp->icb_xfwoptions, icbp->icb_zfwoptions);
1975 
1976 	isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch);
1977 	if (isp->isp_dblev & ISP_LOGDEBUG1) {
1978 		isp_print_bytes(isp, "isp_fibre_init",
1979 		    sizeof(*icbp), fcp->isp_scratch);
1980 	}
1981 
1982 	/*
1983 	 * Init the firmware
1984 	 */
1985 	MBSINIT(&mbs, MBOX_INIT_FIRMWARE, MBLOGALL, 30000000);
1986 	mbs.param[1] = 0;
1987 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
1988 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
1989 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
1990 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
1991 	isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %p (%08x%08x)",
1992 	    fcp->isp_scratch, (uint32_t) ((uint64_t)fcp->isp_scdma >> 32),
1993 	    (uint32_t) fcp->isp_scdma);
1994 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp), 0);
1995 	isp_mboxcmd(isp, &mbs);
1996 	FC_SCRATCH_RELEASE(isp, 0);
1997 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
1998 		return;
1999 	isp->isp_reqidx = 0;
2000 	isp->isp_reqodx = 0;
2001 	isp->isp_residx = 0;
2002 	isp->isp_resodx = 0;
2003 
2004 	/*
2005 	 * Whatever happens, we're now committed to being here.
2006 	 */
2007 	isp->isp_state = ISP_RUNSTATE;
2008 }
2009 
2010 static void
2011 isp_fibre_init_2400(ispsoftc_t *isp)
2012 {
2013 	fcparam *fcp;
2014 	isp_icb_2400_t local, *icbp = &local;
2015 	mbreg_t mbs;
2016 	int chan;
2017 
2018 	/*
2019 	 * Check to see whether all channels have *some* kind of role
2020 	 */
2021 	for (chan = 0; chan < isp->isp_nchan; chan++) {
2022 		fcp = FCPARAM(isp, chan);
2023 		if (fcp->role != ISP_ROLE_NONE) {
2024 			break;
2025 		}
2026 	}
2027 	if (chan == isp->isp_nchan) {
2028 		isp_prt(isp, ISP_LOG_WARN1, "all %d channels with role 'none'", chan);
2029 		return;
2030 	}
2031 
2032 	isp->isp_state = ISP_INITSTATE;
2033 
2034 	/*
2035 	 * Start with channel 0.
2036 	 */
2037 	fcp = FCPARAM(isp, 0);
2038 
2039 	/*
2040 	 * Turn on LIP F8 async event (1)
2041 	 */
2042 	MBSINIT(&mbs, MBOX_SET_FIRMWARE_OPTIONS, MBLOGALL, 0);
2043 	mbs.param[1] = 1;
2044 	isp_mboxcmd(isp, &mbs);
2045 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2046 		return;
2047 	}
2048 
2049 	ISP_MEMZERO(icbp, sizeof (*icbp));
2050 	icbp->icb_fwoptions1 = fcp->isp_fwoptions;
2051 	icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
2052 	icbp->icb_fwoptions3 = fcp->isp_zfwoptions;
2053 	if (isp->isp_nchan > 1 && ISP_CAP_VP0(isp)) {
2054 		icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
2055 		icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
2056 	} else {
2057 		if (fcp->role & ISP_ROLE_TARGET)
2058 			icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
2059 		else
2060 			icbp->icb_fwoptions1 &= ~ICB2400_OPT1_TGT_ENABLE;
2061 		if (fcp->role & ISP_ROLE_INITIATOR)
2062 			icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
2063 		else
2064 			icbp->icb_fwoptions1 |= ICB2400_OPT1_INI_DISABLE;
2065 	}
2066 
2067 	icbp->icb_version = ICB_VERSION1;
2068 	icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp);
2069 	if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
2070 		isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM- using %d", DEFAULT_FRAMESIZE(isp), ICB_DFLT_FRMLEN);
2071 		icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
2072 	}
2073 
2074 	icbp->icb_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
2075 	if (icbp->icb_execthrottle < 1) {
2076 		isp_prt(isp, ISP_LOGERR, "bad execution throttle of %d- using %d", DEFAULT_EXEC_THROTTLE(isp), ICB_DFLT_THROTTLE);
2077 		icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
2078 	}
2079 
2080 	/*
2081 	 * Set target exchange count. Take half if we are supporting both roles.
2082 	 */
2083 	if (icbp->icb_fwoptions1 & ICB2400_OPT1_TGT_ENABLE) {
2084 		icbp->icb_xchgcnt = isp->isp_maxcmds;
2085 		if ((icbp->icb_fwoptions1 & ICB2400_OPT1_INI_DISABLE) == 0)
2086 			icbp->icb_xchgcnt >>= 1;
2087 	}
2088 
2089 	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
2090 		icbp->icb_hardaddr = fcp->isp_loopid;
2091 		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2092 			icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
2093 		else
2094 			icbp->icb_fwoptions1 |= ICB2400_OPT1_PREV_ADDRESS;
2095 	}
2096 
2097 	if (isp->isp_confopts & ISP_CFG_NOFCTAPE) {
2098 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE;
2099 	}
2100 	if (isp->isp_confopts & ISP_CFG_FCTAPE) {
2101 		icbp->icb_fwoptions2 |= ICB2400_OPT2_FCTAPE;
2102 	}
2103 
2104 	for (chan = 0; chan < isp->isp_nchan; chan++) {
2105 		if (icbp->icb_fwoptions2 & ICB2400_OPT2_FCTAPE)
2106 			FCPARAM(isp, chan)->fctape_enabled = 1;
2107 		else
2108 			FCPARAM(isp, chan)->fctape_enabled = 0;
2109 	}
2110 
2111 	switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
2112 	case ISP_CFG_NPORT_ONLY:
2113 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2114 		icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY;
2115 		break;
2116 	case ISP_CFG_LPORT_ONLY:
2117 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2118 		icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY;
2119 		break;
2120 	default:
2121 		/* ISP_CFG_PTP_2_LOOP not available in 24XX/25XX */
2122 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2123 		icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP;
2124 		break;
2125 	}
2126 
2127 	switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) {
2128 	case ICB2400_OPT2_ZIO:
2129 	case ICB2400_OPT2_ZIO1:
2130 		icbp->icb_idelaytimer = 0;
2131 		break;
2132 	case 0:
2133 		break;
2134 	default:
2135 		isp_prt(isp, ISP_LOGWARN, "bad value %x in fwopt2 timer field", icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK);
2136 		icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TIMER_MASK;
2137 		break;
2138 	}
2139 
2140 	if (IS_26XX(isp)) {
2141 		/* We don't support MSI-X yet, so set this unconditionally. */
2142 		icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHR;
2143 		icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHA;
2144 	}
2145 
2146 	if ((icbp->icb_fwoptions3 & ICB2400_OPT3_RSPSZ_MASK) == 0) {
2147 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RSPSZ_24;
2148 	}
2149 	if (isp->isp_confopts & ISP_CFG_1GB) {
2150 		icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2151 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_1GB;
2152 	} else if (isp->isp_confopts & ISP_CFG_2GB) {
2153 		icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2154 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_2GB;
2155 	} else if (isp->isp_confopts & ISP_CFG_4GB) {
2156 		icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2157 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_4GB;
2158 	} else if (isp->isp_confopts & ISP_CFG_8GB) {
2159 		icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2160 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_8GB;
2161 	} else if (isp->isp_confopts & ISP_CFG_16GB) {
2162 		icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2163 		icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_16GB;
2164 	} else {
2165 		switch (icbp->icb_fwoptions3 & ICB2400_OPT3_RATE_MASK) {
2166 		case ICB2400_OPT3_RATE_4GB:
2167 		case ICB2400_OPT3_RATE_8GB:
2168 		case ICB2400_OPT3_RATE_16GB:
2169 		case ICB2400_OPT3_RATE_AUTO:
2170 			break;
2171 		case ICB2400_OPT3_RATE_2GB:
2172 			if (isp->isp_type <= ISP_HA_FC_2500)
2173 				break;
2174 			/*FALLTHROUGH*/
2175 		case ICB2400_OPT3_RATE_1GB:
2176 			if (isp->isp_type <= ISP_HA_FC_2400)
2177 				break;
2178 			/*FALLTHROUGH*/
2179 		default:
2180 			icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2181 			icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO;
2182 			break;
2183 		}
2184 	}
2185 	icbp->icb_logintime = ICB_LOGIN_TOV;
2186 
2187 	if (fcp->isp_wwnn && fcp->isp_wwpn) {
2188 		icbp->icb_fwoptions1 |= ICB2400_OPT1_BOTH_WWNS;
2189 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
2190 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn);
2191 		isp_prt(isp, ISP_LOGDEBUG1, "Setting ICB Node 0x%08x%08x Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwnn >> 32)), ((uint32_t) (fcp->isp_wwnn)),
2192 		    ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->isp_wwpn)));
2193 	} else if (fcp->isp_wwpn) {
2194 		icbp->icb_fwoptions1 &= ~ICB2400_OPT1_BOTH_WWNS;
2195 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
2196 		isp_prt(isp, ISP_LOGDEBUG1, "Setting ICB Node to be same as Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->isp_wwpn)));
2197 	} else {
2198 		isp_prt(isp, ISP_LOGERR, "No valid WWNs to use");
2199 		return;
2200 	}
2201 	icbp->icb_retry_count = fcp->isp_retry_count;
2202 
2203 	icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
2204 	if (icbp->icb_rqstqlen < 8) {
2205 		isp_prt(isp, ISP_LOGERR, "bad request queue length %d", icbp->icb_rqstqlen);
2206 		return;
2207 	}
2208 	icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
2209 	if (icbp->icb_rsltqlen < 8) {
2210 		isp_prt(isp, ISP_LOGERR, "bad result queue length %d",
2211 		    icbp->icb_rsltqlen);
2212 		return;
2213 	}
2214 	icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
2215 	icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
2216 	icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
2217 	icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
2218 
2219 	icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
2220 	icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
2221 	icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
2222 	icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
2223 
2224 #ifdef	ISP_TARGET_MODE
2225 	/* unconditionally set up the ATIO queue if we support target mode */
2226 	icbp->icb_atioqlen = RESULT_QUEUE_LEN(isp);
2227 	if (icbp->icb_atioqlen < 8) {
2228 		isp_prt(isp, ISP_LOGERR, "bad ATIO queue length %d", icbp->icb_atioqlen);
2229 		return;
2230 	}
2231 	icbp->icb_atioqaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_atioq_dma);
2232 	icbp->icb_atioqaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_atioq_dma);
2233 	icbp->icb_atioqaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_atioq_dma);
2234 	icbp->icb_atioqaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_atioq_dma);
2235 	isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: atioq %04x%04x%04x%04x", DMA_WD3(isp->isp_atioq_dma), DMA_WD2(isp->isp_atioq_dma),
2236 	    DMA_WD1(isp->isp_atioq_dma), DMA_WD0(isp->isp_atioq_dma));
2237 #endif
2238 
2239 	isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x", icbp->icb_fwoptions1, icbp->icb_fwoptions2, icbp->icb_fwoptions3);
2240 
2241 	isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: rqst %04x%04x%04x%04x rsp %04x%04x%04x%04x", DMA_WD3(isp->isp_rquest_dma), DMA_WD2(isp->isp_rquest_dma),
2242 	    DMA_WD1(isp->isp_rquest_dma), DMA_WD0(isp->isp_rquest_dma), DMA_WD3(isp->isp_result_dma), DMA_WD2(isp->isp_result_dma),
2243 	    DMA_WD1(isp->isp_result_dma), DMA_WD0(isp->isp_result_dma));
2244 
2245 	if (FC_SCRATCH_ACQUIRE(isp, 0)) {
2246 		isp_prt(isp, ISP_LOGERR, sacq);
2247 		return;
2248 	}
2249 	ISP_MEMZERO(fcp->isp_scratch, ISP_FC_SCRLEN);
2250 	isp_put_icb_2400(isp, icbp, fcp->isp_scratch);
2251 	if (isp->isp_dblev & ISP_LOGDEBUG1) {
2252 		isp_print_bytes(isp, "isp_fibre_init_2400",
2253 		    sizeof (*icbp), fcp->isp_scratch);
2254 	}
2255 
2256 	/*
2257 	 * Now fill in information about any additional channels
2258 	 */
2259 	if (isp->isp_nchan > 1) {
2260 		isp_icb_2400_vpinfo_t vpinfo, *vdst;
2261 		vp_port_info_t pi, *pdst;
2262 		size_t amt = 0;
2263 		uint8_t *off;
2264 
2265 		vpinfo.vp_global_options = ICB2400_VPGOPT_GEN_RIDA;
2266 		if (ISP_CAP_VP0(isp)) {
2267 			vpinfo.vp_global_options |= ICB2400_VPGOPT_VP0_DECOUPLE;
2268 			vpinfo.vp_count = isp->isp_nchan;
2269 			chan = 0;
2270 		} else {
2271 			vpinfo.vp_count = isp->isp_nchan - 1;
2272 			chan = 1;
2273 		}
2274 		off = fcp->isp_scratch;
2275 		off += ICB2400_VPINFO_OFF;
2276 		vdst = (isp_icb_2400_vpinfo_t *) off;
2277 		isp_put_icb_2400_vpinfo(isp, &vpinfo, vdst);
2278 		amt = ICB2400_VPINFO_OFF + sizeof (isp_icb_2400_vpinfo_t);
2279 		for (; chan < isp->isp_nchan; chan++) {
2280 			fcparam *fcp2;
2281 
2282 			ISP_MEMZERO(&pi, sizeof (pi));
2283 			fcp2 = FCPARAM(isp, chan);
2284 			if (fcp2->role != ISP_ROLE_NONE) {
2285 				pi.vp_port_options = ICB2400_VPOPT_ENABLED |
2286 				    ICB2400_VPOPT_ENA_SNSLOGIN;
2287 				if (fcp2->role & ISP_ROLE_INITIATOR)
2288 					pi.vp_port_options |= ICB2400_VPOPT_INI_ENABLE;
2289 				if ((fcp2->role & ISP_ROLE_TARGET) == 0)
2290 					pi.vp_port_options |= ICB2400_VPOPT_TGT_DISABLE;
2291 			}
2292 			if (fcp2->isp_loopid < LOCAL_LOOP_LIM) {
2293 				pi.vp_port_loopid = fcp2->isp_loopid;
2294 				if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2295 					pi.vp_port_options |= ICB2400_VPOPT_HARD_ADDRESS;
2296 				else
2297 					pi.vp_port_options |= ICB2400_VPOPT_PREV_ADDRESS;
2298 			}
2299 			MAKE_NODE_NAME_FROM_WWN(pi.vp_port_portname, fcp2->isp_wwpn);
2300 			MAKE_NODE_NAME_FROM_WWN(pi.vp_port_nodename, fcp2->isp_wwnn);
2301 			off = fcp->isp_scratch;
2302 			if (ISP_CAP_VP0(isp))
2303 				off += ICB2400_VPINFO_PORT_OFF(chan);
2304 			else
2305 				off += ICB2400_VPINFO_PORT_OFF(chan - 1);
2306 			pdst = (vp_port_info_t *) off;
2307 			isp_put_vp_port_info(isp, &pi, pdst);
2308 			amt += ICB2400_VPOPT_WRITE_SIZE;
2309 		}
2310 		if (isp->isp_dblev & ISP_LOGDEBUG1) {
2311 			isp_print_bytes(isp, "isp_fibre_init_2400",
2312 			    amt - ICB2400_VPINFO_OFF,
2313 			    (char *)fcp->isp_scratch + ICB2400_VPINFO_OFF);
2314 		}
2315 	}
2316 
2317 	/*
2318 	 * Init the firmware
2319 	 */
2320 	MBSINIT(&mbs, 0, MBLOGALL, 30000000);
2321 	if (isp->isp_nchan > 1) {
2322 		mbs.param[0] = MBOX_INIT_FIRMWARE_MULTI_ID;
2323 	} else {
2324 		mbs.param[0] = MBOX_INIT_FIRMWARE;
2325 	}
2326 	mbs.param[1] = 0;
2327 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2328 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2329 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2330 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2331 	isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %04x%04x%04x%04x", DMA_WD3(fcp->isp_scdma), DMA_WD2(fcp->isp_scdma), DMA_WD1(fcp->isp_scdma), DMA_WD0(fcp->isp_scdma));
2332 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp), 0);
2333 	isp_mboxcmd(isp, &mbs);
2334 	FC_SCRATCH_RELEASE(isp, 0);
2335 
2336 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2337 		return;
2338 	}
2339 	isp->isp_reqidx = 0;
2340 	isp->isp_reqodx = 0;
2341 	isp->isp_residx = 0;
2342 	isp->isp_resodx = 0;
2343 	isp->isp_atioodx = 0;
2344 
2345 	/*
2346 	 * Whatever happens, we're now committed to being here.
2347 	 */
2348 	isp->isp_state = ISP_RUNSTATE;
2349 }
2350 
2351 static int
2352 isp_fc_enable_vp(ispsoftc_t *isp, int chan)
2353 {
2354 	fcparam *fcp = FCPARAM(isp, chan);
2355 	vp_modify_t vp;
2356 	void *reqp;
2357 	uint8_t resp[QENTRY_LEN];
2358 
2359 	/* Build a VP MODIFY command in memory */
2360 	ISP_MEMZERO(&vp, sizeof(vp));
2361 	vp.vp_mod_hdr.rqs_entry_type = RQSTYPE_VP_MODIFY;
2362 	vp.vp_mod_hdr.rqs_entry_count = 1;
2363 	vp.vp_mod_cnt = 1;
2364 	vp.vp_mod_idx0 = chan;
2365 	vp.vp_mod_cmd = VP_MODIFY_ENA;
2366 	vp.vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED |
2367 	    ICB2400_VPOPT_ENA_SNSLOGIN;
2368 	if (fcp->role & ISP_ROLE_INITIATOR)
2369 		vp.vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE;
2370 	if ((fcp->role & ISP_ROLE_TARGET) == 0)
2371 		vp.vp_mod_ports[0].options |= ICB2400_VPOPT_TGT_DISABLE;
2372 	if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
2373 		vp.vp_mod_ports[0].loopid = fcp->isp_loopid;
2374 		if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2375 			vp.vp_mod_ports[0].options |= ICB2400_VPOPT_HARD_ADDRESS;
2376 		else
2377 			vp.vp_mod_ports[0].options |= ICB2400_VPOPT_PREV_ADDRESS;
2378 	}
2379 	MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwpn, fcp->isp_wwpn);
2380 	MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwnn, fcp->isp_wwnn);
2381 
2382 	/* Prepare space for response in memory */
2383 	memset(resp, 0xff, sizeof(resp));
2384 	vp.vp_mod_hdl = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2385 	if (vp.vp_mod_hdl == 0) {
2386 		isp_prt(isp, ISP_LOGERR,
2387 		    "%s: VP_MODIFY of Chan %d out of handles", __func__, chan);
2388 		return (EIO);
2389 	}
2390 
2391 	/* Send request and wait for response. */
2392 	reqp = isp_getrqentry(isp);
2393 	if (reqp == NULL) {
2394 		isp_prt(isp, ISP_LOGERR,
2395 		    "%s: VP_MODIFY of Chan %d out of rqent", __func__, chan);
2396 		isp_destroy_handle(isp, vp.vp_mod_hdl);
2397 		return (EIO);
2398 	}
2399 	isp_put_vp_modify(isp, &vp, (vp_modify_t *)reqp);
2400 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2401 		isp_print_bytes(isp, "IOCB VP_MODIFY", QENTRY_LEN, reqp);
2402 	ISP_SYNC_REQUEST(isp);
2403 	if (msleep(resp, &isp->isp_lock, 0, "VP_MODIFY", 5*hz) == EWOULDBLOCK) {
2404 		isp_prt(isp, ISP_LOGERR,
2405 		    "%s: VP_MODIFY of Chan %d timed out", __func__, chan);
2406 		isp_destroy_handle(isp, vp.vp_mod_hdl);
2407 		return (EIO);
2408 	}
2409 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2410 		isp_print_bytes(isp, "IOCB VP_MODIFY response", QENTRY_LEN, resp);
2411 	isp_get_vp_modify(isp, (vp_modify_t *)resp, &vp);
2412 
2413 	if (vp.vp_mod_hdr.rqs_flags != 0 || vp.vp_mod_status != VP_STS_OK) {
2414 		isp_prt(isp, ISP_LOGERR,
2415 		    "%s: VP_MODIFY of Chan %d failed with flags %x status %d",
2416 		    __func__, chan, vp.vp_mod_hdr.rqs_flags, vp.vp_mod_status);
2417 		return (EIO);
2418 	}
2419 	return (0);
2420 }
2421 
2422 static int
2423 isp_fc_disable_vp(ispsoftc_t *isp, int chan)
2424 {
2425 	vp_ctrl_info_t vp;
2426 	void *reqp;
2427 	uint8_t resp[QENTRY_LEN];
2428 
2429 	/* Build a VP CTRL command in memory */
2430 	ISP_MEMZERO(&vp, sizeof(vp));
2431 	vp.vp_ctrl_hdr.rqs_entry_type = RQSTYPE_VP_CTRL;
2432 	vp.vp_ctrl_hdr.rqs_entry_count = 1;
2433 	if (ISP_CAP_VP0(isp)) {
2434 		vp.vp_ctrl_status = 1;
2435 	} else {
2436 		vp.vp_ctrl_status = 0;
2437 		chan--;	/* VP0 can not be controlled in this case. */
2438 	}
2439 	vp.vp_ctrl_command = VP_CTRL_CMD_DISABLE_VP_LOGO_ALL;
2440 	vp.vp_ctrl_vp_count = 1;
2441 	vp.vp_ctrl_idmap[chan / 16] |= (1 << chan % 16);
2442 
2443 	/* Prepare space for response in memory */
2444 	memset(resp, 0xff, sizeof(resp));
2445 	vp.vp_ctrl_handle = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2446 	if (vp.vp_ctrl_handle == 0) {
2447 		isp_prt(isp, ISP_LOGERR,
2448 		    "%s: VP_CTRL of Chan %d out of handles", __func__, chan);
2449 		return (EIO);
2450 	}
2451 
2452 	/* Send request and wait for response. */
2453 	reqp = isp_getrqentry(isp);
2454 	if (reqp == NULL) {
2455 		isp_prt(isp, ISP_LOGERR,
2456 		    "%s: VP_CTRL of Chan %d out of rqent", __func__, chan);
2457 		isp_destroy_handle(isp, vp.vp_ctrl_handle);
2458 		return (EIO);
2459 	}
2460 	isp_put_vp_ctrl_info(isp, &vp, (vp_ctrl_info_t *)reqp);
2461 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2462 		isp_print_bytes(isp, "IOCB VP_CTRL", QENTRY_LEN, reqp);
2463 	ISP_SYNC_REQUEST(isp);
2464 	if (msleep(resp, &isp->isp_lock, 0, "VP_CTRL", 5*hz) == EWOULDBLOCK) {
2465 		isp_prt(isp, ISP_LOGERR,
2466 		    "%s: VP_CTRL of Chan %d timed out", __func__, chan);
2467 		isp_destroy_handle(isp, vp.vp_ctrl_handle);
2468 		return (EIO);
2469 	}
2470 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2471 		isp_print_bytes(isp, "IOCB VP_CTRL response", QENTRY_LEN, resp);
2472 	isp_get_vp_ctrl_info(isp, (vp_ctrl_info_t *)resp, &vp);
2473 
2474 	if (vp.vp_ctrl_hdr.rqs_flags != 0 || vp.vp_ctrl_status != 0) {
2475 		isp_prt(isp, ISP_LOGERR,
2476 		    "%s: VP_CTRL of Chan %d failed with flags %x status %d %d",
2477 		    __func__, chan, vp.vp_ctrl_hdr.rqs_flags,
2478 		    vp.vp_ctrl_status, vp.vp_ctrl_index_fail);
2479 		return (EIO);
2480 	}
2481 	return (0);
2482 }
2483 
2484 static int
2485 isp_fc_change_role(ispsoftc_t *isp, int chan, int new_role)
2486 {
2487 	fcparam *fcp = FCPARAM(isp, chan);
2488 	int i, was, res = 0;
2489 
2490 	if (chan >= isp->isp_nchan) {
2491 		isp_prt(isp, ISP_LOGWARN, "%s: bad channel %d", __func__, chan);
2492 		return (ENXIO);
2493 	}
2494 	if (fcp->role == new_role)
2495 		return (0);
2496 	for (was = 0, i = 0; i < isp->isp_nchan; i++) {
2497 		if (FCPARAM(isp, i)->role != ISP_ROLE_NONE)
2498 			was++;
2499 	}
2500 	if (was == 0 || (was == 1 && fcp->role != ISP_ROLE_NONE)) {
2501 		fcp->role = new_role;
2502 		return (isp_reinit(isp, 0));
2503 	}
2504 	if (fcp->role != ISP_ROLE_NONE) {
2505 		res = isp_fc_disable_vp(isp, chan);
2506 		isp_clear_portdb(isp, chan);
2507 	}
2508 	fcp->role = new_role;
2509 	if (fcp->role != ISP_ROLE_NONE)
2510 		res = isp_fc_enable_vp(isp, chan);
2511 	return (res);
2512 }
2513 
2514 static void
2515 isp_clear_portdb(ispsoftc_t *isp, int chan)
2516 {
2517 	fcparam *fcp = FCPARAM(isp, chan);
2518 	fcportdb_t *lp;
2519 	int i;
2520 
2521 	for (i = 0; i < MAX_FC_TARG; i++) {
2522 		lp = &fcp->portdb[i];
2523 		switch (lp->state) {
2524 		case FC_PORTDB_STATE_DEAD:
2525 		case FC_PORTDB_STATE_CHANGED:
2526 		case FC_PORTDB_STATE_VALID:
2527 			lp->state = FC_PORTDB_STATE_NIL;
2528 			isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
2529 			break;
2530 		case FC_PORTDB_STATE_NIL:
2531 		case FC_PORTDB_STATE_NEW:
2532 			lp->state = FC_PORTDB_STATE_NIL;
2533 			break;
2534 		case FC_PORTDB_STATE_ZOMBIE:
2535 			break;
2536 		default:
2537 			panic("Don't know how to clear state %d\n", lp->state);
2538 		}
2539 	}
2540 }
2541 
2542 static void
2543 isp_mark_portdb(ispsoftc_t *isp, int chan)
2544 {
2545 	fcparam *fcp = FCPARAM(isp, chan);
2546 	fcportdb_t *lp;
2547 	int i;
2548 
2549 	for (i = 0; i < MAX_FC_TARG; i++) {
2550 		lp = &fcp->portdb[i];
2551 		if (lp->state == FC_PORTDB_STATE_NIL)
2552 			continue;
2553 		if (lp->portid >= DOMAIN_CONTROLLER_BASE &&
2554 		    lp->portid <= DOMAIN_CONTROLLER_END)
2555 			continue;
2556 		fcp->portdb[i].probational = 1;
2557 	}
2558 }
2559 
2560 /*
2561  * Perform an IOCB PLOGI or LOGO via EXECUTE IOCB A64 for 24XX cards
2562  * or via FABRIC LOGIN/FABRIC LOGOUT for other cards.
2563  */
2564 static int
2565 isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags)
2566 {
2567 	isp_plogx_t pl;
2568 	void *reqp;
2569 	uint8_t resp[QENTRY_LEN];
2570 	uint32_t sst, parm1;
2571 	int rval, lev;
2572 	const char *msg;
2573 	char buf[64];
2574 
2575 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d PLOGX %s PortID 0x%06x nphdl 0x%x",
2576 	    chan, (flags & PLOGX_FLG_CMD_MASK) == PLOGX_FLG_CMD_PLOGI ?
2577 	    "Login":"Logout", portid, handle);
2578 	if (!IS_24XX(isp)) {
2579 		int action = flags & PLOGX_FLG_CMD_MASK;
2580 		if (action == PLOGX_FLG_CMD_PLOGI) {
2581 			return (isp_port_login(isp, handle, portid));
2582 		} else if (action == PLOGX_FLG_CMD_LOGO) {
2583 			return (isp_port_logout(isp, handle, portid));
2584 		} else {
2585 			return (MBOX_INVALID_COMMAND);
2586 		}
2587 	}
2588 
2589 	ISP_MEMZERO(&pl, sizeof(pl));
2590 	pl.plogx_header.rqs_entry_count = 1;
2591 	pl.plogx_header.rqs_entry_type = RQSTYPE_LOGIN;
2592 	pl.plogx_nphdl = handle;
2593 	pl.plogx_vphdl = chan;
2594 	pl.plogx_portlo = portid;
2595 	pl.plogx_rspsz_porthi = (portid >> 16) & 0xff;
2596 	pl.plogx_flags = flags;
2597 
2598 	/* Prepare space for response in memory */
2599 	memset(resp, 0xff, sizeof(resp));
2600 	pl.plogx_handle = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2601 	if (pl.plogx_handle == 0) {
2602 		isp_prt(isp, ISP_LOGERR,
2603 		    "%s: PLOGX of Chan %d out of handles", __func__, chan);
2604 		return (-1);
2605 	}
2606 
2607 	/* Send request and wait for response. */
2608 	reqp = isp_getrqentry(isp);
2609 	if (reqp == NULL) {
2610 		isp_prt(isp, ISP_LOGERR,
2611 		    "%s: PLOGX of Chan %d out of rqent", __func__, chan);
2612 		isp_destroy_handle(isp, pl.plogx_handle);
2613 		return (-1);
2614 	}
2615 	isp_put_plogx(isp, &pl, (isp_plogx_t *)reqp);
2616 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2617 		isp_print_bytes(isp, "IOCB LOGX", QENTRY_LEN, reqp);
2618 	ISP_SYNC_REQUEST(isp);
2619 	if (msleep(resp, &isp->isp_lock, 0, "PLOGX", 3 * ICB_LOGIN_TOV * hz)
2620 	    == EWOULDBLOCK) {
2621 		isp_prt(isp, ISP_LOGERR,
2622 		    "%s: PLOGX of Chan %d timed out", __func__, chan);
2623 		isp_destroy_handle(isp, pl.plogx_handle);
2624 		return (-1);
2625 	}
2626 	if (isp->isp_dblev & ISP_LOGDEBUG1)
2627 		isp_print_bytes(isp, "IOCB LOGX response", QENTRY_LEN, resp);
2628 	isp_get_plogx(isp, (isp_plogx_t *)resp, &pl);
2629 
2630 	if (pl.plogx_status == PLOGX_STATUS_OK) {
2631 		return (0);
2632 	} else if (pl.plogx_status != PLOGX_STATUS_IOCBERR) {
2633 		isp_prt(isp, ISP_LOGWARN,
2634 		    "status 0x%x on port login IOCB channel %d",
2635 		    pl.plogx_status, chan);
2636 		return (-1);
2637 	}
2638 
2639 	sst = pl.plogx_ioparm[0].lo16 | (pl.plogx_ioparm[0].hi16 << 16);
2640 	parm1 = pl.plogx_ioparm[1].lo16 | (pl.plogx_ioparm[1].hi16 << 16);
2641 
2642 	rval = -1;
2643 	lev = ISP_LOGERR;
2644 	msg = NULL;
2645 
2646 	switch (sst) {
2647 	case PLOGX_IOCBERR_NOLINK:
2648 		msg = "no link";
2649 		break;
2650 	case PLOGX_IOCBERR_NOIOCB:
2651 		msg = "no IOCB buffer";
2652 		break;
2653 	case PLOGX_IOCBERR_NOXGHG:
2654 		msg = "no Exchange Control Block";
2655 		break;
2656 	case PLOGX_IOCBERR_FAILED:
2657 		ISP_SNPRINTF(buf, sizeof (buf), "reason 0x%x (last LOGIN state 0x%x)", parm1 & 0xff, (parm1 >> 8) & 0xff);
2658 		msg = buf;
2659 		break;
2660 	case PLOGX_IOCBERR_NOFABRIC:
2661 		msg = "no fabric";
2662 		break;
2663 	case PLOGX_IOCBERR_NOTREADY:
2664 		msg = "firmware not ready";
2665 		break;
2666 	case PLOGX_IOCBERR_NOLOGIN:
2667 		ISP_SNPRINTF(buf, sizeof (buf), "not logged in (last state 0x%x)", parm1);
2668 		msg = buf;
2669 		rval = MBOX_NOT_LOGGED_IN;
2670 		break;
2671 	case PLOGX_IOCBERR_REJECT:
2672 		ISP_SNPRINTF(buf, sizeof (buf), "LS_RJT = 0x%x", parm1);
2673 		msg = buf;
2674 		break;
2675 	case PLOGX_IOCBERR_NOPCB:
2676 		msg = "no PCB allocated";
2677 		break;
2678 	case PLOGX_IOCBERR_EINVAL:
2679 		ISP_SNPRINTF(buf, sizeof (buf), "invalid parameter at offset 0x%x", parm1);
2680 		msg = buf;
2681 		break;
2682 	case PLOGX_IOCBERR_PORTUSED:
2683 		lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
2684 		ISP_SNPRINTF(buf, sizeof (buf), "already logged in with N-Port handle 0x%x", parm1);
2685 		msg = buf;
2686 		rval = MBOX_PORT_ID_USED | (parm1 << 16);
2687 		break;
2688 	case PLOGX_IOCBERR_HNDLUSED:
2689 		lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
2690 		ISP_SNPRINTF(buf, sizeof (buf), "handle already used for PortID 0x%06x", parm1);
2691 		msg = buf;
2692 		rval = MBOX_LOOP_ID_USED;
2693 		break;
2694 	case PLOGX_IOCBERR_NOHANDLE:
2695 		msg = "no handle allocated";
2696 		break;
2697 	case PLOGX_IOCBERR_NOFLOGI:
2698 		msg = "no FLOGI_ACC";
2699 		break;
2700 	default:
2701 		ISP_SNPRINTF(buf, sizeof (buf), "status %x from %x", pl.plogx_status, flags);
2702 		msg = buf;
2703 		break;
2704 	}
2705 	if (msg) {
2706 		isp_prt(isp, ISP_LOGERR, "Chan %d PLOGX PortID 0x%06x to N-Port handle 0x%x: %s", chan, portid, handle, msg);
2707 	}
2708 	return (rval);
2709 }
2710 
2711 static int
2712 isp_port_login(ispsoftc_t *isp, uint16_t handle, uint32_t portid)
2713 {
2714 	mbreg_t mbs;
2715 
2716 	MBSINIT(&mbs, MBOX_FABRIC_LOGIN, MBLOGNONE, 500000);
2717 	if (ISP_CAP_2KLOGIN(isp)) {
2718 		mbs.param[1] = handle;
2719 		mbs.ibits = (1 << 10);
2720 	} else {
2721 		mbs.param[1] = handle << 8;
2722 	}
2723 	mbs.param[2] = portid >> 16;
2724 	mbs.param[3] = portid;
2725 	mbs.logval = MBLOGNONE;
2726 	mbs.timeout = 500000;
2727 	isp_mboxcmd(isp, &mbs);
2728 
2729 	switch (mbs.param[0]) {
2730 	case MBOX_PORT_ID_USED:
2731 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: portid 0x%06x already logged in as 0x%x", portid, mbs.param[1]);
2732 		return (MBOX_PORT_ID_USED | (mbs.param[1] << 16));
2733 
2734 	case MBOX_LOOP_ID_USED:
2735 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: handle 0x%x in use for port id 0x%02xXXXX", handle, mbs.param[1] & 0xff);
2736 		return (MBOX_LOOP_ID_USED);
2737 
2738 	case MBOX_COMMAND_COMPLETE:
2739 		return (0);
2740 
2741 	case MBOX_COMMAND_ERROR:
2742 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: error 0x%x in PLOGI to port 0x%06x", mbs.param[1], portid);
2743 		return (MBOX_COMMAND_ERROR);
2744 
2745 	case MBOX_ALL_IDS_USED:
2746 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: all IDs used for fabric login");
2747 		return (MBOX_ALL_IDS_USED);
2748 
2749 	default:
2750 		isp_prt(isp, ISP_LOG_SANCFG, "isp_port_login: error 0x%x on port login of 0x%06x@0x%0x", mbs.param[0], portid, handle);
2751 		return (mbs.param[0]);
2752 	}
2753 }
2754 
2755 /*
2756  * Pre-24XX fabric port logout
2757  *
2758  * Note that portid is not used
2759  */
2760 static int
2761 isp_port_logout(ispsoftc_t *isp, uint16_t handle, uint32_t portid)
2762 {
2763 	mbreg_t mbs;
2764 
2765 	MBSINIT(&mbs, MBOX_FABRIC_LOGOUT, MBLOGNONE, 500000);
2766 	if (ISP_CAP_2KLOGIN(isp)) {
2767 		mbs.param[1] = handle;
2768 		mbs.ibits = (1 << 10);
2769 	} else {
2770 		mbs.param[1] = handle << 8;
2771 	}
2772 	isp_mboxcmd(isp, &mbs);
2773 	return (mbs.param[0] == MBOX_COMMAND_COMPLETE? 0 : mbs.param[0]);
2774 }
2775 
2776 static int
2777 isp_getpdb(ispsoftc_t *isp, int chan, uint16_t id, isp_pdb_t *pdb)
2778 {
2779 	fcparam *fcp = FCPARAM(isp, chan);
2780 	mbreg_t mbs;
2781 	union {
2782 		isp_pdb_21xx_t fred;
2783 		isp_pdb_24xx_t bill;
2784 	} un;
2785 
2786 	MBSINIT(&mbs, MBOX_GET_PORT_DB,
2787 	    MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 250000);
2788 	if (IS_24XX(isp)) {
2789 		mbs.ibits = (1 << 9)|(1 << 10);
2790 		mbs.param[1] = id;
2791 		mbs.param[9] = chan;
2792 	} else if (ISP_CAP_2KLOGIN(isp)) {
2793 		mbs.param[1] = id;
2794 	} else {
2795 		mbs.param[1] = id << 8;
2796 	}
2797 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2798 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2799 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2800 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2801 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
2802 		isp_prt(isp, ISP_LOGERR, sacq);
2803 		return (-1);
2804 	}
2805 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (un), chan);
2806 	isp_mboxcmd(isp, &mbs);
2807 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2808 		FC_SCRATCH_RELEASE(isp, chan);
2809 		return (mbs.param[0] | (mbs.param[1] << 16));
2810 	}
2811 	if (IS_24XX(isp)) {
2812 		isp_get_pdb_24xx(isp, fcp->isp_scratch, &un.bill);
2813 		pdb->handle = un.bill.pdb_handle;
2814 		pdb->prli_word3 = un.bill.pdb_prli_svc3;
2815 		pdb->portid = BITS2WORD_24XX(un.bill.pdb_portid_bits);
2816 		ISP_MEMCPY(pdb->portname, un.bill.pdb_portname, 8);
2817 		ISP_MEMCPY(pdb->nodename, un.bill.pdb_nodename, 8);
2818 		isp_prt(isp, ISP_LOGDEBUG1,
2819 		    "Chan %d handle 0x%x Port 0x%06x flags 0x%x curstate %x",
2820 		    chan, id, pdb->portid, un.bill.pdb_flags,
2821 		    un.bill.pdb_curstate);
2822 		if (un.bill.pdb_curstate < PDB2400_STATE_PLOGI_DONE || un.bill.pdb_curstate > PDB2400_STATE_LOGGED_IN) {
2823 			mbs.param[0] = MBOX_NOT_LOGGED_IN;
2824 			FC_SCRATCH_RELEASE(isp, chan);
2825 			return (mbs.param[0]);
2826 		}
2827 	} else {
2828 		isp_get_pdb_21xx(isp, fcp->isp_scratch, &un.fred);
2829 		pdb->handle = un.fred.pdb_loopid;
2830 		pdb->prli_word3 = un.fred.pdb_prli_svc3;
2831 		pdb->portid = BITS2WORD(un.fred.pdb_portid_bits);
2832 		ISP_MEMCPY(pdb->portname, un.fred.pdb_portname, 8);
2833 		ISP_MEMCPY(pdb->nodename, un.fred.pdb_nodename, 8);
2834 		isp_prt(isp, ISP_LOGDEBUG1,
2835 		    "Chan %d handle 0x%x Port 0x%06x", chan, id, pdb->portid);
2836 	}
2837 	FC_SCRATCH_RELEASE(isp, chan);
2838 	return (0);
2839 }
2840 
2841 static int
2842 isp_gethandles(ispsoftc_t *isp, int chan, uint16_t *handles, int *num, int loop)
2843 {
2844 	fcparam *fcp = FCPARAM(isp, chan);
2845 	mbreg_t mbs;
2846 	isp_pnhle_21xx_t el1, *elp1;
2847 	isp_pnhle_23xx_t el3, *elp3;
2848 	isp_pnhle_24xx_t el4, *elp4;
2849 	int i, j;
2850 	uint32_t p;
2851 	uint16_t h;
2852 
2853 	MBSINIT(&mbs, MBOX_GET_ID_LIST, MBLOGALL, 250000);
2854 	if (IS_24XX(isp)) {
2855 		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2856 		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2857 		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2858 		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2859 		mbs.param[8] = ISP_FC_SCRLEN;
2860 		mbs.param[9] = chan;
2861 	} else {
2862 		mbs.ibits = (1 << 1)|(1 << 2)|(1 << 3)|(1 << 6);
2863 		mbs.param[1] = DMA_WD1(fcp->isp_scdma);
2864 		mbs.param[2] = DMA_WD0(fcp->isp_scdma);
2865 		mbs.param[3] = DMA_WD3(fcp->isp_scdma);
2866 		mbs.param[6] = DMA_WD2(fcp->isp_scdma);
2867 	}
2868 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
2869 		isp_prt(isp, ISP_LOGERR, sacq);
2870 		return (-1);
2871 	}
2872 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, ISP_FC_SCRLEN, chan);
2873 	isp_mboxcmd(isp, &mbs);
2874 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2875 		FC_SCRATCH_RELEASE(isp, chan);
2876 		return (mbs.param[0] | (mbs.param[1] << 16));
2877 	}
2878 	elp1 = fcp->isp_scratch;
2879 	elp3 = fcp->isp_scratch;
2880 	elp4 = fcp->isp_scratch;
2881 	for (i = 0, j = 0; i < mbs.param[1] && j < *num; i++) {
2882 		if (IS_24XX(isp)) {
2883 			isp_get_pnhle_24xx(isp, &elp4[i], &el4);
2884 			p = el4.pnhle_port_id_lo |
2885 			    (el4.pnhle_port_id_hi << 16);
2886 			h = el4.pnhle_handle;
2887 		} else if (IS_23XX(isp)) {
2888 			isp_get_pnhle_23xx(isp, &elp3[i], &el3);
2889 			p = el3.pnhle_port_id_lo |
2890 			    (el3.pnhle_port_id_hi << 16);
2891 			h = el3.pnhle_handle;
2892 		} else { /* 21xx */
2893 			isp_get_pnhle_21xx(isp, &elp1[i], &el1);
2894 			p = el1.pnhle_port_id_lo |
2895 			    ((el1.pnhle_port_id_hi_handle & 0xff) << 16);
2896 			h = el1.pnhle_port_id_hi_handle >> 8;
2897 		}
2898 		if (loop && (p >> 8) != (fcp->isp_portid >> 8))
2899 			continue;
2900 		handles[j++] = h;
2901 	}
2902 	*num = j;
2903 	FC_SCRATCH_RELEASE(isp, chan);
2904 	return (0);
2905 }
2906 
2907 static void
2908 isp_dump_chip_portdb(ispsoftc_t *isp, int chan)
2909 {
2910 	isp_pdb_t pdb;
2911 	uint16_t lim, nphdl;
2912 
2913 	isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d chip port dump", chan);
2914 	if (ISP_CAP_2KLOGIN(isp)) {
2915 		lim = NPH_MAX_2K;
2916 	} else {
2917 		lim = NPH_MAX;
2918 	}
2919 	for (nphdl = 0; nphdl != lim; nphdl++) {
2920 		if (isp_getpdb(isp, chan, nphdl, &pdb)) {
2921 			continue;
2922 		}
2923 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d Handle 0x%04x "
2924 		    "PortID 0x%06x WWPN 0x%02x%02x%02x%02x%02x%02x%02x%02x",
2925 		    chan, nphdl, pdb.portid, pdb.portname[0], pdb.portname[1],
2926 		    pdb.portname[2], pdb.portname[3], pdb.portname[4],
2927 		    pdb.portname[5], pdb.portname[6], pdb.portname[7]);
2928 	}
2929 }
2930 
2931 static uint64_t
2932 isp_get_wwn(ispsoftc_t *isp, int chan, int nphdl, int nodename)
2933 {
2934 	uint64_t wwn = INI_NONE;
2935 	mbreg_t mbs;
2936 
2937 	MBSINIT(&mbs, MBOX_GET_PORT_NAME,
2938 	    MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 500000);
2939 	if (ISP_CAP_2KLOGIN(isp)) {
2940 		mbs.param[1] = nphdl;
2941 		if (nodename) {
2942 			mbs.param[10] = 1;
2943 		}
2944 		mbs.param[9] = chan;
2945 	} else {
2946 		mbs.ibitm = 3;
2947 		mbs.param[1] = nphdl << 8;
2948 		if (nodename) {
2949 			mbs.param[1] |= 1;
2950 		}
2951 	}
2952 	isp_mboxcmd(isp, &mbs);
2953 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2954 		return (wwn);
2955 	}
2956 	if (IS_24XX(isp)) {
2957 		wwn =
2958 		    (((uint64_t)(mbs.param[2] >> 8))	<< 56) |
2959 		    (((uint64_t)(mbs.param[2] & 0xff))	<< 48) |
2960 		    (((uint64_t)(mbs.param[3] >> 8))	<< 40) |
2961 		    (((uint64_t)(mbs.param[3] & 0xff))	<< 32) |
2962 		    (((uint64_t)(mbs.param[6] >> 8))	<< 24) |
2963 		    (((uint64_t)(mbs.param[6] & 0xff))	<< 16) |
2964 		    (((uint64_t)(mbs.param[7] >> 8))	<<  8) |
2965 		    (((uint64_t)(mbs.param[7] & 0xff)));
2966 	} else {
2967 		wwn =
2968 		    (((uint64_t)(mbs.param[2] & 0xff))  << 56) |
2969 		    (((uint64_t)(mbs.param[2] >> 8))	<< 48) |
2970 		    (((uint64_t)(mbs.param[3] & 0xff))	<< 40) |
2971 		    (((uint64_t)(mbs.param[3] >> 8))	<< 32) |
2972 		    (((uint64_t)(mbs.param[6] & 0xff))	<< 24) |
2973 		    (((uint64_t)(mbs.param[6] >> 8))	<< 16) |
2974 		    (((uint64_t)(mbs.param[7] & 0xff))	<<  8) |
2975 		    (((uint64_t)(mbs.param[7] >> 8)));
2976 	}
2977 	return (wwn);
2978 }
2979 
2980 /*
2981  * Make sure we have good FC link.
2982  */
2983 
2984 static int
2985 isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
2986 {
2987 	mbreg_t mbs;
2988 	int i, r;
2989 	uint16_t nphdl;
2990 	fcparam *fcp;
2991 	isp_pdb_t pdb;
2992 	NANOTIME_T hra, hrb;
2993 
2994 	fcp = FCPARAM(isp, chan);
2995 
2996 	if (fcp->isp_loopstate < LOOP_HAVE_LINK)
2997 		return (-1);
2998 	if (fcp->isp_loopstate >= LOOP_LTEST_DONE)
2999 		return (0);
3000 
3001 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC link test", chan);
3002 	fcp->isp_loopstate = LOOP_TESTING_LINK;
3003 
3004 	/*
3005 	 * Wait up to N microseconds for F/W to go to a ready state.
3006 	 */
3007 	GET_NANOTIME(&hra);
3008 	while (1) {
3009 		isp_change_fw_state(isp, chan, isp_fw_state(isp, chan));
3010 		if (fcp->isp_fwstate == FW_READY) {
3011 			break;
3012 		}
3013 		if (fcp->isp_loopstate < LOOP_TESTING_LINK)
3014 			goto abort;
3015 		GET_NANOTIME(&hrb);
3016 		if ((NANOTIME_SUB(&hrb, &hra) / 1000 + 1000 >= usdelay))
3017 			break;
3018 		ISP_SLEEP(isp, 1000);
3019 	}
3020 	if (fcp->isp_fwstate != FW_READY) {
3021 		isp_prt(isp, ISP_LOG_SANCFG,
3022 		    "Chan %d Firmware is not ready (%s)",
3023 		    chan, isp_fc_fw_statename(fcp->isp_fwstate));
3024 		return (-1);
3025 	}
3026 
3027 	/*
3028 	 * Get our Loop ID and Port ID.
3029 	 */
3030 	MBSINIT(&mbs, MBOX_GET_LOOP_ID, MBLOGALL, 0);
3031 	mbs.param[9] = chan;
3032 	isp_mboxcmd(isp, &mbs);
3033 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3034 		return (-1);
3035 	}
3036 
3037 	if (IS_2100(isp)) {
3038 		/*
3039 		 * Don't bother with fabric if we are using really old
3040 		 * 2100 firmware. It's just not worth it.
3041 		 */
3042 		if (ISP_FW_NEWER_THAN(isp, 1, 15, 37))
3043 			fcp->isp_topo = TOPO_FL_PORT;
3044 		else
3045 			fcp->isp_topo = TOPO_NL_PORT;
3046 	} else {
3047 		int topo = (int) mbs.param[6];
3048 		if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) {
3049 			topo = TOPO_PTP_STUB;
3050 		}
3051 		fcp->isp_topo = topo;
3052 	}
3053 	fcp->isp_portid = mbs.param[2] | (mbs.param[3] << 16);
3054 
3055 	if (!TOPO_IS_FABRIC(fcp->isp_topo)) {
3056 		fcp->isp_loopid = mbs.param[1] & 0xff;
3057 	} else if (fcp->isp_topo != TOPO_F_PORT) {
3058 		uint8_t alpa = fcp->isp_portid;
3059 
3060 		for (i = 0; alpa_map[i]; i++) {
3061 			if (alpa_map[i] == alpa)
3062 				break;
3063 		}
3064 		if (alpa_map[i])
3065 			fcp->isp_loopid = i;
3066 	}
3067 
3068 	if (fcp->isp_topo == TOPO_F_PORT || fcp->isp_topo == TOPO_FL_PORT) {
3069 		nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
3070 		r = isp_getpdb(isp, chan, nphdl, &pdb);
3071 		if (r != 0 || pdb.portid == 0) {
3072 			if (IS_2100(isp)) {
3073 				fcp->isp_topo = TOPO_NL_PORT;
3074 			} else {
3075 				isp_prt(isp, ISP_LOGWARN,
3076 				    "fabric topology, but cannot get info about fabric controller (0x%x)", r);
3077 				fcp->isp_topo = TOPO_PTP_STUB;
3078 			}
3079 			goto not_on_fabric;
3080 		}
3081 
3082 		if (IS_24XX(isp)) {
3083 			fcp->isp_fabric_params = mbs.param[7];
3084 			fcp->isp_sns_hdl = NPH_SNS_ID;
3085 			r = isp_register_fc4_type_24xx(isp, chan);
3086 			if (r == 0)
3087 				isp_register_fc4_features_24xx(isp, chan);
3088 			isp_register_port_name_24xx(isp, chan);
3089 			isp_register_node_name_24xx(isp, chan);
3090 		} else {
3091 			fcp->isp_sns_hdl = SNS_ID;
3092 			r = isp_register_fc4_type(isp, chan);
3093 			if (r == 0 && fcp->role == ISP_ROLE_TARGET)
3094 				isp_send_change_request(isp, chan);
3095 		}
3096 		if (r) {
3097 			isp_prt(isp, ISP_LOGWARN|ISP_LOG_SANCFG, "%s: register fc4 type failed", __func__);
3098 			return (-1);
3099 		}
3100 	}
3101 
3102 not_on_fabric:
3103 	/* Get link speed. */
3104 	fcp->isp_gbspeed = 1;
3105 	if (IS_23XX(isp) || IS_24XX(isp)) {
3106 		MBSINIT(&mbs, MBOX_GET_SET_DATA_RATE, MBLOGALL, 3000000);
3107 		mbs.param[1] = MBGSD_GET_RATE;
3108 		/* mbs.param[2] undefined if we're just getting rate */
3109 		isp_mboxcmd(isp, &mbs);
3110 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3111 			if (mbs.param[1] == MBGSD_10GB)
3112 				fcp->isp_gbspeed = 10;
3113 			else if (mbs.param[1] == MBGSD_16GB)
3114 				fcp->isp_gbspeed = 16;
3115 			else if (mbs.param[1] == MBGSD_8GB)
3116 				fcp->isp_gbspeed = 8;
3117 			else if (mbs.param[1] == MBGSD_4GB)
3118 				fcp->isp_gbspeed = 4;
3119 			else if (mbs.param[1] == MBGSD_2GB)
3120 				fcp->isp_gbspeed = 2;
3121 			else if (mbs.param[1] == MBGSD_1GB)
3122 				fcp->isp_gbspeed = 1;
3123 		}
3124 	}
3125 
3126 	if (fcp->isp_loopstate < LOOP_TESTING_LINK) {
3127 abort:
3128 		isp_prt(isp, ISP_LOG_SANCFG,
3129 		    "Chan %d FC link test aborted", chan);
3130 		return (1);
3131 	}
3132 	fcp->isp_loopstate = LOOP_LTEST_DONE;
3133 	isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGCONFIG,
3134 	    "Chan %d WWPN %016jx WWNN %016jx",
3135 	    chan, (uintmax_t)fcp->isp_wwpn, (uintmax_t)fcp->isp_wwnn);
3136 	isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGCONFIG,
3137 	    "Chan %d %dGb %s PortID 0x%06x LoopID 0x%02x",
3138 	    chan, fcp->isp_gbspeed, isp_fc_toponame(fcp), fcp->isp_portid,
3139 	    fcp->isp_loopid);
3140 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC link test done", chan);
3141 	return (0);
3142 }
3143 
3144 /*
3145  * Complete the synchronization of our Port Database.
3146  *
3147  * At this point, we've scanned the local loop (if any) and the fabric
3148  * and performed fabric logins on all new devices.
3149  *
3150  * Our task here is to go through our port database removing any entities
3151  * that are still marked probational (issuing PLOGO for ones which we had
3152  * PLOGI'd into) or are dead, and notifying upper layers about new/changed
3153  * devices.
3154  */
3155 static int
3156 isp_pdb_sync(ispsoftc_t *isp, int chan)
3157 {
3158 	fcparam *fcp = FCPARAM(isp, chan);
3159 	fcportdb_t *lp;
3160 	uint16_t dbidx;
3161 
3162 	if (fcp->isp_loopstate < LOOP_FSCAN_DONE)
3163 		return (-1);
3164 	if (fcp->isp_loopstate >= LOOP_READY)
3165 		return (0);
3166 
3167 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC PDB sync", chan);
3168 
3169 	fcp->isp_loopstate = LOOP_SYNCING_PDB;
3170 
3171 	for (dbidx = 0; dbidx < MAX_FC_TARG; dbidx++) {
3172 		lp = &fcp->portdb[dbidx];
3173 
3174 		if (lp->state == FC_PORTDB_STATE_NIL)
3175 			continue;
3176 		if (lp->probational && lp->state != FC_PORTDB_STATE_ZOMBIE)
3177 			lp->state = FC_PORTDB_STATE_DEAD;
3178 		switch (lp->state) {
3179 		case FC_PORTDB_STATE_DEAD:
3180 			lp->state = FC_PORTDB_STATE_NIL;
3181 			isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
3182 			if (lp->autologin == 0) {
3183 				(void) isp_plogx(isp, chan, lp->handle,
3184 				    lp->portid,
3185 				    PLOGX_FLG_CMD_LOGO |
3186 				    PLOGX_FLG_IMPLICIT |
3187 				    PLOGX_FLG_FREE_NPHDL);
3188 			}
3189 			/*
3190 			 * Note that we might come out of this with our state
3191 			 * set to FC_PORTDB_STATE_ZOMBIE.
3192 			 */
3193 			break;
3194 		case FC_PORTDB_STATE_NEW:
3195 			lp->state = FC_PORTDB_STATE_VALID;
3196 			isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
3197 			break;
3198 		case FC_PORTDB_STATE_CHANGED:
3199 			lp->state = FC_PORTDB_STATE_VALID;
3200 			isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
3201 			lp->portid = lp->new_portid;
3202 			lp->prli_word3 = lp->new_prli_word3;
3203 			break;
3204 		case FC_PORTDB_STATE_VALID:
3205 			isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
3206 			break;
3207 		case FC_PORTDB_STATE_ZOMBIE:
3208 			break;
3209 		default:
3210 			isp_prt(isp, ISP_LOGWARN,
3211 			    "isp_pdb_sync: state %d for idx %d",
3212 			    lp->state, dbidx);
3213 			isp_dump_portdb(isp, chan);
3214 		}
3215 	}
3216 
3217 	if (fcp->isp_loopstate < LOOP_SYNCING_PDB) {
3218 		isp_prt(isp, ISP_LOG_SANCFG,
3219 		    "Chan %d FC PDB sync aborted", chan);
3220 		return (1);
3221 	}
3222 
3223 	fcp->isp_loopstate = LOOP_READY;
3224 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC PDB sync done", chan);
3225 	return (0);
3226 }
3227 
3228 static void
3229 isp_pdb_add_update(ispsoftc_t *isp, int chan, isp_pdb_t *pdb)
3230 {
3231 	fcportdb_t *lp;
3232 	uint64_t wwnn, wwpn;
3233 
3234 	MAKE_WWN_FROM_NODE_NAME(wwnn, pdb->nodename);
3235 	MAKE_WWN_FROM_NODE_NAME(wwpn, pdb->portname);
3236 
3237 	/* Search port database for the same WWPN. */
3238 	if (isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) {
3239 		if (!lp->probational) {
3240 			isp_prt(isp, ISP_LOGERR,
3241 			    "Chan %d Port 0x%06x@0x%04x [%d] is not probational (0x%x)",
3242 			    chan, lp->portid, lp->handle,
3243 			    FC_PORTDB_TGT(isp, chan, lp), lp->state);
3244 			isp_dump_portdb(isp, chan);
3245 			return;
3246 		}
3247 		lp->probational = 0;
3248 		lp->node_wwn = wwnn;
3249 
3250 		/* Old device, nothing new. */
3251 		if (lp->portid == pdb->portid &&
3252 		    lp->handle == pdb->handle &&
3253 		    lp->prli_word3 == pdb->prli_word3) {
3254 			if (lp->state != FC_PORTDB_STATE_NEW)
3255 				lp->state = FC_PORTDB_STATE_VALID;
3256 			isp_prt(isp, ISP_LOG_SANCFG,
3257 			    "Chan %d Port 0x%06x@0x%04x is valid",
3258 			    chan, pdb->portid, pdb->handle);
3259 			return;
3260 		}
3261 
3262 		/* Something has changed. */
3263 		lp->state = FC_PORTDB_STATE_CHANGED;
3264 		lp->handle = pdb->handle;
3265 		lp->new_portid = pdb->portid;
3266 		lp->new_prli_word3 = pdb->prli_word3;
3267 		isp_prt(isp, ISP_LOG_SANCFG,
3268 		    "Chan %d Port 0x%06x@0x%04x is changed",
3269 		    chan, pdb->portid, pdb->handle);
3270 		return;
3271 	}
3272 
3273 	/* It seems like a new port. Find an empty slot for it. */
3274 	if (!isp_find_pdb_empty(isp, chan, &lp)) {
3275 		isp_prt(isp, ISP_LOGERR, "Chan %d out of portdb entries", chan);
3276 		return;
3277 	}
3278 
3279 	ISP_MEMZERO(lp, sizeof (fcportdb_t));
3280 	lp->autologin = 1;
3281 	lp->probational = 0;
3282 	lp->state = FC_PORTDB_STATE_NEW;
3283 	lp->portid = lp->new_portid = pdb->portid;
3284 	lp->prli_word3 = lp->new_prli_word3 = pdb->prli_word3;
3285 	lp->handle = pdb->handle;
3286 	lp->port_wwn = wwpn;
3287 	lp->node_wwn = wwnn;
3288 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Port 0x%06x@0x%04x is new",
3289 	    chan, pdb->portid, pdb->handle);
3290 }
3291 
3292 /*
3293  * Fix port IDs for logged-in initiators on pre-2400 chips.
3294  * For those chips we are not receiving login events, adding initiators
3295  * based on ATIO requests, but there is no port ID in that structure.
3296  */
3297 static void
3298 isp_fix_portids(ispsoftc_t *isp, int chan)
3299 {
3300 	fcparam *fcp = FCPARAM(isp, chan);
3301 	isp_pdb_t pdb;
3302 	uint64_t wwpn;
3303 	int i, r;
3304 
3305 	for (i = 0; i < MAX_FC_TARG; i++) {
3306 		fcportdb_t *lp = &fcp->portdb[i];
3307 
3308 		if (lp->state == FC_PORTDB_STATE_NIL ||
3309 		    lp->state == FC_PORTDB_STATE_ZOMBIE)
3310 			continue;
3311 		if (VALID_PORT(lp->portid))
3312 			continue;
3313 
3314 		r = isp_getpdb(isp, chan, lp->handle, &pdb);
3315 		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3316 			return;
3317 		if (r != 0) {
3318 			isp_prt(isp, ISP_LOGDEBUG1,
3319 			    "Chan %d FC Scan Loop handle %d returned %x",
3320 			    chan, lp->handle, r);
3321 			continue;
3322 		}
3323 
3324 		MAKE_WWN_FROM_NODE_NAME(wwpn, pdb.portname);
3325 		if (lp->port_wwn != wwpn)
3326 			continue;
3327 		lp->portid = lp->new_portid = pdb.portid;
3328 		isp_prt(isp, ISP_LOG_SANCFG,
3329 		    "Chan %d Port 0x%06x@0x%04x is fixed",
3330 		    chan, pdb.portid, pdb.handle);
3331 	}
3332 }
3333 
3334 /*
3335  * Scan local loop for devices.
3336  */
3337 static int
3338 isp_scan_loop(ispsoftc_t *isp, int chan)
3339 {
3340 	fcparam *fcp = FCPARAM(isp, chan);
3341 	int idx, lim, r;
3342 	isp_pdb_t pdb;
3343 	uint16_t *handles;
3344 	uint16_t handle;
3345 
3346 	if (fcp->isp_loopstate < LOOP_LTEST_DONE)
3347 		return (-1);
3348 	if (fcp->isp_loopstate >= LOOP_LSCAN_DONE)
3349 		return (0);
3350 
3351 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC loop scan", chan);
3352 	fcp->isp_loopstate = LOOP_SCANNING_LOOP;
3353 	if (TOPO_IS_FABRIC(fcp->isp_topo)) {
3354 		if (!IS_24XX(isp)) {
3355 			isp_fix_portids(isp, chan);
3356 			if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3357 				goto abort;
3358 		}
3359 		isp_prt(isp, ISP_LOG_SANCFG,
3360 		    "Chan %d FC loop scan done (no loop)", chan);
3361 		fcp->isp_loopstate = LOOP_LSCAN_DONE;
3362 		return (0);
3363 	}
3364 
3365 	handles = (uint16_t *)fcp->isp_scanscratch;
3366 	lim = ISP_FC_SCRLEN / 2;
3367 	r = isp_gethandles(isp, chan, handles, &lim, 1);
3368 	if (r != 0) {
3369 		isp_prt(isp, ISP_LOG_SANCFG,
3370 		    "Chan %d Getting list of handles failed with %x", chan, r);
3371 		isp_prt(isp, ISP_LOG_SANCFG,
3372 		    "Chan %d FC loop scan done (bad)", chan);
3373 		return (-1);
3374 	}
3375 
3376 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Got %d handles",
3377 	    chan, lim);
3378 
3379 	/*
3380 	 * Run through the list and get the port database info for each one.
3381 	 */
3382 	isp_mark_portdb(isp, chan);
3383 	for (idx = 0; idx < lim; idx++) {
3384 		handle = handles[idx];
3385 
3386 		/*
3387 		 * Don't scan "special" ids.
3388 		 */
3389 		if (ISP_CAP_2KLOGIN(isp)) {
3390 			if (handle >= NPH_RESERVED)
3391 				continue;
3392 		} else {
3393 			if (handle >= FL_ID && handle <= SNS_ID)
3394 				continue;
3395 		}
3396 
3397 		/*
3398 		 * In older cards with older f/w GET_PORT_DATABASE has been
3399 		 * known to hang. This trick gets around that problem.
3400 		 */
3401 		if (IS_2100(isp) || IS_2200(isp)) {
3402 			uint64_t node_wwn = isp_get_wwn(isp, chan, handle, 1);
3403 			if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
3404 abort:
3405 				isp_prt(isp, ISP_LOG_SANCFG,
3406 				    "Chan %d FC loop scan aborted", chan);
3407 				return (1);
3408 			}
3409 			if (node_wwn == INI_NONE) {
3410 				continue;
3411 			}
3412 		}
3413 
3414 		/*
3415 		 * Get the port database entity for this index.
3416 		 */
3417 		r = isp_getpdb(isp, chan, handle, &pdb);
3418 		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3419 			goto abort;
3420 		if (r != 0) {
3421 			isp_prt(isp, ISP_LOGDEBUG1,
3422 			    "Chan %d FC Scan Loop handle %d returned %x",
3423 			    chan, handle, r);
3424 			continue;
3425 		}
3426 
3427 		isp_pdb_add_update(isp, chan, &pdb);
3428 	}
3429 	if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3430 		goto abort;
3431 	fcp->isp_loopstate = LOOP_LSCAN_DONE;
3432 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC loop scan done", chan);
3433 	return (0);
3434 }
3435 
3436 /*
3437  * Scan the fabric for devices and add them to our port database.
3438  *
3439  * Use the GID_FT command to get all Port IDs for FC4 SCSI devices it knows.
3440  *
3441  * For 2100-23XX cards, we can use the SNS mailbox command to pass simple
3442  * name server commands to the switch management server via the QLogic f/w.
3443  *
3444  * For the 24XX card, we have to use CT-Pass through run via the Execute IOCB
3445  * mailbox command.
3446  */
3447 #define	GIDLEN	(ISP_FC_SCRLEN - (3 * QENTRY_LEN))
3448 #define	NGENT	((GIDLEN - 16) >> 2)
3449 
3450 #define	XTXOFF	(ISP_FC_SCRLEN - (3 * QENTRY_LEN))	/* CT request */
3451 #define	CTXOFF	(ISP_FC_SCRLEN - (2 * QENTRY_LEN))	/* Request IOCB */
3452 #define	ZTXOFF	(ISP_FC_SCRLEN - (1 * QENTRY_LEN))	/* Response IOCB */
3453 
3454 static int
3455 isp_gid_ft_sns(ispsoftc_t *isp, int chan)
3456 {
3457 	union {
3458 		sns_gid_ft_req_t _x;
3459 		uint8_t _y[SNS_GID_FT_REQ_SIZE];
3460 	} un;
3461 	fcparam *fcp = FCPARAM(isp, chan);
3462 	sns_gid_ft_req_t *rq = &un._x;
3463 	uint8_t *scp = fcp->isp_scratch;
3464 	mbreg_t mbs;
3465 
3466 	isp_prt(isp, ISP_LOGDEBUG0, "Chan %d requesting GID_FT via SNS", chan);
3467 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3468 		isp_prt(isp, ISP_LOGERR, sacq);
3469 		return (-1);
3470 	}
3471 
3472 	ISP_MEMZERO(rq, SNS_GID_FT_REQ_SIZE);
3473 	rq->snscb_rblen = GIDLEN >> 1;
3474 	rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma);
3475 	rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma);
3476 	rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma);
3477 	rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma);
3478 	rq->snscb_sblen = 6;
3479 	rq->snscb_cmd = SNS_GID_FT;
3480 	rq->snscb_mword_div_2 = NGENT;
3481 	rq->snscb_fc4_type = FC4_SCSI;
3482 
3483 	isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *)&scp[CTXOFF]);
3484 	MEMORYBARRIER(isp, SYNC_SFORDEV, CTXOFF, SNS_GID_FT_REQ_SIZE, chan);
3485 
3486 	MBSINIT(&mbs, MBOX_SEND_SNS, MBLOGALL, 10000000);
3487 	mbs.param[0] = MBOX_SEND_SNS;
3488 	mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1;
3489 	mbs.param[2] = DMA_WD1(fcp->isp_scdma + CTXOFF);
3490 	mbs.param[3] = DMA_WD0(fcp->isp_scdma + CTXOFF);
3491 	mbs.param[6] = DMA_WD3(fcp->isp_scdma + CTXOFF);
3492 	mbs.param[7] = DMA_WD2(fcp->isp_scdma + CTXOFF);
3493 	isp_mboxcmd(isp, &mbs);
3494 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3495 		if (mbs.param[0] == MBOX_INVALID_COMMAND) {
3496 			return (1);
3497 		} else {
3498 			return (-1);
3499 		}
3500 	}
3501 	MEMORYBARRIER(isp, SYNC_SFORCPU, 0, GIDLEN, chan);
3502 	if (isp->isp_dblev & ISP_LOGDEBUG1)
3503 		isp_print_bytes(isp, "CT response", GIDLEN, scp);
3504 	isp_get_gid_ft_response(isp, (sns_gid_ft_rsp_t *)scp,
3505 	    (sns_gid_ft_rsp_t *)fcp->isp_scanscratch, NGENT);
3506 	FC_SCRATCH_RELEASE(isp, chan);
3507 	return (0);
3508 }
3509 
3510 static int
3511 isp_ct_passthru(ispsoftc_t *isp, int chan, uint32_t cmd_bcnt, uint32_t rsp_bcnt)
3512 {
3513 	mbreg_t mbs;
3514 	fcparam *fcp = FCPARAM(isp, chan);
3515 	union {
3516 		isp_ct_pt_t plocal;
3517 		uint8_t q[QENTRY_LEN];
3518 	} un;
3519 	isp_ct_pt_t *pt;
3520 	uint8_t *scp = fcp->isp_scratch;
3521 
3522 	/*
3523 	 * Build a Passthrough IOCB in memory.
3524 	 */
3525 	pt = &un.plocal;
3526 	ISP_MEMZERO(un.q, QENTRY_LEN);
3527 	pt->ctp_header.rqs_entry_count = 1;
3528 	pt->ctp_header.rqs_entry_type = RQSTYPE_CT_PASSTHRU;
3529 	pt->ctp_handle = 0xffffffff;
3530 	pt->ctp_nphdl = fcp->isp_sns_hdl;
3531 	pt->ctp_cmd_cnt = 1;
3532 	pt->ctp_vpidx = ISP_GET_VPIDX(isp, chan);
3533 	pt->ctp_time = 10;
3534 	pt->ctp_rsp_cnt = 1;
3535 	pt->ctp_rsp_bcnt = rsp_bcnt;
3536 	pt->ctp_cmd_bcnt = cmd_bcnt;
3537 	pt->ctp_dataseg[0].ds_base = DMA_LO32(fcp->isp_scdma+XTXOFF);
3538 	pt->ctp_dataseg[0].ds_basehi = DMA_HI32(fcp->isp_scdma+XTXOFF);
3539 	pt->ctp_dataseg[0].ds_count = cmd_bcnt;
3540 	pt->ctp_dataseg[1].ds_base = DMA_LO32(fcp->isp_scdma);
3541 	pt->ctp_dataseg[1].ds_basehi = DMA_HI32(fcp->isp_scdma);
3542 	pt->ctp_dataseg[1].ds_count = rsp_bcnt;
3543 	isp_put_ct_pt(isp, pt, (isp_ct_pt_t *)&scp[CTXOFF]);
3544 	if (isp->isp_dblev & ISP_LOGDEBUG1)
3545 		isp_print_bytes(isp, "CT IOCB request", QENTRY_LEN, &scp[CTXOFF]);
3546 
3547 	/*
3548 	 * Execute the Passthrough IOCB.
3549 	 */
3550 	ISP_MEMZERO(&scp[ZTXOFF], QENTRY_LEN);
3551 	MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL,
3552 	    MBCMD_DEFAULT_TIMEOUT + pt->ctp_time * 1000000);
3553 	mbs.param[1] = QENTRY_LEN;
3554 	mbs.param[2] = DMA_WD1(fcp->isp_scdma + CTXOFF);
3555 	mbs.param[3] = DMA_WD0(fcp->isp_scdma + CTXOFF);
3556 	mbs.param[6] = DMA_WD3(fcp->isp_scdma + CTXOFF);
3557 	mbs.param[7] = DMA_WD2(fcp->isp_scdma + CTXOFF);
3558 	MEMORYBARRIER(isp, SYNC_SFORDEV, XTXOFF, 2 * QENTRY_LEN, chan);
3559 	isp_mboxcmd(isp, &mbs);
3560 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3561 		return (-1);
3562 	}
3563 	MEMORYBARRIER(isp, SYNC_SFORCPU, 0, ISP_FC_SCRLEN, chan);
3564 	if (isp->isp_dblev & ISP_LOGDEBUG1)
3565 		isp_print_bytes(isp, "CT IOCB response", QENTRY_LEN, &scp[ZTXOFF]);
3566 	pt = &un.plocal;
3567 	isp_get_ct_pt(isp, (isp_ct_pt_t *) &scp[ZTXOFF], pt);
3568 	if (pt->ctp_status && pt->ctp_status != RQCS_DATA_UNDERRUN) {
3569 		isp_prt(isp, ISP_LOGWARN,
3570 		    "Chan %d GID_FT CT Passthrough returned 0x%x",
3571 		    chan, pt->ctp_status);
3572 		return (-1);
3573 	}
3574 
3575 	return (0);
3576 }
3577 
3578 static int
3579 isp_gid_ft_ct_passthru(ispsoftc_t *isp, int chan)
3580 {
3581 	fcparam *fcp = FCPARAM(isp, chan);
3582 	ct_hdr_t ct;
3583 	uint32_t *rp;
3584 	uint8_t *scp = fcp->isp_scratch;
3585 
3586 	isp_prt(isp, ISP_LOGDEBUG0, "Chan %d requesting GID_FT via CT", chan);
3587 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3588 		isp_prt(isp, ISP_LOGERR, sacq);
3589 		return (-1);
3590 	}
3591 
3592 	/*
3593 	 * Build the CT header and command in memory.
3594 	 */
3595 	ISP_MEMZERO(&ct, sizeof (ct));
3596 	ct.ct_revision = CT_REVISION;
3597 	ct.ct_fcs_type = CT_FC_TYPE_FC;
3598 	ct.ct_fcs_subtype = CT_FC_SUBTYPE_NS;
3599 	ct.ct_cmd_resp = SNS_GID_FT;
3600 	ct.ct_bcnt_resid = (GIDLEN - 16) >> 2;
3601 	isp_put_ct_hdr(isp, &ct, (ct_hdr_t *) &scp[XTXOFF]);
3602 	rp = (uint32_t *) &scp[XTXOFF + sizeof(ct)];
3603 	ISP_IOZPUT_32(isp, FC4_SCSI, rp);
3604 	if (isp->isp_dblev & ISP_LOGDEBUG1) {
3605 		isp_print_bytes(isp, "CT request",
3606 		    sizeof(ct) + sizeof(uint32_t), &scp[XTXOFF]);
3607 	}
3608 
3609 	if (isp_ct_passthru(isp, chan, sizeof(ct) + sizeof(uint32_t), GIDLEN)) {
3610 		FC_SCRATCH_RELEASE(isp, chan);
3611 		return (-1);
3612 	}
3613 
3614 	if (isp->isp_dblev & ISP_LOGDEBUG1)
3615 		isp_print_bytes(isp, "CT response", GIDLEN, scp);
3616 	isp_get_gid_ft_response(isp, (sns_gid_ft_rsp_t *)scp,
3617 	    (sns_gid_ft_rsp_t *)fcp->isp_scanscratch, NGENT);
3618 	FC_SCRATCH_RELEASE(isp, chan);
3619 	return (0);
3620 }
3621 
3622 static int
3623 isp_scan_fabric(ispsoftc_t *isp, int chan)
3624 {
3625 	fcparam *fcp = FCPARAM(isp, chan);
3626 	fcportdb_t *lp;
3627 	uint32_t portid;
3628 	uint16_t nphdl;
3629 	isp_pdb_t pdb;
3630 	int portidx, portlim, r;
3631 	sns_gid_ft_rsp_t *rs;
3632 
3633 	if (fcp->isp_loopstate < LOOP_LSCAN_DONE)
3634 		return (-1);
3635 	if (fcp->isp_loopstate >= LOOP_FSCAN_DONE)
3636 		return (0);
3637 
3638 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC fabric scan", chan);
3639 	fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
3640 	if (!TOPO_IS_FABRIC(fcp->isp_topo)) {
3641 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
3642 		isp_prt(isp, ISP_LOG_SANCFG,
3643 		    "Chan %d FC fabric scan done (no fabric)", chan);
3644 		return (0);
3645 	}
3646 
3647 	if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) {
3648 abort:
3649 		FC_SCRATCH_RELEASE(isp, chan);
3650 		isp_prt(isp, ISP_LOG_SANCFG,
3651 		    "Chan %d FC fabric scan aborted", chan);
3652 		return (1);
3653 	}
3654 
3655 	/*
3656 	 * Make sure we still are logged into the fabric controller.
3657 	 */
3658 	nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
3659 	r = isp_getpdb(isp, chan, nphdl, &pdb);
3660 	if ((r & 0xffff) == MBOX_NOT_LOGGED_IN) {
3661 		isp_dump_chip_portdb(isp, chan);
3662 	}
3663 	if (r) {
3664 		fcp->isp_loopstate = LOOP_LTEST_DONE;
3665 fail:
3666 		isp_prt(isp, ISP_LOG_SANCFG,
3667 		    "Chan %d FC fabric scan done (bad)", chan);
3668 		return (-1);
3669 	}
3670 
3671 	/* Get list of port IDs from SNS. */
3672 	if (IS_24XX(isp))
3673 		r = isp_gid_ft_ct_passthru(isp, chan);
3674 	else
3675 		r = isp_gid_ft_sns(isp, chan);
3676 	if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3677 		goto abort;
3678 	if (r > 0) {
3679 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
3680 		return (-1);
3681 	} else if (r < 0) {
3682 		fcp->isp_loopstate = LOOP_LTEST_DONE;	/* try again */
3683 		return (-1);
3684 	}
3685 
3686 	rs = (sns_gid_ft_rsp_t *) fcp->isp_scanscratch;
3687 	if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3688 		goto abort;
3689 	if (rs->snscb_cthdr.ct_cmd_resp != LS_ACC) {
3690 		int level;
3691 		if (rs->snscb_cthdr.ct_reason == 9 && rs->snscb_cthdr.ct_explanation == 7) {
3692 			level = ISP_LOG_SANCFG;
3693 		} else {
3694 			level = ISP_LOGWARN;
3695 		}
3696 		isp_prt(isp, level, "Chan %d Fabric Nameserver rejected GID_FT"
3697 		    " (Reason=0x%x Expl=0x%x)", chan,
3698 		    rs->snscb_cthdr.ct_reason,
3699 		    rs->snscb_cthdr.ct_explanation);
3700 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
3701 		return (-1);
3702 	}
3703 
3704 	/* Check our buffer was big enough to get the full list. */
3705 	for (portidx = 0; portidx < NGENT-1; portidx++) {
3706 		if (rs->snscb_ports[portidx].control & 0x80)
3707 			break;
3708 	}
3709 	if ((rs->snscb_ports[portidx].control & 0x80) == 0) {
3710 		isp_prt(isp, ISP_LOGWARN,
3711 		    "fabric too big for scratch area: increase ISP_FC_SCRLEN");
3712 	}
3713 	portlim = portidx + 1;
3714 	isp_prt(isp, ISP_LOG_SANCFG,
3715 	    "Chan %d Got %d ports back from name server", chan, portlim);
3716 
3717 	/* Go through the list and remove duplicate port ids. */
3718 	for (portidx = 0; portidx < portlim; portidx++) {
3719 		int npidx;
3720 
3721 		portid =
3722 		    ((rs->snscb_ports[portidx].portid[0]) << 16) |
3723 		    ((rs->snscb_ports[portidx].portid[1]) << 8) |
3724 		    ((rs->snscb_ports[portidx].portid[2]));
3725 
3726 		for (npidx = portidx + 1; npidx < portlim; npidx++) {
3727 			uint32_t new_portid =
3728 			    ((rs->snscb_ports[npidx].portid[0]) << 16) |
3729 			    ((rs->snscb_ports[npidx].portid[1]) << 8) |
3730 			    ((rs->snscb_ports[npidx].portid[2]));
3731 			if (new_portid == portid) {
3732 				break;
3733 			}
3734 		}
3735 
3736 		if (npidx < portlim) {
3737 			rs->snscb_ports[npidx].portid[0] = 0;
3738 			rs->snscb_ports[npidx].portid[1] = 0;
3739 			rs->snscb_ports[npidx].portid[2] = 0;
3740 			isp_prt(isp, ISP_LOG_SANCFG, "Chan %d removing duplicate PortID 0x%06x entry from list", chan, portid);
3741 		}
3742 	}
3743 
3744 	/*
3745 	 * We now have a list of Port IDs for all FC4 SCSI devices
3746 	 * that the Fabric Name server knows about.
3747 	 *
3748 	 * For each entry on this list go through our port database looking
3749 	 * for probational entries- if we find one, then an old entry is
3750 	 * maybe still this one. We get some information to find out.
3751 	 *
3752 	 * Otherwise, it's a new fabric device, and we log into it
3753 	 * (unconditionally). After searching the entire database
3754 	 * again to make sure that we never ever ever ever have more
3755 	 * than one entry that has the same PortID or the same
3756 	 * WWNN/WWPN duple, we enter the device into our database.
3757 	 */
3758 	isp_mark_portdb(isp, chan);
3759 	for (portidx = 0; portidx < portlim; portidx++) {
3760 		portid = ((rs->snscb_ports[portidx].portid[0]) << 16) |
3761 			 ((rs->snscb_ports[portidx].portid[1]) << 8) |
3762 			 ((rs->snscb_ports[portidx].portid[2]));
3763 		isp_prt(isp, ISP_LOG_SANCFG,
3764 		    "Chan %d Checking fabric port 0x%06x", chan, portid);
3765 		if (portid == 0) {
3766 			isp_prt(isp, ISP_LOG_SANCFG,
3767 			    "Chan %d Port at idx %d is zero",
3768 			    chan, portidx);
3769 			continue;
3770 		}
3771 		if (portid == fcp->isp_portid) {
3772 			isp_prt(isp, ISP_LOG_SANCFG,
3773 			    "Chan %d Port 0x%06x is our", chan, portid);
3774 			continue;
3775 		}
3776 
3777 		/* Now search the entire port database for the same portid. */
3778 		if (isp_find_pdb_by_portid(isp, chan, portid, &lp)) {
3779 			if (!lp->probational) {
3780 				isp_prt(isp, ISP_LOGERR,
3781 				    "Chan %d Port 0x%06x@0x%04x [%d] is not probational (0x%x)",
3782 				    chan, lp->portid, lp->handle,
3783 				    FC_PORTDB_TGT(isp, chan, lp), lp->state);
3784 				isp_dump_portdb(isp, chan);
3785 				goto fail;
3786 			}
3787 
3788 			/*
3789 			 * See if we're still logged into it.
3790 			 *
3791 			 * If we aren't, mark it as a dead device and
3792 			 * leave the new portid in the database entry
3793 			 * for somebody further along to decide what to
3794 			 * do (policy choice).
3795 			 *
3796 			 * If we are, check to see if it's the same
3797 			 * device still (it should be). If for some
3798 			 * reason it isn't, mark it as a changed device
3799 			 * and leave the new portid and role in the
3800 			 * database entry for somebody further along to
3801 			 * decide what to do (policy choice).
3802 			 */
3803 			r = isp_getpdb(isp, chan, lp->handle, &pdb);
3804 			if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3805 				goto abort;
3806 			if (r != 0) {
3807 				lp->state = FC_PORTDB_STATE_DEAD;
3808 				isp_prt(isp, ISP_LOG_SANCFG,
3809 				    "Chan %d Port 0x%06x handle 0x%x is dead (%d)",
3810 				    chan, portid, lp->handle, r);
3811 				goto relogin;
3812 			}
3813 
3814 			isp_pdb_add_update(isp, chan, &pdb);
3815 			continue;
3816 		}
3817 
3818 relogin:
3819 		if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
3820 			isp_prt(isp, ISP_LOG_SANCFG,
3821 			    "Chan %d Port 0x%06x is not logged in", chan, portid);
3822 			continue;
3823 		}
3824 
3825 		if (isp_login_device(isp, chan, portid, &pdb,
3826 		    &FCPARAM(isp, 0)->isp_lasthdl)) {
3827 			if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3828 				goto abort;
3829 			continue;
3830 		}
3831 
3832 		isp_pdb_add_update(isp, chan, &pdb);
3833 	}
3834 
3835 	if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3836 		goto abort;
3837 	fcp->isp_loopstate = LOOP_FSCAN_DONE;
3838 	isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC fabric scan done", chan);
3839 	return (0);
3840 }
3841 
3842 /*
3843  * Find an unused handle and try and use to login to a port.
3844  */
3845 static int
3846 isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, uint16_t *ohp)
3847 {
3848 	int lim, i, r;
3849 	uint16_t handle;
3850 
3851 	if (ISP_CAP_2KLOGIN(isp)) {
3852 		lim = NPH_MAX_2K;
3853 	} else {
3854 		lim = NPH_MAX;
3855 	}
3856 
3857 	handle = isp_next_handle(isp, ohp);
3858 	for (i = 0; i < lim; i++) {
3859 		if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
3860 			return (-1);
3861 
3862 		/* Check if this handle is free. */
3863 		r = isp_getpdb(isp, chan, handle, p);
3864 		if (r == 0) {
3865 			if (p->portid != portid) {
3866 				/* This handle is busy, try next one. */
3867 				handle = isp_next_handle(isp, ohp);
3868 				continue;
3869 			}
3870 			break;
3871 		}
3872 		if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
3873 			return (-1);
3874 
3875 		/*
3876 		 * Now try and log into the device
3877 		 */
3878 		r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI);
3879 		if (r == 0) {
3880 			break;
3881 		} else if ((r & 0xffff) == MBOX_PORT_ID_USED) {
3882 			/*
3883 			 * If we get here, then the firmwware still thinks we're logged into this device, but with a different
3884 			 * handle. We need to break that association. We used to try and just substitute the handle, but then
3885 			 * failed to get any data via isp_getpdb (below).
3886 			 */
3887 			if (isp_plogx(isp, chan, r >> 16, portid, PLOGX_FLG_CMD_LOGO | PLOGX_FLG_IMPLICIT | PLOGX_FLG_FREE_NPHDL)) {
3888 				isp_prt(isp, ISP_LOGERR, "baw... logout of %x failed", r >> 16);
3889 			}
3890 			if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
3891 				return (-1);
3892 			r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI);
3893 			if (r != 0)
3894 				i = lim;
3895 			break;
3896 		} else if ((r & 0xffff) == MBOX_LOOP_ID_USED) {
3897 			/* Try the next handle. */
3898 			handle = isp_next_handle(isp, ohp);
3899 		} else {
3900 			/* Give up. */
3901 			i = lim;
3902 			break;
3903 		}
3904 	}
3905 
3906 	if (i == lim) {
3907 		isp_prt(isp, ISP_LOGWARN, "Chan %d PLOGI 0x%06x failed", chan, portid);
3908 		return (-1);
3909 	}
3910 
3911 	/*
3912 	 * If we successfully logged into it, get the PDB for it
3913 	 * so we can crosscheck that it is still what we think it
3914 	 * is and that we also have the role it plays
3915 	 */
3916 	r = isp_getpdb(isp, chan, handle, p);
3917 	if (r != 0) {
3918 		isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x disappeared", chan, portid, handle);
3919 		return (-1);
3920 	}
3921 
3922 	if (p->handle != handle || p->portid != portid) {
3923 		isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x changed (0x%06x@0x%0x)",
3924 		    chan, portid, handle, p->portid, p->handle);
3925 		return (-1);
3926 	}
3927 	return (0);
3928 }
3929 
3930 static int
3931 isp_send_change_request(ispsoftc_t *isp, int chan)
3932 {
3933 	mbreg_t mbs;
3934 
3935 	MBSINIT(&mbs, MBOX_SEND_CHANGE_REQUEST, MBLOGALL, 500000);
3936 	mbs.param[1] = 0x03;
3937 	mbs.param[9] = chan;
3938 	isp_mboxcmd(isp, &mbs);
3939 	return (mbs.param[0] == MBOX_COMMAND_COMPLETE ? 0 : -1);
3940 }
3941 
3942 static int
3943 isp_register_fc4_type(ispsoftc_t *isp, int chan)
3944 {
3945 	fcparam *fcp = FCPARAM(isp, chan);
3946 	uint8_t local[SNS_RFT_ID_REQ_SIZE];
3947 	sns_screq_t *reqp = (sns_screq_t *) local;
3948 	mbreg_t mbs;
3949 
3950 	ISP_MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE);
3951 	reqp->snscb_rblen = SNS_RFT_ID_RESP_SIZE >> 1;
3952 	reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100);
3953 	reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100);
3954 	reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100);
3955 	reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100);
3956 	reqp->snscb_sblen = 22;
3957 	reqp->snscb_data[0] = SNS_RFT_ID;
3958 	reqp->snscb_data[4] = fcp->isp_portid & 0xffff;
3959 	reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff;
3960 	reqp->snscb_data[6] = (1 << FC4_SCSI);
3961 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3962 		isp_prt(isp, ISP_LOGERR, sacq);
3963 		return (-1);
3964 	}
3965 	isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch);
3966 	MBSINIT(&mbs, MBOX_SEND_SNS, MBLOGALL, 1000000);
3967 	mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1;
3968 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
3969 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
3970 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
3971 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
3972 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_RFT_ID_REQ_SIZE, chan);
3973 	isp_mboxcmd(isp, &mbs);
3974 	FC_SCRATCH_RELEASE(isp, chan);
3975 	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3976 		return (0);
3977 	} else {
3978 		return (-1);
3979 	}
3980 }
3981 
3982 static int
3983 isp_register_fc4_type_24xx(ispsoftc_t *isp, int chan)
3984 {
3985 	fcparam *fcp = FCPARAM(isp, chan);
3986 	ct_hdr_t *ct;
3987 	rft_id_t rp;
3988 	uint8_t *scp = fcp->isp_scratch;
3989 
3990 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3991 		isp_prt(isp, ISP_LOGERR, sacq);
3992 		return (-1);
3993 	}
3994 
3995 	/*
3996 	 * Build the CT header and command in memory.
3997 	 */
3998 	ISP_MEMZERO(&rp, sizeof(rp));
3999 	ct = &rp.rftid_hdr;
4000 	ct->ct_revision = CT_REVISION;
4001 	ct->ct_fcs_type = CT_FC_TYPE_FC;
4002 	ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4003 	ct->ct_cmd_resp = SNS_RFT_ID;
4004 	ct->ct_bcnt_resid = (sizeof (rft_id_t) - sizeof (ct_hdr_t)) >> 2;
4005 	rp.rftid_portid[0] = fcp->isp_portid >> 16;
4006 	rp.rftid_portid[1] = fcp->isp_portid >> 8;
4007 	rp.rftid_portid[2] = fcp->isp_portid;
4008 	rp.rftid_fc4types[FC4_SCSI >> 5] = 1 << (FC4_SCSI & 0x1f);
4009 	isp_put_rft_id(isp, &rp, (rft_id_t *)&scp[XTXOFF]);
4010 	if (isp->isp_dblev & ISP_LOGDEBUG1)
4011 		isp_print_bytes(isp, "CT request", sizeof(rft_id_t), &scp[XTXOFF]);
4012 
4013 	if (isp_ct_passthru(isp, chan, sizeof(rft_id_t), sizeof(ct_hdr_t))) {
4014 		FC_SCRATCH_RELEASE(isp, chan);
4015 		return (-1);
4016 	}
4017 
4018 	isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4019 	FC_SCRATCH_RELEASE(isp, chan);
4020 	if (ct->ct_cmd_resp == LS_RJT) {
4021 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "Chan %d Register FC4 Type rejected", chan);
4022 		return (-1);
4023 	} else if (ct->ct_cmd_resp == LS_ACC) {
4024 		isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Register FC4 Type accepted", chan);
4025 	} else {
4026 		isp_prt(isp, ISP_LOGWARN, "Chan %d Register FC4 Type: 0x%x", chan, ct->ct_cmd_resp);
4027 		return (-1);
4028 	}
4029 	return (0);
4030 }
4031 
4032 static int
4033 isp_register_fc4_features_24xx(ispsoftc_t *isp, int chan)
4034 {
4035 	fcparam *fcp = FCPARAM(isp, chan);
4036 	ct_hdr_t *ct;
4037 	rff_id_t rp;
4038 	uint8_t *scp = fcp->isp_scratch;
4039 
4040 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4041 		isp_prt(isp, ISP_LOGERR, sacq);
4042 		return (-1);
4043 	}
4044 
4045 	/*
4046 	 * Build the CT header and command in memory.
4047 	 */
4048 	ISP_MEMZERO(&rp, sizeof(rp));
4049 	ct = &rp.rffid_hdr;
4050 	ct->ct_revision = CT_REVISION;
4051 	ct->ct_fcs_type = CT_FC_TYPE_FC;
4052 	ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4053 	ct->ct_cmd_resp = SNS_RFF_ID;
4054 	ct->ct_bcnt_resid = (sizeof (rff_id_t) - sizeof (ct_hdr_t)) >> 2;
4055 	rp.rffid_portid[0] = fcp->isp_portid >> 16;
4056 	rp.rffid_portid[1] = fcp->isp_portid >> 8;
4057 	rp.rffid_portid[2] = fcp->isp_portid;
4058 	rp.rffid_fc4features = 0;
4059 	if (fcp->role & ISP_ROLE_TARGET)
4060 		rp.rffid_fc4features |= 1;
4061 	if (fcp->role & ISP_ROLE_INITIATOR)
4062 		rp.rffid_fc4features |= 2;
4063 	rp.rffid_fc4type = FC4_SCSI;
4064 	isp_put_rff_id(isp, &rp, (rff_id_t *)&scp[XTXOFF]);
4065 	if (isp->isp_dblev & ISP_LOGDEBUG1)
4066 		isp_print_bytes(isp, "CT request", sizeof(rft_id_t), &scp[XTXOFF]);
4067 
4068 	if (isp_ct_passthru(isp, chan, sizeof(rft_id_t), sizeof(ct_hdr_t))) {
4069 		FC_SCRATCH_RELEASE(isp, chan);
4070 		return (-1);
4071 	}
4072 
4073 	isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4074 	FC_SCRATCH_RELEASE(isp, chan);
4075 	if (ct->ct_cmd_resp == LS_RJT) {
4076 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4077 		    "Chan %d Register FC4 Features rejected", chan);
4078 		return (-1);
4079 	} else if (ct->ct_cmd_resp == LS_ACC) {
4080 		isp_prt(isp, ISP_LOG_SANCFG,
4081 		    "Chan %d Register FC4 Features accepted", chan);
4082 	} else {
4083 		isp_prt(isp, ISP_LOGWARN,
4084 		    "Chan %d Register FC4 Features: 0x%x", chan, ct->ct_cmd_resp);
4085 		return (-1);
4086 	}
4087 	return (0);
4088 }
4089 
4090 static int
4091 isp_register_port_name_24xx(ispsoftc_t *isp, int chan)
4092 {
4093 	fcparam *fcp = FCPARAM(isp, chan);
4094 	ct_hdr_t *ct;
4095 	rspn_id_t rp;
4096 	uint8_t *scp = fcp->isp_scratch;
4097 	int len;
4098 
4099 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4100 		isp_prt(isp, ISP_LOGERR, sacq);
4101 		return (-1);
4102 	}
4103 
4104 	/*
4105 	 * Build the CT header and command in memory.
4106 	 */
4107 	ISP_MEMZERO(&rp, sizeof(rp));
4108 	ct = &rp.rspnid_hdr;
4109 	ct->ct_revision = CT_REVISION;
4110 	ct->ct_fcs_type = CT_FC_TYPE_FC;
4111 	ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4112 	ct->ct_cmd_resp = SNS_RSPN_ID;
4113 	rp.rspnid_portid[0] = fcp->isp_portid >> 16;
4114 	rp.rspnid_portid[1] = fcp->isp_portid >> 8;
4115 	rp.rspnid_portid[2] = fcp->isp_portid;
4116 	rp.rspnid_length = 0;
4117 	len = offsetof(rspn_id_t, rspnid_name);
4118 	mtx_lock(&prison0.pr_mtx);
4119 	rp.rspnid_length += sprintf(&scp[XTXOFF + len + rp.rspnid_length],
4120 	    "%s", prison0.pr_hostname[0] ? prison0.pr_hostname : "FreeBSD");
4121 	mtx_unlock(&prison0.pr_mtx);
4122 	rp.rspnid_length += sprintf(&scp[XTXOFF + len + rp.rspnid_length],
4123 	    ":%s", device_get_nameunit(isp->isp_dev));
4124 	if (chan != 0) {
4125 		rp.rspnid_length += sprintf(&scp[XTXOFF + len +
4126 		    rp.rspnid_length], "/%d", chan);
4127 	}
4128 	len += rp.rspnid_length;
4129 	ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2;
4130 	isp_put_rspn_id(isp, &rp, (rspn_id_t *)&scp[XTXOFF]);
4131 	if (isp->isp_dblev & ISP_LOGDEBUG1)
4132 		isp_print_bytes(isp, "CT request", len, &scp[XTXOFF]);
4133 
4134 	if (isp_ct_passthru(isp, chan, len, sizeof(ct_hdr_t))) {
4135 		FC_SCRATCH_RELEASE(isp, chan);
4136 		return (-1);
4137 	}
4138 
4139 	isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4140 	FC_SCRATCH_RELEASE(isp, chan);
4141 	if (ct->ct_cmd_resp == LS_RJT) {
4142 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4143 		    "Chan %d Register Symbolic Port Name rejected", chan);
4144 		return (-1);
4145 	} else if (ct->ct_cmd_resp == LS_ACC) {
4146 		isp_prt(isp, ISP_LOG_SANCFG,
4147 		    "Chan %d Register Symbolic Port Name accepted", chan);
4148 	} else {
4149 		isp_prt(isp, ISP_LOGWARN,
4150 		    "Chan %d Register Symbolic Port Name: 0x%x", chan, ct->ct_cmd_resp);
4151 		return (-1);
4152 	}
4153 	return (0);
4154 }
4155 
4156 static int
4157 isp_register_node_name_24xx(ispsoftc_t *isp, int chan)
4158 {
4159 	fcparam *fcp = FCPARAM(isp, chan);
4160 	ct_hdr_t *ct;
4161 	rsnn_nn_t rp;
4162 	uint8_t *scp = fcp->isp_scratch;
4163 	int len;
4164 
4165 	if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4166 		isp_prt(isp, ISP_LOGERR, sacq);
4167 		return (-1);
4168 	}
4169 
4170 	/*
4171 	 * Build the CT header and command in memory.
4172 	 */
4173 	ISP_MEMZERO(&rp, sizeof(rp));
4174 	ct = &rp.rsnnnn_hdr;
4175 	ct->ct_revision = CT_REVISION;
4176 	ct->ct_fcs_type = CT_FC_TYPE_FC;
4177 	ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4178 	ct->ct_cmd_resp = SNS_RSNN_NN;
4179 	MAKE_NODE_NAME_FROM_WWN(rp.rsnnnn_nodename, fcp->isp_wwnn);
4180 	rp.rsnnnn_length = 0;
4181 	len = offsetof(rsnn_nn_t, rsnnnn_name);
4182 	mtx_lock(&prison0.pr_mtx);
4183 	rp.rsnnnn_length += sprintf(&scp[XTXOFF + len + rp.rsnnnn_length],
4184 	    "%s", prison0.pr_hostname[0] ? prison0.pr_hostname : "FreeBSD");
4185 	mtx_unlock(&prison0.pr_mtx);
4186 	len += rp.rsnnnn_length;
4187 	ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2;
4188 	isp_put_rsnn_nn(isp, &rp, (rsnn_nn_t *)&scp[XTXOFF]);
4189 	if (isp->isp_dblev & ISP_LOGDEBUG1)
4190 		isp_print_bytes(isp, "CT request", len, &scp[XTXOFF]);
4191 
4192 	if (isp_ct_passthru(isp, chan, len, sizeof(ct_hdr_t))) {
4193 		FC_SCRATCH_RELEASE(isp, chan);
4194 		return (-1);
4195 	}
4196 
4197 	isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4198 	FC_SCRATCH_RELEASE(isp, chan);
4199 	if (ct->ct_cmd_resp == LS_RJT) {
4200 		isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4201 		    "Chan %d Register Symbolic Node Name rejected", chan);
4202 		return (-1);
4203 	} else if (ct->ct_cmd_resp == LS_ACC) {
4204 		isp_prt(isp, ISP_LOG_SANCFG,
4205 		    "Chan %d Register Symbolic Node Name accepted", chan);
4206 	} else {
4207 		isp_prt(isp, ISP_LOGWARN,
4208 		    "Chan %d Register Symbolic Node Name: 0x%x", chan, ct->ct_cmd_resp);
4209 		return (-1);
4210 	}
4211 	return (0);
4212 }
4213 
4214 static uint16_t
4215 isp_next_handle(ispsoftc_t *isp, uint16_t *ohp)
4216 {
4217 	fcparam *fcp;
4218 	int i, chan, wrap;
4219 	uint16_t handle, minh, maxh;
4220 
4221 	handle = *ohp;
4222 	if (ISP_CAP_2KLOGIN(isp)) {
4223 		minh = 0;
4224 		maxh = NPH_RESERVED - 1;
4225 	} else {
4226 		minh = SNS_ID + 1;
4227 		maxh = NPH_MAX - 1;
4228 	}
4229 	wrap = 0;
4230 
4231 next:
4232 	if (handle == NIL_HANDLE) {
4233 		handle = minh;
4234 	} else {
4235 		handle++;
4236 		if (handle > maxh) {
4237 			if (++wrap >= 2) {
4238 				isp_prt(isp, ISP_LOGERR, "Out of port handles!");
4239 				return (NIL_HANDLE);
4240 			}
4241 			handle = minh;
4242 		}
4243 	}
4244 	for (chan = 0; chan < isp->isp_nchan; chan++) {
4245 		fcp = FCPARAM(isp, chan);
4246 		if (fcp->role == ISP_ROLE_NONE)
4247 			continue;
4248 		for (i = 0; i < MAX_FC_TARG; i++) {
4249 			if (fcp->portdb[i].state != FC_PORTDB_STATE_NIL &&
4250 			    fcp->portdb[i].handle == handle)
4251 				goto next;
4252 		}
4253 	}
4254 	*ohp = handle;
4255 	return (handle);
4256 }
4257 
4258 /*
4259  * Start a command. Locking is assumed done in the caller.
4260  */
4261 
4262 int
4263 isp_start(XS_T *xs)
4264 {
4265 	ispsoftc_t *isp;
4266 	uint32_t cdblen;
4267 	uint8_t local[QENTRY_LEN];
4268 	ispreq_t *reqp;
4269 	void *cdbp, *qep;
4270 	uint16_t *tptr;
4271 	fcportdb_t *lp;
4272 	int target, dmaresult;
4273 
4274 	XS_INITERR(xs);
4275 	isp = XS_ISP(xs);
4276 
4277 	/*
4278 	 * Check command CDB length, etc.. We really are limited to 16 bytes
4279 	 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI,
4280 	 * but probably only if we're running fairly new firmware (we'll
4281 	 * let the old f/w choke on an extended command queue entry).
4282 	 */
4283 
4284 	if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) {
4285 		isp_prt(isp, ISP_LOGERR, "unsupported cdb length (%d, CDB[0]=0x%x)", XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff);
4286 		XS_SETERR(xs, HBA_BOTCH);
4287 		return (CMD_COMPLETE);
4288 	}
4289 
4290 	/*
4291 	 * Translate the target to device handle as appropriate, checking
4292 	 * for correct device state as well.
4293 	 */
4294 	target = XS_TGT(xs);
4295 	if (IS_FC(isp)) {
4296 		fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
4297 
4298 		if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
4299 			isp_prt(isp, ISP_LOG_WARN1,
4300 			    "%d.%d.%jx I am not an initiator",
4301 			    XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4302 			XS_SETERR(xs, HBA_SELTIMEOUT);
4303 			return (CMD_COMPLETE);
4304 		}
4305 
4306 		if (isp->isp_state != ISP_RUNSTATE) {
4307 			isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
4308 			XS_SETERR(xs, HBA_BOTCH);
4309 			return (CMD_COMPLETE);
4310 		}
4311 
4312 		/*
4313 		 * Try again later.
4314 		 */
4315 		if (fcp->isp_loopstate != LOOP_READY) {
4316 			return (CMD_RQLATER);
4317 		}
4318 
4319 		isp_prt(isp, ISP_LOGDEBUG2, "XS_TGT(xs)=%d", target);
4320 		lp = &fcp->portdb[target];
4321 		if (target < 0 || target >= MAX_FC_TARG ||
4322 		    lp->is_target == 0) {
4323 			XS_SETERR(xs, HBA_SELTIMEOUT);
4324 			return (CMD_COMPLETE);
4325 		}
4326 		if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
4327 			isp_prt(isp, ISP_LOGDEBUG1,
4328 			    "%d.%d.%jx target zombie",
4329 			    XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4330 			return (CMD_RQLATER);
4331 		}
4332 		if (lp->state != FC_PORTDB_STATE_VALID) {
4333 			isp_prt(isp, ISP_LOGDEBUG1,
4334 			    "%d.%d.%jx bad db port state 0x%x",
4335 			    XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs), lp->state);
4336 			XS_SETERR(xs, HBA_SELTIMEOUT);
4337 			return (CMD_COMPLETE);
4338 		}
4339 	} else {
4340 		sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
4341 		if (isp->isp_state != ISP_RUNSTATE) {
4342 			isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
4343 			XS_SETERR(xs, HBA_BOTCH);
4344 			return (CMD_COMPLETE);
4345 		}
4346 
4347 		if (sdp->update) {
4348 			isp_spi_update(isp, XS_CHANNEL(xs));
4349 		}
4350 		lp = NULL;
4351 	}
4352 
4353  start_again:
4354 
4355 	qep = isp_getrqentry(isp);
4356 	if (qep == NULL) {
4357 		isp_prt(isp, ISP_LOG_WARN1, "Request Queue Overflow");
4358 		XS_SETERR(xs, HBA_BOTCH);
4359 		return (CMD_EAGAIN);
4360 	}
4361 	XS_SETERR(xs, HBA_NOERROR);
4362 
4363 	/*
4364 	 * Now see if we need to synchronize the ISP with respect to anything.
4365 	 * We do dual duty here (cough) for synchronizing for busses other
4366 	 * than which we got here to send a command to.
4367 	 */
4368 	reqp = (ispreq_t *) local;
4369 	ISP_MEMZERO(local, QENTRY_LEN);
4370 	if (ISP_TST_SENDMARKER(isp, XS_CHANNEL(xs))) {
4371 		if (IS_24XX(isp)) {
4372 			isp_marker_24xx_t *m = (isp_marker_24xx_t *) reqp;
4373 			m->mrk_header.rqs_entry_count = 1;
4374 			m->mrk_header.rqs_entry_type = RQSTYPE_MARKER;
4375 			m->mrk_modifier = SYNC_ALL;
4376 			m->mrk_vphdl = XS_CHANNEL(xs);
4377 			isp_put_marker_24xx(isp, m, qep);
4378 		} else {
4379 			isp_marker_t *m = (isp_marker_t *) reqp;
4380 			m->mrk_header.rqs_entry_count = 1;
4381 			m->mrk_header.rqs_entry_type = RQSTYPE_MARKER;
4382 			m->mrk_target = (XS_CHANNEL(xs) << 7);	/* bus # */
4383 			m->mrk_modifier = SYNC_ALL;
4384 			isp_put_marker(isp, m, qep);
4385 		}
4386 		ISP_SYNC_REQUEST(isp);
4387 		ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 0);
4388 		goto start_again;
4389 	}
4390 
4391 	reqp->req_header.rqs_entry_count = 1;
4392 
4393 	/*
4394 	 * Select and install Header Code.
4395 	 * Note that it might be overridden before going out
4396 	 * if we're on a 64 bit platform. The lower level
4397 	 * code (isp_send_cmd) will select the appropriate
4398 	 * 64 bit variant if it needs to.
4399 	 */
4400 	if (IS_24XX(isp)) {
4401 		reqp->req_header.rqs_entry_type = RQSTYPE_T7RQS;
4402 	} else if (IS_FC(isp)) {
4403 		reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
4404 	} else {
4405 		if (XS_CDBLEN(xs) > 12) {
4406 			reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY;
4407 		} else {
4408 			reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
4409 		}
4410 	}
4411 
4412 	/*
4413 	 * Set task attributes
4414 	 */
4415 	if (IS_24XX(isp)) {
4416 		int ttype;
4417 		if (XS_TAG_P(xs)) {
4418 			ttype = XS_TAG_TYPE(xs);
4419 		} else {
4420 			if (XS_CDBP(xs)[0] == 0x3) {
4421 				ttype = REQFLAG_HTAG;
4422 			} else {
4423 				ttype = REQFLAG_STAG;
4424 			}
4425 		}
4426 		if (ttype == REQFLAG_OTAG) {
4427 			ttype = FCP_CMND_TASK_ATTR_ORDERED;
4428 		} else if (ttype == REQFLAG_HTAG) {
4429 			ttype = FCP_CMND_TASK_ATTR_HEAD;
4430 		} else {
4431 			ttype = FCP_CMND_TASK_ATTR_SIMPLE;
4432 		}
4433 		((ispreqt7_t *)reqp)->req_task_attribute = ttype;
4434 	} else if (IS_FC(isp)) {
4435 		/*
4436 		 * See comment in isp_intr
4437 		 */
4438 		/* XS_SET_RESID(xs, 0); */
4439 
4440 		/*
4441 		 * Fibre Channel always requires some kind of tag.
4442 		 * The Qlogic drivers seem be happy not to use a tag,
4443 		 * but this breaks for some devices (IBM drives).
4444 		 */
4445 		if (XS_TAG_P(xs)) {
4446 			((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs);
4447 		} else {
4448 			/*
4449 			 * If we don't know what tag to use, use HEAD OF QUEUE
4450 			 * for Request Sense or Simple.
4451 			 */
4452 			if (XS_CDBP(xs)[0] == 0x3)	/* REQUEST SENSE */
4453 				((ispreqt2_t *)reqp)->req_flags = REQFLAG_HTAG;
4454 			else
4455 				((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG;
4456 		}
4457 	} else {
4458 		sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
4459 		if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) && XS_TAG_P(xs)) {
4460 			reqp->req_flags = XS_TAG_TYPE(xs);
4461 		}
4462 	}
4463 
4464 	tptr = &reqp->req_time;
4465 
4466 	/*
4467 	 * NB: we do not support long CDBs (yet)
4468 	 */
4469 	cdblen = XS_CDBLEN(xs);
4470 
4471 	if (IS_SCSI(isp)) {
4472 		if (cdblen > sizeof (reqp->req_cdb)) {
4473 			isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4474 			XS_SETERR(xs, HBA_BOTCH);
4475 			return (CMD_COMPLETE);
4476 		}
4477 		reqp->req_target = target | (XS_CHANNEL(xs) << 7);
4478 		reqp->req_lun_trn = XS_LUN(xs);
4479 		cdbp = reqp->req_cdb;
4480 		reqp->req_cdblen = cdblen;
4481 	} else if (IS_24XX(isp)) {
4482 		ispreqt7_t *t7 = (ispreqt7_t *)local;
4483 
4484 		if (cdblen > sizeof (t7->req_cdb)) {
4485 			isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4486 			XS_SETERR(xs, HBA_BOTCH);
4487 			return (CMD_COMPLETE);
4488 		}
4489 
4490 		t7->req_nphdl = lp->handle;
4491 		t7->req_tidlo = lp->portid;
4492 		t7->req_tidhi = lp->portid >> 16;
4493 		t7->req_vpidx = ISP_GET_VPIDX(isp, XS_CHANNEL(xs));
4494 #if __FreeBSD_version >= 1000700
4495 		be64enc(t7->req_lun, CAM_EXTLUN_BYTE_SWIZZLE(XS_LUN(xs)));
4496 #else
4497 		if (XS_LUN(xs) >= 256) {
4498 			t7->req_lun[0] = XS_LUN(xs) >> 8;
4499 			t7->req_lun[0] |= 0x40;
4500 		}
4501 		t7->req_lun[1] = XS_LUN(xs);
4502 #endif
4503 		if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
4504 			if (FCP_NEXT_CRN(isp, &t7->req_crn, xs)) {
4505 				isp_prt(isp, ISP_LOG_WARN1,
4506 				    "%d.%d.%jx cannot generate next CRN",
4507 				    XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4508 				XS_SETERR(xs, HBA_BOTCH);
4509 				return (CMD_EAGAIN);
4510 			}
4511 		}
4512 		tptr = &t7->req_time;
4513 		cdbp = t7->req_cdb;
4514 	} else {
4515 		ispreqt2_t *t2 = (ispreqt2_t *)local;
4516 
4517 		if (cdblen > sizeof t2->req_cdb) {
4518 			isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4519 			XS_SETERR(xs, HBA_BOTCH);
4520 			return (CMD_COMPLETE);
4521 		}
4522 		if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
4523 			if (FCP_NEXT_CRN(isp, &t2->req_crn, xs)) {
4524 				isp_prt(isp, ISP_LOG_WARN1,
4525 				    "%d.%d.%jx cannot generate next CRN",
4526 				    XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4527 				XS_SETERR(xs, HBA_BOTCH);
4528 				return (CMD_EAGAIN);
4529 			}
4530 		}
4531 		if (ISP_CAP_2KLOGIN(isp)) {
4532 			ispreqt2e_t *t2e = (ispreqt2e_t *)local;
4533 			t2e->req_target = lp->handle;
4534 			t2e->req_scclun = XS_LUN(xs);
4535 #if __FreeBSD_version < 1000700
4536 			if (XS_LUN(xs) >= 256)
4537 				t2e->req_scclun |= 0x4000;
4538 #endif
4539 			cdbp = t2e->req_cdb;
4540 		} else if (ISP_CAP_SCCFW(isp)) {
4541 			ispreqt2_t *t2 = (ispreqt2_t *)local;
4542 			t2->req_target = lp->handle;
4543 			t2->req_scclun = XS_LUN(xs);
4544 #if __FreeBSD_version < 1000700
4545 			if (XS_LUN(xs) >= 256)
4546 				t2->req_scclun |= 0x4000;
4547 #endif
4548 			cdbp = t2->req_cdb;
4549 		} else {
4550 			t2->req_target = lp->handle;
4551 			t2->req_lun_trn = XS_LUN(xs);
4552 			cdbp = t2->req_cdb;
4553 		}
4554 	}
4555 	ISP_MEMCPY(cdbp, XS_CDBP(xs), cdblen);
4556 
4557 	*tptr = (XS_TIME(xs) + 999) / 1000;
4558 	if (IS_24XX(isp) && *tptr > 0x1999) {
4559 		*tptr = 0x1999;
4560 	}
4561 
4562 	/* Whew. Thankfully the same for type 7 requests */
4563 	reqp->req_handle = isp_allocate_handle(isp, xs, ISP_HANDLE_INITIATOR);
4564 	if (reqp->req_handle == 0) {
4565 		isp_prt(isp, ISP_LOG_WARN1, "out of xflist pointers");
4566 		XS_SETERR(xs, HBA_BOTCH);
4567 		return (CMD_EAGAIN);
4568 	}
4569 
4570 	/*
4571 	 * Set up DMA and/or do any platform dependent swizzling of the request entry
4572 	 * so that the Qlogic F/W understands what is being asked of it.
4573 	 *
4574 	 * The callee is responsible for adding all requests at this point.
4575 	 */
4576 	dmaresult = ISP_DMASETUP(isp, xs, reqp);
4577 	if (dmaresult != CMD_QUEUED) {
4578 		isp_destroy_handle(isp, reqp->req_handle);
4579 		/*
4580 		 * dmasetup sets actual error in packet, and
4581 		 * return what we were given to return.
4582 		 */
4583 		return (dmaresult);
4584 	}
4585 	isp_xs_prt(isp, xs, ISP_LOGDEBUG0, "START cmd cdb[0]=0x%x datalen %ld", XS_CDBP(xs)[0], (long) XS_XFRLEN(xs));
4586 	isp->isp_nactive++;
4587 	return (CMD_QUEUED);
4588 }
4589 
4590 /*
4591  * isp control
4592  * Locks (ints blocked) assumed held.
4593  */
4594 
4595 int
4596 isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
4597 {
4598 	XS_T *xs;
4599 	mbreg_t *mbr, mbs;
4600 	int chan, tgt;
4601 	uint32_t handle;
4602 	va_list ap;
4603 
4604 	switch (ctl) {
4605 	case ISPCTL_RESET_BUS:
4606 		/*
4607 		 * Issue a bus reset.
4608 		 */
4609 		if (IS_24XX(isp)) {
4610 			isp_prt(isp, ISP_LOGERR, "BUS RESET NOT IMPLEMENTED");
4611 			break;
4612 		} else if (IS_FC(isp)) {
4613 			mbs.param[1] = 10;
4614 			chan = 0;
4615 		} else {
4616 			va_start(ap, ctl);
4617 			chan = va_arg(ap, int);
4618 			va_end(ap);
4619 			mbs.param[1] = SDPARAM(isp, chan)->isp_bus_reset_delay;
4620 			if (mbs.param[1] < 2) {
4621 				mbs.param[1] = 2;
4622 			}
4623 			mbs.param[2] = chan;
4624 		}
4625 		MBSINIT(&mbs, MBOX_BUS_RESET, MBLOGALL, 0);
4626 		ISP_SET_SENDMARKER(isp, chan, 1);
4627 		isp_mboxcmd(isp, &mbs);
4628 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4629 			break;
4630 		}
4631 		isp_prt(isp, ISP_LOGINFO, "driver initiated bus reset of bus %d", chan);
4632 		return (0);
4633 
4634 	case ISPCTL_RESET_DEV:
4635 		va_start(ap, ctl);
4636 		chan = va_arg(ap, int);
4637 		tgt = va_arg(ap, int);
4638 		va_end(ap);
4639 		if (IS_24XX(isp)) {
4640 			uint8_t local[QENTRY_LEN];
4641 			isp24xx_tmf_t *tmf;
4642 			isp24xx_statusreq_t *sp;
4643 			fcparam *fcp = FCPARAM(isp, chan);
4644 			fcportdb_t *lp;
4645 
4646 			if (tgt < 0 || tgt >= MAX_FC_TARG) {
4647 				isp_prt(isp, ISP_LOGWARN, "Chan %d trying to reset bad target %d", chan, tgt);
4648 				break;
4649 			}
4650 			lp = &fcp->portdb[tgt];
4651 			if (lp->is_target == 0 ||
4652 			    lp->state != FC_PORTDB_STATE_VALID) {
4653 				isp_prt(isp, ISP_LOGWARN, "Chan %d abort of no longer valid target %d", chan, tgt);
4654 				break;
4655 			}
4656 
4657 			tmf = (isp24xx_tmf_t *) local;
4658 			ISP_MEMZERO(tmf, QENTRY_LEN);
4659 			tmf->tmf_header.rqs_entry_type = RQSTYPE_TSK_MGMT;
4660 			tmf->tmf_header.rqs_entry_count = 1;
4661 			tmf->tmf_nphdl = lp->handle;
4662 			tmf->tmf_delay = 2;
4663 			tmf->tmf_timeout = 4;
4664 			tmf->tmf_flags = ISP24XX_TMF_TARGET_RESET;
4665 			tmf->tmf_tidlo = lp->portid;
4666 			tmf->tmf_tidhi = lp->portid >> 16;
4667 			tmf->tmf_vpidx = ISP_GET_VPIDX(isp, chan);
4668 			isp_prt(isp, ISP_LOGALL, "Chan %d Reset N-Port Handle 0x%04x @ Port 0x%06x", chan, lp->handle, lp->portid);
4669 			MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL,
4670 			    MBCMD_DEFAULT_TIMEOUT + tmf->tmf_timeout * 1000000);
4671 			mbs.param[1] = QENTRY_LEN;
4672 			mbs.param[2] = DMA_WD1(fcp->isp_scdma);
4673 			mbs.param[3] = DMA_WD0(fcp->isp_scdma);
4674 			mbs.param[6] = DMA_WD3(fcp->isp_scdma);
4675 			mbs.param[7] = DMA_WD2(fcp->isp_scdma);
4676 
4677 			if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4678 				isp_prt(isp, ISP_LOGERR, sacq);
4679 				break;
4680 			}
4681 			isp_put_24xx_tmf(isp, tmf, fcp->isp_scratch);
4682 			MEMORYBARRIER(isp, SYNC_SFORDEV, 0, QENTRY_LEN, chan);
4683 			fcp->sendmarker = 1;
4684 			isp_mboxcmd(isp, &mbs);
4685 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4686 				FC_SCRATCH_RELEASE(isp, chan);
4687 				break;
4688 			}
4689 			MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
4690 			sp = (isp24xx_statusreq_t *) local;
4691 			isp_get_24xx_response(isp, &((isp24xx_statusreq_t *)fcp->isp_scratch)[1], sp);
4692 			FC_SCRATCH_RELEASE(isp, chan);
4693 			if (sp->req_completion_status == 0) {
4694 				return (0);
4695 			}
4696 			isp_prt(isp, ISP_LOGWARN, "Chan %d reset of target %d returned 0x%x", chan, tgt, sp->req_completion_status);
4697 			break;
4698 		} else if (IS_FC(isp)) {
4699 			if (ISP_CAP_2KLOGIN(isp)) {
4700 				mbs.param[1] = tgt;
4701 				mbs.ibits = (1 << 10);
4702 			} else {
4703 				mbs.param[1] = (tgt << 8);
4704 			}
4705 		} else {
4706 			mbs.param[1] = (chan << 15) | (tgt << 8);
4707 		}
4708 		MBSINIT(&mbs, MBOX_ABORT_TARGET, MBLOGALL, 0);
4709 		mbs.param[2] = 3;	/* 'delay', in seconds */
4710 		isp_mboxcmd(isp, &mbs);
4711 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4712 			break;
4713 		}
4714 		isp_prt(isp, ISP_LOGINFO, "Target %d on Bus %d Reset Succeeded", tgt, chan);
4715 		ISP_SET_SENDMARKER(isp, chan, 1);
4716 		return (0);
4717 
4718 	case ISPCTL_ABORT_CMD:
4719 		va_start(ap, ctl);
4720 		xs = va_arg(ap, XS_T *);
4721 		va_end(ap);
4722 
4723 		tgt = XS_TGT(xs);
4724 		chan = XS_CHANNEL(xs);
4725 
4726 		handle = isp_find_handle(isp, xs);
4727 		if (handle == 0) {
4728 			isp_prt(isp, ISP_LOGWARN, "cannot find handle for command to abort");
4729 			break;
4730 		}
4731 		if (IS_24XX(isp)) {
4732 			isp24xx_abrt_t local, *ab = &local, *ab2;
4733 			fcparam *fcp;
4734 			fcportdb_t *lp;
4735 
4736 			fcp = FCPARAM(isp, chan);
4737 			if (tgt < 0 || tgt >= MAX_FC_TARG) {
4738 				isp_prt(isp, ISP_LOGWARN, "Chan %d trying to abort bad target %d", chan, tgt);
4739 				break;
4740 			}
4741 			lp = &fcp->portdb[tgt];
4742 			if (lp->is_target == 0 ||
4743 			    lp->state != FC_PORTDB_STATE_VALID) {
4744 				isp_prt(isp, ISP_LOGWARN, "Chan %d abort of no longer valid target %d", chan, tgt);
4745 				break;
4746 			}
4747 			isp_prt(isp, ISP_LOGALL, "Chan %d Abort Cmd for N-Port 0x%04x @ Port 0x%06x", chan, lp->handle, lp->portid);
4748 			ISP_MEMZERO(ab, QENTRY_LEN);
4749 			ab->abrt_header.rqs_entry_type = RQSTYPE_ABORT_IO;
4750 			ab->abrt_header.rqs_entry_count = 1;
4751 			ab->abrt_handle = lp->handle;
4752 			ab->abrt_cmd_handle = handle;
4753 			ab->abrt_tidlo = lp->portid;
4754 			ab->abrt_tidhi = lp->portid >> 16;
4755 			ab->abrt_vpidx = ISP_GET_VPIDX(isp, chan);
4756 
4757 			ISP_MEMZERO(&mbs, sizeof (mbs));
4758 			MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 5000000);
4759 			mbs.param[1] = QENTRY_LEN;
4760 			mbs.param[2] = DMA_WD1(fcp->isp_scdma);
4761 			mbs.param[3] = DMA_WD0(fcp->isp_scdma);
4762 			mbs.param[6] = DMA_WD3(fcp->isp_scdma);
4763 			mbs.param[7] = DMA_WD2(fcp->isp_scdma);
4764 
4765 			if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4766 				isp_prt(isp, ISP_LOGERR, sacq);
4767 				break;
4768 			}
4769 			isp_put_24xx_abrt(isp, ab, fcp->isp_scratch);
4770 			ab2 = (isp24xx_abrt_t *) &((uint8_t *)fcp->isp_scratch)[QENTRY_LEN];
4771 			ab2->abrt_nphdl = 0xdeaf;
4772 			MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN, chan);
4773 			isp_mboxcmd(isp, &mbs);
4774 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4775 				FC_SCRATCH_RELEASE(isp, chan);
4776 				break;
4777 			}
4778 			MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
4779 			isp_get_24xx_abrt(isp, ab2, ab);
4780 			FC_SCRATCH_RELEASE(isp, chan);
4781 			if (ab->abrt_nphdl == ISP24XX_ABRT_OKAY) {
4782 				return (0);
4783 			}
4784 			isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d abort returned 0x%x", chan, tgt, ab->abrt_nphdl);
4785 			break;
4786 		} else if (IS_FC(isp)) {
4787 			if (ISP_CAP_SCCFW(isp)) {
4788 				if (ISP_CAP_2KLOGIN(isp)) {
4789 					mbs.param[1] = tgt;
4790 				} else {
4791 					mbs.param[1] = tgt << 8;
4792 				}
4793 				mbs.param[6] = XS_LUN(xs);
4794 			} else {
4795 				mbs.param[1] = tgt << 8 | XS_LUN(xs);
4796 			}
4797 		} else {
4798 			mbs.param[1] = (chan << 15) | (tgt << 8) | XS_LUN(xs);
4799 		}
4800 		MBSINIT(&mbs, MBOX_ABORT,
4801 		    MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_ERROR), 0);
4802 		mbs.param[2] = handle;
4803 		isp_mboxcmd(isp, &mbs);
4804 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4805 			break;
4806 		}
4807 		return (0);
4808 
4809 	case ISPCTL_UPDATE_PARAMS:
4810 
4811 		va_start(ap, ctl);
4812 		chan = va_arg(ap, int);
4813 		va_end(ap);
4814 		isp_spi_update(isp, chan);
4815 		return (0);
4816 
4817 	case ISPCTL_FCLINK_TEST:
4818 
4819 		if (IS_FC(isp)) {
4820 			int usdelay;
4821 			va_start(ap, ctl);
4822 			chan = va_arg(ap, int);
4823 			usdelay = va_arg(ap, int);
4824 			va_end(ap);
4825 			if (usdelay == 0) {
4826 				usdelay =  250000;
4827 			}
4828 			return (isp_fclink_test(isp, chan, usdelay));
4829 		}
4830 		break;
4831 
4832 	case ISPCTL_SCAN_FABRIC:
4833 
4834 		if (IS_FC(isp)) {
4835 			va_start(ap, ctl);
4836 			chan = va_arg(ap, int);
4837 			va_end(ap);
4838 			return (isp_scan_fabric(isp, chan));
4839 		}
4840 		break;
4841 
4842 	case ISPCTL_SCAN_LOOP:
4843 
4844 		if (IS_FC(isp)) {
4845 			va_start(ap, ctl);
4846 			chan = va_arg(ap, int);
4847 			va_end(ap);
4848 			return (isp_scan_loop(isp, chan));
4849 		}
4850 		break;
4851 
4852 	case ISPCTL_PDB_SYNC:
4853 
4854 		if (IS_FC(isp)) {
4855 			va_start(ap, ctl);
4856 			chan = va_arg(ap, int);
4857 			va_end(ap);
4858 			return (isp_pdb_sync(isp, chan));
4859 		}
4860 		break;
4861 
4862 	case ISPCTL_SEND_LIP:
4863 
4864 		if (IS_FC(isp) && !IS_24XX(isp)) {
4865 			MBSINIT(&mbs, MBOX_INIT_LIP, MBLOGALL, 0);
4866 			if (ISP_CAP_2KLOGIN(isp)) {
4867 				mbs.ibits = (1 << 10);
4868 			}
4869 			isp_mboxcmd(isp, &mbs);
4870 			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
4871 				return (0);
4872 			}
4873 		}
4874 		break;
4875 
4876 	case ISPCTL_GET_PDB:
4877 		if (IS_FC(isp)) {
4878 			isp_pdb_t *pdb;
4879 			va_start(ap, ctl);
4880 			chan = va_arg(ap, int);
4881 			tgt = va_arg(ap, int);
4882 			pdb = va_arg(ap, isp_pdb_t *);
4883 			va_end(ap);
4884 			return (isp_getpdb(isp, chan, tgt, pdb));
4885 		}
4886 		break;
4887 
4888 	case ISPCTL_GET_NAMES:
4889 	{
4890 		uint64_t *wwnn, *wwnp;
4891 		va_start(ap, ctl);
4892 		chan = va_arg(ap, int);
4893 		tgt = va_arg(ap, int);
4894 		wwnn = va_arg(ap, uint64_t *);
4895 		wwnp = va_arg(ap, uint64_t *);
4896 		va_end(ap);
4897 		if (wwnn == NULL && wwnp == NULL) {
4898 			break;
4899 		}
4900 		if (wwnn) {
4901 			*wwnn = isp_get_wwn(isp, chan, tgt, 1);
4902 			if (*wwnn == INI_NONE) {
4903 				break;
4904 			}
4905 		}
4906 		if (wwnp) {
4907 			*wwnp = isp_get_wwn(isp, chan, tgt, 0);
4908 			if (*wwnp == INI_NONE) {
4909 				break;
4910 			}
4911 		}
4912 		return (0);
4913 	}
4914 	case ISPCTL_RUN_MBOXCMD:
4915 	{
4916 		va_start(ap, ctl);
4917 		mbr = va_arg(ap, mbreg_t *);
4918 		va_end(ap);
4919 		isp_mboxcmd(isp, mbr);
4920 		return (0);
4921 	}
4922 	case ISPCTL_PLOGX:
4923 	{
4924 		isp_plcmd_t *p;
4925 		int r;
4926 
4927 		va_start(ap, ctl);
4928 		p = va_arg(ap, isp_plcmd_t *);
4929 		va_end(ap);
4930 
4931 		if ((p->flags & PLOGX_FLG_CMD_MASK) != PLOGX_FLG_CMD_PLOGI || (p->handle != NIL_HANDLE)) {
4932 			return (isp_plogx(isp, p->channel, p->handle, p->portid, p->flags));
4933 		}
4934 		do {
4935 			isp_next_handle(isp, &p->handle);
4936 			r = isp_plogx(isp, p->channel, p->handle, p->portid, p->flags);
4937 			if ((r & 0xffff) == MBOX_PORT_ID_USED) {
4938 				p->handle = r >> 16;
4939 				r = 0;
4940 				break;
4941 			}
4942 		} while ((r & 0xffff) == MBOX_LOOP_ID_USED);
4943 		return (r);
4944 	}
4945 	case ISPCTL_CHANGE_ROLE:
4946 		if (IS_FC(isp)) {
4947 			int role, r;
4948 
4949 			va_start(ap, ctl);
4950 			chan = va_arg(ap, int);
4951 			role = va_arg(ap, int);
4952 			va_end(ap);
4953 			r = isp_fc_change_role(isp, chan, role);
4954 			return (r);
4955 		}
4956 		break;
4957 	default:
4958 		isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl);
4959 		break;
4960 
4961 	}
4962 	return (-1);
4963 }
4964 
4965 /*
4966  * Interrupt Service Routine(s).
4967  *
4968  * External (OS) framework has done the appropriate locking,
4969  * and the locking will be held throughout this function.
4970  */
4971 
4972 /*
4973  * Limit our stack depth by sticking with the max likely number
4974  * of completions on a request queue at any one time.
4975  */
4976 #ifndef	MAX_REQUESTQ_COMPLETIONS
4977 #define	MAX_REQUESTQ_COMPLETIONS	32
4978 #endif
4979 
4980 void
4981 isp_intr(ispsoftc_t *isp, uint16_t isr, uint16_t sema, uint16_t info)
4982 {
4983 	XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
4984 	uint32_t iptr, optr, junk;
4985 	int i, nlooked = 0, ndone = 0, continuations_expected = 0;
4986 	int etype, last_etype = 0;
4987 
4988 again:
4989 	/*
4990 	 * Is this a mailbox related interrupt?
4991 	 * The mailbox semaphore will be nonzero if so.
4992 	 */
4993 	if (sema) {
4994  fmbox:
4995 		if (info & MBOX_COMMAND_COMPLETE) {
4996 			isp->isp_intmboxc++;
4997 			if (isp->isp_mboxbsy) {
4998 				int obits = isp->isp_obits;
4999 				isp->isp_mboxtmp[0] = info;
5000 				for (i = 1; i < ISP_NMBOX(isp); i++) {
5001 					if ((obits & (1 << i)) == 0) {
5002 						continue;
5003 					}
5004 					isp->isp_mboxtmp[i] = ISP_READ(isp, MBOX_OFF(i));
5005 				}
5006 				if (isp->isp_mbxwrk0) {
5007 					if (isp_mbox_continue(isp) == 0) {
5008 						return;
5009 					}
5010 				}
5011 				MBOX_NOTIFY_COMPLETE(isp);
5012 			} else {
5013 				isp_prt(isp, ISP_LOGWARN, "mailbox cmd (0x%x) with no waiters", info);
5014 			}
5015 		} else {
5016 			i = IS_FC(isp)? isp_parse_async_fc(isp, info) : isp_parse_async(isp, info);
5017 			if (i < 0) {
5018 				return;
5019 			}
5020 		}
5021 		if ((IS_FC(isp) && info != ASYNC_RIOZIO_STALL) || isp->isp_state != ISP_RUNSTATE) {
5022 			goto out;
5023 		}
5024 	}
5025 
5026 	/*
5027 	 * We can't be getting this now.
5028 	 */
5029 	if (isp->isp_state != ISP_RUNSTATE) {
5030 		/*
5031 		 * This seems to happen to 23XX and 24XX cards- don't know why.
5032 		 */
5033 		 if (isp->isp_mboxbsy && isp->isp_lastmbxcmd == MBOX_ABOUT_FIRMWARE) {
5034 			goto fmbox;
5035 		}
5036 		isp_prt(isp, ISP_LOGINFO, "interrupt (ISR=%x SEMA=%x INFO=%x) "
5037 		    "when not ready", isr, sema, info);
5038 		/*
5039 		 * Thank you very much!  *Burrrp*!
5040 		 */
5041 		isp->isp_residx = ISP_READ(isp, isp->isp_respinrp);
5042 		isp->isp_resodx = isp->isp_residx;
5043 		ISP_WRITE(isp, isp->isp_respoutrp, isp->isp_resodx);
5044 		if (IS_24XX(isp)) {
5045 			ISP_DISABLE_INTS(isp);
5046 		}
5047 		goto out;
5048 	}
5049 
5050 #ifdef	ISP_TARGET_MODE
5051 	/*
5052 	 * Check for ATIO Queue entries.
5053 	 */
5054 	if (IS_24XX(isp) &&
5055 	    (isr == ISPR2HST_ATIO_UPDATE || isr == ISPR2HST_ATIO_RSPQ_UPDATE ||
5056 	     isr == ISPR2HST_ATIO_UPDATE2)) {
5057 		iptr = ISP_READ(isp, BIU2400_ATIO_RSPINP);
5058 		optr = isp->isp_atioodx;
5059 
5060 		while (optr != iptr) {
5061 			uint8_t qe[QENTRY_LEN];
5062 			isphdr_t *hp;
5063 			uint32_t oop;
5064 			void *addr;
5065 
5066 			oop = optr;
5067 			MEMORYBARRIER(isp, SYNC_ATIOQ, oop, QENTRY_LEN, -1);
5068 			addr = ISP_QUEUE_ENTRY(isp->isp_atioq, oop);
5069 			isp_get_hdr(isp, addr, (isphdr_t *)qe);
5070 			hp = (isphdr_t *)qe;
5071 			switch (hp->rqs_entry_type) {
5072 			case RQSTYPE_NOTIFY:
5073 			case RQSTYPE_ATIO:
5074 				(void) isp_target_notify(isp, addr, &oop);
5075 				break;
5076 			default:
5077 				isp_print_qentry(isp, "?ATIOQ entry?", oop, addr);
5078 				break;
5079 			}
5080 			optr = ISP_NXT_QENTRY(oop, RESULT_QUEUE_LEN(isp));
5081 		}
5082 		if (isp->isp_atioodx != optr) {
5083 			ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, optr);
5084 			isp->isp_atioodx = optr;
5085 		}
5086 	}
5087 #endif
5088 
5089 	/*
5090 	 * You *must* read the Response Queue In Pointer
5091 	 * prior to clearing the RISC interrupt.
5092 	 *
5093 	 * Debounce the 2300 if revision less than 2.
5094 	 */
5095 	if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) {
5096 		i = 0;
5097 		do {
5098 			iptr = ISP_READ(isp, isp->isp_respinrp);
5099 			junk = ISP_READ(isp, isp->isp_respinrp);
5100 		} while (junk != iptr && ++i < 1000);
5101 
5102 		if (iptr != junk) {
5103 			isp_prt(isp, ISP_LOGWARN, "Response Queue Out Pointer Unstable (%x, %x)", iptr, junk);
5104 			goto out;
5105 		}
5106 	} else {
5107 		iptr = ISP_READ(isp, isp->isp_respinrp);
5108 	}
5109 
5110 	optr = isp->isp_resodx;
5111 	if (optr == iptr && sema == 0) {
5112 		/*
5113 		 * There are a lot of these- reasons unknown- mostly on
5114 		 * faster Alpha machines.
5115 		 *
5116 		 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to
5117 		 * make sure the old interrupt went away (to avoid 'ringing'
5118 		 * effects), but that didn't stop this from occurring.
5119 		 */
5120 		if (IS_24XX(isp)) {
5121 			junk = 0;
5122 		} else if (IS_23XX(isp)) {
5123 			ISP_DELAY(100);
5124 			iptr = ISP_READ(isp, isp->isp_respinrp);
5125 			junk = ISP_READ(isp, BIU_R2HSTSLO);
5126 		} else {
5127 			junk = ISP_READ(isp, BIU_ISR);
5128 		}
5129 		if (optr == iptr) {
5130 			if (IS_23XX(isp) || IS_24XX(isp)) {
5131 				;
5132 			} else {
5133 				sema = ISP_READ(isp, BIU_SEMA);
5134 				info = ISP_READ(isp, OUTMAILBOX0);
5135 				if ((sema & 0x3) && (info & 0x8000)) {
5136 					goto again;
5137 				}
5138 			}
5139 			isp->isp_intbogus++;
5140 			isp_prt(isp, ISP_LOGDEBUG1, "bogus intr- isr %x (%x) iptr %x optr %x", isr, junk, iptr, optr);
5141 		}
5142 	}
5143 	isp->isp_residx = iptr;
5144 
5145 	while (optr != iptr) {
5146 		uint8_t qe[QENTRY_LEN];
5147 		ispstatusreq_t *sp = (ispstatusreq_t *) qe;
5148 		isphdr_t *hp;
5149 		int buddaboom, scsi_status, completion_status;
5150 		int req_status_flags, req_state_flags;
5151 		uint8_t *snsp, *resp;
5152 		uint32_t rlen, slen, totslen;
5153 		long resid;
5154 		uint16_t oop;
5155 
5156 		hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr);
5157 		oop = optr;
5158 		optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
5159 		nlooked++;
5160  read_again:
5161 		buddaboom = req_status_flags = req_state_flags = 0;
5162 		resid = 0L;
5163 
5164 		/*
5165 		 * Synchronize our view of this response queue entry.
5166 		 */
5167 		MEMORYBARRIER(isp, SYNC_RESULT, oop, QENTRY_LEN, -1);
5168 		if (isp->isp_dblev & ISP_LOGDEBUG1)
5169 			isp_print_qentry(isp, "Response Queue Entry", oop, hp);
5170 		isp_get_hdr(isp, hp, &sp->req_header);
5171 		etype = sp->req_header.rqs_entry_type;
5172 
5173 		if (IS_24XX(isp) && etype == RQSTYPE_RESPONSE) {
5174 			isp24xx_statusreq_t *sp2 = (isp24xx_statusreq_t *)qe;
5175 			isp_get_24xx_response(isp, (isp24xx_statusreq_t *)hp, sp2);
5176 			scsi_status = sp2->req_scsi_status;
5177 			completion_status = sp2->req_completion_status;
5178 			if ((scsi_status & 0xff) != 0)
5179 				req_state_flags = RQSF_GOT_STATUS;
5180 			else
5181 				req_state_flags = 0;
5182 			resid = sp2->req_resid;
5183 		} else if (etype == RQSTYPE_RESPONSE) {
5184 			isp_get_response(isp, (ispstatusreq_t *) hp, sp);
5185 			scsi_status = sp->req_scsi_status;
5186 			completion_status = sp->req_completion_status;
5187 			req_status_flags = sp->req_status_flags;
5188 			req_state_flags = sp->req_state_flags;
5189 			resid = sp->req_resid;
5190 		} else if (etype == RQSTYPE_RIO1) {
5191 			isp_rio1_t *rio = (isp_rio1_t *) qe;
5192 			isp_get_rio1(isp, (isp_rio1_t *) hp, rio);
5193 			for (i = 0; i < rio->req_header.rqs_seqno; i++) {
5194 				isp_fastpost_complete(isp, rio->req_handles[i]);
5195 			}
5196 			if (isp->isp_fpcchiwater < rio->req_header.rqs_seqno) {
5197 				isp->isp_fpcchiwater = rio->req_header.rqs_seqno;
5198 			}
5199 			ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5200 			last_etype = etype;
5201 			continue;
5202 		} else if (etype == RQSTYPE_RIO2) {
5203 			isp_prt(isp, ISP_LOGERR, "dropping RIO2 response");
5204 			ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5205 			last_etype = etype;
5206 			continue;
5207 		} else if (etype == RQSTYPE_STATUS_CONT) {
5208 			isp_get_cont_response(isp, (ispstatus_cont_t *) hp, (ispstatus_cont_t *) sp);
5209 			if (last_etype == RQSTYPE_RESPONSE && continuations_expected && ndone > 0 && (xs = complist[ndone-1]) != NULL) {
5210 				ispstatus_cont_t *scp = (ispstatus_cont_t *) sp;
5211 				XS_SENSE_APPEND(xs, scp->req_sense_data, sizeof (scp->req_sense_data));
5212 				isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN, "%d more Status Continuations expected", --continuations_expected);
5213 			} else {
5214 				isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
5215 			}
5216 			ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5217 			continue;
5218 		} else {
5219 			/*
5220 			 * Somebody reachable via isp_handle_other_response
5221 			 * may have updated the response queue pointers for
5222 			 * us, so we reload our goal index.
5223 			 */
5224 			int r;
5225 			uint32_t tsto = oop;
5226 			r = isp_handle_other_response(isp, etype, hp, &tsto);
5227 			if (r < 0) {
5228 				goto read_again;
5229 			}
5230 			/*
5231 			 * If somebody updated the output pointer, then reset
5232 			 * optr to be one more than the updated amount.
5233 			 */
5234 			while (tsto != oop) {
5235 				optr = ISP_NXT_QENTRY(tsto, RESULT_QUEUE_LEN(isp));
5236 			}
5237 			if (r > 0) {
5238 				ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5239 				last_etype = etype;
5240 				continue;
5241 			}
5242 
5243 			/*
5244 			 * After this point, we'll just look at the header as
5245 			 * we don't know how to deal with the rest of the
5246 			 * response.
5247 			 */
5248 
5249 			/*
5250 			 * It really has to be a bounced request just copied
5251 			 * from the request queue to the response queue. If
5252 			 * not, something bad has happened.
5253 			 */
5254 			if (etype != RQSTYPE_REQUEST) {
5255 				isp_prt(isp, ISP_LOGERR, notresp, etype, oop, optr, nlooked);
5256 				ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5257 				last_etype = etype;
5258 				continue;
5259 			}
5260 			buddaboom = 1;
5261 			scsi_status = sp->req_scsi_status;
5262 			completion_status = sp->req_completion_status;
5263 			req_status_flags = sp->req_status_flags;
5264 			req_state_flags = sp->req_state_flags;
5265 			resid = sp->req_resid;
5266 		}
5267 
5268 		if (sp->req_header.rqs_flags & RQSFLAG_MASK) {
5269 			if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
5270 				isp_print_qentry(isp, "unexpected continuation segment",
5271 				    oop, hp);
5272 				last_etype = etype;
5273 				continue;
5274 			}
5275 			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
5276 				isp_prt(isp, ISP_LOG_WARN1, "internal queues full");
5277 				/*
5278 				 * We'll synthesize a QUEUE FULL message below.
5279 				 */
5280 			}
5281 			if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
5282 				isp_print_qentry(isp, "bad header flag",
5283 				    oop, hp);
5284 				buddaboom++;
5285 			}
5286 			if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
5287 				isp_print_qentry(isp, "bad request packet",
5288 				    oop, hp);
5289 				buddaboom++;
5290 			}
5291 			if (sp->req_header.rqs_flags & RQSFLAG_BADCOUNT) {
5292 				isp_print_qentry(isp, "invalid entry count",
5293 				    oop, hp);
5294 				buddaboom++;
5295 			}
5296 			if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) {
5297 				isp_print_qentry(isp, "invalid IOCB ordering",
5298 				    oop, hp);
5299 				last_etype = etype;
5300 				continue;
5301 			}
5302 		}
5303 
5304 		xs = isp_find_xs(isp, sp->req_handle);
5305 		if (xs == NULL) {
5306 			uint8_t ts = completion_status & 0xff;
5307 			/*
5308 			 * Only whine if this isn't the expected fallout of
5309 			 * aborting the command or resetting the target.
5310 			 */
5311 			if (etype != RQSTYPE_RESPONSE) {
5312 				isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (type 0x%x)", sp->req_handle, etype);
5313 			} else if (ts != RQCS_ABORTED && ts != RQCS_RESET_OCCURRED) {
5314 				isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (status 0x%x)", sp->req_handle, ts);
5315 			}
5316 			ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5317 			last_etype = etype;
5318 			continue;
5319 		}
5320 		if (req_status_flags & RQSTF_BUS_RESET) {
5321 			isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx bus was reset",
5322 			    XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
5323 			XS_SETERR(xs, HBA_BUSRESET);
5324 			ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
5325 		}
5326 		if (buddaboom) {
5327 			isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx buddaboom",
5328 			    XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
5329 			XS_SETERR(xs, HBA_BOTCH);
5330 		}
5331 
5332 		resp = NULL;
5333 		rlen = 0;
5334 		snsp = NULL;
5335 		totslen = slen = 0;
5336 		if (IS_24XX(isp) && (scsi_status & (RQCS_RV|RQCS_SV)) != 0) {
5337 			resp = ((isp24xx_statusreq_t *)sp)->req_rsp_sense;
5338 			rlen = ((isp24xx_statusreq_t *)sp)->req_response_len;
5339 		} else if (IS_FC(isp) && (scsi_status & RQCS_RV) != 0) {
5340 			resp = sp->req_response;
5341 			rlen = sp->req_response_len;
5342 		}
5343 		if (IS_FC(isp) && (scsi_status & RQCS_SV) != 0) {
5344 			/*
5345 			 * Fibre Channel F/W doesn't say we got status
5346 			 * if there's Sense Data instead. I guess they
5347 			 * think it goes w/o saying.
5348 			 */
5349 			req_state_flags |= RQSF_GOT_STATUS|RQSF_GOT_SENSE;
5350 			if (IS_24XX(isp)) {
5351 				snsp = ((isp24xx_statusreq_t *)sp)->req_rsp_sense;
5352 				snsp += rlen;
5353 				totslen = ((isp24xx_statusreq_t *)sp)->req_sense_len;
5354 				slen = (sizeof (((isp24xx_statusreq_t *)sp)->req_rsp_sense)) - rlen;
5355 				if (totslen < slen)
5356 					slen = totslen;
5357 			} else {
5358 				snsp = sp->req_sense_data;
5359 				totslen = sp->req_sense_len;
5360 				slen = sizeof (sp->req_sense_data);
5361 				if (totslen < slen)
5362 					slen = totslen;
5363 			}
5364 		} else if (IS_SCSI(isp) && (req_state_flags & RQSF_GOT_SENSE)) {
5365 			snsp = sp->req_sense_data;
5366 			totslen = sp->req_sense_len;
5367 			slen = sizeof (sp->req_sense_data);
5368 			if (totslen < slen)
5369 				slen = totslen;
5370 		}
5371 		if (req_state_flags & RQSF_GOT_STATUS) {
5372 			*XS_STSP(xs) = scsi_status & 0xff;
5373 		}
5374 
5375 		switch (etype) {
5376 		case RQSTYPE_RESPONSE:
5377 			if (resp && rlen >= 4 && resp[FCP_RSPNS_CODE_OFFSET] != 0) {
5378 				const char *ptr;
5379 				char lb[64];
5380 				const char *rnames[10] = {
5381 				    "Task Management function complete",
5382 				    "FCP_DATA length different than FCP_BURST_LEN",
5383 				    "FCP_CMND fields invalid",
5384 				    "FCP_DATA parameter mismatch with FCP_DATA_RO",
5385 				    "Task Management function rejected",
5386 				    "Task Management function failed",
5387 				    NULL,
5388 				    NULL,
5389 				    "Task Management function succeeded",
5390 				    "Task Management function incorrect logical unit number",
5391 				};
5392 				uint8_t code = resp[FCP_RSPNS_CODE_OFFSET];
5393 				if (code >= 10 || rnames[code] == NULL) {
5394 					ISP_SNPRINTF(lb, sizeof(lb),
5395 					    "Unknown FCP Response Code 0x%x",
5396 					    code);
5397 					ptr = lb;
5398 				} else {
5399 					ptr = rnames[code];
5400 				}
5401 				isp_xs_prt(isp, xs, ISP_LOGWARN,
5402 				    "FCP RESPONSE, LENGTH %u: %s CDB0=0x%02x",
5403 				    rlen, ptr, XS_CDBP(xs)[0] & 0xff);
5404 				if (code != 0 && code != 8)
5405 					XS_SETERR(xs, HBA_BOTCH);
5406 			}
5407 			if (IS_24XX(isp)) {
5408 				isp_parse_status_24xx(isp, (isp24xx_statusreq_t *)sp, xs, &resid);
5409 			} else {
5410 				isp_parse_status(isp, (void *)sp, xs, &resid);
5411 			}
5412 			if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) && (*XS_STSP(xs) == SCSI_BUSY)) {
5413 				XS_SETERR(xs, HBA_TGTBSY);
5414 			}
5415 			if (IS_SCSI(isp)) {
5416 				XS_SET_RESID(xs, resid);
5417 				/*
5418 				 * A new synchronous rate was negotiated for
5419 				 * this target. Mark state such that we'll go
5420 				 * look up that which has changed later.
5421 				 */
5422 				if (req_status_flags & RQSTF_NEGOTIATION) {
5423 					int t = XS_TGT(xs);
5424 					sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
5425 					sdp->isp_devparam[t].dev_refresh = 1;
5426 					sdp->update = 1;
5427 				}
5428 			} else {
5429 				if (req_status_flags & RQSF_XFER_COMPLETE) {
5430 					XS_SET_RESID(xs, 0);
5431 				} else if (scsi_status & RQCS_RESID) {
5432 					XS_SET_RESID(xs, resid);
5433 				} else {
5434 					XS_SET_RESID(xs, 0);
5435 				}
5436 			}
5437 			if (snsp && slen) {
5438 				if (totslen > slen) {
5439 					continuations_expected += ((totslen - slen + QENTRY_LEN - 5) / (QENTRY_LEN - 4));
5440 					if (ndone > (MAX_REQUESTQ_COMPLETIONS - continuations_expected - 1)) {
5441 						/* we'll lose some stats, but that's a small price to pay */
5442 						for (i = 0; i < ndone; i++) {
5443 							if (complist[i]) {
5444 								isp->isp_rsltccmplt++;
5445 								isp_done(complist[i]);
5446 							}
5447 						}
5448 						ndone = 0;
5449 					}
5450 					isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN, "Expecting %d more Status Continuations for total sense length of %u",
5451 					    continuations_expected, totslen);
5452 				}
5453 				XS_SAVE_SENSE(xs, snsp, totslen, slen);
5454 			} else if ((req_status_flags & RQSF_GOT_STATUS) && (scsi_status & 0xff) == SCSI_CHECK && IS_FC(isp)) {
5455 				isp_prt(isp, ISP_LOGWARN, "CHECK CONDITION w/o sense data for CDB=0x%x", XS_CDBP(xs)[0] & 0xff);
5456 				isp_print_qentry(isp, "CC with no Sense",
5457 				    oop, hp);
5458 			}
5459 			isp_prt(isp, ISP_LOGDEBUG2, "asked for %ld got raw resid %ld settled for %ld", (long) XS_XFRLEN(xs), resid, (long) XS_GET_RESID(xs));
5460 			break;
5461 		case RQSTYPE_REQUEST:
5462 		case RQSTYPE_A64:
5463 		case RQSTYPE_T2RQS:
5464 		case RQSTYPE_T3RQS:
5465 		case RQSTYPE_T7RQS:
5466 			if (!IS_24XX(isp) && (sp->req_header.rqs_flags & RQSFLAG_FULL)) {
5467 				/*
5468 				 * Force Queue Full status.
5469 				 */
5470 				*XS_STSP(xs) = SCSI_QFULL;
5471 				XS_SETERR(xs, HBA_NOERROR);
5472 			} else if (XS_NOERR(xs)) {
5473 				isp_prt(isp, ISP_LOG_WARN1,
5474 				    "%d.%d.%jx badness at %s:%u",
5475 				    XS_CHANNEL(xs), XS_TGT(xs),
5476 				    (uintmax_t)XS_LUN(xs),
5477 				    __func__, __LINE__);
5478 				XS_SETERR(xs, HBA_BOTCH);
5479 			}
5480 			XS_SET_RESID(xs, XS_XFRLEN(xs));
5481 			break;
5482 		default:
5483 			isp_print_qentry(isp, "Unhandled Response Type",
5484 			    oop, hp);
5485 			if (XS_NOERR(xs)) {
5486 				XS_SETERR(xs, HBA_BOTCH);
5487 			}
5488 			break;
5489 		}
5490 
5491 		/*
5492 		 * Free any DMA resources. As a side effect, this may
5493 		 * also do any cache flushing necessary for data coherence.
5494 		 */
5495 		if (XS_XFRLEN(xs)) {
5496 			ISP_DMAFREE(isp, xs, sp->req_handle);
5497 		}
5498 		isp_destroy_handle(isp, sp->req_handle);
5499 
5500 		if (isp->isp_nactive > 0) {
5501 		    isp->isp_nactive--;
5502 		}
5503 		complist[ndone++] = xs;	/* defer completion call until later */
5504 		ISP_MEMZERO(hp, QENTRY_LEN);	/* PERF */
5505 		last_etype = etype;
5506 		if (ndone == MAX_REQUESTQ_COMPLETIONS) {
5507 			break;
5508 		}
5509 	}
5510 
5511 	/*
5512 	 * If we looked at any commands, then it's valid to find out
5513 	 * what the outpointer is. It also is a trigger to update the
5514 	 * ISP's notion of what we've seen so far.
5515 	 */
5516 	if (nlooked) {
5517 		ISP_WRITE(isp, isp->isp_respoutrp, optr);
5518 		isp->isp_resodx = optr;
5519 		if (isp->isp_rscchiwater < ndone)
5520 			isp->isp_rscchiwater = ndone;
5521 	}
5522 
5523 out:
5524 
5525 	if (IS_24XX(isp)) {
5526 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
5527 	} else {
5528 		ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
5529 		ISP_WRITE(isp, BIU_SEMA, 0);
5530 	}
5531 
5532 	for (i = 0; i < ndone; i++) {
5533 		xs = complist[i];
5534 		if (xs) {
5535 			if (((isp->isp_dblev & (ISP_LOGDEBUG1|ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
5536 			    ((isp->isp_dblev & (ISP_LOGDEBUG0|ISP_LOG_CWARN) && ((!XS_NOERR(xs)) || (*XS_STSP(xs) != SCSI_GOOD))))) {
5537 				isp_prt_endcmd(isp, xs);
5538 			}
5539 			isp->isp_rsltccmplt++;
5540 			isp_done(xs);
5541 		}
5542 	}
5543 }
5544 
5545 /*
5546  * Support routines.
5547  */
5548 
5549 void
5550 isp_prt_endcmd(ispsoftc_t *isp, XS_T *xs)
5551 {
5552 	char cdbstr[16 * 5 + 1];
5553 	int i, lim;
5554 
5555 	lim = XS_CDBLEN(xs) > 16? 16 : XS_CDBLEN(xs);
5556 	ISP_SNPRINTF(cdbstr, sizeof (cdbstr), "0x%02x ", XS_CDBP(xs)[0]);
5557 	for (i = 1; i < lim; i++) {
5558 		ISP_SNPRINTF(cdbstr, sizeof (cdbstr), "%s0x%02x ", cdbstr, XS_CDBP(xs)[i]);
5559 	}
5560 	if (XS_SENSE_VALID(xs)) {
5561 		isp_xs_prt(isp, xs, ISP_LOGALL, "FIN dl%d resid %ld CDB=%s SenseLength=%u/%u KEY/ASC/ASCQ=0x%02x/0x%02x/0x%02x",
5562 		    XS_XFRLEN(xs), (long) XS_GET_RESID(xs), cdbstr, XS_CUR_SNSLEN(xs), XS_TOT_SNSLEN(xs), XS_SNSKEY(xs), XS_SNSASC(xs), XS_SNSASCQ(xs));
5563 	} else {
5564 		isp_xs_prt(isp, xs, ISP_LOGALL, "FIN dl%d resid %ld CDB=%s STS 0x%x XS_ERR=0x%x", XS_XFRLEN(xs), (long) XS_GET_RESID(xs), cdbstr, *XS_STSP(xs), XS_ERR(xs));
5565 	}
5566 }
5567 
5568 /*
5569  * Parse an ASYNC mailbox complete
5570  *
5571  * Return non-zero if the event has been acknowledged.
5572  */
5573 static int
5574 isp_parse_async(ispsoftc_t *isp, uint16_t mbox)
5575 {
5576 	int acked = 0;
5577 	uint32_t h1 = 0, h2 = 0;
5578 	uint16_t chan = 0;
5579 
5580 	/*
5581 	 * Pick up the channel, but not if this is a ASYNC_RIO32_2,
5582 	 * where Mailboxes 6/7 have the second handle.
5583 	 */
5584 	if (mbox != ASYNC_RIO32_2) {
5585 		if (IS_DUALBUS(isp)) {
5586 			chan = ISP_READ(isp, OUTMAILBOX6);
5587 		}
5588 	}
5589 	isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
5590 
5591 	switch (mbox) {
5592 	case ASYNC_BUS_RESET:
5593 		ISP_SET_SENDMARKER(isp, chan, 1);
5594 #ifdef	ISP_TARGET_MODE
5595 		if (isp_target_async(isp, chan, mbox)) {
5596 			acked = 1;
5597 		}
5598 #endif
5599 		isp_async(isp, ISPASYNC_BUS_RESET, chan);
5600 		break;
5601 	case ASYNC_SYSTEM_ERROR:
5602 		isp->isp_dead = 1;
5603 		isp->isp_state = ISP_CRASHED;
5604 		/*
5605 		 * Were we waiting for a mailbox command to complete?
5606 		 * If so, it's dead, so wake up the waiter.
5607 		 */
5608 		if (isp->isp_mboxbsy) {
5609 			isp->isp_obits = 1;
5610 			isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR;
5611 			MBOX_NOTIFY_COMPLETE(isp);
5612 		}
5613 		/*
5614 		 * It's up to the handler for isp_async to reinit stuff and
5615 		 * restart the firmware
5616 		 */
5617 		isp_async(isp, ISPASYNC_FW_CRASH);
5618 		acked = 1;
5619 		break;
5620 
5621 	case ASYNC_RQS_XFER_ERR:
5622 		isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
5623 		break;
5624 
5625 	case ASYNC_RSP_XFER_ERR:
5626 		isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
5627 		break;
5628 
5629 	case ASYNC_QWAKEUP:
5630 		/*
5631 		 * We've just been notified that the Queue has woken up.
5632 		 * We don't need to be chatty about this- just unlatch things
5633 		 * and move on.
5634 		 */
5635 		mbox = ISP_READ(isp, isp->isp_rqstoutrp);
5636 		break;
5637 
5638 	case ASYNC_TIMEOUT_RESET:
5639 		isp_prt(isp, ISP_LOGWARN, "timeout initiated SCSI bus reset of chan %d", chan);
5640 		ISP_SET_SENDMARKER(isp, chan, 1);
5641 #ifdef	ISP_TARGET_MODE
5642 		if (isp_target_async(isp, chan, mbox)) {
5643 			acked = 1;
5644 		}
5645 #endif
5646 		break;
5647 
5648 	case ASYNC_DEVICE_RESET:
5649 		isp_prt(isp, ISP_LOGINFO, "device reset on chan %d", chan);
5650 		ISP_SET_SENDMARKER(isp, chan, 1);
5651 #ifdef	ISP_TARGET_MODE
5652 		if (isp_target_async(isp, chan, mbox)) {
5653 			acked = 1;
5654 		}
5655 #endif
5656 		break;
5657 
5658 	case ASYNC_EXTMSG_UNDERRUN:
5659 		isp_prt(isp, ISP_LOGWARN, "extended message underrun");
5660 		break;
5661 
5662 	case ASYNC_SCAM_INT:
5663 		isp_prt(isp, ISP_LOGINFO, "SCAM interrupt");
5664 		break;
5665 
5666 	case ASYNC_HUNG_SCSI:
5667 		isp_prt(isp, ISP_LOGERR, "stalled SCSI Bus after DATA Overrun");
5668 		/* XXX: Need to issue SCSI reset at this point */
5669 		break;
5670 
5671 	case ASYNC_KILLED_BUS:
5672 		isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun");
5673 		break;
5674 
5675 	case ASYNC_BUS_TRANSIT:
5676 		mbox = ISP_READ(isp, OUTMAILBOX2);
5677 		switch (mbox & SXP_PINS_MODE_MASK) {
5678 		case SXP_PINS_LVD_MODE:
5679 			isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode");
5680 			SDPARAM(isp, chan)->isp_diffmode = 0;
5681 			SDPARAM(isp, chan)->isp_ultramode = 0;
5682 			SDPARAM(isp, chan)->isp_lvdmode = 1;
5683 			break;
5684 		case SXP_PINS_HVD_MODE:
5685 			isp_prt(isp, ISP_LOGINFO,
5686 			    "Transition to Differential mode");
5687 			SDPARAM(isp, chan)->isp_diffmode = 1;
5688 			SDPARAM(isp, chan)->isp_ultramode = 0;
5689 			SDPARAM(isp, chan)->isp_lvdmode = 0;
5690 			break;
5691 		case SXP_PINS_SE_MODE:
5692 			isp_prt(isp, ISP_LOGINFO,
5693 			    "Transition to Single Ended mode");
5694 			SDPARAM(isp, chan)->isp_diffmode = 0;
5695 			SDPARAM(isp, chan)->isp_ultramode = 1;
5696 			SDPARAM(isp, chan)->isp_lvdmode = 0;
5697 			break;
5698 		default:
5699 			isp_prt(isp, ISP_LOGWARN,
5700 			    "Transition to Unknown Mode 0x%x", mbox);
5701 			break;
5702 		}
5703 		/*
5704 		 * XXX: Set up to renegotiate again!
5705 		 */
5706 		/* Can only be for a 1080... */
5707 		ISP_SET_SENDMARKER(isp, chan, 1);
5708 		break;
5709 
5710 	case ASYNC_CMD_CMPLT:
5711 	case ASYNC_RIO32_1:
5712 		if (!IS_ULTRA3(isp)) {
5713 			isp_prt(isp, ISP_LOGERR, "unexpected fast posting completion");
5714 			break;
5715 		}
5716 		/* FALLTHROUGH */
5717 		h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1);
5718 		break;
5719 
5720 	case ASYNC_RIO32_2:
5721 		h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1);
5722 		h2 = (ISP_READ(isp, OUTMAILBOX7) << 16) | ISP_READ(isp, OUTMAILBOX6);
5723 		break;
5724 
5725 	case ASYNC_RIO16_5:
5726 	case ASYNC_RIO16_4:
5727 	case ASYNC_RIO16_3:
5728 	case ASYNC_RIO16_2:
5729 	case ASYNC_RIO16_1:
5730 		isp_prt(isp, ISP_LOGERR, "unexpected 16 bit RIO handle");
5731 		break;
5732 	default:
5733 		isp_prt(isp, ISP_LOGWARN, "%s: unhandled async code 0x%x", __func__, mbox);
5734 		break;
5735 	}
5736 
5737 	if (h1 || h2) {
5738 		isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h1);
5739 		isp_fastpost_complete(isp, h1);
5740 		if (h2) {
5741 			isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h2);
5742 			isp_fastpost_complete(isp, h2);
5743 			if (isp->isp_fpcchiwater < 2) {
5744 				isp->isp_fpcchiwater = 2;
5745 			}
5746 		} else {
5747 			if (isp->isp_fpcchiwater < 1) {
5748 				isp->isp_fpcchiwater = 1;
5749 			}
5750 		}
5751 	} else {
5752 		isp->isp_intoasync++;
5753 	}
5754 	return (acked);
5755 }
5756 
5757 static int
5758 isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
5759 {
5760 	fcparam *fcp;
5761 	int acked = 0;
5762 	uint16_t chan;
5763 
5764 	if (IS_DUALBUS(isp)) {
5765 		chan = ISP_READ(isp, OUTMAILBOX6);
5766 	} else {
5767 		chan = 0;
5768 	}
5769 	isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
5770 
5771 	switch (mbox) {
5772 	case ASYNC_SYSTEM_ERROR:
5773 		isp->isp_dead = 1;
5774 		isp->isp_state = ISP_CRASHED;
5775 		FCPARAM(isp, chan)->isp_loopstate = LOOP_NIL;
5776 		isp_change_fw_state(isp, chan, FW_CONFIG_WAIT);
5777 		/*
5778 		 * Were we waiting for a mailbox command to complete?
5779 		 * If so, it's dead, so wake up the waiter.
5780 		 */
5781 		if (isp->isp_mboxbsy) {
5782 			isp->isp_obits = 1;
5783 			isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR;
5784 			MBOX_NOTIFY_COMPLETE(isp);
5785 		}
5786 		/*
5787 		 * It's up to the handler for isp_async to reinit stuff and
5788 		 * restart the firmware
5789 		 */
5790 		isp_async(isp, ISPASYNC_FW_CRASH);
5791 		acked = 1;
5792 		break;
5793 
5794 	case ASYNC_RQS_XFER_ERR:
5795 		isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
5796 		break;
5797 
5798 	case ASYNC_RSP_XFER_ERR:
5799 		isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
5800 		break;
5801 
5802 	case ASYNC_QWAKEUP:
5803 #ifdef	ISP_TARGET_MODE
5804 		if (IS_24XX(isp)) {
5805 			isp_prt(isp, ISP_LOGERR, "ATIO Queue Transfer Error");
5806 			break;
5807 		}
5808 #endif
5809 		isp_prt(isp, ISP_LOGERR, "%s: unexpected ASYNC_QWAKEUP code", __func__);
5810 		break;
5811 
5812 	case ASYNC_CMD_CMPLT:
5813 		isp_fastpost_complete(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1));
5814 		if (isp->isp_fpcchiwater < 1) {
5815 			isp->isp_fpcchiwater = 1;
5816 		}
5817 		break;
5818 
5819 	case ASYNC_RIOZIO_STALL:
5820 		break;
5821 
5822 	case ASYNC_CTIO_DONE:
5823 #ifdef	ISP_TARGET_MODE
5824 		if (isp_target_async(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1), mbox)) {
5825 			acked = 1;
5826 		} else {
5827 			isp->isp_fphccmplt++;
5828 		}
5829 #else
5830 		isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC CTIO done");
5831 #endif
5832 		break;
5833 	case ASYNC_LIP_ERROR:
5834 	case ASYNC_LIP_NOS_OLS_RECV:
5835 	case ASYNC_LIP_OCCURRED:
5836 	case ASYNC_PTPMODE:
5837 		/*
5838 		 * These are broadcast events that have to be sent across
5839 		 * all active channels.
5840 		 */
5841 		for (chan = 0; chan < isp->isp_nchan; chan++) {
5842 			fcp = FCPARAM(isp, chan);
5843 			int topo = fcp->isp_topo;
5844 
5845 			if (fcp->role == ISP_ROLE_NONE)
5846 				continue;
5847 			if (fcp->isp_loopstate > LOOP_HAVE_LINK)
5848 				fcp->isp_loopstate = LOOP_HAVE_LINK;
5849 			ISP_SET_SENDMARKER(isp, chan, 1);
5850 			isp_async(isp, ISPASYNC_LIP, chan);
5851 #ifdef	ISP_TARGET_MODE
5852 			if (isp_target_async(isp, chan, mbox)) {
5853 				acked = 1;
5854 			}
5855 #endif
5856 			/*
5857 			 * We've had problems with data corruption occuring on
5858 			 * commands that complete (with no apparent error) after
5859 			 * we receive a LIP. This has been observed mostly on
5860 			 * Local Loop topologies. To be safe, let's just mark
5861 			 * all active initiator commands as dead.
5862 			 */
5863 			if (topo == TOPO_NL_PORT || topo == TOPO_FL_PORT) {
5864 				int i, j;
5865 				for (i = j = 0; i < isp->isp_maxcmds; i++) {
5866 					XS_T *xs;
5867 					isp_hdl_t *hdp;
5868 
5869 					hdp = &isp->isp_xflist[i];
5870 					if (ISP_H2HT(hdp->handle) != ISP_HANDLE_INITIATOR) {
5871 						continue;
5872 					}
5873 					xs = hdp->cmd;
5874 					if (XS_CHANNEL(xs) != chan) {
5875 						continue;
5876 					}
5877 					j++;
5878 					isp_prt(isp, ISP_LOG_WARN1,
5879 					    "%d.%d.%jx bus reset set at %s:%u",
5880 					    XS_CHANNEL(xs), XS_TGT(xs),
5881 					    (uintmax_t)XS_LUN(xs),
5882 					    __func__, __LINE__);
5883 					XS_SETERR(xs, HBA_BUSRESET);
5884 				}
5885 				if (j) {
5886 					isp_prt(isp, ISP_LOGERR, lipd, chan, j);
5887 				}
5888 			}
5889 		}
5890 		break;
5891 
5892 	case ASYNC_LOOP_UP:
5893 		/*
5894 		 * This is a broadcast event that has to be sent across
5895 		 * all active channels.
5896 		 */
5897 		for (chan = 0; chan < isp->isp_nchan; chan++) {
5898 			fcp = FCPARAM(isp, chan);
5899 			if (fcp->role == ISP_ROLE_NONE)
5900 				continue;
5901 			fcp->isp_linkstate = 1;
5902 			if (fcp->isp_loopstate < LOOP_HAVE_LINK)
5903 				fcp->isp_loopstate = LOOP_HAVE_LINK;
5904 			ISP_SET_SENDMARKER(isp, chan, 1);
5905 			isp_async(isp, ISPASYNC_LOOP_UP, chan);
5906 #ifdef	ISP_TARGET_MODE
5907 			if (isp_target_async(isp, chan, mbox)) {
5908 				acked = 1;
5909 			}
5910 #endif
5911 		}
5912 		break;
5913 
5914 	case ASYNC_LOOP_DOWN:
5915 		/*
5916 		 * This is a broadcast event that has to be sent across
5917 		 * all active channels.
5918 		 */
5919 		for (chan = 0; chan < isp->isp_nchan; chan++) {
5920 			fcp = FCPARAM(isp, chan);
5921 			if (fcp->role == ISP_ROLE_NONE)
5922 				continue;
5923 			ISP_SET_SENDMARKER(isp, chan, 1);
5924 			fcp->isp_linkstate = 0;
5925 			fcp->isp_loopstate = LOOP_NIL;
5926 			isp_async(isp, ISPASYNC_LOOP_DOWN, chan);
5927 #ifdef	ISP_TARGET_MODE
5928 			if (isp_target_async(isp, chan, mbox)) {
5929 				acked = 1;
5930 			}
5931 #endif
5932 		}
5933 		break;
5934 
5935 	case ASYNC_LOOP_RESET:
5936 		/*
5937 		 * This is a broadcast event that has to be sent across
5938 		 * all active channels.
5939 		 */
5940 		for (chan = 0; chan < isp->isp_nchan; chan++) {
5941 			fcp = FCPARAM(isp, chan);
5942 			if (fcp->role == ISP_ROLE_NONE)
5943 				continue;
5944 			ISP_SET_SENDMARKER(isp, chan, 1);
5945 			if (fcp->isp_loopstate > LOOP_HAVE_LINK)
5946 				fcp->isp_loopstate = LOOP_HAVE_LINK;
5947 			isp_async(isp, ISPASYNC_LOOP_RESET, chan);
5948 #ifdef	ISP_TARGET_MODE
5949 			if (isp_target_async(isp, chan, mbox)) {
5950 				acked = 1;
5951 			}
5952 #endif
5953 		}
5954 		break;
5955 
5956 	case ASYNC_PDB_CHANGED:
5957 	{
5958 		int echan, nphdl, nlstate, reason;
5959 
5960 		if (IS_23XX(isp) || IS_24XX(isp)) {
5961 			nphdl = ISP_READ(isp, OUTMAILBOX1);
5962 			nlstate = ISP_READ(isp, OUTMAILBOX2);
5963 		} else {
5964 			nphdl = nlstate = 0xffff;
5965 		}
5966 		if (IS_24XX(isp))
5967 			reason = ISP_READ(isp, OUTMAILBOX3) >> 8;
5968 		else
5969 			reason = 0xff;
5970 		if (ISP_CAP_MULTI_ID(isp)) {
5971 			chan = ISP_READ(isp, OUTMAILBOX3) & 0xff;
5972 			if (chan == 0xff || nphdl == NIL_HANDLE) {
5973 				chan = 0;
5974 				echan = isp->isp_nchan - 1;
5975 			} else if (chan >= isp->isp_nchan) {
5976 				break;
5977 			} else {
5978 				echan = chan;
5979 			}
5980 		} else {
5981 			chan = echan = 0;
5982 		}
5983 		for (; chan <= echan; chan++) {
5984 			fcp = FCPARAM(isp, chan);
5985 			if (fcp->role == ISP_ROLE_NONE)
5986 				continue;
5987 			if (fcp->isp_loopstate > LOOP_LTEST_DONE)
5988 				fcp->isp_loopstate = LOOP_LTEST_DONE;
5989 			else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
5990 				fcp->isp_loopstate = LOOP_HAVE_LINK;
5991 			isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
5992 			    ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason);
5993 		}
5994 		break;
5995 	}
5996 	case ASYNC_CHANGE_NOTIFY:
5997 	{
5998 		int portid;
5999 
6000 		portid = ((ISP_READ(isp, OUTMAILBOX1) & 0xff) << 16) |
6001 		    ISP_READ(isp, OUTMAILBOX2);
6002 		if (ISP_CAP_MULTI_ID(isp)) {
6003 			chan = ISP_READ(isp, OUTMAILBOX3) & 0xff;
6004 			if (chan >= isp->isp_nchan)
6005 				break;
6006 		} else {
6007 			chan = 0;
6008 		}
6009 		fcp = FCPARAM(isp, chan);
6010 		if (fcp->role == ISP_ROLE_NONE)
6011 			break;
6012 		if (fcp->isp_loopstate > LOOP_LTEST_DONE)
6013 			fcp->isp_loopstate = LOOP_LTEST_DONE;
6014 		else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
6015 			fcp->isp_loopstate = LOOP_HAVE_LINK;
6016 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
6017 		    ISPASYNC_CHANGE_SNS, portid);
6018 		break;
6019 	}
6020 	case ASYNC_ERR_LOGGING_DISABLED:
6021 		isp_prt(isp, ISP_LOGWARN, "Error logging disabled (reason 0x%x)",
6022 		    ISP_READ(isp, OUTMAILBOX1));
6023 		break;
6024 	case ASYNC_CONNMODE:
6025 		/*
6026 		 * This only applies to 2100 amd 2200 cards
6027 		 */
6028 		if (!IS_2200(isp) && !IS_2100(isp)) {
6029 			isp_prt(isp, ISP_LOGWARN, "bad card for ASYNC_CONNMODE event");
6030 			break;
6031 		}
6032 		chan = 0;
6033 		mbox = ISP_READ(isp, OUTMAILBOX1);
6034 		switch (mbox) {
6035 		case ISP_CONN_LOOP:
6036 			isp_prt(isp, ISP_LOGINFO,
6037 			    "Point-to-Point -> Loop mode");
6038 			break;
6039 		case ISP_CONN_PTP:
6040 			isp_prt(isp, ISP_LOGINFO,
6041 			    "Loop -> Point-to-Point mode");
6042 			break;
6043 		case ISP_CONN_BADLIP:
6044 			isp_prt(isp, ISP_LOGWARN,
6045 			    "Point-to-Point -> Loop mode (BAD LIP)");
6046 			break;
6047 		case ISP_CONN_FATAL:
6048 			isp->isp_dead = 1;
6049 			isp->isp_state = ISP_CRASHED;
6050 			isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR");
6051 			isp_async(isp, ISPASYNC_FW_CRASH);
6052 			return (-1);
6053 		case ISP_CONN_LOOPBACK:
6054 			isp_prt(isp, ISP_LOGWARN,
6055 			    "Looped Back in Point-to-Point mode");
6056 			break;
6057 		default:
6058 			isp_prt(isp, ISP_LOGWARN,
6059 			    "Unknown connection mode (0x%x)", mbox);
6060 			break;
6061 		}
6062 		ISP_SET_SENDMARKER(isp, chan, 1);
6063 		FCPARAM(isp, chan)->isp_loopstate = LOOP_HAVE_LINK;
6064 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, ISPASYNC_CHANGE_OTHER);
6065 		break;
6066 	case ASYNC_P2P_INIT_ERR:
6067 		isp_prt(isp, ISP_LOGWARN, "P2P init error (reason 0x%x)",
6068 		    ISP_READ(isp, OUTMAILBOX1));
6069 		break;
6070 	case ASYNC_RCV_ERR:
6071 		if (IS_24XX(isp)) {
6072 			isp_prt(isp, ISP_LOGWARN, "Receive Error");
6073 		} else {
6074 			isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC_RCV_ERR");
6075 		}
6076 		break;
6077 	case ASYNC_RJT_SENT:	/* same as ASYNC_QFULL_SENT */
6078 		if (IS_24XX(isp)) {
6079 			isp_prt(isp, ISP_LOGTDEBUG0, "LS_RJT sent");
6080 			break;
6081 		} else {
6082 			isp_prt(isp, ISP_LOGTDEBUG0, "QFULL sent");
6083 			break;
6084 		}
6085 	case ASYNC_FW_RESTART_COMPLETE:
6086 		isp_prt(isp, ISP_LOGDEBUG0, "FW restart complete");
6087 		break;
6088 	case ASYNC_TEMPERATURE_ALERT:
6089 		isp_prt(isp, ISP_LOGERR, "Temperature alert (subcode 0x%x)",
6090 		    ISP_READ(isp, OUTMAILBOX1));
6091 		break;
6092 	case ASYNC_AUTOLOAD_FW_COMPLETE:
6093 		isp_prt(isp, ISP_LOGDEBUG0, "Autoload FW init complete");
6094 		break;
6095 	case ASYNC_AUTOLOAD_FW_FAILURE:
6096 		isp_prt(isp, ISP_LOGERR, "Autoload FW init failure");
6097 		break;
6098 	default:
6099 		isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox);
6100 		break;
6101 	}
6102 	if (mbox != ASYNC_CTIO_DONE && mbox != ASYNC_CMD_CMPLT) {
6103 		isp->isp_intoasync++;
6104 	}
6105 	return (acked);
6106 }
6107 
6108 /*
6109  * Handle other response entries. A pointer to the request queue output
6110  * index is here in case we want to eat several entries at once, although
6111  * this is not used currently.
6112  */
6113 
6114 static int
6115 isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *optrp)
6116 {
6117 	isp_ridacq_t rid;
6118 	int chan, c;
6119 	uint32_t hdl;
6120 	void *ptr;
6121 
6122 	switch (type) {
6123 	case RQSTYPE_STATUS_CONT:
6124 		isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
6125 		return (1);
6126 	case RQSTYPE_MARKER:
6127 		isp_prt(isp, ISP_LOG_WARN1, "Marker Response");
6128 		return (1);
6129 	case RQSTYPE_RPT_ID_ACQ:
6130 		isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid);
6131 		if (rid.ridacq_format == 0) {
6132 			for (chan = 0; chan < isp->isp_nchan; chan++) {
6133 				fcparam *fcp = FCPARAM(isp, chan);
6134 				if (fcp->role == ISP_ROLE_NONE)
6135 					continue;
6136 				c = (chan == 0) ? 127 : (chan - 1);
6137 				if (rid.ridacq_map[c / 16] & (1 << (c % 16)) ||
6138 				    chan == 0) {
6139 					fcp->isp_loopstate = LOOP_HAVE_LINK;
6140 					isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
6141 					    chan, ISPASYNC_CHANGE_OTHER);
6142 				} else {
6143 					fcp->isp_loopstate = LOOP_NIL;
6144 					isp_async(isp, ISPASYNC_LOOP_DOWN,
6145 					    chan);
6146 				}
6147 			}
6148 		} else {
6149 			fcparam *fcp = FCPARAM(isp, rid.ridacq_vp_index);
6150 			if (rid.ridacq_vp_status == RIDACQ_STS_COMPLETE ||
6151 			    rid.ridacq_vp_status == RIDACQ_STS_CHANGED) {
6152 				fcp->isp_loopstate = LOOP_HAVE_LINK;
6153 				isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
6154 				    rid.ridacq_vp_index, ISPASYNC_CHANGE_OTHER);
6155 			} else {
6156 				fcp->isp_loopstate = LOOP_NIL;
6157 				isp_async(isp, ISPASYNC_LOOP_DOWN,
6158 				    rid.ridacq_vp_index);
6159 			}
6160 		}
6161 		return (1);
6162 	case RQSTYPE_VP_MODIFY:
6163 	case RQSTYPE_VP_CTRL:
6164 	case RQSTYPE_LOGIN:
6165 		ISP_IOXGET_32(isp, (uint32_t *)(hp + 1), hdl);
6166 		ptr = isp_find_xs(isp, hdl);
6167 		if (ptr != NULL) {
6168 			isp_destroy_handle(isp, hdl);
6169 			memcpy(ptr, hp, QENTRY_LEN);
6170 			wakeup(ptr);
6171 		}
6172 		return (1);
6173 	case RQSTYPE_ATIO:
6174 	case RQSTYPE_CTIO:
6175 	case RQSTYPE_ENABLE_LUN:
6176 	case RQSTYPE_MODIFY_LUN:
6177 	case RQSTYPE_NOTIFY:
6178 	case RQSTYPE_NOTIFY_ACK:
6179 	case RQSTYPE_CTIO1:
6180 	case RQSTYPE_ATIO2:
6181 	case RQSTYPE_CTIO2:
6182 	case RQSTYPE_CTIO3:
6183 	case RQSTYPE_CTIO7:
6184 	case RQSTYPE_ABTS_RCVD:
6185 	case RQSTYPE_ABTS_RSP:
6186 		isp->isp_rsltccmplt++;	/* count as a response completion */
6187 #ifdef	ISP_TARGET_MODE
6188 		if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) {
6189 			return (1);
6190 		}
6191 #endif
6192 		/* FALLTHROUGH */
6193 	case RQSTYPE_REQUEST:
6194 	default:
6195 		ISP_DELAY(100);
6196 		if (type != isp_get_response_type(isp, hp)) {
6197 			/*
6198 			 * This is questionable- we're just papering over
6199 			 * something we've seen on SMP linux in target
6200 			 * mode- we don't really know what's happening
6201 			 * here that causes us to think we've gotten
6202 			 * an entry, but that either the entry isn't
6203 			 * filled out yet or our CPU read data is stale.
6204 			 */
6205 			isp_prt(isp, ISP_LOGINFO,
6206 				"unstable type in response queue");
6207 			return (-1);
6208 		}
6209 		isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x",
6210 		    isp_get_response_type(isp, hp));
6211 		return (0);
6212 	}
6213 }
6214 
6215 static void
6216 isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
6217 {
6218 	switch (sp->req_completion_status & 0xff) {
6219 	case RQCS_COMPLETE:
6220 		if (XS_NOERR(xs)) {
6221 			XS_SETERR(xs, HBA_NOERROR);
6222 		}
6223 		return;
6224 
6225 	case RQCS_INCOMPLETE:
6226 		if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
6227 			isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Selection Timeout @ %s:%d", __func__, __LINE__);
6228 			if (XS_NOERR(xs)) {
6229 				XS_SETERR(xs, HBA_SELTIMEOUT);
6230 				*rp = XS_XFRLEN(xs);
6231 			}
6232 			return;
6233 		}
6234 		isp_xs_prt(isp, xs, ISP_LOGERR, "Command Incomplete, state 0x%x", sp->req_state_flags);
6235 		break;
6236 
6237 	case RQCS_DMA_ERROR:
6238 		isp_xs_prt(isp, xs, ISP_LOGERR, "DMA Error");
6239 		*rp = XS_XFRLEN(xs);
6240 		break;
6241 
6242 	case RQCS_TRANSPORT_ERROR:
6243 	{
6244 		char buf[172];
6245 		ISP_SNPRINTF(buf, sizeof (buf), "states=>");
6246 		if (sp->req_state_flags & RQSF_GOT_BUS) {
6247 			ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_BUS", buf);
6248 		}
6249 		if (sp->req_state_flags & RQSF_GOT_TARGET) {
6250 			ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_TGT", buf);
6251 		}
6252 		if (sp->req_state_flags & RQSF_SENT_CDB) {
6253 			ISP_SNPRINTF(buf, sizeof (buf), "%s SENT_CDB", buf);
6254 		}
6255 		if (sp->req_state_flags & RQSF_XFRD_DATA) {
6256 			ISP_SNPRINTF(buf, sizeof (buf), "%s XFRD_DATA", buf);
6257 		}
6258 		if (sp->req_state_flags & RQSF_GOT_STATUS) {
6259 			ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_STS", buf);
6260 		}
6261 		if (sp->req_state_flags & RQSF_GOT_SENSE) {
6262 			ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_SNS", buf);
6263 		}
6264 		if (sp->req_state_flags & RQSF_XFER_COMPLETE) {
6265 			ISP_SNPRINTF(buf, sizeof (buf), "%s XFR_CMPLT", buf);
6266 		}
6267 		ISP_SNPRINTF(buf, sizeof (buf), "%s\nstatus=>", buf);
6268 		if (sp->req_status_flags & RQSTF_DISCONNECT) {
6269 			ISP_SNPRINTF(buf, sizeof (buf), "%s Disconnect", buf);
6270 		}
6271 		if (sp->req_status_flags & RQSTF_SYNCHRONOUS) {
6272 			ISP_SNPRINTF(buf, sizeof (buf), "%s Sync_xfr", buf);
6273 		}
6274 		if (sp->req_status_flags & RQSTF_PARITY_ERROR) {
6275 			ISP_SNPRINTF(buf, sizeof (buf), "%s Parity", buf);
6276 		}
6277 		if (sp->req_status_flags & RQSTF_BUS_RESET) {
6278 			ISP_SNPRINTF(buf, sizeof (buf), "%s Bus_Reset", buf);
6279 		}
6280 		if (sp->req_status_flags & RQSTF_DEVICE_RESET) {
6281 			ISP_SNPRINTF(buf, sizeof (buf), "%s Device_Reset", buf);
6282 		}
6283 		if (sp->req_status_flags & RQSTF_ABORTED) {
6284 			ISP_SNPRINTF(buf, sizeof (buf), "%s Aborted", buf);
6285 		}
6286 		if (sp->req_status_flags & RQSTF_TIMEOUT) {
6287 			ISP_SNPRINTF(buf, sizeof (buf), "%s Timeout", buf);
6288 		}
6289 		if (sp->req_status_flags & RQSTF_NEGOTIATION) {
6290 			ISP_SNPRINTF(buf, sizeof (buf), "%s Negotiation", buf);
6291 		}
6292 		isp_xs_prt(isp, xs,  ISP_LOGERR, "Transport Error: %s", buf);
6293 		*rp = XS_XFRLEN(xs);
6294 		break;
6295 	}
6296 	case RQCS_RESET_OCCURRED:
6297 	{
6298 		int chan;
6299 		isp_xs_prt(isp, xs, ISP_LOGWARN, "Bus Reset destroyed command");
6300 		for (chan = 0; chan < isp->isp_nchan; chan++) {
6301 			FCPARAM(isp, chan)->sendmarker = 1;
6302 		}
6303 		if (XS_NOERR(xs)) {
6304 			XS_SETERR(xs, HBA_BUSRESET);
6305 		}
6306 		*rp = XS_XFRLEN(xs);
6307 		return;
6308 	}
6309 	case RQCS_ABORTED:
6310 		isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
6311 		ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
6312 		if (XS_NOERR(xs)) {
6313 			XS_SETERR(xs, HBA_ABORTED);
6314 		}
6315 		return;
6316 
6317 	case RQCS_TIMEOUT:
6318 		isp_xs_prt(isp, xs, ISP_LOGWARN, "Command timed out");
6319 		/*
6320 	 	 * XXX: Check to see if we logged out of the device.
6321 		 */
6322 		if (XS_NOERR(xs)) {
6323 			XS_SETERR(xs, HBA_CMDTIMEOUT);
6324 		}
6325 		return;
6326 
6327 	case RQCS_DATA_OVERRUN:
6328 		XS_SET_RESID(xs, sp->req_resid);
6329 		isp_xs_prt(isp, xs, ISP_LOGERR, "data overrun (%ld)", (long) XS_GET_RESID(xs));
6330 		if (XS_NOERR(xs)) {
6331 			XS_SETERR(xs, HBA_DATAOVR);
6332 		}
6333 		return;
6334 
6335 	case RQCS_COMMAND_OVERRUN:
6336 		isp_xs_prt(isp, xs, ISP_LOGERR, "command overrun");
6337 		break;
6338 
6339 	case RQCS_STATUS_OVERRUN:
6340 		isp_xs_prt(isp, xs, ISP_LOGERR, "status overrun");
6341 		break;
6342 
6343 	case RQCS_BAD_MESSAGE:
6344 		isp_xs_prt(isp, xs, ISP_LOGERR, "msg not COMMAND COMPLETE after status");
6345 		break;
6346 
6347 	case RQCS_NO_MESSAGE_OUT:
6348 		isp_xs_prt(isp, xs, ISP_LOGERR, "No MESSAGE OUT phase after selection");
6349 		break;
6350 
6351 	case RQCS_EXT_ID_FAILED:
6352 		isp_xs_prt(isp, xs, ISP_LOGERR, "EXTENDED IDENTIFY failed");
6353 		break;
6354 
6355 	case RQCS_IDE_MSG_FAILED:
6356 		isp_xs_prt(isp, xs, ISP_LOGERR, "INITIATOR DETECTED ERROR rejected");
6357 		break;
6358 
6359 	case RQCS_ABORT_MSG_FAILED:
6360 		isp_xs_prt(isp, xs, ISP_LOGERR, "ABORT OPERATION rejected");
6361 		break;
6362 
6363 	case RQCS_REJECT_MSG_FAILED:
6364 		isp_xs_prt(isp, xs, ISP_LOGERR, "MESSAGE REJECT rejected");
6365 		break;
6366 
6367 	case RQCS_NOP_MSG_FAILED:
6368 		isp_xs_prt(isp, xs, ISP_LOGERR, "NOP rejected");
6369 		break;
6370 
6371 	case RQCS_PARITY_ERROR_MSG_FAILED:
6372 		isp_xs_prt(isp, xs, ISP_LOGERR, "MESSAGE PARITY ERROR rejected");
6373 		break;
6374 
6375 	case RQCS_DEVICE_RESET_MSG_FAILED:
6376 		isp_xs_prt(isp, xs, ISP_LOGWARN, "BUS DEVICE RESET rejected");
6377 		break;
6378 
6379 	case RQCS_ID_MSG_FAILED:
6380 		isp_xs_prt(isp, xs, ISP_LOGERR, "IDENTIFY rejected");
6381 		break;
6382 
6383 	case RQCS_UNEXP_BUS_FREE:
6384 		isp_xs_prt(isp, xs, ISP_LOGERR, "Unexpected Bus Free");
6385 		break;
6386 
6387 	case RQCS_DATA_UNDERRUN:
6388 	{
6389 		if (IS_FC(isp)) {
6390 			int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
6391 			if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) {
6392 				isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
6393 				if (XS_NOERR(xs)) {
6394 					XS_SETERR(xs, HBA_BOTCH);
6395 				}
6396 				return;
6397 			}
6398 		}
6399 		XS_SET_RESID(xs, sp->req_resid);
6400 		if (XS_NOERR(xs)) {
6401 			XS_SETERR(xs, HBA_NOERROR);
6402 		}
6403 		return;
6404 	}
6405 
6406 	case RQCS_XACT_ERR1:
6407 		isp_xs_prt(isp, xs, ISP_LOGERR, "HBA attempted queued transaction with disconnect not set");
6408 		break;
6409 
6410 	case RQCS_XACT_ERR2:
6411 		isp_xs_prt(isp, xs, ISP_LOGERR,
6412 		    "HBA attempted queued transaction to target routine %jx",
6413 		    (uintmax_t)XS_LUN(xs));
6414 		break;
6415 
6416 	case RQCS_XACT_ERR3:
6417 		isp_xs_prt(isp, xs, ISP_LOGERR, "HBA attempted queued cmd when queueing disabled");
6418 		break;
6419 
6420 	case RQCS_BAD_ENTRY:
6421 		isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected");
6422 		break;
6423 
6424 	case RQCS_QUEUE_FULL:
6425 		isp_xs_prt(isp, xs, ISP_LOG_WARN1, "internal queues full status 0x%x", *XS_STSP(xs));
6426 
6427 		/*
6428 		 * If QFULL or some other status byte is set, then this
6429 		 * isn't an error, per se.
6430 		 *
6431 		 * Unfortunately, some QLogic f/w writers have, in
6432 		 * some cases, ommitted to *set* status to QFULL.
6433 		 */
6434 #if	0
6435 		if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
6436 			XS_SETERR(xs, HBA_NOERROR);
6437 			return;
6438 		}
6439 
6440 #endif
6441 		*XS_STSP(xs) = SCSI_QFULL;
6442 		XS_SETERR(xs, HBA_NOERROR);
6443 		return;
6444 
6445 	case RQCS_PHASE_SKIPPED:
6446 		isp_xs_prt(isp, xs, ISP_LOGERR, "SCSI phase skipped");
6447 		break;
6448 
6449 	case RQCS_ARQS_FAILED:
6450 		isp_xs_prt(isp, xs, ISP_LOGERR, "Auto Request Sense Failed");
6451 		if (XS_NOERR(xs)) {
6452 			XS_SETERR(xs, HBA_ARQFAIL);
6453 		}
6454 		return;
6455 
6456 	case RQCS_WIDE_FAILED:
6457 		isp_xs_prt(isp, xs, ISP_LOGERR, "Wide Negotiation Failed");
6458 		if (IS_SCSI(isp)) {
6459 			sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
6460 			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE;
6461 			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
6462 			sdp->update = 1;
6463 		}
6464 		if (XS_NOERR(xs)) {
6465 			XS_SETERR(xs, HBA_NOERROR);
6466 		}
6467 		return;
6468 
6469 	case RQCS_SYNCXFER_FAILED:
6470 		isp_xs_prt(isp, xs, ISP_LOGERR, "SDTR Message Failed");
6471 		if (IS_SCSI(isp)) {
6472 			sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
6473 			sdp += XS_CHANNEL(xs);
6474 			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC;
6475 			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
6476 			sdp->update = 1;
6477 		}
6478 		break;
6479 
6480 	case RQCS_LVD_BUSERR:
6481 		isp_xs_prt(isp, xs, ISP_LOGERR, "Bad LVD condition");
6482 		break;
6483 
6484 	case RQCS_PORT_UNAVAILABLE:
6485 		/*
6486 		 * No such port on the loop. Moral equivalent of SELTIMEO
6487 		 */
6488 	case RQCS_PORT_LOGGED_OUT:
6489 	{
6490 		const char *reason;
6491 		uint8_t sts = sp->req_completion_status & 0xff;
6492 
6493 		/*
6494 		 * It was there (maybe)- treat as a selection timeout.
6495 		 */
6496 		if (sts == RQCS_PORT_UNAVAILABLE) {
6497 			reason = "unavailable";
6498 		} else {
6499 			reason = "logout";
6500 		}
6501 
6502 		isp_prt(isp, ISP_LOGINFO, "port %s for target %d", reason, XS_TGT(xs));
6503 
6504 		/*
6505 		 * If we're on a local loop, force a LIP (which is overkill)
6506 		 * to force a re-login of this unit. If we're on fabric,
6507 		 * then we'll have to log in again as a matter of course.
6508 		 */
6509 		if (FCPARAM(isp, 0)->isp_topo == TOPO_NL_PORT ||
6510 		    FCPARAM(isp, 0)->isp_topo == TOPO_FL_PORT) {
6511 			mbreg_t mbs;
6512 			MBSINIT(&mbs, MBOX_INIT_LIP, MBLOGALL, 0);
6513 			if (ISP_CAP_2KLOGIN(isp)) {
6514 				mbs.ibits = (1 << 10);
6515 			}
6516 			isp_mboxcmd_qnw(isp, &mbs, 1);
6517 		}
6518 		if (XS_NOERR(xs)) {
6519 			XS_SETERR(xs, HBA_SELTIMEOUT);
6520 		}
6521 		return;
6522 	}
6523 	case RQCS_PORT_CHANGED:
6524 		isp_prt(isp, ISP_LOGWARN, "port changed for target %d", XS_TGT(xs));
6525 		if (XS_NOERR(xs)) {
6526 			XS_SETERR(xs, HBA_SELTIMEOUT);
6527 		}
6528 		return;
6529 
6530 	case RQCS_PORT_BUSY:
6531 		isp_prt(isp, ISP_LOGWARN, "port busy for target %d", XS_TGT(xs));
6532 		if (XS_NOERR(xs)) {
6533 			XS_SETERR(xs, HBA_TGTBSY);
6534 		}
6535 		return;
6536 
6537 	default:
6538 		isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", sp->req_completion_status);
6539 		break;
6540 	}
6541 	if (XS_NOERR(xs)) {
6542 		XS_SETERR(xs, HBA_BOTCH);
6543 	}
6544 }
6545 
6546 static void
6547 isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *rp)
6548 {
6549 	int ru_marked, sv_marked;
6550 	int chan = XS_CHANNEL(xs);
6551 
6552 	switch (sp->req_completion_status) {
6553 	case RQCS_COMPLETE:
6554 		if (XS_NOERR(xs)) {
6555 			XS_SETERR(xs, HBA_NOERROR);
6556 		}
6557 		return;
6558 
6559 	case RQCS_DMA_ERROR:
6560 		isp_xs_prt(isp, xs, ISP_LOGERR, "DMA error");
6561 		break;
6562 
6563 	case RQCS_TRANSPORT_ERROR:
6564 		isp_xs_prt(isp, xs,  ISP_LOGERR, "Transport Error");
6565 		break;
6566 
6567 	case RQCS_RESET_OCCURRED:
6568 		isp_xs_prt(isp, xs, ISP_LOGWARN, "reset destroyed command");
6569 		FCPARAM(isp, chan)->sendmarker = 1;
6570 		if (XS_NOERR(xs)) {
6571 			XS_SETERR(xs, HBA_BUSRESET);
6572 		}
6573 		return;
6574 
6575 	case RQCS_ABORTED:
6576 		isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
6577 		FCPARAM(isp, chan)->sendmarker = 1;
6578 		if (XS_NOERR(xs)) {
6579 			XS_SETERR(xs, HBA_ABORTED);
6580 		}
6581 		return;
6582 
6583 	case RQCS_TIMEOUT:
6584 		isp_xs_prt(isp, xs, ISP_LOGWARN, "Command Timed Out");
6585 		if (XS_NOERR(xs)) {
6586 			XS_SETERR(xs, HBA_CMDTIMEOUT);
6587 		}
6588 		return;
6589 
6590 	case RQCS_DATA_OVERRUN:
6591 		XS_SET_RESID(xs, sp->req_resid);
6592 		isp_xs_prt(isp, xs, ISP_LOGERR, "Data Overrun");
6593 		if (XS_NOERR(xs)) {
6594 			XS_SETERR(xs, HBA_DATAOVR);
6595 		}
6596 		return;
6597 
6598 	case RQCS_24XX_DRE:	/* data reassembly error */
6599 		isp_prt(isp, ISP_LOGERR, "Chan %d data reassembly error for target %d", chan, XS_TGT(xs));
6600 		if (XS_NOERR(xs)) {
6601 			XS_SETERR(xs, HBA_ABORTED);
6602 		}
6603 		*rp = XS_XFRLEN(xs);
6604 		return;
6605 
6606 	case RQCS_24XX_TABORT:	/* aborted by target */
6607 		isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS", chan, XS_TGT(xs));
6608 		if (XS_NOERR(xs)) {
6609 			XS_SETERR(xs, HBA_ABORTED);
6610 		}
6611 		return;
6612 
6613 	case RQCS_DATA_UNDERRUN:
6614 		ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
6615 		/*
6616 		 * We can get an underrun w/o things being marked
6617 		 * if we got a non-zero status.
6618 		 */
6619 		sv_marked = (sp->req_scsi_status & (RQCS_SV|RQCS_RV)) != 0;
6620 		if ((ru_marked == 0 && sv_marked == 0) ||
6621 		    (sp->req_resid > XS_XFRLEN(xs))) {
6622 			isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
6623 			if (XS_NOERR(xs)) {
6624 				XS_SETERR(xs, HBA_BOTCH);
6625 			}
6626 			return;
6627 		}
6628 		XS_SET_RESID(xs, sp->req_resid);
6629 		isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
6630 		if (XS_NOERR(xs)) {
6631 			XS_SETERR(xs, HBA_NOERROR);
6632 		}
6633 		return;
6634 
6635 	case RQCS_PORT_UNAVAILABLE:
6636 		/*
6637 		 * No such port on the loop. Moral equivalent of SELTIMEO
6638 		 */
6639 	case RQCS_PORT_LOGGED_OUT:
6640 	{
6641 		const char *reason;
6642 		uint8_t sts = sp->req_completion_status & 0xff;
6643 
6644 		/*
6645 		 * It was there (maybe)- treat as a selection timeout.
6646 		 */
6647 		if (sts == RQCS_PORT_UNAVAILABLE) {
6648 			reason = "unavailable";
6649 		} else {
6650 			reason = "logout";
6651 		}
6652 
6653 		isp_prt(isp, ISP_LOGINFO, "Chan %d port %s for target %d",
6654 		    chan, reason, XS_TGT(xs));
6655 
6656 		/*
6657 		 * There is no MBOX_INIT_LIP for the 24XX.
6658 		 */
6659 		if (XS_NOERR(xs)) {
6660 			XS_SETERR(xs, HBA_SELTIMEOUT);
6661 		}
6662 		return;
6663 	}
6664 	case RQCS_PORT_CHANGED:
6665 		isp_prt(isp, ISP_LOGWARN, "port changed for target %d chan %d", XS_TGT(xs), chan);
6666 		if (XS_NOERR(xs)) {
6667 			XS_SETERR(xs, HBA_SELTIMEOUT);
6668 		}
6669 		return;
6670 
6671 
6672 	case RQCS_24XX_ENOMEM:	/* f/w resource unavailable */
6673 		isp_prt(isp, ISP_LOGWARN, "f/w resource unavailable for target %d chan %d", XS_TGT(xs), chan);
6674 		if (XS_NOERR(xs)) {
6675 			*XS_STSP(xs) = SCSI_BUSY;
6676 			XS_SETERR(xs, HBA_TGTBSY);
6677 		}
6678 		return;
6679 
6680 	case RQCS_24XX_TMO:	/* task management overrun */
6681 		isp_prt(isp, ISP_LOGWARN, "command for target %d overlapped task management for chan %d", XS_TGT(xs), chan);
6682 		if (XS_NOERR(xs)) {
6683 			*XS_STSP(xs) = SCSI_BUSY;
6684 			XS_SETERR(xs, HBA_TGTBSY);
6685 		}
6686 		return;
6687 
6688 	default:
6689 		isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, chan);
6690 		break;
6691 	}
6692 	if (XS_NOERR(xs)) {
6693 		XS_SETERR(xs, HBA_BOTCH);
6694 	}
6695 }
6696 
6697 static void
6698 isp_fastpost_complete(ispsoftc_t *isp, uint32_t fph)
6699 {
6700 	XS_T *xs;
6701 
6702 	if (fph == 0) {
6703 		return;
6704 	}
6705 	xs = isp_find_xs(isp, fph);
6706 	if (xs == NULL) {
6707 		isp_prt(isp, ISP_LOGWARN,
6708 		    "Command for fast post handle 0x%x not found", fph);
6709 		return;
6710 	}
6711 	isp_destroy_handle(isp, fph);
6712 
6713 	/*
6714 	 * Since we don't have a result queue entry item,
6715 	 * we must believe that SCSI status is zero and
6716 	 * that all data transferred.
6717 	 */
6718 	XS_SET_RESID(xs, 0);
6719 	*XS_STSP(xs) = SCSI_GOOD;
6720 	if (XS_XFRLEN(xs)) {
6721 		ISP_DMAFREE(isp, xs, fph);
6722 	}
6723 	if (isp->isp_nactive) {
6724 		isp->isp_nactive--;
6725 	}
6726 	isp->isp_fphccmplt++;
6727 	isp_done(xs);
6728 }
6729 
6730 static int
6731 isp_mbox_continue(ispsoftc_t *isp)
6732 {
6733 	mbreg_t mbs;
6734 	uint16_t *ptr;
6735 	uint32_t offset;
6736 
6737 	switch (isp->isp_lastmbxcmd) {
6738 	case MBOX_WRITE_RAM_WORD:
6739 	case MBOX_READ_RAM_WORD:
6740 	case MBOX_WRITE_RAM_WORD_EXTENDED:
6741 	case MBOX_READ_RAM_WORD_EXTENDED:
6742 		break;
6743 	default:
6744 		return (1);
6745 	}
6746 	if (isp->isp_mboxtmp[0] != MBOX_COMMAND_COMPLETE) {
6747 		isp->isp_mbxwrk0 = 0;
6748 		return (-1);
6749 	}
6750 
6751 	/*
6752 	 * Clear the previous interrupt.
6753 	 */
6754 	if (IS_24XX(isp)) {
6755 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
6756 	} else {
6757 		ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
6758 		ISP_WRITE(isp, BIU_SEMA, 0);
6759 	}
6760 
6761 	/*
6762 	 * Continue with next word.
6763 	 */
6764 	ISP_MEMZERO(&mbs, sizeof (mbs));
6765 	ptr = isp->isp_mbxworkp;
6766 	switch (isp->isp_lastmbxcmd) {
6767 	case MBOX_WRITE_RAM_WORD:
6768 		mbs.param[1] = isp->isp_mbxwrk1++;
6769 		mbs.param[2] = *ptr++;
6770 		break;
6771 	case MBOX_READ_RAM_WORD:
6772 		*ptr++ = isp->isp_mboxtmp[2];
6773 		mbs.param[1] = isp->isp_mbxwrk1++;
6774 		break;
6775 	case MBOX_WRITE_RAM_WORD_EXTENDED:
6776 		if (IS_24XX(isp)) {
6777 			uint32_t *lptr = (uint32_t *)ptr;
6778 			mbs.param[2] = lptr[0];
6779 			mbs.param[3] = lptr[0] >> 16;
6780 			lptr++;
6781 			ptr = (uint16_t *)lptr;
6782 		} else {
6783 			mbs.param[2] = *ptr++;
6784 		}
6785 		offset = isp->isp_mbxwrk1;
6786 		offset |= isp->isp_mbxwrk8 << 16;
6787 		mbs.param[1] = offset;
6788 		mbs.param[8] = offset >> 16;
6789 		offset++;
6790 		isp->isp_mbxwrk1 = offset;
6791 		isp->isp_mbxwrk8 = offset >> 16;
6792 		break;
6793 	case MBOX_READ_RAM_WORD_EXTENDED:
6794 		if (IS_24XX(isp)) {
6795 			uint32_t *lptr = (uint32_t *)ptr;
6796 			uint32_t val = isp->isp_mboxtmp[2];
6797 			val |= (isp->isp_mboxtmp[3]) << 16;
6798 			*lptr++ = val;
6799 			ptr = (uint16_t *)lptr;
6800 		} else {
6801 			*ptr++ = isp->isp_mboxtmp[2];
6802 		}
6803 		offset = isp->isp_mbxwrk1;
6804 		offset |= isp->isp_mbxwrk8 << 16;
6805 		mbs.param[1] = offset;
6806 		mbs.param[8] = offset >> 16;
6807 		offset++;
6808 		isp->isp_mbxwrk1 = offset;
6809 		isp->isp_mbxwrk8 = offset >> 16;
6810 		break;
6811 	}
6812 	isp->isp_mbxworkp = ptr;
6813 	isp->isp_mbxwrk0--;
6814 	mbs.param[0] = isp->isp_lastmbxcmd;
6815 	mbs.logval = MBLOGALL;
6816 	isp_mboxcmd_qnw(isp, &mbs, 0);
6817 	return (0);
6818 }
6819 
6820 #define	ISP_SCSI_IBITS(op)		(mbpscsi[((op)<<1)])
6821 #define	ISP_SCSI_OBITS(op)		(mbpscsi[((op)<<1) + 1])
6822 #define	ISP_SCSI_OPMAP(in, out)		in, out
6823 static const uint8_t mbpscsi[] = {
6824 	ISP_SCSI_OPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
6825 	ISP_SCSI_OPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
6826 	ISP_SCSI_OPMAP(0x03, 0x01),	/* 0x02: MBOX_EXEC_FIRMWARE */
6827 	ISP_SCSI_OPMAP(0x1f, 0x01),	/* 0x03: MBOX_DUMP_RAM */
6828 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
6829 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
6830 	ISP_SCSI_OPMAP(0x3f, 0x3f),	/* 0x06: MBOX_MAILBOX_REG_TEST */
6831 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
6832 	ISP_SCSI_OPMAP(0x01, 0x0f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
6833 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x09: */
6834 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x0a: */
6835 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x0b: */
6836 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x0c: */
6837 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x0d: */
6838 	ISP_SCSI_OPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
6839 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x0f: */
6840 	ISP_SCSI_OPMAP(0x1f, 0x1f),	/* 0x10: MBOX_INIT_REQ_QUEUE */
6841 	ISP_SCSI_OPMAP(0x3f, 0x3f),	/* 0x11: MBOX_INIT_RES_QUEUE */
6842 	ISP_SCSI_OPMAP(0x0f, 0x0f),	/* 0x12: MBOX_EXECUTE_IOCB */
6843 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
6844 	ISP_SCSI_OPMAP(0x01, 0x3f),	/* 0x14: MBOX_STOP_FIRMWARE */
6845 	ISP_SCSI_OPMAP(0x0f, 0x0f),	/* 0x15: MBOX_ABORT */
6846 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x16: MBOX_ABORT_DEVICE */
6847 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x17: MBOX_ABORT_TARGET */
6848 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x18: MBOX_BUS_RESET */
6849 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x19: MBOX_STOP_QUEUE */
6850 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x1a: MBOX_START_QUEUE */
6851 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
6852 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x1c: MBOX_ABORT_QUEUE */
6853 	ISP_SCSI_OPMAP(0x03, 0x4f),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
6854 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x1e: */
6855 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
6856 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x20: MBOX_GET_INIT_SCSI_ID */
6857 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x21: MBOX_GET_SELECT_TIMEOUT */
6858 	ISP_SCSI_OPMAP(0x01, 0xc7),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
6859 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x23: MBOX_GET_TAG_AGE_LIMIT */
6860 	ISP_SCSI_OPMAP(0x01, 0x03),	/* 0x24: MBOX_GET_CLOCK_RATE */
6861 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x25: MBOX_GET_ACT_NEG_STATE */
6862 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
6863 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x27: MBOX_GET_PCI_PARAMS */
6864 	ISP_SCSI_OPMAP(0x03, 0x4f),	/* 0x28: MBOX_GET_TARGET_PARAMS */
6865 	ISP_SCSI_OPMAP(0x03, 0x0f),	/* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
6866 	ISP_SCSI_OPMAP(0x01, 0x07),	/* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */
6867 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x2b: */
6868 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x2c: */
6869 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x2d: */
6870 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x2e: */
6871 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x2f: */
6872 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x30: MBOX_SET_INIT_SCSI_ID */
6873 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x31: MBOX_SET_SELECT_TIMEOUT */
6874 	ISP_SCSI_OPMAP(0xc7, 0xc7),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
6875 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x33: MBOX_SET_TAG_AGE_LIMIT */
6876 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x34: MBOX_SET_CLOCK_RATE */
6877 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x35: MBOX_SET_ACT_NEG_STATE */
6878 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
6879 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
6880 	ISP_SCSI_OPMAP(0x4f, 0x4f),	/* 0x38: MBOX_SET_TARGET_PARAMS */
6881 	ISP_SCSI_OPMAP(0x0f, 0x0f),	/* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
6882 	ISP_SCSI_OPMAP(0x07, 0x07),	/* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */
6883 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x3b: */
6884 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x3c: */
6885 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x3d: */
6886 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x3e: */
6887 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x3f: */
6888 	ISP_SCSI_OPMAP(0x01, 0x03),	/* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
6889 	ISP_SCSI_OPMAP(0x3f, 0x01),	/* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
6890 	ISP_SCSI_OPMAP(0x03, 0x07),	/* 0x42: MBOX_EXEC_BIOS_IOCB */
6891 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x43: */
6892 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x44: */
6893 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x45: SET SYSTEM PARAMETER */
6894 	ISP_SCSI_OPMAP(0x01, 0x03),	/* 0x46: GET SYSTEM PARAMETER */
6895 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x47: */
6896 	ISP_SCSI_OPMAP(0x01, 0xcf),	/* 0x48: GET SCAM CONFIGURATION */
6897 	ISP_SCSI_OPMAP(0xcf, 0xcf),	/* 0x49: SET SCAM CONFIGURATION */
6898 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x4a: MBOX_SET_FIRMWARE_FEATURES */
6899 	ISP_SCSI_OPMAP(0x01, 0x03),	/* 0x4b: MBOX_GET_FIRMWARE_FEATURES */
6900 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x4c: */
6901 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x4d: */
6902 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x4e: */
6903 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x4f: */
6904 	ISP_SCSI_OPMAP(0xdf, 0xdf),	/* 0x50: LOAD RAM A64 */
6905 	ISP_SCSI_OPMAP(0xdf, 0xdf),	/* 0x51: DUMP RAM A64 */
6906 	ISP_SCSI_OPMAP(0xdf, 0xff),	/* 0x52: INITIALIZE REQUEST QUEUE A64 */
6907 	ISP_SCSI_OPMAP(0xef, 0xff),	/* 0x53: INITIALIZE RESPONSE QUEUE A64 */
6908 	ISP_SCSI_OPMAP(0xcf, 0x01),	/* 0x54: EXECUCUTE COMMAND IOCB A64 */
6909 	ISP_SCSI_OPMAP(0x07, 0x01),	/* 0x55: ENABLE TARGET MODE */
6910 	ISP_SCSI_OPMAP(0x03, 0x0f),	/* 0x56: GET TARGET STATUS */
6911 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x57: */
6912 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x58: */
6913 	ISP_SCSI_OPMAP(0x00, 0x00),	/* 0x59: */
6914 	ISP_SCSI_OPMAP(0x03, 0x03),	/* 0x5a: SET DATA OVERRUN RECOVERY MODE */
6915 	ISP_SCSI_OPMAP(0x01, 0x03),	/* 0x5b: GET DATA OVERRUN RECOVERY MODE */
6916 	ISP_SCSI_OPMAP(0x0f, 0x0f),	/* 0x5c: SET HOST DATA */
6917 	ISP_SCSI_OPMAP(0x01, 0x01)	/* 0x5d: GET NOST DATA */
6918 };
6919 #define	MAX_SCSI_OPCODE	0x5d
6920 
6921 static const char *scsi_mbcmd_names[] = {
6922 	"NO-OP",
6923 	"LOAD RAM",
6924 	"EXEC FIRMWARE",
6925 	"DUMP RAM",
6926 	"WRITE RAM WORD",
6927 	"READ RAM WORD",
6928 	"MAILBOX REG TEST",
6929 	"VERIFY CHECKSUM",
6930 	"ABOUT FIRMWARE",
6931 	NULL,
6932 	NULL,
6933 	NULL,
6934 	NULL,
6935 	NULL,
6936 	"CHECK FIRMWARE",
6937 	NULL,
6938 	"INIT REQUEST QUEUE",
6939 	"INIT RESULT QUEUE",
6940 	"EXECUTE IOCB",
6941 	"WAKE UP",
6942 	"STOP FIRMWARE",
6943 	"ABORT",
6944 	"ABORT DEVICE",
6945 	"ABORT TARGET",
6946 	"BUS RESET",
6947 	"STOP QUEUE",
6948 	"START QUEUE",
6949 	"SINGLE STEP QUEUE",
6950 	"ABORT QUEUE",
6951 	"GET DEV QUEUE STATUS",
6952 	NULL,
6953 	"GET FIRMWARE STATUS",
6954 	"GET INIT SCSI ID",
6955 	"GET SELECT TIMEOUT",
6956 	"GET RETRY COUNT",
6957 	"GET TAG AGE LIMIT",
6958 	"GET CLOCK RATE",
6959 	"GET ACT NEG STATE",
6960 	"GET ASYNC DATA SETUP TIME",
6961 	"GET PCI PARAMS",
6962 	"GET TARGET PARAMS",
6963 	"GET DEV QUEUE PARAMS",
6964 	"GET RESET DELAY PARAMS",
6965 	NULL,
6966 	NULL,
6967 	NULL,
6968 	NULL,
6969 	NULL,
6970 	"SET INIT SCSI ID",
6971 	"SET SELECT TIMEOUT",
6972 	"SET RETRY COUNT",
6973 	"SET TAG AGE LIMIT",
6974 	"SET CLOCK RATE",
6975 	"SET ACT NEG STATE",
6976 	"SET ASYNC DATA SETUP TIME",
6977 	"SET PCI CONTROL PARAMS",
6978 	"SET TARGET PARAMS",
6979 	"SET DEV QUEUE PARAMS",
6980 	"SET RESET DELAY PARAMS",
6981 	NULL,
6982 	NULL,
6983 	NULL,
6984 	NULL,
6985 	NULL,
6986 	"RETURN BIOS BLOCK ADDR",
6987 	"WRITE FOUR RAM WORDS",
6988 	"EXEC BIOS IOCB",
6989 	NULL,
6990 	NULL,
6991 	"SET SYSTEM PARAMETER",
6992 	"GET SYSTEM PARAMETER",
6993 	NULL,
6994 	"GET SCAM CONFIGURATION",
6995 	"SET SCAM CONFIGURATION",
6996 	"SET FIRMWARE FEATURES",
6997 	"GET FIRMWARE FEATURES",
6998 	NULL,
6999 	NULL,
7000 	NULL,
7001 	NULL,
7002 	"LOAD RAM A64",
7003 	"DUMP RAM A64",
7004 	"INITIALIZE REQUEST QUEUE A64",
7005 	"INITIALIZE RESPONSE QUEUE A64",
7006 	"EXECUTE IOCB A64",
7007 	"ENABLE TARGET MODE",
7008 	"GET TARGET MODE STATE",
7009 	NULL,
7010 	NULL,
7011 	NULL,
7012 	"SET DATA OVERRUN RECOVERY MODE",
7013 	"GET DATA OVERRUN RECOVERY MODE",
7014 	"SET HOST DATA",
7015 	"GET NOST DATA",
7016 };
7017 
7018 #define	ISP_FC_IBITS(op)	((mbpfc[((op)<<3) + 0] << 24) | (mbpfc[((op)<<3) + 1] << 16) | (mbpfc[((op)<<3) + 2] << 8) | (mbpfc[((op)<<3) + 3]))
7019 #define	ISP_FC_OBITS(op)	((mbpfc[((op)<<3) + 4] << 24) | (mbpfc[((op)<<3) + 5] << 16) | (mbpfc[((op)<<3) + 6] << 8) | (mbpfc[((op)<<3) + 7]))
7020 
7021 #define	ISP_FC_OPMAP(in0, out0)							  0,   0,   0, in0,    0,    0,    0, out0
7022 #define	ISP_FC_OPMAP_HALF(in1, in0, out1, out0)					  0,   0, in1, in0,    0,    0, out1, out0
7023 #define	ISP_FC_OPMAP_FULL(in3, in2, in1, in0, out3, out2, out1, out0)		in3, in2, in1, in0, out3, out2, out1, out0
7024 static const uint32_t mbpfc[] = {
7025 	ISP_FC_OPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
7026 	ISP_FC_OPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
7027 	ISP_FC_OPMAP_HALF(0x07, 0xff, 0x00, 0x03),	/* 0x02: MBOX_EXEC_FIRMWARE */
7028 	ISP_FC_OPMAP(0xdf, 0x01),	/* 0x03: MBOX_DUMP_RAM */
7029 	ISP_FC_OPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
7030 	ISP_FC_OPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
7031 	ISP_FC_OPMAP_FULL(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff),	/* 0x06: MBOX_MAILBOX_REG_TEST */
7032 	ISP_FC_OPMAP(0x07, 0x07),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
7033 	ISP_FC_OPMAP_FULL(0x0, 0x0, 0x0, 0x01, 0x0, 0x3, 0x80, 0x7f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
7034 	ISP_FC_OPMAP(0xdf, 0x01),	/* 0x09: MBOX_LOAD_RISC_RAM_2100 */
7035 	ISP_FC_OPMAP(0xdf, 0x01),	/* 0x0a: DUMP RAM */
7036 	ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x01),	/* 0x0b: MBOX_LOAD_RISC_RAM */
7037 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x0c: */
7038 	ISP_FC_OPMAP_HALF(0x1, 0x0f, 0x0, 0x01),	/* 0x0d: MBOX_WRITE_RAM_WORD_EXTENDED */
7039 	ISP_FC_OPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
7040 	ISP_FC_OPMAP_HALF(0x1, 0x03, 0x0, 0x0d),	/* 0x0f: MBOX_READ_RAM_WORD_EXTENDED */
7041 	ISP_FC_OPMAP(0x1f, 0x11),	/* 0x10: MBOX_INIT_REQ_QUEUE */
7042 	ISP_FC_OPMAP(0x2f, 0x21),	/* 0x11: MBOX_INIT_RES_QUEUE */
7043 	ISP_FC_OPMAP(0x0f, 0x01),	/* 0x12: MBOX_EXECUTE_IOCB */
7044 	ISP_FC_OPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
7045 	ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x03),	/* 0x14: MBOX_STOP_FIRMWARE */
7046 	ISP_FC_OPMAP(0x4f, 0x01),	/* 0x15: MBOX_ABORT */
7047 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x16: MBOX_ABORT_DEVICE */
7048 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x17: MBOX_ABORT_TARGET */
7049 	ISP_FC_OPMAP(0x03, 0x03),	/* 0x18: MBOX_BUS_RESET */
7050 	ISP_FC_OPMAP(0x07, 0x05),	/* 0x19: MBOX_STOP_QUEUE */
7051 	ISP_FC_OPMAP(0x07, 0x05),	/* 0x1a: MBOX_START_QUEUE */
7052 	ISP_FC_OPMAP(0x07, 0x05),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
7053 	ISP_FC_OPMAP(0x07, 0x05),	/* 0x1c: MBOX_ABORT_QUEUE */
7054 	ISP_FC_OPMAP(0x07, 0x03),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
7055 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x1e: */
7056 	ISP_FC_OPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
7057 	ISP_FC_OPMAP_HALF(0x2, 0x01, 0x7e, 0xcf),	/* 0x20: MBOX_GET_LOOP_ID */
7058 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x21: */
7059 	ISP_FC_OPMAP(0x03, 0x4b),	/* 0x22: MBOX_GET_TIMEOUT_PARAMS */
7060 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x23: */
7061 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x24: */
7062 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x25: */
7063 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x26: */
7064 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x27: */
7065 	ISP_FC_OPMAP(0x01, 0x03),	/* 0x28: MBOX_GET_FIRMWARE_OPTIONS */
7066 	ISP_FC_OPMAP(0x03, 0x07),	/* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */
7067 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2a: */
7068 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2b: */
7069 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2c: */
7070 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2d: */
7071 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2e: */
7072 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x2f: */
7073 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x30: */
7074 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x31: */
7075 	ISP_FC_OPMAP(0x4b, 0x4b),	/* 0x32: MBOX_SET_TIMEOUT_PARAMS */
7076 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x33: */
7077 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x34: */
7078 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x35: */
7079 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x36: */
7080 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x37: */
7081 	ISP_FC_OPMAP(0x0f, 0x01),	/* 0x38: MBOX_SET_FIRMWARE_OPTIONS */
7082 	ISP_FC_OPMAP(0x0f, 0x07),	/* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */
7083 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3a: */
7084 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3b: */
7085 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3c: */
7086 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3d: */
7087 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3e: */
7088 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x3f: */
7089 	ISP_FC_OPMAP(0x03, 0x01),	/* 0x40: MBOX_LOOP_PORT_BYPASS */
7090 	ISP_FC_OPMAP(0x03, 0x01),	/* 0x41: MBOX_LOOP_PORT_ENABLE */
7091 	ISP_FC_OPMAP_HALF(0x0, 0x01, 0x3, 0xcf),	/* 0x42: MBOX_GET_RESOURCE_COUNT */
7092 	ISP_FC_OPMAP(0x01, 0x01),	/* 0x43: MBOX_REQUEST_OFFLINE_MODE */
7093 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x44: */
7094 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x45: */
7095 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x46: */
7096 	ISP_FC_OPMAP(0xcf, 0x03),	/* 0x47: GET PORT_DATABASE ENHANCED */
7097 	ISP_FC_OPMAP(0xcf, 0x0f),	/* 0x48: MBOX_INIT_FIRMWARE_MULTI_ID */
7098 	ISP_FC_OPMAP(0xcd, 0x01),	/* 0x49: MBOX_GET_VP_DATABASE */
7099 	ISP_FC_OPMAP_HALF(0x2, 0xcd, 0x0, 0x01),	/* 0x4a: MBOX_GET_VP_DATABASE_ENTRY */
7100 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x4b: */
7101 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x4c: */
7102 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x4d: */
7103 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x4e: */
7104 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x4f: */
7105 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x50: */
7106 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x51: */
7107 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x52: */
7108 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x53: */
7109 	ISP_FC_OPMAP(0xcf, 0x01),	/* 0x54: EXECUTE IOCB A64 */
7110 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x55: */
7111 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x56: */
7112 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x57: */
7113 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x58: */
7114 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x59: */
7115 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x5a: */
7116 	ISP_FC_OPMAP(0x03, 0x01),	/* 0x5b: MBOX_DRIVER_HEARTBEAT */
7117 	ISP_FC_OPMAP(0xcf, 0x01),	/* 0x5c: MBOX_FW_HEARTBEAT */
7118 	ISP_FC_OPMAP(0x07, 0x1f),	/* 0x5d: MBOX_GET_SET_DATA_RATE */
7119 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x5e: */
7120 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x5f: */
7121 	ISP_FC_OPMAP(0xcf, 0x0f),	/* 0x60: MBOX_INIT_FIRMWARE */
7122 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x61: */
7123 	ISP_FC_OPMAP(0x01, 0x01),	/* 0x62: MBOX_INIT_LIP */
7124 	ISP_FC_OPMAP(0xcd, 0x03),	/* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
7125 	ISP_FC_OPMAP(0xcf, 0x01),	/* 0x64: MBOX_GET_PORT_DB */
7126 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x65: MBOX_CLEAR_ACA */
7127 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x66: MBOX_TARGET_RESET */
7128 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x67: MBOX_CLEAR_TASK_SET */
7129 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x68: MBOX_ABORT_TASK_SET */
7130 	ISP_FC_OPMAP(0x01, 0x07),	/* 0x69: MBOX_GET_FW_STATE */
7131 	ISP_FC_OPMAP_HALF(0x6, 0x03, 0x0, 0xcf),	/* 0x6a: MBOX_GET_PORT_NAME */
7132 	ISP_FC_OPMAP(0xcf, 0x01),	/* 0x6b: MBOX_GET_LINK_STATUS */
7133 	ISP_FC_OPMAP(0x0f, 0x01),	/* 0x6c: MBOX_INIT_LIP_RESET */
7134 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x6d: */
7135 	ISP_FC_OPMAP(0xcf, 0x03),	/* 0x6e: MBOX_SEND_SNS */
7136 	ISP_FC_OPMAP(0x0f, 0x07),	/* 0x6f: MBOX_FABRIC_LOGIN */
7137 	ISP_FC_OPMAP_HALF(0x02, 0x03, 0x00, 0x03),	/* 0x70: MBOX_SEND_CHANGE_REQUEST */
7138 	ISP_FC_OPMAP(0x03, 0x03),	/* 0x71: MBOX_FABRIC_LOGOUT */
7139 	ISP_FC_OPMAP(0x0f, 0x0f),	/* 0x72: MBOX_INIT_LIP_LOGIN */
7140 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x73: */
7141 	ISP_FC_OPMAP(0x07, 0x01),	/* 0x74: LOGIN LOOP PORT */
7142 	ISP_FC_OPMAP_HALF(0x03, 0xcf, 0x00, 0x07),	/* 0x75: GET PORT/NODE NAME LIST */
7143 	ISP_FC_OPMAP(0x4f, 0x01),	/* 0x76: SET VENDOR ID */
7144 	ISP_FC_OPMAP(0xcd, 0x01),	/* 0x77: INITIALIZE IP MAILBOX */
7145 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x78: */
7146 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x79: */
7147 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x7a: */
7148 	ISP_FC_OPMAP(0x00, 0x00),	/* 0x7b: */
7149 	ISP_FC_OPMAP_HALF(0x03, 0x4f, 0x00, 0x07),	/* 0x7c: Get ID List */
7150 	ISP_FC_OPMAP(0xcf, 0x01),	/* 0x7d: SEND LFA */
7151 	ISP_FC_OPMAP(0x0f, 0x01)	/* 0x7e: LUN RESET */
7152 };
7153 #define	MAX_FC_OPCODE	0x7e
7154 /*
7155  * Footnotes
7156  *
7157  * (1): this sets bits 21..16 in mailbox register #8, which we nominally
7158  *	do not access at this time in the core driver. The caller is
7159  *	responsible for setting this register first (Gross!). The assumption
7160  *	is that we won't overflow.
7161  */
7162 
7163 static const char *fc_mbcmd_names[] = {
7164 	"NO-OP",			/* 00h */
7165 	"LOAD RAM",
7166 	"EXEC FIRMWARE",
7167 	"DUMP RAM",
7168 	"WRITE RAM WORD",
7169 	"READ RAM WORD",
7170 	"MAILBOX REG TEST",
7171 	"VERIFY CHECKSUM",
7172 	"ABOUT FIRMWARE",
7173 	"LOAD RAM (2100)",
7174 	"DUMP RAM",
7175 	"LOAD RISC RAM",
7176 	"DUMP RISC RAM",
7177 	"WRITE RAM WORD EXTENDED",
7178 	"CHECK FIRMWARE",
7179 	"READ RAM WORD EXTENDED",
7180 	"INIT REQUEST QUEUE",		/* 10h */
7181 	"INIT RESULT QUEUE",
7182 	"EXECUTE IOCB",
7183 	"WAKE UP",
7184 	"STOP FIRMWARE",
7185 	"ABORT",
7186 	"ABORT DEVICE",
7187 	"ABORT TARGET",
7188 	"BUS RESET",
7189 	"STOP QUEUE",
7190 	"START QUEUE",
7191 	"SINGLE STEP QUEUE",
7192 	"ABORT QUEUE",
7193 	"GET DEV QUEUE STATUS",
7194 	NULL,
7195 	"GET FIRMWARE STATUS",
7196 	"GET LOOP ID",			/* 20h */
7197 	NULL,
7198 	"GET TIMEOUT PARAMS",
7199 	NULL,
7200 	NULL,
7201 	NULL,
7202 	NULL,
7203 	NULL,
7204 	"GET FIRMWARE OPTIONS",
7205 	"GET PORT QUEUE PARAMS",
7206 	"GENERATE SYSTEM ERROR",
7207 	NULL,
7208 	NULL,
7209 	NULL,
7210 	NULL,
7211 	NULL,
7212 	"WRITE SFP",			/* 30h */
7213 	"READ SFP",
7214 	"SET TIMEOUT PARAMS",
7215 	NULL,
7216 	NULL,
7217 	NULL,
7218 	NULL,
7219 	NULL,
7220 	"SET FIRMWARE OPTIONS",
7221 	"SET PORT QUEUE PARAMS",
7222 	NULL,
7223 	"SET FC LED CONF",
7224 	NULL,
7225 	"RESTART NIC FIRMWARE",
7226 	"ACCESS CONTROL",
7227 	NULL,
7228 	"LOOP PORT BYPASS",		/* 40h */
7229 	"LOOP PORT ENABLE",
7230 	"GET RESOURCE COUNT",
7231 	"REQUEST NON PARTICIPATING MODE",
7232 	"DIAGNOSTIC ECHO TEST",
7233 	"DIAGNOSTIC LOOPBACK",
7234 	NULL,
7235 	"GET PORT DATABASE ENHANCED",
7236 	"INIT FIRMWARE MULTI ID",
7237 	"GET VP DATABASE",
7238 	"GET VP DATABASE ENTRY",
7239 	NULL,
7240 	NULL,
7241 	NULL,
7242 	NULL,
7243 	NULL,
7244 	"GET FCF LIST",			/* 50h */
7245 	"GET DCBX PARAMETERS",
7246 	NULL,
7247 	"HOST MEMORY COPY",
7248 	"EXECUTE IOCB A64",
7249 	NULL,
7250 	NULL,
7251 	"SEND RNID",
7252 	NULL,
7253 	"SET PARAMETERS",
7254 	"GET PARAMETERS",
7255 	"DRIVER HEARTBEAT",
7256 	"FIRMWARE HEARTBEAT",
7257 	"GET/SET DATA RATE",
7258 	"SEND RNFT",
7259 	NULL,
7260 	"INIT FIRMWARE",		/* 60h */
7261 	"GET INIT CONTROL BLOCK",
7262 	"INIT LIP",
7263 	"GET FC-AL POSITION MAP",
7264 	"GET PORT DATABASE",
7265 	"CLEAR ACA",
7266 	"TARGET RESET",
7267 	"CLEAR TASK SET",
7268 	"ABORT TASK SET",
7269 	"GET FW STATE",
7270 	"GET PORT NAME",
7271 	"GET LINK STATUS",
7272 	"INIT LIP RESET",
7273 	"GET LINK STATS & PRIVATE DATA CNTS",
7274 	"SEND SNS",
7275 	"FABRIC LOGIN",
7276 	"SEND CHANGE REQUEST",		/* 70h */
7277 	"FABRIC LOGOUT",
7278 	"INIT LIP LOGIN",
7279 	NULL,
7280 	"LOGIN LOOP PORT",
7281 	"GET PORT/NODE NAME LIST",
7282 	"SET VENDOR ID",
7283 	"INITIALIZE IP MAILBOX",
7284 	NULL,
7285 	NULL,
7286 	"GET XGMAC STATS",
7287 	NULL,
7288 	"GET ID LIST",
7289 	"SEND LFA",
7290 	"LUN RESET"
7291 };
7292 
7293 static void
7294 isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t *mbp, int nodelay)
7295 {
7296 	unsigned int ibits, obits, box, opcode;
7297 
7298 	opcode = mbp->param[0];
7299 	if (IS_FC(isp)) {
7300 		ibits = ISP_FC_IBITS(opcode);
7301 		obits = ISP_FC_OBITS(opcode);
7302 	} else {
7303 		ibits = ISP_SCSI_IBITS(opcode);
7304 		obits = ISP_SCSI_OBITS(opcode);
7305 	}
7306 	ibits |= mbp->ibits;
7307 	obits |= mbp->obits;
7308 	for (box = 0; box < ISP_NMBOX(isp); box++) {
7309 		if (ibits & (1 << box)) {
7310 			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
7311 		}
7312 		if (nodelay == 0) {
7313 			isp->isp_mboxtmp[box] = mbp->param[box] = 0;
7314 		}
7315 	}
7316 	if (nodelay == 0) {
7317 		isp->isp_lastmbxcmd = opcode;
7318 		isp->isp_obits = obits;
7319 		isp->isp_mboxbsy = 1;
7320 	}
7321 	if (IS_24XX(isp)) {
7322 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_SET_HOST_INT);
7323 	} else {
7324 		ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
7325 	}
7326 	/*
7327 	 * Oddly enough, if we're not delaying for an answer,
7328 	 * delay a bit to give the f/w a chance to pick up the
7329 	 * command.
7330 	 */
7331 	if (nodelay) {
7332 		ISP_DELAY(1000);
7333 	}
7334 }
7335 
7336 static void
7337 isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
7338 {
7339 	const char *cname, *xname, *sname;
7340 	char tname[16], mname[16];
7341 	unsigned int ibits, obits, box, opcode;
7342 
7343 	opcode = mbp->param[0];
7344 	if (IS_FC(isp)) {
7345 		if (opcode > MAX_FC_OPCODE) {
7346 			mbp->param[0] = MBOX_INVALID_COMMAND;
7347 			isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
7348 			return;
7349 		}
7350 		cname = fc_mbcmd_names[opcode];
7351 		ibits = ISP_FC_IBITS(opcode);
7352 		obits = ISP_FC_OBITS(opcode);
7353 	} else {
7354 		if (opcode > MAX_SCSI_OPCODE) {
7355 			mbp->param[0] = MBOX_INVALID_COMMAND;
7356 			isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
7357 			return;
7358 		}
7359 		cname = scsi_mbcmd_names[opcode];
7360 		ibits = ISP_SCSI_IBITS(opcode);
7361 		obits = ISP_SCSI_OBITS(opcode);
7362 	}
7363 	if (cname == NULL) {
7364 		cname = tname;
7365 		ISP_SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
7366 	}
7367 	isp_prt(isp, ISP_LOGDEBUG3, "Mailbox Command '%s'", cname);
7368 
7369 	/*
7370 	 * Pick up any additional bits that the caller might have set.
7371 	 */
7372 	ibits |= mbp->ibits;
7373 	obits |= mbp->obits;
7374 
7375 	/*
7376 	 * Mask any bits that the caller wants us to mask
7377 	 */
7378 	ibits &= mbp->ibitm;
7379 	obits &= mbp->obitm;
7380 
7381 
7382 	if (ibits == 0 && obits == 0) {
7383 		mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
7384 		isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
7385 		return;
7386 	}
7387 
7388 	/*
7389 	 * Get exclusive usage of mailbox registers.
7390 	 */
7391 	if (MBOX_ACQUIRE(isp)) {
7392 		mbp->param[0] = MBOX_REGS_BUSY;
7393 		goto out;
7394 	}
7395 
7396 	for (box = 0; box < ISP_NMBOX(isp); box++) {
7397 		if (ibits & (1 << box)) {
7398 			isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box,
7399 			    mbp->param[box]);
7400 			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
7401 		}
7402 		isp->isp_mboxtmp[box] = mbp->param[box] = 0;
7403 	}
7404 
7405 	isp->isp_lastmbxcmd = opcode;
7406 
7407 	/*
7408 	 * We assume that we can't overwrite a previous command.
7409 	 */
7410 	isp->isp_obits = obits;
7411 	isp->isp_mboxbsy = 1;
7412 
7413 	/*
7414 	 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
7415 	 */
7416 	if (IS_24XX(isp)) {
7417 		ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_SET_HOST_INT);
7418 	} else {
7419 		ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
7420 	}
7421 
7422 	/*
7423 	 * While we haven't finished the command, spin our wheels here.
7424 	 */
7425 	MBOX_WAIT_COMPLETE(isp, mbp);
7426 
7427 	/*
7428 	 * Did the command time out?
7429 	 */
7430 	if (mbp->param[0] == MBOX_TIMEOUT) {
7431 		isp->isp_mboxbsy = 0;
7432 		MBOX_RELEASE(isp);
7433 		goto out;
7434 	}
7435 
7436 	/*
7437 	 * Copy back output registers.
7438 	 */
7439 	for (box = 0; box < ISP_NMBOX(isp); box++) {
7440 		if (obits & (1 << box)) {
7441 			mbp->param[box] = isp->isp_mboxtmp[box];
7442 			isp_prt(isp, ISP_LOGDEBUG3, "OUT mbox %d = 0x%04x", box,
7443 			    mbp->param[box]);
7444 		}
7445 	}
7446 
7447 	isp->isp_mboxbsy = 0;
7448 	MBOX_RELEASE(isp);
7449 out:
7450 	if (mbp->logval == 0 || mbp->param[0] == MBOX_COMMAND_COMPLETE)
7451 		return;
7452 
7453 	if ((mbp->param[0] & 0xbfe0) == 0 &&
7454 	    (mbp->logval & MBLOGMASK(mbp->param[0])) == 0)
7455 		return;
7456 
7457 	xname = NULL;
7458 	sname = "";
7459 	switch (mbp->param[0]) {
7460 	case MBOX_INVALID_COMMAND:
7461 		xname = "INVALID COMMAND";
7462 		break;
7463 	case MBOX_HOST_INTERFACE_ERROR:
7464 		xname = "HOST INTERFACE ERROR";
7465 		break;
7466 	case MBOX_TEST_FAILED:
7467 		xname = "TEST FAILED";
7468 		break;
7469 	case MBOX_COMMAND_ERROR:
7470 		xname = "COMMAND ERROR";
7471 		ISP_SNPRINTF(mname, sizeof(mname), " subcode 0x%x",
7472 		    mbp->param[1]);
7473 		sname = mname;
7474 		break;
7475 	case MBOX_COMMAND_PARAM_ERROR:
7476 		xname = "COMMAND PARAMETER ERROR";
7477 		break;
7478 	case MBOX_PORT_ID_USED:
7479 		xname = "PORT ID ALREADY IN USE";
7480 		break;
7481 	case MBOX_LOOP_ID_USED:
7482 		xname = "LOOP ID ALREADY IN USE";
7483 		break;
7484 	case MBOX_ALL_IDS_USED:
7485 		xname = "ALL LOOP IDS IN USE";
7486 		break;
7487 	case MBOX_NOT_LOGGED_IN:
7488 		xname = "NOT LOGGED IN";
7489 		break;
7490 	case MBOX_LINK_DOWN_ERROR:
7491 		xname = "LINK DOWN ERROR";
7492 		break;
7493 	case MBOX_LOOPBACK_ERROR:
7494 		xname = "LOOPBACK ERROR";
7495 		break;
7496 	case MBOX_CHECKSUM_ERROR:
7497 		xname = "CHECKSUM ERROR";
7498 		break;
7499 	case MBOX_INVALID_PRODUCT_KEY:
7500 		xname = "INVALID PRODUCT KEY";
7501 		break;
7502 	case MBOX_REGS_BUSY:
7503 		xname = "REGISTERS BUSY";
7504 		break;
7505 	case MBOX_TIMEOUT:
7506 		xname = "TIMEOUT";
7507 		break;
7508 	default:
7509 		ISP_SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]);
7510 		xname = mname;
7511 		break;
7512 	}
7513 	if (xname) {
7514 		isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s%s)",
7515 		    cname, xname, sname);
7516 	}
7517 }
7518 
7519 static int
7520 isp_fw_state(ispsoftc_t *isp, int chan)
7521 {
7522 	if (IS_FC(isp)) {
7523 		mbreg_t mbs;
7524 
7525 		MBSINIT(&mbs, MBOX_GET_FW_STATE, MBLOGALL, 0);
7526 		isp_mboxcmd(isp, &mbs);
7527 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
7528 			return (mbs.param[1]);
7529 		}
7530 	}
7531 	return (FW_ERROR);
7532 }
7533 
7534 static void
7535 isp_spi_update(ispsoftc_t *isp, int chan)
7536 {
7537 	int tgt;
7538 	mbreg_t mbs;
7539 	sdparam *sdp;
7540 
7541 	if (IS_FC(isp)) {
7542 		/*
7543 		 * There are no 'per-bus' settings for Fibre Channel.
7544 		 */
7545 		return;
7546 	}
7547 	sdp = SDPARAM(isp, chan);
7548 	sdp->update = 0;
7549 
7550 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7551 		uint16_t flags, period, offset;
7552 		int get;
7553 
7554 		if (sdp->isp_devparam[tgt].dev_enable == 0) {
7555 			sdp->isp_devparam[tgt].dev_update = 0;
7556 			sdp->isp_devparam[tgt].dev_refresh = 0;
7557 			isp_prt(isp, ISP_LOGDEBUG0, "skipping target %d bus %d update", tgt, chan);
7558 			continue;
7559 		}
7560 		/*
7561 		 * If the goal is to update the status of the device,
7562 		 * take what's in goal_flags and try and set the device
7563 		 * toward that. Otherwise, if we're just refreshing the
7564 		 * current device state, get the current parameters.
7565 		 */
7566 
7567 		MBSINIT(&mbs, 0, MBLOGALL, 0);
7568 
7569 		/*
7570 		 * Refresh overrides set
7571 		 */
7572 		if (sdp->isp_devparam[tgt].dev_refresh) {
7573 			mbs.param[0] = MBOX_GET_TARGET_PARAMS;
7574 			get = 1;
7575 		} else if (sdp->isp_devparam[tgt].dev_update) {
7576 			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
7577 
7578 			/*
7579 			 * Make sure goal_flags has "Renegotiate on Error"
7580 			 * on and "Freeze Queue on Error" off.
7581 			 */
7582 			sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG;
7583 			sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ;
7584 			mbs.param[2] = sdp->isp_devparam[tgt].goal_flags;
7585 
7586 			/*
7587 			 * Insist that PARITY must be enabled
7588 			 * if SYNC or WIDE is enabled.
7589 			 */
7590 			if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) {
7591 				mbs.param[2] |= DPARM_PARITY;
7592 			}
7593 
7594 			if (mbs.param[2] & DPARM_SYNC) {
7595 				mbs.param[3] =
7596 				    (sdp->isp_devparam[tgt].goal_offset << 8) |
7597 				    (sdp->isp_devparam[tgt].goal_period);
7598 			}
7599 			/*
7600 			 * A command completion later that has
7601 			 * RQSTF_NEGOTIATION set can cause
7602 			 * the dev_refresh/announce cycle also.
7603 			 *
7604 			 * Note: It is really important to update our current
7605 			 * flags with at least the state of TAG capabilities-
7606 			 * otherwise we might try and send a tagged command
7607 			 * when we have it all turned off. So change it here
7608 			 * to say that current already matches goal.
7609 			 */
7610 			sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING;
7611 			sdp->isp_devparam[tgt].actv_flags |=
7612 			    (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING);
7613 			isp_prt(isp, ISP_LOGDEBUG0, "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
7614 			    chan, tgt, mbs.param[2], mbs.param[3] >> 8, mbs.param[3] & 0xff);
7615 			get = 0;
7616 		} else {
7617 			continue;
7618 		}
7619 		mbs.param[1] = (chan << 15) | (tgt << 8);
7620 		isp_mboxcmd(isp, &mbs);
7621 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
7622 			continue;
7623 		}
7624 		if (get == 0) {
7625 			sdp->sendmarker = 1;
7626 			sdp->isp_devparam[tgt].dev_update = 0;
7627 			sdp->isp_devparam[tgt].dev_refresh = 1;
7628 		} else {
7629 			sdp->isp_devparam[tgt].dev_refresh = 0;
7630 			flags = mbs.param[2];
7631 			period = mbs.param[3] & 0xff;
7632 			offset = mbs.param[3] >> 8;
7633 			sdp->isp_devparam[tgt].actv_flags = flags;
7634 			sdp->isp_devparam[tgt].actv_period = period;
7635 			sdp->isp_devparam[tgt].actv_offset = offset;
7636 			isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, chan, tgt);
7637 		}
7638 	}
7639 
7640 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7641 		if (sdp->isp_devparam[tgt].dev_update ||
7642 		    sdp->isp_devparam[tgt].dev_refresh) {
7643 			sdp->update = 1;
7644 			break;
7645 		}
7646 	}
7647 }
7648 
7649 static void
7650 isp_setdfltsdparm(ispsoftc_t *isp)
7651 {
7652 	int tgt;
7653 	sdparam *sdp, *sdp1;
7654 
7655 	sdp = SDPARAM(isp, 0);
7656 	if (IS_DUALBUS(isp))
7657 		sdp1 = sdp + 1;
7658 	else
7659 		sdp1 = NULL;
7660 
7661 	/*
7662 	 * Establish some default parameters.
7663 	 */
7664 	sdp->isp_cmd_dma_burst_enable = 0;
7665 	sdp->isp_data_dma_burst_enabl = 1;
7666 	sdp->isp_fifo_threshold = 0;
7667 	sdp->isp_initiator_id = DEFAULT_IID(isp, 0);
7668 	if (isp->isp_type >= ISP_HA_SCSI_1040) {
7669 		sdp->isp_async_data_setup = 9;
7670 	} else {
7671 		sdp->isp_async_data_setup = 6;
7672 	}
7673 	sdp->isp_selection_timeout = 250;
7674 	sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
7675 	sdp->isp_tag_aging = 8;
7676 	sdp->isp_bus_reset_delay = 5;
7677 	/*
7678 	 * Don't retry selection, busy or queue full automatically- reflect
7679 	 * these back to us.
7680 	 */
7681 	sdp->isp_retry_count = 0;
7682 	sdp->isp_retry_delay = 0;
7683 
7684 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7685 		sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
7686 		sdp->isp_devparam[tgt].dev_enable = 1;
7687 	}
7688 
7689 	/*
7690 	 * The trick here is to establish a default for the default (honk!)
7691 	 * state (goal_flags). Then try and get the current status from
7692 	 * the card to fill in the current state. We don't, in fact, set
7693 	 * the default to the SAFE default state- that's not the goal state.
7694 	 */
7695 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7696 		uint8_t off, per;
7697 		sdp->isp_devparam[tgt].actv_offset = 0;
7698 		sdp->isp_devparam[tgt].actv_period = 0;
7699 		sdp->isp_devparam[tgt].actv_flags = 0;
7700 
7701 		sdp->isp_devparam[tgt].goal_flags =
7702 		    sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT;
7703 
7704 		/*
7705 		 * We default to Wide/Fast for versions less than a 1040
7706 		 * (unless it's SBus).
7707 		 */
7708 		if (IS_ULTRA3(isp)) {
7709 			off = ISP_80M_SYNCPARMS >> 8;
7710 			per = ISP_80M_SYNCPARMS & 0xff;
7711 		} else if (IS_ULTRA2(isp)) {
7712 			off = ISP_40M_SYNCPARMS >> 8;
7713 			per = ISP_40M_SYNCPARMS & 0xff;
7714 		} else if (IS_1240(isp)) {
7715 			off = ISP_20M_SYNCPARMS >> 8;
7716 			per = ISP_20M_SYNCPARMS & 0xff;
7717 		} else if ((isp->isp_bustype == ISP_BT_SBUS &&
7718 		    isp->isp_type < ISP_HA_SCSI_1020A) ||
7719 		    (isp->isp_bustype == ISP_BT_PCI &&
7720 		    isp->isp_type < ISP_HA_SCSI_1040) ||
7721 		    (isp->isp_clock && isp->isp_clock < 60) ||
7722 		    (sdp->isp_ultramode == 0)) {
7723 			off = ISP_10M_SYNCPARMS >> 8;
7724 			per = ISP_10M_SYNCPARMS & 0xff;
7725 		} else {
7726 			off = ISP_20M_SYNCPARMS_1040 >> 8;
7727 			per = ISP_20M_SYNCPARMS_1040 & 0xff;
7728 		}
7729 		sdp->isp_devparam[tgt].goal_offset =
7730 		    sdp->isp_devparam[tgt].nvrm_offset = off;
7731 		sdp->isp_devparam[tgt].goal_period =
7732 		    sdp->isp_devparam[tgt].nvrm_period = per;
7733 
7734 	}
7735 
7736 	/*
7737 	 * If we're a dual bus card, just copy the data over
7738 	 */
7739 	if (sdp1) {
7740 		*sdp1 = *sdp;
7741 		sdp1->isp_initiator_id = DEFAULT_IID(isp, 1);
7742 	}
7743 
7744 	/*
7745 	 * If we've not been told to avoid reading NVRAM, try and read it.
7746 	 * If we're successful reading it, we can then return because NVRAM
7747 	 * will tell us what the desired settings are. Otherwise, we establish
7748 	 * some reasonable 'fake' nvram and goal defaults.
7749 	 */
7750 	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
7751 		mbreg_t mbs;
7752 
7753 		if (isp_read_nvram(isp, 0) == 0) {
7754 			if (IS_DUALBUS(isp)) {
7755 				if (isp_read_nvram(isp, 1) == 0) {
7756 					return;
7757 				}
7758 			}
7759 		}
7760 		MBSINIT(&mbs, MBOX_GET_ACT_NEG_STATE, MBLOGNONE, 0);
7761 		isp_mboxcmd(isp, &mbs);
7762 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
7763 			sdp->isp_req_ack_active_neg = 1;
7764 			sdp->isp_data_line_active_neg = 1;
7765 			if (sdp1) {
7766 				sdp1->isp_req_ack_active_neg = 1;
7767 				sdp1->isp_data_line_active_neg = 1;
7768 			}
7769 		} else {
7770 			sdp->isp_req_ack_active_neg =
7771 			    (mbs.param[1] >> 4) & 0x1;
7772 			sdp->isp_data_line_active_neg =
7773 			    (mbs.param[1] >> 5) & 0x1;
7774 			if (sdp1) {
7775 				sdp1->isp_req_ack_active_neg =
7776 				    (mbs.param[2] >> 4) & 0x1;
7777 				sdp1->isp_data_line_active_neg =
7778 				    (mbs.param[2] >> 5) & 0x1;
7779 			}
7780 		}
7781 	}
7782 
7783 }
7784 
7785 static void
7786 isp_setdfltfcparm(ispsoftc_t *isp, int chan)
7787 {
7788 	fcparam *fcp = FCPARAM(isp, chan);
7789 
7790 	/*
7791 	 * Establish some default parameters.
7792 	 */
7793 	fcp->role = DEFAULT_ROLE(isp, chan);
7794 	fcp->isp_maxalloc = ICB_DFLT_ALLOC;
7795 	fcp->isp_retry_delay = ICB_DFLT_RDELAY;
7796 	fcp->isp_retry_count = ICB_DFLT_RCOUNT;
7797 	fcp->isp_loopid = DEFAULT_LOOPID(isp, chan);
7798 	fcp->isp_wwnn_nvram = DEFAULT_NODEWWN(isp, chan);
7799 	fcp->isp_wwpn_nvram = DEFAULT_PORTWWN(isp, chan);
7800 	fcp->isp_fwoptions = 0;
7801 	fcp->isp_xfwoptions = 0;
7802 	fcp->isp_zfwoptions = 0;
7803 	fcp->isp_lasthdl = NIL_HANDLE;
7804 
7805 	if (IS_24XX(isp)) {
7806 		fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS;
7807 		fcp->isp_fwoptions |= ICB2400_OPT1_HARD_ADDRESS;
7808 		if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
7809 			fcp->isp_fwoptions |= ICB2400_OPT1_FULL_DUPLEX;
7810 		}
7811 		fcp->isp_fwoptions |= ICB2400_OPT1_BOTH_WWNS;
7812 		fcp->isp_zfwoptions |= ICB2400_OPT3_RATE_AUTO;
7813 	} else {
7814 		fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
7815 		fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
7816 		fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
7817 		if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
7818 			fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
7819 		}
7820 		/*
7821 		 * Make sure this is turned off now until we get
7822 		 * extended options from NVRAM
7823 		 */
7824 		fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
7825 		fcp->isp_zfwoptions |= ICBZOPT_RATE_AUTO;
7826 	}
7827 
7828 
7829 	/*
7830 	 * Now try and read NVRAM unless told to not do so.
7831 	 * This will set fcparam's isp_wwnn_nvram && isp_wwpn_nvram.
7832 	 */
7833 	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
7834 		int i, j = 0;
7835 		/*
7836 		 * Give a couple of tries at reading NVRAM.
7837 		 */
7838 		for (i = 0; i < 2; i++) {
7839 			j = isp_read_nvram(isp, chan);
7840 			if (j == 0) {
7841 				break;
7842 			}
7843 		}
7844 		if (j) {
7845 			isp->isp_confopts |= ISP_CFG_NONVRAM;
7846 		}
7847 	}
7848 
7849 	fcp->isp_wwnn = ACTIVE_NODEWWN(isp, chan);
7850 	fcp->isp_wwpn = ACTIVE_PORTWWN(isp, chan);
7851 	isp_prt(isp, ISP_LOGCONFIG, "Chan %d 0x%08x%08x/0x%08x%08x Role %s",
7852 	    chan, (uint32_t) (fcp->isp_wwnn >> 32), (uint32_t) (fcp->isp_wwnn),
7853 	    (uint32_t) (fcp->isp_wwpn >> 32), (uint32_t) (fcp->isp_wwpn),
7854 	    isp_class3_roles[fcp->role]);
7855 }
7856 
7857 /*
7858  * Re-initialize the ISP and complete all orphaned commands
7859  * with a 'botched' notice. The reset/init routines should
7860  * not disturb an already active list of commands.
7861  */
7862 
7863 int
7864 isp_reinit(ispsoftc_t *isp, int do_load_defaults)
7865 {
7866 	int i, res = 0;
7867 
7868 	if (isp->isp_state == ISP_RUNSTATE)
7869 		isp_deinit(isp);
7870 	if (isp->isp_state != ISP_RESETSTATE)
7871 		isp_reset(isp, do_load_defaults);
7872 	if (isp->isp_state != ISP_RESETSTATE) {
7873 		res = EIO;
7874 		isp_prt(isp, ISP_LOGERR, "%s: cannot reset card", __func__);
7875 		ISP_DISABLE_INTS(isp);
7876 		goto cleanup;
7877 	}
7878 
7879 	isp_init(isp);
7880 	if (isp->isp_state > ISP_RESETSTATE &&
7881 	    isp->isp_state != ISP_RUNSTATE) {
7882 		res = EIO;
7883 		isp_prt(isp, ISP_LOGERR, "%s: cannot init card", __func__);
7884 		ISP_DISABLE_INTS(isp);
7885 		if (IS_FC(isp)) {
7886 			/*
7887 			 * If we're in ISP_ROLE_NONE, turn off the lasers.
7888 			 */
7889 			if (!IS_24XX(isp)) {
7890 				ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
7891 				ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
7892 				ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
7893 				ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
7894 				ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
7895 			}
7896 		}
7897 	}
7898 
7899 cleanup:
7900 	isp->isp_nactive = 0;
7901 	isp_clear_commands(isp);
7902 	if (IS_FC(isp)) {
7903 		for (i = 0; i < isp->isp_nchan; i++)
7904 			isp_clear_portdb(isp, i);
7905 	}
7906 	return (res);
7907 }
7908 
7909 /*
7910  * NVRAM Routines
7911  */
7912 static int
7913 isp_read_nvram(ispsoftc_t *isp, int bus)
7914 {
7915 	int i, amt, retval;
7916 	uint8_t csum, minversion;
7917 	union {
7918 		uint8_t _x[ISP2400_NVRAM_SIZE];
7919 		uint16_t _s[ISP2400_NVRAM_SIZE>>1];
7920 	} _n;
7921 #define	nvram_data	_n._x
7922 #define	nvram_words	_n._s
7923 
7924 	if (IS_24XX(isp)) {
7925 		return (isp_read_nvram_2400(isp, nvram_data));
7926 	} else if (IS_FC(isp)) {
7927 		amt = ISP2100_NVRAM_SIZE;
7928 		minversion = 1;
7929 	} else if (IS_ULTRA2(isp)) {
7930 		amt = ISP1080_NVRAM_SIZE;
7931 		minversion = 0;
7932 	} else {
7933 		amt = ISP_NVRAM_SIZE;
7934 		minversion = 2;
7935 	}
7936 
7937 	for (i = 0; i < amt>>1; i++) {
7938 		isp_rdnvram_word(isp, i, &nvram_words[i]);
7939 	}
7940 
7941 	if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
7942 	    nvram_data[2] != 'P') {
7943 		if (isp->isp_bustype != ISP_BT_SBUS) {
7944 			isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header");
7945 			isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x", nvram_data[0], nvram_data[1], nvram_data[2]);
7946 		}
7947 		retval = -1;
7948 		goto out;
7949 	}
7950 
7951 	for (csum = 0, i = 0; i < amt; i++) {
7952 		csum += nvram_data[i];
7953 	}
7954 	if (csum != 0) {
7955 		isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
7956 		retval = -1;
7957 		goto out;
7958 	}
7959 
7960 	if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
7961 		isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood",
7962 		    ISP_NVRAM_VERSION(nvram_data));
7963 		retval = -1;
7964 		goto out;
7965 	}
7966 
7967 	if (IS_ULTRA3(isp)) {
7968 		isp_parse_nvram_12160(isp, bus, nvram_data);
7969 	} else if (IS_1080(isp)) {
7970 		isp_parse_nvram_1080(isp, bus, nvram_data);
7971 	} else if (IS_1280(isp) || IS_1240(isp)) {
7972 		isp_parse_nvram_1080(isp, bus, nvram_data);
7973 	} else if (IS_SCSI(isp)) {
7974 		isp_parse_nvram_1020(isp, nvram_data);
7975 	} else {
7976 		isp_parse_nvram_2100(isp, nvram_data);
7977 	}
7978 	retval = 0;
7979 out:
7980 	return (retval);
7981 #undef	nvram_data
7982 #undef	nvram_words
7983 }
7984 
7985 static int
7986 isp_read_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data)
7987 {
7988 	int retval = 0;
7989 	uint32_t addr, csum, lwrds, *dptr;
7990 
7991 	if (isp->isp_port) {
7992 		addr = ISP2400_NVRAM_PORT1_ADDR;
7993 	} else {
7994 		addr = ISP2400_NVRAM_PORT0_ADDR;
7995 	}
7996 
7997 	dptr = (uint32_t *) nvram_data;
7998 	for (lwrds = 0; lwrds < ISP2400_NVRAM_SIZE >> 2; lwrds++) {
7999 		isp_rd_2400_nvram(isp, addr++, dptr++);
8000 	}
8001 	if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
8002 	    nvram_data[2] != 'P') {
8003 		isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header (%x %x %x)",
8004 		    nvram_data[0], nvram_data[1], nvram_data[2]);
8005 		retval = -1;
8006 		goto out;
8007 	}
8008 	dptr = (uint32_t *) nvram_data;
8009 	for (csum = 0, lwrds = 0; lwrds < ISP2400_NVRAM_SIZE >> 2; lwrds++) {
8010 		uint32_t tmp;
8011 		ISP_IOXGET_32(isp, &dptr[lwrds], tmp);
8012 		csum += tmp;
8013 	}
8014 	if (csum != 0) {
8015 		isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
8016 		retval = -1;
8017 		goto out;
8018 	}
8019 	isp_parse_nvram_2400(isp, nvram_data);
8020 out:
8021 	return (retval);
8022 }
8023 
8024 static void
8025 isp_rdnvram_word(ispsoftc_t *isp, int wo, uint16_t *rp)
8026 {
8027 	int i, cbits;
8028 	uint16_t bit, rqst, junk;
8029 
8030 	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
8031 	ISP_DELAY(10);
8032 	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
8033 	ISP_DELAY(10);
8034 
8035 	if (IS_FC(isp)) {
8036 		wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
8037 		if (IS_2312(isp) && isp->isp_port) {
8038 			wo += 128;
8039 		}
8040 		rqst = (ISP_NVRAM_READ << 8) | wo;
8041 		cbits = 10;
8042 	} else if (IS_ULTRA2(isp)) {
8043 		wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1);
8044 		rqst = (ISP_NVRAM_READ << 8) | wo;
8045 		cbits = 10;
8046 	} else {
8047 		wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
8048 		rqst = (ISP_NVRAM_READ << 6) | wo;
8049 		cbits = 8;
8050 	}
8051 
8052 	/*
8053 	 * Clock the word select request out...
8054 	 */
8055 	for (i = cbits; i >= 0; i--) {
8056 		if ((rqst >> i) & 1) {
8057 			bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
8058 		} else {
8059 			bit = BIU_NVRAM_SELECT;
8060 		}
8061 		ISP_WRITE(isp, BIU_NVRAM, bit);
8062 		ISP_DELAY(10);
8063 		junk = ISP_READ(isp, BIU_NVRAM);	/* force PCI flush */
8064 		ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
8065 		ISP_DELAY(10);
8066 		junk = ISP_READ(isp, BIU_NVRAM);	/* force PCI flush */
8067 		ISP_WRITE(isp, BIU_NVRAM, bit);
8068 		ISP_DELAY(10);
8069 		junk = ISP_READ(isp, BIU_NVRAM);	/* force PCI flush */
8070 	}
8071 	/*
8072 	 * Now read the result back in (bits come back in MSB format).
8073 	 */
8074 	*rp = 0;
8075 	for (i = 0; i < 16; i++) {
8076 		uint16_t rv;
8077 		*rp <<= 1;
8078 		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
8079 		ISP_DELAY(10);
8080 		rv = ISP_READ(isp, BIU_NVRAM);
8081 		if (rv & BIU_NVRAM_DATAIN) {
8082 			*rp |= 1;
8083 		}
8084 		ISP_DELAY(10);
8085 		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
8086 		ISP_DELAY(10);
8087 		junk = ISP_READ(isp, BIU_NVRAM);	/* force PCI flush */
8088 	}
8089 	ISP_WRITE(isp, BIU_NVRAM, 0);
8090 	ISP_DELAY(10);
8091 	junk = ISP_READ(isp, BIU_NVRAM);	/* force PCI flush */
8092 	ISP_SWIZZLE_NVRAM_WORD(isp, rp);
8093 }
8094 
8095 static void
8096 isp_rd_2400_nvram(ispsoftc_t *isp, uint32_t addr, uint32_t *rp)
8097 {
8098 	int loops = 0;
8099 	uint32_t base = 0x7ffe0000;
8100 	uint32_t tmp = 0;
8101 
8102 	if (IS_26XX(isp)) {
8103 		base = 0x7fe7c000;	/* XXX: Observation, may be wrong. */
8104 	} else if (IS_25XX(isp)) {
8105 		base = 0x7ff00000 | 0x48000;
8106 	}
8107 	ISP_WRITE(isp, BIU2400_FLASH_ADDR, base | addr);
8108 	for (loops = 0; loops < 5000; loops++) {
8109 		ISP_DELAY(10);
8110 		tmp = ISP_READ(isp, BIU2400_FLASH_ADDR);
8111 		if ((tmp & (1U << 31)) != 0) {
8112 			break;
8113 		}
8114 	}
8115 	if (tmp & (1U << 31)) {
8116 		*rp = ISP_READ(isp, BIU2400_FLASH_DATA);
8117 		ISP_SWIZZLE_NVRAM_LONG(isp, rp);
8118 	} else {
8119 		*rp = 0xffffffff;
8120 	}
8121 }
8122 
8123 static void
8124 isp_parse_nvram_1020(ispsoftc_t *isp, uint8_t *nvram_data)
8125 {
8126 	sdparam *sdp = SDPARAM(isp, 0);
8127 	int tgt;
8128 
8129 	sdp->isp_fifo_threshold =
8130 		ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
8131 		(ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
8132 
8133 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
8134 		sdp->isp_initiator_id = ISP_NVRAM_INITIATOR_ID(nvram_data);
8135 
8136 	sdp->isp_bus_reset_delay =
8137 		ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
8138 
8139 	sdp->isp_retry_count =
8140 		ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
8141 
8142 	sdp->isp_retry_delay =
8143 		ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
8144 
8145 	sdp->isp_async_data_setup =
8146 		ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
8147 
8148 	if (isp->isp_type >= ISP_HA_SCSI_1040) {
8149 		if (sdp->isp_async_data_setup < 9) {
8150 			sdp->isp_async_data_setup = 9;
8151 		}
8152 	} else {
8153 		if (sdp->isp_async_data_setup != 6) {
8154 			sdp->isp_async_data_setup = 6;
8155 		}
8156 	}
8157 
8158 	sdp->isp_req_ack_active_neg =
8159 		ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
8160 
8161 	sdp->isp_data_line_active_neg =
8162 		ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
8163 
8164 	sdp->isp_data_dma_burst_enabl =
8165 		ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
8166 
8167 	sdp->isp_cmd_dma_burst_enable =
8168 		ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
8169 
8170 	sdp->isp_tag_aging =
8171 		ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
8172 
8173 	sdp->isp_selection_timeout =
8174 		ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
8175 
8176 	sdp->isp_max_queue_depth =
8177 		ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
8178 
8179 	sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
8180 
8181 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
8182 		sdp->isp_devparam[tgt].dev_enable =
8183 			ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt);
8184 		sdp->isp_devparam[tgt].exc_throttle =
8185 			ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt);
8186 		sdp->isp_devparam[tgt].nvrm_offset =
8187 			ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt);
8188 		sdp->isp_devparam[tgt].nvrm_period =
8189 			ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt);
8190 		/*
8191 		 * We probably shouldn't lie about this, but it
8192 		 * it makes it much safer if we limit NVRAM values
8193 		 * to sanity.
8194 		 */
8195 		if (isp->isp_type < ISP_HA_SCSI_1040) {
8196 			/*
8197 			 * If we're not ultra, we can't possibly
8198 			 * be a shorter period than this.
8199 			 */
8200 			if (sdp->isp_devparam[tgt].nvrm_period < 0x19) {
8201 				sdp->isp_devparam[tgt].nvrm_period = 0x19;
8202 			}
8203 			if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) {
8204 				sdp->isp_devparam[tgt].nvrm_offset = 0x0c;
8205 			}
8206 		} else {
8207 			if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) {
8208 				sdp->isp_devparam[tgt].nvrm_offset = 0x8;
8209 			}
8210 		}
8211 		sdp->isp_devparam[tgt].nvrm_flags = 0;
8212 		if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt))
8213 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
8214 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
8215 		if (ISP_NVRAM_TGT_TQING(nvram_data, tgt))
8216 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
8217 		if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt))
8218 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
8219 		if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt))
8220 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
8221 		if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt))
8222 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
8223 		if (ISP_NVRAM_TGT_DISC(nvram_data, tgt))
8224 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
8225 		sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */
8226 		sdp->isp_devparam[tgt].goal_offset =
8227 		    sdp->isp_devparam[tgt].nvrm_offset;
8228 		sdp->isp_devparam[tgt].goal_period =
8229 		    sdp->isp_devparam[tgt].nvrm_period;
8230 		sdp->isp_devparam[tgt].goal_flags =
8231 		    sdp->isp_devparam[tgt].nvrm_flags;
8232 	}
8233 }
8234 
8235 static void
8236 isp_parse_nvram_1080(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
8237 {
8238 	sdparam *sdp = SDPARAM(isp, bus);
8239 	int tgt;
8240 
8241 	sdp->isp_fifo_threshold =
8242 	    ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
8243 
8244 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
8245 		sdp->isp_initiator_id = ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
8246 
8247 	sdp->isp_bus_reset_delay =
8248 	    ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
8249 
8250 	sdp->isp_retry_count =
8251 	    ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
8252 
8253 	sdp->isp_retry_delay =
8254 	    ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
8255 
8256 	sdp->isp_async_data_setup =
8257 	    ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
8258 
8259 	sdp->isp_req_ack_active_neg =
8260 	    ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
8261 
8262 	sdp->isp_data_line_active_neg =
8263 	    ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
8264 
8265 	sdp->isp_data_dma_burst_enabl =
8266 	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
8267 
8268 	sdp->isp_cmd_dma_burst_enable =
8269 	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
8270 
8271 	sdp->isp_selection_timeout =
8272 	    ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
8273 
8274 	sdp->isp_max_queue_depth =
8275 	     ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
8276 
8277 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
8278 		sdp->isp_devparam[tgt].dev_enable =
8279 		    ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
8280 		sdp->isp_devparam[tgt].exc_throttle =
8281 			ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
8282 		sdp->isp_devparam[tgt].nvrm_offset =
8283 			ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
8284 		sdp->isp_devparam[tgt].nvrm_period =
8285 			ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
8286 		sdp->isp_devparam[tgt].nvrm_flags = 0;
8287 		if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
8288 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
8289 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
8290 		if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus))
8291 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
8292 		if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
8293 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
8294 		if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
8295 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
8296 		if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
8297 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
8298 		if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus))
8299 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
8300 		sdp->isp_devparam[tgt].actv_flags = 0;
8301 		sdp->isp_devparam[tgt].goal_offset =
8302 		    sdp->isp_devparam[tgt].nvrm_offset;
8303 		sdp->isp_devparam[tgt].goal_period =
8304 		    sdp->isp_devparam[tgt].nvrm_period;
8305 		sdp->isp_devparam[tgt].goal_flags =
8306 		    sdp->isp_devparam[tgt].nvrm_flags;
8307 	}
8308 }
8309 
8310 static void
8311 isp_parse_nvram_12160(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
8312 {
8313 	sdparam *sdp = SDPARAM(isp, bus);
8314 	int tgt;
8315 
8316 	sdp->isp_fifo_threshold =
8317 	    ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
8318 
8319 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
8320 		sdp->isp_initiator_id = ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
8321 
8322 	sdp->isp_bus_reset_delay =
8323 	    ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
8324 
8325 	sdp->isp_retry_count =
8326 	    ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
8327 
8328 	sdp->isp_retry_delay =
8329 	    ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
8330 
8331 	sdp->isp_async_data_setup =
8332 	    ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
8333 
8334 	sdp->isp_req_ack_active_neg =
8335 	    ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
8336 
8337 	sdp->isp_data_line_active_neg =
8338 	    ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
8339 
8340 	sdp->isp_data_dma_burst_enabl =
8341 	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
8342 
8343 	sdp->isp_cmd_dma_burst_enable =
8344 	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
8345 
8346 	sdp->isp_selection_timeout =
8347 	    ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
8348 
8349 	sdp->isp_max_queue_depth =
8350 	     ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
8351 
8352 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
8353 		sdp->isp_devparam[tgt].dev_enable =
8354 		    ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
8355 		sdp->isp_devparam[tgt].exc_throttle =
8356 			ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
8357 		sdp->isp_devparam[tgt].nvrm_offset =
8358 			ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
8359 		sdp->isp_devparam[tgt].nvrm_period =
8360 			ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
8361 		sdp->isp_devparam[tgt].nvrm_flags = 0;
8362 		if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
8363 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
8364 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
8365 		if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus))
8366 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
8367 		if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
8368 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
8369 		if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
8370 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
8371 		if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
8372 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
8373 		if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus))
8374 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
8375 		sdp->isp_devparam[tgt].actv_flags = 0;
8376 		sdp->isp_devparam[tgt].goal_offset =
8377 		    sdp->isp_devparam[tgt].nvrm_offset;
8378 		sdp->isp_devparam[tgt].goal_period =
8379 		    sdp->isp_devparam[tgt].nvrm_period;
8380 		sdp->isp_devparam[tgt].goal_flags =
8381 		    sdp->isp_devparam[tgt].nvrm_flags;
8382 	}
8383 }
8384 
8385 static void
8386 isp_parse_nvram_2100(ispsoftc_t *isp, uint8_t *nvram_data)
8387 {
8388 	fcparam *fcp = FCPARAM(isp, 0);
8389 	uint64_t wwn;
8390 
8391 	/*
8392 	 * There is NVRAM storage for both Port and Node entities-
8393 	 * but the Node entity appears to be unused on all the cards
8394 	 * I can find. However, we should account for this being set
8395 	 * at some point in the future.
8396 	 *
8397 	 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in
8398 	 * bits 48..60. In the case of the 2202, it appears that they do
8399 	 * use bit 48 to distinguish between the two instances on the card.
8400 	 * The 2204, which I've never seen, *probably* extends this method.
8401 	 */
8402 	wwn = ISP2100_NVRAM_PORT_NAME(nvram_data);
8403 	if (wwn) {
8404 		isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x",
8405 		    (uint32_t) (wwn >> 32), (uint32_t) (wwn));
8406 		if ((wwn >> 60) == 0) {
8407 			wwn |= (((uint64_t) 2)<< 60);
8408 		}
8409 	}
8410 	fcp->isp_wwpn_nvram = wwn;
8411 	if (IS_2200(isp) || IS_23XX(isp)) {
8412 		wwn = ISP2100_NVRAM_NODE_NAME(nvram_data);
8413 		if (wwn) {
8414 			isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x",
8415 			    (uint32_t) (wwn >> 32),
8416 			    (uint32_t) (wwn));
8417 			if ((wwn >> 60) == 0) {
8418 				wwn |= (((uint64_t) 2)<< 60);
8419 			}
8420 		} else {
8421 			wwn = fcp->isp_wwpn_nvram & ~((uint64_t) 0xfff << 48);
8422 		}
8423 	} else {
8424 		wwn &= ~((uint64_t) 0xfff << 48);
8425 	}
8426 	fcp->isp_wwnn_nvram = wwn;
8427 
8428 	fcp->isp_maxalloc = ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
8429 	if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0) {
8430 		DEFAULT_FRAMESIZE(isp) =
8431 		    ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
8432 	}
8433 	fcp->isp_retry_delay = ISP2100_NVRAM_RETRY_DELAY(nvram_data);
8434 	fcp->isp_retry_count = ISP2100_NVRAM_RETRY_COUNT(nvram_data);
8435 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) {
8436 		fcp->isp_loopid = ISP2100_NVRAM_HARDLOOPID(nvram_data);
8437 	}
8438 	if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0) {
8439 		DEFAULT_EXEC_THROTTLE(isp) =
8440 			ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
8441 	}
8442 	fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
8443 	isp_prt(isp, ISP_LOGDEBUG0,
8444 	    "NVRAM 0x%08x%08x 0x%08x%08x maxalloc %d maxframelen %d",
8445 	    (uint32_t) (fcp->isp_wwnn_nvram >> 32),
8446 	    (uint32_t) fcp->isp_wwnn_nvram,
8447 	    (uint32_t) (fcp->isp_wwpn_nvram >> 32),
8448 	    (uint32_t) fcp->isp_wwpn_nvram,
8449 	    ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data),
8450 	    ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data));
8451 	isp_prt(isp, ISP_LOGDEBUG0,
8452 	    "execthrottle %d fwoptions 0x%x hardloop %d tov %d",
8453 	    ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data),
8454 	    ISP2100_NVRAM_OPTIONS(nvram_data),
8455 	    ISP2100_NVRAM_HARDLOOPID(nvram_data),
8456 	    ISP2100_NVRAM_TOV(nvram_data));
8457 	fcp->isp_xfwoptions = ISP2100_XFW_OPTIONS(nvram_data);
8458 	fcp->isp_zfwoptions = ISP2100_ZFW_OPTIONS(nvram_data);
8459 	isp_prt(isp, ISP_LOGDEBUG0, "xfwoptions 0x%x zfw options 0x%x",
8460 	    ISP2100_XFW_OPTIONS(nvram_data), ISP2100_ZFW_OPTIONS(nvram_data));
8461 }
8462 
8463 static void
8464 isp_parse_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data)
8465 {
8466 	fcparam *fcp = FCPARAM(isp, 0);
8467 	uint64_t wwn;
8468 
8469 	isp_prt(isp, ISP_LOGDEBUG0,
8470 	    "NVRAM 0x%08x%08x 0x%08x%08x exchg_cnt %d maxframelen %d",
8471 	    (uint32_t) (ISP2400_NVRAM_NODE_NAME(nvram_data) >> 32),
8472 	    (uint32_t) (ISP2400_NVRAM_NODE_NAME(nvram_data)),
8473 	    (uint32_t) (ISP2400_NVRAM_PORT_NAME(nvram_data) >> 32),
8474 	    (uint32_t) (ISP2400_NVRAM_PORT_NAME(nvram_data)),
8475 	    ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data),
8476 	    ISP2400_NVRAM_MAXFRAMELENGTH(nvram_data));
8477 	isp_prt(isp, ISP_LOGDEBUG0,
8478 	    "NVRAM execthr %d loopid %d fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x",
8479 	    ISP2400_NVRAM_EXECUTION_THROTTLE(nvram_data),
8480 	    ISP2400_NVRAM_HARDLOOPID(nvram_data),
8481 	    ISP2400_NVRAM_FIRMWARE_OPTIONS1(nvram_data),
8482 	    ISP2400_NVRAM_FIRMWARE_OPTIONS2(nvram_data),
8483 	    ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data));
8484 
8485 	wwn = ISP2400_NVRAM_PORT_NAME(nvram_data);
8486 	fcp->isp_wwpn_nvram = wwn;
8487 
8488 	wwn = ISP2400_NVRAM_NODE_NAME(nvram_data);
8489 	if (wwn) {
8490 		if ((wwn >> 60) != 2 && (wwn >> 60) != 5) {
8491 			wwn = 0;
8492 		}
8493 	}
8494 	if (wwn == 0 && (fcp->isp_wwpn_nvram >> 60) == 2) {
8495 		wwn = fcp->isp_wwpn_nvram;
8496 		wwn &= ~((uint64_t) 0xfff << 48);
8497 	}
8498 	fcp->isp_wwnn_nvram = wwn;
8499 
8500 	if (ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data)) {
8501 		fcp->isp_maxalloc = ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data);
8502 	}
8503 	if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0) {
8504 		DEFAULT_FRAMESIZE(isp) =
8505 		    ISP2400_NVRAM_MAXFRAMELENGTH(nvram_data);
8506 	}
8507 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) {
8508 		fcp->isp_loopid = ISP2400_NVRAM_HARDLOOPID(nvram_data);
8509 	}
8510 	if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0) {
8511 		DEFAULT_EXEC_THROTTLE(isp) =
8512 			ISP2400_NVRAM_EXECUTION_THROTTLE(nvram_data);
8513 	}
8514 	fcp->isp_fwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS1(nvram_data);
8515 	fcp->isp_xfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS2(nvram_data);
8516 	fcp->isp_zfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data);
8517 }
8518