blob: 124ac8e67dbd7faa8ed76485f0892b812afaacb4 [file] [log] [blame]
From 3012337540e2bfdf708cdd113c25c2501bf63da7 Mon Sep 17 00:00:00 2001
From: Michael-CY Lee <michael-cy.lee@mediatek.com>
Date: Mon, 14 Aug 2023 18:03:29 +0800
Subject: [PATCH 21/37] mtk: mac80211: Add utilities for converting op_class
These utilities include converting op_class to nl80211 channel width and
center frequency.
Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
---
include/net/cfg80211.h | 25 ++++++++
net/wireless/util.c | 130 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 154 insertions(+), 1 deletion(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 0b5a4e6..19c8abe 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -8723,6 +8723,31 @@ void cfg80211_ch_switch_started_notify(struct net_device *dev,
bool ieee80211_operating_class_to_band(u8 operating_class,
enum nl80211_band *band);
+/**
+ * ieee80211_operating_class_to_center_freq - convert operating class to
+ * center frequency
+ *
+ * @operating_class: the operating class to convert
+ * @chan: the ieee80211_channel to convert
+ * @center_freq1: cneter frequency 1 pointer to fill
+ * @center_freq2: cneter frequency 2 pointer to fill
+ *
+ * Returns %true if the conversion was successful, %false otherwise.
+ */
+bool ieee80211_operating_class_to_center_freq(u8 operating_class,
+ struct ieee80211_channel *chan,
+ u32 *center_freq1,
+ u32 *center_freq2);
+
+/**
+ * ieee80211_operating_class_to_chan_width - convert operating class to
+ * nl80211 channel width
+ *
+ * @operating_class: the operating class to convert
+ */
+enum nl80211_chan_width
+ieee80211_operating_class_to_chan_width(u8 operating_class);
+
/**
* ieee80211_chandef_to_operating_class - convert chandef to operation class
*
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 1783ab9..13cb986 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1981,7 +1981,7 @@ bool ieee80211_operating_class_to_band(u8 operating_class,
case 128 ... 130:
*band = NL80211_BAND_5GHZ;
return true;
- case 131 ... 135:
+ case 131 ... 137:
*band = NL80211_BAND_6GHZ;
return true;
case 81:
@@ -1999,6 +1999,134 @@ bool ieee80211_operating_class_to_band(u8 operating_class,
}
EXPORT_SYMBOL(ieee80211_operating_class_to_band);
+bool ieee80211_operating_class_to_center_freq(u8 operating_class,
+ struct ieee80211_channel *chan,
+ u32 *center_freq1,
+ u32 *center_freq2)
+{
+ u32 control_freq, offset;
+ enum nl80211_band band;
+
+ control_freq = chan->center_freq;
+ if (!ieee80211_operating_class_to_band(operating_class, &band))
+ return false;
+
+ if (band != chan->band)
+ return false;
+
+ if (control_freq >= 5955)
+ offset = control_freq - 5955;
+ else if (control_freq >= 5745)
+ offset = control_freq - 5745;
+ else if (control_freq >= 5180)
+ offset = control_freq - 5180;
+ offset /= 20;
+
+ *center_freq2 = 0;
+ switch (operating_class) {
+ case 81: /* 2 GHz band; 20 MHz; channels 1..13 */
+ case 82: /* 2 GHz band; 20 MHz; channel 14 */
+ case 115: /* 5 GHz band; 20 MHz; channels 36,40,44,48 */
+ case 118: /* 5 GHz band; 20 MHz; channels 52,56,60,64 */
+ case 121: /* 5 GHz band; 20 MHz; channels 100..144 */
+ case 124: /* 5 GHz band; 20 MHz; channels 149,153,157,161 */
+ case 125: /* 5 GHz band; 20 MHz; channels 149..177 */
+ case 131: /* 6 GHz band; 20 MHz; channels 1..233*/
+ case 136: /* 6 GHz band; 20 MHz; channel 2 */
+ *center_freq1 = control_freq;
+ return true;
+ case 83: /* 2 GHz band; 40 MHz; channels 1..9 */
+ case 116: /* 5 GHz band; 40 MHz; channels 36,44 */
+ case 119: /* 5 GHz band; 40 MHz; channels 52,60 */
+ case 122: /* 5 GHz band; 40 MHz; channels 100,108,116,124,132,140 */
+ case 126: /* 5 GHz band; 40 MHz; channels 149,157,165,173 */
+ *center_freq1 = control_freq + 10;
+ return true;
+ case 84: /* 2 GHz band; 40 MHz; channels 5..13 */
+ case 117: /* 5 GHz band; 40 MHz; channels 40,48 */
+ case 120: /* 5 GHz band; 40 MHz; channels 56,64 */
+ case 123: /* 5 GHz band; 40 MHz; channels 104,112,120,128,136,144 */
+ case 127: /* 5 GHz band; 40 MHz; channels 153,161,169,177 */
+ *center_freq1 = control_freq - 10;
+ return true;
+ case 132: /* 6 GHz band; 40 MHz; channels 1,5,..,229*/
+ *center_freq1 = control_freq + 10 - (offset & 1) * 20;
+ return true;
+ case 128: /* 5 GHz band; 80 MHz; channels 36..64,100..144,149..177 */
+ *center_freq1 = control_freq + 30 - (offset & 3) * 20;
+ return true;
+ case 130: /* 5 GHz band; 80+80 MHz; channels 36..64,100..144,149..177 */
+ /* TODO How to know the center_freq2 of 80+80 MHz?*/
+ *center_freq1 = 0;
+ return false;
+ case 133: /* 6 GHz band; 80 MHz; channels 1,5,..,229 */
+ *center_freq1 = control_freq + 30 - (offset & 3) * 20;
+ return true;
+ case 129: /* 5 GHz band; 160 MHz; channels 36..64,100..144,149..177 */
+ *center_freq1 = control_freq + 70 - (offset & 7) * 20;
+ return true;
+ case 134: /* 6 GHz band; 160 MHz; channels 1,5,..,229 */
+ *center_freq1 = control_freq + 70 - (offset & 7) * 20;
+ return true;
+ case 135: /* 6 GHz band; 80+80 MHz; channels 1,5,..,229 */
+ /* TODO How to know the center_freq2 of 80+80 MHz?*/
+ *center_freq1 = 0;
+ return false;
+ case 137: /* 6 GHz band; 320 MHz; channels 1,5,..,229 */
+ /* TODO it's 320-1 or 320-2 channelization? */
+ /* Currently convert to 320-1 */
+ *center_freq1 = control_freq + 150 - (offset & 15) * 20;
+ return true;
+ default:
+ return false;
+ }
+}
+EXPORT_SYMBOL(ieee80211_operating_class_to_center_freq);
+
+enum nl80211_chan_width
+ieee80211_operating_class_to_chan_width(u8 operating_class)
+{
+ switch (operating_class) {
+ case 81: /* 2 GHz band; 20 MHz; channels 1..13 */
+ case 82: /* 2 GHz band; 20 MHz; channel 14 */
+ case 115: /* 5 GHz band; 20 MHz; channels 36,40,44,48 */
+ case 118: /* 5 GHz band; 20 MHz; channels 52,56,60,64 */
+ case 121: /* 5 GHz band; 20 MHz; channels 100..144 */
+ case 124: /* 5 GHz band; 20 MHz; channels 149,153,157,161 */
+ case 125: /* 5 GHz band; 20 MHz; channels 149..177 */
+ case 131: /* 6 GHz band; 20 MHz; channels 1..233*/
+ case 136: /* 6 GHz band; 20 MHz; channel 2 */
+ return NL80211_CHAN_WIDTH_20;
+ case 83: /* 2 GHz band; 40 MHz; channels 1..9 */
+ case 84: /* 2 GHz band; 40 MHz; channels 5..13 */
+ case 116: /* 5 GHz band; 40 MHz; channels 36,44 */
+ case 117: /* 5 GHz band; 40 MHz; channels 40,48 */
+ case 119: /* 5 GHz band; 40 MHz; channels 52,60 */
+ case 120: /* 5 GHz band; 40 MHz; channels 56,64 */
+ case 122: /* 5 GHz band; 40 MHz; channels 100,108,116,124,132,140 */
+ case 123: /* 5 GHz band; 40 MHz; channels 104,112,120,128,136,144 */
+ case 126: /* 5 GHz band; 40 MHz; channels 149,157,165,173 */
+ case 127: /* 5 GHz band; 40 MHz; channels 153,161,169,177 */
+ case 132: /* 6 GHz band; 40 MHz; channels 1,5,..,229*/
+ return NL80211_CHAN_WIDTH_40;
+ case 128: /* 5 GHz band; 80 MHz; channels 36..64,100..144,149..177 */
+ case 133: /* 6 GHz band; 80 MHz; channels 1,5,..,229 */
+ return NL80211_CHAN_WIDTH_80;
+ case 130: /* 5 GHz band; 80+80 MHz; channels 36..64,100..144,149..177 */
+ case 135: /* 6 GHz band; 80+80 MHz; channels 1,5,..,229 */
+ return NL80211_CHAN_WIDTH_80P80;
+ case 129: /* 5 GHz band; 160 MHz; channels 36..64,100..144,149..177 */
+ case 134: /* 6 GHz band; 160 MHz; channels 1,5,..,229 */
+ return NL80211_CHAN_WIDTH_160;
+ case 137: /* 6 GHz band; 320 MHz; channels 1,5,..,229 */
+ return NL80211_CHAN_WIDTH_320;
+ default:
+ WARN_ON(1);
+ return NL80211_CHAN_WIDTH_20_NOHT;
+ }
+}
+EXPORT_SYMBOL(ieee80211_operating_class_to_chan_width);
+
bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef,
u8 *op_class)
{
--
2.18.0