|
@@ -427,6 +427,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
|
|
|
const struct iwl_tt_params *params = mvm->thermal_throttle.params;
|
|
|
struct iwl_mvm_tt_mgmt *tt = &mvm->thermal_throttle;
|
|
|
s32 temperature = mvm->temperature;
|
|
|
+ bool throttle_enable = false;
|
|
|
int i;
|
|
|
u32 tx_backoff;
|
|
|
|
|
@@ -445,6 +446,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
|
|
|
ieee80211_iterate_active_interfaces_atomic(
|
|
|
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
|
|
iwl_mvm_tt_smps_iterator, mvm);
|
|
|
+ throttle_enable = true;
|
|
|
} else if (tt->dynamic_smps &&
|
|
|
temperature <= params->dynamic_smps_exit) {
|
|
|
IWL_DEBUG_TEMP(mvm, "Disable dynamic SMPS\n");
|
|
@@ -456,10 +458,12 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
|
|
|
}
|
|
|
|
|
|
if (params->support_tx_protection) {
|
|
|
- if (temperature >= params->tx_protection_entry)
|
|
|
+ if (temperature >= params->tx_protection_entry) {
|
|
|
iwl_mvm_tt_tx_protection(mvm, true);
|
|
|
- else if (temperature <= params->tx_protection_exit)
|
|
|
+ throttle_enable = true;
|
|
|
+ } else if (temperature <= params->tx_protection_exit) {
|
|
|
iwl_mvm_tt_tx_protection(mvm, false);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (params->support_tx_backoff) {
|
|
@@ -469,9 +473,22 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm)
|
|
|
break;
|
|
|
tx_backoff = params->tx_backoff[i].backoff;
|
|
|
}
|
|
|
+ if (tx_backoff != 0)
|
|
|
+ throttle_enable = true;
|
|
|
if (tt->tx_backoff != tx_backoff)
|
|
|
iwl_mvm_tt_tx_backoff(mvm, tx_backoff);
|
|
|
}
|
|
|
+
|
|
|
+ if (!tt->throttle && throttle_enable) {
|
|
|
+ IWL_WARN(mvm,
|
|
|
+ "Due to high temperature thermal throttling initiated\n");
|
|
|
+ tt->throttle = true;
|
|
|
+ } else if (tt->throttle && !tt->dynamic_smps && tt->tx_backoff == 0 &&
|
|
|
+ temperature <= params->tx_protection_exit) {
|
|
|
+ IWL_WARN(mvm,
|
|
|
+ "Temperature is back to normal thermal throttling stopped\n");
|
|
|
+ tt->throttle = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static const struct iwl_tt_params iwl7000_tt_params = {
|
|
@@ -502,6 +519,7 @@ void iwl_mvm_tt_initialize(struct iwl_mvm *mvm)
|
|
|
|
|
|
IWL_DEBUG_TEMP(mvm, "Initialize Thermal Throttling\n");
|
|
|
tt->params = &iwl7000_tt_params;
|
|
|
+ tt->throttle = false;
|
|
|
INIT_DELAYED_WORK(&tt->ct_kill_exit, check_exit_ctkill);
|
|
|
}
|
|
|
|