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