[PATCH rtw-next 13/14] wifi: rtw89: skip tracking things when entity is paused

Ping-Ke Shih <[email protected]>
Newsgroups org.kernel.vger.linux-wireless
Message-ID <[email protected]>
From: Zong-Zhe Yang <[email protected]>

In some situation, such as HW scan/ROC, entity will temporarily be paused.
They usually have special handling on chanctx. However, things in tracking
work focus on the operating channel. It would be better not to count these
temporary periods. So, add a check before doing tracking things. Also, LPS
will be expected to be off before pausing entity and during the period when
entity is paused.

Besides, since the flow where to call rtw89_recalc_lps() is based on iface
adding/removing, disabling has no need to depend on whether entity mode has
became MCC. Before MCC starts, there must be at least two ifaces first. If
two ifaces exist, rtw89_recalc_lps() will have already disabled LPS.

Signed-off-by: Zong-Zhe Yang <[email protected]>
Signed-off-by: Ping-Ke Shih <[email protected]>
---
 drivers/net/wireless/realtek/rtw89/chan.c | 12 ++++++++++++
 drivers/net/wireless/realtek/rtw89/chan.h |  1 +
 drivers/net/wireless/realtek/rtw89/core.c |  6 ++++++
 drivers/net/wireless/realtek/rtw89/ps.c   |  6 ------
 4 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw89/chan.c b/drivers/net/wireless/realtek/rtw89/chan.c
index 7205fca8ac1a..a7ba47bd9abd 100644
--- a/drivers/net/wireless/realtek/rtw89/chan.c
+++ b/drivers/net/wireless/realtek/rtw89/chan.c
@@ -3230,6 +3230,9 @@ void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,
 
 	lockdep_assert_wiphy(rtwdev->hw->wiphy);
 
+	if (test_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
+		rtw89_warn(rtwdev, "LPS isn't off when pausing chanctx\n");
+
 	if (hal->entity_pause)
 		return;
 
@@ -3247,6 +3250,15 @@ void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,
 	hal->entity_pause = true;
 }
 
+bool rtw89_chanctx_paused(struct rtw89_dev *rtwdev)
+{
+	struct rtw89_hal *hal = &rtwdev->hal;
+
+	lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+	return hal->entity_pause;
+}
+
 static void rtw89_chanctx_proceed_cb(struct rtw89_dev *rtwdev,
 				     const struct rtw89_chanctx_cb_parm *parm)
 {
diff --git a/drivers/net/wireless/realtek/rtw89/chan.h b/drivers/net/wireless/realtek/rtw89/chan.h
index a9a5f1b307a2..f99aca9ef6a4 100644
--- a/drivers/net/wireless/realtek/rtw89/chan.h
+++ b/drivers/net/wireless/realtek/rtw89/chan.h
@@ -185,6 +185,7 @@ void rtw89_query_mr_chanctx_info(struct rtw89_dev *rtwdev, u8 inst_idx,
 void rtw89_chanctx_track(struct rtw89_dev *rtwdev);
 void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,
 			 const struct rtw89_chanctx_pause_parm *parm);
+bool __must_check rtw89_chanctx_paused(struct rtw89_dev *rtwdev);
 void rtw89_chanctx_proceed(struct rtw89_dev *rtwdev,
 			   const struct rtw89_chanctx_cb_parm *cb_parm);
 
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 24275c2250e7..80c4877e2dab 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -5496,6 +5496,9 @@ static void rtw89_track_ps_work(struct wiphy *wiphy, struct wiphy_work *work)
 	if (rtwdev->scanning)
 		return;
 
+	if (rtw89_chanctx_paused(rtwdev))
+		return;
+
 	if (rtwdev->lps_enabled && !rtwdev->btc.btc_ctrl_lps)
 		rtw89_enter_lps_track(rtwdev, RTW89_TFC_INTERVAL_100MS);
 }
@@ -5521,6 +5524,9 @@ static void rtw89_track_work(struct wiphy *wiphy, struct wiphy_work *work)
 	if (rtwdev->scanning)
 		return;
 
+	if (rtw89_chanctx_paused(rtwdev))
+		return;
+
 	rtw89_leave_lps(rtwdev);
 
 	if (tfc_changed) {
diff --git a/drivers/net/wireless/realtek/rtw89/ps.c b/drivers/net/wireless/realtek/rtw89/ps.c
index 31bb5dcd284a..34105d030537 100644
--- a/drivers/net/wireless/realtek/rtw89/ps.c
+++ b/drivers/net/wireless/realtek/rtw89/ps.c
@@ -363,13 +363,8 @@ void rtw89_recalc_lps(struct rtw89_dev *rtwdev)
 {
 	struct ieee80211_vif *vif, *found_vif = NULL;
 	struct rtw89_vif *rtwvif;
-	enum rtw89_entity_mode mode;
 	int count = 0;
 
-	mode = rtw89_get_entity_mode(rtwdev);
-	if (mode == RTW89_ENTITY_MODE_MCC)
-		goto disable_lps;
-
 	rtw89_for_each_rtwvif(rtwdev, rtwvif) {
 		vif = rtwvif_to_vif(rtwvif);
 
@@ -387,7 +382,6 @@ void rtw89_recalc_lps(struct rtw89_dev *rtwdev)
 		return;
 	}
 
-disable_lps:
 	rtw89_leave_lps(rtwdev);
 	rtwdev->lps_enabled = false;
 }
-- 
2.25.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.