From 04d293ebae86094b2096be13dc9f8585123f214b Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 10 Dec 2012 16:43:01 +0000 Subject: b43: fix tx path skb leaks git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34607 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/patches/300-pending_work.patch | 78 +++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'package/mac80211/patches/300-pending_work.patch') diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index adce646894..f90ae21b6f 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -614,3 +614,81 @@ return; } +--- a/drivers/net/wireless/b43/dma.c ++++ b/drivers/net/wireless/b43/dma.c +@@ -409,7 +409,10 @@ static inline + struct b43_dmadesc_meta *meta) + { + if (meta->skb) { +- dev_kfree_skb_any(meta->skb); ++ if (ring->tx) ++ ieee80211_free_txskb(ring->dev->wl->hw, meta->skb); ++ else ++ dev_kfree_skb_any(meta->skb); + meta->skb = NULL; + } + } +@@ -1454,7 +1457,7 @@ int b43_dma_tx(struct b43_wldev *dev, st + if (unlikely(err == -ENOKEY)) { + /* Drop this packet, as we don't have the encryption key + * anymore and must not transmit it unencrypted. */ +- dev_kfree_skb_any(skb); ++ ieee80211_free_txskb(dev->wl->hw, skb); + err = 0; + goto out; + } +--- a/drivers/net/wireless/b43/main.c ++++ b/drivers/net/wireless/b43/main.c +@@ -3397,7 +3397,7 @@ static void b43_tx_work(struct work_stru + break; + } + if (unlikely(err)) +- dev_kfree_skb(skb); /* Drop it */ ++ ieee80211_free_txskb(wl->hw, skb); + err = 0; + } + +@@ -3419,7 +3419,7 @@ static void b43_op_tx(struct ieee80211_h + + if (unlikely(skb->len < 2 + 2 + 6)) { + /* Too short, this can't be a valid frame. */ +- dev_kfree_skb_any(skb); ++ ieee80211_free_txskb(hw, skb); + return; + } + B43_WARN_ON(skb_shinfo(skb)->nr_frags); +@@ -4234,8 +4234,12 @@ redo: + + /* Drain all TX queues. */ + for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) { +- while (skb_queue_len(&wl->tx_queue[queue_num])) +- dev_kfree_skb(skb_dequeue(&wl->tx_queue[queue_num])); ++ while (skb_queue_len(&wl->tx_queue[queue_num])) { ++ struct sk_buff *skb; ++ ++ skb = skb_dequeue(&wl->tx_queue[queue_num]); ++ ieee80211_free_txskb(wl->hw, skb); ++ } + } + + b43_mac_suspend(dev); +--- a/drivers/net/wireless/b43/pio.c ++++ b/drivers/net/wireless/b43/pio.c +@@ -196,7 +196,7 @@ static void b43_pio_cancel_tx_packets(st + for (i = 0; i < ARRAY_SIZE(q->packets); i++) { + pack = &(q->packets[i]); + if (pack->skb) { +- dev_kfree_skb_any(pack->skb); ++ ieee80211_free_txskb(q->dev->wl->hw, pack->skb); + pack->skb = NULL; + } + } +@@ -552,7 +552,7 @@ int b43_pio_tx(struct b43_wldev *dev, st + if (unlikely(err == -ENOKEY)) { + /* Drop this packet, as we don't have the encryption key + * anymore and must not transmit it unencrypted. */ +- dev_kfree_skb_any(skb); ++ ieee80211_free_txskb(dev->wl->hw, skb); + err = 0; + goto out; + } -- cgit v1.2.3