nl80211: support setting S1G channels
S1G channels have a single width defined per frequency, so derive it from the channel flags with ieee80211_s1g_channel_width(). Also support setting an S1G channel where control frequency may differ from operating, and add some basic validation to ensure the control channel is with the operating. Signed-off-by: Thomas Pedersen <thomas@adapt-ip.com> Link: https://lore.kernel.org/r/20200908190323.15814-6-thomas@adapt-ip.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
1d47f1198d
commit
11b34737b1
@@ -111,6 +111,33 @@ u32 ieee80211_channel_to_freq_khz(int chan, enum nl80211_band band)
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_channel_to_freq_khz);
|
||||
|
||||
enum nl80211_chan_width
|
||||
ieee80211_s1g_channel_width(const struct ieee80211_channel *chan)
|
||||
{
|
||||
if (WARN_ON(!chan || chan->band != NL80211_BAND_S1GHZ))
|
||||
return NL80211_CHAN_WIDTH_20_NOHT;
|
||||
|
||||
/*S1G defines a single allowed channel width per channel.
|
||||
* Extract that width here.
|
||||
*/
|
||||
if (chan->flags & IEEE80211_CHAN_1MHZ)
|
||||
return NL80211_CHAN_WIDTH_1;
|
||||
else if (chan->flags & IEEE80211_CHAN_2MHZ)
|
||||
return NL80211_CHAN_WIDTH_2;
|
||||
else if (chan->flags & IEEE80211_CHAN_4MHZ)
|
||||
return NL80211_CHAN_WIDTH_4;
|
||||
else if (chan->flags & IEEE80211_CHAN_8MHZ)
|
||||
return NL80211_CHAN_WIDTH_8;
|
||||
else if (chan->flags & IEEE80211_CHAN_16MHZ)
|
||||
return NL80211_CHAN_WIDTH_16;
|
||||
|
||||
pr_err("unknown channel width for channel at %dKHz?\n",
|
||||
ieee80211_channel_to_khz(chan));
|
||||
|
||||
return NL80211_CHAN_WIDTH_1;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_s1g_channel_width);
|
||||
|
||||
int ieee80211_freq_khz_to_channel(u32 freq)
|
||||
{
|
||||
/* TODO: just handle MHz for now */
|
||||
|
Reference in New Issue
Block a user