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