Home | History | Annotate | Line # | Download | only in scsipi
scsipi_base.c revision 1.33
      1 /*	$NetBSD: scsipi_base.c,v 1.33 2000/04/03 01:40:51 enami 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 XS_CTL_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 	/*
    101 	 * If we're cold, make sure we poll.
    102 	 */
    103 	if (cold)
    104 		flags |= XS_CTL_NOSLEEP | XS_CTL_POLL;
    105 
    106 	s = splbio();
    107 	while (sc_link->active >= sc_link->openings) {
    108 		SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
    109 		if ((flags & XS_CTL_NOSLEEP) != 0) {
    110 			splx(s);
    111 			return (0);
    112 		}
    113 		sc_link->flags |= SDEV_WAITING;
    114 		(void)tsleep(sc_link, PRIBIO, "getxs", 0);
    115 	}
    116 	SC_DEBUG(sc_link, SDEV_DB3, ("calling pool_get\n"));
    117 	xs = pool_get(&scsipi_xfer_pool,
    118 	    ((flags & XS_CTL_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
    119 	if (xs != NULL)
    120 		sc_link->active++;
    121 	else {
    122 		(*sc_link->sc_print_addr)(sc_link);
    123 		printf("cannot allocate scsipi xs\n");
    124 	}
    125 	splx(s);
    126 
    127 	SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
    128 
    129 	/*
    130 	 * zeroes out the command, as ATAPI may use longer commands
    131 	 * than SCSI
    132 	 */
    133 	if (xs != NULL) {
    134 		callout_init(&xs->xs_callout);
    135 		xs->xs_control = flags;
    136 		TAILQ_INSERT_TAIL(&sc_link->pending_xfers, xs, device_q);
    137 		bzero(&xs->cmdstore, sizeof(xs->cmdstore));
    138 	}
    139 	return (xs);
    140 }
    141 
    142 /*
    143  * Given a scsipi_xfer struct, and a device (referenced through sc_link)
    144  * return the struct to the free pool and credit the device with it
    145  * If another process is waiting for an xs, do a wakeup, let it proceed
    146  *
    147  * MUST BE CALLED AT splbio()!!
    148  */
    149 void
    150 scsipi_free_xs(xs, flags)
    151 	struct scsipi_xfer *xs;
    152 	int flags;
    153 {
    154 	struct scsipi_link *sc_link = xs->sc_link;
    155 
    156 	TAILQ_REMOVE(&sc_link->pending_xfers, xs, device_q);
    157 	if (TAILQ_FIRST(&sc_link->pending_xfers) == NULL &&
    158 	    (sc_link->flags & SDEV_WAITDRAIN) != 0) {
    159 		sc_link->flags &= ~SDEV_WAITDRAIN;
    160 		wakeup(&sc_link->pending_xfers);
    161 	}
    162 	pool_put(&scsipi_xfer_pool, xs);
    163 
    164 	SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_free_xs\n"));
    165 	/* if was 0 and someone waits, wake them up */
    166 	sc_link->active--;
    167 	if ((sc_link->flags & SDEV_WAITING) != 0) {
    168 		sc_link->flags &= ~SDEV_WAITING;
    169 		wakeup(sc_link);
    170 	} else {
    171 		if (sc_link->device->start) {
    172 			SC_DEBUG(sc_link, SDEV_DB2,
    173 			    ("calling private start()\n"));
    174 			(*(sc_link->device->start))(sc_link->device_softc);
    175 		}
    176 	}
    177 }
    178 
    179 /*
    180  * Wait for a scsipi_link's pending xfers to drain.
    181  */
    182 void
    183 scsipi_wait_drain(sc_link)
    184 	struct scsipi_link *sc_link;
    185 {
    186 	int s;
    187 
    188 	s = splbio();
    189 	while (TAILQ_FIRST(&sc_link->pending_xfers) != NULL) {
    190 		sc_link->flags |= SDEV_WAITDRAIN;
    191 		(void) tsleep(&sc_link->pending_xfers, PRIBIO, "sxdrn", 0);
    192 	}
    193 	splx(s);
    194 }
    195 
    196 /*
    197  * Kill off all pending xfers for a scsipi_link.
    198  *
    199  * Must be called at splbio().
    200  */
    201 void
    202 scsipi_kill_pending(sc_link)
    203 	struct scsipi_link *sc_link;
    204 {
    205 
    206 	(*sc_link->scsipi_kill_pending)(sc_link);
    207 #ifdef DIAGNOSTIC
    208 	if (TAILQ_FIRST(&sc_link->pending_xfers) != NULL)
    209 		panic("scsipi_kill_pending");
    210 #endif
    211 }
    212 
    213 /*
    214  * Look at the returned sense and act on the error, determining
    215  * the unix error number to pass back.  (0 = report no error)
    216  *
    217  * THIS IS THE DEFAULT ERROR HANDLER FOR SCSI DEVICES
    218  */
    219 int
    220 scsipi_interpret_sense(xs)
    221 	struct scsipi_xfer *xs;
    222 {
    223 	struct scsipi_sense_data *sense;
    224 	struct scsipi_link *sc_link = xs->sc_link;
    225 	u_int8_t key;
    226 	u_int32_t info;
    227 	int error;
    228 #ifndef	SCSIVERBOSE
    229 	static char *error_mes[] = {
    230 		"soft error (corrected)",
    231 		"not ready", "medium error",
    232 		"non-media hardware failure", "illegal request",
    233 		"unit attention", "readonly device",
    234 		"no data found", "vendor unique",
    235 		"copy aborted", "command aborted",
    236 		"search returned equal", "volume overflow",
    237 		"verify miscompare", "unknown error key"
    238 	};
    239 #endif
    240 
    241 	sense = &xs->sense.scsi_sense;
    242 #ifdef	SCSIDEBUG
    243 	if ((sc_link->flags & SDEV_DB1) != 0) {
    244 		int count;
    245 		printf("code 0x%x valid 0x%x ",
    246 			sense->error_code & SSD_ERRCODE,
    247 			sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
    248 		printf("seg 0x%x key 0x%x ili 0x%x eom 0x%x fmark 0x%x\n",
    249 			sense->segment,
    250 			sense->flags & SSD_KEY,
    251 			sense->flags & SSD_ILI ? 1 : 0,
    252 			sense->flags & SSD_EOM ? 1 : 0,
    253 			sense->flags & SSD_FILEMARK ? 1 : 0);
    254 		printf("info: 0x%x 0x%x 0x%x 0x%x followed by %d extra bytes\n",
    255 			sense->info[0],
    256 			sense->info[1],
    257 			sense->info[2],
    258 			sense->info[3],
    259 			sense->extra_len);
    260 		printf("extra: ");
    261 		for (count = 0; count < ADD_BYTES_LIM(sense); count++)
    262 			printf("0x%x ", sense->cmd_spec_info[count]);
    263 		printf("\n");
    264 	}
    265 #endif	/* SCSIDEBUG */
    266 	/*
    267 	 * If the device has it's own error handler, call it first.
    268 	 * If it returns a legit error value, return that, otherwise
    269 	 * it wants us to continue with normal error processing.
    270 	 */
    271 	if (sc_link->device->err_handler) {
    272 		SC_DEBUG(sc_link, SDEV_DB2,
    273 		    ("calling private err_handler()\n"));
    274 		error = (*sc_link->device->err_handler)(xs);
    275 		if (error != SCSIRET_CONTINUE)
    276 			return (error);		/* error >= 0  better ? */
    277 	}
    278 	/* otherwise use the default */
    279 	switch (sense->error_code & SSD_ERRCODE) {
    280 		/*
    281 		 * If it's code 70, use the extended stuff and
    282 		 * interpret the key
    283 		 */
    284 	case 0x71:		/* delayed error */
    285 		sc_link->sc_print_addr(sc_link);
    286 		key = sense->flags & SSD_KEY;
    287 		printf(" DEFERRED ERROR, key = 0x%x\n", key);
    288 		/* FALLTHROUGH */
    289 	case 0x70:
    290 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0)
    291 			info = _4btol(sense->info);
    292 		else
    293 			info = 0;
    294 		key = sense->flags & SSD_KEY;
    295 
    296 		switch (key) {
    297 		case SKEY_NO_SENSE:
    298 		case SKEY_RECOVERED_ERROR:
    299 			if (xs->resid == xs->datalen && xs->datalen) {
    300 				/*
    301 				 * Why is this here?
    302 				 */
    303 				xs->resid = 0;	/* not short read */
    304 			}
    305 		case SKEY_EQUAL:
    306 			error = 0;
    307 			break;
    308 		case SKEY_NOT_READY:
    309 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    310 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    311 			if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
    312 				return (0);
    313 			if (sense->add_sense_code == 0x3A &&
    314 			    sense->add_sense_code_qual == 0x00)
    315 				error = ENODEV; /* Medium not present */
    316 			else
    317 				error = EIO;
    318 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    319 				return (error);
    320 			break;
    321 		case SKEY_ILLEGAL_REQUEST:
    322 			if ((xs->xs_control &
    323 			     XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
    324 				return (0);
    325 			/*
    326 			 * Handle the case where a device reports
    327 			 * Logical Unit Not Supported during discovery.
    328 			 */
    329 			if ((xs->xs_control & XS_CTL_DISCOVERY) != 0 &&
    330 			    sense->add_sense_code == 0x25 &&
    331 			    sense->add_sense_code_qual == 0x00)
    332 				return (EINVAL);
    333 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    334 				return (EIO);
    335 			error = EINVAL;
    336 			break;
    337 		case SKEY_UNIT_ATTENTION:
    338 			if (sense->add_sense_code == 0x29 &&
    339 			    sense->add_sense_code_qual == 0x00)
    340 				return (ERESTART); /* device or bus reset */
    341 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    342 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    343 			if ((xs->xs_control &
    344 			     XS_CTL_IGNORE_MEDIA_CHANGE) != 0 ||
    345 				/* XXX Should reupload any transient state. */
    346 				(sc_link->flags & SDEV_REMOVABLE) == 0)
    347 				return (ERESTART);
    348 			if ((xs->xs_control & XS_CTL_SILENT) != 0)
    349 				return (EIO);
    350 			error = EIO;
    351 			break;
    352 		case SKEY_WRITE_PROTECT:
    353 			error = EROFS;
    354 			break;
    355 		case SKEY_BLANK_CHECK:
    356 			error = 0;
    357 			break;
    358 		case SKEY_ABORTED_COMMAND:
    359 			error = ERESTART;
    360 			break;
    361 		case SKEY_VOLUME_OVERFLOW:
    362 			error = ENOSPC;
    363 			break;
    364 		default:
    365 			error = EIO;
    366 			break;
    367 		}
    368 
    369 #ifdef SCSIVERBOSE
    370 		if (key && (xs->xs_control & XS_CTL_SILENT) == 0)
    371 			scsipi_print_sense(xs, 0);
    372 #else
    373 		if (key) {
    374 			sc_link->sc_print_addr(sc_link);
    375 			printf("%s", error_mes[key - 1]);
    376 			if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    377 				switch (key) {
    378 				case SKEY_NOT_READY:
    379 				case SKEY_ILLEGAL_REQUEST:
    380 				case SKEY_UNIT_ATTENTION:
    381 				case SKEY_WRITE_PROTECT:
    382 					break;
    383 				case SKEY_BLANK_CHECK:
    384 					printf(", requested size: %d (decimal)",
    385 					    info);
    386 					break;
    387 				case SKEY_ABORTED_COMMAND:
    388 					if (xs->retries)
    389 						printf(", retrying");
    390 					printf(", cmd 0x%x, info 0x%x",
    391 					    xs->cmd->opcode, info);
    392 					break;
    393 				default:
    394 					printf(", info = %d (decimal)", info);
    395 				}
    396 			}
    397 			if (sense->extra_len != 0) {
    398 				int n;
    399 				printf(", data =");
    400 				for (n = 0; n < sense->extra_len; n++)
    401 					printf(" %02x",
    402 					    sense->cmd_spec_info[n]);
    403 			}
    404 			printf("\n");
    405 		}
    406 #endif
    407 		return (error);
    408 
    409 	/*
    410 	 * Not code 70, just report it
    411 	 */
    412 	default:
    413 #if	defined(SCSIDEBUG) || defined(DEBUG)
    414 	{
    415 		static char *uc = "undecodable sense error";
    416 		int i;
    417 		u_int8_t *cptr = (u_int8_t *) sense;
    418 		sc_link->sc_print_addr(sc_link);
    419 		if (xs->cmd == &xs->cmdstore) {
    420 			printf("%s for opcode 0x%x, data=",
    421 			    uc, xs->cmdstore.opcode);
    422 		} else {
    423 			printf("%s, data=", uc);
    424 		}
    425 		for (i = 0; i < sizeof (sense); i++)
    426 			printf(" 0x%02x", *(cptr++) & 0xff);
    427 		printf("\n");
    428 	}
    429 #else
    430 		sc_link->sc_print_addr(sc_link);
    431 		printf("Sense Error Code 0x%x",
    432 			sense->error_code & SSD_ERRCODE);
    433 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    434 			struct scsipi_sense_data_unextended *usense =
    435 			    (struct scsipi_sense_data_unextended *)sense;
    436 			printf(" at block no. %d (decimal)",
    437 			    _3btol(usense->block));
    438 		}
    439 		printf("\n");
    440 #endif
    441 		return (EIO);
    442 	}
    443 }
    444 
    445 /*
    446  * Find out from the device what its capacity is.
    447  */
    448 u_long
    449 scsipi_size(sc_link, flags)
    450 	struct scsipi_link *sc_link;
    451 	int flags;
    452 {
    453 	struct scsipi_read_cap_data rdcap;
    454 	struct scsipi_read_capacity scsipi_cmd;
    455 
    456 	/*
    457 	 * make up a scsipi command and ask the scsipi driver to do
    458 	 * it for you.
    459 	 */
    460 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    461 	scsipi_cmd.opcode = READ_CAPACITY;
    462 
    463 	/*
    464 	 * If the command works, interpret the result as a 4 byte
    465 	 * number of blocks
    466 	 */
    467 	if (scsipi_command(sc_link, (struct scsipi_generic *)&scsipi_cmd,
    468 	    sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
    469 	    SCSIPIRETRIES, 20000, NULL, flags | XS_CTL_DATA_IN) != 0) {
    470 		sc_link->sc_print_addr(sc_link);
    471 		printf("could not get size\n");
    472 		return (0);
    473 	}
    474 
    475 	return (_4btol(rdcap.addr) + 1);
    476 }
    477 
    478 /*
    479  * Get scsipi driver to send a "are you ready?" command
    480  */
    481 int
    482 scsipi_test_unit_ready(sc_link, flags)
    483 	struct scsipi_link *sc_link;
    484 	int flags;
    485 {
    486 	struct scsipi_test_unit_ready scsipi_cmd;
    487 
    488 	/* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
    489 	if (sc_link->quirks & ADEV_NOTUR)
    490 		return (0);
    491 
    492 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    493 	scsipi_cmd.opcode = TEST_UNIT_READY;
    494 
    495 	return (scsipi_command(sc_link,
    496 	    (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
    497 	    0, 0, SCSIPIRETRIES, 10000, NULL, flags));
    498 }
    499 
    500 /*
    501  * Do a scsipi operation asking a device what it is
    502  * Use the scsipi_cmd routine in the switch table.
    503  * XXX actually this is only used for scsi devices, because I have the feeling
    504  * that some atapi CDROM may not implement it, althouh it marked as mandatory
    505  * in the atapi specs.
    506  */
    507 int
    508 scsipi_inquire(sc_link, inqbuf, flags)
    509 	struct scsipi_link *sc_link;
    510 	struct scsipi_inquiry_data *inqbuf;
    511 	int flags;
    512 {
    513 	struct scsipi_inquiry scsipi_cmd;
    514 
    515 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    516 	scsipi_cmd.opcode = INQUIRY;
    517 	scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
    518 
    519 	return (scsipi_command(sc_link,
    520 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    521 	    (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
    522 	    SCSIPIRETRIES, 10000, NULL, XS_CTL_DATA_IN | flags));
    523 }
    524 
    525 /*
    526  * Prevent or allow the user to remove the media
    527  */
    528 int
    529 scsipi_prevent(sc_link, type, flags)
    530 	struct scsipi_link *sc_link;
    531 	int type, flags;
    532 {
    533 	struct scsipi_prevent scsipi_cmd;
    534 
    535 	if (sc_link->quirks & ADEV_NODOORLOCK)
    536 		return (0);
    537 
    538 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    539 	scsipi_cmd.opcode = PREVENT_ALLOW;
    540 	scsipi_cmd.how = type;
    541 	return (scsipi_command(sc_link,
    542 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    543 	    0, 0, SCSIPIRETRIES, 5000, NULL, flags));
    544 }
    545 
    546 /*
    547  * Get scsipi driver to send a "start up" command
    548  */
    549 int
    550 scsipi_start(sc_link, type, flags)
    551 	struct scsipi_link *sc_link;
    552 	int type, flags;
    553 {
    554 	struct scsipi_start_stop scsipi_cmd;
    555 
    556 	if (sc_link->quirks & SDEV_NOSTARTUNIT)
    557 		return 0;
    558 
    559 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
    560 	scsipi_cmd.opcode = START_STOP;
    561 	scsipi_cmd.byte2 = 0x00;
    562 	scsipi_cmd.how = type;
    563 	return (scsipi_command(sc_link,
    564 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
    565 	    0, 0, SCSIPIRETRIES, (type & SSS_START) ? 60000 : 10000,
    566 	    NULL, flags));
    567 }
    568 
    569 /*
    570  * This routine is called by the scsipi interrupt when the transfer is
    571  * complete.
    572  */
    573 void
    574 scsipi_done(xs)
    575 	struct scsipi_xfer *xs;
    576 {
    577 	struct scsipi_link *sc_link = xs->sc_link;
    578 	struct buf *bp;
    579 	int error, s;
    580 
    581 	SC_DEBUG(sc_link, SDEV_DB2, ("scsipi_done\n"));
    582 #ifdef	SCSIDEBUG
    583 	if ((sc_link->flags & SDEV_DB1) != 0)
    584 		show_scsipi_cmd(xs);
    585 #endif /* SCSIDEBUG */
    586 
    587 	/*
    588 	 * If it's a user level request, bypass all usual completion
    589 	 * processing, let the user work it out..  We take
    590 	 * reponsibility for freeing the xs when the user returns.
    591 	 * (and restarting the device's queue).
    592 	 */
    593 	if ((xs->xs_control & XS_CTL_USERCMD) != 0) {
    594 		SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
    595 		scsipi_user_done(xs); /* to take a copy of the sense etc. */
    596 		SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
    597 
    598 		/*
    599 		 * If this was an asynchronous operation (i.e. adapter
    600 		 * returned SUCCESSFULLY_QUEUED when the command was
    601 		 * submitted), we need to free the scsipi_xfer here.
    602 		 */
    603 		if (xs->xs_control & XS_CTL_ASYNC) {
    604 			s = splbio();
    605 			scsipi_free_xs(xs, XS_CTL_NOSLEEP);
    606 			splx(s);
    607 		}
    608 		SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
    609 		return;
    610 	}
    611 
    612 	if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
    613 		/*
    614 		 * if it's a normal upper level request, then ask
    615 		 * the upper level code to handle error checking
    616 		 * rather than doing it here at interrupt time
    617 		 */
    618 		wakeup(xs);
    619 		return;
    620 	}
    621 
    622 	/*
    623 	 * Go and handle errors now.
    624 	 * If it returns ERESTART then we should RETRY
    625 	 */
    626 retry:
    627 	error = sc_err1(xs, 1);
    628 	if (error == ERESTART) {
    629 		switch (scsipi_command_direct(xs)) {
    630 		case SUCCESSFULLY_QUEUED:
    631 			return;
    632 
    633 		case TRY_AGAIN_LATER:
    634 			xs->error = XS_BUSY;
    635 		case COMPLETE:
    636 			goto retry;
    637 		}
    638 	}
    639 
    640 	bp = xs->bp;
    641 	if (bp) {
    642 		if (error) {
    643 			bp->b_error = error;
    644 			bp->b_flags |= B_ERROR;
    645 			bp->b_resid = bp->b_bcount;
    646 		} else {
    647 			bp->b_error = 0;
    648 			bp->b_resid = xs->resid;
    649 		}
    650 	}
    651 	if (sc_link->device->done) {
    652 		/*
    653 		 * Tell the device the operation is actually complete.
    654 		 * No more will happen with this xfer.  This for
    655 		 * notification of the upper-level driver only; they
    656 		 * won't be returning any meaningful information to us.
    657 		 */
    658 		(*sc_link->device->done)(xs);
    659 	}
    660 	/*
    661 	 * If this was an asynchronous operation (i.e. adapter
    662 	 * returned SUCCESSFULLY_QUEUED when the command was
    663 	 * submitted), we need to free the scsipi_xfer here.
    664 	 */
    665 	if (xs->xs_control & XS_CTL_ASYNC) {
    666 		s = splbio();
    667 		scsipi_free_xs(xs, XS_CTL_NOSLEEP);
    668 		splx(s);
    669 	}
    670 	if (bp)
    671 		biodone(bp);
    672 }
    673 
    674 int
    675 scsipi_execute_xs(xs)
    676 	struct scsipi_xfer *xs;
    677 {
    678 	int async;
    679 	int error;
    680 	int s;
    681 
    682 	xs->xs_status &= ~XS_STS_DONE;
    683 	xs->error = XS_NOERROR;
    684 	xs->resid = xs->datalen;
    685 	xs->status = 0;
    686 
    687 retry:
    688 	/*
    689 	 * Do the transfer. If we are polling we will return:
    690 	 * COMPLETE,  Was poll, and scsipi_done has been called
    691 	 * TRY_AGAIN_LATER, Adapter short resources, try again
    692 	 *
    693 	 * if under full steam (interrupts) it will return:
    694 	 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
    695 	 * TRY_AGAIN_LATER, (as for polling)
    696 	 * After the wakeup, we must still check if it succeeded
    697 	 *
    698 	 * If we have a XS_CTL_ASYNC (typically because we have a buf)
    699 	 * we just return.  All the error proccessing and the buffer
    700 	 * code both expect us to return straight to them, so as soon
    701 	 * as the command is queued, return.
    702 	 */
    703 #ifdef SCSIDEBUG
    704 	if (xs->sc_link->flags & SDEV_DB3) {
    705 		printf("scsipi_exec_cmd: ");
    706 		show_scsipi_xs(xs);
    707 		printf("\n");
    708 	}
    709 #endif
    710 	async = (xs->xs_control & XS_CTL_ASYNC);
    711 	switch (scsipi_command_direct(xs)) {
    712 	case SUCCESSFULLY_QUEUED:
    713 		if (async) {
    714 			/* scsipi_done() will free the scsipi_xfer. */
    715 			return (EJUSTRETURN);
    716 		}
    717 #ifdef DIAGNOSTIC
    718 		if (xs->xs_control & XS_CTL_ASYNC)
    719 			panic("scsipi_execute_xs: ASYNC and POLL");
    720 #endif
    721 		s = splbio();
    722 		while ((xs->xs_status & XS_STS_DONE) == 0)
    723 			tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
    724 		splx(s);
    725 	case COMPLETE:		/* Polling command completed ok */
    726 		if (xs->bp)
    727 			return (0);
    728 	doit:
    729 		SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
    730 		if ((error = sc_err1(xs, 0)) != ERESTART)
    731 			return (error);
    732 		goto retry;
    733 
    734 	case TRY_AGAIN_LATER:	/* adapter resource shortage */
    735 		xs->error = XS_BUSY;
    736 		goto doit;
    737 
    738 	default:
    739 		panic("scsipi_execute_xs: invalid return code");
    740 	}
    741 
    742 #ifdef DIAGNOSTIC
    743 	panic("scsipi_execute_xs: impossible");
    744 #endif
    745 	return (EINVAL);
    746 }
    747 
    748 int
    749 sc_err1(xs, async)
    750 	struct scsipi_xfer *xs;
    751 	int async;
    752 {
    753 	int error;
    754 
    755 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
    756 
    757 	/*
    758 	 * If it has a buf, we might be working with
    759 	 * a request from the buffer cache or some other
    760 	 * piece of code that requires us to process
    761 	 * errors at inetrrupt time. We have probably
    762 	 * been called by scsipi_done()
    763 	 */
    764 	switch (xs->error) {
    765 	case XS_NOERROR:	/* nearly always hit this one */
    766 		error = 0;
    767 		break;
    768 
    769 	case XS_SENSE:
    770 	case XS_SHORTSENSE:
    771 		if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
    772 		    ERESTART)
    773 			goto retry;
    774 		SC_DEBUG(xs->sc_link, SDEV_DB3,
    775 		    ("scsipi_interpret_sense returned %d\n", error));
    776 		break;
    777 
    778 	case XS_BUSY:
    779 		if (xs->retries) {
    780 			if ((xs->xs_control & XS_CTL_POLL) != 0)
    781 				delay(1000000);
    782 			else if ((xs->xs_control &
    783 			    (XS_CTL_NOSLEEP|XS_CTL_DISCOVERY)) == 0)
    784 				tsleep(&lbolt, PRIBIO, "scbusy", 0);
    785 			else
    786 #if 0
    787 				timeout(scsipi_requeue, xs, hz);
    788 #else
    789 				goto lose;
    790 #endif
    791 		}
    792 	case XS_TIMEOUT:
    793 	retry:
    794 		if (xs->retries) {
    795 			xs->retries--;
    796 			xs->error = XS_NOERROR;
    797 			xs->xs_status &= ~XS_STS_DONE;
    798 			return (ERESTART);
    799 		}
    800 	case XS_DRIVER_STUFFUP:
    801 	lose:
    802 		error = EIO;
    803 		break;
    804 
    805 	case XS_SELTIMEOUT:
    806 		/* XXX Disable device? */
    807 		error = EIO;
    808 		break;
    809 
    810 	case XS_RESET:
    811 		if (xs->retries) {
    812 			SC_DEBUG(xs->sc_link, SDEV_DB3,
    813 			    ("restarting command destroyed by reset\n"));
    814 			goto retry;
    815 		}
    816 		error = EIO;
    817 		break;
    818 
    819 	default:
    820 		(*xs->sc_link->sc_print_addr)(xs->sc_link);
    821 		printf("unknown error category from scsipi driver\n");
    822 		error = EIO;
    823 		break;
    824 	}
    825 
    826 	return (error);
    827 }
    828 
    829 /*
    830  * Add a reference to the adapter pointed to by the provided
    831  * link, enabling the adapter if necessary.
    832  */
    833 int
    834 scsipi_adapter_addref(link)
    835 	struct scsipi_link *link;
    836 {
    837 	struct scsipi_adapter *adapter = link->adapter;
    838 	int s, error = 0;
    839 
    840 	s = splbio();
    841 	if (adapter->scsipi_refcnt++ == 0 &&
    842 	    adapter->scsipi_enable != NULL) {
    843 		error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
    844 		if (error)
    845 			adapter->scsipi_refcnt--;
    846 	}
    847 	splx(s);
    848 	return (error);
    849 }
    850 
    851 /*
    852  * Delete a reference to the adapter pointed to by the provided
    853  * link, disabling the adapter if possible.
    854  */
    855 void
    856 scsipi_adapter_delref(link)
    857 	struct scsipi_link *link;
    858 {
    859 	struct scsipi_adapter *adapter = link->adapter;
    860 	int s;
    861 
    862 	s = splbio();
    863 	if (adapter->scsipi_refcnt-- == 1 &&
    864 	    adapter->scsipi_enable != NULL)
    865 		(void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
    866 	splx(s);
    867 }
    868 
    869 #ifdef	SCSIDEBUG
    870 /*
    871  * Given a scsipi_xfer, dump the request, in all it's glory
    872  */
    873 void
    874 show_scsipi_xs(xs)
    875 	struct scsipi_xfer *xs;
    876 {
    877 
    878 	printf("xs(%p): ", xs);
    879 	printf("xs_control(0x%08x)", xs->xs_control);
    880 	printf("xs_status(0x%08x)", xs->xs_status);
    881 	printf("sc_link(%p)", xs->sc_link);
    882 	printf("retr(0x%x)", xs->retries);
    883 	printf("timo(0x%x)", xs->timeout);
    884 	printf("cmd(%p)", xs->cmd);
    885 	printf("len(0x%x)", xs->cmdlen);
    886 	printf("data(%p)", xs->data);
    887 	printf("len(0x%x)", xs->datalen);
    888 	printf("res(0x%x)", xs->resid);
    889 	printf("err(0x%x)", xs->error);
    890 	printf("bp(%p)", xs->bp);
    891 	show_scsipi_cmd(xs);
    892 }
    893 
    894 void
    895 show_scsipi_cmd(xs)
    896 	struct scsipi_xfer *xs;
    897 {
    898 	u_char *b = (u_char *) xs->cmd;
    899 	int i = 0;
    900 
    901 	(*xs->sc_link->sc_print_addr)(xs->sc_link);
    902 	printf("command: ");
    903 
    904 	if ((xs->xs_control & XS_CTL_RESET) == 0) {
    905 		while (i < xs->cmdlen) {
    906 			if (i)
    907 				printf(",");
    908 			printf("0x%x", b[i++]);
    909 		}
    910 		printf("-[%d bytes]\n", xs->datalen);
    911 		if (xs->datalen)
    912 			show_mem(xs->data, min(64, xs->datalen));
    913 	} else
    914 		printf("-RESET-\n");
    915 }
    916 
    917 void
    918 show_mem(address, num)
    919 	u_char *address;
    920 	int num;
    921 {
    922 	int x;
    923 
    924 	printf("------------------------------");
    925 	for (x = 0; x < num; x++) {
    926 		if ((x % 16) == 0)
    927 			printf("\n%03d: ", x);
    928 		printf("%02x ", *address++);
    929 	}
    930 	printf("\n------------------------------\n");
    931 }
    932 #endif /*SCSIDEBUG */
    933