net: ethernet: mtk_eth_soc: only read the full RX descriptor if DMA is done
authorFelix Fietkau <nbd@nbd.name>
Fri, 23 Apr 2021 05:21:04 +0000 (22:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Apr 2021 20:31:58 +0000 (13:31 -0700)
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

index 6d23118..4735942 100644 (file)
@@ -777,13 +777,18 @@ static inline int mtk_max_buf_size(int frag_size)
        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;
 }
 
 /* the qdma core needs scratch memory to be setup */
@@ -1255,8 +1260,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
                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 */