Re: [PATCH v5 rtw-next 1/7] wifi: rtw88: move the shared 88xxa init helpers into the core

From: Bitterblue Smith

Date: Wed Sep 30 2026 - 14:32:03 EST


On 30/09/2026 12:15, Luka Gejak wrote:
> The adaptive control, EDCA and CCK power detect helpers in rtw88xxa.c
> program values that are not specific to that chip family. The RTL8723B
> needs all three of them, which would make that chip select RTW88_88XXA
> and pull in a whole chip module for three helpers.
>
> Move the CCK power detect setter to phy.c as rtw_phy_cck_pd_set(), where
> the rest of the CCK power detect code and the level enum already live,
> and the two MAC init helpers to mac.c as rtw_mac_init_adaptive_ctrl()
> and rtw_mac_init_edca(). The chips that need them call the core
> versions, so rtw88xxa.c no longer provides any of them.
>
> The two REG_USTIME_* writes are not carried over. rtw88xxa_power_on()
> writes the same values a few lines later, and rtw_set_channel_mac()
> writes them again on every channel set, so the register state of the
> existing chips does not change.
>
> Signed-off-by: Luka Gejak <luka.gejak@xxxxxxxxx>
> ---
> drivers/net/wireless/realtek/rtw88/mac.c | 22 +++++++
> drivers/net/wireless/realtek/rtw88/mac.h | 2 +
> drivers/net/wireless/realtek/rtw88/phy.c | 38 +++++++++++
> drivers/net/wireless/realtek/rtw88/phy.h | 1 +
> drivers/net/wireless/realtek/rtw88/rtw8812a.c | 2 +-
> drivers/net/wireless/realtek/rtw88/rtw8821a.c | 2 +-
> drivers/net/wireless/realtek/rtw88/rtw88xxa.c | 65 +------------------
> drivers/net/wireless/realtek/rtw88/rtw88xxa.h | 1 -
> 8 files changed, 67 insertions(+), 66 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
> index eaa928bab240..83f142f61df5 100644
> --- a/drivers/net/wireless/realtek/rtw88/mac.c
> +++ b/drivers/net/wireless/realtek/rtw88/mac.c
> @@ -1419,3 +1419,25 @@ int rtw_mac_postinit(struct rtw_dev *rtwdev)
>
> return chip->ops->mac_postinit(rtwdev);
> }
> +
> +void rtw_mac_init_adaptive_ctrl(struct rtw_dev *rtwdev)
> +{
> + rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, 0xffff1);
> + rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030);
> +}
> +EXPORT_SYMBOL(rtw_mac_init_adaptive_ctrl);
> +
> +void rtw_mac_init_edca(struct rtw_dev *rtwdev)
> +{
> + rtw_write16(rtwdev, REG_SPEC_SIFS, 0x100a);
> + rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, 0x100a);
> +
> + rtw_write16(rtwdev, REG_SIFS, 0x100a);
> + rtw_write16(rtwdev, REG_SIFS + 2, 0x100a);
> +
> + rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B);
> + rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F);
> + rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324);
> + rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226);
> +}
> +EXPORT_SYMBOL(rtw_mac_init_edca);

No one said anything about moving these functions. Please put them back.

> diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h
> index b73af90ee1d7..b7adc4dd0255 100644
> --- a/drivers/net/wireless/realtek/rtw88/mac.h
> +++ b/drivers/net/wireless/realtek/rtw88/mac.h
> @@ -30,6 +30,8 @@
>
> void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
> u8 primary_ch_idx);
> +void rtw_mac_init_adaptive_ctrl(struct rtw_dev *rtwdev);
> +void rtw_mac_init_edca(struct rtw_dev *rtwdev);
> int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
> const struct rtw_pwr_seq_cmd * const *cmd_seq);
> int rtw_mac_power_on(struct rtw_dev *rtwdev);
> diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
> index e2ac5c6fd500..ee16474ac026 100644
> --- a/drivers/net/wireless/realtek/rtw88/phy.c
> +++ b/drivers/net/wireless/realtek/rtw88/phy.c
> @@ -811,6 +811,44 @@ static void rtw_phy_cck_pd(struct rtw_dev *rtwdev)
> chip->ops->cck_pd_set(rtwdev, level);
> }
>
> +void rtw_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
> +{
> + static const u8 pd[CCK_PD_LV_MAX] = {0x40, 0x83, 0xcd, 0xdd, 0xed};
> + struct rtw_dm_info *dm_info = &rtwdev->dm_info;
> +
> + /* Override rtw_phy_cck_pd_lv_link(). It implements something
> + * like type 2/3/4. We need type 1 here.
> + */
> + if (rtw_is_assoc(rtwdev)) {
> + if (dm_info->min_rssi > 60) {
> + new_lvl = CCK_PD_LV3;
> + } else if (dm_info->min_rssi > 35) {
> + new_lvl = CCK_PD_LV2;
> + } else if (dm_info->min_rssi > 20) {
> + if (dm_info->cck_fa_avg > 500)
> + new_lvl = CCK_PD_LV2;
> + else if (dm_info->cck_fa_avg < 250)
> + new_lvl = CCK_PD_LV1;
> + else
> + return;
> + } else {
> + new_lvl = CCK_PD_LV1;
> + }
> + }
> +
> + rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
> + dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
> +
> + if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
> + return;
> +
> + dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
> + dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
> +
> + rtw_write8(rtwdev, REG_CCK_PD_TH, pd[new_lvl]);
> +}
> +EXPORT_SYMBOL(rtw_phy_cck_pd_set);
> +
> static void rtw_phy_pwr_track(struct rtw_dev *rtwdev)
> {
> rtwdev->chip->ops->pwr_track(rtwdev);
> diff --git a/drivers/net/wireless/realtek/rtw88/phy.h b/drivers/net/wireless/realtek/rtw88/phy.h
> index 8449936497bb..8a843aac7350 100644
> --- a/drivers/net/wireless/realtek/rtw88/phy.h
> +++ b/drivers/net/wireless/realtek/rtw88/phy.h
> @@ -65,6 +65,7 @@ void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
> struct rtw_swing_table *swing_table);
> void rtw_phy_set_edcca_th(struct rtw_dev *rtwdev, u8 l2h, u8 h2l);
> void rtw_phy_adaptivity_set_mode(struct rtw_dev *rtwdev);
> +void rtw_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl);
> void rtw_phy_parsing_cfo(struct rtw_dev *rtwdev,
> struct rtw_rx_pkt_stat *pkt_stat);
> void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev);
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812a.c b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
> index 2078eb6e3628..781b66ccde67 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
> +++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
> @@ -929,7 +929,7 @@ static const struct rtw_chip_ops rtw8812a_ops = {
> .set_ampdu_factor = NULL,
> .false_alarm_statistics = rtw88xxa_false_alarm_statistics,
> .phy_calibration = rtw8812a_phy_calibration,
> - .cck_pd_set = rtw88xxa_phy_cck_pd_set,
> + .cck_pd_set = rtw_phy_cck_pd_set,
> .pwr_track = rtw8812a_pwr_track,
> .config_bfee = NULL,
> .set_gid_table = NULL,
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821a.c b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
> index cab85203b828..6096d3b8e41b 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
> +++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
> @@ -875,7 +875,7 @@ static const struct rtw_chip_ops rtw8821a_ops = {
> .set_ampdu_factor = NULL,
> .false_alarm_statistics = rtw88xxa_false_alarm_statistics,
> .phy_calibration = rtw8821a_phy_calibration,
> - .cck_pd_set = rtw88xxa_phy_cck_pd_set,
> + .cck_pd_set = rtw_phy_cck_pd_set,
> .pwr_track = rtw8821a_pwr_track,
> .config_bfee = NULL,
> .set_gid_table = NULL,
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
> index 2eaadcfec4cb..c95405eacfa3 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
> +++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
> @@ -520,29 +520,6 @@ static void rtw88xxa_init_wmac_setting(struct rtw_dev *rtwdev)
> rtw_write32(rtwdev, REG_MAR + 4, 0xffffffff);
> }
>
> -static void rtw88xxa_init_adaptive_ctrl(struct rtw_dev *rtwdev)
> -{
> - rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, 0xffff1);
> - rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030);
> -}
> -
> -static void rtw88xxa_init_edca(struct rtw_dev *rtwdev)
> -{
> - rtw_write16(rtwdev, REG_SPEC_SIFS, 0x100a);
> - rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, 0x100a);
> -
> - rtw_write16(rtwdev, REG_SIFS, 0x100a);
> - rtw_write16(rtwdev, REG_SIFS + 2, 0x100a);
> -
> - rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B);
> - rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F);
> - rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324);
> - rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226);
> -
> - rtw_write8(rtwdev, REG_USTIME_TSF, 0x50);
> - rtw_write8(rtwdev, REG_USTIME_EDCA, 0x50);
> -}
> -
> static void rtw88xxau_tx_aggregation(struct rtw_dev *rtwdev)
> {
> const struct rtw_chip_info *chip = rtwdev->chip;
> @@ -1103,8 +1080,8 @@ int rtw88xxa_power_on(struct rtw_dev *rtwdev)
> rtw_write32_mask(rtwdev, REG_CR, 0x30000, 0x2);
>
> rtw88xxa_init_wmac_setting(rtwdev);
> - rtw88xxa_init_adaptive_ctrl(rtwdev);
> - rtw88xxa_init_edca(rtwdev);
> + rtw_mac_init_adaptive_ctrl(rtwdev);
> + rtw_mac_init_edca(rtwdev);
>
> rtw_write8_set(rtwdev, REG_FWHW_TXQ_CTRL, BIT(7));
> rtw_write8(rtwdev, REG_ACKTO, 0x80);
> @@ -1947,44 +1924,6 @@ void rtw88xxa_phy_pwrtrack(struct rtw_dev *rtwdev,
> }
> EXPORT_SYMBOL(rtw88xxa_phy_pwrtrack);
>
> -void rtw88xxa_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
> -{
> - static const u8 pd[CCK_PD_LV_MAX] = {0x40, 0x83, 0xcd, 0xdd, 0xed};
> - struct rtw_dm_info *dm_info = &rtwdev->dm_info;
> -
> - /* Override rtw_phy_cck_pd_lv_link(). It implements something
> - * like type 2/3/4. We need type 1 here.
> - */
> - if (rtw_is_assoc(rtwdev)) {
> - if (dm_info->min_rssi > 60) {
> - new_lvl = CCK_PD_LV3;
> - } else if (dm_info->min_rssi > 35) {
> - new_lvl = CCK_PD_LV2;
> - } else if (dm_info->min_rssi > 20) {
> - if (dm_info->cck_fa_avg > 500)
> - new_lvl = CCK_PD_LV2;
> - else if (dm_info->cck_fa_avg < 250)
> - new_lvl = CCK_PD_LV1;
> - else
> - return;
> - } else {
> - new_lvl = CCK_PD_LV1;
> - }
> - }
> -
> - rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
> - dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
> -
> - if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
> - return;
> -
> - dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
> - dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
> -
> - rtw_write8(rtwdev, REG_CCK_PD_TH, pd[new_lvl]);
> -}
> -EXPORT_SYMBOL(rtw88xxa_phy_cck_pd_set);
> -
> MODULE_AUTHOR("Realtek Corporation");
> MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821a/8811a/8812a common code");
> MODULE_LICENSE("Dual BSD/GPL");
> diff --git a/drivers/net/wireless/realtek/rtw88/rtw88xxa.h b/drivers/net/wireless/realtek/rtw88/rtw88xxa.h
> index 09a45c1a4129..d9c8db58909c 100644
> --- a/drivers/net/wireless/realtek/rtw88/rtw88xxa.h
> +++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.h
> @@ -170,6 +170,5 @@ bool rtw88xxa_iqk_finish(int average, int threshold,
> void rtw88xxa_phy_pwrtrack(struct rtw_dev *rtwdev,
> void (*do_lck)(struct rtw_dev *rtwdev),
> void (*do_iqk)(struct rtw_dev *rtwdev));
> -void rtw88xxa_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl);
>
> #endif