scsipi_base.c revision 1.92 1 /* $NetBSD: scsipi_base.c,v 1.92 2003/09/08 18:51:36 mycroft Exp $ */
2
3 /*-
4 * Copyright (c) 1998, 1999, 2000, 2002, 2003 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; by Jason R. Thorpe of the Numerical Aerospace
9 * Simulation Facility, NASA Ames Research Center.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40 #include <sys/cdefs.h>
41 __KERNEL_RCSID(0, "$NetBSD: scsipi_base.c,v 1.92 2003/09/08 18:51:36 mycroft Exp $");
42
43 #include "opt_scsi.h"
44
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/kernel.h>
48 #include <sys/buf.h>
49 #include <sys/uio.h>
50 #include <sys/malloc.h>
51 #include <sys/pool.h>
52 #include <sys/errno.h>
53 #include <sys/device.h>
54 #include <sys/proc.h>
55 #include <sys/kthread.h>
56 #include <sys/hash.h>
57
58 #include <dev/scsipi/scsipi_all.h>
59 #include <dev/scsipi/scsipi_disk.h>
60 #include <dev/scsipi/scsipiconf.h>
61 #include <dev/scsipi/scsipi_base.h>
62
63 #include <dev/scsipi/scsi_all.h>
64 #include <dev/scsipi/scsi_message.h>
65
66 int scsipi_complete __P((struct scsipi_xfer *));
67 void scsipi_request_sense __P((struct scsipi_xfer *));
68 int scsipi_enqueue __P((struct scsipi_xfer *));
69 void scsipi_run_queue __P((struct scsipi_channel *chan));
70
71 void scsipi_completion_thread __P((void *));
72
73 void scsipi_get_tag __P((struct scsipi_xfer *));
74 void scsipi_put_tag __P((struct scsipi_xfer *));
75
76 int scsipi_get_resource __P((struct scsipi_channel *));
77 void scsipi_put_resource __P((struct scsipi_channel *));
78 __inline int scsipi_grow_resources __P((struct scsipi_channel *));
79
80 void scsipi_async_event_max_openings __P((struct scsipi_channel *,
81 struct scsipi_max_openings *));
82 void scsipi_async_event_xfer_mode __P((struct scsipi_channel *,
83 struct scsipi_xfer_mode *));
84 void scsipi_async_event_channel_reset __P((struct scsipi_channel *));
85
86 struct pool scsipi_xfer_pool;
87
88 /*
89 * scsipi_init:
90 *
91 * Called when a scsibus or atapibus is attached to the system
92 * to initialize shared data structures.
93 */
94 void
95 scsipi_init()
96 {
97 static int scsipi_init_done;
98
99 if (scsipi_init_done)
100 return;
101 scsipi_init_done = 1;
102
103 /* Initialize the scsipi_xfer pool. */
104 pool_init(&scsipi_xfer_pool, sizeof(struct scsipi_xfer), 0,
105 0, 0, "scxspl", NULL);
106 }
107
108 /*
109 * scsipi_channel_init:
110 *
111 * Initialize a scsipi_channel when it is attached.
112 */
113 int
114 scsipi_channel_init(chan)
115 struct scsipi_channel *chan;
116 {
117 int i;
118
119 /* Initialize shared data. */
120 scsipi_init();
121
122 /* Initialize the queues. */
123 TAILQ_INIT(&chan->chan_queue);
124 TAILQ_INIT(&chan->chan_complete);
125
126 for (i = 0; i < SCSIPI_CHAN_PERIPH_BUCKETS; i++)
127 LIST_INIT(&chan->chan_periphtab[i]);
128
129 /*
130 * Create the asynchronous completion thread.
131 */
132 kthread_create(scsipi_create_completion_thread, chan);
133 return (0);
134 }
135
136 /*
137 * scsipi_channel_shutdown:
138 *
139 * Shutdown a scsipi_channel.
140 */
141 void
142 scsipi_channel_shutdown(chan)
143 struct scsipi_channel *chan;
144 {
145
146 /*
147 * Shut down the completion thread.
148 */
149 chan->chan_tflags |= SCSIPI_CHANT_SHUTDOWN;
150 wakeup(&chan->chan_complete);
151
152 /*
153 * Now wait for the thread to exit.
154 */
155 while (chan->chan_thread != NULL)
156 (void) tsleep(&chan->chan_thread, PRIBIO, "scshut", 0);
157 }
158
159 static uint32_t
160 scsipi_chan_periph_hash(uint64_t t, uint64_t l)
161 {
162 uint32_t hash;
163
164 hash = hash32_buf(&t, sizeof(t), HASH32_BUF_INIT);
165 hash = hash32_buf(&l, sizeof(l), hash);
166
167 return (hash & SCSIPI_CHAN_PERIPH_HASHMASK);
168 }
169
170 /*
171 * scsipi_insert_periph:
172 *
173 * Insert a periph into the channel.
174 */
175 void
176 scsipi_insert_periph(chan, periph)
177 struct scsipi_channel *chan;
178 struct scsipi_periph *periph;
179 {
180 uint32_t hash;
181 int s;
182
183 hash = scsipi_chan_periph_hash(periph->periph_target,
184 periph->periph_lun);
185
186 s = splbio();
187 LIST_INSERT_HEAD(&chan->chan_periphtab[hash], periph, periph_hash);
188 splx(s);
189 }
190
191 /*
192 * scsipi_remove_periph:
193 *
194 * Remove a periph from the channel.
195 */
196 void
197 scsipi_remove_periph(chan, periph)
198 struct scsipi_channel *chan;
199 struct scsipi_periph *periph;
200 {
201 int s;
202
203 s = splbio();
204 LIST_REMOVE(periph, periph_hash);
205 splx(s);
206 }
207
208 /*
209 * scsipi_lookup_periph:
210 *
211 * Lookup a periph on the specified channel.
212 */
213 struct scsipi_periph *
214 scsipi_lookup_periph(chan, target, lun)
215 struct scsipi_channel *chan;
216 int target, lun;
217 {
218 struct scsipi_periph *periph;
219 uint32_t hash;
220 int s;
221
222 if (target >= chan->chan_ntargets ||
223 lun >= chan->chan_nluns)
224 return (NULL);
225
226 hash = scsipi_chan_periph_hash(target, lun);
227
228 s = splbio();
229 LIST_FOREACH(periph, &chan->chan_periphtab[hash], periph_hash) {
230 if (periph->periph_target == target &&
231 periph->periph_lun == lun)
232 break;
233 }
234 splx(s);
235
236 return (periph);
237 }
238
239 /*
240 * scsipi_get_resource:
241 *
242 * Allocate a single xfer `resource' from the channel.
243 *
244 * NOTE: Must be called at splbio().
245 */
246 int
247 scsipi_get_resource(chan)
248 struct scsipi_channel *chan;
249 {
250 struct scsipi_adapter *adapt = chan->chan_adapter;
251
252 if (chan->chan_flags & SCSIPI_CHAN_OPENINGS) {
253 if (chan->chan_openings > 0) {
254 chan->chan_openings--;
255 return (1);
256 }
257 return (0);
258 }
259
260 if (adapt->adapt_openings > 0) {
261 adapt->adapt_openings--;
262 return (1);
263 }
264 return (0);
265 }
266
267 /*
268 * scsipi_grow_resources:
269 *
270 * Attempt to grow resources for a channel. If this succeeds,
271 * we allocate one for our caller.
272 *
273 * NOTE: Must be called at splbio().
274 */
275 __inline int
276 scsipi_grow_resources(chan)
277 struct scsipi_channel *chan;
278 {
279
280 if (chan->chan_flags & SCSIPI_CHAN_CANGROW) {
281 if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
282 scsipi_adapter_request(chan,
283 ADAPTER_REQ_GROW_RESOURCES, NULL);
284 return (scsipi_get_resource(chan));
285 }
286 /*
287 * ask the channel thread to do it. It'll have to thaw the
288 * queue
289 */
290 scsipi_channel_freeze(chan, 1);
291 chan->chan_tflags |= SCSIPI_CHANT_GROWRES;
292 wakeup(&chan->chan_complete);
293 return (0);
294 }
295
296 return (0);
297 }
298
299 /*
300 * scsipi_put_resource:
301 *
302 * Free a single xfer `resource' to the channel.
303 *
304 * NOTE: Must be called at splbio().
305 */
306 void
307 scsipi_put_resource(chan)
308 struct scsipi_channel *chan;
309 {
310 struct scsipi_adapter *adapt = chan->chan_adapter;
311
312 if (chan->chan_flags & SCSIPI_CHAN_OPENINGS)
313 chan->chan_openings++;
314 else
315 adapt->adapt_openings++;
316 }
317
318 /*
319 * scsipi_get_tag:
320 *
321 * Get a tag ID for the specified xfer.
322 *
323 * NOTE: Must be called at splbio().
324 */
325 void
326 scsipi_get_tag(xs)
327 struct scsipi_xfer *xs;
328 {
329 struct scsipi_periph *periph = xs->xs_periph;
330 int bit, tag;
331 u_int word;
332
333 for (word = 0; word < PERIPH_NTAGWORDS; word++) {
334 bit = ffs(periph->periph_freetags[word]);
335 if (bit != 0)
336 break;
337 }
338 #ifdef DIAGNOSTIC
339 if (word == PERIPH_NTAGWORDS) {
340 scsipi_printaddr(periph);
341 printf("no free tags\n");
342 panic("scsipi_get_tag");
343 }
344 #endif
345
346 bit -= 1;
347 periph->periph_freetags[word] &= ~(1 << bit);
348 tag = (word << 5) | bit;
349
350 /* XXX Should eventually disallow this completely. */
351 if (tag >= periph->periph_openings) {
352 scsipi_printaddr(periph);
353 printf("WARNING: tag %d greater than available openings %d\n",
354 tag, periph->periph_openings);
355 }
356
357 xs->xs_tag_id = tag;
358 }
359
360 /*
361 * scsipi_put_tag:
362 *
363 * Put the tag ID for the specified xfer back into the pool.
364 *
365 * NOTE: Must be called at splbio().
366 */
367 void
368 scsipi_put_tag(xs)
369 struct scsipi_xfer *xs;
370 {
371 struct scsipi_periph *periph = xs->xs_periph;
372 int word, bit;
373
374 word = xs->xs_tag_id >> 5;
375 bit = xs->xs_tag_id & 0x1f;
376
377 periph->periph_freetags[word] |= (1 << bit);
378 }
379
380 /*
381 * scsipi_get_xs:
382 *
383 * Allocate an xfer descriptor and associate it with the
384 * specified peripherial. If the peripherial has no more
385 * available command openings, we either block waiting for
386 * one to become available, or fail.
387 */
388 struct scsipi_xfer *
389 scsipi_get_xs(periph, flags)
390 struct scsipi_periph *periph;
391 int flags;
392 {
393 struct scsipi_xfer *xs;
394 int s;
395
396 SC_DEBUG(periph, SCSIPI_DB3, ("scsipi_get_xs\n"));
397
398 /*
399 * If we're cold, make sure we poll.
400 */
401 if (cold)
402 flags |= XS_CTL_NOSLEEP | XS_CTL_POLL;
403
404 #ifdef DIAGNOSTIC
405 /*
406 * URGENT commands can never be ASYNC.
407 */
408 if ((flags & (XS_CTL_URGENT|XS_CTL_ASYNC)) ==
409 (XS_CTL_URGENT|XS_CTL_ASYNC)) {
410 scsipi_printaddr(periph);
411 printf("URGENT and ASYNC\n");
412 panic("scsipi_get_xs");
413 }
414 #endif
415
416 s = splbio();
417 /*
418 * Wait for a command opening to become available. Rules:
419 *
420 * - All xfers must wait for an available opening.
421 * Exception: URGENT xfers can proceed when
422 * active == openings, because we use the opening
423 * of the command we're recovering for.
424 * - if the periph has sense pending, only URGENT & REQSENSE
425 * xfers may proceed.
426 *
427 * - If the periph is recovering, only URGENT xfers may
428 * proceed.
429 *
430 * - If the periph is currently executing a recovery
431 * command, URGENT commands must block, because only
432 * one recovery command can execute at a time.
433 */
434 for (;;) {
435 if (flags & XS_CTL_URGENT) {
436 if (periph->periph_active > periph->periph_openings)
437 goto wait_for_opening;
438 if (periph->periph_flags & PERIPH_SENSE) {
439 if ((flags & XS_CTL_REQSENSE) == 0)
440 goto wait_for_opening;
441 } else {
442 if ((periph->periph_flags &
443 PERIPH_RECOVERY_ACTIVE) != 0)
444 goto wait_for_opening;
445 periph->periph_flags |= PERIPH_RECOVERY_ACTIVE;
446 }
447 break;
448 }
449 if (periph->periph_active >= periph->periph_openings ||
450 (periph->periph_flags & PERIPH_RECOVERING) != 0)
451 goto wait_for_opening;
452 periph->periph_active++;
453 break;
454
455 wait_for_opening:
456 if (flags & XS_CTL_NOSLEEP) {
457 splx(s);
458 return (NULL);
459 }
460 SC_DEBUG(periph, SCSIPI_DB3, ("sleeping\n"));
461 periph->periph_flags |= PERIPH_WAITING;
462 (void) tsleep(periph, PRIBIO, "getxs", 0);
463 }
464 SC_DEBUG(periph, SCSIPI_DB3, ("calling pool_get\n"));
465 xs = pool_get(&scsipi_xfer_pool,
466 ((flags & XS_CTL_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
467 if (xs == NULL) {
468 if (flags & XS_CTL_URGENT) {
469 if ((flags & XS_CTL_REQSENSE) == 0)
470 periph->periph_flags &= ~PERIPH_RECOVERY_ACTIVE;
471 } else
472 periph->periph_active--;
473 scsipi_printaddr(periph);
474 printf("unable to allocate %sscsipi_xfer\n",
475 (flags & XS_CTL_URGENT) ? "URGENT " : "");
476 }
477 splx(s);
478
479 SC_DEBUG(periph, SCSIPI_DB3, ("returning\n"));
480
481 if (xs != NULL) {
482 callout_init(&xs->xs_callout);
483 memset(xs, 0, sizeof(*xs));
484 xs->xs_periph = periph;
485 xs->xs_control = flags;
486 xs->xs_status = 0;
487 s = splbio();
488 TAILQ_INSERT_TAIL(&periph->periph_xferq, xs, device_q);
489 splx(s);
490 }
491 return (xs);
492 }
493
494 /*
495 * scsipi_put_xs:
496 *
497 * Release an xfer descriptor, decreasing the outstanding command
498 * count for the peripherial. If there is a thread waiting for
499 * an opening, wake it up. If not, kick any queued I/O the
500 * peripherial may have.
501 *
502 * NOTE: Must be called at splbio().
503 */
504 void
505 scsipi_put_xs(xs)
506 struct scsipi_xfer *xs;
507 {
508 struct scsipi_periph *periph = xs->xs_periph;
509 int flags = xs->xs_control;
510
511 SC_DEBUG(periph, SCSIPI_DB3, ("scsipi_free_xs\n"));
512
513 TAILQ_REMOVE(&periph->periph_xferq, xs, device_q);
514 pool_put(&scsipi_xfer_pool, xs);
515
516 #ifdef DIAGNOSTIC
517 if ((periph->periph_flags & PERIPH_RECOVERY_ACTIVE) != 0 &&
518 periph->periph_active == 0) {
519 scsipi_printaddr(periph);
520 printf("recovery without a command to recovery for\n");
521 panic("scsipi_put_xs");
522 }
523 #endif
524
525 if (flags & XS_CTL_URGENT) {
526 if ((flags & XS_CTL_REQSENSE) == 0)
527 periph->periph_flags &= ~PERIPH_RECOVERY_ACTIVE;
528 } else
529 periph->periph_active--;
530 if (periph->periph_active == 0 &&
531 (periph->periph_flags & PERIPH_WAITDRAIN) != 0) {
532 periph->periph_flags &= ~PERIPH_WAITDRAIN;
533 wakeup(&periph->periph_active);
534 }
535
536 if (periph->periph_flags & PERIPH_WAITING) {
537 periph->periph_flags &= ~PERIPH_WAITING;
538 wakeup(periph);
539 } else {
540 if (periph->periph_switch->psw_start != NULL) {
541 SC_DEBUG(periph, SCSIPI_DB2,
542 ("calling private start()\n"));
543 (*periph->periph_switch->psw_start)(periph);
544 }
545 }
546 }
547
548 /*
549 * scsipi_channel_freeze:
550 *
551 * Freeze a channel's xfer queue.
552 */
553 void
554 scsipi_channel_freeze(chan, count)
555 struct scsipi_channel *chan;
556 int count;
557 {
558 int s;
559
560 s = splbio();
561 chan->chan_qfreeze += count;
562 splx(s);
563 }
564
565 /*
566 * scsipi_channel_thaw:
567 *
568 * Thaw a channel's xfer queue.
569 */
570 void
571 scsipi_channel_thaw(chan, count)
572 struct scsipi_channel *chan;
573 int count;
574 {
575 int s;
576
577 s = splbio();
578 chan->chan_qfreeze -= count;
579 /*
580 * Don't let the freeze count go negative.
581 *
582 * Presumably the adapter driver could keep track of this,
583 * but it might just be easier to do this here so as to allow
584 * multiple callers, including those outside the adapter driver.
585 */
586 if (chan->chan_qfreeze < 0) {
587 chan->chan_qfreeze = 0;
588 }
589 splx(s);
590 /*
591 * Kick the channel's queue here. Note, we may be running in
592 * interrupt context (softclock or HBA's interrupt), so the adapter
593 * driver had better not sleep.
594 */
595 if (chan->chan_qfreeze == 0)
596 scsipi_run_queue(chan);
597 }
598
599 /*
600 * scsipi_channel_timed_thaw:
601 *
602 * Thaw a channel after some time has expired. This will also
603 * run the channel's queue if the freeze count has reached 0.
604 */
605 void
606 scsipi_channel_timed_thaw(arg)
607 void *arg;
608 {
609 struct scsipi_channel *chan = arg;
610
611 scsipi_channel_thaw(chan, 1);
612 }
613
614 /*
615 * scsipi_periph_freeze:
616 *
617 * Freeze a device's xfer queue.
618 */
619 void
620 scsipi_periph_freeze(periph, count)
621 struct scsipi_periph *periph;
622 int count;
623 {
624 int s;
625
626 s = splbio();
627 periph->periph_qfreeze += count;
628 splx(s);
629 }
630
631 /*
632 * scsipi_periph_thaw:
633 *
634 * Thaw a device's xfer queue.
635 */
636 void
637 scsipi_periph_thaw(periph, count)
638 struct scsipi_periph *periph;
639 int count;
640 {
641 int s;
642
643 s = splbio();
644 periph->periph_qfreeze -= count;
645 #ifdef DIAGNOSTIC
646 if (periph->periph_qfreeze < 0) {
647 static const char pc[] = "periph freeze count < 0";
648 scsipi_printaddr(periph);
649 printf("%s\n", pc);
650 panic(pc);
651 }
652 #endif
653 if (periph->periph_qfreeze == 0 &&
654 (periph->periph_flags & PERIPH_WAITING) != 0)
655 wakeup(periph);
656 splx(s);
657 }
658
659 /*
660 * scsipi_periph_timed_thaw:
661 *
662 * Thaw a device after some time has expired.
663 */
664 void
665 scsipi_periph_timed_thaw(arg)
666 void *arg;
667 {
668 int s;
669 struct scsipi_periph *periph = arg;
670
671 callout_stop(&periph->periph_callout);
672
673 s = splbio();
674 scsipi_periph_thaw(periph, 1);
675 if ((periph->periph_channel->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
676 /*
677 * Kick the channel's queue here. Note, we're running in
678 * interrupt context (softclock), so the adapter driver
679 * had better not sleep.
680 */
681 scsipi_run_queue(periph->periph_channel);
682 } else {
683 /*
684 * Tell the completion thread to kick the channel's queue here.
685 */
686 periph->periph_channel->chan_tflags |= SCSIPI_CHANT_KICK;
687 wakeup(&periph->periph_channel->chan_complete);
688 }
689 splx(s);
690 }
691
692 /*
693 * scsipi_wait_drain:
694 *
695 * Wait for a periph's pending xfers to drain.
696 */
697 void
698 scsipi_wait_drain(periph)
699 struct scsipi_periph *periph;
700 {
701 int s;
702
703 s = splbio();
704 while (periph->periph_active != 0) {
705 periph->periph_flags |= PERIPH_WAITDRAIN;
706 (void) tsleep(&periph->periph_active, PRIBIO, "sxdrn", 0);
707 }
708 splx(s);
709 }
710
711 /*
712 * scsipi_kill_pending:
713 *
714 * Kill off all pending xfers for a periph.
715 *
716 * NOTE: Must be called at splbio().
717 */
718 void
719 scsipi_kill_pending(periph)
720 struct scsipi_periph *periph;
721 {
722
723 (*periph->periph_channel->chan_bustype->bustype_kill_pending)(periph);
724 #ifdef DIAGNOSTIC
725 if (TAILQ_FIRST(&periph->periph_xferq) != NULL)
726 panic("scsipi_kill_pending");
727 #endif
728 scsipi_wait_drain(periph);
729 }
730
731 /*
732 * scsipi_interpret_sense:
733 *
734 * Look at the returned sense and act on the error, determining
735 * the unix error number to pass back. (0 = report no error)
736 *
737 * NOTE: If we return ERESTART, we are expected to haved
738 * thawed the device!
739 *
740 * THIS IS THE DEFAULT ERROR HANDLER FOR SCSI DEVICES.
741 */
742 int
743 scsipi_interpret_sense(xs)
744 struct scsipi_xfer *xs;
745 {
746 struct scsipi_sense_data *sense;
747 struct scsipi_periph *periph = xs->xs_periph;
748 u_int8_t key;
749 int error;
750 #ifndef SCSIVERBOSE
751 u_int32_t info;
752 static char *error_mes[] = {
753 "soft error (corrected)",
754 "not ready", "medium error",
755 "non-media hardware failure", "illegal request",
756 "unit attention", "readonly device",
757 "no data found", "vendor unique",
758 "copy aborted", "command aborted",
759 "search returned equal", "volume overflow",
760 "verify miscompare", "unknown error key"
761 };
762 #endif
763
764 sense = &xs->sense.scsi_sense;
765 #ifdef SCSIPI_DEBUG
766 if (periph->periph_flags & SCSIPI_DB1) {
767 int count;
768 scsipi_printaddr(periph);
769 printf(" sense debug information:\n");
770 printf("\tcode 0x%x valid 0x%x\n",
771 sense->error_code & SSD_ERRCODE,
772 sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
773 printf("\tseg 0x%x key 0x%x ili 0x%x eom 0x%x fmark 0x%x\n",
774 sense->segment,
775 sense->flags & SSD_KEY,
776 sense->flags & SSD_ILI ? 1 : 0,
777 sense->flags & SSD_EOM ? 1 : 0,
778 sense->flags & SSD_FILEMARK ? 1 : 0);
779 printf("\ninfo: 0x%x 0x%x 0x%x 0x%x followed by %d "
780 "extra bytes\n",
781 sense->info[0],
782 sense->info[1],
783 sense->info[2],
784 sense->info[3],
785 sense->extra_len);
786 printf("\textra: ");
787 for (count = 0; count < ADD_BYTES_LIM(sense); count++)
788 printf("0x%x ", sense->cmd_spec_info[count]);
789 printf("\n");
790 }
791 #endif
792
793 /*
794 * If the periph has it's own error handler, call it first.
795 * If it returns a legit error value, return that, otherwise
796 * it wants us to continue with normal error processing.
797 */
798 if (periph->periph_switch->psw_error != NULL) {
799 SC_DEBUG(periph, SCSIPI_DB2,
800 ("calling private err_handler()\n"));
801 error = (*periph->periph_switch->psw_error)(xs);
802 if (error != EJUSTRETURN)
803 return (error);
804 }
805 /* otherwise use the default */
806 switch (sense->error_code & SSD_ERRCODE) {
807
808 /*
809 * Old SCSI-1 and SASI devices respond with
810 * codes other than 70.
811 */
812 case 0x00: /* no error (command completed OK) */
813 return (0);
814 case 0x04: /* drive not ready after it was selected */
815 if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
816 periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
817 if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
818 return (0);
819 /* XXX - display some sort of error here? */
820 return (EIO);
821 case 0x20: /* invalid command */
822 if ((xs->xs_control &
823 XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
824 return (0);
825 return (EINVAL);
826 case 0x25: /* invalid LUN (Adaptec ACB-4000) */
827 return (EACCES);
828
829 /*
830 * If it's code 70, use the extended stuff and
831 * interpret the key
832 */
833 case 0x71: /* delayed error */
834 scsipi_printaddr(periph);
835 key = sense->flags & SSD_KEY;
836 printf(" DEFERRED ERROR, key = 0x%x\n", key);
837 /* FALLTHROUGH */
838 case 0x70:
839 #ifndef SCSIVERBOSE
840 if ((sense->error_code & SSD_ERRCODE_VALID) != 0)
841 info = _4btol(sense->info);
842 else
843 info = 0;
844 #endif
845 key = sense->flags & SSD_KEY;
846
847 switch (key) {
848 case SKEY_NO_SENSE:
849 case SKEY_RECOVERED_ERROR:
850 if (xs->resid == xs->datalen && xs->datalen) {
851 /*
852 * Why is this here?
853 */
854 xs->resid = 0; /* not short read */
855 }
856 case SKEY_EQUAL:
857 error = 0;
858 break;
859 case SKEY_NOT_READY:
860 if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
861 periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
862 if ((xs->xs_control & XS_CTL_IGNORE_NOT_READY) != 0)
863 return (0);
864 if (sense->add_sense_code == 0x3A) {
865 error = ENODEV; /* Medium not present */
866 if (xs->xs_control & XS_CTL_SILENT_NODEV)
867 return (error);
868 } else
869 error = EIO;
870 if ((xs->xs_control & XS_CTL_SILENT) != 0)
871 return (error);
872 break;
873 case SKEY_ILLEGAL_REQUEST:
874 if ((xs->xs_control &
875 XS_CTL_IGNORE_ILLEGAL_REQUEST) != 0)
876 return (0);
877 /*
878 * Handle the case where a device reports
879 * Logical Unit Not Supported during discovery.
880 */
881 if ((xs->xs_control & XS_CTL_DISCOVERY) != 0 &&
882 sense->add_sense_code == 0x25 &&
883 sense->add_sense_code_qual == 0x00)
884 return (EINVAL);
885 if ((xs->xs_control & XS_CTL_SILENT) != 0)
886 return (EIO);
887 error = EINVAL;
888 break;
889 case SKEY_UNIT_ATTENTION:
890 if (sense->add_sense_code == 0x29 &&
891 sense->add_sense_code_qual == 0x00) {
892 /* device or bus reset */
893 return (ERESTART);
894 }
895 if ((periph->periph_flags & PERIPH_REMOVABLE) != 0)
896 periph->periph_flags &= ~PERIPH_MEDIA_LOADED;
897 if ((xs->xs_control &
898 XS_CTL_IGNORE_MEDIA_CHANGE) != 0 ||
899 /* XXX Should reupload any transient state. */
900 (periph->periph_flags &
901 PERIPH_REMOVABLE) == 0) {
902 return (ERESTART);
903 }
904 if ((xs->xs_control & XS_CTL_SILENT) != 0)
905 return (EIO);
906 error = EIO;
907 break;
908 case SKEY_WRITE_PROTECT:
909 error = EROFS;
910 break;
911 case SKEY_BLANK_CHECK:
912 error = 0;
913 break;
914 case SKEY_ABORTED_COMMAND:
915 error = ERESTART;
916 break;
917 case SKEY_VOLUME_OVERFLOW:
918 error = ENOSPC;
919 break;
920 default:
921 error = EIO;
922 break;
923 }
924
925 #ifdef SCSIVERBOSE
926 if (key && (xs->xs_control & XS_CTL_SILENT) == 0)
927 scsipi_print_sense(xs, 0);
928 #else
929 if (key) {
930 scsipi_printaddr(periph);
931 printf("%s", error_mes[key - 1]);
932 if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
933 switch (key) {
934 case SKEY_NOT_READY:
935 case SKEY_ILLEGAL_REQUEST:
936 case SKEY_UNIT_ATTENTION:
937 case SKEY_WRITE_PROTECT:
938 break;
939 case SKEY_BLANK_CHECK:
940 printf(", requested size: %d (decimal)",
941 info);
942 break;
943 case SKEY_ABORTED_COMMAND:
944 if (xs->xs_retries)
945 printf(", retrying");
946 printf(", cmd 0x%x, info 0x%x",
947 xs->cmd->opcode, info);
948 break;
949 default:
950 printf(", info = %d (decimal)", info);
951 }
952 }
953 if (sense->extra_len != 0) {
954 int n;
955 printf(", data =");
956 for (n = 0; n < sense->extra_len; n++)
957 printf(" %02x",
958 sense->cmd_spec_info[n]);
959 }
960 printf("\n");
961 }
962 #endif
963 return (error);
964
965 /*
966 * Some other code, just report it
967 */
968 default:
969 #if defined(SCSIDEBUG) || defined(DEBUG)
970 {
971 static char *uc = "undecodable sense error";
972 int i;
973 u_int8_t *cptr = (u_int8_t *) sense;
974 scsipi_printaddr(periph);
975 if (xs->cmd == &xs->cmdstore) {
976 printf("%s for opcode 0x%x, data=",
977 uc, xs->cmdstore.opcode);
978 } else {
979 printf("%s, data=", uc);
980 }
981 for (i = 0; i < sizeof (sense); i++)
982 printf(" 0x%02x", *(cptr++) & 0xff);
983 printf("\n");
984 }
985 #else
986 scsipi_printaddr(periph);
987 printf("Sense Error Code 0x%x",
988 sense->error_code & SSD_ERRCODE);
989 if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
990 struct scsipi_sense_data_unextended *usense =
991 (struct scsipi_sense_data_unextended *)sense;
992 printf(" at block no. %d (decimal)",
993 _3btol(usense->block));
994 }
995 printf("\n");
996 #endif
997 return (EIO);
998 }
999 }
1000
1001 /*
1002 * scsipi_size:
1003 *
1004 * Find out from the device what its capacity is.
1005 */
1006 u_int64_t
1007 scsipi_size(periph, flags)
1008 struct scsipi_periph *periph;
1009 int flags;
1010 {
1011 struct scsipi_read_cap_data rdcap;
1012 struct scsipi_read_capacity scsipi_cmd;
1013
1014 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1015 scsipi_cmd.opcode = READ_CAPACITY;
1016
1017 /*
1018 * If the command works, interpret the result as a 4 byte
1019 * number of blocks
1020 */
1021 if (scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1022 sizeof(scsipi_cmd), (u_char *)&rdcap, sizeof(rdcap),
1023 SCSIPIRETRIES, 20000, NULL,
1024 flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK | XS_CTL_SILENT) != 0)
1025 return (0);
1026
1027 return (_4btol(rdcap.addr) + 1);
1028 }
1029
1030 /*
1031 * scsipi_test_unit_ready:
1032 *
1033 * Issue a `test unit ready' request.
1034 */
1035 int
1036 scsipi_test_unit_ready(periph, flags)
1037 struct scsipi_periph *periph;
1038 int flags;
1039 {
1040 int retries;
1041 struct scsipi_test_unit_ready scsipi_cmd;
1042
1043 /* some ATAPI drives don't support TEST_UNIT_READY. Sigh */
1044 if (periph->periph_quirks & PQUIRK_NOTUR)
1045 return (0);
1046
1047 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1048 scsipi_cmd.opcode = TEST_UNIT_READY;
1049
1050 if (flags & XS_CTL_DISCOVERY)
1051 retries = 0;
1052 else
1053 retries = SCSIPIRETRIES;
1054
1055 return (scsipi_command(periph,
1056 (struct scsipi_generic *)&scsipi_cmd, sizeof(scsipi_cmd),
1057 0, 0, retries, 10000, NULL, flags));
1058 }
1059
1060 /*
1061 * scsipi_inquire:
1062 *
1063 * Ask the device about itself.
1064 */
1065 int
1066 scsipi_inquire(periph, inqbuf, flags)
1067 struct scsipi_periph *periph;
1068 struct scsipi_inquiry_data *inqbuf;
1069 int flags;
1070 {
1071 int retries;
1072 struct scsipi_inquiry scsipi_cmd;
1073 int error;
1074
1075 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1076 scsipi_cmd.opcode = INQUIRY;
1077 scsipi_cmd.length = sizeof(struct scsipi_inquiry_data);
1078
1079 if (flags & XS_CTL_DISCOVERY)
1080 retries = 0;
1081 else
1082 retries = SCSIPIRETRIES;
1083
1084 error = scsipi_command(periph,
1085 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
1086 (u_char *) inqbuf, sizeof(struct scsipi_inquiry_data),
1087 retries, 10000, NULL, XS_CTL_DATA_IN | flags);
1088
1089 #ifdef SCSI_OLD_NOINQUIRY
1090 /*
1091 * Kludge for the Adaptec ACB-4000 SCSI->MFM translator.
1092 * This board doesn't support the INQUIRY command at all.
1093 */
1094 if (error == EINVAL || error == EACCES) {
1095 /*
1096 * Conjure up an INQUIRY response.
1097 */
1098 inqbuf->device = (error == EINVAL ?
1099 SID_QUAL_LU_PRESENT :
1100 SID_QUAL_LU_NOTPRESENT) | T_DIRECT;
1101 inqbuf->dev_qual2 = 0;
1102 inqbuf->version = 0;
1103 inqbuf->response_format = SID_FORMAT_SCSI1;
1104 inqbuf->additional_length = 3 + 28;
1105 inqbuf->flags1 = inqbuf->flags2 = inqbuf->flags3 = 0;
1106 memcpy(inqbuf->vendor, "ADAPTEC ", sizeof(inqbuf->vendor));
1107 memcpy(inqbuf->product, "ACB-4000 ",
1108 sizeof(inqbuf->product));
1109 memcpy(inqbuf->revision, " ", sizeof(inqbuf->revision));
1110 error = 0;
1111 }
1112
1113 /*
1114 * Kludge for the Emulex MT-02 SCSI->QIC translator.
1115 * This board gives an empty response to an INQUIRY command.
1116 */
1117 else if (error == 0 &&
1118 inqbuf->device == (SID_QUAL_LU_PRESENT | T_DIRECT) &&
1119 inqbuf->dev_qual2 == 0 &&
1120 inqbuf->version == 0 &&
1121 inqbuf->response_format == SID_FORMAT_SCSI1) {
1122 /*
1123 * Fill out the INQUIRY response.
1124 */
1125 inqbuf->device = (SID_QUAL_LU_PRESENT | T_SEQUENTIAL);
1126 inqbuf->dev_qual2 = SID_REMOVABLE;
1127 inqbuf->additional_length = 3 + 28;
1128 inqbuf->flags1 = inqbuf->flags2 = inqbuf->flags3 = 0;
1129 memcpy(inqbuf->vendor, "EMULEX ", sizeof(inqbuf->vendor));
1130 memcpy(inqbuf->product, "MT-02 QIC ",
1131 sizeof(inqbuf->product));
1132 memcpy(inqbuf->revision, " ", sizeof(inqbuf->revision));
1133 }
1134 #endif /* SCSI_OLD_NOINQUIRY */
1135
1136 return error;
1137 }
1138
1139 /*
1140 * scsipi_prevent:
1141 *
1142 * Prevent or allow the user to remove the media
1143 */
1144 int
1145 scsipi_prevent(periph, type, flags)
1146 struct scsipi_periph *periph;
1147 int type, flags;
1148 {
1149 struct scsipi_prevent scsipi_cmd;
1150
1151 if (periph->periph_quirks & PQUIRK_NODOORLOCK)
1152 return (0);
1153
1154 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1155 scsipi_cmd.opcode = PREVENT_ALLOW;
1156 scsipi_cmd.how = type;
1157
1158 return (scsipi_command(periph,
1159 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
1160 0, 0, SCSIPIRETRIES, 5000, NULL, flags));
1161 }
1162
1163 /*
1164 * scsipi_start:
1165 *
1166 * Send a START UNIT.
1167 */
1168 int
1169 scsipi_start(periph, type, flags)
1170 struct scsipi_periph *periph;
1171 int type, flags;
1172 {
1173 struct scsipi_start_stop scsipi_cmd;
1174
1175 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1176 scsipi_cmd.opcode = START_STOP;
1177 scsipi_cmd.byte2 = 0x00;
1178 scsipi_cmd.how = type;
1179
1180 return (scsipi_command(periph,
1181 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
1182 0, 0, SCSIPIRETRIES, (type & SSS_START) ? 60000 : 10000,
1183 NULL, flags));
1184 }
1185
1186 /*
1187 * scsipi_mode_sense, scsipi_mode_sense_big:
1188 * get a sense page from a device
1189 */
1190
1191 int
1192 scsipi_mode_sense(periph, byte2, page, data, len, flags, retries, timeout)
1193 struct scsipi_periph *periph;
1194 int byte2, page, len, flags, retries, timeout;
1195 struct scsipi_mode_header *data;
1196 {
1197 struct scsipi_mode_sense scsipi_cmd;
1198 int error;
1199
1200 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1201 scsipi_cmd.opcode = MODE_SENSE;
1202 scsipi_cmd.byte2 = byte2;
1203 scsipi_cmd.page = page;
1204 scsipi_cmd.length = len & 0xff;
1205 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1206 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1207 flags | XS_CTL_DATA_IN);
1208 SC_DEBUG(periph, SCSIPI_DB2,
1209 ("scsipi_mode_sense: error=%d\n", error));
1210 return (error);
1211 }
1212
1213 int
1214 scsipi_mode_sense_big(periph, byte2, page, data, len, flags, retries, timeout)
1215 struct scsipi_periph *periph;
1216 int byte2, page, len, flags, retries, timeout;
1217 struct scsipi_mode_header_big *data;
1218 {
1219 struct scsipi_mode_sense_big scsipi_cmd;
1220 int error;
1221
1222 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1223 scsipi_cmd.opcode = MODE_SENSE_BIG;
1224 scsipi_cmd.byte2 = byte2;
1225 scsipi_cmd.page = page;
1226 _lto2b(len, scsipi_cmd.length);
1227 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1228 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1229 flags | XS_CTL_DATA_IN);
1230 SC_DEBUG(periph, SCSIPI_DB2,
1231 ("scsipi_mode_sense_big: error=%d\n", error));
1232 return (error);
1233 }
1234
1235 int
1236 scsipi_mode_select(periph, byte2, data, len, flags, retries, timeout)
1237 struct scsipi_periph *periph;
1238 int byte2, len, flags, retries, timeout;
1239 struct scsipi_mode_header *data;
1240 {
1241 struct scsipi_mode_select scsipi_cmd;
1242 int error;
1243
1244 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1245 scsipi_cmd.opcode = MODE_SELECT;
1246 scsipi_cmd.byte2 = byte2;
1247 scsipi_cmd.length = len & 0xff;
1248 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1249 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1250 flags | XS_CTL_DATA_OUT);
1251 SC_DEBUG(periph, SCSIPI_DB2,
1252 ("scsipi_mode_select: error=%d\n", error));
1253 return (error);
1254 }
1255
1256 int
1257 scsipi_mode_select_big(periph, byte2, data, len, flags, retries, timeout)
1258 struct scsipi_periph *periph;
1259 int byte2, len, flags, retries, timeout;
1260 struct scsipi_mode_header_big *data;
1261 {
1262 struct scsipi_mode_select_big scsipi_cmd;
1263 int error;
1264
1265 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1266 scsipi_cmd.opcode = MODE_SELECT_BIG;
1267 scsipi_cmd.byte2 = byte2;
1268 _lto2b(len, scsipi_cmd.length);
1269 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1270 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1271 flags | XS_CTL_DATA_OUT);
1272 SC_DEBUG(periph, SCSIPI_DB2,
1273 ("scsipi_mode_select: error=%d\n", error));
1274 return (error);
1275 }
1276
1277 /*
1278 * scsipi_done:
1279 *
1280 * This routine is called by an adapter's interrupt handler when
1281 * an xfer is completed.
1282 */
1283 void
1284 scsipi_done(xs)
1285 struct scsipi_xfer *xs;
1286 {
1287 struct scsipi_periph *periph = xs->xs_periph;
1288 struct scsipi_channel *chan = periph->periph_channel;
1289 int s, freezecnt;
1290
1291 SC_DEBUG(periph, SCSIPI_DB2, ("scsipi_done\n"));
1292 #ifdef SCSIPI_DEBUG
1293 if (periph->periph_dbflags & SCSIPI_DB1)
1294 show_scsipi_cmd(xs);
1295 #endif
1296
1297 s = splbio();
1298 /*
1299 * The resource this command was using is now free.
1300 */
1301 scsipi_put_resource(chan);
1302 xs->xs_periph->periph_sent--;
1303
1304 /*
1305 * If the command was tagged, free the tag.
1306 */
1307 if (XS_CTL_TAGTYPE(xs) != 0)
1308 scsipi_put_tag(xs);
1309 else
1310 periph->periph_flags &= ~PERIPH_UNTAG;
1311
1312 /* Mark the command as `done'. */
1313 xs->xs_status |= XS_STS_DONE;
1314
1315 #ifdef DIAGNOSTIC
1316 if ((xs->xs_control & (XS_CTL_ASYNC|XS_CTL_POLL)) ==
1317 (XS_CTL_ASYNC|XS_CTL_POLL))
1318 panic("scsipi_done: ASYNC and POLL");
1319 #endif
1320
1321 /*
1322 * If the xfer had an error of any sort, freeze the
1323 * periph's queue. Freeze it again if we were requested
1324 * to do so in the xfer.
1325 */
1326 freezecnt = 0;
1327 if (xs->error != XS_NOERROR)
1328 freezecnt++;
1329 if (xs->xs_control & XS_CTL_FREEZE_PERIPH)
1330 freezecnt++;
1331 if (freezecnt != 0)
1332 scsipi_periph_freeze(periph, freezecnt);
1333
1334 /*
1335 * record the xfer with a pending sense, in case a SCSI reset is
1336 * received before the thread is waked up.
1337 */
1338 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1339 periph->periph_flags |= PERIPH_SENSE;
1340 periph->periph_xscheck = xs;
1341 }
1342
1343 /*
1344 * If this was an xfer that was not to complete asynchronously,
1345 * let the requesting thread perform error checking/handling
1346 * in its context.
1347 */
1348 if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
1349 splx(s);
1350 /*
1351 * If it's a polling job, just return, to unwind the
1352 * call graph. We don't need to restart the queue,
1353 * because pollings jobs are treated specially, and
1354 * are really only used during crash dumps anyway
1355 * (XXX or during boot-time autconfiguration of
1356 * ATAPI devices).
1357 */
1358 if (xs->xs_control & XS_CTL_POLL)
1359 return;
1360 wakeup(xs);
1361 goto out;
1362 }
1363
1364 /*
1365 * Catch the extremely common case of I/O completing
1366 * without error; no use in taking a context switch
1367 * if we can handle it in interrupt context.
1368 */
1369 if (xs->error == XS_NOERROR) {
1370 splx(s);
1371 (void) scsipi_complete(xs);
1372 goto out;
1373 }
1374
1375 /*
1376 * There is an error on this xfer. Put it on the channel's
1377 * completion queue, and wake up the completion thread.
1378 */
1379 TAILQ_INSERT_TAIL(&chan->chan_complete, xs, channel_q);
1380 splx(s);
1381 wakeup(&chan->chan_complete);
1382
1383 out:
1384 /*
1385 * If there are more xfers on the channel's queue, attempt to
1386 * run them.
1387 */
1388 scsipi_run_queue(chan);
1389 }
1390
1391 /*
1392 * scsipi_complete:
1393 *
1394 * Completion of a scsipi_xfer. This is the guts of scsipi_done().
1395 *
1396 * NOTE: This routine MUST be called with valid thread context
1397 * except for the case where the following two conditions are
1398 * true:
1399 *
1400 * xs->error == XS_NOERROR
1401 * XS_CTL_ASYNC is set in xs->xs_control
1402 *
1403 * The semantics of this routine can be tricky, so here is an
1404 * explanation:
1405 *
1406 * 0 Xfer completed successfully.
1407 *
1408 * ERESTART Xfer had an error, but was restarted.
1409 *
1410 * anything else Xfer had an error, return value is Unix
1411 * errno.
1412 *
1413 * If the return value is anything but ERESTART:
1414 *
1415 * - If XS_CTL_ASYNC is set, `xs' has been freed back to
1416 * the pool.
1417 * - If there is a buf associated with the xfer,
1418 * it has been biodone()'d.
1419 */
1420 int
1421 scsipi_complete(xs)
1422 struct scsipi_xfer *xs;
1423 {
1424 struct scsipi_periph *periph = xs->xs_periph;
1425 struct scsipi_channel *chan = periph->periph_channel;
1426 struct buf *bp;
1427 int error, s;
1428
1429 #ifdef DIAGNOSTIC
1430 if ((xs->xs_control & XS_CTL_ASYNC) != 0 && xs->bp == NULL)
1431 panic("scsipi_complete: XS_CTL_ASYNC but no buf");
1432 #endif
1433 /*
1434 * If command terminated with a CHECK CONDITION, we need to issue a
1435 * REQUEST_SENSE command. Once the REQUEST_SENSE has been processed
1436 * we'll have the real status.
1437 * Must be processed at splbio() to avoid missing a SCSI bus reset
1438 * for this command.
1439 */
1440 s = splbio();
1441 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1442 /* request sense for a request sense ? */
1443 if (xs->xs_control & XS_CTL_REQSENSE) {
1444 scsipi_printaddr(periph);
1445 printf("request sense for a request sense ?\n");
1446 /* XXX maybe we should reset the device ? */
1447 /* we've been frozen because xs->error != XS_NOERROR */
1448 scsipi_periph_thaw(periph, 1);
1449 splx(s);
1450 if (xs->resid < xs->datalen) {
1451 printf("we read %d bytes of sense anyway:\n",
1452 xs->datalen - xs->resid);
1453 #ifdef SCSIVERBOSE
1454 scsipi_print_sense_data((void *)xs->data, 0);
1455 #endif
1456 }
1457 return EINVAL;
1458 }
1459 scsipi_request_sense(xs);
1460 }
1461 splx(s);
1462
1463 /*
1464 * If it's a user level request, bypass all usual completion
1465 * processing, let the user work it out..
1466 */
1467 if ((xs->xs_control & XS_CTL_USERCMD) != 0) {
1468 SC_DEBUG(periph, SCSIPI_DB3, ("calling user done()\n"));
1469 if (xs->error != XS_NOERROR)
1470 scsipi_periph_thaw(periph, 1);
1471 scsipi_user_done(xs);
1472 SC_DEBUG(periph, SCSIPI_DB3, ("returned from user done()\n "));
1473 return 0;
1474 }
1475
1476 switch (xs->error) {
1477 case XS_NOERROR:
1478 error = 0;
1479 break;
1480
1481 case XS_SENSE:
1482 case XS_SHORTSENSE:
1483 error = (*chan->chan_bustype->bustype_interpret_sense)(xs);
1484 break;
1485
1486 case XS_RESOURCE_SHORTAGE:
1487 /*
1488 * XXX Should freeze channel's queue.
1489 */
1490 scsipi_printaddr(periph);
1491 printf("adapter resource shortage\n");
1492 /* FALLTHROUGH */
1493
1494 case XS_BUSY:
1495 if (xs->error == XS_BUSY && xs->status == SCSI_QUEUE_FULL) {
1496 struct scsipi_max_openings mo;
1497
1498 /*
1499 * We set the openings to active - 1, assuming that
1500 * the command that got us here is the first one that
1501 * can't fit into the device's queue. If that's not
1502 * the case, I guess we'll find out soon enough.
1503 */
1504 mo.mo_target = periph->periph_target;
1505 mo.mo_lun = periph->periph_lun;
1506 if (periph->periph_active < periph->periph_openings)
1507 mo.mo_openings = periph->periph_active - 1;
1508 else
1509 mo.mo_openings = periph->periph_openings - 1;
1510 #ifdef DIAGNOSTIC
1511 if (mo.mo_openings < 0) {
1512 scsipi_printaddr(periph);
1513 printf("QUEUE FULL resulted in < 0 openings\n");
1514 panic("scsipi_done");
1515 }
1516 #endif
1517 if (mo.mo_openings == 0) {
1518 scsipi_printaddr(periph);
1519 printf("QUEUE FULL resulted in 0 openings\n");
1520 mo.mo_openings = 1;
1521 }
1522 scsipi_async_event(chan, ASYNC_EVENT_MAX_OPENINGS, &mo);
1523 error = ERESTART;
1524 } else if (xs->xs_retries != 0) {
1525 xs->xs_retries--;
1526 /*
1527 * Wait one second, and try again.
1528 */
1529 if ((xs->xs_control & XS_CTL_POLL) ||
1530 (chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
1531 delay(1000000);
1532 } else if (!callout_pending(&periph->periph_callout)) {
1533 scsipi_periph_freeze(periph, 1);
1534 callout_reset(&periph->periph_callout,
1535 hz, scsipi_periph_timed_thaw, periph);
1536 }
1537 error = ERESTART;
1538 } else
1539 error = EBUSY;
1540 break;
1541
1542 case XS_REQUEUE:
1543 error = ERESTART;
1544 break;
1545
1546 case XS_SELTIMEOUT:
1547 case XS_TIMEOUT:
1548 /*
1549 * If the device hasn't gone away, honor retry counts.
1550 *
1551 * Note that if we're in the middle of probing it,
1552 * it won't be found because it isn't here yet so
1553 * we won't honor the retry count in that case.
1554 */
1555 if (scsipi_lookup_periph(chan, periph->periph_target,
1556 periph->periph_lun) && xs->xs_retries != 0) {
1557 xs->xs_retries--;
1558 error = ERESTART;
1559 } else
1560 error = EIO;
1561 break;
1562
1563 case XS_RESET:
1564 if (xs->xs_control & XS_CTL_REQSENSE) {
1565 /*
1566 * request sense interrupted by reset: signal it
1567 * with EINTR return code.
1568 */
1569 error = EINTR;
1570 } else {
1571 if (xs->xs_retries != 0) {
1572 xs->xs_retries--;
1573 error = ERESTART;
1574 } else
1575 error = EIO;
1576 }
1577 break;
1578
1579 case XS_DRIVER_STUFFUP:
1580 scsipi_printaddr(periph);
1581 printf("generic HBA error\n");
1582 error = EIO;
1583 break;
1584 default:
1585 scsipi_printaddr(periph);
1586 printf("invalid return code from adapter: %d\n", xs->error);
1587 error = EIO;
1588 break;
1589 }
1590
1591 s = splbio();
1592 if (error == ERESTART) {
1593 /*
1594 * If we get here, the periph has been thawed and frozen
1595 * again if we had to issue recovery commands. Alternatively,
1596 * it may have been frozen again and in a timed thaw. In
1597 * any case, we thaw the periph once we re-enqueue the
1598 * command. Once the periph is fully thawed, it will begin
1599 * operation again.
1600 */
1601 xs->error = XS_NOERROR;
1602 xs->status = SCSI_OK;
1603 xs->xs_status &= ~XS_STS_DONE;
1604 xs->xs_requeuecnt++;
1605 error = scsipi_enqueue(xs);
1606 if (error == 0) {
1607 scsipi_periph_thaw(periph, 1);
1608 splx(s);
1609 return (ERESTART);
1610 }
1611 }
1612
1613 /*
1614 * scsipi_done() freezes the queue if not XS_NOERROR.
1615 * Thaw it here.
1616 */
1617 if (xs->error != XS_NOERROR)
1618 scsipi_periph_thaw(periph, 1);
1619
1620 /*
1621 * Set buffer fields in case the periph
1622 * switch done func uses them
1623 */
1624 if ((bp = xs->bp) != NULL) {
1625 if (error) {
1626 bp->b_error = error;
1627 bp->b_flags |= B_ERROR;
1628 bp->b_resid = bp->b_bcount;
1629 } else {
1630 bp->b_error = 0;
1631 bp->b_resid = xs->resid;
1632 }
1633 }
1634
1635 if (periph->periph_switch->psw_done)
1636 periph->periph_switch->psw_done(xs);
1637
1638 if (bp)
1639 biodone(bp);
1640
1641 if (xs->xs_control & XS_CTL_ASYNC)
1642 scsipi_put_xs(xs);
1643 splx(s);
1644
1645 return (error);
1646 }
1647
1648 /*
1649 * Issue a request sense for the given scsipi_xfer. Called when the xfer
1650 * returns with a CHECK_CONDITION status. Must be called in valid thread
1651 * context and at splbio().
1652 */
1653
1654 void
1655 scsipi_request_sense(xs)
1656 struct scsipi_xfer *xs;
1657 {
1658 struct scsipi_periph *periph = xs->xs_periph;
1659 int flags, error;
1660 struct scsipi_sense cmd;
1661
1662 periph->periph_flags |= PERIPH_SENSE;
1663
1664 /* if command was polling, request sense will too */
1665 flags = xs->xs_control & XS_CTL_POLL;
1666 /* Polling commands can't sleep */
1667 if (flags)
1668 flags |= XS_CTL_NOSLEEP;
1669
1670 flags |= XS_CTL_REQSENSE | XS_CTL_URGENT | XS_CTL_DATA_IN |
1671 XS_CTL_THAW_PERIPH | XS_CTL_FREEZE_PERIPH;
1672
1673 memset(&cmd, 0, sizeof(cmd));
1674 cmd.opcode = REQUEST_SENSE;
1675 cmd.length = sizeof(struct scsipi_sense_data);
1676
1677 error = scsipi_command(periph,
1678 (struct scsipi_generic *) &cmd, sizeof(cmd),
1679 (u_char*)&xs->sense.scsi_sense, sizeof(struct scsipi_sense_data),
1680 0, 1000, NULL, flags);
1681 periph->periph_flags &= ~PERIPH_SENSE;
1682 periph->periph_xscheck = NULL;
1683 switch(error) {
1684 case 0:
1685 /* we have a valid sense */
1686 xs->error = XS_SENSE;
1687 return;
1688 case EINTR:
1689 /* REQUEST_SENSE interrupted by bus reset. */
1690 xs->error = XS_RESET;
1691 return;
1692 case EIO:
1693 /* request sense coudn't be performed */
1694 /*
1695 * XXX this isn't quite right but we don't have anything
1696 * better for now
1697 */
1698 xs->error = XS_DRIVER_STUFFUP;
1699 return;
1700 default:
1701 /* Notify that request sense failed. */
1702 xs->error = XS_DRIVER_STUFFUP;
1703 scsipi_printaddr(periph);
1704 printf("request sense failed with error %d\n", error);
1705 return;
1706 }
1707 }
1708
1709 /*
1710 * scsipi_enqueue:
1711 *
1712 * Enqueue an xfer on a channel.
1713 */
1714 int
1715 scsipi_enqueue(xs)
1716 struct scsipi_xfer *xs;
1717 {
1718 struct scsipi_channel *chan = xs->xs_periph->periph_channel;
1719 struct scsipi_xfer *qxs;
1720 int s;
1721
1722 s = splbio();
1723
1724 /*
1725 * If the xfer is to be polled, and there are already jobs on
1726 * the queue, we can't proceed.
1727 */
1728 if ((xs->xs_control & XS_CTL_POLL) != 0 &&
1729 TAILQ_FIRST(&chan->chan_queue) != NULL) {
1730 splx(s);
1731 xs->error = XS_DRIVER_STUFFUP;
1732 return (EAGAIN);
1733 }
1734
1735 /*
1736 * If we have an URGENT xfer, it's an error recovery command
1737 * and it should just go on the head of the channel's queue.
1738 */
1739 if (xs->xs_control & XS_CTL_URGENT) {
1740 TAILQ_INSERT_HEAD(&chan->chan_queue, xs, channel_q);
1741 goto out;
1742 }
1743
1744 /*
1745 * If this xfer has already been on the queue before, we
1746 * need to reinsert it in the correct order. That order is:
1747 *
1748 * Immediately before the first xfer for this periph
1749 * with a requeuecnt less than xs->xs_requeuecnt.
1750 *
1751 * Failing that, at the end of the queue. (We'll end up
1752 * there naturally.)
1753 */
1754 if (xs->xs_requeuecnt != 0) {
1755 for (qxs = TAILQ_FIRST(&chan->chan_queue); qxs != NULL;
1756 qxs = TAILQ_NEXT(qxs, channel_q)) {
1757 if (qxs->xs_periph == xs->xs_periph &&
1758 qxs->xs_requeuecnt < xs->xs_requeuecnt)
1759 break;
1760 }
1761 if (qxs != NULL) {
1762 TAILQ_INSERT_AFTER(&chan->chan_queue, qxs, xs,
1763 channel_q);
1764 goto out;
1765 }
1766 }
1767 TAILQ_INSERT_TAIL(&chan->chan_queue, xs, channel_q);
1768 out:
1769 if (xs->xs_control & XS_CTL_THAW_PERIPH)
1770 scsipi_periph_thaw(xs->xs_periph, 1);
1771 splx(s);
1772 return (0);
1773 }
1774
1775 /*
1776 * scsipi_run_queue:
1777 *
1778 * Start as many xfers as possible running on the channel.
1779 */
1780 void
1781 scsipi_run_queue(chan)
1782 struct scsipi_channel *chan;
1783 {
1784 struct scsipi_xfer *xs;
1785 struct scsipi_periph *periph;
1786 int s;
1787
1788 for (;;) {
1789 s = splbio();
1790
1791 /*
1792 * If the channel is frozen, we can't do any work right
1793 * now.
1794 */
1795 if (chan->chan_qfreeze != 0) {
1796 splx(s);
1797 return;
1798 }
1799
1800 /*
1801 * Look for work to do, and make sure we can do it.
1802 */
1803 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL;
1804 xs = TAILQ_NEXT(xs, channel_q)) {
1805 periph = xs->xs_periph;
1806
1807 if ((periph->periph_sent >= periph->periph_openings) ||
1808 periph->periph_qfreeze != 0 ||
1809 (periph->periph_flags & PERIPH_UNTAG) != 0)
1810 continue;
1811
1812 if ((periph->periph_flags &
1813 (PERIPH_RECOVERING | PERIPH_SENSE)) != 0 &&
1814 (xs->xs_control & XS_CTL_URGENT) == 0)
1815 continue;
1816
1817 /*
1818 * We can issue this xfer!
1819 */
1820 goto got_one;
1821 }
1822
1823 /*
1824 * Can't find any work to do right now.
1825 */
1826 splx(s);
1827 return;
1828
1829 got_one:
1830 /*
1831 * Have an xfer to run. Allocate a resource from
1832 * the adapter to run it. If we can't allocate that
1833 * resource, we don't dequeue the xfer.
1834 */
1835 if (scsipi_get_resource(chan) == 0) {
1836 /*
1837 * Adapter is out of resources. If the adapter
1838 * supports it, attempt to grow them.
1839 */
1840 if (scsipi_grow_resources(chan) == 0) {
1841 /*
1842 * Wasn't able to grow resources,
1843 * nothing more we can do.
1844 */
1845 if (xs->xs_control & XS_CTL_POLL) {
1846 scsipi_printaddr(xs->xs_periph);
1847 printf("polling command but no "
1848 "adapter resources");
1849 /* We'll panic shortly... */
1850 }
1851 splx(s);
1852
1853 /*
1854 * XXX: We should be able to note that
1855 * XXX: that resources are needed here!
1856 */
1857 return;
1858 }
1859 /*
1860 * scsipi_grow_resources() allocated the resource
1861 * for us.
1862 */
1863 }
1864
1865 /*
1866 * We have a resource to run this xfer, do it!
1867 */
1868 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
1869
1870 /*
1871 * If the command is to be tagged, allocate a tag ID
1872 * for it.
1873 */
1874 if (XS_CTL_TAGTYPE(xs) != 0)
1875 scsipi_get_tag(xs);
1876 else
1877 periph->periph_flags |= PERIPH_UNTAG;
1878 periph->periph_sent++;
1879 splx(s);
1880
1881 scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
1882 }
1883 #ifdef DIAGNOSTIC
1884 panic("scsipi_run_queue: impossible");
1885 #endif
1886 }
1887
1888 /*
1889 * scsipi_execute_xs:
1890 *
1891 * Begin execution of an xfer, waiting for it to complete, if necessary.
1892 */
1893 int
1894 scsipi_execute_xs(xs)
1895 struct scsipi_xfer *xs;
1896 {
1897 struct scsipi_periph *periph = xs->xs_periph;
1898 struct scsipi_channel *chan = periph->periph_channel;
1899 int oasync, async, poll, retries, error, s;
1900
1901 xs->xs_status &= ~XS_STS_DONE;
1902 xs->error = XS_NOERROR;
1903 xs->resid = xs->datalen;
1904 xs->status = SCSI_OK;
1905
1906 #ifdef SCSIPI_DEBUG
1907 if (xs->xs_periph->periph_dbflags & SCSIPI_DB3) {
1908 printf("scsipi_execute_xs: ");
1909 show_scsipi_xs(xs);
1910 printf("\n");
1911 }
1912 #endif
1913
1914 /*
1915 * Deal with command tagging:
1916 *
1917 * - If the device's current operating mode doesn't
1918 * include tagged queueing, clear the tag mask.
1919 *
1920 * - If the device's current operating mode *does*
1921 * include tagged queueing, set the tag_type in
1922 * the xfer to the appropriate byte for the tag
1923 * message.
1924 */
1925 if ((PERIPH_XFER_MODE(periph) & PERIPH_CAP_TQING) == 0 ||
1926 (xs->xs_control & XS_CTL_REQSENSE)) {
1927 xs->xs_control &= ~XS_CTL_TAGMASK;
1928 xs->xs_tag_type = 0;
1929 } else {
1930 /*
1931 * If the request doesn't specify a tag, give Head
1932 * tags to URGENT operations and Ordered tags to
1933 * everything else.
1934 */
1935 if (XS_CTL_TAGTYPE(xs) == 0) {
1936 if (xs->xs_control & XS_CTL_URGENT)
1937 xs->xs_control |= XS_CTL_HEAD_TAG;
1938 else
1939 xs->xs_control |= XS_CTL_ORDERED_TAG;
1940 }
1941
1942 switch (XS_CTL_TAGTYPE(xs)) {
1943 case XS_CTL_ORDERED_TAG:
1944 xs->xs_tag_type = MSG_ORDERED_Q_TAG;
1945 break;
1946
1947 case XS_CTL_SIMPLE_TAG:
1948 xs->xs_tag_type = MSG_SIMPLE_Q_TAG;
1949 break;
1950
1951 case XS_CTL_HEAD_TAG:
1952 xs->xs_tag_type = MSG_HEAD_OF_Q_TAG;
1953 break;
1954
1955 default:
1956 scsipi_printaddr(periph);
1957 printf("invalid tag mask 0x%08x\n",
1958 XS_CTL_TAGTYPE(xs));
1959 panic("scsipi_execute_xs");
1960 }
1961 }
1962
1963 /* If the adaptor wants us to poll, poll. */
1964 if (chan->chan_adapter->adapt_flags & SCSIPI_ADAPT_POLL_ONLY)
1965 xs->xs_control |= XS_CTL_POLL;
1966
1967 /*
1968 * If we don't yet have a completion thread, or we are to poll for
1969 * completion, clear the ASYNC flag.
1970 */
1971 oasync = (xs->xs_control & XS_CTL_ASYNC);
1972 if (chan->chan_thread == NULL || (xs->xs_control & XS_CTL_POLL) != 0)
1973 xs->xs_control &= ~XS_CTL_ASYNC;
1974
1975 async = (xs->xs_control & XS_CTL_ASYNC);
1976 poll = (xs->xs_control & XS_CTL_POLL);
1977 retries = xs->xs_retries; /* for polling commands */
1978
1979 #ifdef DIAGNOSTIC
1980 if (oasync != 0 && xs->bp == NULL)
1981 panic("scsipi_execute_xs: XS_CTL_ASYNC but no buf");
1982 #endif
1983
1984 /*
1985 * Enqueue the transfer. If we're not polling for completion, this
1986 * should ALWAYS return `no error'.
1987 */
1988 try_again:
1989 error = scsipi_enqueue(xs);
1990 if (error) {
1991 if (poll == 0) {
1992 scsipi_printaddr(periph);
1993 printf("not polling, but enqueue failed with %d\n",
1994 error);
1995 panic("scsipi_execute_xs");
1996 }
1997
1998 scsipi_printaddr(periph);
1999 printf("failed to enqueue polling command");
2000 if (retries != 0) {
2001 printf(", retrying...\n");
2002 delay(1000000);
2003 retries--;
2004 goto try_again;
2005 }
2006 printf("\n");
2007 goto free_xs;
2008 }
2009
2010 restarted:
2011 scsipi_run_queue(chan);
2012
2013 /*
2014 * The xfer is enqueued, and possibly running. If it's to be
2015 * completed asynchronously, just return now.
2016 */
2017 if (async)
2018 return (EJUSTRETURN);
2019
2020 /*
2021 * Not an asynchronous command; wait for it to complete.
2022 */
2023 s = splbio();
2024 while ((xs->xs_status & XS_STS_DONE) == 0) {
2025 if (poll) {
2026 scsipi_printaddr(periph);
2027 printf("polling command not done\n");
2028 panic("scsipi_execute_xs");
2029 }
2030 (void) tsleep(xs, PRIBIO, "xscmd", 0);
2031 }
2032 splx(s);
2033
2034 /*
2035 * Command is complete. scsipi_done() has awakened us to perform
2036 * the error handling.
2037 */
2038 error = scsipi_complete(xs);
2039 if (error == ERESTART)
2040 goto restarted;
2041
2042 /*
2043 * If it was meant to run async and we cleared aync ourselve,
2044 * don't return an error here. It has already been handled
2045 */
2046 if (oasync)
2047 error = EJUSTRETURN;
2048 /*
2049 * Command completed successfully or fatal error occurred. Fall
2050 * into....
2051 */
2052 free_xs:
2053 s = splbio();
2054 scsipi_put_xs(xs);
2055 splx(s);
2056
2057 /*
2058 * Kick the queue, keep it running in case it stopped for some
2059 * reason.
2060 */
2061 scsipi_run_queue(chan);
2062
2063 return (error);
2064 }
2065
2066 /*
2067 * scsipi_completion_thread:
2068 *
2069 * This is the completion thread. We wait for errors on
2070 * asynchronous xfers, and perform the error handling
2071 * function, restarting the command, if necessary.
2072 */
2073 void
2074 scsipi_completion_thread(arg)
2075 void *arg;
2076 {
2077 struct scsipi_channel *chan = arg;
2078 struct scsipi_xfer *xs;
2079 int s;
2080
2081 if (chan->chan_init_cb)
2082 (*chan->chan_init_cb)(chan, chan->chan_init_cb_arg);
2083
2084 s = splbio();
2085 chan->chan_flags |= SCSIPI_CHAN_TACTIVE;
2086 splx(s);
2087 for (;;) {
2088 s = splbio();
2089 xs = TAILQ_FIRST(&chan->chan_complete);
2090 if (xs == NULL && chan->chan_tflags == 0) {
2091 /* nothing to do; wait */
2092 (void) tsleep(&chan->chan_complete, PRIBIO,
2093 "sccomp", 0);
2094 splx(s);
2095 continue;
2096 }
2097 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2098 /* call chan_callback from thread context */
2099 chan->chan_tflags &= ~SCSIPI_CHANT_CALLBACK;
2100 chan->chan_callback(chan, chan->chan_callback_arg);
2101 splx(s);
2102 continue;
2103 }
2104 if (chan->chan_tflags & SCSIPI_CHANT_GROWRES) {
2105 /* attempt to get more openings for this channel */
2106 chan->chan_tflags &= ~SCSIPI_CHANT_GROWRES;
2107 scsipi_adapter_request(chan,
2108 ADAPTER_REQ_GROW_RESOURCES, NULL);
2109 scsipi_channel_thaw(chan, 1);
2110 splx(s);
2111 continue;
2112 }
2113 if (chan->chan_tflags & SCSIPI_CHANT_KICK) {
2114 /* explicitly run the queues for this channel */
2115 chan->chan_tflags &= ~SCSIPI_CHANT_KICK;
2116 scsipi_run_queue(chan);
2117 splx(s);
2118 continue;
2119 }
2120 if (chan->chan_tflags & SCSIPI_CHANT_SHUTDOWN) {
2121 splx(s);
2122 break;
2123 }
2124 if (xs) {
2125 TAILQ_REMOVE(&chan->chan_complete, xs, channel_q);
2126 splx(s);
2127
2128 /*
2129 * Have an xfer with an error; process it.
2130 */
2131 (void) scsipi_complete(xs);
2132
2133 /*
2134 * Kick the queue; keep it running if it was stopped
2135 * for some reason.
2136 */
2137 scsipi_run_queue(chan);
2138 } else {
2139 splx(s);
2140 }
2141 }
2142
2143 chan->chan_thread = NULL;
2144
2145 /* In case parent is waiting for us to exit. */
2146 wakeup(&chan->chan_thread);
2147
2148 kthread_exit(0);
2149 }
2150
2151 /*
2152 * scsipi_create_completion_thread:
2153 *
2154 * Callback to actually create the completion thread.
2155 */
2156 void
2157 scsipi_create_completion_thread(arg)
2158 void *arg;
2159 {
2160 struct scsipi_channel *chan = arg;
2161 struct scsipi_adapter *adapt = chan->chan_adapter;
2162
2163 if (kthread_create1(scsipi_completion_thread, chan,
2164 &chan->chan_thread, "%s", chan->chan_name)) {
2165 printf("%s: unable to create completion thread for "
2166 "channel %d\n", adapt->adapt_dev->dv_xname,
2167 chan->chan_channel);
2168 panic("scsipi_create_completion_thread");
2169 }
2170 }
2171
2172 /*
2173 * scsipi_thread_call_callback:
2174 *
2175 * request to call a callback from the completion thread
2176 */
2177 int
2178 scsipi_thread_call_callback(chan, callback, arg)
2179 struct scsipi_channel *chan;
2180 void (*callback) __P((struct scsipi_channel *, void *));
2181 void *arg;
2182 {
2183 int s;
2184
2185 s = splbio();
2186 if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
2187 /* kernel thread doesn't exist yet */
2188 splx(s);
2189 return ESRCH;
2190 }
2191 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2192 splx(s);
2193 return EBUSY;
2194 }
2195 scsipi_channel_freeze(chan, 1);
2196 chan->chan_callback = callback;
2197 chan->chan_callback_arg = arg;
2198 chan->chan_tflags |= SCSIPI_CHANT_CALLBACK;
2199 wakeup(&chan->chan_complete);
2200 splx(s);
2201 return(0);
2202 }
2203
2204 /*
2205 * scsipi_async_event:
2206 *
2207 * Handle an asynchronous event from an adapter.
2208 */
2209 void
2210 scsipi_async_event(chan, event, arg)
2211 struct scsipi_channel *chan;
2212 scsipi_async_event_t event;
2213 void *arg;
2214 {
2215 int s;
2216
2217 s = splbio();
2218 switch (event) {
2219 case ASYNC_EVENT_MAX_OPENINGS:
2220 scsipi_async_event_max_openings(chan,
2221 (struct scsipi_max_openings *)arg);
2222 break;
2223
2224 case ASYNC_EVENT_XFER_MODE:
2225 scsipi_async_event_xfer_mode(chan,
2226 (struct scsipi_xfer_mode *)arg);
2227 break;
2228 case ASYNC_EVENT_RESET:
2229 scsipi_async_event_channel_reset(chan);
2230 break;
2231 }
2232 splx(s);
2233 }
2234
2235 /*
2236 * scsipi_print_xfer_mode:
2237 *
2238 * Print a periph's capabilities.
2239 */
2240 void
2241 scsipi_print_xfer_mode(periph)
2242 struct scsipi_periph *periph;
2243 {
2244 int period, freq, speed, mbs;
2245
2246 if ((periph->periph_flags & PERIPH_MODE_VALID) == 0)
2247 return;
2248
2249 printf("%s: ", periph->periph_dev->dv_xname);
2250 if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
2251 period = scsipi_sync_factor_to_period(periph->periph_period);
2252 printf("sync (%d.%02dns offset %d)",
2253 period / 100, period % 100, periph->periph_offset);
2254 } else
2255 printf("async");
2256
2257 if (periph->periph_mode & PERIPH_CAP_WIDE32)
2258 printf(", 32-bit");
2259 else if (periph->periph_mode & (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
2260 printf(", 16-bit");
2261 else
2262 printf(", 8-bit");
2263
2264 if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
2265 freq = scsipi_sync_factor_to_freq(periph->periph_period);
2266 speed = freq;
2267 if (periph->periph_mode & PERIPH_CAP_WIDE32)
2268 speed *= 4;
2269 else if (periph->periph_mode &
2270 (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
2271 speed *= 2;
2272 mbs = speed / 1000;
2273 if (mbs > 0)
2274 printf(" (%d.%03dMB/s)", mbs, speed % 1000);
2275 else
2276 printf(" (%dKB/s)", speed % 1000);
2277 }
2278
2279 printf(" transfers");
2280
2281 if (periph->periph_mode & PERIPH_CAP_TQING)
2282 printf(", tagged queueing");
2283
2284 printf("\n");
2285 }
2286
2287 /*
2288 * scsipi_async_event_max_openings:
2289 *
2290 * Update the maximum number of outstanding commands a
2291 * device may have.
2292 */
2293 void
2294 scsipi_async_event_max_openings(chan, mo)
2295 struct scsipi_channel *chan;
2296 struct scsipi_max_openings *mo;
2297 {
2298 struct scsipi_periph *periph;
2299 int minlun, maxlun;
2300
2301 if (mo->mo_lun == -1) {
2302 /*
2303 * Wildcarded; apply it to all LUNs.
2304 */
2305 minlun = 0;
2306 maxlun = chan->chan_nluns - 1;
2307 } else
2308 minlun = maxlun = mo->mo_lun;
2309
2310 /* XXX This could really suck with a large LUN space. */
2311 for (; minlun <= maxlun; minlun++) {
2312 periph = scsipi_lookup_periph(chan, mo->mo_target, minlun);
2313 if (periph == NULL)
2314 continue;
2315
2316 if (mo->mo_openings < periph->periph_openings)
2317 periph->periph_openings = mo->mo_openings;
2318 else if (mo->mo_openings > periph->periph_openings &&
2319 (periph->periph_flags & PERIPH_GROW_OPENINGS) != 0)
2320 periph->periph_openings = mo->mo_openings;
2321 }
2322 }
2323
2324 /*
2325 * scsipi_async_event_xfer_mode:
2326 *
2327 * Update the xfer mode for all periphs sharing the
2328 * specified I_T Nexus.
2329 */
2330 void
2331 scsipi_async_event_xfer_mode(chan, xm)
2332 struct scsipi_channel *chan;
2333 struct scsipi_xfer_mode *xm;
2334 {
2335 struct scsipi_periph *periph;
2336 int lun, announce, mode, period, offset;
2337
2338 for (lun = 0; lun < chan->chan_nluns; lun++) {
2339 periph = scsipi_lookup_periph(chan, xm->xm_target, lun);
2340 if (periph == NULL)
2341 continue;
2342 announce = 0;
2343
2344 /*
2345 * Clamp the xfer mode down to this periph's capabilities.
2346 */
2347 mode = xm->xm_mode & periph->periph_cap;
2348 if (mode & PERIPH_CAP_SYNC) {
2349 period = xm->xm_period;
2350 offset = xm->xm_offset;
2351 } else {
2352 period = 0;
2353 offset = 0;
2354 }
2355
2356 /*
2357 * If we do not have a valid xfer mode yet, or the parameters
2358 * are different, announce them.
2359 */
2360 if ((periph->periph_flags & PERIPH_MODE_VALID) == 0 ||
2361 periph->periph_mode != mode ||
2362 periph->periph_period != period ||
2363 periph->periph_offset != offset)
2364 announce = 1;
2365
2366 periph->periph_mode = mode;
2367 periph->periph_period = period;
2368 periph->periph_offset = offset;
2369 periph->periph_flags |= PERIPH_MODE_VALID;
2370
2371 if (announce)
2372 scsipi_print_xfer_mode(periph);
2373 }
2374 }
2375
2376 /*
2377 * scsipi_set_xfer_mode:
2378 *
2379 * Set the xfer mode for the specified I_T Nexus.
2380 */
2381 void
2382 scsipi_set_xfer_mode(chan, target, immed)
2383 struct scsipi_channel *chan;
2384 int target, immed;
2385 {
2386 struct scsipi_xfer_mode xm;
2387 struct scsipi_periph *itperiph;
2388 int lun, s;
2389
2390 /*
2391 * Go to the minimal xfer mode.
2392 */
2393 xm.xm_target = target;
2394 xm.xm_mode = 0;
2395 xm.xm_period = 0; /* ignored */
2396 xm.xm_offset = 0; /* ignored */
2397
2398 /*
2399 * Find the first LUN we know about on this I_T Nexus.
2400 */
2401 for (itperiph = NULL, lun = 0; lun < chan->chan_nluns; lun++) {
2402 itperiph = scsipi_lookup_periph(chan, target, lun);
2403 if (itperiph != NULL)
2404 break;
2405 }
2406 if (itperiph != NULL) {
2407 xm.xm_mode = itperiph->periph_cap;
2408 /*
2409 * Now issue the request to the adapter.
2410 */
2411 s = splbio();
2412 scsipi_adapter_request(chan, ADAPTER_REQ_SET_XFER_MODE, &xm);
2413 splx(s);
2414 /*
2415 * If we want this to happen immediately, issue a dummy
2416 * command, since most adapters can't really negotiate unless
2417 * they're executing a job.
2418 */
2419 if (immed != 0) {
2420 (void) scsipi_test_unit_ready(itperiph,
2421 XS_CTL_DISCOVERY | XS_CTL_IGNORE_ILLEGAL_REQUEST |
2422 XS_CTL_IGNORE_NOT_READY |
2423 XS_CTL_IGNORE_MEDIA_CHANGE);
2424 }
2425 }
2426 }
2427
2428 /*
2429 * scsipi_channel_reset:
2430 *
2431 * handle scsi bus reset
2432 * called at splbio
2433 */
2434 void
2435 scsipi_async_event_channel_reset(chan)
2436 struct scsipi_channel *chan;
2437 {
2438 struct scsipi_xfer *xs, *xs_next;
2439 struct scsipi_periph *periph;
2440 int target, lun;
2441
2442 /*
2443 * Channel has been reset. Also mark as reset pending REQUEST_SENSE
2444 * commands; as the sense is not available any more.
2445 * can't call scsipi_done() from here, as the command has not been
2446 * sent to the adapter yet (this would corrupt accounting).
2447 */
2448
2449 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL; xs = xs_next) {
2450 xs_next = TAILQ_NEXT(xs, channel_q);
2451 if (xs->xs_control & XS_CTL_REQSENSE) {
2452 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2453 xs->error = XS_RESET;
2454 if ((xs->xs_control & XS_CTL_ASYNC) != 0)
2455 TAILQ_INSERT_TAIL(&chan->chan_complete, xs,
2456 channel_q);
2457 }
2458 }
2459 wakeup(&chan->chan_complete);
2460 /* Catch xs with pending sense which may not have a REQSENSE xs yet */
2461 for (target = 0; target < chan->chan_ntargets; target++) {
2462 if (target == chan->chan_id)
2463 continue;
2464 for (lun = 0; lun < chan->chan_nluns; lun++) {
2465 periph = scsipi_lookup_periph(chan, target, lun);
2466 if (periph) {
2467 xs = periph->periph_xscheck;
2468 if (xs)
2469 xs->error = XS_RESET;
2470 }
2471 }
2472 }
2473 }
2474
2475 /*
2476 * scsipi_target_detach:
2477 *
2478 * detach all periph associated with a I_T
2479 * must be called from valid thread context
2480 */
2481 int
2482 scsipi_target_detach(chan, target, lun, flags)
2483 struct scsipi_channel *chan;
2484 int target, lun;
2485 int flags;
2486 {
2487 struct scsipi_periph *periph;
2488 int ctarget, mintarget, maxtarget;
2489 int clun, minlun, maxlun;
2490 int error;
2491
2492 if (target == -1) {
2493 mintarget = 0;
2494 maxtarget = chan->chan_ntargets;
2495 } else {
2496 if (target == chan->chan_id)
2497 return EINVAL;
2498 if (target < 0 || target >= chan->chan_ntargets)
2499 return EINVAL;
2500 mintarget = target;
2501 maxtarget = target + 1;
2502 }
2503
2504 if (lun == -1) {
2505 minlun = 0;
2506 maxlun = chan->chan_nluns;
2507 } else {
2508 if (lun < 0 || lun >= chan->chan_nluns)
2509 return EINVAL;
2510 minlun = lun;
2511 maxlun = lun + 1;
2512 }
2513
2514 for (ctarget = mintarget; ctarget < maxtarget; ctarget++) {
2515 if (ctarget == chan->chan_id)
2516 continue;
2517
2518 for (clun = minlun; clun < maxlun; clun++) {
2519 periph = scsipi_lookup_periph(chan, ctarget, clun);
2520 if (periph == NULL)
2521 continue;
2522 error = config_detach(periph->periph_dev, flags);
2523 if (error)
2524 return (error);
2525 scsipi_remove_periph(chan, periph);
2526 free(periph, M_DEVBUF);
2527 }
2528 }
2529 return(0);
2530 }
2531
2532 /*
2533 * scsipi_adapter_addref:
2534 *
2535 * Add a reference to the adapter pointed to by the provided
2536 * link, enabling the adapter if necessary.
2537 */
2538 int
2539 scsipi_adapter_addref(adapt)
2540 struct scsipi_adapter *adapt;
2541 {
2542 int s, error = 0;
2543
2544 s = splbio();
2545 if (adapt->adapt_refcnt++ == 0 && adapt->adapt_enable != NULL) {
2546 error = (*adapt->adapt_enable)(adapt->adapt_dev, 1);
2547 if (error)
2548 adapt->adapt_refcnt--;
2549 }
2550 splx(s);
2551 return (error);
2552 }
2553
2554 /*
2555 * scsipi_adapter_delref:
2556 *
2557 * Delete a reference to the adapter pointed to by the provided
2558 * link, disabling the adapter if possible.
2559 */
2560 void
2561 scsipi_adapter_delref(adapt)
2562 struct scsipi_adapter *adapt;
2563 {
2564 int s;
2565
2566 s = splbio();
2567 if (adapt->adapt_refcnt-- == 1 && adapt->adapt_enable != NULL)
2568 (void) (*adapt->adapt_enable)(adapt->adapt_dev, 0);
2569 splx(s);
2570 }
2571
2572 struct scsipi_syncparam {
2573 int ss_factor;
2574 int ss_period; /* ns * 100 */
2575 } scsipi_syncparams[] = {
2576 { 0x08, 625 }, /* FAST-160 (Ultra320) */
2577 { 0x09, 1250 }, /* FAST-80 (Ultra160) */
2578 { 0x0a, 2500 }, /* FAST-40 40MHz (Ultra2) */
2579 { 0x0b, 3030 }, /* FAST-40 33MHz (Ultra2) */
2580 { 0x0c, 5000 }, /* FAST-20 (Ultra) */
2581 };
2582 const int scsipi_nsyncparams =
2583 sizeof(scsipi_syncparams) / sizeof(scsipi_syncparams[0]);
2584
2585 int
2586 scsipi_sync_period_to_factor(period)
2587 int period; /* ns * 100 */
2588 {
2589 int i;
2590
2591 for (i = 0; i < scsipi_nsyncparams; i++) {
2592 if (period <= scsipi_syncparams[i].ss_period)
2593 return (scsipi_syncparams[i].ss_factor);
2594 }
2595
2596 return ((period / 100) / 4);
2597 }
2598
2599 int
2600 scsipi_sync_factor_to_period(factor)
2601 int factor;
2602 {
2603 int i;
2604
2605 for (i = 0; i < scsipi_nsyncparams; i++) {
2606 if (factor == scsipi_syncparams[i].ss_factor)
2607 return (scsipi_syncparams[i].ss_period);
2608 }
2609
2610 return ((factor * 4) * 100);
2611 }
2612
2613 int
2614 scsipi_sync_factor_to_freq(factor)
2615 int factor;
2616 {
2617 int i;
2618
2619 for (i = 0; i < scsipi_nsyncparams; i++) {
2620 if (factor == scsipi_syncparams[i].ss_factor)
2621 return (100000000 / scsipi_syncparams[i].ss_period);
2622 }
2623
2624 return (10000000 / ((factor * 4) * 10));
2625 }
2626
2627 #ifdef SCSIPI_DEBUG
2628 /*
2629 * Given a scsipi_xfer, dump the request, in all it's glory
2630 */
2631 void
2632 show_scsipi_xs(xs)
2633 struct scsipi_xfer *xs;
2634 {
2635
2636 printf("xs(%p): ", xs);
2637 printf("xs_control(0x%08x)", xs->xs_control);
2638 printf("xs_status(0x%08x)", xs->xs_status);
2639 printf("periph(%p)", xs->xs_periph);
2640 printf("retr(0x%x)", xs->xs_retries);
2641 printf("timo(0x%x)", xs->timeout);
2642 printf("cmd(%p)", xs->cmd);
2643 printf("len(0x%x)", xs->cmdlen);
2644 printf("data(%p)", xs->data);
2645 printf("len(0x%x)", xs->datalen);
2646 printf("res(0x%x)", xs->resid);
2647 printf("err(0x%x)", xs->error);
2648 printf("bp(%p)", xs->bp);
2649 show_scsipi_cmd(xs);
2650 }
2651
2652 void
2653 show_scsipi_cmd(xs)
2654 struct scsipi_xfer *xs;
2655 {
2656 u_char *b = (u_char *) xs->cmd;
2657 int i = 0;
2658
2659 scsipi_printaddr(xs->xs_periph);
2660 printf(" command: ");
2661
2662 if ((xs->xs_control & XS_CTL_RESET) == 0) {
2663 while (i < xs->cmdlen) {
2664 if (i)
2665 printf(",");
2666 printf("0x%x", b[i++]);
2667 }
2668 printf("-[%d bytes]\n", xs->datalen);
2669 if (xs->datalen)
2670 show_mem(xs->data, min(64, xs->datalen));
2671 } else
2672 printf("-RESET-\n");
2673 }
2674
2675 void
2676 show_mem(address, num)
2677 u_char *address;
2678 int num;
2679 {
2680 int x;
2681
2682 printf("------------------------------");
2683 for (x = 0; x < num; x++) {
2684 if ((x % 16) == 0)
2685 printf("\n%03d: ", x);
2686 printf("%02x ", *address++);
2687 }
2688 printf("\n------------------------------\n");
2689 }
2690 #endif /* SCSIPI_DEBUG */
2691