kernel: bump 5.4 to 5.4.124
[openwrt/openwrt.git] / target / linux / generic / pending-5.4 / 770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch
1 From: Felix Fietkau <nbd@nbd.name>
2 Date: Thu, 27 Aug 2020 09:24:25 +0200
3 Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full rx
4 descriptor if DMA is done
5
6 Uncached memory access is expensive, and there is no need to access all
7 descriptor words if we can't process them anyway
8
9 Signed-off-by: Felix Fietkau <nbd@nbd.name>
10 ---
11
12 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
13 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
14 @@ -793,13 +793,18 @@ static inline int mtk_max_buf_size(int f
15 return buf_size;
16 }
17
18 -static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd,
19 +static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd,
20 struct mtk_rx_dma *dma_rxd)
21 {
22 - rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
23 rxd->rxd2 = READ_ONCE(dma_rxd->rxd2);
24 + if (!(rxd->rxd2 & RX_DMA_DONE))
25 + return false;
26 +
27 + rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
28 rxd->rxd3 = READ_ONCE(dma_rxd->rxd3);
29 rxd->rxd4 = READ_ONCE(dma_rxd->rxd4);
30 +
31 + return true;
32 }
33
34 /* the qdma core needs scratch memory to be setup */
35 @@ -1271,8 +1276,7 @@ static int mtk_poll_rx(struct napi_struc
36 rxd = &ring->dma[idx];
37 data = ring->data[idx];
38
39 - mtk_rx_get_desc(&trxd, rxd);
40 - if (!(trxd.rxd2 & RX_DMA_DONE))
41 + if (!mtk_rx_get_desc(&trxd, rxd))
42 break;
43
44 /* find out which mac the packet come from. values start at 1 */