rtw89_core_scan_complete(rtwdev, vif, true);
        ieee80211_scan_completed(rtwdev->hw, &info);
        ieee80211_wake_queues(rtwdev->hw);
+       rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, true);
 
        rtw89_release_pkt_list(rtwdev);
        rtwvif = (struct rtw89_vif *)vif->drv_priv;
        rtw89_hw_scan_complete(rtwdev, vif, true);
 }
 
+static bool rtw89_is_any_vif_connected_or_connecting(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_vif *rtwvif;
+
+       rtw89_for_each_rtwvif(rtwdev, rtwvif) {
+               /* This variable implies connected or during attempt to connect */
+               if (!is_zero_ether_addr(rtwvif->bssid))
+                       return true;
+       }
+
+       return false;
+}
+
 int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
                          bool enable)
 {
        if (!rtwvif)
                return -EINVAL;
 
-       /* This variable implies connected or during attempt to connect */
-       connected = !is_zero_ether_addr(rtwvif->bssid);
+       connected = rtw89_is_any_vif_connected_or_connecting(rtwdev);
        opt.enable = enable;
        opt.target_ch_mode = connected;
        if (enable) {
 
 }
 
 static void rtw89_mac_port_cfg_tx_sw(struct rtw89_dev *rtwdev,
-                                    struct rtw89_vif *rtwvif)
+                                    struct rtw89_vif *rtwvif, bool en)
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        const struct rtw89_port_reg *p = mac->port_base;
-       bool en = rtwvif->net_type == RTW89_NET_TYPE_AP_MODE ||
-                 rtwvif->net_type == RTW89_NET_TYPE_AD_HOC;
 
        if (en)
                rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg, B_AX_BCNTX_EN);
                rtw89_write32_port_clr(rtwdev, rtwvif, p->port_cfg, B_AX_BCNTX_EN);
 }
 
+static void rtw89_mac_port_cfg_tx_sw_by_nettype(struct rtw89_dev *rtwdev,
+                                               struct rtw89_vif *rtwvif)
+{
+       bool en = rtwvif->net_type == RTW89_NET_TYPE_AP_MODE ||
+                 rtwvif->net_type == RTW89_NET_TYPE_AD_HOC;
+
+       rtw89_mac_port_cfg_tx_sw(rtwdev, rtwvif, en);
+}
+
+void rtw89_mac_enable_beacon_for_ap_vifs(struct rtw89_dev *rtwdev, bool en)
+{
+       struct rtw89_vif *rtwvif;
+
+       rtw89_for_each_rtwvif(rtwdev, rtwvif)
+               if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
+                       rtw89_mac_port_cfg_tx_sw(rtwdev, rtwvif, en);
+}
+
 static void rtw89_mac_port_cfg_bcn_intv(struct rtw89_dev *rtwdev,
                                        struct rtw89_vif *rtwvif)
 {
        rtw89_mac_port_cfg_bcn_prct(rtwdev, rtwvif);
        rtw89_mac_port_cfg_rx_sw(rtwdev, rtwvif);
        rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif);
-       rtw89_mac_port_cfg_tx_sw(rtwdev, rtwvif);
+       rtw89_mac_port_cfg_tx_sw_by_nettype(rtwdev, rtwvif);
        rtw89_mac_port_cfg_bcn_intv(rtwdev, rtwvif);
        rtw89_mac_port_cfg_hiq_win(rtwdev, rtwvif);
        rtw89_mac_port_cfg_hiq_dtim(rtwdev, rtwvif);
 
        switch (reason) {
        case RTW89_SCAN_LEAVE_CH_NOTIFY:
-               if (rtw89_is_op_chan(rtwdev, band, chan))
+               if (rtw89_is_op_chan(rtwdev, band, chan)) {
+                       rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, false);
                        ieee80211_stop_queues(rtwdev->hw);
+               }
                return;
        case RTW89_SCAN_END_SCAN_NOTIFY:
                if (rtwvif && rtwvif->scan_req &&
                if (rtw89_is_op_chan(rtwdev, band, chan)) {
                        rtw89_assign_entity_chan(rtwdev, rtwvif->sub_entity_idx,
                                                 &rtwdev->scan_info.op_chan);
+                       rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, true);
                        ieee80211_wake_queues(rtwdev->hw);
                } else {
                        rtw89_chan_create(&new, chan, chan, band,