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