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