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