Commit 312724cea1c02bd2215ac8e6a42ff9cb8ed3b4b4

ckolivas 2012-01-25T15:48:28

Adjust fan speed gently while in the optimal range when temperature is drifting to minimise overshoot in either direction.

diff --git a/adl.c b/adl.c
index cb79c59..198e1ed 100644
--- a/adl.c
+++ b/adl.c
@@ -869,6 +869,18 @@ static void fan_autotune(int gpu, int temp, int fanpercent, bool *fan_optimal)
 		if (opt_debug)
 			applog(LOG_DEBUG, "Temperature %d degrees below target, decreasing fanspeed", opt_hysteresis);
 		newpercent = ga->targetfan - 1;
+	} else {
+		/* We're in the optimal range, make minor adjustments if the
+		 * temp is still drifting */
+		if (fanpercent > bot && temp < ga->lasttemp && temp < ga->targettemp) {
+			if (opt_debug)
+				applog(LOG_DEBUG, "Temperature dropping while in target range, decreasing fanspeed");
+			newpercent = ga->targetfan - 1;
+		} else if (fanpercent < top && temp > ga->lasttemp && temp > ga->targettemp - opt_hysteresis) {
+			if (opt_debug)
+				applog(LOG_DEBUG, "Temperature rising while in target range, increasing fanspeed");
+			newpercent = ga->targetfan + 1;
+		}
 	}
 
 	if (newpercent > iMax)