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