fix freeing frames on tx

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2016-02-28 10:47:27 +01:00
parent d365e4a12e
commit 06619cd877
+9 -7
View File
@@ -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);