Lines Matching refs:dm2sp

121 void dm2s_start(queue_t *wq, dm2s_t *dm2sp);
124 void dm2s_receive(dm2s_t *dm2sp);
129 static void dm2s_cleanup(dm2s_t *dm2sp);
130 static int dm2s_mbox_init(dm2s_t *dm2sp);
131 static void dm2s_mbox_fini(dm2s_t *dm2sp);
248 dm2s_t *dm2sp; in dm2s_attach() local
267 dm2sp = (dm2s_t *)ddi_get_soft_state(dm2s_softstate, instance); in dm2s_attach()
268 if (dm2sp == NULL) { in dm2s_attach()
273 dm2sp->ms_dip = dip; in dm2s_attach()
274 dm2sp->ms_major = ddi_driver_major(dip); in dm2s_attach()
275 dm2sp->ms_ppa = instance; in dm2s_attach()
286 &dm2sp->ms_ibcookie) != DDI_SUCCESS) { in dm2s_attach()
290 mutex_init(&dm2sp->ms_lock, NULL, MUTEX_DRIVER, in dm2s_attach()
291 (void *)dm2sp->ms_ibcookie); in dm2s_attach()
293 dm2sp->ms_clean |= DM2S_CLEAN_LOCK; in dm2s_attach()
294 cv_init(&dm2sp->ms_wait, NULL, CV_DRIVER, NULL); in dm2s_attach()
295 dm2sp->ms_clean |= DM2S_CLEAN_CV; in dm2s_attach()
305 dm2sp->ms_clean |= DM2S_CLEAN_NODE; in dm2s_attach()
306 ddi_set_driver_private(dip, (caddr_t)dm2sp); in dm2s_attach()
310 dm2s_cleanup(dm2sp); in dm2s_attach()
321 dm2s_t *dm2sp; in dm2s_info() local
328 dm2sp = (dm2s_t *)ddi_get_soft_state(dm2s_softstate, minor); in dm2s_info()
329 if (dm2sp == NULL) { in dm2s_info()
332 *result = dm2sp->ms_dip; in dm2s_info()
356 dm2s_t *dm2sp; in dm2s_detach() local
363 dm2sp = (dm2s_t *)ddi_get_soft_state(dm2s_softstate, instance); in dm2s_detach()
364 if (dm2sp == NULL) { in dm2s_detach()
368 mutex_enter(&dm2sp->ms_lock); in dm2s_detach()
371 if (dm2sp->ms_state & DM2S_MB_INITED) { in dm2s_detach()
372 mutex_exit(&dm2sp->ms_lock); in dm2s_detach()
376 mutex_exit(&dm2sp->ms_lock); in dm2s_detach()
377 dm2s_cleanup(dm2sp); in dm2s_detach()
390 dm2s_t *dm2sp; in dm2s_open() local
406 if ((dm2sp = ddi_get_soft_state(dm2s_softstate, instance)) == NULL) { in dm2s_open()
411 mutex_enter(&dm2sp->ms_lock); in dm2s_open()
412 if (dm2sp->ms_state & DM2S_OPENED) { in dm2s_open()
414 mutex_exit(&dm2sp->ms_lock); in dm2s_open()
419 dm2sp->ms_state |= DM2S_OPENED; in dm2s_open()
421 if ((ret = dm2s_mbox_init(dm2sp)) != 0) { in dm2s_open()
422 dm2sp->ms_state = 0; in dm2s_open()
423 mutex_exit(&dm2sp->ms_lock); in dm2s_open()
426 rq->q_ptr = WR(rq)->q_ptr = (void *)dm2sp; in dm2s_open()
427 dm2sp->ms_rq = rq; in dm2s_open()
428 dm2sp->ms_wq = WR(rq); in dm2s_open()
429 mutex_exit(&dm2sp->ms_lock); in dm2s_open()
445 dm2s_t *dm2sp = (dm2s_t *)rq->q_ptr; in dm2s_close() local
448 if (dm2sp == NULL) { in dm2s_close()
454 mutex_enter(&dm2sp->ms_lock); in dm2s_close()
455 (void) scf_mb_flush(dm2sp->ms_target, dm2sp->ms_key, MB_FLUSH_ALL); in dm2s_close()
456 dm2s_mbox_fini(dm2sp); in dm2s_close()
457 mutex_exit(&dm2sp->ms_lock); in dm2s_close()
465 if (dm2sp->ms_rbufcid != 0) { in dm2s_close()
466 qunbufcall(rq, dm2sp->ms_rbufcid); in dm2s_close()
467 dm2sp->ms_rbufcid = 0; in dm2s_close()
469 if (dm2sp->ms_rq_timeoutid != 0) { in dm2s_close()
470 DTRACE_PROBE1(dm2s_rqtimeout__cancel, dm2s_t, dm2sp); in dm2s_close()
471 (void) quntimeout(dm2sp->ms_rq, dm2sp->ms_rq_timeoutid); in dm2s_close()
472 dm2sp->ms_rq_timeoutid = 0; in dm2s_close()
474 if (dm2sp->ms_wq_timeoutid != 0) { in dm2s_close()
475 DTRACE_PROBE1(dm2s_wqtimeout__cancel, dm2s_t, dm2sp); in dm2s_close()
476 (void) quntimeout(dm2sp->ms_wq, dm2sp->ms_wq_timeoutid); in dm2s_close()
477 dm2sp->ms_wq_timeoutid = 0; in dm2s_close()
482 mutex_enter(&dm2sp->ms_lock); in dm2s_close()
483 dm2sp->ms_rq = dm2sp->ms_wq = NULL; in dm2s_close()
484 dm2sp->ms_state &= ~DM2S_OPENED; in dm2s_close()
485 mutex_exit(&dm2sp->ms_lock); in dm2s_close()
503 dm2s_t *dm2sp = (dm2s_t *)rq->q_ptr; in dm2s_rsrv() local
506 ASSERT(dm2sp != NULL); in dm2s_rsrv()
507 mutex_enter(&dm2sp->ms_lock); in dm2s_rsrv()
510 dm2s_receive(dm2sp); in dm2s_rsrv()
511 mutex_exit(&dm2sp->ms_lock); in dm2s_rsrv()
535 dm2s_t *dm2sp = (dm2s_t *)wq->q_ptr; in dm2s_wsrv() local
538 ASSERT(dm2sp != NULL); in dm2s_wsrv()
540 if (dm2sp->ms_wq_timeoutid != 0) { in dm2s_wsrv()
541 DTRACE_PROBE1(dm2s_wqtimeout__cancel, dm2s_t, dm2sp); in dm2s_wsrv()
542 (void) quntimeout(dm2sp->ms_wq, dm2sp->ms_wq_timeoutid); in dm2s_wsrv()
543 dm2sp->ms_wq_timeoutid = 0; in dm2s_wsrv()
545 mutex_enter(&dm2sp->ms_lock); in dm2s_wsrv()
546 dm2s_start(wq, dm2sp); in dm2s_wsrv()
547 mutex_exit(&dm2sp->ms_lock); in dm2s_wsrv()
562 dm2s_t *dm2sp = (dm2s_t *)wq->q_ptr; in dm2s_wput() local
565 if (dm2sp == NULL) { in dm2s_wput()
626 (void) scf_mb_flush(dm2sp->ms_target, dm2sp->ms_key, in dm2s_wput()
632 (void) scf_mb_flush(dm2sp->ms_target, dm2sp->ms_key, in dm2s_wput()
653 dm2s_cleanup(dm2s_t *dm2sp) in dm2s_cleanup() argument
658 ASSERT(dm2sp != NULL); in dm2s_cleanup()
659 if (dm2sp->ms_clean & DM2S_CLEAN_NODE) { in dm2s_cleanup()
660 (void) sprintf(name, "%s%d", DM2S_MODNAME, dm2sp->ms_ppa); in dm2s_cleanup()
661 ddi_remove_minor_node(dm2sp->ms_dip, name); in dm2s_cleanup()
663 if (dm2sp->ms_clean & DM2S_CLEAN_LOCK) in dm2s_cleanup()
664 mutex_destroy(&dm2sp->ms_lock); in dm2s_cleanup()
665 if (dm2sp->ms_clean & DM2S_CLEAN_CV) in dm2s_cleanup()
666 cv_destroy(&dm2sp->ms_wait); in dm2s_cleanup()
667 ddi_set_driver_private(dm2sp->ms_dip, NULL); in dm2s_cleanup()
668 ddi_soft_state_free(dm2s_softstate, dm2sp->ms_ppa); in dm2s_cleanup()
675 dm2s_mbox_init(dm2s_t *dm2sp) in dm2s_mbox_init() argument
680 ASSERT(MUTEX_HELD(&dm2sp->ms_lock)); in dm2s_mbox_init()
681 dm2sp->ms_target = DM2S_TARGET_ID; in dm2s_mbox_init()
682 dm2sp->ms_key = DSCP_KEY; in dm2s_mbox_init()
683 dm2sp->ms_state &= ~DM2S_MB_INITED; in dm2s_mbox_init()
686 while (!(dm2sp->ms_state & DM2S_MB_CONN)) { in dm2s_mbox_init()
688 ret = scf_mb_init(dm2sp->ms_target, dm2sp->ms_key, in dm2s_mbox_init()
689 dm2s_event_handler, (void *)dm2sp); in dm2s_mbox_init()
697 dm2sp->ms_state |= DM2S_MB_INITED; in dm2s_mbox_init()
700 while (!(dm2sp->ms_state & in dm2s_mbox_init()
703 if (cv_wait_sig(&dm2sp->ms_wait, in dm2s_mbox_init()
704 &dm2sp->ms_lock) <= 0) { in dm2s_mbox_init()
712 if ((ret != 0) || (dm2sp->ms_state & DM2S_MB_DISC)) { in dm2s_mbox_init()
714 if (dm2sp->ms_state & DM2S_MB_INITED) { in dm2s_mbox_init()
715 (void) scf_mb_fini(dm2sp->ms_target, in dm2s_mbox_init()
716 dm2sp->ms_key); in dm2s_mbox_init()
718 if (dm2sp->ms_state & DM2S_MB_DISC) { in dm2s_mbox_init()
725 dm2sp->ms_state &= ~(DM2S_MB_INITED | DM2S_MB_DISC | in dm2s_mbox_init()
738 ret = cv_reltimedwait_sig(&dm2sp->ms_wait, in dm2s_mbox_init()
739 &dm2sp->ms_lock, tout, TR_CLOCK_TICK); in dm2s_mbox_init()
755 ret = scf_mb_ctrl(dm2sp->ms_target, dm2sp->ms_key, in dm2s_mbox_init()
756 SCF_MBOP_MAXMSGSIZE, &dm2sp->ms_mtu); in dm2s_mbox_init()
758 if ((ret == 0) && (dm2sp->ms_mtu < DM2S_DEF_MTU)) { in dm2s_mbox_init()
760 "but found %d\n", DM2S_DEF_MTU, dm2sp->ms_mtu); in dm2s_mbox_init()
765 dm2sp->ms_state &= ~DM2S_MB_INITED; in dm2s_mbox_init()
766 (void) scf_mb_fini(dm2sp->ms_target, dm2sp->ms_key); in dm2s_mbox_init()
776 dm2s_mbox_fini(dm2s_t *dm2sp) in dm2s_mbox_fini() argument
780 ASSERT(dm2sp != NULL); in dm2s_mbox_fini()
781 if (dm2sp->ms_state & DM2S_MB_INITED) { in dm2s_mbox_fini()
783 ret = scf_mb_fini(dm2sp->ms_target, dm2sp->ms_key); in dm2s_mbox_fini()
789 dm2sp->ms_state &= ~(DM2S_MB_INITED |DM2S_MB_CONN | in dm2s_mbox_fini()
800 dm2s_t *dm2sp = (dm2s_t *)arg; in dm2s_event_handler() local
803 ASSERT(dm2sp != NULL); in dm2s_event_handler()
804 mutex_enter(&dm2sp->ms_lock); in dm2s_event_handler()
805 if (!(dm2sp->ms_state & DM2S_MB_INITED)) { in dm2s_event_handler()
810 mutex_exit(&dm2sp->ms_lock); in dm2s_event_handler()
821 dm2sp->ms_state |= DM2S_MB_CONN; in dm2s_event_handler()
822 cv_broadcast(&dm2sp->ms_wait); in dm2s_event_handler()
827 if (!DM2S_MBOX_READY(dm2sp)) { in dm2s_event_handler()
837 if (dm2sp->ms_rq != NULL) { in dm2s_event_handler()
838 qenable(dm2sp->ms_rq); in dm2s_event_handler()
844 if (!DM2S_MBOX_READY(dm2sp)) { in dm2s_event_handler()
854 if (dm2sp->ms_wq != NULL) { in dm2s_event_handler()
855 qenable(dm2sp->ms_wq); in dm2s_event_handler()
860 dm2sp->ms_state |= DM2S_MB_DISC; in dm2s_event_handler()
861 if (dm2sp->ms_state & DM2S_MB_CONN) { in dm2s_event_handler()
866 rq = dm2sp->ms_rq; in dm2s_event_handler()
868 mutex_exit(&dm2sp->ms_lock); in dm2s_event_handler()
874 DTRACE_PROBE1(dm2s_hangup, dm2s_t, dm2sp); in dm2s_event_handler()
875 mutex_enter(&dm2sp->ms_lock); in dm2s_event_handler()
882 cv_broadcast(&dm2sp->ms_wait); in dm2s_event_handler()
890 mutex_exit(&dm2sp->ms_lock); in dm2s_event_handler()
901 dm2s_start(queue_t *wq, dm2s_t *dm2sp) in dm2s_start() argument
907 ASSERT(dm2sp != NULL); in dm2s_start()
908 ASSERT(MUTEX_HELD(&dm2sp->ms_lock)); in dm2s_start()
914 ret = dm2s_transmit(wq, mp, dm2sp->ms_target, in dm2s_start()
915 dm2sp->ms_key); in dm2s_start()
922 if (dm2sp->ms_wq_timeoutid == 0) { in dm2s_start()
924 dm2s_t, dm2sp); in dm2s_start()
925 dm2sp->ms_wq_timeoutid = qtimeout(wq, in dm2s_start()
926 dm2s_wq_timeout, (void *)dm2sp, in dm2s_start()
931 mutex_exit(&dm2sp->ms_lock); in dm2s_start()
939 DTRACE_PROBE1(dm2s_hangup, dm2s_t, dm2sp); in dm2s_start()
943 mutex_enter(&dm2sp->ms_lock); in dm2s_start()
963 dm2s_receive(dm2s_t *dm2sp) in dm2s_receive() argument
965 queue_t *rq = dm2sp->ms_rq; in dm2s_receive()
971 ASSERT(dm2sp != NULL); in dm2s_receive()
972 ASSERT(MUTEX_HELD(&dm2sp->ms_lock)); in dm2s_receive()
980 while (DM2S_MBOX_READY(dm2sp) && ((ret = scf_mb_canget(dm2sp->ms_target, in dm2s_receive()
981 dm2sp->ms_key, &len)) == 0)) { in dm2s_receive()
993 dm2sp->ms_rbufcid = qbufcall(rq, len, BPRI_MED, in dm2s_receive()
994 dm2s_bufcall_rcv, dm2sp); in dm2s_receive()
995 if (dm2sp->ms_rbufcid == 0) { in dm2s_receive()
1003 dm2s_t, dm2sp); in dm2s_receive()
1004 dm2sp->ms_rq_timeoutid = qtimeout(rq, in dm2s_receive()
1005 dm2s_rq_timeout, (void *)dm2sp, in dm2s_receive()
1014 dm2sp->ms_sg_rcv.msc_dptr = (caddr_t)mp->b_wptr; in dm2s_receive()
1015 dm2sp->ms_sg_rcv.msc_len = len; in dm2s_receive()
1017 ret = scf_mb_getmsg(dm2sp->ms_target, dm2sp->ms_key, len, 1, in dm2s_receive()
1018 &dm2sp->ms_sg_rcv, 0); in dm2s_receive()
1024 DMPBYTES("dm2s: Getmsg: ", len, 1, &dm2sp->ms_sg_rcv); in dm2s_receive()
1033 if ((!DM2S_MBOX_READY(dm2sp)) || (ret != ENOMSG && ret != EMSGSIZE)) { in dm2s_receive()
1039 mutex_exit(&dm2sp->ms_lock); in dm2s_receive()
1042 DTRACE_PROBE1(dm2s_hangup, dm2s_t, dm2sp); in dm2s_receive()
1043 mutex_enter(&dm2sp->ms_lock); in dm2s_receive()
1055 dm2s_t *dm2sp = (dm2s_t *)wq->q_ptr; in dm2s_transmit() local
1061 ASSERT(dm2sp != NULL); in dm2s_transmit()
1062 ASSERT(MUTEX_HELD(&dm2sp->ms_lock)); in dm2s_transmit()
1066 if (!DM2S_MBOX_READY(dm2sp)) { in dm2s_transmit()
1073 if (len > dm2sp->ms_mtu) { in dm2s_transmit()
1078 DTRACE_PROBE2(dm2s_msg_too_big, dm2s_t, dm2sp, uint32_t, len); in dm2s_transmit()
1083 if ((ret = dm2s_prep_scatgath(mp, &numsg, dm2sp->ms_sg_tx, in dm2s_transmit()
1091 ret = scf_mb_putmsg(target, key, len, numsg, dm2sp->ms_sg_tx, 0); in dm2s_transmit()
1095 if (++dm2sp->ms_retries >= DM2S_MAX_RETRIES) { in dm2s_transmit()
1102 DTRACE_PROBE2(dm2s_retry_fail, dm2s_t, dm2sp, int, ret); in dm2s_transmit()
1104 dm2sp->ms_retries = 0; in dm2s_transmit()
1107 DTRACE_PROBE2(dm2s_mb_busy, dm2s_t, dm2sp, int, ret); in dm2s_transmit()
1114 DMPBYTES("dm2s: Putmsg: ", len, numsg, dm2sp->ms_sg_tx); in dm2s_transmit()
1115 dm2sp->ms_retries = 0; in dm2s_transmit()
1130 dm2s_t *dm2sp = (dm2s_t *)arg; in dm2s_bufcall_rcv() local
1133 mutex_enter(&dm2sp->ms_lock); in dm2s_bufcall_rcv()
1134 dm2sp->ms_rbufcid = 0; in dm2s_bufcall_rcv()
1135 if (dm2sp->ms_rq != NULL) { in dm2s_bufcall_rcv()
1136 qenable(dm2sp->ms_rq); in dm2s_bufcall_rcv()
1138 mutex_exit(&dm2sp->ms_lock); in dm2s_bufcall_rcv()
1150 dm2s_t *dm2sp = (dm2s_t *)arg; in dm2s_rq_timeout() local
1153 mutex_enter(&dm2sp->ms_lock); in dm2s_rq_timeout()
1154 dm2sp->ms_rq_timeoutid = 0; in dm2s_rq_timeout()
1155 if (dm2sp->ms_rq != NULL) { in dm2s_rq_timeout()
1156 qenable(dm2sp->ms_rq); in dm2s_rq_timeout()
1158 mutex_exit(&dm2sp->ms_lock); in dm2s_rq_timeout()
1170 dm2s_t *dm2sp = (dm2s_t *)arg; in dm2s_wq_timeout() local
1173 mutex_enter(&dm2sp->ms_lock); in dm2s_wq_timeout()
1174 dm2sp->ms_wq_timeoutid = 0; in dm2s_wq_timeout()
1175 if (dm2sp->ms_wq != NULL) { in dm2s_wq_timeout()
1176 qenable(dm2sp->ms_wq); in dm2s_wq_timeout()
1178 mutex_exit(&dm2sp->ms_lock); in dm2s_wq_timeout()