xref: /freebsd/sys/dev/isp/isp.c (revision 7dfd9569a2f0637fb9a48157b1c1bfe5709faee3)
1 /*-
2  * Machine and OS Independent (well, as best as possible)
3  * code for the Qlogic ISP SCSI adapters.
4  *
5  * Copyright (c) 1997-2006 by Matthew Jacob
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice immediately at the beginning of the file, without modification,
13  *    this list of conditions, and the following disclaimer.
14  * 2. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 /*
31  * Inspiration and ideas about this driver are from Erik Moe's Linux driver
32  * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
33  * ideas dredged from the Solaris driver.
34  */
35 #ifdef	__FreeBSD__
36 #include <sys/cdefs.h>
37 __FBSDID("$FreeBSD$");
38 #endif
39 
40 /*
41  * Include header file appropriate for platform we're building on.
42  */
43 #ifdef	__NetBSD__
44 #include <dev/ic/isp_netbsd.h>
45 #endif
46 #ifdef	__FreeBSD__
47 #include <dev/isp/isp_freebsd.h>
48 #endif
49 #ifdef	__OpenBSD__
50 #include <dev/ic/isp_openbsd.h>
51 #endif
52 #ifdef	__linux__
53 #include "isp_linux.h"
54 #endif
55 #ifdef	__svr4__
56 #include "isp_solaris.h"
57 #endif
58 
59 /*
60  * General defines
61  */
62 
63 #define	MBOX_DELAY_COUNT	1000000 / 100
64 
65 /*
66  * Local static data
67  */
68 static const char portshift[] =
69     "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)";
70 static const char portdup[] =
71     "Target %d duplicates Target %d- killing off both";
72 static const char retained[] =
73     "Retaining Loop ID 0x%x for Target %d (Port 0x%x)";
74 static const char lretained[] =
75     "Retained login of Target %d (Loop ID 0x%x) Port 0x%x";
76 static const char plogout[] =
77     "Logging out Target %d at Loop ID 0x%x (Port 0x%x)";
78 static const char plogierr[] =
79     "Command Error in PLOGI for Port 0x%x (0x%x)";
80 static const char nopdb[] =
81     "Could not get PDB for Device @ Port 0x%x";
82 static const char pdbmfail1[] =
83     "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)";
84 static const char pdbmfail2[] =
85     "PDB Port info for Device @ Port 0x%x does not match up (0x%x)";
86 static const char ldumped[] =
87     "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch";
88 static const char notresp[] =
89   "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
90 static const char xact1[] =
91     "HBA attempted queued transaction with disconnect not set for %d.%d.%d";
92 static const char xact2[] =
93     "HBA attempted queued transaction to target routine %d on target %d bus %d";
94 static const char xact3[] =
95     "HBA attempted queued cmd for %d.%d.%d when queueing disabled";
96 static const char pskip[] =
97     "SCSI phase skipped for target %d.%d.%d";
98 static const char topology[] =
99     "Loop ID %d, Port ID 0x%x, Loop State 0x%x, Topology '%s'";
100 static const char swrej[] =
101     "Fabric Nameserver rejected %s (Reason=0x%x Expl=0x%x) for Port ID 0x%x";
102 static const char finmsg[] =
103     "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
104 static const char sc0[] =
105     "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x";
106 static const char sc1[] =
107     "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d";
108 static const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x";
109 static const char sc3[] = "Generated";
110 static const char sc4[] = "NVRAM";
111 static const char bun[] =
112     "bad underrun for %d.%d (count %d, resid %d, status %s)";
113 
114 /*
115  * Local function prototypes.
116  */
117 static int isp_parse_async(ispsoftc_t *, uint16_t);
118 static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *,
119     uint16_t *);
120 static void
121 isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *);
122 static void isp_fastpost_complete(ispsoftc_t *, uint16_t);
123 static int isp_mbox_continue(ispsoftc_t *);
124 static void isp_scsi_init(ispsoftc_t *);
125 static void isp_scsi_channel_init(ispsoftc_t *, int);
126 static void isp_fibre_init(ispsoftc_t *);
127 static void isp_mark_getpdb_all(ispsoftc_t *);
128 static int isp_getmap(ispsoftc_t *, fcpos_map_t *);
129 static int isp_getpdb(ispsoftc_t *, int, isp_pdb_t *);
130 static uint64_t isp_get_portname(ispsoftc_t *, int, int);
131 static int isp_fclink_test(ispsoftc_t *, int);
132 static char *isp2100_fw_statename(int);
133 static int isp_pdb_sync(ispsoftc_t *);
134 static int isp_scan_loop(ispsoftc_t *);
135 static int isp_fabric_mbox_cmd(ispsoftc_t *, mbreg_t *);
136 static int isp_scan_fabric(ispsoftc_t *, int);
137 static void isp_register_fc4_type(ispsoftc_t *);
138 static void isp_fw_state(ispsoftc_t *);
139 static void isp_mboxcmd_qnw(ispsoftc_t *, mbreg_t *, int);
140 static void isp_mboxcmd(ispsoftc_t *, mbreg_t *, int);
141 
142 static void isp_update(ispsoftc_t *);
143 static void isp_update_bus(ispsoftc_t *, int);
144 static void isp_setdfltparm(ispsoftc_t *, int);
145 static int isp_read_nvram(ispsoftc_t *);
146 static void isp_rdnvram_word(ispsoftc_t *, int, uint16_t *);
147 static void isp_parse_nvram_1020(ispsoftc_t *, uint8_t *);
148 static void isp_parse_nvram_1080(ispsoftc_t *, int, uint8_t *);
149 static void isp_parse_nvram_12160(ispsoftc_t *, int, uint8_t *);
150 static void isp_parse_nvram_2100(ispsoftc_t *, uint8_t *);
151 
152 /*
153  * Reset Hardware.
154  *
155  * Hit the chip over the head, download new f/w if available and set it running.
156  *
157  * Locking done elsewhere.
158  */
159 
160 void
161 isp_reset(ispsoftc_t *isp)
162 {
163 	mbreg_t mbs;
164 	uint16_t code_org;
165 	int loops, i, dodnld = 1;
166 	char *btype = "????";
167 
168 	isp->isp_state = ISP_NILSTATE;
169 	MEMZERO(&mbs, sizeof (mbs));
170 
171 	/*
172 	 * Basic types (SCSI, FibreChannel and PCI or SBus)
173 	 * have been set in the MD code. We figure out more
174 	 * here. Possibly more refined types based upon PCI
175 	 * identification. Chip revision has been gathered.
176 	 *
177 	 * After we've fired this chip up, zero out the conf1 register
178 	 * for SCSI adapters and do other settings for the 2100.
179 	 */
180 
181 	/*
182 	 * Get the current running firmware revision out of the
183 	 * chip before we hit it over the head (if this is our
184 	 * first time through). Note that we store this as the
185 	 * 'ROM' firmware revision- which it may not be. In any
186 	 * case, we don't really use this yet, but we may in
187 	 * the future.
188 	 */
189 	if (isp->isp_touched == 0) {
190 		/*
191 		 * First see whether or not we're sitting in the ISP PROM.
192 		 * If we've just been reset, we'll have the string "ISP   "
193 		 * spread through outgoing mailbox registers 1-3. We do
194 		 * this for PCI cards because otherwise we really don't
195 		 * know what state the card is in and we could hang if
196 		 * we try this command otherwise.
197 		 *
198 		 * For SBus cards, we just do this because they almost
199 		 * certainly will be running firmware by now.
200 		 */
201 		if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 ||
202 		    ISP_READ(isp, OUTMAILBOX2) != 0x5020 ||
203 		    ISP_READ(isp, OUTMAILBOX3) != 0x2020) {
204 			/*
205 			 * Just in case it was paused...
206 			 */
207 			ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
208 			mbs.param[0] = MBOX_ABOUT_FIRMWARE;
209 			isp_mboxcmd(isp, &mbs, MBLOGNONE);
210 			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
211 				isp->isp_romfw_rev[0] = mbs.param[1];
212 				isp->isp_romfw_rev[1] = mbs.param[2];
213 				isp->isp_romfw_rev[2] = mbs.param[3];
214 			}
215 		}
216 		isp->isp_touched = 1;
217 	}
218 
219 	DISABLE_INTS(isp);
220 
221 	/*
222 	 * Set up default request/response queue in-pointer/out-pointer
223 	 * register indices.
224 	 */
225 	if (IS_23XX(isp)) {
226 		isp->isp_rqstinrp = BIU_REQINP;
227 		isp->isp_rqstoutrp = BIU_REQOUTP;
228 		isp->isp_respinrp = BIU_RSPINP;
229 		isp->isp_respoutrp = BIU_RSPOUTP;
230 	} else {
231 		isp->isp_rqstinrp = INMAILBOX4;
232 		isp->isp_rqstoutrp = OUTMAILBOX4;
233 		isp->isp_respinrp = OUTMAILBOX5;
234 		isp->isp_respoutrp = INMAILBOX5;
235 	}
236 
237 	/*
238 	 * Put the board into PAUSE mode (so we can read the SXP registers
239 	 * or write FPM/FBM registers).
240 	 */
241 	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
242 
243 	if (IS_FC(isp)) {
244 		switch (isp->isp_type) {
245 		case ISP_HA_FC_2100:
246 			btype = "2100";
247 			break;
248 		case ISP_HA_FC_2200:
249 			btype = "2200";
250 			break;
251 		case ISP_HA_FC_2300:
252 			btype = "2300";
253 			break;
254 		case ISP_HA_FC_2312:
255 			btype = "2312";
256 			break;
257 		case ISP_HA_FC_2322:
258 			btype = "2322";
259 			break;
260 		case ISP_HA_FC_2422:
261 			btype = "2422";
262 			break;
263 		default:
264 			break;
265 		}
266 		/*
267 		 * While we're paused, reset the FPM module and FBM fifos.
268 		 */
269 		ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
270 		ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
271 		ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
272 		ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
273 		ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
274 	} else if (IS_1240(isp)) {
275 		sdparam *sdp = isp->isp_param;
276 		btype = "1240";
277 		isp->isp_clock = 60;
278 		sdp->isp_ultramode = 1;
279 		sdp++;
280 		sdp->isp_ultramode = 1;
281 		/*
282 		 * XXX: Should probably do some bus sensing.
283 		 */
284 	} else if (IS_ULTRA2(isp)) {
285 		static const char m[] = "bus %d is in %s Mode";
286 		uint16_t l;
287 		sdparam *sdp = isp->isp_param;
288 
289 		isp->isp_clock = 100;
290 
291 		if (IS_1280(isp))
292 			btype = "1280";
293 		else if (IS_1080(isp))
294 			btype = "1080";
295 		else if (IS_10160(isp))
296 			btype = "10160";
297 		else if (IS_12160(isp))
298 			btype = "12160";
299 		else
300 			btype = "<UNKLVD>";
301 
302 		l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
303 		switch (l) {
304 		case ISP1080_LVD_MODE:
305 			sdp->isp_lvdmode = 1;
306 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD");
307 			break;
308 		case ISP1080_HVD_MODE:
309 			sdp->isp_diffmode = 1;
310 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential");
311 			break;
312 		case ISP1080_SE_MODE:
313 			sdp->isp_ultramode = 1;
314 			isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended");
315 			break;
316 		default:
317 			isp_prt(isp, ISP_LOGERR,
318 			    "unknown mode on bus %d (0x%x)", 0, l);
319 			break;
320 		}
321 
322 		if (IS_DUALBUS(isp)) {
323 			sdp++;
324 			l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
325 			l &= ISP1080_MODE_MASK;
326 			switch(l) {
327 			case ISP1080_LVD_MODE:
328 				sdp->isp_lvdmode = 1;
329 				isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
330 				break;
331 			case ISP1080_HVD_MODE:
332 				sdp->isp_diffmode = 1;
333 				isp_prt(isp, ISP_LOGCONFIG,
334 				    m, 1, "Differential");
335 				break;
336 			case ISP1080_SE_MODE:
337 				sdp->isp_ultramode = 1;
338 				isp_prt(isp, ISP_LOGCONFIG,
339 				    m, 1, "Single-Ended");
340 				break;
341 			default:
342 				isp_prt(isp, ISP_LOGERR,
343 				    "unknown mode on bus %d (0x%x)", 1, l);
344 				break;
345 			}
346 		}
347 	} else {
348 		sdparam *sdp = isp->isp_param;
349 		i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
350 		switch (i) {
351 		default:
352 			isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i);
353 			/* FALLTHROUGH */
354 		case 1:
355 			btype = "1020";
356 			isp->isp_type = ISP_HA_SCSI_1020;
357 			isp->isp_clock = 40;
358 			break;
359 		case 2:
360 			/*
361 			 * Some 1020A chips are Ultra Capable, but don't
362 			 * run the clock rate up for that unless told to
363 			 * do so by the Ultra Capable bits being set.
364 			 */
365 			btype = "1020A";
366 			isp->isp_type = ISP_HA_SCSI_1020A;
367 			isp->isp_clock = 40;
368 			break;
369 		case 3:
370 			btype = "1040";
371 			isp->isp_type = ISP_HA_SCSI_1040;
372 			isp->isp_clock = 60;
373 			break;
374 		case 4:
375 			btype = "1040A";
376 			isp->isp_type = ISP_HA_SCSI_1040A;
377 			isp->isp_clock = 60;
378 			break;
379 		case 5:
380 			btype = "1040B";
381 			isp->isp_type = ISP_HA_SCSI_1040B;
382 			isp->isp_clock = 60;
383 			break;
384 		case 6:
385 			btype = "1040C";
386 			isp->isp_type = ISP_HA_SCSI_1040C;
387 			isp->isp_clock = 60;
388                         break;
389 		}
390 		/*
391 		 * Now, while we're at it, gather info about ultra
392 		 * and/or differential mode.
393 		 */
394 		if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
395 			isp_prt(isp, ISP_LOGCONFIG, "Differential Mode");
396 			sdp->isp_diffmode = 1;
397 		} else {
398 			sdp->isp_diffmode = 0;
399 		}
400 		i = ISP_READ(isp, RISC_PSR);
401 		if (isp->isp_bustype == ISP_BT_SBUS) {
402 			i &= RISC_PSR_SBUS_ULTRA;
403 		} else {
404 			i &= RISC_PSR_PCI_ULTRA;
405 		}
406 		if (i != 0) {
407 			isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable");
408 			sdp->isp_ultramode = 1;
409 			/*
410 			 * If we're in Ultra Mode, we have to be 60MHz clock-
411 			 * even for the SBus version.
412 			 */
413 			isp->isp_clock = 60;
414 		} else {
415 			sdp->isp_ultramode = 0;
416 			/*
417 			 * Clock is known. Gronk.
418 			 */
419 		}
420 
421 		/*
422 		 * Machine dependent clock (if set) overrides
423 		 * our generic determinations.
424 		 */
425 		if (isp->isp_mdvec->dv_clock) {
426 			if (isp->isp_mdvec->dv_clock < isp->isp_clock) {
427 				isp->isp_clock = isp->isp_mdvec->dv_clock;
428 			}
429 		}
430 
431 	}
432 
433 	/*
434 	 * Clear instrumentation
435 	 */
436 	isp->isp_intcnt = isp->isp_intbogus = 0;
437 
438 	/*
439 	 * Do MD specific pre initialization
440 	 */
441 	ISP_RESET0(isp);
442 
443 again:
444 
445 	/*
446 	 * Hit the chip over the head with hammer,
447 	 * and give the ISP a chance to recover.
448 	 */
449 
450 	if (IS_SCSI(isp)) {
451 		ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
452 		/*
453 		 * A slight delay...
454 		 */
455 		USEC_DELAY(100);
456 
457 		/*
458 		 * Clear data && control DMA engines.
459 		 */
460 		ISP_WRITE(isp, CDMA_CONTROL,
461 		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
462 		ISP_WRITE(isp, DDMA_CONTROL,
463 		    DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
464 
465 
466 	} else {
467 		ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
468 		/*
469 		 * A slight delay...
470 		 */
471 		USEC_DELAY(100);
472 
473 		/*
474 		 * Clear data && control DMA engines.
475 		 */
476 		ISP_WRITE(isp, CDMA2100_CONTROL,
477 			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
478 		ISP_WRITE(isp, TDMA2100_CONTROL,
479 			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
480 		ISP_WRITE(isp, RDMA2100_CONTROL,
481 			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
482 	}
483 
484 	/*
485 	 * Wait for ISP to be ready to go...
486 	 */
487 	loops = MBOX_DELAY_COUNT;
488 	for (;;) {
489 		if (IS_SCSI(isp)) {
490 			if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET))
491 				break;
492 		} else {
493 			if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
494 				break;
495 		}
496 		USEC_DELAY(100);
497 		if (--loops < 0) {
498 			ISP_DUMPREGS(isp, "chip reset timed out");
499 			return;
500 		}
501 	}
502 
503 	/*
504 	 * After we've fired this chip up, zero out the conf1 register
505 	 * for SCSI adapters and other settings for the 2100.
506 	 */
507 
508 	if (IS_SCSI(isp)) {
509 		ISP_WRITE(isp, BIU_CONF1, 0);
510 	} else {
511 		ISP_WRITE(isp, BIU2100_CSR, 0);
512 	}
513 
514 	/*
515 	 * Reset RISC Processor
516 	 */
517 	ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
518 	USEC_DELAY(100);
519 	/* Clear semaphore register (just to be sure) */
520 	ISP_WRITE(isp, BIU_SEMA, 0);
521 
522 	/*
523 	 * Establish some initial burst rate stuff.
524 	 * (only for the 1XX0 boards). This really should
525 	 * be done later after fetching from NVRAM.
526 	 */
527 	if (IS_SCSI(isp)) {
528 		uint16_t tmp = isp->isp_mdvec->dv_conf1;
529 		/*
530 		 * Busted FIFO. Turn off all but burst enables.
531 		 */
532 		if (isp->isp_type == ISP_HA_SCSI_1040A) {
533 			tmp &= BIU_BURST_ENABLE;
534 		}
535 		ISP_SETBITS(isp, BIU_CONF1, tmp);
536 		if (tmp & BIU_BURST_ENABLE) {
537 			ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
538 			ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
539 		}
540 #ifdef	PTI_CARDS
541 		if (((sdparam *) isp->isp_param)->isp_ultramode) {
542 			while (ISP_READ(isp, RISC_MTR) != 0x1313) {
543 				ISP_WRITE(isp, RISC_MTR, 0x1313);
544 				ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
545 			}
546 		} else {
547 			ISP_WRITE(isp, RISC_MTR, 0x1212);
548 		}
549 		/*
550 		 * PTI specific register
551 		 */
552 		ISP_WRITE(isp, RISC_EMB, DUAL_BANK)
553 #else
554 		ISP_WRITE(isp, RISC_MTR, 0x1212);
555 #endif
556 	} else {
557 		ISP_WRITE(isp, RISC_MTR2100, 0x1212);
558 		if (IS_2200(isp) || IS_23XX(isp)) {
559 			ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE);
560 		}
561 	}
562 
563 	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */
564 
565 	/*
566 	 * Do MD specific post initialization
567 	 */
568 	ISP_RESET1(isp);
569 
570 	/*
571 	 * Wait for everything to finish firing up.
572 	 *
573 	 * Avoid doing this on the 2312 because you can generate a PCI
574 	 * parity error (chip breakage).
575 	 */
576 	if (IS_23XX(isp)) {
577 		USEC_DELAY(5);
578 	} else {
579 		loops = MBOX_DELAY_COUNT;
580 		while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
581 			USEC_DELAY(100);
582 			if (--loops < 0) {
583 				isp_prt(isp, ISP_LOGERR,
584 				    "MBOX_BUSY never cleared on reset");
585 				return;
586 			}
587 		}
588 	}
589 
590 	/*
591 	 * Up until this point we've done everything by just reading or
592 	 * setting registers. From this point on we rely on at least *some*
593 	 * kind of firmware running in the card.
594 	 */
595 
596 	/*
597 	 * Do some sanity checking.
598 	 */
599 	mbs.param[0] = MBOX_NO_OP;
600 	isp_mboxcmd(isp, &mbs, MBLOGALL);
601 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
602 		return;
603 	}
604 
605 	if (IS_SCSI(isp)) {
606 		mbs.param[0] = MBOX_MAILBOX_REG_TEST;
607 		mbs.param[1] = 0xdead;
608 		mbs.param[2] = 0xbeef;
609 		mbs.param[3] = 0xffff;
610 		mbs.param[4] = 0x1111;
611 		mbs.param[5] = 0xa5a5;
612 		isp_mboxcmd(isp, &mbs, MBLOGALL);
613 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
614 			return;
615 		}
616 		if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef ||
617 		    mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 ||
618 		    mbs.param[5] != 0xa5a5) {
619 			isp_prt(isp, ISP_LOGERR,
620 			    "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)",
621 			    mbs.param[1], mbs.param[2], mbs.param[3],
622 			    mbs.param[4], mbs.param[5]);
623 			return;
624 		}
625 
626 	}
627 
628 	/*
629 	 * Download new Firmware, unless requested not to do so.
630 	 * This is made slightly trickier in some cases where the
631 	 * firmware of the ROM revision is newer than the revision
632 	 * compiled into the driver. So, where we used to compare
633 	 * versions of our f/w and the ROM f/w, now we just see
634 	 * whether we have f/w at all and whether a config flag
635 	 * has disabled our download.
636 	 */
637 	if ((isp->isp_mdvec->dv_ispfw == NULL) ||
638 	    (isp->isp_confopts & ISP_CFG_NORELOAD)) {
639 		dodnld = 0;
640 	}
641 
642 	if (IS_23XX(isp))
643 		code_org = ISP_CODE_ORG_2300;
644 	else
645 		code_org = ISP_CODE_ORG;
646 
647 	if (dodnld) {
648 		isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1];
649 		isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[3] - 1;
650 		isp->isp_mbxwrk1 = code_org + 1;
651 		mbs.param[0] = MBOX_WRITE_RAM_WORD;
652 		mbs.param[1] = code_org;
653 		mbs.param[2] = isp->isp_mdvec->dv_ispfw[0];
654 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
655 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
656 			isp_prt(isp, ISP_LOGERR,
657 			    "F/W download failed at word %d",
658 			    isp->isp_mbxwrk1 - code_org);
659 			dodnld = 0;
660 			goto again;
661 		}
662 		/*
663 		 * Verify that it downloaded correctly.
664 		 */
665 		mbs.param[0] = MBOX_VERIFY_CHECKSUM;
666 		mbs.param[1] = code_org;
667 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
668 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
669 			isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure");
670 			return;
671 		}
672 		isp->isp_loaded_fw = 1;
673 	} else {
674 		isp->isp_loaded_fw = 0;
675 		isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
676 	}
677 
678 	/*
679 	 * Now start it rolling.
680 	 *
681 	 * If we didn't actually download f/w,
682 	 * we still need to (re)start it.
683 	 */
684 
685 
686 	mbs.param[0] = MBOX_EXEC_FIRMWARE;
687 	mbs.param[1] = code_org;
688 	if (IS_2322(isp) || IS_24XX(isp)) {
689 		if (isp->isp_loaded_fw) {
690 			mbs.param[2] = 1;
691 		} else {
692 			mbs.param[2] = 0;
693 		}
694 		mbs.obits |= 2;
695 	}
696 
697 	isp_mboxcmd(isp, &mbs, MBLOGNONE);
698 	/*
699 	 * Give it a chance to start.
700 	 */
701 	USEC_DELAY(500);
702 
703 	if (IS_SCSI(isp)) {
704 		/*
705 		 * Set CLOCK RATE, but only if asked to.
706 		 */
707 		if (isp->isp_clock) {
708 			mbs.param[0] = MBOX_SET_CLOCK_RATE;
709 			mbs.param[1] = isp->isp_clock;
710 			isp_mboxcmd(isp, &mbs, MBLOGALL);
711 			/* we will try not to care if this fails */
712 		}
713 	}
714 
715 	mbs.param[0] = MBOX_ABOUT_FIRMWARE;
716 	isp_mboxcmd(isp, &mbs, MBLOGALL);
717 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
718 		return;
719 	}
720 
721 	/*
722 	 * The SBus firmware that we are using apparently does not return
723 	 * major, minor, micro revisions in the mailbox registers, which
724 	 * is really, really, annoying.
725 	 */
726 	if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) {
727 		if (dodnld) {
728 #ifdef	ISP_TARGET_MODE
729 			isp->isp_fwrev[0] = 7;
730 			isp->isp_fwrev[1] = 55;
731 #else
732 			isp->isp_fwrev[0] = 1;
733 			isp->isp_fwrev[1] = 37;
734 #endif
735 			isp->isp_fwrev[2] = 0;
736 		}
737 	} else {
738 		isp->isp_fwrev[0] = mbs.param[1];
739 		isp->isp_fwrev[1] = mbs.param[2];
740 		isp->isp_fwrev[2] = mbs.param[3];
741 	}
742 	isp_prt(isp, ISP_LOGCONFIG,
743 	    "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
744 	    btype, isp->isp_revision, dodnld? "loaded" : "resident",
745 	    isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
746 
747 	if (IS_FC(isp)) {
748 		/*
749 		 * We do not believe firmware attributes for 2100 code less
750 		 * than 1.17.0, unless it's the firmware we specifically
751 		 * are loading.
752 		 *
753 		 * Note that all 22XX and 23XX f/w is greater than 1.X.0.
754 		 */
755 		if (!(ISP_FW_NEWER_THAN(isp, 1, 17, 0))) {
756 #ifdef	USE_SMALLER_2100_FIRMWARE
757 			FCPARAM(isp)->isp_fwattr = ISP_FW_ATTR_SCCLUN;
758 #else
759 			FCPARAM(isp)->isp_fwattr = 0;
760 #endif
761 		} else {
762 			FCPARAM(isp)->isp_fwattr = mbs.param[6];
763 			isp_prt(isp, ISP_LOGDEBUG0,
764 			    "Firmware Attributes = 0x%x", mbs.param[6]);
765 		}
766 		if (IS_2KLOGIN(isp)) {
767 			isp_prt(isp, ISP_LOGCONFIG, "2K Logins Supported");
768 		}
769 	}
770 
771 	if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] ||
772 	    isp->isp_romfw_rev[2]) {
773 		isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d",
774 		    isp->isp_romfw_rev[0], isp->isp_romfw_rev[1],
775 		    isp->isp_romfw_rev[2]);
776 	}
777 
778 	mbs.param[0] = MBOX_GET_FIRMWARE_STATUS;
779 	isp_mboxcmd(isp, &mbs, MBLOGALL);
780 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
781 		return;
782 	}
783 	isp->isp_maxcmds = mbs.param[2];
784 	isp_prt(isp, ISP_LOGINFO,
785 	    "%d max I/O commands supported", mbs.param[2]);
786 	isp_fw_state(isp);
787 
788 	/*
789 	 * Set up DMA for the request and result mailboxes.
790 	 */
791 	if (ISP_MBOXDMASETUP(isp) != 0) {
792 		isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
793 		return;
794 	}
795 	isp->isp_state = ISP_RESETSTATE;
796 
797 	/*
798 	 * Okay- now that we have new firmware running, we now (re)set our
799 	 * notion of how many luns we support. This is somewhat tricky because
800 	 * if we haven't loaded firmware, we sometimes do not have an easy way
801 	 * of knowing how many luns we support.
802 	 *
803 	 * Expanded lun firmware gives you 32 luns for SCSI cards and
804 	 * 16384 luns for Fibre Channel cards.
805 	 *
806 	 * It turns out that even for QLogic 2100s with ROM 1.10 and above
807 	 * we do get a firmware attributes word returned in mailbox register 6.
808 	 *
809 	 * Because the lun is in a different position in the Request Queue
810 	 * Entry structure for Fibre Channel with expanded lun firmware, we
811 	 * can only support one lun (lun zero) when we don't know what kind
812 	 * of firmware we're running.
813 	 */
814 	if (IS_SCSI(isp)) {
815 		if (dodnld) {
816 			if (IS_ULTRA2(isp) || IS_ULTRA3(isp)) {
817 				isp->isp_maxluns = 32;
818 			} else {
819 				isp->isp_maxluns = 8;
820 			}
821 		} else {
822 			isp->isp_maxluns = 8;
823 		}
824 	} else {
825 		if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
826 			isp->isp_maxluns = 16384;
827 		} else {
828 			isp->isp_maxluns = 16;
829 		}
830 	}
831 }
832 
833 /*
834  * Initialize Parameters of Hardware to a known state.
835  *
836  * Locks are held before coming here.
837  */
838 
839 void
840 isp_init(ispsoftc_t *isp)
841 {
842 	/*
843 	 * Must do this first to get defaults established.
844 	 */
845 	isp_setdfltparm(isp, 0);
846 	if (IS_DUALBUS(isp)) {
847 		isp_setdfltparm(isp, 1);
848 	}
849 	if (IS_FC(isp)) {
850 		isp_fibre_init(isp);
851 	} else {
852 		isp_scsi_init(isp);
853 	}
854 }
855 
856 static void
857 isp_scsi_init(ispsoftc_t *isp)
858 {
859 	sdparam *sdp_chan0, *sdp_chan1;
860 	mbreg_t mbs;
861 
862 	sdp_chan0 = isp->isp_param;
863 	sdp_chan1 = sdp_chan0;
864 	if (IS_DUALBUS(isp)) {
865 		sdp_chan1++;
866 	}
867 
868 	/*
869 	 * If we have no role (neither target nor initiator), return.
870 	 */
871 	if (isp->isp_role == ISP_ROLE_NONE) {
872 		return;
873 	}
874 
875 	/* First do overall per-card settings. */
876 
877 	/*
878 	 * If we have fast memory timing enabled, turn it on.
879 	 */
880 	if (sdp_chan0->isp_fast_mttr) {
881 		ISP_WRITE(isp, RISC_MTR, 0x1313);
882 	}
883 
884 	/*
885 	 * Set Retry Delay and Count.
886 	 * You set both channels at the same time.
887 	 */
888 	MEMZERO(&mbs, sizeof (mbs));
889 	mbs.param[0] = MBOX_SET_RETRY_COUNT;
890 	mbs.param[1] = sdp_chan0->isp_retry_count;
891 	mbs.param[2] = sdp_chan0->isp_retry_delay;
892 	mbs.param[6] = sdp_chan1->isp_retry_count;
893 	mbs.param[7] = sdp_chan1->isp_retry_delay;
894 
895 	isp_mboxcmd(isp, &mbs, MBLOGALL);
896 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
897 		return;
898 	}
899 
900 	/*
901 	 * Set ASYNC DATA SETUP time. This is very important.
902 	 */
903 	mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME;
904 	mbs.param[1] = sdp_chan0->isp_async_data_setup;
905 	mbs.param[2] = sdp_chan1->isp_async_data_setup;
906 	isp_mboxcmd(isp, &mbs, MBLOGALL);
907 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
908 		return;
909 	}
910 
911 	/*
912 	 * Set ACTIVE Negation State.
913 	 */
914 	mbs.param[0] = MBOX_SET_ACT_NEG_STATE;
915 	mbs.param[1] =
916 	    (sdp_chan0->isp_req_ack_active_neg << 4) |
917 	    (sdp_chan0->isp_data_line_active_neg << 5);
918 	mbs.param[2] =
919 	    (sdp_chan1->isp_req_ack_active_neg << 4) |
920 	    (sdp_chan1->isp_data_line_active_neg << 5);
921 
922 	isp_mboxcmd(isp, &mbs, MBLOGNONE);
923 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
924 		isp_prt(isp, ISP_LOGERR,
925 		    "failed to set active negation state (%d,%d), (%d,%d)",
926 		    sdp_chan0->isp_req_ack_active_neg,
927 		    sdp_chan0->isp_data_line_active_neg,
928 		    sdp_chan1->isp_req_ack_active_neg,
929 		    sdp_chan1->isp_data_line_active_neg);
930 		/*
931 		 * But don't return.
932 		 */
933 	}
934 
935 	/*
936 	 * Set the Tag Aging limit
937 	 */
938 	mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT;
939 	mbs.param[1] = sdp_chan0->isp_tag_aging;
940 	mbs.param[2] = sdp_chan1->isp_tag_aging;
941 	isp_mboxcmd(isp, &mbs, MBLOGALL);
942 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
943 		isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
944 		    sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
945 		return;
946 	}
947 
948 	/*
949 	 * Set selection timeout.
950 	 */
951 	mbs.param[0] = MBOX_SET_SELECT_TIMEOUT;
952 	mbs.param[1] = sdp_chan0->isp_selection_timeout;
953 	mbs.param[2] = sdp_chan1->isp_selection_timeout;
954 	isp_mboxcmd(isp, &mbs, MBLOGALL);
955 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
956 		return;
957 	}
958 
959 	/* now do per-channel settings */
960 	isp_scsi_channel_init(isp, 0);
961 	if (IS_DUALBUS(isp))
962 		isp_scsi_channel_init(isp, 1);
963 
964 	/*
965 	 * Now enable request/response queues
966 	 */
967 
968 	if (IS_ULTRA2(isp) || IS_1240(isp)) {
969 		mbs.param[0] = MBOX_INIT_RES_QUEUE_A64;
970 		mbs.param[1] = RESULT_QUEUE_LEN(isp);
971 		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
972 		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
973 		mbs.param[4] = 0;
974 		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
975 		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
976 		isp_mboxcmd(isp, &mbs, MBLOGALL);
977 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
978 			return;
979 		}
980 		isp->isp_residx = mbs.param[5];
981 
982 		mbs.param[0] = MBOX_INIT_REQ_QUEUE_A64;
983 		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
984 		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
985 		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
986 		mbs.param[5] = 0;
987 		mbs.param[6] = DMA_WD3(isp->isp_result_dma);
988 		mbs.param[7] = DMA_WD2(isp->isp_result_dma);
989 		isp_mboxcmd(isp, &mbs, MBLOGALL);
990 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
991 			return;
992 		}
993 		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
994 	} else {
995 		mbs.param[0] = MBOX_INIT_RES_QUEUE;
996 		mbs.param[1] = RESULT_QUEUE_LEN(isp);
997 		mbs.param[2] = DMA_WD1(isp->isp_result_dma);
998 		mbs.param[3] = DMA_WD0(isp->isp_result_dma);
999 		mbs.param[4] = 0;
1000 		isp_mboxcmd(isp, &mbs, MBLOGALL);
1001 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1002 			return;
1003 		}
1004 		isp->isp_residx = mbs.param[5];
1005 
1006 		mbs.param[0] = MBOX_INIT_REQ_QUEUE;
1007 		mbs.param[1] = RQUEST_QUEUE_LEN(isp);
1008 		mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
1009 		mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
1010 		mbs.param[5] = 0;
1011 		isp_mboxcmd(isp, &mbs, MBLOGALL);
1012 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1013 			return;
1014 		}
1015 		isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
1016 	}
1017 
1018 	/*
1019 	 * Turn on Fast Posting, LVD transitions
1020 	 *
1021 	 * Ultra2 F/W always has had fast posting (and LVD transitions)
1022 	 *
1023 	 * Ultra and older (i.e., SBus) cards may not. It's just safer
1024 	 * to assume not for them.
1025 	 */
1026 
1027 	mbs.param[0] = MBOX_SET_FW_FEATURES;
1028 	mbs.param[1] = 0;
1029 	if (IS_ULTRA2(isp))
1030 		mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
1031 #ifndef	ISP_NO_RIO
1032 	if (IS_ULTRA2(isp) || IS_1240(isp))
1033 		mbs.param[1] |= FW_FEATURE_RIO_16BIT;
1034 #else
1035 #ifndef	ISP_NO_FASTPOST
1036 	if (IS_ULTRA2(isp) || IS_1240(isp))
1037 		mbs.param[1] |= FW_FEATURE_FAST_POST;
1038 #endif
1039 #endif
1040 	if (mbs.param[1] != 0) {
1041 		uint16_t sfeat = mbs.param[1];
1042 		isp_mboxcmd(isp, &mbs, MBLOGALL);
1043 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1044 			isp_prt(isp, ISP_LOGINFO,
1045 			    "Enabled FW features (0x%x)", sfeat);
1046 		}
1047 	}
1048 
1049 	/*
1050 	 * Let the outer layers decide whether to issue a SCSI bus reset.
1051 	 */
1052 	isp->isp_state = ISP_INITSTATE;
1053 }
1054 
1055 static void
1056 isp_scsi_channel_init(ispsoftc_t *isp, int channel)
1057 {
1058 	sdparam *sdp;
1059 	mbreg_t mbs;
1060 	int tgt;
1061 
1062 	sdp = isp->isp_param;
1063 	sdp += channel;
1064 
1065 	/*
1066 	 * Set (possibly new) Initiator ID.
1067 	 */
1068 	MEMZERO(&mbs, sizeof (mbs));
1069 	mbs.param[0] = MBOX_SET_INIT_SCSI_ID;
1070 	mbs.param[1] = (channel << 7) | sdp->isp_initiator_id;
1071 	isp_mboxcmd(isp, &mbs, MBLOGALL);
1072 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1073 		return;
1074 	}
1075 	isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d",
1076 	    sdp->isp_initiator_id, channel);
1077 
1078 
1079 	/*
1080 	 * Set current per-target parameters to an initial safe minimum.
1081 	 */
1082 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1083 		int lun;
1084 		uint16_t sdf;
1085 
1086 		if (sdp->isp_devparam[tgt].dev_enable == 0) {
1087 			continue;
1088 		}
1089 #ifndef	ISP_TARGET_MODE
1090 		sdf = sdp->isp_devparam[tgt].goal_flags;
1091 		sdf &= DPARM_SAFE_DFLT;
1092 		/*
1093 		 * It is not quite clear when this changed over so that
1094 		 * we could force narrow and async for 1000/1020 cards,
1095 		 * but assume that this is only the case for loaded
1096 		 * firmware.
1097 		 */
1098 		if (isp->isp_loaded_fw) {
1099 			sdf |= DPARM_NARROW | DPARM_ASYNC;
1100 		}
1101 #else
1102 		/*
1103 		 * The !$*!)$!$)* f/w uses the same index into some
1104 		 * internal table to decide how to respond to negotiations,
1105 		 * so if we've said "let's be safe" for ID X, and ID X
1106 		 * selects *us*, the negotiations will back to 'safe'
1107 		 * (as in narrow/async). What the f/w *should* do is
1108 		 * use the initiator id settings to decide how to respond.
1109 		 */
1110 		sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT;
1111 #endif
1112 		mbs.param[0] = MBOX_SET_TARGET_PARAMS;
1113 		mbs.param[1] = (channel << 15) | (tgt << 8);
1114 		mbs.param[2] = sdf;
1115 		if ((sdf & DPARM_SYNC) == 0) {
1116 			mbs.param[3] = 0;
1117 		} else {
1118 			mbs.param[3] =
1119 			    (sdp->isp_devparam[tgt].goal_offset << 8) |
1120 			    (sdp->isp_devparam[tgt].goal_period);
1121 		}
1122 		isp_prt(isp, ISP_LOGDEBUG0,
1123 		    "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
1124 		    channel, tgt, mbs.param[2], mbs.param[3] >> 8,
1125 		    mbs.param[3] & 0xff);
1126 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
1127 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1128 			sdf = DPARM_SAFE_DFLT;
1129 			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
1130 			mbs.param[1] = (tgt << 8) | (channel << 15);
1131 			mbs.param[2] = sdf;
1132 			mbs.param[3] = 0;
1133 			isp_mboxcmd(isp, &mbs, MBLOGALL);
1134 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1135 				continue;
1136 			}
1137 		}
1138 
1139 		/*
1140 		 * We don't update any information directly from the f/w
1141 		 * because we need to run at least one command to cause a
1142 		 * new state to be latched up. So, we just assume that we
1143 		 * converge to the values we just had set.
1144 		 *
1145 		 * Ensure that we don't believe tagged queuing is enabled yet.
1146 		 * It turns out that sometimes the ISP just ignores our
1147 		 * attempts to set parameters for devices that it hasn't
1148 		 * seen yet.
1149 		 */
1150 		sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING;
1151 		for (lun = 0; lun < (int) isp->isp_maxluns; lun++) {
1152 			mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS;
1153 			mbs.param[1] = (channel << 15) | (tgt << 8) | lun;
1154 			mbs.param[2] = sdp->isp_max_queue_depth;
1155 			mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
1156 			isp_mboxcmd(isp, &mbs, MBLOGALL);
1157 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1158 				break;
1159 			}
1160 		}
1161 	}
1162 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1163 		if (sdp->isp_devparam[tgt].dev_refresh) {
1164 			isp->isp_sendmarker |= (1 << channel);
1165 			isp->isp_update |= (1 << channel);
1166 			break;
1167 		}
1168 	}
1169 }
1170 
1171 /*
1172  * Fibre Channel specific initialization.
1173  *
1174  * Locks are held before coming here.
1175  */
1176 static void
1177 isp_fibre_init(ispsoftc_t *isp)
1178 {
1179 	fcparam *fcp;
1180 	isp_icb_t local, *icbp = &local;
1181 	mbreg_t mbs;
1182 	int loopid;
1183 	uint64_t nwwn, pwwn;
1184 
1185 	fcp = isp->isp_param;
1186 
1187 	/*
1188 	 * Do this *before* initializing the firmware.
1189 	 */
1190 	isp_mark_getpdb_all(isp);
1191 	fcp->isp_fwstate = FW_CONFIG_WAIT;
1192 	fcp->isp_loopstate = LOOP_NIL;
1193 
1194 	/*
1195 	 * If we have no role (neither target nor initiator), return.
1196 	 */
1197 	if (isp->isp_role == ISP_ROLE_NONE) {
1198 		return;
1199 	}
1200 
1201 	loopid = fcp->isp_loopid;
1202 	MEMZERO(icbp, sizeof (*icbp));
1203 	icbp->icb_version = ICB_VERSION1;
1204 
1205 	/*
1206 	 * Firmware Options are either retrieved from NVRAM or
1207 	 * are patched elsewhere. We check them for sanity here
1208 	 * and make changes based on board revision, but otherwise
1209 	 * let others decide policy.
1210 	 */
1211 
1212 	/*
1213 	 * If this is a 2100 < revision 5, we have to turn off FAIRNESS.
1214 	 */
1215 	if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) {
1216 		fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS;
1217 	}
1218 
1219 	/*
1220 	 * We have to use FULL LOGIN even though it resets the loop too much
1221 	 * because otherwise port database entries don't get updated after
1222 	 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0.
1223 	 */
1224 	if (!ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
1225 		fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN;
1226 	}
1227 
1228 	/*
1229 	 * Insist on Port Database Update Async notifications
1230 	 */
1231 	fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
1232 
1233 	/*
1234 	 * Make sure that target role reflects into fwoptions.
1235 	 */
1236 	if (isp->isp_role & ISP_ROLE_TARGET) {
1237 		fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE;
1238 	} else {
1239 		fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE;
1240 	}
1241 
1242 	if (isp->isp_role & ISP_ROLE_INITIATOR) {
1243 		fcp->isp_fwoptions &= ~ICBOPT_INI_DISABLE;
1244 	} else {
1245 		fcp->isp_fwoptions |= ICBOPT_INI_DISABLE;
1246 	}
1247 
1248 	/*
1249 	 * Propagate all of this into the ICB structure.
1250 	 */
1251 	icbp->icb_fwoptions = fcp->isp_fwoptions;
1252 	icbp->icb_maxfrmlen = fcp->isp_maxfrmlen;
1253 	if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN ||
1254 	    icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
1255 		isp_prt(isp, ISP_LOGERR,
1256 		    "bad frame length (%d) from NVRAM- using %d",
1257 		    fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN);
1258 		icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
1259 	}
1260 	icbp->icb_maxalloc = fcp->isp_maxalloc;
1261 	if (icbp->icb_maxalloc < 1) {
1262 		isp_prt(isp, ISP_LOGERR,
1263 		    "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc);
1264 		icbp->icb_maxalloc = 16;
1265 	}
1266 	icbp->icb_execthrottle = fcp->isp_execthrottle;
1267 	if (icbp->icb_execthrottle < 1) {
1268 		isp_prt(isp, ISP_LOGERR,
1269 		    "bad execution throttle of %d- using 16",
1270 		    fcp->isp_execthrottle);
1271 		icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
1272 	}
1273 	icbp->icb_retry_delay = fcp->isp_retry_delay;
1274 	icbp->icb_retry_count = fcp->isp_retry_count;
1275 	icbp->icb_hardaddr = loopid;
1276 	if (icbp->icb_hardaddr >= 125) {
1277 		/*
1278 		 * We end up with these Loop IDs for F-Port topologies
1279 		 */
1280 		if (icbp->icb_hardaddr != 0xff && icbp->icb_hardaddr != 0x800) {
1281 		    isp_prt(isp, ISP_LOGERR,
1282 			"bad hard address %u- resetting to zero",
1283 			icbp->icb_hardaddr);
1284 		}
1285 		icbp->icb_hardaddr = 0;
1286 	}
1287 	/*
1288 	 * Right now we just set extended options to prefer point-to-point
1289 	 * over loop based upon some soft config options.
1290 	 *
1291 	 * NB: for the 2300, ICBOPT_EXTENDED is required.
1292 	 */
1293 	if (IS_2200(isp) || IS_23XX(isp)) {
1294 		icbp->icb_fwoptions |= ICBOPT_EXTENDED;
1295 		/*
1296 		 * Prefer or force Point-To-Point instead Loop?
1297 		 */
1298 		switch(isp->isp_confopts & ISP_CFG_PORT_PREF) {
1299 		case ISP_CFG_NPORT:
1300 			icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
1301 			break;
1302 		case ISP_CFG_NPORT_ONLY:
1303 			icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
1304 			break;
1305 		case ISP_CFG_LPORT_ONLY:
1306 			icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
1307 			break;
1308 		default:
1309 			icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
1310 			break;
1311 		}
1312 		if (IS_23XX(isp)) {
1313 			/*
1314 			 * QLogic recommends that FAST Posting be turned
1315 			 * off for 23XX cards and instead allow the HBA
1316 			 * to write response queue entries and interrupt
1317 			 * after a delay (ZIO).
1318 			 *
1319 			 * If we set ZIO, it will disable fast posting,
1320 			 * so we don't need to clear it in fwoptions.
1321 			 *
1322 			 * Depending on the role we're selecting, we
1323 			 * chose fast posting or not as it still is
1324 			 * a win for target mode.
1325 			 */
1326 #ifndef	ISP_NO_ZIO
1327 			if (isp->isp_role == ISP_ROLE_TARGET) {
1328 				icbp->icb_fwoptions |= ICBOPT_FAST_POST;
1329 			} else {
1330 				icbp->icb_xfwoptions |= ICBXOPT_ZIO;
1331 			}
1332 #else
1333 			icbp->icb_fwoptions |= ICBOPT_FAST_POST;
1334 #endif
1335 #if	0
1336 			/*
1337 			 * Values, in 100us increments. The default
1338 			 * is 2 (200us) if a value 0 (default) is
1339 			 * selected.
1340 			 */
1341 			icbp->icb_idelaytimer = 2;
1342 #endif
1343 
1344 			if (isp->isp_confopts & ISP_CFG_ONEGB) {
1345 				icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB;
1346 			} else if (isp->isp_confopts & ISP_CFG_TWOGB) {
1347 				icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB;
1348 			} else {
1349 				icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO;
1350 			}
1351 		}
1352 	}
1353 
1354 #ifndef	ISP_NO_RIO_FC
1355 	/*
1356 	 * RIO seems to be enabled in 2100s for fw >= 1.17.0.
1357 	 *
1358 	 * I've had some questionable problems with RIO on 2200.
1359 	 * More specifically, on a 2204 I had problems with RIO
1360 	 * on a Linux system where I was dropping commands right
1361 	 * and left. It's not clear to me what the actual problem
1362 	 * was.
1363 	 *
1364 	 * 23XX Cards do not support RIO. Instead they support ZIO.
1365 	 */
1366 #if	0
1367 	if (!IS_23XX(isp) && ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
1368 		icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT;
1369 		icbp->icb_racctimer = 4;
1370 		icbp->icb_idelaytimer = 8;
1371 	}
1372 #endif
1373 #endif
1374 
1375 	MEMZERO(&mbs, sizeof (mbs));
1376 
1377 	/*
1378 	 * For 22XX > 2.1.26 && 23XX, set some options.
1379 	 * XXX: Probably okay for newer 2100 f/w too.
1380 	 */
1381 	if (ISP_FW_NEWER_THAN(isp, 2, 26, 0)) {
1382 		/*
1383 		 * Turn on LIP F8 async event (1)
1384 		 * Turn on generate AE 8013 on all LIP Resets (2)
1385 		 * Disable LIP F7 switching (8)
1386 		 */
1387 		mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS;
1388 		mbs.param[1] = 0xb;
1389 		mbs.param[2] = 0;
1390 		mbs.param[3] = 0;
1391 		isp_mboxcmd(isp, &mbs, MBLOGALL);
1392 	}
1393 	icbp->icb_logintime = ICB_LOGIN_TOV;
1394 	icbp->icb_lunetimeout = ICB_LUN_ENABLE_TOV;
1395 
1396 	if (IS_23XX(isp)) {
1397 		ISP_WRITE(isp, isp->isp_rqstinrp, 0);
1398         	ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
1399         	ISP_WRITE(isp, isp->isp_respinrp, 0);
1400 		ISP_WRITE(isp, isp->isp_respoutrp, 0);
1401 	}
1402 
1403 	nwwn = ISP_NODEWWN(isp);
1404 	pwwn = ISP_PORTWWN(isp);
1405 	if (nwwn && pwwn) {
1406 		icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
1407 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn);
1408 		MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn);
1409 		isp_prt(isp, ISP_LOGDEBUG1,
1410 		    "Setting ICB Node 0x%08x%08x Port 0x%08x%08x",
1411 		    ((uint32_t) (nwwn >> 32)),
1412 		    ((uint32_t) (nwwn & 0xffffffff)),
1413 		    ((uint32_t) (pwwn >> 32)),
1414 		    ((uint32_t) (pwwn & 0xffffffff)));
1415 	} else {
1416 		isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs");
1417 		icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN);
1418 	}
1419 	icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
1420 	if (icbp->icb_rqstqlen < 1) {
1421 		isp_prt(isp, ISP_LOGERR, "bad request queue length");
1422 	}
1423 	icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
1424 	if (icbp->icb_rsltqlen < 1) {
1425 		isp_prt(isp, ISP_LOGERR, "bad result queue length");
1426 	}
1427 	icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
1428 	icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
1429 	icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
1430 	icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
1431 	icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
1432 	icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
1433 	icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
1434 	icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
1435 	isp_prt(isp, ISP_LOGDEBUG0,
1436 	    "isp_fibre_init: fwopt 0x%x xfwopt 0x%x zfwopt 0x%x",
1437 	    icbp->icb_fwoptions, icbp->icb_xfwoptions, icbp->icb_zfwoptions);
1438 
1439 	FC_SCRATCH_ACQUIRE(isp);
1440 	isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch);
1441 
1442 	/*
1443 	 * Init the firmware
1444 	 */
1445 	mbs.param[0] = MBOX_INIT_FIRMWARE;
1446 	mbs.param[1] = 0;
1447 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
1448 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
1449 	mbs.param[4] = 0;
1450 	mbs.param[5] = 0;
1451 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
1452 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
1453 	isp_mboxcmd(isp, &mbs, MBLOGALL);
1454 	FC_SCRATCH_RELEASE(isp);
1455 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1456 		return;
1457 	}
1458 	isp->isp_reqidx = isp->isp_reqodx = 0;
1459 	isp->isp_residx = 0;
1460 	isp->isp_sendmarker = 1;
1461 
1462 	/*
1463 	 * Whatever happens, we're now committed to being here.
1464 	 */
1465 	isp->isp_state = ISP_INITSTATE;
1466 }
1467 
1468 /*
1469  * Fibre Channel Support- get the port database for the id.
1470  *
1471  * Locks are held before coming here. Return 0 if success,
1472  * else failure.
1473  */
1474 
1475 static int
1476 isp_getmap(ispsoftc_t *isp, fcpos_map_t *map)
1477 {
1478 	fcparam *fcp = (fcparam *) isp->isp_param;
1479 	mbreg_t mbs;
1480 
1481 	MEMZERO(&mbs, sizeof (mbs));
1482 	mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP;
1483 	mbs.param[1] = 0;
1484 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
1485 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
1486 	/*
1487 	 * Unneeded. For the 2100, except for initializing f/w, registers
1488 	 * 4/5 have to not be written to.
1489 	 *	mbs.param[4] = 0;
1490 	 *	mbs.param[5] = 0;
1491 	 *
1492 	 */
1493 	mbs.param[6] = 0;
1494 	mbs.param[7] = 0;
1495 	FC_SCRATCH_ACQUIRE(isp);
1496 	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
1497 	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1498 		MEMCPY(map, fcp->isp_scratch, sizeof (fcpos_map_t));
1499 		map->fwmap = mbs.param[1] != 0;
1500 		FC_SCRATCH_RELEASE(isp);
1501 		return (0);
1502 	}
1503 	FC_SCRATCH_RELEASE(isp);
1504 	return (-1);
1505 }
1506 
1507 static void
1508 isp_mark_getpdb_all(ispsoftc_t *isp)
1509 {
1510 	fcparam *fcp = (fcparam *) isp->isp_param;
1511 	int i;
1512 	for (i = 0; i < MAX_FC_TARG; i++) {
1513 		fcp->portdb[i].valid = fcp->portdb[i].fabric_dev = 0;
1514 	}
1515 }
1516 
1517 static int
1518 isp_getpdb(ispsoftc_t *isp, int id, isp_pdb_t *pdbp)
1519 {
1520 	fcparam *fcp = (fcparam *) isp->isp_param;
1521 	mbreg_t mbs;
1522 
1523 	MEMZERO(&mbs, sizeof (mbs));
1524 	mbs.param[0] = MBOX_GET_PORT_DB;
1525 	if (IS_2KLOGIN(isp)) {
1526 		mbs.param[1] = id;
1527 		mbs.obits |= (1 << 10);
1528 	} else {
1529 		mbs.param[1] = id << 8;
1530 	}
1531 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
1532 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
1533 	/*
1534 	 * Unneeded. For the 2100, except for initializing f/w, registers
1535 	 * 4/5 have to not be written to.
1536 	 *	mbs.param[4] = 0;
1537 	 *	mbs.param[5] = 0;
1538 	 *
1539 	 */
1540 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
1541 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
1542 	FC_SCRATCH_ACQUIRE(isp);
1543 	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
1544 	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1545 		isp_get_pdb(isp, (isp_pdb_t *)fcp->isp_scratch, pdbp);
1546 		FC_SCRATCH_RELEASE(isp);
1547 		return (0);
1548 	}
1549 	FC_SCRATCH_RELEASE(isp);
1550 	return (-1);
1551 }
1552 
1553 static uint64_t
1554 isp_get_portname(ispsoftc_t *isp, int loopid, int nodename)
1555 {
1556 	uint64_t wwn = 0;
1557 	mbreg_t mbs;
1558 
1559 	MEMZERO(&mbs, sizeof (mbs));
1560 	mbs.param[0] = MBOX_GET_PORT_NAME;
1561 	if (IS_2KLOGIN(isp)) {
1562 		mbs.param[1] = loopid;
1563 		if (nodename)
1564 			mbs.param[10] = 1;
1565 		mbs.obits |= (1 << 10);
1566 	} else {
1567 		mbs.param[1] = loopid << 8;
1568 		if (nodename)
1569 			mbs.param[1] |= 1;
1570 	}
1571 	isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
1572 	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1573 		wwn =
1574 		    (((uint64_t)(mbs.param[2] & 0xff)) << 56) |
1575 		    (((uint64_t)(mbs.param[2] >> 8))	<< 48) |
1576 		    (((uint64_t)(mbs.param[3] & 0xff))	<< 40) |
1577 		    (((uint64_t)(mbs.param[3] >> 8))	<< 32) |
1578 		    (((uint64_t)(mbs.param[6] & 0xff))	<< 24) |
1579 		    (((uint64_t)(mbs.param[6] >> 8))	<< 16) |
1580 		    (((uint64_t)(mbs.param[7] & 0xff))	<<  8) |
1581 		    (((uint64_t)(mbs.param[7] >> 8)));
1582 	}
1583 	return (wwn);
1584 }
1585 
1586 /*
1587  * Make sure we have good FC link and know our Loop ID.
1588  */
1589 
1590 static int
1591 isp_fclink_test(ispsoftc_t *isp, int usdelay)
1592 {
1593 	static char *toponames[] = {
1594 		"Private Loop",
1595 		"FL Port",
1596 		"N-Port to N-Port",
1597 		"F Port",
1598 		"F Port (no FLOGI_ACC response)"
1599 	};
1600 	mbreg_t mbs;
1601 	int count, check_for_fabric;
1602 	uint8_t lwfs;
1603 	fcparam *fcp;
1604 	struct lportdb *lp;
1605 	isp_pdb_t pdb;
1606 
1607 	fcp = isp->isp_param;
1608 
1609 	/*
1610 	 * XXX: Here is where we would start a 'loop dead' timeout
1611 	 */
1612 
1613 	/*
1614 	 * Wait up to N microseconds for F/W to go to a ready state.
1615 	 */
1616 	lwfs = FW_CONFIG_WAIT;
1617 	count = 0;
1618 	while (count < usdelay) {
1619 		uint64_t enano;
1620 		uint32_t wrk;
1621 		NANOTIME_T hra, hrb;
1622 
1623 		GET_NANOTIME(&hra);
1624 		isp_fw_state(isp);
1625 		if (lwfs != fcp->isp_fwstate) {
1626 			isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>",
1627 			    isp2100_fw_statename((int)lwfs),
1628 			    isp2100_fw_statename((int)fcp->isp_fwstate));
1629 			lwfs = fcp->isp_fwstate;
1630 		}
1631 		if (fcp->isp_fwstate == FW_READY) {
1632 			break;
1633 		}
1634 		GET_NANOTIME(&hrb);
1635 
1636 		/*
1637 		 * Get the elapsed time in nanoseconds.
1638 		 * Always guaranteed to be non-zero.
1639 		 */
1640 		enano = NANOTIME_SUB(&hrb, &hra);
1641 
1642 		isp_prt(isp, ISP_LOGDEBUG1,
1643 		    "usec%d: 0x%lx->0x%lx enano 0x%x%08x",
1644 		    count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb),
1645 		    (uint32_t)(enano >> 32), (uint32_t)(enano & 0xffffffff));
1646 
1647 		/*
1648 		 * If the elapsed time is less than 1 millisecond,
1649 		 * delay a period of time up to that millisecond of
1650 		 * waiting.
1651 		 *
1652 		 * This peculiar code is an attempt to try and avoid
1653 		 * invoking uint64_t math support functions for some
1654 		 * platforms where linkage is a problem.
1655 		 */
1656 		if (enano < (1000 * 1000)) {
1657 			count += 1000;
1658 			enano = (1000 * 1000) - enano;
1659 			while (enano > (uint64_t) 4000000000U) {
1660 				USEC_SLEEP(isp, 4000000);
1661 				enano -= (uint64_t) 4000000000U;
1662 			}
1663 			wrk = enano;
1664 			wrk /= 1000;
1665 			USEC_SLEEP(isp, wrk);
1666 		} else {
1667 			while (enano > (uint64_t) 4000000000U) {
1668 				count += 4000000;
1669 				enano -= (uint64_t) 4000000000U;
1670 			}
1671 			wrk = enano;
1672 			count += (wrk / 1000);
1673 		}
1674 	}
1675 
1676 	/*
1677 	 * If we haven't gone to 'ready' state, return.
1678 	 */
1679 	if (fcp->isp_fwstate != FW_READY) {
1680 		return (-1);
1681 	}
1682 
1683 	/*
1684 	 * Get our Loop ID (if possible). We really need to have it.
1685 	 */
1686 	MEMZERO(&mbs, sizeof (mbs));
1687 	mbs.param[0] = MBOX_GET_LOOP_ID;
1688 	isp_mboxcmd(isp, &mbs, MBLOGALL);
1689 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1690 		return (-1);
1691 	}
1692 	fcp->isp_loopid = mbs.param[1];
1693 	if (fcp->isp_loopid == 0xffff) {	/* happens with 2k login f/w */
1694 		fcp->isp_loopid = MAX_FC_TARG-1;
1695 	} else if (fcp->isp_loopid >= MAX_FC_TARG) {
1696 		isp_prt(isp, ISP_LOGWARN, "bad initiator loopid (0x%x)", fcp->isp_loopid);
1697 		fcp->isp_loopid = MAX_FC_TARG-1;
1698 	}
1699 	if (IS_2200(isp) || IS_23XX(isp)) {
1700 		int topo = (int) mbs.param[6];
1701 		if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB)
1702 			topo = TOPO_PTP_STUB;
1703 		fcp->isp_topo = topo;
1704 	} else {
1705 		fcp->isp_topo = TOPO_NL_PORT;
1706 	}
1707 	/*
1708 	 * Get the port id.
1709 	 */
1710 	fcp->isp_portid = mbs.param[2] | (mbs.param[3] << 16);
1711 
1712 	/*
1713 	 * Check to see if we're on a fabric by trying to see if we
1714 	 * can talk to the fabric name server. This can be a bit
1715 	 * tricky because if we're a 2100, we should check always
1716 	 * (in case we're connected to a server doing aliasing).
1717 	 */
1718 	fcp->isp_onfabric = 0;
1719 
1720 	if (IS_2100(isp)) {
1721 		/*
1722 		 * Don't bother with fabric if we are using really old
1723 		 * 2100 firmware. It's just not worth it.
1724 		 */
1725 		if (ISP_FW_NEWER_THAN(isp, 1, 15, 37)) {
1726 			check_for_fabric = 1;
1727 		} else {
1728 			check_for_fabric = 0;
1729 		}
1730 	} else if (fcp->isp_topo == TOPO_FL_PORT ||
1731 	    fcp->isp_topo == TOPO_F_PORT) {
1732 		check_for_fabric = 1;
1733 	} else
1734 		check_for_fabric = 0;
1735 
1736 	if (check_for_fabric && isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) {
1737 		int loopid = FL_PORT_ID;
1738 		if (IS_2100(isp)) {
1739 			fcp->isp_topo = TOPO_FL_PORT;
1740 		}
1741 
1742 		if (BITS2WORD(pdb.pdb_portid_bits) == 0) {
1743 			/*
1744 			 * Crock.
1745 			 */
1746 			fcp->isp_topo = TOPO_NL_PORT;
1747 			goto not_on_fabric;
1748 		}
1749 		fcp->isp_portid = mbs.param[2] | ((int) mbs.param[3] << 16);
1750 
1751 		/*
1752 		 * Save the Fabric controller's port database entry.
1753 		 */
1754 		lp = &fcp->portdb[loopid];
1755 		lp->node_wwn =
1756 		    (((uint64_t)pdb.pdb_nodename[0]) << 56) |
1757 		    (((uint64_t)pdb.pdb_nodename[1]) << 48) |
1758 		    (((uint64_t)pdb.pdb_nodename[2]) << 40) |
1759 		    (((uint64_t)pdb.pdb_nodename[3]) << 32) |
1760 		    (((uint64_t)pdb.pdb_nodename[4]) << 24) |
1761 		    (((uint64_t)pdb.pdb_nodename[5]) << 16) |
1762 		    (((uint64_t)pdb.pdb_nodename[6]) <<  8) |
1763 		    (((uint64_t)pdb.pdb_nodename[7]));
1764 		lp->port_wwn =
1765 		    (((uint64_t)pdb.pdb_portname[0]) << 56) |
1766 		    (((uint64_t)pdb.pdb_portname[1]) << 48) |
1767 		    (((uint64_t)pdb.pdb_portname[2]) << 40) |
1768 		    (((uint64_t)pdb.pdb_portname[3]) << 32) |
1769 		    (((uint64_t)pdb.pdb_portname[4]) << 24) |
1770 		    (((uint64_t)pdb.pdb_portname[5]) << 16) |
1771 		    (((uint64_t)pdb.pdb_portname[6]) <<  8) |
1772 		    (((uint64_t)pdb.pdb_portname[7]));
1773 		lp->roles =
1774 		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
1775 		lp->portid = BITS2WORD(pdb.pdb_portid_bits);
1776 		lp->loopid = pdb.pdb_loopid;
1777 		lp->loggedin = lp->valid = 1;
1778 		fcp->isp_onfabric = 1;
1779 		(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
1780 		isp_register_fc4_type(isp);
1781 	} else {
1782 not_on_fabric:
1783 		fcp->isp_onfabric = 0;
1784 		fcp->portdb[FL_PORT_ID].valid = 0;
1785 	}
1786 
1787 	fcp->isp_gbspeed = 1;
1788 	if (IS_23XX(isp)) {
1789 		mbs.param[0] = MBOX_GET_SET_DATA_RATE;
1790 		mbs.param[1] = MBGSD_GET_RATE;
1791 		/* mbs.param[2] undefined if we're just getting rate */
1792 		isp_mboxcmd(isp, &mbs, MBLOGALL);
1793 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1794 			if (mbs.param[1] == MBGSD_TWOGB) {
1795 				isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s");
1796 				fcp->isp_gbspeed = 2;
1797 			}
1798 		}
1799 	}
1800 
1801 	isp_prt(isp, ISP_LOGCONFIG, topology, fcp->isp_loopid,
1802 	    fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]);
1803 
1804 	/*
1805 	 * Announce ourselves, too. This involves synthesizing an entry.
1806 	 */
1807 	if (fcp->isp_iid_set == 0) {
1808 		fcp->isp_iid_set = 1;
1809 		fcp->isp_iid = fcp->isp_loopid;
1810 		lp = &fcp->portdb[fcp->isp_iid];
1811 	} else {
1812 		lp = &fcp->portdb[fcp->isp_iid];
1813 		if (fcp->isp_portid != lp->portid ||
1814 		    fcp->isp_loopid != lp->loopid ||
1815 		    fcp->isp_nodewwn != ISP_NODEWWN(isp) ||
1816 		    fcp->isp_portwwn != ISP_PORTWWN(isp)) {
1817 			lp->valid = 0;
1818 			count = fcp->isp_iid;
1819 			(void) isp_async(isp, ISPASYNC_PROMENADE, &count);
1820 		}
1821 	}
1822 	lp->loopid = fcp->isp_loopid;
1823 	lp->portid = fcp->isp_portid;
1824 	lp->node_wwn = ISP_NODEWWN(isp);
1825 	lp->port_wwn = ISP_PORTWWN(isp);
1826 	switch (isp->isp_role) {
1827 	case ISP_ROLE_NONE:
1828 		lp->roles = 0;
1829 		break;
1830 	case ISP_ROLE_TARGET:
1831 		lp->roles = SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT;
1832 		break;
1833 	case ISP_ROLE_INITIATOR:
1834 		lp->roles = SVC3_INI_ROLE >> SVC3_ROLE_SHIFT;
1835 		break;
1836 	case ISP_ROLE_BOTH:
1837 		lp->roles = (SVC3_INI_ROLE|SVC3_TGT_ROLE) >> SVC3_ROLE_SHIFT;
1838 		break;
1839 	}
1840 	lp->loggedin = lp->valid = 1;
1841 	count = fcp->isp_iid;
1842 	(void) isp_async(isp, ISPASYNC_PROMENADE, &count);
1843 	return (0);
1844 }
1845 
1846 static char *
1847 isp2100_fw_statename(int state)
1848 {
1849 	switch(state) {
1850 	case FW_CONFIG_WAIT:	return "Config Wait";
1851 	case FW_WAIT_AL_PA:	return "Waiting for AL_PA";
1852 	case FW_WAIT_LOGIN:	return "Wait Login";
1853 	case FW_READY:		return "Ready";
1854 	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
1855 	case FW_ERROR:		return "Error";
1856 	case FW_REINIT:		return "Re-Init";
1857 	case FW_NON_PART:	return "Nonparticipating";
1858 	default:		return "?????";
1859 	}
1860 }
1861 
1862 /*
1863  * Synchronize our soft copy of the port database with what the f/w thinks
1864  * (with a view toward possibly for a specific target....)
1865  */
1866 
1867 static int
1868 isp_pdb_sync(ispsoftc_t *isp)
1869 {
1870 	struct lportdb *lp;
1871 	fcparam *fcp = isp->isp_param;
1872 	isp_pdb_t pdb;
1873 	int loopid, base, lim;
1874 
1875 	/*
1876 	 * Make sure we're okay for doing this right now.
1877 	 */
1878 	if (fcp->isp_loopstate != LOOP_PDB_RCVD &&
1879 	    fcp->isp_loopstate != LOOP_FSCAN_DONE &&
1880 	    fcp->isp_loopstate != LOOP_LSCAN_DONE) {
1881 		return (-1);
1882 	}
1883 
1884 	if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_NL_PORT ||
1885 	    fcp->isp_topo == TOPO_N_PORT) {
1886 		if (fcp->isp_loopstate < LOOP_LSCAN_DONE) {
1887 			if (isp_scan_loop(isp) != 0) {
1888 				return (-1);
1889 			}
1890 		}
1891 	}
1892 	fcp->isp_loopstate = LOOP_SYNCING_PDB;
1893 
1894 	/*
1895 	 * If we get this far, we've settled our differences with the f/w
1896 	 * (for local loop device) and we can say that the loop state is ready.
1897 	 */
1898 
1899 	if (fcp->isp_topo == TOPO_NL_PORT) {
1900 		fcp->loop_seen_once = 1;
1901 		fcp->isp_loopstate = LOOP_READY;
1902 		return (0);
1903 	}
1904 
1905 	/*
1906 	 * Find all Fabric Entities that didn't make it from one scan to the
1907 	 * next and let the world know they went away. Scan the whole database.
1908 	 */
1909 	for (lp = &fcp->portdb[0]; lp < &fcp->portdb[MAX_FC_TARG]; lp++) {
1910 		if (lp->was_fabric_dev && lp->fabric_dev == 0) {
1911 			loopid = lp - fcp->portdb;
1912 			lp->valid = 0;	/* should already be set */
1913 			(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
1914 			MEMZERO((void *) lp, sizeof (*lp));
1915 			continue;
1916 		}
1917 		lp->was_fabric_dev = lp->fabric_dev;
1918 	}
1919 
1920 	if (fcp->isp_topo == TOPO_FL_PORT)
1921 		base = FC_SNS_ID+1;
1922 	else
1923 		base = 0;
1924 
1925 	if (fcp->isp_topo == TOPO_N_PORT)
1926 		lim = 1;
1927 	else
1928 		lim = MAX_FC_TARG;
1929 
1930 	/*
1931 	 * Now log in any fabric devices that the outer layer has
1932 	 * left for us to see. This seems the most sane policy
1933 	 * for the moment.
1934 	 */
1935 	for (lp = &fcp->portdb[base]; lp < &fcp->portdb[lim]; lp++) {
1936 		uint32_t portid;
1937 		mbreg_t mbs;
1938 
1939 		loopid = lp - fcp->portdb;
1940 		if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) {
1941 			continue;
1942 		}
1943 
1944 		/*
1945 		 * Anything here?
1946 		 */
1947 		if (lp->port_wwn == 0) {
1948 			continue;
1949 		}
1950 
1951 		/*
1952 		 * Don't try to log into yourself.
1953 		 */
1954 		if ((portid = lp->portid) == fcp->isp_portid) {
1955 			continue;
1956 		}
1957 
1958 
1959 		/*
1960 		 * If we'd been logged in- see if we still are and we haven't
1961 		 * changed. If so, no need to log ourselves out, etc..
1962 		 *
1963 		 * Unfortunately, our charming Qlogic f/w has decided to
1964 		 * return a valid port database entry for a fabric device
1965 		 * that has, in fact, gone away. And it hangs trying to
1966 		 * log it out.
1967 		 */
1968 		if (lp->loggedin && lp->force_logout == 0 &&
1969 		    isp_getpdb(isp, lp->loopid, &pdb) == 0) {
1970 			int nrole;
1971 			uint64_t nwwnn, nwwpn;
1972 			nwwnn =
1973 			    (((uint64_t)pdb.pdb_nodename[0]) << 56) |
1974 			    (((uint64_t)pdb.pdb_nodename[1]) << 48) |
1975 			    (((uint64_t)pdb.pdb_nodename[2]) << 40) |
1976 			    (((uint64_t)pdb.pdb_nodename[3]) << 32) |
1977 			    (((uint64_t)pdb.pdb_nodename[4]) << 24) |
1978 			    (((uint64_t)pdb.pdb_nodename[5]) << 16) |
1979 			    (((uint64_t)pdb.pdb_nodename[6]) <<  8) |
1980 			    (((uint64_t)pdb.pdb_nodename[7]));
1981 			nwwpn =
1982 			    (((uint64_t)pdb.pdb_portname[0]) << 56) |
1983 			    (((uint64_t)pdb.pdb_portname[1]) << 48) |
1984 			    (((uint64_t)pdb.pdb_portname[2]) << 40) |
1985 			    (((uint64_t)pdb.pdb_portname[3]) << 32) |
1986 			    (((uint64_t)pdb.pdb_portname[4]) << 24) |
1987 			    (((uint64_t)pdb.pdb_portname[5]) << 16) |
1988 			    (((uint64_t)pdb.pdb_portname[6]) <<  8) |
1989 			    (((uint64_t)pdb.pdb_portname[7]));
1990 			nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >>
1991 			    SVC3_ROLE_SHIFT;
1992 			if (pdb.pdb_loopid == lp->loopid && lp->portid ==
1993 			    (uint32_t) BITS2WORD(pdb.pdb_portid_bits) &&
1994 			    nwwnn == lp->node_wwn && nwwpn == lp->port_wwn &&
1995 			    lp->roles == nrole && lp->force_logout == 0) {
1996 				lp->loggedin = lp->valid = 1;
1997 				isp_prt(isp, ISP_LOGCONFIG, lretained,
1998 				    (int) (lp - fcp->portdb),
1999 				    (int) lp->loopid, lp->portid);
2000 				continue;
2001 			}
2002 		}
2003 
2004 		if (fcp->isp_fwstate != FW_READY ||
2005 		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
2006 			return (-1);
2007 		}
2008 
2009 		/*
2010 		 * Force a logout if we were logged in.
2011 		 */
2012 		if (lp->loggedin) {
2013 			if (lp->force_logout ||
2014 			    isp_getpdb(isp, lp->loopid, &pdb) == 0) {
2015 				MEMZERO(&mbs, sizeof (mbs));
2016 				mbs.param[0] = MBOX_FABRIC_LOGOUT;
2017 				if (IS_2KLOGIN(isp)) {
2018 					mbs.param[1] = lp->loopid;
2019 					mbs.obits |= (1 << 10);
2020 				} else {
2021 					mbs.param[1] = lp->loopid << 8;
2022 				}
2023 				mbs.param[2] = 0;
2024 				mbs.param[3] = 0;
2025 				isp_mboxcmd(isp, &mbs, MBLOGNONE);
2026 				isp_prt(isp, ISP_LOGINFO, plogout,
2027 				    (int) (lp - fcp->portdb), lp->loopid,
2028 				    lp->portid);
2029 			}
2030 			lp->force_logout = lp->loggedin = 0;
2031 			if (fcp->isp_fwstate != FW_READY ||
2032 			    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
2033 				return (-1);
2034 			}
2035 		}
2036 
2037 		/*
2038 		 * And log in....
2039 		 */
2040 		loopid = lp - fcp->portdb;
2041 		lp->loopid = FL_PORT_ID;
2042 		do {
2043 			MEMZERO(&mbs, sizeof (mbs));
2044 			mbs.param[0] = MBOX_FABRIC_LOGIN;
2045 			if (IS_2KLOGIN(isp)) {
2046 				mbs.param[1] = loopid;
2047 				mbs.obits |= (1 << 10);
2048 			} else {
2049 				mbs.param[1] = loopid << 8;
2050 			}
2051 			mbs.param[2] = portid >> 16;
2052 			mbs.param[3] = portid & 0xffff;
2053 			isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED |
2054 			    MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR));
2055 			if (fcp->isp_fwstate != FW_READY ||
2056 			    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
2057 				return (-1);
2058 			}
2059 			switch (mbs.param[0]) {
2060 			case MBOX_LOOP_ID_USED:
2061 				/*
2062 				 * Try the next available loop id.
2063 				 */
2064 				loopid++;
2065 				break;
2066 			case MBOX_PORT_ID_USED:
2067 				/*
2068 				 * This port is already logged in.
2069 				 * Snaffle the loop id it's using if it's
2070 				 * nonzero, otherwise we're hosed.
2071 				 */
2072 				if (mbs.param[1] != 0) {
2073 					loopid = mbs.param[1];
2074 					if (loopid >= MAX_FC_TARG) {
2075 						loopid = MAX_FC_TARG;
2076 						break;
2077 					}
2078 					isp_prt(isp, ISP_LOGINFO, retained,
2079 					    loopid, (int) (lp - fcp->portdb),
2080 					    lp->portid);
2081 				} else {
2082 					loopid = MAX_FC_TARG;
2083 					break;
2084 				}
2085 				/* FALLTHROUGH */
2086 			case MBOX_COMMAND_COMPLETE:
2087 				lp->loggedin = 1;
2088 				lp->loopid = loopid;
2089 				break;
2090 			case MBOX_COMMAND_ERROR:
2091 				isp_prt(isp, ISP_LOGINFO, plogierr,
2092 				    portid, mbs.param[1]);
2093 				/* FALLTHROUGH */
2094 			case MBOX_ALL_IDS_USED: /* We're outta IDs */
2095 			default:
2096 				loopid = MAX_FC_TARG;
2097 				break;
2098 			}
2099 		} while (lp->loopid == FL_PORT_ID && loopid < MAX_FC_TARG);
2100 
2101 		/*
2102 		 * If we get here and we haven't set a Loop ID,
2103 		 * we failed to log into this device.
2104 		 */
2105 
2106 		if (lp->loopid == FL_PORT_ID) {
2107 			lp->loopid = 0;
2108 			continue;
2109 		}
2110 
2111 		/*
2112 		 * Make sure we can get the approriate port information.
2113 		 */
2114 		if (isp_getpdb(isp, lp->loopid, &pdb) != 0) {
2115 			isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid);
2116 			goto dump_em;
2117 		}
2118 
2119 		if (fcp->isp_fwstate != FW_READY ||
2120 		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
2121 			return (-1);
2122 		}
2123 
2124 		if (pdb.pdb_loopid != lp->loopid) {
2125 			isp_prt(isp, ISP_LOGWARN, pdbmfail1,
2126 			    lp->portid, pdb.pdb_loopid);
2127 			goto dump_em;
2128 		}
2129 
2130 		if (lp->portid != (uint32_t) BITS2WORD(pdb.pdb_portid_bits)) {
2131 			isp_prt(isp, ISP_LOGWARN, pdbmfail2,
2132 			    lp->portid, BITS2WORD(pdb.pdb_portid_bits));
2133 			goto dump_em;
2134 		}
2135 
2136 		lp->roles =
2137 		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
2138 		lp->node_wwn =
2139 		    (((uint64_t)pdb.pdb_nodename[0]) << 56) |
2140 		    (((uint64_t)pdb.pdb_nodename[1]) << 48) |
2141 		    (((uint64_t)pdb.pdb_nodename[2]) << 40) |
2142 		    (((uint64_t)pdb.pdb_nodename[3]) << 32) |
2143 		    (((uint64_t)pdb.pdb_nodename[4]) << 24) |
2144 		    (((uint64_t)pdb.pdb_nodename[5]) << 16) |
2145 		    (((uint64_t)pdb.pdb_nodename[6]) <<  8) |
2146 		    (((uint64_t)pdb.pdb_nodename[7]));
2147 		lp->port_wwn =
2148 		    (((uint64_t)pdb.pdb_portname[0]) << 56) |
2149 		    (((uint64_t)pdb.pdb_portname[1]) << 48) |
2150 		    (((uint64_t)pdb.pdb_portname[2]) << 40) |
2151 		    (((uint64_t)pdb.pdb_portname[3]) << 32) |
2152 		    (((uint64_t)pdb.pdb_portname[4]) << 24) |
2153 		    (((uint64_t)pdb.pdb_portname[5]) << 16) |
2154 		    (((uint64_t)pdb.pdb_portname[6]) <<  8) |
2155 		    (((uint64_t)pdb.pdb_portname[7]));
2156 		/*
2157 		 * Check to make sure this all makes sense.
2158 		 */
2159 		if (lp->node_wwn && lp->port_wwn) {
2160 			lp->valid = 1;
2161 			loopid = lp - fcp->portdb;
2162 			(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
2163 			continue;
2164 		}
2165 dump_em:
2166 		lp->valid = 0;
2167 		isp_prt(isp, ISP_LOGINFO,
2168 		    ldumped, loopid, lp->loopid, lp->portid);
2169 		MEMZERO(&mbs, sizeof (mbs));
2170 		mbs.param[0] = MBOX_FABRIC_LOGOUT;
2171 		if (IS_2KLOGIN(isp)) {
2172 			mbs.param[1] = lp->loopid;
2173 			mbs.obits |= (1 << 10);
2174 		} else {
2175 			mbs.param[1] = lp->loopid << 8;
2176 		}
2177 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
2178 		if (fcp->isp_fwstate != FW_READY ||
2179 		    fcp->isp_loopstate != LOOP_SYNCING_PDB) {
2180 			return (-1);
2181 		}
2182 	}
2183 	/*
2184 	 * If we get here, we've for sure seen not only a valid loop
2185 	 * but know what is or isn't on it, so mark this for usage
2186 	 * in isp_start.
2187 	 */
2188 	fcp->loop_seen_once = 1;
2189 	fcp->isp_loopstate = LOOP_READY;
2190 	return (0);
2191 }
2192 
2193 static int
2194 isp_scan_loop(ispsoftc_t *isp)
2195 {
2196 	struct lportdb *lp;
2197 	fcparam *fcp = isp->isp_param;
2198 	isp_pdb_t pdb;
2199 	int loopid, lim, hival;
2200 
2201 	switch (fcp->isp_topo) {
2202 	case TOPO_NL_PORT:
2203 		hival = FL_PORT_ID;
2204 		break;
2205 	case TOPO_N_PORT:
2206 		hival = 2;
2207 		break;
2208 	case TOPO_FL_PORT:
2209 		hival = FC_PORT_ID;
2210 		break;
2211 	default:
2212 		fcp->isp_loopstate = LOOP_LSCAN_DONE;
2213 		return (0);
2214 	}
2215 	fcp->isp_loopstate = LOOP_SCANNING_LOOP;
2216 
2217 	/*
2218 	 * make sure the temp port database is clean...
2219 	 */
2220 	MEMZERO((void *)fcp->tport, sizeof (fcp->tport));
2221 
2222 	/*
2223 	 * Run through the local loop ports and get port database info
2224 	 * for each loop ID.
2225 	 *
2226 	 * There's a somewhat unexplained situation where the f/w passes back
2227 	 * the wrong database entity- if that happens, just restart (up to
2228 	 * FL_PORT_ID times).
2229 	 */
2230 	for (lim = loopid = 0; loopid < hival; loopid++) {
2231 		lp = &fcp->tport[loopid];
2232 
2233 		/*
2234 		 * Don't even try for ourselves...
2235 	 	 */
2236 		if (loopid == fcp->isp_loopid)
2237 			continue;
2238 
2239 		lp->node_wwn = isp_get_portname(isp, loopid, 1);
2240 		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
2241 			return (-1);
2242 		if (lp->node_wwn == 0)
2243 			continue;
2244 		lp->port_wwn = isp_get_portname(isp, loopid, 0);
2245 		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
2246 			return (-1);
2247 		if (lp->port_wwn == 0) {
2248 			lp->node_wwn = 0;
2249 			continue;
2250 		}
2251 
2252 		/*
2253 		 * Get an entry....
2254 		 */
2255 		if (isp_getpdb(isp, loopid, &pdb) != 0) {
2256 			if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
2257 				return (-1);
2258 			continue;
2259 		}
2260 		if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
2261 			return (-1);
2262 		}
2263 
2264 		/*
2265 		 * If the returned database element doesn't match what we
2266 		 * asked for, restart the process entirely (up to a point...).
2267 		 */
2268 		if (pdb.pdb_loopid != loopid) {
2269 			loopid = 0;
2270 			if (lim++ < hival) {
2271 				continue;
2272 			}
2273 			isp_prt(isp, ISP_LOGWARN,
2274 			    "giving up on synchronizing the port database");
2275 			return (-1);
2276 		}
2277 
2278 		/*
2279 		 * Save the pertinent info locally.
2280 		 */
2281 		lp->node_wwn =
2282 		    (((uint64_t)pdb.pdb_nodename[0]) << 56) |
2283 		    (((uint64_t)pdb.pdb_nodename[1]) << 48) |
2284 		    (((uint64_t)pdb.pdb_nodename[2]) << 40) |
2285 		    (((uint64_t)pdb.pdb_nodename[3]) << 32) |
2286 		    (((uint64_t)pdb.pdb_nodename[4]) << 24) |
2287 		    (((uint64_t)pdb.pdb_nodename[5]) << 16) |
2288 		    (((uint64_t)pdb.pdb_nodename[6]) <<  8) |
2289 		    (((uint64_t)pdb.pdb_nodename[7]));
2290 		lp->port_wwn =
2291 		    (((uint64_t)pdb.pdb_portname[0]) << 56) |
2292 		    (((uint64_t)pdb.pdb_portname[1]) << 48) |
2293 		    (((uint64_t)pdb.pdb_portname[2]) << 40) |
2294 		    (((uint64_t)pdb.pdb_portname[3]) << 32) |
2295 		    (((uint64_t)pdb.pdb_portname[4]) << 24) |
2296 		    (((uint64_t)pdb.pdb_portname[5]) << 16) |
2297 		    (((uint64_t)pdb.pdb_portname[6]) <<  8) |
2298 		    (((uint64_t)pdb.pdb_portname[7]));
2299 		lp->roles =
2300 		    (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
2301 		lp->portid = BITS2WORD(pdb.pdb_portid_bits);
2302 		lp->loopid = pdb.pdb_loopid;
2303 	}
2304 
2305 	/*
2306 	 * Mark all of the permanent local loop database entries as invalid
2307 	 * (except our own entry).
2308 	 */
2309 	for (loopid = 0; loopid < hival; loopid++) {
2310 		if (loopid == fcp->isp_iid) {
2311 			fcp->portdb[loopid].valid = 1;
2312 			fcp->portdb[loopid].loopid = fcp->isp_loopid;
2313 			continue;
2314 		}
2315 		fcp->portdb[loopid].valid = 0;
2316 	}
2317 
2318 	/*
2319 	 * Now merge our local copy of the port database into our saved copy.
2320 	 * Notify the outer layers of new devices arriving.
2321 	 */
2322 	for (loopid = 0; loopid < hival; loopid++) {
2323 		int i;
2324 
2325 		/*
2326 		 * If we don't have a non-zero Port WWN, we're not here.
2327 		 */
2328 		if (fcp->tport[loopid].port_wwn == 0) {
2329 			continue;
2330 		}
2331 
2332 		/*
2333 		 * Skip ourselves.
2334 		 */
2335 		if (loopid == fcp->isp_iid) {
2336 			continue;
2337 		}
2338 
2339 		/*
2340 		 * For the purposes of deciding whether this is the
2341 		 * 'same' device or not, we only search for an identical
2342 		 * Port WWN. Node WWNs may or may not be the same as
2343 		 * the Port WWN, and there may be multiple different
2344 		 * Port WWNs with the same Node WWN. It would be chaos
2345 		 * to have multiple identical Port WWNs, so we don't
2346 		 * allow that.
2347 		 */
2348 
2349 		for (i = 0; i < hival; i++) {
2350 			int j;
2351 			if (fcp->portdb[i].port_wwn == 0)
2352 				continue;
2353 			if (fcp->portdb[i].port_wwn !=
2354 			    fcp->tport[loopid].port_wwn)
2355 				continue;
2356 			/*
2357 			 * We found this WWN elsewhere- it's changed
2358 			 * loopids then. We don't change it's actual
2359 			 * position in our cached port database- we
2360 			 * just change the actual loop ID we'd use.
2361 			 */
2362 			if (fcp->portdb[i].loopid != loopid) {
2363 				isp_prt(isp, ISP_LOGINFO, portshift, i,
2364 				    fcp->portdb[i].loopid,
2365 				    fcp->portdb[i].portid, loopid,
2366 				    fcp->tport[loopid].portid);
2367 			}
2368 			fcp->portdb[i].portid = fcp->tport[loopid].portid;
2369 			fcp->portdb[i].loopid = loopid;
2370 			fcp->portdb[i].valid = 1;
2371 			fcp->portdb[i].roles = fcp->tport[loopid].roles;
2372 
2373 			/*
2374 			 * Now make sure this Port WWN doesn't exist elsewhere
2375 			 * in the port database.
2376 			 */
2377 			for (j = i+1; j < hival; j++) {
2378 				if (fcp->portdb[i].port_wwn !=
2379 				    fcp->portdb[j].port_wwn) {
2380 					continue;
2381 				}
2382 				isp_prt(isp, ISP_LOGWARN, portdup, j, i);
2383 				/*
2384 				 * Invalidate the 'old' *and* 'new' ones.
2385 				 * This is really harsh and not quite right,
2386 				 * but if this happens, we really don't know
2387 				 * who is what at this point.
2388 				 */
2389 				fcp->portdb[i].valid = 0;
2390 				fcp->portdb[j].valid = 0;
2391 			}
2392 			break;
2393 		}
2394 
2395 		/*
2396 		 * If we didn't traverse the entire port database,
2397 		 * then we found (and remapped) an existing entry.
2398 		 * No need to notify anyone- go for the next one.
2399 		 */
2400 		if (i < hival) {
2401 			isp_prt(isp, ISP_LOGINFO, retained,
2402 			    fcp->portdb[i].loopid, i, fcp->portdb[i].portid);
2403 			continue;
2404 		}
2405 
2406 		/*
2407 		 * We've not found this Port WWN anywhere. It's a new entry.
2408 		 * See if we can leave it where it is (with target == loopid).
2409 		 */
2410 		if (fcp->portdb[loopid].port_wwn != 0) {
2411 			for (lim = 0; lim < hival; lim++) {
2412 				if (fcp->portdb[lim].port_wwn == 0)
2413 					break;
2414 			}
2415 			/* "Cannot Happen" */
2416 			if (lim == hival) {
2417 				isp_prt(isp, ISP_LOGWARN, "Remap Overflow");
2418 				continue;
2419 			}
2420 			i = lim;
2421 		} else {
2422 			i = loopid;
2423 		}
2424 
2425 		/*
2426 		 * NB:	The actual loopid we use here is loopid- we may
2427 		 *	in fact be at a completely different index (target).
2428 		 */
2429 		fcp->portdb[i].loopid = loopid;
2430 		fcp->portdb[i].port_wwn = fcp->tport[loopid].port_wwn;
2431 		fcp->portdb[i].node_wwn = fcp->tport[loopid].node_wwn;
2432 		fcp->portdb[i].roles = fcp->tport[loopid].roles;
2433 		fcp->portdb[i].portid = fcp->tport[loopid].portid;
2434 		fcp->portdb[i].valid = 1;
2435 
2436 		/*
2437 		 * Tell the outside world we've arrived.
2438 		 */
2439 		(void) isp_async(isp, ISPASYNC_PROMENADE, &i);
2440 	}
2441 
2442 	/*
2443 	 * Now find all previously used targets that are now invalid and
2444 	 * notify the outer layers that they're gone.
2445 	 */
2446 	for (lp = &fcp->portdb[0]; lp < &fcp->portdb[hival]; lp++) {
2447 		if (lp->valid || lp->port_wwn == 0) {
2448 			continue;
2449 		}
2450 
2451 		/*
2452 		 * Tell the outside world we've gone
2453 		 * away and erase our pdb entry.
2454 		 *
2455 		 */
2456 		loopid = lp - fcp->portdb;
2457 		(void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
2458 		MEMZERO((void *) lp, sizeof (*lp));
2459 	}
2460 	fcp->isp_loopstate = LOOP_LSCAN_DONE;
2461 	return (0);
2462 }
2463 
2464 
2465 static int
2466 isp_fabric_mbox_cmd(ispsoftc_t *isp, mbreg_t *mbp)
2467 {
2468 	isp_mboxcmd(isp, mbp, MBLOGNONE);
2469 	if (mbp->param[0] != MBOX_COMMAND_COMPLETE) {
2470 		if (FCPARAM(isp)->isp_loopstate == LOOP_SCANNING_FABRIC) {
2471 			FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
2472 		}
2473 		if (mbp->param[0] == MBOX_COMMAND_ERROR) {
2474 			char tbuf[16];
2475 			char *m;
2476 			switch (mbp->param[1]) {
2477 			case 1:
2478 				m = "No Loop";
2479 				break;
2480 			case 2:
2481 				m = "Failed to allocate IOCB buffer";
2482 				break;
2483 			case 3:
2484 				m = "Failed to allocate XCB buffer";
2485 				break;
2486 			case 4:
2487 				m = "timeout or transmit failed";
2488 				break;
2489 			case 5:
2490 				m = "no fabric loop";
2491 				break;
2492 			case 6:
2493 				m = "remote device not a target";
2494 				break;
2495 			default:
2496 				SNPRINTF(tbuf, sizeof tbuf, "%x",
2497 				    mbp->param[1]);
2498 				m = tbuf;
2499 				break;
2500 			}
2501 			isp_prt(isp, ISP_LOGERR, "SNS Failed- %s", m);
2502 		}
2503 		return (-1);
2504 	}
2505 
2506 	if (FCPARAM(isp)->isp_fwstate != FW_READY ||
2507 	    FCPARAM(isp)->isp_loopstate < LOOP_SCANNING_FABRIC) {
2508 		return (-1);
2509 	}
2510 	return(0);
2511 }
2512 
2513 #ifdef	ISP_USE_GA_NXT
2514 static int
2515 isp_scan_fabric(ispsoftc_t *isp, int ftype)
2516 {
2517 	fcparam *fcp = isp->isp_param;
2518 	uint32_t portid, first_portid, last_portid;
2519 	int hicap, last_port_same;
2520 
2521 	if (fcp->isp_onfabric == 0) {
2522 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
2523 		return (0);
2524 	}
2525 
2526 	FC_SCRATCH_ACQUIRE(isp);
2527 
2528 	/*
2529 	 * Since Port IDs are 24 bits, we can check against having seen
2530 	 * anything yet with this value.
2531 	 */
2532 	last_port_same = 0;
2533 	last_portid = 0xffffffff;	/* not a port */
2534 	first_portid = portid = fcp->isp_portid;
2535 	fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
2536 
2537 	for (hicap = 0; hicap < GA_NXT_MAX; hicap++) {
2538 		mbreg_t mbs;
2539 		sns_screq_t *rq;
2540 		sns_ga_nxt_rsp_t *rs0, *rs1;
2541 		struct lportdb lcl;
2542 		uint8_t sc[SNS_GA_NXT_RESP_SIZE];
2543 
2544 		rq = (sns_screq_t *)sc;
2545 		MEMZERO((void *) rq, SNS_GA_NXT_REQ_SIZE);
2546 		rq->snscb_rblen = SNS_GA_NXT_RESP_SIZE >> 1;
2547 		rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+0x100);
2548 		rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+0x100);
2549 		rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+0x100);
2550 		rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+0x100);
2551 		rq->snscb_sblen = 6;
2552 		rq->snscb_data[0] = SNS_GA_NXT;
2553 		rq->snscb_data[4] = portid & 0xffff;
2554 		rq->snscb_data[5] = (portid >> 16) & 0xff;
2555 		isp_put_sns_request(isp, rq, (sns_screq_t *) fcp->isp_scratch);
2556 		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GA_NXT_REQ_SIZE);
2557 		MEMZERO(&mbs, sizeof (mbs));
2558 		mbs.param[0] = MBOX_SEND_SNS;
2559 		mbs.param[1] = SNS_GA_NXT_REQ_SIZE >> 1;
2560 		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2561 		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2562 		/*
2563 		 * Leave 4 and 5 alone
2564 		 */
2565 		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2566 		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2567 		if (isp_fabric_mbox_cmd(isp, &mbs)) {
2568 			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
2569 				fcp->isp_loopstate = LOOP_PDB_RCVD;
2570 			}
2571 			FC_SCRATCH_RELEASE(isp);
2572 			return (-1);
2573 		}
2574 		MEMORYBARRIER(isp, SYNC_SFORCPU, 0x100, SNS_GA_NXT_RESP_SIZE);
2575 		rs1 = (sns_ga_nxt_rsp_t *) sc;
2576 		rs0 = (sns_ga_nxt_rsp_t *) ((uint8_t *)fcp->isp_scratch+0x100);
2577 		isp_get_ga_nxt_response(isp, rs0, rs1);
2578 		if (rs1->snscb_cthdr.ct_response != FS_ACC) {
2579 			int level;
2580 			if (rs1->snscb_cthdr.ct_reason == 9 &&
2581 			    rs1->snscb_cthdr.ct_explanation == 7)
2582 				level = ISP_LOGDEBUG0;
2583 			else
2584 				level = ISP_LOGWARN;
2585 			isp_prt(isp, level, swrej, "GA_NXT",
2586 			    rs1->snscb_cthdr.ct_reason,
2587 			    rs1->snscb_cthdr.ct_explanation, portid);
2588 			FC_SCRATCH_RELEASE(isp);
2589 			fcp->isp_loopstate = LOOP_FSCAN_DONE;
2590 			return (0);
2591 		}
2592 		portid =
2593 		    (((uint32_t) rs1->snscb_port_id[0]) << 16) |
2594 		    (((uint32_t) rs1->snscb_port_id[1]) << 8) |
2595 		    (((uint32_t) rs1->snscb_port_id[2]));
2596 
2597 		/*
2598 		 * XXX: We should check to make sure that this entry
2599 		 * XXX: supports the type(s) we are interested in.
2600 		 */
2601 		/*
2602 		 * Okay, we now have information about a fabric object.
2603 		 * If it is the type we're interested in, tell the outer layers
2604 		 * about it. The outer layer needs to  know: Port ID, WWNN,
2605 		 * WWPN, FC4 type, and port type.
2606 		 *
2607 		 * The lportdb structure is adequate for this.
2608 		 */
2609 		MEMZERO(&lcl, sizeof (lcl));
2610 		lcl.port_type = rs1->snscb_port_type;
2611 		lcl.fc4_type = ftype;
2612 		lcl.portid = portid;
2613 		lcl.node_wwn =
2614 		    (((uint64_t)rs1->snscb_nodename[0]) << 56) |
2615 		    (((uint64_t)rs1->snscb_nodename[1]) << 48) |
2616 		    (((uint64_t)rs1->snscb_nodename[2]) << 40) |
2617 		    (((uint64_t)rs1->snscb_nodename[3]) << 32) |
2618 		    (((uint64_t)rs1->snscb_nodename[4]) << 24) |
2619 		    (((uint64_t)rs1->snscb_nodename[5]) << 16) |
2620 		    (((uint64_t)rs1->snscb_nodename[6]) <<  8) |
2621 		    (((uint64_t)rs1->snscb_nodename[7]));
2622 		lcl.port_wwn =
2623 		    (((uint64_t)rs1->snscb_portname[0]) << 56) |
2624 		    (((uint64_t)rs1->snscb_portname[1]) << 48) |
2625 		    (((uint64_t)rs1->snscb_portname[2]) << 40) |
2626 		    (((uint64_t)rs1->snscb_portname[3]) << 32) |
2627 		    (((uint64_t)rs1->snscb_portname[4]) << 24) |
2628 		    (((uint64_t)rs1->snscb_portname[5]) << 16) |
2629 		    (((uint64_t)rs1->snscb_portname[6]) <<  8) |
2630 		    (((uint64_t)rs1->snscb_portname[7]));
2631 
2632 		/*
2633 		 * Does this fabric object support the type we want?
2634 		 * If not, skip it.
2635 		 */
2636 		if (rs1->snscb_fc4_types[ftype >> 5] & (1 << (ftype & 0x1f))) {
2637 			if (first_portid == portid) {
2638 				lcl.last_fabric_dev = 1;
2639 			} else {
2640 				lcl.last_fabric_dev = 0;
2641 			}
2642 			(void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
2643 		} else {
2644 			isp_prt(isp, ISP_LOGDEBUG0,
2645 			    "PortID 0x%x doesn't support FC4 type 0x%x",
2646 			    portid, ftype);
2647 		}
2648 		if (first_portid == portid) {
2649 			fcp->isp_loopstate = LOOP_FSCAN_DONE;
2650 			FC_SCRATCH_RELEASE(isp);
2651 			return (0);
2652 		}
2653 		if (portid == last_portid) {
2654 			if (last_port_same++ > 20) {
2655 				isp_prt(isp, ISP_LOGWARN,
2656 				    "tangled fabric database detected");
2657 				break;
2658 			}
2659 		} else {
2660 			last_port_same = 0 ;
2661 			last_portid = portid;
2662 		}
2663 	}
2664 	FC_SCRATCH_RELEASE(isp);
2665 	if (hicap >= GA_NXT_MAX) {
2666 		isp_prt(isp, ISP_LOGWARN, "fabric too big (> %d)", GA_NXT_MAX);
2667 	}
2668 	fcp->isp_loopstate = LOOP_FSCAN_DONE;
2669 	return (0);
2670 }
2671 #else
2672 #define	GIDLEN	((ISP2100_SCRLEN >> 1) + 16)
2673 #define	NGENT	((GIDLEN - 16) >> 2)
2674 
2675 #define	IGPOFF	(ISP2100_SCRLEN - GIDLEN)
2676 #define	GXOFF	(256)
2677 
2678 static int
2679 isp_scan_fabric(ispsoftc_t *isp, int ftype)
2680 {
2681 	fcparam *fcp = FCPARAM(isp);
2682 	mbreg_t mbs;
2683 	int i;
2684 	sns_gid_ft_req_t *rq;
2685 	sns_gid_ft_rsp_t *rs0, *rs1;
2686 
2687 	if (fcp->isp_onfabric == 0) {
2688 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
2689 		return (0);
2690 	}
2691 
2692 	FC_SCRATCH_ACQUIRE(isp);
2693 	fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
2694 
2695 	rq = (sns_gid_ft_req_t *)fcp->tport;
2696 	MEMZERO((void *) rq, SNS_GID_FT_REQ_SIZE);
2697 	rq->snscb_rblen = GIDLEN >> 1;
2698 	rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+IGPOFF);
2699 	rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+IGPOFF);
2700 	rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+IGPOFF);
2701 	rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+IGPOFF);
2702 	rq->snscb_sblen = 6;
2703 	rq->snscb_cmd = SNS_GID_FT;
2704 	rq->snscb_mword_div_2 = NGENT;
2705 	rq->snscb_fc4_type = ftype;
2706 	isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *) fcp->isp_scratch);
2707 	MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GID_FT_REQ_SIZE);
2708 	MEMZERO(&mbs, sizeof (mbs));
2709 	mbs.param[0] = MBOX_SEND_SNS;
2710 	mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1;
2711 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2712 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2713 
2714 	/*
2715 	 * Leave 4 and 5 alone
2716 	 */
2717 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2718 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2719 	if (isp_fabric_mbox_cmd(isp, &mbs)) {
2720 		if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
2721 			fcp->isp_loopstate = LOOP_PDB_RCVD;
2722 		}
2723 		FC_SCRATCH_RELEASE(isp);
2724 		return (-1);
2725 	}
2726 	if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2727 		FC_SCRATCH_RELEASE(isp);
2728 		return (-1);
2729 	}
2730 	MEMORYBARRIER(isp, SYNC_SFORCPU, IGPOFF, GIDLEN);
2731 	rs1 = (sns_gid_ft_rsp_t *) fcp->tport;
2732 	rs0 = (sns_gid_ft_rsp_t *) ((uint8_t *)fcp->isp_scratch+IGPOFF);
2733 	isp_get_gid_ft_response(isp, rs0, rs1, NGENT);
2734 	if (rs1->snscb_cthdr.ct_response != FS_ACC) {
2735 		int level;
2736 		if (rs1->snscb_cthdr.ct_reason == 9 &&
2737 		    rs1->snscb_cthdr.ct_explanation == 7)
2738 			level = ISP_LOGDEBUG0;
2739 		else
2740 			level = ISP_LOGWARN;
2741 		isp_prt(isp, level, swrej, "GID_FT",
2742 		    rs1->snscb_cthdr.ct_reason,
2743 		    rs1->snscb_cthdr.ct_explanation, 0);
2744 		FC_SCRATCH_RELEASE(isp);
2745 		fcp->isp_loopstate = LOOP_FSCAN_DONE;
2746 		return (0);
2747 	}
2748 
2749 	/*
2750 	 * Okay, we now have a list of Port IDs for this class of device.
2751 	 * Go through the list and for each one get the WWPN/WWNN for it
2752 	 * and tell the outer layers about it. The outer layer needs to
2753 	 * know: Port ID, WWNN, WWPN, FC4 type, and (possibly) port type.
2754 	 *
2755 	 * The lportdb structure is adequate for this.
2756 	 */
2757 	i = -1;
2758 	do {
2759 		sns_gxn_id_req_t grqbuf, *gq = &grqbuf;
2760 		sns_gxn_id_rsp_t *gs0, grsbuf, *gs1 = &grsbuf;
2761 		struct lportdb lcl;
2762 #if	0
2763 		sns_gff_id_rsp_t *fs0, ffsbuf, *fs1 = &ffsbuf;
2764 #endif
2765 
2766 		i++;
2767 		MEMZERO(&lcl, sizeof (lcl));
2768 		lcl.fc4_type = ftype;
2769 		lcl.portid =
2770 		    (((uint32_t) rs1->snscb_ports[i].portid[0]) << 16) |
2771 		    (((uint32_t) rs1->snscb_ports[i].portid[1]) << 8) |
2772 		    (((uint32_t) rs1->snscb_ports[i].portid[2]));
2773 
2774 		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
2775 		gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
2776 		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
2777 		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
2778 		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
2779 		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
2780 		gq->snscb_sblen = 6;
2781 		gq->snscb_cmd = SNS_GPN_ID;
2782 		gq->snscb_portid = lcl.portid;
2783 		isp_put_gxn_id_request(isp, gq,
2784 		    (sns_gxn_id_req_t *) fcp->isp_scratch);
2785 		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
2786 		MEMZERO(&mbs, sizeof (mbs));
2787 		mbs.param[0] = MBOX_SEND_SNS;
2788 		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
2789 		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2790 		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2791 		/*
2792 		 * Leave 4 and 5 alone
2793 		 */
2794 		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2795 		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2796 		if (isp_fabric_mbox_cmd(isp, &mbs)) {
2797 			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
2798 				fcp->isp_loopstate = LOOP_PDB_RCVD;
2799 			}
2800 			FC_SCRATCH_RELEASE(isp);
2801 			return (-1);
2802 		}
2803 		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2804 			FC_SCRATCH_RELEASE(isp);
2805 			return (-1);
2806 		}
2807 		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
2808 		gs0 = (sns_gxn_id_rsp_t *) ((uint8_t *)fcp->isp_scratch+GXOFF);
2809 		isp_get_gxn_id_response(isp, gs0, gs1);
2810 		if (gs1->snscb_cthdr.ct_response != FS_ACC) {
2811 			isp_prt(isp, ISP_LOGWARN, swrej, "GPN_ID",
2812 			    gs1->snscb_cthdr.ct_reason,
2813 			    gs1->snscb_cthdr.ct_explanation, lcl.portid);
2814 			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2815 				FC_SCRATCH_RELEASE(isp);
2816 				return (-1);
2817 			}
2818 			continue;
2819 		}
2820 		lcl.port_wwn =
2821 		    (((uint64_t)gs1->snscb_wwn[0]) << 56) |
2822 		    (((uint64_t)gs1->snscb_wwn[1]) << 48) |
2823 		    (((uint64_t)gs1->snscb_wwn[2]) << 40) |
2824 		    (((uint64_t)gs1->snscb_wwn[3]) << 32) |
2825 		    (((uint64_t)gs1->snscb_wwn[4]) << 24) |
2826 		    (((uint64_t)gs1->snscb_wwn[5]) << 16) |
2827 		    (((uint64_t)gs1->snscb_wwn[6]) <<  8) |
2828 		    (((uint64_t)gs1->snscb_wwn[7]));
2829 
2830 		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
2831 		gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
2832 		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
2833 		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
2834 		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
2835 		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
2836 		gq->snscb_sblen = 6;
2837 		gq->snscb_cmd = SNS_GNN_ID;
2838 		gq->snscb_portid = lcl.portid;
2839 		isp_put_gxn_id_request(isp, gq,
2840 		    (sns_gxn_id_req_t *) fcp->isp_scratch);
2841 		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
2842 		MEMZERO(&mbs, sizeof (mbs));
2843 		mbs.param[0] = MBOX_SEND_SNS;
2844 		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
2845 		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2846 		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2847 		/*
2848 		 * Leave 4 and 5 alone
2849 		 */
2850 		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2851 		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2852 		if (isp_fabric_mbox_cmd(isp, &mbs)) {
2853 			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
2854 				fcp->isp_loopstate = LOOP_PDB_RCVD;
2855 			}
2856 			FC_SCRATCH_RELEASE(isp);
2857 			return (-1);
2858 		}
2859 		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2860 			FC_SCRATCH_RELEASE(isp);
2861 			return (-1);
2862 		}
2863 		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
2864 		gs0 = (sns_gxn_id_rsp_t *) ((uint8_t *)fcp->isp_scratch+GXOFF);
2865 		isp_get_gxn_id_response(isp, gs0, gs1);
2866 		if (gs1->snscb_cthdr.ct_response != FS_ACC) {
2867 			isp_prt(isp, ISP_LOGWARN, swrej, "GNN_ID",
2868 			    gs1->snscb_cthdr.ct_reason,
2869 			    gs1->snscb_cthdr.ct_explanation, lcl.portid);
2870 			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2871 				FC_SCRATCH_RELEASE(isp);
2872 				return (-1);
2873 			}
2874 			continue;
2875 		}
2876 		lcl.node_wwn =
2877 		    (((uint64_t)gs1->snscb_wwn[0]) << 56) |
2878 		    (((uint64_t)gs1->snscb_wwn[1]) << 48) |
2879 		    (((uint64_t)gs1->snscb_wwn[2]) << 40) |
2880 		    (((uint64_t)gs1->snscb_wwn[3]) << 32) |
2881 		    (((uint64_t)gs1->snscb_wwn[4]) << 24) |
2882 		    (((uint64_t)gs1->snscb_wwn[5]) << 16) |
2883 		    (((uint64_t)gs1->snscb_wwn[6]) <<  8) |
2884 		    (((uint64_t)gs1->snscb_wwn[7]));
2885 
2886 		/*
2887 		 * The QLogic f/w is bouncing this with a parameter error.
2888 		 */
2889 #if	0
2890 		/*
2891 		 * Try and get FC4 Features (FC-GS-3 only).
2892 		 * We can use the sns_gxn_id_req_t for this request.
2893 		 */
2894 		MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
2895 		gq->snscb_rblen = SNS_GFF_ID_RESP_SIZE >> 1;
2896 		gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
2897 		gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
2898 		gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
2899 		gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
2900 		gq->snscb_sblen = 6;
2901 		gq->snscb_cmd = SNS_GFF_ID;
2902 		gq->snscb_portid = lcl.portid;
2903 		isp_put_gxn_id_request(isp, gq,
2904 		    (sns_gxn_id_req_t *) fcp->isp_scratch);
2905 		MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
2906 		MEMZERO(&mbs, sizeof (mbs));
2907 		mbs.param[0] = MBOX_SEND_SNS;
2908 		mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
2909 		mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2910 		mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2911 		/*
2912 		 * Leave 4 and 5 alone
2913 		 */
2914 		mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2915 		mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2916 		if (isp_fabric_mbox_cmd(isp, &mbs)) {
2917 			if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
2918 				fcp->isp_loopstate = LOOP_PDB_RCVD;
2919 			}
2920 			FC_SCRATCH_RELEASE(isp);
2921 			return (-1);
2922 		}
2923 		if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2924 			FC_SCRATCH_RELEASE(isp);
2925 			return (-1);
2926 		}
2927 		MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GFF_ID_RESP_SIZE);
2928 		fs0 = (sns_gff_id_rsp_t *) ((uint8_t *)fcp->isp_scratch+GXOFF);
2929 		isp_get_gff_id_response(isp, fs0, fs1);
2930 		if (fs1->snscb_cthdr.ct_response != FS_ACC) {
2931 			isp_prt(isp, /* ISP_LOGDEBUG0 */ ISP_LOGWARN,
2932 			    swrej, "GFF_ID",
2933 			    fs1->snscb_cthdr.ct_reason,
2934 			    fs1->snscb_cthdr.ct_explanation, lcl.portid);
2935 			if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
2936 				FC_SCRATCH_RELEASE(isp);
2937 				return (-1);
2938 			}
2939 		} else {
2940 			int index = (ftype >> 3);
2941 			int bshft = (ftype & 0x7) * 4;
2942 			int fc4_fval =
2943 			    (fs1->snscb_fc4_features[index] >> bshft) & 0xf;
2944 			if (fc4_fval & 0x1) {
2945 				lcl.roles |=
2946 				    (SVC3_INI_ROLE >> SVC3_ROLE_SHIFT);
2947 			}
2948 			if (fc4_fval & 0x2) {
2949 				lcl.roles |=
2950 				    (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT);
2951 			}
2952 		}
2953 #endif
2954 
2955 		/*
2956 		 * If we really want to know what kind of port type this is,
2957 		 * we have to run another CT command. Otherwise, we'll leave
2958 		 * it as undefined.
2959 		 *
2960 		lcl.port_type = 0;
2961 		 */
2962 		if (rs1->snscb_ports[i].control & 0x80) {
2963 			lcl.last_fabric_dev = 1;
2964 		} else {
2965 			lcl.last_fabric_dev = 0;
2966 		}
2967 		(void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
2968 
2969 	} while ((rs1->snscb_ports[i].control & 0x80) == 0 && i < NGENT-1);
2970 
2971 	/*
2972 	 * If we're not at the last entry, our list isn't big enough.
2973 	 */
2974 	if ((rs1->snscb_ports[i].control & 0x80) == 0) {
2975 		isp_prt(isp, ISP_LOGWARN, "fabric too big for scratch area");
2976 	}
2977 
2978 	FC_SCRATCH_RELEASE(isp);
2979 	fcp->isp_loopstate = LOOP_FSCAN_DONE;
2980 	return (0);
2981 }
2982 #endif
2983 
2984 static void
2985 isp_register_fc4_type(ispsoftc_t *isp)
2986 {
2987 	fcparam *fcp = isp->isp_param;
2988 	uint8_t local[SNS_RFT_ID_REQ_SIZE];
2989 	sns_screq_t *reqp = (sns_screq_t *) local;
2990 	mbreg_t mbs;
2991 
2992 	MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE);
2993 	reqp->snscb_rblen = SNS_RFT_ID_RESP_SIZE >> 1;
2994 	reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100);
2995 	reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100);
2996 	reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100);
2997 	reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100);
2998 	reqp->snscb_sblen = 22;
2999 	reqp->snscb_data[0] = SNS_RFT_ID;
3000 	reqp->snscb_data[4] = fcp->isp_portid & 0xffff;
3001 	reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff;
3002 	reqp->snscb_data[6] = (1 << FC4_SCSI);
3003 #if	0
3004 	reqp->snscb_data[6] |= (1 << FC4_IP);	/* ISO/IEC 8802-2 LLC/SNAP */
3005 #endif
3006 	FC_SCRATCH_ACQUIRE(isp);
3007 	isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch);
3008 	MEMZERO(&mbs, sizeof (mbs));
3009 	mbs.param[0] = MBOX_SEND_SNS;
3010 	mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1;
3011 	mbs.param[2] = DMA_WD1(fcp->isp_scdma);
3012 	mbs.param[3] = DMA_WD0(fcp->isp_scdma);
3013 	/*
3014 	 * Leave 4 and 5 alone
3015 	 */
3016 	mbs.param[6] = DMA_WD3(fcp->isp_scdma);
3017 	mbs.param[7] = DMA_WD2(fcp->isp_scdma);
3018 	isp_mboxcmd(isp, &mbs, MBLOGALL);
3019 	FC_SCRATCH_RELEASE(isp);
3020 	if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3021 		isp_prt(isp, ISP_LOGDEBUG0, "Register FC4 types succeeded");
3022 	}
3023 }
3024 
3025 /*
3026  * Start a command. Locking is assumed done in the caller.
3027  */
3028 
3029 int
3030 isp_start(XS_T *xs)
3031 {
3032 	ispsoftc_t *isp;
3033 	uint16_t nxti, optr, handle;
3034 	uint8_t local[QENTRY_LEN];
3035 	ispreq_t *reqp, *qep;
3036 	int target, i;
3037 
3038 	XS_INITERR(xs);
3039 	isp = XS_ISP(xs);
3040 
3041 	/*
3042 	 * Check to make sure we're supporting initiator role.
3043 	 */
3044 	if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
3045 		XS_SETERR(xs, HBA_SELTIMEOUT);
3046 		return (CMD_COMPLETE);
3047 	}
3048 
3049 	/*
3050 	 * Now make sure we're running.
3051 	 */
3052 
3053 	if (isp->isp_state != ISP_RUNSTATE) {
3054 		isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
3055 		XS_SETERR(xs, HBA_BOTCH);
3056 		return (CMD_COMPLETE);
3057 	}
3058 
3059 	/*
3060 	 * Check command CDB length, etc.. We really are limited to 16 bytes
3061 	 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI,
3062 	 * but probably only if we're running fairly new firmware (we'll
3063 	 * let the old f/w choke on an extended command queue entry).
3064 	 */
3065 
3066 	if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) {
3067 		isp_prt(isp, ISP_LOGERR,
3068 		    "unsupported cdb length (%d, CDB[0]=0x%x)",
3069 		    XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff);
3070 		XS_SETERR(xs, HBA_BOTCH);
3071 		return (CMD_COMPLETE);
3072 	}
3073 
3074 	/*
3075 	 * Check to see whether we have good firmware state still or
3076 	 * need to refresh our port database for this target.
3077 	 */
3078 	target = XS_TGT(xs);
3079 	if (IS_FC(isp)) {
3080 		fcparam *fcp = isp->isp_param;
3081 		struct lportdb *lp;
3082 #ifdef	HANDLE_LOOPSTATE_IN_OUTER_LAYERS
3083 		if (fcp->isp_fwstate != FW_READY ||
3084 		    fcp->isp_loopstate != LOOP_READY) {
3085 			return (CMD_RQLATER);
3086 		}
3087 
3088 		/*
3089 		 * If we're not on a Fabric, we can't have a target
3090 		 * above FL_PORT_ID-1.
3091 		 *
3092 		 * If we're on a fabric and *not* connected as an F-port,
3093 		 * we can't have a target less than FC_SNS_ID+1. This
3094 		 * keeps us from having to sort out the difference between
3095 		 * local public loop devices and those which we might get
3096 		 * from a switch's database.
3097 		 */
3098 		if (fcp->isp_onfabric == 0) {
3099 			if (target >= FL_PORT_ID) {
3100 				XS_SETERR(xs, HBA_SELTIMEOUT);
3101 				return (CMD_COMPLETE);
3102 			}
3103 		} else {
3104 			if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
3105 				XS_SETERR(xs, HBA_SELTIMEOUT);
3106 				return (CMD_COMPLETE);
3107 			}
3108 			/*
3109 			 * We used to exclude having local loop ports
3110 			 * at the same time that we have fabric ports.
3111 			 * That is, we used to exclude having ports
3112 			 * at < FL_PORT_ID if we're FL-port.
3113 			 *
3114 			 * That's wrong. The only thing that could be
3115 			 * dicey is if the switch you're connected to
3116 			 * has these local loop ports appear on the
3117 			 * fabric and we somehow attach them twice.
3118 			 */
3119 		}
3120 #else
3121 		/*
3122 		 * Check for f/w being in ready state. If the f/w
3123 		 * isn't in ready state, then we don't know our
3124 		 * loop ID and the f/w hasn't completed logging
3125 		 * into all targets on the loop. If this is the
3126 		 * case, then bounce the command. We pretend this is
3127 		 * a SELECTION TIMEOUT error if we've never gone to
3128 		 * FW_READY state at all- in this case we may not
3129 		 * be hooked to a loop at all and we shouldn't hang
3130 		 * the machine for this. Otherwise, defer this command
3131 		 * until later.
3132 		 */
3133 		if (fcp->isp_fwstate != FW_READY) {
3134 			/*
3135 			 * Give ourselves at most a 250ms delay.
3136 			 */
3137 			if (isp_fclink_test(isp, 250000)) {
3138 				XS_SETERR(xs, HBA_SELTIMEOUT);
3139 				if (fcp->loop_seen_once) {
3140 					return (CMD_RQLATER);
3141 				} else {
3142 					return (CMD_COMPLETE);
3143 				}
3144 			}
3145 		}
3146 
3147 		/*
3148 		 * If we're not on a Fabric, we can't have a target
3149 		 * above FL_PORT_ID-1.
3150 		 *
3151 		 * If we're on a fabric and *not* connected as an F-port,
3152 		 * we can't have a target less than FC_SNS_ID+1. This
3153 		 * keeps us from having to sort out the difference between
3154 		 * local public loop devices and those which we might get
3155 		 * from a switch's database.
3156 		 */
3157 		if (fcp->isp_onfabric == 0) {
3158 			if (target >= FL_PORT_ID) {
3159 				XS_SETERR(xs, HBA_SELTIMEOUT);
3160 				return (CMD_COMPLETE);
3161 			}
3162 		} else {
3163 			if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
3164 				XS_SETERR(xs, HBA_SELTIMEOUT);
3165 				return (CMD_COMPLETE);
3166 			}
3167 			if (fcp->isp_topo != TOPO_F_PORT &&
3168 			    target < FL_PORT_ID) {
3169 				XS_SETERR(xs, HBA_SELTIMEOUT);
3170 				return (CMD_COMPLETE);
3171 			}
3172 		}
3173 
3174 		/*
3175 		 * If our loop state is such that we haven't yet received
3176 		 * a "Port Database Changed" notification (after a LIP or
3177 		 * a Loop Reset or firmware initialization), then defer
3178 		 * sending commands for a little while, but only if we've
3179 		 * seen a valid loop at one point (otherwise we can get
3180 		 * stuck at initialization time).
3181 		 */
3182 		if (fcp->isp_loopstate < LOOP_PDB_RCVD) {
3183 			XS_SETERR(xs, HBA_SELTIMEOUT);
3184 			if (fcp->loop_seen_once) {
3185 				return (CMD_RQLATER);
3186 			} else {
3187 				return (CMD_COMPLETE);
3188 			}
3189 		}
3190 
3191 		/*
3192 		 * If we're in the middle of loop or fabric scanning
3193 		 * or merging the port databases, retry this command later.
3194 		 */
3195 		if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC ||
3196 		    fcp->isp_loopstate == LOOP_SCANNING_LOOP ||
3197 		    fcp->isp_loopstate == LOOP_SYNCING_PDB) {
3198 			return (CMD_RQLATER);
3199 		}
3200 
3201 		/*
3202 		 * If our loop state is now such that we've just now
3203 		 * received a Port Database Change notification, then
3204 		 * we have to go off and (re)scan the fabric. We back
3205 		 * out and try again later if this doesn't work.
3206 		 */
3207 		if (fcp->isp_loopstate == LOOP_PDB_RCVD && fcp->isp_onfabric) {
3208 			if (isp_scan_fabric(isp, FC4_SCSI)) {
3209 				return (CMD_RQLATER);
3210 			}
3211 			if (fcp->isp_fwstate != FW_READY ||
3212 			    fcp->isp_loopstate < LOOP_FSCAN_DONE) {
3213 				return (CMD_RQLATER);
3214 			}
3215 		}
3216 
3217 		/*
3218 		 * If our loop state is now such that we've just now
3219 		 * received a Port Database Change notification, then
3220 		 * we have to go off and (re)synchronize our port
3221 		 * database.
3222 		 */
3223 		if (fcp->isp_loopstate < LOOP_READY) {
3224 			if (isp_pdb_sync(isp)) {
3225 				return (CMD_RQLATER);
3226 			}
3227 			if (fcp->isp_fwstate != FW_READY ||
3228 			    fcp->isp_loopstate != LOOP_READY) {
3229 				return (CMD_RQLATER);
3230 			}
3231 		}
3232 
3233 		/*
3234 		 * XXX: Here's were we would cancel any loop_dead flag
3235 		 * XXX: also cancel in dead_loop timeout that's running
3236 		 */
3237 #endif
3238 
3239 		/*
3240 		 * Now check whether we should even think about pursuing this.
3241 		 */
3242 		lp = &fcp->portdb[target];
3243 		if (lp->valid == 0) {
3244 			XS_SETERR(xs, HBA_SELTIMEOUT);
3245 			return (CMD_COMPLETE);
3246 		}
3247 		if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) {
3248 			isp_prt(isp, ISP_LOGDEBUG2,
3249 			    "Target %d does not have target service", target);
3250 			XS_SETERR(xs, HBA_SELTIMEOUT);
3251 			return (CMD_COMPLETE);
3252 		}
3253 		/*
3254 		 * Now turn target into what the actual Loop ID is.
3255 		 */
3256 		target = lp->loopid;
3257 	}
3258 
3259 	/*
3260 	 * Next check to see if any HBA or Device
3261 	 * parameters need to be updated.
3262 	 */
3263 	if (isp->isp_update != 0) {
3264 		isp_update(isp);
3265 	}
3266 
3267 	if (isp_getrqentry(isp, &nxti, &optr, (void *)&qep)) {
3268 		isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow");
3269 		XS_SETERR(xs, HBA_BOTCH);
3270 		return (CMD_EAGAIN);
3271 	}
3272 
3273 	/*
3274 	 * Now see if we need to synchronize the ISP with respect to anything.
3275 	 * We do dual duty here (cough) for synchronizing for busses other
3276 	 * than which we got here to send a command to.
3277 	 */
3278 	reqp = (ispreq_t *) local;
3279 	if (isp->isp_sendmarker) {
3280 		uint8_t n = (IS_DUALBUS(isp)? 2: 1);
3281 		/*
3282 		 * Check ports to send markers for...
3283 		 */
3284 		for (i = 0; i < n; i++) {
3285 			if ((isp->isp_sendmarker & (1 << i)) == 0) {
3286 				continue;
3287 			}
3288 			MEMZERO((void *) reqp, QENTRY_LEN);
3289 			reqp->req_header.rqs_entry_count = 1;
3290 			reqp->req_header.rqs_entry_type = RQSTYPE_MARKER;
3291 			reqp->req_modifier = SYNC_ALL;
3292 			reqp->req_target = i << 7;	/* insert bus number */
3293 			isp_put_request(isp, reqp, qep);
3294 			ISP_ADD_REQUEST(isp, nxti);
3295 			isp->isp_sendmarker &= ~(1 << i);
3296 			if (isp_getrqentry(isp, &nxti, &optr, (void *) &qep)) {
3297 				isp_prt(isp, ISP_LOGDEBUG0,
3298 				    "Request Queue Overflow+");
3299 				XS_SETERR(xs, HBA_BOTCH);
3300 				return (CMD_EAGAIN);
3301 			}
3302 		}
3303 	}
3304 
3305 	MEMZERO((void *)reqp, QENTRY_LEN);
3306 	reqp->req_header.rqs_entry_count = 1;
3307 	if (IS_FC(isp)) {
3308 		reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
3309 	} else {
3310 		if (XS_CDBLEN(xs) > 12)
3311 			reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY;
3312 		else
3313 			reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
3314 	}
3315 	/* reqp->req_header.rqs_flags = 0; */
3316 	/* reqp->req_header.rqs_seqno = 0; */
3317 	if (IS_FC(isp)) {
3318 		/*
3319 		 * See comment in isp_intr
3320 		 */
3321 		/* XS_RESID(xs) = 0; */
3322 
3323 		/*
3324 		 * Fibre Channel always requires some kind of tag.
3325 		 * The Qlogic drivers seem be happy not to use a tag,
3326 		 * but this breaks for some devices (IBM drives).
3327 		 */
3328 		if (XS_TAG_P(xs)) {
3329 			((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs);
3330 		} else {
3331 			/*
3332 			 * If we don't know what tag to use, use HEAD OF QUEUE
3333 			 * for Request Sense or Simple.
3334 			 */
3335 			if (XS_CDBP(xs)[0] == 0x3)	/* REQUEST SENSE */
3336 				((ispreqt2_t *)reqp)->req_flags = REQFLAG_HTAG;
3337 			else
3338 				((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG;
3339 		}
3340 	} else {
3341 		sdparam *sdp = (sdparam *)isp->isp_param;
3342 		sdp += XS_CHANNEL(xs);
3343 		if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) &&
3344 		    XS_TAG_P(xs)) {
3345 			reqp->req_flags = XS_TAG_TYPE(xs);
3346 		}
3347 	}
3348 	if (IS_SCSI(isp)) {
3349 		reqp->req_target = target | (XS_CHANNEL(xs) << 7);
3350 		reqp->req_lun_trn = XS_LUN(xs);
3351 		reqp->req_cdblen = XS_CDBLEN(xs);
3352 	} else if (IS_2KLOGIN(isp)) {
3353 		((ispreqt2e_t *)reqp)->req_target = target;
3354 		((ispreqt2e_t *)reqp)->req_scclun = XS_LUN(xs);
3355 	} else if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
3356 		((ispreqt2_t *)reqp)->req_target = target;
3357 		((ispreqt2_t *)reqp)->req_scclun = XS_LUN(xs);
3358 	} else {
3359 		((ispreqt2_t *)reqp)->req_target = target;
3360 		((ispreqt2_t *)reqp)->req_lun_trn = XS_LUN(xs);
3361 	}
3362 	MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs));
3363 
3364 	reqp->req_time = XS_TIME(xs) / 1000;
3365 	if (reqp->req_time == 0 && XS_TIME(xs)) {
3366 		reqp->req_time = 1;
3367 	}
3368 
3369 	if (isp_save_xs(isp, xs, &handle)) {
3370 		isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers");
3371 		XS_SETERR(xs, HBA_BOTCH);
3372 		return (CMD_EAGAIN);
3373 	}
3374 	reqp->req_handle = handle;
3375 
3376 	/*
3377 	 * Set up DMA and/or do any bus swizzling of the request entry
3378 	 * so that the Qlogic F/W understands what is being asked of it.
3379 	 */
3380 	i = ISP_DMASETUP(isp, xs, reqp, &nxti, optr);
3381 	if (i != CMD_QUEUED) {
3382 		isp_destroy_handle(isp, handle);
3383 		/*
3384 		 * dmasetup sets actual error in packet, and
3385 		 * return what we were given to return.
3386 		 */
3387 		return (i);
3388 	}
3389 	XS_SETERR(xs, HBA_NOERROR);
3390 	isp_prt(isp, ISP_LOGDEBUG2,
3391 	    "START cmd for %d.%d.%d cmd 0x%x datalen %ld",
3392 	    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), XS_CDBP(xs)[0],
3393 	    (long) XS_XFRLEN(xs));
3394 	ISP_ADD_REQUEST(isp, nxti);
3395 	isp->isp_nactive++;
3396 	return (CMD_QUEUED);
3397 }
3398 
3399 /*
3400  * isp control
3401  * Locks (ints blocked) assumed held.
3402  */
3403 
3404 int
3405 isp_control(ispsoftc_t *isp, ispctl_t ctl, void *arg)
3406 {
3407 	XS_T *xs;
3408 	mbreg_t mbs;
3409 	int bus, tgt;
3410 	uint16_t handle;
3411 
3412 	MEMZERO(&mbs, sizeof (mbs));
3413 
3414 	switch (ctl) {
3415 	default:
3416 		isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl);
3417 		break;
3418 
3419 	case ISPCTL_RESET_BUS:
3420 		/*
3421 		 * Issue a bus reset.
3422 		 */
3423 		mbs.param[0] = MBOX_BUS_RESET;
3424 		mbs.param[2] = 0;
3425 		if (IS_SCSI(isp)) {
3426 			mbs.param[1] =
3427 			    ((sdparam *) isp->isp_param)->isp_bus_reset_delay;
3428 			if (mbs.param[1] < 2)
3429 				mbs.param[1] = 2;
3430 			bus = *((int *) arg);
3431 			if (IS_DUALBUS(isp))
3432 				mbs.param[2] = bus;
3433 		} else {
3434 			mbs.param[1] = 10;
3435 			bus = 0;
3436 		}
3437 		isp->isp_sendmarker |= (1 << bus);
3438 		isp_mboxcmd(isp, &mbs, MBLOGALL);
3439 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3440 			break;
3441 		}
3442 		isp_prt(isp, ISP_LOGINFO,
3443 		    "driver initiated bus reset of bus %d", bus);
3444 		return (0);
3445 
3446 	case ISPCTL_RESET_DEV:
3447 		tgt = (*((int *) arg)) & 0xffff;
3448 		bus = (*((int *) arg)) >> 16;
3449 		mbs.param[0] = MBOX_ABORT_TARGET;
3450 		if (IS_SCSI(isp)) {
3451 			mbs.param[1] = (tgt << 8) | (bus << 15);
3452 		} else {
3453 			if (IS_2KLOGIN(isp)) {
3454 				mbs.param[1] = tgt;
3455 				mbs.obits |= (1 << 10);
3456 			} else {
3457 				mbs.param[1] = (tgt << 8);
3458 			}
3459 		}
3460 		mbs.param[2] = 3;	/* 'delay', in seconds */
3461 		isp_mboxcmd(isp, &mbs, MBLOGALL);
3462 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3463 			break;
3464 		}
3465 		isp_prt(isp, ISP_LOGINFO,
3466 		    "Target %d on Bus %d Reset Succeeded", tgt, bus);
3467 		isp->isp_sendmarker |= (1 << bus);
3468 		return (0);
3469 
3470 	case ISPCTL_ABORT_CMD:
3471 		xs = (XS_T *) arg;
3472 		tgt = XS_TGT(xs);
3473 		handle = isp_find_handle(isp, xs);
3474 		if (handle == 0) {
3475 			isp_prt(isp, ISP_LOGWARN,
3476 			    "cannot find handle for command to abort");
3477 			break;
3478 		}
3479 		bus = XS_CHANNEL(xs);
3480 		mbs.param[0] = MBOX_ABORT;
3481 		if (IS_FC(isp)) {
3482 			if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)  {
3483 				if (IS_2KLOGIN(isp)) {
3484 					mbs.param[1] = tgt;
3485 				} else {
3486 					mbs.param[1] = tgt << 8;
3487 				}
3488 				mbs.param[4] = 0;
3489 				mbs.param[5] = 0;
3490 				mbs.param[6] = XS_LUN(xs);
3491 			} else {
3492 				mbs.param[1] = tgt << 8 | XS_LUN(xs);
3493 			}
3494 		} else {
3495 			mbs.param[1] =
3496 			    (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs);
3497 		}
3498 		mbs.param[3] = 0;
3499 		mbs.param[2] = handle;
3500 		isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR);
3501 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3502 			return (0);
3503 		}
3504 		/*
3505 		 * XXX: Look for command in the REQUEST QUEUE. That is,
3506 		 * XXX: It hasen't been picked up by firmware yet.
3507 		 */
3508 		break;
3509 
3510 	case ISPCTL_UPDATE_PARAMS:
3511 
3512 		isp_update(isp);
3513 		return (0);
3514 
3515 	case ISPCTL_FCLINK_TEST:
3516 
3517 		if (IS_FC(isp)) {
3518 			int usdelay = *((int *) arg);
3519 			if (usdelay == 0) {
3520 				usdelay =  250000;
3521 			}
3522 			return (isp_fclink_test(isp, usdelay));
3523 		}
3524 		break;
3525 
3526 	case ISPCTL_SCAN_FABRIC:
3527 
3528 		if (IS_FC(isp)) {
3529 			int ftype = (arg)? *((int *) arg) : FC4_SCSI;
3530 			return (isp_scan_fabric(isp, ftype));
3531 		}
3532 		break;
3533 
3534 	case ISPCTL_SCAN_LOOP:
3535 
3536 		if (IS_FC(isp)) {
3537 			return (isp_scan_loop(isp));
3538 		}
3539 		break;
3540 
3541 	case ISPCTL_PDB_SYNC:
3542 
3543 		if (IS_FC(isp)) {
3544 			return (isp_pdb_sync(isp));
3545 		}
3546 		break;
3547 
3548 	case ISPCTL_SEND_LIP:
3549 
3550 		if (IS_FC(isp)) {
3551 			mbs.param[0] = MBOX_INIT_LIP;
3552 			isp_mboxcmd(isp, &mbs, MBLOGALL);
3553 			if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3554 				return (0);
3555 			}
3556 		}
3557 		break;
3558 
3559 	case ISPCTL_GET_POSMAP:
3560 
3561 		if (IS_FC(isp) && arg) {
3562 			return (isp_getmap(isp, arg));
3563 		}
3564 		break;
3565 
3566 
3567 	case ISPCTL_GET_PDB:
3568 		if (IS_FC(isp) && arg) {
3569 			int id = *((int *)arg);
3570 			isp_pdb_t *pdb = arg;
3571 			return (isp_getpdb(isp, id, pdb));
3572 		}
3573 		break;
3574 
3575 	case ISPCTL_RUN_MBOXCMD:
3576 
3577 		isp_mboxcmd(isp, arg, MBLOGALL);
3578 		return(0);
3579 
3580 #ifdef	ISP_TARGET_MODE
3581 	case ISPCTL_TOGGLE_TMODE:
3582 	{
3583 
3584 		/*
3585 		 * We don't check/set against role here- that's the
3586 		 * responsibility for the outer layer to coordinate.
3587 		 */
3588 		if (IS_SCSI(isp)) {
3589 			int param = *(int *)arg;
3590 			mbs.param[0] = MBOX_ENABLE_TARGET_MODE;
3591 			mbs.param[1] = param & 0xffff;
3592 			mbs.param[2] = param >> 16;
3593 			isp_mboxcmd(isp, &mbs, MBLOGALL);
3594 			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3595 				break;
3596 			}
3597 		}
3598 		return (0);
3599 	}
3600 #endif
3601 	}
3602 	return (-1);
3603 }
3604 
3605 /*
3606  * Interrupt Service Routine(s).
3607  *
3608  * External (OS) framework has done the appropriate locking,
3609  * and the locking will be held throughout this function.
3610  */
3611 
3612 /*
3613  * Limit our stack depth by sticking with the max likely number
3614  * of completions on a request queue at any one time.
3615  */
3616 #ifndef	MAX_REQUESTQ_COMPLETIONS
3617 #define	MAX_REQUESTQ_COMPLETIONS	64
3618 #endif
3619 
3620 void
3621 isp_intr(ispsoftc_t *isp, uint16_t isr, uint16_t sema, uint16_t mbox)
3622 {
3623 	XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
3624 	uint16_t iptr, optr, junk;
3625 	int i, nlooked = 0, ndone = 0;
3626 
3627 again:
3628 	/*
3629 	 * Is this a mailbox related interrupt?
3630 	 * The mailbox semaphore will be nonzero if so.
3631 	 */
3632 	if (sema) {
3633 		if (mbox & 0x4000) {
3634 			isp->isp_intmboxc++;
3635 			if (isp->isp_mboxbsy) {
3636 				int i = 0, obits = isp->isp_obits;
3637 				isp->isp_mboxtmp[i++] = mbox;
3638 				for (i = 1; i < MAX_MAILBOX(isp); i++) {
3639 					if ((obits & (1 << i)) == 0) {
3640 						continue;
3641 					}
3642 					isp->isp_mboxtmp[i] =
3643 					    ISP_READ(isp, MBOX_OFF(i));
3644 				}
3645 				if (isp->isp_mbxwrk0) {
3646 					if (isp_mbox_continue(isp) == 0) {
3647 						return;
3648 					}
3649 				}
3650 				MBOX_NOTIFY_COMPLETE(isp);
3651 			} else {
3652 				isp_prt(isp, ISP_LOGWARN,
3653 				    "Mbox Command Async (0x%x) with no waiters",
3654 				    mbox);
3655 			}
3656 		} else if (isp_parse_async(isp, mbox) < 0) {
3657 			return;
3658 		}
3659 		if ((IS_FC(isp) && mbox != ASYNC_RIO_RESP) ||
3660 		    isp->isp_state != ISP_RUNSTATE) {
3661 			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
3662 			ISP_WRITE(isp, BIU_SEMA, 0);
3663 			return;
3664 		}
3665 	}
3666 
3667 	/*
3668 	 * We can't be getting this now.
3669 	 */
3670 	if (isp->isp_state != ISP_RUNSTATE) {
3671 		isp_prt(isp, ISP_LOGWARN,
3672 		    "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema);
3673 		/*
3674 		 * Thank you very much!  *Burrrp*!
3675 		 */
3676 		WRITE_RESPONSE_QUEUE_OUT_POINTER(isp,
3677 		    READ_RESPONSE_QUEUE_IN_POINTER(isp));
3678 
3679 		ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
3680 		ISP_WRITE(isp, BIU_SEMA, 0);
3681 		return;
3682 	}
3683 
3684 	/*
3685 	 * Get the current Response Queue Out Pointer.
3686 	 *
3687 	 * If we're a 2300, we can ask what hardware what it thinks.
3688 	 */
3689 	if (IS_23XX(isp)) {
3690 		optr = ISP_READ(isp, isp->isp_respoutrp);
3691 		/*
3692 		 * Debug: to be taken out eventually
3693 		 */
3694 		if (isp->isp_residx != optr) {
3695 			isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x",
3696 			    optr, isp->isp_residx);
3697 		}
3698 	} else {
3699 		optr = isp->isp_residx;
3700 	}
3701 
3702 	/*
3703 	 * You *must* read the Response Queue In Pointer
3704 	 * prior to clearing the RISC interrupt.
3705 	 *
3706 	 * Debounce the 2300 if revision less than 2.
3707 	 */
3708 	if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) {
3709 		i = 0;
3710 		do {
3711 			iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
3712 			junk = READ_RESPONSE_QUEUE_IN_POINTER(isp);
3713 		} while (junk != iptr && ++i < 1000);
3714 
3715 		if (iptr != junk) {
3716 			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
3717 			isp_prt(isp, ISP_LOGWARN,
3718 			    "Response Queue Out Pointer Unstable (%x, %x)",
3719 			    iptr, junk);
3720 			return;
3721 		}
3722 	} else {
3723 		iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
3724 	}
3725 	isp->isp_resodx = iptr;
3726 
3727 
3728 	if (optr == iptr && sema == 0) {
3729 		/*
3730 		 * There are a lot of these- reasons unknown- mostly on
3731 		 * faster Alpha machines.
3732 		 *
3733 		 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to
3734 		 * make sure the old interrupt went away (to avoid 'ringing'
3735 		 * effects), but that didn't stop this from occurring.
3736 		 */
3737 		if (IS_23XX(isp)) {
3738 			USEC_DELAY(100);
3739 			iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
3740 			junk = ISP_READ(isp, BIU_R2HSTSLO);
3741 		} else {
3742 			junk = ISP_READ(isp, BIU_ISR);
3743 		}
3744 		if (optr == iptr) {
3745 			if (IS_23XX(isp)) {
3746 				;
3747 			} else {
3748 				sema = ISP_READ(isp, BIU_SEMA);
3749 				mbox = ISP_READ(isp, OUTMAILBOX0);
3750 				if ((sema & 0x3) && (mbox & 0x8000)) {
3751 					goto again;
3752 				}
3753 			}
3754 			isp->isp_intbogus++;
3755 			isp_prt(isp, ISP_LOGDEBUG1,
3756 			    "bogus intr- isr %x (%x) iptr %x optr %x",
3757 			    isr, junk, iptr, optr);
3758 		}
3759 	}
3760 	isp->isp_resodx = iptr;
3761 	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
3762 	ISP_WRITE(isp, BIU_SEMA, 0);
3763 
3764 	if (isp->isp_rspbsy) {
3765 		return;
3766 	}
3767 	isp->isp_rspbsy = 1;
3768 
3769 	while (optr != iptr) {
3770 		ispstatusreq_t local, *sp = &local;
3771 		isphdr_t *hp;
3772 		int type;
3773 		uint16_t oop;
3774 		int buddaboom = 0;
3775 
3776 		hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr);
3777 		oop = optr;
3778 		optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
3779 		nlooked++;
3780  read_again:
3781 		/*
3782 		 * Synchronize our view of this response queue entry.
3783 		 */
3784 		MEMORYBARRIER(isp, SYNC_RESULT, oop, QENTRY_LEN);
3785 
3786 		type = isp_get_response_type(isp, hp);
3787 
3788 		if (type == RQSTYPE_RESPONSE) {
3789 			isp_get_response(isp, (ispstatusreq_t *) hp, sp);
3790 		} else if (type == RQSTYPE_RIO2) {
3791 			isp_rio2_t rio;
3792 			isp_get_rio2(isp, (isp_rio2_t *) hp, &rio);
3793 			for (i = 0; i < rio.req_header.rqs_seqno; i++) {
3794 				isp_fastpost_complete(isp, rio.req_handles[i]);
3795 			}
3796 			if (isp->isp_fpcchiwater < rio.req_header.rqs_seqno)
3797 				isp->isp_fpcchiwater = rio.req_header.rqs_seqno;
3798 			MEMZERO(hp, QENTRY_LEN);	/* PERF */
3799 			continue;
3800 		} else {
3801 			/*
3802 			 * Somebody reachable via isp_handle_other_response
3803 			 * may have updated the response queue pointers for
3804 			 * us, so we reload our goal index.
3805 			 */
3806 			int i = isp_handle_other_response(isp, type, hp, &optr);
3807 			if (i < 0) {
3808 				goto read_again;
3809 			} else if (i > 0) {
3810 				iptr = isp->isp_resodx;
3811 				MEMZERO(hp, QENTRY_LEN);	/* PERF */
3812 				continue;
3813 			}
3814 
3815 			/*
3816 			 * After this point, we'll just look at the header as
3817 			 * we don't know how to deal with the rest of the
3818 			 * response.
3819 			 */
3820 			isp_get_response(isp, (ispstatusreq_t *) hp, sp);
3821 
3822 			/*
3823 			 * It really has to be a bounced request just copied
3824 			 * from the request queue to the response queue. If
3825 			 * not, something bad has happened.
3826 			 */
3827 			if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) {
3828 				isp_prt(isp, ISP_LOGERR, notresp,
3829 				    sp->req_header.rqs_entry_type, oop, optr,
3830 				    nlooked);
3831 				if (isp->isp_dblev & ISP_LOGDEBUG0) {
3832 					isp_print_bytes(isp, "Queue Entry",
3833 					    QENTRY_LEN, sp);
3834 				}
3835 				MEMZERO(hp, QENTRY_LEN);	/* PERF */
3836 				continue;
3837 			}
3838 			buddaboom = 1;
3839 		}
3840 
3841 		if (sp->req_header.rqs_flags & 0xf) {
3842 #define	_RQS_OFLAGS	\
3843 	~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET)
3844 			if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
3845 				isp_prt(isp, ISP_LOGWARN,
3846 				    "continuation segment");
3847 				WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
3848 				continue;
3849 			}
3850 			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
3851 				isp_prt(isp, ISP_LOGDEBUG1,
3852 				    "internal queues full");
3853 				/*
3854 				 * We'll synthesize a QUEUE FULL message below.
3855 				 */
3856 			}
3857 			if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
3858 				isp_prt(isp, ISP_LOGERR,  "bad header flag");
3859 				buddaboom++;
3860 			}
3861 			if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
3862 				isp_prt(isp, ISP_LOGERR, "bad request packet");
3863 				buddaboom++;
3864 			}
3865 			if (sp->req_header.rqs_flags & _RQS_OFLAGS) {
3866 				isp_prt(isp, ISP_LOGERR,
3867 				    "unknown flags (0x%x) in response",
3868 				    sp->req_header.rqs_flags);
3869 				buddaboom++;
3870 			}
3871 #undef	_RQS_OFLAGS
3872 		}
3873 		if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) {
3874 			MEMZERO(hp, QENTRY_LEN);	/* PERF */
3875 			isp_prt(isp, ISP_LOGERR,
3876 			    "bad request handle %d (type 0x%x, flags 0x%x)",
3877 			    sp->req_handle, sp->req_header.rqs_entry_type,
3878 			    sp->req_header.rqs_flags);
3879 			WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
3880 			continue;
3881 		}
3882 		xs = isp_find_xs(isp, sp->req_handle);
3883 		if (xs == NULL) {
3884 			uint8_t ts = sp->req_completion_status & 0xff;
3885 			MEMZERO(hp, QENTRY_LEN);	/* PERF */
3886 			/*
3887 			 * Only whine if this isn't the expected fallout of
3888 			 * aborting the command.
3889 			 */
3890 			if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) {
3891 				isp_prt(isp, ISP_LOGERR,
3892 				    "cannot find handle 0x%x (type 0x%x)",
3893 				    sp->req_handle,
3894 				    sp->req_header.rqs_entry_type);
3895 			} else if (ts != RQCS_ABORTED) {
3896 				isp_prt(isp, ISP_LOGERR,
3897 				    "cannot find handle 0x%x (status 0x%x)",
3898 				    sp->req_handle, ts);
3899 			}
3900 			WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
3901 			continue;
3902 		}
3903 		isp_destroy_handle(isp, sp->req_handle);
3904 		if (sp->req_status_flags & RQSTF_BUS_RESET) {
3905 			XS_SETERR(xs, HBA_BUSRESET);
3906 			isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
3907 		}
3908 		if (buddaboom) {
3909 			XS_SETERR(xs, HBA_BOTCH);
3910 		}
3911 
3912 		if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) {
3913 			/*
3914 			 * Fibre Channel F/W doesn't say we got status
3915 			 * if there's Sense Data instead. I guess they
3916 			 * think it goes w/o saying.
3917 			 */
3918 			sp->req_state_flags |= RQSF_GOT_STATUS;
3919 		}
3920 		if (sp->req_state_flags & RQSF_GOT_STATUS) {
3921 			*XS_STSP(xs) = sp->req_scsi_status & 0xff;
3922 		}
3923 
3924 		switch (sp->req_header.rqs_entry_type) {
3925 		case RQSTYPE_RESPONSE:
3926 			XS_SET_STATE_STAT(isp, xs, sp);
3927 			isp_parse_status(isp, sp, xs);
3928 			if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) &&
3929 			    (*XS_STSP(xs) == SCSI_BUSY)) {
3930 				XS_SETERR(xs, HBA_TGTBSY);
3931 			}
3932 			if (IS_SCSI(isp)) {
3933 				XS_RESID(xs) = sp->req_resid;
3934 				if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
3935 				    (*XS_STSP(xs) == SCSI_CHECK) &&
3936 				    (sp->req_state_flags & RQSF_GOT_SENSE)) {
3937 					XS_SAVE_SENSE(xs, sp);
3938 				}
3939 				/*
3940 				 * A new synchronous rate was negotiated for
3941 				 * this target. Mark state such that we'll go
3942 				 * look up that which has changed later.
3943 				 */
3944 				if (sp->req_status_flags & RQSTF_NEGOTIATION) {
3945 					int t = XS_TGT(xs);
3946 					sdparam *sdp = isp->isp_param;
3947 					sdp += XS_CHANNEL(xs);
3948 					sdp->isp_devparam[t].dev_refresh = 1;
3949 					isp->isp_update |=
3950 					    (1 << XS_CHANNEL(xs));
3951 				}
3952 			} else {
3953 				if (sp->req_status_flags & RQSF_XFER_COMPLETE) {
3954 					XS_RESID(xs) = 0;
3955 				} else if (sp->req_scsi_status & RQCS_RESID) {
3956 					XS_RESID(xs) = sp->req_resid;
3957 				} else {
3958 					XS_RESID(xs) = 0;
3959 				}
3960 				if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
3961 				    (*XS_STSP(xs) == SCSI_CHECK) &&
3962 				    (sp->req_scsi_status & RQCS_SV)) {
3963 					XS_SAVE_SENSE(xs, sp);
3964 					/* solely for the benefit of debug */
3965 					sp->req_state_flags |= RQSF_GOT_SENSE;
3966 				}
3967 			}
3968 			isp_prt(isp, ISP_LOGDEBUG2,
3969 			   "asked for %ld got resid %ld", (long) XS_XFRLEN(xs),
3970 			   (long) sp->req_resid);
3971 			break;
3972 		case RQSTYPE_REQUEST:
3973 			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
3974 				/*
3975 				 * Force Queue Full status.
3976 				 */
3977 				*XS_STSP(xs) = SCSI_QFULL;
3978 				XS_SETERR(xs, HBA_NOERROR);
3979 			} else if (XS_NOERR(xs)) {
3980 				/*
3981 				 * ????
3982 				 */
3983 				isp_prt(isp, ISP_LOGDEBUG0,
3984 				    "Request Queue Entry bounced back");
3985 				XS_SETERR(xs, HBA_BOTCH);
3986 			}
3987 			XS_RESID(xs) = XS_XFRLEN(xs);
3988 			break;
3989 		default:
3990 			isp_prt(isp, ISP_LOGWARN,
3991 			    "unhandled response queue type 0x%x",
3992 			    sp->req_header.rqs_entry_type);
3993 			if (XS_NOERR(xs)) {
3994 				XS_SETERR(xs, HBA_BOTCH);
3995 			}
3996 			break;
3997 		}
3998 
3999 		/*
4000 		 * Free any DMA resources. As a side effect, this may
4001 		 * also do any cache flushing necessary for data coherence.			 */
4002 		if (XS_XFRLEN(xs)) {
4003 			ISP_DMAFREE(isp, xs, sp->req_handle);
4004 		}
4005 
4006 		if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
4007 		    ((isp->isp_dblev & ISP_LOGDEBUG1) && ((!XS_NOERR(xs)) ||
4008 		    (*XS_STSP(xs) != SCSI_GOOD)))) {
4009 			char skey;
4010 			if (sp->req_state_flags & RQSF_GOT_SENSE) {
4011 				skey = XS_SNSKEY(xs) & 0xf;
4012 				if (skey < 10)
4013 					skey += '0';
4014 				else
4015 					skey += 'a' - 10;
4016 			} else if (*XS_STSP(xs) == SCSI_CHECK) {
4017 				skey = '?';
4018 			} else {
4019 				skey = '.';
4020 			}
4021 			isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs),
4022 			    XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs),
4023 			    *XS_STSP(xs), skey, XS_ERR(xs));
4024 		}
4025 
4026 		if (isp->isp_nactive > 0)
4027 		    isp->isp_nactive--;
4028 		complist[ndone++] = xs;	/* defer completion call until later */
4029 		MEMZERO(hp, QENTRY_LEN);	/* PERF */
4030 		if (ndone == MAX_REQUESTQ_COMPLETIONS) {
4031 			break;
4032 		}
4033 	}
4034 
4035 	/*
4036 	 * If we looked at any commands, then it's valid to find out
4037 	 * what the outpointer is. It also is a trigger to update the
4038 	 * ISP's notion of what we've seen so far.
4039 	 */
4040 	if (nlooked) {
4041 		WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
4042 		/*
4043 		 * While we're at it, read the requst queue out pointer.
4044 		 */
4045 		isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
4046 		if (isp->isp_rscchiwater < ndone)
4047 			isp->isp_rscchiwater = ndone;
4048 	}
4049 
4050 	isp->isp_residx = optr;
4051 	isp->isp_rspbsy = 0;
4052 	for (i = 0; i < ndone; i++) {
4053 		xs = complist[i];
4054 		if (xs) {
4055 			isp->isp_rsltccmplt++;
4056 			isp_done(xs);
4057 		}
4058 	}
4059 }
4060 
4061 /*
4062  * Support routines.
4063  */
4064 
4065 static int
4066 isp_parse_async(ispsoftc_t *isp, uint16_t mbox)
4067 {
4068 	int rval = 0;
4069 	int bus;
4070 
4071 	if (IS_DUALBUS(isp)) {
4072 		bus = ISP_READ(isp, OUTMAILBOX6);
4073 	} else {
4074 		bus = 0;
4075 	}
4076 	isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
4077 
4078 	switch (mbox) {
4079 	case ASYNC_BUS_RESET:
4080 		isp->isp_sendmarker |= (1 << bus);
4081 #ifdef	ISP_TARGET_MODE
4082 		if (isp_target_async(isp, bus, mbox))
4083 			rval = -1;
4084 #endif
4085 		isp_async(isp, ISPASYNC_BUS_RESET, &bus);
4086 		break;
4087 	case ASYNC_SYSTEM_ERROR:
4088 #ifdef	ISP_FW_CRASH_DUMP
4089 		/*
4090 		 * If we have crash dumps enabled, it's up to the handler
4091 		 * for isp_async to reinit stuff and restart the firmware
4092 		 * after performing the crash dump. The reason we do things
4093 		 * this way is that we may need to activate a kernel thread
4094 		 * to do all the crash dump goop.
4095 		 */
4096 		isp_async(isp, ISPASYNC_FW_CRASH, NULL);
4097 #else
4098 		isp_async(isp, ISPASYNC_FW_CRASH, NULL);
4099 		isp_reinit(isp);
4100 		isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
4101 #endif
4102 		rval = -1;
4103 		break;
4104 
4105 	case ASYNC_RQS_XFER_ERR:
4106 		isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
4107 		break;
4108 
4109 	case ASYNC_RSP_XFER_ERR:
4110 		isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
4111 		break;
4112 
4113 	case ASYNC_QWAKEUP:
4114 		/*
4115 		 * We've just been notified that the Queue has woken up.
4116 		 * We don't need to be chatty about this- just unlatch things
4117 		 * and move on.
4118 		 */
4119 		mbox = READ_REQUEST_QUEUE_OUT_POINTER(isp);
4120 		break;
4121 
4122 	case ASYNC_TIMEOUT_RESET:
4123 		isp_prt(isp, ISP_LOGWARN,
4124 		    "timeout initiated SCSI bus reset of bus %d", bus);
4125 		isp->isp_sendmarker |= (1 << bus);
4126 #ifdef	ISP_TARGET_MODE
4127 		if (isp_target_async(isp, bus, mbox))
4128 			rval = -1;
4129 #endif
4130 		break;
4131 
4132 	case ASYNC_DEVICE_RESET:
4133 		isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus);
4134 		isp->isp_sendmarker |= (1 << bus);
4135 #ifdef	ISP_TARGET_MODE
4136 		if (isp_target_async(isp, bus, mbox))
4137 			rval = -1;
4138 #endif
4139 		break;
4140 
4141 	case ASYNC_EXTMSG_UNDERRUN:
4142 		isp_prt(isp, ISP_LOGWARN, "extended message underrun");
4143 		break;
4144 
4145 	case ASYNC_SCAM_INT:
4146 		isp_prt(isp, ISP_LOGINFO, "SCAM interrupt");
4147 		break;
4148 
4149 	case ASYNC_HUNG_SCSI:
4150 		isp_prt(isp, ISP_LOGERR,
4151 		    "stalled SCSI Bus after DATA Overrun");
4152 		/* XXX: Need to issue SCSI reset at this point */
4153 		break;
4154 
4155 	case ASYNC_KILLED_BUS:
4156 		isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun");
4157 		break;
4158 
4159 	case ASYNC_BUS_TRANSIT:
4160 		mbox = ISP_READ(isp, OUTMAILBOX2);
4161 		switch (mbox & 0x1c00) {
4162 		case SXP_PINS_LVD_MODE:
4163 			isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode");
4164 			SDPARAM(isp)->isp_diffmode = 0;
4165 			SDPARAM(isp)->isp_ultramode = 0;
4166 			SDPARAM(isp)->isp_lvdmode = 1;
4167 			break;
4168 		case SXP_PINS_HVD_MODE:
4169 			isp_prt(isp, ISP_LOGINFO,
4170 			    "Transition to Differential mode");
4171 			SDPARAM(isp)->isp_diffmode = 1;
4172 			SDPARAM(isp)->isp_ultramode = 0;
4173 			SDPARAM(isp)->isp_lvdmode = 0;
4174 			break;
4175 		case SXP_PINS_SE_MODE:
4176 			isp_prt(isp, ISP_LOGINFO,
4177 			    "Transition to Single Ended mode");
4178 			SDPARAM(isp)->isp_diffmode = 0;
4179 			SDPARAM(isp)->isp_ultramode = 1;
4180 			SDPARAM(isp)->isp_lvdmode = 0;
4181 			break;
4182 		default:
4183 			isp_prt(isp, ISP_LOGWARN,
4184 			    "Transition to Unknown Mode 0x%x", mbox);
4185 			break;
4186 		}
4187 		/*
4188 		 * XXX: Set up to renegotiate again!
4189 		 */
4190 		/* Can only be for a 1080... */
4191 		isp->isp_sendmarker |= (1 << bus);
4192 		break;
4193 
4194 	/*
4195 	 * We can use bus, which will always be zero for FC cards,
4196 	 * as a mailbox pattern accumulator to be checked below.
4197 	 */
4198 	case ASYNC_RIO5:
4199 		bus = 0x1ce;	/* outgoing mailbox regs 1-3, 6-7 */
4200 		break;
4201 
4202 	case ASYNC_RIO4:
4203 		bus = 0x14e;	/* outgoing mailbox regs 1-3, 6 */
4204 		break;
4205 
4206 	case ASYNC_RIO3:
4207 		bus = 0x10e;	/* outgoing mailbox regs 1-3 */
4208 		break;
4209 
4210 	case ASYNC_RIO2:
4211 		bus = 0x106;	/* outgoing mailbox regs 1-2 */
4212 		break;
4213 
4214 	case ASYNC_RIO1:
4215 	case ASYNC_CMD_CMPLT:
4216 		bus = 0x102;	/* outgoing mailbox regs 1 */
4217 		break;
4218 
4219 	case ASYNC_RIO_RESP:
4220 		return (rval);
4221 
4222 	case ASYNC_CTIO_DONE:
4223 	{
4224 #ifdef	ISP_TARGET_MODE
4225 		int handle =
4226 		    (ISP_READ(isp, OUTMAILBOX2) << 16) |
4227 		    (ISP_READ(isp, OUTMAILBOX1));
4228 		if (isp_target_async(isp, handle, mbox)) {
4229 			rval = -1;
4230 		} else {
4231 			/* count it as a fast posting intr */
4232 			isp->isp_fphccmplt++;
4233 		}
4234 #else
4235 		isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done");
4236 		isp->isp_fphccmplt++;	/* count it as a fast posting intr */
4237 #endif
4238 		break;
4239 	}
4240 	case ASYNC_LIP_F8:
4241 	case ASYNC_LIP_OCCURRED:
4242 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4243 		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
4244 		isp->isp_sendmarker = 1;
4245 		isp_mark_getpdb_all(isp);
4246 		isp_async(isp, ISPASYNC_LIP, NULL);
4247 #ifdef	ISP_TARGET_MODE
4248 		if (isp_target_async(isp, bus, mbox))
4249 			rval = -1;
4250 #endif
4251 		/*
4252 		 * We've had problems with data corruption occuring on
4253 		 * commands that complete (with no apparent error) after
4254 		 * we receive a LIP. This has been observed mostly on
4255 		 * Local Loop topologies. To be safe, let's just mark
4256 		 * all active commands as dead.
4257 		 */
4258 		if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
4259 		    FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
4260 			int i, j;
4261 			for (i = j = 0; i < isp->isp_maxcmds; i++) {
4262 				XS_T *xs;
4263 				xs = isp->isp_xflist[i];
4264 				if (xs != NULL) {
4265 					j++;
4266 					XS_SETERR(xs, HBA_BUSRESET);
4267 				}
4268 			}
4269 			if (j) {
4270 				isp_prt(isp, ISP_LOGERR,
4271 				    "LIP destroyed %d active commands", j);
4272 			}
4273 		}
4274 		break;
4275 
4276 	case ASYNC_LOOP_UP:
4277 		isp->isp_sendmarker = 1;
4278 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4279 		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
4280 		isp_mark_getpdb_all(isp);
4281 		isp_async(isp, ISPASYNC_LOOP_UP, NULL);
4282 #ifdef	ISP_TARGET_MODE
4283 		if (isp_target_async(isp, bus, mbox))
4284 			rval = -1;
4285 #endif
4286 		break;
4287 
4288 	case ASYNC_LOOP_DOWN:
4289 		isp->isp_sendmarker = 1;
4290 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4291 		FCPARAM(isp)->isp_loopstate = LOOP_NIL;
4292 		isp_mark_getpdb_all(isp);
4293 		isp_async(isp, ISPASYNC_LOOP_DOWN, NULL);
4294 #ifdef	ISP_TARGET_MODE
4295 		if (isp_target_async(isp, bus, mbox))
4296 			rval = -1;
4297 #endif
4298 		break;
4299 
4300 	case ASYNC_LOOP_RESET:
4301 		isp->isp_sendmarker = 1;
4302 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4303 		FCPARAM(isp)->isp_loopstate = LOOP_NIL;
4304 		isp_mark_getpdb_all(isp);
4305 		isp_async(isp, ISPASYNC_LOOP_RESET, NULL);
4306 #ifdef	ISP_TARGET_MODE
4307 		if (isp_target_async(isp, bus, mbox))
4308 			rval = -1;
4309 #endif
4310 		break;
4311 
4312 	case ASYNC_PDB_CHANGED:
4313 		isp->isp_sendmarker = 1;
4314 		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
4315 		isp_mark_getpdb_all(isp);
4316 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_PDB);
4317 		break;
4318 
4319 	case ASYNC_CHANGE_NOTIFY:
4320 		/*
4321 		 * Not correct, but it will force us to rescan the loop.
4322 		 */
4323 		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
4324 		isp_mark_getpdb_all(isp);
4325 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_SNS);
4326 		break;
4327 
4328 	case ASYNC_PTPMODE:
4329 		if (FCPARAM(isp)->isp_onfabric)
4330 			FCPARAM(isp)->isp_topo = TOPO_F_PORT;
4331 		else
4332 			FCPARAM(isp)->isp_topo = TOPO_N_PORT;
4333 		isp_mark_getpdb_all(isp);
4334 		isp->isp_sendmarker = 1;
4335 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4336 		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
4337 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
4338 #ifdef	ISP_TARGET_MODE
4339 		if (isp_target_async(isp, bus, mbox))
4340 			rval = -1;
4341 #endif
4342 		isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode");
4343 		break;
4344 
4345 	case ASYNC_CONNMODE:
4346 		mbox = ISP_READ(isp, OUTMAILBOX1);
4347 		isp_mark_getpdb_all(isp);
4348 		switch (mbox) {
4349 		case ISP_CONN_LOOP:
4350 			isp_prt(isp, ISP_LOGINFO,
4351 			    "Point-to-Point -> Loop mode");
4352 			break;
4353 		case ISP_CONN_PTP:
4354 			isp_prt(isp, ISP_LOGINFO,
4355 			    "Loop -> Point-to-Point mode");
4356 			break;
4357 		case ISP_CONN_BADLIP:
4358 			isp_prt(isp, ISP_LOGWARN,
4359 			    "Point-to-Point -> Loop mode (BAD LIP)");
4360 			break;
4361 		case ISP_CONN_FATAL:
4362 			isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR");
4363 #ifdef	ISP_FW_CRASH_DUMP
4364 			isp_async(isp, ISPASYNC_FW_CRASH, NULL);
4365 #else
4366 			isp_async(isp, ISPASYNC_FW_CRASH, NULL);
4367 			isp_reinit(isp);
4368 			isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
4369 #endif
4370 			return (-1);
4371 		case ISP_CONN_LOOPBACK:
4372 			isp_prt(isp, ISP_LOGWARN,
4373 			    "Looped Back in Point-to-Point mode");
4374 			break;
4375 		default:
4376 			isp_prt(isp, ISP_LOGWARN,
4377 			    "Unknown connection mode (0x%x)", mbox);
4378 			break;
4379 		}
4380 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
4381 		isp->isp_sendmarker = 1;
4382 		FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
4383 		FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
4384 		break;
4385 
4386 	default:
4387 		isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox);
4388 		break;
4389 	}
4390 
4391 	if (bus & 0x100) {
4392 		int i, nh;
4393 		uint16_t handles[16];
4394 
4395 		for (nh = 0, i = 1; i < MAX_MAILBOX(isp); i++) {
4396 			if ((bus & (1 << i)) == 0) {
4397 				continue;
4398 			}
4399 			handles[nh++] = ISP_READ(isp, MBOX_OFF(i));
4400 		}
4401 		for (i = 0; i < nh; i++) {
4402 			isp_fastpost_complete(isp, handles[i]);
4403 			isp_prt(isp,  ISP_LOGDEBUG3,
4404 			    "fast post completion of %u", handles[i]);
4405 		}
4406 		if (isp->isp_fpcchiwater < nh)
4407 			isp->isp_fpcchiwater = nh;
4408 	} else {
4409 		isp->isp_intoasync++;
4410 	}
4411 	return (rval);
4412 }
4413 
4414 /*
4415  * Handle other response entries. A pointer to the request queue output
4416  * index is here in case we want to eat several entries at once, although
4417  * this is not used currently.
4418  */
4419 
4420 static int
4421 isp_handle_other_response(ispsoftc_t *isp, int type,
4422     isphdr_t *hp, uint16_t *optrp)
4423 {
4424 	switch (type) {
4425 	case RQSTYPE_STATUS_CONT:
4426 		isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response");
4427 		return (1);
4428 	case RQSTYPE_ATIO:
4429 	case RQSTYPE_CTIO:
4430 	case RQSTYPE_ENABLE_LUN:
4431 	case RQSTYPE_MODIFY_LUN:
4432 	case RQSTYPE_NOTIFY:
4433 	case RQSTYPE_NOTIFY_ACK:
4434 	case RQSTYPE_CTIO1:
4435 	case RQSTYPE_ATIO2:
4436 	case RQSTYPE_CTIO2:
4437 	case RQSTYPE_CTIO3:
4438 		isp->isp_rsltccmplt++;	/* count as a response completion */
4439 #ifdef	ISP_TARGET_MODE
4440 		if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) {
4441 			return (1);
4442 		}
4443 #endif
4444 		/* FALLTHROUGH */
4445 	case RQSTYPE_REQUEST:
4446 	default:
4447 		USEC_DELAY(100);
4448 		if (type != isp_get_response_type(isp, hp)) {
4449 			/*
4450 			 * This is questionable- we're just papering over
4451 			 * something we've seen on SMP linux in target
4452 			 * mode- we don't really know what's happening
4453 			 * here that causes us to think we've gotten
4454 			 * an entry, but that either the entry isn't
4455 			 * filled out yet or our CPU read data is stale.
4456 			 */
4457 			isp_prt(isp, ISP_LOGINFO,
4458 				"unstable type in response queue");
4459 			return (-1);
4460 		}
4461 		isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x",
4462 		    isp_get_response_type(isp, hp));
4463 		if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, hp)) {
4464 			return (1);
4465 		}
4466 		return (0);
4467 	}
4468 }
4469 
4470 static void
4471 isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs)
4472 {
4473 	switch (sp->req_completion_status & 0xff) {
4474 	case RQCS_COMPLETE:
4475 		if (XS_NOERR(xs)) {
4476 			XS_SETERR(xs, HBA_NOERROR);
4477 		}
4478 		return;
4479 
4480 	case RQCS_INCOMPLETE:
4481 		if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
4482 			isp_prt(isp, ISP_LOGDEBUG1,
4483 			    "Selection Timeout for %d.%d.%d",
4484 			    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4485 			if (XS_NOERR(xs)) {
4486 				XS_SETERR(xs, HBA_SELTIMEOUT);
4487 			}
4488 			return;
4489 		}
4490 		isp_prt(isp, ISP_LOGERR,
4491 		    "command incomplete for %d.%d.%d, state 0x%x",
4492 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs),
4493 		    sp->req_state_flags);
4494 		break;
4495 
4496 	case RQCS_DMA_ERROR:
4497 		isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d",
4498 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4499 		break;
4500 
4501 	case RQCS_TRANSPORT_ERROR:
4502 	{
4503 		char buf[172];
4504 		SNPRINTF(buf, sizeof (buf), "states=>");
4505 		if (sp->req_state_flags & RQSF_GOT_BUS) {
4506 			SNPRINTF(buf, sizeof (buf), "%s GOT_BUS", buf);
4507 		}
4508 		if (sp->req_state_flags & RQSF_GOT_TARGET) {
4509 			SNPRINTF(buf, sizeof (buf), "%s GOT_TGT", buf);
4510 		}
4511 		if (sp->req_state_flags & RQSF_SENT_CDB) {
4512 			SNPRINTF(buf, sizeof (buf), "%s SENT_CDB", buf);
4513 		}
4514 		if (sp->req_state_flags & RQSF_XFRD_DATA) {
4515 			SNPRINTF(buf, sizeof (buf), "%s XFRD_DATA", buf);
4516 		}
4517 		if (sp->req_state_flags & RQSF_GOT_STATUS) {
4518 			SNPRINTF(buf, sizeof (buf), "%s GOT_STS", buf);
4519 		}
4520 		if (sp->req_state_flags & RQSF_GOT_SENSE) {
4521 			SNPRINTF(buf, sizeof (buf), "%s GOT_SNS", buf);
4522 		}
4523 		if (sp->req_state_flags & RQSF_XFER_COMPLETE) {
4524 			SNPRINTF(buf, sizeof (buf), "%s XFR_CMPLT", buf);
4525 		}
4526 		SNPRINTF(buf, sizeof (buf), "%s\nstatus=>", buf);
4527 		if (sp->req_status_flags & RQSTF_DISCONNECT) {
4528 			SNPRINTF(buf, sizeof (buf), "%s Disconnect", buf);
4529 		}
4530 		if (sp->req_status_flags & RQSTF_SYNCHRONOUS) {
4531 			SNPRINTF(buf, sizeof (buf), "%s Sync_xfr", buf);
4532 		}
4533 		if (sp->req_status_flags & RQSTF_PARITY_ERROR) {
4534 			SNPRINTF(buf, sizeof (buf), "%s Parity", buf);
4535 		}
4536 		if (sp->req_status_flags & RQSTF_BUS_RESET) {
4537 			SNPRINTF(buf, sizeof (buf), "%s Bus_Reset", buf);
4538 		}
4539 		if (sp->req_status_flags & RQSTF_DEVICE_RESET) {
4540 			SNPRINTF(buf, sizeof (buf), "%s Device_Reset", buf);
4541 		}
4542 		if (sp->req_status_flags & RQSTF_ABORTED) {
4543 			SNPRINTF(buf, sizeof (buf), "%s Aborted", buf);
4544 		}
4545 		if (sp->req_status_flags & RQSTF_TIMEOUT) {
4546 			SNPRINTF(buf, sizeof (buf), "%s Timeout", buf);
4547 		}
4548 		if (sp->req_status_flags & RQSTF_NEGOTIATION) {
4549 			SNPRINTF(buf, sizeof (buf), "%s Negotiation", buf);
4550 		}
4551 		isp_prt(isp, ISP_LOGERR, "%s", buf);
4552 		isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s",
4553 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf);
4554 		break;
4555 	}
4556 	case RQCS_RESET_OCCURRED:
4557 		isp_prt(isp, ISP_LOGWARN,
4558 		    "bus reset destroyed command for %d.%d.%d",
4559 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4560 		isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
4561 		if (XS_NOERR(xs)) {
4562 			XS_SETERR(xs, HBA_BUSRESET);
4563 		}
4564 		return;
4565 
4566 	case RQCS_ABORTED:
4567 		isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d",
4568 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4569 		isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
4570 		if (XS_NOERR(xs)) {
4571 			XS_SETERR(xs, HBA_ABORTED);
4572 		}
4573 		return;
4574 
4575 	case RQCS_TIMEOUT:
4576 		isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d",
4577 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4578 		/*
4579 	 	 * Check to see if we logged out the device.
4580 		 */
4581 		if (IS_FC(isp)) {
4582 			if ((sp->req_completion_status & RQSTF_LOGOUT) &&
4583 			    FCPARAM(isp)->portdb[XS_TGT(xs)].valid &&
4584 			    FCPARAM(isp)->portdb[XS_TGT(xs)].fabric_dev) {
4585 				FCPARAM(isp)->portdb[XS_TGT(xs)].relogin = 1;
4586 			}
4587 		}
4588 		if (XS_NOERR(xs)) {
4589 			XS_SETERR(xs, HBA_CMDTIMEOUT);
4590 		}
4591 		return;
4592 
4593 	case RQCS_DATA_OVERRUN:
4594 		XS_RESID(xs) = sp->req_resid;
4595 		isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d",
4596 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4597 		if (XS_NOERR(xs)) {
4598 			XS_SETERR(xs, HBA_DATAOVR);
4599 		}
4600 		return;
4601 
4602 	case RQCS_COMMAND_OVERRUN:
4603 		isp_prt(isp, ISP_LOGERR,
4604 		    "command overrun for command on %d.%d.%d",
4605 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4606 		break;
4607 
4608 	case RQCS_STATUS_OVERRUN:
4609 		isp_prt(isp, ISP_LOGERR,
4610 		    "status overrun for command on %d.%d.%d",
4611 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4612 		break;
4613 
4614 	case RQCS_BAD_MESSAGE:
4615 		isp_prt(isp, ISP_LOGERR,
4616 		    "msg not COMMAND COMPLETE after status %d.%d.%d",
4617 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4618 		break;
4619 
4620 	case RQCS_NO_MESSAGE_OUT:
4621 		isp_prt(isp, ISP_LOGERR,
4622 		    "No MESSAGE OUT phase after selection on %d.%d.%d",
4623 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4624 		break;
4625 
4626 	case RQCS_EXT_ID_FAILED:
4627 		isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d",
4628 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4629 		break;
4630 
4631 	case RQCS_IDE_MSG_FAILED:
4632 		isp_prt(isp, ISP_LOGERR,
4633 		    "INITIATOR DETECTED ERROR rejected by %d.%d.%d",
4634 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4635 		break;
4636 
4637 	case RQCS_ABORT_MSG_FAILED:
4638 		isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d",
4639 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4640 		break;
4641 
4642 	case RQCS_REJECT_MSG_FAILED:
4643 		isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d",
4644 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4645 		break;
4646 
4647 	case RQCS_NOP_MSG_FAILED:
4648 		isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d",
4649 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4650 		break;
4651 
4652 	case RQCS_PARITY_ERROR_MSG_FAILED:
4653 		isp_prt(isp, ISP_LOGERR,
4654 		    "MESSAGE PARITY ERROR rejected by %d.%d.%d",
4655 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4656 		break;
4657 
4658 	case RQCS_DEVICE_RESET_MSG_FAILED:
4659 		isp_prt(isp, ISP_LOGWARN,
4660 		    "BUS DEVICE RESET rejected by %d.%d.%d",
4661 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4662 		break;
4663 
4664 	case RQCS_ID_MSG_FAILED:
4665 		isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d",
4666 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4667 		break;
4668 
4669 	case RQCS_UNEXP_BUS_FREE:
4670 		isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free",
4671 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4672 		break;
4673 
4674 	case RQCS_DATA_UNDERRUN:
4675 	{
4676 		if (IS_FC(isp)) {
4677 			int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
4678 			if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) {
4679 				isp_prt(isp, ISP_LOGWARN, bun, XS_TGT(xs),
4680 				    XS_LUN(xs), XS_XFRLEN(xs), sp->req_resid,
4681 				    (ru_marked)? "marked" : "not marked");
4682 				if (XS_NOERR(xs)) {
4683 					XS_SETERR(xs, HBA_BOTCH);
4684 				}
4685 				return;
4686 			}
4687 		}
4688 		XS_RESID(xs) = sp->req_resid;
4689 		if (XS_NOERR(xs)) {
4690 			XS_SETERR(xs, HBA_NOERROR);
4691 		}
4692 		return;
4693 	}
4694 
4695 	case RQCS_XACT_ERR1:
4696 		isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs),
4697 		    XS_TGT(xs), XS_LUN(xs));
4698 		break;
4699 
4700 	case RQCS_XACT_ERR2:
4701 		isp_prt(isp, ISP_LOGERR, xact2,
4702 		    XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs));
4703 		break;
4704 
4705 	case RQCS_XACT_ERR3:
4706 		isp_prt(isp, ISP_LOGERR, xact3,
4707 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4708 		break;
4709 
4710 	case RQCS_BAD_ENTRY:
4711 		isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected");
4712 		break;
4713 
4714 	case RQCS_QUEUE_FULL:
4715 		isp_prt(isp, ISP_LOGDEBUG0,
4716 		    "internal queues full for %d.%d.%d status 0x%x",
4717 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), *XS_STSP(xs));
4718 
4719 		/*
4720 		 * If QFULL or some other status byte is set, then this
4721 		 * isn't an error, per se.
4722 		 *
4723 		 * Unfortunately, some QLogic f/w writers have, in
4724 		 * some cases, ommitted to *set* status to QFULL.
4725 		 *
4726 
4727 		if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
4728 			XS_SETERR(xs, HBA_NOERROR);
4729 			return;
4730 		}
4731 
4732 		 *
4733 		 *
4734 		 */
4735 
4736 		*XS_STSP(xs) = SCSI_QFULL;
4737 		XS_SETERR(xs, HBA_NOERROR);
4738 		return;
4739 
4740 	case RQCS_PHASE_SKIPPED:
4741 		isp_prt(isp, ISP_LOGERR, pskip, XS_CHANNEL(xs),
4742 		    XS_TGT(xs), XS_LUN(xs));
4743 		break;
4744 
4745 	case RQCS_ARQS_FAILED:
4746 		isp_prt(isp, ISP_LOGERR,
4747 		    "Auto Request Sense failed for %d.%d.%d",
4748 		    XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
4749 		if (XS_NOERR(xs)) {
4750 			XS_SETERR(xs, HBA_ARQFAIL);
4751 		}
4752 		return;
4753 
4754 	case RQCS_WIDE_FAILED:
4755 		isp_prt(isp, ISP_LOGERR,
4756 		    "Wide Negotiation failed for %d.%d.%d",
4757 		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
4758 		if (IS_SCSI(isp)) {
4759 			sdparam *sdp = isp->isp_param;
4760 			sdp += XS_CHANNEL(xs);
4761 			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE;
4762 			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
4763 			isp->isp_update |= (1 << XS_CHANNEL(xs));
4764 		}
4765 		if (XS_NOERR(xs)) {
4766 			XS_SETERR(xs, HBA_NOERROR);
4767 		}
4768 		return;
4769 
4770 	case RQCS_SYNCXFER_FAILED:
4771 		isp_prt(isp, ISP_LOGERR,
4772 		    "SDTR Message failed for target %d.%d.%d",
4773 		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
4774 		if (IS_SCSI(isp)) {
4775 			sdparam *sdp = isp->isp_param;
4776 			sdp += XS_CHANNEL(xs);
4777 			sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC;
4778 			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
4779 			isp->isp_update |= (1 << XS_CHANNEL(xs));
4780 		}
4781 		break;
4782 
4783 	case RQCS_LVD_BUSERR:
4784 		isp_prt(isp, ISP_LOGERR,
4785 		    "Bad LVD condition while talking to %d.%d.%d",
4786 		    XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
4787 		break;
4788 
4789 	case RQCS_PORT_UNAVAILABLE:
4790 		/*
4791 		 * No such port on the loop. Moral equivalent of SELTIMEO
4792 		 */
4793 	case RQCS_PORT_LOGGED_OUT:
4794 		/*
4795 		 * It was there (maybe)- treat as a selection timeout.
4796 		 */
4797 		if ((sp->req_completion_status & 0xff) == RQCS_PORT_UNAVAILABLE)
4798 			isp_prt(isp, ISP_LOGINFO,
4799 			    "port unavailable for target %d", XS_TGT(xs));
4800 		else
4801 			isp_prt(isp, ISP_LOGINFO,
4802 			    "port logout for target %d", XS_TGT(xs));
4803 		/*
4804 		 * If we're on a local loop, force a LIP (which is overkill)
4805 		 * to force a re-login of this unit. If we're on fabric,
4806 		 * then we'll have to relogin as a matter of course.
4807 		 */
4808 		if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
4809 		    FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
4810 			mbreg_t mbs;
4811 			MEMZERO(&mbs, sizeof (mbs));
4812 			mbs.param[0] = MBOX_INIT_LIP;
4813 			isp_mboxcmd_qnw(isp, &mbs, 1);
4814 		}
4815 
4816 		/*
4817 		 * Probably overkill.
4818 		 */
4819 		isp->isp_sendmarker = 1;
4820 		FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
4821 		isp_mark_getpdb_all(isp);
4822 		isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
4823 		if (XS_NOERR(xs)) {
4824 			XS_SETERR(xs, HBA_SELTIMEOUT);
4825 		}
4826 		return;
4827 
4828 	case RQCS_PORT_CHANGED:
4829 		isp_prt(isp, ISP_LOGWARN,
4830 		    "port changed for target %d", XS_TGT(xs));
4831 		if (XS_NOERR(xs)) {
4832 			XS_SETERR(xs, HBA_SELTIMEOUT);
4833 		}
4834 		return;
4835 
4836 	case RQCS_PORT_BUSY:
4837 		isp_prt(isp, ISP_LOGWARN,
4838 		    "port busy for target %d", XS_TGT(xs));
4839 		if (XS_NOERR(xs)) {
4840 			XS_SETERR(xs, HBA_TGTBSY);
4841 		}
4842 		return;
4843 
4844 	default:
4845 		isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x",
4846 		    sp->req_completion_status);
4847 		break;
4848 	}
4849 	if (XS_NOERR(xs)) {
4850 		XS_SETERR(xs, HBA_BOTCH);
4851 	}
4852 }
4853 
4854 static void
4855 isp_fastpost_complete(ispsoftc_t *isp, uint16_t fph)
4856 {
4857 	XS_T *xs;
4858 
4859 	if (fph == 0) {
4860 		return;
4861 	}
4862 	xs = isp_find_xs(isp, fph);
4863 	if (xs == NULL) {
4864 		isp_prt(isp, ISP_LOGWARN,
4865 		    "Command for fast post handle 0x%x not found", fph);
4866 		return;
4867 	}
4868 	isp_destroy_handle(isp, fph);
4869 
4870 	/*
4871 	 * Since we don't have a result queue entry item,
4872 	 * we must believe that SCSI status is zero and
4873 	 * that all data transferred.
4874 	 */
4875 	XS_SET_STATE_STAT(isp, xs, NULL);
4876 	XS_RESID(xs) = 0;
4877 	*XS_STSP(xs) = SCSI_GOOD;
4878 	if (XS_XFRLEN(xs)) {
4879 		ISP_DMAFREE(isp, xs, fph);
4880 	}
4881 	if (isp->isp_nactive)
4882 		isp->isp_nactive--;
4883 	isp->isp_fphccmplt++;
4884 	isp_done(xs);
4885 }
4886 
4887 static int
4888 isp_mbox_continue(ispsoftc_t *isp)
4889 {
4890 	mbreg_t mbs;
4891 	uint16_t *ptr;
4892 
4893 	switch (isp->isp_lastmbxcmd) {
4894 	case MBOX_WRITE_RAM_WORD:
4895 	case MBOX_READ_RAM_WORD:
4896 	case MBOX_READ_RAM_WORD_EXTENDED:
4897 		break;
4898 	default:
4899 		return (1);
4900 	}
4901 	if (isp->isp_mboxtmp[0] != MBOX_COMMAND_COMPLETE) {
4902 		isp->isp_mbxwrk0 = 0;
4903 		return (-1);
4904 	}
4905 
4906 	/*
4907 	 * Clear the previous interrupt.
4908 	 */
4909 	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
4910 	ISP_WRITE(isp, BIU_SEMA, 0);
4911 
4912 	/*
4913 	 * Continue with next word.
4914 	 */
4915 	MEMZERO(&mbs, sizeof (mbs));
4916 	ptr = isp->isp_mbxworkp;
4917 	switch (isp->isp_lastmbxcmd) {
4918 	case MBOX_WRITE_RAM_WORD:
4919 		mbs.param[2] = *ptr++;
4920 		mbs.param[1] = isp->isp_mbxwrk1++;
4921 		break;
4922 	case MBOX_READ_RAM_WORD:
4923 	case MBOX_READ_RAM_WORD_EXTENDED:
4924 		*ptr++ = isp->isp_mboxtmp[2];
4925 		mbs.param[1] = isp->isp_mbxwrk1++;
4926 		break;
4927 	}
4928 	isp->isp_mbxworkp = ptr;
4929 	mbs.param[0] = isp->isp_lastmbxcmd;
4930 	isp->isp_mbxwrk0 -= 1;
4931 	isp_mboxcmd_qnw(isp, &mbs, 0);
4932 	return (0);
4933 }
4934 
4935 
4936 #define	HIWRD(x)			((x) >> 16)
4937 #define	LOWRD(x)			((x)  & 0xffff)
4938 #define	ISPOPMAP(a, b)			(((a) << 16) | (b))
4939 static const uint32_t mbpscsi[] = {
4940 	ISPOPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
4941 	ISPOPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
4942 	ISPOPMAP(0x03, 0x01),	/* 0x02: MBOX_EXEC_FIRMWARE */
4943 	ISPOPMAP(0x1f, 0x01),	/* 0x03: MBOX_DUMP_RAM */
4944 	ISPOPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
4945 	ISPOPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
4946 	ISPOPMAP(0x3f, 0x3f),	/* 0x06: MBOX_MAILBOX_REG_TEST */
4947 	ISPOPMAP(0x03, 0x07),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
4948 	ISPOPMAP(0x01, 0x0f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
4949 	ISPOPMAP(0x00, 0x00),	/* 0x09: */
4950 	ISPOPMAP(0x00, 0x00),	/* 0x0a: */
4951 	ISPOPMAP(0x00, 0x00),	/* 0x0b: */
4952 	ISPOPMAP(0x00, 0x00),	/* 0x0c: */
4953 	ISPOPMAP(0x00, 0x00),	/* 0x0d: */
4954 	ISPOPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
4955 	ISPOPMAP(0x00, 0x00),	/* 0x0f: */
4956 	ISPOPMAP(0x1f, 0x1f),	/* 0x10: MBOX_INIT_REQ_QUEUE */
4957 	ISPOPMAP(0x3f, 0x3f),	/* 0x11: MBOX_INIT_RES_QUEUE */
4958 	ISPOPMAP(0x0f, 0x0f),	/* 0x12: MBOX_EXECUTE_IOCB */
4959 	ISPOPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
4960 	ISPOPMAP(0x01, 0x3f),	/* 0x14: MBOX_STOP_FIRMWARE */
4961 	ISPOPMAP(0x0f, 0x0f),	/* 0x15: MBOX_ABORT */
4962 	ISPOPMAP(0x03, 0x03),	/* 0x16: MBOX_ABORT_DEVICE */
4963 	ISPOPMAP(0x07, 0x07),	/* 0x17: MBOX_ABORT_TARGET */
4964 	ISPOPMAP(0x07, 0x07),	/* 0x18: MBOX_BUS_RESET */
4965 	ISPOPMAP(0x03, 0x07),	/* 0x19: MBOX_STOP_QUEUE */
4966 	ISPOPMAP(0x03, 0x07),	/* 0x1a: MBOX_START_QUEUE */
4967 	ISPOPMAP(0x03, 0x07),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
4968 	ISPOPMAP(0x03, 0x07),	/* 0x1c: MBOX_ABORT_QUEUE */
4969 	ISPOPMAP(0x03, 0x4f),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
4970 	ISPOPMAP(0x00, 0x00),	/* 0x1e: */
4971 	ISPOPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
4972 	ISPOPMAP(0x01, 0x07),	/* 0x20: MBOX_GET_INIT_SCSI_ID */
4973 	ISPOPMAP(0x01, 0x07),	/* 0x21: MBOX_GET_SELECT_TIMEOUT */
4974 	ISPOPMAP(0x01, 0xc7),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
4975 	ISPOPMAP(0x01, 0x07),	/* 0x23: MBOX_GET_TAG_AGE_LIMIT */
4976 	ISPOPMAP(0x01, 0x03),	/* 0x24: MBOX_GET_CLOCK_RATE */
4977 	ISPOPMAP(0x01, 0x07),	/* 0x25: MBOX_GET_ACT_NEG_STATE */
4978 	ISPOPMAP(0x01, 0x07),	/* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
4979 	ISPOPMAP(0x01, 0x07),	/* 0x27: MBOX_GET_PCI_PARAMS */
4980 	ISPOPMAP(0x03, 0x4f),	/* 0x28: MBOX_GET_TARGET_PARAMS */
4981 	ISPOPMAP(0x03, 0x0f),	/* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
4982 	ISPOPMAP(0x01, 0x07),	/* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */
4983 	ISPOPMAP(0x00, 0x00),	/* 0x2b: */
4984 	ISPOPMAP(0x00, 0x00),	/* 0x2c: */
4985 	ISPOPMAP(0x00, 0x00),	/* 0x2d: */
4986 	ISPOPMAP(0x00, 0x00),	/* 0x2e: */
4987 	ISPOPMAP(0x00, 0x00),	/* 0x2f: */
4988 	ISPOPMAP(0x03, 0x03),	/* 0x30: MBOX_SET_INIT_SCSI_ID */
4989 	ISPOPMAP(0x07, 0x07),	/* 0x31: MBOX_SET_SELECT_TIMEOUT */
4990 	ISPOPMAP(0xc7, 0xc7),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
4991 	ISPOPMAP(0x07, 0x07),	/* 0x33: MBOX_SET_TAG_AGE_LIMIT */
4992 	ISPOPMAP(0x03, 0x03),	/* 0x34: MBOX_SET_CLOCK_RATE */
4993 	ISPOPMAP(0x07, 0x07),	/* 0x35: MBOX_SET_ACT_NEG_STATE */
4994 	ISPOPMAP(0x07, 0x07),	/* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
4995 	ISPOPMAP(0x07, 0x07),	/* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
4996 	ISPOPMAP(0x4f, 0x4f),	/* 0x38: MBOX_SET_TARGET_PARAMS */
4997 	ISPOPMAP(0x0f, 0x0f),	/* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
4998 	ISPOPMAP(0x07, 0x07),	/* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */
4999 	ISPOPMAP(0x00, 0x00),	/* 0x3b: */
5000 	ISPOPMAP(0x00, 0x00),	/* 0x3c: */
5001 	ISPOPMAP(0x00, 0x00),	/* 0x3d: */
5002 	ISPOPMAP(0x00, 0x00),	/* 0x3e: */
5003 	ISPOPMAP(0x00, 0x00),	/* 0x3f: */
5004 	ISPOPMAP(0x01, 0x03),	/* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
5005 	ISPOPMAP(0x3f, 0x01),	/* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
5006 	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_EXEC_BIOS_IOCB */
5007 	ISPOPMAP(0x00, 0x00),	/* 0x43: */
5008 	ISPOPMAP(0x00, 0x00),	/* 0x44: */
5009 	ISPOPMAP(0x03, 0x03),	/* 0x45: SET SYSTEM PARAMETER */
5010 	ISPOPMAP(0x01, 0x03),	/* 0x46: GET SYSTEM PARAMETER */
5011 	ISPOPMAP(0x00, 0x00),	/* 0x47: */
5012 	ISPOPMAP(0x01, 0xcf),	/* 0x48: GET SCAM CONFIGURATION */
5013 	ISPOPMAP(0xcf, 0xcf),	/* 0x49: SET SCAM CONFIGURATION */
5014 	ISPOPMAP(0x03, 0x03),	/* 0x4a: MBOX_SET_FIRMWARE_FEATURES */
5015 	ISPOPMAP(0x01, 0x03),	/* 0x4b: MBOX_GET_FIRMWARE_FEATURES */
5016 	ISPOPMAP(0x00, 0x00),	/* 0x4c: */
5017 	ISPOPMAP(0x00, 0x00),	/* 0x4d: */
5018 	ISPOPMAP(0x00, 0x00),	/* 0x4e: */
5019 	ISPOPMAP(0x00, 0x00),	/* 0x4f: */
5020 	ISPOPMAP(0xdf, 0xdf),	/* 0x50: LOAD RAM A64 */
5021 	ISPOPMAP(0xdf, 0xdf),	/* 0x51: DUMP RAM A64 */
5022 	ISPOPMAP(0xdf, 0xff),	/* 0x52: INITIALIZE REQUEST QUEUE A64 */
5023 	ISPOPMAP(0xef, 0xff),	/* 0x53: INITIALIZE RESPONSE QUEUE A64 */
5024 	ISPOPMAP(0xcf, 0x01),	/* 0x54: EXECUTE IOCB A64 */
5025 	ISPOPMAP(0x07, 0x01),	/* 0x55: ENABLE TARGET MODE */
5026 	ISPOPMAP(0x03, 0x0f),	/* 0x56: GET TARGET STATUS */
5027 	ISPOPMAP(0x00, 0x00),	/* 0x57: */
5028 	ISPOPMAP(0x00, 0x00),	/* 0x58: */
5029 	ISPOPMAP(0x00, 0x00),	/* 0x59: */
5030 	ISPOPMAP(0x03, 0x03),	/* 0x5a: SET DATA OVERRUN RECOVERY MODE */
5031 	ISPOPMAP(0x01, 0x03),	/* 0x5b: GET DATA OVERRUN RECOVERY MODE */
5032 	ISPOPMAP(0x0f, 0x0f),	/* 0x5c: SET HOST DATA */
5033 	ISPOPMAP(0x01, 0x01)	/* 0x5d: GET NOST DATA */
5034 };
5035 
5036 #ifndef	ISP_STRIPPED
5037 static char *scsi_mbcmd_names[] = {
5038 	"NO-OP",
5039 	"LOAD RAM",
5040 	"EXEC FIRMWARE",
5041 	"DUMP RAM",
5042 	"WRITE RAM WORD",
5043 	"READ RAM WORD",
5044 	"MAILBOX REG TEST",
5045 	"VERIFY CHECKSUM",
5046 	"ABOUT FIRMWARE",
5047 	NULL,
5048 	NULL,
5049 	NULL,
5050 	NULL,
5051 	NULL,
5052 	"CHECK FIRMWARE",
5053 	NULL,
5054 	"INIT REQUEST QUEUE",
5055 	"INIT RESULT QUEUE",
5056 	"EXECUTE IOCB",
5057 	"WAKE UP",
5058 	"STOP FIRMWARE",
5059 	"ABORT",
5060 	"ABORT DEVICE",
5061 	"ABORT TARGET",
5062 	"BUS RESET",
5063 	"STOP QUEUE",
5064 	"START QUEUE",
5065 	"SINGLE STEP QUEUE",
5066 	"ABORT QUEUE",
5067 	"GET DEV QUEUE STATUS",
5068 	NULL,
5069 	"GET FIRMWARE STATUS",
5070 	"GET INIT SCSI ID",
5071 	"GET SELECT TIMEOUT",
5072 	"GET RETRY COUNT",
5073 	"GET TAG AGE LIMIT",
5074 	"GET CLOCK RATE",
5075 	"GET ACT NEG STATE",
5076 	"GET ASYNC DATA SETUP TIME",
5077 	"GET PCI PARAMS",
5078 	"GET TARGET PARAMS",
5079 	"GET DEV QUEUE PARAMS",
5080 	"GET RESET DELAY PARAMS",
5081 	NULL,
5082 	NULL,
5083 	NULL,
5084 	NULL,
5085 	NULL,
5086 	"SET INIT SCSI ID",
5087 	"SET SELECT TIMEOUT",
5088 	"SET RETRY COUNT",
5089 	"SET TAG AGE LIMIT",
5090 	"SET CLOCK RATE",
5091 	"SET ACT NEG STATE",
5092 	"SET ASYNC DATA SETUP TIME",
5093 	"SET PCI CONTROL PARAMS",
5094 	"SET TARGET PARAMS",
5095 	"SET DEV QUEUE PARAMS",
5096 	"SET RESET DELAY PARAMS",
5097 	NULL,
5098 	NULL,
5099 	NULL,
5100 	NULL,
5101 	NULL,
5102 	"RETURN BIOS BLOCK ADDR",
5103 	"WRITE FOUR RAM WORDS",
5104 	"EXEC BIOS IOCB",
5105 	NULL,
5106 	NULL,
5107 	"SET SYSTEM PARAMETER",
5108 	"GET SYSTEM PARAMETER",
5109 	NULL,
5110 	"GET SCAM CONFIGURATION",
5111 	"SET SCAM CONFIGURATION",
5112 	"SET FIRMWARE FEATURES",
5113 	"GET FIRMWARE FEATURES",
5114 	NULL,
5115 	NULL,
5116 	NULL,
5117 	NULL,
5118 	"LOAD RAM A64",
5119 	"DUMP RAM A64",
5120 	"INITIALIZE REQUEST QUEUE A64",
5121 	"INITIALIZE RESPONSE QUEUE A64",
5122 	"EXECUTE IOCB A64",
5123 	"ENABLE TARGET MODE",
5124 	"GET TARGET MODE STATE",
5125 	NULL,
5126 	NULL,
5127 	NULL,
5128 	"SET DATA OVERRUN RECOVERY MODE",
5129 	"GET DATA OVERRUN RECOVERY MODE",
5130 	"SET HOST DATA",
5131 	"GET NOST DATA",
5132 };
5133 #endif
5134 
5135 static const uint32_t mbpfc[] = {
5136 	ISPOPMAP(0x01, 0x01),	/* 0x00: MBOX_NO_OP */
5137 	ISPOPMAP(0x1f, 0x01),	/* 0x01: MBOX_LOAD_RAM */
5138 	ISPOPMAP(0x03, 0x01),	/* 0x02: MBOX_EXEC_FIRMWARE */
5139 	ISPOPMAP(0xdf, 0x01),	/* 0x03: MBOX_DUMP_RAM */
5140 	ISPOPMAP(0x07, 0x07),	/* 0x04: MBOX_WRITE_RAM_WORD */
5141 	ISPOPMAP(0x03, 0x07),	/* 0x05: MBOX_READ_RAM_WORD */
5142 	ISPOPMAP(0xff, 0xff),	/* 0x06: MBOX_MAILBOX_REG_TEST */
5143 	ISPOPMAP(0x03, 0x05),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
5144 	ISPOPMAP(0x01, 0x4f),	/* 0x08: MBOX_ABOUT_FIRMWARE */
5145 	ISPOPMAP(0xdf, 0x01),	/* 0x09: LOAD RAM */
5146 	ISPOPMAP(0xdf, 0x01),	/* 0x0a: DUMP RAM */
5147 	ISPOPMAP(0x00, 0x00),	/* 0x0b: */
5148 	ISPOPMAP(0x00, 0x00),	/* 0x0c: */
5149 	ISPOPMAP(0x00, 0x00),	/* 0x0d: */
5150 	ISPOPMAP(0x01, 0x05),	/* 0x0e: MBOX_CHECK_FIRMWARE */
5151 	ISPOPMAP(0x03, 0x07),	/* 0x0f: MBOX_READ_RAM_WORD_EXTENDED(1) */
5152 	ISPOPMAP(0x1f, 0x11),	/* 0x10: MBOX_INIT_REQ_QUEUE */
5153 	ISPOPMAP(0x2f, 0x21),	/* 0x11: MBOX_INIT_RES_QUEUE */
5154 	ISPOPMAP(0x0f, 0x01),	/* 0x12: MBOX_EXECUTE_IOCB */
5155 	ISPOPMAP(0x03, 0x03),	/* 0x13: MBOX_WAKE_UP	*/
5156 	ISPOPMAP(0x01, 0xff),	/* 0x14: MBOX_STOP_FIRMWARE */
5157 	ISPOPMAP(0x4f, 0x01),	/* 0x15: MBOX_ABORT */
5158 	ISPOPMAP(0x07, 0x01),	/* 0x16: MBOX_ABORT_DEVICE */
5159 	ISPOPMAP(0x07, 0x01),	/* 0x17: MBOX_ABORT_TARGET */
5160 	ISPOPMAP(0x03, 0x03),	/* 0x18: MBOX_BUS_RESET */
5161 	ISPOPMAP(0x07, 0x05),	/* 0x19: MBOX_STOP_QUEUE */
5162 	ISPOPMAP(0x07, 0x05),	/* 0x1a: MBOX_START_QUEUE */
5163 	ISPOPMAP(0x07, 0x05),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
5164 	ISPOPMAP(0x07, 0x05),	/* 0x1c: MBOX_ABORT_QUEUE */
5165 	ISPOPMAP(0x07, 0x03),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
5166 	ISPOPMAP(0x00, 0x00),	/* 0x1e: */
5167 	ISPOPMAP(0x01, 0x07),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
5168 	ISPOPMAP(0x01, 0x4f),	/* 0x20: MBOX_GET_LOOP_ID */
5169 	ISPOPMAP(0x00, 0x00),	/* 0x21: */
5170 	ISPOPMAP(0x01, 0x07),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
5171 	ISPOPMAP(0x00, 0x00),	/* 0x23: */
5172 	ISPOPMAP(0x00, 0x00),	/* 0x24: */
5173 	ISPOPMAP(0x00, 0x00),	/* 0x25: */
5174 	ISPOPMAP(0x00, 0x00),	/* 0x26: */
5175 	ISPOPMAP(0x00, 0x00),	/* 0x27: */
5176 	ISPOPMAP(0x01, 0x03),	/* 0x28: MBOX_GET_FIRMWARE_OPTIONS */
5177 	ISPOPMAP(0x03, 0x07),	/* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */
5178 	ISPOPMAP(0x00, 0x00),	/* 0x2a: */
5179 	ISPOPMAP(0x00, 0x00),	/* 0x2b: */
5180 	ISPOPMAP(0x00, 0x00),	/* 0x2c: */
5181 	ISPOPMAP(0x00, 0x00),	/* 0x2d: */
5182 	ISPOPMAP(0x00, 0x00),	/* 0x2e: */
5183 	ISPOPMAP(0x00, 0x00),	/* 0x2f: */
5184 	ISPOPMAP(0x00, 0x00),	/* 0x30: */
5185 	ISPOPMAP(0x00, 0x00),	/* 0x31: */
5186 	ISPOPMAP(0x07, 0x07),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
5187 	ISPOPMAP(0x00, 0x00),	/* 0x33: */
5188 	ISPOPMAP(0x00, 0x00),	/* 0x34: */
5189 	ISPOPMAP(0x00, 0x00),	/* 0x35: */
5190 	ISPOPMAP(0x00, 0x00),	/* 0x36: */
5191 	ISPOPMAP(0x00, 0x00),	/* 0x37: */
5192 	ISPOPMAP(0x0f, 0x01),	/* 0x38: MBOX_SET_FIRMWARE_OPTIONS */
5193 	ISPOPMAP(0x0f, 0x07),	/* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */
5194 	ISPOPMAP(0x00, 0x00),	/* 0x3a: */
5195 	ISPOPMAP(0x00, 0x00),	/* 0x3b: */
5196 	ISPOPMAP(0x00, 0x00),	/* 0x3c: */
5197 	ISPOPMAP(0x00, 0x00),	/* 0x3d: */
5198 	ISPOPMAP(0x00, 0x00),	/* 0x3e: */
5199 	ISPOPMAP(0x00, 0x00),	/* 0x3f: */
5200 	ISPOPMAP(0x03, 0x01),	/* 0x40: MBOX_LOOP_PORT_BYPASS */
5201 	ISPOPMAP(0x03, 0x01),	/* 0x41: MBOX_LOOP_PORT_ENABLE */
5202 	ISPOPMAP(0x03, 0x07),	/* 0x42: MBOX_GET_RESOURCE_COUNTS */
5203 	ISPOPMAP(0x01, 0x01),	/* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */
5204 	ISPOPMAP(0x00, 0x00),	/* 0x44: */
5205 	ISPOPMAP(0x00, 0x00),	/* 0x45: */
5206 	ISPOPMAP(0x00, 0x00),	/* 0x46: */
5207 	ISPOPMAP(0xcf, 0x03),	/* 0x47: GET PORT_DATABASE ENHANCED */
5208 	ISPOPMAP(0x00, 0x00),	/* 0x48: */
5209 	ISPOPMAP(0x00, 0x00),	/* 0x49: */
5210 	ISPOPMAP(0x00, 0x00),	/* 0x4a: */
5211 	ISPOPMAP(0x00, 0x00),	/* 0x4b: */
5212 	ISPOPMAP(0x00, 0x00),	/* 0x4c: */
5213 	ISPOPMAP(0x00, 0x00),	/* 0x4d: */
5214 	ISPOPMAP(0x00, 0x00),	/* 0x4e: */
5215 	ISPOPMAP(0x00, 0x00),	/* 0x4f: */
5216 	ISPOPMAP(0x00, 0x00),	/* 0x50: */
5217 	ISPOPMAP(0x00, 0x00),	/* 0x51: */
5218 	ISPOPMAP(0x00, 0x00),	/* 0x52: */
5219 	ISPOPMAP(0x00, 0x00),	/* 0x53: */
5220 	ISPOPMAP(0xcf, 0x01),	/* 0x54: EXECUTE IOCB A64 */
5221 	ISPOPMAP(0x00, 0x00),	/* 0x55: */
5222 	ISPOPMAP(0x00, 0x00),	/* 0x56: */
5223 	ISPOPMAP(0x00, 0x00),	/* 0x57: */
5224 	ISPOPMAP(0x00, 0x00),	/* 0x58: */
5225 	ISPOPMAP(0x00, 0x00),	/* 0x59: */
5226 	ISPOPMAP(0x00, 0x00),	/* 0x5a: */
5227 	ISPOPMAP(0x03, 0x01),	/* 0x5b: MBOX_DRIVER_HEARTBEAT */
5228 	ISPOPMAP(0xcf, 0x01),	/* 0x5c: MBOX_FW_HEARTBEAT */
5229 	ISPOPMAP(0x07, 0x03),	/* 0x5d: MBOX_GET_SET_DATA_RATE */
5230 	ISPOPMAP(0x00, 0x00),	/* 0x5e: */
5231 	ISPOPMAP(0x00, 0x00),	/* 0x5f: */
5232 	ISPOPMAP(0xfd, 0x31),	/* 0x60: MBOX_INIT_FIRMWARE */
5233 	ISPOPMAP(0x00, 0x00),	/* 0x61: */
5234 	ISPOPMAP(0x01, 0x01),	/* 0x62: MBOX_INIT_LIP */
5235 	ISPOPMAP(0xcd, 0x03),	/* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
5236 	ISPOPMAP(0xcf, 0x01),	/* 0x64: MBOX_GET_PORT_DB */
5237 	ISPOPMAP(0x07, 0x01),	/* 0x65: MBOX_CLEAR_ACA */
5238 	ISPOPMAP(0x07, 0x01),	/* 0x66: MBOX_TARGET_RESET */
5239 	ISPOPMAP(0x07, 0x01),	/* 0x67: MBOX_CLEAR_TASK_SET */
5240 	ISPOPMAP(0x07, 0x01),	/* 0x68: MBOX_ABORT_TASK_SET */
5241 	ISPOPMAP(0x01, 0x07),	/* 0x69: MBOX_GET_FW_STATE */
5242 	ISPOPMAP(0x03, 0xcf),	/* 0x6a: MBOX_GET_PORT_NAME */
5243 	ISPOPMAP(0xcf, 0x01),	/* 0x6b: MBOX_GET_LINK_STATUS */
5244 	ISPOPMAP(0x0f, 0x01),	/* 0x6c: MBOX_INIT_LIP_RESET */
5245 	ISPOPMAP(0x00, 0x00),	/* 0x6d: */
5246 	ISPOPMAP(0xcf, 0x03),	/* 0x6e: MBOX_SEND_SNS */
5247 	ISPOPMAP(0x0f, 0x07),	/* 0x6f: MBOX_FABRIC_LOGIN */
5248 	ISPOPMAP(0x03, 0x01),	/* 0x70: MBOX_SEND_CHANGE_REQUEST */
5249 	ISPOPMAP(0x03, 0x03),	/* 0x71: MBOX_FABRIC_LOGOUT */
5250 	ISPOPMAP(0x0f, 0x0f),	/* 0x72: MBOX_INIT_LIP_LOGIN */
5251 	ISPOPMAP(0x00, 0x00),	/* 0x73: */
5252 	ISPOPMAP(0x07, 0x01),	/* 0x74: LOGIN LOOP PORT */
5253 	ISPOPMAP(0xcf, 0x03),	/* 0x75: GET PORT/NODE NAME LIST */
5254 	ISPOPMAP(0x4f, 0x01),	/* 0x76: SET VENDOR ID */
5255 	ISPOPMAP(0xcd, 0x01),	/* 0x77: INITIALIZE IP MAILBOX */
5256 	ISPOPMAP(0x00, 0x00),	/* 0x78: */
5257 	ISPOPMAP(0x00, 0x00),	/* 0x79: */
5258 	ISPOPMAP(0x00, 0x00),	/* 0x7a: */
5259 	ISPOPMAP(0x00, 0x00),	/* 0x7b: */
5260 	ISPOPMAP(0x4f, 0x03),	/* 0x7c: Get ID List */
5261 	ISPOPMAP(0xcf, 0x01),	/* 0x7d: SEND LFA */
5262 	ISPOPMAP(0x0f, 0x01)	/* 0x7e: LUN RESET */
5263 };
5264 /*
5265  * Footnotes
5266  *
5267  * (1): this sets bits 21..16 in mailbox register #8, which we nominally
5268  *	do not access at this time in the core driver. The caller is
5269  *	responsible for setting this register first (Gross!).
5270  */
5271 
5272 #ifndef	ISP_STRIPPED
5273 static char *fc_mbcmd_names[] = {
5274 	"NO-OP",
5275 	"LOAD RAM",
5276 	"EXEC FIRMWARE",
5277 	"DUMP RAM",
5278 	"WRITE RAM WORD",
5279 	"READ RAM WORD",
5280 	"MAILBOX REG TEST",
5281 	"VERIFY CHECKSUM",
5282 	"ABOUT FIRMWARE",
5283 	"LOAD RAM",
5284 	"DUMP RAM",
5285 	NULL,
5286 	NULL,
5287 	"READ RAM WORD EXTENDED",
5288 	"CHECK FIRMWARE",
5289 	NULL,
5290 	"INIT REQUEST QUEUE",
5291 	"INIT RESULT QUEUE",
5292 	"EXECUTE IOCB",
5293 	"WAKE UP",
5294 	"STOP FIRMWARE",
5295 	"ABORT",
5296 	"ABORT DEVICE",
5297 	"ABORT TARGET",
5298 	"BUS RESET",
5299 	"STOP QUEUE",
5300 	"START QUEUE",
5301 	"SINGLE STEP QUEUE",
5302 	"ABORT QUEUE",
5303 	"GET DEV QUEUE STATUS",
5304 	NULL,
5305 	"GET FIRMWARE STATUS",
5306 	"GET LOOP ID",
5307 	NULL,
5308 	"GET RETRY COUNT",
5309 	NULL,
5310 	NULL,
5311 	NULL,
5312 	NULL,
5313 	NULL,
5314 	"GET FIRMWARE OPTIONS",
5315 	"GET PORT QUEUE PARAMS",
5316 	NULL,
5317 	NULL,
5318 	NULL,
5319 	NULL,
5320 	NULL,
5321 	NULL,
5322 	NULL,
5323 	NULL,
5324 	"SET RETRY COUNT",
5325 	NULL,
5326 	NULL,
5327 	NULL,
5328 	NULL,
5329 	NULL,
5330 	"SET FIRMWARE OPTIONS",
5331 	"SET PORT QUEUE PARAMS",
5332 	NULL,
5333 	NULL,
5334 	NULL,
5335 	NULL,
5336 	NULL,
5337 	NULL,
5338 	"LOOP PORT BYPASS",
5339 	"LOOP PORT ENABLE",
5340 	"GET RESOURCE COUNTS",
5341 	"REQUEST NON PARTICIPATING MODE",
5342 	NULL,
5343 	NULL,
5344 	NULL,
5345 	"GET PORT DATABASE,, ENHANCED",
5346 	NULL,
5347 	NULL,
5348 	NULL,
5349 	NULL,
5350 	NULL,
5351 	NULL,
5352 	NULL,
5353 	NULL,
5354 	NULL,
5355 	NULL,
5356 	NULL,
5357 	NULL,
5358 	"EXECUTE IOCB A64",
5359 	NULL,
5360 	NULL,
5361 	NULL,
5362 	NULL,
5363 	NULL,
5364 	NULL,
5365 	"DRIVER HEARTBEAT",
5366 	NULL,
5367 	"GET/SET DATA RATE",
5368 	NULL,
5369 	NULL,
5370 	"INIT FIRMWARE",
5371 	NULL,
5372 	"INIT LIP",
5373 	"GET FC-AL POSITION MAP",
5374 	"GET PORT DATABASE",
5375 	"CLEAR ACA",
5376 	"TARGET RESET",
5377 	"CLEAR TASK SET",
5378 	"ABORT TASK SET",
5379 	"GET FW STATE",
5380 	"GET PORT NAME",
5381 	"GET LINK STATUS",
5382 	"INIT LIP RESET",
5383 	NULL,
5384 	"SEND SNS",
5385 	"FABRIC LOGIN",
5386 	"SEND CHANGE REQUEST",
5387 	"FABRIC LOGOUT",
5388 	"INIT LIP LOGIN",
5389 	NULL,
5390 	"LOGIN LOOP PORT",
5391 	"GET PORT/NODE NAME LIST",
5392 	"SET VENDOR ID",
5393 	"INITIALIZE IP MAILBOX",
5394 	NULL,
5395 	NULL,
5396 	NULL,
5397 	NULL,
5398 	"Get ID List",
5399 	"SEND LFA",
5400 	"Lun RESET"
5401 };
5402 #endif
5403 
5404 static void
5405 isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t *mbp, int nodelay)
5406 {
5407 	unsigned int ibits, obits, box, opcode;
5408 	const uint32_t *mcp;
5409 
5410 	if (IS_FC(isp)) {
5411 		mcp = mbpfc;
5412 	} else {
5413 		mcp = mbpscsi;
5414 	}
5415 	opcode = mbp->param[0];
5416 	ibits = HIWRD(mcp[opcode]) & NMBOX_BMASK(isp);
5417 	obits = LOWRD(mcp[opcode]) & NMBOX_BMASK(isp);
5418 	ibits |= mbp->ibits;
5419 	obits |= mbp->obits;
5420 	for (box = 0; box < MAX_MAILBOX(isp); box++) {
5421 		if (ibits & (1 << box)) {
5422 			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
5423 		}
5424 		if (nodelay == 0) {
5425 			isp->isp_mboxtmp[box] = mbp->param[box] = 0;
5426 		}
5427 	}
5428 	if (nodelay == 0) {
5429 		isp->isp_lastmbxcmd = opcode;
5430 		isp->isp_obits = obits;
5431 		isp->isp_mboxbsy = 1;
5432 	}
5433 	ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
5434 	/*
5435 	 * Oddly enough, if we're not delaying for an answer,
5436 	 * delay a bit to give the f/w a chance to pick up the
5437 	 * command.
5438 	 */
5439 	if (nodelay) {
5440 		USEC_DELAY(1000);
5441 	}
5442 }
5443 
5444 static void
5445 isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp, int logmask)
5446 {
5447 	char *cname, *xname, tname[16], mname[16];
5448 	unsigned int lim, ibits, obits, box, opcode;
5449 	const uint32_t *mcp;
5450 
5451 	if (IS_FC(isp)) {
5452 		mcp = mbpfc;
5453 		lim = (sizeof (mbpfc) / sizeof (mbpfc[0]));
5454 	} else {
5455 		mcp = mbpscsi;
5456 		lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0]));
5457 	}
5458 
5459 	if ((opcode = mbp->param[0]) >= lim) {
5460 		mbp->param[0] = MBOX_INVALID_COMMAND;
5461 		isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
5462 		return;
5463 	}
5464 
5465 	ibits = HIWRD(mcp[opcode]) & NMBOX_BMASK(isp);
5466 	obits = LOWRD(mcp[opcode]) & NMBOX_BMASK(isp);
5467 
5468 	ibits |= mbp->ibits;
5469 	obits |= mbp->obits;
5470 
5471 	if (ibits == 0 && obits == 0) {
5472 		mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
5473 		isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
5474 		return;
5475 	}
5476 
5477 	/*
5478 	 * Get exclusive usage of mailbox registers.
5479 	 */
5480 	MBOX_ACQUIRE(isp);
5481 
5482 	for (box = 0; box < MAX_MAILBOX(isp); box++) {
5483 		if (ibits & (1 << box)) {
5484 			ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
5485 		}
5486 		isp->isp_mboxtmp[box] = mbp->param[box] = 0;
5487 	}
5488 
5489 	isp->isp_lastmbxcmd = opcode;
5490 
5491 	/*
5492 	 * We assume that we can't overwrite a previous command.
5493 	 */
5494 	isp->isp_obits = obits;
5495 	isp->isp_mboxbsy = 1;
5496 
5497 	/*
5498 	 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
5499 	 */
5500 	ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
5501 
5502 	/*
5503 	 * While we haven't finished the command, spin our wheels here.
5504 	 */
5505 	MBOX_WAIT_COMPLETE(isp);
5506 
5507 	if (isp->isp_mboxbsy) {
5508 		/*
5509 		 * Command timed out.
5510 		 */
5511 		isp->isp_mboxbsy = 0;
5512 		MBOX_RELEASE(isp);
5513 		return;
5514 	}
5515 
5516 	/*
5517 	 * Copy back output registers.
5518 	 */
5519 	for (box = 0; box < MAX_MAILBOX(isp); box++) {
5520 		if (obits & (1 << box)) {
5521 			mbp->param[box] = isp->isp_mboxtmp[box];
5522 		}
5523 	}
5524 
5525 	MBOX_RELEASE(isp);
5526 
5527 	if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) {
5528 		return;
5529 	}
5530 #ifdef	ISP_STRIPPED
5531 	cname = NULL;
5532 #else
5533 	cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode];
5534 #endif
5535 	if (cname == NULL) {
5536 		cname = tname;
5537 		SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
5538 	}
5539 
5540 	/*
5541 	 * Just to be chatty here...
5542 	 */
5543 	xname = NULL;
5544 	switch (mbp->param[0]) {
5545 	case MBOX_COMMAND_COMPLETE:
5546 		break;
5547 	case MBOX_INVALID_COMMAND:
5548 		if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE))
5549 			xname = "INVALID COMMAND";
5550 		break;
5551 	case MBOX_HOST_INTERFACE_ERROR:
5552 		if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR))
5553 			xname = "HOST INTERFACE ERROR";
5554 		break;
5555 	case MBOX_TEST_FAILED:
5556 		if (logmask & MBLOGMASK(MBOX_TEST_FAILED))
5557 			xname = "TEST FAILED";
5558 		break;
5559 	case MBOX_COMMAND_ERROR:
5560 		if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR))
5561 			xname = "COMMAND ERROR";
5562 		break;
5563 	case MBOX_COMMAND_PARAM_ERROR:
5564 		if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR))
5565 			xname = "COMMAND PARAMETER ERROR";
5566 		break;
5567 	case MBOX_LOOP_ID_USED:
5568 		if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED))
5569 			xname = "LOOP ID ALREADY IN USE";
5570 		break;
5571 	case MBOX_PORT_ID_USED:
5572 		if (logmask & MBLOGMASK(MBOX_PORT_ID_USED))
5573 			xname = "PORT ID ALREADY IN USE";
5574 		break;
5575 	case MBOX_ALL_IDS_USED:
5576 		if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED))
5577 			xname = "ALL LOOP IDS IN USE";
5578 		break;
5579 	case 0:		/* special case */
5580 		xname = "TIMEOUT";
5581 		break;
5582 	default:
5583 		SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]);
5584 		xname = mname;
5585 		break;
5586 	}
5587 	if (xname)
5588 		isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)",
5589 		    cname, xname);
5590 }
5591 
5592 static void
5593 isp_fw_state(ispsoftc_t *isp)
5594 {
5595 	if (IS_FC(isp)) {
5596 		mbreg_t mbs;
5597 		fcparam *fcp = isp->isp_param;
5598 
5599 		MEMZERO(&mbs, sizeof (mbs));
5600 		mbs.param[0] = MBOX_GET_FW_STATE;
5601 		isp_mboxcmd(isp, &mbs, MBLOGALL);
5602 		if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
5603 			fcp->isp_fwstate = mbs.param[1];
5604 		}
5605 	}
5606 }
5607 
5608 static void
5609 isp_update(ispsoftc_t *isp)
5610 {
5611 	int bus, upmask;
5612 
5613 	for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) {
5614 		if (upmask & (1 << bus)) {
5615 			isp_update_bus(isp, bus);
5616 		}
5617 		upmask &= ~(1 << bus);
5618 	}
5619 }
5620 
5621 static void
5622 isp_update_bus(ispsoftc_t *isp, int bus)
5623 {
5624 	int tgt;
5625 	mbreg_t mbs;
5626 	sdparam *sdp;
5627 
5628 	isp->isp_update &= ~(1 << bus);
5629 	if (IS_FC(isp)) {
5630 		/*
5631 		 * There are no 'per-bus' settings for Fibre Channel.
5632 		 */
5633 		return;
5634 	}
5635 	sdp = isp->isp_param;
5636 	sdp += bus;
5637 	MEMZERO(&mbs, sizeof (mbs));
5638 
5639 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
5640 		uint16_t flags, period, offset;
5641 		int get;
5642 
5643 		if (sdp->isp_devparam[tgt].dev_enable == 0) {
5644 			sdp->isp_devparam[tgt].dev_update = 0;
5645 			sdp->isp_devparam[tgt].dev_refresh = 0;
5646 			isp_prt(isp, ISP_LOGDEBUG0,
5647 	 		    "skipping target %d bus %d update", tgt, bus);
5648 			continue;
5649 		}
5650 		/*
5651 		 * If the goal is to update the status of the device,
5652 		 * take what's in goal_flags and try and set the device
5653 		 * toward that. Otherwise, if we're just refreshing the
5654 		 * current device state, get the current parameters.
5655 		 */
5656 
5657 		/*
5658 		 * Refresh overrides set
5659 		 */
5660 		if (sdp->isp_devparam[tgt].dev_refresh) {
5661 			mbs.param[0] = MBOX_GET_TARGET_PARAMS;
5662 			sdp->isp_devparam[tgt].dev_refresh = 0;
5663 			get = 1;
5664 		} else if (sdp->isp_devparam[tgt].dev_update) {
5665 			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
5666 			/*
5667 			 * Make sure goal_flags has "Renegotiate on Error"
5668 			 * on and "Freeze Queue on Error" off.
5669 			 */
5670 			sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG;
5671 			sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ;
5672 
5673 			mbs.param[2] = sdp->isp_devparam[tgt].goal_flags;
5674 
5675 			/*
5676 			 * Insist that PARITY must be enabled
5677 			 * if SYNC or WIDE is enabled.
5678 			 */
5679 			if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) {
5680 				mbs.param[2] |= DPARM_PARITY;
5681 			}
5682 
5683 			if ((mbs.param[2] & DPARM_SYNC) == 0) {
5684 				mbs.param[3] = 0;
5685 			} else {
5686 				mbs.param[3] =
5687 				    (sdp->isp_devparam[tgt].goal_offset << 8) |
5688 				    (sdp->isp_devparam[tgt].goal_period);
5689 			}
5690 			/*
5691 			 * A command completion later that has
5692 			 * RQSTF_NEGOTIATION set can cause
5693 			 * the dev_refresh/announce cycle also.
5694 			 *
5695 			 * Note: It is really important to update our current
5696 			 * flags with at least the state of TAG capabilities-
5697 			 * otherwise we might try and send a tagged command
5698 			 * when we have it all turned off. So change it here
5699 			 * to say that current already matches goal.
5700 			 */
5701 			sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING;
5702 			sdp->isp_devparam[tgt].actv_flags |=
5703 			    (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING);
5704 			isp_prt(isp, ISP_LOGDEBUG0,
5705 			    "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
5706 			    bus, tgt, mbs.param[2], mbs.param[3] >> 8,
5707 			    mbs.param[3] & 0xff);
5708 			sdp->isp_devparam[tgt].dev_update = 0;
5709 			sdp->isp_devparam[tgt].dev_refresh = 1;
5710 			get = 0;
5711 		} else {
5712 			continue;
5713 		}
5714 		mbs.param[1] = (bus << 15) | (tgt << 8);
5715 		isp_mboxcmd(isp, &mbs, MBLOGALL);
5716 		if (get == 0) {
5717 			isp->isp_sendmarker |= (1 << bus);
5718 			continue;
5719 		}
5720 		flags = mbs.param[2];
5721 		period = mbs.param[3] & 0xff;
5722 		offset = mbs.param[3] >> 8;
5723 		sdp->isp_devparam[tgt].actv_flags = flags;
5724 		sdp->isp_devparam[tgt].actv_period = period;
5725 		sdp->isp_devparam[tgt].actv_offset = offset;
5726 		get = (bus << 16) | tgt;
5727 		(void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get);
5728 	}
5729 
5730 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
5731 		if (sdp->isp_devparam[tgt].dev_update ||
5732 		    sdp->isp_devparam[tgt].dev_refresh) {
5733 			isp->isp_update |= (1 << bus);
5734 			break;
5735 		}
5736 	}
5737 }
5738 
5739 #ifndef	DEFAULT_FRAMESIZE
5740 #define	DEFAULT_FRAMESIZE(isp)		ICB_DFLT_FRMLEN
5741 #endif
5742 #ifndef	DEFAULT_EXEC_THROTTLE
5743 #define	DEFAULT_EXEC_THROTTLE(isp)	ISP_EXEC_THROTTLE
5744 #endif
5745 
5746 static void
5747 isp_setdfltparm(ispsoftc_t *isp, int channel)
5748 {
5749 	int tgt;
5750 	mbreg_t mbs;
5751 	sdparam *sdp;
5752 
5753 	MEMZERO(&mbs, sizeof (mbs));
5754 	if (IS_FC(isp)) {
5755 		fcparam *fcp = (fcparam *) isp->isp_param;
5756 		int nvfail;
5757 
5758 		fcp += channel;
5759 		if (fcp->isp_gotdparms) {
5760 			return;
5761 		}
5762 		fcp->isp_gotdparms = 1;
5763 		fcp->isp_maxfrmlen = DEFAULT_FRAMESIZE(isp);
5764 		fcp->isp_maxalloc = ICB_DFLT_ALLOC;
5765 		fcp->isp_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
5766 		fcp->isp_retry_delay = ICB_DFLT_RDELAY;
5767 		fcp->isp_retry_count = ICB_DFLT_RCOUNT;
5768 		/* Platform specific.... */
5769 		fcp->isp_loopid = DEFAULT_LOOPID(isp);
5770 		fcp->isp_nodewwn = DEFAULT_NODEWWN(isp);
5771 		fcp->isp_portwwn = DEFAULT_PORTWWN(isp);
5772 		fcp->isp_fwoptions = 0;
5773 		fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
5774 		fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
5775 		fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
5776 #ifndef	ISP_NO_FASTPOST_FC
5777 		fcp->isp_fwoptions |= ICBOPT_FAST_POST;
5778 #endif
5779 		if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
5780 			fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
5781 
5782 		/*
5783 		 * Make sure this is turned off now until we get
5784 		 * extended options from NVRAM
5785 		 */
5786 		fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
5787 
5788 		/*
5789 		 * Now try and read NVRAM unless told to not do so.
5790 		 * This will set fcparam's isp_nodewwn && isp_portwwn.
5791 		 */
5792 		if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
5793 		    	nvfail = isp_read_nvram(isp);
5794 			if (nvfail)
5795 				isp->isp_confopts |= ISP_CFG_NONVRAM;
5796 		} else {
5797 			nvfail = 1;
5798 		}
5799 		/*
5800 		 * Set node && port to override platform set defaults
5801 		 * unless the nvram read failed (or none was done),
5802 		 * or the platform code wants to use what had been
5803 		 * set in the defaults.
5804 		 */
5805 		if (nvfail) {
5806 			isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN;
5807 		}
5808 		if (isp->isp_confopts & ISP_CFG_OWNWWNN) {
5809 			isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x",
5810 			    (uint32_t) (DEFAULT_NODEWWN(isp) >> 32),
5811 			    (uint32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff));
5812 			ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
5813 		} else {
5814 			/*
5815 			 * We always start out with values derived
5816 			 * from NVRAM or our platform default.
5817 			 */
5818 			ISP_NODEWWN(isp) = fcp->isp_nodewwn;
5819 		}
5820 		if (isp->isp_confopts & ISP_CFG_OWNWWPN) {
5821 			isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x",
5822 			    (uint32_t) (DEFAULT_PORTWWN(isp) >> 32),
5823 			    (uint32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff));
5824 			ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
5825 		} else {
5826 			/*
5827 			 * We always start out with values derived
5828 			 * from NVRAM or our platform default.
5829 			 */
5830 			ISP_PORTWWN(isp) = fcp->isp_portwwn;
5831 		}
5832 		return;
5833 	}
5834 
5835 	sdp = (sdparam *) isp->isp_param;
5836 	sdp += channel;
5837 
5838 	/*
5839 	 * Been there, done that, got the T-shirt...
5840 	 */
5841 	if (sdp->isp_gotdparms) {
5842 		return;
5843 	}
5844 	sdp->isp_gotdparms = 1;
5845 
5846 	/*
5847 	 * Establish some default parameters.
5848 	 */
5849 	sdp->isp_cmd_dma_burst_enable = 0;
5850 	sdp->isp_data_dma_burst_enabl = 1;
5851 	sdp->isp_fifo_threshold = 0;
5852 	sdp->isp_initiator_id = DEFAULT_IID(isp);
5853 	if (isp->isp_type >= ISP_HA_SCSI_1040) {
5854 		sdp->isp_async_data_setup = 9;
5855 	} else {
5856 		sdp->isp_async_data_setup = 6;
5857 	}
5858 	sdp->isp_selection_timeout = 250;
5859 	sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
5860 	sdp->isp_tag_aging = 8;
5861 	sdp->isp_bus_reset_delay = 5;
5862 	/*
5863 	 * Don't retry selection, busy or queue full automatically- reflect
5864 	 * these back to us.
5865 	 */
5866 	sdp->isp_retry_count = 0;
5867 	sdp->isp_retry_delay = 0;
5868 
5869 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
5870 		sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
5871 		sdp->isp_devparam[tgt].dev_enable = 1;
5872 	}
5873 
5874 	/*
5875 	 * If we've not been told to avoid reading NVRAM, try and read it.
5876 	 * If we're successful reading it, we can then return because NVRAM
5877 	 * will tell us what the desired settings are. Otherwise, we establish
5878 	 * some reasonable 'fake' nvram and goal defaults.
5879 	 */
5880 
5881 	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
5882 		if (isp_read_nvram(isp) == 0) {
5883 			return;
5884 		}
5885 	}
5886 
5887 	/*
5888 	 * Now try and see whether we have specific values for them.
5889 	 */
5890 	if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
5891 		mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
5892 		isp_mboxcmd(isp, &mbs, MBLOGNONE);
5893 		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
5894 			sdp->isp_req_ack_active_neg = 1;
5895 			sdp->isp_data_line_active_neg = 1;
5896 		} else {
5897 			sdp->isp_req_ack_active_neg =
5898 			    (mbs.param[1+channel] >> 4) & 0x1;
5899 			sdp->isp_data_line_active_neg =
5900 			    (mbs.param[1+channel] >> 5) & 0x1;
5901 		}
5902 	}
5903 
5904 	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc3,
5905 	    0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
5906 	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
5907 	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
5908 	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc3,
5909 	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
5910 	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
5911 	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
5912 
5913 	/*
5914 	 * The trick here is to establish a default for the default (honk!)
5915 	 * state (goal_flags). Then try and get the current status from
5916 	 * the card to fill in the current state. We don't, in fact, set
5917 	 * the default to the SAFE default state- that's not the goal state.
5918 	 */
5919 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
5920 		uint8_t off, per;
5921 		sdp->isp_devparam[tgt].actv_offset = 0;
5922 		sdp->isp_devparam[tgt].actv_period = 0;
5923 		sdp->isp_devparam[tgt].actv_flags = 0;
5924 
5925 		sdp->isp_devparam[tgt].goal_flags =
5926 		    sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT;
5927 
5928 		/*
5929 		 * We default to Wide/Fast for versions less than a 1040
5930 		 * (unless it's SBus).
5931 		 */
5932 		if (IS_ULTRA3(isp)) {
5933 			off = ISP_80M_SYNCPARMS >> 8;
5934 			per = ISP_80M_SYNCPARMS & 0xff;
5935 		} else if (IS_ULTRA2(isp)) {
5936 			off = ISP_40M_SYNCPARMS >> 8;
5937 			per = ISP_40M_SYNCPARMS & 0xff;
5938 		} else if (IS_1240(isp)) {
5939 			off = ISP_20M_SYNCPARMS >> 8;
5940 			per = ISP_20M_SYNCPARMS & 0xff;
5941 		} else if ((isp->isp_bustype == ISP_BT_SBUS &&
5942 		    isp->isp_type < ISP_HA_SCSI_1020A) ||
5943 		    (isp->isp_bustype == ISP_BT_PCI &&
5944 		    isp->isp_type < ISP_HA_SCSI_1040) ||
5945 		    (isp->isp_clock && isp->isp_clock < 60) ||
5946 		    (sdp->isp_ultramode == 0)) {
5947 			off = ISP_10M_SYNCPARMS >> 8;
5948 			per = ISP_10M_SYNCPARMS & 0xff;
5949 		} else {
5950 			off = ISP_20M_SYNCPARMS_1040 >> 8;
5951 			per = ISP_20M_SYNCPARMS_1040 & 0xff;
5952 		}
5953 		sdp->isp_devparam[tgt].goal_offset =
5954 		    sdp->isp_devparam[tgt].nvrm_offset = off;
5955 		sdp->isp_devparam[tgt].goal_period =
5956 		    sdp->isp_devparam[tgt].nvrm_period = per;
5957 
5958 		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc3,
5959 		    channel, tgt, sdp->isp_devparam[tgt].nvrm_flags,
5960 		    sdp->isp_devparam[tgt].nvrm_offset,
5961 		    sdp->isp_devparam[tgt].nvrm_period);
5962 	}
5963 }
5964 
5965 /*
5966  * Re-initialize the ISP and complete all orphaned commands
5967  * with a 'botched' notice. The reset/init routines should
5968  * not disturb an already active list of commands.
5969  *
5970  * Locks held prior to coming here.
5971  */
5972 
5973 void
5974 isp_reinit(ispsoftc_t *isp)
5975 {
5976 	XS_T *xs;
5977 	int i;
5978 
5979 	if (IS_FC(isp)) {
5980 		isp_mark_getpdb_all(isp);
5981 	}
5982 	isp_reset(isp);
5983 	if (isp->isp_state != ISP_RESETSTATE) {
5984 		isp_prt(isp, ISP_LOGERR, "isp_reinit cannot reset card");
5985 	} else if (isp->isp_role != ISP_ROLE_NONE) {
5986 		isp_init(isp);
5987 		if (isp->isp_state == ISP_INITSTATE) {
5988 			isp->isp_state = ISP_RUNSTATE;
5989 		}
5990 		if (isp->isp_state != ISP_RUNSTATE) {
5991 			isp_prt(isp, ISP_LOGERR,
5992 			    "isp_reinit cannot restart card");
5993 		}
5994 	}
5995 	isp->isp_nactive = 0;
5996 
5997 	for (i = 0; i < isp->isp_maxcmds; i++) {
5998 		uint16_t handle;
5999 		xs = isp->isp_xflist[i];
6000 		if (xs == NULL) {
6001 			continue;
6002 		}
6003 		handle = isp_index_handle(i);
6004 		isp_destroy_handle(isp, handle);
6005 		if (XS_XFRLEN(xs)) {
6006 			ISP_DMAFREE(isp, xs, handle);
6007 			XS_RESID(xs) = XS_XFRLEN(xs);
6008 		} else {
6009 			XS_RESID(xs) = 0;
6010 		}
6011 		XS_SETERR(xs, HBA_BUSRESET);
6012 		isp_done(xs);
6013 	}
6014 }
6015 
6016 /*
6017  * NVRAM Routines
6018  */
6019 static int
6020 isp_read_nvram(ispsoftc_t *isp)
6021 {
6022 	int i, amt;
6023 	uint8_t csum, minversion;
6024 	union {
6025 		uint8_t _x[ISP2100_NVRAM_SIZE];
6026 		uint16_t _s[ISP2100_NVRAM_SIZE>>1];
6027 	} _n;
6028 #define	nvram_data	_n._x
6029 #define	nvram_words	_n._s
6030 
6031 	if (IS_FC(isp)) {
6032 		amt = ISP2100_NVRAM_SIZE;
6033 		minversion = 1;
6034 	} else if (IS_ULTRA2(isp)) {
6035 		amt = ISP1080_NVRAM_SIZE;
6036 		minversion = 0;
6037 	} else {
6038 		amt = ISP_NVRAM_SIZE;
6039 		minversion = 2;
6040 	}
6041 
6042 	/*
6043 	 * Just read the first two words first to see if we have a valid
6044 	 * NVRAM to continue reading the rest with.
6045 	 */
6046 	for (i = 0; i < 2; i++) {
6047 		isp_rdnvram_word(isp, i, &nvram_words[i]);
6048 	}
6049 	if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
6050 	    nvram_data[2] != 'P') {
6051 		if (isp->isp_bustype != ISP_BT_SBUS) {
6052 			isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header");
6053 			isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x",
6054 			    nvram_data[0], nvram_data[1], nvram_data[2]);
6055 		}
6056 		return (-1);
6057 	}
6058 	for (i = 2; i < amt>>1; i++) {
6059 		isp_rdnvram_word(isp, i, &nvram_words[i]);
6060 	}
6061 	for (csum = 0, i = 0; i < amt; i++) {
6062 		csum += nvram_data[i];
6063 	}
6064 	if (csum != 0) {
6065 		isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
6066 		return (-1);
6067 	}
6068 	if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
6069 		isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood",
6070 		    ISP_NVRAM_VERSION(nvram_data));
6071 		return (-1);
6072 	}
6073 
6074 	if (IS_ULTRA3(isp)) {
6075 		isp_parse_nvram_12160(isp, 0, nvram_data);
6076 		if (IS_12160(isp))
6077 			isp_parse_nvram_12160(isp, 1, nvram_data);
6078 	} else if (IS_1080(isp)) {
6079 		isp_parse_nvram_1080(isp, 0, nvram_data);
6080 	} else if (IS_1280(isp) || IS_1240(isp)) {
6081 		isp_parse_nvram_1080(isp, 0, nvram_data);
6082 		isp_parse_nvram_1080(isp, 1, nvram_data);
6083 	} else if (IS_SCSI(isp)) {
6084 		isp_parse_nvram_1020(isp, nvram_data);
6085 	} else {
6086 		isp_parse_nvram_2100(isp, nvram_data);
6087 	}
6088 	return (0);
6089 #undef	nvram_data
6090 #undef	nvram_words
6091 }
6092 
6093 static void
6094 isp_rdnvram_word(ispsoftc_t *isp, int wo, uint16_t *rp)
6095 {
6096 	int i, cbits;
6097 	uint16_t bit, rqst;
6098 
6099 	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
6100 	USEC_DELAY(2);
6101 	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
6102 	USEC_DELAY(2);
6103 
6104 	if (IS_FC(isp)) {
6105 		wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
6106 		if (IS_2312(isp) && isp->isp_port) {
6107 			wo += 128;
6108 		}
6109 		rqst = (ISP_NVRAM_READ << 8) | wo;
6110 		cbits = 10;
6111 	} else if (IS_ULTRA2(isp)) {
6112 		wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1);
6113 		rqst = (ISP_NVRAM_READ << 8) | wo;
6114 		cbits = 10;
6115 	} else {
6116 		wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
6117 		rqst = (ISP_NVRAM_READ << 6) | wo;
6118 		cbits = 8;
6119 	}
6120 
6121 	/*
6122 	 * Clock the word select request out...
6123 	 */
6124 	for (i = cbits; i >= 0; i--) {
6125 		if ((rqst >> i) & 1) {
6126 			bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
6127 		} else {
6128 			bit = BIU_NVRAM_SELECT;
6129 		}
6130 		ISP_WRITE(isp, BIU_NVRAM, bit);
6131 		USEC_DELAY(2);
6132 		ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
6133 		USEC_DELAY(2);
6134 		ISP_WRITE(isp, BIU_NVRAM, bit);
6135 		USEC_DELAY(2);
6136 	}
6137 	/*
6138 	 * Now read the result back in (bits come back in MSB format).
6139 	 */
6140 	*rp = 0;
6141 	for (i = 0; i < 16; i++) {
6142 		uint16_t rv;
6143 		*rp <<= 1;
6144 		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
6145 		USEC_DELAY(2);
6146 		rv = ISP_READ(isp, BIU_NVRAM);
6147 		if (rv & BIU_NVRAM_DATAIN) {
6148 			*rp |= 1;
6149 		}
6150 		USEC_DELAY(2);
6151 		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
6152 		USEC_DELAY(2);
6153 	}
6154 	ISP_WRITE(isp, BIU_NVRAM, 0);
6155 	USEC_DELAY(2);
6156 	ISP_SWIZZLE_NVRAM_WORD(isp, rp);
6157 }
6158 
6159 static void
6160 isp_parse_nvram_1020(ispsoftc_t *isp, uint8_t *nvram_data)
6161 {
6162 	sdparam *sdp = (sdparam *) isp->isp_param;
6163 	int tgt;
6164 
6165 	sdp->isp_fifo_threshold =
6166 		ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
6167 		(ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
6168 
6169 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
6170 		sdp->isp_initiator_id =
6171 			ISP_NVRAM_INITIATOR_ID(nvram_data);
6172 
6173 	sdp->isp_bus_reset_delay =
6174 		ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
6175 
6176 	sdp->isp_retry_count =
6177 		ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
6178 
6179 	sdp->isp_retry_delay =
6180 		ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
6181 
6182 	sdp->isp_async_data_setup =
6183 		ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
6184 
6185 	if (isp->isp_type >= ISP_HA_SCSI_1040) {
6186 		if (sdp->isp_async_data_setup < 9) {
6187 			sdp->isp_async_data_setup = 9;
6188 		}
6189 	} else {
6190 		if (sdp->isp_async_data_setup != 6) {
6191 			sdp->isp_async_data_setup = 6;
6192 		}
6193 	}
6194 
6195 	sdp->isp_req_ack_active_neg =
6196 		ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
6197 
6198 	sdp->isp_data_line_active_neg =
6199 		ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
6200 
6201 	sdp->isp_data_dma_burst_enabl =
6202 		ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
6203 
6204 	sdp->isp_cmd_dma_burst_enable =
6205 		ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
6206 
6207 	sdp->isp_tag_aging =
6208 		ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
6209 
6210 	sdp->isp_selection_timeout =
6211 		ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
6212 
6213 	sdp->isp_max_queue_depth =
6214 		ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
6215 
6216 	sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
6217 
6218 	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
6219 	    0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
6220 	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
6221 	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
6222 	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
6223 	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
6224 	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
6225 	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
6226 
6227 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
6228 		sdp->isp_devparam[tgt].dev_enable =
6229 			ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt);
6230 		sdp->isp_devparam[tgt].exc_throttle =
6231 			ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt);
6232 		sdp->isp_devparam[tgt].nvrm_offset =
6233 			ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt);
6234 		sdp->isp_devparam[tgt].nvrm_period =
6235 			ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt);
6236 		/*
6237 		 * We probably shouldn't lie about this, but it
6238 		 * it makes it much safer if we limit NVRAM values
6239 		 * to sanity.
6240 		 */
6241 		if (isp->isp_type < ISP_HA_SCSI_1040) {
6242 			/*
6243 			 * If we're not ultra, we can't possibly
6244 			 * be a shorter period than this.
6245 			 */
6246 			if (sdp->isp_devparam[tgt].nvrm_period < 0x19) {
6247 				sdp->isp_devparam[tgt].nvrm_period = 0x19;
6248 			}
6249 			if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) {
6250 				sdp->isp_devparam[tgt].nvrm_offset = 0x0c;
6251 			}
6252 		} else {
6253 			if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) {
6254 				sdp->isp_devparam[tgt].nvrm_offset = 0x8;
6255 			}
6256 		}
6257 		sdp->isp_devparam[tgt].nvrm_flags = 0;
6258 		if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt))
6259 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
6260 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
6261 		if (ISP_NVRAM_TGT_TQING(nvram_data, tgt))
6262 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
6263 		if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt))
6264 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
6265 		if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt))
6266 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
6267 		if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt))
6268 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
6269 		if (ISP_NVRAM_TGT_DISC(nvram_data, tgt))
6270 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
6271 		sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */
6272 		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
6273 		    0, tgt, sdp->isp_devparam[tgt].nvrm_flags,
6274 		    sdp->isp_devparam[tgt].nvrm_offset,
6275 		    sdp->isp_devparam[tgt].nvrm_period);
6276 		sdp->isp_devparam[tgt].goal_offset =
6277 		    sdp->isp_devparam[tgt].nvrm_offset;
6278 		sdp->isp_devparam[tgt].goal_period =
6279 		    sdp->isp_devparam[tgt].nvrm_period;
6280 		sdp->isp_devparam[tgt].goal_flags =
6281 		    sdp->isp_devparam[tgt].nvrm_flags;
6282 	}
6283 }
6284 
6285 static void
6286 isp_parse_nvram_1080(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
6287 {
6288 	sdparam *sdp = (sdparam *) isp->isp_param;
6289 	int tgt;
6290 
6291 	sdp += bus;
6292 
6293 	sdp->isp_fifo_threshold =
6294 	    ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
6295 
6296 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
6297 		sdp->isp_initiator_id =
6298 		    ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
6299 
6300 	sdp->isp_bus_reset_delay =
6301 	    ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
6302 
6303 	sdp->isp_retry_count =
6304 	    ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
6305 
6306 	sdp->isp_retry_delay =
6307 	    ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
6308 
6309 	sdp->isp_async_data_setup =
6310 	    ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
6311 
6312 	sdp->isp_req_ack_active_neg =
6313 	    ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
6314 
6315 	sdp->isp_data_line_active_neg =
6316 	    ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
6317 
6318 	sdp->isp_data_dma_burst_enabl =
6319 	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
6320 
6321 	sdp->isp_cmd_dma_burst_enable =
6322 	    ISP1080_NVRAM_BURST_ENABLE(nvram_data);
6323 
6324 	sdp->isp_selection_timeout =
6325 	    ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
6326 
6327 	sdp->isp_max_queue_depth =
6328 	     ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
6329 
6330 	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
6331 	    bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
6332 	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
6333 	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
6334 	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
6335 	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
6336 	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
6337 	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
6338 
6339 
6340 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
6341 		sdp->isp_devparam[tgt].dev_enable =
6342 		    ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
6343 		sdp->isp_devparam[tgt].exc_throttle =
6344 			ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
6345 		sdp->isp_devparam[tgt].nvrm_offset =
6346 			ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
6347 		sdp->isp_devparam[tgt].nvrm_period =
6348 			ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
6349 		sdp->isp_devparam[tgt].nvrm_flags = 0;
6350 		if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
6351 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
6352 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
6353 		if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus))
6354 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
6355 		if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
6356 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
6357 		if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
6358 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
6359 		if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
6360 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
6361 		if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus))
6362 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
6363 		sdp->isp_devparam[tgt].actv_flags = 0;
6364 		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
6365 		    bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
6366 		    sdp->isp_devparam[tgt].nvrm_offset,
6367 		    sdp->isp_devparam[tgt].nvrm_period);
6368 		sdp->isp_devparam[tgt].goal_offset =
6369 		    sdp->isp_devparam[tgt].nvrm_offset;
6370 		sdp->isp_devparam[tgt].goal_period =
6371 		    sdp->isp_devparam[tgt].nvrm_period;
6372 		sdp->isp_devparam[tgt].goal_flags =
6373 		    sdp->isp_devparam[tgt].nvrm_flags;
6374 	}
6375 }
6376 
6377 static void
6378 isp_parse_nvram_12160(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
6379 {
6380 	sdparam *sdp = (sdparam *) isp->isp_param;
6381 	int tgt;
6382 
6383 	sdp += bus;
6384 
6385 	sdp->isp_fifo_threshold =
6386 	    ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
6387 
6388 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
6389 		sdp->isp_initiator_id =
6390 		    ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
6391 
6392 	sdp->isp_bus_reset_delay =
6393 	    ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
6394 
6395 	sdp->isp_retry_count =
6396 	    ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
6397 
6398 	sdp->isp_retry_delay =
6399 	    ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
6400 
6401 	sdp->isp_async_data_setup =
6402 	    ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
6403 
6404 	sdp->isp_req_ack_active_neg =
6405 	    ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
6406 
6407 	sdp->isp_data_line_active_neg =
6408 	    ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
6409 
6410 	sdp->isp_data_dma_burst_enabl =
6411 	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
6412 
6413 	sdp->isp_cmd_dma_burst_enable =
6414 	    ISP12160_NVRAM_BURST_ENABLE(nvram_data);
6415 
6416 	sdp->isp_selection_timeout =
6417 	    ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
6418 
6419 	sdp->isp_max_queue_depth =
6420 	     ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
6421 
6422 	isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
6423 	    bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
6424 	    sdp->isp_bus_reset_delay, sdp->isp_retry_count,
6425 	    sdp->isp_retry_delay, sdp->isp_async_data_setup);
6426 	isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
6427 	    sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
6428 	    sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
6429 	    sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
6430 
6431 	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
6432 		sdp->isp_devparam[tgt].dev_enable =
6433 		    ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
6434 		sdp->isp_devparam[tgt].exc_throttle =
6435 			ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
6436 		sdp->isp_devparam[tgt].nvrm_offset =
6437 			ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
6438 		sdp->isp_devparam[tgt].nvrm_period =
6439 			ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
6440 		sdp->isp_devparam[tgt].nvrm_flags = 0;
6441 		if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
6442 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
6443 		sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
6444 		if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus))
6445 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
6446 		if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
6447 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
6448 		if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
6449 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
6450 		if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
6451 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
6452 		if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus))
6453 			sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
6454 		sdp->isp_devparam[tgt].actv_flags = 0;
6455 		isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
6456 		    bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
6457 		    sdp->isp_devparam[tgt].nvrm_offset,
6458 		    sdp->isp_devparam[tgt].nvrm_period);
6459 		sdp->isp_devparam[tgt].goal_offset =
6460 		    sdp->isp_devparam[tgt].nvrm_offset;
6461 		sdp->isp_devparam[tgt].goal_period =
6462 		    sdp->isp_devparam[tgt].nvrm_period;
6463 		sdp->isp_devparam[tgt].goal_flags =
6464 		    sdp->isp_devparam[tgt].nvrm_flags;
6465 	}
6466 }
6467 
6468 static void
6469 isp_parse_nvram_2100(ispsoftc_t *isp, uint8_t *nvram_data)
6470 {
6471 	fcparam *fcp = (fcparam *) isp->isp_param;
6472 	uint64_t wwn;
6473 
6474 	/*
6475 	 * There is NVRAM storage for both Port and Node entities-
6476 	 * but the Node entity appears to be unused on all the cards
6477 	 * I can find. However, we should account for this being set
6478 	 * at some point in the future.
6479 	 *
6480 	 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in
6481 	 * bits 48..60. In the case of the 2202, it appears that they do
6482 	 * use bit 48 to distinguish between the two instances on the card.
6483 	 * The 2204, which I've never seen, *probably* extends this method.
6484 	 */
6485 	wwn = ISP2100_NVRAM_PORT_NAME(nvram_data);
6486 	if (wwn) {
6487 		isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x",
6488 		    (uint32_t) (wwn >> 32), (uint32_t) (wwn & 0xffffffff));
6489 		if ((wwn >> 60) == 0) {
6490 			wwn |= (((uint64_t) 2)<< 60);
6491 		}
6492 	}
6493 	fcp->isp_portwwn = wwn;
6494 	if (IS_2200(isp) || IS_23XX(isp)) {
6495 		wwn = ISP2200_NVRAM_NODE_NAME(nvram_data);
6496 		if (wwn) {
6497 			isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x",
6498 			    (uint32_t) (wwn >> 32),
6499 			    (uint32_t) (wwn & 0xffffffff));
6500 			if ((wwn >> 60) == 0) {
6501 				wwn |= (((uint64_t) 2)<< 60);
6502 			}
6503 		}
6504 	} else {
6505 		wwn &= ~((uint64_t) 0xfff << 48);
6506 	}
6507 	fcp->isp_nodewwn = wwn;
6508 
6509 	/*
6510 	 * Make sure we have both Node and Port as non-zero values.
6511 	 */
6512 	if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) {
6513 		fcp->isp_portwwn = fcp->isp_nodewwn;
6514 	} else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) {
6515 		fcp->isp_nodewwn = fcp->isp_portwwn;
6516 	}
6517 
6518 	/*
6519 	 * Make the Node and Port values sane if they're NAA == 2.
6520 	 * This means to clear bits 48..56 for the Node WWN and
6521 	 * make sure that there's some non-zero value in 48..56
6522 	 * for the Port WWN.
6523 	 */
6524 	if (fcp->isp_nodewwn && fcp->isp_portwwn) {
6525 		if ((fcp->isp_nodewwn & (((uint64_t) 0xfff) << 48)) != 0 &&
6526 		    (fcp->isp_nodewwn >> 60) == 2) {
6527 			fcp->isp_nodewwn &= ~((uint64_t) 0xfff << 48);
6528 		}
6529 		if ((fcp->isp_portwwn & (((uint64_t) 0xfff) << 48)) == 0 &&
6530 		    (fcp->isp_portwwn >> 60) == 2) {
6531 			fcp->isp_portwwn |= ((uint64_t) 1 << 56);
6532 		}
6533 	}
6534 
6535 	isp_prt(isp, ISP_LOGDEBUG0,
6536 	    "NVRAM: maxfrmlen %d execthrottle %d fwoptions 0x%x loopid %x",
6537 	    ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data),
6538 	    ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data),
6539 	    ISP2100_NVRAM_OPTIONS(nvram_data),
6540 	    ISP2100_NVRAM_HARDLOOPID(nvram_data));
6541 
6542 	fcp->isp_maxalloc =
6543 		ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
6544 	if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0)
6545 		fcp->isp_maxfrmlen =
6546 			ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
6547 	fcp->isp_retry_delay =
6548 		ISP2100_NVRAM_RETRY_DELAY(nvram_data);
6549 	fcp->isp_retry_count =
6550 		ISP2100_NVRAM_RETRY_COUNT(nvram_data);
6551 	if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
6552 		fcp->isp_loopid =
6553 			ISP2100_NVRAM_HARDLOOPID(nvram_data);
6554 	if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0)
6555 		fcp->isp_execthrottle =
6556 			ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
6557 	fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
6558 }
6559 
6560 #ifdef	ISP_FW_CRASH_DUMP
6561 static void isp2200_fw_dump(ispsoftc_t *);
6562 static void isp2300_fw_dump(ispsoftc_t *);
6563 
6564 static void
6565 isp2200_fw_dump(ispsoftc_t *isp)
6566 {
6567 	int i, j;
6568 	mbreg_t mbs;
6569 	uint16_t *ptr;
6570 
6571 	MEMZERO(&mbs, sizeof (mbs));
6572 	ptr = FCPARAM(isp)->isp_dump_data;
6573 	if (ptr == NULL) {
6574 		isp_prt(isp, ISP_LOGERR,
6575 		   "No place to dump RISC registers and SRAM");
6576 		return;
6577 	}
6578 	if (*ptr++) {
6579 		isp_prt(isp, ISP_LOGERR,
6580 		   "dump area for RISC registers and SRAM already used");
6581 		return;
6582 	}
6583 	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
6584 	for (i = 0; i < 100; i++) {
6585 		USEC_DELAY(100);
6586 		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
6587 			break;
6588 		}
6589 	}
6590 	if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
6591 		/*
6592 		 * PBIU Registers
6593 		 */
6594 		for (i = 0; i < 8; i++) {
6595 			*ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
6596 		}
6597 
6598 		/*
6599 		 * Mailbox Registers
6600 		 */
6601 		for (i = 0; i < 8; i++) {
6602 			*ptr++ = ISP_READ(isp, MBOX_BLOCK + (i << 1));
6603 		}
6604 
6605 		/*
6606 		 * DMA Registers
6607 		 */
6608 		for (i = 0; i < 48; i++) {
6609 			*ptr++ = ISP_READ(isp, DMA_BLOCK + 0x20 + (i << 1));
6610 		}
6611 
6612 		/*
6613 		 * RISC H/W Registers
6614 		 */
6615 		ISP_WRITE(isp, BIU2100_CSR, 0);
6616 		for (i = 0; i < 16; i++) {
6617 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
6618 		}
6619 
6620 		/*
6621 		 * RISC GP Registers
6622 		 */
6623 		for (j = 0; j < 8; j++) {
6624 			ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 8));
6625 			for (i = 0; i < 16; i++) {
6626 				*ptr++ =
6627 				    ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6628 			}
6629 		}
6630 
6631 		/*
6632 		 * Frame Buffer Hardware Registers
6633 		 */
6634 		ISP_WRITE(isp, BIU2100_CSR, 0x10);
6635 		for (i = 0; i < 16; i++) {
6636 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6637 		}
6638 
6639 		/*
6640 		 * Fibre Protocol Module 0 Hardware Registers
6641 		 */
6642 		ISP_WRITE(isp, BIU2100_CSR, 0x20);
6643 		for (i = 0; i < 64; i++) {
6644 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6645 		}
6646 
6647 		/*
6648 		 * Fibre Protocol Module 1 Hardware Registers
6649 		 */
6650 		ISP_WRITE(isp, BIU2100_CSR, 0x30);
6651 		for (i = 0; i < 64; i++) {
6652 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6653 		}
6654 	} else {
6655 		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
6656 		return;
6657 	}
6658 	isp_prt(isp, ISP_LOGALL,
6659 	   "isp_fw_dump: RISC registers dumped successfully");
6660 	ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
6661 	for (i = 0; i < 100; i++) {
6662 		USEC_DELAY(100);
6663 		if (ISP_READ(isp, OUTMAILBOX0) == 0) {
6664 			break;
6665 		}
6666 	}
6667 	if (ISP_READ(isp, OUTMAILBOX0) != 0) {
6668 		isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
6669 		return;
6670 	}
6671 	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
6672 	for (i = 0; i < 100; i++) {
6673 		USEC_DELAY(100);
6674 		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
6675 			break;
6676 		}
6677 	}
6678 	if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
6679 		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause After Reset");
6680 		return;
6681 	}
6682 	ISP_WRITE(isp, RISC_EMB, 0xf2);
6683 	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
6684 	for (i = 0; i < 100; i++) {
6685 		USEC_DELAY(100);
6686 		if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
6687 			break;
6688 		}
6689 	}
6690 	ENABLE_INTS(isp);
6691 	mbs.param[0] = MBOX_READ_RAM_WORD;
6692 	mbs.param[1] = 0x1000;
6693 	isp->isp_mbxworkp = (void *) ptr;
6694 	isp->isp_mbxwrk0 = 0xefff;	/* continuation count */
6695 	isp->isp_mbxwrk1 = 0x1001;	/* next SRAM address */
6696 	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
6697 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
6698 		isp_prt(isp, ISP_LOGWARN,
6699 		    "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
6700 		return;
6701 	}
6702 	ptr = isp->isp_mbxworkp;	/* finish fetch of final word */
6703 	*ptr++ = isp->isp_mboxtmp[2];
6704 	isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
6705 	FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
6706 	(void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
6707 }
6708 
6709 static void
6710 isp2300_fw_dump(ispsoftc_t *isp)
6711 {
6712 	int i, j;
6713 	mbreg_t mbs;
6714 	uint16_t *ptr;
6715 
6716 	MEMZERO(&mbs, sizeof (mbs));
6717 	ptr = FCPARAM(isp)->isp_dump_data;
6718 	if (ptr == NULL) {
6719 		isp_prt(isp, ISP_LOGERR,
6720 		   "No place to dump RISC registers and SRAM");
6721 		return;
6722 	}
6723 	if (*ptr++) {
6724 		isp_prt(isp, ISP_LOGERR,
6725 		   "dump area for RISC registers and SRAM already used");
6726 		return;
6727 	}
6728 	ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
6729 	for (i = 0; i < 100; i++) {
6730 		USEC_DELAY(100);
6731 		if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
6732 			break;
6733 		}
6734 	}
6735 	if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
6736 		/*
6737 		 * PBIU registers
6738 		 */
6739 		for (i = 0; i < 8; i++) {
6740 			*ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
6741 		}
6742 
6743 		/*
6744 		 * ReqQ-RspQ-Risc2Host Status registers
6745 		 */
6746 		for (i = 0; i < 8; i++) {
6747 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x10 + (i << 1));
6748 		}
6749 
6750 		/*
6751 		 * Mailbox Registers
6752 		 */
6753 		for (i = 0; i < 32; i++) {
6754 			*ptr++ =
6755 			    ISP_READ(isp, PCI_MBOX_REGS2300_OFF + (i << 1));
6756 		}
6757 
6758 		/*
6759 		 * Auto Request Response DMA registers
6760 		 */
6761 		ISP_WRITE(isp, BIU2100_CSR, 0x40);
6762 		for (i = 0; i < 32; i++) {
6763 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6764 		}
6765 
6766 		/*
6767 		 * DMA registers
6768 		 */
6769 		ISP_WRITE(isp, BIU2100_CSR, 0x50);
6770 		for (i = 0; i < 48; i++) {
6771 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6772 		}
6773 
6774 		/*
6775 		 * RISC hardware registers
6776 		 */
6777 		ISP_WRITE(isp, BIU2100_CSR, 0);
6778 		for (i = 0; i < 16; i++) {
6779 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
6780 		}
6781 
6782 		/*
6783 		 * RISC GP? registers
6784 		 */
6785 		for (j = 0; j < 8; j++) {
6786 			ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 9));
6787 			for (i = 0; i < 16; i++) {
6788 				*ptr++ =
6789 				    ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6790 			}
6791 		}
6792 
6793 		/*
6794 		 * frame buffer hardware registers
6795 		 */
6796 		ISP_WRITE(isp, BIU2100_CSR, 0x10);
6797 		for (i = 0; i < 64; i++) {
6798 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6799 		}
6800 
6801 		/*
6802 		 * FPM B0 hardware registers
6803 		 */
6804 		ISP_WRITE(isp, BIU2100_CSR, 0x20);
6805 		for (i = 0; i < 64; i++) {
6806 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6807 		}
6808 
6809 		/*
6810 		 * FPM B1 hardware registers
6811 		 */
6812 		ISP_WRITE(isp, BIU2100_CSR, 0x30);
6813 		for (i = 0; i < 64; i++) {
6814 			*ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
6815 		}
6816 	} else {
6817 		isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
6818 		return;
6819 	}
6820 	isp_prt(isp, ISP_LOGALL,
6821 	   "isp_fw_dump: RISC registers dumped successfully");
6822 	ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
6823 	for (i = 0; i < 100; i++) {
6824 		USEC_DELAY(100);
6825 		if (ISP_READ(isp, OUTMAILBOX0) == 0) {
6826 			break;
6827 		}
6828 	}
6829 	if (ISP_READ(isp, OUTMAILBOX0) != 0) {
6830 		isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
6831 		return;
6832 	}
6833 	ENABLE_INTS(isp);
6834 	mbs.param[0] = MBOX_READ_RAM_WORD;
6835 	mbs.param[1] = 0x800;
6836 	isp->isp_mbxworkp = (void *) ptr;
6837 	isp->isp_mbxwrk0 = 0xf7ff;	/* continuation count */
6838 	isp->isp_mbxwrk1 = 0x801;	/* next SRAM address */
6839 	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
6840 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
6841 		isp_prt(isp, ISP_LOGWARN,
6842 		    "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
6843 		return;
6844 	}
6845 	ptr = isp->isp_mbxworkp;	/* finish fetch of final word */
6846 	*ptr++ = isp->isp_mboxtmp[2];
6847 
6848 	/*
6849 	 * We don't have access to mailbox registers 8.. onward
6850 	 * in our 'common' device model- so we have to set it
6851 	 * here and hope it stays the same!
6852 	 */
6853 	ISP_WRITE(isp, PCI_MBOX_REGS2300_OFF + (8 << 1), 0x1);
6854 
6855 	mbs.param[0] = MBOX_READ_RAM_WORD_EXTENDED;
6856 	mbs.param[1] = 0;
6857 	isp->isp_mbxworkp = (void *) ptr;
6858 	isp->isp_mbxwrk0 = 0xffff;	/* continuation count */
6859 	isp->isp_mbxwrk1 = 0x1;		/* next SRAM address */
6860 	isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
6861 	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
6862 		isp_prt(isp, ISP_LOGWARN,
6863 		    "RAM DUMP FAILED @ WORD %x", 0x10000 + isp->isp_mbxwrk1);
6864 		return;
6865 	}
6866 	ptr = isp->isp_mbxworkp;	/* finish final word */
6867 	*ptr++ = mbs.param[2];
6868 	isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
6869 	FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
6870 	(void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
6871 }
6872 
6873 void
6874 isp_fw_dump(ispsoftc_t *isp)
6875 {
6876 	if (IS_2200(isp))
6877 		isp2200_fw_dump(isp);
6878 	else if (IS_23XX(isp))
6879 		isp2300_fw_dump(isp);
6880 }
6881 #endif
6882