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