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