Author: nwhitehorn
Date: Fri Oct 25 03:55:52 2013
New Revision: 257093
URL: http://svnweb.freebsd.org/changeset/base/257093

Log:
  Be a little more suspicious of thermal sensors, which can have single
  crazy readings occasionally. One wild reading should not be enough to
  trigger a shutdown, so instead wait for several concerning readings in
  a row.
  
  PR:           powerpc/180593
  Submitted by: Julio Merino
  MFC after:    1 week

Modified:
  head/sys/powerpc/powermac/powermac_thermal.c

Modified: head/sys/powerpc/powermac/powermac_thermal.c
==============================================================================
--- head/sys/powerpc/powermac/powermac_thermal.c        Fri Oct 25 03:18:56 
2013        (r257092)
+++ head/sys/powerpc/powermac/powermac_thermal.c        Fri Oct 25 03:55:52 
2013        (r257093)
@@ -68,6 +68,8 @@ struct pmac_fan_le {
 struct pmac_sens_le {
        struct pmac_therm               *sensor;
        int                             last_val;
+#define MAX_CRITICAL_COUNT 6
+       int                             critical_count;
        SLIST_ENTRY(pmac_sens_le)       entries;
 };
 static SLIST_HEAD(pmac_fans, pmac_fan_le) fans = SLIST_HEAD_INITIALIZER(fans);
@@ -106,14 +108,27 @@ pmac_therm_manage_fans(void)
                        sensor->last_val = temp;
 
                if (sensor->last_val > sensor->sensor->max_temp) {
+                       sensor->critical_count++;
                        printf("WARNING: Current temperature (%s: %d.%d C) "
-                           "exceeds critical temperature (%d.%d C)! "
-                           "Shutting down!\n", sensor->sensor->name,
-                              (sensor->last_val - ZERO_C_TO_K) / 10,
-                              (sensor->last_val - ZERO_C_TO_K) % 10,
-                              (sensor->sensor->max_temp - ZERO_C_TO_K) / 10,
-                              (sensor->sensor->max_temp - ZERO_C_TO_K) % 10);
-                       shutdown_nice(RB_POWEROFF);
+                           "exceeds critical temperature (%d.%d C); "
+                           "count=%d\n",
+                           sensor->sensor->name,
+                           (sensor->last_val - ZERO_C_TO_K) / 10,
+                           (sensor->last_val - ZERO_C_TO_K) % 10,
+                           (sensor->sensor->max_temp - ZERO_C_TO_K) / 10,
+                           (sensor->sensor->max_temp - ZERO_C_TO_K) % 10,
+                           sensor->critical_count);
+                       if (sensor->critical_count >= MAX_CRITICAL_COUNT) {
+                               printf("WARNING: %s temperature exceeded "
+                                   "critical temperature %d times in a row; "
+                                   "shutting down!\n",
+                                   sensor->sensor->name,
+                                   sensor->critical_count);
+                               shutdown_nice(RB_POWEROFF);
+                       }
+               } else {
+                       if (sensor->critical_count > 0)
+                               sensor->critical_count--;
                }
        }
 
@@ -177,6 +192,8 @@ pmac_thermal_sensor_register(struct pmac
        list_entry = malloc(sizeof(struct pmac_sens_le), M_PMACTHERM,
            M_ZERO | M_WAITOK);
        list_entry->sensor = sensor;
+       list_entry->last_val = 0;
+       list_entry->critical_count = 0;
 
        SLIST_INSERT_HEAD(&sensors, list_entry, entries);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to