From 06619cd877006e3ae1acb3f479f698598bea8e51 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 28 Feb 2016 10:47:27 +0100 Subject: [PATCH] fix freeing frames on tx Signed-off-by: Felix Fietkau --- tx.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tx.c b/tx.c index 8f9b4ef9..59edfa22 100644 --- a/tx.c +++ b/tx.c @@ -91,6 +91,7 @@ int mt76_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, struct sk_buff *skb, struct mt76_wcid *wcid, struct ieee80211_sta *sta) { + struct mt76_queue_entry e; struct mt76_txwi_cache *t; struct mt76_queue_buf buf[32]; struct sk_buff *iter; @@ -101,8 +102,8 @@ int mt76_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, t = mt76_get_txwi(dev); if (!t) { - ret = -ENOMEM; - goto free; + ieee80211_free_txskb(dev->hw, skb); + return -ENOMEM; } dma_sync_single_for_cpu(dev->dev, t->dma_addr, sizeof(t->txwi), @@ -112,13 +113,13 @@ int mt76_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, dma_sync_single_for_device(dev->dev, t->dma_addr, sizeof(t->txwi), DMA_TO_DEVICE); if (ret < 0) - goto free_txwi; + goto free; len = skb->len - skb->data_len; addr = dma_map_single(dev->dev, skb->data, len, DMA_TO_DEVICE); if (dma_mapping_error(dev->dev, addr)) { ret = -ENOMEM; - goto free_txwi; + goto free; } n = 0; @@ -149,10 +150,11 @@ unmap: for (n--; n > 0; n--) dma_unmap_single(dev->dev, buf[n].addr, buf[n].len, DMA_TO_DEVICE); -free_txwi: - mt76_put_txwi(dev, t); free: - ieee80211_free_txskb(dev->hw, skb); + e.skb = skb; + e.txwi = t; + dev->drv->tx_complete_skb(dev, q, &e, true); + mt76_put_txwi(dev, t); return ret; } EXPORT_SYMBOL_GPL(mt76_tx_queue_skb);