scsipi_base.c revision 1.20.2.4 1 /* $NetBSD: scsipi_base.c,v 1.20.2.4 2000/01/23 12:41:20 he 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 (sense->add_sense_code == 0x3A &&
291 sense->add_sense_code_qual == 0x00)
292 error = ENODEV; /* Medium not present */
293 else
294 error = EIO;
295 if ((xs->flags & SCSI_SILENT) != 0)
296 return (error);
297 break;
298 case SKEY_ILLEGAL_REQUEST:
299 if ((xs->flags & SCSI_IGNORE_ILLEGAL_REQUEST) != 0)
300 return (0);
301 if ((xs->flags & SCSI_SILENT) != 0)
302 return (EIO);
303 /*
304 * If we're probing and the device indicates LUNs
305 * aren't supported, shut up about it.
306 */
307 if ((xs->flags & SCSI_PROBE) != 0 &&
308 sense->add_sense_code == 0x25 &&
309 sense->add_sense_code_qual == 0x00)
310 return (EINVAL);
311 error = EINVAL;
312 break;
313 case SKEY_UNIT_ATTENTION:
314 if (sense->add_sense_code == 0x29 &&
315 sense->add_sense_code_qual == 0x00)
316 return (ERESTART); /* device or bus reset */
317 if ((sc_link->flags & SDEV_REMOVABLE) != 0)
318 sc_link->flags &= ~SDEV_MEDIA_LOADED;
319 if ((xs->flags & SCSI_IGNORE_MEDIA_CHANGE) != 0 ||
320 /* XXX Should reupload any transient state. */
321 (sc_link->flags & SDEV_REMOVABLE) == 0)
322 return (ERESTART);
323 if ((xs->flags & SCSI_SILENT) != 0)
324 return (EIO);
325 error = EIO;
326 break;
327 case SKEY_WRITE_PROTECT:
328 error = EROFS;
329 break;
330 case SKEY_BLANK_CHECK:
331 error = 0;
332 break;
333 case SKEY_ABORTED_COMMAND:
334 error = ERESTART;
335 break;
336 case SKEY_VOLUME_OVERFLOW:
337 error = ENOSPC;
338 break;
339 default:
340 error = EIO;
341 break;
342 }
343
344 #ifdef SCSIVERBOSE
345 if ((xs->flags & SCSI_SILENT) == 0)
346 scsipi_print_sense(xs, 0);
347 #else
348 if (key) {
349 sc_link->sc_print_addr(sc_link);
350 printf("%s", error_mes[key - 1]);
351 if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
352 switch (key) {
353 case SKEY_NOT_READY:
354 case SKEY_ILLEGAL_REQUEST:
355 case SKEY_UNIT_ATTENTION:
356 case SKEY_WRITE_PROTECT:
357 break;
358 case SKEY_BLANK_CHECK:
359 printf(", requested size: %d (decimal)",
360 info);
361 break;
362 case SKEY_ABORTED_COMMAND:
363 if (xs->retries)
364 printf(", retrying");
365 printf(", cmd 0x%x, info 0x%x",
366 xs->cmd->opcode, info);
367 break;
368 default:
369 printf(", info = %d (decimal)", info);
370 }
371 }
372 if (sense->extra_len != 0) {
373 int n;
374 printf(", data =");
375 for (n = 0; n < sense->extra_len; n++)
376 printf(" %02x",
377 sense->cmd_spec_info[n]);
378 }
379 printf("\n");
380 }
381 #endif
382 return (error);
383
384 /*
385 * Not code 70, just report it
386 */
387 default:
388 sc_link->sc_print_addr(sc_link);
389 printf("Sense Error Code 0x%x",
390 sense->error_code & SSD_ERRCODE);
391 if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
392 struct scsipi_sense_data_unextended *usense =
393 (struct scsipi_sense_data_unextended *)sense;
394 printf(" at block no. %d (decimal)",
395 _3btol(usense->block));
396 }
397 printf("\n");
398 return (EIO);
399 }
400 }
401
402 /*
403 * Find out from the device what its capacity is.
404 */
405 u_long
406 scsipi_size(sc_link, flags)
407 struct scsipi_link *sc_link;
408 int flags;
409 {
410 struct scsipi_read_cap_data rdcap;
411 struct scsipi_read_capacity scsipi_cmd;
412
413 /*
414 * make up a scsipi command and ask the scsipi driver to do
415 * it for you.
416 */
417 bzero(&scsipi_cmd, sizeof(scsipi_cmd));
418 scsipi_cmd.opcode = READ_CAPACITY;
419
420 /*
421 * If the command works, interpret the result as a 4 byte
422 * number of blocks
423 */
424 if (scsipi_command(sc_link, (struct scsipi_generic *)&scsipi_cmd,
425 sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
426 SCSIPIRETRIES, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
427 sc_link->sc_print_addr(sc_link);
428 printf("could not get size\n");
429 return (0);
430 }
431
432 return (_4btol(rdcap.addr) + 1);
433 }
434
435 /*
436 * Get scsipi driver to send a "are you ready?" command
437 */
438 int
439 scsipi_test_unit_ready(sc_link, flags)
440 struct scsipi_link *sc_link;
441 int flags;
442 {
443 struct scsipi_test_unit_ready scsipi_cmd;
444
445 /* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
446 if (sc_link->quirks & ADEV_NOTUR)
447 return (0);
448
449 bzero(&scsipi_cmd, sizeof(scsipi_cmd));
450 scsipi_cmd.opcode = TEST_UNIT_READY;
451
452 return (scsipi_command(sc_link,
453 (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
454 0, 0, SCSIPIRETRIES, 10000, NULL, flags));
455 }
456
457 /*
458 * Do a scsipi operation asking a device what it is
459 * Use the scsipi_cmd routine in the switch table.
460 * XXX actually this is only used for scsi devices, because I have the feeling
461 * that some atapi CDROM may not implement it, althouh it marked as mandatory
462 * in the atapi specs.
463 */
464 int
465 scsipi_inquire(sc_link, inqbuf, flags)
466 struct scsipi_link *sc_link;
467 struct scsipi_inquiry_data *inqbuf;
468 int flags;
469 {
470 struct scsipi_inquiry scsipi_cmd;
471
472 bzero(&scsipi_cmd, sizeof(scsipi_cmd));
473 scsipi_cmd.opcode = INQUIRY;
474 scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
475
476 return (scsipi_command(sc_link,
477 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
478 (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
479 SCSIPIRETRIES, 10000, NULL, SCSI_DATA_IN | flags));
480 }
481
482 /*
483 * Prevent or allow the user to remove the media
484 */
485 int
486 scsipi_prevent(sc_link, type, flags)
487 struct scsipi_link *sc_link;
488 int type, flags;
489 {
490 struct scsipi_prevent scsipi_cmd;
491
492 if (sc_link->quirks & ADEV_NODOORLOCK)
493 return (0);
494
495 bzero(&scsipi_cmd, sizeof(scsipi_cmd));
496 scsipi_cmd.opcode = PREVENT_ALLOW;
497 scsipi_cmd.how = type;
498 return (scsipi_command(sc_link,
499 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
500 0, 0, SCSIPIRETRIES, 5000, NULL, flags));
501 }
502
503 /*
504 * Get scsipi driver to send a "start up" command
505 */
506 int
507 scsipi_start(sc_link, type, flags)
508 struct scsipi_link *sc_link;
509 int type, flags;
510 {
511 struct scsipi_start_stop scsipi_cmd;
512
513 if (sc_link->quirks & SDEV_NOSTARTUNIT)
514 return 0;
515
516 bzero(&scsipi_cmd, sizeof(scsipi_cmd));
517 scsipi_cmd.opcode = START_STOP;
518 scsipi_cmd.byte2 = 0x00;
519 scsipi_cmd.how = type;
520 return (scsipi_command(sc_link,
521 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
522 0, 0, SCSIPIRETRIES, (type & SSS_START) ? 30000 : 10000,
523 NULL, flags));
524 }
525
526 /*
527 * This routine is called by the scsipi interrupt when the transfer is
528 * complete.
529 */
530 void
531 scsipi_done(xs)
532 struct scsipi_xfer *xs;
533 {
534 struct scsipi_link *sc_link = xs->sc_link;
535 struct buf *bp;
536 int error;
537
538 SC_DEBUG(sc_link, SDEV_DB2, ("scsipi_done\n"));
539 #ifdef SCSIDEBUG
540 if ((sc_link->flags & SDEV_DB1) != 0)
541 show_scsipi_cmd(xs);
542 #endif /* SCSIDEBUG */
543
544 /*
545 * If it's a user level request, bypass all usual completion
546 * processing, let the user work it out.. We take
547 * reponsibility for freeing the xs when the user returns.
548 * (and restarting the device's queue).
549 */
550 if ((xs->flags & SCSI_USER) != 0) {
551 SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
552 scsipi_user_done(xs); /* to take a copy of the sense etc. */
553 SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
554
555 /*
556 * If this was an asynchronous operation (i.e. adapter
557 * returned SUCCESSFULLY_QUEUED when the command was
558 * submitted), we need to free the scsipi_xfer here.
559 */
560 if (SCSIPI_XFER_ASYNC(xs))
561 scsipi_free_xs(xs, SCSI_NOSLEEP);
562 SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
563 return;
564 }
565
566 if (!SCSIPI_XFER_ASYNC(xs)) {
567 /*
568 * if it's a normal upper level request, then ask
569 * the upper level code to handle error checking
570 * rather than doing it here at interrupt time
571 */
572 wakeup(xs);
573 return;
574 }
575
576 /*
577 * Go and handle errors now.
578 * If it returns ERESTART then we should RETRY
579 */
580 retry:
581 error = sc_err1(xs, 1);
582 if (error == ERESTART) {
583 switch (scsipi_command_direct(xs)) {
584 case SUCCESSFULLY_QUEUED:
585 return;
586
587 case TRY_AGAIN_LATER:
588 xs->error = XS_BUSY;
589 case COMPLETE:
590 goto retry;
591 }
592 }
593
594 bp = xs->bp;
595 if (bp) {
596 if (error) {
597 bp->b_error = error;
598 bp->b_flags |= B_ERROR;
599 bp->b_resid = bp->b_bcount;
600 } else {
601 bp->b_error = 0;
602 bp->b_resid = xs->resid;
603 }
604 }
605 if (sc_link->device->done) {
606 /*
607 * Tell the device the operation is actually complete.
608 * No more will happen with this xfer. This for
609 * notification of the upper-level driver only; they
610 * won't be returning any meaningful information to us.
611 */
612 (*sc_link->device->done)(xs);
613 }
614 /*
615 * If this was an asynchronous operation (i.e. adapter
616 * returned SUCCESSFULLY_QUEUED when the command was
617 * submitted), we need to free the scsipi_xfer here.
618 */
619 if (SCSIPI_XFER_ASYNC(xs)) {
620 int s = splbio();
621 scsipi_free_xs(xs, SCSI_NOSLEEP);
622 splx(s);
623 }
624 if (bp)
625 biodone(bp);
626 }
627
628 int
629 scsipi_execute_xs(xs)
630 struct scsipi_xfer *xs;
631 {
632 int async;
633 int error;
634 int s;
635
636 xs->flags &= ~ITSDONE;
637 xs->error = XS_NOERROR;
638 xs->resid = xs->datalen;
639 xs->status = 0;
640
641 retry:
642 /*
643 * Do the transfer. If we are polling we will return:
644 * COMPLETE, Was poll, and scsipi_done has been called
645 * TRY_AGAIN_LATER, Adapter short resources, try again
646 *
647 * if under full steam (interrupts) it will return:
648 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
649 * TRY_AGAIN_LATER, (as for polling)
650 * After the wakeup, we must still check if it succeeded
651 *
652 * If we have a SCSI_NOSLEEP (typically because we have a buf)
653 * we just return. All the error proccessing and the buffer
654 * code both expect us to return straight to them, so as soon
655 * as the command is queued, return.
656 */
657 #ifdef SCSIDEBUG
658 if (xs->sc_link->flags & SDEV_DB3) {
659 printf("scsipi_exec_cmd: ");
660 show_scsipi_xs(xs);
661 printf("\n");
662 }
663 #endif
664 async = SCSIPI_XFER_ASYNC(xs);
665 switch (scsipi_command_direct(xs)) {
666 case SUCCESSFULLY_QUEUED:
667 if (async) {
668 /* scsipi_done() will free the scsipi_xfer. */
669 return (EJUSTRETURN);
670 }
671 #ifdef DIAGNOSTIC
672 if (xs->flags & SCSI_NOSLEEP)
673 panic("scsipi_execute_xs: NOSLEEP and POLL");
674 #endif
675 s = splbio();
676 while ((xs->flags & ITSDONE) == 0)
677 tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
678 splx(s);
679 case COMPLETE: /* Polling command completed ok */
680 if (xs->bp)
681 return (0);
682 doit:
683 SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
684 if ((error = sc_err1(xs, 0)) != ERESTART)
685 return (error);
686 goto retry;
687
688 case TRY_AGAIN_LATER: /* adapter resource shortage */
689 xs->error = XS_BUSY;
690 goto doit;
691
692 default:
693 panic("scsipi_execute_xs: invalid return code");
694 }
695
696 #ifdef DIAGNOSTIC
697 panic("scsipi_execute_xs: impossible");
698 #endif
699 return (EINVAL);
700 }
701
702 int
703 sc_err1(xs, async)
704 struct scsipi_xfer *xs;
705 int async;
706 {
707 int error;
708
709 SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
710
711 /*
712 * If it has a buf, we might be working with
713 * a request from the buffer cache or some other
714 * piece of code that requires us to process
715 * errors at inetrrupt time. We have probably
716 * been called by scsipi_done()
717 */
718 switch (xs->error) {
719 case XS_NOERROR: /* nearly always hit this one */
720 error = 0;
721 break;
722
723 case XS_SENSE:
724 case XS_SHORTSENSE:
725 if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
726 ERESTART)
727 goto retry;
728 SC_DEBUG(xs->sc_link, SDEV_DB3,
729 ("scsipi_interpret_sense returned %d\n", error));
730 break;
731
732 case XS_BUSY:
733 if (xs->retries) {
734 if ((xs->flags & SCSI_POLL) != 0)
735 delay(1000000);
736 else if ((xs->flags & SCSI_NOSLEEP) == 0)
737 tsleep(&lbolt, PRIBIO, "scbusy", 0);
738 else
739 #if 0
740 timeout(scsipi_requeue, xs, hz);
741 #else
742 goto lose;
743 #endif
744 }
745 case XS_TIMEOUT:
746 retry:
747 if (xs->retries) {
748 xs->retries--;
749 xs->error = XS_NOERROR;
750 xs->flags &= ~ITSDONE;
751 return (ERESTART);
752 }
753 case XS_DRIVER_STUFFUP:
754 lose:
755 error = EIO;
756 break;
757
758 case XS_SELTIMEOUT:
759 /* XXX Disable device? */
760 error = EIO;
761 break;
762
763 case XS_RESET:
764 if (xs->retries) {
765 SC_DEBUG(xs->sc_link, SDEV_DB3,
766 ("restarting command destroyed by reset\n"));
767 goto retry;
768 }
769 error = EIO;
770 break;
771
772 default:
773 (*xs->sc_link->sc_print_addr)(xs->sc_link);
774 printf("unknown error category from scsipi driver\n");
775 error = EIO;
776 break;
777 }
778
779 return (error);
780 }
781
782 /*
783 * Add a reference to the adapter pointed to by the provided
784 * link, enabling the adapter if necessary.
785 */
786 int
787 scsipi_adapter_addref(link)
788 struct scsipi_link *link;
789 {
790 struct scsipi_adapter *adapter = link->adapter;
791 int s, error = 0;
792
793 s = splbio();
794 if (adapter->scsipi_refcnt++ == 0 &&
795 adapter->scsipi_enable != NULL) {
796 error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
797 if (error)
798 adapter->scsipi_refcnt--;
799 }
800 splx(s);
801 return (error);
802 }
803
804 /*
805 * Delete a reference to the adapter pointed to by the provided
806 * link, disabling the adapter if possible.
807 */
808 void
809 scsipi_adapter_delref(link)
810 struct scsipi_link *link;
811 {
812 struct scsipi_adapter *adapter = link->adapter;
813 int s;
814
815 s = splbio();
816 if (adapter->scsipi_refcnt-- == 1 &&
817 adapter->scsipi_enable != NULL)
818 (void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
819 splx(s);
820 }
821
822 #ifdef SCSIDEBUG
823 /*
824 * Given a scsipi_xfer, dump the request, in all it's glory
825 */
826 void
827 show_scsipi_xs(xs)
828 struct scsipi_xfer *xs;
829 {
830
831 printf("xs(%p): ", xs);
832 printf("flg(0x%x)", xs->flags);
833 printf("sc_link(%p)", xs->sc_link);
834 printf("retr(0x%x)", xs->retries);
835 printf("timo(0x%x)", xs->timeout);
836 printf("cmd(%p)", xs->cmd);
837 printf("len(0x%x)", xs->cmdlen);
838 printf("data(%p)", xs->data);
839 printf("len(0x%x)", xs->datalen);
840 printf("res(0x%x)", xs->resid);
841 printf("err(0x%x)", xs->error);
842 printf("bp(%p)", xs->bp);
843 show_scsipi_cmd(xs);
844 }
845
846 void
847 show_scsipi_cmd(xs)
848 struct scsipi_xfer *xs;
849 {
850 u_char *b = (u_char *) xs->cmd;
851 int i = 0;
852
853 (*xs->sc_link->sc_print_addr)(xs->sc_link);
854 printf("command: ");
855
856 if ((xs->flags & SCSI_RESET) == 0) {
857 while (i < xs->cmdlen) {
858 if (i)
859 printf(",");
860 printf("0x%x", b[i++]);
861 }
862 printf("-[%d bytes]\n", xs->datalen);
863 if (xs->datalen)
864 show_mem(xs->data, min(64, xs->datalen));
865 } else
866 printf("-RESET-\n");
867 }
868
869 void
870 show_mem(address, num)
871 u_char *address;
872 int num;
873 {
874 int x;
875
876 printf("------------------------------");
877 for (x = 0; x < num; x++) {
878 if ((x % 16) == 0)
879 printf("\n%03d: ", x);
880 printf("%02x ", *address++);
881 }
882 printf("\n------------------------------\n");
883 }
884 #endif /*SCSIDEBUG */
885