xref: /netbsd-src/sys/dev/scsipi/scsipi_base.c (revision dc306354b0b29af51801a7632f1e95265a68cd81)
1 /*	$NetBSD: scsipi_base.c,v 1.17 1999/01/10 06:26:23 mjacob Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Charles M. Hannum.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #include "opt_scsi.h"
40 
41 #include <sys/types.h>
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/buf.h>
46 #include <sys/uio.h>
47 #include <sys/malloc.h>
48 #include <sys/pool.h>
49 #include <sys/errno.h>
50 #include <sys/device.h>
51 #include <sys/proc.h>
52 
53 #include <dev/scsipi/scsipi_all.h>
54 #include <dev/scsipi/scsipi_disk.h>
55 #include <dev/scsipi/scsipiconf.h>
56 #include <dev/scsipi/scsipi_base.h>
57 
58 struct pool scsipi_xfer_pool;
59 
60 int	sc_err1 __P((struct scsipi_xfer *, int));
61 
62 /*
63  * Called when a scsibus is attached to initialize global data.
64  */
65 void
66 scsipi_init()
67 {
68 	static int scsipi_init_done;
69 
70 	if (scsipi_init_done)
71 		return;
72 	scsipi_init_done = 1;
73 
74 	/* Initialize the scsipi_xfer pool. */
75 	pool_init(&scsipi_xfer_pool, sizeof(struct scsipi_xfer), 0,
76 	    0, 0, "scxspl", 0, NULL, NULL, M_DEVBUF);
77 }
78 
79 /*
80  * Get a scsipi transfer structure for the caller. Charge the structure
81  * to the device that is referenced by the sc_link structure. If the
82  * sc_link structure has no 'credits' then the device already has the
83  * maximum number or outstanding operations under way. In this stage,
84  * wait on the structure so that when one is freed, we are awoken again
85  * If the SCSI_NOSLEEP flag is set, then do not wait, but rather, return
86  * a NULL pointer, signifying that no slots were available
87  * Note in the link structure, that we are waiting on it.
88  */
89 
90 struct scsipi_xfer *
91 scsipi_get_xs(sc_link, flags)
92 	struct scsipi_link *sc_link;	/* who to charge the xs to */
93 	int flags;			/* if this call can sleep */
94 {
95 	struct scsipi_xfer *xs;
96 	int s;
97 
98 	SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_get_xs\n"));
99 
100 	s = splbio();
101 	while (sc_link->openings <= 0) {
102 		SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
103 		if ((flags & SCSI_NOSLEEP) != 0) {
104 			splx(s);
105 			return (0);
106 		}
107 		sc_link->flags |= SDEV_WAITING;
108 		(void)tsleep(sc_link, PRIBIO, "getxs", 0);
109 	}
110 	SC_DEBUG(sc_link, SDEV_DB3, ("calling pool_get\n"));
111 	xs = pool_get(&scsipi_xfer_pool,
112 	    ((flags & SCSI_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
113 	if (xs != NULL)
114 		sc_link->openings--;
115 	else {
116 		(*sc_link->sc_print_addr)(sc_link);
117 		printf("cannot allocate scsipi xs\n");
118 	}
119 	splx(s);
120 
121 	SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
122 
123 	/*
124 	 * zeroes out the command, as ATAPI may use longer commands
125 	 * than SCSI
126 	 */
127 	if (xs != NULL) {
128 		xs->flags = INUSE | flags;
129 		TAILQ_INSERT_TAIL(&sc_link->pending_xfers, xs, device_q);
130 		bzero(&xs->cmdstore, sizeof(xs->cmdstore));
131 	}
132 	return (xs);
133 }
134 
135 /*
136  * Given a scsipi_xfer struct, and a device (referenced through sc_link)
137  * return the struct to the free pool and credit the device with it
138  * If another process is waiting for an xs, do a wakeup, let it proceed
139  *
140  * MUST BE CALLED AT splbio()!!
141  */
142 void
143 scsipi_free_xs(xs, flags)
144 	struct scsipi_xfer *xs;
145 	int flags;
146 {
147 	struct scsipi_link *sc_link = xs->sc_link;
148 
149 	TAILQ_REMOVE(&sc_link->pending_xfers, xs, device_q);
150 	if (TAILQ_FIRST(&sc_link->pending_xfers) == NULL &&
151 	    (sc_link->flags & SDEV_WAITDRAIN) != 0) {
152 		sc_link->flags &= ~SDEV_WAITDRAIN;
153 		wakeup(&sc_link->pending_xfers);
154 	}
155 	xs->flags &= ~INUSE;
156 	pool_put(&scsipi_xfer_pool, xs);
157 
158 	SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_free_xs\n"));
159 	/* if was 0 and someone waits, wake them up */
160 	sc_link->openings++;
161 	if ((sc_link->flags & SDEV_WAITING) != 0) {
162 		sc_link->flags &= ~SDEV_WAITING;
163 		wakeup(sc_link);
164 	} else {
165 		if (sc_link->device->start) {
166 			SC_DEBUG(sc_link, SDEV_DB2,
167 			    ("calling private start()\n"));
168 			(*(sc_link->device->start))(sc_link->device_softc);
169 		}
170 	}
171 }
172 
173 /*
174  * Wait for a scsipi_link's pending xfers to drain.
175  */
176 void
177 scsipi_wait_drain(sc_link)
178 	struct scsipi_link *sc_link;
179 {
180 	int s;
181 
182 	s = splbio();
183 	while (TAILQ_FIRST(&sc_link->pending_xfers) != NULL) {
184 		sc_link->flags |= SDEV_WAITDRAIN;
185 		(void) tsleep(&sc_link->pending_xfers, PRIBIO, "sxdrn", 0);
186 	}
187 	splx(s);
188 }
189 
190 /*
191  * Look at the returned sense and act on the error, determining
192  * the unix error number to pass back.  (0 = report no error)
193  *
194  * THIS IS THE DEFAULT ERROR HANDLER FOR SCSI DEVICES
195  */
196 int
197 scsipi_interpret_sense(xs)
198 	struct scsipi_xfer *xs;
199 {
200 	struct scsipi_sense_data *sense;
201 	struct scsipi_link *sc_link = xs->sc_link;
202 	u_int8_t key;
203 	u_int32_t info;
204 	int error;
205 #ifndef	SCSIVERBOSE
206 	static char *error_mes[] = {
207 		"soft error (corrected)",
208 		"not ready", "medium error",
209 		"non-media hardware failure", "illegal request",
210 		"unit attention", "readonly device",
211 		"no data found", "vendor unique",
212 		"copy aborted", "command aborted",
213 		"search returned equal", "volume overflow",
214 		"verify miscompare", "unknown error key"
215 	};
216 #endif
217 
218 	sense = &xs->sense.scsi_sense;
219 #ifdef	SCSIDEBUG
220 	if ((sc_link->flags & SDEV_DB1) != 0) {
221 		int count;
222 		printf("code 0x%x valid 0x%x ",
223 			sense->error_code & SSD_ERRCODE,
224 			sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
225 		printf("seg 0x%x key 0x%x ili 0x%x eom 0x%x fmark 0x%x\n",
226 			sense->segment,
227 			sense->flags & SSD_KEY,
228 			sense->flags & SSD_ILI ? 1 : 0,
229 			sense->flags & SSD_EOM ? 1 : 0,
230 			sense->flags & SSD_FILEMARK ? 1 : 0);
231 		printf("info: 0x%x 0x%x 0x%x 0x%x followed by %d extra bytes\n",
232 			sense->info[0],
233 			sense->info[1],
234 			sense->info[2],
235 			sense->info[3],
236 			sense->extra_len);
237 		printf("extra: ");
238 		for (count = 0; count < ADD_BYTES_LIM(sense); count++)
239 			printf("0x%x ", sense->cmd_spec_info[count]);
240 		printf("\n");
241 	}
242 #endif	/* SCSIDEBUG */
243 	/*
244 	 * If the device has it's own error handler, call it first.
245 	 * If it returns a legit error value, return that, otherwise
246 	 * it wants us to continue with normal error processing.
247 	 */
248 	if (sc_link->device->err_handler) {
249 		SC_DEBUG(sc_link, SDEV_DB2,
250 		    ("calling private err_handler()\n"));
251 		error = (*sc_link->device->err_handler)(xs);
252 		if (error != SCSIRET_CONTINUE)
253 			return (error);		/* error >= 0  better ? */
254 	}
255 	/* otherwise use the default */
256 	switch (sense->error_code & SSD_ERRCODE) {
257 		/*
258 		 * If it's code 70, use the extended stuff and
259 		 * interpret the key
260 		 */
261 	case 0x71:		/* delayed error */
262 		sc_link->sc_print_addr(sc_link);
263 		key = sense->flags & SSD_KEY;
264 		printf(" DEFERRED ERROR, key = 0x%x\n", key);
265 		/* FALLTHROUGH */
266 	case 0x70:
267 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0)
268 			info = _4btol(sense->info);
269 		else
270 			info = 0;
271 		key = sense->flags & SSD_KEY;
272 
273 		switch (key) {
274 		case SKEY_NO_SENSE:
275 		case SKEY_RECOVERED_ERROR:
276 			if (xs->resid == xs->datalen && xs->datalen) {
277 				/*
278 				 * Why is this here?
279 				 */
280 				xs->resid = 0;	/* not short read */
281 			}
282 		case SKEY_EQUAL:
283 			error = 0;
284 			break;
285 		case SKEY_NOT_READY:
286 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
287 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
288 			if ((xs->flags & SCSI_IGNORE_NOT_READY) != 0)
289 				return (0);
290 			if ((xs->flags & SCSI_SILENT) != 0)
291 				return (EIO);
292 			error = EIO;
293 			break;
294 		case SKEY_ILLEGAL_REQUEST:
295 			if ((xs->flags & SCSI_IGNORE_ILLEGAL_REQUEST) != 0)
296 				return (0);
297 			if ((xs->flags & SCSI_SILENT) != 0)
298 				return (EIO);
299 			error = EINVAL;
300 			break;
301 		case SKEY_UNIT_ATTENTION:
302 			if ((sc_link->flags & SDEV_REMOVABLE) != 0)
303 				sc_link->flags &= ~SDEV_MEDIA_LOADED;
304 			if ((xs->flags & SCSI_IGNORE_MEDIA_CHANGE) != 0 ||
305 				/* XXX Should reupload any transient state. */
306 				(sc_link->flags & SDEV_REMOVABLE) == 0)
307 				return (ERESTART);
308 			if ((xs->flags & SCSI_SILENT) != 0)
309 				return (EIO);
310 			error = EIO;
311 			break;
312 		case SKEY_WRITE_PROTECT:
313 			error = EROFS;
314 			break;
315 		case SKEY_BLANK_CHECK:
316 			error = 0;
317 			break;
318 		case SKEY_ABORTED_COMMAND:
319 			error = ERESTART;
320 			break;
321 		case SKEY_VOLUME_OVERFLOW:
322 			error = ENOSPC;
323 			break;
324 		default:
325 			error = EIO;
326 			break;
327 		}
328 
329 #ifdef SCSIVERBOSE
330 		if ((xs->flags & SCSI_SILENT) == 0)
331 			scsipi_print_sense(xs, 0);
332 #else
333 		if (key) {
334 			sc_link->sc_print_addr(sc_link);
335 			printf("%s", error_mes[key - 1]);
336 			if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
337 				switch (key) {
338 				case SKEY_NOT_READY:
339 				case SKEY_ILLEGAL_REQUEST:
340 				case SKEY_UNIT_ATTENTION:
341 				case SKEY_WRITE_PROTECT:
342 					break;
343 				case SKEY_BLANK_CHECK:
344 					printf(", requested size: %d (decimal)",
345 					    info);
346 					break;
347 				case SKEY_ABORTED_COMMAND:
348 					if (xs->retries)
349 						printf(", retrying");
350 					printf(", cmd 0x%x, info 0x%x",
351 					    xs->cmd->opcode, info);
352 					break;
353 				default:
354 					printf(", info = %d (decimal)", info);
355 				}
356 			}
357 			if (sense->extra_len != 0) {
358 				int n;
359 				printf(", data =");
360 				for (n = 0; n < sense->extra_len; n++)
361 					printf(" %02x",
362 					    sense->cmd_spec_info[n]);
363 			}
364 			printf("\n");
365 		}
366 #endif
367 		return (error);
368 
369 	/*
370 	 * Not code 70, just report it
371 	 */
372 	default:
373 		sc_link->sc_print_addr(sc_link);
374 		printf("Sense Error Code 0x%x",
375 			sense->error_code & SSD_ERRCODE);
376 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
377 			struct scsipi_sense_data_unextended *usense =
378 			    (struct scsipi_sense_data_unextended *)sense;
379 			printf(" at block no. %d (decimal)",
380 			    _3btol(usense->block));
381 		}
382 		printf("\n");
383 		return (EIO);
384 	}
385 }
386 
387 /*
388  * Find out from the device what its capacity is.
389  */
390 u_long
391 scsipi_size(sc_link, flags)
392 	struct scsipi_link *sc_link;
393 	int flags;
394 {
395 	struct scsipi_read_cap_data rdcap;
396 	struct scsipi_read_capacity scsipi_cmd;
397 
398 	/*
399 	 * make up a scsipi command and ask the scsipi driver to do
400 	 * it for you.
401 	 */
402 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
403 	scsipi_cmd.opcode = READ_CAPACITY;
404 
405 	/*
406 	 * If the command works, interpret the result as a 4 byte
407 	 * number of blocks
408 	 */
409 	if (scsipi_command(sc_link, (struct scsipi_generic *)&scsipi_cmd,
410 	    sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
411 	    2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
412 		sc_link->sc_print_addr(sc_link);
413 		printf("could not get size\n");
414 		return (0);
415 	}
416 
417 	return (_4btol(rdcap.addr) + 1);
418 }
419 
420 /*
421  * Get scsipi driver to send a "are you ready?" command
422  */
423 int
424 scsipi_test_unit_ready(sc_link, flags)
425 	struct scsipi_link *sc_link;
426 	int flags;
427 {
428 	struct scsipi_test_unit_ready scsipi_cmd;
429 
430 	/* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
431 	if (sc_link->quirks & ADEV_NOTUR)
432 		return (0);
433 
434 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
435 	scsipi_cmd.opcode = TEST_UNIT_READY;
436 
437 	return (scsipi_command(sc_link,
438 	    (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
439 	    0, 0, 2, 10000, NULL, flags));
440 }
441 
442 /*
443  * Do a scsipi operation asking a device what it is
444  * Use the scsipi_cmd routine in the switch table.
445  * XXX actually this is only used for scsi devices, because I have the feeling
446  * that some atapi CDROM may not implement it, althouh it marked as mandatory
447  * in the atapi specs.
448  */
449 int
450 scsipi_inquire(sc_link, inqbuf, flags)
451 	struct scsipi_link *sc_link;
452 	struct scsipi_inquiry_data *inqbuf;
453 	int flags;
454 {
455 	struct scsipi_inquiry scsipi_cmd;
456 
457 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
458 	scsipi_cmd.opcode = INQUIRY;
459 	scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
460 
461 	return (scsipi_command(sc_link,
462 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
463 	    (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
464 	    2, 10000, NULL, SCSI_DATA_IN | flags));
465 }
466 
467 /*
468  * Prevent or allow the user to remove the media
469  */
470 int
471 scsipi_prevent(sc_link, type, flags)
472 	struct scsipi_link *sc_link;
473 	int type, flags;
474 {
475 	struct scsipi_prevent scsipi_cmd;
476 
477 	if (sc_link->quirks & ADEV_NODOORLOCK)
478 		return (0);
479 
480 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
481 	scsipi_cmd.opcode = PREVENT_ALLOW;
482 	scsipi_cmd.how = type;
483 	return (scsipi_command(sc_link,
484 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
485 	    0, 0, 2, 5000, NULL, flags));
486 }
487 
488 /*
489  * Get scsipi driver to send a "start up" command
490  */
491 int
492 scsipi_start(sc_link, type, flags)
493 	struct scsipi_link *sc_link;
494 	int type, flags;
495 {
496 	struct scsipi_start_stop scsipi_cmd;
497 
498 	bzero(&scsipi_cmd, sizeof(scsipi_cmd));
499 	scsipi_cmd.opcode = START_STOP;
500 	scsipi_cmd.byte2 = 0x00;
501 	scsipi_cmd.how = type;
502 	return (scsipi_command(sc_link,
503 	    (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
504 	    0, 0, 2, type == SSS_START ? 30000 : 10000, NULL, flags));
505 }
506 
507 /*
508  * This routine is called by the scsipi interrupt when the transfer is
509  * complete.
510  */
511 void
512 scsipi_done(xs)
513 	struct scsipi_xfer *xs;
514 {
515 	struct scsipi_link *sc_link = xs->sc_link;
516 	struct buf *bp;
517 	int error;
518 
519 	SC_DEBUG(sc_link, SDEV_DB2, ("scsipi_done\n"));
520 #ifdef	SCSIDEBUG
521 	if ((sc_link->flags & SDEV_DB1) != 0)
522 		show_scsipi_cmd(xs);
523 #endif /* SCSIDEBUG */
524 
525 	/*
526 	 * If it's a user level request, bypass all usual completion
527 	 * processing, let the user work it out..  We take
528 	 * reponsibility for freeing the xs when the user returns.
529 	 * (and restarting the device's queue).
530 	 */
531 	if ((xs->flags & SCSI_USER) != 0) {
532 		SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
533 		scsipi_user_done(xs); /* to take a copy of the sense etc. */
534 		SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
535 
536 		/*
537 		 * If this was an asynchronous operation (i.e. adapter
538 		 * returned SUCCESSFULLY_QUEUED when the command was
539 		 * submitted), we need to free the scsipi_xfer here.
540 		 */
541 		if (SCSIPI_XFER_ASYNC(xs))
542 			scsipi_free_xs(xs, SCSI_NOSLEEP);
543 		SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
544 		return;
545 	}
546 
547 	if (!SCSIPI_XFER_ASYNC(xs)) {
548 		/*
549 		 * if it's a normal upper level request, then ask
550 		 * the upper level code to handle error checking
551 		 * rather than doing it here at interrupt time
552 		 */
553 		wakeup(xs);
554 		return;
555 	}
556 
557 	/*
558 	 * Go and handle errors now.
559 	 * If it returns ERESTART then we should RETRY
560 	 */
561 retry:
562 	error = sc_err1(xs, 1);
563 	if (error == ERESTART)
564 		switch (scsipi_command_direct(xs)) {
565 		case SUCCESSFULLY_QUEUED:
566 			return;
567 
568 		case TRY_AGAIN_LATER:
569 			xs->error = XS_BUSY;
570 		case COMPLETE:
571 			goto retry;
572 		}
573 
574 	bp = xs->bp;
575 	if (bp) {
576 		if (error) {
577 			bp->b_error = error;
578 			bp->b_flags |= B_ERROR;
579 			bp->b_resid = bp->b_bcount;
580 		} else {
581 			bp->b_error = 0;
582 			bp->b_resid = xs->resid;
583 		}
584 	}
585 	if (sc_link->device->done) {
586 		/*
587 		 * Tell the device the operation is actually complete.
588 		 * No more will happen with this xfer.  This for
589 		 * notification of the upper-level driver only; they
590 		 * won't be returning any meaningful information to us.
591 		 */
592 		(*sc_link->device->done)(xs);
593 	}
594 	/*
595 	 * If this was an asynchronous operation (i.e. adapter
596 	 * returned SUCCESSFULLY_QUEUED when the command was
597 	 * submitted), we need to free the scsipi_xfer here.
598 	 */
599 	if (SCSIPI_XFER_ASYNC(xs))
600 		scsipi_free_xs(xs, SCSI_NOSLEEP);
601 	if (bp)
602 		biodone(bp);
603 }
604 
605 int
606 scsipi_execute_xs(xs)
607 	struct scsipi_xfer *xs;
608 {
609 	int async;
610 	int error;
611 	int s;
612 
613 	xs->flags &= ~ITSDONE;
614 	xs->error = XS_NOERROR;
615 	xs->resid = xs->datalen;
616 	xs->status = 0;
617 
618 retry:
619 	/*
620 	 * Do the transfer. If we are polling we will return:
621 	 * COMPLETE,  Was poll, and scsipi_done has been called
622 	 * TRY_AGAIN_LATER, Adapter short resources, try again
623 	 *
624 	 * if under full steam (interrupts) it will return:
625 	 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
626 	 * TRY_AGAIN_LATER, (as for polling)
627 	 * After the wakeup, we must still check if it succeeded
628 	 *
629 	 * If we have a SCSI_NOSLEEP (typically because we have a buf)
630 	 * we just return.  All the error proccessing and the buffer
631 	 * code both expect us to return straight to them, so as soon
632 	 * as the command is queued, return.
633 	 */
634 #ifdef SCSIDEBUG
635 	if (xs->sc_link->flags & SDEV_DB3) {
636 		printf("scsipi_exec_cmd: ");
637 		show_scsipi_xs(xs);
638 		printf("\n");
639 	}
640 #endif
641 	async = SCSIPI_XFER_ASYNC(xs);
642 	switch (scsipi_command_direct(xs)) {
643 	case SUCCESSFULLY_QUEUED:
644 		if (async) {
645 			/* scsipi_done() will free the scsipi_xfer. */
646 			return (EJUSTRETURN);
647 		}
648 #ifdef DIAGNOSTIC
649 		if (xs->flags & SCSI_NOSLEEP)
650 			panic("scsipi_execute_xs: NOSLEEP and POLL");
651 #endif
652 		s = splbio();
653 		while ((xs->flags & ITSDONE) == 0)
654 			tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
655 		splx(s);
656 	case COMPLETE:		/* Polling command completed ok */
657 		if (xs->bp)
658 			return (0);
659 	doit:
660 		SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
661 		if ((error = sc_err1(xs, 0)) != ERESTART)
662 			return (error);
663 		goto retry;
664 
665 	case TRY_AGAIN_LATER:	/* adapter resource shortage */
666 		xs->error = XS_BUSY;
667 		goto doit;
668 
669 	default:
670 		panic("scsipi_execute_xs: invalid return code");
671 	}
672 
673 #ifdef DIAGNOSTIC
674 	panic("scsipi_execute_xs: impossible");
675 #endif
676 	return (EINVAL);
677 }
678 
679 int
680 sc_err1(xs, async)
681 	struct scsipi_xfer *xs;
682 	int async;
683 {
684 	int error;
685 
686 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
687 
688 	/*
689 	 * If it has a buf, we might be working with
690 	 * a request from the buffer cache or some other
691 	 * piece of code that requires us to process
692 	 * errors at inetrrupt time. We have probably
693 	 * been called by scsipi_done()
694 	 */
695 	switch (xs->error) {
696 	case XS_NOERROR:	/* nearly always hit this one */
697 		error = 0;
698 		break;
699 
700 	case XS_SENSE:
701 	case XS_SHORTSENSE:
702 		if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
703 		    ERESTART)
704 			goto retry;
705 		SC_DEBUG(xs->sc_link, SDEV_DB3,
706 		    ("scsipi_interpret_sense returned %d\n", error));
707 		break;
708 
709 	case XS_BUSY:
710 		if (xs->retries) {
711 			if ((xs->flags & SCSI_POLL) != 0)
712 				delay(1000000);
713 			else if ((xs->flags & SCSI_NOSLEEP) == 0)
714 				tsleep(&lbolt, PRIBIO, "scbusy", 0);
715 			else
716 #if 0
717 				timeout(scsipi_requeue, xs, hz);
718 #else
719 				goto lose;
720 #endif
721 		}
722 	case XS_TIMEOUT:
723 	retry:
724 		if (xs->retries) {
725 			xs->retries--;
726 			xs->error = XS_NOERROR;
727 			xs->flags &= ~ITSDONE;
728 			return (ERESTART);
729 		}
730 	case XS_DRIVER_STUFFUP:
731 	lose:
732 		error = EIO;
733 		break;
734 
735 	case XS_SELTIMEOUT:
736 		/* XXX Disable device? */
737 		error = EIO;
738 		break;
739 
740 	case XS_RESET:
741 		if (xs->retries) {
742 			SC_DEBUG(xs->sc_link, SDEV_DB3,
743 			    ("restarting command destroyed by reset\n"));
744 			goto retry;
745 		}
746 		error = EIO;
747 		break;
748 
749 	default:
750 		(*xs->sc_link->sc_print_addr)(xs->sc_link);
751 		printf("unknown error category from scsipi driver\n");
752 		error = EIO;
753 		break;
754 	}
755 
756 	return (error);
757 }
758 
759 /*
760  * Add a reference to the adapter pointed to by the provided
761  * link, enabling the adapter if necessary.
762  */
763 int
764 scsipi_adapter_addref(link)
765 	struct scsipi_link *link;
766 {
767 	struct scsipi_adapter *adapter = link->adapter;
768 	int s, error = 0;
769 
770 	s = splbio();
771 	if (adapter->scsipi_refcnt++ == 0 &&
772 	    adapter->scsipi_enable != NULL) {
773 		error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
774 		if (error)
775 			adapter->scsipi_refcnt--;
776 	}
777 	splx(s);
778 	return (error);
779 }
780 
781 /*
782  * Delete a reference to the adapter pointed to by the provided
783  * link, disabling the adapter if possible.
784  */
785 void
786 scsipi_adapter_delref(link)
787 	struct scsipi_link *link;
788 {
789 	struct scsipi_adapter *adapter = link->adapter;
790 	int s;
791 
792 	s = splbio();
793 	if (adapter->scsipi_refcnt-- == 1 &&
794 	    adapter->scsipi_enable != NULL)
795 		(void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
796 	splx(s);
797 }
798 
799 #ifdef	SCSIDEBUG
800 /*
801  * Given a scsipi_xfer, dump the request, in all it's glory
802  */
803 void
804 show_scsipi_xs(xs)
805 	struct scsipi_xfer *xs;
806 {
807 
808 	printf("xs(%p): ", xs);
809 	printf("flg(0x%x)", xs->flags);
810 	printf("sc_link(%p)", xs->sc_link);
811 	printf("retr(0x%x)", xs->retries);
812 	printf("timo(0x%x)", xs->timeout);
813 	printf("cmd(%p)", xs->cmd);
814 	printf("len(0x%x)", xs->cmdlen);
815 	printf("data(%p)", xs->data);
816 	printf("len(0x%x)", xs->datalen);
817 	printf("res(0x%x)", xs->resid);
818 	printf("err(0x%x)", xs->error);
819 	printf("bp(%p)", xs->bp);
820 	show_scsipi_cmd(xs);
821 }
822 
823 void
824 show_scsipi_cmd(xs)
825 	struct scsipi_xfer *xs;
826 {
827 	u_char *b = (u_char *) xs->cmd;
828 	int i = 0;
829 
830 	(*xs->sc_link->sc_print_addr)(xs->sc_link);
831 	printf("command: ");
832 
833 	if ((xs->flags & SCSI_RESET) == 0) {
834 		while (i < xs->cmdlen) {
835 			if (i)
836 				printf(",");
837 			printf("0x%x", b[i++]);
838 		}
839 		printf("-[%d bytes]\n", xs->datalen);
840 		if (xs->datalen)
841 			show_mem(xs->data, min(64, xs->datalen));
842 	} else
843 		printf("-RESET-\n");
844 }
845 
846 void
847 show_mem(address, num)
848 	u_char *address;
849 	int num;
850 {
851 	int x;
852 
853 	printf("------------------------------");
854 	for (x = 0; x < num; x++) {
855 		if ((x % 16) == 0)
856 			printf("\n%03d: ", x);
857 		printf("%02x ", *address++);
858 	}
859 	printf("\n------------------------------\n");
860 }
861 #endif /*SCSIDEBUG */
862