Lines Matching refs:sp

123 static void request_pri(ds_pri_state_t *sp);
124 static uint64_t ds_get_hv_pri(ds_pri_state_t *sp);
278 ds_pri_state_t *sp; in ds_pri_getinfo() local
285 sp = ddi_get_soft_state(ds_pri_statep, getminor((dev_t)arg)); in ds_pri_getinfo()
286 if (sp != NULL) { in ds_pri_getinfo()
287 *resultp = sp->dip; in ds_pri_getinfo()
310 ds_pri_state_t *sp; in ds_pri_attach() local
333 sp = ddi_get_soft_state(ds_pri_statep, instance); in ds_pri_attach()
335 mutex_init(&sp->lock, NULL, MUTEX_DEFAULT, NULL); in ds_pri_attach()
336 cv_init(&sp->cv, NULL, CV_DEFAULT, NULL); in ds_pri_attach()
349 sp->state = DS_PRI_NO_SERVICE; in ds_pri_attach()
352 sp->ds_pri_handle = DS_INVALID_HDL; in ds_pri_attach()
354 sp->ds_pri = NULL; in ds_pri_attach()
355 sp->ds_pri_len = 0; in ds_pri_attach()
356 sp->req_id = 0; in ds_pri_attach()
357 sp->num_opens = 0; in ds_pri_attach()
364 if ((status = ds_get_hv_pri(sp)) != 0) { in ds_pri_attach()
379 if (sp->ds_pri) in ds_pri_attach()
380 kmem_free(sp->ds_pri, sp->ds_pri_len); in ds_pri_attach()
382 cv_destroy(&sp->cv); in ds_pri_attach()
383 mutex_destroy(&sp->lock); in ds_pri_attach()
394 ds_pri_state_t *sp; in ds_pri_detach() local
399 sp = ddi_get_soft_state(ds_pri_statep, instance); in ds_pri_detach()
417 if (sp != NULL && sp->ds_pri_len != 0) in ds_pri_detach()
418 kmem_free(sp->ds_pri, sp->ds_pri_len); in ds_pri_detach()
423 cv_destroy(&sp->cv); in ds_pri_detach()
424 mutex_destroy(&sp->lock); in ds_pri_detach()
435 ds_pri_state_t *sp; in ds_pri_open() local
442 sp = ddi_get_soft_state(ds_pri_statep, instance); in ds_pri_open()
443 if (sp == NULL) in ds_pri_open()
446 mutex_enter(&sp->lock); in ds_pri_open()
458 if (!(sp->state & DS_PRI_HAS_PRI)) { in ds_pri_open()
459 while (!(sp->state & DS_PRI_HAS_SERVICE)) { in ds_pri_open()
460 if (cv_wait_sig(&sp->cv, &sp->lock) == 0) { in ds_pri_open()
461 mutex_exit(&sp->lock); in ds_pri_open()
467 sp->num_opens++; in ds_pri_open()
468 mutex_exit(&sp->lock); in ds_pri_open()
470 DS_PRI_DBG("ds_pri_open: state = 0x%x\n", sp->state); in ds_pri_open()
481 ds_pri_state_t *sp; in ds_pri_close() local
489 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_close()
492 mutex_enter(&sp->lock); in ds_pri_close()
493 if (!(sp->state & DS_PRI_HAS_SERVICE)) { in ds_pri_close()
494 mutex_exit(&sp->lock); in ds_pri_close()
498 if (--sp->num_opens > 0) { in ds_pri_close()
499 mutex_exit(&sp->lock); in ds_pri_close()
503 sp->state &= ~DS_PRI_REQUESTED; in ds_pri_close()
504 mutex_exit(&sp->lock); in ds_pri_close()
513 ds_pri_state_t *sp; in ds_pri_read() local
521 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_read()
529 mutex_enter(&sp->lock); in ds_pri_read()
531 DS_PRI_DBG("ds_pri_read: state = 0x%x\n", sp->state); in ds_pri_read()
534 if (!(sp->state & DS_PRI_HAS_PRI)) { in ds_pri_read()
538 mutex_exit(&sp->lock); in ds_pri_read()
542 while (!(sp->state & DS_PRI_HAS_PRI)) { in ds_pri_read()
543 DS_PRI_DBG("ds_pri_read: state = 0x%x\n", sp->state); in ds_pri_read()
544 request_pri(sp); in ds_pri_read()
545 if (cv_wait_sig(&sp->cv, &sp->lock) == 0) { in ds_pri_read()
546 mutex_exit(&sp->lock); in ds_pri_read()
552 if (len > sp->ds_pri_len) in ds_pri_read()
553 len = sp->ds_pri_len; in ds_pri_read()
556 mutex_exit(&sp->lock); in ds_pri_read()
572 bcopy(((caddr_t)sp->ds_pri), tmpbufp, len); in ds_pri_read()
573 mutex_exit(&sp->lock); in ds_pri_read()
594 ds_pri_state_t *sp; in ds_pri_ioctl() local
598 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_ioctl()
613 mutex_enter(&sp->lock); in ds_pri_ioctl()
616 if (sp->state & DS_PRI_HAS_PRI) { in ds_pri_ioctl()
618 info.size = sp->ds_pri_len; in ds_pri_ioctl()
619 info.token = sp->gencount; in ds_pri_ioctl()
621 if (!(sp->state & DS_PRI_HAS_SERVICE)) { in ds_pri_ioctl()
626 request_pri(sp); in ds_pri_ioctl()
628 if (cv_wait_sig(&sp->cv, &sp->lock) == 0) { in ds_pri_ioctl()
629 mutex_exit(&sp->lock); in ds_pri_ioctl()
636 mutex_exit(&sp->lock); in ds_pri_ioctl()
650 mutex_enter(&sp->lock); in ds_pri_ioctl()
653 gencount, sp->gencount); in ds_pri_ioctl()
655 while ((sp->state & DS_PRI_HAS_PRI) == 0 || in ds_pri_ioctl()
656 gencount == sp->gencount) { in ds_pri_ioctl()
657 if ((sp->state & DS_PRI_HAS_PRI) == 0) in ds_pri_ioctl()
658 request_pri(sp); in ds_pri_ioctl()
659 if (cv_wait_sig(&sp->cv, &sp->lock) == 0) { in ds_pri_ioctl()
660 mutex_exit(&sp->lock); in ds_pri_ioctl()
664 mutex_exit(&sp->lock); in ds_pri_ioctl()
677 request_pri(ds_pri_state_t *sp) in request_pri() argument
681 ASSERT(MUTEX_HELD(&sp->lock)); in request_pri()
684 if (!(sp->state & DS_PRI_HAS_SERVICE)) in request_pri()
686 if (sp->state & DS_PRI_REQUESTED) in request_pri()
690 if (sp->state & DS_PRI_HAS_PRI) { in request_pri()
691 ASSERT(sp->ds_pri_len != 0); in request_pri()
692 ASSERT(sp->ds_pri != NULL); in request_pri()
695 kmem_free(sp->ds_pri, sp->ds_pri_len); in request_pri()
696 sp->ds_pri_len = 0; in request_pri()
697 sp->ds_pri = NULL; in request_pri()
698 sp->state &= ~DS_PRI_HAS_PRI; in request_pri()
700 ASSERT(sp->ds_pri == NULL); in request_pri()
701 ASSERT(sp->ds_pri_len == 0); in request_pri()
704 reqmsg.hdr.seq_num = ++(sp->req_id); in request_pri()
707 DS_PRI_DBG("request_pri: request id 0x%lx\n", sp->req_id); in request_pri()
716 (void) ds_cap_send(sp->ds_pri_handle, &reqmsg, sizeof (reqmsg.hdr)); in request_pri()
718 sp->state |= DS_PRI_REQUESTED; in request_pri()
719 sp->last_req_id = sp->req_id; in request_pri()
730 ds_pri_state_t *sp; in ds_pri_reg_handler() local
734 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_reg_handler()
741 mutex_enter(&sp->lock); in ds_pri_reg_handler()
743 ASSERT(sp->ds_pri_handle == DS_INVALID_HDL); in ds_pri_reg_handler()
744 sp->ds_pri_handle = hdl; in ds_pri_reg_handler()
746 ASSERT(!(sp->state & DS_PRI_HAS_SERVICE)); in ds_pri_reg_handler()
747 sp->state |= DS_PRI_HAS_SERVICE; in ds_pri_reg_handler()
756 cv_broadcast(&sp->cv); in ds_pri_reg_handler()
758 mutex_exit(&sp->lock); in ds_pri_reg_handler()
766 ds_pri_state_t *sp; in ds_pri_unreg_handler() local
770 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_unreg_handler()
775 mutex_enter(&sp->lock); in ds_pri_unreg_handler()
785 sp->ds_pri_handle = DS_INVALID_HDL; in ds_pri_unreg_handler()
786 sp->state &= ~DS_PRI_HAS_SERVICE; in ds_pri_unreg_handler()
788 mutex_exit(&sp->lock); in ds_pri_unreg_handler()
796 ds_pri_state_t *sp; in ds_pri_data_handler() local
812 if ((sp = ddi_get_soft_state(ds_pri_statep, instance)) == NULL) in ds_pri_data_handler()
815 mutex_enter(&sp->lock); in ds_pri_data_handler()
817 ASSERT(sp->state & DS_PRI_HAS_SERVICE); in ds_pri_data_handler()
825 request_pri(sp); in ds_pri_data_handler()
836 if (!(sp->state & DS_PRI_REQUESTED)) { in ds_pri_data_handler()
842 ASSERT(!(sp->state & DS_PRI_HAS_PRI)); in ds_pri_data_handler()
843 ASSERT(sp->ds_pri_len == 0); in ds_pri_data_handler()
844 ASSERT(sp->ds_pri == NULL); in ds_pri_data_handler()
847 if (msgp->hdr.seq_num != sp->last_req_id) { in ds_pri_data_handler()
859 sp->ds_pri = data; in ds_pri_data_handler()
860 sp->ds_pri_len = pri_size; in ds_pri_data_handler()
861 bcopy(msgp->data, data, sp->ds_pri_len); in ds_pri_data_handler()
862 sp->state &= ~DS_PRI_REQUESTED; in ds_pri_data_handler()
863 sp->state |= DS_PRI_HAS_PRI; in ds_pri_data_handler()
865 sp->gencount++; in ds_pri_data_handler()
866 cv_broadcast(&sp->cv); in ds_pri_data_handler()
869 mutex_exit(&sp->lock); in ds_pri_data_handler()
878 ds_get_hv_pri(ds_pri_state_t *sp) in ds_get_hv_pri() argument
928 sp->ds_pri = pri_data; in ds_get_hv_pri()
929 sp->ds_pri_len = pri_size; in ds_get_hv_pri()
930 bcopy(buf_va, pri_data, sp->ds_pri_len); in ds_get_hv_pri()
931 sp->state |= DS_PRI_HAS_PRI; in ds_get_hv_pri()
932 sp->gencount++; in ds_get_hv_pri()