Commit a7bd3e99 authored by Peter Oh's avatar Peter Oh Committed by Kalle Valo

ath10k: add new wmi interface of NF cal period

Introduce a new wmi interface controls noise floor (NF) calibration
period via debugfs as firmware has introduced it on v10.2.

It allows users to modify frequency of NF calibration in millisecond
and changes RSSI reporting frequency consequently.
Short calibration period will trigger more frequent NF calibration,
so that RSSI reported in receive frames is more realistic.

Till now calibration was done at 30 seconds.
Signed-off-by: default avatarPeter Oh <poh@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent b43bf97e
...@@ -327,6 +327,7 @@ struct ath10k_debug { ...@@ -327,6 +327,7 @@ struct ath10k_debug {
u32 fw_dbglog_mask; u32 fw_dbglog_mask;
u32 pktlog_filter; u32 pktlog_filter;
u32 reg_addr; u32 reg_addr;
u32 nf_cal_period;
u8 htt_max_amsdu; u8 htt_max_amsdu;
u8 htt_max_ampdu; u8 htt_max_ampdu;
......
...@@ -1608,6 +1608,73 @@ static const struct file_operations fops_cal_data = { ...@@ -1608,6 +1608,73 @@ static const struct file_operations fops_cal_data = {
.llseek = default_llseek, .llseek = default_llseek,
}; };
static ssize_t ath10k_read_nf_cal_period(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
{
struct ath10k *ar = file->private_data;
unsigned int len;
char buf[32];
len = scnprintf(buf, sizeof(buf), "%d\n",
ar->debug.nf_cal_period);
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
}
static ssize_t ath10k_write_nf_cal_period(struct file *file,
const char __user *user_buf,
size_t count, loff_t *ppos)
{
struct ath10k *ar = file->private_data;
unsigned long period;
int ret;
ret = kstrtoul_from_user(user_buf, count, 0, &period);
if (ret)
return ret;
if (period > WMI_PDEV_PARAM_CAL_PERIOD_MAX)
return -EINVAL;
/* there's no way to switch back to the firmware default */
if (period == 0)
return -EINVAL;
mutex_lock(&ar->conf_mutex);
ar->debug.nf_cal_period = period;
if (ar->state != ATH10K_STATE_ON) {
/* firmware is not running, nothing else to do */
ret = count;
goto exit;
}
ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->cal_period,
ar->debug.nf_cal_period);
if (ret) {
ath10k_warn(ar, "cal period cfg failed from debugfs: %d\n",
ret);
goto exit;
}
ret = count;
exit:
mutex_unlock(&ar->conf_mutex);
return ret;
}
static const struct file_operations fops_nf_cal_period = {
.read = ath10k_read_nf_cal_period,
.write = ath10k_write_nf_cal_period,
.open = simple_open,
.owner = THIS_MODULE,
.llseek = default_llseek,
};
int ath10k_debug_start(struct ath10k *ar) int ath10k_debug_start(struct ath10k *ar)
{ {
int ret; int ret;
...@@ -1643,6 +1710,16 @@ int ath10k_debug_start(struct ath10k *ar) ...@@ -1643,6 +1710,16 @@ int ath10k_debug_start(struct ath10k *ar)
ath10k_warn(ar, "failed to disable pktlog: %d\n", ret); ath10k_warn(ar, "failed to disable pktlog: %d\n", ret);
} }
if (ar->debug.nf_cal_period) {
ret = ath10k_wmi_pdev_set_param(ar,
ar->wmi.pdev_param->cal_period,
ar->debug.nf_cal_period);
if (ret)
/* not serious */
ath10k_warn(ar, "cal period cfg failed from debug start: %d\n",
ret);
}
return ret; return ret;
} }
...@@ -1881,6 +1958,9 @@ int ath10k_debug_register(struct ath10k *ar) ...@@ -1881,6 +1958,9 @@ int ath10k_debug_register(struct ath10k *ar)
debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy, debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy,
ar, &fops_cal_data); ar, &fops_cal_data);
debugfs_create_file("nf_cal_period", S_IRUSR | S_IWUSR,
ar->debug.debugfs_phy, ar, &fops_nf_cal_period);
if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) { if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
debugfs_create_file("dfs_simulate_radar", S_IWUSR, debugfs_create_file("dfs_simulate_radar", S_IWUSR,
ar->debug.debugfs_phy, ar, ar->debug.debugfs_phy, ar,
......
...@@ -2096,6 +2096,7 @@ static struct wmi_pdev_param_map wmi_tlv_pdev_param_map = { ...@@ -2096,6 +2096,7 @@ static struct wmi_pdev_param_map wmi_tlv_pdev_param_map = {
.fast_channel_reset = WMI_TLV_PDEV_PARAM_UNSUPPORTED, .fast_channel_reset = WMI_TLV_PDEV_PARAM_UNSUPPORTED,
.burst_dur = WMI_TLV_PDEV_PARAM_BURST_DUR, .burst_dur = WMI_TLV_PDEV_PARAM_BURST_DUR,
.burst_enable = WMI_TLV_PDEV_PARAM_BURST_ENABLE, .burst_enable = WMI_TLV_PDEV_PARAM_BURST_ENABLE,
.cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
}; };
static struct wmi_vdev_param_map wmi_tlv_vdev_param_map = { static struct wmi_vdev_param_map wmi_tlv_vdev_param_map = {
......
...@@ -436,6 +436,7 @@ static struct wmi_pdev_param_map wmi_pdev_param_map = { ...@@ -436,6 +436,7 @@ static struct wmi_pdev_param_map wmi_pdev_param_map = {
.fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED, .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
.burst_dur = WMI_PDEV_PARAM_UNSUPPORTED, .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
.burst_enable = WMI_PDEV_PARAM_UNSUPPORTED, .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
.cal_period = WMI_PDEV_PARAM_UNSUPPORTED,
}; };
static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
...@@ -488,6 +489,7 @@ static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { ...@@ -488,6 +489,7 @@ static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
.fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
.burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
.burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
.cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD,
}; };
/* firmware 10.2 specific mappings */ /* firmware 10.2 specific mappings */
......
...@@ -2583,6 +2583,7 @@ struct wmi_pdev_param_map { ...@@ -2583,6 +2583,7 @@ struct wmi_pdev_param_map {
u32 fast_channel_reset; u32 fast_channel_reset;
u32 burst_dur; u32 burst_dur;
u32 burst_enable; u32 burst_enable;
u32 cal_period;
}; };
#define WMI_PDEV_PARAM_UNSUPPORTED 0 #define WMI_PDEV_PARAM_UNSUPPORTED 0
...@@ -2803,6 +2804,9 @@ struct wmi_pdev_set_param_cmd { ...@@ -2803,6 +2804,9 @@ struct wmi_pdev_set_param_cmd {
__le32 param_value; __le32 param_value;
} __packed; } __packed;
/* valid period is 1 ~ 60000ms, unit in millisecond */
#define WMI_PDEV_PARAM_CAL_PERIOD_MAX 60000
struct wmi_pdev_get_tpc_config_cmd { struct wmi_pdev_get_tpc_config_cmd {
/* parameter */ /* parameter */
__le32 param; __le32 param;
......
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