Lines Matching refs:sensor
371 ksensor_free_sensor(ksensor_t *sensor) in ksensor_free_sensor() argument
373 strfree(sensor->ksensor_name); in ksensor_free_sensor()
374 strfree(sensor->ksensor_class); in ksensor_free_sensor()
375 id_free(ksensor_ids, sensor->ksensor_id); in ksensor_free_sensor()
376 mutex_destroy(&sensor->ksensor_mutex); in ksensor_free_sensor()
377 kmem_free(sensor, sizeof (ksensor_t)); in ksensor_free_sensor()
391 ksensor_t *sensor; in ksensor_dip_unbind_taskq() local
398 for (sensor = list_head(&k->ksdip_sensors); sensor != NULL; in ksensor_dip_unbind_taskq()
399 sensor = list_next(&k->ksdip_sensors, sensor)) { in ksensor_dip_unbind_taskq()
400 mutex_enter(&sensor->ksensor_mutex); in ksensor_dip_unbind_taskq()
401 if (sensor->ksensor_flags & KSENSOR_F_NOTIFIED) { in ksensor_dip_unbind_taskq()
402 ksensor_cb_remove(sensor->ksensor_id, in ksensor_dip_unbind_taskq()
403 sensor->ksensor_name); in ksensor_dip_unbind_taskq()
404 sensor->ksensor_flags &= ~KSENSOR_F_NOTIFIED; in ksensor_dip_unbind_taskq()
406 mutex_exit(&sensor->ksensor_mutex); in ksensor_dip_unbind_taskq()
414 while ((sensor = list_remove_head(&k->ksdip_sensors)) != NULL) { in ksensor_dip_unbind_taskq()
415 mutex_enter(&sensor->ksensor_mutex); in ksensor_dip_unbind_taskq()
416 while ((sensor->ksensor_flags & KSENSOR_F_BUSY) != 0 || in ksensor_dip_unbind_taskq()
417 sensor->ksensor_nwaiters > 0) { in ksensor_dip_unbind_taskq()
418 cv_wait(&sensor->ksensor_cv, &sensor->ksensor_mutex); in ksensor_dip_unbind_taskq()
420 mutex_exit(&sensor->ksensor_mutex); in ksensor_dip_unbind_taskq()
421 ksensor_free_sensor(sensor); in ksensor_dip_unbind_taskq()
430 ksensor_t *sensor; in ksensor_dip_unbind_cb() local
441 for (sensor = list_head(&k->ksdip_sensors); sensor != NULL; in ksensor_dip_unbind_cb()
442 sensor = list_next(&k->ksdip_sensors, sensor)) { in ksensor_dip_unbind_cb()
443 avl_remove(&ksensor_avl, sensor); in ksensor_dip_unbind_cb()
488 ksensor_t *sensor; in ksensor_create() local
506 sensor = ksensor_search_ksdip(ksdip, name, class); in ksensor_create()
507 if (sensor != NULL) { in ksensor_create()
508 ASSERT3P(sensor->ksensor_ksdip, ==, ksdip); in ksensor_create()
509 if ((sensor->ksensor_flags & KSENSOR_F_VALID) != 0) { in ksensor_create()
516 sensor->ksensor_ops = ops; in ksensor_create()
517 sensor->ksensor_arg = arg; in ksensor_create()
519 sensor = kmem_zalloc(sizeof (ksensor_t), KM_SLEEP); in ksensor_create()
520 sensor->ksensor_ksdip = ksdip; in ksensor_create()
521 sensor->ksensor_name = ddi_strdup(name, KM_SLEEP); in ksensor_create()
522 sensor->ksensor_class = ddi_strdup(class, KM_SLEEP); in ksensor_create()
523 sensor->ksensor_id = id_alloc(ksensor_ids); in ksensor_create()
524 sensor->ksensor_ops = ops; in ksensor_create()
525 sensor->ksensor_arg = arg; in ksensor_create()
526 list_insert_tail(&ksdip->ksdip_sensors, sensor); in ksensor_create()
527 avl_add(&ksensor_avl, sensor); in ksensor_create()
530 sensor->ksensor_flags |= KSENSOR_F_VALID; in ksensor_create()
534 if (ksensor_cb_create(sensor->ksensor_id, sensor->ksensor_class, in ksensor_create()
535 sensor->ksensor_name) == 0) { in ksensor_create()
536 sensor->ksensor_flags |= KSENSOR_F_NOTIFIED; in ksensor_create()
540 *idp = sensor->ksensor_id; in ksensor_create()
611 ksensor_t *sensor; in ksensor_remove() local
624 for (sensor = list_head(&kdip->ksdip_sensors); sensor != NULL; in ksensor_remove()
625 sensor = list_next(&kdip->ksdip_sensors, sensor)) { in ksensor_remove()
626 if (sensor->ksensor_id == id || id == KSENSOR_ALL_IDS) { in ksensor_remove()
627 mutex_enter(&sensor->ksensor_mutex); in ksensor_remove()
628 sensor->ksensor_flags &= ~KSENSOR_F_VALID; in ksensor_remove()
629 sensor->ksensor_ops = NULL; in ksensor_remove()
630 sensor->ksensor_arg = NULL; in ksensor_remove()
631 mutex_exit(&sensor->ksensor_mutex); in ksensor_remove()
639 ksensor_release(ksensor_t *sensor) in ksensor_release() argument
643 ddi_release_devi(sensor->ksensor_ksdip->ksdip_dip); in ksensor_release()
645 mutex_enter(&sensor->ksensor_mutex); in ksensor_release()
646 sensor->ksensor_flags &= ~KSENSOR_F_BUSY; in ksensor_release()
647 cv_broadcast(&sensor->ksensor_cv); in ksensor_release()
648 mutex_exit(&sensor->ksensor_mutex); in ksensor_release()
654 ksensor_t *sensor; in ksensor_hold_by_id() local
659 sensor = ksensor_find_by_id(id); in ksensor_hold_by_id()
660 if (sensor == NULL) { in ksensor_hold_by_id()
666 if ((sensor->ksensor_ksdip->ksdip_flags & KSENSOR_DIP_F_REMOVED) != 0) { in ksensor_hold_by_id()
672 mutex_enter(&sensor->ksensor_mutex); in ksensor_hold_by_id()
673 if ((sensor->ksensor_flags & KSENSOR_F_BUSY) != 0) { in ksensor_hold_by_id()
675 sensor->ksensor_nwaiters++; in ksensor_hold_by_id()
676 while ((sensor->ksensor_flags & KSENSOR_F_BUSY) != 0) { in ksensor_hold_by_id()
677 int cv = cv_wait_sig(&sensor->ksensor_cv, in ksensor_hold_by_id()
678 &sensor->ksensor_mutex); in ksensor_hold_by_id()
680 sensor->ksensor_nwaiters--; in ksensor_hold_by_id()
681 cv_broadcast(&sensor->ksensor_cv); in ksensor_hold_by_id()
682 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
687 sensor->ksensor_nwaiters--; in ksensor_hold_by_id()
688 cv_broadcast(&sensor->ksensor_cv); in ksensor_hold_by_id()
689 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
697 sensor->ksensor_flags |= KSENSOR_F_BUSY; in ksensor_hold_by_id()
698 pdip = ddi_get_parent(sensor->ksensor_ksdip->ksdip_dip); in ksensor_hold_by_id()
699 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
706 e_ddi_hold_devi(sensor->ksensor_ksdip->ksdip_dip); in ksensor_hold_by_id()
714 if ((sensor->ksensor_ksdip->ksdip_flags & KSENSOR_DIP_F_REMOVED) != 0) { in ksensor_hold_by_id()
716 ksensor_release(sensor); in ksensor_hold_by_id()
720 mutex_enter(&sensor->ksensor_mutex); in ksensor_hold_by_id()
721 if ((sensor->ksensor_flags & KSENSOR_F_VALID) == 0) { in ksensor_hold_by_id()
722 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
726 mutex_enter(&sensor->ksensor_mutex); in ksensor_hold_by_id()
732 if ((sensor->ksensor_ksdip->ksdip_flags & in ksensor_hold_by_id()
734 (sensor->ksensor_flags & KSENSOR_F_VALID) == 0) { in ksensor_hold_by_id()
735 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
737 ksensor_release(sensor); in ksensor_hold_by_id()
741 mutex_exit(&sensor->ksensor_mutex); in ksensor_hold_by_id()
743 *outp = sensor; in ksensor_hold_by_id()
752 ksensor_t *sensor; in ksensor_op_kind() local
754 if ((ret = ksensor_hold_by_id(id, &sensor)) != 0) { in ksensor_op_kind()
758 ret = sensor->ksensor_ops->kso_kind(sensor->ksensor_arg, kind); in ksensor_op_kind()
759 ksensor_release(sensor); in ksensor_op_kind()
768 ksensor_t *sensor; in ksensor_op_scalar() local
770 if ((ret = ksensor_hold_by_id(id, &sensor)) != 0) { in ksensor_op_scalar()
774 ret = sensor->ksensor_ops->kso_scalar(sensor->ksensor_arg, scalar); in ksensor_op_scalar()
775 ksensor_release(sensor); in ksensor_op_scalar()
783 ksensor_t *sensor; in ksensor_unregister() local
790 for (sensor = avl_first(&ksensor_avl); sensor != NULL; sensor = in ksensor_unregister()
791 AVL_NEXT(&ksensor_avl, sensor)) { in ksensor_unregister()
792 mutex_enter(&sensor->ksensor_mutex); in ksensor_unregister()
793 sensor->ksensor_flags &= ~KSENSOR_F_NOTIFIED; in ksensor_unregister()
794 mutex_exit(&sensor->ksensor_mutex); in ksensor_unregister()
807 ksensor_t *sensor; in ksensor_register() local
821 for (sensor = avl_first(&ksensor_avl); sensor != NULL; sensor = in ksensor_register()
822 AVL_NEXT(&ksensor_avl, sensor)) { in ksensor_register()
823 mutex_enter(&sensor->ksensor_mutex); in ksensor_register()
824 ASSERT0(sensor->ksensor_flags & KSENSOR_F_NOTIFIED); in ksensor_register()
826 if (ksensor_cb_create(sensor->ksensor_id, sensor->ksensor_class, in ksensor_register()
827 sensor->ksensor_name) == 0) { in ksensor_register()
828 sensor->ksensor_flags |= KSENSOR_F_NOTIFIED; in ksensor_register()
831 mutex_exit(&sensor->ksensor_mutex); in ksensor_register()