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: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
committed by
Johannes Berg
parent
65a124dd71
commit
6fa001bc7e
@@ -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,
|
|||||||
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user