From: Zong-Zhe Yang Set BIT(RTW89_DM_REGD_LEARN) to dbgfs disable_dm if needing to disable regd learn mechanism at runtime. Read dbgfs disable_dm to show current status. Signed-off-by: Zong-Zhe Yang Signed-off-by: Ping-Ke Shih --- v4: no change v3: no change v2: no change --- drivers/net/wireless/realtek/rtw89/core.c | 8 ++++++++ drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/debug.c | 1 + drivers/net/wireless/realtek/rtw89/regd.c | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c index 8c4dd6f4a797..1cdf78a9a297 100644 --- a/drivers/net/wireless/realtek/rtw89/core.c +++ b/drivers/net/wireless/realtek/rtw89/core.c @@ -5552,6 +5552,7 @@ void rtw89_core_dm_disable_cfg(struct rtw89_dev *rtwdev, u32 new) { struct rtw89_hal *hal = &rtwdev->hal; u32 old = hal->disabled_dm_bitmap; + u32 changes = new ^ old; if (new == old) return; @@ -5559,6 +5560,13 @@ void rtw89_core_dm_disable_cfg(struct rtw89_dev *rtwdev, u32 new) hal->disabled_dm_bitmap = new; rtw89_debug(rtwdev, RTW89_DBG_STATE, "Disable DM: 0x%x -> 0x%x\n", old, new); + + if (changes & BIT(RTW89_DM_REGD_LEARN)) { + if (new & BIT(RTW89_DM_REGD_LEARN)) + rtw89_regd_learn_cancel(rtwdev); + else + rtw89_regd_learn_queue(rtwdev); + } } void rtw89_core_dm_disable_set(struct rtw89_dev *rtwdev, enum rtw89_dm_type type) diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h index d0a42f09fa13..27fe4c0fa316 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -6485,6 +6485,7 @@ enum rtw89_dm_type { RTW89_DM_INACTIVE_PS, RTW89_DM_DIG_PD, RTW89_DM_VCORE, + RTW89_DM_REGD_LEARN, }; #define RTW89_THERMAL_PROT_LV_MAX 5 diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c index 3b7f8a8090fa..3ebe4aa04e2b 100644 --- a/drivers/net/wireless/realtek/rtw89/debug.c +++ b/drivers/net/wireless/realtek/rtw89/debug.c @@ -4780,6 +4780,7 @@ static const struct rtw89_disabled_dm_info { DM_INFO(INACTIVE_PS), DM_INFO(DIG_PD), DM_INFO(VCORE), + DM_INFO(REGD_LEARN), }; static ssize_t diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c index 89be36ccd84b..f75ce808254c 100644 --- a/drivers/net/wireless/realtek/rtw89/regd.c +++ b/drivers/net/wireless/realtek/rtw89/regd.c @@ -715,6 +715,7 @@ void rtw89_regd_learn_queue(struct rtw89_dev *rtwdev) 4, 16, 64, 256, 1024, 4096, }; struct wiphy *wiphy = rtwdev->hw->wiphy; + struct rtw89_hal *hal = &rtwdev->hal; unsigned int delay; unsigned int index; @@ -726,6 +727,9 @@ void rtw89_regd_learn_queue(struct rtw89_dev *rtwdev) if (!regd_learn->shall_run) return; + if (hal->disabled_dm_bitmap & BIT(RTW89_DM_REGD_LEARN)) + return; + rtw89_debug(rtwdev, RTW89_DBG_REGD, "regd_learn: queue (retry=%u)\n", regd_learn->retry); -- 2.25.1