Home | History | Annotate | Line # | Download | only in scsipi
scsipi_base.c revision 1.17
      1 /*	$NetBSD: scsipi_base.c,v 1.17 1999/01/10 06:26:23 mjacob 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("Sense Error Code 0x%x",
    375 			sense->error_code & SSD_ERRCODE);
    376 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    377 			struct scsipi_sense_data_unextended *usense =
    378 			    (struct scsipi_sense_data_unextended *)sense;
    379 			printf(" at block no. %d (decimal)",
    380 			    _3btol(usense->block));
    381 		}
    382 		printf("\n");
    383 		return (EIO);
    384 	}
    385 }
    386 
    387 /*
    388  * Find out from the device what its capacity is.
    389  */
    390 u_long
    391 scsipi_size(sc_link, flags)
    392 	struct scsipi_link *sc_link;
    393 	int flags;
    394 {
    395 	struct scsipi_read_cap_data rdcap;
    396 	struct scsipi_read_capacity scsipi_cmd;
    397 
    398 	/*
    399 	 * make up a scsipi command and ask the scsipi driver to do
    400 	 * it for you.
    401 	 */
    402 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    403 	scsipi_cmd.opcode = READ_CAPACITY;
    404 
    405 	/*
    406 	 * If the command works, interpret the result as a 4 byte
    407 	 * number of blocks
    408 	 */
    409 	if (scsipi_command(sc_link, (struct scsipi_generic *)&scsipi_cmd,
    410 	    sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
    411 	    2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
    412 		sc_link->sc_print_addr(sc_link);
    413 		printf("could not get size\n");
    414 		return (0);
    415 	}
    416 
    417 	return (_4btol(rdcap.addr) + 1);
    418 }
    419 
    420 /*
    421  * Get scsipi driver to send a "are you ready?" command
    422  */
    423 int
    424 scsipi_test_unit_ready(sc_link, flags)
    425 	struct scsipi_link *sc_link;
    426 	int flags;
    427 {
    428 	struct scsipi_test_unit_ready scsipi_cmd;
    429 
    430 	/* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
    431 	if (sc_link->quirks & ADEV_NOTUR)
    432 		return (0);
    433 
    434 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    435 	scsipi_cmd.opcode = TEST_UNIT_READY;
    436 
    437 	return (scsipi_command(sc_link,
    438 	    (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
    439 	    0, 0, 2, 10000, NULL, flags));
    440 }
    441 
    442 /*
    443  * Do a scsipi operation asking a device what it is
    444  * Use the scsipi_cmd routine in the switch table.
    445  * XXX actually this is only used for scsi devices, because I have the feeling
    446  * that some atapi CDROM may not implement it, althouh it marked as mandatory
    447  * in the atapi specs.
    448  */
    449 int
    450 scsipi_inquire(sc_link, inqbuf, flags)
    451 	struct scsipi_link *sc_link;
    452 	struct scsipi_inquiry_data *inqbuf;
    453 	int flags;
    454 {
    455 	struct scsipi_inquiry scsipi_cmd;
    456 
    457 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    458 	scsipi_cmd.opcode = INQUIRY;
    459 	scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
    460 
    461 	return (scsipi_command(sc_link,
    462 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    463 	    (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
    464 	    2, 10000, NULL, SCSI_DATA_IN | flags));
    465 }
    466 
    467 /*
    468  * Prevent or allow the user to remove the media
    469  */
    470 int
    471 scsipi_prevent(sc_link, type, flags)
    472 	struct scsipi_link *sc_link;
    473 	int type, flags;
    474 {
    475 	struct scsipi_prevent scsipi_cmd;
    476 
    477 	if (sc_link->quirks & ADEV_NODOORLOCK)
    478 		return (0);
    479 
    480 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    481 	scsipi_cmd.opcode = PREVENT_ALLOW;
    482 	scsipi_cmd.how = type;
    483 	return (scsipi_command(sc_link,
    484 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    485 	    0, 0, 2, 5000, NULL, flags));
    486 }
    487 
    488 /*
    489  * Get scsipi driver to send a "start up" command
    490  */
    491 int
    492 scsipi_start(sc_link, type, flags)
    493 	struct scsipi_link *sc_link;
    494 	int type, flags;
    495 {
    496 	struct scsipi_start_stop scsipi_cmd;
    497 
    498 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    499 	scsipi_cmd.opcode = START_STOP;
    500 	scsipi_cmd.byte2 = 0x00;
    501 	scsipi_cmd.how = type;
    502 	return (scsipi_command(sc_link,
    503 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    504 	    0, 0, 2, type == SSS_START ? 30000 : 10000, NULL, flags));
    505 }
    506 
    507 /*
    508  * This routine is called by the scsipi interrupt when the transfer is
    509  * complete.
    510  */
    511 void
    512 scsipi_done(xs)
    513 	struct scsipi_xfer *xs;
    514 {
    515 	struct scsipi_link *sc_link = xs->sc_link;
    516 	struct buf *bp;
    517 	int error;
    518 
    519 	SC_DEBUG(sc_link, SDEV_DB2, ("scsipi_done\n"));
    520 #ifdef	SCSIDEBUG
    521 	if ((sc_link->flags & SDEV_DB1) != 0)
    522 		show_scsipi_cmd(xs);
    523 #endif /* SCSIDEBUG */
    524 
    525 	/*
    526 	 * If it's a user level request, bypass all usual completion
    527 	 * processing, let the user work it out..  We take
    528 	 * reponsibility for freeing the xs when the user returns.
    529 	 * (and restarting the device's queue).
    530 	 */
    531 	if ((xs->flags & SCSI_USER) != 0) {
    532 		SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
    533 		scsipi_user_done(xs); /* to take a copy of the sense etc. */
    534 		SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
    535 
    536 		/*
    537 		 * If this was an asynchronous operation (i.e. adapter
    538 		 * returned SUCCESSFULLY_QUEUED when the command was
    539 		 * submitted), we need to free the scsipi_xfer here.
    540 		 */
    541 		if (SCSIPI_XFER_ASYNC(xs))
    542 			scsipi_free_xs(xs, SCSI_NOSLEEP);
    543 		SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
    544 		return;
    545 	}
    546 
    547 	if (!SCSIPI_XFER_ASYNC(xs)) {
    548 		/*
    549 		 * if it's a normal upper level request, then ask
    550 		 * the upper level code to handle error checking
    551 		 * rather than doing it here at interrupt time
    552 		 */
    553 		wakeup(xs);
    554 		return;
    555 	}
    556 
    557 	/*
    558 	 * Go and handle errors now.
    559 	 * If it returns ERESTART then we should RETRY
    560 	 */
    561 retry:
    562 	error = sc_err1(xs, 1);
    563 	if (error == ERESTART)
    564 		switch (scsipi_command_direct(xs)) {
    565 		case SUCCESSFULLY_QUEUED:
    566 			return;
    567 
    568 		case TRY_AGAIN_LATER:
    569 			xs->error = XS_BUSY;
    570 		case COMPLETE:
    571 			goto retry;
    572 		}
    573 
    574 	bp = xs->bp;
    575 	if (bp) {
    576 		if (error) {
    577 			bp->b_error = error;
    578 			bp->b_flags |= B_ERROR;
    579 			bp->b_resid = bp->b_bcount;
    580 		} else {
    581 			bp->b_error = 0;
    582 			bp->b_resid = xs->resid;
    583 		}
    584 	}
    585 	if (sc_link->device->done) {
    586 		/*
    587 		 * Tell the device the operation is actually complete.
    588 		 * No more will happen with this xfer.  This for
    589 		 * notification of the upper-level driver only; they
    590 		 * won't be returning any meaningful information to us.
    591 		 */
    592 		(*sc_link->device->done)(xs);
    593 	}
    594 	/*
    595 	 * If this was an asynchronous operation (i.e. adapter
    596 	 * returned SUCCESSFULLY_QUEUED when the command was
    597 	 * submitted), we need to free the scsipi_xfer here.
    598 	 */
    599 	if (SCSIPI_XFER_ASYNC(xs))
    600 		scsipi_free_xs(xs, SCSI_NOSLEEP);
    601 	if (bp)
    602 		biodone(bp);
    603 }
    604 
    605 int
    606 scsipi_execute_xs(xs)
    607 	struct scsipi_xfer *xs;
    608 {
    609 	int async;
    610 	int error;
    611 	int s;
    612 
    613 	xs->flags &= ~ITSDONE;
    614 	xs->error = XS_NOERROR;
    615 	xs->resid = xs->datalen;
    616 	xs->status = 0;
    617 
    618 retry:
    619 	/*
    620 	 * Do the transfer. If we are polling we will return:
    621 	 * COMPLETE,  Was poll, and scsipi_done has been called
    622 	 * TRY_AGAIN_LATER, Adapter short resources, try again
    623 	 *
    624 	 * if under full steam (interrupts) it will return:
    625 	 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
    626 	 * TRY_AGAIN_LATER, (as for polling)
    627 	 * After the wakeup, we must still check if it succeeded
    628 	 *
    629 	 * If we have a SCSI_NOSLEEP (typically because we have a buf)
    630 	 * we just return.  All the error proccessing and the buffer
    631 	 * code both expect us to return straight to them, so as soon
    632 	 * as the command is queued, return.
    633 	 */
    634 #ifdef SCSIDEBUG
    635 	if (xs->sc_link->flags & SDEV_DB3) {
    636 		printf("scsipi_exec_cmd: ");
    637 		show_scsipi_xs(xs);
    638 		printf("\n");
    639 	}
    640 #endif
    641 	async = SCSIPI_XFER_ASYNC(xs);
    642 	switch (scsipi_command_direct(xs)) {
    643 	case SUCCESSFULLY_QUEUED:
    644 		if (async) {
    645 			/* scsipi_done() will free the scsipi_xfer. */
    646 			return (EJUSTRETURN);
    647 		}
    648 #ifdef DIAGNOSTIC
    649 		if (xs->flags & SCSI_NOSLEEP)
    650 			panic("scsipi_execute_xs: NOSLEEP and POLL");
    651 #endif
    652 		s = splbio();
    653 		while ((xs->flags & ITSDONE) == 0)
    654 			tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
    655 		splx(s);
    656 	case COMPLETE:		/* Polling command completed ok */
    657 		if (xs->bp)
    658 			return (0);
    659 	doit:
    660 		SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
    661 		if ((error = sc_err1(xs, 0)) != ERESTART)
    662 			return (error);
    663 		goto retry;
    664 
    665 	case TRY_AGAIN_LATER:	/* adapter resource shortage */
    666 		xs->error = XS_BUSY;
    667 		goto doit;
    668 
    669 	default:
    670 		panic("scsipi_execute_xs: invalid return code");
    671 	}
    672 
    673 #ifdef DIAGNOSTIC
    674 	panic("scsipi_execute_xs: impossible");
    675 #endif
    676 	return (EINVAL);
    677 }
    678 
    679 int
    680 sc_err1(xs, async)
    681 	struct scsipi_xfer *xs;
    682 	int async;
    683 {
    684 	int error;
    685 
    686 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
    687 
    688 	/*
    689 	 * If it has a buf, we might be working with
    690 	 * a request from the buffer cache or some other
    691 	 * piece of code that requires us to process
    692 	 * errors at inetrrupt time. We have probably
    693 	 * been called by scsipi_done()
    694 	 */
    695 	switch (xs->error) {
    696 	case XS_NOERROR:	/* nearly always hit this one */
    697 		error = 0;
    698 		break;
    699 
    700 	case XS_SENSE:
    701 	case XS_SHORTSENSE:
    702 		if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
    703 		    ERESTART)
    704 			goto retry;
    705 		SC_DEBUG(xs->sc_link, SDEV_DB3,
    706 		    ("scsipi_interpret_sense returned %d\n", error));
    707 		break;
    708 
    709 	case XS_BUSY:
    710 		if (xs->retries) {
    711 			if ((xs->flags & SCSI_POLL) != 0)
    712 				delay(1000000);
    713 			else if ((xs->flags & SCSI_NOSLEEP) == 0)
    714 				tsleep(&lbolt, PRIBIO, "scbusy", 0);
    715 			else
    716 #if 0
    717 				timeout(scsipi_requeue, xs, hz);
    718 #else
    719 				goto lose;
    720 #endif
    721 		}
    722 	case XS_TIMEOUT:
    723 	retry:
    724 		if (xs->retries) {
    725 			xs->retries--;
    726 			xs->error = XS_NOERROR;
    727 			xs->flags &= ~ITSDONE;
    728 			return (ERESTART);
    729 		}
    730 	case XS_DRIVER_STUFFUP:
    731 	lose:
    732 		error = EIO;
    733 		break;
    734 
    735 	case XS_SELTIMEOUT:
    736 		/* XXX Disable device? */
    737 		error = EIO;
    738 		break;
    739 
    740 	case XS_RESET:
    741 		if (xs->retries) {
    742 			SC_DEBUG(xs->sc_link, SDEV_DB3,
    743 			    ("restarting command destroyed by reset\n"));
    744 			goto retry;
    745 		}
    746 		error = EIO;
    747 		break;
    748 
    749 	default:
    750 		(*xs->sc_link->sc_print_addr)(xs->sc_link);
    751 		printf("unknown error category from scsipi driver\n");
    752 		error = EIO;
    753 		break;
    754 	}
    755 
    756 	return (error);
    757 }
    758 
    759 /*
    760  * Add a reference to the adapter pointed to by the provided
    761  * link, enabling the adapter if necessary.
    762  */
    763 int
    764 scsipi_adapter_addref(link)
    765 	struct scsipi_link *link;
    766 {
    767 	struct scsipi_adapter *adapter = link->adapter;
    768 	int s, error = 0;
    769 
    770 	s = splbio();
    771 	if (adapter->scsipi_refcnt++ == 0 &&
    772 	    adapter->scsipi_enable != NULL) {
    773 		error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
    774 		if (error)
    775 			adapter->scsipi_refcnt--;
    776 	}
    777 	splx(s);
    778 	return (error);
    779 }
    780 
    781 /*
    782  * Delete a reference to the adapter pointed to by the provided
    783  * link, disabling the adapter if possible.
    784  */
    785 void
    786 scsipi_adapter_delref(link)
    787 	struct scsipi_link *link;
    788 {
    789 	struct scsipi_adapter *adapter = link->adapter;
    790 	int s;
    791 
    792 	s = splbio();
    793 	if (adapter->scsipi_refcnt-- == 1 &&
    794 	    adapter->scsipi_enable != NULL)
    795 		(void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
    796 	splx(s);
    797 }
    798 
    799 #ifdef	SCSIDEBUG
    800 /*
    801  * Given a scsipi_xfer, dump the request, in all it's glory
    802  */
    803 void
    804 show_scsipi_xs(xs)
    805 	struct scsipi_xfer *xs;
    806 {
    807 
    808 	printf("xs(%p): ", xs);
    809 	printf("flg(0x%x)", xs->flags);
    810 	printf("sc_link(%p)", xs->sc_link);
    811 	printf("retr(0x%x)", xs->retries);
    812 	printf("timo(0x%x)", xs->timeout);
    813 	printf("cmd(%p)", xs->cmd);
    814 	printf("len(0x%x)", xs->cmdlen);
    815 	printf("data(%p)", xs->data);
    816 	printf("len(0x%x)", xs->datalen);
    817 	printf("res(0x%x)", xs->resid);
    818 	printf("err(0x%x)", xs->error);
    819 	printf("bp(%p)", xs->bp);
    820 	show_scsipi_cmd(xs);
    821 }
    822 
    823 void
    824 show_scsipi_cmd(xs)
    825 	struct scsipi_xfer *xs;
    826 {
    827 	u_char *b = (u_char *) xs->cmd;
    828 	int i = 0;
    829 
    830 	(*xs->sc_link->sc_print_addr)(xs->sc_link);
    831 	printf("command: ");
    832 
    833 	if ((xs->flags & SCSI_RESET) == 0) {
    834 		while (i < xs->cmdlen) {
    835 			if (i)
    836 				printf(",");
    837 			printf("0x%x", b[i++]);
    838 		}
    839 		printf("-[%d bytes]\n", xs->datalen);
    840 		if (xs->datalen)
    841 			show_mem(xs->data, min(64, xs->datalen));
    842 	} else
    843 		printf("-RESET-\n");
    844 }
    845 
    846 void
    847 show_mem(address, num)
    848 	u_char *address;
    849 	int num;
    850 {
    851 	int x;
    852 
    853 	printf("------------------------------");
    854 	for (x = 0; x < num; x++) {
    855 		if ((x % 16) == 0)
    856 			printf("\n%03d: ", x);
    857 		printf("%02x ", *address++);
    858 	}
    859 	printf("\n------------------------------\n");
    860 }
    861 #endif /*SCSIDEBUG */
    862