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: Felix Fietkau <nbd@nbd.name> Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
e9229ffd55
Коммит
4e6bf60956
|
@ -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,
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
* @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 {
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче