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