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