Commit 4e6bf609 authored by Felix Fietkau's avatar Felix Fietkau Committed by David S. Miller

net: ethernet: mtk_eth_soc: cache HW pointer of last freed TX descriptor

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: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarIlya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e9229ffd
...@@ -1364,7 +1364,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget, ...@@ -1364,7 +1364,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,
struct mtk_tx_buf *tx_buf; struct mtk_tx_buf *tx_buf;
u32 cpu, dma; u32 cpu, dma;
cpu = mtk_r32(eth, MTK_QTX_CRX_PTR); cpu = ring->last_free_ptr;
dma = mtk_r32(eth, MTK_QTX_DRX_PTR); dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
desc = mtk_qdma_phys_to_virt(ring, cpu); desc = mtk_qdma_phys_to_virt(ring, cpu);
...@@ -1398,6 +1398,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget, ...@@ -1398,6 +1398,7 @@ static int mtk_poll_tx_qdma(struct mtk_eth *eth, int budget,
cpu = next_cpu; cpu = next_cpu;
} }
ring->last_free_ptr = cpu;
mtk_w32(eth, cpu, MTK_QTX_CRX_PTR); mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
return budget; return budget;
...@@ -1598,6 +1599,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth) ...@@ -1598,6 +1599,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
ring->next_free = &ring->dma[0]; ring->next_free = &ring->dma[0];
ring->last_free = &ring->dma[MTK_DMA_SIZE - 1]; 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; ring->thresh = MAX_SKB_FRAGS;
/* make sure that all changes to the dma ring are flushed before we /* 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) ...@@ -1611,9 +1613,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
mtk_w32(eth, mtk_w32(eth,
ring->phys + ((MTK_DMA_SIZE - 1) * sz), ring->phys + ((MTK_DMA_SIZE - 1) * sz),
MTK_QTX_CRX_PTR); MTK_QTX_CRX_PTR);
mtk_w32(eth, mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR);
ring->phys + ((MTK_DMA_SIZE - 1) * sz),
MTK_QTX_DRX_PTR);
mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES,
MTK_QTX_CFG(0)); MTK_QTX_CFG(0));
} else { } else {
......
...@@ -642,6 +642,7 @@ struct mtk_tx_buf { ...@@ -642,6 +642,7 @@ struct mtk_tx_buf {
* @phys: The physical addr of tx_buf * @phys: The physical addr of tx_buf
* @next_free: Pointer to the next free descriptor * @next_free: Pointer to the next free descriptor
* @last_free: Pointer to the last 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 * @thresh: The threshold of minimum amount of free descriptors
* @free_count: QDMA uses a linked list. Track how many free descriptors * @free_count: QDMA uses a linked list. Track how many free descriptors
* are present * are present
...@@ -652,6 +653,7 @@ struct mtk_tx_ring { ...@@ -652,6 +653,7 @@ struct mtk_tx_ring {
dma_addr_t phys; dma_addr_t phys;
struct mtk_tx_dma *next_free; struct mtk_tx_dma *next_free;
struct mtk_tx_dma *last_free; struct mtk_tx_dma *last_free;
u32 last_free_ptr;
u16 thresh; u16 thresh;
atomic_t free_count; atomic_t free_count;
int dma_size; int dma_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment