mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 10:51:27 +00:00
182 lines
6.4 KiB
Diff
182 lines
6.4 KiB
Diff
From 4d49b6c131ff9afd3d40e075e448f9ee6767916a Mon Sep 17 00:00:00 2001
|
|
From: Muna Sinada <quic_msinada@quicinc.com>
|
|
Date: Wed, 30 Jun 2021 12:41:04 -0700
|
|
Subject: [PATCH 07/27] ath12k: adding EHT PHY modes
|
|
|
|
Adding EHT Phy modes that are shared by host and fw. 240 MHz phy mode
|
|
is not defined since it is not defined in 11be spec.
|
|
|
|
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
|
---
|
|
drivers/net/wireless/ath/ath12k/mac.c | 81 ++++++++++++++++++++-------
|
|
drivers/net/wireless/ath/ath12k/wmi.h | 31 +++++++++-
|
|
2 files changed, 90 insertions(+), 22 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
|
@@ -185,32 +185,35 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
|
|
[NL80211_BAND_2GHZ] = {
|
|
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
|
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
|
- [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
|
|
- [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
|
|
- [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
|
|
- [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
|
|
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
|
|
+ [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
|
|
+ [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
|
|
+ [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
|
|
[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
|
|
[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
|
|
+ [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
|
|
},
|
|
[NL80211_BAND_5GHZ] = {
|
|
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
|
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
|
- [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
|
|
- [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
|
|
- [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
|
|
- [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
|
|
- [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
|
|
- [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
|
|
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
|
|
+ [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
|
|
+ [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
|
+ [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
|
+ [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
|
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
|
+ [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
|
},
|
|
[NL80211_BAND_6GHZ] = {
|
|
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
|
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
|
- [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
|
|
- [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
|
|
- [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
|
|
- [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
|
|
- [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
|
|
- [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
|
|
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
|
|
+ [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
|
|
+ [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
|
+ [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
|
+ [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
|
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
|
+ [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
|
},
|
|
|
|
};
|
|
@@ -2180,6 +2183,36 @@ static enum wmi_phy_mode ath12k_mac_get_
|
|
return MODE_UNKNOWN;
|
|
}
|
|
|
|
+static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
|
|
+ struct ieee80211_sta *sta)
|
|
+{
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320)
|
|
+ if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[0] &
|
|
+ IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
|
|
+ return MODE_11BE_EHT320;
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
|
+ if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
|
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
|
+ return MODE_11BE_EHT160;
|
|
+ else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
|
+ IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
|
+ return MODE_11BE_EHT80_80;
|
|
+ /* not sure if this is a valid case? */
|
|
+ return MODE_11BE_EHT160;
|
|
+ }
|
|
+
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
|
+ return MODE_11BE_EHT80;
|
|
+
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
|
+ return MODE_11BE_EHT40;
|
|
+
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
|
+ return MODE_11BE_EHT20;
|
|
+
|
|
+ return MODE_UNKNOWN;
|
|
+}
|
|
+
|
|
static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
|
|
struct ieee80211_vif *vif,
|
|
struct ieee80211_sta *sta,
|
|
@@ -2203,8 +2236,13 @@ static void ath12k_peer_assoc_h_phymode(
|
|
|
|
switch (band) {
|
|
case NL80211_BAND_2GHZ:
|
|
- if (sta->deflink.he_cap.has_he &&
|
|
- !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
|
|
+ if (sta->deflink.eht_cap.has_eht) {
|
|
+ if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
|
+ phymode = MODE_11BE_EHT40_2G;
|
|
+ else
|
|
+ phymode = MODE_11BE_EHT20_2G;
|
|
+ } else if (sta->deflink.he_cap.has_he &&
|
|
+ !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
|
|
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
|
phymode = MODE_11AX_HE80_2G;
|
|
else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
|
@@ -2231,8 +2269,10 @@ static void ath12k_peer_assoc_h_phymode(
|
|
break;
|
|
case NL80211_BAND_5GHZ:
|
|
case NL80211_BAND_6GHZ:
|
|
- /* Check HE first */
|
|
- if (sta->deflink.he_cap.has_he &&
|
|
+ /* Check EHT first */
|
|
+ if (sta->deflink.eht_cap.has_eht) {
|
|
+ phymode = ath12k_mac_get_phymode_eht(ar, sta);
|
|
+ } else if (sta->deflink.he_cap.has_he &&
|
|
!ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
|
|
phymode = ath12k_mac_get_phymode_he(ar, sta);
|
|
} else if (sta->deflink.vht_cap.vht_supported &&
|
|
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
|
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
|
@@ -2758,8 +2758,17 @@ enum wmi_phy_mode {
|
|
MODE_11AX_HE20_2G = 21,
|
|
MODE_11AX_HE40_2G = 22,
|
|
MODE_11AX_HE80_2G = 23,
|
|
- MODE_UNKNOWN = 24,
|
|
- MODE_MAX = 24
|
|
+ MODE_11BE_EHT20 = 24,
|
|
+ MODE_11BE_EHT40 = 25,
|
|
+ MODE_11BE_EHT80 = 26,
|
|
+ MODE_11BE_EHT80_80 = 27,
|
|
+ MODE_11BE_EHT160 = 28,
|
|
+ MODE_11BE_EHT160_160 = 29,
|
|
+ MODE_11BE_EHT320 = 30,
|
|
+ MODE_11BE_EHT20_2G = 31,
|
|
+ MODE_11BE_EHT40_2G = 32,
|
|
+ MODE_UNKNOWN = 33,
|
|
+ MODE_MAX = 33
|
|
};
|
|
|
|
static inline const char *ath12k_wmi_phymode_str(enum wmi_phy_mode mode)
|
|
@@ -2813,6 +2822,24 @@ static inline const char *ath12k_wmi_phy
|
|
return "11ax-he40-2g";
|
|
case MODE_11AX_HE80_2G:
|
|
return "11ax-he80-2g";
|
|
+ case MODE_11BE_EHT20:
|
|
+ return "11be-eht20";
|
|
+ case MODE_11BE_EHT40:
|
|
+ return "11be-eht40";
|
|
+ case MODE_11BE_EHT80:
|
|
+ return "11be-eht80";
|
|
+ case MODE_11BE_EHT80_80:
|
|
+ return "11be-eht80+80";
|
|
+ case MODE_11BE_EHT160:
|
|
+ return "11be-eht160";
|
|
+ case MODE_11BE_EHT160_160:
|
|
+ return "11be-eht160+160";
|
|
+ case MODE_11BE_EHT320:
|
|
+ return "11be-eht320";
|
|
+ case MODE_11BE_EHT20_2G:
|
|
+ return "11be-eht20-2g";
|
|
+ case MODE_11BE_EHT40_2G:
|
|
+ return "11be-eht40-2g";
|
|
case MODE_UNKNOWN:
|
|
/* skip */
|
|
break;
|