Home | History | Annotate | Line # | Download | only in ic
isp_netbsd.c revision 1.36
      1 /* $NetBSD: isp_netbsd.c,v 1.36 2000/12/28 21:37:04 mjacob Exp $ */
      2 /*
      3  * This driver, which is contained in NetBSD in the files:
      4  *
      5  *	sys/dev/ic/isp.c
      6  *	sys/dev/ic/isp_inline.h
      7  *	sys/dev/ic/isp_netbsd.c
      8  *	sys/dev/ic/isp_netbsd.h
      9  *	sys/dev/ic/isp_target.c
     10  *	sys/dev/ic/isp_target.h
     11  *	sys/dev/ic/isp_tpublic.h
     12  *	sys/dev/ic/ispmbox.h
     13  *	sys/dev/ic/ispreg.h
     14  *	sys/dev/ic/ispvar.h
     15  *	sys/microcode/isp/asm_sbus.h
     16  *	sys/microcode/isp/asm_1040.h
     17  *	sys/microcode/isp/asm_1080.h
     18  *	sys/microcode/isp/asm_12160.h
     19  *	sys/microcode/isp/asm_2100.h
     20  *	sys/microcode/isp/asm_2200.h
     21  *	sys/pci/isp_pci.c
     22  *	sys/sbus/isp_sbus.c
     23  *
     24  * Is being actively maintained by Matthew Jacob (mjacob (at) netbsd.org).
     25  * This driver also is shared source with FreeBSD, OpenBSD, Linux, Solaris,
     26  * Linux versions. This tends to be an interesting maintenance problem.
     27  *
     28  * Please coordinate with Matthew Jacob on changes you wish to make here.
     29  */
     30 /*
     31  * Platform (NetBSD) dependent common attachment code for Qlogic adapters.
     32  * Matthew Jacob <mjacob (at) nas.nasa.gov>
     33  */
     34 /*
     35  * Copyright (C) 1997, 1998, 1999 National Aeronautics & Space Administration
     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, this list of conditions and the following disclaimer.
     43  * 2. Redistributions in binary form must reproduce the above copyright
     44  *    notice, this list of conditions and the following disclaimer in the
     45  *    documentation and/or other materials provided with the distribution.
     46  * 3. The name of the author may not be used to endorse or promote products
     47  *    derived from this software without specific prior written permission
     48  *
     49  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     50  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     51  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     52  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     53  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     54  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     55  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     56  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     57  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     58  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     59  */
     60 
     61 #include <dev/ic/isp_netbsd.h>
     62 #include <sys/scsiio.h>
     63 
     64 
     65 /*
     66  * Set a timeout for the watchdogging of a command.
     67  *
     68  * The dimensional analysis is
     69  *
     70  *	milliseconds * (seconds/millisecond) * (ticks/second) = ticks
     71  *
     72  *			=
     73  *
     74  *	(milliseconds / 1000) * hz = ticks
     75  *
     76  *
     77  * For timeouts less than 1 second, we'll get zero. Because of this, and
     78  * because we want to establish *our* timeout to be longer than what the
     79  * firmware might do, we just add 3 seconds at the back end.
     80  */
     81 #define	_XT(xs)	((((xs)->timeout/1000) * hz) + (3 * hz))
     82 
     83 static void ispminphys __P((struct buf *));
     84 static int32_t ispcmd __P((XS_T *));
     85 static int
     86 ispioctl __P((struct scsipi_link *, u_long, caddr_t, int, struct proc *));
     87 
     88 static struct scsipi_device isp_dev = { NULL, NULL, NULL, NULL };
     89 static int isp_polled_cmd __P((struct ispsoftc *, XS_T *));
     90 static void isp_dog __P((void *));
     91 static void isp_command_requeue __P((void *));
     92 static void isp_internal_restart __P((void *));
     93 
     94 /*
     95  * Complete attachment of hardware, include subdevices.
     96  */
     97 void
     98 isp_attach(isp)
     99 	struct ispsoftc *isp;
    100 {
    101 	isp->isp_osinfo._adapter.scsipi_minphys = ispminphys;
    102 	isp->isp_osinfo._adapter.scsipi_ioctl = ispioctl;
    103 	isp->isp_osinfo._adapter.scsipi_cmd = ispcmd;
    104 
    105 	isp->isp_state = ISP_RUNSTATE;
    106 	isp->isp_osinfo._link.scsipi_scsi.channel =
    107 	    (IS_DUALBUS(isp))? 0 : SCSI_CHANNEL_ONLY_ONE;
    108 	isp->isp_osinfo._link.adapter_softc = isp;
    109 	isp->isp_osinfo._link.device = &isp_dev;
    110 	isp->isp_osinfo._link.adapter = &isp->isp_osinfo._adapter;
    111 	isp->isp_osinfo._link.openings = isp->isp_maxcmds;
    112 	/*
    113 	 * Until the midlayer is fixed to use REPORT LUNS, limit to 8 luns.
    114 	 */
    115 	isp->isp_osinfo._link.scsipi_scsi.max_lun =
    116 	   (isp->isp_maxluns < 7)? isp->isp_maxluns - 1 : 7;
    117 	TAILQ_INIT(&isp->isp_osinfo.waitq);	/* The 2nd bus will share.. */
    118 
    119 	if (IS_FC(isp)) {
    120 		isp->isp_osinfo._link.scsipi_scsi.max_target = MAX_FC_TARG-1;
    121 	} else {
    122 		sdparam *sdp = isp->isp_param;
    123 		isp->isp_osinfo._link.scsipi_scsi.max_target = MAX_TARGETS-1;
    124 		isp->isp_osinfo._link.scsipi_scsi.adapter_target =
    125 		    sdp->isp_initiator_id;
    126 		isp->isp_osinfo.discovered[0] = 1 << sdp->isp_initiator_id;
    127 		if (IS_DUALBUS(isp)) {
    128 			isp->isp_osinfo._link_b = isp->isp_osinfo._link;
    129 			sdp++;
    130 			isp->isp_osinfo.discovered[1] =
    131 			    1 << sdp->isp_initiator_id;
    132 			isp->isp_osinfo._link_b.scsipi_scsi.adapter_target =
    133 			    sdp->isp_initiator_id;
    134 			isp->isp_osinfo._link_b.scsipi_scsi.channel = 1;
    135 			isp->isp_osinfo._link_b.scsipi_scsi.max_lun =
    136 			    isp->isp_osinfo._link.scsipi_scsi.max_lun;
    137 		}
    138 	}
    139 	isp->isp_osinfo._link.type = BUS_SCSI;
    140 
    141 	/*
    142 	 * Send a SCSI Bus Reset.
    143 	 */
    144 	if (IS_SCSI(isp)) {
    145 		int bus = 0;
    146 		ISP_LOCK(isp);
    147 		(void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
    148 		if (IS_DUALBUS(isp)) {
    149 			bus++;
    150 			(void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
    151 		}
    152 		ISP_UNLOCK(isp);
    153 	} else {
    154 		int defid;
    155 		fcparam *fcp = isp->isp_param;
    156 		delay(2 * 1000000);
    157 		defid = MAX_FC_TARG;
    158 		ISP_LOCK(isp);
    159 		/*
    160 		 * We probably won't have clock interrupts running,
    161 		 * so we'll be really short (smoke test, really)
    162 		 * at this time.
    163 		 */
    164 		if (isp_control(isp, ISPCTL_FCLINK_TEST, NULL)) {
    165 			(void) isp_control(isp, ISPCTL_PDB_SYNC, NULL);
    166 			if (fcp->isp_fwstate == FW_READY &&
    167 			    fcp->isp_loopstate >= LOOP_PDB_RCVD) {
    168 				defid = fcp->isp_loopid;
    169 			}
    170 		}
    171 		ISP_UNLOCK(isp);
    172 		isp->isp_osinfo._link.scsipi_scsi.adapter_target = defid;
    173 	}
    174 
    175 	/*
    176 	 * After this point, we'll be doing the new configuration
    177 	 * schema which allows interrups, so we can do tsleep/wakeup
    178 	 * for mailbox stuff at that point.
    179 	 */
    180 	isp->isp_osinfo.no_mbox_ints = 0;
    181 
    182 	/*
    183 	 * And attach children (if any).
    184 	 */
    185 	config_found((void *)isp, &isp->isp_osinfo._link, scsiprint);
    186 	if (IS_DUALBUS(isp)) {
    187 		config_found((void *)isp, &isp->isp_osinfo._link_b, scsiprint);
    188 	}
    189 }
    190 
    191 /*
    192  * minphys our xfers
    193  *
    194  * Unfortunately, the buffer pointer describes the target device- not the
    195  * adapter device, so we can't use the pointer to find out what kind of
    196  * adapter we are and adjust accordingly.
    197  */
    198 
    199 static void
    200 ispminphys(bp)
    201 	struct buf *bp;
    202 {
    203 	/*
    204 	 * XX: Only the 1020 has a 24 bit limit.
    205 	 */
    206 	if (bp->b_bcount >= (1 << 24)) {
    207 		bp->b_bcount = (1 << 24);
    208 	}
    209 	minphys(bp);
    210 }
    211 
    212 static int
    213 ispioctl(sc_link, cmd, addr, flag, p)
    214 	struct scsipi_link *sc_link;
    215 	u_long cmd;
    216 	caddr_t addr;
    217 	int flag;
    218 	struct proc *p;
    219 {
    220 	struct ispsoftc *isp = sc_link->adapter_softc;
    221 	int s, chan, retval = ENOTTY;
    222 
    223 	chan = (sc_link->scsipi_scsi.channel == SCSI_CHANNEL_ONLY_ONE)? 0 :
    224 	    sc_link->scsipi_scsi.channel;
    225 
    226 	switch (cmd) {
    227 	case SCBUSACCEL:
    228 	{
    229 		struct scbusaccel_args *sp = (struct scbusaccel_args *)addr;
    230 		if (IS_SCSI(isp) && sp->sa_lun == 0) {
    231 			int dflags = 0;
    232 			sdparam *sdp = SDPARAM(isp);
    233 
    234 			sdp += chan;
    235 			if (sp->sa_flags & SC_ACCEL_TAGS)
    236 				dflags |= DPARM_TQING;
    237 			if (sp->sa_flags & SC_ACCEL_WIDE)
    238 				dflags |= DPARM_WIDE;
    239 			if (sp->sa_flags & SC_ACCEL_SYNC)
    240 				dflags |= DPARM_SYNC;
    241 			s = splbio();
    242 			sdp->isp_devparam[sp->sa_target].dev_flags |= dflags;
    243 			dflags = sdp->isp_devparam[sp->sa_target].dev_flags;
    244 			sdp->isp_devparam[sp->sa_target].dev_update = 1;
    245 			isp->isp_update |= (1 << chan);
    246 			splx(s);
    247 			isp_prt(isp, ISP_LOGDEBUG1,
    248 			    "ispioctl: device flags 0x%x for %d.%d.X",
    249 			    dflags, chan, sp->sa_target);
    250 		}
    251 		retval = 0;
    252 		break;
    253 	}
    254 	case SCBUSIORESET:
    255 		s = splbio();
    256 		if (isp_control(isp, ISPCTL_RESET_BUS, &chan))
    257 			retval = EIO;
    258 		else
    259 			retval = 0;
    260 		(void) splx(s);
    261 		break;
    262 	default:
    263 		break;
    264 	}
    265 	return (retval);
    266 }
    267 
    268 
    269 static int32_t
    270 ispcmd(xs)
    271 	XS_T *xs;
    272 {
    273 	struct ispsoftc *isp;
    274 	int result, s;
    275 
    276 	isp = XS_ISP(xs);
    277 	s = splbio();
    278 	if (isp->isp_state < ISP_RUNSTATE) {
    279 		DISABLE_INTS(isp);
    280 		isp_init(isp);
    281                 if (isp->isp_state != ISP_INITSTATE) {
    282 			ENABLE_INTS(isp);
    283                         (void) splx(s);
    284                         XS_SETERR(xs, HBA_BOTCH);
    285                         return (COMPLETE);
    286                 }
    287                 isp->isp_state = ISP_RUNSTATE;
    288 		ENABLE_INTS(isp);
    289         }
    290 
    291 	/*
    292 	 * Check for queue blockage...
    293 	 */
    294 	if (isp->isp_osinfo.blocked) {
    295 		if (xs->xs_control & XS_CTL_POLL) {
    296 			xs->error = XS_DRIVER_STUFFUP;
    297 			splx(s);
    298 			return (TRY_AGAIN_LATER);
    299 		}
    300 		TAILQ_INSERT_TAIL(&isp->isp_osinfo.waitq, xs, adapter_q);
    301 		splx(s);
    302 		return (SUCCESSFULLY_QUEUED);
    303 	}
    304 
    305 	if (xs->xs_control & XS_CTL_POLL) {
    306 		volatile u_int8_t ombi = isp->isp_osinfo.no_mbox_ints;
    307 		isp->isp_osinfo.no_mbox_ints = 1;
    308 		result = isp_polled_cmd(isp, xs);
    309 		isp->isp_osinfo.no_mbox_ints = ombi;
    310 		(void) splx(s);
    311 		return (result);
    312 	}
    313 
    314 	result = isp_start(xs);
    315 #if	0
    316 {
    317 	static int na[16] = { 0 };
    318 	if (na[isp->isp_unit] < isp->isp_nactive) {
    319 		isp_prt(isp, ISP_LOGALL, "active hiwater %d", isp->isp_nactive);
    320 		na[isp->isp_unit] = isp->isp_nactive;
    321 	}
    322 }
    323 #endif
    324 	switch (result) {
    325 	case CMD_QUEUED:
    326 		result = SUCCESSFULLY_QUEUED;
    327 		if (xs->timeout) {
    328 			callout_reset(&xs->xs_callout, _XT(xs), isp_dog, xs);
    329 		}
    330 		break;
    331 	case CMD_EAGAIN:
    332 		result = TRY_AGAIN_LATER;
    333 		break;
    334 	case CMD_RQLATER:
    335 		result = SUCCESSFULLY_QUEUED;
    336 		callout_reset(&xs->xs_callout, hz, isp_command_requeue, xs);
    337 		break;
    338 	case CMD_COMPLETE:
    339 		result = COMPLETE;
    340 		break;
    341 	}
    342 	(void) splx(s);
    343 	return (result);
    344 }
    345 
    346 static int
    347 isp_polled_cmd(isp, xs)
    348 	struct ispsoftc *isp;
    349 	XS_T *xs;
    350 {
    351 	int result;
    352 	int infinite = 0, mswait;
    353 
    354 	result = isp_start(xs);
    355 
    356 	switch (result) {
    357 	case CMD_QUEUED:
    358 		result = SUCCESSFULLY_QUEUED;
    359 		break;
    360 	case CMD_RQLATER:
    361 	case CMD_EAGAIN:
    362 		if (XS_NOERR(xs)) {
    363 			xs->error = XS_DRIVER_STUFFUP;
    364 		}
    365 		result = TRY_AGAIN_LATER;
    366 		break;
    367 	case CMD_COMPLETE:
    368 		result = COMPLETE;
    369 		break;
    370 
    371 	}
    372 
    373 	if (result != SUCCESSFULLY_QUEUED) {
    374 		return (result);
    375 	}
    376 
    377 	/*
    378 	 * If we can't use interrupts, poll on completion.
    379 	 */
    380 	if ((mswait = XS_TIME(xs)) == 0)
    381 		infinite = 1;
    382 
    383 	while (mswait || infinite) {
    384 		if (isp_intr((void *)isp)) {
    385 			if (XS_CMD_DONE_P(xs)) {
    386 				break;
    387 			}
    388 		}
    389 		USEC_DELAY(1000);
    390 		mswait -= 1;
    391 	}
    392 
    393 	/*
    394 	 * If no other error occurred but we didn't finish,
    395 	 * something bad happened.
    396 	 */
    397 	if (XS_CMD_DONE_P(xs) == 0) {
    398 		if (isp_control(isp, ISPCTL_ABORT_CMD, xs)) {
    399 			isp_reinit(isp);
    400 		}
    401 		if (XS_NOERR(xs)) {
    402 			XS_SETERR(xs, HBA_BOTCH);
    403 		}
    404 	}
    405 	result = COMPLETE;
    406 	return (result);
    407 }
    408 
    409 void
    410 isp_done(xs)
    411 	XS_T *xs;
    412 {
    413 	XS_CMD_S_DONE(xs);
    414 	if (XS_CMD_WDOG_P(xs) == 0) {
    415 		struct ispsoftc *isp = XS_ISP(xs);
    416 		callout_stop(&xs->xs_callout);
    417 		if (XS_CMD_GRACE_P(xs)) {
    418 			isp_prt(isp, ISP_LOGDEBUG1,
    419 			    "finished command on borrowed time");
    420 		}
    421 		XS_CMD_S_CLEAR(xs);
    422 		scsipi_done(xs);
    423 	}
    424 }
    425 
    426 static void
    427 isp_dog(arg)
    428 	void *arg;
    429 {
    430 	XS_T *xs = arg;
    431 	struct ispsoftc *isp = XS_ISP(xs);
    432 	u_int32_t handle;
    433 
    434 	ISP_ILOCK(isp);
    435 	/*
    436 	 * We've decided this command is dead. Make sure we're not trying
    437 	 * to kill a command that's already dead by getting it's handle and
    438 	 * and seeing whether it's still alive.
    439 	 */
    440 	handle = isp_find_handle(isp, xs);
    441 	if (handle) {
    442 		u_int16_t r, r1, i;
    443 
    444 		if (XS_CMD_DONE_P(xs)) {
    445 			isp_prt(isp, ISP_LOGDEBUG1,
    446 			    "watchdog found done cmd (handle 0x%x)", handle);
    447 			ISP_IUNLOCK(isp);
    448 			return;
    449 		}
    450 
    451 		if (XS_CMD_WDOG_P(xs)) {
    452 			isp_prt(isp, ISP_LOGDEBUG1,
    453 			    "recursive watchdog (handle 0x%x)", handle);
    454 			ISP_IUNLOCK(isp);
    455 			return;
    456 		}
    457 
    458 		XS_CMD_S_WDOG(xs);
    459 
    460 		i = 0;
    461 		do {
    462 			r = ISP_READ(isp, BIU_ISR);
    463 			USEC_DELAY(1);
    464 			r1 = ISP_READ(isp, BIU_ISR);
    465 		} while (r != r1 && ++i < 1000);
    466 
    467 		if (INT_PENDING(isp, r) && isp_intr(isp) && XS_CMD_DONE_P(xs)) {
    468 			isp_prt(isp, ISP_LOGDEBUG1, "watchdog cleanup (%x, %x)",
    469 			    handle, r);
    470 			XS_CMD_C_WDOG(xs);
    471 			isp_done(xs);
    472 		} else if (XS_CMD_GRACE_P(xs)) {
    473 			isp_prt(isp, ISP_LOGDEBUG1, "watchdog timeout (%x, %x)",
    474 			    handle, r);
    475 			/*
    476 			 * Make sure the command is *really* dead before we
    477 			 * release the handle (and DMA resources) for reuse.
    478 			 */
    479 			(void) isp_control(isp, ISPCTL_ABORT_CMD, arg);
    480 
    481 			/*
    482 			 * After this point, the comamnd is really dead.
    483 			 */
    484 			if (XS_XFRLEN(xs)) {
    485 				ISP_DMAFREE(isp, xs, handle);
    486 			}
    487 			isp_destroy_handle(isp, handle);
    488 			XS_SETERR(xs, XS_TIMEOUT);
    489 			XS_CMD_S_CLEAR(xs);
    490 			isp_done(xs);
    491 		} else {
    492 			u_int16_t iptr, optr;
    493 			ispreq_t *mp;
    494 			isp_prt(isp, ISP_LOGDEBUG2,
    495 			    "possible command timeout (%x, %x)", handle, r);
    496 			XS_CMD_C_WDOG(xs);
    497 			callout_reset(&xs->xs_callout, hz, isp_dog, xs);
    498 			if (isp_getrqentry(isp, &iptr, &optr, (void **) &mp)) {
    499 				ISP_UNLOCK(isp);
    500 				return;
    501 			}
    502 			XS_CMD_S_GRACE(xs);
    503 			MEMZERO((void *) mp, sizeof (*mp));
    504 			mp->req_header.rqs_entry_count = 1;
    505 			mp->req_header.rqs_entry_type = RQSTYPE_MARKER;
    506 			mp->req_modifier = SYNC_ALL;
    507 			mp->req_target = XS_CHANNEL(xs) << 7;
    508 			ISP_SWIZZLE_REQUEST(isp, mp);
    509 			ISP_ADD_REQUEST(isp, iptr);
    510 		}
    511 	} else {
    512 		isp_prt(isp, ISP_LOGDEBUG0, "watchdog with no command");
    513 	}
    514 	ISP_IUNLOCK(isp);
    515 }
    516 
    517 /*
    518  * Free any associated resources prior to decommissioning and
    519  * set the card to a known state (so it doesn't wake up and kick
    520  * us when we aren't expecting it to).
    521  *
    522  * Locks are held before coming here.
    523  */
    524 void
    525 isp_uninit(isp)
    526 	struct ispsoftc *isp;
    527 {
    528 	isp_lock(isp);
    529 	/*
    530 	 * Leave with interrupts disabled.
    531 	 */
    532 	DISABLE_INTS(isp);
    533 	isp_unlock(isp);
    534 }
    535 
    536 /*
    537  * Restart function for a command to be requeued later.
    538  */
    539 static void
    540 isp_command_requeue(arg)
    541 	void *arg;
    542 {
    543 	struct scsipi_xfer *xs = arg;
    544 	struct ispsoftc *isp = XS_ISP(xs);
    545 	ISP_ILOCK(isp);
    546 	switch (ispcmd(xs)) {
    547 	case SUCCESSFULLY_QUEUED:
    548 		isp_prt(isp, ISP_LOGINFO,
    549 		    "requeued commands for %d.%d", XS_TGT(xs), XS_LUN(xs));
    550 		if (xs->timeout) {
    551 			callout_reset(&xs->xs_callout, _XT(xs), isp_dog, xs);
    552 		}
    553 		break;
    554 	case TRY_AGAIN_LATER:
    555 		isp_prt(isp, ISP_LOGINFO,
    556 		    "EAGAIN on requeue for %d.%d", XS_TGT(xs), XS_LUN(xs));
    557 		callout_reset(&xs->xs_callout, hz, isp_command_requeue, xs);
    558 		break;
    559 	case COMPLETE:
    560 		/* can only be an error */
    561 		XS_CMD_S_DONE(xs);
    562 		callout_stop(&xs->xs_callout);
    563 		if (XS_NOERR(xs)) {
    564 			XS_SETERR(xs, HBA_BOTCH);
    565 		}
    566 		scsipi_done(xs);
    567 		break;
    568 	}
    569 	ISP_IUNLOCK(isp);
    570 }
    571 
    572 /*
    573  * Restart function after a LOOP UP event (e.g.),
    574  * done as a timeout for some hysteresis.
    575  */
    576 static void
    577 isp_internal_restart(arg)
    578 	void *arg;
    579 {
    580 	struct ispsoftc *isp = arg;
    581 	int result, nrestarted = 0;
    582 
    583 	ISP_ILOCK(isp);
    584 	if (isp->isp_osinfo.blocked == 0) {
    585 		struct scsipi_xfer *xs;
    586 		while ((xs = TAILQ_FIRST(&isp->isp_osinfo.waitq)) != NULL) {
    587 			TAILQ_REMOVE(&isp->isp_osinfo.waitq, xs, adapter_q);
    588 			result = isp_start(xs);
    589 			if (result != CMD_QUEUED) {
    590 				isp_prt(isp, ISP_LOGERR,
    591 				    "botched command restart (err=%d)", result);
    592 				XS_CMD_S_DONE(xs);
    593 				if (xs->error == XS_NOERROR)
    594 					xs->error = XS_DRIVER_STUFFUP;
    595 				callout_stop(&xs->xs_callout);
    596 				scsipi_done(xs);
    597 			} else if (xs->timeout) {
    598 				callout_reset(&xs->xs_callout,
    599 				    _XT(xs), isp_dog, xs);
    600 			}
    601 			nrestarted++;
    602 		}
    603 		isp_prt(isp, ISP_LOGINFO,
    604 		    "isp_restart requeued %d commands", nrestarted);
    605 	}
    606 	ISP_IUNLOCK(isp);
    607 }
    608 
    609 int
    610 isp_async(isp, cmd, arg)
    611 	struct ispsoftc *isp;
    612 	ispasync_t cmd;
    613 	void *arg;
    614 {
    615 	int bus, tgt;
    616 	int s = splbio();
    617 	switch (cmd) {
    618 	case ISPASYNC_NEW_TGT_PARAMS:
    619 	if (IS_SCSI(isp) && isp->isp_dblev) {
    620 		sdparam *sdp = isp->isp_param;
    621 		char *wt;
    622 		int mhz, flags, period;
    623 
    624 		tgt = *((int *) arg);
    625 		bus = (tgt >> 16) & 0xffff;
    626 		tgt &= 0xffff;
    627 		sdp += bus;
    628 		flags = sdp->isp_devparam[tgt].cur_dflags;
    629 		period = sdp->isp_devparam[tgt].cur_period;
    630 
    631 		if ((flags & DPARM_SYNC) && period &&
    632 		    (sdp->isp_devparam[tgt].cur_offset) != 0) {
    633 			/*
    634 			 * There's some ambiguity about our negotiated speed
    635 			 * if we haven't detected LVD mode correctly (which
    636 			 * seems to happen, unfortunately). If we're in LVD
    637 			 * mode, then different rules apply about speed.
    638 			 */
    639 			if (sdp->isp_lvdmode || period < 0xc) {
    640 				switch (period) {
    641 				case 0x9:
    642 					mhz = 80;
    643 					break;
    644 				case 0xa:
    645 					mhz = 40;
    646 					break;
    647 				case 0xb:
    648 					mhz = 33;
    649 					break;
    650 				case 0xc:
    651 					mhz = 25;
    652 					break;
    653 				default:
    654 					mhz = 1000 / (period * 4);
    655 					break;
    656 				}
    657 			} else {
    658 				mhz = 1000 / (period * 4);
    659 			}
    660 		} else {
    661 			mhz = 0;
    662 		}
    663 		switch (flags & (DPARM_WIDE|DPARM_TQING)) {
    664 		case DPARM_WIDE:
    665 			wt = ", 16 bit wide";
    666 			break;
    667 		case DPARM_TQING:
    668 			wt = ", Tagged Queueing Enabled";
    669 			break;
    670 		case DPARM_WIDE|DPARM_TQING:
    671 			wt = ", 16 bit wide, Tagged Queueing Enabled";
    672 			break;
    673 		default:
    674 			wt = " ";
    675 			break;
    676 		}
    677 		if (mhz) {
    678 			isp_prt(isp, ISP_LOGINFO,
    679 			    "Bus %d Target %d at %dMHz Max Offset %d%s",
    680 			    bus, tgt, mhz, sdp->isp_devparam[tgt].cur_offset,
    681 			    wt);
    682 		} else {
    683 			isp_prt(isp, ISP_LOGINFO,
    684 			    "Bus %d Target %d Async Mode%s", bus, tgt, wt);
    685 		}
    686 		break;
    687 	}
    688 	case ISPASYNC_BUS_RESET:
    689 		if (arg)
    690 			bus = *((int *) arg);
    691 		else
    692 			bus = 0;
    693 		isp_prt(isp, ISP_LOGINFO, "SCSI bus %d reset detected", bus);
    694 		break;
    695 	case ISPASYNC_LOOP_DOWN:
    696 		/*
    697 		 * Hopefully we get here in time to minimize the number
    698 		 * of commands we are firing off that are sure to die.
    699 		 */
    700 		isp->isp_osinfo.blocked = 1;
    701 		isp_prt(isp, ISP_LOGINFO, "Loop DOWN");
    702 		break;
    703         case ISPASYNC_LOOP_UP:
    704 		isp->isp_osinfo.blocked = 0;
    705 		callout_reset(&isp->isp_osinfo._restart, 1,
    706 		    isp_internal_restart, isp);
    707 		isp_prt(isp, ISP_LOGINFO, "Loop UP");
    708 		break;
    709 	case ISPASYNC_PDB_CHANGED:
    710 	if (IS_FC(isp) && isp->isp_dblev) {
    711 		const char *fmt = "Target %d (Loop 0x%x) Port ID 0x%x "
    712 		    "role %s %s\n Port WWN 0x%08x%08x\n Node WWN 0x%08x%08x";
    713 		const static char *roles[4] = {
    714 		    "No", "Target", "Initiator", "Target/Initiator"
    715 		};
    716 		char *ptr;
    717 		fcparam *fcp = isp->isp_param;
    718 		int tgt = *((int *) arg);
    719 		struct lportdb *lp = &fcp->portdb[tgt];
    720 
    721 		if (lp->valid) {
    722 			ptr = "arrived";
    723 		} else {
    724 			ptr = "disappeared";
    725 		}
    726 		isp_prt(isp, ISP_LOGINFO, fmt, tgt, lp->loopid, lp->portid,
    727 		    roles[lp->roles & 0x3], ptr,
    728 		    (u_int32_t) (lp->port_wwn >> 32),
    729 		    (u_int32_t) (lp->port_wwn & 0xffffffffLL),
    730 		    (u_int32_t) (lp->node_wwn >> 32),
    731 		    (u_int32_t) (lp->node_wwn & 0xffffffffLL));
    732 		break;
    733 	}
    734 #ifdef	ISP2100_FABRIC
    735 	case ISPASYNC_CHANGE_NOTIFY:
    736 		isp_prt(isp, ISP_LOGINFO, "Name Server Database Changed");
    737 		break;
    738 	case ISPASYNC_FABRIC_DEV:
    739 	{
    740 		int target;
    741 		struct lportdb *lp;
    742 		sns_scrsp_t *resp = (sns_scrsp_t *) arg;
    743 		u_int32_t portid;
    744 		u_int64_t wwn;
    745 		fcparam *fcp = isp->isp_param;
    746 
    747 		portid =
    748 		    (((u_int32_t) resp->snscb_port_id[0]) << 16) |
    749 		    (((u_int32_t) resp->snscb_port_id[1]) << 8) |
    750 		    (((u_int32_t) resp->snscb_port_id[2]));
    751 		wwn =
    752 		    (((u_int64_t)resp->snscb_portname[0]) << 56) |
    753 		    (((u_int64_t)resp->snscb_portname[1]) << 48) |
    754 		    (((u_int64_t)resp->snscb_portname[2]) << 40) |
    755 		    (((u_int64_t)resp->snscb_portname[3]) << 32) |
    756 		    (((u_int64_t)resp->snscb_portname[4]) << 24) |
    757 		    (((u_int64_t)resp->snscb_portname[5]) << 16) |
    758 		    (((u_int64_t)resp->snscb_portname[6]) <<  8) |
    759 		    (((u_int64_t)resp->snscb_portname[7]));
    760 
    761 		isp_prt(isp, ISP_LOGINFO,
    762 		    "Fabric Device (Type 0x%x)@PortID 0x%x WWN 0x%08x%08x",
    763 		    resp->snscb_port_type, portid, ((u_int32_t)(wwn >> 32)),
    764 		    ((u_int32_t)(wwn & 0xffffffff)));
    765 
    766 		for (target = FC_SNS_ID+1; target < MAX_FC_TARG; target++) {
    767 			lp = &fcp->portdb[target];
    768 			if (lp->port_wwn == wwn)
    769 				break;
    770 		}
    771 		if (target < MAX_FC_TARG) {
    772 			break;
    773 		}
    774 		for (target = FC_SNS_ID+1; target < MAX_FC_TARG; target++) {
    775 			lp = &fcp->portdb[target];
    776 			if (lp->port_wwn == 0)
    777 				break;
    778 		}
    779 		if (target == MAX_FC_TARG) {
    780 			isp_prt(isp, ISP_LOGWARN,
    781 			    "no more space for fabric devices");
    782 			return (-1);
    783 		}
    784 		lp->port_wwn = lp->node_wwn = wwn;
    785 		lp->portid = portid;
    786 		break;
    787 	}
    788 #endif
    789 	default:
    790 		break;
    791 	}
    792 	(void) splx(s);
    793 	return (0);
    794 }
    795 
    796 #include <machine/stdarg.h>
    797 void
    798 #ifdef	__STDC__
    799 isp_prt(struct ispsoftc *isp, int level, const char *fmt, ...)
    800 #else
    801 isp_prt(isp, fmt, va_alist)
    802 	struct ispsoftc *isp;
    803 	char *fmt;
    804 	va_dcl;
    805 #endif
    806 {
    807 	va_list ap;
    808 	if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) {
    809 		return;
    810 	}
    811 	printf("%s: ", isp->isp_name);
    812 	va_start(ap, fmt);
    813 	vprintf(fmt, ap);
    814 	va_end(ap);
    815 	printf("\n");
    816 }
    817