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