Search Linux Wireless

[RFC][PATCH] mac80211: fix VHT 160Mhz bandwidth when using extended NSS on PHY with NSS ratio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



A PHY supporting 160Mhz with a reduced number of NSS may not have any
of the IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK bits set.

For exemple, the QCA9984 is 4x4, but can only do 2x2 VHT160 or
80+80. The corresponding VHT capabilities should be:
 - IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK == 0
 - Extended NSS BW == 2

If we use that hardware in AP mode, and a 160Mhz 2x2 STA without NSS
restriction connects to it, then that STA will set
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK to 1.

The usual logic of using bitwise-and with our own capabilities does
not work here, the current code clears the SUPP_CHAN_WIDTH bits and
resolve STA bandwidth to 80Mhz instead of 160Mhz, fix this.

Signed-off-by: Maxime Bizon <mbizon@xxxxxxxxxx>
---
 net/mac80211/vht.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c
index e856f9092137..7ef93adc4f24 100644
--- a/net/mac80211/vht.c
+++ b/net/mac80211/vht.c
@@ -230,9 +230,11 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
 	       sizeof(struct ieee80211_vht_mcs_info));
 
 	/* copy EXT_NSS_BW Support value or remove the capability */
-	if (ieee80211_hw_check(&sdata->local->hw, SUPPORTS_VHT_EXT_NSS_BW))
+	if (ieee80211_hw_check(&sdata->local->hw, SUPPORTS_VHT_EXT_NSS_BW)) {
+		vht_cap->cap |= cap_info &
+			IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
 		vht_cap->cap |= (cap_info & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
-	else
+	} else
 		vht_cap->vht_mcs.tx_highest &=
 			~cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
 
-- 
2.17.1





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux