scsipi_base.c revision 1.29 1 /* $NetBSD: scsipi_base.c,v 1.29 2000/01/17 17:59:48 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 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 SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
109 if ((flags & XS_CTL_NOSLEEP) != 0) {
110 splx(s);
111 return (0);
112 }
113 sc_link->flags |= SDEV_WAITING;
114 (void)tsleep(sc_link, PRIBIO, "getxs", 0);
115 }
116 SC_DEBUG(sc_link, SDEV_DB3, ("calling pool_get\n"));
117 xs = pool_get(&scsipi_xfer_pool,
118 ((flags & XS_CTL_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
119 if (xs != NULL)
120 sc_link->active++;
121 else {
122 (*sc_link->sc_print_addr)(sc_link);
123 printf("cannot allocate scsipi xs\n");
124 }
125 splx(s);
126
127 SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
128
129 /*
130 * zeroes out the command, as ATAPI may use longer commands
131 * than SCSI
132 */
133 if (xs != NULL) {
134 xs->xs_control = flags;
135 TAILQ_INSERT_TAIL(&sc_link->pending_xfers, xs, device_q);
136 bzero(&xs->cmdstore, sizeof(xs->cmdstore));
137 }
138 return (xs);
139 }
140
141 /*
142 * Given a scsipi_xfer struct, and a device (referenced through sc_link)
143 * return the struct to the free pool and credit the device with it
144 * If another process is waiting for an xs, do a wakeup, let it proceed
145 *
146 * MUST BE CALLED AT splbio()!!
147 */
148 void
149 scsipi_free_xs(xs, flags)
150 struct scsipi_xfer *xs;
151 int flags;
152 {
153 struct scsipi_link *sc_link = xs->sc_link;
154
155 TAILQ_REMOVE(&sc_link->pending_xfers, xs, device_q);
156 if (TAILQ_FIRST(&sc_link->pending_xfers) == NULL &&
157 (sc_link->flags & SDEV_WAITDRAIN) != 0) {
158 sc_link->flags &= ~SDEV_WAITDRAIN;
159 wakeup(&sc_link->pending_xfers);
160 }
161 pool_put(&scsipi_xfer_pool, xs);
162
163 SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_free_xs\n"));
164 /* if was 0 and someone waits, wake them up */
165 sc_link->active--;
166 if ((sc_link->flags & SDEV_WAITING) != 0) {
167 sc_link->flags &= ~SDEV_WAITING;
168 wakeup(sc_link);
169 } else {
170 if (sc_link->device->start) {
171 SC_DEBUG(sc_link, SDEV_DB2,
172 ("calling private start()\n"));
173 (*(sc_link->device->start))(sc_link->device_softc);
174 }
175 }
176 }
177
178 /*
179 * Wait for a scsipi_link's pending xfers to drain.
180 */
181 void
182 scsipi_wait_drain(sc_link)
183 struct scsipi_link *sc_link;
184 {
185 int s;
186
187 s = splbio();
188 while (TAILQ_FIRST(&sc_link->pending_xfers) != NULL) {
189 sc_link->flags |= SDEV_WAITDRAIN;
190 (void) tsleep(&sc_link->pending_xfers, PRIBIO, "sxdrn", 0);
191 }
192 splx(s);
193 }
194
195 /*
196 * Kill off all pending xfers for a scsipi_link.
197 *
198 * Must be called at splbio().
199 */
200 void
201 scsipi_kill_pending(sc_link)
202 struct scsipi_link *sc_link;
203 {
204
205 (*sc_link->scsipi_kill_pending)(sc_link);
206 #ifdef DIAGNOSTIC
207 if (TAILQ_FIRST(&sc_link->pending_xfers) != NULL)
208 panic("scsipi_kill_pending");
209 #endif
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 ((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;
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 scsipi_free_xs(xs, XS_CTL_NOSLEEP);
604 SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
605 return;
606 }
607
608 if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
609 /*
610 * if it's a normal upper level request, then ask
611 * the upper level code to handle error checking
612 * rather than doing it here at interrupt time
613 */
614 wakeup(xs);
615 return;
616 }
617
618 /*
619 * Go and handle errors now.
620 * If it returns ERESTART then we should RETRY
621 */
622 retry:
623 error = sc_err1(xs, 1);
624 if (error == ERESTART) {
625 switch (scsipi_command_direct(xs)) {
626 case SUCCESSFULLY_QUEUED:
627 return;
628
629 case TRY_AGAIN_LATER:
630 xs->error = XS_BUSY;
631 case COMPLETE:
632 goto retry;
633 }
634 }
635
636 bp = xs->bp;
637 if (bp) {
638 if (error) {
639 bp->b_error = error;
640 bp->b_flags |= B_ERROR;
641 bp->b_resid = bp->b_bcount;
642 } else {
643 bp->b_error = 0;
644 bp->b_resid = xs->resid;
645 }
646 }
647 if (sc_link->device->done) {
648 /*
649 * Tell the device the operation is actually complete.
650 * No more will happen with this xfer. This for
651 * notification of the upper-level driver only; they
652 * won't be returning any meaningful information to us.
653 */
654 (*sc_link->device->done)(xs);
655 }
656 /*
657 * If this was an asynchronous operation (i.e. adapter
658 * returned SUCCESSFULLY_QUEUED when the command was
659 * submitted), we need to free the scsipi_xfer here.
660 */
661 if (xs->xs_control & XS_CTL_ASYNC) {
662 int s = splbio();
663 scsipi_free_xs(xs, XS_CTL_NOSLEEP);
664 splx(s);
665 }
666 if (bp)
667 biodone(bp);
668 }
669
670 int
671 scsipi_execute_xs(xs)
672 struct scsipi_xfer *xs;
673 {
674 int async;
675 int error;
676 int s;
677
678 xs->xs_status &= ~XS_STS_DONE;
679 xs->error = XS_NOERROR;
680 xs->resid = xs->datalen;
681 xs->status = 0;
682
683 retry:
684 /*
685 * Do the transfer. If we are polling we will return:
686 * COMPLETE, Was poll, and scsipi_done has been called
687 * TRY_AGAIN_LATER, Adapter short resources, try again
688 *
689 * if under full steam (interrupts) it will return:
690 * SUCCESSFULLY_QUEUED, will do a wakeup when complete
691 * TRY_AGAIN_LATER, (as for polling)
692 * After the wakeup, we must still check if it succeeded
693 *
694 * If we have a XS_CTL_ASYNC (typically because we have a buf)
695 * we just return. All the error proccessing and the buffer
696 * code both expect us to return straight to them, so as soon
697 * as the command is queued, return.
698 */
699 #ifdef SCSIDEBUG
700 if (xs->sc_link->flags & SDEV_DB3) {
701 printf("scsipi_exec_cmd: ");
702 show_scsipi_xs(xs);
703 printf("\n");
704 }
705 #endif
706 async = (xs->xs_control & XS_CTL_ASYNC);
707 switch (scsipi_command_direct(xs)) {
708 case SUCCESSFULLY_QUEUED:
709 if (async) {
710 /* scsipi_done() will free the scsipi_xfer. */
711 return (EJUSTRETURN);
712 }
713 #ifdef DIAGNOSTIC
714 if (xs->xs_control & XS_CTL_ASYNC)
715 panic("scsipi_execute_xs: ASYNC and POLL");
716 #endif
717 s = splbio();
718 while ((xs->xs_status & XS_STS_DONE) == 0)
719 tsleep(xs, PRIBIO + 1, "scsipi_cmd", 0);
720 splx(s);
721 case COMPLETE: /* Polling command completed ok */
722 if (xs->bp)
723 return (0);
724 doit:
725 SC_DEBUG(xs->sc_link, SDEV_DB3, ("back in cmd()\n"));
726 if ((error = sc_err1(xs, 0)) != ERESTART)
727 return (error);
728 goto retry;
729
730 case TRY_AGAIN_LATER: /* adapter resource shortage */
731 xs->error = XS_BUSY;
732 goto doit;
733
734 default:
735 panic("scsipi_execute_xs: invalid return code");
736 }
737
738 #ifdef DIAGNOSTIC
739 panic("scsipi_execute_xs: impossible");
740 #endif
741 return (EINVAL);
742 }
743
744 int
745 sc_err1(xs, async)
746 struct scsipi_xfer *xs;
747 int async;
748 {
749 int error;
750
751 SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
752
753 /*
754 * If it has a buf, we might be working with
755 * a request from the buffer cache or some other
756 * piece of code that requires us to process
757 * errors at inetrrupt time. We have probably
758 * been called by scsipi_done()
759 */
760 switch (xs->error) {
761 case XS_NOERROR: /* nearly always hit this one */
762 error = 0;
763 break;
764
765 case XS_SENSE:
766 case XS_SHORTSENSE:
767 if ((error = (*xs->sc_link->scsipi_interpret_sense)(xs)) ==
768 ERESTART)
769 goto retry;
770 SC_DEBUG(xs->sc_link, SDEV_DB3,
771 ("scsipi_interpret_sense returned %d\n", error));
772 break;
773
774 case XS_BUSY:
775 if (xs->retries) {
776 if ((xs->xs_control & XS_CTL_POLL) != 0)
777 delay(1000000);
778 else if ((xs->xs_control & (XS_CTL_NOSLEEP|XS_CTL_DISCOVERY)) == 0)
779 tsleep(&lbolt, PRIBIO, "scbusy", 0);
780 else
781 #if 0
782 timeout(scsipi_requeue, xs, hz);
783 #else
784 goto lose;
785 #endif
786 }
787 case XS_TIMEOUT:
788 retry:
789 if (xs->retries) {
790 xs->retries--;
791 xs->error = XS_NOERROR;
792 xs->xs_status &= ~XS_STS_DONE;
793 return (ERESTART);
794 }
795 case XS_DRIVER_STUFFUP:
796 lose:
797 error = EIO;
798 break;
799
800 case XS_SELTIMEOUT:
801 /* XXX Disable device? */
802 error = EIO;
803 break;
804
805 case XS_RESET:
806 if (xs->retries) {
807 SC_DEBUG(xs->sc_link, SDEV_DB3,
808 ("restarting command destroyed by reset\n"));
809 goto retry;
810 }
811 error = EIO;
812 break;
813
814 default:
815 (*xs->sc_link->sc_print_addr)(xs->sc_link);
816 printf("unknown error category from scsipi driver\n");
817 error = EIO;
818 break;
819 }
820
821 return (error);
822 }
823
824 /*
825 * Add a reference to the adapter pointed to by the provided
826 * link, enabling the adapter if necessary.
827 */
828 int
829 scsipi_adapter_addref(link)
830 struct scsipi_link *link;
831 {
832 struct scsipi_adapter *adapter = link->adapter;
833 int s, error = 0;
834
835 s = splbio();
836 if (adapter->scsipi_refcnt++ == 0 &&
837 adapter->scsipi_enable != NULL) {
838 error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
839 if (error)
840 adapter->scsipi_refcnt--;
841 }
842 splx(s);
843 return (error);
844 }
845
846 /*
847 * Delete a reference to the adapter pointed to by the provided
848 * link, disabling the adapter if possible.
849 */
850 void
851 scsipi_adapter_delref(link)
852 struct scsipi_link *link;
853 {
854 struct scsipi_adapter *adapter = link->adapter;
855 int s;
856
857 s = splbio();
858 if (adapter->scsipi_refcnt-- == 1 &&
859 adapter->scsipi_enable != NULL)
860 (void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
861 splx(s);
862 }
863
864 #ifdef SCSIDEBUG
865 /*
866 * Given a scsipi_xfer, dump the request, in all it's glory
867 */
868 void
869 show_scsipi_xs(xs)
870 struct scsipi_xfer *xs;
871 {
872
873 printf("xs(%p): ", xs);
874 printf("xs_control(0x%08x)", xs->xs_control);
875 printf("xs_status(0x%08x)", xs->xs_status);
876 printf("sc_link(%p)", xs->sc_link);
877 printf("retr(0x%x)", xs->retries);
878 printf("timo(0x%x)", xs->timeout);
879 printf("cmd(%p)", xs->cmd);
880 printf("len(0x%x)", xs->cmdlen);
881 printf("data(%p)", xs->data);
882 printf("len(0x%x)", xs->datalen);
883 printf("res(0x%x)", xs->resid);
884 printf("err(0x%x)", xs->error);
885 printf("bp(%p)", xs->bp);
886 show_scsipi_cmd(xs);
887 }
888
889 void
890 show_scsipi_cmd(xs)
891 struct scsipi_xfer *xs;
892 {
893 u_char *b = (u_char *) xs->cmd;
894 int i = 0;
895
896 (*xs->sc_link->sc_print_addr)(xs->sc_link);
897 printf("command: ");
898
899 if ((xs->xs_control & XS_CTL_RESET) == 0) {
900 while (i < xs->cmdlen) {
901 if (i)
902 printf(",");
903 printf("0x%x", b[i++]);
904 }
905 printf("-[%d bytes]\n", xs->datalen);
906 if (xs->datalen)
907 show_mem(xs->data, min(64, xs->datalen));
908 } else
909 printf("-RESET-\n");
910 }
911
912 void
913 show_mem(address, num)
914 u_char *address;
915 int num;
916 {
917 int x;
918
919 printf("------------------------------");
920 for (x = 0; x < num; x++) {
921 if ((x % 16) == 0)
922 printf("\n%03d: ", x);
923 printf("%02x ", *address++);
924 }
925 printf("\n------------------------------\n");
926 }
927 #endif /*SCSIDEBUG */
928