From: Zong-Zhe Yang 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 Signed-off-by: Ping-Ke Shih --- 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