wifi: rtw89: prepare packets offload to support newer firmware
Ping-Ke Shih
maintainercover wifi: rtw89: prepare packets offload to support newer firmware
The packet offload is that driver prepare packets, such as QoS null or null frames, and firmware uses these packets to tell AP about power state, for example. The older firmware can prepare this itself, but further firmware in the future will always need driver's help.
First three patches are to fix and adjust packet offload feature. The latter three patches are to support new firmware type NORMAL_CE that doesn't have LPS-PS mode but have P2P-PS and hardware scan.
Chin-Yen Lee (2):
wifi: rtw89: fix potential wrong mapping for pkt-offload
wifi: rtw89: refine packet offload flow
Ping-Ke Shih (4):
wifi: rtw89: add use of pkt_list offload to debug entry
wifi: rtw89: 8852b: reset IDMEM mode to default value
wifi: rtw89: 8852b: don't support LPS-PG mode after firmware 0.29.26.0
wifi: rtw89: 8852b: try to use NORMAL_CE type firmware first
drivers/net/wireless/realtek/rtw89/core.c | 23 ++--- drivers/net/wireless/realtek/rtw89/core.h | 5 +- drivers/net/wireless/realtek/rtw89/debug.c | 36 ++++++++ drivers/net/wireless/realtek/rtw89/fw.c | 84 +++++++++++++++---- drivers/net/wireless/realtek/rtw89/fw.h | 6 +- drivers/net/wireless/realtek/rtw89/mac.c | 5 ++ drivers/net/wireless/realtek/rtw89/mac80211.c | 1 + drivers/net/wireless/realtek/rtw89/reg.h | 3 + drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 + drivers/net/wireless/realtek/rtw89/ser.c | 1 + drivers/net/wireless/realtek/rtw89/wow.c | 26 ++---- 13 files changed, 147 insertions(+), 46 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/6 wifi: rtw89: fix potential wrong mapping for pkt-offload
From: Chin-Yen Lee <[email protected]>
When driver fails to send H2C to firmware for pkt-offload, we should not update the pkt_list of driver, and need to release allocated pkt index to avoid wrong mapping between driver and firmware.
--- drivers/net/wireless/realtek/rtw89/fw.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +6 -3
@@ -948,13 +948,13 @@ static int rtw89_fw_h2c_add_wow_fw_ofld(struct rtw89_dev *rtwdev,if (!skb) goto err; -list_add_tail (&info->list, &rtw_wow->pkt_list); ret =rtw89_fw_h2c_add_pkt_offload (rtwdev, &info->id, skb);kfree_skb (skb);if (ret) -return ret; + goto err; +list_add_tail (&info->list, &rtw_wow->pkt_list); *id = info->id;return 0 ;
@@ -2133,6 +2133,7 @@ int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id, skb =rtw89_fw_h2c_alloc_skb_with_hdr (rtwdev,H2C_LEN_PKT_OFLD + skb_ofld->len);if (!skb) {rtw89_err (rtwdev,"failed to alloc skb for h2c pkt offload\n" ); +rtw89_core_release_bit_map (rtwdev->pkt_offload, alloc_id);return -ENOMEM ; }skb_put (skb,H2C_LEN_PKT_OFLD );
@@ -2151,6 +2152,7 @@ int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id, ret =rtw89_h2c_tx (rtwdev, skb, false);if (ret) {rtw89_err (rtwdev,"failed to send h2c\n" ); +rtw89_core_release_bit_map (rtwdev->pkt_offload, alloc_id); goto fail; }
@@ -2684,13 +2686,14 @@ static int rtw89_append_probe_req_ie(struct rtw89_dev *rtwdev, goto out; } -list_add_tail (&info->list, &scan_info->pkt_list[band]); ret =rtw89_fw_h2c_add_pkt_offload (rtwdev, &info->id, new);if (ret) {kfree_skb (new); +kfree (info); goto out; } +list_add_tail (&info->list, &scan_info->pkt_list[band]);kfree_skb (new); } out:
Signature · 1 line
2.25.1
Re: [PATCH 1/6] wifi: rtw89: fix potential wrong mapping for pkt-offload
Quoted 8 lines · Ping-Ke Shih
From: Chin-Yen Lee <[email protected]>
When driver fails to send H2C to firmware for pkt-offload, we should not update the
pkt_listof driver, and need to release allocated pkt index to avoid wrong mapping between driver and firmware.Signed-off-by Chin-Yen Lee <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
6 patches applied to wireless-next.git, thanks.
b8e8ff842b1b wifi: rtw89: fix potential wrong mapping for pkt-offload 5c12bb66b79d wifi: rtw89: refine packet offload flow5da5ba7e6ec4 wifi: rtw89: add use of pkt_list offload to debug entry 2e5a65f5952f wifi: rtw89: 8852b: reset IDMEM mode to default value e5624482ba3e wifi: rtw89: 8852b: don't support LPS-PG mode after firmware 0.29.26.0 7410bd727584 wifi: rtw89: 8852b: try to use NORMAL_CE type firmware first
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: refine packet offload flow
In reply to Ping-Ke ShihFrom: Chin-Yen Lee <[email protected]>
For upcoming firmware, driver needs to do packet offload to firmware to ensure LPS protocol work properly, so we update current connection and disconnect flow to maintain packet offload flow, and integrate with current WoWLAN flow which also needs packet offload.
--- drivers/net/wireless/realtek/rtw89/core.c | 17 +++--- drivers/net/wireless/realtek/rtw89/core.h | 2 +- drivers/net/wireless/realtek/rtw89/fw.c | 54 +++++++++++++++---- drivers/net/wireless/realtek/rtw89/fw.h | 6 ++- drivers/net/wireless/realtek/rtw89/mac80211.c | 1 + drivers/net/wireless/realtek/rtw89/ser.c | 1 + drivers/net/wireless/realtek/rtw89/wow.c | 26 ++++----- 7 files changed, 71 insertions(+), 36 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +9 -8
@@ -2491,8 +2491,10 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev,if (sta->tdls)rtw89_cam_deinit_bssid_cam (rtwdev, &rtwsta->bssid_cam); -if (vif->type ==NL80211_IFTYPE_STATION && !sta->tdls) +if (vif->type ==NL80211_IFTYPE_STATION && !sta->tdls) {rtw89_vif_type_mapping (vif, false); +rtw89_fw_release_general_pkt_list_vif (rtwdev, rtwvif, true); + } ret =rtw89_fw_h2c_assoc_cmac_tbl (rtwdev, vif, sta);if (ret) {
@@ -2580,12 +2582,6 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,return ret; } - ret =rtw89_fw_h2c_general_pkt (rtwdev, rtwsta->mac_id); -if (ret) { -rtw89_warn (rtwdev,"failed to send h2c general packet\n" ); -return ret; - } - rtwdev->total_sta_assoc++;rtw89_phy_ra_assoc (rtwdev, sta);rtw89_mac_bf_assoc (rtwdev, vif, sta);
@@ -2602,6 +2598,12 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev, BTC_ROLE_MSTS_STA_CONN_END);rtw89_core_get_no_ul_ofdma_htc (rtwdev, &rtwsta->htc_template);rtw89_phy_ul_tb_assoc (rtwdev, rtwvif); + + ret =rtw89_fw_h2c_general_pkt (rtwdev, rtwvif, rtwsta->mac_id); +if (ret) { +rtw89_warn (rtwdev,"failed to send h2c general packet\n" ); +return ret; + } }return ret;
@@ -3126,7 +3128,6 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)continue ;INIT_LIST_HEAD (&rtwdev->scan_info.pkt_list[band]); } -INIT_LIST_HEAD (&rtwdev->wow.pkt_list);INIT_WORK (&rtwdev->ba_work, rtw89_core_ba_work);INIT_WORK (&rtwdev->txq_work, rtw89_core_txq_work);INIT_DELAYED_WORK (&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work);
drivers/net/wireless/realtek/rtw89/core.h +1 -1
@@ -2460,6 +2460,7 @@ struct rtw89_vif {struct rtw89_phy_rate_pattern rate_pattern;struct cfg80211_scan_request *scan_req;struct ieee80211_scan_ies *scan_ies; +struct list_head general_pkt_list; };enum rtw89_lv1_rcvy_step {
@@ -3723,7 +3724,6 @@ struct rtw89_wow_param {DECLARE_BITMAP (flags,RTW89_WOW_FLAG_NUM );struct rtw89_wow_cam_info patterns[RTW89_MAX_PATTERN_NUM ];u8 pattern_cnt; -struct list_head pkt_list; };struct rtw89_mcc_info {
drivers/net/wireless/realtek/rtw89/fw.c +45 -9
101 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/fw.h +5 -1
@@ -3518,7 +3518,11 @@ int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,int rtw89_fw_h2c_raw (struct rtw89_dev *rtwdev,const u8 *buf,u16 len);void rtw89_fw_send_all_early_h2c (struct rtw89_dev *rtwdev);void rtw89_fw_free_all_early_h2c (struct rtw89_dev *rtwdev); -int rtw89_fw_h2c_general_pkt (struct rtw89_dev *rtwdev,u8 macid); +int rtw89_fw_h2c_general_pkt (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif, +u8 macid); +void rtw89_fw_release_general_pkt_list_vif (struct rtw89_dev *rtwdev, +struct rtw89_vif *rtwvif,bool notify_fw); +void rtw89_fw_release_general_pkt_list (struct rtw89_dev *rtwdev,bool notify_fw);int rtw89_fw_h2c_ba_cam (struct rtw89_dev *rtwdev,struct rtw89_sta *rtwsta,bool valid,struct ieee80211_ampdu_params *params);void rtw89_fw_h2c_init_ba_cam_v1 (struct rtw89_dev *rtwdev);
drivers/net/wireless/realtek/rtw89/mac80211.c +1 -0
@@ -135,6 +135,7 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw, rtwvif->sub_entity_idx =RTW89_SUB_ENTITY_0 ; rtwvif->hit_rule =0 ;ether_addr_copy (rtwvif->mac_addr, vif->addr); +INIT_LIST_HEAD (&rtwvif->general_pkt_list); ret =rtw89_mac_add_vif (rtwdev, rtwvif);if (ret) {
drivers/net/wireless/realtek/rtw89/ser.c +1 -0
@@ -611,6 +611,7 @@ static void ser_l2_reset_st_pre_hdl(struct rtw89_ser *ser)ser_reset_mac_binding (rtwdev);rtw89_core_stop (rtwdev);rtw89_entity_init (rtwdev); +rtw89_fw_release_general_pkt_list (rtwdev, false);INIT_LIST_HEAD (&rtwdev->rtwvifs_list); }
drivers/net/wireless/realtek/rtw89/wow.c +9 -17
@@ -490,21 +490,6 @@ static int rtw89_wow_check_fw_status(struct rtw89_dev *rtwdev, bool wow_enable)return ret; } -static void rtw89_wow_release_pkt_list (struct rtw89_dev *rtwdev) -{ -struct rtw89_wow_param *rtw_wow = &rtwdev->wow; -struct list_head *pkt_list = &rtw_wow->pkt_list; -struct rtw89_pktofld_info *info, *tmp; - -list_for_each_entry_safe (info, tmp, pkt_list, list) { -rtw89_fw_h2c_del_pkt_offload (rtwdev, info->id); -rtw89_core_release_bit_map (rtwdev->pkt_offload, - info->id); -list_del (&info->list); -kfree (info); - } -} -static int rtw89_wow_swap_fw (struct rtw89_dev *rtwdev,bool wow) {enum rtw89_fw_type fw_type = wow ?RTW89_FW_WOWLAN :RTW89_FW_NORMAL ;
@@ -561,6 +546,11 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow) }if (is_conn) { + ret =rtw89_fw_h2c_general_pkt (rtwdev, rtwvif, rtwsta->mac_id); +if (ret) { +rtw89_warn (rtwdev,"failed to send h2c general packet\n" ); +return ret; + }rtw89_phy_ra_assoc (rtwdev, wow_sta);rtw89_phy_set_bss_color (rtwdev, wow_vif);rtw89_chip_cfg_txpwr_ul_tb_offset (rtwdev, wow_vif);
@@ -708,8 +698,6 @@ static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev) goto out; } -rtw89_wow_release_pkt_list (rtwdev); - ret =rtw89_fw_h2c_disconnect_detect (rtwdev, rtwvif, false);if (ret) {rtw89_err (rtwdev,"wow: failed to disable disconnect detect\n" );
@@ -744,6 +732,8 @@ static int rtw89_wow_enable(struct rtw89_dev *rtwdev) goto out; } +rtw89_fw_release_general_pkt_list (rtwdev, true); + ret =rtw89_wow_swap_fw (rtwdev, true);if (ret) {rtw89_err (rtwdev,"wow: failed to swap to wow fw\n" );
@@ -789,6 +779,8 @@ static int rtw89_wow_disable(struct rtw89_dev *rtwdev) goto out; } +rtw89_fw_release_general_pkt_list (rtwdev, true); + ret =rtw89_wow_swap_fw (rtwdev, false);if (ret) {rtw89_err (rtwdev,"wow: failed to disable trx_post\n" );
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/6 wifi: rtw89: add use of pkt_list offload to debug entry
In reply to Ping-Ke ShihDriver can prepare pkt_list for firmware that only uses them to send out the packets in specific situations. To understand the usage of current status, and to check if there is leakage problem, dump bitmap and the indices used by certain function.
An example looks like:
map:
...
pkt_ofld: 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...
[SCAN 0]: 3
[SCAN 1]: 4
[SCAN 3]: 5
VIF [0] xx:xx:xx:xx:xx:xx
...
pkt_ofld[GENERAL]: 0 1 2--- drivers/net/wireless/realtek/rtw89/debug.c | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+)
drivers/net/wireless/realtek/rtw89/debug.c +36 -0
@@ -3347,6 +3347,31 @@ static void rtw89_dump_addr_cam(struct seq_file *m, } } +__printf(3, 4) +static void rtw89_dump_pkt_offload (struct seq_file *m,struct list_head *pkt_list, +const char *fmt, ...) +{ +struct rtw89_pktofld_info *info; +struct va_format vaf; +va_list args; + +if (list_empty (pkt_list)) +return ; + +va_start (args, fmt); + vaf.va = &args; + vaf.fmt = fmt; + +seq_printf (m,"%pV" , &vaf); + +va_end (args); + +list_for_each_entry (info, pkt_list, list) +seq_printf (m,"%d " , info->id); + +seq_puts (m,"\n" ); +} +static void rtw89_vif_ids_get_iter (void *data,u8 *mac,struct ieee80211_vif *vif) {
@@ -3357,6 +3382,7 @@ void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)seq_printf (m,"VIF [%d] %pM\n" , rtwvif->mac_id, rtwvif->mac_addr);seq_printf (m,"\tbssid_cam_idx=%u\n" , bssid_cam->bssid_cam_idx);rtw89_dump_addr_cam (m, &rtwvif->addr_cam); +rtw89_dump_pkt_offload (m, &rtwvif->general_pkt_list,"\tpkt_ofld[GENERAL]: " ); }static void rtw89_dump_ba_cam (struct seq_file *m,struct rtw89_sta *rtwsta)
@@ -3395,6 +3421,7 @@ static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v)struct rtw89_debugfs_priv *debugfs_priv = m->private;struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;struct rtw89_cam_info *cam_info = &rtwdev->cam_info; +u8 idx;mutex_lock (&rtwdev->mutex);
@@ -3409,6 +3436,15 @@ static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v) cam_info->sec_cam_map);seq_printf (m,"\tba_cam: %*ph\n" , (int )sizeof (cam_info->ba_cam_map), cam_info->ba_cam_map); +seq_printf (m,"\tpkt_ofld: %*ph\n" , (int )sizeof (rtwdev->pkt_offload), + rtwdev->pkt_offload); + +for (idx =NL80211_BAND_2GHZ ; idx <NUM_NL80211_BANDS ; idx++) { +if (!(rtwdev->chip->support_bands &BIT (idx))) +continue ; +rtw89_dump_pkt_offload (m, &rtwdev->scan_info.pkt_list[idx], +"\t\t[SCAN %u]: " , idx); + }ieee80211_iterate_active_interfaces_atomic (rtwdev->hw,IEEE80211_IFACE_ITER_NORMAL , rtw89_vif_ids_get_iter, m);
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/6 wifi: rtw89: 8852b: reset IDMEM mode to default value
In reply to Ping-Ke ShihFor different firmware type, it could use different IDMEM mode, so reset it to default to avoid encountering error during we bisect firmware version, like
rtw89_8852be 0000:03:00.0: Firmware version 0.29.26.0, cmd version 0, type 5 rtw89_8852be 0000:03:00.0: Firmware version 0.29.26.0, cmd version 0, type 3 rtw89_8852be 0000:03:00.0: fw security fail
rtw89_8852be 0000:03:00.0: download firmware fail
rtw89_8852be 0000:03:00.0: [ERR]fwdl 0x1E0 = 0x62
rtw89_8852be 0000:03:00.0: [ERR]fwdl 0x83F2 = 0x8
rtw89_8852be 0000:03:00.0: [ERR]fw PC = 0xb8931154
rtw89_8852be 0000:03:00.0: [ERR]fw PC = 0xb8931154
rtw89_8852be 0000:03:00.0: [ERR]fw PC = 0xb8931150
rtw89_8852be 0000:03:00.0: [ERR]fw PC = 0xb8931154
--- drivers/net/wireless/realtek/rtw89/mac.c | 5 +++++ drivers/net/wireless/realtek/rtw89/reg.h | 3 +++ 2 files changed, 8 insertions(+)
drivers/net/wireless/realtek/rtw89/mac.c +5 -0
@@ -3411,6 +3411,11 @@ int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw) val |=B_AX_WCPU_FWDL_EN ;rtw89_write32 (rtwdev,R_AX_WCPU_FW_CTRL , val); + +if (rtwdev->chip->chip_id ==RTL8852B ) +rtw89_write32_mask (rtwdev,R_AX_SEC_CTRL , +B_AX_SEC_IDMEM_SIZE_CONFIG_MASK ,0x2 ); +rtw89_write16_mask (rtwdev,R_AX_BOOT_REASON ,B_AX_BOOT_REASON_MASK , boot_reason);rtw89_write32_set (rtwdev,R_AX_PLATFORM_ENABLE ,B_AX_WCPU_EN );
drivers/net/wireless/realtek/rtw89/reg.h +3 -0
@@ -275,6 +275,9 @@#define B_AX_S1_LDO2PWRCUT_F BIT(23)#define B_AX_S0_LDO_VSEL_F_MASK GENMASK(22, 21) +#define R_AX_SEC_CTRL 0x0C00 +#define B_AX_SEC_IDMEM_SIZE_CONFIG_MASK GENMASK(17, 16) +#define R_AX_FILTER_MODEL_ADDR 0x0C04#define R_AX_HAXI_INIT_CFG1 0x1000
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/6 wifi: rtw89: 8852b: don't support LPS-PG mode after firmware 0.29.26.0
In reply to Ping-Ke ShihDue to firmware size limit of 8852b, LPS-PG mode isn't supported after 0.29.26.0, and then we have more space to support other features, such as P2P-PS, hardware scan and so on.
--- drivers/net/wireless/realtek/rtw89/core.c | 6 ++++-- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/fw.c | 1 + 3 files changed, 6 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +4 -2
@@ -1764,7 +1764,8 @@ static enum rtw89_ps_mode rtw89_update_ps_mode(struct rtw89_dev *rtwdev) RTW89_CHK_FW_FEATURE(NO_DEEP_PS, &rtwdev->fw))return RTW89_PS_MODE_NONE ; -if (chip->ps_mode_supported &BIT (RTW89_PS_MODE_PWR_GATED )) +if ((chip->ps_mode_supported &BIT (RTW89_PS_MODE_PWR_GATED )) && + !RTW89_CHK_FW_FEATURE (NO_LPS_PG , &rtwdev->fw))return RTW89_PS_MODE_PWR_GATED ;if (chip->ps_mode_supported &BIT (RTW89_PS_MODE_CLK_GATED ))
@@ -3154,7 +3155,6 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)rtw89_core_ppdu_sts_init (rtwdev);rtw89_traffic_stats_init (rtwdev, &rtwdev->stats); - rtwdev->ps_mode =rtw89_update_ps_mode (rtwdev); rtwdev->hal.rx_fltr =DEFAULT_AX_RX_FLTR ;INIT_WORK (&btc->eapol_notify_work, rtw89_btc_ntfy_eapol_packet_work);
@@ -3310,6 +3310,8 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)if (ret)return ret; + rtwdev->ps_mode =rtw89_update_ps_mode (rtwdev); +return 0 ; }EXPORT_SYMBOL (rtw89_chip_info_setup);
drivers/net/wireless/realtek/rtw89/core.h +1 -0
@@ -3022,6 +3022,7 @@ enum rtw89_fw_feature {RTW89_FW_FEATURE_CRASH_TRIGGER ,RTW89_FW_FEATURE_PACKET_DROP ,RTW89_FW_FEATURE_NO_DEEP_PS , + RTW89_FW_FEATURE_NO_LPS_PG, }; struct rtw89_fw_suit {
drivers/net/wireless/realtek/rtw89/fw.c +1 -0
@@ -255,6 +255,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__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 (RTL8852B , ge,0 ,29 ,26 ,0 ,NO_LPS_PG ),__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: 8852b: try to use NORMAL_CE type firmware first
In reply to Ping-Ke ShihNew firmware type NORMAL_CE is introduced to support P2P-PS and hardware scan, but no LPS-PG mode. After this patch, old firmware with NORMAL type can still work well.
The use of this new type is the same as before, so we add new type to avoid taking wrong firmware. Then, driver log can also give clear information about this change:
rtw89_8852be 0000:03:00.0: Firmware version 0.29.26.0, cmd version 0, type 5 rtw89_8852be 0000:03:00.0: Firmware version 0.29.26.0, cmd version 0, type 3
--- drivers/net/wireless/realtek/rtw89/core.h | 2 ++ drivers/net/wireless/realtek/rtw89/fw.c | 22 ++++++++++++++----- drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 + 5 files changed, 21 insertions(+), 6 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +2 -0
@@ -2847,6 +2847,7 @@ struct rtw89_chip_info {enum rtw89_core_chip_id chip_id;const struct rtw89_chip_ops *ops;const char *fw_name; +bool try_ce_fw;u32 fifo_size;u32 dle_scc_rsvd_size;u16 max_amsdu_limit;
@@ -3013,6 +3014,7 @@ static inline void rtw89_init_wait(struct rtw89_wait_info *wait)enum rtw89_fw_type {RTW89_FW_NORMAL =1 ,RTW89_FW_WOWLAN =3 , +RTW89_FW_NORMAL_CE =5 , };enum rtw89_fw_feature {
drivers/net/wireless/realtek/rtw89/fw.c +16 -6
@@ -152,7 +152,7 @@ static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev, const u8 *fw, u32 len,static int rtw89_mfw_recognize (struct rtw89_dev *rtwdev,enum rtw89_fw_type type, -struct rtw89_fw_suit *fw_suit) +struct rtw89_fw_suit *fw_suit,bool nowarn) {struct rtw89_fw_info *fw_info = &rtwdev->fw;const u8 *mfw = fw_info->firmware->data;
@@ -183,7 +183,8 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,return 0 ; } -rtw89_err (rtwdev,"no suitable firmware found\n" ); +if (!nowarn) +rtw89_err (rtwdev,"no suitable firmware found\n" );return -ENOENT ; }
@@ -211,12 +212,13 @@ static void rtw89_fw_update_ver(struct rtw89_dev *rtwdev, }static -int __rtw89_fw_recognize (struct rtw89_dev *rtwdev,enum rtw89_fw_type type) +int __rtw89_fw_recognize (struct rtw89_dev *rtwdev,enum rtw89_fw_type type, +bool nowarn) {struct rtw89_fw_suit *fw_suit =rtw89_fw_suit_get (rtwdev, type);int ret; - ret =rtw89_mfw_recognize (rtwdev, type, fw_suit); + ret =rtw89_mfw_recognize (rtwdev, type, fw_suit, nowarn);if (ret)return ret;
@@ -343,14 +345,22 @@ rtw89_early_fw_feature_recognize(struct device *device,int rtw89_fw_recognize (struct rtw89_dev *rtwdev) { +const struct rtw89_chip_info *chip = rtwdev->chip;int ret; - ret =__rtw89_fw_recognize (rtwdev,RTW89_FW_NORMAL ); +if (chip->try_ce_fw) { + ret =__rtw89_fw_recognize (rtwdev,RTW89_FW_NORMAL_CE , true); +if (!ret) + goto normal_done; + } + + ret =__rtw89_fw_recognize (rtwdev,RTW89_FW_NORMAL , false);if (ret)return ret; +normal_done:/* It still works if wowlan firmware isn't existing. */ -__rtw89_fw_recognize (rtwdev,RTW89_FW_WOWLAN ); +__rtw89_fw_recognize (rtwdev,RTW89_FW_WOWLAN , false);rtw89_fw_recognize_features (rtwdev);
drivers/net/wireless/realtek/rtw89/rtw8852a.c +1 -0
@@ -2055,6 +2055,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = { .chip_id = RTL8852A, .ops = &rtw8852a_chip_ops, .fw_name = "rtw89/rtw8852a_fw.bin", + .try_ce_fw = false, .fifo_size = 458752, .dle_scc_rsvd_size = 0, .max_amsdu_limit = 3500,
drivers/net/wireless/realtek/rtw89/rtw8852b.c +1 -0
@@ -2430,6 +2430,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = { .chip_id = RTL8852B, .ops = &rtw8852b_chip_ops, .fw_name = "rtw89/rtw8852b_fw.bin", + .try_ce_fw = true, .fifo_size = 196608, .dle_scc_rsvd_size = 98304, .max_amsdu_limit = 3500,
drivers/net/wireless/realtek/rtw89/rtw8852c.c +1 -0
@@ -2857,6 +2857,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = { .chip_id = RTL8852C, .ops = &rtw8852c_chip_ops, .fw_name = "rtw89/rtw8852c_fw.bin", + .try_ce_fw = false, .fifo_size = 458752, .dle_scc_rsvd_size = 0, .max_amsdu_limit = 8000,
Signature · 1 line
2.25.1