Home | History | Annotate | Line # | Download | only in scsipi
scsi_base.c revision 1.22
      1 /*	$NetBSD: scsi_base.c,v 1.22 1994/12/28 19:42:55 mycroft Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1994 Charles Hannum.  All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. All advertising materials mentioning features or use of this software
     15  *    must display the following acknowledgement:
     16  *	This product includes software developed by Charles Hannum.
     17  * 4. The name of the author may not be used to endorse or promote products
     18  *    derived from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*
     33  * Originally written by Julian Elischer (julian (at) dialix.oz.au)
     34  */
     35 
     36 #include <sys/types.h>
     37 #include <sys/param.h>
     38 #include <sys/kernel.h>
     39 #include <sys/buf.h>
     40 #include <sys/uio.h>
     41 #include <sys/malloc.h>
     42 #include <sys/errno.h>
     43 #include <sys/device.h>
     44 
     45 #include <scsi/scsi_all.h>
     46 #include <scsi/scsi_disk.h>
     47 #include <scsi/scsiconf.h>
     48 
     49 #ifdef DDB
     50 int     Debugger();
     51 #else	/* DDB */
     52 #define Debugger()
     53 #endif	/* DDB */
     54 
     55 void scsi_error __P((struct scsi_xfer *, int));
     56 
     57 LIST_HEAD(xs_free_list, scsi_xfer) xs_free_list;
     58 
     59 /*
     60  * Get a scsi transfer structure for the caller. Charge the structure
     61  * to the device that is referenced by the sc_link structure. If the
     62  * sc_link structure has no 'credits' then the device already has the
     63  * maximum number or outstanding operations under way. In this stage,
     64  * wait on the structure so that when one is freed, we are awoken again
     65  * If the SCSI_NOSLEEP flag is set, then do not wait, but rather, return
     66  * a NULL pointer, signifying that no slots were available
     67  * Note in the link structure, that we are waiting on it.
     68  */
     69 
     70 struct scsi_xfer *
     71 scsi_get_xs(sc_link, flags)
     72 	struct scsi_link *sc_link;	/* who to charge the xs to */
     73 	int flags;			/* if this call can sleep */
     74 {
     75 	struct scsi_xfer *xs;
     76 	int s;
     77 
     78 	SC_DEBUG(sc_link, SDEV_DB3, ("scsi_get_xs\n"));
     79 	s = splbio();
     80 	while (sc_link->openings <= 0) {
     81 		SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
     82 		if ((flags & SCSI_NOSLEEP) != 0) {
     83 			splx(s);
     84 			return 0;
     85 		}
     86 		sc_link->flags |= SDEV_WAITING;
     87 		(void) tsleep(sc_link, PRIBIO, "getxs", 0);
     88 	}
     89 	sc_link->openings--;
     90 	if (xs = xs_free_list.lh_first) {
     91 		LIST_REMOVE(xs, free_list);
     92 		splx(s);
     93 	} else {
     94 		splx(s);
     95 		SC_DEBUG(sc_link, SDEV_DB3, ("making\n"));
     96 		xs = malloc(sizeof(*xs), M_DEVBUF,
     97 		    ((flags & SCSI_NOSLEEP) != 0 ? M_NOWAIT : M_WAITOK));
     98 		if (!xs) {
     99 			sc_print_addr(sc_link);
    100 			printf("cannot allocate scsi xs\n");
    101 			return 0;
    102 		}
    103 	}
    104 
    105 	SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
    106 	xs->flags = INUSE | flags;
    107 	return xs;
    108 }
    109 
    110 /*
    111  * Given a scsi_xfer struct, and a device (referenced through sc_link)
    112  * return the struct to the free pool and credit the device with it
    113  * If another process is waiting for an xs, do a wakeup, let it proceed
    114  */
    115 void
    116 scsi_free_xs(xs, flags)
    117 	struct scsi_xfer *xs;
    118 	int flags;
    119 {
    120 	struct scsi_link *sc_link = xs->sc_link;
    121 
    122 	xs->flags &= ~INUSE;
    123 	LIST_INSERT_HEAD(&xs_free_list, xs, free_list);
    124 
    125 	SC_DEBUG(sc_link, SDEV_DB3, ("scsi_free_xs\n"));
    126 	/* if was 0 and someone waits, wake them up */
    127 	sc_link->openings++;
    128 	if ((sc_link->flags & SDEV_WAITING) != 0) {
    129 		sc_link->flags &= ~SDEV_WAITING;
    130 		wakeup(sc_link);
    131 	} else {
    132 		if (sc_link->device->start) {
    133 			SC_DEBUG(sc_link, SDEV_DB2, ("calling private start()\n"));
    134 			(*(sc_link->device->start)) (sc_link->device_softc);
    135 		}
    136 	}
    137 }
    138 
    139 /*
    140  * Make a scsi_xfer, and return a pointer to it.
    141  */
    142 static __inline struct scsi_xfer *
    143 scsi_make_xs(sc_link, scsi_cmd, cmdlen, data_addr, datalen,
    144     retries, timeout, bp, flags)
    145 	struct scsi_link *sc_link;
    146 	struct scsi_generic *scsi_cmd;
    147 	int cmdlen;
    148 	u_char *data_addr;
    149 	int datalen;
    150 	int retries;
    151 	int timeout;
    152 	struct buf *bp;
    153 	int flags;
    154 {
    155 	struct scsi_xfer *xs;
    156 
    157 	if ((xs = scsi_get_xs(sc_link, flags)) == NULL)
    158 		return NULL;
    159 
    160 	/*
    161 	 * Fill out the scsi_xfer structure.  We don't know whose context
    162 	 * the cmd is in, so copy it.
    163 	 */
    164 	xs->sc_link = sc_link;
    165 	bcopy(scsi_cmd, &xs->cmdstore, cmdlen);
    166 	xs->cmd = &xs->cmdstore;
    167 	xs->cmdlen = cmdlen;
    168 	xs->data = data_addr;
    169 	xs->datalen = datalen;
    170 	xs->retries = retries;
    171 	xs->timeout = timeout;
    172 	xs->bp = bp;
    173 
    174 	return xs;
    175 }
    176 
    177 /*
    178  * Find out from the device what its capacity is.
    179  */
    180 u_long
    181 scsi_size(sc_link, flags)
    182 	struct scsi_link *sc_link;
    183 	int flags;
    184 {
    185 	struct scsi_read_cap_data rdcap;
    186 	struct scsi_read_capacity scsi_cmd;
    187 	u_long size;
    188 
    189 	/*
    190 	 * make up a scsi command and ask the scsi driver to do
    191 	 * it for you.
    192 	 */
    193 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    194 	scsi_cmd.opcode = READ_CAPACITY;
    195 
    196 	/*
    197 	 * If the command works, interpret the result as a 4 byte
    198 	 * number of blocks
    199 	 */
    200 	if (scsi_scsi_cmd(sc_link, (struct scsi_generic *)&scsi_cmd,
    201 			  sizeof(scsi_cmd), (u_char *)&rdcap, sizeof(rdcap),
    202 			  2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
    203 		sc_print_addr(sc_link);
    204 		printf("could not get size\n");
    205 		return 0;
    206 	} else {
    207 		size = rdcap.addr_0 + 1;
    208 		size += rdcap.addr_1 << 8;
    209 		size += rdcap.addr_2 << 16;
    210 		size += rdcap.addr_3 << 24;
    211 	}
    212 	return size;
    213 }
    214 
    215 /*
    216  * Get scsi driver to send a "are you ready?" command
    217  */
    218 int
    219 scsi_test_unit_ready(sc_link, flags)
    220 	struct scsi_link *sc_link;
    221 	int flags;
    222 {
    223 	struct scsi_test_unit_ready scsi_cmd;
    224 
    225 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    226 	scsi_cmd.opcode = TEST_UNIT_READY;
    227 
    228 	return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
    229 			     sizeof(scsi_cmd), 0, 0, 2, 10000, NULL, flags);
    230 }
    231 
    232 /*
    233  * Do a scsi operation, asking a device to run as SCSI-II if it can.
    234  */
    235 int
    236 scsi_change_def(sc_link, flags)
    237 	struct scsi_link *sc_link;
    238 	int flags;
    239 {
    240 	struct scsi_changedef scsi_cmd;
    241 
    242 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    243 	scsi_cmd.opcode = CHANGE_DEFINITION;
    244 	scsi_cmd.how = SC_SCSI_2;
    245 
    246 	return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
    247 			     sizeof(scsi_cmd), 0, 0, 2, 100000, NULL, flags);
    248 }
    249 
    250 /*
    251  * Do a scsi operation asking a device what it is
    252  * Use the scsi_cmd routine in the switch table.
    253  */
    254 int
    255 scsi_inquire(sc_link, inqbuf, flags)
    256 	struct scsi_link *sc_link;
    257 	struct scsi_inquiry_data *inqbuf;
    258 	int flags;
    259 {
    260 	struct scsi_inquiry scsi_cmd;
    261 
    262 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    263 	scsi_cmd.opcode = INQUIRY;
    264 	scsi_cmd.length = sizeof(struct scsi_inquiry_data);
    265 
    266 	return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
    267 			     sizeof(scsi_cmd), (u_char *) inqbuf,
    268 			     sizeof(struct scsi_inquiry_data), 2, 10000, NULL,
    269 			     SCSI_DATA_IN | flags);
    270 }
    271 
    272 /*
    273  * Prevent or allow the user to remove the media
    274  */
    275 int
    276 scsi_prevent(sc_link, type, flags)
    277 	struct scsi_link *sc_link;
    278 	int type, flags;
    279 {
    280 	struct scsi_prevent scsi_cmd;
    281 
    282 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    283 	scsi_cmd.opcode = PREVENT_ALLOW;
    284 	scsi_cmd.how = type;
    285 	return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
    286 			     sizeof(scsi_cmd), 0, 0, 2, 5000, NULL, flags);
    287 }
    288 
    289 /*
    290  * Get scsi driver to send a "start up" command
    291  */
    292 int
    293 scsi_start(sc_link, type, flags)
    294 	struct scsi_link *sc_link;
    295 	int type, flags;
    296 {
    297 	struct scsi_start_stop scsi_cmd;
    298 
    299 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    300 	scsi_cmd.opcode = START_STOP;
    301 	scsi_cmd.byte2 = 0x00;
    302 	scsi_cmd.how = type;
    303 	return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
    304 			     sizeof(scsi_cmd), 0, 0, 2,
    305 			     type == SSS_START ? 30000 : 10000, NULL, flags);
    306 }
    307 
    308 int
    309 scsi_start_and_wait(sc_link, n, flags)
    310 	struct scsi_link *sc_link;
    311 	int n;
    312 	int flags;
    313 {
    314 	int silent = flags & SCSI_SILENT;
    315 	struct scsi_xfer *xs;
    316 	struct scsi_start_stop scsi_cmd;
    317 	int error;
    318 
    319 	flags |= SCSI_SILENT | SCSI_IGNORE_MEDIA_CHANGE;
    320 
    321 	bzero(&scsi_cmd, sizeof(scsi_cmd));
    322 	scsi_cmd.opcode = START_STOP;
    323 	scsi_cmd.byte2 = 0x01;
    324 	scsi_cmd.how = SSS_START;
    325 
    326 	if ((xs = scsi_make_xs(sc_link, (struct scsi_generic *)&scsi_cmd,
    327 	    sizeof(scsi_cmd), 0, 0, 2, 1000, NULL, flags)) == NULL)
    328 		return ENOMEM;
    329 
    330 	if ((error = scsi_execute_xs(xs)) != EIO ||
    331 	    xs->error != XS_SENSE ||
    332 	    (xs->sense.error_code & SSD_ERRCODE) != 0x70 ||
    333 	    (xs->sense.extended_flags & SSD_KEY) != 0x2)
    334 		goto out;
    335 	if (!silent) {
    336 		sc_print_addr(sc_link);
    337 		printf("waiting for device to come ready\n");
    338 	}
    339 	while (n--) {
    340 		if ((flags & SCSI_POLL) != 0)
    341 			delay(1000000);
    342 		else
    343 			tsleep(&lbolt, PRIBIO, "scisaw", 0);
    344 		if ((error = scsi_execute_xs(xs)) != EIO ||
    345 		    xs->error != XS_SENSE ||
    346 		    (xs->sense.error_code & SSD_ERRCODE) != 0x70 ||
    347 		    (xs->sense.extended_flags & SSD_KEY) != 0x2) {
    348 			if (!silent) {
    349 				sc_print_addr(sc_link);
    350 				printf("ready\n");
    351 			}
    352 			goto out;
    353 		}
    354 	}
    355 	if (!silent) {
    356 		sc_print_addr(sc_link);
    357 		printf("not ready\n");
    358 	}
    359 out:
    360 	scsi_free_xs(xs, SCSI_NOSLEEP);
    361 	return error;
    362 }
    363 
    364 /*
    365  * This routine is called by the scsi interrupt when the transfer is complete.
    366  */
    367 void
    368 scsi_done(xs)
    369 	struct scsi_xfer *xs;
    370 {
    371 	struct scsi_link *sc_link = xs->sc_link;
    372 	int error;
    373 
    374 	SC_DEBUG(sc_link, SDEV_DB2, ("scsi_done\n"));
    375 #ifdef	SCSIDEBUG
    376 	if ((sc_link->flags & SDEV_DB1) != 0)
    377 		show_scsi_cmd(xs);
    378 #endif /* SCSIDEBUG */
    379 
    380 	/*
    381  	 * If it's a user level request, bypass all usual completion processing,
    382  	 * let the user work it out.. We take reponsibility for freeing the
    383  	 * xs when the user returns. (and restarting the device's queue).
    384  	 */
    385 	if ((xs->flags & SCSI_USER) != 0) {
    386 		SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
    387 		scsi_user_done(xs); /* to take a copy of the sense etc. */
    388 		SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
    389 
    390 		scsi_free_xs(xs, SCSI_NOSLEEP); /* restarts queue too */
    391 		SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
    392 		return;
    393 	}
    394 
    395 	/*
    396 	 * If the device has it's own done routine, call it first.
    397 	 * If it returns a legit error value, return that, otherwise
    398 	 * it wants us to continue with normal processing.
    399 	 */
    400 	if (sc_link->device->done) {
    401 		SC_DEBUG(sc_link, SDEV_DB2, ("calling private done()\n"));
    402 		error = (*sc_link->device->done) (xs);
    403 		if (error == EJUSTRETURN)
    404 			goto done;
    405 		SC_DEBUG(sc_link, SDEV_DB3, ("continuing with generic done()\n"));
    406 	}
    407 	if (xs->bp == NULL) {
    408 		/*
    409 		 * if it's a normal upper level request, then ask
    410 		 * the upper level code to handle error checking
    411 		 * rather than doing it here at interrupt time
    412 		 */
    413 		wakeup(xs);
    414 		return;
    415 	}
    416 	/*
    417 	 * Go and handle errors now.
    418 	 * If it returns ERESTART then we should RETRY
    419 	 */
    420 retry:
    421 	if (sc_err1(xs, 1) == ERESTART) {
    422 		switch ((*(sc_link->adapter->scsi_cmd)) (xs)) {
    423 		case SUCCESSFULLY_QUEUED:
    424 			return;
    425 
    426 		case TRY_AGAIN_LATER:
    427 			xs->error = XS_BUSY;
    428 		case COMPLETE:
    429 			goto retry;
    430 		}
    431 	}
    432 done:
    433 	scsi_free_xs(xs, SCSI_NOSLEEP);
    434 }
    435 
    436 int
    437 scsi_execute_xs(xs)
    438 	struct scsi_xfer *xs;
    439 {
    440 	int error;
    441 	int s;
    442 
    443 	xs->flags &= ~ITSDONE;
    444 	xs->error = XS_NOERROR;
    445 	xs->resid = xs->datalen;
    446 
    447 retry:
    448 	/*
    449 	 * Do the transfer. If we are polling we will return:
    450 	 * COMPLETE,  Was poll, and scsi_done has been called
    451 	 * TRY_AGAIN_LATER, Adapter short resources, try again
    452 	 *
    453 	 * if under full steam (interrupts) it will return:
    454 	 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
    455 	 * TRY_AGAIN_LATER, (as for polling)
    456 	 * After the wakeup, we must still check if it succeeded
    457 	 *
    458 	 * If we have a bp however, all the error proccessing
    459 	 * and the buffer code both expect us to return straight
    460 	 * to them, so as soon as the command is queued, return
    461 	 */
    462 	switch ((*(xs->sc_link->adapter->scsi_cmd)) (xs)) {
    463 	case SUCCESSFULLY_QUEUED:
    464 		if (xs->bp)
    465 			return EJUSTRETURN;
    466 		s = splbio();
    467 		while ((xs->flags & ITSDONE) == 0)
    468 			tsleep(xs, PRIBIO + 1, "scsi_scsi_cmd", 0);
    469 		splx(s);
    470 	case COMPLETE:		/* Polling command completed ok */
    471 		if (xs->bp)
    472 			return EJUSTRETURN;
    473 	doit:
    474 		SC_DEBUG(sc_link, SDEV_DB3, ("back in cmd()\n"));
    475 		if ((error = sc_err1(xs, 0)) != ERESTART)
    476 			return error;
    477 		goto retry;
    478 
    479 	case TRY_AGAIN_LATER:	/* adapter resource shortage */
    480 		xs->error = XS_BUSY;
    481 		goto doit;
    482 
    483 	default:
    484 		panic("scsi_execute_xs: invalid return code");
    485 	}
    486 
    487 #ifdef DIAGNOSTIC
    488 	panic("scsi_execute_xs: impossible");
    489 #endif
    490 }
    491 
    492 /*
    493  * ask the scsi driver to perform a command for us.
    494  * tell it where to read/write the data, and how
    495  * long the data is supposed to be. If we have  a buf
    496  * to associate with the transfer, we need that too.
    497  */
    498 int
    499 scsi_scsi_cmd(sc_link, scsi_cmd, cmdlen, data_addr, datalen,
    500     retries, timeout, bp, flags)
    501 	struct scsi_link *sc_link;
    502 	struct scsi_generic *scsi_cmd;
    503 	int cmdlen;
    504 	u_char *data_addr;
    505 	int datalen;
    506 	int retries;
    507 	int timeout;
    508 	struct buf *bp;
    509 	int flags;
    510 {
    511 	struct scsi_xfer *xs;
    512 	int error;
    513 
    514 	SC_DEBUG(sc_link, SDEV_DB2, ("scsi_cmd\n"));
    515 
    516 	if ((xs = scsi_make_xs(sc_link, scsi_cmd, cmdlen, data_addr, datalen,
    517 	    retries, timeout, bp, flags)) == NULL)
    518 		return ENOMEM;
    519 
    520 	if ((error = scsi_execute_xs(xs)) == EJUSTRETURN)
    521 		return 0;
    522 
    523 	/*
    524 	 * we have finished with the xfer stuct, free it and
    525 	 * check if anyone else needs to be started up.
    526 	 */
    527 	scsi_free_xs(xs, flags);
    528 	return error;
    529 }
    530 
    531 int
    532 sc_err1(xs, async)
    533 	struct scsi_xfer *xs;
    534 	int async;
    535 {
    536 	int error;
    537 
    538 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
    539 
    540 	/*
    541 	 * If it has a buf, we might be working with
    542 	 * a request from the buffer cache or some other
    543 	 * piece of code that requires us to process
    544 	 * errors at inetrrupt time. We have probably
    545 	 * been called by scsi_done()
    546 	 */
    547 	switch (xs->error) {
    548 	case XS_NOERROR:	/* nearly always hit this one */
    549 		error = 0;
    550 		break;
    551 
    552 	case XS_SENSE:
    553 		if ((error = scsi_interpret_sense(xs)) == ERESTART)
    554 			goto retry;
    555 		SC_DEBUG(xs->sc_link, SDEV_DB3,
    556 		    ("scsi_interpret_sense returned %d\n", error));
    557 		break;
    558 
    559 	case XS_BUSY:
    560 		if (xs->retries) {
    561 			if ((xs->flags & SCSI_POLL) != 0)
    562 				delay(1000000);
    563 			else if ((xs->flags & SCSI_NOSLEEP) == 0)
    564 				tsleep(&lbolt, PRIBIO, "scbusy", 0);
    565 			else
    566 #if 0
    567 				timeout(scsi_requeue, xs, hz);
    568 #else
    569 				goto lose;
    570 #endif
    571 		}
    572 	case XS_TIMEOUT:
    573 	retry:
    574 		if (xs->retries--) {
    575 			xs->error = XS_NOERROR;
    576 			xs->flags &= ~ITSDONE;
    577 			return ERESTART;
    578 		}
    579 	case XS_DRIVER_STUFFUP:
    580 	lose:
    581 		error = EIO;
    582 		break;
    583 
    584 	case XS_SELTIMEOUT:
    585 		/* XXX Disable device? */
    586 		error = EIO;
    587 		break;
    588 
    589 	default:
    590 		sc_print_addr(xs->sc_link);
    591 		printf("unknown error category from scsi driver\n");
    592 		error = EIO;
    593 		break;
    594 	}
    595 
    596 	scsi_error(xs, error);
    597 	return error;
    598 }
    599 
    600 void
    601 scsi_error(xs, error)
    602 	struct scsi_xfer *xs;
    603 	int error;
    604 {
    605 	struct buf *bp = xs->bp;
    606 
    607 	if (bp) {
    608 		if (error) {
    609 			bp->b_error = error;
    610 			bp->b_flags |= B_ERROR;
    611 			bp->b_resid = bp->b_bcount;
    612 		} else {
    613 			bp->b_error = 0;
    614 			bp->b_resid = xs->resid;
    615 		}
    616 		biodone(bp);
    617 	}
    618 }
    619 
    620 /*
    621  * Look at the returned sense and act on the error, determining
    622  * the unix error number to pass back.  (0 = report no error)
    623  *
    624  * THIS IS THE DEFAULT ERROR HANDLER
    625  */
    626 int
    627 scsi_interpret_sense(xs)
    628 	struct scsi_xfer *xs;
    629 {
    630 	struct scsi_sense_data *sense;
    631 	struct scsi_link *sc_link = xs->sc_link;
    632 	u_int8_t key;
    633 	u_int32_t info;
    634 	int error;
    635 
    636 	static char *error_mes[] = {
    637 		"soft error (corrected)",
    638 		"not ready", "medium error",
    639 		"non-media hardware failure", "illegal request",
    640 		"unit attention", "readonly device",
    641 		"no data found", "vendor unique",
    642 		"copy aborted", "command aborted",
    643 		"search returned equal", "volume overflow",
    644 		"verify miscompare", "unknown error key"
    645 	};
    646 
    647 	sense = &xs->sense;
    648 #ifdef	SCSIDEBUG
    649 	if ((sc_link->flags & SDEV_DB1) != 0) {
    650 		int count;
    651 		printf("code%x valid%x ",
    652 		    sense->error_code & SSD_ERRCODE,
    653 		    sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
    654 		printf("seg%x key%x ili%x eom%x fmark%x\n",
    655 		    sense->extended_segment,
    656 		    sense->extended_flags & SSD_KEY,
    657 		    sense->extended_flags & SSD_ILI ? 1 : 0,
    658 		    sense->extended_flags & SSD_EOM ? 1 : 0,
    659 		    sense->extended_flags & SSD_FILEMARK ? 1 : 0);
    660 		printf("info: %x %x %x %x followed by %d extra bytes\n",
    661 		    sense->extended_info[0],
    662 		    sense->extended_info[1],
    663 		    sense->extended_info[2],
    664 		    sense->extended_info[3],
    665 		    sense->extended_extra_len);
    666 		printf("extra: ");
    667 		for (count = 0; count < sense->extended_extra_len; count++)
    668 			printf("%x ", sense->extended_extra_bytes[count]);
    669 		printf("\n");
    670 	}
    671 #endif	/*SCSIDEBUG */
    672 	/*
    673 	 * If the device has it's own error handler, call it first.
    674 	 * If it returns a legit error value, return that, otherwise
    675 	 * it wants us to continue with normal error processing.
    676 	 */
    677 	if (sc_link->device->err_handler) {
    678 		SC_DEBUG(sc_link, SDEV_DB2, ("calling private err_handler()\n"));
    679 		error = (*sc_link->device->err_handler) (xs);
    680 		if (error != -1)
    681 			return error;		/* error >= 0  better ? */
    682 	}
    683 	/* otherwise use the default */
    684 	switch (sense->error_code & SSD_ERRCODE) {
    685 		/*
    686 		 * If it's code 70, use the extended stuff and interpret the key
    687 		 */
    688 	case 0x71:		/* delayed error */
    689 		sc_print_addr(sc_link);
    690 		key = sense->extended_flags & SSD_KEY;
    691 		printf(" DELAYED ERROR, key = 0x%x\n", key);
    692 	case 0x70:
    693 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    694 			bcopy(sense->extended_info, &info, sizeof info);
    695 			info = ntohl(info);
    696 		} else
    697 			info = 0;
    698 		key = sense->extended_flags & SSD_KEY;
    699 
    700 		switch (key) {
    701 		case 0x1:	/* RECOVERED ERROR */
    702 			sc_print_addr(sc_link);
    703 			printf("soft error (corrected), info = %d (decimal)\n", info);
    704 		case 0x0:	/* NO SENSE */
    705 			if (xs->resid == xs->datalen)
    706 				xs->resid = 0;	/* not short read */
    707 		case 0xc:	/* EQUAL */
    708 			error = 0;
    709 			break;
    710 		case 0x2:	/* NOT READY */
    711 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    712 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    713 			if ((xs->flags & SCSI_IGNORE_NOT_READY) != 0)
    714 				return 0;
    715 			if ((xs->flags & SCSI_SILENT) != 0)
    716 				return EIO;
    717 			error = EIO;
    718 			break;
    719 		case 0x5:	/* ILLEGAL REQUEST */
    720 			if ((xs->flags & SCSI_IGNORE_ILLEGAL_REQUEST) != 0)
    721 				return 0;
    722 			error = EINVAL;
    723 			break;
    724 		case 0x6:	/* UNIT ATTENTION */
    725 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
    726 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
    727 			if ((xs->flags & SCSI_IGNORE_MEDIA_CHANGE) != 0 ||
    728 			    /* XXX Should reupload any transient state. */
    729 			    (sc_link->flags & SDEV_REMOVABLE) == 0)
    730 				return ERESTART;
    731 			if ((xs->flags & SCSI_SILENT) != 0)
    732 				return EIO;
    733 			error = EIO;
    734 			break;
    735 		case 0x7:	/* DATA PROTECT */
    736 			error = EACCES;
    737 			break;
    738 		case 0x8:	/* BLANK CHECK */
    739 			error = 0;
    740 			break;
    741 		case 0xd:	/* VOLUME OVERFLOW */
    742 			error = ENOSPC;
    743 			break;
    744 		default:
    745 			error = EIO;
    746 			break;
    747 		}
    748 
    749 		if (key) {
    750 			sc_print_addr(sc_link);
    751 			printf("%s", error_mes[key - 1]);
    752 			if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    753 				switch (key) {
    754 				case 0x7:	/* DATA PROTECT */
    755 					break;
    756 				case 0x8:	/* BLANK CHECK */
    757 					printf(", requested size: %d (decimal)",
    758 					    info);
    759 					break;
    760 				default:
    761 					printf(", info = %d (decimal)", info);
    762 				}
    763 			}
    764 			printf("\n");
    765 		}
    766 		return error;
    767 
    768 	/*
    769 	 * Not code 70, just report it
    770 	 */
    771 	default:
    772 		sc_print_addr(sc_link);
    773 		printf("error code %d",
    774 		    sense->error_code & SSD_ERRCODE);
    775 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
    776 			printf(" at block no. %d (decimal)",
    777 			    (sense->XXX_unextended_blockhi << 16) +
    778 			    (sense->XXX_unextended_blockmed << 8) +
    779 			    (sense->XXX_unextended_blocklow));
    780 		}
    781 		printf("\n");
    782 		return EIO;
    783 	}
    784 }
    785 
    786 /*
    787  * Utility routines often used in SCSI stuff
    788  */
    789 
    790 /*
    791  * convert a physical address to 3 bytes,
    792  * MSB at the lowest address,
    793  * LSB at the highest.
    794  */
    795 void
    796 lto3b(val, bytes)
    797 	u_int32_t val;
    798 	u_int8_t *bytes;
    799 {
    800 
    801 	*bytes++ = (val & 0xff0000) >> 16;
    802 	*bytes++ = (val & 0xff00) >> 8;
    803 	*bytes = val & 0xff;
    804 }
    805 
    806 /*
    807  * The reverse of lto3b
    808  */
    809 u_int32_t
    810 _3btol(bytes)
    811 	u_int8_t *bytes;
    812 {
    813 	u_int32_t rc;
    814 
    815 	rc = (*bytes++ << 16);
    816 	rc += (*bytes++ << 8);
    817 	rc += *bytes;
    818 	return (rc);
    819 }
    820 
    821 /*
    822  * Print out the scsi_link structure's address info.
    823  */
    824 void
    825 sc_print_addr(sc_link)
    826 	struct scsi_link *sc_link;
    827 {
    828 
    829 	printf("%s(%s:%d:%d): ",
    830 	    sc_link->device_softc ?
    831 	    ((struct device *)sc_link->device_softc)->dv_xname : "probe",
    832 	    ((struct device *)sc_link->adapter_softc)->dv_xname,
    833 	    sc_link->target, sc_link->lun);
    834 }
    835 
    836 #ifdef	SCSIDEBUG
    837 /*
    838  * Given a scsi_xfer, dump the request, in all it's glory
    839  */
    840 void
    841 show_scsi_xs(xs)
    842 	struct scsi_xfer *xs;
    843 {
    844 	printf("xs(0x%x): ", xs);
    845 	printf("flg(0x%x)", xs->flags);
    846 	printf("sc_link(0x%x)", xs->sc_link);
    847 	printf("retr(0x%x)", xs->retries);
    848 	printf("timo(0x%x)", xs->timeout);
    849 	printf("cmd(0x%x)", xs->cmd);
    850 	printf("len(0x%x)", xs->cmdlen);
    851 	printf("data(0x%x)", xs->data);
    852 	printf("len(0x%x)", xs->datalen);
    853 	printf("res(0x%x)", xs->resid);
    854 	printf("err(0x%x)", xs->error);
    855 	printf("bp(0x%x)", xs->bp);
    856 	show_scsi_cmd(xs);
    857 }
    858 
    859 void
    860 show_scsi_cmd(xs)
    861 	struct scsi_xfer *xs;
    862 {
    863 	u_char *b = (u_char *) xs->cmd;
    864 	int     i = 0;
    865 
    866 	sc_print_addr(xs->sc_link);
    867 	printf("command: ");
    868 
    869 	if ((xs->flags & SCSI_RESET) == 0) {
    870 		while (i < xs->cmdlen) {
    871 			if (i)
    872 				printf(",");
    873 			printf("%x", b[i++]);
    874 		}
    875 		printf("-[%d bytes]\n", xs->datalen);
    876 		if (xs->datalen)
    877 			show_mem(xs->data, min(64, xs->datalen));
    878 	} else
    879 		printf("-RESET-\n");
    880 }
    881 
    882 void
    883 show_mem(address, num)
    884 	unsigned char *address;
    885 	u_int32 num;
    886 {
    887 	u_int32 x, y;
    888 	printf("------------------------------");
    889 	for (y = 0; y < num; y += 1) {
    890 		if (!(y % 16))
    891 			printf("\n%03d: ", y);
    892 		printf("%02x ", *address++);
    893 	}
    894 	printf("\n------------------------------\n");
    895 }
    896 #endif /*SCSIDEBUG */
    897