Commit 6fa001bc authored by Michal Kazior's avatar Michal Kazior Committed by Johannes Berg

mac80211: add max channel calculation utility function

The utility function has no uses yet. It is aimed
at future chanctx reservation management and
channel switching.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 65a124dd
...@@ -1822,6 +1822,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, ...@@ -1822,6 +1822,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
enum ieee80211_chanctx_mode chanmode, enum ieee80211_chanctx_mode chanmode,
u8 radar_detect); u8 radar_detect);
int ieee80211_max_num_channels(struct ieee80211_local *local);
#ifdef CONFIG_MAC80211_NOINLINE #ifdef CONFIG_MAC80211_NOINLINE
#define debug_noinline noinline #define debug_noinline noinline
......
...@@ -2873,3 +2873,45 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, ...@@ -2873,3 +2873,45 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
num_different_channels, num_different_channels,
radar_detect, num); radar_detect, num);
} }
static void
ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c,
void *data)
{
u32 *max_num_different_channels = data;
*max_num_different_channels = max(*max_num_different_channels,
c->num_different_channels);
}
int ieee80211_max_num_channels(struct ieee80211_local *local)
{
struct ieee80211_sub_if_data *sdata;
int num[NUM_NL80211_IFTYPES] = {};
struct ieee80211_chanctx *ctx;
int num_different_channels = 0;
u8 radar_detect = 0;
u32 max_num_different_channels = 1;
int err;
lockdep_assert_held(&local->chanctx_mtx);
list_for_each_entry(ctx, &local->chanctx_list, list) {
num_different_channels++;
if (ctx->conf.radar_enabled)
radar_detect |= BIT(ctx->conf.def.width);
}
list_for_each_entry_rcu(sdata, &local->interfaces, list)
num[sdata->wdev.iftype]++;
err = cfg80211_iter_combinations(local->hw.wiphy,
num_different_channels, radar_detect,
num, ieee80211_iter_max_chans,
&max_num_different_channels);
if (err < 0)
return err;
return max_num_different_channels;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment