mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-30 18:07:52 +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