Skip to content

Commit 5c12bb6

Browse files
Chin-Yen LeeKalle Valo
authored andcommitted
wifi: rtw89: refine packet offload flow
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. Signed-off-by: Chin-Yen Lee <timlee@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20230123065401.14174-3-pkshih@realtek.com
1 parent b8e8ff8 commit 5c12bb6

File tree

7 files changed

+71
-36
lines changed

7 files changed

+71
-36
lines changed

drivers/net/wireless/realtek/rtw89/core.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,8 +2495,10 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev,
24952495
if (sta->tdls)
24962496
rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta->bssid_cam);
24972497

2498-
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
2498+
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
24992499
rtw89_vif_type_mapping(vif, false);
2500+
rtw89_fw_release_general_pkt_list_vif(rtwdev, rtwvif, true);
2501+
}
25002502

25012503
ret = rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, sta);
25022504
if (ret) {
@@ -2584,12 +2586,6 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
25842586
return ret;
25852587
}
25862588

2587-
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwsta->mac_id);
2588-
if (ret) {
2589-
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
2590-
return ret;
2591-
}
2592-
25932589
rtwdev->total_sta_assoc++;
25942590
if (sta->tdls)
25952591
rtwvif->tdls_peer++;
@@ -2608,6 +2604,12 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
26082604
BTC_ROLE_MSTS_STA_CONN_END);
26092605
rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template);
26102606
rtw89_phy_ul_tb_assoc(rtwdev, rtwvif);
2607+
2608+
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
2609+
if (ret) {
2610+
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
2611+
return ret;
2612+
}
26112613
}
26122614

26132615
return ret;
@@ -3132,7 +3134,6 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
31323134
continue;
31333135
INIT_LIST_HEAD(&rtwdev->scan_info.pkt_list[band]);
31343136
}
3135-
INIT_LIST_HEAD(&rtwdev->wow.pkt_list);
31363137
INIT_WORK(&rtwdev->ba_work, rtw89_core_ba_work);
31373138
INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work);
31383139
INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work);

drivers/net/wireless/realtek/rtw89/core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2461,6 +2461,7 @@ struct rtw89_vif {
24612461
struct rtw89_phy_rate_pattern rate_pattern;
24622462
struct cfg80211_scan_request *scan_req;
24632463
struct ieee80211_scan_ies *scan_ies;
2464+
struct list_head general_pkt_list;
24642465
};
24652466

24662467
enum rtw89_lv1_rcvy_step {
@@ -3724,7 +3725,6 @@ struct rtw89_wow_param {
37243725
DECLARE_BITMAP(flags, RTW89_WOW_FLAG_NUM);
37253726
struct rtw89_wow_cam_info patterns[RTW89_MAX_PATTERN_NUM];
37263727
u8 pattern_cnt;
3727-
struct list_head pkt_list;
37283728
};
37293729

37303730
struct rtw89_mcc_info {

drivers/net/wireless/realtek/rtw89/fw.c

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "mac.h"
1111
#include "phy.h"
1212
#include "reg.h"
13+
#include "util.h"
1314

1415
static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
1516
struct sk_buff *skb);
@@ -913,13 +914,12 @@ int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable)
913914
return ret;
914915
}
915916

916-
static int rtw89_fw_h2c_add_wow_fw_ofld(struct rtw89_dev *rtwdev,
917+
static int rtw89_fw_h2c_add_general_pkt(struct rtw89_dev *rtwdev,
917918
struct rtw89_vif *rtwvif,
918919
enum rtw89_fw_pkt_ofld_type type,
919920
u8 *id)
920921
{
921922
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
922-
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
923923
struct rtw89_pktofld_info *info;
924924
struct sk_buff *skb;
925925
int ret;
@@ -954,7 +954,7 @@ static int rtw89_fw_h2c_add_wow_fw_ofld(struct rtw89_dev *rtwdev,
954954
if (ret)
955955
goto err;
956956

957-
list_add_tail(&info->list, &rtw_wow->pkt_list);
957+
list_add_tail(&info->list, &rtwvif->general_pkt_list);
958958
*id = info->id;
959959
return 0;
960960

@@ -963,13 +963,48 @@ static int rtw89_fw_h2c_add_wow_fw_ofld(struct rtw89_dev *rtwdev,
963963
return -ENOMEM;
964964
}
965965

966+
void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
967+
struct rtw89_vif *rtwvif, bool notify_fw)
968+
{
969+
struct list_head *pkt_list = &rtwvif->general_pkt_list;
970+
struct rtw89_pktofld_info *info, *tmp;
971+
972+
list_for_each_entry_safe(info, tmp, pkt_list, list) {
973+
if (notify_fw)
974+
rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
975+
rtw89_core_release_bit_map(rtwdev->pkt_offload,
976+
info->id);
977+
list_del(&info->list);
978+
kfree(info);
979+
}
980+
}
981+
982+
void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw)
983+
{
984+
struct rtw89_vif *rtwvif;
985+
986+
rtw89_for_each_rtwvif(rtwdev, rtwvif)
987+
rtw89_fw_release_general_pkt_list_vif(rtwdev, rtwvif, notify_fw);
988+
}
989+
966990
#define H2C_GENERAL_PKT_LEN 6
967991
#define H2C_GENERAL_PKT_ID_UND 0xff
968-
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid)
992+
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev,
993+
struct rtw89_vif *rtwvif, u8 macid)
969994
{
995+
u8 pkt_id_ps_poll = H2C_GENERAL_PKT_ID_UND;
996+
u8 pkt_id_null = H2C_GENERAL_PKT_ID_UND;
997+
u8 pkt_id_qos_null = H2C_GENERAL_PKT_ID_UND;
970998
struct sk_buff *skb;
971999
int ret;
9721000

1001+
rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif,
1002+
RTW89_PKT_OFLD_TYPE_PS_POLL, &pkt_id_ps_poll);
1003+
rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif,
1004+
RTW89_PKT_OFLD_TYPE_NULL_DATA, &pkt_id_null);
1005+
rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif,
1006+
RTW89_PKT_OFLD_TYPE_QOS_NULL, &pkt_id_qos_null);
1007+
9731008
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_GENERAL_PKT_LEN);
9741009
if (!skb) {
9751010
rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
@@ -978,9 +1013,9 @@ int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid)
9781013
skb_put(skb, H2C_GENERAL_PKT_LEN);
9791014
SET_GENERAL_PKT_MACID(skb->data, macid);
9801015
SET_GENERAL_PKT_PROBRSP_ID(skb->data, H2C_GENERAL_PKT_ID_UND);
981-
SET_GENERAL_PKT_PSPOLL_ID(skb->data, H2C_GENERAL_PKT_ID_UND);
982-
SET_GENERAL_PKT_NULL_ID(skb->data, H2C_GENERAL_PKT_ID_UND);
983-
SET_GENERAL_PKT_QOS_NULL_ID(skb->data, H2C_GENERAL_PKT_ID_UND);
1016+
SET_GENERAL_PKT_PSPOLL_ID(skb->data, pkt_id_ps_poll);
1017+
SET_GENERAL_PKT_NULL_ID(skb->data, pkt_id_null);
1018+
SET_GENERAL_PKT_QOS_NULL_ID(skb->data, pkt_id_qos_null);
9841019
SET_GENERAL_PKT_CTS2SELF_ID(skb->data, H2C_GENERAL_PKT_ID_UND);
9851020

9861021
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
@@ -3099,8 +3134,9 @@ int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
30993134
int ret;
31003135

31013136
if (enable) {
3102-
ret = rtw89_fw_h2c_add_wow_fw_ofld(rtwdev, rtwvif,
3103-
RTW89_PKT_OFLD_TYPE_NULL_DATA, &pkt_id);
3137+
ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif,
3138+
RTW89_PKT_OFLD_TYPE_NULL_DATA,
3139+
&pkt_id);
31043140
if (ret)
31053141
return -EPERM;
31063142
}

drivers/net/wireless/realtek/rtw89/fw.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3518,7 +3518,11 @@ int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
35183518
int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len);
35193519
void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev);
35203520
void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
3521-
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, u8 macid);
3521+
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
3522+
u8 macid);
3523+
void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
3524+
struct rtw89_vif *rtwvif, bool notify_fw);
3525+
void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
35223526
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
35233527
bool valid, struct ieee80211_ampdu_params *params);
35243528
void rtw89_fw_h2c_init_ba_cam_v1(struct rtw89_dev *rtwdev);

drivers/net/wireless/realtek/rtw89/mac80211.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
135135
rtwvif->sub_entity_idx = RTW89_SUB_ENTITY_0;
136136
rtwvif->hit_rule = 0;
137137
ether_addr_copy(rtwvif->mac_addr, vif->addr);
138+
INIT_LIST_HEAD(&rtwvif->general_pkt_list);
138139

139140
ret = rtw89_mac_add_vif(rtwdev, rtwvif);
140141
if (ret) {

drivers/net/wireless/realtek/rtw89/ser.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ static void ser_l2_reset_st_pre_hdl(struct rtw89_ser *ser)
611611
ser_reset_mac_binding(rtwdev);
612612
rtw89_core_stop(rtwdev);
613613
rtw89_entity_init(rtwdev);
614+
rtw89_fw_release_general_pkt_list(rtwdev, false);
614615
INIT_LIST_HEAD(&rtwdev->rtwvifs_list);
615616
}
616617

drivers/net/wireless/realtek/rtw89/wow.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -490,21 +490,6 @@ static int rtw89_wow_check_fw_status(struct rtw89_dev *rtwdev, bool wow_enable)
490490
return ret;
491491
}
492492

493-
static void rtw89_wow_release_pkt_list(struct rtw89_dev *rtwdev)
494-
{
495-
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
496-
struct list_head *pkt_list = &rtw_wow->pkt_list;
497-
struct rtw89_pktofld_info *info, *tmp;
498-
499-
list_for_each_entry_safe(info, tmp, pkt_list, list) {
500-
rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
501-
rtw89_core_release_bit_map(rtwdev->pkt_offload,
502-
info->id);
503-
list_del(&info->list);
504-
kfree(info);
505-
}
506-
}
507-
508493
static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
509494
{
510495
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)
561546
}
562547

563548
if (is_conn) {
549+
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
550+
if (ret) {
551+
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
552+
return ret;
553+
}
564554
rtw89_phy_ra_assoc(rtwdev, wow_sta);
565555
rtw89_phy_set_bss_color(rtwdev, wow_vif);
566556
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, wow_vif);
@@ -708,8 +698,6 @@ static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
708698
goto out;
709699
}
710700

711-
rtw89_wow_release_pkt_list(rtwdev);
712-
713701
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
714702
if (ret) {
715703
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
@@ -744,6 +732,8 @@ static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
744732
goto out;
745733
}
746734

735+
rtw89_fw_release_general_pkt_list(rtwdev, true);
736+
747737
ret = rtw89_wow_swap_fw(rtwdev, true);
748738
if (ret) {
749739
rtw89_err(rtwdev, "wow: failed to swap to wow fw\n");
@@ -789,6 +779,8 @@ static int rtw89_wow_disable(struct rtw89_dev *rtwdev)
789779
goto out;
790780
}
791781

782+
rtw89_fw_release_general_pkt_list(rtwdev, true);
783+
792784
ret = rtw89_wow_swap_fw(rtwdev, false);
793785
if (ret) {
794786
rtw89_err(rtwdev, "wow: failed to disable trx_post\n");

0 commit comments

Comments
 (0)