linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mac80211: 160MHz support per IEEE802.11ax standard
@ 2020-10-12 14:18 Shay Bar
  2020-10-12 16:44 ` kernel test robot
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Shay Bar @ 2020-10-12 14:18 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, eliav.farber, aviad.brikman

According to the new IEEE802.11ax standard center frequency of the 160MHz
should be published in segment2 field of HT operation IE when using EXT NSS
(when supporting smaller number of NSS in VHT in 160MHz BW).
This patch adds the required support to mac80211, cfg80211 to parse it properly
according to the new style as appears in the new standard.

According to the new style, the AP should publish that its bw is 80MHz and not
160MHz.
A STA should conclude that an AP is working in 160MHz if it publishes
the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
or seg2 field of HT operation IE.

A little about the old/new style of the channel/bandwidth publish in beacons:

- In the old style bandwidth of 160MHz and center frequency segment 0 are
  published in vht/he operation information element, while the center_freq_seg0
  indicates the center frequency of 160MHz.
- According to the new style, bandwidth of 80MHz is published and also the
  following:
    * If the supported number of VHT NSS in 160MHz is at least max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 indicates the center frequency of 160MHz.
    * If the supported number of VHT NSS in 160MHz is less than max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 is 0. The center frequency of 160MHz is published in HT
      operation information element instead.

Signed-off-by: Aviad Brikman <aviad.brikman@celeno.com>
Signed-off-by: Shay Bar <shay.bar@celeno.com>
---
 include/linux/ieee80211.h | 15 ++++++
 net/mac80211/spectmgmt.c  | 97 ++++++++++++++++++++++++++++++++++++---
 net/wireless/nl80211.c    | 15 ++++++
 3 files changed, 121 insertions(+), 6 deletions(-)

diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index c47f43e65a2f..884b71a96084 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1692,6 +1692,21 @@ enum ieee80211_vht_chanwidth {
 	IEEE80211_VHT_CHANWIDTH_80P80MHZ	= 3,
 };
 
+/**
+ * enum ieee80211_center_freq_seg1_location - the location of center
+ * frequency segment1
+ * @IEEE80211_CENTER_FREQ_SEG1_NONE: center freq seg1 is located no where
+ * @IEEE80211_CENTER_FREQ_SEG1_VHT_OPER: center freq seg1 is located in VHT
+ * operation IE
+ * @IEEE80211_CENTER_FREQ_SEG1_HT_OPER: center freq seg1 is located in HT
+ * operation IE
+ */
+enum ieee80211_center_freq_seg1_location {
+	IEEE80211_CENTER_FREQ_SEG1_NONE         = 0,
+	IEEE80211_CENTER_FREQ_SEG1_VHT_OPER     = 1,
+	IEEE80211_CENTER_FREQ_SEG1_HT_OPER      = 2,
+};
+
 /**
  * struct ieee80211_vht_operation - VHT operation IE
  *
diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index ae1cb2c68722..6600e78e2bde 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -19,6 +19,78 @@
 #include "sta_info.h"
 #include "wme.h"
 
+enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
+							      u32 seg0,
+							      u32 seg1)
+{
+	enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
+
+	if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
+		return vht_oper_bw;
+
+	if (!seg1) {
+		return IEEE80211_VHT_CHANWIDTH_80MHZ;
+	} else {
+		int diff;
+
+		diff = abs((int) seg0 - (int) seg1);
+
+		if (diff == 8)
+			return IEEE80211_VHT_CHANWIDTH_160MHZ;
+
+		if (diff > 16)
+			return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
+	}
+
+	return ret;
+}
+
+enum ieee80211_center_freq_seg1_location
+ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
+					u32 vht_cap_info,
+					u8 actual_chanwidth)
+{
+	u8 ext_nss_bw_supp = (vht_cap_info &
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
+	u8 supp_chwidth = (vht_cap_info &
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
+	enum ieee80211_center_freq_seg1_location res =
+					IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	/* The bandwidth is less than 80+80/160MHz */
+	if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
+		return IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	switch (supp_chwidth) {
+	case 0:
+		if ((ext_nss_bw_supp > 1) ||
+		    ((ext_nss_bw_supp == 1) &&
+		     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
+		break;
+	case 1:
+		if ((ext_nss_bw_supp > 2) ||
+		    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
+			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER; /* CCFS1 */
+		else if (ext_nss_bw_supp > 0)
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
+		break;
+	case 2:
+		res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
+		if ((ext_nss_bw_supp > 0) && (ext_nss_bw_supp < 3))
+			sdata_info(sdata,
+				   "Invalid ext_nss_bw_supp %u for chwidth 2",
+				   ext_nss_bw_supp);
+		break;
+	default:
+		break;
+	}
+
+	return res;
+}
+
 int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 				 struct ieee802_11_elems *elems,
 				 enum nl80211_band current_band,
@@ -133,17 +205,30 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 	}
 
 	if (wide_bw_chansw_ie) {
+		u8 new_channel_width = wide_bw_chansw_ie->new_channel_width;
+		u8 new_seg0 = wide_bw_chansw_ie->new_center_freq_seg0;
+		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
+		enum ieee80211_vht_chanwidth act_chanwidth =
+			ieee80211_vht_get_actual_chwidth(
+			 new_channel_width, new_seg0, new_seg1);
+		enum ieee80211_center_freq_seg1_location seg1_location =
+			ieee80211_get_center_freq_seg1_location(sdata,
+								vht_cap_info,
+								act_chanwidth);
 		struct ieee80211_vht_operation vht_oper = {
-			.chan_width =
-				wide_bw_chansw_ie->new_channel_width,
-			.center_freq_seg0_idx =
-				wide_bw_chansw_ie->new_center_freq_seg0,
-			.center_freq_seg1_idx =
-				wide_bw_chansw_ie->new_center_freq_seg1,
+			.chan_width = new_channel_width,
+			.center_freq_seg0_idx = new_seg0,
 			/* .basic_mcs_set doesn't matter */
 		};
 		struct ieee80211_ht_operation ht_oper = {};
 
+		if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_VHT_OPER)
+			vht_oper.center_freq_seg1_idx = new_seg1;
+		else if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_HT_OPER)
+			ht_oper.operation_mode =
+					(le16_to_cpu(new_seg1) <<
+					 IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
+
 		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
 		 * to the previously parsed chandef
 		 */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 5940acbe761c..9644d00cfd2f 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2889,6 +2889,21 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
 		chandef->edmg.channels = 0;
 	}
 
+	if (chandef->width == NL80211_CHAN_WIDTH_80) {
+		if (chandef->center_freq2) {
+			int diff = abs(chandef->center_freq1 -
+				       chandef->center_freq2);
+
+			if (diff == 40)
+				chandef->width = NL80211_CHAN_WIDTH_160;
+			else if (diff > 80)
+				chandef->width = NL80211_CHAN_WIDTH_80P80;
+
+			chandef->center_freq1 = chandef->center_freq2;
+			chandef->center_freq2 = 0;
+		}
+	}
+
 	if (!cfg80211_chandef_valid(chandef)) {
 		NL_SET_ERR_MSG(extack, "invalid channel definition");
 		return -EINVAL;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-12 14:18 [PATCH] mac80211: 160MHz support per IEEE802.11ax standard Shay Bar
@ 2020-10-12 16:44 ` kernel test robot
  2020-10-12 17:08 ` kernel test robot
  2020-10-19  6:39 ` [PATCH v2] " Shay Bar
  2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2020-10-12 16:44 UTC (permalink / raw)
  To: Shay Bar, Johannes Berg
  Cc: kbuild-all, linux-wireless, eliav.farber, aviad.brikman

[-- Attachment #1: Type: text/plain, Size: 4654 bytes --]

Hi Shay,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mac80211-next/master]
[also build test WARNING on mac80211/master v5.9 next-20201012]
[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]

url:    https://github.com/0day-ci/linux/commits/Shay-Bar/mac80211-160MHz-support-per-IEEE802-11ax-standard/20201012-221911
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/13bd6eb21625512094cdded5c24e9dd314fb00b7
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Shay-Bar/mac80211-160MHz-support-per-IEEE802-11ax-standard/20201012-221911
        git checkout 13bd6eb21625512094cdded5c24e9dd314fb00b7
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> net/mac80211/spectmgmt.c:22:30: warning: no previous prototype for 'ieee80211_vht_get_actual_chwidth' [-Wmissing-prototypes]
      22 | enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
         |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> net/mac80211/spectmgmt.c:49:1: warning: no previous prototype for 'ieee80211_get_center_freq_seg1_location' [-Wmissing-prototypes]
      49 | ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

vim +/ieee80211_vht_get_actual_chwidth +22 net/mac80211/spectmgmt.c

    21	
  > 22	enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
    23								      u32 seg0,
    24								      u32 seg1)
    25	{
    26		enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
    27	
    28		if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
    29			return vht_oper_bw;
    30	
    31		if (!seg1) {
    32			return IEEE80211_VHT_CHANWIDTH_80MHZ;
    33		} else {
    34			int diff;
    35	
    36			diff = abs((int) seg0 - (int) seg1);
    37	
    38			if (diff == 8)
    39				return IEEE80211_VHT_CHANWIDTH_160MHZ;
    40	
    41			if (diff > 16)
    42				return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
    43		}
    44	
    45		return ret;
    46	}
    47	
    48	enum ieee80211_center_freq_seg1_location
  > 49	ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
    50						u32 vht_cap_info,
    51						u8 actual_chanwidth)
    52	{
    53		u8 ext_nss_bw_supp = (vht_cap_info &
    54				      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
    55				      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
    56		u8 supp_chwidth = (vht_cap_info &
    57				   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
    58				   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
    59		enum ieee80211_center_freq_seg1_location res =
    60						IEEE80211_CENTER_FREQ_SEG1_NONE;
    61	
    62		/* The bandwidth is less than 80+80/160MHz */
    63		if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
    64			return IEEE80211_CENTER_FREQ_SEG1_NONE;
    65	
    66		switch (supp_chwidth) {
    67		case 0:
    68			if ((ext_nss_bw_supp > 1) ||
    69			    ((ext_nss_bw_supp == 1) &&
    70			     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
    71				res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
    72			break;
    73		case 1:
    74			if ((ext_nss_bw_supp > 2) ||
    75			    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
    76				res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER; /* CCFS1 */
    77			else if (ext_nss_bw_supp > 0)
    78				res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
    79			break;
    80		case 2:
    81			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
    82			if ((ext_nss_bw_supp > 0) && (ext_nss_bw_supp < 3))
    83				sdata_info(sdata,
    84					   "Invalid ext_nss_bw_supp %u for chwidth 2",
    85					   ext_nss_bw_supp);
    86			break;
    87		default:
    88			break;
    89		}
    90	
    91		return res;
    92	}
    93	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 65140 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-12 14:18 [PATCH] mac80211: 160MHz support per IEEE802.11ax standard Shay Bar
  2020-10-12 16:44 ` kernel test robot
@ 2020-10-12 17:08 ` kernel test robot
  2020-10-19  6:39 ` [PATCH v2] " Shay Bar
  2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2020-10-12 17:08 UTC (permalink / raw)
  To: Shay Bar, Johannes Berg
  Cc: kbuild-all, clang-built-linux, linux-wireless, eliav.farber,
	aviad.brikman

[-- Attachment #1: Type: text/plain, Size: 12091 bytes --]

Hi Shay,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mac80211-next/master]
[also build test WARNING on mac80211/master v5.9 next-20201012]
[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]

url:    https://github.com/0day-ci/linux/commits/Shay-Bar/mac80211-160MHz-support-per-IEEE802-11ax-standard/20201012-221911
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: riscv-randconfig-r006-20201012 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 9e72d3eaf38f217698f72cb8fdc969a6e72dad3a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/13bd6eb21625512094cdded5c24e9dd314fb00b7
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Shay-Bar/mac80211-160MHz-support-per-IEEE802-11ax-standard/20201012-221911
        git checkout 13bd6eb21625512094cdded5c24e9dd314fb00b7
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

                                                                           ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:87:48: note: expanded from macro 'readb_cpu'
   #define readb_cpu(c)            ({ u8  __r = __raw_readb(c); __r; })
                                                            ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:564:9: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           return inw(addr);
                  ^~~~~~~~~
   arch/riscv/include/asm/io.h:55:76: note: expanded from macro 'inw'
   #define inw(c)          ({ u16 __v; __io_pbr(); __v = readw_cpu((void*)(PCI_IOBASE + (c))); __io_par(__v); __v; })
                                                                           ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:88:76: note: expanded from macro 'readw_cpu'
   #define readw_cpu(c)            ({ u16 __r = le16_to_cpu((__force __le16)__raw_readw(c)); __r; })
                                                                                        ^
   include/uapi/linux/byteorder/little_endian.h:36:51: note: expanded from macro '__le16_to_cpu'
   #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
                                                     ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:572:9: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           return inl(addr);
                  ^~~~~~~~~
   arch/riscv/include/asm/io.h:56:76: note: expanded from macro 'inl'
   #define inl(c)          ({ u32 __v; __io_pbr(); __v = readl_cpu((void*)(PCI_IOBASE + (c))); __io_par(__v); __v; })
                                                                           ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:89:76: note: expanded from macro 'readl_cpu'
   #define readl_cpu(c)            ({ u32 __r = le32_to_cpu((__force __le32)__raw_readl(c)); __r; })
                                                                                        ^
   include/uapi/linux/byteorder/little_endian.h:34:51: note: expanded from macro '__le32_to_cpu'
   #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
                                                     ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:580:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outb(value, addr);
           ^~~~~~~~~~~~~~~~~
   arch/riscv/include/asm/io.h:58:68: note: expanded from macro 'outb'
   #define outb(v,c)       ({ __io_pbw(); writeb_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); })
                                                                 ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:91:52: note: expanded from macro 'writeb_cpu'
   #define writeb_cpu(v, c)        ((void)__raw_writeb((v), (c)))
                                                             ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:588:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outw(value, addr);
           ^~~~~~~~~~~~~~~~~
   arch/riscv/include/asm/io.h:59:68: note: expanded from macro 'outw'
   #define outw(v,c)       ({ __io_pbw(); writew_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); })
                                                                 ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:92:76: note: expanded from macro 'writew_cpu'
   #define writew_cpu(v, c)        ((void)__raw_writew((__force u16)cpu_to_le16(v), (c)))
                                                                                     ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:596:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           outl(value, addr);
           ^~~~~~~~~~~~~~~~~
   arch/riscv/include/asm/io.h:60:68: note: expanded from macro 'outl'
   #define outl(v,c)       ({ __io_pbw(); writel_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); })
                                                                 ~~~~~~~~~~ ^
   arch/riscv/include/asm/mmio.h:93:76: note: expanded from macro 'writel_cpu'
   #define writel_cpu(v, c)        ((void)__raw_writel((__force u32)cpu_to_le32(v), (c)))
                                                                                     ^
   In file included from net/mac80211/spectmgmt.c:15:
   In file included from include/linux/ieee80211.h:19:
   In file included from include/linux/if_ether.h:19:
   In file included from include/linux/skbuff.h:31:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/riscv/include/asm/io.h:148:
   include/asm-generic/io.h:1017:55: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
                                                     ~~~~~~~~~~ ^
>> net/mac80211/spectmgmt.c:22:30: warning: no previous prototype for function 'ieee80211_vht_get_actual_chwidth' [-Wmissing-prototypes]
   enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
                                ^
   net/mac80211/spectmgmt.c:22:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
   ^
   static 
>> net/mac80211/spectmgmt.c:49:1: warning: no previous prototype for function 'ieee80211_get_center_freq_seg1_location' [-Wmissing-prototypes]
   ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
   ^
   net/mac80211/spectmgmt.c:48:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   enum ieee80211_center_freq_seg1_location
   ^
   static 
   9 warnings generated.

vim +/ieee80211_vht_get_actual_chwidth +22 net/mac80211/spectmgmt.c

    21	
  > 22	enum ieee80211_vht_chanwidth ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
    23								      u32 seg0,
    24								      u32 seg1)
    25	{
    26		enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
    27	
    28		if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
    29			return vht_oper_bw;
    30	
    31		if (!seg1) {
    32			return IEEE80211_VHT_CHANWIDTH_80MHZ;
    33		} else {
    34			int diff;
    35	
    36			diff = abs((int) seg0 - (int) seg1);
    37	
    38			if (diff == 8)
    39				return IEEE80211_VHT_CHANWIDTH_160MHZ;
    40	
    41			if (diff > 16)
    42				return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
    43		}
    44	
    45		return ret;
    46	}
    47	
    48	enum ieee80211_center_freq_seg1_location
  > 49	ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
    50						u32 vht_cap_info,
    51						u8 actual_chanwidth)
    52	{
    53		u8 ext_nss_bw_supp = (vht_cap_info &
    54				      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
    55				      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
    56		u8 supp_chwidth = (vht_cap_info &
    57				   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
    58				   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
    59		enum ieee80211_center_freq_seg1_location res =
    60						IEEE80211_CENTER_FREQ_SEG1_NONE;
    61	
    62		/* The bandwidth is less than 80+80/160MHz */
    63		if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
    64			return IEEE80211_CENTER_FREQ_SEG1_NONE;
    65	
    66		switch (supp_chwidth) {
    67		case 0:
    68			if ((ext_nss_bw_supp > 1) ||
    69			    ((ext_nss_bw_supp == 1) &&
    70			     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
    71				res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
    72			break;
    73		case 1:
    74			if ((ext_nss_bw_supp > 2) ||
    75			    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
    76				res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER; /* CCFS1 */
    77			else if (ext_nss_bw_supp > 0)
    78				res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER; /* CCFS2 */
    79			break;
    80		case 2:
    81			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
    82			if ((ext_nss_bw_supp > 0) && (ext_nss_bw_supp < 3))
    83				sdata_info(sdata,
    84					   "Invalid ext_nss_bw_supp %u for chwidth 2",
    85					   ext_nss_bw_supp);
    86			break;
    87		default:
    88			break;
    89		}
    90	
    91		return res;
    92	}
    93	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 29851 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-12 14:18 [PATCH] mac80211: 160MHz support per IEEE802.11ax standard Shay Bar
  2020-10-12 16:44 ` kernel test robot
  2020-10-12 17:08 ` kernel test robot
@ 2020-10-19  6:39 ` Shay Bar
  2020-10-19 13:26   ` [PATCH v3 v3] " Shay Bar
  2020-12-11 12:28   ` [PATCH v2] mac80211: 160MHz support per IEEE802.11ax standard Johannes Berg
  2 siblings, 2 replies; 14+ messages in thread
From: Shay Bar @ 2020-10-19  6:39 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, Aviad.Brikman, eliav.farber, Aviad Brikman

According to the new IEEE802.11ax standard center frequency of the 160MHz
should be published in segment2 field of HT operation IE when using EXT NSS
(when supporting smaller number of NSS in VHT in 160MHz BW).
This patch adds the required support to mac80211, cfg80211 to parse it properly
according to the new style as appears in the new standard.

According to the new style, the AP should publish that its bw is 80MHz and not
160MHz.
A STA should conclude that an AP is working in 160MHz if it publishes
the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
or seg2 field of HT operation IE.

A little about the old/new style of the channel/bandwidth publish in beacons:

- In the old style bandwidth of 160MHz and center frequency segment 0 are
  published in vht/he operation information element, while the center_freq_seg0
  indicates the center frequency of 160MHz.
- According to the new style, bandwidth of 80MHz is published and also the
  following:
    * If the supported number of VHT NSS in 160MHz is at least max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 indicates the center frequency of 160MHz.
    * If the supported number of VHT NSS in 160MHz is less than max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 is 0. The center frequency of 160MHz is published in HT
      operation information element instead.

Signed-off-by: Aviad Brikman <aviad.brikman@celeno.com>
Signed-off-by: Shay Bar <shay.bar@celeno.com>
---
 include/linux/ieee80211.h |  15 ++++++
 net/mac80211/spectmgmt.c  | 100 +++++++++++++++++++++++++++++++++++---
 net/wireless/nl80211.c    |  15 ++++++
 3 files changed, 124 insertions(+), 6 deletions(-)

diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 770408b2fdaf..768285b143a3 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1748,6 +1748,21 @@ enum ieee80211_vht_chanwidth {
 	IEEE80211_VHT_CHANWIDTH_80P80MHZ	= 3,
 };
 
+/**
+ * enum ieee80211_center_freq_seg1_location - the location of center
+ * frequency segment1
+ * @IEEE80211_CENTER_FREQ_SEG1_NONE: center freq seg1 is located no where
+ * @IEEE80211_CENTER_FREQ_SEG1_VHT_OPER: center freq seg1 is located in VHT
+ * operation IE
+ * @IEEE80211_CENTER_FREQ_SEG1_HT_OPER: center freq seg1 is located in HT
+ * operation IE
+ */
+enum ieee80211_center_freq_seg1 {
+	IEEE80211_CENTER_FREQ_SEG1_NONE		= 0,
+	IEEE80211_CENTER_FREQ_SEG1_VHT_OPER	= 1,
+	IEEE80211_CENTER_FREQ_SEG1_HT_OPER	= 2,
+};
+
 /**
  * struct ieee80211_vht_operation - VHT operation IE
  *
diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index ae1cb2c68722..d03763c8b648 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -19,6 +19,81 @@
 #include "sta_info.h"
 #include "wme.h"
 
+static enum ieee80211_vht_chanwidth
+ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
+				 u32 seg0,
+				 u32 seg1)
+{
+	enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
+
+	if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
+		return vht_oper_bw;
+
+	if (!seg1) {
+		return IEEE80211_VHT_CHANWIDTH_80MHZ;
+	} else {
+		int diff;
+
+		diff = abs((int) seg0 - (int) seg1);
+
+		if (diff == 8)
+			return IEEE80211_VHT_CHANWIDTH_160MHZ;
+
+		if (diff > 16)
+			return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
+	}
+
+	return ret;
+}
+
+static enum ieee80211_center_freq_seg1
+ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
+					u32 vht_cap_info,
+					u8 actual_chanwidth)
+{
+	u8 ext_nss_bw = (vht_cap_info &
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
+	u8 supp_chwidth = (vht_cap_info &
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
+	enum ieee80211_center_freq_seg1 res =
+					IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	/* The bandwidth is less than 80+80/160MHz */
+	if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
+		return IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	switch (supp_chwidth) {
+	case 0:
+		if ((ext_nss_bw > 1) ||
+		    ((ext_nss_bw == 1) &&
+		     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
+			/* CCFS2 */
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;
+		break;
+	case 1:
+		if ((ext_nss_bw > 2) ||
+		    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
+			/* CCFS1 */
+			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
+		else if (ext_nss_bw > 0)
+			/* CCFS2 */
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;
+		break;
+	case 2:
+		res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
+		if ((ext_nss_bw > 0) && (ext_nss_bw < 3))
+			sdata_info(sdata,
+				   "Invalid ext_nss_bw %u\n", ext_nss_bw);
+		break;
+	default:
+		break;
+	}
+
+	return res;
+}
+
 int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 				 struct ieee802_11_elems *elems,
 				 enum nl80211_band current_band,
@@ -133,17 +208,30 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 	}
 
 	if (wide_bw_chansw_ie) {
+		u8 new_channel_width = wide_bw_chansw_ie->new_channel_width;
+		u8 new_seg0 = wide_bw_chansw_ie->new_center_freq_seg0;
+		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
+		enum ieee80211_vht_chanwidth act_chanwidth =
+			ieee80211_vht_get_actual_chwidth(
+			 new_channel_width, new_seg0, new_seg1);
+		enum ieee80211_center_freq_seg1 seg1_location =
+			ieee80211_get_center_freq_seg1_location(sdata,
+								vht_cap_info,
+								act_chanwidth);
 		struct ieee80211_vht_operation vht_oper = {
-			.chan_width =
-				wide_bw_chansw_ie->new_channel_width,
-			.center_freq_seg0_idx =
-				wide_bw_chansw_ie->new_center_freq_seg0,
-			.center_freq_seg1_idx =
-				wide_bw_chansw_ie->new_center_freq_seg1,
+			.chan_width = new_channel_width,
+			.center_freq_seg0_idx = new_seg0,
 			/* .basic_mcs_set doesn't matter */
 		};
 		struct ieee80211_ht_operation ht_oper = {};
 
+		if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_VHT_OPER)
+			vht_oper.center_freq_seg1_idx = new_seg1;
+		else if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_HT_OPER)
+			ht_oper.operation_mode =
+					(le16_to_cpu(new_seg1) <<
+					 IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
+
 		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
 		 * to the previously parsed chandef
 		 */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 554796a6c6fe..690a5a382d94 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2976,6 +2976,21 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
 		chandef->edmg.channels = 0;
 	}
 
+	if (chandef->width == NL80211_CHAN_WIDTH_80) {
+		if (chandef->center_freq2) {
+			int diff = abs(chandef->center_freq1 -
+				       chandef->center_freq2);
+
+			if (diff == 40)
+				chandef->width = NL80211_CHAN_WIDTH_160;
+			else if (diff > 80)
+				chandef->width = NL80211_CHAN_WIDTH_80P80;
+
+			chandef->center_freq1 = chandef->center_freq2;
+			chandef->center_freq2 = 0;
+		}
+	}
+
 	if (!cfg80211_chandef_valid(chandef)) {
 		NL_SET_ERR_MSG(extack, "invalid channel definition");
 		return -EINVAL;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-19  6:39 ` [PATCH v2] " Shay Bar
@ 2020-10-19 13:26   ` Shay Bar
  2020-11-06 10:35     ` Johannes Berg
  2020-12-21 14:14     ` [PATCH] mac80211: 160Mhz with extended NSS BW in CSA Shay Bar
  2020-12-11 12:28   ` [PATCH v2] mac80211: 160MHz support per IEEE802.11ax standard Johannes Berg
  1 sibling, 2 replies; 14+ messages in thread
From: Shay Bar @ 2020-10-19 13:26 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber

According to the new IEEE802.11ax standard center frequency of the 160MHz
should be published in segment2 field of HT operation IE when using EXT NSS
(when supporting smaller number of NSS in VHT in 160MHz BW).
This patch adds the required support to mac80211, cfg80211 to parse it properly
according to the new style as appears in the new standard.

According to the new style, the AP should publish that its bw is 80MHz and not
160MHz.
A STA should conclude that an AP is working in 160MHz if it publishes
the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
or seg2 field of HT operation IE.

A little about the old/new style of the channel/bandwidth publish in beacons:

- In the old style bandwidth of 160MHz and center frequency segment 0 are
  published in vht/he operation information element, while the center_freq_seg0
  indicates the center frequency of 160MHz.
- According to the new style, bandwidth of 80MHz is published and also the
  following:
    * If the supported number of VHT NSS in 160MHz is at least max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 indicates the center frequency of 160MHz.
    * If the supported number of VHT NSS in 160MHz is less than max VHT NSS
      support, then center_freq_seg0 indicates the center frequency of 80MHz and
      center_freq_seg1 is 0. The center frequency of 160MHz is published in HT
      operation information element instead.

Signed-off-by: Aviad Brikman <aviad.brikman@celeno.com>
Signed-off-by: Shay Bar <shay.bar@celeno.com>
---
 include/linux/ieee80211.h | 15 ++++++
 net/mac80211/spectmgmt.c  | 99 ++++++++++++++++++++++++++++++++++++---
 net/wireless/nl80211.c    | 15 ++++++
 3 files changed, 123 insertions(+), 6 deletions(-)

diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 770408b2fdaf..768285b143a3 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1748,6 +1748,21 @@ enum ieee80211_vht_chanwidth {
 	IEEE80211_VHT_CHANWIDTH_80P80MHZ	= 3,
 };
 
+/**
+ * enum ieee80211_center_freq_seg1_location - the location of center
+ * frequency segment1
+ * @IEEE80211_CENTER_FREQ_SEG1_NONE: center freq seg1 is located no where
+ * @IEEE80211_CENTER_FREQ_SEG1_VHT_OPER: center freq seg1 is located in VHT
+ * operation IE
+ * @IEEE80211_CENTER_FREQ_SEG1_HT_OPER: center freq seg1 is located in HT
+ * operation IE
+ */
+enum ieee80211_center_freq_seg1 {
+	IEEE80211_CENTER_FREQ_SEG1_NONE		= 0,
+	IEEE80211_CENTER_FREQ_SEG1_VHT_OPER	= 1,
+	IEEE80211_CENTER_FREQ_SEG1_HT_OPER	= 2,
+};
+
 /**
  * struct ieee80211_vht_operation - VHT operation IE
  *
diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index ae1cb2c68722..569b9e9d1228 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -19,6 +19,81 @@
 #include "sta_info.h"
 #include "wme.h"
 
+static enum ieee80211_vht_chanwidth
+ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
+				 u8 seg0,
+				 u8 seg1)
+{
+	enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
+
+	if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
+		return vht_oper_bw;
+
+	if (!seg1) {
+		return IEEE80211_VHT_CHANWIDTH_80MHZ;
+	} else {
+		int diff;
+
+		diff = abs((int) seg0 - (int) seg1);
+
+		if (diff == 8)
+			return IEEE80211_VHT_CHANWIDTH_160MHZ;
+
+		if (diff > 16)
+			return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
+	}
+
+	return ret;
+}
+
+static enum ieee80211_center_freq_seg1
+ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
+					u32 vht_cap_info,
+					u8 actual_chanwidth)
+{
+	u8 ext_nss_bw = (vht_cap_info &
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
+			      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
+	u8 supp_chwidth = (vht_cap_info &
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
+			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;
+	enum ieee80211_center_freq_seg1 res =
+					IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	/* The bandwidth is less than 80+80/160MHz */
+	if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
+		return IEEE80211_CENTER_FREQ_SEG1_NONE;
+
+	switch (supp_chwidth) {
+	case 0:
+		if ((ext_nss_bw > 1) ||
+		    ((ext_nss_bw == 1) &&
+		     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
+			/* CCFS2 */
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;
+		break;
+	case 1:
+		if ((ext_nss_bw > 2) ||
+		    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
+			/* CCFS1 */
+			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
+		else if (ext_nss_bw > 0)
+			/* CCFS2 */
+			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;
+		break;
+	case 2:
+		res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
+		if ((ext_nss_bw > 0) && (ext_nss_bw < 3))
+			sdata_info(sdata,
+				   "Invalid ext_nss_bw %u\n", ext_nss_bw);
+		break;
+	default:
+		break;
+	}
+
+	return res;
+}
+
 int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 				 struct ieee802_11_elems *elems,
 				 enum nl80211_band current_band,
@@ -133,17 +208,29 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 	}
 
 	if (wide_bw_chansw_ie) {
+		u8 new_channel_width = wide_bw_chansw_ie->new_channel_width;
+		u8 new_seg0 = wide_bw_chansw_ie->new_center_freq_seg0;
+		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
+		enum ieee80211_vht_chanwidth act_chanwidth =
+			ieee80211_vht_get_actual_chwidth(new_channel_width,
+							 new_seg0, new_seg1);
+		enum ieee80211_center_freq_seg1 seg1_location =
+			ieee80211_get_center_freq_seg1_location(sdata,
+								vht_cap_info,
+								act_chanwidth);
 		struct ieee80211_vht_operation vht_oper = {
-			.chan_width =
-				wide_bw_chansw_ie->new_channel_width,
-			.center_freq_seg0_idx =
-				wide_bw_chansw_ie->new_center_freq_seg0,
-			.center_freq_seg1_idx =
-				wide_bw_chansw_ie->new_center_freq_seg1,
+			.chan_width = new_channel_width,
+			.center_freq_seg0_idx = new_seg0,
 			/* .basic_mcs_set doesn't matter */
 		};
 		struct ieee80211_ht_operation ht_oper = {};
 
+		if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_VHT_OPER)
+			vht_oper.center_freq_seg1_idx = new_seg1;
+		else if (seg1_location == IEEE80211_CENTER_FREQ_SEG1_HT_OPER)
+			ht_oper.operation_mode = (new_seg1 <<
+					 IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
+
 		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
 		 * to the previously parsed chandef
 		 */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 554796a6c6fe..690a5a382d94 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2976,6 +2976,21 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
 		chandef->edmg.channels = 0;
 	}
 
+	if (chandef->width == NL80211_CHAN_WIDTH_80) {
+		if (chandef->center_freq2) {
+			int diff = abs(chandef->center_freq1 -
+				       chandef->center_freq2);
+
+			if (diff == 40)
+				chandef->width = NL80211_CHAN_WIDTH_160;
+			else if (diff > 80)
+				chandef->width = NL80211_CHAN_WIDTH_80P80;
+
+			chandef->center_freq1 = chandef->center_freq2;
+			chandef->center_freq2 = 0;
+		}
+	}
+
 	if (!cfg80211_chandef_valid(chandef)) {
 		NL_SET_ERR_MSG(extack, "invalid channel definition");
 		return -EINVAL;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-19 13:26   ` [PATCH v3 v3] " Shay Bar
@ 2020-11-06 10:35     ` Johannes Berg
  2020-11-08  8:11       ` Shay Bar
  2020-12-21 14:14     ` [PATCH] mac80211: 160Mhz with extended NSS BW in CSA Shay Bar
  1 sibling, 1 reply; 14+ messages in thread
From: Johannes Berg @ 2020-11-06 10:35 UTC (permalink / raw)
  To: Shay Bar; +Cc: linux-wireless, aviad.brikman, eliav.farber

On Mon, 2020-10-19 at 16:26 +0300, Shay Bar wrote:
> According to the new IEEE802.11ax standard center frequency of the 160MHz
> should be published in segment2 field of HT operation IE when using EXT NSS
> (when supporting smaller number of NSS in VHT in 160MHz BW).
> This patch adds the required support to mac80211, cfg80211 to parse it properly
> according to the new style as appears in the new standard.
> 
> According to the new style, the AP should publish that its bw is 80MHz and not
> 160MHz.
> A STA should conclude that an AP is working in 160MHz if it publishes
> the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
> or seg2 field of HT operation IE.

Is this referring to D6.2 Table 26-9 "Setting of the VHT Channel Width
and VHT NSS at an HE STA transmitting the OM Control subfield"?

If so, then what does the part of "at an HE STA transmitting the OM
Control subfield" do? Do we need to check it? That doesn't sound like we
should apply any changed logic to normal VHT STAs?

johannes


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-11-06 10:35     ` Johannes Berg
@ 2020-11-08  8:11       ` Shay Bar
  2020-11-13  9:04         ` Johannes Berg
  0 siblings, 1 reply; 14+ messages in thread
From: Shay Bar @ 2020-11-08  8:11 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber


On 06/11/2020 12:35, Johannes Berg wrote:
> External Email
>
>
> On Mon, 2020-10-19 at 16:26 +0300, Shay Bar wrote:
>> According to the new IEEE802.11ax standard center frequency of the 160MHz
>> should be published in segment2 field of HT operation IE when using EXT NSS
>> (when supporting smaller number of NSS in VHT in 160MHz BW).
>> This patch adds the required support to mac80211, cfg80211 to parse it properly
>> according to the new style as appears in the new standard.
>>
>> According to the new style, the AP should publish that its bw is 80MHz and not
>> 160MHz.
>> A STA should conclude that an AP is working in 160MHz if it publishes
>> the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
>> or seg2 field of HT operation IE.
> Is this referring to D6.2 Table 26-9 "Setting of the VHT Channel Width
> and VHT NSS at an HE STA transmitting the OM Control subfield"?

No, it is referring to IEEE P802.11-REVmd™/D5.0, September 2020 Table 
9-81- "Setting of the Channel Width subfield and 160/80+80 BW subfield 
at a VHT STA transmitting the Operating Mode field" (where it doesn't 
refer to OM)

The nl80211.c change is also described in the first 3 rows of Table 
9-274 "VHT Operation Information subfields".


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-11-08  8:11       ` Shay Bar
@ 2020-11-13  9:04         ` Johannes Berg
  2020-11-15  8:57           ` Shay Bar
  0 siblings, 1 reply; 14+ messages in thread
From: Johannes Berg @ 2020-11-13  9:04 UTC (permalink / raw)
  To: Shay Bar; +Cc: linux-wireless, aviad.brikman, eliav.farber

On Sun, 2020-11-08 at 10:11 +0200, Shay Bar wrote:
> On 06/11/2020 12:35, Johannes Berg wrote:
> > External Email
> > 
> > 
> > On Mon, 2020-10-19 at 16:26 +0300, Shay Bar wrote:
> > > According to the new IEEE802.11ax standard center frequency of the 160MHz
> > > should be published in segment2 field of HT operation IE when using EXT NSS
> > > (when supporting smaller number of NSS in VHT in 160MHz BW).

> No, it is referring to IEEE P802.11-REVmd™/D5.0, September 2020 Table 
> 9-81- "Setting of the Channel Width subfield and 160/80+80 BW subfield 
> at a VHT STA transmitting the Operating Mode field" (where it doesn't 
> refer to OM)

But you said above "according to the new IEEE802.11ax"? I guess that
confuses me.

Or did D5.0 incorporate 802.11ax? But that seems unlikely, 802.11ax D8.0
was still in circulation until yesterday, i.e. after you sent the patch?

> The nl80211.c change is also described in the first 3 rows of Table 
> 9-274 "VHT Operation Information subfields".

OK, thanks, I'll have to check that out.

johannes


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-11-13  9:04         ` Johannes Berg
@ 2020-11-15  8:57           ` Shay Bar
  2020-12-11 12:22             ` Johannes Berg
  0 siblings, 1 reply; 14+ messages in thread
From: Shay Bar @ 2020-11-15  8:57 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber

On 13/11/2020 11:04, Johannes Berg wrote:
> On Sun, 2020-11-08 at 10:11 +0200, Shay Bar wrote:
>> On 06/11/2020 12:35, Johannes Berg wrote:
>>> On Mon, 2020-10-19 at 16:26 +0300, Shay Bar wrote:
>>>> According to the new IEEE802.11ax standard center frequency of the 160MHz
>>>> should be published in segment2 field of HT operation IE when using EXT NSS
>>>> (when supporting smaller number of NSS in VHT in 160MHz BW).
>> No, it is referring to IEEE P802.11-REVmd™/D5.0, September 2020 Table
>> 9-81- "Setting of the Channel Width subfield and 160/80+80 BW subfield
>> at a VHT STA transmitting the Operating Mode field" (where it doesn't
>> refer to OM)
> But you said above "according to the new IEEE802.11ax"? I guess that
> confuses me.
>
> Or did D5.0 incorporate 802.11ax? But that seems unlikely, 802.11ax D8.0
> was still in circulation until yesterday, i.e. after you sent the patch?

"Setting of the VHT Channel Width and VHT NSS at an HE STA transmitting 
the OM Control subfield" table in the 802.11ax D* files is identical to 
the "Setting of the Channel Width subfield and 160/80+80 BW subfield at 
a VHT STA transmitting the Operating Mode field" table in the Draft 
P802.11REVmd_D* files.

This is the source of confusion, sorry :)

>> The nl80211.c change is also described in the first 3 rows of Table
>> 9-274 "VHT Operation Information subfields".
> OK, thanks, I'll have to check that out.
Thanks.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-11-15  8:57           ` Shay Bar
@ 2020-12-11 12:22             ` Johannes Berg
  2020-12-21 14:25               ` Shay Bar
  0 siblings, 1 reply; 14+ messages in thread
From: Johannes Berg @ 2020-12-11 12:22 UTC (permalink / raw)
  To: Shay Bar; +Cc: linux-wireless, aviad.brikman, eliav.farber

On Sun, 2020-11-15 at 10:57 +0200, Shay Bar wrote:
> 
> This is the source of confusion, sorry :)

Actually, the confusion is that you said "160 MHz support" ... and you
really only meant "160 MHz in extended channel switch" :-)

I'll respond to the patch also again.

johannes


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2] mac80211: 160MHz support per IEEE802.11ax standard
  2020-10-19  6:39 ` [PATCH v2] " Shay Bar
  2020-10-19 13:26   ` [PATCH v3 v3] " Shay Bar
@ 2020-12-11 12:28   ` Johannes Berg
  1 sibling, 0 replies; 14+ messages in thread
From: Johannes Berg @ 2020-12-11 12:28 UTC (permalink / raw)
  To: Shay Bar; +Cc: linux-wireless, Aviad.Brikman, eliav.farber

On Mon, 2020-10-19 at 09:39 +0300, Shay Bar wrote:
> According to the new IEEE802.11ax standard center frequency of the 160MHz
> should be published in segment2 field of HT operation IE when using EXT NSS
> (when supporting smaller number of NSS in VHT in 160MHz BW).
> This patch adds the required support to mac80211, cfg80211 to parse it properly
> according to the new style as appears in the new standard.
> 
> According to the new style, the AP should publish that its bw is 80MHz and not
> 160MHz.
> A STA should conclude that an AP is working in 160MHz if it publishes
> the center frequency of the 160MHz bandwidth in seg1 field of VHT operation IE
> or seg2 field of HT operation IE.
> 
> A little about the old/new style of the channel/bandwidth publish in beacons:
> 
> - In the old style bandwidth of 160MHz and center frequency segment 0 are
>   published in vht/he operation information element, while the center_freq_seg0
>   indicates the center frequency of 160MHz.
> - According to the new style, bandwidth of 80MHz is published and also the
>   following:
>     * If the supported number of VHT NSS in 160MHz is at least max VHT NSS
>       support, then center_freq_seg0 indicates the center frequency of 80MHz and
>       center_freq_seg1 indicates the center frequency of 160MHz.
>     * If the supported number of VHT NSS in 160MHz is less than max VHT NSS
>       support, then center_freq_seg0 indicates the center frequency of 80MHz and
>       center_freq_seg1 is 0. The center frequency of 160MHz is published in HT
>       operation information element instead.


All of that is nice, but basically we already covered it ...

Seems like perhaps you rebased this patch and dropped the bits that we
already had upstream now/later, but we don't have the CSA pieces, and
then you didn't update the commit message? :-)

> +/**
> + * enum ieee80211_center_freq_seg1_location - the location of center
> + * frequency segment1
> + * @IEEE80211_CENTER_FREQ_SEG1_NONE: center freq seg1 is located no where
> + * @IEEE80211_CENTER_FREQ_SEG1_VHT_OPER: center freq seg1 is located in VHT
> + * operation IE
> + * @IEEE80211_CENTER_FREQ_SEG1_HT_OPER: center freq seg1 is located in HT
> + * operation IE

please use tabs at the beginning of continued documentation lines

> +static enum ieee80211_vht_chanwidth
> +ieee80211_vht_get_actual_chwidth(u8 vht_oper_bw,
> +				 u32 seg0,
> +				 u32 seg1)

the parameters all fit on one line

> +{
> +	enum ieee80211_vht_chanwidth ret = IEEE80211_VHT_CHANWIDTH_USE_HT;
> +
> +	if (vht_oper_bw != IEEE80211_VHT_CHANWIDTH_80MHZ)
> +		return vht_oper_bw;
> +
> +	if (!seg1) {
> +		return IEEE80211_VHT_CHANWIDTH_80MHZ;
> +	} else {
> +		int diff;
> +
> +		diff = abs((int) seg0 - (int) seg1);
> +
> +		if (diff == 8)
> +			return IEEE80211_VHT_CHANWIDTH_160MHZ;
> +
> +		if (diff > 16)
> +			return IEEE80211_VHT_CHANWIDTH_80P80MHZ;
> +	}
> +
> +	return ret;

You can remove the 'ret' variable, and having "else" after "return" is
also pointless.

Easier to just do a chain of ifs, and return
IEEE80211_VHT_CHANWIDTH_USE_HT at the end.

> +}
> +
> +static enum ieee80211_center_freq_seg1
> +ieee80211_get_center_freq_seg1_location(struct ieee80211_sub_if_data *sdata,
> +					u32 vht_cap_info,
> +					u8 actual_chanwidth)
> +{
> +	u8 ext_nss_bw = (vht_cap_info &
> +			      IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
> +			      IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT;
> +	u8 supp_chwidth = (vht_cap_info &
> +			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) >>
> +			   IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT;


please use the include/bitfield.h helpers, specifically u32_get_bits().

> +	enum ieee80211_center_freq_seg1 res =
> +					IEEE80211_CENTER_FREQ_SEG1_NONE;
> +
> +	/* The bandwidth is less than 80+80/160MHz */
> +	if (actual_chanwidth < IEEE80211_VHT_CHANWIDTH_160MHZ)
> +		return IEEE80211_CENTER_FREQ_SEG1_NONE;
> +
> +	switch (supp_chwidth) {
> +	case 0:
> +		if ((ext_nss_bw > 1) ||
> +		    ((ext_nss_bw == 1) &&
> +		     (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ)))
> +			/* CCFS2 */
> +			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;

You can also just return here and get rid of the 'res' variable.

> +		break;
> +	case 1:
> +		if ((ext_nss_bw > 2) ||
> +		    (actual_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ))
> +			/* CCFS1 */
> +			res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
> +		else if (ext_nss_bw > 0)
> +			/* CCFS2 */
> +			res = IEEE80211_CENTER_FREQ_SEG1_HT_OPER;
> +		break;
> +	case 2:
> +		res = IEEE80211_CENTER_FREQ_SEG1_VHT_OPER;
> +		if ((ext_nss_bw > 0) && (ext_nss_bw < 3))
> +			sdata_info(sdata,
> +				   "Invalid ext_nss_bw %u\n", ext_nss_bw);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return res;
> +}

Maybe that could reuse some code from ieee80211_chandef_vht_oper()?
Seems very similar? Or refactor some of it?

> +++ b/net/wireless/nl80211.c
> @@ -2976,6 +2976,21 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
>  		chandef->edmg.channels = 0;
>  	}
>  
> +	if (chandef->width == NL80211_CHAN_WIDTH_80) {
> +		if (chandef->center_freq2) {
> +			int diff = abs(chandef->center_freq1 -
> +				       chandef->center_freq2);
> +
> +			if (diff == 40)
> +				chandef->width = NL80211_CHAN_WIDTH_160;
> +			else if (diff > 80)
> +				chandef->width = NL80211_CHAN_WIDTH_80P80;
> +
> +			chandef->center_freq1 = chandef->center_freq2;
> +			chandef->center_freq2 = 0;
> +		}
> +	}

This doesn't seem appropriate at all, why would we possibly want to do
such a backward compat workaround in the *nl80211* API??

_If_ there's a good reason for it, it needs to come in a separate patch,
but I really don't see it.

johannes


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH] mac80211: 160Mhz with extended NSS BW in CSA
  2020-10-19 13:26   ` [PATCH v3 v3] " Shay Bar
  2020-11-06 10:35     ` Johannes Berg
@ 2020-12-21 14:14     ` Shay Bar
  2020-12-22  6:47       ` Shay Bar
  1 sibling, 1 reply; 14+ messages in thread
From: Shay Bar @ 2020-12-21 14:14 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber

Upon receiving CSA with 160Mhz extended NSS BW from associated AP,
STA should set the HT operation_mode based on new_center_freq_seg1
because it is later used as ccfs2 in ieee80211_chandef_vht_oper().

Signed-off-by: Aviad Brikman <aviad.brikman@celeno.com>
Signed-off-by: Shay Bar <shay.bar@celeno.com>
---
 net/mac80211/spectmgmt.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index ae1cb2c68722..c235ddceb835 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -133,16 +133,19 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 	}
 
 	if (wide_bw_chansw_ie) {
+		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
 		struct ieee80211_vht_operation vht_oper = {
 			.chan_width =
 				wide_bw_chansw_ie->new_channel_width,
 			.center_freq_seg0_idx =
 				wide_bw_chansw_ie->new_center_freq_seg0,
-			.center_freq_seg1_idx =
-				wide_bw_chansw_ie->new_center_freq_seg1,
+			.center_freq_seg1_idx = new_seg1,
 			/* .basic_mcs_set doesn't matter */
 		};
-		struct ieee80211_ht_operation ht_oper = {};
+		struct ieee80211_ht_operation ht_oper = {
+			.operation_mode = (le16_to_cpu(new_seg1) <<
+					   IEEE80211_HT_OP_MODE_CCFS2_SHIFT),
+		};
 
 		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
 		 * to the previously parsed chandef
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 v3] mac80211: 160MHz support per IEEE802.11ax standard
  2020-12-11 12:22             ` Johannes Berg
@ 2020-12-21 14:25               ` Shay Bar
  0 siblings, 0 replies; 14+ messages in thread
From: Shay Bar @ 2020-12-21 14:25 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber

Hi Johannes,

I published a new (short) patch for 160Mhz with extended NSS BW in CSA

Message-Id: <20201221141441.17613-1-shay.bar@celeno.com>

I will discard the previous patches.

Thanks,

Shay Bar.

On 11/12/2020 14:22, Johannes Berg wrote:
> On Sun, 2020-11-15 at 10:57 +0200, Shay Bar wrote:
>> This is the source of confusion, sorry :)
> Actually, the confusion is that you said "160 MHz support" ... and you
> really only meant "160 MHz in extended channel switch" :-)
>
> I'll respond to the patch also again.
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH] mac80211: 160Mhz with extended NSS BW in CSA
  2020-12-21 14:14     ` [PATCH] mac80211: 160Mhz with extended NSS BW in CSA Shay Bar
@ 2020-12-22  6:47       ` Shay Bar
  0 siblings, 0 replies; 14+ messages in thread
From: Shay Bar @ 2020-12-22  6:47 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, aviad.brikman, eliav.farber

Upon receiving CSA with 160Mhz extended NSS BW from associated AP,
STA should set the HT operation_mode based on new_center_freq_seg1
because it is later used as ccfs2 in ieee80211_chandef_vht_oper().

Signed-off-by: Aviad Brikman <aviad.brikman@celeno.com>
Signed-off-by: Shay Bar <shay.bar@celeno.com>
---
 net/mac80211/spectmgmt.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
index ae1cb2c68722..9acbf5fab542 100644
--- a/net/mac80211/spectmgmt.c
+++ b/net/mac80211/spectmgmt.c
@@ -133,16 +133,18 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
 	}
 
 	if (wide_bw_chansw_ie) {
+		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
 		struct ieee80211_vht_operation vht_oper = {
 			.chan_width =
 				wide_bw_chansw_ie->new_channel_width,
 			.center_freq_seg0_idx =
 				wide_bw_chansw_ie->new_center_freq_seg0,
-			.center_freq_seg1_idx =
-				wide_bw_chansw_ie->new_center_freq_seg1,
+			.center_freq_seg1_idx = new_seg1,
 			/* .basic_mcs_set doesn't matter */
 		};
-		struct ieee80211_ht_operation ht_oper = {};
+		struct ieee80211_ht_operation ht_oper = {
+			.operation_mode = (new_seg1 << IEEE80211_HT_OP_MODE_CCFS2_SHIFT),
+		};
 
 		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
 		 * to the previously parsed chandef
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2020-12-22  6:48 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-12 14:18 [PATCH] mac80211: 160MHz support per IEEE802.11ax standard Shay Bar
2020-10-12 16:44 ` kernel test robot
2020-10-12 17:08 ` kernel test robot
2020-10-19  6:39 ` [PATCH v2] " Shay Bar
2020-10-19 13:26   ` [PATCH v3 v3] " Shay Bar
2020-11-06 10:35     ` Johannes Berg
2020-11-08  8:11       ` Shay Bar
2020-11-13  9:04         ` Johannes Berg
2020-11-15  8:57           ` Shay Bar
2020-12-11 12:22             ` Johannes Berg
2020-12-21 14:25               ` Shay Bar
2020-12-21 14:14     ` [PATCH] mac80211: 160Mhz with extended NSS BW in CSA Shay Bar
2020-12-22  6:47       ` Shay Bar
2020-12-11 12:28   ` [PATCH v2] mac80211: 160MHz support per IEEE802.11ax standard Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).