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