Home | History | Annotate | Line # | Download | only in scsipi
scsipi_base.c revision 1.111
      1 /*	$NetBSD: scsipi_base.c,v 1.111 2004/09/02 12:39:56 chs Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1998, 1999, 2000, 2002, 2003 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Charles M. Hannum; by Jason R. Thorpe of the Numerical Aerospace
      9  * Simulation Facility, NASA Ames Research Center.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  * 3. All advertising materials mentioning features or use of this software
     20  *    must display the following acknowledgement:
     21  *        This product includes software developed by the NetBSD
     22  *        Foundation, Inc. and its contributors.
     23  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24  *    contributors may be used to endorse or promote products derived
     25  *    from this software without specific prior written permission.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  * POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 
     40 #include <sys/cdefs.h>
     41 __KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.111 2004/09/02 12:39:56 chs Exp $");
     42 
     43 #include "opt_scsi.h"
     44 
     45 #include <sys/param.h>
     46 #include <sys/systm.h>
     47 #include <sys/kernel.h>
     48 #include <sys/buf.h>
     49 #include <sys/uio.h>
     50 #include <sys/malloc.h>
     51 #include <sys/pool.h>
     52 #include <sys/errno.h>
     53 #include <sys/device.h>
     54 #include <sys/proc.h>
     55 #include <sys/kthread.h>
     56 #include <sys/hash.h>
     57 
     58 #include <uvm/uvm_extern.h>
     59 
     60 #include <dev/scsipi/scsipi_all.h>
     61 #include <dev/scsipi/scsipi_disk.h>
     62 #include <dev/scsipi/scsipiconf.h>
     63 #include <dev/scsipi/scsipi_base.h>
     64 
     65 #include <dev/scsipi/scsi_all.h>
     66 #include <dev/scsipi/scsi_message.h>
     67 
     68 static int	scsipi_complete(struct scsipi_xfer *);
     69 static void	scsipi_request_sense(struct scsipi_xfer *);
     70 static int	scsipi_enqueue(struct scsipi_xfer *);
     71 static void	scsipi_run_queue(struct scsipi_channel *chan);
     72 
     73 static void	scsipi_completion_thread(void *);
     74 
     75 static void	scsipi_get_tag(struct scsipi_xfer *);
     76 static void	scsipi_put_tag(struct scsipi_xfer *);
     77 
     78 static int	scsipi_get_resource(struct scsipi_channel *);
     79 static void	scsipi_put_resource(struct scsipi_channel *);
     80 
     81 static void	scsipi_async_event_max_openings(struct scsipi_channel *,
     82 		    struct scsipi_max_openings *);
     83 static void	scsipi_async_event_xfer_mode(struct scsipi_channel *,
     84 		    struct scsipi_xfer_mode *);
     85 static void	scsipi_async_event_channel_reset(struct scsipi_channel *);
     86 
     87 static struct pool scsipi_xfer_pool;
     88 
     89 /*
     90  * scsipi_init:
     91  *
     92  *	Called when a scsibus or atapibus is attached to the system
     93  *	to initialize shared data structures.
     94  */
     95 void
     96 scsipi_init(void)
     97 {
     98 	static int scsipi_init_done;
     99 
    100 	if (scsipi_init_done)
    101 		return;
    102 	scsipi_init_done = 1;
    103 
    104 	/* Initialize the scsipi_xfer pool. */
    105 	pool_init(&scsipi_xfer_pool, sizeof(struct scsipi_xfer), 0,
    106 	    0, 0, "scxspl", NULL);
    107 	if (pool_prime(&scsipi_xfer_pool,
    108 	    PAGE_SIZE / sizeof(struct scsipi_xfer)) == ENOMEM) {
    109 		printf("WARNING: not enough memory for scsipi_xfer_pool\n");
    110 	}
    111 }
    112 
    113 /*
    114  * scsipi_channel_init:
    115  *
    116  *	Initialize a scsipi_channel when it is attached.
    117  */
    118 int
    119 scsipi_channel_init(struct scsipi_channel *chan)
    120 {
    121 	int i;
    122 
    123 	/* Initialize shared data. */
    124 	scsipi_init();
    125 
    126 	/* Initialize the queues. */
    127 	TAILQ_INIT(&chan->chan_queue);
    128 	TAILQ_INIT(&chan->chan_complete);
    129 
    130 	for (i = 0; i < SCSIPI_CHAN_PERIPH_BUCKETS; i++)
    131 		LIST_INIT(&chan->chan_periphtab[i]);
    132 
    133 	/*
    134 	 * Create the asynchronous completion thread.
    135 	 */
    136 	kthread_create(scsipi_create_completion_thread, chan);
    137 	return (0);
    138 }
    139 
    140 /*
    141  * scsipi_channel_shutdown:
    142  *
    143  *	Shutdown a scsipi_channel.
    144  */
    145 void
    146 scsipi_channel_shutdown(struct scsipi_channel *chan)
    147 {
    148 
    149 	/*
    150 	 * Shut down the completion thread.
    151 	 */
    152 	chan->chan_tflags |= SCSIPI_CHANT_SHUTDOWN;
    153 	wakeup(&chan->chan_complete);
    154 
    155 	/*
    156 	 * Now wait for the thread to exit.
    157 	 */
    158 	while (chan->chan_thread != NULL)
    159 		(void) tsleep(&chan->chan_thread, PRIBIO, "scshut", 0);
    160 }
    161 
    162 static uint32_t
    163 scsipi_chan_periph_hash(uint64_t t, uint64_t l)
    164 {
    165 	uint32_t hash;
    166 
    167 	hash = hash32_buf(&t, sizeof(t), HASH32_BUF_INIT);
    168 	hash = hash32_buf(&l, sizeof(l), hash);
    169 
    170 	return (hash & SCSIPI_CHAN_PERIPH_HASHMASK);
    171 }
    172 
    173 /*
    174  * scsipi_insert_periph:
    175  *
    176  *	Insert a periph into the channel.
    177  */
    178 void
    179 scsipi_insert_periph(struct scsipi_channel *chan, struct scsipi_periph *periph)
    180 {
    181 	uint32_t hash;
    182 	int s;
    183 
    184 	hash = scsipi_chan_periph_hash(periph->periph_target,
    185 	    periph->periph_lun);
    186 
    187 	s = splbio();
    188 	LIST_INSERT_HEAD(&chan->chan_periphtab[hash], periph, periph_hash);
    189 	splx(s);
    190 }
    191 
    192 /*
    193  * scsipi_remove_periph:
    194  *
    195  *	Remove a periph from the channel.
    196  */
    197 void
    198 scsipi_remove_periph(struct scsipi_channel *chan, struct scsipi_periph *periph)
    199 {
    200 	int s;
    201 
    202 	s = splbio();
    203 	LIST_REMOVE(periph, periph_hash);
    204 	splx(s);
    205 }
    206 
    207 /*
    208  * scsipi_lookup_periph:
    209  *
    210  *	Lookup a periph on the specified channel.
    211  */
    212 struct scsipi_periph *
    213 scsipi_lookup_periph(struct scsipi_channel *chan, int target, int lun)
    214 {
    215 	struct scsipi_periph *periph;
    216 	uint32_t hash;
    217 	int s;
    218 
    219 	if (target >= chan->chan_ntargets ||
    220 	    lun >= chan->chan_nluns)
    221 		return (NULL);
    222 
    223 	hash = scsipi_chan_periph_hash(target, lun);
    224 
    225 	s = splbio();
    226 	LIST_FOREACH(periph, &chan->chan_periphtab[hash], periph_hash) {
    227 		if (periph->periph_target == target &&
    228 		    periph->periph_lun == lun)
    229 			break;
    230 	}
    231 	splx(s);
    232 
    233 	return (periph);
    234 }
    235 
    236 /*
    237  * scsipi_get_resource:
    238  *
    239  *	Allocate a single xfer `resource' from the channel.
    240  *
    241  *	NOTE: Must be called at splbio().
    242  */
    243 static int
    244 scsipi_get_resource(struct scsipi_channel *chan)
    245 {
    246 	struct scsipi_adapter *adapt = chan->chan_adapter;
    247 
    248 	if (chan->chan_flags & SCSIPI_CHAN_OPENINGS) {
    249 		if (chan->chan_openings > 0) {
    250 			chan->chan_openings--;
    251 			return (1);
    252 		}
    253 		return (0);
    254 	}
    255 
    256 	if (adapt->adapt_openings > 0) {
    257 		adapt->adapt_openings--;
    258 		return (1);
    259 	}
    260 	return (0);
    261 }
    262 
    263 /*
    264  * scsipi_grow_resources:
    265  *
    266  *	Attempt to grow resources for a channel.  If this succeeds,
    267  *	we allocate one for our caller.
    268  *
    269  *	NOTE: Must be called at splbio().
    270  */
    271 static __inline int
    272 scsipi_grow_resources(struct scsipi_channel *chan)
    273 {
    274 
    275 	if (chan->chan_flags & SCSIPI_CHAN_CANGROW) {
    276 		if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
    277 			scsipi_adapter_request(chan,
    278 			    ADAPTER_REQ_GROW_RESOURCES, NULL);
    279 			return (scsipi_get_resource(chan));
    280 		}
    281 		/*
    282 		 * ask the channel thread to do it. It'll have to thaw the
    283 		 * queue
    284 		 */
    285 		scsipi_channel_freeze(chan, 1);
    286 		chan->chan_tflags |= SCSIPI_CHANT_GROWRES;
    287 		wakeup(&chan->chan_complete);
    288 		return (0);
    289 	}
    290 
    291 	return (0);
    292 }
    293 
    294 /*
    295  * scsipi_put_resource:
    296  *
    297  *	Free a single xfer `resource' to the channel.
    298  *
    299  *	NOTE: Must be called at splbio().
    300  */
    301 static void
    302 scsipi_put_resource(struct scsipi_channel *chan)
    303 {
    304 	struct scsipi_adapter *adapt = chan->chan_adapter;
    305 
    306 	if (chan->chan_flags & SCSIPI_CHAN_OPENINGS)
    307 		chan->chan_openings++;
    308 	else
    309 		adapt->adapt_openings++;
    310 }
    311 
    312 /*
    313  * scsipi_get_tag:
    314  *
    315  *	Get a tag ID for the specified xfer.
    316  *
    317  *	NOTE: Must be called at splbio().
    318  */
    319 static void
    320 scsipi_get_tag(struct scsipi_xfer *xs)
    321 {
    322 	struct scsipi_periph *periph = xs->xs_periph;
    323 	int bit, tag;
    324 	u_int word;
    325 
    326 	bit = 0;	/* XXX gcc */
    327 	for (word = 0; word < PERIPH_NTAGWORDS; word++) {
    328 		bit = ffs(periph->periph_freetags[word]);
    329 		if (bit != 0)
    330 			break;
    331 	}
    332 #ifdef DIAGNOSTIC
    333 	if (word == PERIPH_NTAGWORDS) {
    334 		scsipi_printaddr(periph);
    335 		printf("no free tags\n");
    336 		panic("scsipi_get_tag");
    337 	}
    338 #endif
    339 
    340 	bit -= 1;
    341 	periph->periph_freetags[word] &= ~(1 << bit);
    342 	tag = (word << 5) | bit;
    343 
    344 	/* XXX Should eventually disallow this completely. */
    345 	if (tag >= periph->periph_openings) {
    346 		scsipi_printaddr(periph);
    347 		printf("WARNING: tag %d greater than available openings %d\n",
    348 		    tag, periph->periph_openings);
    349 	}
    350 
    351 	xs->xs_tag_id = tag;
    352 }
    353 
    354 /*
    355  * scsipi_put_tag:
    356  *
    357  *	Put the tag ID for the specified xfer back into the pool.
    358  *
    359  *	NOTE: Must be called at splbio().
    360  */
    361 static void
    362 scsipi_put_tag(struct scsipi_xfer *xs)
    363 {
    364 	struct scsipi_periph *periph = xs->xs_periph;
    365 	int word, bit;
    366 
    367 	word = xs->xs_tag_id >> 5;
    368 	bit = xs->xs_tag_id & 0x1f;
    369 
    370 	periph->periph_freetags[word] |= (1 << bit);
    371 }
    372 
    373 /*
    374  * scsipi_get_xs:
    375  *
    376  *	Allocate an xfer descriptor and associate it with the
    377  *	specified peripherial.  If the peripherial has no more
    378  *	available command openings, we either block waiting for
    379  *	one to become available, or fail.
    380  */
    381 struct scsipi_xfer *
    382 scsipi_get_xs(struct scsipi_periph *periph, int flags)
    383 {
    384 	struct scsipi_xfer *xs;
    385 	int s;
    386 
    387 	SC_DEBUG(periph, SCSIPI_DB3, ("scsipi_get_xs\n"));
    388 
    389 	/*
    390 	 * If we're cold, make sure we poll.
    391 	 */
    392 	if (cold)
    393 		flags |= XS_CTL_NOSLEEP | XS_CTL_POLL;
    394 
    395 #ifdef DIAGNOSTIC
    396 	/*
    397 	 * URGENT commands can never be ASYNC.
    398 	 */
    399 	if ((flags & (XS_CTL_URGENT|XS_CTL_ASYNC)) ==
    400 	    (XS_CTL_URGENT|XS_CTL_ASYNC)) {
    401 		scsipi_printaddr(periph);
    402 		printf("URGENT and ASYNC\n");
    403 		panic("scsipi_get_xs");
    404 	}
    405 #endif
    406 
    407 	s = splbio();
    408 	/*
    409 	 * Wait for a command opening to become available.  Rules:
    410 	 *
    411 	 *	- All xfers must wait for an available opening.
    412 	 *	  Exception: URGENT xfers can proceed when
    413 	 *	  active == openings, because we use the opening
    414 	 *	  of the command we're recovering for.
    415 	 *	- if the periph has sense pending, only URGENT & REQSENSE
    416 	 *	  xfers may proceed.
    417 	 *
    418 	 *	- If the periph is recovering, only URGENT xfers may
    419 	 *	  proceed.
    420 	 *
    421 	 *	- If the periph is currently executing a recovery
    422 	 *	  command, URGENT commands must block, because only
    423 	 *	  one recovery command can execute at a time.
    424 	 */
    425 	for (;;) {
    426 		if (flags & XS_CTL_URGENT) {
    427 			if (periph->periph_active > periph->periph_openings)
    428 				goto wait_for_opening;
    429 			if (periph->periph_flags & PERIPH_SENSE) {
    430 				if ((flags & XS_CTL_REQSENSE) == 0)
    431 					goto wait_for_opening;
    432 			} else {
    433 				if ((periph->periph_flags &
    434 				    PERIPH_RECOVERY_ACTIVE) != 0)
    435 					goto wait_for_opening;
    436 				periph->periph_flags |= PERIPH_RECOVERY_ACTIVE;
    437 			}
    438 			break;
    439 		}
    440 		if (periph->periph_active >= periph->periph_openings ||
    441 		    (periph->periph_flags & PERIPH_RECOVERING) != 0)
    442 			goto wait_for_opening;
    443 		periph->periph_active++;
    444 		break;
    445 
    446  wait_for_opening:
    447 		if (flags & XS_CTL_NOSLEEP) {
    448 			splx(s);
    449 			return (NULL);
    450 		}
    451 		SC_DEBUG(periph, SCSIPI_DB3, ("sleeping\n"));
    452 		periph->periph_flags |= PERIPH_WAITING;
    453 		(void) tsleep(periph, PRIBIO, "getxs", 0);
    454 	}
    455 	SC_DEBUG(periph, SCSIPI_DB3, ("calling pool_get\n"));
    456 	xs = pool_get(&scsipi_xfer_pool,
    457 	    ((flags & XS_CTL_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
    458 	if (xs == NULL) {
    459 		if (flags & XS_CTL_URGENT) {
    460 			if ((flags & XS_CTL_REQSENSE) == 0)
    461 				periph->periph_flags &= ~PERIPH_RECOVERY_ACTIVE;
    462 		} else
    463 			periph->periph_active--;
    464 		scsipi_printaddr(periph);
    465 		printf("unable to allocate %sscsipi_xfer\n",
    466 		    (flags & XS_CTL_URGENT) ? "URGENT " : "");
    467 	}
    468 	splx(s);
    469 
    470 	SC_DEBUG(periph, SCSIPI_DB3, ("returning\n"));
    471 
    472 	if (xs != NULL) {
    473 		memset(xs, 0, sizeof(*xs));
    474 		callout_init(&xs->xs_callout);
    475 		xs->xs_periph = periph;
    476 		xs->xs_control = flags;
    477 		xs->xs_status = 0;
    478 		s = splbio();
    479 		TAILQ_INSERT_TAIL(&periph->periph_xferq, xs, device_q);
    480 		splx(s);
    481 	}
    482 	return (xs);
    483 }
    484 
    485 /*
    486  * scsipi_put_xs:
    487  *
    488  *	Release an xfer descriptor, decreasing the outstanding command
    489  *	count for the peripherial.  If there is a thread waiting for
    490  *	an opening, wake it up.  If not, kick any queued I/O the
    491  *	peripherial may have.
    492  *
    493  *	NOTE: Must be called at splbio().
    494  */
    495 void
    496 scsipi_put_xs(struct scsipi_xfer *xs)
    497 {
    498 	struct scsipi_periph *periph = xs->xs_periph;
    499 	int flags = xs->xs_control;
    500 
    501 	SC_DEBUG(periph, SCSIPI_DB3, ("scsipi_free_xs\n"));
    502 
    503 	TAILQ_REMOVE(&periph->periph_xferq, xs, device_q);
    504 	pool_put(&scsipi_xfer_pool, xs);
    505 
    506 #ifdef DIAGNOSTIC
    507 	if ((periph->periph_flags & PERIPH_RECOVERY_ACTIVE) != 0 &&
    508 	    periph->periph_active == 0) {
    509 		scsipi_printaddr(periph);
    510 		printf("recovery without a command to recovery for\n");
    511 		panic("scsipi_put_xs");
    512 	}
    513 #endif
    514 
    515 	if (flags & XS_CTL_URGENT) {
    516 		if ((flags & XS_CTL_REQSENSE) == 0)
    517 			periph->periph_flags &= ~PERIPH_RECOVERY_ACTIVE;
    518 	} else
    519 		periph->periph_active--;
    520 	if (periph->periph_active == 0 &&
    521 	    (periph->periph_flags & PERIPH_WAITDRAIN) != 0) {
    522 		periph->periph_flags &= ~PERIPH_WAITDRAIN;
    523 		wakeup(&periph->periph_active);
    524 	}
    525 
    526 	if (periph->periph_flags & PERIPH_WAITING) {
    527 		periph->periph_flags &= ~PERIPH_WAITING;
    528 		wakeup(periph);
    529 	} else {
    530 		if (periph->periph_switch->psw_start != NULL &&
    531 		    (periph->periph_dev->dv_flags & DVF_ACTIVE)) {
    532 			SC_DEBUG(periph, SCSIPI_DB2,
    533 			    ("calling private start()\n"));
    534 			(*periph->periph_switch->psw_start)(periph);
    535 		}
    536 	}
    537 }
    538 
    539 /*
    540  * scsipi_channel_freeze:
    541  *
    542  *	Freeze a channel's xfer queue.
    543  */
    544 void
    545 scsipi_channel_freeze(struct scsipi_channel *chan, int count)
    546 {
    547 	int s;
    548 
    549 	s = splbio();
    550 	chan->chan_qfreeze += count;
    551 	splx(s);
    552 }
    553 
    554 /*
    555  * scsipi_channel_thaw:
    556  *
    557  *	Thaw a channel's xfer queue.
    558  */
    559 void
    560 scsipi_channel_thaw(struct scsipi_channel *chan, int count)
    561 {
    562 	int s;
    563 
    564 	s = splbio();
    565 	chan->chan_qfreeze -= count;
    566 	/*
    567 	 * Don't let the freeze count go negative.
    568 	 *
    569 	 * Presumably the adapter driver could keep track of this,
    570 	 * but it might just be easier to do this here so as to allow
    571 	 * multiple callers, including those outside the adapter driver.
    572 	 */
    573 	if (chan->chan_qfreeze < 0) {
    574 		chan->chan_qfreeze = 0;
    575 	}
    576 	splx(s);
    577 	/*
    578 	 * Kick the channel's queue here.  Note, we may be running in
    579 	 * interrupt context (softclock or HBA's interrupt), so the adapter
    580 	 * driver had better not sleep.
    581 	 */
    582 	if (chan->chan_qfreeze == 0)
    583 		scsipi_run_queue(chan);
    584 }
    585 
    586 /*
    587  * scsipi_channel_timed_thaw:
    588  *
    589  *	Thaw a channel after some time has expired. This will also
    590  * 	run the channel's queue if the freeze count has reached 0.
    591  */
    592 void
    593 scsipi_channel_timed_thaw(void *arg)
    594 {
    595 	struct scsipi_channel *chan = arg;
    596 
    597 	scsipi_channel_thaw(chan, 1);
    598 }
    599 
    600 /*
    601  * scsipi_periph_freeze:
    602  *
    603  *	Freeze a device's xfer queue.
    604  */
    605 void
    606 scsipi_periph_freeze(struct scsipi_periph *periph, int count)
    607 {
    608 	int s;
    609 
    610 	s = splbio();
    611 	periph->periph_qfreeze += count;
    612 	splx(s);
    613 }
    614 
    615 /*
    616  * scsipi_periph_thaw:
    617  *
    618  *	Thaw a device's xfer queue.
    619  */
    620 void
    621 scsipi_periph_thaw(struct scsipi_periph *periph, int count)
    622 {
    623 	int s;
    624 
    625 	s = splbio();
    626 	periph->periph_qfreeze -= count;
    627 #ifdef DIAGNOSTIC
    628 	if (periph->periph_qfreeze < 0) {
    629 		static const char pc[] = "periph freeze count < 0";
    630 		scsipi_printaddr(periph);
    631 		printf("%s\n", pc);
    632 		panic(pc);
    633 	}
    634 #endif
    635 	if (periph->periph_qfreeze == 0 &&
    636 	    (periph->periph_flags & PERIPH_WAITING) != 0)
    637 		wakeup(periph);
    638 	splx(s);
    639 }
    640 
    641 /*
    642  * scsipi_periph_timed_thaw:
    643  *
    644  *	Thaw a device after some time has expired.
    645  */
    646 void
    647 scsipi_periph_timed_thaw(void *arg)
    648 {
    649 	int s;
    650 	struct scsipi_periph *periph = arg;
    651 
    652 	callout_stop(&periph->periph_callout);
    653 
    654 	s = splbio();
    655 	scsipi_periph_thaw(periph, 1);
    656 	if ((periph->periph_channel->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
    657 		/*
    658 		 * Kick the channel's queue here.  Note, we're running in
    659 		 * interrupt context (softclock), so the adapter driver
    660 		 * had better not sleep.
    661 		 */
    662 		scsipi_run_queue(periph->periph_channel);
    663 	} else {
    664 		/*
    665 		 * Tell the completion thread to kick the channel's queue here.
    666 		 */
    667 		periph->periph_channel->chan_tflags |= SCSIPI_CHANT_KICK;
    668 		wakeup(&periph->periph_channel->chan_complete);
    669 	}
    670 	splx(s);
    671 }
    672 
    673 /*
    674  * scsipi_wait_drain:
    675  *
    676  *	Wait for a periph's pending xfers to drain.
    677  */
    678 void
    679 scsipi_wait_drain(struct scsipi_periph *periph)
    680 {
    681 	int s;
    682 
    683 	s = splbio();
    684 	while (periph->periph_active != 0) {
    685 		periph->periph_flags |= PERIPH_WAITDRAIN;
    686 		(void) tsleep(&periph->periph_active, PRIBIO, "sxdrn", 0);
    687 	}
    688 	splx(s);
    689 }
    690 
    691 /*
    692  * scsipi_kill_pending:
    693  *
    694  *	Kill off all pending xfers for a periph.
    695  *
    696  *	NOTE: Must be called at splbio().
    697  */
    698 void
    699 scsipi_kill_pending(struct scsipi_periph *periph)
    700 {
    701 
    702 	(*periph->periph_channel->chan_bustype->bustype_kill_pending)(periph);
    703 	scsipi_wait_drain(periph);
    704 }
    705 
    706 /*
    707  * scsipi_print_cdb:
    708  * prints a command descriptor block (for debug purpose, error messages,
    709  * SCSIPI_VERBOSE, ...)
    710  */
    711 void
    712 scsipi_print_cdb(struct scsipi_generic *cmd)
    713 {
    714 	int i, j;
    715 
    716  	printf("0x%02x", cmd->opcode);
    717 
    718  	switch (CDB_GROUPID(cmd->opcode)) {
    719  	case CDB_GROUPID_0:
    720  		j = CDB_GROUP0;
    721  		break;
    722  	case CDB_GROUPID_1:
    723  		j = CDB_GROUP1;
    724  		break;
    725  	case CDB_GROUPID_2:
    726  		j = CDB_GROUP2;
    727  		break;
    728  	case CDB_GROUPID_3:
    729  		j = CDB_GROUP3;
    730  		break;
    731  	case CDB_GROUPID_4:
    732  		j = CDB_GROUP4;
    733  		break;
    734  	case CDB_GROUPID_5:
    735  		j = CDB_GROUP5;
    736  		break;
    737  	case CDB_GROUPID_6:
    738  		j = CDB_GROUP6;
    739  		break;
    740  	case CDB_GROUPID_7:
    741  		j = CDB_GROUP7;
    742  		break;
    743  	default:
    744  		j = 0;
    745  	}
    746  	if (j == 0)
    747  		j = sizeof (cmd->bytes);
    748  	for (i = 0; i < j-1; i++) /* already done the opcode */
    749  		printf(" %02x", cmd->bytes[i]);
    750 }
    751 
    752 /*
    753  * scsipi_interpret_sense:
    754  *
    755  *	Look at the returned sense and act on the error, determining
    756  *	the unix error number to pass back.  (0 = report no error)
    757  *
    758  *	NOTE: If we return ERESTART, we are expected to haved
    759  *	thawed the device!
    760  *
    761  *	THIS IS THE DEFAULT ERROR HANDLER FOR SCSI DEVICES.
    762  */
    763 int
    764 scsipi_interpret_sense(struct scsipi_xfer *xs)
    765 {
    766 	struct scsipi_sense_data *sense;
    767 	struct scsipi_periph *periph = xs->xs_periph;
    768 	u_int8_t key;
    769 	int error;
    770 #ifndef	SCSIVERBOSE
    771 	u_int32_t info;
    772 	static char *error_mes[] = {
    773 		"soft error (corrected)",
    774 		"not ready", "medium error",
    775 		"non-media hardware failure", "illegal request",
    776 		"unit attention", "readonly device",
    777 		"no data found", "vendor unique",
    778 		"copy aborted", "command aborted",
    779 		"search returned equal", "volume overflow",
    780 		"verify miscompare", "unknown error key"
    781 	};
    782 #endif
    783 
    784 	sense = &xs->sense.scsi_sense;
    785 #ifdef SCSIPI_DEBUG
    786 	if (periph->periph_flags & SCSIPI_DB1) {
    787 		int count;
    788 		scsipi_printaddr(periph);
    789 		printf(" sense debug information:\n");
    790 		printf("\tcode 0x%x valid 0x%x\n",
    791 			sense->error_code & SSD_ERRCODE,
    792 			sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
    793 		printf("\tseg 0x%x key 0x%x ili 0x%x eom 0x%x fmark 0x%x\n",
    794 			sense->segment,
    795 			sense->flags & SSD_KEY,
    796 			sense->flags & SSD_ILI ? 1 : 0,
    797 			sense->flags & SSD_EOM ? 1 : 0,
    798 			sense->flags & SSD_FILEMARK ? 1 : 0);
    799 		printf("\ninfo: 0x%x 0x%x 0x%x 0x%x followed by %d "
    800 			"extra bytes\n",
    801 			sense->info[0],
    802 			sense->info[1],
    803 			sense->info[2],
    804 			sense->info[3],
    805 			sense->extra_len);
    806 		printf("\textra: ");
    807 		for (count = 0; count < ADD_BYTES_LIM(sense); count++)
    808 			printf("0x%x ", sense->cmd_spec_info[count]);
    809 		printf("\n");
    810 	}
    811 #endif
    812 
    813 	/*
    814 	 * If the periph has it's own error handler, call it first.
    815 	 * If it returns a legit error value, return that, otherwise
    816 	 * it wants us to continue with normal error processing.
    817 	 */
    818 	if (periph->periph_switch->psw_error != NULL) {
    819 		SC_DEBUG(periph, SCSIPI_DB2,
    820 		    ("calling private err_handler()\n"));
    821 		error = (*periph->periph_switch->psw_error)(xs);
    822 		if (error != EJUSTRETURN)
    823 			return (error);
    824 	}
    825 	/* otherwise use the default */
    826 	switch (sense->error_code & SSD_ERRCODE) {
    827 
    828 		/*
    829 		 * Old SCSI-1 and SASI devices respond with
    830 		 * codes other than 70.
    831 		 */
    832 	case 0x00:		/* no error (command completed OK) */
    833 		return (0);
    834 	case 0x04:		/* drive not ready after it was selected */
    835 		if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
    836 			periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
    837 		if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
    838 			return (0);
    839 		/* XXX - display some sort of error here? */
    840 		return (EIO);
    841 	case 0x20:		/* invalid command */
    842 		if ((xs->xs_control &
    843 		     XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
    844 			return (0);
    845 		return (EINVAL);
    846 	case 0x25:		/* invalid LUN (Adaptec ACB-4000) */
    847 		return (EACCES);
    848 
    849 		/*
    850 		 * If it's code 70, use the extended stuff and
    851 		 * interpret the key
    852 		 */
    853 	case 0x71:		/* delayed error */
    854 		scsipi_printaddr(periph);
    855 		key = sense->flags & SSD_KEY;
    856 		printf(" DEFERRED ERROR, key = 0x%x\n", key);
    857 		/* FALLTHROUGH */
    858 	case 0x70:
    859 #ifndef	SCSIVERBOSE
    860 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0)
    861 			info = _4btol(sense->info);
    862 		else
    863 			info = 0;
    864 #endif
    865 		key = sense->flags & SSD_KEY;
    866 
    867 		switch (key) {
    868 		case SKEY_NO_SENSE:
    869 		case SKEY_RECOVERED_ERROR:
    870 			if (xs->resid == xs->datalen && xs->datalen) {
    871 				/*
    872 				 * Why is this here?
    873 				 */
    874 				xs->resid = 0;	/* not short read */
    875 			}
    876 		case SKEY_EQUAL:
    877 			error = 0;
    878 			break;
    879 		case SKEY_NOT_READY:
    880 			if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
    881 				periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
    882 			if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
    883 				return (0);
    884 			if (sense->add_sense_code == 0x3A) {
    885 				error = ENODEV; /* Medium not present */
    886 				if (xs->xs_control & XS_CTL_SILENT_NODEV)
    887 					return (error);
    888 			} else
    889 				error = EIO;
    890 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    891 				return (error);
    892 			break;
    893 		case SKEY_ILLEGAL_REQUEST:
    894 			if ((xs->xs_control &
    895 			     XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
    896 				return (0);
    897 			/*
    898 			 * Handle the case where a device reports
    899 			 * Logical Unit Not Supported during discovery.
    900 			 */
    901 			if ((xs->xs_control & XS_CTL_DISCOVERY) != 0 &&
    902 			    sense->add_sense_code == 0x25 &&
    903 			    sense->add_sense_code_qual == 0x00)
    904 				return (EINVAL);
    905 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    906 				return (EIO);
    907 			error = EINVAL;
    908 			break;
    909 		case SKEY_UNIT_ATTENTION:
    910 			if (sense->add_sense_code == 0x29 &&
    911 			    sense->add_sense_code_qual == 0x00) {
    912 				/* device or bus reset */
    913 				return (ERESTART);
    914 			}
    915 			if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
    916 				periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
    917 			if ((xs->xs_control &
    918 			     XS_CTL_IGNORE_MEDIA_CHANGE) != 0 ||
    919 				/* XXX Should reupload any transient state. */
    920 				(periph->periph_flags &
    921 				 PERIPH_REMOVABLE) == 0) {
    922 				return (ERESTART);
    923 			}
    924 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    925 				return (EIO);
    926 			error = EIO;
    927 			break;
    928 		case SKEY_WRITE_PROTECT:
    929 			error = EROFS;
    930 			break;
    931 		case SKEY_BLANK_CHECK:
    932 			error = 0;
    933 			break;
    934 		case SKEY_ABORTED_COMMAND:
    935 			if (xs->xs_retries != 0) {
    936 				xs->xs_retries--;
    937 				error = ERESTART;
    938 			} else
    939 				error = EIO;
    940 			break;
    941 		case SKEY_VOLUME_OVERFLOW:
    942 			error = ENOSPC;
    943 			break;
    944 		default:
    945 			error = EIO;
    946 			break;
    947 		}
    948 
    949 #ifdef SCSIVERBOSE
    950 		if (key && (xs->xs_control & XS_CTL_SILENT) == 0)
    951 			scsipi_print_sense(xs, 0);
    952 #else
    953 		if (key) {
    954 			scsipi_printaddr(periph);
    955 			printf("%s", error_mes[key - 1]);
    956 			if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    957 				switch (key) {
    958 				case SKEY_NOT_READY:
    959 				case SKEY_ILLEGAL_REQUEST:
    960 				case SKEY_UNIT_ATTENTION:
    961 				case SKEY_WRITE_PROTECT:
    962 					break;
    963 				case SKEY_BLANK_CHECK:
    964 					printf(", requested size: %d (decimal)",
    965 					    info);
    966 					break;
    967 				case SKEY_ABORTED_COMMAND:
    968 					if (xs->xs_retries)
    969 						printf(", retrying");
    970 					printf(", cmd 0x%x, info 0x%x",
    971 					    xs->cmd->opcode, info);
    972 					break;
    973 				default:
    974 					printf(", info = %d (decimal)", info);
    975 				}
    976 			}
    977 			if (sense->extra_len != 0) {
    978 				int n;
    979 				printf(", data =");
    980 				for (n = 0; n < sense->extra_len; n++)
    981 					printf(" %02x",
    982 					    sense->cmd_spec_info[n]);
    983 			}
    984 			printf("\n");
    985 		}
    986 #endif
    987 		return (error);
    988 
    989 	/*
    990 	 * Some other code, just report it
    991 	 */
    992 	default:
    993 #if    defined(SCSIDEBUG) || defined(DEBUG)
    994 	{
    995 		static char *uc = "undecodable sense error";
    996 		int i;
    997 		u_int8_t *cptr = (u_int8_t *) sense;
    998 		scsipi_printaddr(periph);
    999 		if (xs->cmd == &xs->cmdstore) {
   1000 			printf("%s for opcode 0x%x, data=",
   1001 			    uc, xs->cmdstore.opcode);
   1002 		} else {
   1003 			printf("%s, data=", uc);
   1004 		}
   1005 		for (i = 0; i < sizeof (sense); i++)
   1006 			printf(" 0x%02x", *(cptr++) & 0xff);
   1007 		printf("\n");
   1008 	}
   1009 #else
   1010 		scsipi_printaddr(periph);
   1011 		printf("Sense Error Code 0x%x",
   1012 			sense->error_code & SSD_ERRCODE);
   1013 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
   1014 			struct scsipi_sense_data_unextended *usense =
   1015 			    (struct scsipi_sense_data_unextended *)sense;
   1016 			printf(" at block no. %d (decimal)",
   1017 			    _3btol(usense->block));
   1018 		}
   1019 		printf("\n");
   1020 #endif
   1021 		return (EIO);
   1022 	}
   1023 }
   1024 
   1025 /*
   1026  * scsipi_size:
   1027  *
   1028  *	Find out from the device what its capacity is.
   1029  */
   1030 u_int64_t
   1031 scsipi_size(struct scsipi_periph *periph, int flags)
   1032 {
   1033 	struct scsipi_read_cap_data rdcap;
   1034 	struct scsipi_read_capacity scsipi_cmd;
   1035 
   1036 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1037 	scsipi_cmd.opcode = READ_CAPACITY;
   1038 
   1039 	/*
   1040 	 * If the command works, interpret the result as a 4 byte
   1041 	 * number of blocks
   1042 	 */
   1043 	if (scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
   1044 	    sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
   1045 	    SCSIPIRETRIES, 20000, NULL,
   1046 	    flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK | XS_CTL_SILENT) != 0)
   1047 		return (0);
   1048 
   1049 	return (_4btol(rdcap.addr) + 1);
   1050 }
   1051 
   1052 /*
   1053  * scsipi_test_unit_ready:
   1054  *
   1055  *	Issue a `test unit ready' request.
   1056  */
   1057 int
   1058 scsipi_test_unit_ready(struct scsipi_periph *periph, int flags)
   1059 {
   1060 	int retries;
   1061 	struct scsipi_test_unit_ready scsipi_cmd;
   1062 
   1063 	/* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
   1064 	if (periph->periph_quirks & PQUIRK_NOTUR)
   1065 		return (0);
   1066 
   1067 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1068 	scsipi_cmd.opcode = TEST_UNIT_READY;
   1069 
   1070 	if (flags & XS_CTL_DISCOVERY)
   1071 		retries = 0;
   1072 	else
   1073 		retries = SCSIPIRETRIES;
   1074 
   1075 	return (scsipi_command(periph,
   1076 	    (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
   1077 	    0, 0, retries, 10000, NULL, flags));
   1078 }
   1079 
   1080 /*
   1081  * scsipi_inquire:
   1082  *
   1083  *	Ask the device about itself.
   1084  */
   1085 int
   1086 scsipi_inquire(struct scsipi_periph *periph, struct scsipi_inquiry_data *inqbuf,
   1087     int flags)
   1088 {
   1089 	int retries;
   1090 	struct scsipi_inquiry scsipi_cmd;
   1091 	int error;
   1092 
   1093 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1094 	scsipi_cmd.opcode = INQUIRY;
   1095 
   1096 	if (flags & XS_CTL_DISCOVERY)
   1097 		retries = 0;
   1098 	else
   1099 		retries = SCSIPIRETRIES;
   1100 
   1101 	/*
   1102 	 * If we request more data than the device can provide, it SHOULD just
   1103 	 * return a short reponse.  However, some devices error with an
   1104 	 * ILLEGAL REQUEST sense code, and yet others have even more special
   1105 	 * failture modes (such as the GL641USB flash adapter, which goes loony
   1106 	 * and sends corrupted CRCs).  To work around this, and to bring our
   1107 	 * behavior more in line with other OSes, we do a shorter inquiry,
   1108 	 * covering all the SCSI-2 information, first, and then request more
   1109 	 * data iff the "additional length" field indicates there is more.
   1110 	 * - mycroft, 2003/10/16
   1111 	 */
   1112 	scsipi_cmd.length = SCSIPI_INQUIRY_LENGTH_SCSI2;
   1113 	error = scsipi_command(periph,
   1114 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
   1115 	    (u_char *) inqbuf, SCSIPI_INQUIRY_LENGTH_SCSI2,
   1116 	    retries, 10000, NULL, XS_CTL_DATA_IN | flags);
   1117 	if (!error && inqbuf->additional_length > SCSIPI_INQUIRY_LENGTH_SCSI2 - 4) {
   1118 		scsipi_cmd.length = SCSIPI_INQUIRY_LENGTH_SCSI3;
   1119 		error = scsipi_command(periph,
   1120 		    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
   1121 		    (u_char *) inqbuf, SCSIPI_INQUIRY_LENGTH_SCSI3,
   1122 		    retries, 10000, NULL, XS_CTL_DATA_IN | flags);
   1123 	}
   1124 
   1125 #ifdef SCSI_OLD_NOINQUIRY
   1126 	/*
   1127 	 * Kludge for the Adaptec ACB-4000 SCSI->MFM translator.
   1128 	 * This board doesn't support the INQUIRY command at all.
   1129 	 */
   1130 	if (error == EINVAL || error == EACCES) {
   1131 		/*
   1132 		 * Conjure up an INQUIRY response.
   1133 		 */
   1134 		inqbuf->device = (error == EINVAL ?
   1135 			 SID_QUAL_LU_PRESENT :
   1136 			 SID_QUAL_LU_NOTPRESENT) | T_DIRECT;
   1137 		inqbuf->dev_qual2 = 0;
   1138 		inqbuf->version = 0;
   1139 		inqbuf->response_format = SID_FORMAT_SCSI1;
   1140 		inqbuf->additional_length = SCSIPI_INQUIRY_LENGTH_SCSI2 - 4;
   1141 		inqbuf->flags1 = inqbuf->flags2 = inqbuf->flags3 = 0;
   1142 		memcpy(inqbuf->vendor, "ADAPTEC ACB-4000            ", 28);
   1143 		error = 0;
   1144 	}
   1145 
   1146 	/*
   1147 	 * Kludge for the Emulex MT-02 SCSI->QIC translator.
   1148 	 * This board gives an empty response to an INQUIRY command.
   1149 	 */
   1150 	else if (error == 0 &&
   1151 		 inqbuf->device == (SID_QUAL_LU_PRESENT | T_DIRECT) &&
   1152 		 inqbuf->dev_qual2 == 0 &&
   1153 		 inqbuf->version == 0 &&
   1154 		 inqbuf->response_format == SID_FORMAT_SCSI1) {
   1155 		/*
   1156 		 * Fill out the INQUIRY response.
   1157 		 */
   1158 		inqbuf->device = (SID_QUAL_LU_PRESENT | T_SEQUENTIAL);
   1159 		inqbuf->dev_qual2 = SID_REMOVABLE;
   1160 		inqbuf->additional_length = SCSIPI_INQUIRY_LENGTH_SCSI2 - 4;
   1161 		inqbuf->flags1 = inqbuf->flags2 = inqbuf->flags3 = 0;
   1162 		memcpy(inqbuf->vendor, "EMULEX  MT-02 QIC           ", 28);
   1163 	}
   1164 #endif /* SCSI_OLD_NOINQUIRY */
   1165 
   1166 	return error;
   1167 }
   1168 
   1169 /*
   1170  * scsipi_prevent:
   1171  *
   1172  *	Prevent or allow the user to remove the media
   1173  */
   1174 int
   1175 scsipi_prevent(struct scsipi_periph *periph, int type, int flags)
   1176 {
   1177 	struct scsipi_prevent scsipi_cmd;
   1178 
   1179 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1180 	scsipi_cmd.opcode = PREVENT_ALLOW;
   1181 	scsipi_cmd.how = type;
   1182 
   1183 	return (scsipi_command(periph,
   1184 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
   1185 	    0, 0, SCSIPIRETRIES, 5000, NULL, flags));
   1186 }
   1187 
   1188 /*
   1189  * scsipi_start:
   1190  *
   1191  *	Send a START UNIT.
   1192  */
   1193 int
   1194 scsipi_start(struct scsipi_periph *periph, int type, int flags)
   1195 {
   1196 	struct scsipi_start_stop scsipi_cmd;
   1197 
   1198 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1199 	scsipi_cmd.opcode = START_STOP;
   1200 	scsipi_cmd.byte2 = 0x00;
   1201 	scsipi_cmd.how = type;
   1202 
   1203 	return (scsipi_command(periph,
   1204 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
   1205 	    0, 0, SCSIPIRETRIES, (type & SSS_START) ? 60000 : 10000,
   1206 	    NULL, flags));
   1207 }
   1208 
   1209 /*
   1210  * scsipi_mode_sense, scsipi_mode_sense_big:
   1211  *	get a sense page from a device
   1212  */
   1213 
   1214 int
   1215 scsipi_mode_sense(struct scsipi_periph *periph, int byte2, int page,
   1216     struct scsipi_mode_header *data, int len, int flags, int retries,
   1217     int timeout)
   1218 {
   1219 	struct scsipi_mode_sense scsipi_cmd;
   1220 	int error;
   1221 
   1222 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1223 	scsipi_cmd.opcode = MODE_SENSE;
   1224 	scsipi_cmd.byte2 = byte2;
   1225 	scsipi_cmd.page = page;
   1226 	scsipi_cmd.length = len & 0xff;
   1227 	error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
   1228 	    sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
   1229 	    flags | XS_CTL_DATA_IN);
   1230 	SC_DEBUG(periph, SCSIPI_DB2,
   1231 	    ("scsipi_mode_sense: error=%d\n", error));
   1232 	return (error);
   1233 }
   1234 
   1235 int
   1236 scsipi_mode_sense_big(struct scsipi_periph *periph, int byte2, int page,
   1237     struct scsipi_mode_header_big *data, int len, int flags, int retries,
   1238     int timeout)
   1239 {
   1240 	struct scsipi_mode_sense_big scsipi_cmd;
   1241 	int error;
   1242 
   1243 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1244 	scsipi_cmd.opcode = MODE_SENSE_BIG;
   1245 	scsipi_cmd.byte2 = byte2;
   1246 	scsipi_cmd.page = page;
   1247 	_lto2b(len, scsipi_cmd.length);
   1248 	error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
   1249 	    sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
   1250 	    flags | XS_CTL_DATA_IN);
   1251 	SC_DEBUG(periph, SCSIPI_DB2,
   1252 	    ("scsipi_mode_sense_big: error=%d\n", error));
   1253 	return (error);
   1254 }
   1255 
   1256 int
   1257 scsipi_mode_select(struct scsipi_periph *periph, int byte2,
   1258     struct scsipi_mode_header *data, int len, int flags, int retries,
   1259     int timeout)
   1260 {
   1261 	struct scsipi_mode_select scsipi_cmd;
   1262 	int error;
   1263 
   1264 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1265 	scsipi_cmd.opcode = MODE_SELECT;
   1266 	scsipi_cmd.byte2 = byte2;
   1267 	scsipi_cmd.length = len & 0xff;
   1268 	error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
   1269 	    sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
   1270 	    flags | XS_CTL_DATA_OUT);
   1271 	SC_DEBUG(periph, SCSIPI_DB2,
   1272 	    ("scsipi_mode_select: error=%d\n", error));
   1273 	return (error);
   1274 }
   1275 
   1276 int
   1277 scsipi_mode_select_big(struct scsipi_periph *periph, int byte2,
   1278     struct scsipi_mode_header_big *data, int len, int flags, int retries,
   1279     int timeout)
   1280 {
   1281 	struct scsipi_mode_select_big scsipi_cmd;
   1282 	int error;
   1283 
   1284 	memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
   1285 	scsipi_cmd.opcode = MODE_SELECT_BIG;
   1286 	scsipi_cmd.byte2 = byte2;
   1287 	_lto2b(len, scsipi_cmd.length);
   1288 	error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
   1289 	    sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
   1290 	    flags | XS_CTL_DATA_OUT);
   1291 	SC_DEBUG(periph, SCSIPI_DB2,
   1292 	    ("scsipi_mode_select: error=%d\n", error));
   1293 	return (error);
   1294 }
   1295 
   1296 /*
   1297  * scsipi_done:
   1298  *
   1299  *	This routine is called by an adapter's interrupt handler when
   1300  *	an xfer is completed.
   1301  */
   1302 void
   1303 scsipi_done(struct scsipi_xfer *xs)
   1304 {
   1305 	struct scsipi_periph *periph = xs->xs_periph;
   1306 	struct scsipi_channel *chan = periph->periph_channel;
   1307 	int s, freezecnt;
   1308 
   1309 	SC_DEBUG(periph, SCSIPI_DB2, ("scsipi_done\n"));
   1310 #ifdef SCSIPI_DEBUG
   1311 	if (periph->periph_dbflags & SCSIPI_DB1)
   1312 		show_scsipi_cmd(xs);
   1313 #endif
   1314 
   1315 	s = splbio();
   1316 	/*
   1317 	 * The resource this command was using is now free.
   1318 	 */
   1319 	scsipi_put_resource(chan);
   1320 	xs->xs_periph->periph_sent--;
   1321 
   1322 	/*
   1323 	 * If the command was tagged, free the tag.
   1324 	 */
   1325 	if (XS_CTL_TAGTYPE(xs) != 0)
   1326 		scsipi_put_tag(xs);
   1327 	else
   1328 		periph->periph_flags &= ~PERIPH_UNTAG;
   1329 
   1330 	/* Mark the command as `done'. */
   1331 	xs->xs_status |= XS_STS_DONE;
   1332 
   1333 #ifdef DIAGNOSTIC
   1334 	if ((xs->xs_control & (XS_CTL_ASYNC|XS_CTL_POLL)) ==
   1335 	    (XS_CTL_ASYNC|XS_CTL_POLL))
   1336 		panic("scsipi_done: ASYNC and POLL");
   1337 #endif
   1338 
   1339 	/*
   1340 	 * If the xfer had an error of any sort, freeze the
   1341 	 * periph's queue.  Freeze it again if we were requested
   1342 	 * to do so in the xfer.
   1343 	 */
   1344 	freezecnt = 0;
   1345 	if (xs->error != XS_NOERROR)
   1346 		freezecnt++;
   1347 	if (xs->xs_control & XS_CTL_FREEZE_PERIPH)
   1348 		freezecnt++;
   1349 	if (freezecnt != 0)
   1350 		scsipi_periph_freeze(periph, freezecnt);
   1351 
   1352 	/*
   1353 	 * record the xfer with a pending sense, in case a SCSI reset is
   1354 	 * received before the thread is waked up.
   1355 	 */
   1356 	if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
   1357 		periph->periph_flags |= PERIPH_SENSE;
   1358 		periph->periph_xscheck = xs;
   1359 	}
   1360 
   1361 	/*
   1362 	 * If this was an xfer that was not to complete asynchronously,
   1363 	 * let the requesting thread perform error checking/handling
   1364 	 * in its context.
   1365 	 */
   1366 	if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
   1367 		splx(s);
   1368 		/*
   1369 		 * If it's a polling job, just return, to unwind the
   1370 		 * call graph.  We don't need to restart the queue,
   1371 		 * because pollings jobs are treated specially, and
   1372 		 * are really only used during crash dumps anyway
   1373 		 * (XXX or during boot-time autconfiguration of
   1374 		 * ATAPI devices).
   1375 		 */
   1376 		if (xs->xs_control & XS_CTL_POLL)
   1377 			return;
   1378 		wakeup(xs);
   1379 		goto out;
   1380 	}
   1381 
   1382 	/*
   1383 	 * Catch the extremely common case of I/O completing
   1384 	 * without error; no use in taking a context switch
   1385 	 * if we can handle it in interrupt context.
   1386 	 */
   1387 	if (xs->error == XS_NOERROR) {
   1388 		splx(s);
   1389 		(void) scsipi_complete(xs);
   1390 		goto out;
   1391 	}
   1392 
   1393 	/*
   1394 	 * There is an error on this xfer.  Put it on the channel's
   1395 	 * completion queue, and wake up the completion thread.
   1396 	 */
   1397 	TAILQ_INSERT_TAIL(&chan->chan_complete, xs, channel_q);
   1398 	splx(s);
   1399 	wakeup(&chan->chan_complete);
   1400 
   1401  out:
   1402 	/*
   1403 	 * If there are more xfers on the channel's queue, attempt to
   1404 	 * run them.
   1405 	 */
   1406 	scsipi_run_queue(chan);
   1407 }
   1408 
   1409 /*
   1410  * scsipi_complete:
   1411  *
   1412  *	Completion of a scsipi_xfer.  This is the guts of scsipi_done().
   1413  *
   1414  *	NOTE: This routine MUST be called with valid thread context
   1415  *	except for the case where the following two conditions are
   1416  *	true:
   1417  *
   1418  *		xs->error == XS_NOERROR
   1419  *		XS_CTL_ASYNC is set in xs->xs_control
   1420  *
   1421  *	The semantics of this routine can be tricky, so here is an
   1422  *	explanation:
   1423  *
   1424  *		0		Xfer completed successfully.
   1425  *
   1426  *		ERESTART	Xfer had an error, but was restarted.
   1427  *
   1428  *		anything else	Xfer had an error, return value is Unix
   1429  *				errno.
   1430  *
   1431  *	If the return value is anything but ERESTART:
   1432  *
   1433  *		- If XS_CTL_ASYNC is set, `xs' has been freed back to
   1434  *		  the pool.
   1435  *		- If there is a buf associated with the xfer,
   1436  *		  it has been biodone()'d.
   1437  */
   1438 static int
   1439 scsipi_complete(struct scsipi_xfer *xs)
   1440 {
   1441 	struct scsipi_periph *periph = xs->xs_periph;
   1442 	struct scsipi_channel *chan = periph->periph_channel;
   1443 	struct buf *bp;
   1444 	int error, s;
   1445 
   1446 #ifdef DIAGNOSTIC
   1447 	if ((xs->xs_control & XS_CTL_ASYNC) != 0 && xs->bp == NULL)
   1448 		panic("scsipi_complete: XS_CTL_ASYNC but no buf");
   1449 #endif
   1450 	/*
   1451 	 * If command terminated with a CHECK CONDITION, we need to issue a
   1452 	 * REQUEST_SENSE command. Once the REQUEST_SENSE has been processed
   1453 	 * we'll have the real status.
   1454 	 * Must be processed at splbio() to avoid missing a SCSI bus reset
   1455 	 * for this command.
   1456 	 */
   1457 	s = splbio();
   1458 	if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
   1459 		/* request sense for a request sense ? */
   1460 		if (xs->xs_control & XS_CTL_REQSENSE) {
   1461 			scsipi_printaddr(periph);
   1462 			printf("request sense for a request sense ?\n");
   1463 			/* XXX maybe we should reset the device ? */
   1464 			/* we've been frozen because xs->error != XS_NOERROR */
   1465 			scsipi_periph_thaw(periph, 1);
   1466 			splx(s);
   1467 			if (xs->resid < xs->datalen) {
   1468 				printf("we read %d bytes of sense anyway:\n",
   1469 				    xs->datalen - xs->resid);
   1470 #ifdef SCSIVERBOSE
   1471 				scsipi_print_sense_data((void *)xs->data, 0);
   1472 #endif
   1473 			}
   1474 			return EINVAL;
   1475 		}
   1476 		scsipi_request_sense(xs);
   1477 	}
   1478 	splx(s);
   1479 
   1480 	/*
   1481 	 * If it's a user level request, bypass all usual completion
   1482 	 * processing, let the user work it out..
   1483 	 */
   1484 	if ((xs->xs_control & XS_CTL_USERCMD) != 0) {
   1485 		SC_DEBUG(periph, SCSIPI_DB3, ("calling user done()\n"));
   1486 		if (xs->error != XS_NOERROR)
   1487 			scsipi_periph_thaw(periph, 1);
   1488 		scsipi_user_done(xs);
   1489 		SC_DEBUG(periph, SCSIPI_DB3, ("returned from user done()\n "));
   1490 		return 0;
   1491 	}
   1492 
   1493 	switch (xs->error) {
   1494 	case XS_NOERROR:
   1495 		error = 0;
   1496 		break;
   1497 
   1498 	case XS_SENSE:
   1499 	case XS_SHORTSENSE:
   1500 		error = (*chan->chan_bustype->bustype_interpret_sense)(xs);
   1501 		break;
   1502 
   1503 	case XS_RESOURCE_SHORTAGE:
   1504 		/*
   1505 		 * XXX Should freeze channel's queue.
   1506 		 */
   1507 		scsipi_printaddr(periph);
   1508 		printf("adapter resource shortage\n");
   1509 		/* FALLTHROUGH */
   1510 
   1511 	case XS_BUSY:
   1512 		if (xs->error == XS_BUSY && xs->status == SCSI_QUEUE_FULL) {
   1513 			struct scsipi_max_openings mo;
   1514 
   1515 			/*
   1516 			 * We set the openings to active - 1, assuming that
   1517 			 * the command that got us here is the first one that
   1518 			 * can't fit into the device's queue.  If that's not
   1519 			 * the case, I guess we'll find out soon enough.
   1520 			 */
   1521 			mo.mo_target = periph->periph_target;
   1522 			mo.mo_lun = periph->periph_lun;
   1523 			if (periph->periph_active < periph->periph_openings)
   1524 				mo.mo_openings = periph->periph_active - 1;
   1525 			else
   1526 				mo.mo_openings = periph->periph_openings - 1;
   1527 #ifdef DIAGNOSTIC
   1528 			if (mo.mo_openings < 0) {
   1529 				scsipi_printaddr(periph);
   1530 				printf("QUEUE FULL resulted in < 0 openings\n");
   1531 				panic("scsipi_done");
   1532 			}
   1533 #endif
   1534 			if (mo.mo_openings == 0) {
   1535 				scsipi_printaddr(periph);
   1536 				printf("QUEUE FULL resulted in 0 openings\n");
   1537 				mo.mo_openings = 1;
   1538 			}
   1539 			scsipi_async_event(chan, ASYNC_EVENT_MAX_OPENINGS, &mo);
   1540 			error = ERESTART;
   1541 		} else if (xs->xs_retries != 0) {
   1542 			xs->xs_retries--;
   1543 			/*
   1544 			 * Wait one second, and try again.
   1545 			 */
   1546 			if ((xs->xs_control & XS_CTL_POLL) ||
   1547 			    (chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
   1548 				delay(1000000);
   1549 			} else if (!callout_pending(&periph->periph_callout)) {
   1550 				scsipi_periph_freeze(periph, 1);
   1551 				callout_reset(&periph->periph_callout,
   1552 				    hz, scsipi_periph_timed_thaw, periph);
   1553 			}
   1554 			error = ERESTART;
   1555 		} else
   1556 			error = EBUSY;
   1557 		break;
   1558 
   1559 	case XS_REQUEUE:
   1560 		error = ERESTART;
   1561 		break;
   1562 
   1563 	case XS_SELTIMEOUT:
   1564 	case XS_TIMEOUT:
   1565 		/*
   1566 		 * If the device hasn't gone away, honor retry counts.
   1567 		 *
   1568 		 * Note that if we're in the middle of probing it,
   1569 		 * it won't be found because it isn't here yet so
   1570 		 * we won't honor the retry count in that case.
   1571 		 */
   1572 		if (scsipi_lookup_periph(chan, periph->periph_target,
   1573 		    periph->periph_lun) && xs->xs_retries != 0) {
   1574 			xs->xs_retries--;
   1575 			error = ERESTART;
   1576 		} else
   1577 			error = EIO;
   1578 		break;
   1579 
   1580 	case XS_RESET:
   1581 		if (xs->xs_control & XS_CTL_REQSENSE) {
   1582 			/*
   1583 			 * request sense interrupted by reset: signal it
   1584 			 * with EINTR return code.
   1585 			 */
   1586 			error = EINTR;
   1587 		} else {
   1588 			if (xs->xs_retries != 0) {
   1589 				xs->xs_retries--;
   1590 				error = ERESTART;
   1591 			} else
   1592 				error = EIO;
   1593 		}
   1594 		break;
   1595 
   1596 	case XS_DRIVER_STUFFUP:
   1597 		scsipi_printaddr(periph);
   1598 		printf("generic HBA error\n");
   1599 		error = EIO;
   1600 		break;
   1601 	default:
   1602 		scsipi_printaddr(periph);
   1603 		printf("invalid return code from adapter: %d\n", xs->error);
   1604 		error = EIO;
   1605 		break;
   1606 	}
   1607 
   1608 	s = splbio();
   1609 	if (error == ERESTART) {
   1610 		/*
   1611 		 * If we get here, the periph has been thawed and frozen
   1612 		 * again if we had to issue recovery commands.  Alternatively,
   1613 		 * it may have been frozen again and in a timed thaw.  In
   1614 		 * any case, we thaw the periph once we re-enqueue the
   1615 		 * command.  Once the periph is fully thawed, it will begin
   1616 		 * operation again.
   1617 		 */
   1618 		xs->error = XS_NOERROR;
   1619 		xs->status = SCSI_OK;
   1620 		xs->xs_status &= ~XS_STS_DONE;
   1621 		xs->xs_requeuecnt++;
   1622 		error = scsipi_enqueue(xs);
   1623 		if (error == 0) {
   1624 			scsipi_periph_thaw(periph, 1);
   1625 			splx(s);
   1626 			return (ERESTART);
   1627 		}
   1628 	}
   1629 
   1630 	/*
   1631 	 * scsipi_done() freezes the queue if not XS_NOERROR.
   1632 	 * Thaw it here.
   1633 	 */
   1634 	if (xs->error != XS_NOERROR)
   1635 		scsipi_periph_thaw(periph, 1);
   1636 
   1637 	/*
   1638 	 * Set buffer fields in case the periph
   1639 	 * switch done func uses them
   1640 	 */
   1641 	if ((bp = xs->bp) != NULL) {
   1642 		if (error) {
   1643 			bp->b_error = error;
   1644 			bp->b_flags |= B_ERROR;
   1645 			bp->b_resid = bp->b_bcount;
   1646 		} else {
   1647 			bp->b_error = 0;
   1648 			bp->b_resid = xs->resid;
   1649 		}
   1650 	}
   1651 
   1652 	if (periph->periph_switch->psw_done)
   1653 		periph->periph_switch->psw_done(xs);
   1654 
   1655 	if (bp)
   1656 		biodone(bp);
   1657 
   1658 	if (xs->xs_control & XS_CTL_ASYNC)
   1659 		scsipi_put_xs(xs);
   1660 	splx(s);
   1661 
   1662 	return (error);
   1663 }
   1664 
   1665 /*
   1666  * Issue a request sense for the given scsipi_xfer. Called when the xfer
   1667  * returns with a CHECK_CONDITION status. Must be called in valid thread
   1668  * context and at splbio().
   1669  */
   1670 
   1671 static void
   1672 scsipi_request_sense(struct scsipi_xfer *xs)
   1673 {
   1674 	struct scsipi_periph *periph = xs->xs_periph;
   1675 	int flags, error;
   1676 	struct scsipi_sense cmd;
   1677 
   1678 	periph->periph_flags |= PERIPH_SENSE;
   1679 
   1680 	/* if command was polling, request sense will too */
   1681 	flags = xs->xs_control & XS_CTL_POLL;
   1682 	/* Polling commands can't sleep */
   1683 	if (flags)
   1684 		flags |= XS_CTL_NOSLEEP;
   1685 
   1686 	flags |= XS_CTL_REQSENSE | XS_CTL_URGENT | XS_CTL_DATA_IN |
   1687 	    XS_CTL_THAW_PERIPH | XS_CTL_FREEZE_PERIPH;
   1688 
   1689 	memset(&cmd, 0, sizeof(cmd));
   1690 	cmd.opcode = REQUEST_SENSE;
   1691 	cmd.length = sizeof(struct scsipi_sense_data);
   1692 
   1693 	error = scsipi_command(periph,
   1694 	    (struct scsipi_generic *) &cmd, sizeof(cmd),
   1695 	    (u_char*)&xs->sense.scsi_sense, sizeof(struct scsipi_sense_data),
   1696 	    0, 1000, NULL, flags);
   1697 	periph->periph_flags &= ~PERIPH_SENSE;
   1698 	periph->periph_xscheck = NULL;
   1699 	switch(error) {
   1700 	case 0:
   1701 		/* we have a valid sense */
   1702 		xs->error = XS_SENSE;
   1703 		return;
   1704 	case EINTR:
   1705 		/* REQUEST_SENSE interrupted by bus reset. */
   1706 		xs->error = XS_RESET;
   1707 		return;
   1708 	case EIO:
   1709 		 /* request sense coudn't be performed */
   1710 		/*
   1711 		 * XXX this isn't quite right but we don't have anything
   1712 		 * better for now
   1713 		 */
   1714 		xs->error = XS_DRIVER_STUFFUP;
   1715 		return;
   1716 	default:
   1717 		 /* Notify that request sense failed. */
   1718 		xs->error = XS_DRIVER_STUFFUP;
   1719 		scsipi_printaddr(periph);
   1720 		printf("request sense failed with error %d\n", error);
   1721 		return;
   1722 	}
   1723 }
   1724 
   1725 /*
   1726  * scsipi_enqueue:
   1727  *
   1728  *	Enqueue an xfer on a channel.
   1729  */
   1730 static int
   1731 scsipi_enqueue(struct scsipi_xfer *xs)
   1732 {
   1733 	struct scsipi_channel *chan = xs->xs_periph->periph_channel;
   1734 	struct scsipi_xfer *qxs;
   1735 	int s;
   1736 
   1737 	s = splbio();
   1738 
   1739 	/*
   1740 	 * If the xfer is to be polled, and there are already jobs on
   1741 	 * the queue, we can't proceed.
   1742 	 */
   1743 	if ((xs->xs_control & XS_CTL_POLL) != 0 &&
   1744 	    TAILQ_FIRST(&chan->chan_queue) != NULL) {
   1745 		splx(s);
   1746 		xs->error = XS_DRIVER_STUFFUP;
   1747 		return (EAGAIN);
   1748 	}
   1749 
   1750 	/*
   1751 	 * If we have an URGENT xfer, it's an error recovery command
   1752 	 * and it should just go on the head of the channel's queue.
   1753 	 */
   1754 	if (xs->xs_control & XS_CTL_URGENT) {
   1755 		TAILQ_INSERT_HEAD(&chan->chan_queue, xs, channel_q);
   1756 		goto out;
   1757 	}
   1758 
   1759 	/*
   1760 	 * If this xfer has already been on the queue before, we
   1761 	 * need to reinsert it in the correct order.  That order is:
   1762 	 *
   1763 	 *	Immediately before the first xfer for this periph
   1764 	 *	with a requeuecnt less than xs->xs_requeuecnt.
   1765 	 *
   1766 	 * Failing that, at the end of the queue.  (We'll end up
   1767 	 * there naturally.)
   1768 	 */
   1769 	if (xs->xs_requeuecnt != 0) {
   1770 		for (qxs = TAILQ_FIRST(&chan->chan_queue); qxs != NULL;
   1771 		     qxs = TAILQ_NEXT(qxs, channel_q)) {
   1772 			if (qxs->xs_periph == xs->xs_periph &&
   1773 			    qxs->xs_requeuecnt < xs->xs_requeuecnt)
   1774 				break;
   1775 		}
   1776 		if (qxs != NULL) {
   1777 			TAILQ_INSERT_AFTER(&chan->chan_queue, qxs, xs,
   1778 			    channel_q);
   1779 			goto out;
   1780 		}
   1781 	}
   1782 	TAILQ_INSERT_TAIL(&chan->chan_queue, xs, channel_q);
   1783  out:
   1784 	if (xs->xs_control & XS_CTL_THAW_PERIPH)
   1785 		scsipi_periph_thaw(xs->xs_periph, 1);
   1786 	splx(s);
   1787 	return (0);
   1788 }
   1789 
   1790 /*
   1791  * scsipi_run_queue:
   1792  *
   1793  *	Start as many xfers as possible running on the channel.
   1794  */
   1795 static void
   1796 scsipi_run_queue(struct scsipi_channel *chan)
   1797 {
   1798 	struct scsipi_xfer *xs;
   1799 	struct scsipi_periph *periph;
   1800 	int s;
   1801 
   1802 	for (;;) {
   1803 		s = splbio();
   1804 
   1805 		/*
   1806 		 * If the channel is frozen, we can't do any work right
   1807 		 * now.
   1808 		 */
   1809 		if (chan->chan_qfreeze != 0) {
   1810 			splx(s);
   1811 			return;
   1812 		}
   1813 
   1814 		/*
   1815 		 * Look for work to do, and make sure we can do it.
   1816 		 */
   1817 		for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL;
   1818 		     xs = TAILQ_NEXT(xs, channel_q)) {
   1819 			periph = xs->xs_periph;
   1820 
   1821 			if ((periph->periph_sent >= periph->periph_openings) ||
   1822 			    periph->periph_qfreeze != 0 ||
   1823 			    (periph->periph_flags & PERIPH_UNTAG) != 0)
   1824 				continue;
   1825 
   1826 			if ((periph->periph_flags &
   1827 			    (PERIPH_RECOVERING | PERIPH_SENSE)) != 0 &&
   1828 			    (xs->xs_control & XS_CTL_URGENT) == 0)
   1829 				continue;
   1830 
   1831 			/*
   1832 			 * We can issue this xfer!
   1833 			 */
   1834 			goto got_one;
   1835 		}
   1836 
   1837 		/*
   1838 		 * Can't find any work to do right now.
   1839 		 */
   1840 		splx(s);
   1841 		return;
   1842 
   1843  got_one:
   1844 		/*
   1845 		 * Have an xfer to run.  Allocate a resource from
   1846 		 * the adapter to run it.  If we can't allocate that
   1847 		 * resource, we don't dequeue the xfer.
   1848 		 */
   1849 		if (scsipi_get_resource(chan) == 0) {
   1850 			/*
   1851 			 * Adapter is out of resources.  If the adapter
   1852 			 * supports it, attempt to grow them.
   1853 			 */
   1854 			if (scsipi_grow_resources(chan) == 0) {
   1855 				/*
   1856 				 * Wasn't able to grow resources,
   1857 				 * nothing more we can do.
   1858 				 */
   1859 				if (xs->xs_control & XS_CTL_POLL) {
   1860 					scsipi_printaddr(xs->xs_periph);
   1861 					printf("polling command but no "
   1862 					    "adapter resources");
   1863 					/* We'll panic shortly... */
   1864 				}
   1865 				splx(s);
   1866 
   1867 				/*
   1868 				 * XXX: We should be able to note that
   1869 				 * XXX: that resources are needed here!
   1870 				 */
   1871 				return;
   1872 			}
   1873 			/*
   1874 			 * scsipi_grow_resources() allocated the resource
   1875 			 * for us.
   1876 			 */
   1877 		}
   1878 
   1879 		/*
   1880 		 * We have a resource to run this xfer, do it!
   1881 		 */
   1882 		TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
   1883 
   1884 		/*
   1885 		 * If the command is to be tagged, allocate a tag ID
   1886 		 * for it.
   1887 		 */
   1888 		if (XS_CTL_TAGTYPE(xs) != 0)
   1889 			scsipi_get_tag(xs);
   1890 		else
   1891 			periph->periph_flags |= PERIPH_UNTAG;
   1892 		periph->periph_sent++;
   1893 		splx(s);
   1894 
   1895 		scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
   1896 	}
   1897 #ifdef DIAGNOSTIC
   1898 	panic("scsipi_run_queue: impossible");
   1899 #endif
   1900 }
   1901 
   1902 /*
   1903  * scsipi_execute_xs:
   1904  *
   1905  *	Begin execution of an xfer, waiting for it to complete, if necessary.
   1906  */
   1907 int
   1908 scsipi_execute_xs(struct scsipi_xfer *xs)
   1909 {
   1910 	struct scsipi_periph *periph = xs->xs_periph;
   1911 	struct scsipi_channel *chan = periph->periph_channel;
   1912 	int oasync, async, poll, retries, error, s;
   1913 
   1914 	xs->xs_status &= ~XS_STS_DONE;
   1915 	xs->error = XS_NOERROR;
   1916 	xs->resid = xs->datalen;
   1917 	xs->status = SCSI_OK;
   1918 
   1919 #ifdef SCSIPI_DEBUG
   1920 	if (xs->xs_periph->periph_dbflags & SCSIPI_DB3) {
   1921 		printf("scsipi_execute_xs: ");
   1922 		show_scsipi_xs(xs);
   1923 		printf("\n");
   1924 	}
   1925 #endif
   1926 
   1927 	/*
   1928 	 * Deal with command tagging:
   1929 	 *
   1930 	 *	- If the device's current operating mode doesn't
   1931 	 *	  include tagged queueing, clear the tag mask.
   1932 	 *
   1933 	 *	- If the device's current operating mode *does*
   1934 	 *	  include tagged queueing, set the tag_type in
   1935 	 *	  the xfer to the appropriate byte for the tag
   1936 	 *	  message.
   1937 	 */
   1938 	if ((PERIPH_XFER_MODE(periph) & PERIPH_CAP_TQING) == 0 ||
   1939 		(xs->xs_control & XS_CTL_REQSENSE)) {
   1940 		xs->xs_control &= ~XS_CTL_TAGMASK;
   1941 		xs->xs_tag_type = 0;
   1942 	} else {
   1943 		/*
   1944 		 * If the request doesn't specify a tag, give Head
   1945 		 * tags to URGENT operations and Ordered tags to
   1946 		 * everything else.
   1947 		 */
   1948 		if (XS_CTL_TAGTYPE(xs) == 0) {
   1949 			if (xs->xs_control & XS_CTL_URGENT)
   1950 				xs->xs_control |= XS_CTL_HEAD_TAG;
   1951 			else
   1952 				xs->xs_control |= XS_CTL_ORDERED_TAG;
   1953 		}
   1954 
   1955 		switch (XS_CTL_TAGTYPE(xs)) {
   1956 		case XS_CTL_ORDERED_TAG:
   1957 			xs->xs_tag_type = MSG_ORDERED_Q_TAG;
   1958 			break;
   1959 
   1960 		case XS_CTL_SIMPLE_TAG:
   1961 			xs->xs_tag_type = MSG_SIMPLE_Q_TAG;
   1962 			break;
   1963 
   1964 		case XS_CTL_HEAD_TAG:
   1965 			xs->xs_tag_type = MSG_HEAD_OF_Q_TAG;
   1966 			break;
   1967 
   1968 		default:
   1969 			scsipi_printaddr(periph);
   1970 			printf("invalid tag mask 0x%08x\n",
   1971 			    XS_CTL_TAGTYPE(xs));
   1972 			panic("scsipi_execute_xs");
   1973 		}
   1974 	}
   1975 
   1976 	/* If the adaptor wants us to poll, poll. */
   1977 	if (chan->chan_adapter->adapt_flags & SCSIPI_ADAPT_POLL_ONLY)
   1978 		xs->xs_control |= XS_CTL_POLL;
   1979 
   1980 	/*
   1981 	 * If we don't yet have a completion thread, or we are to poll for
   1982 	 * completion, clear the ASYNC flag.
   1983 	 */
   1984 	oasync =  (xs->xs_control & XS_CTL_ASYNC);
   1985 	if (chan->chan_thread == NULL || (xs->xs_control & XS_CTL_POLL) != 0)
   1986 		xs->xs_control &= ~XS_CTL_ASYNC;
   1987 
   1988 	async = (xs->xs_control & XS_CTL_ASYNC);
   1989 	poll = (xs->xs_control & XS_CTL_POLL);
   1990 	retries = xs->xs_retries;		/* for polling commands */
   1991 
   1992 #ifdef DIAGNOSTIC
   1993 	if (oasync != 0 && xs->bp == NULL)
   1994 		panic("scsipi_execute_xs: XS_CTL_ASYNC but no buf");
   1995 #endif
   1996 
   1997 	/*
   1998 	 * Enqueue the transfer.  If we're not polling for completion, this
   1999 	 * should ALWAYS return `no error'.
   2000 	 */
   2001  try_again:
   2002 	error = scsipi_enqueue(xs);
   2003 	if (error) {
   2004 		if (poll == 0) {
   2005 			scsipi_printaddr(periph);
   2006 			printf("not polling, but enqueue failed with %d\n",
   2007 			    error);
   2008 			panic("scsipi_execute_xs");
   2009 		}
   2010 
   2011 		scsipi_printaddr(periph);
   2012 		printf("failed to enqueue polling command");
   2013 		if (retries != 0) {
   2014 			printf(", retrying...\n");
   2015 			delay(1000000);
   2016 			retries--;
   2017 			goto try_again;
   2018 		}
   2019 		printf("\n");
   2020 		goto free_xs;
   2021 	}
   2022 
   2023  restarted:
   2024 	scsipi_run_queue(chan);
   2025 
   2026 	/*
   2027 	 * The xfer is enqueued, and possibly running.  If it's to be
   2028 	 * completed asynchronously, just return now.
   2029 	 */
   2030 	if (async)
   2031 		return (EJUSTRETURN);
   2032 
   2033 	/*
   2034 	 * Not an asynchronous command; wait for it to complete.
   2035 	 */
   2036 	s = splbio();
   2037 	while ((xs->xs_status & XS_STS_DONE) == 0) {
   2038 		if (poll) {
   2039 			scsipi_printaddr(periph);
   2040 			printf("polling command not done\n");
   2041 			panic("scsipi_execute_xs");
   2042 		}
   2043 		(void) tsleep(xs, PRIBIO, "xscmd", 0);
   2044 	}
   2045 	splx(s);
   2046 
   2047 	/*
   2048 	 * Command is complete.  scsipi_done() has awakened us to perform
   2049 	 * the error handling.
   2050 	 */
   2051 	error = scsipi_complete(xs);
   2052 	if (error == ERESTART)
   2053 		goto restarted;
   2054 
   2055 	/*
   2056 	 * If it was meant to run async and we cleared aync ourselve,
   2057 	 * don't return an error here. It has already been handled
   2058 	 */
   2059 	if (oasync)
   2060 		error = EJUSTRETURN;
   2061 	/*
   2062 	 * Command completed successfully or fatal error occurred.  Fall
   2063 	 * into....
   2064 	 */
   2065  free_xs:
   2066 	s = splbio();
   2067 	scsipi_put_xs(xs);
   2068 	splx(s);
   2069 
   2070 	/*
   2071 	 * Kick the queue, keep it running in case it stopped for some
   2072 	 * reason.
   2073 	 */
   2074 	scsipi_run_queue(chan);
   2075 
   2076 	return (error);
   2077 }
   2078 
   2079 /*
   2080  * scsipi_completion_thread:
   2081  *
   2082  *	This is the completion thread.  We wait for errors on
   2083  *	asynchronous xfers, and perform the error handling
   2084  *	function, restarting the command, if necessary.
   2085  */
   2086 static void
   2087 scsipi_completion_thread(void *arg)
   2088 {
   2089 	struct scsipi_channel *chan = arg;
   2090 	struct scsipi_xfer *xs;
   2091 	int s;
   2092 
   2093 	if (chan->chan_init_cb)
   2094 		(*chan->chan_init_cb)(chan, chan->chan_init_cb_arg);
   2095 
   2096 	s = splbio();
   2097 	chan->chan_flags |= SCSIPI_CHAN_TACTIVE;
   2098 	splx(s);
   2099 	for (;;) {
   2100 		s = splbio();
   2101 		xs = TAILQ_FIRST(&chan->chan_complete);
   2102 		if (xs == NULL && chan->chan_tflags  == 0) {
   2103 			/* nothing to do; wait */
   2104 			(void) tsleep(&chan->chan_complete, PRIBIO,
   2105 			    "sccomp", 0);
   2106 			splx(s);
   2107 			continue;
   2108 		}
   2109 		if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
   2110 			/* call chan_callback from thread context */
   2111 			chan->chan_tflags &= ~SCSIPI_CHANT_CALLBACK;
   2112 			chan->chan_callback(chan, chan->chan_callback_arg);
   2113 			splx(s);
   2114 			continue;
   2115 		}
   2116 		if (chan->chan_tflags & SCSIPI_CHANT_GROWRES) {
   2117 			/* attempt to get more openings for this channel */
   2118 			chan->chan_tflags &= ~SCSIPI_CHANT_GROWRES;
   2119 			scsipi_adapter_request(chan,
   2120 			    ADAPTER_REQ_GROW_RESOURCES, NULL);
   2121 			scsipi_channel_thaw(chan, 1);
   2122 			splx(s);
   2123 			continue;
   2124 		}
   2125 		if (chan->chan_tflags & SCSIPI_CHANT_KICK) {
   2126 			/* explicitly run the queues for this channel */
   2127 			chan->chan_tflags &= ~SCSIPI_CHANT_KICK;
   2128 			scsipi_run_queue(chan);
   2129 			splx(s);
   2130 			continue;
   2131 		}
   2132 		if (chan->chan_tflags & SCSIPI_CHANT_SHUTDOWN) {
   2133 			splx(s);
   2134 			break;
   2135 		}
   2136 		if (xs) {
   2137 			TAILQ_REMOVE(&chan->chan_complete, xs, channel_q);
   2138 			splx(s);
   2139 
   2140 			/*
   2141 			 * Have an xfer with an error; process it.
   2142 			 */
   2143 			(void) scsipi_complete(xs);
   2144 
   2145 			/*
   2146 			 * Kick the queue; keep it running if it was stopped
   2147 			 * for some reason.
   2148 			 */
   2149 			scsipi_run_queue(chan);
   2150 		} else {
   2151 			splx(s);
   2152 		}
   2153 	}
   2154 
   2155 	chan->chan_thread = NULL;
   2156 
   2157 	/* In case parent is waiting for us to exit. */
   2158 	wakeup(&chan->chan_thread);
   2159 
   2160 	kthread_exit(0);
   2161 }
   2162 
   2163 /*
   2164  * scsipi_create_completion_thread:
   2165  *
   2166  *	Callback to actually create the completion thread.
   2167  */
   2168 void
   2169 scsipi_create_completion_thread(void *arg)
   2170 {
   2171 	struct scsipi_channel *chan = arg;
   2172 	struct scsipi_adapter *adapt = chan->chan_adapter;
   2173 
   2174 	if (kthread_create1(scsipi_completion_thread, chan,
   2175 	    &chan->chan_thread, "%s", chan->chan_name)) {
   2176 		printf("%s: unable to create completion thread for "
   2177 		    "channel %d\n", adapt->adapt_dev->dv_xname,
   2178 		    chan->chan_channel);
   2179 		panic("scsipi_create_completion_thread");
   2180 	}
   2181 }
   2182 
   2183 /*
   2184  * scsipi_thread_call_callback:
   2185  *
   2186  * 	request to call a callback from the completion thread
   2187  */
   2188 int
   2189 scsipi_thread_call_callback(struct scsipi_channel *chan,
   2190     void (*callback)(struct scsipi_channel *, void *), void *arg)
   2191 {
   2192 	int s;
   2193 
   2194 	s = splbio();
   2195 	if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
   2196 		/* kernel thread doesn't exist yet */
   2197 		splx(s);
   2198 		return ESRCH;
   2199 	}
   2200 	if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
   2201 		splx(s);
   2202 		return EBUSY;
   2203 	}
   2204 	scsipi_channel_freeze(chan, 1);
   2205 	chan->chan_callback = callback;
   2206 	chan->chan_callback_arg = arg;
   2207 	chan->chan_tflags |= SCSIPI_CHANT_CALLBACK;
   2208 	wakeup(&chan->chan_complete);
   2209 	splx(s);
   2210 	return(0);
   2211 }
   2212 
   2213 /*
   2214  * scsipi_async_event:
   2215  *
   2216  *	Handle an asynchronous event from an adapter.
   2217  */
   2218 void
   2219 scsipi_async_event(struct scsipi_channel *chan, scsipi_async_event_t event,
   2220     void *arg)
   2221 {
   2222 	int s;
   2223 
   2224 	s = splbio();
   2225 	switch (event) {
   2226 	case ASYNC_EVENT_MAX_OPENINGS:
   2227 		scsipi_async_event_max_openings(chan,
   2228 		    (struct scsipi_max_openings *)arg);
   2229 		break;
   2230 
   2231 	case ASYNC_EVENT_XFER_MODE:
   2232 		scsipi_async_event_xfer_mode(chan,
   2233 		    (struct scsipi_xfer_mode *)arg);
   2234 		break;
   2235 	case ASYNC_EVENT_RESET:
   2236 		scsipi_async_event_channel_reset(chan);
   2237 		break;
   2238 	}
   2239 	splx(s);
   2240 }
   2241 
   2242 /*
   2243  * scsipi_print_xfer_mode:
   2244  *
   2245  *	Print a periph's capabilities.
   2246  */
   2247 void
   2248 scsipi_print_xfer_mode(struct scsipi_periph *periph)
   2249 {
   2250 	int period, freq, speed, mbs;
   2251 
   2252 	if ((periph->periph_flags & PERIPH_MODE_VALID) == 0)
   2253 		return;
   2254 
   2255 	aprint_normal("%s: ", periph->periph_dev->dv_xname);
   2256 	if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
   2257 		period = scsipi_sync_factor_to_period(periph->periph_period);
   2258 		aprint_normal("sync (%d.%02dns offset %d)",
   2259 		    period / 100, period % 100, periph->periph_offset);
   2260 	} else
   2261 		aprint_normal("async");
   2262 
   2263 	if (periph->periph_mode & PERIPH_CAP_WIDE32)
   2264 		aprint_normal(", 32-bit");
   2265 	else if (periph->periph_mode & (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
   2266 		aprint_normal(", 16-bit");
   2267 	else
   2268 		aprint_normal(", 8-bit");
   2269 
   2270 	if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
   2271 		freq = scsipi_sync_factor_to_freq(periph->periph_period);
   2272 		speed = freq;
   2273 		if (periph->periph_mode & PERIPH_CAP_WIDE32)
   2274 			speed *= 4;
   2275 		else if (periph->periph_mode &
   2276 		    (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
   2277 			speed *= 2;
   2278 		mbs = speed / 1000;
   2279 		if (mbs > 0)
   2280 			aprint_normal(" (%d.%03dMB/s)", mbs, speed % 1000);
   2281 		else
   2282 			aprint_normal(" (%dKB/s)", speed % 1000);
   2283 	}
   2284 
   2285 	aprint_normal(" transfers");
   2286 
   2287 	if (periph->periph_mode & PERIPH_CAP_TQING)
   2288 		aprint_normal(", tagged queueing");
   2289 
   2290 	aprint_normal("\n");
   2291 }
   2292 
   2293 /*
   2294  * scsipi_async_event_max_openings:
   2295  *
   2296  *	Update the maximum number of outstanding commands a
   2297  *	device may have.
   2298  */
   2299 static void
   2300 scsipi_async_event_max_openings(struct scsipi_channel *chan,
   2301     struct scsipi_max_openings *mo)
   2302 {
   2303 	struct scsipi_periph *periph;
   2304 	int minlun, maxlun;
   2305 
   2306 	if (mo->mo_lun == -1) {
   2307 		/*
   2308 		 * Wildcarded; apply it to all LUNs.
   2309 		 */
   2310 		minlun = 0;
   2311 		maxlun = chan->chan_nluns - 1;
   2312 	} else
   2313 		minlun = maxlun = mo->mo_lun;
   2314 
   2315 	/* XXX This could really suck with a large LUN space. */
   2316 	for (; minlun <= maxlun; minlun++) {
   2317 		periph = scsipi_lookup_periph(chan, mo->mo_target, minlun);
   2318 		if (periph == NULL)
   2319 			continue;
   2320 
   2321 		if (mo->mo_openings < periph->periph_openings)
   2322 			periph->periph_openings = mo->mo_openings;
   2323 		else if (mo->mo_openings > periph->periph_openings &&
   2324 		    (periph->periph_flags & PERIPH_GROW_OPENINGS) != 0)
   2325 			periph->periph_openings = mo->mo_openings;
   2326 	}
   2327 }
   2328 
   2329 /*
   2330  * scsipi_async_event_xfer_mode:
   2331  *
   2332  *	Update the xfer mode for all periphs sharing the
   2333  *	specified I_T Nexus.
   2334  */
   2335 static void
   2336 scsipi_async_event_xfer_mode(struct scsipi_channel *chan,
   2337     struct scsipi_xfer_mode *xm)
   2338 {
   2339 	struct scsipi_periph *periph;
   2340 	int lun, announce, mode, period, offset;
   2341 
   2342 	for (lun = 0; lun < chan->chan_nluns; lun++) {
   2343 		periph = scsipi_lookup_periph(chan, xm->xm_target, lun);
   2344 		if (periph == NULL)
   2345 			continue;
   2346 		announce = 0;
   2347 
   2348 		/*
   2349 		 * Clamp the xfer mode down to this periph's capabilities.
   2350 		 */
   2351 		mode = xm->xm_mode & periph->periph_cap;
   2352 		if (mode & PERIPH_CAP_SYNC) {
   2353 			period = xm->xm_period;
   2354 			offset = xm->xm_offset;
   2355 		} else {
   2356 			period = 0;
   2357 			offset = 0;
   2358 		}
   2359 
   2360 		/*
   2361 		 * If we do not have a valid xfer mode yet, or the parameters
   2362 		 * are different, announce them.
   2363 		 */
   2364 		if ((periph->periph_flags & PERIPH_MODE_VALID) == 0 ||
   2365 		    periph->periph_mode != mode ||
   2366 		    periph->periph_period != period ||
   2367 		    periph->periph_offset != offset)
   2368 			announce = 1;
   2369 
   2370 		periph->periph_mode = mode;
   2371 		periph->periph_period = period;
   2372 		periph->periph_offset = offset;
   2373 		periph->periph_flags |= PERIPH_MODE_VALID;
   2374 
   2375 		if (announce)
   2376 			scsipi_print_xfer_mode(periph);
   2377 	}
   2378 }
   2379 
   2380 /*
   2381  * scsipi_set_xfer_mode:
   2382  *
   2383  *	Set the xfer mode for the specified I_T Nexus.
   2384  */
   2385 void
   2386 scsipi_set_xfer_mode(struct scsipi_channel *chan, int target, int immed)
   2387 {
   2388 	struct scsipi_xfer_mode xm;
   2389 	struct scsipi_periph *itperiph;
   2390 	int lun, s;
   2391 
   2392 	/*
   2393 	 * Go to the minimal xfer mode.
   2394 	 */
   2395 	xm.xm_target = target;
   2396 	xm.xm_mode = 0;
   2397 	xm.xm_period = 0;			/* ignored */
   2398 	xm.xm_offset = 0;			/* ignored */
   2399 
   2400 	/*
   2401 	 * Find the first LUN we know about on this I_T Nexus.
   2402 	 */
   2403 	for (itperiph = NULL, lun = 0; lun < chan->chan_nluns; lun++) {
   2404 		itperiph = scsipi_lookup_periph(chan, target, lun);
   2405 		if (itperiph != NULL)
   2406 			break;
   2407 	}
   2408 	if (itperiph != NULL) {
   2409 		xm.xm_mode = itperiph->periph_cap;
   2410 		/*
   2411 		 * Now issue the request to the adapter.
   2412 		 */
   2413 		s = splbio();
   2414 		scsipi_adapter_request(chan, ADAPTER_REQ_SET_XFER_MODE, &xm);
   2415 		splx(s);
   2416 		/*
   2417 		 * If we want this to happen immediately, issue a dummy
   2418 		 * command, since most adapters can't really negotiate unless
   2419 		 * they're executing a job.
   2420 		 */
   2421 		if (immed != 0) {
   2422 			(void) scsipi_test_unit_ready(itperiph,
   2423 			    XS_CTL_DISCOVERY | XS_CTL_IGNORE_ILLEGAL_REQUEST |
   2424 			    XS_CTL_IGNORE_NOT_READY |
   2425 			    XS_CTL_IGNORE_MEDIA_CHANGE);
   2426 		}
   2427 	}
   2428 }
   2429 
   2430 /*
   2431  * scsipi_channel_reset:
   2432  *
   2433  *	handle scsi bus reset
   2434  * called at splbio
   2435  */
   2436 static void
   2437 scsipi_async_event_channel_reset(struct scsipi_channel *chan)
   2438 {
   2439 	struct scsipi_xfer *xs, *xs_next;
   2440 	struct scsipi_periph *periph;
   2441 	int target, lun;
   2442 
   2443 	/*
   2444 	 * Channel has been reset. Also mark as reset pending REQUEST_SENSE
   2445 	 * commands; as the sense is not available any more.
   2446 	 * can't call scsipi_done() from here, as the command has not been
   2447 	 * sent to the adapter yet (this would corrupt accounting).
   2448 	 */
   2449 
   2450 	for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL; xs = xs_next) {
   2451 		xs_next = TAILQ_NEXT(xs, channel_q);
   2452 		if (xs->xs_control & XS_CTL_REQSENSE) {
   2453 			TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
   2454 			xs->error = XS_RESET;
   2455 			if ((xs->xs_control & XS_CTL_ASYNC) != 0)
   2456 				TAILQ_INSERT_TAIL(&chan->chan_complete, xs,
   2457 				    channel_q);
   2458 		}
   2459 	}
   2460 	wakeup(&chan->chan_complete);
   2461 	/* Catch xs with pending sense which may not have a REQSENSE xs yet */
   2462 	for (target = 0; target < chan->chan_ntargets; target++) {
   2463 		if (target == chan->chan_id)
   2464 			continue;
   2465 		for (lun = 0; lun <  chan->chan_nluns; lun++) {
   2466 			periph = scsipi_lookup_periph(chan, target, lun);
   2467 			if (periph) {
   2468 				xs = periph->periph_xscheck;
   2469 				if (xs)
   2470 					xs->error = XS_RESET;
   2471 			}
   2472 		}
   2473 	}
   2474 }
   2475 
   2476 /*
   2477  * scsipi_target_detach:
   2478  *
   2479  *	detach all periph associated with a I_T
   2480  * 	must be called from valid thread context
   2481  */
   2482 int
   2483 scsipi_target_detach(struct scsipi_channel *chan, int target, int lun,
   2484     int flags)
   2485 {
   2486 	struct scsipi_periph *periph;
   2487 	int ctarget, mintarget, maxtarget;
   2488 	int clun, minlun, maxlun;
   2489 	int error;
   2490 
   2491 	if (target == -1) {
   2492 		mintarget = 0;
   2493 		maxtarget = chan->chan_ntargets;
   2494 	} else {
   2495 		if (target == chan->chan_id)
   2496 			return EINVAL;
   2497 		if (target < 0 || target >= chan->chan_ntargets)
   2498 			return EINVAL;
   2499 		mintarget = target;
   2500 		maxtarget = target + 1;
   2501 	}
   2502 
   2503 	if (lun == -1) {
   2504 		minlun = 0;
   2505 		maxlun = chan->chan_nluns;
   2506 	} else {
   2507 		if (lun < 0 || lun >= chan->chan_nluns)
   2508 			return EINVAL;
   2509 		minlun = lun;
   2510 		maxlun = lun + 1;
   2511 	}
   2512 
   2513 	for (ctarget = mintarget; ctarget < maxtarget; ctarget++) {
   2514 		if (ctarget == chan->chan_id)
   2515 			continue;
   2516 
   2517 		for (clun = minlun; clun < maxlun; clun++) {
   2518 			periph = scsipi_lookup_periph(chan, ctarget, clun);
   2519 			if (periph == NULL)
   2520 				continue;
   2521 			error = config_detach(periph->periph_dev, flags);
   2522 			if (error)
   2523 				return (error);
   2524 		}
   2525 	}
   2526 	return(0);
   2527 }
   2528 
   2529 /*
   2530  * scsipi_adapter_addref:
   2531  *
   2532  *	Add a reference to the adapter pointed to by the provided
   2533  *	link, enabling the adapter if necessary.
   2534  */
   2535 int
   2536 scsipi_adapter_addref(struct scsipi_adapter *adapt)
   2537 {
   2538 	int s, error = 0;
   2539 
   2540 	s = splbio();
   2541 	if (adapt->adapt_refcnt++ == 0 && adapt->adapt_enable != NULL) {
   2542 		error = (*adapt->adapt_enable)(adapt->adapt_dev, 1);
   2543 		if (error)
   2544 			adapt->adapt_refcnt--;
   2545 	}
   2546 	splx(s);
   2547 	return (error);
   2548 }
   2549 
   2550 /*
   2551  * scsipi_adapter_delref:
   2552  *
   2553  *	Delete a reference to the adapter pointed to by the provided
   2554  *	link, disabling the adapter if possible.
   2555  */
   2556 void
   2557 scsipi_adapter_delref(struct scsipi_adapter *adapt)
   2558 {
   2559 	int s;
   2560 
   2561 	s = splbio();
   2562 	if (adapt->adapt_refcnt-- == 1 && adapt->adapt_enable != NULL)
   2563 		(void) (*adapt->adapt_enable)(adapt->adapt_dev, 0);
   2564 	splx(s);
   2565 }
   2566 
   2567 static struct scsipi_syncparam {
   2568 	int	ss_factor;
   2569 	int	ss_period;	/* ns * 100 */
   2570 } scsipi_syncparams[] = {
   2571 	{ 0x08,		 625 },	/* FAST-160 (Ultra320) */
   2572 	{ 0x09,		1250 },	/* FAST-80 (Ultra160) */
   2573 	{ 0x0a,		2500 },	/* FAST-40 40MHz (Ultra2) */
   2574 	{ 0x0b,		3030 },	/* FAST-40 33MHz (Ultra2) */
   2575 	{ 0x0c,		5000 },	/* FAST-20 (Ultra) */
   2576 };
   2577 static const int scsipi_nsyncparams =
   2578     sizeof(scsipi_syncparams) / sizeof(scsipi_syncparams[0]);
   2579 
   2580 int
   2581 scsipi_sync_period_to_factor(int period /* ns * 100 */)
   2582 {
   2583 	int i;
   2584 
   2585 	for (i = 0; i < scsipi_nsyncparams; i++) {
   2586 		if (period <= scsipi_syncparams[i].ss_period)
   2587 			return (scsipi_syncparams[i].ss_factor);
   2588 	}
   2589 
   2590 	return ((period / 100) / 4);
   2591 }
   2592 
   2593 int
   2594 scsipi_sync_factor_to_period(int factor)
   2595 {
   2596 	int i;
   2597 
   2598 	for (i = 0; i < scsipi_nsyncparams; i++) {
   2599 		if (factor == scsipi_syncparams[i].ss_factor)
   2600 			return (scsipi_syncparams[i].ss_period);
   2601 	}
   2602 
   2603 	return ((factor * 4) * 100);
   2604 }
   2605 
   2606 int
   2607 scsipi_sync_factor_to_freq(int factor)
   2608 {
   2609 	int i;
   2610 
   2611 	for (i = 0; i < scsipi_nsyncparams; i++) {
   2612 		if (factor == scsipi_syncparams[i].ss_factor)
   2613 			return (100000000 / scsipi_syncparams[i].ss_period);
   2614 	}
   2615 
   2616 	return (10000000 / ((factor * 4) * 10));
   2617 }
   2618 
   2619 #ifdef SCSIPI_DEBUG
   2620 /*
   2621  * Given a scsipi_xfer, dump the request, in all it's glory
   2622  */
   2623 void
   2624 show_scsipi_xs(struct scsipi_xfer *xs)
   2625 {
   2626 
   2627 	printf("xs(%p): ", xs);
   2628 	printf("xs_control(0x%08x)", xs->xs_control);
   2629 	printf("xs_status(0x%08x)", xs->xs_status);
   2630 	printf("periph(%p)", xs->xs_periph);
   2631 	printf("retr(0x%x)", xs->xs_retries);
   2632 	printf("timo(0x%x)", xs->timeout);
   2633 	printf("cmd(%p)", xs->cmd);
   2634 	printf("len(0x%x)", xs->cmdlen);
   2635 	printf("data(%p)", xs->data);
   2636 	printf("len(0x%x)", xs->datalen);
   2637 	printf("res(0x%x)", xs->resid);
   2638 	printf("err(0x%x)", xs->error);
   2639 	printf("bp(%p)", xs->bp);
   2640 	show_scsipi_cmd(xs);
   2641 }
   2642 
   2643 void
   2644 show_scsipi_cmd(struct scsipi_xfer *xs)
   2645 {
   2646 	u_char *b = (u_char *) xs->cmd;
   2647 	int i = 0;
   2648 
   2649 	scsipi_printaddr(xs->xs_periph);
   2650 	printf(" command: ");
   2651 
   2652 	if ((xs->xs_control & XS_CTL_RESET) == 0) {
   2653 		while (i < xs->cmdlen) {
   2654 			if (i)
   2655 				printf(",");
   2656 			printf("0x%x", b[i++]);
   2657 		}
   2658 		printf("-[%d bytes]\n", xs->datalen);
   2659 		if (xs->datalen)
   2660 			show_mem(xs->data, min(64, xs->datalen));
   2661 	} else
   2662 		printf("-RESET-\n");
   2663 }
   2664 
   2665 void
   2666 show_mem(u_char *address, int num)
   2667 {
   2668 	int x;
   2669 
   2670 	printf("------------------------------");
   2671 	for (x = 0; x < num; x++) {
   2672 		if ((x % 16) == 0)
   2673 			printf("\n%03d: ", x);
   2674 		printf("%02x ", *address++);
   2675 	}
   2676 	printf("\n------------------------------\n");
   2677 }
   2678 #endif /* SCSIPI_DEBUG */
   2679