ath11k: purge rx pktlog when entering WoW
authorCarl Huang <quic_cjhuang@quicinc.com>
Mon, 14 Mar 2022 05:18:16 +0000 (07:18 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Fri, 18 Mar 2022 15:35:41 +0000 (17:35 +0200)
This change is to purge rx pktlog when entering WoW and reap
the mon_status buffer to keep it empty. When leaving WoW, host
restarts the reap timer. In WoW state, it's not allowed to feed
into mon_status rings per firmware team's recommendation.

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

Signed-off-by: Carl Huang <quic_cjhuang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/1644308006-22784-5-git-send-email-quic_cjhuang@quicinc.com
drivers/net/wireless/ath/ath11k/wow.c

index 50dd50944eddfa92be6cfcd329c7a3bbb6e8be47..602b8f4c598510aac5151172f4fa41cdde041506 100644 (file)
@@ -13,6 +13,7 @@
 #include "debug.h"
 #include "wmi.h"
 #include "wow.h"
+#include "dp_rx.h"
 
 static const struct wiphy_wowlan_support ath11k_wowlan_support = {
        .flags = WIPHY_WOWLAN_DISCONNECT |
@@ -566,6 +567,14 @@ int ath11k_wow_op_suspend(struct ieee80211_hw *hw,
 
        mutex_lock(&ar->conf_mutex);
 
+       ret = ath11k_dp_rx_pktlog_stop(ar->ab, true);
+       if (ret) {
+               ath11k_warn(ar->ab,
+                           "failed to stop dp rx (and timer) pktlog during wow suspend: %d\n",
+                           ret);
+               goto exit;
+       }
+
        ret =  ath11k_wow_cleanup(ar);
        if (ret) {
                ath11k_warn(ar->ab, "failed to clear wow wakeup events: %d\n",
@@ -599,6 +608,14 @@ int ath11k_wow_op_suspend(struct ieee80211_hw *hw,
                goto cleanup;
        }
 
+       ret = ath11k_dp_rx_pktlog_stop(ar->ab, false);
+       if (ret) {
+               ath11k_warn(ar->ab,
+                           "failed to stop dp rx pktlog during wow suspend: %d\n",
+                           ret);
+               goto cleanup;
+       }
+
        ath11k_ce_stop_shadow_timers(ar->ab);
        ath11k_dp_stop_shadow_timers(ar->ab);
 
@@ -649,6 +666,12 @@ int ath11k_wow_op_resume(struct ieee80211_hw *hw)
        ath11k_hif_ce_irq_enable(ar->ab);
        ath11k_hif_irq_enable(ar->ab);
 
+       ret = ath11k_dp_rx_pktlog_start(ar->ab);
+       if (ret) {
+               ath11k_warn(ar->ab, "failed to start rx pktlog from wow: %d\n", ret);
+               return ret;
+       }
+
        ret = ath11k_wow_wakeup(ar->ab);
        if (ret) {
                ath11k_warn(ar->ab, "failed to wakeup from wow: %d\n", ret);