mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	All patches automatically rebased. Build system: x86_64 Build-tested: ipq806x/R7800 Signed-off-by: John Audia <therealgraysky@proton.me>
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 816ac3e6e67bdd78d86226c6eb53619780750e92 Mon Sep 17 00:00:00 2001
 | |
| From: Felix Fietkau <nbd@nbd.name>
 | |
| Date: Thu, 22 Apr 2021 22:21:04 -0700
 | |
| Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full RX descriptor
 | |
|  if DMA is done
 | |
| 
 | |
| Uncached memory access is expensive, and there is no need to access all
 | |
| descriptor words if we can't process them anyway
 | |
| 
 | |
| 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 | 12 ++++++++----
 | |
|  1 file changed, 8 insertions(+), 4 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | |
| @@ -798,13 +798,18 @@ static inline int mtk_max_buf_size(int f
 | |
|  	return buf_size;
 | |
|  }
 | |
|  
 | |
| -static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd,
 | |
| +static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd,
 | |
|  				   struct mtk_rx_dma *dma_rxd)
 | |
|  {
 | |
| -	rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
 | |
|  	rxd->rxd2 = READ_ONCE(dma_rxd->rxd2);
 | |
| +	if (!(rxd->rxd2 & RX_DMA_DONE))
 | |
| +		return false;
 | |
| +
 | |
| +	rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
 | |
|  	rxd->rxd3 = READ_ONCE(dma_rxd->rxd3);
 | |
|  	rxd->rxd4 = READ_ONCE(dma_rxd->rxd4);
 | |
| +
 | |
| +	return true;
 | |
|  }
 | |
|  
 | |
|  static void *mtk_max_lro_buf_alloc(gfp_t gfp_mask)
 | |
| @@ -1287,8 +1292,7 @@ static int mtk_poll_rx(struct napi_struc
 | |
|  		rxd = &ring->dma[idx];
 | |
|  		data = ring->data[idx];
 | |
|  
 | |
| -		mtk_rx_get_desc(&trxd, rxd);
 | |
| -		if (!(trxd.rxd2 & RX_DMA_DONE))
 | |
| +		if (!mtk_rx_get_desc(&trxd, rxd))
 | |
|  			break;
 | |
|  
 | |
|  		/* find out which mac the packet come from. values start at 1 */
 |