mac80211: add support for QAM-256 in 2.4GHz 802.11n
Add support for QAM-256 in 2.4GHz 802.11n. This is non-standard and comunicate vht capabilities in 2.4GHz 802.11n permittin, for supported clients, to benefits for additional data rate. Many driver supports this, for a start enable this for ath10k and ath11k.
This commit is contained in:
committed by
Lucas Asvio
parent
290156f351
commit
0073a62855
@@ -0,0 +1,37 @@
|
||||
From 7658e786e6de189f218ba7ed5d8db953cc6cf980 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 14 Jun 2023 09:14:56 +0200
|
||||
Subject: [PATCH 3/4] wifi: ath10k: add support for QAM-256 in 2.4GHz 802.11n
|
||||
|
||||
Ath10k supports non-standard QAM-256 in 2.4GHz in 802.11n. Permit for
|
||||
supported client to benefits from these extra bandwidth by enabling
|
||||
support for it.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath10k/mac.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -2744,9 +2744,9 @@ static void ath10k_peer_assoc_h_phymode(
|
||||
if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
- phymode = MODE_11AC_VHT40;
|
||||
+ phymode = MODE_11AC_VHT40_2G;
|
||||
else
|
||||
- phymode = MODE_11AC_VHT20;
|
||||
+ phymode = MODE_11AC_VHT20_2G;
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
@@ -4996,6 +4996,8 @@ static void ath10k_mac_setup_ht_vht_cap(
|
||||
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
|
||||
band = &ar->mac.sbands[NL80211_BAND_2GHZ];
|
||||
band->ht_cap = ht_cap;
|
||||
+ band->vht_cap = vht_cap;
|
||||
+ band->vht_cap.vendor_qam256_supported = true;
|
||||
}
|
||||
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
|
||||
band = &ar->mac.sbands[NL80211_BAND_5GHZ];
|
||||
@@ -0,0 +1,50 @@
|
||||
From 462b0e7ce7cadef5c14bb16134e43573b169c9b5 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 14 Jun 2023 09:44:29 +0200
|
||||
Subject: [PATCH 4/4] wifi: ath11k: add support for QAM-256 in 2.4GHz 802.11n
|
||||
|
||||
Ath11k supports non-standard QAM-256 in 2.4GHz in 802.11n. Permit for
|
||||
supported client to benefits from these extra bandwidth by enabling
|
||||
support for it.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 7 +++++--
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 2 ++
|
||||
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -2858,9 +2858,9 @@ static void ath11k_peer_assoc_h_phymode(
|
||||
} else if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
- phymode = MODE_11AC_VHT40;
|
||||
+ phymode = MODE_11AC_VHT40_2G;
|
||||
else
|
||||
- phymode = MODE_11AC_VHT20;
|
||||
+ phymode = MODE_11AC_VHT20_2G;
|
||||
} else if (sta->deflink.ht_cap.ht_supported &&
|
||||
!ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
@@ -5490,6 +5490,9 @@ static void ath11k_mac_setup_ht_vht_cap(
|
||||
*ht_cap_info = ht_cap;
|
||||
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
|
||||
rate_cap_rx_chainmask);
|
||||
+ band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
|
||||
+ rate_cap_rx_chainmask);
|
||||
+ band->vht_cap.vendor_qam256_supported = true;
|
||||
}
|
||||
|
||||
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -411,6 +411,8 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(st
|
||||
* handled.
|
||||
*/
|
||||
if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) {
|
||||
+ pdev_cap->vht_cap = mac_phy_caps->vht_cap_info_2g;
|
||||
+ pdev_cap->vht_mcs = mac_phy_caps->vht_supp_mcs_2g;
|
||||
pdev_cap->tx_chain_mask = mac_phy_caps->tx_chain_mask_2g;
|
||||
pdev_cap->rx_chain_mask = mac_phy_caps->rx_chain_mask_2g;
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
From 35040d1f349f2346832ca1ebb408924dbefc1cfc Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 14 Jun 2023 07:15:48 +0200
|
||||
Subject: [PATCH 1/4] mac80211: introduce support for vendor QAM-256 in 2.4GHz
|
||||
802.11n
|
||||
|
||||
Some vendor supports non-standard QAM-256 in 2.4GHz 802.11n mode.
|
||||
The implementation works by comunicating vht capabilities to the client
|
||||
in 2.4GHz 802.11n, the supported client will take this info and
|
||||
benefits from the additional rates of it.
|
||||
|
||||
Each driver needs to enable support for this by enabling the
|
||||
vendor_qam256_supported in the 2G sband struct and add the required
|
||||
capabilities for vht_cap.
|
||||
|
||||
This feature is supported by various vendor with all kind of marketing
|
||||
name, but all of them have in common the use of vht capabilities in
|
||||
2.4GHz 802.11n.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
include/net/cfg80211.h | 2 ++
|
||||
net/mac80211/mlme.c | 14 ++++++++----
|
||||
net/mac80211/util.c | 10 +++++---
|
||||
net/mac80211/vht.c | 52 +++++++++++++++++++++++++++---------------
|
||||
4 files changed, 51 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -357,11 +357,13 @@ struct ieee80211_sta_ht_cap {
|
||||
* to describe 802.11ac VHT capabilities for an STA.
|
||||
*
|
||||
* @vht_supported: is VHT supported by the STA
|
||||
+ * @qam256_supported: is QAM256 supported by the STA
|
||||
* @cap: VHT capabilities map as described in 802.11ac spec
|
||||
* @vht_mcs: Supported VHT MCS rates
|
||||
*/
|
||||
struct ieee80211_sta_vht_cap {
|
||||
bool vht_supported;
|
||||
+ bool vendor_qam256_supported;
|
||||
u32 cap; /* use IEEE80211_VHT_CAP_ */
|
||||
struct ieee80211_vht_mcs_info vht_mcs;
|
||||
};
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -5270,6 +5270,8 @@ ieee80211_determine_our_sta_mode(struct
|
||||
if (sband->band != NL80211_BAND_2GHZ) {
|
||||
conn->mode = IEEE80211_CONN_MODE_VHT;
|
||||
conn->bw_limit = IEEE80211_CONN_BW_LIMIT_160;
|
||||
+ } else if (sband->vht_cap.vendor_qam256_supported) {
|
||||
+ conn->mode = IEEE80211_CONN_MODE_VHT;
|
||||
}
|
||||
|
||||
if (is_5ghz &&
|
||||
--- a/net/mac80211/util.c
|
||||
+++ b/net/mac80211/util.c
|
||||
@@ -1318,7 +1318,9 @@ static int ieee80211_put_preq_ies_band(s
|
||||
break;
|
||||
}
|
||||
|
||||
- if (sband->vht_cap.vht_supported && have_80mhz) {
|
||||
+ if (sband->vht_cap.vht_supported &&
|
||||
+ (have_80mhz ||
|
||||
+ sband->vht_cap.vendor_qam256_supported)) {
|
||||
u8 *pos;
|
||||
|
||||
if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_vht_cap))
|
||||
--- a/net/mac80211/vht.c
|
||||
+++ b/net/mac80211/vht.c
|
||||
@@ -122,7 +122,7 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(stru
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &link_sta->pub->vht_cap;
|
||||
struct ieee80211_sta_vht_cap own_cap;
|
||||
u32 cap_info, i;
|
||||
- bool have_80mhz;
|
||||
+ bool can_vht;
|
||||
u32 mpdu_len;
|
||||
|
||||
memset(vht_cap, 0, sizeof(*vht_cap));
|
||||
@@ -134,17 +134,21 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(stru
|
||||
return;
|
||||
|
||||
/* Allow VHT if at least one channel on the sband supports 80 MHz */
|
||||
- have_80mhz = false;
|
||||
+ can_vht = false;
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
|
||||
IEEE80211_CHAN_NO_80MHZ))
|
||||
continue;
|
||||
|
||||
- have_80mhz = true;
|
||||
+ can_vht = true;
|
||||
break;
|
||||
}
|
||||
|
||||
- if (!have_80mhz)
|
||||
+ /* Some Vendor supports non-standard QAM-256 on 2.4GHz 802.11n */
|
||||
+ if (sband->vht_cap.vendor_qam256_supported)
|
||||
+ can_vht = true;
|
||||
+
|
||||
+ if (!can_vht)
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -359,23 +363,23 @@ _ieee80211_sta_cap_rx_bw(struct link_sta
|
||||
struct ieee80211_sta_vht_cap *vht_cap = &link_sta->pub->vht_cap;
|
||||
struct ieee80211_sta_he_cap *he_cap = &link_sta->pub->he_cap;
|
||||
struct ieee80211_sta_eht_cap *eht_cap = &link_sta->pub->eht_cap;
|
||||
+ enum nl80211_band band;
|
||||
u32 cap_width;
|
||||
|
||||
+ if (chandef) {
|
||||
+ band = chandef->chan->band;
|
||||
+ } else {
|
||||
+ struct ieee80211_bss_conf *link_conf;
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+ link_conf = rcu_dereference(sdata->vif.link_conf[link_id]);
|
||||
+ band = link_conf->chanreq.oper.chan->band;
|
||||
+ rcu_read_unlock();
|
||||
+ }
|
||||
+
|
||||
if (he_cap->has_he) {
|
||||
- enum nl80211_band band;
|
||||
u8 info;
|
||||
|
||||
- if (chandef) {
|
||||
- band = chandef->chan->band;
|
||||
- } else {
|
||||
- struct ieee80211_bss_conf *link_conf;
|
||||
-
|
||||
- rcu_read_lock();
|
||||
- link_conf = rcu_dereference(sdata->vif.link_conf[link_id]);
|
||||
- band = link_conf->chanreq.oper.chan->band;
|
||||
- rcu_read_unlock();
|
||||
- }
|
||||
-
|
||||
if (eht_cap->has_eht && band == NL80211_BAND_6GHZ) {
|
||||
info = eht_cap->eht_cap_elem.phy_cap_info[0];
|
||||
|
||||
@@ -401,7 +405,8 @@ _ieee80211_sta_cap_rx_bw(struct link_sta
|
||||
return IEEE80211_STA_RX_BW_20;
|
||||
}
|
||||
|
||||
- if (!vht_cap->vht_supported)
|
||||
+ if (!vht_cap->vht_supported || (band == NL80211_BAND_2GHZ &&
|
||||
+ vht_cap->vendor_qam256_supported))
|
||||
return link_sta->pub->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
|
||||
IEEE80211_STA_RX_BW_40 :
|
||||
IEEE80211_STA_RX_BW_20;
|
||||
@@ -0,0 +1,32 @@
|
||||
From 793bfa410bd16c273beb390818ab44886c680a22 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 14 Jun 2023 10:20:31 +0200
|
||||
Subject: [PATCH 2/4] mac80211: add logic to skip useless VHT cap check in
|
||||
ieee80211_sta_cap_rx_bw
|
||||
|
||||
Add logic to skip useless VHT cap check in ieee80211_sta_cap_rx_bw in
|
||||
the case where HT doesn't indicate support for 40MHz.
|
||||
|
||||
If the STA doesn't indicate support for 40MHz then it doesn't make sense
|
||||
to check additional support for 80MHz, 80+80MHz or 160MHz
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
---
|
||||
net/mac80211/vht.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/net/mac80211/vht.c
|
||||
+++ b/net/mac80211/vht.c
|
||||
@@ -442,6 +442,12 @@ ieee80211_sta_cap_chan_bw(struct link_st
|
||||
NL80211_CHAN_WIDTH_40 : NL80211_CHAN_WIDTH_20;
|
||||
}
|
||||
|
||||
+ /* Skip checking VHT cap and set to 20MHz if HT cap doesn't indicate
|
||||
+ * support for 40MHz.
|
||||
+ */
|
||||
+ if (!(link_sta->pub->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
||||
+ return NL80211_CHAN_WIDTH_20;
|
||||
+
|
||||
cap_width = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
|
||||
|
||||
if (cap_width == IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
|
||||
Reference in New Issue
Block a user