wifi: rtw89: add USB IO offload and some refactors
Ping-Ke Shih
maintainercover wifi: rtw89: add USB IO offload and some refactors
First patch is to correct typo which was missed because of two patchset were submitted at the same time; patch 7 is similar. The second one is to improve user experience on realtime applications, such as remote desktop.
The patches 3-5 are to add switches by debugfs to control the functions for latency-sensitive scenario.
Patch 6 is to fix data type to prevent overflow for 6GHz RNR scan.
Patches 8-10 are to add USB IO offload, which packs IO into a H2C command and firmware does all IO in one go. This is to improve overall IO performance.
Patch 11 is trivial to add a USB device.
Patch 12-14 are to fix issues rarely found by MCC test. Address them and fix.
Patch 15-16 are to support RTL8922D's new design, which hardware does backup RF calibration data on two PHY with the same channel to support runtime switch channels without doing calibration again, for example eMLSR that should change to 5GHz or 6GHz channel quickly.
Chia-Yuan Li (2):
wifi: rtw89: add IO offload support via firmware
wifi: rtw89: offload DMAC and CMAC init IO to firmware
Chih-Kang Chang (3):
wifi: rtw89: use struct to fill C2H recv ack
wifi: rtw89: check scan C2H event recv ack instead of C2H event done
ack
wifi: rtw89: suspend DIG when remain-on-channel
Eric Huang (2):
wifi: rtw89: phy: support static PD level setting
wifi: rtw89: use firmware offload for PHY and RF batch register writes
Johnson Tsai (3):
wifi: rtw89: debug: disable hw_scan for latency-sensitive scenarios
wifi: rtw89: debug: disable inactive power save to reduce bus overhead
wifi: rtw89: 8832cu: Add ID 2c7c:8206 for RTL8832CU
Ping-Ke Shih (1):
wifi: rtw89: 8922d: fix typo rx_freq_frome_ie
Po-Hao Huang (1):
wifi: rtw89: 8852a: refine power save to lower latency
Shin-Yi Lin (1):
wifi: rtw89: Correct data type for scan index to avoid infinite loop
Zong-Zhe Yang (3):
wifi: rtw89: 8852bt: configure support_noise field explicitly
wifi: rtw89: chan: introduce new helper to get entity current
configuration
wifi: rtw89: 8922d: update RF calibration flow for MLD
drivers/net/wireless/realtek/rtw89/chan.c | 90 +++-- drivers/net/wireless/realtek/rtw89/chan.h | 21 +- drivers/net/wireless/realtek/rtw89/core.c | 111 +++++- drivers/net/wireless/realtek/rtw89/core.h | 97 ++++- drivers/net/wireless/realtek/rtw89/debug.c | 96 +++++ drivers/net/wireless/realtek/rtw89/fw.c | 349 +++++++++++++++++- drivers/net/wireless/realtek/rtw89/fw.h | 75 +++- drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++- drivers/net/wireless/realtek/rtw89/mac80211.c | 7 + drivers/net/wireless/realtek/rtw89/mac_be.c | 57 ++- drivers/net/wireless/realtek/rtw89/phy.c | 94 +++-- drivers/net/wireless/realtek/rtw89/phy.h | 30 +- drivers/net/wireless/realtek/rtw89/phy_be.c | 8 +- drivers/net/wireless/realtek/rtw89/ps.c | 6 + drivers/net/wireless/realtek/rtw89/reg.h | 4 + drivers/net/wireless/realtek/rtw89/rtw8851b.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 + .../net/wireless/realtek/rtw89/rtw8852b_rfk.c | 6 +- .../net/wireless/realtek/rtw89/rtw8852bt.c | 2 + .../wireless/realtek/rtw89/rtw8852bt_rfk.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 + .../net/wireless/realtek/rtw89/rtw8852cu.c | 2 + drivers/net/wireless/realtek/rtw89/rtw8922a.c | 18 +- .../net/wireless/realtek/rtw89/rtw8922a_rfk.c | 22 +- drivers/net/wireless/realtek/rtw89/rtw8922d.c | 40 +- .../net/wireless/realtek/rtw89/rtw8922d_rfk.c | 92 +++-- .../net/wireless/realtek/rtw89/rtw8922d_rfk.h | 1 + 28 files changed, 1130 insertions(+), 197 deletions(-)
base-commit: fa489a77e3267e05df95db96ba98e141ec07cbd9
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/16 wifi: rtw89: 8922d: fix typo rx_freq_frome_ie
The commit 127ea8d0b068 ("wifi: rtw89: fix typo "frome" -> "from" in rx_freq_frome_ie") change the struct field to correct the typo, but miss to fix this for RTL8922D because it is submitting at the same time.
As RTL8922D is not enabled yet, this build error doesn't appear.
Fix it accordingly.
--- drivers/net/wireless/realtek/rtw89/rtw8922d.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/rtw8922d.c +1 -1
@@ -2988,7 +2988,7 @@ const struct rtw89_chip_info rtw8922d_chip_info = { .support_noise = false, .ul_tb_waveform_ctrl = false, .ul_tb_pwr_diff = false, - .rx_freq_frome_ie = false, + .rx_freq_from_ie = false, .hw_sec_hdr = true, .hw_mgmt_tx_encrypt = true, .hw_tkip_crypto = true,
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerRe: [PATCH rtw-next 01/16] wifi: rtw89: 8922d: fix typo rx_freq_frome_ie
Quoted 9 lines · Ping-Ke Shih
The commit
127ea8d0b068("wifi: rtw89: fix typo "frome" -> "from" inrx_freq_frome_ie") change the struct field to correct the typo, but miss to fix this for RTL8922D because it is submitting at the same time.As RTL8922D is not enabled yet, this build error doesn't appear.
Fix it accordingly.
Signed-off-by Ping-Ke Shih <[email protected]>
16 patch(es) applied to rtw-next branch of rtw.git, thanks.
d6a3aac6ed5d wifi: rtw89: 8922d: fix typo rx_freq_frome_iefdf0eb355182 wifi: rtw89: 8852a: refine power save to lower latency 3da737c77764 wifi: rtw89: debug: disable hw_scan for latency-sensitive scenarios bd2d1abf74e4 wifi: rtw89: debug: disable inactive power save to reduce bus overhead e3ed82f19f13 wifi: rtw89: phy: support static PD level setting 08fdcb529df6 wifi: rtw89: Correct data type for scan index to avoid infinite loop 72b781d3bdd3 wifi: rtw89: 8852bt: configure support_noise field explicitly ae3d327515f2 wifi: rtw89: add IO offload support via firmware63586e841cf3 wifi: rtw89: offload DMAC and CMAC init IO to firmware 850216ff7d12 wifi: rtw89: use firmware offload for PHY and RF batch register writes 89058548dd14 wifi: rtw89: 8832cu: Add ID 2c7c:8206 for RTL8832CU 8beba37615f2 wifi: rtw89: use struct to fill C2H recv ack6a9b4babeb9b wifi: rtw89: check scan C2H event recv ack instead of C2H event done ack 602b58bb45b2 wifi: rtw89: suspend DIG when remain-on-channel2da590b9ccf5 wifi: rtw89: chan: introduce new helper to get entity current configuration b465bc7e18a7 wifi: rtw89: 8922d: update RF calibration flow for MLD
Ping-Ke Shih
maintainerPATCH 2/16 wifi: rtw89: 8852a: refine power save to lower latency
In reply to Ping-Ke ShihFrom: Po-Hao Huang <[email protected]>
Improve user experience while using interactive applications. Adjust power saving decisions under different scenarios. Minimize latency for delay-sensitive connections by exiting power-save on packet bursts and maintain active until a period of inactivity is reached. For connections that are not that sensitive to delays, keep the current aggressive power save logic.
--- drivers/net/wireless/realtek/rtw89/core.c | 87 +++++++++++++++++++++-- drivers/net/wireless/realtek/rtw89/core.h | 9 +++ 2 files changed, 89 insertions(+), 7 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +80 -7
@@ -341,10 +341,26 @@ static const struct rtw89_hw_rate_def { }, }; +static void rtw89_core_tx_skb_proto_stats (struct rtw89_traffic_stats *stats, +struct sk_buff *skb) +{ +switch (ip_hdr (skb)->protocol) { +case IPPROTO_TCP : + stats->tcp++; +break ; +case IPPROTO_UDP : + stats->udp++; +break ; +default : +break ; + } +} +static void __rtw89_traffic_stats_accu (struct rtw89_traffic_stats *stats,struct sk_buff *skb,bool tx) {if (tx) { +rtw89_core_tx_skb_proto_stats (stats, skb); stats->tx_cnt++; stats->tx_unicast += skb->len; }else {
@@ -2902,6 +2918,23 @@ static void rtw89_core_bcn_track_reset(struct rtw89_dev *rtwdev)memset (&rtwdev->bcn_track,0 ,sizeof (rtwdev->bcn_track)); } +static bool rtw89_core_proto_stats_can_lps (struct rtw89_dev *rtwdev, +struct rtw89_vif *rtwvif, +enum rtw89_tfc_interval interval) +{ +if (rtwdev->chip->chip_id !=RTL8852A ) +return true; + +if (rtwvif->burst_active) +return false; + +if (interval ==RTW89_TFC_INTERVAL_100MS && +hweight8 (rtwvif->stats_ps.active_histogram) <3 ) +return false; + +return true; +} +static void rtw89_vif_rx_bcn_stat (struct rtw89_dev *rtwdev,struct sk_buff *skb) {#define RTW89_APPEND_TSF_2GHZ 384
@@ -4540,9 +4573,42 @@ static enum rtw89_tfc_lv rtw89_get_traffic_level(struct rtw89_dev *rtwdev,return RTW89_TFC_ULTRA_LOW ; } +static void rtw89_calc_vif_active_histogram (struct rtw89_dev *rtwdev, +struct rtw89_traffic_stats *stats, +enum rtw89_tfc_interval interval) +{ +struct rtw89_vif *rtwvif; + + stats->udp_ratio = stats->tx_cnt ? +DIV_ROUND_DOWN_ULL (stats->udp *100 , stats->tx_cnt) :0 ; + stats->active_histogram <<=1 ; + +switch (interval) { +case RTW89_TFC_INTERVAL_2SEC : + rtwvif = container_of(stats, struct rtw89_vif, stats); + +if (stats->tcp >=RTW89_TCP_TH && stats->tx_cnt >= stats->rx_cnt) + stats->active_histogram |=BIT (0 ); + +if (stats->active_histogram &RTW89_RECENT_ACTIVE_HIST ) + rtwvif->burst_active = true; +else + rtwvif->burst_active = false; + +break ; +case RTW89_TFC_INTERVAL_100MS : +if (stats->udp_ratio >=RTW89_UDP_RATIO_TH ) + stats->active_histogram |=BIT (0 ); +break ; + } + + stats->tcp =0 ; + stats->udp =0 ; +} +static bool rtw89_traffic_stats_calc (struct rtw89_dev *rtwdev,struct rtw89_traffic_stats *stats, -enum rtw89_tfc_interval interval) +enum rtw89_tfc_interval interval,bool by_vif) {enum rtw89_tfc_lv tx_tfc_lv = stats->tx_tfc_lv;enum rtw89_tfc_lv rx_tfc_lv = stats->rx_tfc_lv;
@@ -4564,6 +4630,9 @@ static bool rtw89_traffic_stats_calc(struct rtw89_dev *rtwdev, stats->rx_avg_len = stats->rx_cnt ?DIV_ROUND_DOWN_ULL (stats->rx_unicast, stats->rx_cnt) :0 ; +if (by_vif) +rtw89_calc_vif_active_histogram (rtwdev, stats, interval); + stats->tx_unicast =0 ; stats->rx_unicast =0 ; stats->tx_cnt =0 ;
@@ -4585,11 +4654,11 @@ static bool rtw89_traffic_stats_track(struct rtw89_dev *rtwdev)bool tfc_changed; tfc_changed =rtw89_traffic_stats_calc (rtwdev, &rtwdev->stats, -RTW89_TFC_INTERVAL_2SEC ); +RTW89_TFC_INTERVAL_2SEC , false);rtw89_for_each_rtwvif (rtwdev, rtwvif) {rtw89_traffic_stats_calc (rtwdev, &rtwvif->stats, -RTW89_TFC_INTERVAL_2SEC ); +RTW89_TFC_INTERVAL_2SEC , true);rtw89_vif_for_each_link (rtwvif, rtwvif_link, link_id)rtw89_fw_h2c_tp_offload (rtwdev, rtwvif_link);
@@ -4598,7 +4667,8 @@ static bool rtw89_traffic_stats_track(struct rtw89_dev *rtwdev)return tfc_changed; } -static void rtw89_enter_lps_track (struct rtw89_dev *rtwdev) +static void rtw89_enter_lps_track (struct rtw89_dev *rtwdev, +enum rtw89_tfc_interval interval) {struct ieee80211_vif *vif;struct rtw89_vif *rtwvif;
@@ -4622,6 +4692,9 @@ static void rtw89_enter_lps_track(struct rtw89_dev *rtwdev)if (!rtw89_core_bcn_track_can_lps (rtwdev))continue ; +if (!rtw89_core_proto_stats_can_lps (rtwdev, rtwvif, interval)) +continue ; +rtw89_enter_lps (rtwdev, rtwvif, true); } }
@@ -4771,13 +4844,13 @@ static void rtw89_track_ps_work(struct wiphy *wiphy, struct wiphy_work *work)rtw89_for_each_rtwvif (rtwdev, rtwvif)rtw89_traffic_stats_calc (rtwdev, &rtwvif->stats_ps, -RTW89_TFC_INTERVAL_100MS ); +RTW89_TFC_INTERVAL_100MS , true);if (rtwdev->scanning)return ;if (rtwdev->lps_enabled && !rtwdev->btc.lps) -rtw89_enter_lps_track (rtwdev); +rtw89_enter_lps_track (rtwdev,RTW89_TFC_INTERVAL_100MS ); }static void rtw89_track_work (struct wiphy *wiphy,struct wiphy_work *work)
@@ -4825,7 +4898,7 @@ static void rtw89_track_work(struct wiphy *wiphy, struct wiphy_work *work)rtw89_core_mlo_track (rtwdev);if (rtwdev->lps_enabled && !rtwdev->btc.lps) -rtw89_enter_lps_track (rtwdev); +rtw89_enter_lps_track (rtwdev,RTW89_TFC_INTERVAL_2SEC ); }void rtw89_core_dm_disable_cfg (struct rtw89_dev *rtwdev,u32 new)
drivers/net/wireless/realtek/rtw89/core.h +9 -0
@@ -1477,6 +1477,10 @@ enum rtw89_tfc_lv {DECLARE_EWMA (tp,10 ,2 ); +#define RTW89_TCP_TH 40 +#define RTW89_UDP_RATIO_TH 70 +#define RTW89_RECENT_ACTIVE_HIST GENMASK(4, 0) +struct rtw89_traffic_stats {/* units in bytes */ u64 tx_unicast;
@@ -1504,6 +1508,10 @@ struct rtw89_traffic_stats {u16 tx_rate;u16 rx_rate; + +/* used by rtwvif only */ +u64 tcp, udp, udp_ratio; +u8 active_histogram; };struct rtw89_btc_chdef {
@@ -6354,6 +6362,7 @@ struct rtw89_vif {struct rtw89_roc roc;bool offchan; +bool burst_active;enum rtw89_mlo_mode mlo_mode;struct rtw89_vif_ml_trans ml_trans;
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/16 wifi: rtw89: debug: disable hw_scan for latency-sensitive scenarios
In reply to Ping-Ke ShihFrom: Johnson Tsai <[email protected]>
This helps avoid scan-triggered off-channel activity during latency-sensitive scenarios.
Add RTW89_DM_HW_SCAN to the disabled_dm bitmap via debugfs and check it in the hw_scan path. When set, the driver rejects hw_scan requests and returns -EBUSY.
--- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/debug.c | 1 + drivers/net/wireless/realtek/rtw89/mac80211.c | 7 +++++++ 3 files changed, 9 insertions(+)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
@@ -5178,6 +5178,7 @@ enum rtw89_dm_type {RTW89_DM_THERMAL_PROTECT ,RTW89_DM_TAS ,RTW89_DM_MLO , + RTW89_DM_HW_SCAN, };#define RTW89_THERMAL_PROT_LV_MAX 5
drivers/net/wireless/realtek/rtw89/debug.c +1 -0
@@ -4347,6 +4347,7 @@ static const struct rtw89_disabled_dm_info {DM_INFO (THERMAL_PROTECT ),DM_INFO (TAS ),DM_INFO (MLO ), + DM_INFO(HW_SCAN), }; static ssize_t
drivers/net/wireless/realtek/rtw89/mac80211.c +7 -0
@@ -1241,6 +1241,7 @@ static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct rtw89_dev *rtwdev = hw->priv;struct rtw89_vif *rtwvif =vif_to_rtwvif (vif);struct rtw89_vif_link *rtwvif_link; +struct rtw89_hal *hal = &rtwdev->hal;int ret;lockdep_assert_wiphy (hw->wiphy);
@@ -1248,6 +1249,12 @@ static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,if (!RTW89_CHK_FW_FEATURE (SCAN_OFFLOAD , &rtwdev->fw))return 1 ; +if (hal->disabled_dm_bitmap &BIT (RTW89_DM_HW_SCAN )) { +rtw89_debug (rtwdev,RTW89_DBG_HW_SCAN , +"reject hw scan due to disabled_dm\n" ); +return -EBUSY ; + } +if (rtwdev->scanning || rtwvif->offchan)return -EBUSY ;
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/16 wifi: rtw89: debug: disable inactive power save to reduce bus overhead
In reply to Ping-Ke ShihFrom: Johnson Tsai <[email protected]>
This helps avoid excessive bus traffic and I/O overhead on slower HCIs (e.g., USB, SDIO) caused by frequent power state transitions.
Add RTW89_DM_INACTIVE_PS to the disabled_dm bitmap via debugfs and check it in the rtw89_enter_ips path. When set, the driver skips entering inactive power save and returns immediately.
--- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/debug.c | 1 + drivers/net/wireless/realtek/rtw89/ps.c | 6 ++++++ 3 files changed, 8 insertions(+)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
@@ -5179,6 +5179,7 @@ enum rtw89_dm_type {RTW89_DM_TAS ,RTW89_DM_MLO ,RTW89_DM_HW_SCAN , + RTW89_DM_INACTIVE_PS, };#define RTW89_THERMAL_PROT_LV_MAX 5
drivers/net/wireless/realtek/rtw89/debug.c +1 -0
@@ -4348,6 +4348,7 @@ static const struct rtw89_disabled_dm_info {DM_INFO (TAS ),DM_INFO (MLO ),DM_INFO (HW_SCAN ), + DM_INFO(INACTIVE_PS), }; static ssize_t
drivers/net/wireless/realtek/rtw89/ps.c +6 -0
@@ -234,8 +234,14 @@ void rtw89_enter_ips(struct rtw89_dev *rtwdev) {struct rtw89_vif_link *rtwvif_link;struct rtw89_vif *rtwvif; +struct rtw89_hal *hal = &rtwdev->hal;unsigned int link_id; +if (hal->disabled_dm_bitmap &BIT (RTW89_DM_INACTIVE_PS )) { +rtw89_debug (rtwdev,RTW89_DBG_PS ,"skip enter IPS due to disabled_dm\n" ); +return ; + } +set_bit (RTW89_FLAG_INACTIVE_PS , rtwdev->flags);if (!test_bit (RTW89_FLAG_POWERON , rtwdev->flags))
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/16 wifi: rtw89: phy: support static PD level setting
In reply to Ping-Ke ShihFrom: Eric Huang <[email protected]>
PD (Packet Detection) threshold is a key parameter in the DIG (Dynamic Initial Gain) algorithm that determines the sensitivity of packet detection. Current implementation only supports dynamic PD adjustment based on environment. This patch adds support for static PD threshold via debugfs allowing users to set a fixed PD value for testing or specific scenarios.
--- drivers/net/wireless/realtek/rtw89/core.h | 4 + drivers/net/wireless/realtek/rtw89/debug.c | 94 ++++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/phy.c | 44 +++++++--- 3 files changed, 131 insertions(+), 11 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +4 -0
@@ -5180,6 +5180,7 @@ enum rtw89_dm_type {RTW89_DM_MLO ,RTW89_DM_HW_SCAN ,RTW89_DM_INACTIVE_PS , + RTW89_DM_DIG_PD, };#define RTW89_THERMAL_PROT_LV_MAX 5
@@ -5221,6 +5222,9 @@ struct rtw89_hal {u8 thermal_prot_th;u8 thermal_prot_lv;/* 0 ~ RTW89_THERMAL_PROT_LV_MAX */ + +u8 fixed_dig_pd_th;/* v = (X(dBm) + 102)/2 */ +s8 fixed_dig_cck_pd_th;/* dBm */ };#define RTW89_MAX_MAC_ID_NUM 128
drivers/net/wireless/realtek/rtw89/debug.c +94 -0
124 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/phy.c +33 -11
77 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 6/16 wifi: rtw89: Correct data type for scan index to avoid infinite loop
In reply to Ping-Ke ShihFrom: Shin-Yi Lin <[email protected]>
A kernel soft lockup was observed during Wi-Fi scanning on the 6GHz band. The CPU becomes stuck in rtw89_hw_scan_add_chan_ax for over 20 seconds, leading to a system panic.
RIP points to 0f b6 c3 (movzbl %bl, %eax), which zero-extends the low 8 bits of RBX into RAX.
RBX (the counter i) has reached a huge value: 0x137466a1.
watchdog: BUG: soft lockup - CPU#2 stuck for 26s! [kworker/u16:4:6124] Workqueue: events_unbound cfg80211_wiphy_work [cfg80211] RIP: 0010:rtw89_hw_scan_add_chan_ax+0xb3/0x6e0 [rtw89_core] Code: a0 48 89 45 a8 44 89 6d 9c 44 89 75 98 eb 29 66 66 2e 0f 1f 84 00 00 00 00 00 66 66 2e 0f 1f 84 00 00 00 00 00 66 90 83 c3 01 <0f> b6 c3 41 3b 44 24 74 0f 83 0b 02 00 00 0f b6 c3 48 8d 14 80 49 RSP: 0018:ffffcb48cbaa39f8 EFLAGS: 00000202 RAX: 0000000000000005 RBX: 00000000137466a1 RCX: 0000000000000000 RDX: ffff89ffc9d851a8 RSI: 0000000000004f0d RDI: 0000000096af0130 RBP: ffffcb48cbaa3a60 R08: 0000000000000000 R09: ffff8a00b7502080 R10: ffff8a00b75ff600 R11: 0000000000000000 R12: ffff89ffc7553870 R13: ffff8a00b7ac8f19 R14: ffff8a00b75020d8 R15: ffff89ffc3d54d80 FS: 0000000000000000(0000) GS:ffff8a014f962000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007558d7f9f4c4 CR3: 0000000178040001 CR4: 00000000001706f0 Call Trace: <TASK> rtw89_hw_scan_prep_chan_list_ax+0x8a/0x400 [rtw89_core] rtw89_hw_scan_start+0x546/0x8a0 [rtw89_core] ? rtw89_fw_h2c_default_cmac_tbl+0x13c/0x1f0 [rtw89_core] rtw89_ops_hw_scan+0xae/0x120 [rtw89_core] drv_hw_scan+0xbb/0x180 [mac80211] __ieee80211_start_scan+0x2fc/0x750 [mac80211] ieee80211_request_scan+0xe/0x20 [mac80211] ieee80211_scan+0x123/0x190 [mac80211] rdev_scan+0x40/0x110 [cfg80211] cfg80211_scan_6ghz+0x5a1/0xa30 [cfg80211]
By objdump with source:
for (i = 0; i < req->n_6ghz_params; i++) { 5fbc0: 83 c3 01 add $0x1,%ebx --> i++
5fbc3: 0f b6 c3 movzbl %bl,%eax --> get counter
fbc6: 41 3b 44 24 74 cmp 0x74(%r12),%eax
* RBX: 00000000137466a1 -> %bl = a1 -> EAX = 000000a1 (161)
--- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/fw.c +1 -1
@@ -8318,7 +8318,7 @@ static int rtw89_update_6ghz_rnr_chan_ax(struct rtw89_dev *rtwdev,struct sk_buff *skb;bool found;int ret =0 ; -u8 i; +u32 i;if (!req->n_6ghz_params)return 0 ;
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 7/16 wifi: rtw89: 8852bt: configure support_noise field explicitly
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
RTL8852BT missed to configure support_noise field in chip_info. Although RTL8852BT doesn't support that, add the configuration to make things clear.
--- drivers/net/wireless/realtek/rtw89/rtw8852bt.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/realtek/rtw89/rtw8852bt.c +1 -0
@@ -811,6 +811,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = { .support_ant_gain = true, .support_tas = false, .support_sar_by_ant = true, + .support_noise = false, .ul_tb_waveform_ctrl = true, .ul_tb_pwr_diff = false, .rx_freq_from_ie = true,
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 8/16 wifi: rtw89: add IO offload support via firmware
In reply to Ping-Ke ShihFrom: Chia-Yuan Li <[email protected]>
Offload register write operations to the firmware to improve IO efficiency. Instead of the host performing direct bus access for every register, the operations are now encapsulated into firmware commands.
This implementation allows the host to aggregate multiple register write actions into a single command buffer. By batching these operations, we reduce the number of individual transactions on the bus and minimize per-transfer overhead, leading to faster overall IO performance.
Add a support_fw_cmd_ofld field to the chip_info structure to control whether firmware-offloaded batch writes are enabled. Enable it by default for RTL8832CU.
--- drivers/net/wireless/realtek/rtw89/core.c | 2 + drivers/net/wireless/realtek/rtw89/core.h | 82 ++++- drivers/net/wireless/realtek/rtw89/fw.c | 347 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/fw.h | 57 +++ drivers/net/wireless/realtek/rtw89/phy.h | 30 +- drivers/net/wireless/realtek/rtw89/rtw8851b.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 + .../net/wireless/realtek/rtw89/rtw8852bt.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8922a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8922d.c | 1 + 12 files changed, 515 insertions(+), 10 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +2 -0
@@ -6302,6 +6302,8 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)struct rtw89_btc *btc = &rtwdev->btc;u8 band; + rtwdev->io =rtw89_fw_cmd_ofld_alloc_and_get_io_ops (rtwdev); +bitmap_or (rtwdev->quirks, rtwdev->quirks, &rtwdev->chip->default_quirks,NUM_OF_RTW89_QUIRKS );
drivers/net/wireless/realtek/rtw89/core.h +78 -4
146 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/fw.c +347 -0
350 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/fw.h +57 -0
73 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/phy.h +24 -6
@@ -576,30 +576,48 @@ extern const struct rtw89_phy_gen_def rtw89_phy_gen_ax;extern const struct rtw89_phy_gen_def rtw89_phy_gen_be;extern const struct rtw89_phy_gen_def rtw89_phy_gen_be_v1; -static inline void rtw89_phy_write8 (struct rtw89_dev *rtwdev, -u32 addr,u8 data) +static inline void rtw89_raw_phy_write8 (struct rtw89_dev *rtwdev, +u32 addr,u8 data) {const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;rtw89_write8 (rtwdev, addr + phy->cr_base, data); } -static inline void rtw89_phy_write16 (struct rtw89_dev *rtwdev, -u32 addr,u16 data) +static inline void rtw89_raw_phy_write16 (struct rtw89_dev *rtwdev, +u32 addr,u16 data) {const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;rtw89_write16 (rtwdev, addr + phy->cr_base, data); } -static inline void rtw89_phy_write32 (struct rtw89_dev *rtwdev, -u32 addr,u32 data) +static inline void rtw89_raw_phy_write32 (struct rtw89_dev *rtwdev, +u32 addr,u32 data) {const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;rtw89_write32 (rtwdev, addr + phy->cr_base, data); } +static inline void rtw89_phy_write8 (struct rtw89_dev *rtwdev, +u32 addr,u8 data) +{ + rtwdev->io->phy_write8 (rtwdev, addr, data); +} + +static inline void rtw89_phy_write16 (struct rtw89_dev *rtwdev, +u32 addr,u16 data) +{ + rtwdev->io->phy_write16 (rtwdev, addr, data); +} + +static inline void rtw89_phy_write32 (struct rtw89_dev *rtwdev, +u32 addr,u32 data) +{ + rtwdev->io->phy_write32 (rtwdev, addr, data); +} +static inline void rtw89_phy_write32_set (struct rtw89_dev *rtwdev,u32 addr,u32 bits) {
drivers/net/wireless/realtek/rtw89/rtw8851b.c +1 -0
@@ -2639,6 +2639,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = { .support_tas = false, .support_sar_by_ant = false, .support_noise = false, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = true, .ul_tb_pwr_diff = false, .rx_freq_from_ie = true,
drivers/net/wireless/realtek/rtw89/rtw8852a.c +1 -0
@@ -2376,6 +2376,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = { .support_tas = false, .support_sar_by_ant = false, .support_noise = true, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = false, .ul_tb_pwr_diff = false, .rx_freq_from_ie = true,
drivers/net/wireless/realtek/rtw89/rtw8852b.c +1 -0
@@ -972,6 +972,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = { .support_tas = false, .support_sar_by_ant = true, .support_noise = false, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = true, .ul_tb_pwr_diff = false, .rx_freq_from_ie = true,
drivers/net/wireless/realtek/rtw89/rtw8852bt.c +1 -0
@@ -812,6 +812,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = { .support_tas = false, .support_sar_by_ant = true, .support_noise = false, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = true, .ul_tb_pwr_diff = false, .rx_freq_from_ie = true,
drivers/net/wireless/realtek/rtw89/rtw8852c.c +1 -0
@@ -3169,6 +3169,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = { .support_tas = true, .support_sar_by_ant = true, .support_noise = false, + .support_fw_cmd_ofld = true, .ul_tb_waveform_ctrl = false, .ul_tb_pwr_diff = true, .rx_freq_from_ie = false,
drivers/net/wireless/realtek/rtw89/rtw8922a.c +1 -0
@@ -2973,6 +2973,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = { .support_tas = true, .support_sar_by_ant = true, .support_noise = false, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = false, .ul_tb_pwr_diff = false, .rx_freq_from_ie = false,
drivers/net/wireless/realtek/rtw89/rtw8922d.c +1 -0
@@ -2986,6 +2986,7 @@ const struct rtw89_chip_info rtw8922d_chip_info = { .support_tas = false, .support_sar_by_ant = true, .support_noise = false, + .support_fw_cmd_ofld = false, .ul_tb_waveform_ctrl = false, .ul_tb_pwr_diff = false, .rx_freq_from_ie = false,
Signature · 1 line
2.25.1
Re: [PATCH rtw-next 08/16] wifi: rtw89: add IO offload support via firmware
Quoted 17 lines · Ping-Ke Shih
drivers/net/wireless/realtek/rtw89/fw.c +17
-0+static void rtw89_fw_cmd_ofld_udelay (struct rtw89_dev *rtwdev,u32 us) +{ +struct rtw89_fw_cmd_ofld_arg cmd = { + .src =RTW89_FW_CMD_OFLD_SRC_OTHER , + .type =RTW89_FW_CMD_OFLD_DELAY , + .value = us, + }; +int ret; + + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +udelay (us); +} + +static void rtw89_fw_cmd_ofld_mdelay (struct rtw89_dev *rtwdev,u32 ms) +{ +struct rtw89_fw_cmd_ofld_arg cmd = {
drivers/net/wireless/realtek/rtw89/fw.c rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev, · line 11661
Quoted 10 lines
drivers/net/wireless/realtek/rtw89/fw.c +10
-0+ .src = RTW89_FW_CMD_OFLD_SRC_OTHER, + .type = RTW89_FW_CMD_OFLD_DELAY, + .value = ms * 1000, + }; +int ret; + + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +mdelay (ms); +}
This can fail to compile with some kernel configurations because RTW89_FW_CMD_OFLD_SRC_OTHER (4) doesn't fit in the mask RTW89_H2C_CMD_OFLD_W0_SRC (GENMASK(0, 1)):
In file included from core.h:10,
from cam.h:8,
from fw.c:6:
In function ‘le32_encode_bits’,
inlined from ‘rtw89_fw_cmd_ofld_enqueue’ at fw.c:11655:12,
inlined from ‘rtw89_fw_cmd_ofld_udelay’ at fw.c:11858:8:
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:217:17: error: call to ‘__field_overflow’ declared with attribute error: value doesn't fit into mask
217 | __field_overflow(); \
| ^~~~~~~~~~~~~~~~~~
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:235:9: note: in expansion of macro ‘____MAKE_OP’
235 | ____MAKE_OP(le##size,u##size,cpu_to_le##size,le##size##_to_cpu) \
| ^~~~~~~~~~~
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:240:1: note: in expansion of macro ‘__MAKE_OP’
240 | __MAKE_OP(32)
| ^~~~~~~~~
In function ‘le32_encode_bits’,
inlined from ‘rtw89_fw_cmd_ofld_enqueue’ at fw.c:11655:12,
inlined from ‘rtw89_fw_cmd_ofld_mdelay’ at fw.c:11872:8:
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:217:17: error: call to ‘__field_overflow’ declared with attribute error: value doesn't fit into mask
217 | __field_overflow(); \
| ^~~~~~~~~~~~~~~~~~
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:235:9: note: in expansion of macro ‘____MAKE_OP’
235 | ____MAKE_OP(le##size,u##size,cpu_to_le##size,le##size##_to_cpu) \
| ^~~~~~~~~~~
/usr/lib/modules/7.1.3-zen1-1-zen/build/include/linux/bitfield.h:240:1: note: in expansion of macro ‘__MAKE_OP’
240 | __MAKE_OP(32)
| ^~~~~~~~~https://github.com/morrownr/rtw89/issues/111
https://github.com/morrownr/rtw89/issues/106
The reports are about the code from that repository, not the kernel, but I assume the same thing will happen when someone tries to build kernel 7.2 with the Zen config.
Using the same GCC 16.1.1, this fails on 7.1.3-zen1 but compiles on 7.1.3-arch1 (the standard Arch Linux kernel). This is the difference between their /proc/config.gz:
3c3
< # Linux/x86 7.1.3-arch1 Kernel Configuration
---
Quoted 1 line
# Linux/x86 7.1.3-zen1 Kernel Configuration
40a41
Quoted 1 line
CONFIG_ZEN_INTERACTIVE=y
148a150
Quoted 1 line
#
CONFIG_PREEMPT_RTis not set
218a221
Quoted 1 line
#
CONFIG_SCHED_ALTis not set
270a274
Quoted 1 line
CONFIG_USER_NS_UNPRIVILEGED=y
290c294,295
< CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
---
Quoted 2 lines
#
CONFIG_CC_OPTIMIZE_FOR_PERFORMANCEis not setCONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3=y
1264c1269
< CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
---
Quoted 1 line
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=0
1477a1483
Quoted 1 line
CONFIG_TCP_CONG_BBR3=m
3057a3064
Quoted 1 line
CONFIG_VHBA=m
So I guess the error happens when rtw89 is compiled with -O3.
Ping-Ke Shih
maintainerRE: [PATCH rtw-next 08/16] wifi: rtw89: add IO offload support via firmware
Quoted 23 lines · Bitterblue Smith
Quoted 22 lines · Ping-Ke Shih
drivers/net/wireless/realtek/rtw89/fw.c +22
-0+static void rtw89_fw_cmd_ofld_udelay (struct rtw89_dev *rtwdev,u32 us) +{ +struct rtw89_fw_cmd_ofld_arg cmd = { + .src =RTW89_FW_CMD_OFLD_SRC_OTHER , + .type =RTW89_FW_CMD_OFLD_DELAY , + .value = us, + }; +int ret; + + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +udelay (us); +} + +static void rtw89_fw_cmd_ofld_mdelay (struct rtw89_dev *rtwdev,u32 ms) +{ +struct rtw89_fw_cmd_ofld_arg cmd = { + .src =RTW89_FW_CMD_OFLD_SRC_OTHER , + .type =RTW89_FW_CMD_OFLD_DELAY , + .value = ms *1000 , + }; +int ret;
Quoted 8 lines
drivers/net/wireless/realtek/rtw89/fw.c rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev, · line 11661
Quoted 5 lines
drivers/net/wireless/realtek/rtw89/fw.c +5
-0+ + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +mdelay (ms); +}This can fail to compile with some kernel configurations because
RTW89_FW_CMD_OFLD_SRC_OTHER(4) doesn't fit in the maskRTW89_H2C_CMD_OFLD_W0_SRC(GENMASK(0, 1)):
Thanks for the report.
I sent a patch [1] with first github link. If this the link isn't good to you, please let me know. I can change it.
[1] https://lore.kernel.org/linux-wireless/[email protected]/T/#u
Re: [PATCH rtw-next 08/16] wifi: rtw89: add IO offload support via firmware
Quoted 33 lines · Ping-Ke Shih
Quoted 23 lines · Bitterblue Smith
Quoted 22 lines · Ping-Ke Shih
drivers/net/wireless/realtek/rtw89/fw.c +22
-0+static void rtw89_fw_cmd_ofld_udelay (struct rtw89_dev *rtwdev,u32 us) +{ +struct rtw89_fw_cmd_ofld_arg cmd = { + .src =RTW89_FW_CMD_OFLD_SRC_OTHER , + .type =RTW89_FW_CMD_OFLD_DELAY , + .value = us, + }; +int ret; + + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +udelay (us); +} + +static void rtw89_fw_cmd_ofld_mdelay (struct rtw89_dev *rtwdev,u32 ms) +{ +struct rtw89_fw_cmd_ofld_arg cmd = { + .src =RTW89_FW_CMD_OFLD_SRC_OTHER , + .type =RTW89_FW_CMD_OFLD_DELAY , + .value = ms *1000 , + }; +int ret;Quoted 8 lines
drivers/net/wireless/realtek/rtw89/fw.c rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev, · line 11661
Quoted 5 lines
drivers/net/wireless/realtek/rtw89/fw.c +5
-0+ + ret =rtw89_fw_cmd_ofld_enqueue (rtwdev, &cmd); +if (ret) +mdelay (ms); +}This can fail to compile with some kernel configurations because
RTW89_FW_CMD_OFLD_SRC_OTHER(4) doesn't fit in the maskRTW89_H2C_CMD_OFLD_W0_SRC(GENMASK(0, 1)):
Quoted 10 lines
Thanks for the report.
I sent a patch [1] with first github link. If this the link isn't good to you, please let me know. I can change it.
[1] https://lore.kernel.org/linux-wireless/[email protected]/T/#u
It looks good to me, thank you.
Ping-Ke Shih
maintainerPATCH 9/16 wifi: rtw89: offload DMAC and CMAC init IO to firmware
In reply to Ping-Ke ShihFrom: Chia-Yuan Li <[email protected]>
During the initialization of DMAC and CMAC, the driver performs a large number of consecutive register writes. Sending these I/O requests individually over the host interface introduces significant latency and delays the device bring-up process.
Optimize the initialization flow by wrapping the register write sequences in mac.c and mac_be.c with rtw89_io_pack() and rtw89_io_unpack(). This batches the operations and offloads them to the firmware via H2C commands, which significantly accelerates the overall initialization time.
(8852C USB2.0 AMD B450 1379 ms -> 1273 ms)
--- drivers/net/wireless/realtek/rtw89/mac.c | 53 +++++++++++++++++++ drivers/net/wireless/realtek/rtw89/mac_be.c | 57 ++++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/mac.c +53 -0
@@ -2300,6 +2300,8 @@ static int preload_init_set_ax(struct rtw89_dev *rtwdev, u8 mac_idx, {u32 reg, max_preld_size, min_rsvd_size; +rtw89_io_pack (rtwdev); + max_preld_size = (mac_idx ==RTW89_MAC_0 ?PRELD_B0_ENT_NUM :PRELD_B1_ENT_NUM ) *PRELD_AMSDU_SIZE ; reg = mac_idx == RTW89_MAC_0 ?
@@ -2313,6 +2315,8 @@ static int preload_init_set_ax(struct rtw89_dev *rtwdev, u8 mac_idx,rtw89_write32_mask (rtwdev, reg,B_AX_B0_PRELD_NXT_TXENDWIN_MASK ,PRELD_NEXT_WND );rtw89_write32_mask (rtwdev, reg,B_AX_B0_PRELD_NXT_RSVMINSZ_MASK , min_rsvd_size); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2392,11 +2396,15 @@ static int sta_sch_init_ax(struct rtw89_dev *rtwdev)return ret; } +rtw89_io_pack (rtwdev); +rtw89_write32_set (rtwdev,R_AX_SS_CTRL ,B_AX_SS_WARM_INIT_FLG );rtw89_write32_clr (rtwdev,R_AX_SS_CTRL ,B_AX_SS_NONEMPTY_SS2FINFO_EN );_patch_ss2f_path (rtwdev); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2408,12 +2416,16 @@ static int mpdu_proc_init_ax(struct rtw89_dev *rtwdev)if (ret)return ret; +rtw89_io_pack (rtwdev); +rtw89_write32 (rtwdev,R_AX_ACTION_FWD0 ,TRXCFG_MPDU_PROC_ACT_FRWD );rtw89_write32 (rtwdev,R_AX_TF_FWD ,TRXCFG_MPDU_PROC_TF_FRWD );rtw89_write32_set (rtwdev,R_AX_MPDU_PROC ,B_AX_APPEND_FCS |B_AX_A_ICV_ERR );rtw89_write32 (rtwdev,R_AX_CUT_AMSDU_CTRL ,TRXCFG_MPDU_PROC_CUT_CTRL ); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2427,6 +2439,8 @@ static int sec_eng_init_ax(struct rtw89_dev *rtwdev)if (ret)return ret; +rtw89_io_pack (rtwdev); + val =rtw89_read32 (rtwdev,R_AX_SEC_ENG_CTRL );/* init clock */ val |= (B_AX_CLK_EN_CGCMP |B_AX_CLK_EN_WAPI |B_AX_CLK_EN_WEP_TKIP );
@@ -2452,6 +2466,8 @@ static int sec_eng_init_ax(struct rtw89_dev *rtwdev)rtw89_write32_mask (rtwdev,R_AX_SEC_DEBUG1 ,B_AX_TX_TIMEOUT_SEL_MASK ,AX_TX_TO_VAL ); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2535,6 +2551,8 @@ static int scheduler_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); + reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_PREBKF_CFG_1 , mac_idx);if (rtwdev->chip->chip_id ==RTL8852C ) rtw89_write32_mask(rtwdev, reg, B_AX_SIFS_MACTXEN_T1_MASK,
@@ -2563,6 +2581,8 @@ static int scheduler_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx) SCH_PREBKF_24US); } +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2631,6 +2651,8 @@ static int rx_fltr_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); +for (i =RTW89_MGNT ; i <=RTW89_DATA ; i++) { ret =rtw89_mac_typ_fltr_opt_ax (rtwdev, i,RTW89_FWD_TO_HOST , mac_idx);
@@ -2647,6 +2669,8 @@ static int rx_fltr_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)rtw89_write16 (rtwdev,rtw89_mac_reg_by_idx (rtwdev,R_AX_PLCP_HDR_FLTR , mac_idx), plcp_ftlr); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2693,6 +2717,8 @@ static int cca_ctrl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); + reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_CCA_CONTROL , mac_idx); val =rtw89_read32 (rtwdev, reg); val |= (B_AX_TB_CHK_BASIC_NAV | B_AX_TB_CHK_BTCCA |
@@ -2713,16 +2739,22 @@ static int cca_ctrl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)_patch_dis_resp_chk (rtwdev, mac_idx); +rtw89_io_unpack (rtwdev); +return 0 ; }static int nav_ctrl_init_ax (struct rtw89_dev *rtwdev) { +rtw89_io_pack (rtwdev); +rtw89_write32_set (rtwdev,R_AX_WMAC_NAV_CTL ,B_AX_WMAC_PLCP_UP_NAV_EN |B_AX_WMAC_TF_UP_NAV_EN |B_AX_WMAC_NAV_UPPER_EN );rtw89_write32_mask (rtwdev,R_AX_WMAC_NAV_CTL ,B_AX_WMAC_NAV_UPPER_MASK ,NAV_25MS ); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2734,12 +2766,17 @@ static int spatial_reuse_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx) ret =rtw89_mac_check_mac_en (rtwdev, mac_idx,RTW89_CMAC_SEL );if (ret)return ret; + +rtw89_io_pack (rtwdev); + reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_RX_SR_CTRL , mac_idx);rtw89_write8_clr (rtwdev, reg,B_AX_SR_EN ); reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_BSSID_SRC_CTRL , mac_idx);rtw89_write8_set (rtwdev, reg,B_AX_PLCP_SRC_EN ); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2752,6 +2789,8 @@ static int tmac_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); + reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_MAC_LOOPBACK , mac_idx);rtw89_write32_clr (rtwdev, reg,B_AX_MACLBK_EN );
@@ -2762,6 +2801,8 @@ static int tmac_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)rtw89_write32_mask (rtwdev, reg,B_AX_TXDFIFO_HIGH_MCS_THRE_MASK ,TXDFIFO_HIGH_MCS_THRE );rtw89_write32_mask (rtwdev, reg,B_AX_TXDFIFO_LOW_MCS_THRE_MASK ,TXDFIFO_LOW_MCS_THRE ); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2776,6 +2817,8 @@ static int trxptcl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); + reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_TRXPTCL_RESP_0 , mac_idx); val =rtw89_read32 (rtwdev, reg); val &= ~B_AX_WMAC_SPEC_SIFS_CCK_MASK ;
@@ -2806,6 +2849,8 @@ static int trxptcl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx) reg =rtw89_mac_reg_by_idx (rtwdev, rrsr->rsc.addr, mac_idx);rtw89_write32_mask (rtwdev, reg, rrsr->rsc.mask, rrsr->rsc.data); +rtw89_io_unpack (rtwdev); +return 0 ; }
@@ -2840,6 +2885,8 @@ static int rmac_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); +if (mac_idx ==RTW89_MAC_0 )rst_bacam (rtwdev);
@@ -2881,6 +2928,8 @@ static int rmac_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx) reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_PLCP_HDR_FLTR , mac_idx);rtw89_write8_clr (rtwdev, reg,B_AX_VHT_SU_SIGB_CRC_CHK ); +rtw89_io_unpack (rtwdev); +return ret; }
@@ -2932,6 +2981,8 @@ static int ptcl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)if (ret)return ret; +rtw89_io_pack (rtwdev); +if (rtwdev->hci.type ==RTW89_HCI_TYPE_PCIE ) { reg =rtw89_mac_reg_by_idx (rtwdev,R_AX_SIFS_SETTING , mac_idx); val =rtw89_read32 (rtwdev, reg);
@@ -2969,6 +3020,8 @@ static int ptcl_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx) B_AX_AMPDU_MAX_LEN_VHT_MASK, 0x3FF80); } +rtw89_io_unpack (rtwdev); +return 0 ; }
drivers/net/wireless/realtek/rtw89/mac_be.c +56 -1
220 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 10/16 wifi: rtw89: use firmware offload for PHY and RF batch register writes
In reply to Ping-Ke ShihFrom: Eric Huang <[email protected]>
Use firmware offload to perform batch register writes for PHY and RF. This reduces I/O operations, improves bus transfer efficiency, and decreases hardware initialization time.
Performance improvement on USB 2.0 HCI:
- rtw89_phy_init_bb_reg: 61 ms -> 5 ms
- rtw89_phy_init_rf_reg: 587 ms -> 106 ms
Use offload-aware delay functions (do_udelay and do_mdelay) for the delay calls in rtw89_phy_init_reg, rtw89_phy_config_rf_reg, and rtw89_phy_config_rf_reg_v1 to ensure compatibility with batch register writes.
--- drivers/net/wireless/realtek/rtw89/phy.c | 38 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-)
drivers/net/wireless/realtek/rtw89/phy.c +26 -12
@@ -1352,17 +1352,17 @@ static void rtw89_phy_config_bb_reg(struct rtw89_dev *rtwdev,u32 addr;if (reg->addr ==0xfe ) { -mdelay (50 ); +rtw89_io_mdelay (rtwdev,50 ); }else if (reg->addr ==0xfd ) { -mdelay (5 ); +rtw89_io_mdelay (rtwdev,5 ); }else if (reg->addr ==0xfc ) { -mdelay (1 ); +rtw89_io_mdelay (rtwdev,1 ); }else if (reg->addr ==0xfb ) { -udelay (50 ); +rtw89_io_udelay (rtwdev,50 ); }else if (reg->addr ==0xfa ) { -udelay (5 ); +rtw89_io_udelay (rtwdev,5 ); }else if (reg->addr ==0xf9 ) { -udelay (1 ); +rtw89_io_udelay (rtwdev,1 ); }else if (reg->data ==BYPASS_CR_DATA ) {rtw89_debug (rtwdev,RTW89_DBG_PHY_TRACK ,"Bypass CR 0x%x\n" , reg->addr); }else {
@@ -1692,17 +1692,17 @@ void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev, void *extra_data) {if (reg->addr ==0xfe ) { -mdelay (50 ); +rtw89_io_mdelay (rtwdev,50 ); }else if (reg->addr ==0xfd ) { -mdelay (5 ); +rtw89_io_mdelay (rtwdev,5 ); }else if (reg->addr ==0xfc ) { -mdelay (1 ); +rtw89_io_mdelay (rtwdev,1 ); }else if (reg->addr ==0xfb ) { -udelay (50 ); +rtw89_io_udelay (rtwdev,50 ); }else if (reg->addr ==0xfa ) { -udelay (5 ); +rtw89_io_udelay (rtwdev,5 ); }else if (reg->addr ==0xf9 ) { -udelay (1 ); +rtw89_io_udelay (rtwdev,1 ); }else {rtw89_write_rf (rtwdev, rf_path, reg->addr,0xfffff , reg->data); rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path,
@@ -1715,6 +1715,11 @@ void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, void *extra_data) { +if (reg->addr ==0xfe ) { +rtw89_io_mdelay (rtwdev,50 ); +return ; + } +rtw89_write_rf (rtwdev, rf_path, reg->addr,RFREG_MASK , reg->data);if (reg->addr <0x100 )
@@ -1885,11 +1890,16 @@ void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev)const struct rtw89_phy_table *bb_gain_table; bb_table = elm_info->bb_tbl ? elm_info->bb_tbl : chip->bb_table; + +rtw89_io_pack (rtwdev); +rtw89_phy_init_reg (rtwdev, bb_table, false, rtw89_phy_config_bb_reg,NULL );if (rtwdev->dbcc_en)rtw89_phy_init_reg (rtwdev, bb_table, false, rtw89_phy_config_bb_reg, (void *)RTW89_PHY_1 ); +rtw89_io_unpack (rtwdev); +rtw89_chip_init_txpwr_unit (rtwdev); bb_gain_table = elm_info->bb_gain ? elm_info->bb_gain : chip->bb_gain_table;
@@ -2016,7 +2026,11 @@ void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev, bool noio)else config = rf_table->config ? rf_table->config : rtw89_phy_config_rf_reg; + +rtw89_io_pack (rtwdev);rtw89_phy_init_reg (rtwdev, rf_table, by_acv, config, (void *)rf_reg_info); +rtw89_io_unpack (rtwdev); +if (rtw89_phy_config_rf_reg_fw (rtwdev, rf_reg_info))rtw89_warn (rtwdev,"rf path %d reg h2c config failed\n" , rf_reg_info->rf_path);
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 11/16 wifi: rtw89: 8832cu: Add ID 2c7c:8206 for RTL8832CU
In reply to Ping-Ke ShihFrom: Johnson Tsai <[email protected]>
This ID is used by RTL8832CU-based Quectel USB dongle devices.
--- drivers/net/wireless/realtek/rtw89/rtw8852cu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtw89/rtw8852cu.c +2 -0
@@ -53,6 +53,8 @@ static const struct usb_device_id rtw_8852cu_id_table[] = { .driver_info = (kernel_ulong_t)&rtw89_8852cu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x28de, 0x2432, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8852cu_info }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x8206, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&rtw89_8852cu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x35b2, 0x0502, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&rtw89_8852cu_info }, { USB_DEVICE_AND_INTERFACE_INFO(0x35bc, 0x0101, 0xff, 0xff, 0xff),
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 12/16 wifi: rtw89: use struct to fill C2H recv ack
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
This C2H packet is used to indicate that FW has received the corresponding H2C command. No logic is changed.
--- drivers/net/wireless/realtek/rtw89/fw.h | 18 ++++++++++-------- drivers/net/wireless/realtek/rtw89/mac.c | 13 ++++++++----- 2 files changed, 18 insertions(+), 13 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.h +10 -8
@@ -3886,14 +3886,16 @@ struct rtw89_c2h_done_ack {#define RTW89_C2H_SCAN_DONE_ACK_RETURN GENMASK(5, 0)#define RTW89_C2H_DONE_ACK_W2_H2C_SEQ GENMASK(31, 24) -#define RTW89_GET_MAC_C2H_REV_ACK_CAT (c2h) \ - le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0)) -#define RTW89_GET_MAC_C2H_REV_ACK_CLASS (c2h) \ - le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2)) -#define RTW89_GET_MAC_C2H_REV_ACK_FUNC (c2h) \ - le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) -#define RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ (c2h) \ - le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16)) +struct rtw89_c2h_rev_ack { +__le32 w0; +__le32 w1; +__le32 w2; +} __packed; + +#define RTW89_C2H_REV_ACK_W2_CAT GENMASK(1, 0) +#define RTW89_C2H_REV_ACK_W2_CLASS GENMASK(7, 2) +#define RTW89_C2H_REV_ACK_W2_FUNC GENMASK(15, 8) +#define RTW89_C2H_REV_ACK_W2_H2C_SEQ GENMASK(23, 16)struct rtw89_fw_c2h_log_fmt {__le16 signature;
drivers/net/wireless/realtek/rtw89/mac.c +8 -5
@@ -5406,16 +5406,19 @@ rtw89_mac_c2h_bcn_fltr_rpt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, }static void -rtw89_mac_c2h_rec_ack (struct rtw89_dev *rtwdev,struct sk_buff *c2h,u32 len) +rtw89_mac_c2h_rec_ack (struct rtw89_dev *rtwdev,struct sk_buff *skb_c2h,u32 len) {/* N.B. This will run in interrupt context. */ +const struct rtw89_c2h_rev_ack *c2h = (const void *)skb_c2h->data; + +u8 h2c_cat =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_CAT ); +u8 h2c_class =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_CLASS ); +u8 h2c_func =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_FUNC ); +u8 h2c_seq =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_H2C_SEQ );rtw89_debug (rtwdev,RTW89_DBG_FW ,"C2H rev ack recv, cat: %d, class: %d, func: %d, seq : %d\n" , -RTW89_GET_MAC_C2H_REV_ACK_CAT (c2h->data), -RTW89_GET_MAC_C2H_REV_ACK_CLASS (c2h->data), -RTW89_GET_MAC_C2H_REV_ACK_FUNC (c2h->data), -RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ (c2h->data)); + h2c_cat, h2c_class, h2c_func, h2c_seq); } static void
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 13/16 wifi: rtw89: check scan C2H event recv ack instead of C2H event done ack
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
The original flow checks the scan offload C2H event done ack to increase the scan sequence. However, the scan offload response C2H event may be received earlier than the scan offload C2H event done ack, which causes these C2H event to be dropped by rtw89_fw_c2h_purge_obsoleted_scan_events() check because the scan sequence of the scan offload response C2H event is less than the scan offload C2H event done ack. Therefore, checking the scan offload C2H event recv ack instead of C2H event done ack to fix this issue.
--- drivers/net/wireless/realtek/rtw89/mac.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/mac.c +20 -3
@@ -5415,10 +5415,30 @@ rtw89_mac_c2h_rec_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 lenu8 h2c_class =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_CLASS );u8 h2c_func =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_FUNC );u8 h2c_seq =le32_get_bits (c2h->w2,RTW89_C2H_REV_ACK_W2_H2C_SEQ ); +struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;rtw89_debug (rtwdev,RTW89_DBG_FW ,"C2H rev ack recv, cat: %d, class: %d, func: %d, seq : %d\n" , h2c_cat, h2c_class, h2c_func, h2c_seq); + +if (h2c_cat !=H2C_CAT_MAC ) +return ; + +switch (h2c_class) { +default : +return ; +case H2C_CL_MAC_FW_OFLD : +switch (h2c_func) { +default : +return ; +case H2C_FUNC_SCANOFLD : +case H2C_FUNC_SCANOFLD_BE : + scan_info->seq++; +break ; + } + +return ; + } } static void
@@ -5426,7 +5446,6 @@ rtw89_mac_c2h_done_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 le {/* N.B. This will run in interrupt context. */ struct rtw89_wait_info *fw_ofld_wait = &rtwdev->mac.fw_ofld_wait; -struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;struct rtw89_wait_info *ps_wait = &rtwdev->mac.ps_wait;const struct rtw89_c2h_done_ack *c2h = (const struct rtw89_c2h_done_ack *)skb_c2h->data;
@@ -5469,11 +5488,9 @@ rtw89_mac_c2h_done_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 le h2c_return &=RTW89_C2H_SCAN_DONE_ACK_RETURN ;break ;case H2C_FUNC_SCANOFLD : - scan_info->seq++; cond =RTW89_SCANOFLD_WAIT_COND_START ;break ;case H2C_FUNC_SCANOFLD_BE : - scan_info->seq++; cond =RTW89_SCANOFLD_BE_WAIT_COND_START ; h2c_return &=RTW89_C2H_SCAN_DONE_ACK_RETURN ;break ;
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 14/16 wifi: rtw89: suspend DIG when remain-on-channel
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
The PD (Packet Detection) lower bound is set after the STA interface connects. When the P2P interface attempts to find peers, it enters the remain-on-channel flow to listen for probe requests. However, if the RSSI of the connected AP is too high, the P2P interface fails to receive it. To resolve this, suspend the DIG during the remain-on-channel period.
--- drivers/net/wireless/realtek/rtw89/core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtw89/core.c +2 -0
@@ -4474,6 +4474,7 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) reg =rtw89_mac_reg_by_idx (rtwdev, mac->rx_fltr, rtwvif_link->mac_idx);rtw89_write32_clr (rtwdev, reg,B_AX_A_UC_CAM_MATCH |B_AX_A_BC_CAM_MATCH ); +rtw89_phy_dig_suspend (rtwdev);ieee80211_ready_on_channel (hw);wiphy_delayed_work_cancel (hw->wiphy, &rtwvif->roc.roc_work); wiphy_delayed_work_queue(hw->wiphy, &rtwvif->roc.roc_work,
@@ -4518,6 +4519,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)rtw89_core_handle_sta_pending_tx (rtwdev, rtwvif_link);queue_work (rtwdev->txq_wq, &rtwdev->txq_work); +rtw89_phy_dig_resume (rtwdev, true);if (hw->conf.flags &IEEE80211_CONF_IDLE ) wiphy_delayed_work_queue(hw->wiphy, &roc->roc_work,
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 15/16 wifi: rtw89: chan: introduce new helper to get entity current configuration
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
The original helper can only queries target channel, but cannot determine current role's status, e.g. is it MLD or not. These things should be a set. Adding more and more helpers to query them individually without synchronous doesn't seem right. Introduce a new helper to query current channel set and role status.
Besides, when single channel, e.g. MLO_2_PLUS_0_1RF and MLO_0_PLUS_2_1RF, the target channel pointer will be duplicated to fill the returned channel set. So, some callers can save trivial things for these cases. The returned channels will be non-NULL, so callers don't need trivial NULL check either.
--- drivers/net/wireless/realtek/rtw89/chan.c | 90 +++++++++++-------- drivers/net/wireless/realtek/rtw89/chan.h | 21 ++--- drivers/net/wireless/realtek/rtw89/core.c | 20 ++--- drivers/net/wireless/realtek/rtw89/phy.c | 12 ++- drivers/net/wireless/realtek/rtw89/phy_be.c | 8 +- .../net/wireless/realtek/rtw89/rtw8852b_rfk.c | 6 +- .../wireless/realtek/rtw89/rtw8852bt_rfk.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8922a.c | 17 +--- .../net/wireless/realtek/rtw89/rtw8922a_rfk.c | 22 +---- drivers/net/wireless/realtek/rtw89/rtw8922d.c | 30 +++++-- .../net/wireless/realtek/rtw89/rtw8922d_rfk.c | 22 +---- 11 files changed, 129 insertions(+), 125 deletions(-)
drivers/net/wireless/realtek/rtw89/chan.c +53 -37
@@ -398,43 +398,6 @@ static u8 rtw89_entity_role_get_index(struct rtw89_dev *rtwdev) } } -const struct rtw89_chan *__rtw89_mgnt_chan_get (struct rtw89_dev *rtwdev, -const char *caller_message, -u8 link_index,bool nullchk) -{ -struct rtw89_hal *hal = &rtwdev->hal; -struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt; -enum rtw89_chanctx_idx chanctx_idx; -u8 role_index; - -lockdep_assert_wiphy (rtwdev->hw->wiphy); - -if (unlikely (link_index >= __RTW89_MLD_MAX_LINK_NUM)) { -WARN (1 ,"link index %u is invalid (max link inst num: %d)\n" , - link_index, __RTW89_MLD_MAX_LINK_NUM); - goto dflt; - } - - role_index =rtw89_entity_role_get_index (rtwdev); - - chanctx_idx = mgnt->chanctx_tbl[role_index][link_index]; -if (chanctx_idx ==RTW89_CHANCTX_IDLE ) - goto dflt; - -return rtw89_chan_get (rtwdev, chanctx_idx); - -dflt: -if (unlikely (nullchk)) -return NULL ; - -rtw89_debug (rtwdev,RTW89_DBG_CHAN , -"%s (%s): prefetch NULL on link index %u\n" , - __func__, caller_message ?:"" , link_index); - -return rtw89_chan_get (rtwdev,RTW89_CHANCTX_0 ); -} -EXPORT_SYMBOL (__rtw89_mgnt_chan_get); -bool rtw89_entity_check_hw (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) {switch (rtwdev->mlo_dbcc_mode) {
@@ -457,6 +420,59 @@ void rtw89_entity_force_hw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)rtw89_debug (rtwdev,RTW89_DBG_CHAN ,"%s: (none)\n" , __func__); } +void rtw89_entity_get_conf (struct rtw89_dev *rtwdev,struct rtw89_entity_conf *conf) +{ +struct rtw89_entity_mgnt *mgnt = &rtwdev->hal.entity_mgnt; +enum rtw89_chanctx_idx idxes[ARRAY_SIZE (conf->chans)]; +struct rtw89_vif *role; +u8 ridx; +int i; + +lockdep_assert_wiphy (rtwdev->hw->wiphy); + +memset (conf,0 ,sizeof (*conf)); + + ridx =rtw89_entity_role_get_index (rtwdev); + role = mgnt->active_roles[ridx]; +if (role) { +struct ieee80211_vif *vif =rtwvif_to_vif (role); + + conf->is_mld =ieee80211_vif_is_mld (vif); + conf->en_emlsr = role->mlo_mode ==RTW89_MLO_MODE_EMLSR ; + } + +for (i =0 ; i <ARRAY_SIZE (idxes); i++) + idxes[i] =RTW89_CHANCTX_IDLE ; + +switch (rtwdev->mlo_dbcc_mode) { +default : +case MLO_2_PLUS_0_1RF : +set_bit (0 , conf->hw_bitmap); + idxes[0 ] = mgnt->chanctx_tbl[ridx][0 ]; + idxes[1 ] = idxes[0 ]; +break ; +case MLO_0_PLUS_2_1RF : +set_bit (1 , conf->hw_bitmap); + idxes[1 ] = mgnt->chanctx_tbl[ridx][1 ]; + idxes[0 ] = idxes[1 ]; +break ; +case MLO_1_PLUS_1_1RF : +set_bit (0 , conf->hw_bitmap); +set_bit (1 , conf->hw_bitmap); + idxes[0 ] = mgnt->chanctx_tbl[ridx][0 ]; + idxes[1 ] = mgnt->chanctx_tbl[ridx][1 ]; +break ; + } + +for (i =0 ; i <ARRAY_SIZE (idxes); i++) { +if (idxes[i] ==RTW89_CHANCTX_IDLE ) + idxes[i] =RTW89_CHANCTX_0 ; + + conf->chans[i] =rtw89_chan_get (rtwdev, idxes[i]); + } +} +EXPORT_SYMBOL (rtw89_entity_get_conf); +static enum rtw89_mlo_dbcc_mode rtw89_entity_sel_mlo_dbcc_mode (struct rtw89_dev *rtwdev,u8 active_hws) {
drivers/net/wireless/realtek/rtw89/chan.h +8 -13
@@ -116,6 +116,13 @@ struct rtw89_entity_weight {unsigned int active_roles; }; +struct rtw89_entity_conf { +bool is_mld; +bool en_emlsr; + DECLARE_BITMAP(hw_bitmap, __RTW89_MLD_MAX_LINK_NUM); +const struct rtw89_chan *chans[__RTW89_MLD_MAX_LINK_NUM]; +}; +static inline bool rtw89_get_entity_state (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) {
@@ -168,6 +175,7 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev);enum rtw89_entity_mode rtw89_entity_recalc (struct rtw89_dev *rtwdev);bool rtw89_entity_check_hw (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx);void rtw89_entity_force_hw (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx); +void rtw89_entity_get_conf (struct rtw89_dev *rtwdev,struct rtw89_entity_conf *conf);void rtw89_chanctx_work (struct wiphy *wiphy,struct wiphy_work *work);void rtw89_queue_chanctx_work (struct rtw89_dev *rtwdev); void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
@@ -180,19 +188,6 @@ void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,void rtw89_chanctx_proceed (struct rtw89_dev *rtwdev,const struct rtw89_chanctx_cb_parm *cb_parm); -const struct rtw89_chan *__rtw89_mgnt_chan_get (struct rtw89_dev *rtwdev, -const char *caller_message, -u8 link_index,bool nullchk); - -#define rtw89_mgnt_chan_get (rtwdev, link_index) \ - __rtw89_mgnt_chan_get(rtwdev, __func__, link_index, false) - -static inline const struct rtw89_chan * -rtw89_mgnt_chan_get_or_null (struct rtw89_dev *rtwdev,u8 link_index) -{ -return __rtw89_mgnt_chan_get (rtwdev,NULL , link_index, true); -} -struct rtw89_mcc_links_info {struct rtw89_vif_link *links[NUM_OF_RTW89_MCC_ROLES ]; };
drivers/net/wireless/realtek/rtw89/core.c +10 -10
@@ -474,16 +474,16 @@ static void __rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev,void rtw89_core_set_chip_txpwr (struct rtw89_dev *rtwdev) { -const struct rtw89_chan *chan; +struct rtw89_entity_conf conf; + +rtw89_entity_get_conf (rtwdev, &conf); - chan =rtw89_mgnt_chan_get (rtwdev,0 ); -__rtw89_core_set_chip_txpwr (rtwdev, chan,RTW89_PHY_0 ); +__rtw89_core_set_chip_txpwr (rtwdev, conf.chans[0 ],RTW89_PHY_0 );if (rtwdev->chip->chip_gen ==RTW89_CHIP_AX )return ; - chan =rtw89_mgnt_chan_get (rtwdev,1 ); -__rtw89_core_set_chip_txpwr (rtwdev, chan,RTW89_PHY_1 ); +__rtw89_core_set_chip_txpwr (rtwdev, conf.chans[1 ],RTW89_PHY_1 ); } void rtw89_chip_rfk_channel(struct rtw89_dev *rtwdev,
@@ -562,7 +562,7 @@ static void __rtw89_set_channel(struct rtw89_dev *rtwdev,int rtw89_set_channel (struct rtw89_dev *rtwdev) { -const struct rtw89_chan *chan; +struct rtw89_entity_conf conf;enum rtw89_entity_mode mode; mode =rtw89_entity_recalc (rtwdev);
@@ -571,14 +571,14 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)return -EINVAL ; } - chan =rtw89_mgnt_chan_get (rtwdev,0 ); -__rtw89_set_channel (rtwdev, chan,RTW89_MAC_0 ,RTW89_PHY_0 ); +rtw89_entity_get_conf (rtwdev, &conf); + +__rtw89_set_channel (rtwdev, conf.chans[0 ],RTW89_MAC_0 ,RTW89_PHY_0 );if (rtwdev->chip->chip_gen ==RTW89_CHIP_AX )return 0 ; - chan =rtw89_mgnt_chan_get (rtwdev,1 ); -__rtw89_set_channel (rtwdev, chan,RTW89_MAC_1 ,RTW89_PHY_1 ); +__rtw89_set_channel (rtwdev, conf.chans[1 ],RTW89_MAC_1 ,RTW89_PHY_1 );return 0 ; }
drivers/net/wireless/realtek/rtw89/phy.c +10 -2
@@ -6839,11 +6839,15 @@ static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev,static void rtw89_phy_dig_update_para (struct rtw89_dev *rtwdev,struct rtw89_bb_ctx *bb) { -const struct rtw89_chan *chan =rtw89_mgnt_chan_get (rtwdev, bb->phy_idx);struct rtw89_dig_info *dig = &bb->dig;bool is_linked = rtwdev->total_sta_assoc >0 ; +struct rtw89_entity_conf conf; +const struct rtw89_chan *chan;const u16 *fa_th_src =NULL ; +rtw89_entity_get_conf (rtwdev, &conf); + chan = conf.chans[bb->phy_idx]; +switch (chan->band_type) {case RTW89_BAND_2G : dig->lna_gain = dig->lna_gain_g;
@@ -7173,14 +7177,18 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev,struct rtw89_bb_ctx *bb, u8 rssi, bool enable) { - const struct rtw89_chan *chan = rtw89_mgnt_chan_get(rtwdev, bb->phy_idx); const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;struct rtw89_dig_info *dig = &bb->dig;struct rtw89_hal *hal = &rtwdev->hal;u8 final_rssi, under_region = dig->pd_low_th_ofst; +struct rtw89_entity_conf conf; +const struct rtw89_chan *chan;s8 cck_cca_th;u32 pd_val; +rtw89_entity_get_conf (rtwdev, &conf); + chan = conf.chans[bb->phy_idx]; +if (hal->disabled_dm_bitmap &BIT (RTW89_DM_DIG_PD )) { pd_val = hal->fixed_dig_pd_th;
drivers/net/wireless/realtek/rtw89/phy_be.c +5 -3
@@ -865,6 +865,7 @@ static void rtw89_phy_bb_wrap_tx_rfsi_ctrl_init(struct rtw89_dev *rtwdev, {enum rtw89_phy_idx phy_idx = mac_idx !=RTW89_MAC_0 ?RTW89_PHY_1 :RTW89_PHY_0 ;enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; +struct rtw89_entity_conf conf;const struct rtw89_chan *chan;if (chip_id !=RTL8922D )
@@ -879,9 +880,10 @@ static void rtw89_phy_bb_wrap_tx_rfsi_ctrl_init(struct rtw89_dev *rtwdev,rtw89_phy_bb_wrap_set_rfsi_ct_opt (rtwdev, phy_idx); - chan =rtw89_mgnt_chan_get (rtwdev, phy_idx); -if (chan) -rtw89_phy_bb_wrap_set_rfsi_bandedge_ch (rtwdev, chan, phy_idx); +rtw89_entity_get_conf (rtwdev, &conf); + chan = conf.chans[phy_idx]; + +rtw89_phy_bb_wrap_set_rfsi_bandedge_ch (rtwdev, chan, phy_idx); }static void rtw89_phy_bb_wrap_ul_pwr (struct rtw89_dev *rtwdev)
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c +5 -1
@@ -4167,11 +4167,15 @@ void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev,void rtw8852b_mcc_get_ch_info (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) { -const struct rtw89_chan *chan =rtw89_mgnt_chan_get (rtwdev,0 );struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;struct rtw89_rfk_chan_desc desc[__RTW89_RFK_CHS_NR_V0] = {}; +struct rtw89_entity_conf conf; +const struct rtw89_chan *chan;u8 idx; +rtw89_entity_get_conf (rtwdev, &conf); + chan = conf.chans[0 ]; +for (idx =0 ; idx <ARRAY_SIZE (desc); idx++) {struct rtw89_rfk_chan_desc *p = &desc[idx];
drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c +5 -1
@@ -4234,11 +4234,15 @@ void rtw8852bt_set_channel_rf(struct rtw89_dev *rtwdev,void rtw8852bt_mcc_get_ch_info (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) { -const struct rtw89_chan *chan =rtw89_mgnt_chan_get (rtwdev,0 );struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;struct rtw89_rfk_chan_desc desc[__RTW89_RFK_CHS_NR_V0] = {}; +struct rtw89_entity_conf conf; +const struct rtw89_chan *chan;u8 idx; +rtw89_entity_get_conf (rtwdev, &conf); + chan = conf.chans[0 ]; +for (idx =0 ; idx <ARRAY_SIZE (desc); idx++) {struct rtw89_rfk_chan_desc *p = &desc[idx];
drivers/net/wireless/realtek/rtw89/rtw8922a.c +4 -13
@@ -1860,7 +1860,7 @@ static void rtw8922a_digital_pwr_comp(struct rtw89_dev *rtwdev,static int rtw8922a_ctrl_mlo (struct rtw89_dev *rtwdev,enum rtw89_mlo_dbcc_mode mode) { -const struct rtw89_chan *chan0, *chan1; +struct rtw89_entity_conf conf;if (mode ==MLO_1_PLUS_1_1RF || mode ==DBCC_LEGACY ) {rtw89_phy_write32_mask (rtwdev,R_DBCC ,B_DBCC_EN ,0x1 );
@@ -1873,19 +1873,10 @@ static int rtw8922a_ctrl_mlo(struct rtw89_dev *rtwdev, enum rtw89_mlo_dbcc_modereturn -EOPNOTSUPP ; } -if (mode ==MLO_1_PLUS_1_1RF ) { - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - }else if (mode ==MLO_0_PLUS_2_1RF ) { - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - chan0 = chan1; - }else { - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 = chan0; - } +rtw89_entity_get_conf (rtwdev, &conf); -rtw8922a_ctrl_afe_dac (rtwdev, chan0->band_width,RF_PATH_A ); -rtw8922a_ctrl_afe_dac (rtwdev, chan1->band_width,RF_PATH_B ); +rtw8922a_ctrl_afe_dac (rtwdev, conf.chans[0 ]->band_width,RF_PATH_A ); +rtw8922a_ctrl_afe_dac (rtwdev, conf.chans[1 ]->band_width,RF_PATH_B );rtw89_phy_write32_mask (rtwdev,R_EMLSR ,B_EMLSR_PARM ,0x6180 );
drivers/net/wireless/realtek/rtw89/rtw8922a_rfk.c +4 -18
@@ -278,27 +278,13 @@ static u8 rtw8922a_chlk_reload_sel_tbl(struct rtw89_dev *rtwdev,static void rtw8922a_chlk_reload (struct rtw89_dev *rtwdev) { -const struct rtw89_chan *chan0, *chan1; +struct rtw89_entity_conf conf;u8 s0_tbl, s1_tbl; -switch (rtwdev->mlo_dbcc_mode) { -default : -case MLO_2_PLUS_0_1RF : - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 = chan0; -break ; -case MLO_0_PLUS_2_1RF : - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - chan0 = chan1; -break ; -case MLO_1_PLUS_1_1RF : - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); -break ; - } +rtw89_entity_get_conf (rtwdev, &conf); - s0_tbl =rtw8922a_chlk_reload_sel_tbl (rtwdev, chan0,0 ); - s1_tbl =rtw8922a_chlk_reload_sel_tbl (rtwdev, chan1,1 ); + s0_tbl =rtw8922a_chlk_reload_sel_tbl (rtwdev, conf.chans[0 ],0 ); + s1_tbl =rtw8922a_chlk_reload_sel_tbl (rtwdev, conf.chans[1 ],1 );rtw8922a_chlk_ktbl_sel (rtwdev,RF_A , s0_tbl);rtw8922a_chlk_ktbl_sel (rtwdev,RF_B , s1_tbl);
drivers/net/wireless/realtek/rtw89/rtw8922d.c +21 -9
@@ -1943,10 +1943,19 @@ static void rtw8922d_set_digital_pwr_comp(struct rtw89_dev *rtwdev,static void rtw8922d_digital_pwr_comp (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) { -const struct rtw89_chan *chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); -const struct rtw89_chan *chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - -if (rtwdev->mlo_dbcc_mode ==MLO_1_PLUS_1_1RF ) { +const struct rtw89_chan *chan0, *chan1; +struct rtw89_entity_conf conf; + +rtw89_entity_get_conf (rtwdev, &conf); + chan0 = conf.chans[0 ]; + chan1 = conf.chans[1 ]; + +if (conf.en_emlsr) { +rtw8922d_set_digital_pwr_comp (rtwdev, chan0,1 ,RF_PATH_A ,RTW89_PHY_0 ); +rtw8922d_set_digital_pwr_comp (rtwdev, chan0,1 ,RF_PATH_B ,RTW89_PHY_0 ); +rtw8922d_set_digital_pwr_comp (rtwdev, chan1,1 ,RF_PATH_A ,RTW89_PHY_1 ); +rtw8922d_set_digital_pwr_comp (rtwdev, chan1,1 ,RF_PATH_B ,RTW89_PHY_1 ); + }else if (rtwdev->mlo_dbcc_mode ==MLO_1_PLUS_1_1RF ) {rtw8922d_set_digital_pwr_comp (rtwdev, chan0,0 ,RF_PATH_A ,RTW89_PHY_0 );rtw8922d_set_digital_pwr_comp (rtwdev, chan1,0 ,RF_PATH_B ,RTW89_PHY_1 ); }else {
@@ -1958,7 +1967,6 @@ static void rtw8922d_digital_pwr_comp(struct rtw89_dev *rtwdev,static int rtw8922d_ctrl_mlo (struct rtw89_dev *rtwdev,enum rtw89_mlo_dbcc_mode mode,bool pwr_comp) { -const struct rtw89_chan *chan1;u32 reg0, reg1;u8 cck_phy_idx;
@@ -2016,8 +2024,10 @@ static int rtw8922d_ctrl_mlo(struct rtw89_dev *rtwdev, enum rtw89_mlo_dbcc_modertw89_write32_mask (rtwdev, reg0,B_BBWRAP_ELMSR_EN_BE4 ,0 );rtw89_write32_mask (rtwdev, reg1,B_BBWRAP_ELMSR_EN_BE4 ,0 ); }else if ((mode ==MLO_1_PLUS_1_1RF ) || (mode ==DBCC_LEGACY )) { - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - cck_phy_idx = chan1->band_type ==RTW89_BAND_2G ? +struct rtw89_entity_conf conf; + +rtw89_entity_get_conf (rtwdev, &conf); + cck_phy_idx = conf.chans[1 ]->band_type ==RTW89_BAND_2G ?RTW89_PHY_1 :RTW89_PHY_0 ; rtw89_phy_write32_mask(rtwdev, R_SYS_DBCC_BE4,
@@ -2475,9 +2485,11 @@ static void rtw8922d_set_txpwr(struct rtw89_dev *rtwdev,static void rtw8922d_set_txpwr_ctrl (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx) { -const struct rtw89_chan *chan =rtw89_mgnt_chan_get (rtwdev, phy_idx); +struct rtw89_entity_conf conf; -rtw8922d_set_txpwr_ref (rtwdev, chan, phy_idx); +rtw89_entity_get_conf (rtwdev, &conf); + +rtw8922d_set_txpwr_ref (rtwdev, conf.chans[phy_idx], phy_idx); } static void rtw8922d_ctrl_trx_path(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/rtw8922d_rfk.c +4 -18
@@ -187,27 +187,13 @@ static u8 rtw8922d_chlk_reload_sel_tbl(struct rtw89_dev *rtwdev,static void rtw8922d_chlk_reload (struct rtw89_dev *rtwdev) { -const struct rtw89_chan *chan0, *chan1; +struct rtw89_entity_conf conf;u8 s0_tbl, s1_tbl; -switch (rtwdev->mlo_dbcc_mode) { -default : -case MLO_2_PLUS_0_1RF : - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 = chan0; -break ; -case MLO_0_PLUS_2_1RF : - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); - chan0 = chan1; -break ; -case MLO_1_PLUS_1_1RF : - chan0 =rtw89_mgnt_chan_get (rtwdev,0 ); - chan1 =rtw89_mgnt_chan_get (rtwdev,1 ); -break ; - } +rtw89_entity_get_conf (rtwdev, &conf); - s0_tbl =rtw8922d_chlk_reload_sel_tbl (rtwdev, chan0,0 ); - s1_tbl =rtw8922d_chlk_reload_sel_tbl (rtwdev, chan1,1 ); + s0_tbl =rtw8922d_chlk_reload_sel_tbl (rtwdev, conf.chans[0 ],0 ); + s1_tbl =rtw8922d_chlk_reload_sel_tbl (rtwdev, conf.chans[1 ],1 );rtw8922d_chlk_ktbl_sel (rtwdev,RF_A , s0_tbl);rtw8922d_chlk_ktbl_sel (rtwdev,RF_B , s1_tbl);
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 16/16 wifi: rtw89: 8922d: update RF calibration flow for MLD
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
RF calibration (RFK) will record the results in HW RFK tables. SW can select and configure the target HW RFK table to reuse the RFK result on the target channel. Though the above can work as before, when MLD runs eMLSR mode, a faster switching between links than SW is needed.
So, introduce a new working flow for MLD. With the new settings, HW can easily switch RFK results between links during eMLSR mode.
--- drivers/net/wireless/realtek/rtw89/reg.h | 4 ++ drivers/net/wireless/realtek/rtw89/rtw8922d.c | 7 ++ .../net/wireless/realtek/rtw89/rtw8922d_rfk.c | 70 +++++++++++++++---- .../net/wireless/realtek/rtw89/rtw8922d_rfk.h | 1 + 4 files changed, 69 insertions(+), 13 deletions(-)
drivers/net/wireless/realtek/rtw89/reg.h +4 -0
@@ -8462,6 +8462,8 @@#define RR_MODOPT_V1 0x10001#define RR_SW_SEL BIT(19)#define RR_TXG_SEL GENMASK(19, 17) +#define RR_TBL_SEL_IDX1 GENMASK(9, 8) +#define RR_TBL_SEL_IDX0 GENMASK(7, 6)#define RR_MODOPT_M_TXPWR GENMASK(5, 0)#define RR_WLSEL 0x02#define RR_WLSEL_AG GENMASK(18, 16)
@@ -10687,6 +10689,8 @@#define R_KTBL0B_BE4 0x38204#define B_KTBL0_IDX0 GENMASK(1, 0)#define B_KTBL0_IDX1 GENMASK(9, 8) +#define B_KTBL0_MLD_IDX0 GENMASK(25, 24) +#define B_KTBL0_MLD_IDX1 GENMASK(27, 26)#define B_KTBL0_RST BIT(31)#define R_KTBL1A_BE4 0x38154#define R_KTBL1B_BE4 0x38254
drivers/net/wireless/realtek/rtw89/rtw8922d.c +7 -0
@@ -2332,12 +2332,16 @@ static void rtw8922d_rfk_tssi(struct rtw89_dev *rtwdev,static void rtw8922d_rfk_channel (struct rtw89_dev *rtwdev,struct rtw89_vif_link *rtwvif_link) { +struct ieee80211_vif *vif =rtwvif_to_vif (rtwvif_link->rtwvif);enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;const struct rtw89_chan *chan =rtw89_chan_get (rtwdev, chanctx_idx);enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;u8 phy_map =rtw89_btc_phymap (rtwdev, phy_idx,RF_AB , chanctx_idx);u32 tx_en; +if (ieee80211_vif_is_mld (vif)) +rtw8922d_chlk_ktbl_ctl_mld (rtwdev, phy_idx, true); +rtw89_btc_ntfy_wl_rfk (rtwdev, phy_map,BTC_WRFKT_CHLK ,BTC_WRFK_START );rtw89_chip_stop_sch_tx (rtwdev, phy_idx, &tx_en,RTW89_SCH_TX_SEL_ALL );_wait_rx_mode (rtwdev,RF_AB );
@@ -2353,6 +2357,9 @@ static void rtw8922d_rfk_channel(struct rtw89_dev *rtwdev,rtw89_chip_resume_sch_tx (rtwdev, phy_idx, tx_en);rtw89_btc_ntfy_wl_rfk (rtwdev, phy_map,BTC_WRFKT_CHLK ,BTC_WRFK_STOP ); + +if (ieee80211_vif_is_mld (vif)) +rtw8922d_chlk_ktbl_ctl_mld (rtwdev, phy_idx, false); } static void rtw8922d_rfk_band_changed(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/rtw8922d_rfk.c +57 -13
91 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/rtw8922d_rfk.h +1 -0
@@ -18,5 +18,6 @@ void rtw8922d_rfk_mlo_ctrl(struct rtw89_dev *rtwdev);void rtw8922d_pre_set_channel_rf (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx);void rtw8922d_post_set_channel_rf (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx);void rtw8922d_lck_track (struct rtw89_dev *rtwdev); +void rtw8922d_chlk_ktbl_ctl_mld (struct rtw89_dev *rtwdev,enum rtw89_phy_idx phy_idx,bool manual);#endif
Signature · 1 line
2.25.1