net: ethernet: mtk_eth_soc: cache HW pointer of last freed TX descriptor
authorFelix Fietkau <nbd@nbd.name>
Fri, 23 Apr 2021 05:21:03 +0000 (22:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Apr 2021 20:31:58 +0000 (13:31 -0700)
The value is only updated by the CPU, so it is cheaper to access from the
ring data structure than from a hardware register.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mediatek/mtk_eth_soc.c
drivers/net/ethernet/mediatek/mtk_eth_soc.h

index 762e985..6d23118 100644 (file)
@@ -1364,7 +1364,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,
        struct mtk_tx_buf *tx_buf;
        u32 cpu, dma;
 
-       cpu = mtk_r32(eth, MTK_QTX_CRX_PTR);
+       cpu = ring->last_free_ptr;
        dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
 
        desc = mtk_qdma_phys_to_virt(ring, cpu);
@@ -1398,6 +1398,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,
                cpu = next_cpu;
        }
 
+       ring->last_free_ptr = cpu;
        mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
 
        return budget;
@@ -1598,6 +1599,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
        atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
        ring->next_free = &ring->dma[0];
        ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
+       ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz));
        ring->thresh = MAX_SKB_FRAGS;
 
        /* make sure that all changes to the dma ring are flushed before we
@@ -1611,9 +1613,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
                mtk_w32(eth,
                        ring->phys + ((MTK_DMA_SIZE - 1) * sz),
                        MTK_QTX_CRX_PTR);
-               mtk_w32(eth,
-                       ring->phys + ((MTK_DMA_SIZE - 1) * sz),
-                       MTK_QTX_DRX_PTR);
+               mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR);
                mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES,
                        MTK_QTX_CFG(0));
        } else {
index ceb5a4a..6b92dd6 100644 (file)
@@ -642,6 +642,7 @@ struct mtk_tx_buf {
  * @phys:              The physical addr of tx_buf
  * @next_free:         Pointer to the next free descriptor
  * @last_free:         Pointer to the last free descriptor
+ * @last_free_ptr:     Hardware pointer value of the last free descriptor
  * @thresh:            The threshold of minimum amount of free descriptors
  * @free_count:                QDMA uses a linked list. Track how many free descriptors
  *                     are present
@@ -652,6 +653,7 @@ struct mtk_tx_ring {
        dma_addr_t phys;
        struct mtk_tx_dma *next_free;
        struct mtk_tx_dma *last_free;
+       u32 last_free_ptr;
        u16 thresh;
        atomic_t free_count;
        int dma_size;