mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
To: Luka Gejak <luka.gejak@linux.dev>, Ping-Ke Shih <pkshih@realtek.com>
Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org,
	Michael Straube <straube.linux@gmail.com>,
	Peter Robinson <pbrobinson@gmail.com>
Subject: Re: [PATCH v5 rtw-next 1/7] wifi: rtw88: move the shared 88xxa init helpers into the core
Date: Wed, 30 Sep 2026 21:04:09 +0300	[thread overview]
Message-ID: <17f1504d-4a27-48f1-9c8e-e84a3416c383@gmail.com> (raw)
In-Reply-To: <20260930091604.52891-2-luka.gejak@linux.dev>

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@linux.dev>
> ---
>  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


  reply	other threads:[~2026-09-30 18:04 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-30  9:15 [PATCH v5 rtw-next 0/7] wifi: rtw88: add RTL8723B/RTL8723BS support Luka Gejak
2026-09-30  9:15 ` [PATCH v5 rtw-next 1/7] wifi: rtw88: move the shared 88xxa init helpers into the core Luka Gejak
2026-09-30 18:04   ` Bitterblue Smith [this message]
2026-09-30 20:53     ` Luka Gejak
2026-09-30  9:15 ` [PATCH v5 rtw-next 2/7] wifi: rtw88: assign the RCR per chip in rtw_core_init Luka Gejak
2026-09-30 18:03   ` Bitterblue Smith
2026-09-30 20:36     ` Luka Gejak
2026-09-30 21:27       ` Bitterblue Smith
2026-09-30 21:29         ` Luka Gejak
2026-09-30 21:46           ` Bitterblue Smith
2026-09-30 21:49             ` Luka Gejak
2026-09-30  9:16 ` [PATCH v5 rtw-next 3/7] wifi: rtw88: 8723b: add the RTL8723B register definitions Luka Gejak
2026-09-30  9:16 ` [PATCH v5 rtw-next 4/7] wifi: rtw88: 8723b: add the RTL8723B BB, RF and AGC tables Luka Gejak
2026-09-30  9:16 ` [PATCH v5 rtw-next 5/7] wifi: rtw88: 8723b: add the RTL8723B chip driver Luka Gejak
2026-09-30 18:03   ` Bitterblue Smith
2026-09-30 21:14     ` Luka Gejak
2026-09-30  9:16 ` [PATCH v5 rtw-next 6/7] wifi: rtw88: 8723bs: add the RTL8723BS SDIO bind Luka Gejak
2026-09-30  9:16 ` [PATCH v5 rtw-next 7/7] wifi: rtw88: 8723bs: enable building the RTL8723BS driver Luka Gejak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=17f1504d-4a27-48f1-9c8e-e84a3416c383@gmail.com \
    --to=rtl8821cerfe2@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=luka.gejak@linux.dev \
    --cc=pbrobinson@gmail.com \
    --cc=pkshih@realtek.com \
    --cc=straube.linux@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®