ath10k: configure thermal throttle while powering up
authorRajkumar Manoharan <rmanohar@qti.qualcomm.com>
Sun, 15 Mar 2015 15:06:22 +0000 (20:36 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 23 Mar 2015 15:16:37 +0000 (17:16 +0200)
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: Matthias Kaehlcke <mka@google.com>
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/debug.c
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/thermal.c
drivers/net/wireless/ath/ath10k/thermal.h

index 812365c..d684edf 100644 (file)
@@ -2008,6 +2008,7 @@ static ssize_t ath10k_write_quiet_period(struct file *file,
        }
        mutex_lock(&ar->conf_mutex);
        ar->thermal.quiet_period = period;
+       ath10k_thermal_set_throttling(ar);
        mutex_unlock(&ar->conf_mutex);
 
        return count;
index 2409147..60e416e 100644 (file)
@@ -3157,6 +3157,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
        ath10k_regd_update(ar);
 
        ath10k_spectral_start(ar);
+       ath10k_thermal_set_throttling(ar);
 
        mutex_unlock(&ar->conf_mutex);
        return 0;
index dc0ebf3..8640f41 100644 (file)
@@ -73,7 +73,6 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,
                                      unsigned long throttle_state)
 {
        struct ath10k *ar = cdev->devdata;
-       u32 period, duration, enabled;
        int num_bss, ret = 0;
 
        mutex_lock(&ar->conf_mutex);
@@ -99,19 +98,8 @@ ath10k_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,
                ret = -ENETDOWN;
                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;
+       ath10k_thermal_set_throttling(ar);
 out:
        mutex_unlock(&ar->conf_mutex);
        return ret;
@@ -186,6 +174,26 @@ static struct attribute *ath10k_hwmon_attrs[] = {
 };
 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)
 {
        struct thermal_cooling_device *cdev;
index 5728010..b610ea5 100644 (file)
@@ -40,6 +40,7 @@ struct ath10k_thermal {
 int ath10k_thermal_register(struct ath10k *ar);
 void ath10k_thermal_unregister(struct ath10k *ar);
 void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
+void ath10k_thermal_set_throttling(struct ath10k *ar);
 #else
 static inline int ath10k_thermal_register(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 /* _THERMAL_ */