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