summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.c1
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/wow.c32
3 files changed, 34 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath10k/hw.c b/drivers/net/wireless/ath/ath10k/hw.c
index 1d37b2c8426b..caf63b8bbba4 100644
--- a/drivers/net/wireless/ath/ath10k/hw.c
+++ b/drivers/net/wireless/ath/ath10k/hw.c
@@ -509,6 +509,7 @@ const struct ath10k_hw_values wcn3990_values = {
.num_target_ce_config_wlan = 12,
.ce_desc_meta_data_mask = 0xFFF0,
.ce_desc_meta_data_lsb = 4,
+ .default_listen_interval = 1,
};
struct fw_flag wcn3990_fw_flags = {
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index e0af0f766b02..8aa696ed2e72 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -369,6 +369,7 @@ struct ath10k_hw_values {
u8 num_target_ce_config_wlan;
u16 ce_desc_meta_data_mask;
u8 ce_desc_meta_data_lsb;
+ u8 default_listen_interval;
};
extern const struct ath10k_hw_values qca988x_values;
diff --git a/drivers/net/wireless/ath/ath10k/wow.c b/drivers/net/wireless/ath/ath10k/wow.c
index 77100d42f401..dfc4cf016c99 100644
--- a/drivers/net/wireless/ath/ath10k/wow.c
+++ b/drivers/net/wireless/ath/ath10k/wow.c
@@ -224,6 +224,31 @@ static int ath10k_wow_wakeup(struct ath10k *ar)
return 0;
}
+static int ath10k_config_wow_listen_interval(struct ath10k *ar)
+{
+ int ret;
+ u32 param = ar->wmi.vdev_param->listen_interval;
+ u8 listen_interval = ar->hw_values->default_listen_interval;
+ struct ath10k_vif *arvif;
+
+ if (!listen_interval)
+ return 0;
+
+ list_for_each_entry(arvif, &ar->arvifs, list) {
+ if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
+ continue;
+ ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
+ param, listen_interval);
+ if (ret) {
+ ath10k_err(ar, "failed to config LI for vdev_id: %d\n",
+ arvif->vdev_id);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
int ath10k_wow_op_suspend(struct ieee80211_hw *hw,
struct cfg80211_wowlan *wowlan)
{
@@ -252,6 +277,13 @@ int ath10k_wow_op_suspend(struct ieee80211_hw *hw,
goto cleanup;
}
+ ret = ath10k_config_wow_listen_interval(ar);
+ if (ret) {
+ ath10k_warn(ar, "failed to config wow listen interval: %d\n",
+ ret);
+ goto cleanup;
+ }
+
ret = ath10k_wow_enable(ar);
if (ret) {
ath10k_warn(ar, "failed to start wow: %d\n", ret);