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