struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
        int ret;
 
-       mutex_lock(&sdata->local->chanctx_mtx);
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
        ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
-       mutex_unlock(&sdata->local->chanctx_mtx);
        if (ret < 0)
                return ret;
 
        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
        int ret;
 
-       mutex_lock(&sdata->local->chanctx_mtx);
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
        ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
-       mutex_unlock(&sdata->local->chanctx_mtx);
        if (ret < 0)
                return ret;
 
 
        sdata_assert_lock(sdata);
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /*
         * using reservation isn't immediate as it may be deferred until later
 
        sdata_lock(sdata);
        mutex_lock(&local->mtx);
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /* AP might have been stopped while waiting for the lock. */
        if (!sdata->vif.bss_conf.csa_active)
        ieee80211_csa_finalize(sdata);
 
 unlock:
-       mutex_unlock(&local->chanctx_mtx);
        mutex_unlock(&local->mtx);
        sdata_unlock(sdata);
 }
 
        sdata_assert_lock(sdata);
        lockdep_assert_held(&local->mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!list_empty(&local->roc_list) || local->scanning)
                return -EBUSY;
        if (sdata->vif.bss_conf.csa_active)
                return -EBUSY;
 
-       mutex_lock(&local->chanctx_mtx);
        conf = rcu_dereference_protected(sdata->vif.bss_conf.chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (!conf) {
                err = -EBUSY;
                goto out;
        }
 
 out:
-       mutex_unlock(&local->chanctx_mtx);
        return err;
 }
 
 
        struct ieee80211_link_data *link;
        int num = 0;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(link, &ctx->assigned_links, assigned_chanctx_list)
                num++;
        struct ieee80211_link_data *link;
        int num = 0;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(link, &ctx->reserved_links, reserved_chanctx_list)
                num++;
        struct ieee80211_chanctx *ctx;
        int num = 0;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(ctx, &local->chanctx_list, list)
                num++;
 
 static bool ieee80211_can_create_new_chanctx(struct ieee80211_local *local)
 {
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        return ieee80211_num_chanctx(local) < ieee80211_max_num_channels(local);
 }
 
        struct ieee80211_chanctx_conf *conf;
 
        conf = rcu_dereference_protected(link->conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (!conf)
                return NULL;
 
 {
        struct ieee80211_link_data *link;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(link, &ctx->reserved_links,
                            reserved_chanctx_list) {
 {
        struct ieee80211_link_data *link;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(link, &ctx->assigned_links,
                            assigned_chanctx_list) {
                                   struct ieee80211_chanctx *ctx,
                                   const struct cfg80211_chan_def *compat)
 {
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        compat = ieee80211_chanctx_reserved_chandef(local, ctx, compat);
        if (!compat)
                                      struct ieee80211_chanctx *ctx,
                                      const struct cfg80211_chan_def *def)
 {
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (ieee80211_chanctx_combined_chandef(local, ctx, def))
                return true;
 {
        struct ieee80211_chanctx *ctx;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (mode == IEEE80211_CHANCTX_EXCLUSIVE)
                return NULL;
        enum nl80211_chan_width max_bw;
        struct cfg80211_chan_def min_def;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /* don't optimize non-20MHz based and radar_enabled confs */
        if (ctx->conf.def.width == NL80211_CHAN_WIDTH_5 ||
 {
        struct ieee80211_chanctx *ctx;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (mode == IEEE80211_CHANCTX_EXCLUSIVE)
                return NULL;
        struct ieee80211_sub_if_data *sdata;
        bool required = false;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
        lockdep_assert_held(&local->mtx);
 
        rcu_read_lock();
 {
        struct ieee80211_chanctx *ctx;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        ctx = kzalloc(sizeof(*ctx) + local->hw.chanctx_data_size, GFP_KERNEL);
        if (!ctx)
        int err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!local->use_chanctx)
                local->hw.conf.radar_enabled = ctx->conf.radar_enabled;
        int err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        ctx = ieee80211_alloc_chanctx(local, chandef, mode);
        if (!ctx)
 static void ieee80211_del_chanctx(struct ieee80211_local *local,
                                  struct ieee80211_chanctx *ctx)
 {
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!local->use_chanctx) {
                struct cfg80211_chan_def *chandef = &local->_oper_chandef;
 static void ieee80211_free_chanctx(struct ieee80211_local *local,
                                   struct ieee80211_chanctx *ctx)
 {
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        WARN_ON_ONCE(ieee80211_chanctx_refcount(local, ctx) != 0);
 
        const struct cfg80211_chan_def *compat = NULL;
        struct sta_info *sta;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        rcu_read_lock();
        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 {
        bool radar_enabled;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
        /* for ieee80211_is_radar_required */
        lockdep_assert_held(&local->mtx);
 
                return -ENOTSUPP;
 
        conf = rcu_dereference_protected(link->conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
 
        if (conf) {
                curr_ctx = container_of(conf, struct ieee80211_chanctx, conf);
        struct ieee80211_sub_if_data *sdata;
        u8 rx_chains_static, rx_chains_dynamic;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        rx_chains_static = 1;
        rx_chains_dynamic = 1;
         * to a channel context that has already been freed.
         */
        conf = rcu_dereference_protected(link_conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        WARN_ON(!conf);
 
        if (clear)
 {
        struct ieee80211_local *local = link->sdata->local;
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        __ieee80211_link_copy_chanctx_to_vlans(link, clear);
-
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 int ieee80211_link_unreserve_chanctx(struct ieee80211_link_data *link)
        struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_chanctx *ctx = link->reserved_chanctx;
 
-       lockdep_assert_held(&sdata->local->chanctx_mtx);
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
 
        if (WARN_ON(!ctx))
                return -EINVAL;
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_chanctx *new_ctx, *curr_ctx, *ctx;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        curr_ctx = ieee80211_link_get_chanctx(link);
        if (curr_ctx && local->use_chanctx && !local->ops->switch_vif_chanctx)
        int err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        new_ctx = link->reserved_chanctx;
        old_ctx = ieee80211_link_get_chanctx(link);
        struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_chanctx *old_ctx, *new_ctx;
 
-       lockdep_assert_held(&sdata->local->chanctx_mtx);
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
 
        new_ctx = link->reserved_chanctx;
        old_ctx = ieee80211_link_get_chanctx(link);
        const struct cfg80211_chan_def *chandef;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        chandef = ieee80211_chanctx_reserved_chandef(local, new_ctx, NULL);
        if (WARN_ON(!chandef))
        int i, err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        vif_chsw = kcalloc(n_vifs, sizeof(vif_chsw[0]), GFP_KERNEL);
        if (!vif_chsw)
        int err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(ctx, &local->chanctx_list, list) {
                if (ctx->replace_state != IEEE80211_CHANCTX_REPLACES_OTHER)
        int n_ctx = 0, n_vifs_switch = 0, n_vifs_assign = 0, n_vifs_ctxless = 0;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /*
         * If there are 2 independent pairs of channel contexts performing
        struct ieee80211_chanctx *ctx;
        bool use_reserved_switch = false;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        conf = rcu_dereference_protected(link_conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (!conf)
                return;
 
                return 0;
        }
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        ret = cfg80211_chandef_dfs_required(local->hw.wiphy,
                                            chandef,
        if (ret)
                link->radar_required = false;
 
-       mutex_unlock(&local->chanctx_mtx);
        return ret;
 }
 
        int err;
 
        lockdep_assert_held(&local->mtx);
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        new_ctx = link->reserved_chanctx;
        old_ctx = ieee80211_link_get_chanctx(link);
        struct ieee80211_chanctx_conf *conf;
        struct ieee80211_chanctx *ctx;
        const struct cfg80211_chan_def *compat;
-       int ret;
+
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
                                     IEEE80211_CHAN_DISABLED))
                return -EINVAL;
 
-       mutex_lock(&local->chanctx_mtx);
-       if (cfg80211_chandef_identical(chandef, &link_conf->chandef)) {
-               ret = 0;
-               goto out;
-       }
+       if (cfg80211_chandef_identical(chandef, &link_conf->chandef))
+               return 0;
 
        if (chandef->width == NL80211_CHAN_WIDTH_20_NOHT ||
-           link_conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT) {
-               ret = -EINVAL;
-               goto out;
-       }
+           link_conf->chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
+               return -EINVAL;
 
        conf = rcu_dereference_protected(link_conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
-       if (!conf) {
-               ret = -EINVAL;
-               goto out;
-       }
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
+       if (!conf)
+               return -EINVAL;
 
        ctx = container_of(conf, struct ieee80211_chanctx, conf);
 
        compat = cfg80211_chandef_compatible(&conf->def, chandef);
-       if (!compat) {
-               ret = -EINVAL;
-               goto out;
-       }
+       if (!compat)
+               return -EINVAL;
 
        switch (ctx->replace_state) {
        case IEEE80211_CHANCTX_REPLACE_NONE:
-               if (!ieee80211_chanctx_reserved_chandef(local, ctx, compat)) {
-                       ret = -EBUSY;
-                       goto out;
-               }
+               if (!ieee80211_chanctx_reserved_chandef(local, ctx, compat))
+                       return -EBUSY;
                break;
        case IEEE80211_CHANCTX_WILL_BE_REPLACED:
                /* TODO: Perhaps the bandwidth change could be treated as a
                 * reservation itself? */
-               ret = -EBUSY;
-               goto out;
+               return -EBUSY;
        case IEEE80211_CHANCTX_REPLACES_OTHER:
                /* channel context that is going to replace another channel
                 * context doesn't really exist and shouldn't be assigned
        ieee80211_recalc_chanctx_chantype(local, ctx);
 
        *changed |= BSS_CHANGED_BANDWIDTH;
-       ret = 0;
- out:
-       mutex_unlock(&local->chanctx_mtx);
-       return ret;
+       return 0;
 }
 
 void ieee80211_link_release_channel(struct ieee80211_link_data *link)
 {
        struct ieee80211_sub_if_data *sdata = link->sdata;
 
-       mutex_lock(&sdata->local->chanctx_mtx);
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
        if (rcu_access_pointer(link->conf->chanctx_conf)) {
                lockdep_assert_held(&sdata->local->mtx);
                __ieee80211_link_release_channel(link);
        }
-       mutex_unlock(&sdata->local->chanctx_mtx);
 }
 
 void ieee80211_link_vlan_copy_chanctx(struct ieee80211_link_data *link)
        struct ieee80211_sub_if_data *ap;
        struct ieee80211_chanctx_conf *conf;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->bss))
                return;
 
        ap = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap);
 
-       mutex_lock(&local->chanctx_mtx);
-
        rcu_read_lock();
        ap_conf = rcu_dereference(ap->vif.link_conf[link_id]);
        conf = rcu_dereference_protected(ap_conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        rcu_assign_pointer(link_conf->chanctx_conf, conf);
        rcu_read_unlock();
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 void ieee80211_iter_chan_contexts_atomic(
 
        int i;
        int ret;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (params->chandef.chan->freq_offset) {
                /* this may work, but is untested */
                return -EOPNOTSUPP;
        chanmode = (params->channel_fixed && !ret) ?
                IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE;
 
-       mutex_lock(&local->chanctx_mtx);
        ret = ieee80211_check_combinations(sdata, ¶ms->chandef, chanmode,
                                           radar_detect_width);
-       mutex_unlock(&local->chanctx_mtx);
        if (ret < 0)
                return ret;
 
 
        struct ieee80211_sub_if_data *sdata;
        unsigned int link_id;
 
-       struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
-       struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
+       struct list_head assigned_chanctx_list; /* protected by wiphy mutex */
+       struct list_head reserved_chanctx_list; /* protected by wiphy mutex */
 
        /* multicast keys only */
        struct ieee80211_key __rcu *gtk[NUM_DEFAULT_KEYS +
        struct delayed_work color_collision_detect_work;
        u64 color_bitmap;
 
-       /* context reservation -- protected with chanctx_mtx */
+       /* context reservation -- protected with wiphy mutex */
        struct ieee80211_chanctx *reserved_chanctx;
        struct cfg80211_chan_def reserved_chandef;
        bool reserved_radar_required;
 
        /* channel contexts */
        struct list_head chanctx_list;
-       struct mutex chanctx_mtx;
 
 #ifdef CONFIG_MAC80211_LEDS
        struct led_trigger tx_led, rx_led, assoc_led, radio_led;
 
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_sub_if_data *nsdata;
-       int ret;
 
        ASSERT_RTNL();
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /* we hold the RTNL here so can safely walk the list */
        list_for_each_entry(nsdata, &local->interfaces, list) {
                }
        }
 
-       mutex_lock(&local->chanctx_mtx);
-       ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
-       mutex_unlock(&local->chanctx_mtx);
-       return ret;
+       return ieee80211_check_combinations(sdata, NULL, 0, 0);
 }
 
 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
 
        spin_lock_init(&local->handle_wake_tx_queue_lock);
 
        INIT_LIST_HEAD(&local->chanctx_list);
-       mutex_init(&local->chanctx_mtx);
 
        wiphy_delayed_work_init(&local->scan_work, ieee80211_scan_work);
 
 
 
        sdata_lock(sdata);
        mutex_lock(&local->mtx);
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!ifmgd->associated)
                goto out;
        ieee80211_sta_reset_conn_monitor(sdata);
 
 out:
-       mutex_unlock(&local->chanctx_mtx);
        mutex_unlock(&local->mtx);
        sdata_unlock(sdata);
 }
        struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_local *local = sdata->local;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (!local->ops->abort_channel_switch)
                return;
 
        mutex_lock(&local->mtx);
 
-       mutex_lock(&local->chanctx_mtx);
        ieee80211_link_unreserve_chanctx(link);
-       mutex_unlock(&local->chanctx_mtx);
 
        if (link->csa_block_tx)
                ieee80211_wake_vif_queues(local, sdata,
        int res;
 
        sdata_assert_lock(sdata);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (!cbss)
                return;
        ieee80211_teardown_tdls_peers(sdata);
 
        mutex_lock(&local->mtx);
-       mutex_lock(&local->chanctx_mtx);
        conf = rcu_dereference_protected(link->conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (!conf) {
                sdata_info(sdata,
                           "no channel context assigned to vif?, disconnecting\n");
                           res);
                goto drop_connection;
        }
-       mutex_unlock(&local->chanctx_mtx);
 
        link->conf->csa_active = true;
        link->csa_chandef = csa_ie.chandef;
        return;
  lock_and_drop_connection:
        mutex_lock(&local->mtx);
-       mutex_lock(&local->chanctx_mtx);
  drop_connection:
        /*
         * This is just so that the disconnect flow will know that
 
        wiphy_work_queue(sdata->local->hw.wiphy,
                         &ifmgd->csa_connection_drop_work);
-       mutex_unlock(&local->chanctx_mtx);
        mutex_unlock(&local->mtx);
 }
 
        u8 unicast_limit = max(1, max_probe_tries - 3);
        struct sta_info *sta;
 
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
        if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
                return;
 
        ifmgd->probe_send_count++;
 
        if (dst) {
-               lockdep_assert_wiphy(sdata->local->hw.wiphy);
                sta = sta_info_get(sdata, dst);
                if (!WARN_ON(!sta))
                        ieee80211_check_fast_rx(sta);
        const u8 *ap_addr = ifmgd->auth_data->ap_addr;
        struct sta_info *sta;
 
+       lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
        sdata_info(sdata, "authenticated\n");
        ifmgd->auth_data->done = true;
        ifmgd->auth_data->timeout = jiffies + IEEE80211_AUTH_WAIT_ASSOC;
        run_again(sdata, ifmgd->auth_data->timeout);
 
        /* move station state to auth */
-       lockdep_assert_wiphy(sdata->local->hw.wiphy);
        sta = sta_info_get(sdata, ap_addr);
        if (!sta) {
                WARN_ONCE(1, "%s: STA %pM not found", sdata->name, ap_addr);
        };
 
        sdata_assert_lock(sdata);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        /* Process beacon from the current BSS */
        bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type);
                                le16_to_cpu(mgmt->u.beacon.capab_info),
                                erp_valid, erp_value);
 
-       lockdep_assert_wiphy(local->hw.wiphy);
        sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
        if (WARN_ON(!sta)) {
                goto free;
 
        enum nl80211_chan_width width;
        struct ieee80211_supported_band *sband;
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        conf = rcu_dereference_protected(sdata->vif.bss_conf.chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (conf) {
                width = conf->def.width;
                sband = local->hw.wiphy->bands[conf->def.chan->band];
                }
 
        }
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 static int iee80211_tdls_have_ht_peers(struct ieee80211_sub_if_data *sdata)
        struct ieee80211_local *local = sdata->local;
        int ret;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS))
                return -ENOTSUPP;
 
                        break;
                }
 
-               lockdep_assert_wiphy(local->hw.wiphy);
                sta = sta_info_get(sdata, peer);
                if (!sta) {
                        ret = -ENOLINK;
 
                ret = sta_info_destroy_addr(sdata, peer);
 
-               lockdep_assert_wiphy(local->hw.wiphy);
                iee80211_tdls_recalc_ht_protection(sdata, NULL);
 
                iee80211_tdls_recalc_chanctx(sdata, NULL);
        u32 ch_sw_tm_ie;
        int ret;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (chandef->chan->freq_offset)
                /* this may work, but is untested */
                return -EOPNOTSUPP;
 
-       lockdep_assert_wiphy(local->hw.wiphy);
        sta = sta_info_get(sdata, addr);
        if (!sta) {
                tdls_dbg(sdata,
        struct ieee80211_tdls_ch_sw_params params = {};
        int ret;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        params.action_code = WLAN_TDLS_CHANNEL_SWITCH_RESPONSE;
        params.timestamp = rx_status->device_timestamp;
 
                return -EINVAL;
        }
 
-       lockdep_assert_wiphy(local->hw.wiphy);
        sta = sta_info_get(sdata, tf->sa);
        if (!sta || !test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH)) {
                tdls_dbg(sdata, "TDLS chan switch from non-peer sta %pM\n",
        struct ieee80211_tdls_ch_sw_params params = {};
        int ret = 0;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        params.action_code = WLAN_TDLS_CHANNEL_SWITCH_REQUEST;
        params.timestamp = rx_status->device_timestamp;
 
                goto free;
        }
 
-       lockdep_assert_wiphy(local->hw.wiphy);
        sta = sta_info_get(sdata, tf->sa);
        if (!sta || !test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH)) {
                tdls_dbg(sdata, "TDLS chan switch from non-peer sta %pM\n",
 
        struct ieee80211_sub_if_data *sdata;
        struct ieee80211_chanctx *ctx;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        /*
         * We get here if during resume the device can't be restarted properly.
         * We might also get here if this happens during HW reset, which is a
        /* Mark channel contexts as not being in the driver any more to avoid
         * removing them from the driver during the shutdown process...
         */
-       mutex_lock(&local->chanctx_mtx);
        list_for_each_entry(ctx, &local->chanctx_list, list)
                ctx->driver_present = false;
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 static void ieee80211_assign_chanctx(struct ieee80211_local *local,
        struct ieee80211_chanctx_conf *conf;
        struct ieee80211_chanctx *ctx;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        if (!local->use_chanctx)
                return;
 
-       mutex_lock(&local->chanctx_mtx);
        conf = rcu_dereference_protected(link->conf->chanctx_conf,
-                                        lockdep_is_held(&local->chanctx_mtx));
+                                        lockdep_is_held(&local->hw.wiphy->mtx));
        if (conf) {
                ctx = container_of(conf, struct ieee80211_chanctx, conf);
                drv_assign_vif_chanctx(local, sdata, link->conf, ctx);
        }
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata)
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
 
-       /* add STAs back */
        lockdep_assert_wiphy(local->hw.wiphy);
+
+       /* add STAs back */
        list_for_each_entry(sta, &local->sta_list, list) {
                enum ieee80211_sta_state state;
 
        bool suspended = local->suspended;
        bool in_reconfig = false;
 
+       lockdep_assert_wiphy(local->hw.wiphy);
+
        /* nothing to do if HW shouldn't run */
        if (!local->open_count)
                goto wake_up;
 
        /* add channel contexts */
        if (local->use_chanctx) {
-               mutex_lock(&local->chanctx_mtx);
                list_for_each_entry(ctx, &local->chanctx_list, list)
                        if (ctx->replace_state !=
                            IEEE80211_CHANCTX_REPLACES_OTHER)
                                WARN_ON(drv_add_chanctx(local, ctx));
-               mutex_unlock(&local->chanctx_mtx);
 
                sdata = wiphy_dereference(local->hw.wiphy,
                                          local->monitor_sdata);
         * are active. This is really a workaround though.
         */
        if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
-               lockdep_assert_wiphy(local->hw.wiphy);
-
                list_for_each_entry(sta, &local->sta_list, list) {
                        if (!local->resuming)
                                ieee80211_sta_tear_down_BA_sessions(
        struct ieee80211_chanctx_conf *chanctx_conf;
        struct ieee80211_chanctx *chanctx;
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        chanctx_conf = rcu_dereference_protected(link->conf->chanctx_conf,
-                                                lockdep_is_held(&local->chanctx_mtx));
+                                                lockdep_is_held(&local->hw.wiphy->mtx));
 
        /*
         * This function can be called from a work, thus it may be possible
         * So nothing should be done in such case.
         */
        if (!chanctx_conf)
-               goto unlock;
+               return;
 
        chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
        ieee80211_recalc_smps_chanctx(local, chanctx);
- unlock:
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_chanctx *chanctx;
        int i;
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        for (i = 0; i < ARRAY_SIZE(sdata->vif.link_conf); i++) {
                struct ieee80211_bss_conf *bss_conf;
                }
 
                chanctx_conf = rcu_dereference_protected(bss_conf->chanctx_conf,
-                                                        lockdep_is_held(&local->chanctx_mtx));
+                                                        lockdep_is_held(&local->hw.wiphy->mtx));
                /*
-                * Since we hold the chanctx_mtx (checked above)
+                * Since we hold the wiphy mutex (checked above)
                 * we can take the chanctx_conf pointer out of the
                 * RCU critical section, it cannot go away without
                 * the mutex. Just the way we reached it could - in
                rcu_read_unlock();
 
                if (!chanctx_conf)
-                       goto unlock;
+                       return;
 
                chanctx = container_of(chanctx_conf, struct ieee80211_chanctx,
                                       conf);
                ieee80211_recalc_chanctx_min_def(local, chanctx, NULL);
        }
- unlock:
-       mutex_unlock(&local->chanctx_mtx);
 }
 
 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
        struct ieee80211_chanctx *ctx;
        int num_chanctx = 0;
 
-       mutex_lock(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
        list_for_each_entry(ctx, &local->chanctx_list, list) {
                if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER)
                        continue;
                num_chanctx++;
                chandef = ctx->conf.def;
        }
-       mutex_unlock(&local->chanctx_mtx);
 
        ieee80211_dfs_cac_cancel(local);
 
        struct ieee80211_link_data *link;
        u8 radar_detect = 0;
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
                return 0;
                .radar_detect = radar_detect,
        };
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        if (WARN_ON(hweight32(radar_detect) > 1))
                return -EINVAL;
        int err;
        struct iface_combination_params params = {0};
 
-       lockdep_assert_held(&local->chanctx_mtx);
+       lockdep_assert_wiphy(local->hw.wiphy);
 
        list_for_each_entry(ctx, &local->chanctx_list, list) {
                if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)