mac80211: fix an issue with wds links on 802.11ax devices
authorFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 10:16:49 +0000 (12:16 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 10:17:54 +0000 (12:17 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
(cherry-picked from commit 89c9ccc3b241d8f07c22a1c271211322c4703f7b)

package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch [new file with mode: 0644]

diff --git a/package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch b/package/kernel/mac80211/patches/subsys/378-mac80211-remove-iwlwifi-specific-workaround-that-bro.patch
new file mode 100644 (file)
index 0000000..a5ad377
--- /dev/null
@@ -0,0 +1,51 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 19 Jun 2021 12:10:14 +0200
+Subject: [PATCH] mac80211: remove iwlwifi specific workaround that broke sta
+ NDP tx
+
+Sending nulldata packets is important for sw AP link probing and detecting
+4-address mode links. The checks that dropped these packets were apparently
+added to work around an iwlwifi firmware bug with multi-TID aggregation.
+
+Fixes: 41cbb0f5a295 ("mac80211: add support for HE")
+Cc: stable@vger.kernel.org
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+@@ -1085,6 +1085,9 @@ static int iwl_mvm_tx_mpdu(struct iwl_mv
+       if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_INVALID_STA))
+               return -1;
++      if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->he_cap.has_he)
++              return -1;
++
+       if (unlikely(ieee80211_is_probe_resp(fc)))
+               iwl_mvm_probe_resp_set_noa(mvm, skb);
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -1094,11 +1094,6 @@ void ieee80211_send_nullfunc(struct ieee
+       struct ieee80211_hdr_3addr *nullfunc;
+       struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+-      /* Don't send NDPs when STA is connected HE */
+-      if (sdata->vif.type == NL80211_IFTYPE_STATION &&
+-          !(ifmgd->flags & IEEE80211_STA_DISABLE_HE))
+-              return;
+-
+       skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif,
+               !ieee80211_hw_check(&local->hw, DOESNT_SUPPORT_QOS_NDP));
+       if (!skb)
+@@ -1130,10 +1125,6 @@ static void ieee80211_send_4addr_nullfun
+       if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
+               return;
+-      /* Don't send NDPs when connected HE */
+-      if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
+-              return;
+-
+       skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30);
+       if (!skb)
+               return;