OSDN Git Service

wifi: ath12k: add EHT PHY modes
authorMuna Sinada <quic_msinada@quicinc.com>
Wed, 2 Aug 2023 17:04:03 +0000 (20:04 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Thu, 3 Aug 2023 09:11:59 +0000 (12:11 +0300)
Add support to retrieve and configure the phy modes supported
by the hardware.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230725224034.14045-6-quic_alokad@quicinc.com
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/mac.h
drivers/net/wireless/ath/ath12k/wmi.h

index c64cd80..8ea1ac5 100644 (file)
@@ -182,32 +182,35 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
        [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,
        },
 
 };
@@ -292,6 +295,24 @@ static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
                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;
@@ -1929,6 +1950,41 @@ static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
        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;
+
+               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;
+
+               ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
+                           sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
+
+               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,
@@ -1950,7 +2006,12 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
 
        switch (band) {
        case NL80211_BAND_2GHZ:
-               if (sta->deflink.he_cap.has_he) {
+               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) {
                        if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                                phymode = MODE_11AX_HE80_2G;
                        else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
@@ -1977,8 +2038,10 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
                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) {
                        phymode = ath12k_mac_get_phymode_he(ar, sta);
                } else if (sta->deflink.vht_cap.vht_supported &&
                    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
index 57f4295..7b16b70 100644 (file)
@@ -33,7 +33,7 @@ struct ath12k_generic_iter {
 #define IEEE80211_VHT_MCS_SUPPORT_0_11_MASK    GENMASK(23, 16)
 #define IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11 BIT(24)
 
-#define ATH12K_CHAN_WIDTH_NUM                  8
+#define ATH12K_CHAN_WIDTH_NUM                  14
 
 #define ATH12K_TX_POWER_MAX_VAL        70
 #define ATH12K_TX_POWER_MIN_VAL        0
index bafcaa7..0aa7390 100644 (file)
@@ -2796,8 +2796,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,
 };
 
 struct wmi_vdev_start_req_arg {