From a3bc62968430acca60438e42402885b5c8fc4a64 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sun, 20 Oct 2024 09:24:08 +0200 Subject: [PATCH] ipq807x: import QCOM ath11k patch Fixes: WIFI-13926 Signed-off-by: John Crispin --- ...-tx_status-when-peer-cannot-be-found.patch | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 feeds/ipq807x_v5.4/mac80211/patches/pending/357-wifi-ath11k-Don-t-drop-tx_status-when-peer-cannot-be-found.patch diff --git a/feeds/ipq807x_v5.4/mac80211/patches/pending/357-wifi-ath11k-Don-t-drop-tx_status-when-peer-cannot-be-found.patch b/feeds/ipq807x_v5.4/mac80211/patches/pending/357-wifi-ath11k-Don-t-drop-tx_status-when-peer-cannot-be-found.patch new file mode 100644 index 000000000..20bf9c232 --- /dev/null +++ b/feeds/ipq807x_v5.4/mac80211/patches/pending/357-wifi-ath11k-Don-t-drop-tx_status-when-peer-cannot-be-found.patch @@ -0,0 +1,63 @@ +From d911f48294852be77371a675ab294e7c4f8d3b60 Mon Sep 17 00:00:00 2001 +From: Sven Eckelmann +Date: Thu, 5 Sep 2024 16:13:01 +0530 +Subject: [PATCH] wifi: ath11k: Don't drop tx_status when peer cannot be found +When a station is idle for a long time, hostapd will try to send a QoS +NULL frame to the station. The skb will be added to ack_status_frame, +waiting for a completion via ieee80211_report_ack_skb(). +When a peer is removed before the tx_complete arrives, the +peer will be missing. Using dev_kfree_skb_any() which goes through +mac80211 will not delete the entry from ack_status_frames. This IDR +will therefore run full after 8K request were generated for such clients. +At this point, the access point will then just stall and not allow any new +clients because idr_alloc() for ack_status_frame will fail. +ieee80211_free_txskb() on the other hand will call +ieee80211_report_ack_skb() and make sure to remove the entry from +ack_status_frame. +Fixes: ff0d702450e5 (105-ath11k-fix-monitor-crash-if-tx-offload-is-enabled.patch) + 92450479b82c (039-mac80211-ath11k-add-HE-TX-rate-reporting-to-radiotap.patch) +Signed-off-by: Sven Eckelmann +--- + drivers/net/wireless/ath/ath11k/dp_tx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) +--- a/drivers/net/wireless/ath/ath11k/dp_tx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_tx.c +@@ -555,12 +555,12 @@ ath11k_dp_tx_htt_tx_complete_buf(struct + kfree_skb_list(skb_shinfo(msdu)->frag_list); + skb_shinfo(msdu)->frag_list = NULL; + } +- dev_kfree_skb(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + return; + } + + if (unlikely(!skb_cb->vif)) { +- dev_kfree_skb_any(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + return; + } + +@@ -716,12 +716,12 @@ static void ath11k_dp_tx_complete_msdu(s + rcu_read_lock(); + + if (unlikely(!rcu_dereference(ab->pdevs_active[ar->pdev_idx]))) { +- dev_kfree_skb_any(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + goto exit; + } + + if (unlikely(!skb_cb->vif)) { +- dev_kfree_skb_any(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + goto exit; + } + +@@ -788,7 +788,7 @@ static void ath11k_dp_tx_complete_msdu(s + "dp_tx: failed to find the peer with peer_id %d\n", + ts.peer_id); + spin_unlock_bh(&ab->base_lock); +- dev_kfree_skb_any(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + goto exit; + } + arsta = (struct ath11k_sta *)peer->sta->drv_priv;