Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Apr 2008 00:17:15 +0300
From:      Andriy Gapon <avg@icyb.net.ua>
To:        Nate Lawson <nate@root.org>
Cc:        freebsd-acpi@freebsd.org
Subject:   Re: initial value of tz_active
Message-ID:  <4810F8DB.3090507@icyb.net.ua>
In-Reply-To: <480FBA31.2050202@icyb.net.ua>
References:  <480F8E2E.8000502@icyb.net.ua> <480F921D.3050505@root.org> <480FBA31.2050202@icyb.net.ua>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
on 24/04/2008 01:37 Andriy Gapon said the following:
> I agree - this is a better approach.
> On a technical level  - maybe use TZ_ACTIVE_UNKNOWN=-2 instead of a new
> variable.
> I'll try to work on this somewhere in the middle of May.

I've couple of spare hours this evening, so I decided to not delay this
small thing until after the vacation.
Result is attached.
My short testing shows that the patch does the job and doesn't introduce
any problems.

-- 
Andriy Gapon

[-- Attachment #2 --]
diff --git a/sys/dev/acpica/acpi_thermal.c b/sys/dev/acpica/acpi_thermal.c
index 18432ee..f87d6df 100644
--- a/sys/dev/acpica/acpi_thermal.c
+++ b/sys/dev/acpica/acpi_thermal.c
@@ -90,6 +90,7 @@ struct acpi_tz_softc {
     int				tz_temperature;	/*Current temperature*/
     int				tz_active;	/*Current active cooling*/
 #define TZ_ACTIVE_NONE		-1
+#define TZ_ACTIVE_UNKNOWN	-2
     int				tz_requested;	/*Minimum active cooling*/
     int				tz_thflags;	/*Current temp-related flags*/
 #define TZ_THFLAG_NONE		0
@@ -202,7 +203,7 @@ acpi_tz_attach(device_t dev)
     sc->tz_dev = dev;
     sc->tz_handle = acpi_get_handle(dev);
     sc->tz_requested = TZ_ACTIVE_NONE;
-    sc->tz_active = TZ_ACTIVE_NONE;
+    sc->tz_active = TZ_ACTIVE_UNKNOWN;
     sc->tz_thflags = TZ_THFLAG_NONE;
     sc->tz_cooling_proc = NULL;
     sc->tz_cooling_proc_running = FALSE;
@@ -520,6 +521,7 @@ acpi_tz_monitor(void *Context)
      * minimum cooling run time if requested.
      */
     if (acpi_tz_min_runtime > 0 && sc->tz_active != TZ_ACTIVE_NONE &&
+	sc->tz_active != TZ_ACTIVE_UNKNOWN &&
 	(newactive == TZ_ACTIVE_NONE || newactive > sc->tz_active)) {
 
 	getnanotime(&curtime);
@@ -543,6 +545,22 @@ acpi_tz_monitor(void *Context)
 	newflags |= TZ_THFLAG_CRT;
 
     /* If the active cooling state has changed, we have to switch things. */
+    if (sc->tz_active == TZ_ACTIVE_UNKNOWN) {
+	/* We don't know which cooling device is on or off,
+	 * so stop them all, because we now know which
+	 * should be on (if any).
+	 */
+	for (i = 0; i < TZ_NUMLEVELS; i++) {
+	    if (sc->tz_zone.al[i].Pointer != NULL) {
+		acpi_ForeachPackageObject(
+		    (ACPI_OBJECT *)sc->tz_zone.al[i].Pointer,
+		    acpi_tz_switch_cooler_off, sc);
+	    }
+	}
+	/* now we know that all devices are off */
+	sc->tz_active = TZ_ACTIVE_NONE;
+    }
+
     if (newactive != sc->tz_active) {
 	/* Turn off the cooling devices that are on, if any are */
 	if (sc->tz_active != TZ_ACTIVE_NONE)
help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4810F8DB.3090507>