diff mbox series

[1/2] wifi: mac80211: Add utilities for converting op_class

Message ID 20231106073301.7351-1-michael-cy.lee@mediatek.com
State Superseded
Headers show
Series [1/2] wifi: mac80211: Add utilities for converting op_class | expand

Commit Message

Michael-CY Lee Nov. 6, 2023, 7:33 a.m. UTC
These utilities include converting op_class to nl80211 channel width and
center frequency.

Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
Signed-off-by: Money Wang <money.wang@mediatek.com>
---
 include/net/cfg80211.h |  25 ++++++++
 net/wireless/util.c    | 127 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 152 insertions(+)

Comments

kernel test robot Nov. 7, 2023, 9:48 p.m. UTC | #1
Hi Michael-CY,

kernel test robot noticed the following build warnings:

[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main linus/master v6.6 next-20231107]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Michael-CY-Lee/wifi-mac80211-Refactor-STA-CSA-parsing-flow/20231106-161059
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link:    https://lore.kernel.org/r/20231106073301.7351-1-michael-cy.lee%40mediatek.com
patch subject: [PATCH 1/2] wifi: mac80211: Add utilities for converting op_class
config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20231108/202311080415.70MyjizQ-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231108/202311080415.70MyjizQ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311080415.70MyjizQ-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> net/wireless/util.c:2039:11: warning: variable 'offset' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
           else if (control_freq >= 5180)
                    ^~~~~~~~~~~~~~~~~~~~
   net/wireless/util.c:2041:2: note: uninitialized use occurs here
           offset /= 20;
           ^~~~~~
   net/wireless/util.c:2039:7: note: remove the 'if' if its condition is always true
           else if (control_freq >= 5180)
                ^~~~~~~~~~~~~~~~~~~~~~~~~
   net/wireless/util.c:2025:26: note: initialize the variable 'offset' to silence this warning
           u32 control_freq, offset;
                                   ^
                                    = 0
   1 warning generated.


vim +2039 net/wireless/util.c

  2019	
  2020	bool ieee80211_operating_class_to_center_freq(u8 operating_class,
  2021						      struct ieee80211_channel *chan,
  2022						      u32 *center_freq1,
  2023						      u32 *center_freq2)
  2024	{
  2025		u32 control_freq, offset;
  2026		enum nl80211_band band;
  2027	
  2028		control_freq = chan->center_freq;
  2029		if (!ieee80211_operating_class_to_band(operating_class, &band))
  2030			return false;
  2031	
  2032		if (band != chan->band)
  2033			return false;
  2034	
  2035		if (control_freq >= 5955)
  2036			offset = control_freq - 5955;
  2037		else if (control_freq >= 5745)
  2038			offset = control_freq - 5745;
> 2039		else if (control_freq >= 5180)
  2040			offset = control_freq - 5180;
  2041		offset /= 20;
  2042	
  2043		*center_freq2 = 0;
  2044		switch (operating_class) {
  2045		case 81:  /* 2 GHz band; 20 MHz; channels 1..13 */
  2046		case 82:  /* 2 GHz band; 20 MHz; channel 14 */
  2047		case 115: /* 5 GHz band; 20 MHz; channels 36,40,44,48 */
  2048		case 118: /* 5 GHz band; 20 MHz; channels 52,56,60,64 */
  2049		case 121: /* 5 GHz band; 20 MHz; channels 100..144 */
  2050		case 124: /* 5 GHz band; 20 MHz; channels 149,153,157,161 */
  2051		case 125: /* 5 GHz band; 20 MHz; channels 149..177 */
  2052		case 131: /* 6 GHz band; 20 MHz; channels 1..233*/
  2053		case 136: /* 6 GHz band; 20 MHz; channel 2 */
  2054			*center_freq1 = control_freq;
  2055			return true;
  2056		case 83:  /* 2 GHz band; 40 MHz; channels 1..9 */
  2057		case 116: /* 5 GHz band; 40 MHz; channels 36,44 */
  2058		case 119: /* 5 GHz band; 40 MHz; channels 52,60 */
  2059		case 122: /* 5 GHz band; 40 MHz; channels 100,108,116,124,132,140 */
  2060		case 126: /* 5 GHz band; 40 MHz; channels 149,157,165,173 */
  2061			*center_freq1 = control_freq + 10;
  2062			return true;
  2063		case 84:  /* 2 GHz band; 40 MHz; channels 5..13 */
  2064		case 117: /* 5 GHz band; 40 MHz; channels 40,48 */
  2065		case 120: /* 5 GHz band; 40 MHz; channels 56,64 */
  2066		case 123: /* 5 GHz band; 40 MHz; channels 104,112,120,128,136,144 */
  2067		case 127: /* 5 GHz band; 40 MHz; channels 153,161,169,177 */
  2068			*center_freq1 = control_freq - 10;
  2069			return true;
  2070		case 132: /* 6 GHz band; 40 MHz; channels 1,5,..,229*/
  2071			*center_freq1 = control_freq + 10 - (offset & 1) * 20;
  2072			return true;
  2073		case 128: /* 5 GHz band; 80 MHz; channels 36..64,100..144,149..177 */
  2074			*center_freq1 = control_freq + 30 - (offset & 3) * 20;
  2075			return true;
  2076		case 130: /* 5 GHz band; 80+80 MHz; channels 36..64,100..144,149..177 */
  2077			/* TODO How to know the center_freq2 of 80+80 MHz?*/
  2078			*center_freq1 = 0;
  2079			return false;
  2080		case 133: /* 6 GHz band; 80 MHz; channels 1,5,..,229 */
  2081			*center_freq1 = control_freq + 30 - (offset & 3) * 20;
  2082			return true;
  2083		case 129: /* 5 GHz band; 160 MHz; channels 36..64,100..144,149..177 */
  2084			*center_freq1 = control_freq + 70 - (offset & 7) * 20;
  2085			return true;
  2086		case 134: /* 6 GHz band; 160 MHz; channels 1,5,..,229 */
  2087			*center_freq1 = control_freq + 70 - (offset & 7) * 20;
  2088			return true;
  2089		case 135: /* 6 GHz band; 80+80 MHz; channels 1,5,..,229 */
  2090			/* TODO How to know the center_freq2 of 80+80 MHz?*/
  2091			*center_freq1 = 0;
  2092			return false;
  2093		case 137: /* 6 GHz band; 320 MHz; channels 1,5,..,229 */
  2094			/* TODO it's 320 MHz-1 or 320 MHz-2 channelization? */
  2095			*center_freq1 = 0;
  2096			return false;
  2097		default:
  2098			return false;
  2099		}
  2100	}
  2101	EXPORT_SYMBOL(ieee80211_operating_class_to_center_freq);
  2102
diff mbox series

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index b137a33a1b68..a226d1cae7f7 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -8669,6 +8669,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 626b858b4b35..08a62dd5a855 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -2017,6 +2017,133 @@  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 MHz-1 or 320 MHz-2 channelization? */
+		*center_freq1 = 0;
+		return false;
+	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)
 {