1010#include "mac.h"
1111#include "phy.h"
1212#include "reg.h"
13+ #include "util.h"
1314
1415static 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 }
0 commit comments