wifi: ath11k: Cleanup mac80211 references on failure during tx_complete
authorSven Eckelmann <sven@narfation.org>
Tue, 22 Aug 2023 13:42:24 +0000 (16:42 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Oct 2023 12:56:44 +0000 (14:56 +0200)
[ Upstream commit 29d15589f084d71a4ea8c544039c5839db0236e2 ]

When a function is using functions from mac80211 to free an skb then it
should do it consistently and not switch to the generic dev_kfree_skb_any
(or similar functions). Otherwise (like in the error handlers), mac80211
will will not be aware of the freed skb and thus not clean up related
information in its internal data structures.

Not doing so lead in the past to filled up structure which then prevented
new clients to connect.

Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
Fixes: 6257c702264c ("wifi: ath11k: fix tx status reporting in encap offload mode")
Cc: stable@vger.kernel.org
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230802-ath11k-ack_status_leak-v2-2-c0af729d6229@narfation.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath11k/dp_tx.c

index 08a28464eb7a949637bd9a65f79b5c612ebd1b89..64c8ccac22d27a83ec9d08b68965ca4fbaaa8326 100644 (file)
@@ -344,7 +344,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct ath11k_base *ab,
        dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
 
        if (!skb_cb->vif) {
-               dev_kfree_skb_any(msdu);
+               ieee80211_free_txskb(ar->hw, msdu);
                return;
        }
 
@@ -566,12 +566,12 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar,
        dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
 
        if (unlikely(!rcu_access_pointer(ab->pdevs_active[ar->pdev_idx]))) {
-               dev_kfree_skb_any(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;
        }