Lines Matching defs:chan
74 "struct scsipi_channel *"/*chan*/,
78 "struct scsipi_channel *"/*chan*/,
83 "struct scsipi_channel *"/*chan*/);
85 "struct scsipi_channel *"/*chan*/,
88 "struct scsipi_channel *"/*chan*/);
101 static void scsipi_run_queue(struct scsipi_channel *chan);
155 scsipi_channel_init(struct scsipi_channel *chan)
157 struct scsipi_adapter *adapt = chan->chan_adapter;
164 TAILQ_INIT(&chan->chan_queue);
165 TAILQ_INIT(&chan->chan_complete);
168 LIST_INIT(&chan->chan_periphtab[i]);
173 if (kthread_create(PRI_NONE, 0, NULL, scsipi_completion_thread, chan,
174 &chan->chan_thread, "%s", chan->chan_name)) {
176 "channel %d\n", chan->chan_channel);
189 scsipi_channel_shutdown(struct scsipi_channel *chan)
192 mutex_enter(chan_mtx(chan));
196 chan->chan_tflags |= SCSIPI_CHANT_SHUTDOWN;
197 cv_broadcast(chan_cv_complete(chan));
202 while (chan->chan_thread != NULL)
203 cv_wait(chan_cv_thread(chan), chan_mtx(chan));
204 mutex_exit(chan_mtx(chan));
224 scsipi_insert_periph(struct scsipi_channel *chan, struct scsipi_periph *periph)
231 mutex_enter(chan_mtx(chan));
232 LIST_INSERT_HEAD(&chan->chan_periphtab[hash], periph, periph_hash);
233 mutex_exit(chan_mtx(chan));
242 scsipi_remove_periph(struct scsipi_channel *chan,
255 scsipi_lookup_periph_internal(struct scsipi_channel *chan, int target, int lun, bool lock)
260 if (target >= chan->chan_ntargets ||
261 lun >= chan->chan_nluns)
267 mutex_enter(chan_mtx(chan));
268 LIST_FOREACH(periph, &chan->chan_periphtab[hash], periph_hash) {
274 mutex_exit(chan_mtx(chan));
280 scsipi_lookup_periph_locked(struct scsipi_channel *chan, int target, int lun)
282 return scsipi_lookup_periph_internal(chan, target, lun, false);
286 scsipi_lookup_periph(struct scsipi_channel *chan, int target, int lun)
288 return scsipi_lookup_periph_internal(chan, target, lun, true);
299 scsipi_get_resource(struct scsipi_channel *chan)
301 struct scsipi_adapter *adapt = chan->chan_adapter;
303 if (chan->chan_flags & SCSIPI_CHAN_OPENINGS) {
304 if (chan->chan_openings > 0) {
305 chan->chan_openings--;
327 scsipi_grow_resources(struct scsipi_channel *chan)
330 if (chan->chan_flags & SCSIPI_CHAN_CANGROW) {
331 if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
332 mutex_exit(chan_mtx(chan));
333 scsipi_adapter_request(chan,
335 mutex_enter(chan_mtx(chan));
336 return scsipi_get_resource(chan);
342 scsipi_channel_freeze_locked(chan, 1);
343 chan->chan_tflags |= SCSIPI_CHANT_GROWRES;
344 cv_broadcast(chan_cv_complete(chan));
359 scsipi_put_resource(struct scsipi_channel *chan)
361 struct scsipi_adapter *adapt = chan->chan_adapter;
363 if (chan->chan_flags & SCSIPI_CHAN_OPENINGS)
364 chan->chan_openings++;
626 scsipi_channel_freeze(struct scsipi_channel *chan, int count)
628 bool lock = chan_running(chan) > 0;
631 mutex_enter(chan_mtx(chan));
632 chan->chan_qfreeze += count;
634 mutex_exit(chan_mtx(chan));
638 scsipi_channel_freeze_locked(struct scsipi_channel *chan, int count)
641 chan->chan_qfreeze += count;
650 scsipi_channel_thaw(struct scsipi_channel *chan, int count)
652 bool lock = chan_running(chan) > 0;
655 mutex_enter(chan_mtx(chan));
656 chan->chan_qfreeze -= count;
664 if (chan->chan_qfreeze < 0) {
665 chan->chan_qfreeze = 0;
668 mutex_exit(chan_mtx(chan));
681 if (chan->chan_qfreeze == 0)
682 scsipi_run_queue(chan);
694 struct scsipi_channel *chan = arg;
696 scsipi_channel_thaw(chan, 1);
761 struct scsipi_channel *chan = periph->periph_channel;
765 mutex_enter(chan_mtx(chan));
773 mutex_exit(chan_mtx(chan));
780 cv_broadcast(chan_cv_complete(chan));
781 mutex_exit(chan_mtx(chan));
793 struct scsipi_channel *chan = periph->periph_channel;
795 mutex_enter(chan_mtx(chan));
798 cv_wait(periph_cv_active(periph), chan_mtx(chan));
800 mutex_exit(chan_mtx(chan));
813 struct scsipi_channel *chan = periph->periph_channel;
815 (*chan->chan_bustype->bustype_kill_pending)(periph);
818 cv_wait(periph_cv_active(periph), chan_mtx(chan));
1608 struct scsipi_channel *chan = periph->periph_channel;
1617 mutex_enter(chan_mtx(chan));
1634 mutex_exit(chan_mtx(chan));
1637 scsipi_put_resource(chan);
1694 mutex_exit(chan_mtx(chan));
1698 mutex_exit(chan_mtx(chan));
1708 mutex_exit(chan_mtx(chan));
1717 TAILQ_INSERT_TAIL(&chan->chan_complete, xs, channel_q);
1718 cv_broadcast(chan_cv_complete(chan));
1719 mutex_exit(chan_mtx(chan));
1726 scsipi_run_queue(chan);
1762 struct scsipi_channel *chan = periph->periph_channel;
1778 mutex_enter(chan_mtx(chan));
1787 mutex_exit(chan_mtx(chan));
1795 mutex_exit(chan_mtx(chan)); // XXX allows other commands to queue or run
1798 mutex_exit(chan_mtx(chan));
1806 mutex_enter(chan_mtx(chan));
1809 mutex_exit(chan_mtx(chan));
1822 error = (*chan->chan_bustype->bustype_interpret_sense)(xs);
1861 scsipi_async_event(chan, ASYNC_EVENT_MAX_OPENINGS, &mo);
1868 mutex_enter(chan_mtx(chan));
1870 (chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
1872 kpause("xsbusy", false, hz, chan_mtx(chan));
1878 mutex_exit(chan_mtx(chan));
1897 if (scsipi_lookup_periph(chan, periph->periph_target,
1933 mutex_enter(chan_mtx(chan));
1951 mutex_exit(chan_mtx(chan));
1962 mutex_exit(chan_mtx(chan));
1967 mutex_enter(chan_mtx(chan));
1970 mutex_exit(chan_mtx(chan));
2042 struct scsipi_channel *chan = xs->xs_periph->periph_channel;
2051 KASSERT(mutex_owned(chan_mtx(chan)));
2053 TAILQ_FIRST(&chan->chan_queue) != NULL) {
2063 TAILQ_INSERT_HEAD(&chan->chan_queue, xs, channel_q);
2078 for (qxs = TAILQ_FIRST(&chan->chan_queue); qxs != NULL;
2085 TAILQ_INSERT_AFTER(&chan->chan_queue, qxs, xs,
2090 TAILQ_INSERT_TAIL(&chan->chan_queue, xs, channel_q);
2103 scsipi_run_queue(struct scsipi_channel *chan)
2108 SDT_PROBE1(scsi, base, queue, batch__start, chan);
2110 mutex_enter(chan_mtx(chan));
2116 if (chan->chan_qfreeze != 0) {
2117 mutex_exit(chan_mtx(chan));
2124 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL;
2147 mutex_exit(chan_mtx(chan));
2156 if (scsipi_get_resource(chan) == 0) {
2161 if (scsipi_grow_resources(chan) == 0) {
2172 mutex_exit(chan_mtx(chan));
2189 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2200 mutex_exit(chan_mtx(chan));
2202 SDT_PROBE2(scsi, base, queue, run, chan, xs);
2203 scsipi_adapter_request(chan, ADAPTER_REQ_RUN_XFER, xs);
2205 SDT_PROBE1(scsi, base, queue, batch__done, chan);
2217 struct scsipi_channel *chan = periph->periph_channel;
2224 (chan->chan_bustype->bustype_cmd)(xs);
2290 if (chan->chan_adapter->adapt_flags & SCSIPI_ADAPT_POLL_ONLY)
2298 if (chan->chan_thread == NULL || (xs->xs_control & XS_CTL_POLL) != 0)
2327 mutex_exit(chan_mtx(chan));
2329 scsipi_run_queue(chan);
2330 mutex_enter(chan_mtx(chan));
2348 cv_wait(xs_cv(xs), chan_mtx(chan));
2355 mutex_exit(chan_mtx(chan));
2370 mutex_enter(chan_mtx(chan));
2373 mutex_exit(chan_mtx(chan));
2379 scsipi_run_queue(chan);
2381 mutex_enter(chan_mtx(chan));
2395 struct scsipi_channel *chan = arg;
2398 if (chan->chan_init_cb)
2399 (*chan->chan_init_cb)(chan, chan->chan_init_cb_arg);
2401 mutex_enter(chan_mtx(chan));
2402 chan->chan_flags |= SCSIPI_CHAN_TACTIVE;
2404 xs = TAILQ_FIRST(&chan->chan_complete);
2405 if (xs == NULL && chan->chan_tflags == 0) {
2407 cv_wait(chan_cv_complete(chan), chan_mtx(chan));
2410 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2412 chan->chan_tflags &= ~SCSIPI_CHANT_CALLBACK;
2413 chan->chan_callback(chan, chan->chan_callback_arg);
2416 if (chan->chan_tflags & SCSIPI_CHANT_GROWRES) {
2418 chan->chan_tflags &= ~SCSIPI_CHANT_GROWRES;
2419 mutex_exit(chan_mtx(chan));
2420 scsipi_adapter_request(chan,
2422 scsipi_channel_thaw(chan, 1);
2423 if (chan->chan_tflags & SCSIPI_CHANT_GROWRES)
2425 mutex_enter(chan_mtx(chan));
2428 if (chan->chan_tflags & SCSIPI_CHANT_KICK) {
2430 chan->chan_tflags &= ~SCSIPI_CHANT_KICK;
2431 mutex_exit(chan_mtx(chan));
2432 scsipi_run_queue(chan);
2433 mutex_enter(chan_mtx(chan));
2436 if (chan->chan_tflags & SCSIPI_CHANT_SHUTDOWN) {
2440 TAILQ_REMOVE(&chan->chan_complete, xs, channel_q);
2441 mutex_exit(chan_mtx(chan));
2452 scsipi_run_queue(chan);
2453 mutex_enter(chan_mtx(chan));
2457 chan->chan_thread = NULL;
2460 cv_broadcast(chan_cv_thread(chan));
2461 mutex_exit(chan_mtx(chan));
2471 scsipi_thread_call_callback(struct scsipi_channel *chan,
2475 mutex_enter(chan_mtx(chan));
2476 if ((chan->chan_flags & SCSIPI_CHAN_TACTIVE) == 0) {
2478 mutex_exit(chan_mtx(chan));
2481 if (chan->chan_tflags & SCSIPI_CHANT_CALLBACK) {
2482 mutex_exit(chan_mtx(chan));
2485 scsipi_channel_freeze(chan, 1);
2486 chan->chan_callback = callback;
2487 chan->chan_callback_arg = arg;
2488 chan->chan_tflags |= SCSIPI_CHANT_CALLBACK;
2489 cv_broadcast(chan_cv_complete(chan));
2490 mutex_exit(chan_mtx(chan));
2500 scsipi_async_event(struct scsipi_channel *chan, scsipi_async_event_t event,
2503 bool lock = chan_running(chan) > 0;
2506 mutex_enter(chan_mtx(chan));
2509 scsipi_async_event_max_openings(chan,
2514 if (chan->chan_bustype->bustype_async_event_xfer_mode) {
2515 chan->chan_bustype->bustype_async_event_xfer_mode(
2516 chan, arg);
2520 scsipi_async_event_channel_reset(chan);
2524 mutex_exit(chan_mtx(chan));
2534 scsipi_async_event_max_openings(struct scsipi_channel *chan,
2545 maxlun = chan->chan_nluns - 1;
2551 periph = scsipi_lookup_periph_locked(chan, mo->mo_target, minlun);
2569 scsipi_set_xfer_mode(struct scsipi_channel *chan, int target, int immed)
2586 for (itperiph = NULL, lun = 0; lun < chan->chan_nluns; lun++) {
2587 itperiph = scsipi_lookup_periph(chan, target, lun);
2596 scsipi_adapter_request(chan, ADAPTER_REQ_SET_XFER_MODE, &xm);
2618 scsipi_async_event_channel_reset(struct scsipi_channel *chan)
2631 for (xs = TAILQ_FIRST(&chan->chan_queue); xs != NULL; xs = xs_next) {
2634 TAILQ_REMOVE(&chan->chan_queue, xs, channel_q);
2637 TAILQ_INSERT_TAIL(&chan->chan_complete, xs,
2641 cv_broadcast(chan_cv_complete(chan));
2643 for (target = 0; target < chan->chan_ntargets; target++) {
2644 if (target == chan->chan_id)
2646 for (lun = 0; lun < chan->chan_nluns; lun++) {
2647 periph = scsipi_lookup_periph_locked(chan, target, lun);
2664 scsipi_target_detach(struct scsipi_channel *chan, int target, int lun,
2675 maxtarget = chan->chan_ntargets;
2677 if (target == chan->chan_id)
2679 if (target < 0 || target >= chan->chan_ntargets)
2687 maxlun = chan->chan_nluns;
2689 if (lun < 0 || lun >= chan->chan_nluns)
2698 mutex_enter(chan_mtx(chan));
2700 if (ctarget == chan->chan_id)
2704 periph = scsipi_lookup_periph_locked(chan, ctarget, clun);
2708 mutex_exit(chan_mtx(chan));
2712 mutex_enter(chan_mtx(chan));
2713 KASSERT(scsipi_lookup_periph_locked(chan, ctarget, clun) == NULL);
2716 mutex_exit(chan_mtx(chan));
2835 scsipi_adapter_minphys(struct scsipi_channel *chan, struct buf *bp)
2837 struct scsipi_adapter *adapt = chan->chan_adapter;
2841 scsipi_adapter_unlock(chan->chan_adapter);
2845 scsipi_adapter_request(struct scsipi_channel *chan,
2849 struct scsipi_adapter *adapt = chan->chan_adapter;
2852 SDT_PROBE3(scsi, base, adapter, request__start, chan, req, arg);
2853 (adapt->adapt_request)(chan, req, arg);
2854 SDT_PROBE3(scsi, base, adapter, request__done, chan, req, arg);
2859 scsipi_adapter_ioctl(struct scsipi_channel *chan, u_long cmd,
2862 struct scsipi_adapter *adapt = chan->chan_adapter;
2869 error = (adapt->adapt_ioctl)(chan, cmd, data, flag, p);