wifi: rtw89: stop mac port function when stop_ap()
authorPo-Hao Huang <phhuang@realtek.com>
Fri, 2 Dec 2022 06:15:25 +0000 (14:15 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:47:58 +0000 (16:47 +0200)
Disable hardware beacon related functions when ap stops. So hardware won't
transmit beacons while interface is already removed.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221202061527.505668-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac80211.c

index a80690d0bf4855803f00d34a117c8dfff1fa7490..12cbf41590bbe319cdfe3cdfe4d82dcb8723a78d 100644 (file)
@@ -3877,11 +3877,16 @@ static void rtw89_mac_port_cfg_hiq_drop(struct rtw89_dev *rtwdev,
 }
 
 static void rtw89_mac_port_cfg_func_en(struct rtw89_dev *rtwdev,
-                                      struct rtw89_vif *rtwvif)
+                                      struct rtw89_vif *rtwvif, bool enable)
 {
        const struct rtw89_port_reg *p = &rtw_port_base;
 
-       rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg, B_AX_PORT_FUNC_EN);
+       if (enable)
+               rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg,
+                                      B_AX_PORT_FUNC_EN);
+       else
+               rtw89_write32_port_clr(rtwdev, rtwvif, p->port_cfg,
+                                      B_AX_PORT_FUNC_EN);
 }
 
 static void rtw89_mac_port_cfg_bcn_early(struct rtw89_dev *rtwdev,
@@ -4033,7 +4038,7 @@ int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
        rtw89_mac_port_cfg_tbtt_shift(rtwdev, rtwvif);
        rtw89_mac_port_cfg_bss_color(rtwdev, rtwvif);
        rtw89_mac_port_cfg_mbssid(rtwdev, rtwvif);
-       rtw89_mac_port_cfg_func_en(rtwdev, rtwvif);
+       rtw89_mac_port_cfg_func_en(rtwdev, rtwvif, true);
        rtw89_mac_port_tsf_resync_all(rtwdev);
        fsleep(BCN_ERLY_SET_DLY);
        rtw89_mac_port_cfg_bcn_early(rtwdev, rtwvif);
@@ -4085,6 +4090,11 @@ void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
                rtw89_write32_set(rtwdev, reg, B_AX_RXTRIG_RU26_DIS);
 }
 
+void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
+{
+       rtw89_mac_port_cfg_func_en(rtwdev, rtwvif, false);
+}
+
 int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
        int ret;
index 766ca6934d33a764e9ab7de95dac8359c59e22af..f0b684b205f1011b75e6364839cf7622dcf90591 100644 (file)
@@ -908,6 +908,7 @@ int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
 int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
                                        struct ieee80211_vif *vif);
+void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
 int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
 void rtw89_mac_disable_cpu(struct rtw89_dev *rtwdev);
 int rtw89_mac_enable_cpu(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw);
index 1a99267d710d4e8b91f8a4515b81ea5ff9009b55..0c86d416b7ad2720fad77e17233ceb263ebd3b46 100644 (file)
@@ -454,6 +454,7 @@ void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
 
        mutex_lock(&rtwdev->mutex);
+       rtw89_mac_stop_ap(rtwdev, rtwvif);
        rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, NULL);
        rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
        mutex_unlock(&rtwdev->mutex);