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