mt76: connac: add 6 GHz support for wtbl and starec configuration
authorMeiChia Chiu <MeiChia.Chiu@mediatek.com>
Mon, 7 Mar 2022 07:10:25 +0000 (15:10 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 16 Mar 2022 16:40:22 +0000 (17:40 +0100)
Since there are no HT & VHT IEs being sent in 6ghz,
some capabilities judgement and parsing for wtbl &
starec configuration should be modified to reflect such changes.

Reviewed-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Money Wang <Money.Wang@mediatek.com>
Signed-off-by: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c

index 6c762fb..5e65fa3 100644 (file)
@@ -905,18 +905,27 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
        struct tlv *tlv;
        u32 flags = 0;
 
-       if (sta->ht_cap.ht_supported) {
+       if (sta->ht_cap.ht_supported || sta->he_6ghz_capa.capa) {
                tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
                                                     wtbl_tlv, sta_wtbl);
                ht = (struct wtbl_ht *)tlv;
                ht->ldpc = ht_ldpc &&
                           !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
-               ht->af = sta->ht_cap.ampdu_factor;
-               ht->mm = sta->ht_cap.ampdu_density;
+
+               if (sta->ht_cap.ht_supported) {
+                       ht->af = sta->ht_cap.ampdu_factor;
+                       ht->mm = sta->ht_cap.ampdu_density;
+               } else {
+                       ht->af = le16_get_bits(sta->he_6ghz_capa.capa,
+                                              IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
+                       ht->mm = le16_get_bits(sta->he_6ghz_capa.capa,
+                                              IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
+               }
+
                ht->ht = true;
        }
 
-       if (sta->vht_cap.vht_supported) {
+       if (sta->vht_cap.vht_supported || sta->he_6ghz_capa.capa) {
                struct wtbl_vht *vht;
                u8 af;
 
@@ -1242,7 +1251,7 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
 
                if (he_cap && he_cap->has_he)
                        mode |= PHY_MODE_AX_24G;
-       } else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) {
+       } else if (band == NL80211_BAND_5GHZ) {
                mode |= PHY_MODE_A;
 
                if (ht_cap->ht_supported)
@@ -1251,8 +1260,11 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
                if (vht_cap->vht_supported)
                        mode |= PHY_MODE_AC;
 
-               if (he_cap && he_cap->has_he && band == NL80211_BAND_5GHZ)
+               if (he_cap && he_cap->has_he)
                        mode |= PHY_MODE_AX_5G;
+       } else if (band == NL80211_BAND_6GHZ) {
+               mode |= PHY_MODE_A | PHY_MODE_AN |
+                       PHY_MODE_AC | PHY_MODE_AX_5G;
        }
 
        return mode;