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