rtw88: pci: extract skbs free routine for trx rings
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Mon, 16 Sep 2019 07:03:34 +0000 (15:03 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Sat, 21 Sep 2019 05:47:26 +0000 (08:47 +0300)
These skbs free routines could be used when driver wants
to stop PCI bus, because some of the skbs remained in the
queue may not have been returned via DMA interrupt.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/pci.c

index 3fdb52a..bc3a364 100644 (file)
@@ -90,16 +90,13 @@ static inline void *rtw_pci_get_tx_desc(struct rtw_pci_tx_ring *tx_ring, u8 idx)
        return tx_ring->r.head + offset;
 }
 
-static void rtw_pci_free_tx_ring(struct rtw_dev *rtwdev,
-                                struct rtw_pci_tx_ring *tx_ring)
+static void rtw_pci_free_tx_ring_skbs(struct rtw_dev *rtwdev,
+                                     struct rtw_pci_tx_ring *tx_ring)
 {
        struct pci_dev *pdev = to_pci_dev(rtwdev->dev);
        struct rtw_pci_tx_data *tx_data;
        struct sk_buff *skb, *tmp;
        dma_addr_t dma;
-       u8 *head = tx_ring->r.head;
-       u32 len = tx_ring->r.len;
-       int ring_sz = len * tx_ring->r.desc_size;
 
        /* free every skb remained in tx list */
        skb_queue_walk_safe(&tx_ring->queue, skb, tmp) {
@@ -110,21 +107,30 @@ static void rtw_pci_free_tx_ring(struct rtw_dev *rtwdev,
                pci_unmap_single(pdev, dma, skb->len, PCI_DMA_TODEVICE);
                dev_kfree_skb_any(skb);
        }
+}
+
+static void rtw_pci_free_tx_ring(struct rtw_dev *rtwdev,
+                                struct rtw_pci_tx_ring *tx_ring)
+{
+       struct pci_dev *pdev = to_pci_dev(rtwdev->dev);
+       u8 *head = tx_ring->r.head;
+       u32 len = tx_ring->r.len;
+       int ring_sz = len * tx_ring->r.desc_size;
+
+       rtw_pci_free_tx_ring_skbs(rtwdev, tx_ring);
 
        /* free the ring itself */
        pci_free_consistent(pdev, ring_sz, head, tx_ring->r.dma);
        tx_ring->r.head = NULL;
 }
 
-static void rtw_pci_free_rx_ring(struct rtw_dev *rtwdev,
-                                struct rtw_pci_rx_ring *rx_ring)
+static void rtw_pci_free_rx_ring_skbs(struct rtw_dev *rtwdev,
+                                     struct rtw_pci_rx_ring *rx_ring)
 {
        struct pci_dev *pdev = to_pci_dev(rtwdev->dev);
        struct sk_buff *skb;
-       dma_addr_t dma;
-       u8 *head = rx_ring->r.head;
        int buf_sz = RTK_PCI_RX_BUF_SIZE;
-       int ring_sz = rx_ring->r.desc_size * rx_ring->r.len;
+       dma_addr_t dma;
        int i;
 
        for (i = 0; i < rx_ring->r.len; i++) {
@@ -137,6 +143,16 @@ static void rtw_pci_free_rx_ring(struct rtw_dev *rtwdev,
                dev_kfree_skb(skb);
                rx_ring->buf[i] = NULL;
        }
+}
+
+static void rtw_pci_free_rx_ring(struct rtw_dev *rtwdev,
+                                struct rtw_pci_rx_ring *rx_ring)
+{
+       struct pci_dev *pdev = to_pci_dev(rtwdev->dev);
+       u8 *head = rx_ring->r.head;
+       int ring_sz = rx_ring->r.desc_size * rx_ring->r.len;
+
+       rtw_pci_free_rx_ring_skbs(rtwdev, rx_ring);
 
        pci_free_consistent(pdev, ring_sz, head, rx_ring->r.dma);
 }