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