wifi: ath12k: switch to using wiphy_lock() and remove ar->conf_mutex
authorKalle Valo <quic_kvalo@quicinc.com>
Mon, 7 Oct 2024 16:59:29 +0000 (19:59 +0300)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Fri, 11 Oct 2024 14:21:54 +0000 (07:21 -0700)
Switch from using driver specific ar->conf_mutex to wiphy->mtx. The benefits are:

* one lock less and simplified locking

* possibility to use wiphy_work_queue() without other locks

Most of the mac80211 ops are called within wiphy_lock(), most notable exception
being tx op. This can be checked with lockdep_assert_wiphy() from
net/mac80211/driver-ops.[ch] and I veried that by manually going through all
the ops in ath12k_ops which had lockdep_assert_wiphy().

The conversion was simple:

* All conf_mutex lock() and unlock() calls which
  already were called under wiphy_lock() I replaced with
  lockdep_assert_wiphy().

* The rest of conf_mutex calls I replaced with wiphy_lock() and wiphy_unlock().

* All lockdep_asset_held(conf_mutex) calls I replaced with
  lockdep_assert_wiphy().

One exception was in ath12k_core_post_reconfigure_recovery() where the wiphy
lock needs to be taken before hw_mutex to avoid a lockdep warning.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://patch.msgid.link/20241007165932.78081-4-kvalo@kernel.org
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
drivers/net/wireless/ath/ath12k/core.c
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/debugfs.c
drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/peer.c
drivers/net/wireless/ath/ath12k/wow.c

index 51252e8bc1ae99b953e1488a9d53ad6cc198411c..9cd485ed42ab7db743609cbeca9883e659714d93 100644 (file)
@@ -1004,7 +1004,7 @@ void ath12k_core_halt(struct ath12k *ar)
 {
        struct ath12k_base *ab = ar->ab;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ar->num_created_vdevs = 0;
        ar->allocated_vdev_map = 0;
@@ -1078,6 +1078,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)
                if (!ah || ah->state == ATH12K_HW_STATE_OFF)
                        continue;
 
+               wiphy_lock(ah->hw->wiphy);
                mutex_lock(&ah->hw_mutex);
 
                switch (ah->state) {
@@ -1086,10 +1087,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)
 
                        for (j = 0; j < ah->num_radio; j++) {
                                ar = &ah->radio[j];
-
-                               mutex_lock(&ar->conf_mutex);
                                ath12k_core_halt(ar);
-                               mutex_unlock(&ar->conf_mutex);
                        }
 
                        break;
@@ -1110,6 +1108,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)
                }
 
                mutex_unlock(&ah->hw_mutex);
+               wiphy_unlock(ah->hw->wiphy);
        }
 
        complete(&ab->driver_recovery);
index 5163b5b0737666d3b82243c338bc55708fa014b0..ebfc1e370acc3bdbfadfdbdd052757869bba8360 100644 (file)
@@ -562,10 +562,7 @@ struct ath12k {
        u32 num_stations;
        u32 max_num_stations;
        bool monitor_present;
-       /* To synchronize concurrent synchronous mac80211 callback operations,
-        * concurrent debugfs configuration and concurrent FW statistics events.
-        */
-       struct mutex conf_mutex;
+
        /* protects the radio specific data like debug stats, ppdu_stats_info stats,
         * vdev_stop_status info, scan data, ath12k_sta info, ath12k_vif info,
         * channel context data, survey info, test mode data.
index 2a977c36af0095ec823e1700e46ff682ef9537bc..d4b32d1a431c0dfa6894cb8a42722ca20444f3db 100644 (file)
@@ -15,14 +15,14 @@ static ssize_t ath12k_write_simulate_radar(struct file *file,
        struct ath12k *ar = file->private_data;
        int ret;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
        ret = ath12k_wmi_simulate_radar(ar);
        if (ret)
                goto exit;
 
        ret = count;
 exit:
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
        return ret;
 }
 
index d890679a3f16213475d8be47789a3105eda579c3..b2be7dade79f95c744936a9ba783cbbe84f28d0f 100644 (file)
@@ -2750,9 +2750,9 @@ static ssize_t ath12k_read_htt_stats_type(struct file *file,
        char buf[32];
        size_t len;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
        type = ar->debug.htt_stats.type;
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        len = scnprintf(buf, sizeof(buf), "%u\n", type);
 
@@ -2785,7 +2785,7 @@ static ssize_t ath12k_write_htt_stats_type(struct file *file,
            type >= ATH12K_DBG_HTT_NUM_EXT_STATS)
                return -EINVAL;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
 
        ar->debug.htt_stats.type = type;
        ar->debug.htt_stats.cfg_param[0] = cfg_param[0];
@@ -2793,7 +2793,7 @@ static ssize_t ath12k_write_htt_stats_type(struct file *file,
        ar->debug.htt_stats.cfg_param[2] = cfg_param[2];
        ar->debug.htt_stats.cfg_param[3] = cfg_param[3];
 
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        return count;
 }
@@ -2814,7 +2814,7 @@ static int ath12k_debugfs_htt_stats_req(struct ath12k *ar)
        int ret, pdev_id;
        struct htt_ext_stats_cfg_params cfg_params = { 0 };
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        init_completion(&stats_req->htt_stats_rcvd);
 
@@ -2864,7 +2864,7 @@ static int ath12k_open_htt_stats(struct inode *inode,
        if (type == ATH12K_DBG_HTT_EXT_STATS_RESET)
                return -EPERM;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
 
        if (ah->state != ATH12K_HW_STATE_ON) {
                ret = -ENETDOWN;
@@ -2899,14 +2899,14 @@ static int ath12k_open_htt_stats(struct inode *inode,
 
        file->private_data = stats_req;
 
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        return 0;
 out:
        kfree(stats_req);
        ar->debug.htt_stats.stats_req = NULL;
 err_unlock:
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        return ret;
 }
@@ -2916,10 +2916,10 @@ static int ath12k_release_htt_stats(struct inode *inode,
 {
        struct ath12k *ar = inode->i_private;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
        kfree(file->private_data);
        ar->debug.htt_stats.stats_req = NULL;
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        return 0;
 }
@@ -2963,7 +2963,7 @@ static ssize_t ath12k_write_htt_stats_reset(struct file *file,
            type == ATH12K_DBG_HTT_EXT_STATS_RESET)
                return -E2BIG;
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
        cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET;
        param_pos = (type >> 5) + 1;
 
@@ -2989,12 +2989,12 @@ static ssize_t ath12k_write_htt_stats_reset(struct file *file,
                                                 0ULL);
        if (ret) {
                ath12k_warn(ar->ab, "failed to send htt stats request: %d\n", ret);
-               mutex_unlock(&ar->conf_mutex);
+               wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
                return ret;
        }
 
        ar->debug.htt_stats.reset = type;
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 
        return count;
 }
index 34b6caaaf33c2aa044be84a3153867478b90f00a..98894b4bf7e8473a10f575277199576769e90f6b 100644 (file)
@@ -677,7 +677,8 @@ static struct ath12k_vif *ath12k_mac_get_vif_up(struct ath12k *ar)
 {
        struct ath12k_vif *arvif;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (arvif->is_up)
                        return arvif;
@@ -774,7 +775,7 @@ static int ath12k_mac_txpower_recalc(struct ath12k *ar)
        int ret, txpower = -1;
        u32 param;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (arvif->txpower <= 0)
@@ -830,7 +831,7 @@ static int ath12k_recalc_rtscts_prot(struct ath12k_vif *arvif)
        u32 vdev_param, rts_cts;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
 
@@ -913,7 +914,7 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
        struct ath12k_peer *peer, *tmp;
        struct ath12k_base *ab = ar->ab;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        spin_lock_bh(&ab->base_lock);
        list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
@@ -932,7 +933,7 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
 
 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
 {
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
                return -ESHUTDOWN;
@@ -974,7 +975,7 @@ static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
        struct ath12k_wmi_vdev_up_params params = {};
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        channel = chandef->chan;
        arg.vdev_id = vdev_id;
@@ -1037,7 +1038,7 @@ static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        reinit_completion(&ar->vdev_setup_done);
 
@@ -1069,7 +1070,7 @@ static int ath12k_mac_monitor_vdev_create(struct ath12k *ar)
        u8 tmp_addr[6];
        u16 nss;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (ar->monitor_vdev_created)
                return 0;
@@ -1135,7 +1136,7 @@ static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
        int ret;
        unsigned long time_left;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (!ar->monitor_vdev_created)
                return 0;
@@ -1181,7 +1182,7 @@ static int ath12k_mac_monitor_start(struct ath12k *ar)
        struct cfg80211_chan_def *chandef = NULL;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (ar->monitor_started)
                return 0;
@@ -1211,7 +1212,7 @@ static int ath12k_mac_monitor_stop(struct ath12k *ar)
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (!ar->monitor_started)
                return 0;
@@ -1234,7 +1235,7 @@ static int ath12k_mac_vdev_stop(struct ath12k_vif *arvif)
        struct ath12k *ar = arvif->ar;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        reinit_completion(&ar->vdev_setup_done);
 
@@ -1275,7 +1276,7 @@ static int ath12k_mac_config(struct ath12k *ar, u32 changed)
        struct ieee80211_conf *conf = &hw->conf;
        int ret = 0;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
                ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR;
@@ -1299,12 +1300,10 @@ static int ath12k_mac_config(struct ath12k *ar, u32 changed)
        }
 
 exit:
-       mutex_unlock(&ar->conf_mutex);
        return ret;
 
 err_mon_del:
        ath12k_mac_monitor_vdev_delete(ar);
-       mutex_unlock(&ar->conf_mutex);
        return ret;
 }
 
@@ -1605,7 +1604,7 @@ static void ath12k_control_beaconing(struct ath12k_vif *arvif,
        struct ath12k *ar = arvif->ar;
        int ret;
 
-       lockdep_assert_held(&arvif->ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy);
 
        if (!info->enable_beacon) {
                ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
@@ -1727,7 +1726,7 @@ static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
        u32 aid;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        if (vif->type == NL80211_IFTYPE_STATION)
                aid = vif->cfg.aid;
@@ -1757,7 +1756,7 @@ static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
        const u8 *rsnie = NULL;
        const u8 *wpaie = NULL;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
@@ -1822,7 +1821,7 @@ static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
        u8 rate;
        int i;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
@@ -1883,7 +1882,7 @@ static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
        u8 max_nss;
        u32 stbc;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
@@ -2423,7 +2422,7 @@ static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
        u32 uapsd;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        arg.vdev_id = arvif->vdev_id;
 
@@ -2810,7 +2809,7 @@ static void ath12k_peer_assoc_prepare(struct ath12k *ar,
                                      struct ath12k_wmi_peer_assoc_arg *arg,
                                      bool reassoc)
 {
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        memset(arg, 0, sizeof(*arg));
 
@@ -2863,7 +2862,7 @@ static void ath12k_bss_assoc(struct ath12k *ar,
        bool is_auth = false;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
                   arvif->vdev_id, arvif->bssid, arvif->aid);
@@ -2956,7 +2955,7 @@ static void ath12k_bss_disassoc(struct ath12k *ar,
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
                   arvif->vdev_id, arvif->bssid);
@@ -3011,7 +3010,7 @@ static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
        u16 bitrate;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        sband = hw->wiphy->bands[def->chan->band];
        basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
@@ -3094,7 +3093,7 @@ static void ath12k_mac_vif_setup_ps(struct ath12k_vif *arvif)
        int timeout;
        bool enable_ps;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (vif->type != NL80211_IFTYPE_STATION)
                return;
@@ -3149,7 +3148,7 @@ static void ath12k_mac_bss_info_changed(struct ath12k *ar,
        u8 rateidx;
        u32 rate;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (changed & BSS_CHANGED_BEACON_INT) {
                arvif->beacon_interval = info->beacon_int;
@@ -3451,11 +3450,9 @@ static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
                return;
        }
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ath12k_mac_bss_info_changed(ar, arvif, info, changed);
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static struct ath12k*
@@ -3544,7 +3541,7 @@ static int ath12k_scan_stop(struct ath12k *ar)
        };
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        /* TODO: Fill other STOP Params */
        arg.pdev_id = ar->pdev->pdev_id;
@@ -3584,7 +3581,7 @@ static void ath12k_scan_abort(struct ath12k *ar)
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        spin_lock_bh(&ar->data_lock);
 
@@ -3619,9 +3616,9 @@ static void ath12k_scan_timeout_work(struct work_struct *work)
        struct ath12k *ar = container_of(work, struct ath12k,
                                         scan.timeout.work);
 
-       mutex_lock(&ar->conf_mutex);
+       wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
        ath12k_scan_abort(ar);
-       mutex_unlock(&ar->conf_mutex);
+       wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
 }
 
 static int ath12k_start_scan(struct ath12k *ar,
@@ -3629,7 +3626,7 @@ static int ath12k_start_scan(struct ath12k *ar,
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
        if (ret)
@@ -3671,6 +3668,8 @@ static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
        int i;
        bool create = true;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (ah->num_radio == 1) {
                WARN_ON(!arvif->is_created);
                ar = ath12k_ah_to_ar(ah, 0);
@@ -3705,9 +3704,7 @@ static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
                         * would assign the arvif->ar to NULL after the call
                         */
                        prev_ar = arvif->ar;
-                       mutex_lock(&prev_ar->conf_mutex);
                        ret = ath12k_mac_vdev_delete(prev_ar, vif);
-                       mutex_unlock(&prev_ar->conf_mutex);
                        if (ret)
                                ath12k_warn(prev_ar->ab,
                                            "unable to delete scan vdev %d\n", ret);
@@ -3716,17 +3713,13 @@ static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
                }
        }
        if (create) {
-               mutex_lock(&ar->conf_mutex);
                ret = ath12k_mac_vdev_create(ar, vif);
-               mutex_unlock(&ar->conf_mutex);
                if (ret) {
                        ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
                        return -EINVAL;
                }
        }
 scan:
-       mutex_lock(&ar->conf_mutex);
-
        spin_lock_bh(&ar->data_lock);
        switch (ar->scan.state) {
        case ATH12K_SCAN_IDLE:
@@ -3808,8 +3801,6 @@ exit:
                kfree(arg);
        }
 
-       mutex_unlock(&ar->conf_mutex);
-
        return ret;
 }
 
@@ -3824,9 +3815,9 @@ static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
 
        ar = arvif->ar;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
+
        ath12k_scan_abort(ar);
-       mutex_unlock(&ar->conf_mutex);
 
        cancel_delayed_work_sync(&ar->scan.timeout);
 }
@@ -3847,7 +3838,7 @@ static int ath12k_install_key(struct ath12k_vif *arvif,
                .macaddr = macaddr,
        };
 
-       lockdep_assert_held(&arvif->ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        reinit_completion(&ar->install_key_done);
 
@@ -3915,7 +3906,7 @@ static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
        int i;
        u32 flags = 0;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        spin_lock_bh(&ab->base_lock);
        peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
@@ -3958,7 +3949,7 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
        int ret = 0;
        u32 flags = 0;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
                return 1;
@@ -3973,7 +3964,7 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
        key->hw_key_idx = key->keyidx;
 
        /* the peer should not disappear in mid-way (unless FW goes awry) since
-        * we already hold conf_mutex. we just make sure its there now.
+        * we already hold wiphy lock. we just make sure its there now.
         */
        spin_lock_bh(&ab->base_lock);
        peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
@@ -4066,6 +4057,8 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
        struct ath12k *ar;
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        /* BIP needs to be done in software */
        if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
            key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
@@ -4093,9 +4086,7 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                return 0;
        }
 
-       mutex_lock(&ar->conf_mutex);
        ret = ath12k_mac_set_key(ar, cmd, vif, sta, key);
-       mutex_unlock(&ar->conf_mutex);
        return ret;
 }
 
@@ -4124,7 +4115,7 @@ ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
        u32 rate_code;
        int ret, i;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        nss = 0;
 
@@ -4172,7 +4163,7 @@ static int ath12k_station_assoc(struct ath12k *ar,
        struct cfg80211_bitrate_mask *mask;
        u8 num_vht_rates;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return -EPERM;
@@ -4255,7 +4246,7 @@ static int ath12k_station_disassoc(struct ath12k *ar,
        struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (!sta->wme) {
                arvif->num_legacy_stations--;
@@ -4315,8 +4306,6 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
 
        spin_unlock_bh(&ar->data_lock);
 
-       mutex_lock(&ar->conf_mutex);
-
        nss = max_t(u32, 1, nss);
        nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
                           ath12k_mac_max_vht_nss(vht_mcs_mask)));
@@ -4339,7 +4328,7 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
                        if (err) {
                                ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
                                            sta->addr, peer_phymode, err);
-                               goto err_rc_bw_changed;
+                               return;
                        }
                        err = ath12k_wmi_set_peer_param(ar, sta->addr,
                                                        arvif->vdev_id, WMI_PEER_CHWIDTH,
@@ -4360,7 +4349,7 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
                        if (err) {
                                ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
                                            sta->addr, bw, err);
-                               goto err_rc_bw_changed;
+                               return;
                        }
                        err = ath12k_wmi_set_peer_param(ar, sta->addr,
                                                        arvif->vdev_id, WMI_PEER_PHYMODE,
@@ -4430,8 +4419,6 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
                                            sta->addr, arvif->vdev_id);
                }
        }
-err_rc_bw_changed:
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
@@ -4439,7 +4426,7 @@ static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
 {
        struct ath12k *ar = arvif->ar;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
                return 0;
@@ -4457,7 +4444,7 @@ static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
 {
        struct ath12k *ar = arvif->ar;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
                return;
@@ -4475,7 +4462,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
        struct ath12k_wmi_peer_create_arg peer_param;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ret = ath12k_mac_inc_num_stations(arvif, sta);
        if (ret) {
@@ -4596,7 +4583,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
                return -EINVAL;
        }
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        if (old_state == IEEE80211_STA_NOTEXIST &&
            new_state == IEEE80211_STA_NONE) {
@@ -4697,8 +4684,6 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
                                    sta->addr);
        }
 
-       mutex_unlock(&ar->conf_mutex);
-
        return ret;
 }
 
@@ -4725,7 +4710,7 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
 
        ar = ath12k_ah_to_ar(ah, 0);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
                                        WMI_PEER_USE_FIXED_PWR, txpwr);
@@ -4736,7 +4721,6 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
        }
 
 out:
-       mutex_unlock(&ar->conf_mutex);
        return ret;
 }
 
@@ -4882,7 +4866,7 @@ static int ath12k_mac_conf_tx(struct ath12k_vif *arvif,
        struct ath12k_base *ab = ar->ab;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        switch (ac) {
        case IEEE80211_AC_VO:
@@ -4936,6 +4920,8 @@ static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
        struct ath12k_vif_cache *cache = arvif->cache;
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        ar = ath12k_get_ar_by_vif(hw, vif);
        if (!ar) {
                /* cache the info and apply after vdev is created */
@@ -4948,9 +4934,7 @@ static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
                return 0;
        }
 
-       mutex_lock(&ar->conf_mutex);
        ret = ath12k_mac_conf_tx(arvif, link_id, ac, params);
-       mutex_unlock(&ar->conf_mutex);
 
        return ret;
 }
@@ -5617,7 +5601,7 @@ static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
        struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (ath12k_check_chain_mask(ar, tx_ant, true))
                return -EINVAL;
@@ -5944,8 +5928,7 @@ static int ath12k_mac_start(struct ath12k *ar)
        int ret;
 
        lockdep_assert_held(&ah->hw_mutex);
-
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
                                        1, pdev->pdev_id);
@@ -6030,14 +6013,11 @@ static int ath12k_mac_start(struct ath12k *ar)
                }
        }
 
-       mutex_unlock(&ar->conf_mutex);
-
        rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
                           &ab->pdevs[ar->pdev_idx]);
 
        return 0;
 err:
-       mutex_unlock(&ar->conf_mutex);
 
        return ret;
 }
@@ -6163,15 +6143,14 @@ static void ath12k_mac_stop(struct ath12k *ar)
        int ret;
 
        lockdep_assert_held(&ah->hw_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       mutex_lock(&ar->conf_mutex);
        ret = ath12k_mac_config_mon_status_default(ar, false);
        if (ret && (ret != -EOPNOTSUPP))
                ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
                           ret);
 
        clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
-       mutex_unlock(&ar->conf_mutex);
 
        cancel_delayed_work_sync(&ar->scan.timeout);
        cancel_work_sync(&ar->regd_update_work);
@@ -6435,7 +6414,7 @@ static int ath12k_mac_vdev_create(struct ath12k *ar, struct ieee80211_vif *vif)
        int i;
        int ret, vdev_id;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        arvif->ar = ar;
        vdev_id = __ffs64(ab->free_vdev_map);
@@ -6646,7 +6625,7 @@ static void ath12k_mac_vif_cache_flush(struct ath12k *ar,  struct ieee80211_vif
 
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (!cache)
                return;
@@ -6685,6 +6664,8 @@ static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
        struct ath12k_base *ab;
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (ah->num_radio == 1)
                ar = ah->radio;
        else if (ctx)
@@ -6717,20 +6698,15 @@ static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
                         * be set to NULL after vdev delete is done
                         */
                        prev_ar = arvif->ar;
-                       mutex_lock(&prev_ar->conf_mutex);
                        ret = ath12k_mac_vdev_delete(prev_ar, vif);
-
                        if (ret)
                                ath12k_warn(prev_ar->ab, "unable to delete vdev %d\n",
                                            ret);
-                       mutex_unlock(&prev_ar->conf_mutex);
                }
        }
 
        ab = ar->ab;
 
-       mutex_lock(&ar->conf_mutex);
-
        if (arvif->is_created)
                goto flush;
 
@@ -6759,7 +6735,6 @@ flush:
         */
        ath12k_mac_vif_cache_flush(ar, vif);
 unlock:
-       mutex_unlock(&ar->conf_mutex);
        return arvif->ar;
 }
 
@@ -6769,6 +6744,8 @@ static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
        struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
        int i;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        memset(arvif, 0, sizeof(*arvif));
 
        arvif->vif = vif;
@@ -6833,7 +6810,7 @@ static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ieee80211_vif *vif)
        unsigned long time_left;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
        reinit_completion(&ar->vdev_delete_done);
 
        ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
@@ -6896,6 +6873,8 @@ static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
        struct ath12k *ar;
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (!arvif->is_created) {
                /* if we cached some config but never received assign chanctx,
                 * free the allocated cache.
@@ -6909,8 +6888,6 @@ static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
 
        cancel_delayed_work_sync(&arvif->connection_loss_work);
 
-       mutex_lock(&ar->conf_mutex);
-
        ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
                   arvif->vdev_id);
 
@@ -6922,8 +6899,6 @@ static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
        }
 
        ath12k_mac_vdev_delete(ar, vif);
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 /* FIXME: Has to be verified. */
@@ -6942,7 +6917,7 @@ static void ath12k_mac_configure_filter(struct ath12k *ar,
        bool reset_flag;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ar->filter_flags = total_flags;
 
@@ -6969,12 +6944,10 @@ static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
 
        ar = ath12k_ah_to_ar(ah, 0);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        *total_flags &= SUPPORTED_FILTERS;
        ath12k_mac_configure_filter(ar, *total_flags);
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
@@ -6984,11 +6957,11 @@ static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *
        struct ath12k *ar;
        int i;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        for_each_ar(ah, ar, i) {
-               mutex_lock(&ar->conf_mutex);
                antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
                antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
-               mutex_unlock(&ar->conf_mutex);
        }
 
        *tx_ant = antennas_tx;
@@ -7004,10 +6977,10 @@ static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx
        int ret = 0;
        int i;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        for_each_ar(ah, ar, i) {
-               mutex_lock(&ar->conf_mutex);
                ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
-               mutex_unlock(&ar->conf_mutex);
                if (ret)
                        break;
        }
@@ -7021,7 +6994,7 @@ static int ath12k_mac_ampdu_action(struct ath12k_vif *arvif,
        struct ath12k *ar = arvif->ar;
        int ret = -EINVAL;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        switch (params->action) {
        case IEEE80211_AMPDU_RX_START:
@@ -7060,10 +7033,9 @@ static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
 
        ar = ath12k_ah_to_ar(ah, 0);
 
-       mutex_lock(&ar->conf_mutex);
-       ret = ath12k_mac_ampdu_action(arvif, params);
-       mutex_unlock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
+       ret = ath12k_mac_ampdu_action(arvif, params);
        if (ret)
                ath12k_warn(ar->ab, "pdev idx %d unable to perform ampdu action %d ret %d\n",
                            ar->pdev_idx, params->action, ret);
@@ -7087,7 +7059,7 @@ static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
                   "mac chanctx add freq %u width %d ptr %p\n",
                   ctx->def.chan->center_freq, ctx->def.width, ctx);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        spin_lock_bh(&ar->data_lock);
        /* TODO: In case of multiple channel context, populate rx_channel from
@@ -7096,8 +7068,6 @@ static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
        ar->rx_channel = ctx->def.chan;
        spin_unlock_bh(&ar->data_lock);
 
-       mutex_unlock(&ar->conf_mutex);
-
        return 0;
 }
 
@@ -7117,7 +7087,7 @@ static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
                   "mac chanctx remove freq %u width %d ptr %p\n",
                   ctx->def.chan->center_freq, ctx->def.width, ctx);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        spin_lock_bh(&ar->data_lock);
        /* TODO: In case of there is one more channel context left, populate
@@ -7125,8 +7095,6 @@ static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
         */
        ar->rx_channel = NULL;
        spin_unlock_bh(&ar->data_lock);
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static enum wmi_phy_mode
@@ -7204,7 +7172,7 @@ ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
        int he_support = arvif->vif->bss_conf.he_support;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        reinit_completion(&ar->vdev_setup_done);
 
@@ -7440,7 +7408,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
        int i;
        bool monitor_vif = false;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        for (i = 0; i < n_vifs; i++) {
                vif = vifs[i].vif;
@@ -7533,7 +7501,7 @@ ath12k_mac_update_active_vif_chan(struct ath12k *ar,
        struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ieee80211_iterate_active_interfaces_atomic(hw,
                                                   IEEE80211_IFACE_ITER_NORMAL,
@@ -7569,7 +7537,7 @@ static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
 
        ab = ar->ab;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ath12k_dbg(ab, ATH12K_DBG_MAC,
                   "mac chanctx change freq %u width %d ptr %p changed %x\n",
@@ -7579,7 +7547,7 @@ static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
         * switch_vif_chanctx().
         */
        if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
-               goto unlock;
+               return;
 
        if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
            changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
@@ -7587,9 +7555,6 @@ static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
                ath12k_mac_update_active_vif_chan(ar, ctx);
 
        /* TODO: Recalc radar detection */
-
-unlock:
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static int ath12k_start_vdev_delay(struct ath12k *ar,
@@ -7635,6 +7600,8 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
        struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        /* For multi radio wiphy, the vdev was not created during add_interface
         * create now since we have a channel ctx now to assign to a specific ar/fw
         */
@@ -7646,8 +7613,6 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
 
        ab = ar->ab;
 
-       mutex_lock(&ar->conf_mutex);
-
        ath12k_dbg(ab, ATH12K_DBG_MAC,
                   "mac chanctx assign ptr %p vdev_id %i\n",
                   ctx, arvif->vdev_id);
@@ -7693,8 +7658,6 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
        /* TODO: Setup ps and cts/rts protection */
 
 out:
-       mutex_unlock(&ar->conf_mutex);
-
        return ret;
 }
 
@@ -7722,7 +7685,7 @@ ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
        ar = arvif->ar;
        ab = ar->ab;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ath12k_dbg(ab, ATH12K_DBG_MAC,
                   "mac chanctx unassign ptr %p vdev_id %i\n",
@@ -7732,10 +7695,8 @@ ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
 
        if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
                ret = ath12k_mac_monitor_stop(ar);
-               if (ret) {
-                       mutex_unlock(&ar->conf_mutex);
+               if (ret)
                        return;
-               }
 
                arvif->is_started = false;
        }
@@ -7753,8 +7714,6 @@ ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
        if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
            ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
                ath12k_mac_monitor_stop(ar);
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static int
@@ -7769,21 +7728,17 @@ ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
        if (!ar)
                return -EINVAL;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        /* Switching channels across radio is not allowed */
-       if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx)) {
-               mutex_unlock(&ar->conf_mutex);
+       if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
                return -EINVAL;
-       }
 
        ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
                   "mac chanctx switch n_vifs %d mode %d\n",
                   n_vifs, mode);
        ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
 
-       mutex_unlock(&ar->conf_mutex);
-
        return 0;
 }
 
@@ -7793,7 +7748,8 @@ ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
        struct ath12k_vif *arvif;
        int ret = 0;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
        list_for_each_entry(arvif, &ar->arvifs, list) {
                ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
                           param, arvif->vdev_id, value);
@@ -7806,7 +7762,7 @@ ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
                        break;
                }
        }
-       mutex_unlock(&ar->conf_mutex);
+
        return ret;
 }
 
@@ -8032,7 +7988,7 @@ static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
        u32 vdev_param;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
                   arvif->vdev_id, rate, nss, sgi);
@@ -8158,6 +8114,8 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
        int ret;
        int num_rates;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (ath12k_mac_vif_chan(vif, &def))
                return -EPERM;
 
@@ -8239,26 +8197,18 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                                               ath12k_mac_disable_peer_fixed_rate,
                                               arvif);
 
-               mutex_lock(&ar->conf_mutex);
-
                arvif->bitrate_mask = *mask;
                ieee80211_iterate_stations_mtx(hw,
                                               ath12k_mac_set_bitrate_mask_iter,
                                               arvif);
-
-               mutex_unlock(&ar->conf_mutex);
        }
 
-       mutex_lock(&ar->conf_mutex);
-
        ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
        if (ret) {
                ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
                            arvif->vdev_id, ret);
        }
 
-       mutex_unlock(&ar->conf_mutex);
-
 out:
        return ret;
 }
@@ -8273,6 +8223,8 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
        struct ath12k_vif *arvif;
        int recovery_count, i;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
                return;
 
@@ -8285,8 +8237,6 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
        ieee80211_wake_queues(hw);
 
        for_each_ar(ah, ar, i) {
-               mutex_lock(&ar->conf_mutex);
-
                ab = ar->ab;
 
                ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
@@ -8331,8 +8281,6 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
                                           "restart disconnect\n");
                        }
                }
-
-               mutex_unlock(&ar->conf_mutex);
        }
 }
 
@@ -8343,7 +8291,7 @@ ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
        int ret;
        enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
            ar->rx_channel != channel)
@@ -8375,6 +8323,8 @@ static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
        struct ieee80211_supported_band *sband;
        struct survey_info *ar_survey;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (idx >= ATH12K_NUM_CHANS)
                return -ENOENT;
 
@@ -8408,8 +8358,6 @@ static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
 
        ar_survey = &ar->survey[idx];
 
-       mutex_lock(&ar->conf_mutex);
-
        ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
 
        spin_lock_bh(&ar->data_lock);
@@ -8421,7 +8369,6 @@ static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
        if (ar->rx_channel == survey->channel)
                survey->filled |= SURVEY_INFO_IN_USE;
 
-       mutex_unlock(&ar->conf_mutex);
        return 0;
 }
 
@@ -8467,7 +8414,7 @@ static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
 
        ar = ath12k_ah_to_ar(ah, 0);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        spin_lock_bh(&ar->data_lock);
        ar->scan.roc_notify = false;
@@ -8475,8 +8422,6 @@ static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
 
        ath12k_scan_abort(ar);
 
-       mutex_unlock(&ar->conf_mutex);
-
        cancel_delayed_work_sync(&ar->scan.timeout);
 
        return 0;
@@ -8496,6 +8441,8 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
        bool create = true;
        int ret;
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        if (ah->num_radio == 1) {
                WARN_ON(!arvif->is_created);
                ar = ath12k_ah_to_ar(ah, 0);
@@ -8527,9 +8474,7 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
                         * would assign the arvif->ar to NULL after the call
                         */
                        prev_ar = arvif->ar;
-                       mutex_lock(&prev_ar->conf_mutex);
                        ret = ath12k_mac_vdev_delete(prev_ar, vif);
-                       mutex_unlock(&prev_ar->conf_mutex);
                        if (ret) {
                                ath12k_warn(prev_ar->ab,
                                            "unable to delete scan vdev for roc: %d\n",
@@ -8542,9 +8487,7 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
        }
 
        if (create) {
-               mutex_lock(&ar->conf_mutex);
                ret = ath12k_mac_vdev_create(ar, vif);
-               mutex_unlock(&ar->conf_mutex);
                if (ret) {
                        ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
                                    ret);
@@ -8553,7 +8496,6 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
        }
 
 scan:
-       mutex_lock(&ar->conf_mutex);
        spin_lock_bh(&ar->data_lock);
 
        switch (ar->scan.state) {
@@ -8629,8 +8571,6 @@ scan:
 free_chan_list:
        kfree(arg.chan_list);
 exit:
-       mutex_unlock(&ar->conf_mutex);
-
        return ret;
 }
 
@@ -8643,11 +8583,11 @@ static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
        struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
        struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
 
+       lockdep_assert_wiphy(hw->wiphy);
+
        ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
                   arvif->vdev_id);
 
-       mutex_lock(&ar->conf_mutex);
-
        memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
        memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
 
@@ -8664,8 +8604,6 @@ static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
                        rekey_data->kck, NL80211_KEK_LEN);
        ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
                        &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
-
-       mutex_unlock(&ar->conf_mutex);
 }
 
 static const struct ieee80211_ops ath12k_ops = {
@@ -9325,7 +9263,7 @@ static void ath12k_mac_setup(struct ath12k *ar)
        spin_lock_init(&ar->data_lock);
        INIT_LIST_HEAD(&ar->arvifs);
        INIT_LIST_HEAD(&ar->ppdu_stats_info);
-       mutex_init(&ar->conf_mutex);
+
        init_completion(&ar->vdev_setup_done);
        init_completion(&ar->vdev_delete_done);
        init_completion(&ar->peer_assoc_done);
@@ -9514,7 +9452,7 @@ int ath12k_mac_vif_set_keepalive(struct ath12k_vif *arvif,
        struct ath12k *ar = arvif->ar;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
                return 0;
index 19c0626fbff1f24f15cc050bc275959227256469..404fb7ff71549cf6157ff20c33bda67f39fdb8b1 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include "core.h"
@@ -186,7 +186,7 @@ void ath12k_peer_cleanup(struct ath12k *ar, u32 vdev_id)
        struct ath12k_peer *peer, *tmp;
        struct ath12k_base *ab = ar->ab;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        spin_lock_bh(&ab->base_lock);
        list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
@@ -235,7 +235,7 @@ int ath12k_peer_delete(struct ath12k *ar, u32 vdev_id, u8 *addr)
 {
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        reinit_completion(&ar->peer_delete_done);
 
@@ -268,7 +268,7 @@ int ath12k_peer_create(struct ath12k *ar, struct ath12k_vif *arvif,
        struct ath12k_peer *peer;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        if (ar->num_peers > (ar->max_num_peers - 1)) {
                ath12k_warn(ar->ab,
index 3624180b25b9706bb017aed62c64fa7a63719a9a..a6bb860a4eaa11dfd78cce9299556999a031b7ea 100644 (file)
@@ -132,7 +132,7 @@ static int ath12k_wow_cleanup(struct ath12k *ar)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                ret = ath12k_wow_vif_cleanup(arvif);
@@ -476,7 +476,7 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (ath12k_wow_is_p2p_vdev(arvif))
@@ -535,7 +535,7 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (ath12k_wow_is_p2p_vdev(arvif))
@@ -558,7 +558,7 @@ static int ath12k_wow_set_hw_filter(struct ath12k *ar)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
@@ -584,7 +584,7 @@ static int ath12k_wow_clear_hw_filter(struct ath12k *ar)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
@@ -735,7 +735,7 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        offload = kmalloc(sizeof(*offload), GFP_KERNEL);
        if (!offload)
@@ -769,7 +769,7 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                if (arvif->vdev_type != WMI_VDEV_TYPE_STA ||
@@ -827,7 +827,7 @@ static int ath12k_wow_set_keepalive(struct ath12k *ar,
        struct ath12k_vif *arvif;
        int ret;
 
-       lockdep_assert_held(&ar->conf_mutex);
+       lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
        list_for_each_entry(arvif, &ar->arvifs, list) {
                ret = ath12k_mac_vif_set_keepalive(arvif, method, interval);
@@ -845,7 +845,7 @@ int ath12k_wow_op_suspend(struct ieee80211_hw *hw,
        struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
        int ret;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ret =  ath12k_wow_cleanup(ar);
        if (ret) {
@@ -913,7 +913,6 @@ cleanup:
        ath12k_wow_cleanup(ar);
 
 exit:
-       mutex_unlock(&ar->conf_mutex);
        return ret ? 1 : 0;
 }
 
@@ -922,9 +921,9 @@ void ath12k_wow_op_set_wakeup(struct ieee80211_hw *hw, bool enabled)
        struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
        struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
+
        device_set_wakeup_enable(ar->ab->dev, enabled);
-       mutex_unlock(&ar->conf_mutex);
 }
 
 int ath12k_wow_op_resume(struct ieee80211_hw *hw)
@@ -933,7 +932,7 @@ int ath12k_wow_op_resume(struct ieee80211_hw *hw)
        struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
        int ret;
 
-       mutex_lock(&ar->conf_mutex);
+       lockdep_assert_wiphy(hw->wiphy);
 
        ret = ath12k_hif_resume(ar->ab);
        if (ret) {
@@ -995,7 +994,6 @@ exit:
                }
        }
 
-       mutex_unlock(&ar->conf_mutex);
        return ret;
 }