1 |
From 59f0257329e9686e8be867b131bace30c73db540 Mon Sep 17 00:00:00 2001 |
2 |
From: Sasha Levin <sashal@kernel.org> |
3 |
Date: Tue, 23 Aug 2022 14:24:07 +0200 |
4 |
Subject: net: ethernet: mtk_eth_soc: fix hw hash reporting for MTK_NETSYS_V2 |
5 |
|
6 |
From: Lorenzo Bianconi <lorenzo@kernel.org> |
7 |
|
8 |
[ Upstream commit 0cf731f9ebb5bf6f252055bebf4463a5c0bd490b ] |
9 |
|
10 |
Properly report hw rx hash for mt7986 chipset accroding to the new dma |
11 |
descriptor layout. |
12 |
|
13 |
Fixes: 197c9e9b17b11 ("net: ethernet: mtk_eth_soc: introduce support for mt7986 chipset") |
14 |
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> |
15 |
Link: https://lore.kernel.org/r/091394ea4e705fbb35f828011d98d0ba33808f69.1661257293.git.lorenzo@kernel.org |
16 |
Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
17 |
Signed-off-by: Sasha Levin <sashal@kernel.org> |
18 |
--- |
19 |
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 +++++++++++---------- |
20 |
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 +++++ |
21 |
2 files changed, 17 insertions(+), 10 deletions(-) |
22 |
|
23 |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
24 |
index 6beb3d4873a37..dcf0aac0aa65d 100644 |
25 |
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
26 |
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
27 |
@@ -1513,10 +1513,19 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, |
28 |
skb->dev = netdev; |
29 |
skb_put(skb, pktlen); |
30 |
|
31 |
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) |
32 |
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { |
33 |
+ hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY; |
34 |
+ if (hash != MTK_RXD5_FOE_ENTRY) |
35 |
+ skb_set_hash(skb, jhash_1word(hash, 0), |
36 |
+ PKT_HASH_TYPE_L4); |
37 |
rxdcsum = &trxd.rxd3; |
38 |
- else |
39 |
+ } else { |
40 |
+ hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; |
41 |
+ if (hash != MTK_RXD4_FOE_ENTRY) |
42 |
+ skb_set_hash(skb, jhash_1word(hash, 0), |
43 |
+ PKT_HASH_TYPE_L4); |
44 |
rxdcsum = &trxd.rxd4; |
45 |
+ } |
46 |
|
47 |
if (*rxdcsum & eth->soc->txrx.rx_dma_l4_valid) |
48 |
skb->ip_summed = CHECKSUM_UNNECESSARY; |
49 |
@@ -1525,16 +1534,9 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, |
50 |
skb->protocol = eth_type_trans(skb, netdev); |
51 |
bytes += pktlen; |
52 |
|
53 |
- hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY; |
54 |
- if (hash != MTK_RXD4_FOE_ENTRY) { |
55 |
- hash = jhash_1word(hash, 0); |
56 |
- skb_set_hash(skb, hash, PKT_HASH_TYPE_L4); |
57 |
- } |
58 |
- |
59 |
reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4); |
60 |
if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) |
61 |
- mtk_ppe_check_skb(eth->ppe, skb, |
62 |
- trxd.rxd4 & MTK_RXD4_FOE_ENTRY); |
63 |
+ mtk_ppe_check_skb(eth->ppe, skb, hash); |
64 |
|
65 |
if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { |
66 |
if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { |
67 |
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
68 |
index 0a632896451a4..98d6a6d047e32 100644 |
69 |
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
70 |
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
71 |
@@ -307,6 +307,11 @@ |
72 |
#define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */ |
73 |
#define RX_DMA_SPECIAL_TAG BIT(22) |
74 |
|
75 |
+/* PDMA descriptor rxd5 */ |
76 |
+#define MTK_RXD5_FOE_ENTRY GENMASK(14, 0) |
77 |
+#define MTK_RXD5_PPE_CPU_REASON GENMASK(22, 18) |
78 |
+#define MTK_RXD5_SRC_PORT GENMASK(29, 26) |
79 |
+ |
80 |
#define RX_DMA_GET_SPORT(x) (((x) >> 19) & 0xf) |
81 |
#define RX_DMA_GET_SPORT_V2(x) (((x) >> 26) & 0x7) |
82 |
|
83 |
-- |
84 |
2.35.1 |
85 |
|