scsipi_base.c revision 1.95 1 /* $NetBSD: scsipi_base.c,v 1.95 2003/10/12 03:21:56 thorpej 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.95 2003/10/12 03:21:56 thorpej 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 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1152 scsipi_cmd.opcode = PREVENT_ALLOW;
1153 scsipi_cmd.how = type;
1154
1155 return (scsipi_command(periph,
1156 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
1157 0, 0, SCSIPIRETRIES, 5000, NULL, flags));
1158 }
1159
1160 /*
1161 * scsipi_start:
1162 *
1163 * Send a START UNIT.
1164 */
1165 int
1166 scsipi_start(periph, type, flags)
1167 struct scsipi_periph *periph;
1168 int type, flags;
1169 {
1170 struct scsipi_start_stop scsipi_cmd;
1171
1172 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1173 scsipi_cmd.opcode = START_STOP;
1174 scsipi_cmd.byte2 = 0x00;
1175 scsipi_cmd.how = type;
1176
1177 return (scsipi_command(periph,
1178 (struct scsipi_generic *) &scsipi_cmd, sizeof(scsipi_cmd),
1179 0, 0, SCSIPIRETRIES, (type & SSS_START) ? 60000 : 10000,
1180 NULL, flags));
1181 }
1182
1183 /*
1184 * scsipi_mode_sense, scsipi_mode_sense_big:
1185 * get a sense page from a device
1186 */
1187
1188 int
1189 scsipi_mode_sense(periph, byte2, page, data, len, flags, retries, timeout)
1190 struct scsipi_periph *periph;
1191 int byte2, page, len, flags, retries, timeout;
1192 struct scsipi_mode_header *data;
1193 {
1194 struct scsipi_mode_sense scsipi_cmd;
1195 int error;
1196
1197 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1198 scsipi_cmd.opcode = MODE_SENSE;
1199 scsipi_cmd.byte2 = byte2;
1200 scsipi_cmd.page = page;
1201 scsipi_cmd.length = len & 0xff;
1202 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1203 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1204 flags | XS_CTL_DATA_IN);
1205 SC_DEBUG(periph, SCSIPI_DB2,
1206 ("scsipi_mode_sense: error=%d\n", error));
1207 return (error);
1208 }
1209
1210 int
1211 scsipi_mode_sense_big(periph, byte2, page, data, len, flags, retries, timeout)
1212 struct scsipi_periph *periph;
1213 int byte2, page, len, flags, retries, timeout;
1214 struct scsipi_mode_header_big *data;
1215 {
1216 struct scsipi_mode_sense_big scsipi_cmd;
1217 int error;
1218
1219 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1220 scsipi_cmd.opcode = MODE_SENSE_BIG;
1221 scsipi_cmd.byte2 = byte2;
1222 scsipi_cmd.page = page;
1223 _lto2b(len, scsipi_cmd.length);
1224 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1225 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1226 flags | XS_CTL_DATA_IN);
1227 SC_DEBUG(periph, SCSIPI_DB2,
1228 ("scsipi_mode_sense_big: error=%d\n", error));
1229 return (error);
1230 }
1231
1232 int
1233 scsipi_mode_select(periph, byte2, data, len, flags, retries, timeout)
1234 struct scsipi_periph *periph;
1235 int byte2, len, flags, retries, timeout;
1236 struct scsipi_mode_header *data;
1237 {
1238 struct scsipi_mode_select scsipi_cmd;
1239 int error;
1240
1241 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1242 scsipi_cmd.opcode = MODE_SELECT;
1243 scsipi_cmd.byte2 = byte2;
1244 scsipi_cmd.length = len & 0xff;
1245 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1246 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1247 flags | XS_CTL_DATA_OUT);
1248 SC_DEBUG(periph, SCSIPI_DB2,
1249 ("scsipi_mode_select: error=%d\n", error));
1250 return (error);
1251 }
1252
1253 int
1254 scsipi_mode_select_big(periph, byte2, data, len, flags, retries, timeout)
1255 struct scsipi_periph *periph;
1256 int byte2, len, flags, retries, timeout;
1257 struct scsipi_mode_header_big *data;
1258 {
1259 struct scsipi_mode_select_big scsipi_cmd;
1260 int error;
1261
1262 memset(&scsipi_cmd, 0, sizeof(scsipi_cmd));
1263 scsipi_cmd.opcode = MODE_SELECT_BIG;
1264 scsipi_cmd.byte2 = byte2;
1265 _lto2b(len, scsipi_cmd.length);
1266 error = scsipi_command(periph, (struct scsipi_generic *)&scsipi_cmd,
1267 sizeof(scsipi_cmd), (void *)data, len, retries, timeout, NULL,
1268 flags | XS_CTL_DATA_OUT);
1269 SC_DEBUG(periph, SCSIPI_DB2,
1270 ("scsipi_mode_select: error=%d\n", error));
1271 return (error);
1272 }
1273
1274 /*
1275 * scsipi_done:
1276 *
1277 * This routine is called by an adapter's interrupt handler when
1278 * an xfer is completed.
1279 */
1280 void
1281 scsipi_done(xs)
1282 struct scsipi_xfer *xs;
1283 {
1284 struct scsipi_periph *periph = xs->xs_periph;
1285 struct scsipi_channel *chan = periph->periph_channel;
1286 int s, freezecnt;
1287
1288 SC_DEBUG(periph, SCSIPI_DB2, ("scsipi_done\n"));
1289 #ifdef SCSIPI_DEBUG
1290 if (periph->periph_dbflags & SCSIPI_DB1)
1291 show_scsipi_cmd(xs);
1292 #endif
1293
1294 s = splbio();
1295 /*
1296 * The resource this command was using is now free.
1297 */
1298 scsipi_put_resource(chan);
1299 xs->xs_periph->periph_sent--;
1300
1301 /*
1302 * If the command was tagged, free the tag.
1303 */
1304 if (XS_CTL_TAGTYPE(xs) != 0)
1305 scsipi_put_tag(xs);
1306 else
1307 periph->periph_flags &= ~PERIPH_UNTAG;
1308
1309 /* Mark the command as `done'. */
1310 xs->xs_status |= XS_STS_DONE;
1311
1312 #ifdef DIAGNOSTIC
1313 if ((xs->xs_control & (XS_CTL_ASYNC|XS_CTL_POLL)) ==
1314 (XS_CTL_ASYNC|XS_CTL_POLL))
1315 panic("scsipi_done: ASYNC and POLL");
1316 #endif
1317
1318 /*
1319 * If the xfer had an error of any sort, freeze the
1320 * periph's queue. Freeze it again if we were requested
1321 * to do so in the xfer.
1322 */
1323 freezecnt = 0;
1324 if (xs->error != XS_NOERROR)
1325 freezecnt++;
1326 if (xs->xs_control & XS_CTL_FREEZE_PERIPH)
1327 freezecnt++;
1328 if (freezecnt != 0)
1329 scsipi_periph_freeze(periph, freezecnt);
1330
1331 /*
1332 * record the xfer with a pending sense, in case a SCSI reset is
1333 * received before the thread is waked up.
1334 */
1335 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1336 periph->periph_flags |= PERIPH_SENSE;
1337 periph->periph_xscheck = xs;
1338 }
1339
1340 /*
1341 * If this was an xfer that was not to complete asynchronously,
1342 * let the requesting thread perform error checking/handling
1343 * in its context.
1344 */
1345 if ((xs->xs_control & XS_CTL_ASYNC) == 0) {
1346 splx(s);
1347 /*
1348 * If it's a polling job, just return, to unwind the
1349 * call graph. We don't need to restart the queue,
1350 * because pollings jobs are treated specially, and
1351 * are really only used during crash dumps anyway
1352 * (XXX or during boot-time autconfiguration of
1353 * ATAPI devices).
1354 */
1355 if (xs->xs_control & XS_CTL_POLL)
1356 return;
1357 wakeup(xs);
1358 goto out;
1359 }
1360
1361 /*
1362 * Catch the extremely common case of I/O completing
1363 * without error; no use in taking a context switch
1364 * if we can handle it in interrupt context.
1365 */
1366 if (xs->error == XS_NOERROR) {
1367 splx(s);
1368 (void) scsipi_complete(xs);
1369 goto out;
1370 }
1371
1372 /*
1373 * There is an error on this xfer. Put it on the channel's
1374 * completion queue, and wake up the completion thread.
1375 */
1376 TAILQ_INSERT_TAIL(&chan->chan_complete, xs, channel_q);
1377 splx(s);
1378 wakeup(&chan->chan_complete);
1379
1380 out:
1381 /*
1382 * If there are more xfers on the channel's queue, attempt to
1383 * run them.
1384 */
1385 scsipi_run_queue(chan);
1386 }
1387
1388 /*
1389 * scsipi_complete:
1390 *
1391 * Completion of a scsipi_xfer. This is the guts of scsipi_done().
1392 *
1393 * NOTE: This routine MUST be called with valid thread context
1394 * except for the case where the following two conditions are
1395 * true:
1396 *
1397 * xs->error == XS_NOERROR
1398 * XS_CTL_ASYNC is set in xs->xs_control
1399 *
1400 * The semantics of this routine can be tricky, so here is an
1401 * explanation:
1402 *
1403 * 0 Xfer completed successfully.
1404 *
1405 * ERESTART Xfer had an error, but was restarted.
1406 *
1407 * anything else Xfer had an error, return value is Unix
1408 * errno.
1409 *
1410 * If the return value is anything but ERESTART:
1411 *
1412 * - If XS_CTL_ASYNC is set, `xs' has been freed back to
1413 * the pool.
1414 * - If there is a buf associated with the xfer,
1415 * it has been biodone()'d.
1416 */
1417 int
1418 scsipi_complete(xs)
1419 struct scsipi_xfer *xs;
1420 {
1421 struct scsipi_periph *periph = xs->xs_periph;
1422 struct scsipi_channel *chan = periph->periph_channel;
1423 struct buf *bp;
1424 int error, s;
1425
1426 #ifdef DIAGNOSTIC
1427 if ((xs->xs_control & XS_CTL_ASYNC) != 0 && xs->bp == NULL)
1428 panic("scsipi_complete: XS_CTL_ASYNC but no buf");
1429 #endif
1430 /*
1431 * If command terminated with a CHECK CONDITION, we need to issue a
1432 * REQUEST_SENSE command. Once the REQUEST_SENSE has been processed
1433 * we'll have the real status.
1434 * Must be processed at splbio() to avoid missing a SCSI bus reset
1435 * for this command.
1436 */
1437 s = splbio();
1438 if (xs->error == XS_BUSY && xs->status == SCSI_CHECK) {
1439 /* request sense for a request sense ? */
1440 if (xs->xs_control & XS_CTL_REQSENSE) {
1441 scsipi_printaddr(periph);
1442 printf("request sense for a request sense ?\n");
1443 /* XXX maybe we should reset the device ? */
1444 /* we've been frozen because xs->error != XS_NOERROR */
1445 scsipi_periph_thaw(periph, 1);
1446 splx(s);
1447 if (xs->resid < xs->datalen) {
1448 printf("we read %d bytes of sense anyway:\n",
1449 xs->datalen - xs->resid);
1450 #ifdef SCSIVERBOSE
1451 scsipi_print_sense_data((void *)xs->data, 0);
1452 #endif
1453 }
1454 return EINVAL;
1455 }
1456 scsipi_request_sense(xs);
1457 }
1458 splx(s);
1459
1460 /*
1461 * If it's a user level request, bypass all usual completion
1462 * processing, let the user work it out..
1463 */
1464 if ((xs->xs_control & XS_CTL_USERCMD) != 0) {
1465 SC_DEBUG(periph, SCSIPI_DB3, ("calling user done()\n"));
1466 if (xs->error != XS_NOERROR)
1467 scsipi_periph_thaw(periph, 1);
1468 scsipi_user_done(xs);
1469 SC_DEBUG(periph, SCSIPI_DB3, ("returned from user done()\n "));
1470 return 0;
1471 }
1472
1473 switch (xs->error) {
1474 case XS_NOERROR:
1475 error = 0;
1476 break;
1477
1478 case XS_SENSE:
1479 case XS_SHORTSENSE:
1480 error = (*chan->chan_bustype->bustype_interpret_sense)(xs);
1481 break;
1482
1483 case XS_RESOURCE_SHORTAGE:
1484 /*
1485 * XXX Should freeze channel's queue.
1486 */
1487 scsipi_printaddr(periph);
1488 printf("adapter resource shortage\n");
1489 /* FALLTHROUGH */
1490
1491 case XS_BUSY:
1492 if (xs->error == XS_BUSY && xs->status == SCSI_QUEUE_FULL) {
1493 struct scsipi_max_openings mo;
1494
1495 /*
1496 * We set the openings to active - 1, assuming that
1497 * the command that got us here is the first one that
1498 * can't fit into the device's queue. If that's not
1499 * the case, I guess we'll find out soon enough.
1500 */
1501 mo.mo_target = periph->periph_target;
1502 mo.mo_lun = periph->periph_lun;
1503 if (periph->periph_active < periph->periph_openings)
1504 mo.mo_openings = periph->periph_active - 1;
1505 else
1506 mo.mo_openings = periph->periph_openings - 1;
1507 #ifdef DIAGNOSTIC
1508 if (mo.mo_openings < 0) {
1509 scsipi_printaddr(periph);
1510 printf("QUEUE FULL resulted in < 0 openings\n");
1511 panic("scsipi_done");
1512 }
1513 #endif
1514 if (mo.mo_openings == 0) {
1515 scsipi_printaddr(periph);
1516 printf("QUEUE FULL resulted in 0 openings\n");
1517 mo.mo_openings = 1;
1518 }
1519 scsipi_async_event(chan, ASYNC_EVENT_MAX_OPENINGS, &mo);
1520 error = ERESTART;
1521 } else if (xs->xs_retries != 0) {
1522 xs->xs_retries--;
1523 /*
1524 * Wait one second, and try again.
1525 */
1526 if ((xs->xs_control & XS_CTL_POLL) ||
1527 (chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
1528 delay(1000000);
1529 } else if (!callout_pending(&periph->periph_callout)) {
1530 scsipi_periph_freeze(periph, 1);
1531 callout_reset(&periph->periph_callout,
1532 hz, scsipi_periph_timed_thaw, periph);
1533 }
1534 error = ERESTART;
1535 } else
1536 error = EBUSY;
1537 break;
1538
1539 case XS_REQUEUE:
1540 error = ERESTART;
1541 break;
1542
1543 case XS_SELTIMEOUT:
1544 case XS_TIMEOUT:
1545 /*
1546 * If the device hasn't gone away, honor retry counts.
1547 *
1548 * Note that if we're in the middle of probing it,
1549 * it won't be found because it isn't here yet so
1550 * we won't honor the retry count in that case.
1551 */
1552 if (scsipi_lookup_periph(chan, periph->periph_target,
1553 periph->periph_lun) && xs->xs_retries != 0) {
1554 xs->xs_retries--;
1555 error = ERESTART;
1556 } else
1557 error = EIO;
1558 break;
1559
1560 case XS_RESET:
1561 if (xs->xs_control & XS_CTL_REQSENSE) {
1562 /*
1563 * request sense interrupted by reset: signal it
1564 * with EINTR return code.
1565 */
1566 error = EINTR;
1567 } else {
1568 if (xs->xs_retries != 0) {
1569 xs->xs_retries--;
1570 error = ERESTART;
1571 } else
1572 error = EIO;
1573 }
1574 break;
1575
1576 case XS_DRIVER_STUFFUP:
1577 scsipi_printaddr(periph);
1578 printf("generic HBA error\n");
1579 error = EIO;
1580 break;
1581 default:
1582 scsipi_printaddr(periph);
1583 printf("invalid return code from adapter: %d\n", xs->error);
1584 error = EIO;
1585 break;
1586 }
1587
1588 s = splbio();
1589 if (error == ERESTART) {
1590 /*
1591 * If we get here, the periph has been thawed and frozen
1592 * again if we had to issue recovery commands. Alternatively,
1593 * it may have been frozen again and in a timed thaw. In
1594 * any case, we thaw the periph once we re-enqueue the
1595 * command. Once the periph is fully thawed, it will begin
1596 * operation again.
1597 */
1598 xs->error = XS_NOERROR;
1599 xs->status = SCSI_OK;
1600 xs->xs_status &= ~XS_STS_DONE;
1601 xs->xs_requeuecnt++;
1602 error = scsipi_enqueue(xs);
1603 if (error == 0) {
1604 scsipi_periph_thaw(periph, 1);
1605 splx(s);
1606 return (ERESTART);
1607 }
1608 }
1609
1610 /*
1611 * scsipi_done() freezes the queue if not XS_NOERROR.
1612 * Thaw it here.
1613 */
1614 if (xs->error != XS_NOERROR)
1615 scsipi_periph_thaw(periph, 1);
1616
1617 /*
1618 * Set buffer fields in case the periph
1619 * switch done func uses them
1620 */
1621 if ((bp = xs->bp) != NULL) {
1622 if (error) {
1623 bp->b_error = error;
1624 bp->b_flags |= B_ERROR;
1625 bp->b_resid = bp->b_bcount;
1626 } else {
1627 bp->b_error = 0;
1628 bp->b_resid = xs->resid;
1629 }
1630 }
1631
1632 if (periph->periph_switch->psw_done)
1633 periph->periph_switch->psw_done(xs);
1634
1635 if (bp)
1636 biodone(bp);
1637
1638 if (xs->xs_control & XS_CTL_ASYNC)
1639 scsipi_put_xs(xs);
1640 splx(s);
1641
1642 return (error);
1643 }
1644
1645 /*
1646 * Issue a request sense for the given scsipi_xfer. Called when the xfer
1647 * returns with a CHECK_CONDITION status. Must be called in valid thread
1648 * context and at splbio().
1649 */
1650
1651 void
1652 scsipi_request_sense(xs)
1653 struct scsipi_xfer *xs;
1654 {
1655 struct scsipi_periph *periph = xs->xs_periph;
1656 int flags, error;
1657 struct scsipi_sense cmd;
1658
1659 periph->periph_flags |= PERIPH_SENSE;
1660
1661 /* if command was polling, request sense will too */
1662 flags = xs->xs_control & XS_CTL_POLL;
1663 /* Polling commands can't sleep */
1664 if (flags)
1665 flags |= XS_CTL_NOSLEEP;
1666
1667 flags |= XS_CTL_REQSENSE | XS_CTL_URGENT | XS_CTL_DATA_IN |
1668 XS_CTL_THAW_PERIPH | XS_CTL_FREEZE_PERIPH;
1669
1670 memset(&cmd, 0, sizeof(cmd));
1671 cmd.opcode = REQUEST_SENSE;
1672 cmd.length = sizeof(struct scsipi_sense_data);
1673
1674 error = scsipi_command(periph,
1675 (struct scsipi_generic *) &cmd, sizeof(cmd),
1676 (u_char*)&xs->sense.scsi_sense, sizeof(struct scsipi_sense_data),
1677 0, 1000, NULL, flags);
1678 periph->periph_flags &= ~PERIPH_SENSE;
1679 periph->periph_xscheck = NULL;
1680 switch(error) {
1681 case 0:
1682 /* we have a valid sense */
1683 xs->error = XS_SENSE;
1684 return;
1685 case EINTR:
1686 /* REQUEST_SENSE interrupted by bus reset. */
1687 xs->error = XS_RESET;
1688 return;
1689 case EIO:
1690 /* request sense coudn't be performed */
1691 /*
1692 * XXX this isn't quite right but we don't have anything
1693 * better for now
1694 */
1695 xs->error = XS_DRIVER_STUFFUP;
1696 return;
1697 default:
1698 /* Notify that request sense failed. */
1699 xs->error = XS_DRIVER_STUFFUP;
1700 scsipi_printaddr(periph);
1701 printf("request sense failed with error %d\n", error);
1702 return;
1703 }
1704 }
1705
1706 /*
1707 * scsipi_enqueue:
1708 *
1709 * Enqueue an xfer on a channel.
1710 */
1711 int
1712 scsipi_enqueue(xs)
1713 struct scsipi_xfer *xs;
1714 {
1715 struct scsipi_channel *chan = xs->xs_periph->periph_channel;
1716 struct scsipi_xfer *qxs;
1717 int s;
1718
1719 s = splbio();
1720
1721 /*
1722 * If the xfer is to be polled, and there are already jobs on
1723 * the queue, we can't proceed.
1724 */
1725 if ((xs->xs_control & XS_CTL_POLL) != 0 &&
1726 TAILQ_FIRST(&chan->chan_queue) != NULL) {
1727 splx(s);
1728 xs->error = XS_DRIVER_STUFFUP;
1729 return (EAGAIN);
1730 }
1731
1732 /*
1733 * If we have an URGENT xfer, it's an error recovery command
1734 * and it should just go on the head of the channel's queue.
1735 */
1736 if (xs->xs_control & XS_CTL_URGENT) {
1737 TAILQ_INSERT_HEAD(&chan->chan_queue, xs, channel_q);
1738 goto out;
1739 }
1740
1741 /*
1742 * If this xfer has already been on the queue before, we
1743 * need to reinsert it in the correct order. That order is:
1744 *
1745 * Immediately before the first xfer for this periph
1746 * with a requeuecnt less than xs->xs_requeuecnt.
1747 *
1748 * Failing that, at the end of the queue. (We'll end up
1749 * there naturally.)
1750 */
1751 if (xs->xs_requeuecnt != 0) {
1752 for (qxs = TAILQ_FIRST(&chan->chan_queue); qxs != NULL;
1753 qxs = TAILQ_NEXT(qxs, channel_q)) {
1754 if (qxs->xs_periph == xs->xs_periph &&
1755 qxs->xs_requeuecnt < xs->xs_requeuecnt)
1756 break;
1757 }
1758 if (qxs != NULL) {
1759 TAILQ_INSERT_AFTER(&chan->chan_queue, qxs, xs,
1760 channel_q);
1761 goto out;
1762 }
1763 }
1764 TAILQ_INSERT_TAIL(&chan->chan_queue, xs, channel_q);
1765 out:
1766 if (xs->xs_control & XS_CTL_THAW_PERIPH)
1767 scsipi_periph_thaw(xs->xs_periph, 1);
1768 splx(s);
1769 return (0);
1770 }
1771
1772 /*
1773 * scsipi_run_queue:
1774 *
1775 * Start as many xfers as possible running on the channel.
1776 */
1777 void
1778 scsipi_run_queue(chan)
1779 struct scsipi_channel *chan;
1780 {
1781 struct scsipi_xfer *xs;
1782 struct scsipi_periph *periph;
1783 int s;
1784
1785 for (;;) {
1786 s = splbio();
1787
1788 /*
1789 * If the channel is frozen, we can't do any work right
1790 * now.
1791 */
1792 if (chan->chan_qfreeze != 0) {
1793 splx(s);
1794 return;
1795 }
1796
1797 /*
1798 * Look for work to do, and make sure we can do it.
1799 */
1800 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL;
1801 xs = TAILQ_NEXT(xs, channel_q)) {
1802 periph = xs->xs_periph;
1803
1804 if ((periph->periph_sent >= periph->periph_openings) ||
1805 periph->periph_qfreeze != 0 ||
1806 (periph->periph_flags & PERIPH_UNTAG) != 0)
1807 continue;
1808
1809 if ((periph->periph_flags &
1810 (PERIPH_RECOVERING | PERIPH_SENSE)) != 0 &&
1811 (xs->xs_control & XS_CTL_URGENT) == 0)
1812 continue;
1813
1814 /*
1815 * We can issue this xfer!
1816 */
1817 goto got_one;
1818 }
1819
1820 /*
1821 * Can't find any work to do right now.
1822 */
1823 splx(s);
1824 return;
1825
1826 got_one:
1827 /*
1828 * Have an xfer to run. Allocate a resource from
1829 * the adapter to run it. If we can't allocate that
1830 * resource, we don't dequeue the xfer.
1831 */
1832 if (scsipi_get_resource(chan) == 0) {
1833 /*
1834 * Adapter is out of resources. If the adapter
1835 * supports it, attempt to grow them.
1836 */
1837 if (scsipi_grow_resources(chan) == 0) {
1838 /*
1839 * Wasn't able to grow resources,
1840 * nothing more we can do.
1841 */
1842 if (xs->xs_control & XS_CTL_POLL) {
1843 scsipi_printaddr(xs->xs_periph);
1844 printf("polling command but no "
1845 "adapter resources");
1846 /* We'll panic shortly... */
1847 }
1848 splx(s);
1849
1850 /*
1851 * XXX: We should be able to note that
1852 * XXX: that resources are needed here!
1853 */
1854 return;
1855 }
1856 /*
1857 * scsipi_grow_resources() allocated the resource
1858 * for us.
1859 */
1860 }
1861
1862 /*
1863 * We have a resource to run this xfer, do it!
1864 */
1865 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
1866
1867 /*
1868 * If the command is to be tagged, allocate a tag ID
1869 * for it.
1870 */
1871 if (XS_CTL_TAGTYPE(xs) != 0)
1872 scsipi_get_tag(xs);
1873 else
1874 periph->periph_flags |= PERIPH_UNTAG;
1875 periph->periph_sent++;
1876 splx(s);
1877
1878 scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
1879 }
1880 #ifdef DIAGNOSTIC
1881 panic("scsipi_run_queue: impossible");
1882 #endif
1883 }
1884
1885 /*
1886 * scsipi_execute_xs:
1887 *
1888 * Begin execution of an xfer, waiting for it to complete, if necessary.
1889 */
1890 int
1891 scsipi_execute_xs(xs)
1892 struct scsipi_xfer *xs;
1893 {
1894 struct scsipi_periph *periph = xs->xs_periph;
1895 struct scsipi_channel *chan = periph->periph_channel;
1896 int oasync, async, poll, retries, error, s;
1897
1898 xs->xs_status &= ~XS_STS_DONE;
1899 xs->error = XS_NOERROR;
1900 xs->resid = xs->datalen;
1901 xs->status = SCSI_OK;
1902
1903 #ifdef SCSIPI_DEBUG
1904 if (xs->xs_periph->periph_dbflags & SCSIPI_DB3) {
1905 printf("scsipi_execute_xs: ");
1906 show_scsipi_xs(xs);
1907 printf("\n");
1908 }
1909 #endif
1910
1911 /*
1912 * Deal with command tagging:
1913 *
1914 * - If the device's current operating mode doesn't
1915 * include tagged queueing, clear the tag mask.
1916 *
1917 * - If the device's current operating mode *does*
1918 * include tagged queueing, set the tag_type in
1919 * the xfer to the appropriate byte for the tag
1920 * message.
1921 */
1922 if ((PERIPH_XFER_MODE(periph) & PERIPH_CAP_TQING) == 0 ||
1923 (xs->xs_control & XS_CTL_REQSENSE)) {
1924 xs->xs_control &= ~XS_CTL_TAGMASK;
1925 xs->xs_tag_type = 0;
1926 } else {
1927 /*
1928 * If the request doesn't specify a tag, give Head
1929 * tags to URGENT operations and Ordered tags to
1930 * everything else.
1931 */
1932 if (XS_CTL_TAGTYPE(xs) == 0) {
1933 if (xs->xs_control & XS_CTL_URGENT)
1934 xs->xs_control |= XS_CTL_HEAD_TAG;
1935 else
1936 xs->xs_control |= XS_CTL_ORDERED_TAG;
1937 }
1938
1939 switch (XS_CTL_TAGTYPE(xs)) {
1940 case XS_CTL_ORDERED_TAG:
1941 xs->xs_tag_type = MSG_ORDERED_Q_TAG;
1942 break;
1943
1944 case XS_CTL_SIMPLE_TAG:
1945 xs->xs_tag_type = MSG_SIMPLE_Q_TAG;
1946 break;
1947
1948 case XS_CTL_HEAD_TAG:
1949 xs->xs_tag_type = MSG_HEAD_OF_Q_TAG;
1950 break;
1951
1952 default:
1953 scsipi_printaddr(periph);
1954 printf("invalid tag mask 0x%08x\n",
1955 XS_CTL_TAGTYPE(xs));
1956 panic("scsipi_execute_xs");
1957 }
1958 }
1959
1960 /* If the adaptor wants us to poll, poll. */
1961 if (chan->chan_adapter->adapt_flags & SCSIPI_ADAPT_POLL_ONLY)
1962 xs->xs_control |= XS_CTL_POLL;
1963
1964 /*
1965 * If we don't yet have a completion thread, or we are to poll for
1966 * completion, clear the ASYNC flag.
1967 */
1968 oasync = (xs->xs_control & XS_CTL_ASYNC);
1969 if (chan->chan_thread == NULL || (xs->xs_control & XS_CTL_POLL) != 0)
1970 xs->xs_control &= ~XS_CTL_ASYNC;
1971
1972 async = (xs->xs_control & XS_CTL_ASYNC);
1973 poll = (xs->xs_control & XS_CTL_POLL);
1974 retries = xs->xs_retries; /* for polling commands */
1975
1976 #ifdef DIAGNOSTIC
1977 if (oasync != 0 && xs->bp == NULL)
1978 panic("scsipi_execute_xs: XS_CTL_ASYNC but no buf");
1979 #endif
1980
1981 /*
1982 * Enqueue the transfer. If we're not polling for completion, this
1983 * should ALWAYS return `no error'.
1984 */
1985 try_again:
1986 error = scsipi_enqueue(xs);
1987 if (error) {
1988 if (poll == 0) {
1989 scsipi_printaddr(periph);
1990 printf("not polling, but enqueue failed with %d\n",
1991 error);
1992 panic("scsipi_execute_xs");
1993 }
1994
1995 scsipi_printaddr(periph);
1996 printf("failed to enqueue polling command");
1997 if (retries != 0) {
1998 printf(", retrying...\n");
1999 delay(1000000);
2000 retries--;
2001 goto try_again;
2002 }
2003 printf("\n");
2004 goto free_xs;
2005 }
2006
2007 restarted:
2008 scsipi_run_queue(chan);
2009
2010 /*
2011 * The xfer is enqueued, and possibly running. If it's to be
2012 * completed asynchronously, just return now.
2013 */
2014 if (async)
2015 return (EJUSTRETURN);
2016
2017 /*
2018 * Not an asynchronous command; wait for it to complete.
2019 */
2020 s = splbio();
2021 while ((xs->xs_status & XS_STS_DONE) == 0) {
2022 if (poll) {
2023 scsipi_printaddr(periph);
2024 printf("polling command not done\n");
2025 panic("scsipi_execute_xs");
2026 }
2027 (void) tsleep(xs, PRIBIO, "xscmd", 0);
2028 }
2029 splx(s);
2030
2031 /*
2032 * Command is complete. scsipi_done() has awakened us to perform
2033 * the error handling.
2034 */
2035 error = scsipi_complete(xs);
2036 if (error == ERESTART)
2037 goto restarted;
2038
2039 /*
2040 * If it was meant to run async and we cleared aync ourselve,
2041 * don't return an error here. It has already been handled
2042 */
2043 if (oasync)
2044 error = EJUSTRETURN;
2045 /*
2046 * Command completed successfully or fatal error occurred. Fall
2047 * into....
2048 */
2049 free_xs:
2050 s = splbio();
2051 scsipi_put_xs(xs);
2052 splx(s);
2053
2054 /*
2055 * Kick the queue, keep it running in case it stopped for some
2056 * reason.
2057 */
2058 scsipi_run_queue(chan);
2059
2060 return (error);
2061 }
2062
2063 /*
2064 * scsipi_completion_thread:
2065 *
2066 * This is the completion thread. We wait for errors on
2067 * asynchronous xfers, and perform the error handling
2068 * function, restarting the command, if necessary.
2069 */
2070 void
2071 scsipi_completion_thread(arg)
2072 void *arg;
2073 {
2074 struct scsipi_channel *chan = arg;
2075 struct scsipi_xfer *xs;
2076 int s;
2077
2078 if (chan->chan_init_cb)
2079 (*chan->chan_init_cb)(chan, chan->chan_init_cb_arg);
2080
2081 s = splbio();
2082 chan->chan_flags |= SCSIPI_CHAN_TACTIVE;
2083 splx(s);
2084 for (;;) {
2085 s = splbio();
2086 xs = TAILQ_FIRST(&chan->chan_complete);
2087 if (xs == NULL && chan->chan_tflags == 0) {
2088 /* nothing to do; wait */
2089 (void) tsleep(&chan->chan_complete, PRIBIO,
2090 "sccomp", 0);
2091 splx(s);
2092 continue;
2093 }
2094 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2095 /* call chan_callback from thread context */
2096 chan->chan_tflags &= ~SCSIPI_CHANT_CALLBACK;
2097 chan->chan_callback(chan, chan->chan_callback_arg);
2098 splx(s);
2099 continue;
2100 }
2101 if (chan->chan_tflags & SCSIPI_CHANT_GROWRES) {
2102 /* attempt to get more openings for this channel */
2103 chan->chan_tflags &= ~SCSIPI_CHANT_GROWRES;
2104 scsipi_adapter_request(chan,
2105 ADAPTER_REQ_GROW_RESOURCES, NULL);
2106 scsipi_channel_thaw(chan, 1);
2107 splx(s);
2108 continue;
2109 }
2110 if (chan->chan_tflags & SCSIPI_CHANT_KICK) {
2111 /* explicitly run the queues for this channel */
2112 chan->chan_tflags &= ~SCSIPI_CHANT_KICK;
2113 scsipi_run_queue(chan);
2114 splx(s);
2115 continue;
2116 }
2117 if (chan->chan_tflags & SCSIPI_CHANT_SHUTDOWN) {
2118 splx(s);
2119 break;
2120 }
2121 if (xs) {
2122 TAILQ_REMOVE(&chan->chan_complete, xs, channel_q);
2123 splx(s);
2124
2125 /*
2126 * Have an xfer with an error; process it.
2127 */
2128 (void) scsipi_complete(xs);
2129
2130 /*
2131 * Kick the queue; keep it running if it was stopped
2132 * for some reason.
2133 */
2134 scsipi_run_queue(chan);
2135 } else {
2136 splx(s);
2137 }
2138 }
2139
2140 chan->chan_thread = NULL;
2141
2142 /* In case parent is waiting for us to exit. */
2143 wakeup(&chan->chan_thread);
2144
2145 kthread_exit(0);
2146 }
2147
2148 /*
2149 * scsipi_create_completion_thread:
2150 *
2151 * Callback to actually create the completion thread.
2152 */
2153 void
2154 scsipi_create_completion_thread(arg)
2155 void *arg;
2156 {
2157 struct scsipi_channel *chan = arg;
2158 struct scsipi_adapter *adapt = chan->chan_adapter;
2159
2160 if (kthread_create1(scsipi_completion_thread, chan,
2161 &chan->chan_thread, "%s", chan->chan_name)) {
2162 printf("%s: unable to create completion thread for "
2163 "channel %d\n", adapt->adapt_dev->dv_xname,
2164 chan->chan_channel);
2165 panic("scsipi_create_completion_thread");
2166 }
2167 }
2168
2169 /*
2170 * scsipi_thread_call_callback:
2171 *
2172 * request to call a callback from the completion thread
2173 */
2174 int
2175 scsipi_thread_call_callback(chan, callback, arg)
2176 struct scsipi_channel *chan;
2177 void (*callback) __P((struct scsipi_channel *, void *));
2178 void *arg;
2179 {
2180 int s;
2181
2182 s = splbio();
2183 if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
2184 /* kernel thread doesn't exist yet */
2185 splx(s);
2186 return ESRCH;
2187 }
2188 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2189 splx(s);
2190 return EBUSY;
2191 }
2192 scsipi_channel_freeze(chan, 1);
2193 chan->chan_callback = callback;
2194 chan->chan_callback_arg = arg;
2195 chan->chan_tflags |= SCSIPI_CHANT_CALLBACK;
2196 wakeup(&chan->chan_complete);
2197 splx(s);
2198 return(0);
2199 }
2200
2201 /*
2202 * scsipi_async_event:
2203 *
2204 * Handle an asynchronous event from an adapter.
2205 */
2206 void
2207 scsipi_async_event(chan, event, arg)
2208 struct scsipi_channel *chan;
2209 scsipi_async_event_t event;
2210 void *arg;
2211 {
2212 int s;
2213
2214 s = splbio();
2215 switch (event) {
2216 case ASYNC_EVENT_MAX_OPENINGS:
2217 scsipi_async_event_max_openings(chan,
2218 (struct scsipi_max_openings *)arg);
2219 break;
2220
2221 case ASYNC_EVENT_XFER_MODE:
2222 scsipi_async_event_xfer_mode(chan,
2223 (struct scsipi_xfer_mode *)arg);
2224 break;
2225 case ASYNC_EVENT_RESET:
2226 scsipi_async_event_channel_reset(chan);
2227 break;
2228 }
2229 splx(s);
2230 }
2231
2232 /*
2233 * scsipi_print_xfer_mode:
2234 *
2235 * Print a periph's capabilities.
2236 */
2237 void
2238 scsipi_print_xfer_mode(periph)
2239 struct scsipi_periph *periph;
2240 {
2241 int period, freq, speed, mbs;
2242
2243 if ((periph->periph_flags & PERIPH_MODE_VALID) == 0)
2244 return;
2245
2246 printf("%s: ", periph->periph_dev->dv_xname);
2247 if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
2248 period = scsipi_sync_factor_to_period(periph->periph_period);
2249 printf("sync (%d.%02dns offset %d)",
2250 period / 100, period % 100, periph->periph_offset);
2251 } else
2252 printf("async");
2253
2254 if (periph->periph_mode & PERIPH_CAP_WIDE32)
2255 printf(", 32-bit");
2256 else if (periph->periph_mode & (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
2257 printf(", 16-bit");
2258 else
2259 printf(", 8-bit");
2260
2261 if (periph->periph_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT)) {
2262 freq = scsipi_sync_factor_to_freq(periph->periph_period);
2263 speed = freq;
2264 if (periph->periph_mode & PERIPH_CAP_WIDE32)
2265 speed *= 4;
2266 else if (periph->periph_mode &
2267 (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
2268 speed *= 2;
2269 mbs = speed / 1000;
2270 if (mbs > 0)
2271 printf(" (%d.%03dMB/s)", mbs, speed % 1000);
2272 else
2273 printf(" (%dKB/s)", speed % 1000);
2274 }
2275
2276 printf(" transfers");
2277
2278 if (periph->periph_mode & PERIPH_CAP_TQING)
2279 printf(", tagged queueing");
2280
2281 printf("\n");
2282 }
2283
2284 /*
2285 * scsipi_async_event_max_openings:
2286 *
2287 * Update the maximum number of outstanding commands a
2288 * device may have.
2289 */
2290 void
2291 scsipi_async_event_max_openings(chan, mo)
2292 struct scsipi_channel *chan;
2293 struct scsipi_max_openings *mo;
2294 {
2295 struct scsipi_periph *periph;
2296 int minlun, maxlun;
2297
2298 if (mo->mo_lun == -1) {
2299 /*
2300 * Wildcarded; apply it to all LUNs.
2301 */
2302 minlun = 0;
2303 maxlun = chan->chan_nluns - 1;
2304 } else
2305 minlun = maxlun = mo->mo_lun;
2306
2307 /* XXX This could really suck with a large LUN space. */
2308 for (; minlun <= maxlun; minlun++) {
2309 periph = scsipi_lookup_periph(chan, mo->mo_target, minlun);
2310 if (periph == NULL)
2311 continue;
2312
2313 if (mo->mo_openings < periph->periph_openings)
2314 periph->periph_openings = mo->mo_openings;
2315 else if (mo->mo_openings > periph->periph_openings &&
2316 (periph->periph_flags & PERIPH_GROW_OPENINGS) != 0)
2317 periph->periph_openings = mo->mo_openings;
2318 }
2319 }
2320
2321 /*
2322 * scsipi_async_event_xfer_mode:
2323 *
2324 * Update the xfer mode for all periphs sharing the
2325 * specified I_T Nexus.
2326 */
2327 void
2328 scsipi_async_event_xfer_mode(chan, xm)
2329 struct scsipi_channel *chan;
2330 struct scsipi_xfer_mode *xm;
2331 {
2332 struct scsipi_periph *periph;
2333 int lun, announce, mode, period, offset;
2334
2335 for (lun = 0; lun < chan->chan_nluns; lun++) {
2336 periph = scsipi_lookup_periph(chan, xm->xm_target, lun);
2337 if (periph == NULL)
2338 continue;
2339 announce = 0;
2340
2341 /*
2342 * Clamp the xfer mode down to this periph's capabilities.
2343 */
2344 mode = xm->xm_mode & periph->periph_cap;
2345 if (mode & PERIPH_CAP_SYNC) {
2346 period = xm->xm_period;
2347 offset = xm->xm_offset;
2348 } else {
2349 period = 0;
2350 offset = 0;
2351 }
2352
2353 /*
2354 * If we do not have a valid xfer mode yet, or the parameters
2355 * are different, announce them.
2356 */
2357 if ((periph->periph_flags & PERIPH_MODE_VALID) == 0 ||
2358 periph->periph_mode != mode ||
2359 periph->periph_period != period ||
2360 periph->periph_offset != offset)
2361 announce = 1;
2362
2363 periph->periph_mode = mode;
2364 periph->periph_period = period;
2365 periph->periph_offset = offset;
2366 periph->periph_flags |= PERIPH_MODE_VALID;
2367
2368 if (announce)
2369 scsipi_print_xfer_mode(periph);
2370 }
2371 }
2372
2373 /*
2374 * scsipi_set_xfer_mode:
2375 *
2376 * Set the xfer mode for the specified I_T Nexus.
2377 */
2378 void
2379 scsipi_set_xfer_mode(chan, target, immed)
2380 struct scsipi_channel *chan;
2381 int target, immed;
2382 {
2383 struct scsipi_xfer_mode xm;
2384 struct scsipi_periph *itperiph;
2385 int lun, s;
2386
2387 /*
2388 * Go to the minimal xfer mode.
2389 */
2390 xm.xm_target = target;
2391 xm.xm_mode = 0;
2392 xm.xm_period = 0; /* ignored */
2393 xm.xm_offset = 0; /* ignored */
2394
2395 /*
2396 * Find the first LUN we know about on this I_T Nexus.
2397 */
2398 for (itperiph = NULL, lun = 0; lun < chan->chan_nluns; lun++) {
2399 itperiph = scsipi_lookup_periph(chan, target, lun);
2400 if (itperiph != NULL)
2401 break;
2402 }
2403 if (itperiph != NULL) {
2404 xm.xm_mode = itperiph->periph_cap;
2405 /*
2406 * Now issue the request to the adapter.
2407 */
2408 s = splbio();
2409 scsipi_adapter_request(chan, ADAPTER_REQ_SET_XFER_MODE, &xm);
2410 splx(s);
2411 /*
2412 * If we want this to happen immediately, issue a dummy
2413 * command, since most adapters can't really negotiate unless
2414 * they're executing a job.
2415 */
2416 if (immed != 0) {
2417 (void) scsipi_test_unit_ready(itperiph,
2418 XS_CTL_DISCOVERY | XS_CTL_IGNORE_ILLEGAL_REQUEST |
2419 XS_CTL_IGNORE_NOT_READY |
2420 XS_CTL_IGNORE_MEDIA_CHANGE);
2421 }
2422 }
2423 }
2424
2425 /*
2426 * scsipi_channel_reset:
2427 *
2428 * handle scsi bus reset
2429 * called at splbio
2430 */
2431 void
2432 scsipi_async_event_channel_reset(chan)
2433 struct scsipi_channel *chan;
2434 {
2435 struct scsipi_xfer *xs, *xs_next;
2436 struct scsipi_periph *periph;
2437 int target, lun;
2438
2439 /*
2440 * Channel has been reset. Also mark as reset pending REQUEST_SENSE
2441 * commands; as the sense is not available any more.
2442 * can't call scsipi_done() from here, as the command has not been
2443 * sent to the adapter yet (this would corrupt accounting).
2444 */
2445
2446 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL; xs = xs_next) {
2447 xs_next = TAILQ_NEXT(xs, channel_q);
2448 if (xs->xs_control & XS_CTL_REQSENSE) {
2449 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2450 xs->error = XS_RESET;
2451 if ((xs->xs_control & XS_CTL_ASYNC) != 0)
2452 TAILQ_INSERT_TAIL(&chan->chan_complete, xs,
2453 channel_q);
2454 }
2455 }
2456 wakeup(&chan->chan_complete);
2457 /* Catch xs with pending sense which may not have a REQSENSE xs yet */
2458 for (target = 0; target < chan->chan_ntargets; target++) {
2459 if (target == chan->chan_id)
2460 continue;
2461 for (lun = 0; lun < chan->chan_nluns; lun++) {
2462 periph = scsipi_lookup_periph(chan, target, lun);
2463 if (periph) {
2464 xs = periph->periph_xscheck;
2465 if (xs)
2466 xs->error = XS_RESET;
2467 }
2468 }
2469 }
2470 }
2471
2472 /*
2473 * scsipi_target_detach:
2474 *
2475 * detach all periph associated with a I_T
2476 * must be called from valid thread context
2477 */
2478 int
2479 scsipi_target_detach(chan, target, lun, flags)
2480 struct scsipi_channel *chan;
2481 int target, lun;
2482 int flags;
2483 {
2484 struct scsipi_periph *periph;
2485 int ctarget, mintarget, maxtarget;
2486 int clun, minlun, maxlun;
2487 int error;
2488
2489 if (target == -1) {
2490 mintarget = 0;
2491 maxtarget = chan->chan_ntargets;
2492 } else {
2493 if (target == chan->chan_id)
2494 return EINVAL;
2495 if (target < 0 || target >= chan->chan_ntargets)
2496 return EINVAL;
2497 mintarget = target;
2498 maxtarget = target + 1;
2499 }
2500
2501 if (lun == -1) {
2502 minlun = 0;
2503 maxlun = chan->chan_nluns;
2504 } else {
2505 if (lun < 0 || lun >= chan->chan_nluns)
2506 return EINVAL;
2507 minlun = lun;
2508 maxlun = lun + 1;
2509 }
2510
2511 for (ctarget = mintarget; ctarget < maxtarget; ctarget++) {
2512 if (ctarget == chan->chan_id)
2513 continue;
2514
2515 for (clun = minlun; clun < maxlun; clun++) {
2516 periph = scsipi_lookup_periph(chan, ctarget, clun);
2517 if (periph == NULL)
2518 continue;
2519 error = config_detach(periph->periph_dev, flags);
2520 if (error)
2521 return (error);
2522 scsipi_remove_periph(chan, periph);
2523 free(periph, M_DEVBUF);
2524 }
2525 }
2526 return(0);
2527 }
2528
2529 /*
2530 * scsipi_adapter_addref:
2531 *
2532 * Add a reference to the adapter pointed to by the provided
2533 * link, enabling the adapter if necessary.
2534 */
2535 int
2536 scsipi_adapter_addref(adapt)
2537 struct scsipi_adapter *adapt;
2538 {
2539 int s, error = 0;
2540
2541 s = splbio();
2542 if (adapt->adapt_refcnt++ == 0 && adapt->adapt_enable != NULL) {
2543 error = (*adapt->adapt_enable)(adapt->adapt_dev, 1);
2544 if (error)
2545 adapt->adapt_refcnt--;
2546 }
2547 splx(s);
2548 return (error);
2549 }
2550
2551 /*
2552 * scsipi_adapter_delref:
2553 *
2554 * Delete a reference to the adapter pointed to by the provided
2555 * link, disabling the adapter if possible.
2556 */
2557 void
2558 scsipi_adapter_delref(adapt)
2559 struct scsipi_adapter *adapt;
2560 {
2561 int s;
2562
2563 s = splbio();
2564 if (adapt->adapt_refcnt-- == 1 && adapt->adapt_enable != NULL)
2565 (void) (*adapt->adapt_enable)(adapt->adapt_dev, 0);
2566 splx(s);
2567 }
2568
2569 struct scsipi_syncparam {
2570 int ss_factor;
2571 int ss_period; /* ns * 100 */
2572 } scsipi_syncparams[] = {
2573 { 0x08, 625 }, /* FAST-160 (Ultra320) */
2574 { 0x09, 1250 }, /* FAST-80 (Ultra160) */
2575 { 0x0a, 2500 }, /* FAST-40 40MHz (Ultra2) */
2576 { 0x0b, 3030 }, /* FAST-40 33MHz (Ultra2) */
2577 { 0x0c, 5000 }, /* FAST-20 (Ultra) */
2578 };
2579 const int scsipi_nsyncparams =
2580 sizeof(scsipi_syncparams) / sizeof(scsipi_syncparams[0]);
2581
2582 int
2583 scsipi_sync_period_to_factor(period)
2584 int period; /* ns * 100 */
2585 {
2586 int i;
2587
2588 for (i = 0; i < scsipi_nsyncparams; i++) {
2589 if (period <= scsipi_syncparams[i].ss_period)
2590 return (scsipi_syncparams[i].ss_factor);
2591 }
2592
2593 return ((period / 100) / 4);
2594 }
2595
2596 int
2597 scsipi_sync_factor_to_period(factor)
2598 int factor;
2599 {
2600 int i;
2601
2602 for (i = 0; i < scsipi_nsyncparams; i++) {
2603 if (factor == scsipi_syncparams[i].ss_factor)
2604 return (scsipi_syncparams[i].ss_period);
2605 }
2606
2607 return ((factor * 4) * 100);
2608 }
2609
2610 int
2611 scsipi_sync_factor_to_freq(factor)
2612 int factor;
2613 {
2614 int i;
2615
2616 for (i = 0; i < scsipi_nsyncparams; i++) {
2617 if (factor == scsipi_syncparams[i].ss_factor)
2618 return (100000000 / scsipi_syncparams[i].ss_period);
2619 }
2620
2621 return (10000000 / ((factor * 4) * 10));
2622 }
2623
2624 #ifdef SCSIPI_DEBUG
2625 /*
2626 * Given a scsipi_xfer, dump the request, in all it's glory
2627 */
2628 void
2629 show_scsipi_xs(xs)
2630 struct scsipi_xfer *xs;
2631 {
2632
2633 printf("xs(%p): ", xs);
2634 printf("xs_control(0x%08x)", xs->xs_control);
2635 printf("xs_status(0x%08x)", xs->xs_status);
2636 printf("periph(%p)", xs->xs_periph);
2637 printf("retr(0x%x)", xs->xs_retries);
2638 printf("timo(0x%x)", xs->timeout);
2639 printf("cmd(%p)", xs->cmd);
2640 printf("len(0x%x)", xs->cmdlen);
2641 printf("data(%p)", xs->data);
2642 printf("len(0x%x)", xs->datalen);
2643 printf("res(0x%x)", xs->resid);
2644 printf("err(0x%x)", xs->error);
2645 printf("bp(%p)", xs->bp);
2646 show_scsipi_cmd(xs);
2647 }
2648
2649 void
2650 show_scsipi_cmd(xs)
2651 struct scsipi_xfer *xs;
2652 {
2653 u_char *b = (u_char *) xs->cmd;
2654 int i = 0;
2655
2656 scsipi_printaddr(xs->xs_periph);
2657 printf(" command: ");
2658
2659 if ((xs->xs_control & XS_CTL_RESET) == 0) {
2660 while (i < xs->cmdlen) {
2661 if (i)
2662 printf(",");
2663 printf("0x%x", b[i++]);
2664 }
2665 printf("-[%d bytes]\n", xs->datalen);
2666 if (xs->datalen)
2667 show_mem(xs->data, min(64, xs->datalen));
2668 } else
2669 printf("-RESET-\n");
2670 }
2671
2672 void
2673 show_mem(address, num)
2674 u_char *address;
2675 int num;
2676 {
2677 int x;
2678
2679 printf("------------------------------");
2680 for (x = 0; x < num; x++) {
2681 if ((x % 16) == 0)
2682 printf("\n%03d: ", x);
2683 printf("%02x ", *address++);
2684 }
2685 printf("\n------------------------------\n");
2686 }
2687 #endif /* SCSIPI_DEBUG */
2688