wifi: iwlwifi: mvm: use EHT maximum MPDU length on 2.4 GHz
authorJohannes Berg <johannes.berg@intel.com>
Tue, 20 Jun 2023 10:03:53 +0000 (13:03 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 21 Jun 2023 12:02:15 +0000 (14:02 +0200)
On 2.4 GHz there's no VHT, so EHT defines its own bits for
the maximum MPDU length. Use them when telling firmware
about the maximum.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230620125813.fd5322bb48a4.Ic471045f83229ceaacce25edcf992d3ce2c75de5@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c

index 2382725..6cba8a3 100644 (file)
@@ -523,6 +523,7 @@ u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *sta,
 {
        const struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap;
        const struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap;
+       const struct ieee80211_sta_eht_cap *eht_cap = &link_sta->eht_cap;
 
        if (WARN_ON_ONCE(!link_conf->chandef.chan))
                return IEEE80211_MAX_MPDU_LEN_VHT_3895;
@@ -537,8 +538,18 @@ u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *sta,
                default:
                        return IEEE80211_MAX_MPDU_LEN_VHT_3895;
                }
-       } else
-       if (vht_cap->vht_supported) {
+       } else if (link_conf->chandef.chan->band == NL80211_BAND_2GHZ &&
+                  eht_cap->has_eht) {
+               switch (u8_get_bits(eht_cap->eht_cap_elem.mac_cap_info[0],
+                                   IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK)) {
+               case IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454:
+                       return IEEE80211_MAX_MPDU_LEN_VHT_11454;
+               case IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_7991:
+                       return IEEE80211_MAX_MPDU_LEN_VHT_7991;
+               default:
+                       return IEEE80211_MAX_MPDU_LEN_VHT_3895;
+               }
+       } else if (vht_cap->vht_supported) {
                switch (vht_cap->cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK) {
                case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454:
                        return IEEE80211_MAX_MPDU_LEN_VHT_11454;