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