Decrease avalon frequency in auto mode if we are unable to maintain the temperature in the optimal range.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
diff --git a/driver-avalon.c b/driver-avalon.c
index c3b3aa7..eee6d3a 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -885,15 +885,19 @@ static void *avalon_send_tasks(void *userdata)
if (opt_avalon_auto && info->auto_queued >= AVALON_AUTO_CYCLE) {
mutex_lock(&info->lock);
- if (info->auto_nonces >= (AVALON_AUTO_CYCLE * 19 / 20) &&
- info->auto_nonces <= (AVALON_AUTO_CYCLE * 21 / 20)) {
- int total = info->auto_nonces + info->auto_hw;
-
- /* Try to keep hw errors ~1% */
- if (info->auto_hw * 200 < total)
- avalon_inc_freq(info);
- else if (info->auto_hw * 100 > total)
- avalon_dec_freq(info);
+ if (!info->optimal) {
+ applog(LOG_WARNING, "AVA%i: Above optimal temperature, throttling",
+ avalon->device_id);
+ avalon_dec_freq(info);
+ } else if (info->auto_nonces >= (AVALON_AUTO_CYCLE * 19 / 20) &&
+ info->auto_nonces <= (AVALON_AUTO_CYCLE * 21 / 20)) {
+ int total = info->auto_nonces + info->auto_hw;
+
+ /* Try to keep hw errors ~1% */
+ if (info->auto_hw * 200 < total)
+ avalon_inc_freq(info);
+ else if (info->auto_hw * 100 > total)
+ avalon_dec_freq(info);
}
avalon_reset_auto(info);
mutex_unlock(&info->lock);
@@ -1083,6 +1087,10 @@ static inline void adjust_fan(struct avalon_info *info)
temp_drop(info, temp_new);
}
info->temp_old = temp_new;
+ if (info->temp_old <= opt_avalon_temp)
+ info->optimal = true;
+ else
+ info->optimal = false;
}
static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *info,
diff --git a/driver-avalon.h b/driver-avalon.h
index 9454f24..4ab16d9 100644
--- a/driver-avalon.h
+++ b/driver-avalon.h
@@ -134,6 +134,7 @@ struct avalon_info {
bool idle;
bool reset;
bool overheat;
+ bool optimal;
};
#define AVALON_WRITE_SIZE (sizeof(struct avalon_task))