summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordumbbell <dumbbell@FreeBSD.org>2013-08-30 19:21:12 +0000
committerdumbbell <dumbbell@FreeBSD.org>2013-08-30 19:21:12 +0000
commit49a58122d3abaaed6f6c0d66e422391bb6ef3de4 (patch)
treed3686f0ab2684ed41d8491376c34e2bf0e75c04e
parent8477c7824ca5deadf4314381a5fe5d0c3bfbab99 (diff)
downloadFreeBSD-src-49a58122d3abaaed6f6c0d66e422391bb6ef3de4.zip
FreeBSD-src-49a58122d3abaaed6f6c0d66e422391bb6ef3de4.tar.gz
acpi_thermal: Warn about insane _TMP temperature only once
A warning is emitted again if the temperature became briefly valid meanwhile. This avoids spamming the user when the sensor is broken. Other values (ie. not _TMP) always raise a warning.
-rw-r--r--sys/dev/acpica/acpi_thermal.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/sys/dev/acpica/acpi_thermal.c b/sys/dev/acpica/acpi_thermal.c
index 485da9e..4acf3c4 100644
--- a/sys/dev/acpica/acpi_thermal.c
+++ b/sys/dev/acpica/acpi_thermal.c
@@ -111,6 +111,7 @@ struct acpi_tz_softc {
struct acpi_tz_zone tz_zone; /*Thermal zone parameters*/
int tz_validchecks;
+ int tz_insane_tmp_notified;
/* passive cooling */
struct proc *tz_cooling_proc;
@@ -161,6 +162,8 @@ static driver_t acpi_tz_driver = {
sizeof(struct acpi_tz_softc),
};
+static char *acpi_tz_tmp_name = "_TMP";
+
static devclass_t acpi_tz_devclass;
DRIVER_MODULE(acpi_tz, acpi, acpi_tz_driver, acpi_tz_devclass, 0, 0);
MODULE_DEPEND(acpi_tz, acpi, 1, 1, 1);
@@ -456,12 +459,11 @@ acpi_tz_get_temperature(struct acpi_tz_softc *sc)
{
int temp;
ACPI_STATUS status;
- static char *tmp_name = "_TMP";
ACPI_FUNCTION_NAME ("acpi_tz_get_temperature");
/* Evaluate the thermal zone's _TMP method. */
- status = acpi_GetInteger(sc->tz_handle, tmp_name, &temp);
+ status = acpi_GetInteger(sc->tz_handle, acpi_tz_tmp_name, &temp);
if (ACPI_FAILURE(status)) {
ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),
"error fetching current temperature -- %s\n",
@@ -470,7 +472,7 @@ acpi_tz_get_temperature(struct acpi_tz_softc *sc)
}
/* Check it for validity. */
- acpi_tz_sanity(sc, &temp, tmp_name);
+ acpi_tz_sanity(sc, &temp, acpi_tz_tmp_name);
if (temp == -1)
return (FALSE);
@@ -696,10 +698,29 @@ static void
acpi_tz_sanity(struct acpi_tz_softc *sc, int *val, char *what)
{
if (*val != -1 && (*val < TZ_ZEROC || *val > TZ_ZEROC + 2000)) {
- device_printf(sc->tz_dev, "%s value is absurd, ignored (%d.%dC)\n",
- what, TZ_KELVTOC(*val));
+ /*
+ * If the value we are checking is _TMP, warn the user only
+ * once. This avoids spamming messages if, for instance, the
+ * sensor is broken and always returns an invalid temperature.
+ *
+ * This is only done for _TMP; other values always emit a
+ * warning.
+ */
+ if (what != acpi_tz_tmp_name || !sc->tz_insane_tmp_notified) {
+ device_printf(sc->tz_dev, "%s value is absurd, ignored (%d.%dC)\n",
+ what, TZ_KELVTOC(*val));
+
+ /* Don't warn the user again if the read value doesn't improve. */
+ if (what == acpi_tz_tmp_name)
+ sc->tz_insane_tmp_notified = 1;
+ }
*val = -1;
+ return;
}
+
+ /* This value is correct. Warn if it's incorrect again. */
+ if (what == acpi_tz_tmp_name)
+ sc->tz_insane_tmp_notified = 0;
}
/*
OpenPOWER on IntegriCloud