diff --git a/dma.c b/dma.c index 14d3ddc6..f7b8d465 100644 --- a/dma.c +++ b/dma.c @@ -252,3 +252,25 @@ int mt76_dma_init(struct mt76_dev *dev) return 0; } EXPORT_SYMBOL_GPL(mt76_dma_init); + +static void +mt76_tx_cleanup_entry(struct mt76_dev *dev, struct mt76_queue *q, + struct mt76_queue_entry *e) +{ + if (e->txwi) + ieee80211_free_txskb(dev->hw, e->skb); + else + dev_kfree_skb_any(e->skb); +} + +void mt76_dma_cleanup(struct mt76_dev *dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++) + mt76_dma_tx_cleanup(dev, &dev->q_tx[i], true, + mt76_tx_cleanup_entry); + for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) + mt76_dma_rx_cleanup(dev, &dev->q_rx[i]); +} +EXPORT_SYMBOL_GPL(mt76_dma_cleanup); diff --git a/dma.h b/dma.h index c3af9bf6..fd224746 100644 --- a/dma.h +++ b/dma.h @@ -30,5 +30,6 @@ struct mt76_desc { } __packed __aligned(4); int mt76_dma_init(struct mt76_dev *dev); +void mt76_dma_cleanup(struct mt76_dev *dev); #endif diff --git a/mt7603_dma.c b/mt7603_dma.c index ac8616b2..9348ea24 100644 --- a/mt7603_dma.c +++ b/mt7603_dma.c @@ -294,8 +294,6 @@ int mt7603_dma_init(struct mt7603_dev *dev) void mt7603_dma_cleanup(struct mt7603_dev *dev) { - int i; - mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_EN | MT_WPDMA_GLO_CFG_RX_DMA_EN | @@ -303,8 +301,5 @@ void mt7603_dma_cleanup(struct mt7603_dev *dev) tasklet_kill(&dev->tx_tasklet); tasklet_kill(&dev->rx_tasklet); - for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) - mt7603_tx_cleanup(dev, &dev->mt76.q_tx[i], true); - for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++) - mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]); + mt76_dma_cleanup(&dev->mt76); } diff --git a/mt76x2_dma.c b/mt76x2_dma.c index e24e64c1..0a48e4b3 100644 --- a/mt76x2_dma.c +++ b/mt76x2_dma.c @@ -341,12 +341,7 @@ int mt76x2_dma_init(struct mt76x2_dev *dev) void mt76x2_dma_cleanup(struct mt76x2_dev *dev) { - int i; - tasklet_kill(&dev->tx_tasklet); tasklet_kill(&dev->rx_tasklet); - for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) - mt76x2_tx_cleanup(dev, &dev->mt76.q_tx[i], true); - for (i = 0; i < ARRAY_SIZE(dev->mt76.q_rx); i++) - mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]); + mt76_dma_cleanup(&dev->mt76); }