Lines Matching refs:okmsp

90 int okm_get_req(okms_t *okmsp, sckm_ioctl_getreq_t *ireqp,
92 int okm_process_req(okms_t *okmsp, okm_req_hdr_t *reqp, uint32_t len,
94 int okm_process_status(okms_t *okmsp, sckm_ioctl_status_t *ireply);
96 int okm_send_reply(okms_t *okmsp, uint32_t transid, uint32_t status,
98 int block_until_ready(okms_t *okmsp);
103 static void okm_cleanup(okms_t *okmsp);
104 static int okm_mbox_init(okms_t *okmsp);
105 static void okm_mbox_fini(okms_t *okmsp);
202 okms_t *okmsp = &okms_global; in okm_attach() local
215 okmsp->km_dip = dip; in okm_attach()
216 okmsp->km_major = ddi_driver_major(dip); in okm_attach()
217 okmsp->km_inst = instance; in okm_attach()
228 &okmsp->km_ibcookie) != DDI_SUCCESS) { in okm_attach()
232 mutex_init(&okmsp->km_lock, NULL, MUTEX_DRIVER, in okm_attach()
233 (void *)okmsp->km_ibcookie); in okm_attach()
234 okmsp->km_clean |= OKM_CLEAN_LOCK; in okm_attach()
235 cv_init(&okmsp->km_wait, NULL, CV_DRIVER, NULL); in okm_attach()
236 okmsp->km_clean |= OKM_CLEAN_CV; in okm_attach()
242 okmsp->km_clean |= OKM_CLEAN_NODE; in okm_attach()
246 okm_cleanup(okmsp); in okm_attach()
250 ddi_set_driver_private(dip, (caddr_t)okmsp); in okm_attach()
264 okms_t *okmsp; in okm_detach() local
270 if ((okmsp = ddi_get_driver_private(dip)) == NULL) { in okm_detach()
274 mutex_enter(&okmsp->km_lock); in okm_detach()
278 if (okmsp->km_state & OKM_MB_INITED) { in okm_detach()
279 mutex_exit(&okmsp->km_lock); in okm_detach()
283 mutex_exit(&okmsp->km_lock); in okm_detach()
284 okm_cleanup(okmsp); in okm_detach()
296 okms_t *okmsp = &okms_global; in okm_info() local
309 if (okmsp->km_inst != minor) { in okm_info()
312 *result = okmsp->km_dip; in okm_info()
338 okms_t *okmsp = &okms_global; in okm_open() local
342 mutex_enter(&okmsp->km_lock); in okm_open()
343 if (okmsp->km_state & OKM_OPENED) { in okm_open()
345 mutex_exit(&okmsp->km_lock); in okm_open()
349 okmsp->km_state |= OKM_OPENED; in okm_open()
350 ret = block_until_ready(okmsp); in okm_open()
352 okmsp->km_state &= ~OKM_OPENED; in okm_open()
354 mutex_exit(&okmsp->km_lock); in okm_open()
366 block_until_ready(okms_t *okmsp) in block_until_ready() argument
371 ASSERT(MUTEX_HELD(&okmsp->km_lock)); in block_until_ready()
373 if (okmsp->km_state & OKM_MB_DISC) { in block_until_ready()
375 okm_mbox_fini(okmsp); in block_until_ready()
377 if (okmsp->km_state & OKM_MB_CONN) { in block_until_ready()
384 if ((ret = okm_mbox_init(okmsp)) != 0) { in block_until_ready()
402 okms_t *okmsp = &okms_global; in okm_close() local
406 mutex_enter(&okmsp->km_lock); in okm_close()
407 okm_mbox_fini(okmsp); in okm_close()
408 okmsp->km_state = 0; in okm_close()
409 mutex_exit(&okmsp->km_lock); in okm_close()
423 okms_t *okmsp = &okms_global; in okm_ioctl() local
436 ret = okm_get_req(okmsp, &ireq, data, flag); in okm_ioctl()
447 ret = okm_process_status(okmsp, &istatus); in okm_ioctl()
465 okm_get_req(okms_t *okmsp, sckm_ioctl_getreq_t *ireqp, intptr_t data, int flag) in okm_get_req() argument
473 mutex_enter(&okmsp->km_lock); in okm_get_req()
474 if ((ret = block_until_ready(okmsp)) != 0) { in okm_get_req()
475 mutex_exit(&okmsp->km_lock); in okm_get_req()
480 if (okmsp->km_reqp != NULL) { in okm_get_req()
482 reqp = okmsp->km_reqp; in okm_get_req()
483 len = okmsp->km_reqlen; in okm_get_req()
484 okmsp->km_reqp = NULL; in okm_get_req()
485 okmsp->km_reqlen = 0; in okm_get_req()
488 while (OKM_MBOX_READY(okmsp) && in okm_get_req()
489 ((ret = scf_mb_canget(okmsp->km_target, in okm_get_req()
490 okmsp->km_key, &len)) != 0)) { in okm_get_req()
494 mutex_exit(&okmsp->km_lock); in okm_get_req()
498 if (cv_wait_sig(&okmsp->km_wait, in okm_get_req()
499 &okmsp->km_lock) <= 0) { in okm_get_req()
500 mutex_exit(&okmsp->km_lock); in okm_get_req()
505 if (!OKM_MBOX_READY(okmsp)) { in okm_get_req()
506 mutex_exit(&okmsp->km_lock); in okm_get_req()
512 okmsp->km_sg_rcv.msc_dptr = msgbuf; in okm_get_req()
513 okmsp->km_sg_rcv.msc_len = len; in okm_get_req()
516 ret = scf_mb_getmsg(okmsp->km_target, okmsp->km_key, len, 1, in okm_get_req()
517 &okmsp->km_sg_rcv, 0); in okm_get_req()
524 mutex_exit(&okmsp->km_lock); in okm_get_req()
534 mutex_exit(&okmsp->km_lock); in okm_get_req()
547 (void) okm_send_reply(okmsp, reqp->krq_transid, in okm_get_req()
550 mutex_exit(&okmsp->km_lock); in okm_get_req()
558 ret = okm_process_req(okmsp, reqp, len, ireqp, data, flag); in okm_get_req()
559 if (okmsp->km_reqp == NULL) { in okm_get_req()
565 mutex_exit(&okmsp->km_lock); in okm_get_req()
578 okm_process_req(okms_t *okmsp, okm_req_hdr_t *reqp, uint32_t len, in okm_process_req() argument
591 (void) okm_send_reply(okmsp, reqp->krq_transid, in okm_process_req()
600 okmsp->km_reqp = reqp; in okm_process_req()
601 okmsp->km_reqlen = len; in okm_process_req()
630 (void) okm_send_reply(okmsp, reqp->krq_transid, in okm_process_req()
645 okm_process_status(okms_t *okmsp, sckm_ioctl_status_t *ireply) in okm_process_status() argument
650 okm_req_hdr_t *reqp = okmsp->km_reqp; in okm_process_status()
654 mutex_enter(&okmsp->km_lock); in okm_process_status()
655 if ((ret = block_until_ready(okmsp)) != 0) { in okm_process_status()
656 mutex_exit(&okmsp->km_lock); in okm_process_status()
663 if (!okmsp->km_reqp || (reqp->krq_transid != ireply->transid)) { in okm_process_status()
664 mutex_exit(&okmsp->km_lock); in okm_process_status()
706 ret = okm_send_reply(okmsp, ireply->transid, status, in okm_process_status()
712 kmem_free(okmsp->km_reqp, okmsp->km_reqlen); in okm_process_status()
713 okmsp->km_reqp = NULL; in okm_process_status()
714 okmsp->km_reqlen = 0; in okm_process_status()
716 mutex_exit(&okmsp->km_lock); in okm_process_status()
802 okm_cleanup(okms_t *okmsp) in okm_cleanup() argument
805 ASSERT(okmsp != NULL); in okm_cleanup()
806 if (okmsp->km_clean & OKM_CLEAN_NODE) { in okm_cleanup()
807 ddi_remove_minor_node(okmsp->km_dip, NULL); in okm_cleanup()
809 if (okmsp->km_clean & OKM_CLEAN_LOCK) in okm_cleanup()
810 mutex_destroy(&okmsp->km_lock); in okm_cleanup()
811 if (okmsp->km_clean & OKM_CLEAN_CV) in okm_cleanup()
812 cv_destroy(&okmsp->km_wait); in okm_cleanup()
813 if (okmsp->km_reqp != NULL) { in okm_cleanup()
814 kmem_free(okmsp->km_reqp, okmsp->km_reqlen); in okm_cleanup()
815 okmsp->km_reqp = NULL; in okm_cleanup()
816 okmsp->km_reqlen = 0; in okm_cleanup()
818 ddi_set_driver_private(okmsp->km_dip, NULL); in okm_cleanup()
825 okm_mbox_init(okms_t *okmsp) in okm_mbox_init() argument
830 ASSERT(MUTEX_HELD(&okmsp->km_lock)); in okm_mbox_init()
831 okmsp->km_target = OKM_TARGET_ID; in okm_mbox_init()
832 okmsp->km_key = DKMD_KEY; in okm_mbox_init()
833 okmsp->km_state &= ~OKM_MB_INITED; in okm_mbox_init()
836 while (!(okmsp->km_state & OKM_MB_CONN)) { in okm_mbox_init()
838 ret = scf_mb_init(okmsp->km_target, okmsp->km_key, in okm_mbox_init()
839 okm_event_handler, (void *)okmsp); in okm_mbox_init()
847 okmsp->km_state |= OKM_MB_INITED; in okm_mbox_init()
850 while (!(okmsp->km_state & in okm_mbox_init()
853 if (cv_wait_sig(&okmsp->km_wait, in okm_mbox_init()
854 &okmsp->km_lock) <= 0) { in okm_mbox_init()
862 if ((ret != 0) || (okmsp->km_state & OKM_MB_DISC)) { in okm_mbox_init()
864 if (okmsp->km_state & OKM_MB_INITED) { in okm_mbox_init()
865 (void) scf_mb_fini(okmsp->km_target, in okm_mbox_init()
866 okmsp->km_key); in okm_mbox_init()
868 if (okmsp->km_state & OKM_MB_DISC) { in okm_mbox_init()
875 okmsp->km_state &= ~(OKM_MB_INITED | OKM_MB_DISC | in okm_mbox_init()
889 ret = cv_reltimedwait_sig(&okmsp->km_wait, in okm_mbox_init()
890 &okmsp->km_lock, tout, TR_CLOCK_TICK); in okm_mbox_init()
900 ret = scf_mb_ctrl(okmsp->km_target, okmsp->km_key, in okm_mbox_init()
901 SCF_MBOP_MAXMSGSIZE, &okmsp->km_maxsz); in okm_mbox_init()
907 if ((ret == 0) && (okmsp->km_maxsz < sizeof (okm_rep_hdr_t))) { in okm_mbox_init()
909 "but found %d\n", sizeof (okm_rep_hdr_t), okmsp->km_maxsz); in okm_mbox_init()
913 okmsp->km_state &= ~OKM_MB_INITED; in okm_mbox_init()
914 (void) scf_mb_fini(okmsp->km_target, okmsp->km_key); in okm_mbox_init()
924 okm_mbox_fini(okms_t *okmsp) in okm_mbox_fini() argument
928 ASSERT(MUTEX_HELD(&okmsp->km_lock)); in okm_mbox_fini()
929 if (okmsp->km_state & OKM_MB_INITED) { in okm_mbox_fini()
931 ret = scf_mb_fini(okmsp->km_target, okmsp->km_key); in okm_mbox_fini()
937 okmsp->km_state &= ~(OKM_MB_INITED | OKM_MB_CONN | OKM_MB_DISC); in okm_mbox_fini()
951 okms_t *okmsp = (okms_t *)arg; in okm_event_handler() local
954 ASSERT(okmsp != NULL); in okm_event_handler()
955 mutex_enter(&okmsp->km_lock); in okm_event_handler()
956 if (!(okmsp->km_state & OKM_MB_INITED)) { in okm_event_handler()
961 mutex_exit(&okmsp->km_lock); in okm_event_handler()
974 okmsp->km_state |= OKM_MB_CONN; in okm_event_handler()
975 cv_broadcast(&okmsp->km_wait); in okm_event_handler()
984 if (OKM_MBOX_READY(okmsp)) { in okm_event_handler()
985 cv_broadcast(&okmsp->km_wait); in okm_event_handler()
995 if (OKM_MBOX_READY(okmsp)) { in okm_event_handler()
996 cv_broadcast(&okmsp->km_wait); in okm_event_handler()
1001 okmsp->km_state &= ~OKM_MB_CONN; in okm_event_handler()
1002 okmsp->km_state |= OKM_MB_DISC; in okm_event_handler()
1003 cv_broadcast(&okmsp->km_wait); in okm_event_handler()
1008 mutex_exit(&okmsp->km_lock); in okm_event_handler()
1015 okm_send_reply(okms_t *okmsp, uint32_t transid, in okm_send_reply() argument
1022 ASSERT(MUTEX_HELD(&okmsp->km_lock)); in okm_send_reply()
1028 okmsp->km_sg_tx.msc_dptr = (caddr_t)&reply; in okm_send_reply()
1029 okmsp->km_sg_tx.msc_len = sizeof (reply); in okm_send_reply()
1032 while (OKM_MBOX_READY(okmsp)) { in okm_send_reply()
1034 ret = scf_mb_putmsg(okmsp->km_target, okmsp->km_key, in okm_send_reply()
1035 sizeof (reply), 1, &okmsp->km_sg_tx, 0); in okm_send_reply()
1039 if (cv_timedwait_sig(&okmsp->km_wait, in okm_send_reply()
1040 &okmsp->km_lock, okm_timeout_val(ret)) == 0) { in okm_send_reply()