|
@@ -406,6 +406,34 @@ bool ieee80211_is_radar_required(struct ieee80211_local *local)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static bool
|
|
|
+ieee80211_chanctx_radar_required(struct ieee80211_local *local,
|
|
|
+ struct ieee80211_chanctx *ctx)
|
|
|
+{
|
|
|
+ struct ieee80211_chanctx_conf *conf = &ctx->conf;
|
|
|
+ struct ieee80211_sub_if_data *sdata;
|
|
|
+ bool required = false;
|
|
|
+
|
|
|
+ lockdep_assert_held(&local->chanctx_mtx);
|
|
|
+ lockdep_assert_held(&local->mtx);
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
|
|
+ if (!ieee80211_sdata_running(sdata))
|
|
|
+ continue;
|
|
|
+ if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf)
|
|
|
+ continue;
|
|
|
+ if (!sdata->radar_required)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ required = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ rcu_read_unlock();
|
|
|
+
|
|
|
+ return required;
|
|
|
+}
|
|
|
+
|
|
|
static struct ieee80211_chanctx *
|
|
|
ieee80211_alloc_chanctx(struct ieee80211_local *local,
|
|
|
const struct cfg80211_chan_def *chandef,
|
|
@@ -425,7 +453,7 @@ ieee80211_alloc_chanctx(struct ieee80211_local *local,
|
|
|
ctx->conf.rx_chains_static = 1;
|
|
|
ctx->conf.rx_chains_dynamic = 1;
|
|
|
ctx->mode = mode;
|
|
|
- ctx->conf.radar_enabled = ieee80211_is_radar_required(local);
|
|
|
+ ctx->conf.radar_enabled = false;
|
|
|
ieee80211_recalc_chanctx_min_def(local, ctx);
|
|
|
|
|
|
return ctx;
|
|
@@ -570,7 +598,7 @@ static void ieee80211_recalc_radar_chanctx(struct ieee80211_local *local,
|
|
|
/* for ieee80211_is_radar_required */
|
|
|
lockdep_assert_held(&local->mtx);
|
|
|
|
|
|
- radar_enabled = ieee80211_is_radar_required(local);
|
|
|
+ radar_enabled = ieee80211_chanctx_radar_required(local, chanctx);
|
|
|
|
|
|
if (radar_enabled == chanctx->conf.radar_enabled)
|
|
|
return;
|