diff --git a/package/kernel/mac80211/patches/nss/ath11k/910-wifi-ath11k-remove-call-trace-while-rebooting-AP.patch b/package/kernel/mac80211/patches/nss/ath11k/910-wifi-ath11k-remove-call-trace-while-rebooting-AP.patch new file mode 100644 index 0000000000..dd2af91aa0 --- /dev/null +++ b/package/kernel/mac80211/patches/nss/ath11k/910-wifi-ath11k-remove-call-trace-while-rebooting-AP.patch @@ -0,0 +1,43 @@ +From 214fcc7e98445c0af0ef75df3174227484da13e2 Mon Sep 17 00:00:00 2001 +From: Sarika Sharma +Date: Wed, 21 Feb 2024 10:23:35 +0530 +Subject: [PATCH] wifi: ath11k: remove call trace while rebooting AP + +When a station idles for a long time, hostapd will try to send +a QoS Null frame to the station as "poll". NL80211_CMD_PROBE_CLIENT +is used for this purpose. +And the skb will be added to ack_status_frame - waiting for a +completion via ieee80211_report_ack_skb(). + +But when the peer was already removed before the tx_complete arrives, +the peer will be missing. And when using dev_kfree_skb_any (instead +of going through mac80211), the entry will stay inside +ack_status_frames thus not clean up related information in its +internal data structures. 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 (when required) call +ieee80211_report_ack_skb() and make sure that (when required) remove +the entry from the ack_status_frame and clean up related +information in its internal data structures. + +Signed-off-by: Sven Eckelmann + +Signed-off-by: Sarika Sharma +--- + drivers/net/wireless/ath/ath11k/dp_tx.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +--- a/drivers/net/wireless/ath/ath11k/dp_tx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_tx.c +@@ -451,7 +451,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct + } + + if (unlikely(!skb_cb->vif)) { +- dev_kfree_skb_any(msdu); ++ ieee80211_free_txskb(ar->hw, msdu); + return; + } +