Home | History | Annotate | Line # | Download | only in scsipi
scsipi_base.c revision 1.16
      1 /*	$NetBSD: scsipi_base.c,v 1.16 1998/12/08 00:26:22 thorpej Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1998 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.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *        This product includes software developed by the NetBSD
     21  *        Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 #include "opt_scsi.h"
     40 
     41 #include <sys/types.h>
     42 #include <sys/param.h>
     43 #include <sys/systm.h>
     44 #include <sys/kernel.h>
     45 #include <sys/buf.h>
     46 #include <sys/uio.h>
     47 #include <sys/malloc.h>
     48 #include <sys/pool.h>
     49 #include <sys/errno.h>
     50 #include <sys/device.h>
     51 #include <sys/proc.h>
     52 
     53 #include <dev/scsipi/scsipi_all.h>
     54 #include <dev/scsipi/scsipi_disk.h>
     55 #include <dev/scsipi/scsipiconf.h>
     56 #include <dev/scsipi/scsipi_base.h>
     57 
     58 struct pool scsipi_xfer_pool;
     59 
     60 int	sc_err1 __P((struct scsipi_xfer *, int));
     61 
     62 /*
     63  * Called when a scsibus is attached to initialize global data.
     64  */
     65 void
     66 scsipi_init()
     67 {
     68 	static int scsipi_init_done;
     69 
     70 	if (scsipi_init_done)
     71 		return;
     72 	scsipi_init_done = 1;
     73 
     74 	/* Initialize the scsipi_xfer pool. */
     75 	pool_init(&scsipi_xfer_pool, sizeof(struct scsipi_xfer), 0,
     76 	    0, 0, "scxspl", 0, NULL, NULL, M_DEVBUF);
     77 }
     78 
     79 /*
     80  * Get a scsipi transfer structure for the caller. Charge the structure
     81  * to the device that is referenced by the sc_link structure. If the
     82  * sc_link structure has no 'credits' then the device already has the
     83  * maximum number or outstanding operations under way. In this stage,
     84  * wait on the structure so that when one is freed, we are awoken again
     85  * If the SCSI_NOSLEEP flag is set, then do not wait, but rather, return
     86  * a NULL pointer, signifying that no slots were available
     87  * Note in the link structure, that we are waiting on it.
     88  */
     89 
     90 struct scsipi_xfer *
     91 scsipi_get_xs(sc_link, flags)
     92 	struct scsipi_link *sc_link;	/* who to charge the xs to */
     93 	int flags;			/* if this call can sleep */
     94 {
     95 	struct scsipi_xfer *xs;
     96 	int s;
     97 
     98 	SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_get_xs\n"));
     99 
    100 	s = splbio();
    101 	while (sc_link->openings <= 0) {
    102 		SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
    103 		if ((flags & SCSI_NOSLEEP) != 0) {
    104 			splx(s);
    105 			return (0);
    106 		}
    107 		sc_link->flags |= SDEV_WAITING;
    108 		(void)tsleep(sc_link, PRIBIO, "getxs", 0);
    109 	}
    110 	SC_DEBUG(sc_link, SDEV_DB3, ("calling pool_get\n"));
    111 	xs = pool_get(&scsipi_xfer_pool,
    112 	    ((flags & SCSI_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
    113 	if (xs != NULL)
    114 		sc_link->openings--;
    115 	else {
    116 		(*sc_link->sc_print_addr)(sc_link);
    117 		printf("cannot allocate scsipi xs\n");
    118 	}
    119 	splx(s);
    120 
    121 	SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
    122 
    123 	/*
    124 	 * zeroes out the command, as ATAPI may use longer commands
    125 	 * than SCSI
    126 	 */
    127 	if (xs != NULL) {
    128 		xs->flags = INUSE | flags;
    129 		TAILQ_INSERT_TAIL(&sc_link->pending_xfers, xs, device_q);
    130 		bzero(&xs->cmdstore, sizeof(xs->cmdstore));
    131 	}
    132 	return (xs);
    133 }
    134 
    135 /*
    136  * Given a scsipi_xfer struct, and a device (referenced through sc_link)
    137  * return the struct to the free pool and credit the device with it
    138  * If another process is waiting for an xs, do a wakeup, let it proceed
    139  *
    140  * MUST BE CALLED AT splbio()!!
    141  */
    142 void
    143 scsipi_free_xs(xs, flags)
    144 	struct scsipi_xfer *xs;
    145 	int flags;
    146 {
    147 	struct scsipi_link *sc_link = xs->sc_link;
    148 
    149 	TAILQ_REMOVE(&sc_link->pending_xfers, xs, device_q);
    150 	if (TAILQ_FIRST(&sc_link->pending_xfers) == NULL &&
    151 	    (sc_link->flags & SDEV_WAITDRAIN) != 0) {
    152 		sc_link->flags &= ~SDEV_WAITDRAIN;
    153 		wakeup(&sc_link->pending_xfers);
    154 	}
    155 	xs->flags &= ~INUSE;
    156 	pool_put(&scsipi_xfer_pool, xs);
    157 
    158 	SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_free_xs\n"));
    159 	/* if was 0 and someone waits, wake them up */
    160 	sc_link->openings++;
    161 	if ((sc_link->flags & SDEV_WAITING) != 0) {
    162 		sc_link->flags &= ~SDEV_WAITING;
    163 		wakeup(sc_link);
    164 	} else {
    165 		if (sc_link->device->start) {
    166 			SC_DEBUG(sc_link, SDEV_DB2,
    167 			    ("calling private start()\n"));
    168 			(*(sc_link->device->start))(sc_link->device_softc);
    169 		}
    170 	}
    171 }
    172 
    173 /*
    174  * Wait for a scsipi_link's pending xfers to drain.
    175  */
    176 void
    177 scsipi_wait_drain(sc_link)
    178 	struct scsipi_link *sc_link;
    179 {
    180 	int s;
    181 
    182 	s = splbio();
    183 	while (TAILQ_FIRST(&sc_link->pending_xfers) != NULL) {
    184 		sc_link->flags |= SDEV_WAITDRAIN;
    185 		(void) tsleep(&sc_link->pending_xfers, PRIBIO, "sxdrn", 0);
    186 	}
    187 	splx(s);
    188 }
    189 
    190 /*
    191  * Look at the returned sense and act on the error, determining
    192  * the unix error number to pass back.  (0 = report no error)
    193  *
    194  * THIS IS THE DEFAULT ERROR HANDLER FOR SCSI DEVICES
    195  */
    196 int
    197 scsipi_interpret_sense(xs)
    198 	struct scsipi_xfer *xs;
    199 {
    200 	struct scsipi_sense_data *sense;
    201 	struct scsipi_link *sc_link = xs->sc_link;
    202 	u_int8_t key;
    203 	u_int32_t info;
    204 	int error;
    205 #ifndef	SCSIVERBOSE
    206 	static char *error_mes[] = {
    207 		"soft error (corrected)",
    208 		"not ready", "medium error",
    209 		"non-media hardware failure", "illegal request",
    210 		"unit attention", "readonly device",
    211 		"no data found", "vendor unique",
    212 		"copy aborted", "command aborted",
    213 		"search returned equal", "volume overflow",
    214 		"verify miscompare", "unknown error key"
    215 	};
    216 #endif
    217 
    218 	sense = &xs->sense.scsi_sense;
    219 #ifdef	SCSIDEBUG
    220 	if ((sc_link->flags & SDEV_DB1) != 0) {
    221 		int count;
    222 		printf("code 0x%x valid 0x%x ",
    223 			sense->error_code & SSD_ERRCODE,
    224 			sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
    225 		printf("seg 0x%x key 0x%x ili 0x%x eom 0x%x fmark 0x%x\n",
    226 			sense->segment,
    227 			sense->flags & SSD_KEY,
    228 			sense->flags & SSD_ILI ? 1 : 0,
    229 			sense->flags & SSD_EOM ? 1 : 0,
    230 			sense->flags & SSD_FILEMARK ? 1 : 0);
    231 		printf("info: 0x%x 0x%x 0x%x 0x%x followed by %d extra bytes\n",
    232 			sense->info[0],
    233 			sense->info[1],
    234 			sense->info[2],
    235 			sense->info[3],
    236 			sense->extra_len);
    237 		printf("extra: ");
    238 		for (count = 0; count < ADD_BYTES_LIM(sense); count++)
    239 			printf("0x%x ", sense->cmd_spec_info[count]);
    240 		printf("\n");
    241 	}
    242 #endif	/* SCSIDEBUG */
    243 	/*
    244 	 * If the device has it's own error handler, call it first.
    245 	 * If it returns a legit error value, return that, otherwise
    246 	 * it wants us to continue with normal error processing.
    247 	 */
    248 	if (sc_link->device->err_handler) {
    249 		SC_DEBUG(sc_link, SDEV_DB2,
    250 		    ("calling private err_handler()\n"));
    251 		error = (*sc_link->device->err_handler)(xs);
    252 		if (error != SCSIRET_CONTINUE)
    253 			return (error);		/* error >= 0  better ? */
    254 	}
    255 	/* otherwise use the default */
    256 	switch (sense->error_code & SSD_ERRCODE) {
    257 		/*
    258 		 * If it's code 70, use the extended stuff and
    259 		 * interpret the key
    260 		 */
    261 	case 0x71:		/* delayed error */
    262 		sc_link->sc_print_addr(sc_link);
    263 		key = sense->flags & SSD_KEY;
    264 		printf(" DEFERRED ERROR, key = 0x%x\n", key);
    265 		/* FALLTHROUGH */
    266 	case 0x70:
    267 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0)
    268 			info = _4btol(sense->info);
    269 		else
    270 			info = 0;
    271 		key = sense->flags & SSD_KEY;
    272 
    273 		switch (key) {
    274 		case SKEY_NO_SENSE:
    275 		case SKEY_RECOVERED_ERROR:
    276 			if (xs->resid == xs->datalen && xs->datalen) {
    277 				/*
    278 				 * Why is this here?
    279 				 */
    280 				xs->resid = 0;	/* not short read */
    281 			}
    282 		case SKEY_EQUAL:
    283 			error = 0;
    284 			break;
    285 		case SKEY_NOT_READY:
    286 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    287 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    288 			if ((xs->flags & SCSI_IGNORE_NOT_READY) != 0)
    289 				return (0);
    290 			if ((xs->flags & SCSI_SILENT) != 0)
    291 				return (EIO);
    292 			error = EIO;
    293 			break;
    294 		case SKEY_ILLEGAL_REQUEST:
    295 			if ((xs->flags & SCSI_IGNORE_ILLEGAL_REQUEST) != 0)
    296 				return (0);
    297 			if ((xs->flags & SCSI_SILENT) != 0)
    298 				return (EIO);
    299 			error = EINVAL;
    300 			break;
    301 		case SKEY_UNIT_ATTENTION:
    302 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    303 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    304 			if ((xs->flags & SCSI_IGNORE_MEDIA_CHANGE) != 0 ||
    305 				/* XXX Should reupload any transient state. */
    306 				(sc_link->flags & SDEV_REMOVABLE) == 0)
    307 				return (ERESTART);
    308 			if ((xs->flags & SCSI_SILENT) != 0)
    309 				return (EIO);
    310 			error = EIO;
    311 			break;
    312 		case SKEY_WRITE_PROTECT:
    313 			error = EROFS;
    314 			break;
    315 		case SKEY_BLANK_CHECK:
    316 			error = 0;
    317 			break;
    318 		case SKEY_ABORTED_COMMAND:
    319 			error = ERESTART;
    320 			break;
    321 		case SKEY_VOLUME_OVERFLOW:
    322 			error = ENOSPC;
    323 			break;
    324 		default:
    325 			error = EIO;
    326 			break;
    327 		}
    328 
    329 #ifdef SCSIVERBOSE
    330 		if ((xs->flags & SCSI_SILENT) == 0)
    331 			scsipi_print_sense(xs, 0);
    332 #else
    333 		if (key) {
    334 			sc_link->sc_print_addr(sc_link);
    335 			printf("%s", error_mes[key - 1]);
    336 			if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    337 				switch (key) {
    338 				case SKEY_NOT_READY:
    339 				case SKEY_ILLEGAL_REQUEST:
    340 				case SKEY_UNIT_ATTENTION:
    341 				case SKEY_WRITE_PROTECT:
    342 					break;
    343 				case SKEY_BLANK_CHECK:
    344 					printf(", requested size: %d (decimal)",
    345 					    info);
    346 					break;
    347 				case SKEY_ABORTED_COMMAND:
    348 					if (xs->retries)
    349 						printf(", retrying");
    350 					printf(", cmd 0x%x, info 0x%x",
    351 					    xs->cmd->opcode, info);
    352 					break;
    353 				default:
    354 					printf(", info = %d (decimal)", info);
    355 				}
    356 			}
    357 			if (sense->extra_len != 0) {
    358 				int n;
    359 				printf(", data =");
    360 				for (n = 0; n < sense->extra_len; n++)
    361 					printf(" %02x",
    362 					    sense->cmd_spec_info[n]);
    363 			}
    364 			printf("\n");
    365 		}
    366 #endif
    367 		return (error);
    368 
    369 	/*
    370 	 * Not code 70, just report it
    371 	 */
    372 	default:
    373 		sc_link->sc_print_addr(sc_link);
    374 		printf("error code %d", sense->error_code & SSD_ERRCODE);
    375 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    376 			struct scsipi_sense_data_unextended *usense =
    377 			    (struct scsipi_sense_data_unextended *)sense;
    378 			printf(" at block no. %d (decimal)",
    379 			    _3btol(usense->block));
    380 		}
    381 		printf("\n");
    382 		return (EIO);
    383 	}
    384 }
    385 
    386 /*
    387  * Find out from the device what its capacity is.
    388  */
    389 u_long
    390 scsipi_size(sc_link, flags)
    391 	struct scsipi_link *sc_link;
    392 	int flags;
    393 {
    394 	struct scsipi_read_cap_data rdcap;
    395 	struct scsipi_read_capacity scsipi_cmd;
    396 
    397 	/*
    398 	 * make up a scsipi command and ask the scsipi driver to do
    399 	 * it for you.
    400 	 */
    401 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    402 	scsipi_cmd.opcode = READ_CAPACITY;
    403 
    404 	/*
    405 	 * If the command works, interpret the result as a 4 byte
    406 	 * number of blocks
    407 	 */
    408 	if (scsipi_command(sc_link, (struct scsipi_generic *)&scsipi_cmd,
    409 	    sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
    410 	    2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
    411 		sc_link->sc_print_addr(sc_link);
    412 		printf("could not get size\n");
    413 		return (0);
    414 	}
    415 
    416 	return (_4btol(rdcap.addr) + 1);
    417 }
    418 
    419 /*
    420  * Get scsipi driver to send a "are you ready?" command
    421  */
    422 int
    423 scsipi_test_unit_ready(sc_link, flags)
    424 	struct scsipi_link *sc_link;
    425 	int flags;
    426 {
    427 	struct scsipi_test_unit_ready scsipi_cmd;
    428 
    429 	/* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
    430 	if (sc_link->quirks & ADEV_NOTUR)
    431 		return (0);
    432 
    433 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    434 	scsipi_cmd.opcode = TEST_UNIT_READY;
    435 
    436 	return (scsipi_command(sc_link,
    437 	    (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
    438 	    0, 0, 2, 10000, NULL, flags));
    439 }
    440 
    441 /*
    442  * Do a scsipi operation asking a device what it is
    443  * Use the scsipi_cmd routine in the switch table.
    444  * XXX actually this is only used for scsi devices, because I have the feeling
    445  * that some atapi CDROM may not implement it, althouh it marked as mandatory
    446  * in the atapi specs.
    447  */
    448 int
    449 scsipi_inquire(sc_link, inqbuf, flags)
    450 	struct scsipi_link *sc_link;
    451 	struct scsipi_inquiry_data *inqbuf;
    452 	int flags;
    453 {
    454 	struct scsipi_inquiry scsipi_cmd;
    455 
    456 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    457 	scsipi_cmd.opcode = INQUIRY;
    458 	scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
    459 
    460 	return (scsipi_command(sc_link,
    461 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    462 	    (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
    463 	    2, 10000, NULL, SCSI_DATA_IN | flags));
    464 }
    465 
    466 /*
    467  * Prevent or allow the user to remove the media
    468  */
    469 int
    470 scsipi_prevent(sc_link, type, flags)
    471 	struct scsipi_link *sc_link;
    472 	int type, flags;
    473 {
    474 	struct scsipi_prevent scsipi_cmd;
    475 
    476 	if (sc_link->quirks & ADEV_NODOORLOCK)
    477 		return (0);
    478 
    479 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    480 	scsipi_cmd.opcode = PREVENT_ALLOW;
    481 	scsipi_cmd.how = type;
    482 	return (scsipi_command(sc_link,
    483 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    484 	    0, 0, 2, 5000, NULL, flags));
    485 }
    486 
    487 /*
    488  * Get scsipi driver to send a "start up" command
    489  */
    490 int
    491 scsipi_start(sc_link, type, flags)
    492 	struct scsipi_link *sc_link;
    493 	int type, flags;
    494 {
    495 	struct scsipi_start_stop scsipi_cmd;
    496 
    497 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    498 	scsipi_cmd.opcode = START_STOP;
    499 	scsipi_cmd.byte2 = 0x00;
    500 	scsipi_cmd.how = type;
    501 	return (scsipi_command(sc_link,
    502 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    503 	    0, 0, 2, type == SSS_START ? 30000 : 10000, NULL, flags));
    504 }
    505 
    506 /*
    507  * This routine is called by the scsipi interrupt when the transfer is
    508  * complete.
    509  */
    510 void
    511 scsipi_done(xs)
    512 	struct scsipi_xfer *xs;
    513 {
    514 	struct scsipi_link *sc_link = xs->sc_link;
    515 	struct buf *bp;
    516 	int error;
    517 
    518 	SC_DEBUG(sc_link, SDEV_DB2, ("scsipi_done\n"));
    519 #ifdef	SCSIDEBUG
    520 	if ((sc_link->flags & SDEV_DB1) != 0)
    521 		show_scsipi_cmd(xs);
    522 #endif /* SCSIDEBUG */
    523 
    524 	/*
    525 	 * If it's a user level request, bypass all usual completion
    526 	 * processing, let the user work it out..  We take
    527 	 * reponsibility for freeing the xs when the user returns.
    528 	 * (and restarting the device's queue).
    529 	 */
    530 	if ((xs->flags & SCSI_USER) != 0) {
    531 		SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
    532 		scsipi_user_done(xs); /* to take a copy of the sense etc. */
    533 		SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
    534 
    535 		/*
    536 		 * If this was an asynchronous operation (i.e. adapter
    537 		 * returned SUCCESSFULLY_QUEUED when the command was
    538 		 * submitted), we need to free the scsipi_xfer here.
    539 		 */
    540 		if (SCSIPI_XFER_ASYNC(xs))
    541 			scsipi_free_xs(xs, SCSI_NOSLEEP);
    542 		SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
    543 		return;
    544 	}
    545 
    546 	if (!SCSIPI_XFER_ASYNC(xs)) {
    547 		/*
    548 		 * if it's a normal upper level request, then ask
    549 		 * the upper level code to handle error checking
    550 		 * rather than doing it here at interrupt time
    551 		 */
    552 		wakeup(xs);
    553 		return;
    554 	}
    555 
    556 	/*
    557 	 * Go and handle errors now.
    558 	 * If it returns ERESTART then we should RETRY
    559 	 */
    560 retry:
    561 	error = sc_err1(xs, 1);
    562 	if (error == ERESTART)
    563 		switch (scsipi_command_direct(xs)) {
    564 		case SUCCESSFULLY_QUEUED:
    565 			return;
    566 
    567 		case TRY_AGAIN_LATER:
    568 			xs->error = XS_BUSY;
    569 		case COMPLETE:
    570 			goto retry;
    571 		}
    572 
    573 	bp = xs->bp;
    574 	if (bp) {
    575 		if (error) {
    576 			bp->b_error = error;
    577 			bp->b_flags |= B_ERROR;
    578 			bp->b_resid = bp->b_bcount;
    579 		} else {
    580 			bp->b_error = 0;
    581 			bp->b_resid = xs->resid;
    582 		}
    583 	}
    584 	if (sc_link->device->done) {
    585 		/*
    586 		 * Tell the device the operation is actually complete.
    587 		 * No more will happen with this xfer.  This for
    588 		 * notification of the upper-level driver only; they
    589 		 * won't be returning any meaningful information to us.
    590 		 */
    591 		(*sc_link->device->done)(xs);
    592 	}
    593 	/*
    594 	 * If this was an asynchronous operation (i.e. adapter
    595 	 * returned SUCCESSFULLY_QUEUED when the command was
    596 	 * submitted), we need to free the scsipi_xfer here.
    597 	 */
    598 	if (SCSIPI_XFER_ASYNC(xs))
    599 		scsipi_free_xs(xs, SCSI_NOSLEEP);
    600 	if (bp)
    601 		biodone(bp);
    602 }
    603 
    604 int
    605 scsipi_execute_xs(xs)
    606 	struct scsipi_xfer *xs;
    607 {
    608 	int async;
    609 	int error;
    610 	int s;
    611 
    612 	xs->flags &= ~ITSDONE;
    613 	xs->error = XS_NOERROR;
    614 	xs->resid = xs->datalen;
    615 	xs->status = 0;
    616 
    617 retry:
    618 	/*
    619 	 * Do the transfer. If we are polling we will return:
    620 	 * COMPLETE,  Was poll, and scsipi_done has been called
    621 	 * TRY_AGAIN_LATER, Adapter short resources, try again
    622 	 *
    623 	 * if under full steam (interrupts) it will return:
    624 	 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
    625 	 * TRY_AGAIN_LATER, (as for polling)
    626 	 * After the wakeup, we must still check if it succeeded
    627 	 *
    628 	 * If we have a SCSI_NOSLEEP (typically because we have a buf)
    629 	 * we just return.  All the error proccessing and the buffer
    630 	 * code both expect us to return straight to them, so as soon
    631 	 * as the command is queued, return.
    632 	 */
    633 #ifdef SCSIDEBUG
    634 	if (xs->sc_link->flags & SDEV_DB3) {
    635 		printf("scsipi_exec_cmd: ");
    636 		show_scsipi_xs(xs);
    637 		printf("\n");
    638 	}
    639 #endif
    640 	async = SCSIPI_XFER_ASYNC(xs);
    641 	switch (scsipi_command_direct(xs)) {
    642 	case SUCCESSFULLY_QUEUED:
    643 		if (async) {
    644 			/* scsipi_done() will free the scsipi_xfer. */
    645 			return (EJUSTRETURN);
    646 		}
    647 #ifdef DIAGNOSTIC
    648 		if (xs->flags & SCSI_NOSLEEP)
    649 			panic("scsipi_execute_xs: NOSLEEP and POLL");
    650 #endif
    651 		s = splbio();
    652 		while ((xs->flags & ITSDONE) == 0)
    653 			tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
    654 		splx(s);
    655 	case COMPLETE:		/* Polling command completed ok */
    656 		if (xs->bp)
    657 			return (0);
    658 	doit:
    659 		SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
    660 		if ((error = sc_err1(xs, 0)) != ERESTART)
    661 			return (error);
    662 		goto retry;
    663 
    664 	case TRY_AGAIN_LATER:	/* adapter resource shortage */
    665 		xs->error = XS_BUSY;
    666 		goto doit;
    667 
    668 	default:
    669 		panic("scsipi_execute_xs: invalid return code");
    670 	}
    671 
    672 #ifdef DIAGNOSTIC
    673 	panic("scsipi_execute_xs: impossible");
    674 #endif
    675 	return (EINVAL);
    676 }
    677 
    678 int
    679 sc_err1(xs, async)
    680 	struct scsipi_xfer *xs;
    681 	int async;
    682 {
    683 	int error;
    684 
    685 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
    686 
    687 	/*
    688 	 * If it has a buf, we might be working with
    689 	 * a request from the buffer cache or some other
    690 	 * piece of code that requires us to process
    691 	 * errors at inetrrupt time. We have probably
    692 	 * been called by scsipi_done()
    693 	 */
    694 	switch (xs->error) {
    695 	case XS_NOERROR:	/* nearly always hit this one */
    696 		error = 0;
    697 		break;
    698 
    699 	case XS_SENSE:
    700 	case XS_SHORTSENSE:
    701 		if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
    702 		    ERESTART)
    703 			goto retry;
    704 		SC_DEBUG(xs->sc_link, SDEV_DB3,
    705 		    ("scsipi_interpret_sense returned %d\n", error));
    706 		break;
    707 
    708 	case XS_BUSY:
    709 		if (xs->retries) {
    710 			if ((xs->flags & SCSI_POLL) != 0)
    711 				delay(1000000);
    712 			else if ((xs->flags & SCSI_NOSLEEP) == 0)
    713 				tsleep(&lbolt, PRIBIO, "scbusy", 0);
    714 			else
    715 #if 0
    716 				timeout(scsipi_requeue, xs, hz);
    717 #else
    718 				goto lose;
    719 #endif
    720 		}
    721 	case XS_TIMEOUT:
    722 	retry:
    723 		if (xs->retries) {
    724 			xs->retries--;
    725 			xs->error = XS_NOERROR;
    726 			xs->flags &= ~ITSDONE;
    727 			return (ERESTART);
    728 		}
    729 	case XS_DRIVER_STUFFUP:
    730 	lose:
    731 		error = EIO;
    732 		break;
    733 
    734 	case XS_SELTIMEOUT:
    735 		/* XXX Disable device? */
    736 		error = EIO;
    737 		break;
    738 
    739 	case XS_RESET:
    740 		if (xs->retries) {
    741 			SC_DEBUG(xs->sc_link, SDEV_DB3,
    742 			    ("restarting command destroyed by reset\n"));
    743 			goto retry;
    744 		}
    745 		error = EIO;
    746 		break;
    747 
    748 	default:
    749 		(*xs->sc_link->sc_print_addr)(xs->sc_link);
    750 		printf("unknown error category from scsipi driver\n");
    751 		error = EIO;
    752 		break;
    753 	}
    754 
    755 	return (error);
    756 }
    757 
    758 /*
    759  * Add a reference to the adapter pointed to by the provided
    760  * link, enabling the adapter if necessary.
    761  */
    762 int
    763 scsipi_adapter_addref(link)
    764 	struct scsipi_link *link;
    765 {
    766 	struct scsipi_adapter *adapter = link->adapter;
    767 	int s, error = 0;
    768 
    769 	s = splbio();
    770 	if (adapter->scsipi_refcnt++ == 0 &&
    771 	    adapter->scsipi_enable != NULL) {
    772 		error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
    773 		if (error)
    774 			adapter->scsipi_refcnt--;
    775 	}
    776 	splx(s);
    777 	return (error);
    778 }
    779 
    780 /*
    781  * Delete a reference to the adapter pointed to by the provided
    782  * link, disabling the adapter if possible.
    783  */
    784 void
    785 scsipi_adapter_delref(link)
    786 	struct scsipi_link *link;
    787 {
    788 	struct scsipi_adapter *adapter = link->adapter;
    789 	int s;
    790 
    791 	s = splbio();
    792 	if (adapter->scsipi_refcnt-- == 1 &&
    793 	    adapter->scsipi_enable != NULL)
    794 		(void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
    795 	splx(s);
    796 }
    797 
    798 #ifdef	SCSIDEBUG
    799 /*
    800  * Given a scsipi_xfer, dump the request, in all it's glory
    801  */
    802 void
    803 show_scsipi_xs(xs)
    804 	struct scsipi_xfer *xs;
    805 {
    806 
    807 	printf("xs(%p): ", xs);
    808 	printf("flg(0x%x)", xs->flags);
    809 	printf("sc_link(%p)", xs->sc_link);
    810 	printf("retr(0x%x)", xs->retries);
    811 	printf("timo(0x%x)", xs->timeout);
    812 	printf("cmd(%p)", xs->cmd);
    813 	printf("len(0x%x)", xs->cmdlen);
    814 	printf("data(%p)", xs->data);
    815 	printf("len(0x%x)", xs->datalen);
    816 	printf("res(0x%x)", xs->resid);
    817 	printf("err(0x%x)", xs->error);
    818 	printf("bp(%p)", xs->bp);
    819 	show_scsipi_cmd(xs);
    820 }
    821 
    822 void
    823 show_scsipi_cmd(xs)
    824 	struct scsipi_xfer *xs;
    825 {
    826 	u_char *b = (u_char *) xs->cmd;
    827 	int i = 0;
    828 
    829 	(*xs->sc_link->sc_print_addr)(xs->sc_link);
    830 	printf("command: ");
    831 
    832 	if ((xs->flags & SCSI_RESET) == 0) {
    833 		while (i < xs->cmdlen) {
    834 			if (i)
    835 				printf(",");
    836 			printf("0x%x", b[i++]);
    837 		}
    838 		printf("-[%d bytes]\n", xs->datalen);
    839 		if (xs->datalen)
    840 			show_mem(xs->data, min(64, xs->datalen));
    841 	} else
    842 		printf("-RESET-\n");
    843 }
    844 
    845 void
    846 show_mem(address, num)
    847 	u_char *address;
    848 	int num;
    849 {
    850 	int x;
    851 
    852 	printf("------------------------------");
    853 	for (x = 0; x < num; x++) {
    854 		if ((x % 16) == 0)
    855 			printf("\n%03d: ", x);
    856 		printf("%02x ", *address++);
    857 	}
    858 	printf("\n------------------------------\n");
    859 }
    860 #endif /*SCSIDEBUG */
    861