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