Commit 8515b5c7 authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by Kalle Valo

ath10k: configure thermal throttle while powering up

Thermal throttling is not handled in software restart and device
bootup. Also it needs to be configured whenever quiet period got
updated. Fix that.
Reported-by: default avatarMatthias Kaehlcke <mka@google.com>
Signed-off-by: default avatarRajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 972f0513
...@@ -2008,6 +2008,7 @@ static ssize_t ath10k_write_quiet_period(struct file *file, ...@@ -2008,6 +2008,7 @@ static ssize_t ath10k_write_quiet_period(struct file *file,
} }
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
ar->thermal.quiet_period = period; ar->thermal.quiet_period = period;
ath10k_thermal_set_throttling(ar);
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
return count; return count;
......
...@@ -3157,6 +3157,7 @@ static int ath10k_start(struct ieee80211_hw *hw) ...@@ -3157,6 +3157,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
ath10k_regd_update(ar); ath10k_regd_update(ar);
ath10k_spectral_start(ar); ath10k_spectral_start(ar);
ath10k_thermal_set_throttling(ar);
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
return 0; return 0;
......
...@@ -73,7 +73,6 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev, ...@@ -73,7 +73,6 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,
unsigned long throttle_state) unsigned long throttle_state)
{ {
struct ath10k *ar = cdev->devdata; struct ath10k *ar = cdev->devdata;
u32 period, duration, enabled;
int num_bss, ret = 0; int num_bss, ret = 0;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -99,19 +98,8 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev, ...@@ -99,19 +98,8 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,
ret = -ENETDOWN; ret = -ENETDOWN;
goto out; goto out;
} }
period = ar->thermal.quiet_period;
duration = (period * throttle_state) / 100;
enabled = duration ? 1 : 0;
ret = ath10k_wmi_pdev_set_quiet_mode(ar, period, duration,
ATH10K_QUIET_START_OFFSET,
enabled);
if (ret) {
ath10k_warn(ar, "failed to set quiet mode period %u duarion %u enabled %u ret %d\n",
period, duration, enabled, ret);
goto out;
}
ar->thermal.throttle_state = throttle_state; ar->thermal.throttle_state = throttle_state;
ath10k_thermal_set_throttling(ar);
out: out:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
return ret; return ret;
...@@ -186,6 +174,26 @@ static struct attribute *ath10k_hwmon_attrs[] = { ...@@ -186,6 +174,26 @@ static struct attribute *ath10k_hwmon_attrs[] = {
}; };
ATTRIBUTE_GROUPS(ath10k_hwmon); ATTRIBUTE_GROUPS(ath10k_hwmon);
void ath10k_thermal_set_throttling(struct ath10k *ar)
{
u32 period, duration, enabled;
int ret;
lockdep_assert_held(&ar->conf_mutex);
period = ar->thermal.quiet_period;
duration = (period * ar->thermal.throttle_state) / 100;
enabled = duration ? 1 : 0;
ret = ath10k_wmi_pdev_set_quiet_mode(ar, period, duration,
ATH10K_QUIET_START_OFFSET,
enabled);
if (ret) {
ath10k_warn(ar, "failed to set quiet mode period %u duarion %u enabled %u ret %d\n",
period, duration, enabled, ret);
}
}
int ath10k_thermal_register(struct ath10k *ar) int ath10k_thermal_register(struct ath10k *ar)
{ {
struct thermal_cooling_device *cdev; struct thermal_cooling_device *cdev;
......
...@@ -40,6 +40,7 @@ struct ath10k_thermal { ...@@ -40,6 +40,7 @@ struct ath10k_thermal {
int ath10k_thermal_register(struct ath10k *ar); int ath10k_thermal_register(struct ath10k *ar);
void ath10k_thermal_unregister(struct ath10k *ar); void ath10k_thermal_unregister(struct ath10k *ar);
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
void ath10k_thermal_set_throttling(struct ath10k *ar);
#else #else
static inline int ath10k_thermal_register(struct ath10k *ar) static inline int ath10k_thermal_register(struct ath10k *ar)
{ {
...@@ -55,5 +56,9 @@ static inline void ath10k_thermal_event_temperature(struct ath10k *ar, ...@@ -55,5 +56,9 @@ static inline void ath10k_thermal_event_temperature(struct ath10k *ar,
{ {
} }
static inline void ath10k_thermal_set_throttling(struct ath10k *ar)
{
}
#endif #endif
#endif /* _THERMAL_ */ #endif /* _THERMAL_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment