wifi: rtw89: support WoWLAN for more chips and some fixes
Ping-Ke Shih
maintainercover wifi: rtw89: support WoWLAN for more chips and some fixes
Some WiFi 6 chips support WoWLAN with different firmware command formats, and firmware uses the register of WoWLAN reason, so extend to support them accordingly. During development, we found some drawbacks, so correct them.
Chih-Kang Chang (7):
wifi: rtw89: wow: append security header offset for different cipher
wifi: rtw89: wow: update WoWLAN reason register for different FW
wifi: rtw89: wow: update config mac for 802.11ax chip
wifi: rtw89: wow: fix GTK offload H2C skbuff issue
wifi: rtw89: wow: prevent to send unexpected H2C during download
Firmware
wifi: rtw89: wow: enable beacon filter after swapping firmware
wifi: rtw89: add polling for LPS H2C to ensure FW received
drivers/net/wireless/realtek/rtw89/core.c | 3 +- drivers/net/wireless/realtek/rtw89/core.h | 3 +- drivers/net/wireless/realtek/rtw89/fw.c | 80 ++++++++++++------- drivers/net/wireless/realtek/rtw89/fw.h | 6 ++ drivers/net/wireless/realtek/rtw89/mac.c | 29 +++++++ drivers/net/wireless/realtek/rtw89/mac.h | 1 + drivers/net/wireless/realtek/rtw89/mac_be.c | 20 ----- drivers/net/wireless/realtek/rtw89/reg.h | 7 ++ drivers/net/wireless/realtek/rtw89/rtw8851b.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8852a.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 6 +- drivers/net/wireless/realtek/rtw89/rtw8922a.c | 6 +- drivers/net/wireless/realtek/rtw89/wow.c | 33 +++++--- drivers/net/wireless/realtek/rtw89/wow.h | 30 +++++++ 15 files changed, 177 insertions(+), 65 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/7 wifi: rtw89: wow: append security header offset for different cipher
From: Chih-Kang Chang <[email protected]>
When creating EAPOL_KEY, SA_QUERY and ARP_RSP packet offload, we need to append security header offset for different cipher as required by the firmware. Only 8852A, 8852B, 8852BT and 8851B need it.
--- drivers/net/wireless/realtek/rtw89/fw.c | 67 +++++++++++++++--------- drivers/net/wireless/realtek/rtw89/wow.c | 22 +++++--- drivers/net/wireless/realtek/rtw89/wow.h | 30 +++++++++++ 3 files changed, 85 insertions(+), 34 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +41 -26
@@ -13,22 +13,20 @@#include "ps.h" #include "reg.h" #include "util.h" +#include "wow.h" struct rtw89_eapol_2_of_2 { -struct ieee80211_hdr_3addr hdr;u8 gtkbody[14 ];u8 key_des_ver;u8 rsvd[92 ]; -} __packed__aligned(2) ; +} __packed;struct rtw89_sa_query { -struct ieee80211_hdr_3addr hdr;u8 category;u8 action; -} __packed__aligned(2) ; +} __packed;struct rtw89_arp_rsp { -struct ieee80211_hdr_3addr addr;u8 llc_hdr[sizeof (rfc1042_header)];__be16 llc_type;struct arphdr arp_hdr;
@@ -36,7 +34,7 @@ struct rtw89_arp_rsp {__be32 sender_ip;u8 target_hw[ETH_ALEN ];__be32 target_ip; -} __packed__aligned(2) ; +} __packed;static const u8 mss_signature[] = {0x4D ,0x53 ,0x53 ,0x4B ,0x50 ,0x4F ,0x4F ,0x4C };
@@ -2197,8 +2195,10 @@ static struct sk_buff *rtw89_eapol_get(struct rtw89_dev *rtwdev, 0x8E, 0x01, 0x03, 0x00, 0x5F, 0x02, 0x03};struct ieee80211_vif *vif =rtwvif_to_vif (rtwvif);struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; +u8 sec_hdr_len =rtw89_wow_get_sec_hdr_len (rtwdev);struct rtw89_wow_param *rtw_wow = &rtwdev->wow;struct rtw89_eapol_2_of_2 *eapol_pkt; +struct ieee80211_hdr_3addr *hdr;struct sk_buff *skb;u8 key_des_ver;
@@ -2211,17 +2211,21 @@ static struct sk_buff *rtw89_eapol_get(struct rtw89_dev *rtwdev,else key_des_ver =0 ; - skb =dev_alloc_skb (sizeof (*eapol_pkt)); + skb =dev_alloc_skb (sizeof (*hdr) + sec_hdr_len +sizeof (*eapol_pkt));if (!skb)return NULL ; + hdr =skb_put_zero (skb,sizeof (*hdr)); + hdr->frame_control =cpu_to_le16 (IEEE80211_FTYPE_DATA | +IEEE80211_FCTL_TODS | +IEEE80211_FCTL_PROTECTED ); +ether_addr_copy (hdr->addr1, bss_conf->bssid); +ether_addr_copy (hdr->addr2, vif->addr); +ether_addr_copy (hdr->addr3, bss_conf->bssid); + +skb_put_zero (skb, sec_hdr_len); + eapol_pkt =skb_put_zero (skb,sizeof (*eapol_pkt)); - eapol_pkt->hdr.frame_control =cpu_to_le16 (IEEE80211_FTYPE_DATA | -IEEE80211_FCTL_TODS | -IEEE80211_FCTL_PROTECTED ); -ether_addr_copy (eapol_pkt->hdr.addr1, bss_conf->bssid); -ether_addr_copy (eapol_pkt->hdr.addr2, vif->addr); -ether_addr_copy (eapol_pkt->hdr.addr3, bss_conf->bssid);memcpy (eapol_pkt->gtkbody, gtkbody,sizeof (gtkbody)); eapol_pkt->key_des_ver = key_des_ver;
@@ -2233,20 +2237,26 @@ static struct sk_buff *rtw89_sa_query_get(struct rtw89_dev *rtwdev, {struct ieee80211_vif *vif =rtwvif_to_vif (rtwvif);struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; +u8 sec_hdr_len =rtw89_wow_get_sec_hdr_len (rtwdev); +struct ieee80211_hdr_3addr *hdr;struct rtw89_sa_query *sa_query;struct sk_buff *skb; - skb =dev_alloc_skb (sizeof (*sa_query)); + skb =dev_alloc_skb (sizeof (*hdr) + sec_hdr_len +sizeof (*sa_query));if (!skb)return NULL ; + hdr =skb_put_zero (skb,sizeof (*hdr)); + hdr->frame_control =cpu_to_le16 (IEEE80211_FTYPE_MGMT | +IEEE80211_STYPE_ACTION | +IEEE80211_FCTL_PROTECTED ); +ether_addr_copy (hdr->addr1, bss_conf->bssid); +ether_addr_copy (hdr->addr2, vif->addr); +ether_addr_copy (hdr->addr3, bss_conf->bssid); + +skb_put_zero (skb, sec_hdr_len); + sa_query =skb_put_zero (skb,sizeof (*sa_query)); - sa_query->hdr.frame_control =cpu_to_le16 (IEEE80211_FTYPE_MGMT | -IEEE80211_STYPE_ACTION | -IEEE80211_FCTL_PROTECTED ); -ether_addr_copy (sa_query->hdr.addr1, bss_conf->bssid); -ether_addr_copy (sa_query->hdr.addr2, vif->addr); -ether_addr_copy (sa_query->hdr.addr3, bss_conf->bssid); sa_query->category =WLAN_CATEGORY_SA_QUERY ; sa_query->action =WLAN_ACTION_SA_QUERY_RESPONSE ;
@@ -2256,17 +2266,19 @@ static struct sk_buff *rtw89_sa_query_get(struct rtw89_dev *rtwdev,static struct sk_buff *rtw89_arp_response_get (struct rtw89_dev *rtwdev,struct rtw89_vif *rtwvif) { +u8 sec_hdr_len =rtw89_wow_get_sec_hdr_len (rtwdev);struct rtw89_wow_param *rtw_wow = &rtwdev->wow; +struct ieee80211_hdr_3addr *hdr;struct rtw89_arp_rsp *arp_skb;struct arphdr *arp_hdr;struct sk_buff *skb;__le16 fc; - skb =dev_alloc_skb (sizeof (struct rtw89_arp_rsp )); + skb =dev_alloc_skb (sizeof (*hdr) + sec_hdr_len +sizeof (*arp_skb));if (!skb)return NULL ; - arp_skb =skb_put_zero (skb,sizeof (*arp_skb)); + hdr =skb_put_zero (skb,sizeof (*hdr));if (rtw_wow->ptk_alg) fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_FCTL_TODS |
@@ -2274,11 +2286,14 @@ static struct sk_buff *rtw89_arp_response_get(struct rtw89_dev *rtwdev,else fc =cpu_to_le16 (IEEE80211_FTYPE_DATA |IEEE80211_FCTL_TODS ); - arp_skb->addr.frame_control = fc; -ether_addr_copy (arp_skb->addr.addr1, rtwvif->bssid); -ether_addr_copy (arp_skb->addr.addr2, rtwvif->mac_addr); -ether_addr_copy (arp_skb->addr.addr3, rtwvif->bssid); + hdr->frame_control = fc; +ether_addr_copy (hdr->addr1, rtwvif->bssid); +ether_addr_copy (hdr->addr2, rtwvif->mac_addr); +ether_addr_copy (hdr->addr3, rtwvif->bssid); + +skb_put_zero (skb, sec_hdr_len); + arp_skb =skb_put_zero (skb,sizeof (*arp_skb));memcpy (arp_skb->llc_hdr, rfc1042_header,sizeof (rfc1042_header)); arp_skb->llc_type =htons (ETH_P_ARP );
drivers/net/wireless/realtek/rtw89/wow.c +14 -8
@@ -27,17 +27,23 @@ void rtw89_wow_parse_akm(struct rtw89_dev *rtwdev, struct sk_buff *skb) rtw_wow->akm = rsn_ie->akm_cipher_suite.type; } +#define RTW89_CIPHER_INFO_DEF (cipher) \ + {WLAN_CIPHER_SUITE_ ## cipher, .fw_alg = RTW89_WOW_FW_ALG_ ## cipher, \ + .len = WLAN_KEY_LEN_ ## cipher} +static const struct rtw89_cipher_info rtw89_cipher_info_defs[] = { - {WLAN_CIPHER_SUITE_WEP40 , .fw_alg =1 , .len =WLAN_KEY_LEN_WEP40 ,}, - {WLAN_CIPHER_SUITE_WEP104 , .fw_alg =2 , .len =WLAN_KEY_LEN_WEP104 ,}, - {WLAN_CIPHER_SUITE_TKIP , .fw_alg =3 , .len =WLAN_KEY_LEN_TKIP ,}, - {WLAN_CIPHER_SUITE_CCMP , .fw_alg =6 , .len =WLAN_KEY_LEN_CCMP ,}, - {WLAN_CIPHER_SUITE_GCMP , .fw_alg =8 , .len =WLAN_KEY_LEN_GCMP ,}, - {WLAN_CIPHER_SUITE_CCMP_256 , .fw_alg =7 , .len =WLAN_KEY_LEN_CCMP_256 ,}, - {WLAN_CIPHER_SUITE_GCMP_256 , .fw_alg =23 , .len =WLAN_KEY_LEN_GCMP_256 ,}, - {WLAN_CIPHER_SUITE_AES_CMAC , .fw_alg =32 , .len =WLAN_KEY_LEN_AES_CMAC ,}, +RTW89_CIPHER_INFO_DEF (WEP40 ), +RTW89_CIPHER_INFO_DEF (WEP104 ), +RTW89_CIPHER_INFO_DEF (TKIP ), +RTW89_CIPHER_INFO_DEF (CCMP ), +RTW89_CIPHER_INFO_DEF (GCMP ), +RTW89_CIPHER_INFO_DEF (CCMP_256 ), +RTW89_CIPHER_INFO_DEF (GCMP_256 ), +RTW89_CIPHER_INFO_DEF (AES_CMAC ), }; +#undef RTW89_CIPHER_INFO_DEF +static const struct rtw89_cipher_info *rtw89_cipher_alg_recognize (u32 cipher) {
drivers/net/wireless/realtek/rtw89/wow.h +30 -0
@@ -35,6 +35,17 @@ enum rtw89_wake_reason { RTW89_WOW_RSN_RX_NLO = 0x55, }; +enum rtw89_fw_alg { +RTW89_WOW_FW_ALG_WEP40 =0x1 , +RTW89_WOW_FW_ALG_WEP104 =0x2 , +RTW89_WOW_FW_ALG_TKIP =0x3 , +RTW89_WOW_FW_ALG_CCMP =0x6 , +RTW89_WOW_FW_ALG_CCMP_256 =0x7 , +RTW89_WOW_FW_ALG_GCMP =0x8 , +RTW89_WOW_FW_ALG_GCMP_256 =0x9 , +RTW89_WOW_FW_ALG_AES_CMAC =0xa , +}; +struct rtw89_cipher_suite {u8 oui[3 ];u8 type;
@@ -64,6 +75,25 @@ struct rtw89_set_key_info_iter_data {bool error; }; +static inline int rtw89_wow_get_sec_hdr_len (struct rtw89_dev *rtwdev) +{ +struct rtw89_wow_param *rtw_wow = &rtwdev->wow; + +if (!(rtwdev->chip->chip_id ==RTL8852A ||rtw89_is_rtl885xb (rtwdev))) +return 0 ; + +switch (rtw_wow->ptk_alg) { +case RTW89_WOW_FW_ALG_WEP40 : +return 4 ; +case RTW89_WOW_FW_ALG_TKIP : +case RTW89_WOW_FW_ALG_CCMP : +case RTW89_WOW_FW_ALG_GCMP_256 : +return 8 ; +default : +return 0 ; + } +} +#ifdef CONFIG_PM int rtw89_wow_suspend (struct rtw89_dev *rtwdev,struct cfg80211_wowlan *wowlan);int rtw89_wow_resume (struct rtw89_dev *rtwdev);
Signature · 1 line
2.25.1
kernel test robot
build botRe: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher
kernel test robot noticed the following build errors:
Hi Ping-Ke,
kernel test robot noticed the following build errors:
[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.10-rc5 next-20240624] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ping-Ke-Shih/wifi-rtw89-wow-append-security-header-offset-for-different-cipher/20240624-152444 base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main patch link: https://lore.kernel.org/r/20240620055825.17592-2-pkshih%40realtek.com patch subject: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20240625/[email protected]/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240625/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
In file included from drivers/net/wireless/realtek/rtw89/core.c:21:
drivers/net/wireless/realtek/rtw89/wow.h: In function 'rtw89_wow_get_sec_hdr_len':
>> drivers/net/wireless/realtek/rtw89/wow.h:82:52: error: implicit declaration of function 'rtw89_is_rtl885xb' [-Werror=implicit-function-declaration]
82 | if (!(rtwdev->chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev)))
| ^~~~~~~~~~~~~~~~~cc1: some warnings being treated as errors
vim +/rtw89_is_rtl885xb +82 drivers/net/wireless/realtek/rtw89/wow.h
77
78 static inline int rtw89_wow_get_sec_hdr_len(struct rtw89_dev *rtwdev)
79 {
80 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
81
> 82 if (!(rtwdev->chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev)))
83 return 0;
84
85 switch (rtw_wow->ptk_alg) {
86 case RTW89_WOW_FW_ALG_WEP40:
87 return 4;
88 case RTW89_WOW_FW_ALG_TKIP:
89 case RTW89_WOW_FW_ALG_CCMP:
90 case RTW89_WOW_FW_ALG_GCMP_256:
91 return 8;
92 default:
93 return 0;
94 }
95 }
96 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Ping-Ke Shih
maintainerRE: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher
Quoted 29 lines · kernel test robot
Hi Ping-Ke,
kernel test robot noticed the following build errors:
[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.10-rc5 next-20240624] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]url:
https://github.com/intel-lab-lkp/linux/commits/Ping-Ke-Shih/wifi-rtw89-wow-append-security-header-offs
et-for-different-cipher/20240624-152444base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main patch link: https://lore.kernel.org/r/20240620055825.17592-2-pkshih%40realtek.com patch subject: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher config: i386-allmodconfig(https://download.01.org/0day-ci/archive/20240625/[email protected]/config)
compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0
reproduce (this is a W=1 build):
(https://download.01.org/0day-ci/archive/20240625/[email protected]/reproduce)If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All errors (new ones prefixed by >>):
Quoted 8 lines
In file included from
drivers/net/wireless/realtek/rtw89/core.c:21:
drivers/net/wireless/realtek/rtw89/wow.h: In function 'rtw89_wow_get_sec_hdr_len':Quoted 1 line
Quoted 1 line
drivers/net/wireless/realtek/rtw89/wow.h:82:52: error: implicit declaration of function'
rtw89_is_rtl885xb' [-Werror=implicit-function-declaration]82 | if (!(rtwdev->chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev))) | ^~~~~~~~~~~~~~~~~cc1: some warnings being treated as errors
This inline function has been in rtw tree [1], but haven't merged into wireless-next yet. I will ignore this robot report.
kernel test robot
build botRe: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher
In reply to Ping-Ke Shihkernel test robot noticed the following build errors:
Hi Ping-Ke,
kernel test robot noticed the following build errors:
[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.10-rc5 next-20240624] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ping-Ke-Shih/wifi-rtw89-wow-append-security-header-offset-for-different-cipher/20240624-152444 base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main patch link: https://lore.kernel.org/r/20240620055825.17592-2-pkshih%40realtek.com patch subject: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20240625/[email protected]/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240625/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
In file included from drivers/net/wireless/realtek/rtw89/core.c:21:
>> drivers/net/wireless/realtek/rtw89/wow.h:82:45: error: call to undeclared function 'rtw89_is_rtl885xb'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
82 | if (!(rtwdev->chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev)))
| ^1 error generated.
vim +/rtw89_is_rtl885xb +82 drivers/net/wireless/realtek/rtw89/wow.h
77
78 static inline int rtw89_wow_get_sec_hdr_len(struct rtw89_dev *rtwdev)
79 {
80 struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
81
> 82 if (!(rtwdev->chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev)))
83 return 0;
84
85 switch (rtw_wow->ptk_alg) {
86 case RTW89_WOW_FW_ALG_WEP40:
87 return 4;
88 case RTW89_WOW_FW_ALG_TKIP:
89 case RTW89_WOW_FW_ALG_CCMP:
90 case RTW89_WOW_FW_ALG_GCMP_256:
91 return 8;
92 default:
93 return 0;
94 }
95 }
96 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Ping-Ke Shih
maintainerRe: [PATCH 1/7] wifi: rtw89: wow: append security header offset for different cipher
In reply to Ping-Ke ShihQuoted 8 lines · Ping-Ke Shih
From: Chih-Kang Chang <[email protected]>
When creating
EAPOL_KEY,SA_QUERYandARP_RSPpacket offload, we need to append security header offset for different cipher as required by the firmware. Only 8852A, 8852B, 8852BT and 8851B need it.Signed-off-by Chih-Kang Chang <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
7 patch(es) applied to rtw-next branch of rtw.git, thanks.
0065199f4303 wifi: rtw89: wow: append security header offset for different cipher 0e5210217768 wifi: rtw89: wow: update WoWLAN reason register for different FW 6a03a349be1b wifi: rtw89: wow: update config mac for 802.11ax chip dda364c34591 wifi: rtw89: wow: fix GTK offload H2C skbuff issue 60757f28408b wifi: rtw89: wow: prevent to send unexpected H2C during download Firmware 2e2564877f57 wifi: rtw89: wow: enable beacon filter after swapping firmware 792586591f44 wifi: rtw89: add polling for LPS H2C to ensure FW received
Ping-Ke Shih
maintainerPATCH 2/7 wifi: rtw89: wow: update WoWLAN reason register for different FW
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
Need to update WoWLAN wakeup reason register after firmware version 0.35.22.0 for RTL8922A, and 0.27.80.0 for RTL8852CE.
--- drivers/net/wireless/realtek/rtw89/core.h | 3 ++- drivers/net/wireless/realtek/rtw89/fw.c | 2 ++ drivers/net/wireless/realtek/rtw89/fw.h | 6 ++++++ drivers/net/wireless/realtek/rtw89/reg.h | 4 ++++ drivers/net/wireless/realtek/rtw89/rtw8851b.c | 6 +++++- drivers/net/wireless/realtek/rtw89/rtw8852a.c | 6 +++++- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 6 +++++- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 6 +++++- drivers/net/wireless/realtek/rtw89/rtw8922a.c | 6 +++++- drivers/net/wireless/realtek/rtw89/wow.c | 7 ++++++- 10 files changed, 45 insertions(+), 7 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +2 -1
@@ -4236,7 +4236,7 @@ struct rtw89_chip_info {const u32 *c2h_regs;struct rtw89_reg_def c2h_counter_reg;const struct rtw89_page_regs *page_regs; -u32 wow_reason_reg; +const u32 *wow_reason_reg;bool cfo_src_fd;bool cfo_hw_comp;const struct rtw89_reg_def *dcfo_comp;
@@ -4346,6 +4346,7 @@ enum rtw89_fw_feature {RTW89_FW_FEATURE_NO_LPS_PG ,RTW89_FW_FEATURE_BEACON_FILTER ,RTW89_FW_FEATURE_MACID_PAUSE_SLEEP , + RTW89_FW_FEATURE_WOW_REASON_V1, }; struct rtw89_fw_suit {
drivers/net/wireless/realtek/rtw89/fw.c +2 -0
@@ -675,10 +675,12 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,36 ,0 ,SCAN_OFFLOAD ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,40 ,0 ,CRASH_TRIGGER ),__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,56 ,10 ,BEACON_FILTER ), +__CFG_FW_FEAT (RTL8852C , ge,0 ,27 ,80 ,0 ,WOW_REASON_V1 ),__CFG_FW_FEAT (RTL8922A , ge,0 ,34 ,30 ,0 ,CRASH_TRIGGER ),__CFG_FW_FEAT (RTL8922A , ge,0 ,34 ,11 ,0 ,MACID_PAUSE_SLEEP ),__CFG_FW_FEAT (RTL8922A , ge,0 ,34 ,35 ,0 ,SCAN_OFFLOAD ),__CFG_FW_FEAT (RTL8922A , ge,0 ,35 ,12 ,0 ,BEACON_FILTER ), + __CFG_FW_FEAT(RTL8922A, ge, 0, 35, 22, 0, WOW_REASON_V1), }; static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
drivers/net/wireless/realtek/rtw89/fw.h +6 -0
@@ -4659,4 +4659,10 @@ const struct rtw89_rfe_parms * rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev, const struct rtw89_rfe_parms *init); +enum rtw89_wow_wakeup_ver { +RTW89_WOW_REASON_V0 , +RTW89_WOW_REASON_V1 , +RTW89_WOW_REASON_NUM , +}; +#endif
drivers/net/wireless/realtek/rtw89/reg.h +4 -0
@@ -311,6 +311,8 @@#define B_AX_S1_LDO2PWRCUT_F BIT(23)#define B_AX_S0_LDO_VSEL_F_MASK GENMASK(22, 21) +#define R_AX_DBG_WOW 0x0504 +#define R_AX_SEC_CTRL 0x0C00#define B_AX_SEC_IDMEM_SIZE_CONFIG_MASK GENMASK(17, 16)
@@ -4315,6 +4317,8 @@#define R_BE_WLCPU_PORT_PC 0x03FC +#define R_BE_DBG_WOW 0x0504 +#define R_BE_DCPU_PLATFORM_ENABLE 0x0888#define B_BE_DCPU_SYM_DPLT_MEM_MUX_EN BIT(10)#define B_BE_DCPU_WARM_EN BIT(9)
drivers/net/wireless/realtek/rtw89/rtw8851b.c +5 -1
@@ -105,6 +105,10 @@ static const u32 rtw8851b_c2h_regs[RTW89_C2HREG_MAX] = {R_AX_C2HREG_DATA3 }; +static const u32 rtw8851b_wow_wakeup_regs[RTW89_WOW_REASON_NUM ] = { +R_AX_C2HREG_DATA3 +3 ,R_AX_C2HREG_DATA3 +3 , +}; +static const struct rtw89_page_regs rtw8851b_page_regs = { .hci_fc_ctrl =R_AX_HCI_FC_CTRL , .ch_page_ctrl =R_AX_CH_PAGE_CTRL ,
@@ -2509,7 +2513,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = { .c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8}, .c2h_regs = rtw8851b_c2h_regs, .page_regs = &rtw8851b_page_regs, - .wow_reason_reg = R_AX_C2HREG_DATA3 + 3, + .wow_reason_reg = rtw8851b_wow_wakeup_regs, .cfo_src_fd = true, .cfo_hw_comp = true, .dcfo_comp = &rtw8851b_dcfo_comp,
drivers/net/wireless/realtek/rtw89/rtw8852a.c +5 -1
@@ -398,6 +398,10 @@ static const u32 rtw8852a_c2h_regs[RTW89_C2HREG_MAX] = {R_AX_C2HREG_DATA3 }; +static const u32 rtw8852a_wow_wakeup_regs[RTW89_WOW_REASON_NUM ] = { +R_AX_C2HREG_DATA3 +3 ,R_AX_C2HREG_DATA3 +3 , +}; +static const struct rtw89_page_regs rtw8852a_page_regs = { .hci_fc_ctrl =R_AX_HCI_FC_CTRL , .ch_page_ctrl =R_AX_CH_PAGE_CTRL ,
@@ -2225,7 +2229,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = { .c2h_regs = rtw8852a_c2h_regs, .c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8}, .page_regs = &rtw8852a_page_regs, - .wow_reason_reg = R_AX_C2HREG_DATA3 + 3, + .wow_reason_reg = rtw8852a_wow_wakeup_regs, .cfo_src_fd = false, .cfo_hw_comp = false, .dcfo_comp = &rtw8852a_dcfo_comp,
drivers/net/wireless/realtek/rtw89/rtw8852b.c +5 -1
@@ -76,6 +76,10 @@ static const u32 rtw8852b_c2h_regs[RTW89_C2HREG_MAX] = {R_AX_C2HREG_DATA3 }; +static const u32 rtw8852b_wow_wakeup_regs[RTW89_WOW_REASON_NUM ] = { +R_AX_C2HREG_DATA3 +3 ,R_AX_C2HREG_DATA3 +3 , +}; +static const struct rtw89_page_regs rtw8852b_page_regs = { .hci_fc_ctrl =R_AX_HCI_FC_CTRL , .ch_page_ctrl =R_AX_CH_PAGE_CTRL ,
@@ -1026,7 +1030,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = { .c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8}, .c2h_regs = rtw8852b_c2h_regs, .page_regs = &rtw8852b_page_regs, - .wow_reason_reg = R_AX_C2HREG_DATA3 + 3, + .wow_reason_reg = rtw8852b_wow_wakeup_regs, .cfo_src_fd = true, .cfo_hw_comp = true, .dcfo_comp = &rtw8852b_dcfo_comp,
drivers/net/wireless/realtek/rtw89/rtw8852c.c +5 -1
@@ -73,6 +73,10 @@ static const u32 rtw8852c_c2h_regs[RTW89_H2CREG_MAX] = {R_AX_C2HREG_DATA3_V1 }; +static const u32 rtw8852c_wow_wakeup_regs[RTW89_WOW_REASON_NUM ] = { +R_AX_C2HREG_DATA3_V1 +3 ,R_AX_DBG_WOW , +}; +static const struct rtw89_page_regs rtw8852c_page_regs = { .hci_fc_ctrl =R_AX_HCI_FC_CTRL_V1 , .ch_page_ctrl =R_AX_CH_PAGE_CTRL_V1 ,
@@ -3007,7 +3011,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = { .c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8}, .c2h_regs = rtw8852c_c2h_regs, .page_regs = &rtw8852c_page_regs, - .wow_reason_reg = R_AX_C2HREG_DATA3_V1 + 3, + .wow_reason_reg = rtw8852c_wow_wakeup_regs, .cfo_src_fd = false, .cfo_hw_comp = false, .dcfo_comp = &rtw8852c_dcfo_comp,
drivers/net/wireless/realtek/rtw89/rtw8922a.c +5 -1
@@ -85,6 +85,10 @@ static const u32 rtw8922a_c2h_regs[RTW89_H2CREG_MAX] = {R_BE_C2HREG_DATA3 }; +static const u32 rtw8922a_wow_wakeup_regs[RTW89_WOW_REASON_NUM ] = { +R_AX_C2HREG_DATA3_V1 +3 ,R_BE_DBG_WOW , +}; +static const struct rtw89_page_regs rtw8922a_page_regs = { .hci_fc_ctrl =R_BE_HCI_FC_CTRL , .ch_page_ctrl =R_BE_CH_PAGE_CTRL ,
@@ -2609,7 +2613,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = { .c2h_counter_reg = {R_BE_UDM1 + 1, B_BE_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8}, .c2h_regs = rtw8922a_c2h_regs, .page_regs = &rtw8922a_page_regs, - .wow_reason_reg = R_AX_C2HREG_DATA3_V1 + 3, + .wow_reason_reg = rtw8922a_wow_wakeup_regs, .cfo_src_fd = true, .cfo_hw_comp = true, .dcfo_comp = NULL,
drivers/net/wireless/realtek/rtw89/wow.c +6 -1
@@ -723,13 +723,18 @@ static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev) {struct rtw89_wow_param *rtw_wow = &rtwdev->wow;struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt; -u32 wow_reason_reg = rtwdev->chip->wow_reason_reg;struct cfg80211_wowlan_nd_info nd_info;struct cfg80211_wowlan_wakeup wakeup = { .pattern_idx =-1 , }; +u32 wow_reason_reg;u8 reason; +if (RTW89_CHK_FW_FEATURE (WOW_REASON_V1 , &rtwdev->fw)) + wow_reason_reg = rtwdev->chip->wow_reason_reg[RTW89_WOW_REASON_V1 ]; +else + wow_reason_reg = rtwdev->chip->wow_reason_reg[RTW89_WOW_REASON_V0 ]; + reason =rtw89_read8 (rtwdev, wow_reason_reg);switch (reason) {case RTW89_WOW_RSN_RX_DEAUTH :
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/7 wifi: rtw89: wow: update config mac for 802.11ax chip
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
The 802.11ax chip also needs rtw89_mac_cpu_io_rx(), which notifies Firmware to start or stop WoWLAN and waits until Firmware process over. Then, the driver can continue processing to avoid unexpected behavior.
--- drivers/net/wireless/realtek/rtw89/mac.c | 29 +++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/mac.h | 1 + drivers/net/wireless/realtek/rtw89/mac_be.c | 20 -------------- drivers/net/wireless/realtek/rtw89/reg.h | 1 + 4 files changed, 31 insertions(+), 20 deletions(-)
drivers/net/wireless/realtek/rtw89/mac.c +29 -0
@@ -6320,9 +6320,30 @@ int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev,return ret; } +int rtw89_mac_cpu_io_rx (struct rtw89_dev *rtwdev,bool wow_enable) +{ +struct rtw89_mac_h2c_info h2c_info = {}; +struct rtw89_mac_c2h_info c2h_info = {}; +u32 ret; + + h2c_info.id =RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL ; + h2c_info.content_len =sizeof (h2c_info.u.hdr); + h2c_info.u.hdr.w0 =u32_encode_bits (wow_enable,RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN ); + + ret =rtw89_fw_msg_reg (rtwdev, &h2c_info, &c2h_info); +if (ret) +return ret; + +if (c2h_info.id !=RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK ) + ret = -EINVAL ; + +return ret; +} +static int rtw89_wow_config_mac_ax (struct rtw89_dev *rtwdev,bool enable_wow) {const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; +const struct rtw89_chip_info *chip = rtwdev->chip;int ret;if (enable_wow) {
@@ -6333,12 +6354,19 @@ static int rtw89_wow_config_mac_ax(struct rtw89_dev *rtwdev, bool enable_wow) }rtw89_write32_set (rtwdev,R_AX_RX_FUNCTION_STOP ,B_AX_HDR_RX_STOP ); +rtw89_mac_cpu_io_rx (rtwdev, enable_wow);rtw89_write32_clr (rtwdev, mac->rx_fltr,B_AX_SNIFFER_MODE );rtw89_mac_cfg_ppdu_status (rtwdev,RTW89_MAC_0 , false);rtw89_write32 (rtwdev,R_AX_ACTION_FWD0 ,0 );rtw89_write32 (rtwdev,R_AX_ACTION_FWD1 ,0 );rtw89_write32 (rtwdev,R_AX_TF_FWD ,0 );rtw89_write32 (rtwdev,R_AX_HW_RPT_FWD ,0 ); + +if (chip->chip_id ==RTL8852A ||rtw89_is_rtl885xb (rtwdev)) +rtw89_write8 (rtwdev,R_BE_DBG_WOW_READY ,WOWLAN_NOT_READY ); +else +rtw89_write32_set (rtwdev,R_AX_DBG_WOW , +B_AX_DBG_WOW_CPU_IO_RX_EN ); }else { ret =rtw89_mac_resize_ple_rx_quota (rtwdev, false);if (ret) {
@@ -6346,6 +6374,7 @@ static int rtw89_wow_config_mac_ax(struct rtw89_dev *rtwdev, bool enable_wow)return ret; } +rtw89_mac_cpu_io_rx (rtwdev, enable_wow);rtw89_write32_clr (rtwdev,R_AX_RX_FUNCTION_STOP ,B_AX_HDR_RX_STOP );rtw89_mac_cfg_ppdu_status (rtwdev,RTW89_MAC_0 , true);rtw89_write32 (rtwdev,R_AX_ACTION_FWD0 ,TRXCFG_MPDU_PROC_ACT_FRWD );
drivers/net/wireless/realtek/rtw89/mac.h +1 -0
@@ -1446,5 +1446,6 @@ int rtw89_mac_dle_quota_change(struct rtw89_dev *rtwdev, enum rtw89_qta_mode modint rtw89_mac_get_dle_rsvd_qt_cfg (struct rtw89_dev *rtwdev,enum rtw89_mac_dle_rsvd_qt_type type,struct rtw89_mac_dle_rsvd_qt_cfg *cfg); +int rtw89_mac_cpu_io_rx (struct rtw89_dev *rtwdev,bool wow_enable);#endif
drivers/net/wireless/realtek/rtw89/mac_be.c +0 -20
@@ -2312,26 +2312,6 @@ static void rtw89_mac_dump_qta_lost_be(struct rtw89_dev *rtwdev)dump_err_status_dispatcher_be (rtwdev); } -static int rtw89_mac_cpu_io_rx (struct rtw89_dev *rtwdev,bool wow_enable) -{ -struct rtw89_mac_h2c_info h2c_info = {}; -struct rtw89_mac_c2h_info c2h_info = {}; -u32 ret; - - h2c_info.id =RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL ; - h2c_info.content_len =sizeof (h2c_info.u.hdr); - h2c_info.u.hdr.w0 =u32_encode_bits (wow_enable,RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN ); - - ret =rtw89_fw_msg_reg (rtwdev, &h2c_info, &c2h_info); -if (ret) -return ret; - -if (c2h_info.id !=RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK ) - ret = -EINVAL ; - -return ret; -} -static int rtw89_wow_config_mac_be (struct rtw89_dev *rtwdev,bool enable_wow) {if (enable_wow) {
drivers/net/wireless/realtek/rtw89/reg.h +1 -0
@@ -312,6 +312,7 @@#define B_AX_S0_LDO_VSEL_F_MASK GENMASK(22, 21)#define R_AX_DBG_WOW 0x0504 +#define B_AX_DBG_WOW_CPU_IO_RX_EN BIT(8)#define R_AX_SEC_CTRL 0x0C00#define B_AX_SEC_IDMEM_SIZE_CONFIG_MASK GENMASK(17, 16)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/7 wifi: rtw89: wow: fix GTK offload H2C skbuff issue
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
We mistakenly put skb too large and that may exceed skb->end. Therefore, we fix it.
skbuff: skb_over_panic: text:ffffffffc09e9a9d len:416 put:204 head:ffff8fba04eca780 data:ffff8fba04eca7e0 tail:0x200 end:0x140 dev:<NULL>
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:192! invalid opcode: 0000 [#1] PREEMPT SMP PTI CPU: 1 PID: 4747 Comm: kworker/u4:44 Tainted: G O 6.6.30-02659-gc18865c4dfbd #1 86547039b47e46935493f615ee31d0b2d711d35e Hardware name: HP Meep/Meep, BIOS Google_Meep.11297.262.0 03/18/2021 Workqueue: events_unbound async_run_entry_fn RIP: 0010:skb_panic+0x5d/0x60 Code: c6 63 8b 8f bb 4c 0f 45 f6 48 c7 c7 4d 89 8b bb 48 89 ce 44 89 d1 41 56 53 41 53 ff b0 c8 00 00 00 e8 27 5f 23 00 48 83 c4 20 <0f> 0b 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 0f 1f 44 RSP: 0018:ffffaa700144bad0 EFLAGS: 00010282 RAX: 0000000000000089 RBX: 0000000000000140 RCX: 14432c5aad26c900 RDX: 0000000000000000 RSI: 00000000ffffdfff RDI: 0000000000000001 RBP: ffffaa700144bae0 R08: 0000000000000000 R09: ffffaa700144b920 R10: 00000000ffffdfff R11: ffffffffbc28fbc0 R12: ffff8fba4e57a010 R13: 0000000000000000 R14: ffffffffbb8f8b63 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff8fba7bd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007999c4ad1000 CR3: 000000015503a000 CR4: 0000000000350ee0 Call Trace: <TASK> ? __die_body+0x1f/0x70 ? die+0x3d/0x60 ? do_trap+0xa4/0x110 ? skb_panic+0x5d/0x60 ? do_error_trap+0x6d/0x90 ? skb_panic+0x5d/0x60 ? handle_invalid_op+0x30/0x40 ? skb_panic+0x5d/0x60 ? exc_invalid_op+0x3c/0x50 ? asm_exc_invalid_op+0x16/0x20 ? skb_panic+0x5d/0x60 skb_put+0x49/0x50 rtw89_fw_h2c_wow_gtk_ofld+0xbd/0x220 [rtw89_core 778b32de31cd1f14df2d6721ae99ba8a83636fa5] rtw89_wow_resume+0x31f/0x540 [rtw89_core 778b32de31cd1f14df2d6721ae99ba8a83636fa5] rtw89_ops_resume+0x2b/0xa0 [rtw89_core 778b32de31cd1f14df2d6721ae99ba8a83636fa5] ieee80211_reconfig+0x84/0x13e0 [mac80211 818a894e3b77da6298269c59ed7cdff065a4ed52] ? __pfx_wiphy_resume+0x10/0x10 [cfg80211 1a793119e2aeb157c4ca4091ff8e1d9ae233b59d] ? dev_printk_emit+0x51/0x70 ? _dev_info+0x6e/0x90 ? __pfx_wiphy_resume+0x10/0x10 [cfg80211 1a793119e2aeb157c4ca4091ff8e1d9ae233b59d] wiphy_resume+0x89/0x180 [cfg80211 1a793119e2aeb157c4ca4091ff8e1d9ae233b59d] ? __pfx_wiphy_resume+0x10/0x10 [cfg80211 1a793119e2aeb157c4ca4091ff8e1d9ae233b59d] dpm_run_callback+0x3c/0x140 device_resume+0x1f9/0x3c0 ? __pfx_dpm_watchdog_handler+0x10/0x10 async_resume+0x1d/0x30 async_run_entry_fn+0x29/0xd0 process_scheduled_works+0x1d8/0x3d0 worker_thread+0x1fc/0x2f0 kthread+0xed/0x110 ? __pfx_worker_thread+0x10/0x10 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x38/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1b/0x30 </TASK> Modules linked in: ccm 8021q r8153_ecm cdc_ether usbnet r8152 mii dm_integrity async_xor xor async_tx lz4 lz4_compress zstd zstd_compress zram zsmalloc uinput rfcomm cmac algif_hash rtw89_8922ae(O) algif_skcipher rtw89_8922a(O) af_alg rtw89_pci(O) rtw89_core(O) btusb(O) snd_soc_sst_bxt_da7219_max98357a btbcm(O) snd_soc_hdac_hdmi btintel(O) snd_soc_intel_hda_dsp_common snd_sof_probes btrtl(O) btmtk(O) snd_hda_codec_hdmi snd_soc_dmic uvcvideo videobuf2_vmalloc uvc videobuf2_memops videobuf2_v4l2 videobuf2_common snd_sof_pci_intel_apl snd_sof_intel_hda_common snd_soc_hdac_hda snd_sof_intel_hda soundwire_intel soundwire_generic_allocation snd_sof_intel_hda_mlink soundwire_cadence snd_sof_pci snd_sof_xtensa_dsp mac80211 snd_soc_acpi_intel_match snd_soc_acpi snd_sof snd_sof_utils soundwire_bus snd_soc_max98357a snd_soc_avs snd_soc_hda_codec snd_hda_ext_core snd_intel_dspcfg snd_intel_sdw_acpi snd_soc_da7219 snd_hda_codec snd_hwdep snd_hda_core veth ip6table_nat xt_MASQUERADE xt_cgroup fuse bluetooth ecdh_generic cfg80211 ecc gsmi: Log Shutdown Reason 0x03 ---[ end trace 0000000000000000 ]---
--- drivers/net/wireless/realtek/rtw89/fw.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +1 -3
@@ -6767,10 +6767,8 @@ int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,skb_put (skb, len); h2c = (struct rtw89_h2c_wow_gtk_ofld *)skb->data; -if (!enable) { -skb_put_zero (skb,sizeof (*gtk_info)); +if (!enable) goto hdr; - } ret = rtw89_fw_h2c_add_general_pkt(rtwdev, rtwvif, RTW89_PKT_OFLD_TYPE_EAPOL_KEY,
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/7 wifi: rtw89: wow: prevent to send unexpected H2C during download Firmware
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
While downloading Firmware in the resume flow, it is possible to receive beacon and send H2C to Firmware. However, if Firmware receives unexpected H2C during the download process, it will fail. Therefore, we prevent to send unexpected H2C during download Firmware in WoWLAN mode.
--- drivers/net/wireless/realtek/rtw89/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/core.c +2 -1
@@ -1921,7 +1921,8 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,return ;if (ieee80211_is_beacon (hdr->frame_control)) { -if (vif->type ==NL80211_IFTYPE_STATION ) { +if (vif->type ==NL80211_IFTYPE_STATION && + !test_bit (RTW89_FLAG_WOWLAN , rtwdev->flags)) {rtw89_vif_sync_bcn_tsf (rtwvif, hdr, skb->len);rtw89_fw_h2c_rssi_offload (rtwdev, phy_ppdu); }
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 6/7 wifi: rtw89: wow: enable beacon filter after swapping firmware
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
To avoid wake up by AP disconnection, but no beacon filter setting and driver can't disconnect successfully. We need to enable beacon filter after swapping firmware in WoWLAN mode.
--- drivers/net/wireless/realtek/rtw89/wow.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/realtek/rtw89/wow.c +4 -0
@@ -1295,12 +1295,16 @@ static int rtw89_wow_disable_trx_pre(struct rtw89_dev *rtwdev)static int rtw89_wow_disable_trx_post (struct rtw89_dev *rtwdev) { +struct rtw89_wow_param *rtw_wow = &rtwdev->wow; +struct ieee80211_vif *vif = rtw_wow->wow_vif;int ret; ret =rtw89_mac_cfg_ppdu_status (rtwdev,RTW89_MAC_0 , true);if (ret)rtw89_err (rtwdev,"cfg ppdu status\n" ); +rtw89_fw_h2c_set_bcn_fltr_cfg (rtwdev, vif, true); +return ret; }
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 7/7 wifi: rtw89: add polling for LPS H2C to ensure FW received
In reply to Ping-Ke ShihFrom: Chih-Kang Chang <[email protected]>
We add polling after sending LPS H2C to ensure that the Firmware is received and executes RPWM thereafter. Otherwise, if the Firmware executes RPWM without receiving LPS H2C, it will cause beacon loss in WoWLAN mode due to the inability to obtain channel and bandwidth information from H2C.
--- drivers/net/wireless/realtek/rtw89/fw.c | 7 +++++++ drivers/net/wireless/realtek/rtw89/reg.h | 2 ++ 2 files changed, 9 insertions(+)
drivers/net/wireless/realtek/rtw89/fw.c +7 -0
@@ -2496,6 +2496,7 @@ int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)struct rtw89_h2c_lps_ch_info *h2c;u32 len =sizeof (*h2c);struct sk_buff *skb; +u32 done;int ret;if (chip->chip_gen !=RTW89_CHIP_BE )
@@ -2519,12 +2520,18 @@ int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)H2C_CAT_OUTSRC ,H2C_CL_OUTSRC_DM , H2C_FUNC_FW_LPS_CH_INFO, 0, 0, len); +rtw89_phy_write32_mask (rtwdev,R_CHK_LPS_STAT ,B_CHK_LPS_STAT ,0 ); ret =rtw89_h2c_tx (rtwdev, skb, false);if (ret) {rtw89_err (rtwdev,"failed to send h2c\n" ); goto fail; } + ret =read_poll_timeout (rtw89_phy_read32_mask, done, done,50 ,5000 , + true, rtwdev,R_CHK_LPS_STAT ,B_CHK_LPS_STAT ); +if (ret) +rtw89_warn (rtwdev,"h2c_lps_ch_info done polling timeout\n" ); +return 0 ; fail:dev_kfree_skb_any (skb);
drivers/net/wireless/realtek/rtw89/reg.h +2 -0
@@ -7818,6 +7818,8 @@#define B_UPD_P0_EN BIT(31)#define R_EMLSR 0x0044#define B_EMLSR_PARM GENMASK(27, 12) +#define R_CHK_LPS_STAT 0x0058 +#define B_CHK_LPS_STAT BIT(0)#define R_SPOOF_CG 0x00B4#define B_SPOOF_CG_EN BIT(17)#define R_CHINFO_SEG 0x00B4
Signature · 1 line
2.25.1