Lines Matching defs:sme
119 struct sysmon_envsys *sme, sysmon_envsys_lim_t *lims,
130 KASSERT(sme != NULL);
172 mutex_enter(&sme->sme_mtx);
173 LIST_FOREACH(osee, &sme->sme_events_list, see_list) {
187 __func__, sme->sme_name, edata->desc, crittype));
224 mutex_exit(&sme->sme_mtx);
234 __func__, sme->sme_name, edata->desc));
237 see->see_sme = sme;
268 (void)strlcpy(see->see_pes.pes_dvname, sme->sme_name,
284 __func__, sme->sme_name, objkey));
292 "(%s updated)\n", __func__, sme->sme_name,
316 if (sme->sme_callout_state == SME_CALLOUT_INVALID)
317 error = sme_events_init(sme);
323 if (sme->sme_set_limits)
324 (*sme->sme_set_limits)(sme, edata, &(edata->limits),
329 mutex_enter(&sme->sme_work_mtx);
330 LIST_INSERT_HEAD(&sme->sme_events_list, see, see_list);
331 mutex_exit(&sme->sme_work_mtx);
334 mutex_exit(&sme->sme_mtx);
345 sme_event_unregister_all(struct sysmon_envsys *sme)
351 KASSERT(sme != NULL);
353 mutex_enter(&sme->sme_mtx);
354 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
356 cv_wait(&sme->sme_condvar, &sme->sme_mtx);
358 if (strcmp(see->see_pes.pes_dvname, sme->sme_name) == 0)
363 evcounter, sme->sme_name));
365 while ((see = LIST_FIRST(&sme->sme_events_list))) {
369 if (strcmp(see->see_pes.pes_dvname, sme->sme_name) == 0) {
372 sme->sme_name));
373 sme_remove_event(see, sme);
379 mutex_enter(&sme->sme_work_mtx);
380 if (LIST_EMPTY(&sme->sme_events_list) &&
381 sme->sme_callout_state == SME_CALLOUT_READY) {
382 sme_events_halt_callout(sme);
385 mutex_exit(&sme->sme_work_mtx);
386 mutex_exit(&sme->sme_mtx);
389 sme_events_destroy(sme);
398 sme_event_unregister(struct sysmon_envsys *sme, const char *sensor, int type)
406 mutex_enter(&sme->sme_mtx);
407 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
417 mutex_exit(&sme->sme_mtx);
426 cv_wait(&sme->sme_condvar, &sme->sme_mtx);
431 sme_remove_event(see, sme);
433 mutex_enter(&sme->sme_work_mtx);
434 if (LIST_EMPTY(&sme->sme_events_list)) {
435 sme_events_halt_callout(sme);
438 mutex_exit(&sme->sme_work_mtx);
439 mutex_exit(&sme->sme_mtx);
442 sme_events_destroy(sme);
454 sme_event_unregister_sensor(struct sysmon_envsys *sme, envsys_data_t *edata)
459 KASSERT(mutex_owned(&sme->sme_mtx));
460 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
474 cv_wait(&sme->sme_condvar, &sme->sme_mtx);
479 sme_remove_event(see, sme);
485 sme_remove_event(sme_event_t *see, struct sysmon_envsys *sme)
488 KASSERT(mutex_owned(&sme->sme_mtx));
490 mutex_enter(&sme->sme_work_mtx);
492 mutex_exit(&sme->sme_work_mtx);
569 sme_events_init(struct sysmon_envsys *sme)
573 KASSERT(sme != NULL);
574 KASSERT(mutex_owned(&sme->sme_mtx));
576 error = workqueue_create(&sme->sme_wq, sme->sme_name,
577 sme_events_worker, sme, PRI_NONE, IPL_SOFTCLOCK, WQ_MPSAFE);
581 callout_init(&sme->sme_callout, CALLOUT_MPSAFE);
582 callout_setfunc(&sme->sme_callout, sme_events_check, sme);
584 mutex_enter(&sme->sme_work_mtx);
585 sme->sme_callout_state = SME_CALLOUT_READY;
586 sme_schedule_callout(sme);
587 mutex_exit(&sme->sme_work_mtx);
590 sme->sme_name));
601 sme_schedule_callout(struct sysmon_envsys *sme)
605 KASSERT(sme != NULL);
606 KASSERT(mutex_owned(&sme->sme_work_mtx));
608 if (sme->sme_callout_state != SME_CALLOUT_READY)
611 if (sme->sme_events_timeout)
612 timo = sme->sme_events_timeout * hz;
616 callout_schedule(&sme->sme_callout, timo);
625 sme_events_halt_callout(struct sysmon_envsys *sme)
628 KASSERT(mutex_owned(&sme->sme_mtx));
629 KASSERT(sme->sme_callout_state == SME_CALLOUT_READY);
638 sme->sme_callout_state = SME_CALLOUT_HALTED;
639 callout_halt(&sme->sme_callout, &sme->sme_mtx);
649 sme_events_destroy(struct sysmon_envsys *sme)
652 KASSERT(!mutex_owned(&sme->sme_mtx));
654 if (sme->sme_callout_state == SME_CALLOUT_HALTED) {
655 callout_destroy(&sme->sme_callout);
656 sme->sme_callout_state = SME_CALLOUT_INVALID;
657 workqueue_destroy(sme->sme_wq);
659 KASSERT(sme->sme_callout_state == SME_CALLOUT_INVALID);
662 __func__, sme->sme_name));
674 sysmon_envsys_update_limits(struct sysmon_envsys *sme, envsys_data_t *edata)
678 sysmon_envsys_acquire(sme, false);
679 if (sme->sme_get_limits == NULL ||
683 err = sme_update_limits(sme, edata);
684 sysmon_envsys_release(sme, false);
697 sme_update_limits(struct sysmon_envsys *sme, envsys_data_t *edata)
706 array = prop_dictionary_get(sme_propd, sme->sme_name);
719 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
728 if (sme->sme_get_limits != NULL)
729 (*sme->sme_get_limits)(sme, edata, &lims, &props);
732 sme_event_register(sdict, edata, sme, &lims, props,
747 struct sysmon_envsys *sme = arg;
750 KASSERT(sme != NULL);
752 mutex_enter(&sme->sme_work_mtx);
753 if (sme->sme_busy > 0) {
755 sme->sme_name);
756 mutex_exit(&sme->sme_work_mtx);
759 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
760 workqueue_enqueue(sme->sme_wq, &see->see_wk, NULL);
762 sme->sme_busy++;
765 sme_schedule_callout(sme);
766 mutex_exit(&sme->sme_work_mtx);
779 struct sysmon_envsys *sme = see->see_sme;
783 KASSERT(sme != NULL);
786 mutex_enter(&sme->sme_mtx);
793 mutex_enter(&sme->sme_work_mtx);
796 mutex_exit(&sme->sme_work_mtx);
797 sysmon_envsys_refresh_sensor(sme, edata);
798 mutex_enter(&sme->sme_work_mtx);
801 mutex_exit(&sme->sme_work_mtx);
804 "value_cur=%d upropset=0x%04x\n", __func__, sme->sme_name, edata->desc,
847 cv_broadcast(&sme->sme_condvar);
848 mutex_enter(&sme->sme_work_mtx);
849 KASSERT(sme->sme_busy > 0);
850 sme->sme_busy--;
851 mutex_exit(&sme->sme_work_mtx);
852 mutex_exit(&sme->sme_mtx);
863 sysmon_envsys_sensor_event(struct sysmon_envsys *sme, envsys_data_t *edata,
868 mutex_enter(&sme->sme_mtx);
869 LIST_FOREACH(see, &sme->sme_events_list, see_list) {
879 mutex_exit(&sme->sme_mtx);
1024 struct sysmon_envsys *sme = see->see_sme;
1030 KASSERT(mutex_owned(&sme->sme_mtx));
1031 KASSERT(sme->sme_callout_state == SME_CALLOUT_READY);
1032 callout_stop(&sme->sme_callout);
1033 sme->sme_callout_state = SME_CALLOUT_HALTED;
1065 struct sysmon_envsys *sme;
1069 LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) {
1070 if (sme->sme_class == SME_CLASS_ACADAPTER) {
1085 TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head) {
1089 sysmon_envsys_refresh_sensor(sme, edata);
1112 struct sysmon_envsys *sme;
1120 LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) {
1121 if (sme->sme_class != SME_CLASS_BATTERY)
1131 TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head) {
1145 TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head) {