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