ath11k: enable idle power save mode
authorCarl Huang <cjhuang@codeaurora.org>
Thu, 1 Oct 2020 09:34:49 +0000 (12:34 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 1 Oct 2020 19:33:17 +0000 (22:33 +0300)
Host sends wmi command to allow hardware enter idle power
save mode in ath11k_mac_op_start function.

hw parameter idle_ps indicates whether idle power save is supported.

Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1

Signed-off-by: Carl Huang <cjhuang@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1601544890-13450-8-git-send-email-kvalo@codeaurora.org
drivers/net/wireless/ath/ath11k/core.c
drivers/net/wireless/ath/ath11k/hw.h
drivers/net/wireless/ath/ath11k/mac.c

index e94d760..ebd6886 100644 (file)
@@ -64,6 +64,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                                        BIT(NL80211_IFTYPE_MESH_POINT),
                .supports_monitor = true,
                .supports_shadow_regs = false,
+               .idle_ps = false,
        },
        {
                .hw_rev = ATH11K_HW_IPQ6018_HW10,
@@ -100,6 +101,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                                        BIT(NL80211_IFTYPE_MESH_POINT),
                .supports_monitor = true,
                .supports_shadow_regs = false,
+               .idle_ps = false,
        },
        {
                .name = "qca6390 hw2.0",
@@ -135,6 +137,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
                                        BIT(NL80211_IFTYPE_AP),
                .supports_monitor = false,
                .supports_shadow_regs = true,
+               .idle_ps = true,
        },
 };
 
index 8e908bc..1dda425 100644 (file)
@@ -160,6 +160,7 @@ struct ath11k_hw_params {
        u16 interface_modes;
        bool supports_monitor;
        bool supports_shadow_regs;
+       bool idle_ps;
 };
 
 struct ath11k_hw_ops {
index 38a8c41..3f63a7b 100644 (file)
@@ -4208,6 +4208,15 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw)
        rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
                           &ab->pdevs[ar->pdev_idx]);
 
+       /* allow device to enter IMPS */
+       if (ab->hw_params.idle_ps) {
+               ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
+                                               1, pdev->pdev_id);
+               if (ret) {
+                       ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
+                       goto err;
+               }
+       }
        return 0;
 
 err: