iwlwifi: mvm: consider ieee80211 station max amsdu value
authorMordechay Goodstein <mordechay.goodstein@intel.com>
Sun, 28 Jul 2019 17:09:22 +0000 (20:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 Jan 2020 18:49:01 +0000 (19:49 +0100)
commit ee4cce9b9d6421d037ffc002536b918fd7f4aff3 upstream.

debugfs amsdu_len sets only the max_amsdu_len for ieee80211 station
so take it into consideration while getting max amsdu

Fixes: af2984e9e625 ("iwlwifi: mvm: add a debugfs entry to set a fixed size AMSDU for all TX packets")
Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index 8f50e2b121bd0899505bd86e2c659af2b98462c9..098d48153a38787d6a4712f36c080a154d533fee 100644 (file)
@@ -350,7 +350,13 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm,
                u16 size = le32_to_cpu(notif->amsdu_size);
                int i;
 
-               if (WARN_ON(sta->max_amsdu_len < size))
+               /*
+                * In debug sta->max_amsdu_len < size
+                * so also check with orig_amsdu_len which holds the original
+                * data before debugfs changed the value
+                */
+               if (WARN_ON(sta->max_amsdu_len < size &&
+                           mvmsta->orig_amsdu_len < size))
                        goto out;
 
                mvmsta->amsdu_enabled = le32_to_cpu(notif->amsdu_enabled);
index 8a059da7a1fa7920a9856612b160d4cec526223d..e3b2a2bf3863c335cfda28805e326efec69c0363 100644 (file)
@@ -935,7 +935,12 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
            !(mvmsta->amsdu_enabled & BIT(tid)))
                return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
 
-       max_amsdu_len = iwl_mvm_max_amsdu_size(mvm, sta, tid);
+       /*
+        * Take the min of ieee80211 station and mvm station
+        */
+       max_amsdu_len =
+               min_t(unsigned int, sta->max_amsdu_len,
+                     iwl_mvm_max_amsdu_size(mvm, sta, tid));
 
        /*
         * Limit A-MSDU in A-MPDU to 4095 bytes when VHT is not