wifi: rtw89: add firmware features for 8852B
Ping-Ke Shih
maintainercover wifi: rtw89: add firmware features for 8852B
We have implemented and verified these firmware features, so turn on them by this patchset.
Among the features, HW_SCAN needs additional process, because the setting of RX report channel information is different from driver, so adjust the code by patches 3/6 and 4/6.
Chin-Yen Lee (1):
wifi: rtw89: add tx_wake notify for 8852B
Ping-Ke Shih (1):
wifi: rtw89: 8852b: enable hw_scan support
Po-Hao Huang (2):
wifi: rtw89: adjust channel encoding to common function
wifi: rtw89: 8852b: add channel encoding for hw_scan
Zong-Zhe Yang (2):
wifi: rtw89: fw: configure CRASH_TRIGGER feature for 8852B
wifi: rtw89: refine FW feature judgement on packet drop
drivers/net/wireless/realtek/rtw89/core.h | 2 +- drivers/net/wireless/realtek/rtw89/fw.c | 7 +- drivers/net/wireless/realtek/rtw89/mac.c | 2 +- drivers/net/wireless/realtek/rtw89/mac80211.c | 2 +- drivers/net/wireless/realtek/rtw89/phy.c | 72 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/phy.h | 3 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 12 +-- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 74 +------------------ 8 files changed, 92 insertions(+), 82 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/6 wifi: rtw89: add tx_wake notify for 8852B
From: Chin-Yen Lee <[email protected]>
8852B has the same issue: management frames get stuck when wifi chip enters low ps mode, so we alse add notify wake function to trigger wifi chip wake before forwarding management frames.
--- drivers/net/wireless/realtek/rtw89/fw.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/realtek/rtw89/fw.c +1 -0
@@ -258,6 +258,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,36 ,0 ,CRASH_TRIGGER ),__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,38 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,NO_LPS_PG ), +__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,TX_WAKE ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,20 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852C , le,0 ,27 ,33 ,0 ,NO_DEEP_PS ), __CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
Signature · 1 line
2.25.1
Re: [PATCH 1/6] wifi: rtw89: add tx_wake notify for 8852B
Quoted 8 lines · Ping-Ke Shih
From: Chin-Yen Lee <[email protected]>
8852B has the same issue: management frames get stuck when wifi chip enters low ps mode, so we alse add notify wake function to trigger wifi chip wake before forwarding management frames.
Signed-off-by Chin-Yen Lee <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
6 patches applied to wireless-next.git, thanks.
aa4e05594546 wifi: rtw89: add tx_wake notify for 8852B 31c416e69dbf wifi: rtw89: fw: configure CRASH_TRIGGER feature for 8852B bb9040b3ff97 wifi: rtw89: adjust channel encoding to common function 4f24d7aa575a wifi: rtw89: 8852b: add channel encoding for hw_scan 357277e1afda wifi: rtw89: 8852b: enable hw_scan support 0d1f7ff19d4f wifi: rtw89: refine FW feature judgement on packet drop
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH 2/6 wifi: rtw89: fw: configure CRASH_TRIGGER feature for 8852B
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
RTL8852B firmware supports CRASH_TRIGGER feature from v0.29.29.0. After this is configured, debugfs fw_crash can support type 1 on RTL8852B to trigger firmware crash and verify L2 recovery through simulation.
--- drivers/net/wireless/realtek/rtw89/fw.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/realtek/rtw89/fw.c +1 -0
@@ -259,6 +259,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,38 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,NO_LPS_PG ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,TX_WAKE ), +__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,29 ,0 ,CRASH_TRIGGER ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,20 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852C , le,0 ,27 ,33 ,0 ,NO_DEEP_PS ), __CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/6 wifi: rtw89: adjust channel encoding to common function
In reply to Ping-Ke ShihFrom: Po-Hao Huang <[email protected]>
Since the range of channel table is identical among ICs. Make channel encode/decode function common and not IC dependent. So all ICs with matching firmware that needs this kind of coding can use it directly. This patch doesn't change logic at all.
--- drivers/net/wireless/realtek/rtw89/phy.c | 72 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/phy.h | 3 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 74 +------------------ 3 files changed, 77 insertions(+), 72 deletions(-)
drivers/net/wireless/realtek/rtw89/phy.c +72 -0
@@ -4294,3 +4294,75 @@ void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev, data[RTW89_TSSI_SBW20]); }EXPORT_SYMBOL (rtw89_phy_tssi_ctrl_set_bandedge_cfg); + +static +const u8 rtw89_ch_base_table[16 ] = {1 ,0xff , +36 ,100 ,132 ,149 ,0xff , +1 ,33 ,65 ,97 ,129 ,161 ,193 ,225 ,0xff }; +#define RTW89_CH_BASE_IDX_2G 0 +#define RTW89_CH_BASE_IDX_5G_FIRST 2 +#define RTW89_CH_BASE_IDX_5G_LAST 5 +#define RTW89_CH_BASE_IDX_6G_FIRST 7 +#define RTW89_CH_BASE_IDX_6G_LAST 14 + +#define RTW89_CH_BASE_IDX_MASK GENMASK(7, 4) +#define RTW89_CH_OFFSET_MASK GENMASK(3, 0) + +u8 rtw89_encode_chan_idx (struct rtw89_dev *rtwdev,u8 central_ch,u8 band) +{ +u8 chan_idx; +u8 last, first; +u8 idx; + +switch (band) { +case RTW89_BAND_2G : + chan_idx =FIELD_PREP (RTW89_CH_BASE_IDX_MASK ,RTW89_CH_BASE_IDX_2G ) | +FIELD_PREP (RTW89_CH_OFFSET_MASK , central_ch); +return chan_idx; +case RTW89_BAND_5G : + first =RTW89_CH_BASE_IDX_5G_FIRST ; + last =RTW89_CH_BASE_IDX_5G_LAST ; +break ; +case RTW89_BAND_6G : + first =RTW89_CH_BASE_IDX_6G_FIRST ; + last =RTW89_CH_BASE_IDX_6G_LAST ; +break ; +default : +rtw89_warn (rtwdev,"Unsupported band %d\n" , band); +return 0 ; + } + +for (idx = last; idx >= first; idx--) +if (central_ch >= rtw89_ch_base_table[idx]) +break ; + +if (idx < first) { +rtw89_warn (rtwdev,"Unknown band %d channel %d\n" , band, central_ch); +return 0 ; + } + + chan_idx =FIELD_PREP (RTW89_CH_BASE_IDX_MASK , idx) | +FIELD_PREP (RTW89_CH_OFFSET_MASK , + (central_ch - rtw89_ch_base_table[idx]) >>1 ); +return chan_idx; +} +EXPORT_SYMBOL (rtw89_encode_chan_idx); + +void rtw89_decode_chan_idx (struct rtw89_dev *rtwdev,u8 chan_idx, +u8 *ch,enum nl80211_band *band) +{ +u8 idx, offset; + + idx =FIELD_GET (RTW89_CH_BASE_IDX_MASK , chan_idx); + offset =FIELD_GET (RTW89_CH_OFFSET_MASK , chan_idx); + +if (idx ==RTW89_CH_BASE_IDX_2G ) { + *band =NL80211_BAND_2GHZ ; + *ch = offset; +return ; + } + + *band = idx <=RTW89_CH_BASE_IDX_5G_LAST ?NL80211_BAND_5GHZ :NL80211_BAND_6GHZ ; + *ch = rtw89_ch_base_table[idx] + (offset <<1 ); +} +EXPORT_SYMBOL (rtw89_decode_chan_idx);
drivers/net/wireless/realtek/rtw89/phy.h +3 -0
@@ -555,5 +555,8 @@ void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev, enum rtw89_tssi_bandedge_cfg bandedge_cfg);void rtw89_phy_ul_tb_assoc (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif);void rtw89_phy_ul_tb_ctrl_track (struct rtw89_dev *rtwdev); +u8 rtw89_encode_chan_idx (struct rtw89_dev *rtwdev,u8 central_ch,u8 band); +void rtw89_decode_chan_idx (struct rtw89_dev *rtwdev,u8 chan_idx, +u8 *ch,enum nl80211_band *band);#endif
drivers/net/wireless/realtek/rtw89/rtw8852c.c +2 -72
92 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/6 wifi: rtw89: 8852b: add channel encoding for hw_scan
In reply to Ping-Ke ShihFrom: Po-Hao Huang <[email protected]>
To obtain correct packet frequency for hw_scan, 52b needs to decode the channel index obtained from hardware. Change the driver related set channel part as well to make driver/firmware compatible.
--- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw89/rtw8852b.c +7 -5
@@ -1422,6 +1422,7 @@ static void rtw8852b_set_channel_bb(struct rtw89_dev *rtwdev, const struct rtw89 {bool cck_en = chan->channel <=14 ;u8 pri_ch_idx = chan->pri_ch_idx; +u8 band = chan->band_type, chan_idx;if (cck_en)rtw8852b_ctrl_sco_cck (rtwdev, chan->primary_channel);
@@ -1444,8 +1445,8 @@ static void rtw8852b_set_channel_bb(struct rtw89_dev *rtwdev, const struct rtw89 B_BT_DYN_DC_EST_EN_MSK, 0x0);rtw89_phy_write32_mask (rtwdev,R_GNT_BT_WGT_EN ,B_GNT_BT_WGT_EN ,0x0 ); } -rtw89_phy_write32_mask (rtwdev,R_MAC_PIN_SEL ,B_CH_IDX_SEG0 , - chan->primary_channel); + chan_idx =rtw89_encode_chan_idx (rtwdev, chan->primary_channel, band); +rtw89_phy_write32_mask (rtwdev,R_MAC_PIN_SEL ,B_CH_IDX_SEG0 , chan_idx);rtw8852b_5m_mask (rtwdev, chan, phy_idx);rtw8852b_bb_set_pop (rtwdev);rtw8852b_bb_reset_all (rtwdev, phy_idx);
@@ -2299,13 +2300,14 @@ static void rtw8852b_fill_freq_with_ppdu(struct rtw89_dev *rtwdev, struct ieee80211_rx_status *status) {u16 chan = phy_ppdu->chan_idx; -u8 band; +enum nl80211_band band; +u8 ch;if (chan ==0 )return ; - band = chan <=14 ?NL80211_BAND_2GHZ :NL80211_BAND_5GHZ ; - status->freq =ieee80211_channel_to_frequency (chan, band); +rtw89_decode_chan_idx (rtwdev, chan, &ch, &band); + status->freq =ieee80211_channel_to_frequency (ch, band); status->band = band; }
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/6 wifi: rtw89: 8852b: enable hw_scan support
In reply to Ping-Ke ShihThis enables hw_scan for 8852b after firmware version 0.29.29.0.
--- drivers/net/wireless/realtek/rtw89/fw.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/realtek/rtw89/fw.c +1 -0
@@ -260,6 +260,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,NO_LPS_PG ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,TX_WAKE ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,29 ,0 ,CRASH_TRIGGER ), +__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,29 ,0 ,SCAN_OFFLOAD ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,20 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852C , le,0 ,27 ,33 ,0 ,NO_DEEP_PS ), __CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 6/6 wifi: rtw89: refine FW feature judgement on packet drop
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
The newer chips use the newer firmware branches, e.g. v027, v029. And, those firmware branches are supposed to support packet drop when they are just branched out.
The initial firmware branch used by each chip is as below.
* 8852A: v009
* 8852C: v027
* 8852B: v027
So, only 8852A may use firmware which doesn't support packet drop at runtime. To save trivial positive listing in firmware feature table, we change to reverse judgment.
Besides, rtw89_mac_ptk_drop_by_band_and_wait() missed to check firmware feature before calling rtw89_fw_h2c_pkt_drop(). We also fix it.
--- drivers/net/wireless/realtek/rtw89/core.h | 2 +- drivers/net/wireless/realtek/rtw89/fw.c | 4 ++-- drivers/net/wireless/realtek/rtw89/mac.c | 2 +- drivers/net/wireless/realtek/rtw89/mac80211.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -1
@@ -3023,7 +3023,7 @@ enum rtw89_fw_feature {RTW89_FW_FEATURE_SCAN_OFFLOAD ,RTW89_FW_FEATURE_TX_WAKE ,RTW89_FW_FEATURE_CRASH_TRIGGER , -RTW89_FW_FEATURE_PACKET_DROP , +RTW89_FW_FEATURE_NO_PACKET_DROP ,RTW89_FW_FEATURE_NO_DEEP_PS , RTW89_FW_FEATURE_NO_LPS_PG, };
drivers/net/wireless/realtek/rtw89/fw.c +2 -2
@@ -235,6 +235,7 @@ static bool __fw_feat_cond_ ## __cond(u32 suit_ver_code, u32 comp_ver_code) \ __DEF_FW_FEAT_COND(ge, >=); /* greater or equal */ __DEF_FW_FEAT_COND(le, <=); /* less or equal */ +__DEF_FW_FEAT_COND(lt, <); /* less than */struct __fw_feat_cfg {enum rtw89_core_chip_id chip_id;
@@ -256,12 +257,11 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,35 ,0 ,SCAN_OFFLOAD ),__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,35 ,0 ,TX_WAKE ),__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,36 ,0 ,CRASH_TRIGGER ), -__CFG_FW_FEAT (RTL8852A , ge,0 ,13 ,38 ,0 ,PACKET_DROP ), +__CFG_FW_FEAT (RTL8852A , lt,0 ,13 ,38 ,0 ,NO_PACKET_DROP ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,NO_LPS_PG ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,26 ,0 ,TX_WAKE ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,29 ,0 ,CRASH_TRIGGER ),__CFG_FW_FEAT (RTL8852B , ge,0 ,29 ,29 ,0 ,SCAN_OFFLOAD ), -__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,20 ,0 ,PACKET_DROP ),__CFG_FW_FEAT (RTL8852C , le,0 ,27 ,33 ,0 ,NO_DEEP_PS ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,34 ,0 ,TX_WAKE ), __CFG_FW_FEAT(RTL8852C, ge, 0, 27, 36, 0, SCAN_OFFLOAD),
drivers/net/wireless/realtek/rtw89/mac.c +1 -1
@@ -5426,7 +5426,7 @@ int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev,for (i =0 ; i < try_cnt; i++) { ret =read_poll_timeout (mac_is_txq_empty, empty, empty,50 ,50000 , false, rtwdev); -if (ret) +if (ret && !RTW89_CHK_FW_FEATURE (NO_PACKET_DROP , &rtwdev->fw))rtw89_fw_h2c_pkt_drop (rtwdev, ¶ms);else return 0 ;
drivers/net/wireless/realtek/rtw89/mac80211.c +1 -1
@@ -676,7 +676,7 @@ static void rtw89_ops_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,rtw89_leave_lps (rtwdev);rtw89_hci_flush_queues (rtwdev, queues, drop); -if (drop &&RTW89_CHK_FW_FEATURE (PACKET_DROP , &rtwdev->fw)) +if (drop && !RTW89_CHK_FW_FEATURE (NO_PACKET_DROP , &rtwdev->fw))__rtw89_drop_packets (rtwdev, vif);else rtw89_mac_flush_txq (rtwdev, queues, drop);
Signature · 1 line
2.25.1