Message ID | edf07cdd-ad15-4012-3afd-d8b961a80b69@broadcom.com |
---|---|
State | New |
Headers | show |
Series | [V2] cfg80211: adapt to new channelization of the 6GHz band | expand |
diff --git a/net/wireless/util.c b/net/wireless/util.c index df75e58eca5d..220f44ae3a70 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -92,9 +92,11 @@ u32 ieee80211_channel_to_freq_khz(int chan, enum nl80211_band band) return MHZ_TO_KHZ(5000 + chan * 5); break; case NL80211_BAND_6GHZ: - /* see 802.11ax D4.1 27.3.22.2 */ + /* see 802.11ax D6.1 27.3.23.2 */ + if (chan == 2) + return MHZ_TO_KHZ(5935); if (chan <= 253) - return 5940 + chan * 5; + return MHZ_TO_KHZ(5950 + chan * 5); break; case NL80211_BAND_60GHZ:
The 6GHz band does not have regulatory approval yet, but things are moving forward. However, that has led to a change in the channelization of the 6GHz band which has been accepted in the 11ax specification. It also fixes a missing MHZ_TO_KHZ() macro for 6GHz channels while at it. This change is primarily thrown in to discuss how to deal with it. I noticed ath11k adding 6G support with old channelization and ditto for iw. It probably involves changes in hostapd as well. Cc: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org> Cc: Jouni Malinen <jouni@w1.fi> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> --- V2: - deal with channel 2 in ieee80211_chandef_to_operating_class() --- net/wireless/util.c | 49 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) if (chan < 7) @@ -119,11 +121,14 @@ int ieee80211_freq_khz_to_channel(u32 freq) return (freq - 2407) / 5; else if (freq >= 4910 && freq <= 4980) return (freq - 4000) / 5; - else if (freq < 5945) + else if (freq < 5935) return (freq - 5000) / 5; + else if (freq == 5935) + /* see 802.11ax D6.1 27.3.23.2 */ + return 2; else if (freq <= 45000) /* DMG band lower limit */ - /* see 802.11ax D4.1 27.3.22.2 */ - return (freq - 5940) / 5; + /* see 802.11ax D6.1 27.3.23.2 */ + return (freq - 5950) / 5; else if (freq >= 58320 && freq <= 70200) return (freq - 56160) / 2160; else @@ -1662,6 +1667,40 @@ bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef, return true; } + /* 6GHz, channels 1..233 */ + if (freq == 5935) { + if (chandef->width != NL80211_CHAN_WIDTH_20) + return false; + + *op_class = 136; + return true; + } else if (freq > 5935 && freq <= 7115) { + switch (chandef->width) { + case NL80211_CHAN_WIDTH_20: + *op_class = 131; + break; + case NL80211_CHAN_WIDTH_40: + *op_class = 132; + break; + case NL80211_CHAN_WIDTH_80: + *op_class = 133; + break; + case NL80211_CHAN_WIDTH_160: + *op_class = 134; + break; + case NL80211_CHAN_WIDTH_80P80: + *op_class = 135; + break; + case NL80211_CHAN_WIDTH_5: + case NL80211_CHAN_WIDTH_10: + case NL80211_CHAN_WIDTH_20_NOHT: + default: + return false; + } + + return true; + } + /* 56.16 GHz, channel 1..4 */ if (freq >= 56160 + 2160 * 1 && freq <= 56160 + 2160 * 6) { if (chandef->width >= NL80211_CHAN_WIDTH_40)