ath10k: allow user to toggle ani_enable via debugfs
authorAshok Raj Nagarajan <arnagara@qti.qualcomm.com>
Thu, 19 Mar 2015 11:08:00 +0000 (16:38 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 23 Mar 2015 15:20:26 +0000 (17:20 +0200)
Now that ANI is enabled by default, allow user to disable or enable ANI feature
from debugfs

echo 0|1 > /sys/kernel/debug/ieee80211/phyX/ath10k/ani_enable

Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/debug.c
drivers/net/wireless/ath/ath10k/mac.c

index 39a08f5..cfd37a6 100644 (file)
@@ -520,6 +520,8 @@ struct ath10k {
        u32 ht_cap_info;
        u32 vht_cap_info;
        u32 num_rf_chains;
+       /* protected by conf_mutex */
+       bool ani_enabled;
 
        DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT);
 
index d684edf..51cf536 100644 (file)
@@ -1708,6 +1708,61 @@ static int ath10k_debug_cal_data_release(struct inode *inode,
        return 0;
 }
 
+static ssize_t ath10k_write_ani_enable(struct file *file,
+                                      const char __user *user_buf,
+                                      size_t count, loff_t *ppos)
+{
+       struct ath10k *ar = file->private_data;
+       int ret;
+       u8 enable;
+
+       if (kstrtou8_from_user(user_buf, count, 0, &enable))
+               return -EINVAL;
+
+       mutex_lock(&ar->conf_mutex);
+
+       if (ar->ani_enabled == enable) {
+               ret = count;
+               goto exit;
+       }
+
+       ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->ani_enable,
+                                       enable);
+       if (ret) {
+               ath10k_warn(ar, "ani_enable failed from debugfs: %d\n", ret);
+               goto exit;
+       }
+       ar->ani_enabled = enable;
+
+       ret = count;
+
+exit:
+       mutex_unlock(&ar->conf_mutex);
+
+       return ret;
+}
+
+static ssize_t ath10k_read_ani_enable(struct file *file, char __user *user_buf,
+                                     size_t count, loff_t *ppos)
+{
+       struct ath10k *ar = file->private_data;
+       int len = 0;
+       char buf[32];
+
+       len = scnprintf(buf, sizeof(buf) - len, "%d\n",
+                       ar->ani_enabled);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
+static const struct file_operations fops_ani_enable = {
+       .read = ath10k_read_ani_enable,
+       .write = ath10k_write_ani_enable,
+       .open = simple_open,
+       .owner = THIS_MODULE,
+       .llseek = default_llseek,
+};
+
 static const struct file_operations fops_cal_data = {
        .open = ath10k_debug_cal_data_open,
        .read = ath10k_debug_cal_data_read,
@@ -2112,6 +2167,9 @@ int ath10k_debug_register(struct ath10k *ar)
        debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy,
                            ar, &fops_cal_data);
 
+       debugfs_create_file("ani_enable", S_IRUSR | S_IWUSR,
+                           ar->debug.debugfs_phy, ar, &fops_ani_enable);
+
        debugfs_create_file("nf_cal_period", S_IRUSR | S_IWUSR,
                            ar->debug.debugfs_phy, ar, &fops_nf_cal_period);
 
index 76a9bed..73a9d38 100644 (file)
@@ -3161,6 +3161,8 @@ static int ath10k_start(struct ieee80211_hw *hw)
                goto err_core_stop;
        }
 
+       ar->ani_enabled = true;
+
        ar->num_started_vdevs = 0;
        ath10k_regd_update(ar);