summaryrefslogtreecommitdiff
path: root/sys/dev/sysmon
diff options
context:
space:
mode:
authorxtraeme <xtraeme@NetBSD.org>2008-01-02 12:20:26 +0000
committerxtraeme <xtraeme@NetBSD.org>2008-01-02 12:20:26 +0000
commitb88ea32e70c37bcd2e25d8b7df87d17cd0a95abc (patch)
treee91ccd031ba50e9e6477af55cb3adaaf839bb361 /sys/dev/sysmon
parenta108410386a9b8bced7fd1ae6a0d0b1fb7646af5 (diff)
- Initialize the callout with CALLOUT_MPSAFE, like it was done before
in sysmon_envsys_events.c. - Separate sme_event_check_low_power() into sme_battery_check(), sme_acadapter_check() and sme_battery_critical() (no functional changes).
Diffstat (limited to 'sys/dev/sysmon')
-rw-r--r--sys/dev/sysmon/sysmon_envsys.c20
-rw-r--r--sys/dev/sysmon/sysmon_envsys_events.c52
2 files changed, 51 insertions, 21 deletions
diff --git a/sys/dev/sysmon/sysmon_envsys.c b/sys/dev/sysmon/sysmon_envsys.c
index a40e9a32d34..aa76b122497 100644
--- a/sys/dev/sysmon/sysmon_envsys.c
+++ b/sys/dev/sysmon/sysmon_envsys.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys.c,v 1.78 2008/01/02 10:15:53 dyoung Exp $ */
+/* $NetBSD: sysmon_envsys.c,v 1.79 2008/01/02 12:20:26 xtraeme Exp $ */
/*-
* Copyright (c) 2007 Juan Romero Pardines.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.78 2008/01/02 10:15:53 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys.c,v 1.79 2008/01/02 12:20:26 xtraeme Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -520,7 +520,7 @@ sysmon_envsys_create(void)
sme = kmem_zalloc(sizeof(*sme), KM_SLEEP);
TAILQ_INIT(&sme->sme_sensors_list);
LIST_INIT(&sme->sme_events_list);
- callout_init(&sme->sme_callout, 0);
+ callout_init(&sme->sme_callout, CALLOUT_MPSAFE);
return sme;
}
@@ -927,14 +927,14 @@ sysmon_envsys_find(const char *name)
again:
LIST_FOREACH(sme, &sysmon_envsys_list, sme_list) {
- if (strcmp(sme->sme_name, name) == 0) {
- if (sme->sme_flags & SME_FLAG_BUSY) {
- cv_wait(&sme_cv, &sme_mtx);
- goto again;
- }
- sme->sme_flags |= SME_FLAG_BUSY;
- break;
+ if (strcmp(sme->sme_name, name) == 0) {
+ if (sme->sme_flags & SME_FLAG_BUSY) {
+ cv_wait(&sme_cv, &sme_mtx);
+ goto again;
}
+ sme->sme_flags |= SME_FLAG_BUSY;
+ break;
+ }
}
return sme;
}
diff --git a/sys/dev/sysmon/sysmon_envsys_events.c b/sys/dev/sysmon/sysmon_envsys_events.c
index 7aac79788fe..fbafd3f5f2b 100644
--- a/sys/dev/sysmon/sysmon_envsys_events.c
+++ b/sys/dev/sysmon/sysmon_envsys_events.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysmon_envsys_events.c,v 1.46 2007/11/20 17:24:32 xtraeme Exp $ */
+/* $NetBSD: sysmon_envsys_events.c,v 1.47 2008/01/02 12:20:26 xtraeme Exp $ */
/*-
* Copyright (c) 2007 Juan Romero Pardines.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.46 2007/11/20 17:24:32 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysmon_envsys_events.c,v 1.47 2008/01/02 12:20:26 xtraeme Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -69,7 +69,9 @@ static bool sysmon_low_power = false;
#define SME_EVTIMO (SME_EVENTS_DEFTIMEOUT * hz)
static bool sme_event_check_low_power(void);
+static bool sme_battery_check(void);
static bool sme_battery_critical(envsys_data_t *);
+static bool sme_acadapter_check(void);
/*
* sme_event_register:
@@ -367,7 +369,6 @@ sme_events_init(struct sysmon_envsys *sme)
if (error)
goto out;
- callout_init(&sme->sme_callout, CALLOUT_MPSAFE);
callout_setfunc(&sme->sme_callout, sme_events_check, sme);
callout_schedule(&sme->sme_callout, timo);
sme->sme_flags |= SME_CALLOUT_INITIALIZED;
@@ -613,37 +614,64 @@ do { \
mutex_exit(&sme_mtx);
}
+/*
+ * Returns true if the system is in low power state: all AC adapters
+ * are OFF and all batteries are in LOW/CRITICAL state.
+ */
static bool
sme_event_check_low_power(void)
{
+ KASSERT(mutex_owned(&sme_mtx));
+
+ if (!sme_acadapter_check())
+ return false;
+
+ return sme_battery_check();
+}
+
+static bool
+sme_acadapter_check(void)
+{
struct sysmon_envsys *sme;
envsys_data_t *edata;
- bool battery, batterycap, batterycharge;
+ bool sensor = false;
KASSERT(mutex_owned(&sme_mtx));
- battery = batterycap = batterycharge = false;
-
LIST_FOREACH(sme, &sysmon_envsys_list, sme_list)
if (sme->sme_class == SME_CLASS_ACADAPTER)
break;
-
/*
- * No AC Adapter devices were found, do nothing.
+ * No AC Adapter devices were found.
*/
if (!sme)
return false;
-
/*
- * If there's an AC Adapter connected, there's no need
- * to continue...
+ * Check if there's an AC adapter device connected.
*/
TAILQ_FOREACH(edata, &sme->sme_sensors_list, sensors_head) {
if (edata->units == ENVSYS_INDICATOR) {
+ sensor = true;
if (edata->value_cur)
return false;
}
}
+ if (!sensor)
+ return false;
+
+ return true;
+}
+
+static bool
+sme_battery_check(void)
+{
+ struct sysmon_envsys *sme;
+ envsys_data_t *edata;
+ bool battery, batterycap, batterycharge;
+
+ KASSERT(mutex_owned(&sme_mtx));
+
+ battery = batterycap = batterycharge = false;
/*
* Check for battery devices and its state.
@@ -680,6 +708,8 @@ sme_event_check_low_power(void)
static bool
sme_battery_critical(envsys_data_t *edata)
{
+ KASSERT(mutex_owned(&sme_mtx));
+
if (edata->value_cur == ENVSYS_BATTERY_CAPACITY_CRITICAL ||
edata->value_cur == ENVSYS_BATTERY_CAPACITY_LOW)
return true;