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