ipq807x: import QCOM ath11k patch

Fixes: WIFI-13926
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2024-10-20 09:24:08 +02:00
parent 514210fd7e
commit a3bc629684

View File

@@ -0,0 +1,63 @@
From d911f48294852be77371a675ab294e7c4f8d3b60 Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <sven@narfation.org>
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 <sven@narfation.org>
---
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;