mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 09:32:34 +00:00
ipq807x: import QCOM ath11k patch
Fixes: WIFI-13926 Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user