scsipi_base.c revision 1.35.2.1 1 /* $NetBSD: scsipi_base.c,v 1.35.2.1 2000/06/22 17:08:14 minoura 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 ((flags & XS_CTL_URGENT) == 0)) {
109 SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
110 if ((flags & XS_CTL_NOSLEEP) != 0) {
111 splx(s);
112 return (0);
113 }
114 sc_link->flags |= SDEV_WAITING;
115 (void)tsleep(sc_link, PRIBIO, "getxs", 0);
116 }
117 SC_DEBUG(sc_link, SDEV_DB3, ("calling pool_get\n"));
118 xs = pool_get(&scsipi_xfer_pool,
119 ((flags & XS_CTL_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
120 if (xs != NULL)
121 sc_link->active++;
122 else {
123 (*sc_link->sc_print_addr)(sc_link);
124 printf("cannot allocate scsipi xs\n");
125 }
126 splx(s);
127
128 SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
129
130 /*
131 * zeroes out the command, as ATAPI may use longer commands
132 * than SCSI
133 */
134 if (xs != NULL) {
135 callout_init(&xs->xs_callout);
136 xs->xs_control = flags;
137 xs->xs_status = 0;
138 TAILQ_INSERT_TAIL(&sc_link->pending_xfers, xs, device_q);
139 bzero(&xs->cmdstore, sizeof(xs->cmdstore));
140 }
141 return (xs);
142 }
143
144 /*
145 * Given a scsipi_xfer struct, and a device (referenced through sc_link)
146 * return the struct to the free pool and credit the device with it
147 * If another process is waiting for an xs, do a wakeup, let it proceed
148 *
149 * MUST BE CALLED AT splbio()!!
150 */
151 void
152 scsipi_free_xs(xs, flags)
153 struct scsipi_xfer *xs;
154 int flags;
155 {
156 struct scsipi_link *sc_link = xs->sc_link;
157
158 TAILQ_REMOVE(&sc_link->pending_xfers, xs, device_q);
159 if (TAILQ_FIRST(&sc_link->pending_xfers) == NULL &&
160 (sc_link->flags & SDEV_WAITDRAIN) != 0) {
161 sc_link->flags &= ~SDEV_WAITDRAIN;
162 wakeup(&sc_link->pending_xfers);
163 }
164 pool_put(&scsipi_xfer_pool, xs);
165
166 SC_DEBUG(sc_link, SDEV_DB3, ("scsipi_free_xs\n"));
167 /* if was 0 and someone waits, wake them up */
168 sc_link->active--;
169 if ((sc_link->flags & SDEV_WAITING) != 0) {
170 sc_link->flags &= ~SDEV_WAITING;
171 wakeup(sc_link);
172 } else {
173 if (sc_link->device->start) {
174 SC_DEBUG(sc_link, SDEV_DB2,
175 ("calling private start()\n"));
176 (*(sc_link->device->start))(sc_link->device_softc);
177 }
178 }
179 }
180
181 /*
182 * Wait for a scsipi_link's pending xfers to drain.
183 */
184 void
185 scsipi_wait_drain(sc_link)
186 struct scsipi_link *sc_link;
187 {
188 int s;
189
190 s = splbio();
191 while (TAILQ_FIRST(&sc_link->pending_xfers) != NULL) {
192 sc_link->flags |= SDEV_WAITDRAIN;
193 (void) tsleep(&sc_link->pending_xfers, PRIBIO, "sxdrn", 0);
194 }
195 splx(s);
196 }
197
198 /*
199 * Kill off all pending xfers for a scsipi_link.
200 *
201 * Must be called at splbio().
202 */
203 void
204 scsipi_kill_pending(sc_link)
205 struct scsipi_link *sc_link;
206 {
207
208 (*sc_link->scsipi_kill_pending)(sc_link);
209 scsipi_wait_drain(sc_link);
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 (key && (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,
469 flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK) != 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 (!async && (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 retry;
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 error = EIO;
802 break;
803
804 case XS_SELTIMEOUT:
805 /* XXX Disable device? */
806 error = EIO;
807 break;
808
809 case XS_RESET:
810 if (xs->retries) {
811 SC_DEBUG(xs->sc_link, SDEV_DB3,
812 ("restarting command destroyed by reset\n"));
813 goto retry;
814 }
815 error = EIO;
816 break;
817
818 default:
819 (*xs->sc_link->sc_print_addr)(xs->sc_link);
820 printf("unknown error category from scsipi driver\n");
821 error = EIO;
822 break;
823 }
824
825 return (error);
826 }
827
828 /*
829 * Add a reference to the adapter pointed to by the provided
830 * link, enabling the adapter if necessary.
831 */
832 int
833 scsipi_adapter_addref(link)
834 struct scsipi_link *link;
835 {
836 struct scsipi_adapter *adapter = link->adapter;
837 int s, error = 0;
838
839 s = splbio();
840 if (adapter->scsipi_refcnt++ == 0 &&
841 adapter->scsipi_enable != NULL) {
842 error = (*adapter->scsipi_enable)(link->adapter_softc, 1);
843 if (error)
844 adapter->scsipi_refcnt--;
845 }
846 splx(s);
847 return (error);
848 }
849
850 /*
851 * Delete a reference to the adapter pointed to by the provided
852 * link, disabling the adapter if possible.
853 */
854 void
855 scsipi_adapter_delref(link)
856 struct scsipi_link *link;
857 {
858 struct scsipi_adapter *adapter = link->adapter;
859 int s;
860
861 s = splbio();
862 if (adapter->scsipi_refcnt-- == 1 &&
863 adapter->scsipi_enable != NULL)
864 (void) (*adapter->scsipi_enable)(link->adapter_softc, 0);
865 splx(s);
866 }
867
868 #ifdef SCSIDEBUG
869 /*
870 * Given a scsipi_xfer, dump the request, in all it's glory
871 */
872 void
873 show_scsipi_xs(xs)
874 struct scsipi_xfer *xs;
875 {
876
877 printf("xs(%p): ", xs);
878 printf("xs_control(0x%08x)", xs->xs_control);
879 printf("xs_status(0x%08x)", xs->xs_status);
880 printf("sc_link(%p)", xs->sc_link);
881 printf("retr(0x%x)", xs->retries);
882 printf("timo(0x%x)", xs->timeout);
883 printf("cmd(%p)", xs->cmd);
884 printf("len(0x%x)", xs->cmdlen);
885 printf("data(%p)", xs->data);
886 printf("len(0x%x)", xs->datalen);
887 printf("res(0x%x)", xs->resid);
888 printf("err(0x%x)", xs->error);
889 printf("bp(%p)", xs->bp);
890 show_scsipi_cmd(xs);
891 }
892
893 void
894 show_scsipi_cmd(xs)
895 struct scsipi_xfer *xs;
896 {
897 u_char *b = (u_char *) xs->cmd;
898 int i = 0;
899
900 (*xs->sc_link->sc_print_addr)(xs->sc_link);
901 printf("command: ");
902
903 if ((xs->xs_control & XS_CTL_RESET) == 0) {
904 while (i < xs->cmdlen) {
905 if (i)
906 printf(",");
907 printf("0x%x", b[i++]);
908 }
909 printf("-[%d bytes]\n", xs->datalen);
910 if (xs->datalen)
911 show_mem(xs->data, min(64, xs->datalen));
912 } else
913 printf("-RESET-\n");
914 }
915
916 void
917 show_mem(address, num)
918 u_char *address;
919 int num;
920 {
921 int x;
922
923 printf("------------------------------");
924 for (x = 0; x < num; x++) {
925 if ((x % 16) == 0)
926 printf("\n%03d: ", x);
927 printf("%02x ", *address++);
928 }
929 printf("\n------------------------------\n");
930 }
931 #endif /*SCSIDEBUG */
932