]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: mcc: clear normal flow NoA when MCC start
authorChih-Kang Chang <gary.chang@realtek.com>
Tue, 10 Jun 2025 13:00:31 +0000 (21:00 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 16 Jun 2025 05:35:06 +0000 (13:35 +0800)
Clear NoA setting before MCC starts. Otherwise, nulldata will be
blocked to TX because firmware use the normal flow NoA to calculate
timing.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250610130034.14692-10-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/chan.c
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/ps.c
drivers/net/wireless/realtek/rtw89/ps.h

index 7539bba2e094853dc03c1d3d58e0eecb36bd8056..c83c4036151db0cb7454f91b45369a28eafb8643 100644 (file)
@@ -960,6 +960,7 @@ static int rtw89_mcc_fill_all_roles(struct rtw89_dev *rtwdev)
                }
 
                sel.bind_vif[i] = rtwvif_link;
+               rtw89_p2p_disable_all_noa(rtwdev, rtwvif_link, NULL);
        }
 
        ret = rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_fill_role_iterator, &sel);
index 608159d31e08db255615a8a3d68c5db3d4cd4218..2d649186b70059baf06903023a9158a8212a4e4f 100644 (file)
@@ -3033,12 +3033,10 @@ fail:
 #define H2C_P2P_ACT_LEN 20
 int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
                         struct rtw89_vif_link *rtwvif_link,
-                        struct ieee80211_bss_conf *bss_conf,
                         struct ieee80211_p2p_noa_desc *desc,
-                        u8 act, u8 noa_id)
+                        u8 act, u8 noa_id, u8 ctwindow_oppps)
 {
        bool p2p_type_gc = rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT;
-       u8 ctwindow_oppps = bss_conf->p2p_noa_attr.oppps_ctwindow;
        struct sk_buff *skb;
        u8 *cmd;
        int ret;
index d66333321de2f0709cf0c4295617471dbb950297..116a17f7dfc6c232306cfedc4f61ac5adeec3aa2 100644 (file)
@@ -4849,9 +4849,8 @@ int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
                          const struct rtw89_pkt_drop_params *params);
 int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
                         struct rtw89_vif_link *rtwvif_link,
-                        struct ieee80211_bss_conf *bss_conf,
                         struct ieee80211_p2p_noa_desc *desc,
-                        u8 act, u8 noa_id);
+                        u8 act, u8 noa_id, u8 ctwindow_oppps);
 int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
                              struct rtw89_vif_link *rtwvif_link,
                              bool en);
index c255c2f9b94587b41cf218f40de80613404c41a7..3411d642c84a7be469386d18eab3867b46420ac9 100644 (file)
@@ -238,13 +238,23 @@ static void rtw89_tsf32_toggle(struct rtw89_dev *rtwdev,
                rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif_link, false);
 }
 
-static void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
-                                     struct rtw89_vif_link *rtwvif_link,
-                                     struct ieee80211_bss_conf *bss_conf)
+void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
+                              struct rtw89_vif_link *rtwvif_link,
+                              struct ieee80211_bss_conf *bss_conf)
 {
        enum rtw89_p2pps_action act;
+       u8 oppps_ctwindow;
        u8 noa_id;
 
+       rcu_read_lock();
+
+       if (!bss_conf)
+               bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
+
+       oppps_ctwindow = bss_conf->p2p_noa_attr.oppps_ctwindow;
+
+       rcu_read_unlock();
+
        if (rtwvif_link->last_noa_nr == 0)
                return;
 
@@ -254,8 +264,8 @@ static void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
                else
                        act = RTW89_P2P_ACT_REMOVE;
                rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
-               rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, bss_conf,
-                                    NULL, act, noa_id);
+               rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, NULL,
+                                    act, noa_id, oppps_ctwindow);
        }
 }
 
@@ -277,8 +287,8 @@ static void rtw89_p2p_update_noa(struct rtw89_dev *rtwdev,
                else
                        act = RTW89_P2P_ACT_UPDATE;
                rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
-               rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, bss_conf,
-                                    desc, act, noa_id);
+               rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, desc, act, noa_id,
+                                    bss_conf->p2p_noa_attr.oppps_ctwindow);
        }
        rtwvif_link->last_noa_nr = noa_id;
 }
index b2c43d44820d3fd54c787a0c2b0f86c595f826cb..729477153de66bf71be6bbcdd0832053e288c148 100644 (file)
@@ -25,6 +25,9 @@ u8 rtw89_p2p_noa_fetch(struct rtw89_vif_link *rtwvif_link, void **data);
 void rtw89_p2p_noa_once_init(struct rtw89_vif_link *rtwvif_link);
 void rtw89_p2p_noa_once_deinit(struct rtw89_vif_link *rtwvif_link);
 void rtw89_p2p_noa_once_recalc(struct rtw89_vif_link *rtwvif_link);
+void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
+                              struct rtw89_vif_link *rtwvif_link,
+                              struct ieee80211_bss_conf *bss_conf);
 
 static inline void rtw89_leave_ips_by_hwflags(struct rtw89_dev *rtwdev)
 {