if (!info->enable_beacon) {
                ath10k_vdev_stop(arvif);
 
-               spin_lock_bh(&arvif->ar->data_lock);
                arvif->is_started = false;
                arvif->is_up = false;
+
+               spin_lock_bh(&arvif->ar->data_lock);
                ath10k_mac_vif_beacon_free(arvif);
                spin_unlock_bh(&arvif->ar->data_lock);
 
        struct ieee80211_vif *vif = arvif->vif;
        int ret;
 
+       lockdep_assert_held(&arvif->ar->conf_mutex);
+
+       if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
+               return;
+
        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
                return;
 
                return;
        }
 
-       spin_lock_bh(&arvif->ar->data_lock);
        arvif->is_up = true;
-       spin_unlock_bh(&arvif->ar->data_lock);
 
        /* Workaround: Some firmware revisions (tested with qca6174
         * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
                return;
        }
 
-       spin_lock_bh(&arvif->ar->data_lock);
        arvif->is_up = false;
-       spin_unlock_bh(&arvif->ar->data_lock);
 }
 
 static int ath10k_station_assoc(struct ath10k *ar,
 
                break;
        }
 
-       spin_lock_bh(&ar->data_lock);
        arvif = ath10k_get_arvif(ar, vdev_id);
-       if (arvif && arvif->is_up)
+       if (arvif && arvif->is_up && arvif->vif->csa_active)
                ieee80211_queue_work(ar->hw, &arvif->ap_csa_work);
-       spin_unlock_bh(&ar->data_lock);
 
        kfree(tb);
        return 0;