]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: check scan C2H event recv ack instead of C2H event done ack
authorChih-Kang Chang <gary.chang@realtek.com>
Mon, 20 Apr 2026 03:40:48 +0000 (11:40 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 29 Apr 2026 04:52:37 +0000 (12:52 +0800)
The original flow checks the scan offload C2H event done ack to increase
the scan sequence. However, the scan offload response C2H event may be
received earlier than the scan offload C2H event done ack, which causes
these C2H event to be dropped by rtw89_fw_c2h_purge_obsoleted_scan_events()
check because the scan sequence of the scan offload response C2H event
is less than the scan offload C2H event done ack. Therefore, checking
the scan offload C2H event recv ack instead of C2H event done ack to fix
this issue.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260420034051.17666-14-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c

index 3f8275bfe91b7e688fe023d51a4b234bcc71334a..87e3320b5a8105a2732ca3985e445f82c73fee48 100644 (file)
@@ -5451,10 +5451,30 @@ rtw89_mac_c2h_rec_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 len
        u8 h2c_class = le32_get_bits(c2h->w2, RTW89_C2H_REV_ACK_W2_CLASS);
        u8 h2c_func = le32_get_bits(c2h->w2, RTW89_C2H_REV_ACK_W2_FUNC);
        u8 h2c_seq = le32_get_bits(c2h->w2, RTW89_C2H_REV_ACK_W2_H2C_SEQ);
+       struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
 
        rtw89_debug(rtwdev, RTW89_DBG_FW,
                    "C2H rev ack recv, cat: %d, class: %d, func: %d, seq : %d\n",
                    h2c_cat, h2c_class, h2c_func, h2c_seq);
+
+       if (h2c_cat != H2C_CAT_MAC)
+               return;
+
+       switch (h2c_class) {
+       default:
+               return;
+       case H2C_CL_MAC_FW_OFLD:
+               switch (h2c_func) {
+               default:
+                       return;
+               case H2C_FUNC_SCANOFLD:
+               case H2C_FUNC_SCANOFLD_BE:
+                       scan_info->seq++;
+                       break;
+               }
+
+               return;
+       }
 }
 
 static void
@@ -5462,7 +5482,6 @@ rtw89_mac_c2h_done_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 le
 {
        /* N.B. This will run in interrupt context. */
        struct rtw89_wait_info *fw_ofld_wait = &rtwdev->mac.fw_ofld_wait;
-       struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
        struct rtw89_wait_info *ps_wait = &rtwdev->mac.ps_wait;
        const struct rtw89_c2h_done_ack *c2h =
                (const struct rtw89_c2h_done_ack *)skb_c2h->data;
@@ -5505,11 +5524,9 @@ rtw89_mac_c2h_done_ack(struct rtw89_dev *rtwdev, struct sk_buff *skb_c2h, u32 le
                        h2c_return &= RTW89_C2H_SCAN_DONE_ACK_RETURN;
                        break;
                case H2C_FUNC_SCANOFLD:
-                       scan_info->seq++;
                        cond = RTW89_SCANOFLD_WAIT_COND_START;
                        break;
                case H2C_FUNC_SCANOFLD_BE:
-                       scan_info->seq++;
                        cond = RTW89_SCANOFLD_BE_WAIT_COND_START;
                        h2c_return &= RTW89_C2H_SCAN_DONE_ACK_RETURN;
                        break;