Skip to content

Commit e2c7469

Browse files
vDorstdavem330
authored andcommitted
net: ethernet: mediatek: Fix overlapping capability bits.
Both MTK_TRGMII_MT7621_CLK and MTK_PATH_BIT are defined as bit 10. This can causes issues on non-MT7621 devices which has the MTK_PATH_BIT(MTK_ETH_PATH_GMAC1_RGMII) and MTK_TRGMII capability set. The wrong TRGMII setup code can be executed. The current wrongly executed code doesn’t do any harm on MT7623 and the TRGMII setup for the MT7623 SOC side is done in MT7530 driver So it wasn’t noticed in the test. Move all capability bits in one enum so that they are all unique and easy to expand in the future. Because mtk_eth_path enum is merged in to mkt_eth_capabilities, the variable path value is no longer between 0 to number of paths, mtk_eth_path_name can’t be used anymore in this form. Convert the mtk_eth_path_name array to a function to lookup the pathname. The old code walked thru the mtk_eth_path enum, which is also merged with mkt_eth_capabilities. Expand array mtk_eth_muxc so it can store the name and capability bit of the mux. Convert the code so it can walk thru the mtk_eth_muxc array. Fixes: 8efaa65 ("net: ethernet: mediatek: Add MT7621 TRGMII mode support") Signed-off-by: René van Dorst <[email protected]> v1->v2: - Move all capability bits in one enum, suggested by Willem de Bruijn - Convert the mtk_eth_path_name array to a function to lookup the pathname - Expand array mtk_eth_muxc so it can also store the name and capability bit of the mux - Updated commit message Signed-off-by: David S. Miller <[email protected]>
1 parent c3efed5 commit e2c7469

File tree

2 files changed

+125
-85
lines changed

2 files changed

+125
-85
lines changed

drivers/net/ethernet/mediatek/mtk_eth_path.c

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,32 @@
1313
#include "mtk_eth_soc.h"
1414

1515
struct mtk_eth_muxc {
16-
int (*set_path)(struct mtk_eth *eth, int path);
16+
const char *name;
17+
int cap_bit;
18+
int (*set_path)(struct mtk_eth *eth, int path);
1719
};
1820

19-
static const char * const mtk_eth_mux_name[] = {
20-
"mux_gdm1_to_gmac1_esw", "mux_gmac2_gmac0_to_gephy",
21-
"mux_u3_gmac2_to_qphy", "mux_gmac1_gmac2_to_sgmii_rgmii",
22-
"mux_gmac12_to_gephy_sgmii",
23-
};
24-
25-
static const char * const mtk_eth_path_name[] = {
26-
"gmac1_rgmii", "gmac1_trgmii", "gmac1_sgmii", "gmac2_rgmii",
27-
"gmac2_sgmii", "gmac2_gephy", "gdm1_esw",
28-
};
21+
static const char *mtk_eth_path_name(int path)
22+
{
23+
switch (path) {
24+
case MTK_ETH_PATH_GMAC1_RGMII:
25+
return "gmac1_rgmii";
26+
case MTK_ETH_PATH_GMAC1_TRGMII:
27+
return "gmac1_trgmii";
28+
case MTK_ETH_PATH_GMAC1_SGMII:
29+
return "gmac1_sgmii";
30+
case MTK_ETH_PATH_GMAC2_RGMII:
31+
return "gmac2_rgmii";
32+
case MTK_ETH_PATH_GMAC2_SGMII:
33+
return "gmac2_sgmii";
34+
case MTK_ETH_PATH_GMAC2_GEPHY:
35+
return "gmac2_gephy";
36+
case MTK_ETH_PATH_GDM1_ESW:
37+
return "gdm1_esw";
38+
default:
39+
return "unknown path";
40+
}
41+
}
2942

3043
static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path)
3144
{
@@ -53,7 +66,7 @@ static int set_mux_gdm1_to_gmac1_esw(struct mtk_eth *eth, int path)
5366
}
5467

5568
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
56-
mtk_eth_path_name[path], __func__, updated);
69+
mtk_eth_path_name(path), __func__, updated);
5770

5871
return 0;
5972
}
@@ -76,7 +89,7 @@ static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, int path)
7689
regmap_update_bits(eth->infra, INFRA_MISC2, GEPHY_MAC_SEL, val);
7790

7891
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
79-
mtk_eth_path_name[path], __func__, updated);
92+
mtk_eth_path_name(path), __func__, updated);
8093

8194
return 0;
8295
}
@@ -99,7 +112,7 @@ static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path)
99112
regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val);
100113

101114
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
102-
mtk_eth_path_name[path], __func__, updated);
115+
mtk_eth_path_name(path), __func__, updated);
103116

104117
return 0;
105118
}
@@ -137,7 +150,7 @@ static int set_mux_gmac1_gmac2_to_sgmii_rgmii(struct mtk_eth *eth, int path)
137150
SYSCFG0_SGMII_MASK, val);
138151

139152
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
140-
mtk_eth_path_name[path], __func__, updated);
153+
mtk_eth_path_name(path), __func__, updated);
141154

142155
return 0;
143156
}
@@ -168,41 +181,57 @@ static int set_mux_gmac12_to_gephy_sgmii(struct mtk_eth *eth, int path)
168181
SYSCFG0_SGMII_MASK, val);
169182

170183
dev_dbg(eth->dev, "path %s in %s updated = %d\n",
171-
mtk_eth_path_name[path], __func__, updated);
184+
mtk_eth_path_name(path), __func__, updated);
172185

173186
return 0;
174187
}
175188

176189
static const struct mtk_eth_muxc mtk_eth_muxc[] = {
177-
{ .set_path = set_mux_gdm1_to_gmac1_esw, },
178-
{ .set_path = set_mux_gmac2_gmac0_to_gephy, },
179-
{ .set_path = set_mux_u3_gmac2_to_qphy, },
180-
{ .set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii, },
181-
{ .set_path = set_mux_gmac12_to_gephy_sgmii, }
190+
{
191+
.name = "mux_gdm1_to_gmac1_esw",
192+
.cap_bit = MTK_ETH_MUX_GDM1_TO_GMAC1_ESW,
193+
.set_path = set_mux_gdm1_to_gmac1_esw,
194+
}, {
195+
.name = "mux_gmac2_gmac0_to_gephy",
196+
.cap_bit = MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY,
197+
.set_path = set_mux_gmac2_gmac0_to_gephy,
198+
}, {
199+
.name = "mux_u3_gmac2_to_qphy",
200+
.cap_bit = MTK_ETH_MUX_U3_GMAC2_TO_QPHY,
201+
.set_path = set_mux_u3_gmac2_to_qphy,
202+
}, {
203+
.name = "mux_gmac1_gmac2_to_sgmii_rgmii",
204+
.cap_bit = MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII,
205+
.set_path = set_mux_gmac1_gmac2_to_sgmii_rgmii,
206+
}, {
207+
.name = "mux_gmac12_to_gephy_sgmii",
208+
.cap_bit = MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII,
209+
.set_path = set_mux_gmac12_to_gephy_sgmii,
210+
},
182211
};
183212

184213
static int mtk_eth_mux_setup(struct mtk_eth *eth, int path)
185214
{
186215
int i, err = 0;
187216

188-
if (!MTK_HAS_CAPS(eth->soc->caps, MTK_PATH_BIT(path))) {
217+
if (!MTK_HAS_CAPS(eth->soc->caps, path)) {
189218
dev_err(eth->dev, "path %s isn't support on the SoC\n",
190-
mtk_eth_path_name[path]);
219+
mtk_eth_path_name(path));
191220
return -EINVAL;
192221
}
193222

194223
if (!MTK_HAS_CAPS(eth->soc->caps, MTK_MUX))
195224
return 0;
196225

197226
/* Setup MUX in path fabric */
198-
for (i = 0; i < MTK_ETH_MUX_MAX; i++) {
199-
if (MTK_HAS_CAPS(eth->soc->caps, MTK_MUX_BIT(i))) {
227+
for (i = 0; i < ARRAY_SIZE(mtk_eth_muxc); i++) {
228+
if (MTK_HAS_CAPS(eth->soc->caps, mtk_eth_muxc[i].cap_bit)) {
200229
err = mtk_eth_muxc[i].set_path(eth, path);
201230
if (err)
202231
goto out;
203232
} else {
204233
dev_dbg(eth->dev, "mux %s isn't present on the SoC\n",
205-
mtk_eth_mux_name[i]);
234+
mtk_eth_muxc[i].name);
206235
}
207236
}
208237

drivers/net/ethernet/mediatek/mtk_eth_soc.h

Lines changed: 70 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -592,86 +592,97 @@ struct mtk_rx_ring {
592592
u32 crx_idx_reg;
593593
};
594594

595-
enum mtk_eth_mux {
596-
MTK_ETH_MUX_GDM1_TO_GMAC1_ESW,
597-
MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY,
598-
MTK_ETH_MUX_U3_GMAC2_TO_QPHY,
599-
MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII,
600-
MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII,
601-
MTK_ETH_MUX_MAX,
602-
};
603-
604-
enum mtk_eth_path {
605-
MTK_ETH_PATH_GMAC1_RGMII,
606-
MTK_ETH_PATH_GMAC1_TRGMII,
607-
MTK_ETH_PATH_GMAC1_SGMII,
608-
MTK_ETH_PATH_GMAC2_RGMII,
609-
MTK_ETH_PATH_GMAC2_SGMII,
610-
MTK_ETH_PATH_GMAC2_GEPHY,
611-
MTK_ETH_PATH_GDM1_ESW,
612-
MTK_ETH_PATH_MAX,
595+
enum mkt_eth_capabilities {
596+
MTK_RGMII_BIT = 0,
597+
MTK_TRGMII_BIT,
598+
MTK_SGMII_BIT,
599+
MTK_ESW_BIT,
600+
MTK_GEPHY_BIT,
601+
MTK_MUX_BIT,
602+
MTK_INFRA_BIT,
603+
MTK_SHARED_SGMII_BIT,
604+
MTK_HWLRO_BIT,
605+
MTK_SHARED_INT_BIT,
606+
MTK_TRGMII_MT7621_CLK_BIT,
607+
608+
/* MUX BITS*/
609+
MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
610+
MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT,
611+
MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT,
612+
MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT,
613+
MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT,
614+
615+
/* PATH BITS */
616+
MTK_ETH_PATH_GMAC1_RGMII_BIT,
617+
MTK_ETH_PATH_GMAC1_TRGMII_BIT,
618+
MTK_ETH_PATH_GMAC1_SGMII_BIT,
619+
MTK_ETH_PATH_GMAC2_RGMII_BIT,
620+
MTK_ETH_PATH_GMAC2_SGMII_BIT,
621+
MTK_ETH_PATH_GMAC2_GEPHY_BIT,
622+
MTK_ETH_PATH_GDM1_ESW_BIT,
613623
};
614624

615625
/* Supported hardware group on SoCs */
616-
#define MTK_RGMII BIT(0)
617-
#define MTK_TRGMII BIT(1)
618-
#define MTK_SGMII BIT(2)
619-
#define MTK_ESW BIT(3)
620-
#define MTK_GEPHY BIT(4)
621-
#define MTK_MUX BIT(5)
622-
#define MTK_INFRA BIT(6)
623-
#define MTK_SHARED_SGMII BIT(7)
624-
#define MTK_HWLRO BIT(8)
625-
#define MTK_SHARED_INT BIT(9)
626-
#define MTK_TRGMII_MT7621_CLK BIT(10)
626+
#define MTK_RGMII BIT(MTK_RGMII_BIT)
627+
#define MTK_TRGMII BIT(MTK_TRGMII_BIT)
628+
#define MTK_SGMII BIT(MTK_SGMII_BIT)
629+
#define MTK_ESW BIT(MTK_ESW_BIT)
630+
#define MTK_GEPHY BIT(MTK_GEPHY_BIT)
631+
#define MTK_MUX BIT(MTK_MUX_BIT)
632+
#define MTK_INFRA BIT(MTK_INFRA_BIT)
633+
#define MTK_SHARED_SGMII BIT(MTK_SHARED_SGMII_BIT)
634+
#define MTK_HWLRO BIT(MTK_HWLRO_BIT)
635+
#define MTK_SHARED_INT BIT(MTK_SHARED_INT_BIT)
636+
#define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT)
637+
638+
#define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
639+
BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
640+
#define MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY \
641+
BIT(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT)
642+
#define MTK_ETH_MUX_U3_GMAC2_TO_QPHY \
643+
BIT(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT)
644+
#define MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII \
645+
BIT(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII_BIT)
646+
#define MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII \
647+
BIT(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII_BIT)
627648

628649
/* Supported path present on SoCs */
629-
#define MTK_PATH_BIT(x) BIT((x) + 10)
630-
631-
#define MTK_GMAC1_RGMII \
632-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC1_RGMII) | MTK_RGMII)
633-
634-
#define MTK_GMAC1_TRGMII \
635-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC1_TRGMII) | MTK_TRGMII)
636-
637-
#define MTK_GMAC1_SGMII \
638-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC1_SGMII) | MTK_SGMII)
639-
640-
#define MTK_GMAC2_RGMII \
641-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC2_RGMII) | MTK_RGMII)
642-
643-
#define MTK_GMAC2_SGMII \
644-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC2_SGMII) | MTK_SGMII)
645-
646-
#define MTK_GMAC2_GEPHY \
647-
(MTK_PATH_BIT(MTK_ETH_PATH_GMAC2_GEPHY) | MTK_GEPHY)
648-
649-
#define MTK_GDM1_ESW \
650-
(MTK_PATH_BIT(MTK_ETH_PATH_GDM1_ESW) | MTK_ESW)
651-
652-
#define MTK_MUX_BIT(x) BIT((x) + 20)
650+
#define MTK_ETH_PATH_GMAC1_RGMII BIT(MTK_ETH_PATH_GMAC1_RGMII_BIT)
651+
#define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT)
652+
#define MTK_ETH_PATH_GMAC1_SGMII BIT(MTK_ETH_PATH_GMAC1_SGMII_BIT)
653+
#define MTK_ETH_PATH_GMAC2_RGMII BIT(MTK_ETH_PATH_GMAC2_RGMII_BIT)
654+
#define MTK_ETH_PATH_GMAC2_SGMII BIT(MTK_ETH_PATH_GMAC2_SGMII_BIT)
655+
#define MTK_ETH_PATH_GMAC2_GEPHY BIT(MTK_ETH_PATH_GMAC2_GEPHY_BIT)
656+
#define MTK_ETH_PATH_GDM1_ESW BIT(MTK_ETH_PATH_GDM1_ESW_BIT)
657+
658+
#define MTK_GMAC1_RGMII (MTK_ETH_PATH_GMAC1_RGMII | MTK_RGMII)
659+
#define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII)
660+
#define MTK_GMAC1_SGMII (MTK_ETH_PATH_GMAC1_SGMII | MTK_SGMII)
661+
#define MTK_GMAC2_RGMII (MTK_ETH_PATH_GMAC2_RGMII | MTK_RGMII)
662+
#define MTK_GMAC2_SGMII (MTK_ETH_PATH_GMAC2_SGMII | MTK_SGMII)
663+
#define MTK_GMAC2_GEPHY (MTK_ETH_PATH_GMAC2_GEPHY | MTK_GEPHY)
664+
#define MTK_GDM1_ESW (MTK_ETH_PATH_GDM1_ESW | MTK_ESW)
653665

654666
/* MUXes present on SoCs */
655667
/* 0: GDM1 -> GMAC1, 1: GDM1 -> ESW */
656-
#define MTK_MUX_GDM1_TO_GMAC1_ESW \
657-
(MTK_MUX_BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW) | MTK_MUX)
668+
#define MTK_MUX_GDM1_TO_GMAC1_ESW (MTK_ETH_MUX_GDM1_TO_GMAC1_ESW | MTK_MUX)
658669

659670
/* 0: GMAC2 -> GEPHY, 1: GMAC0 -> GePHY */
660671
#define MTK_MUX_GMAC2_GMAC0_TO_GEPHY \
661-
(MTK_MUX_BIT(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY) | MTK_MUX | MTK_INFRA)
672+
(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY | MTK_MUX | MTK_INFRA)
662673

663674
/* 0: U3 -> QPHY, 1: GMAC2 -> QPHY */
664675
#define MTK_MUX_U3_GMAC2_TO_QPHY \
665-
(MTK_MUX_BIT(MTK_ETH_MUX_U3_GMAC2_TO_QPHY) | MTK_MUX | MTK_INFRA)
676+
(MTK_ETH_MUX_U3_GMAC2_TO_QPHY | MTK_MUX | MTK_INFRA)
666677

667678
/* 2: GMAC1 -> SGMII, 3: GMAC2 -> SGMII */
668679
#define MTK_MUX_GMAC1_GMAC2_TO_SGMII_RGMII \
669-
(MTK_MUX_BIT(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII) | MTK_MUX | \
680+
(MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII | MTK_MUX | \
670681
MTK_SHARED_SGMII)
671682

672683
/* 0: GMACx -> GEPHY, 1: GMACx -> SGMII where x is 1 or 2 */
673684
#define MTK_MUX_GMAC12_TO_GEPHY_SGMII \
674-
(MTK_MUX_BIT(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII) | MTK_MUX)
685+
(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII | MTK_MUX)
675686

676687
#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
677688

0 commit comments

Comments
 (0)