]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: wow: fix wait condition for AOAC report request
authorZong-Zhe Yang <kevin_yang@realtek.com>
Mon, 26 Aug 2024 09:04:36 +0000 (17:04 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 2 Sep 2024 01:12:16 +0000 (09:12 +0800)
Each condition binding to the same wait should be unique. AOAC code misused
the wait of FW offload series and broke the above rule. It added another
macro to generate wait condition of WoWLAN/AOAC, but the results conflict
to the ones of FW offload series. It means that we might be completed
wrongly in logic. We don't want things work/read like this and should
have avoided this.

Fix this by adding another wait which aims for WoWLAN functions.

Fixes: ff53fce5c78b ("wifi: rtw89: wow: update latest PTK GTK info to mac80211 after resume")
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240826090439.17242-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/mac.c

index dc642697d74a5979f93115890feb34f56ab0571d..436c01880ed49298238d3ecfbc980f5aeebe1e79 100644 (file)
@@ -4320,6 +4320,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
 
        rtw89_init_wait(&rtwdev->mcc.wait);
        rtw89_init_wait(&rtwdev->mac.fw_ofld_wait);
+       rtw89_init_wait(&rtwdev->wow.wait);
 
        INIT_WORK(&rtwdev->c2h_work, rtw89_fw_c2h_work);
        INIT_WORK(&rtwdev->ips_work, rtw89_ips_work);
index 34dbe7f132f8407888239caeb63273121dbe65d5..0f881cf99289791ded0a3ceb12bfc77aa6d70617 100644 (file)
@@ -5367,6 +5367,9 @@ struct rtw89_wow_param {
        u8 ptk_keyidx;
        u8 akm;
 
+       /* see RTW89_WOW_WAIT_COND series for wait condition */
+       struct rtw89_wait_info wait;
+
        bool pno_inited;
        struct list_head pno_pkt_list;
        struct cfg80211_sched_scan_request *nd_config;
index 023dd34567835a10ec9add30103fee219f99a542..fa2f0d8c2ec0ccd468d01e7f0acf89efccb821db 100644 (file)
@@ -7212,11 +7212,10 @@ fail:
 
 int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev)
 {
-       struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
+       struct rtw89_wait_info *wait = &rtwdev->wow.wait;
        struct rtw89_h2c_wow_aoac *h2c;
        u32 len = sizeof(*h2c);
        struct sk_buff *skb;
-       unsigned int cond;
 
        skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
        if (!skb) {
@@ -7235,8 +7234,7 @@ int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev)
                              H2C_FUNC_AOAC_REPORT_REQ, 1, 0,
                              len);
 
-       cond = RTW89_WOW_WAIT_COND(H2C_FUNC_AOAC_REPORT_REQ);
-       return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, cond);
+       return rtw89_h2c_tx_and_wait(rtwdev, skb, wait, RTW89_WOW_WAIT_COND_AOAC);
 }
 
 /* Return < 0, if failures happen during waiting for the condition.
index 6e43cbc9559c88d069cb75caf0c397741e8340eb..deda384a5251d91de1bbadbeb0f7b3c7d70d4aa4 100644 (file)
@@ -4015,8 +4015,11 @@ enum rtw89_wow_h2c_func {
        NUM_OF_RTW89_WOW_H2C_FUNC,
 };
 
-#define RTW89_WOW_WAIT_COND(func) \
-       (NUM_OF_RTW89_WOW_H2C_FUNC + (func))
+#define RTW89_WOW_WAIT_COND(tag, func) \
+       ((tag) * NUM_OF_RTW89_WOW_H2C_FUNC + (func))
+
+#define RTW89_WOW_WAIT_COND_AOAC \
+       RTW89_WOW_WAIT_COND(0 /* don't care */, H2C_FUNC_AOAC_REPORT_REQ)
 
 /* CLASS 2 - PS */
 #define H2C_CL_MAC_PS                  0x2
index a661c176100cf94544f25d3c5cd90b6e300198ef..f336362ad45ef2a90359294238b41cd23b548b01 100644 (file)
@@ -5165,11 +5165,10 @@ rtw89_mac_c2h_wow_aoac_rpt(struct rtw89_dev *rtwdev, struct sk_buff *skb, u32 le
 {
        struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
        struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt;
-       struct rtw89_wait_info *wait = &rtwdev->mac.fw_ofld_wait;
+       struct rtw89_wait_info *wait = &rtw_wow->wait;
        const struct rtw89_c2h_wow_aoac_report *c2h =
                (const struct rtw89_c2h_wow_aoac_report *)skb->data;
        struct rtw89_completion_data data = {};
-       unsigned int cond;
 
        aoac_rpt->rpt_ver = c2h->rpt_ver;
        aoac_rpt->sec_type = c2h->sec_type;
@@ -5187,8 +5186,7 @@ rtw89_mac_c2h_wow_aoac_rpt(struct rtw89_dev *rtwdev, struct sk_buff *skb, u32 le
        aoac_rpt->igtk_ipn = le64_to_cpu(c2h->igtk_ipn);
        memcpy(aoac_rpt->igtk, c2h->igtk, sizeof(aoac_rpt->igtk));
 
-       cond = RTW89_WOW_WAIT_COND(H2C_FUNC_AOAC_REPORT_REQ);
-       rtw89_complete_cond(wait, cond, &data);
+       rtw89_complete_cond(wait, RTW89_WOW_WAIT_COND_AOAC, &data);
 }
 
 static void