ec51e3f6792884a7e67aa969bc6c5937df2bae6d
[openwrt/staging/ldir.git] /
1 From c1b2294a9b4b9b6c0cbe58666cb86e0a9cb0abfd Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
3 Date: Mon, 22 Jan 2024 08:35:56 +0300
4 Subject: [PATCH 09/30] net: dsa: mt7530: improve code path for setting up port
5 5
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 There're two code paths for setting up port 5:
11
12 mt7530_setup()
13 -> mt7530_setup_port5()
14
15 mt753x_phylink_mac_config()
16 -> mt753x_mac_config()
17 -> mt7530_mac_config()
18 -> mt7530_setup_port5()
19
20 Currently mt7530_setup_port5() from mt7530_setup() always runs. If port 5
21 is used as a CPU, DSA, or user port, mt7530_setup_port5() from
22 mt753x_phylink_mac_config() won't run. That is because priv->p5_interface
23 set on mt7530_setup_port5() will match state->interface on
24 mt753x_phylink_mac_config() which will stop running mt7530_setup_port5()
25 again.
26
27 Therefore, mt7530_setup_port5() will never run from
28 mt753x_phylink_mac_config().
29
30 Address this by not running mt7530_setup_port5() from mt7530_setup() if
31 port 5 is used as a CPU, DSA, or user port. This driver isn't in the
32 dsa_switches_apply_workarounds[] array so phylink will always be present.
33
34 To keep the cases where port 5 isn't controlled by phylink working as
35 before, preserve the mt7530_setup_port5() call from mt7530_setup().
36
37 Do not set priv->p5_intf_sel to P5_DISABLED. It is already set to that when
38 "priv" is allocated.
39
40 Move setting the interface to a more specific location. It's supposed to be
41 overwritten if PHY muxing is detected.
42
43 Improve the comment which explains the process.
44
45 Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
46 Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
47 Link: https://lore.kernel.org/r/20240122-for-netnext-mt7530-improvements-1-v3-5-042401f2b279@arinc9.com
48 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
49 ---
50 drivers/net/dsa/mt7530.c | 17 ++++++++---------
51 1 file changed, 8 insertions(+), 9 deletions(-)
52
53 --- a/drivers/net/dsa/mt7530.c
54 +++ b/drivers/net/dsa/mt7530.c
55 @@ -2523,16 +2523,15 @@ mt7530_setup(struct dsa_switch *ds)
56 return ret;
57
58 /* Setup port 5 */
59 - priv->p5_intf_sel = P5_DISABLED;
60 - interface = PHY_INTERFACE_MODE_NA;
61 -
62 if (!dsa_is_unused_port(ds, 5)) {
63 priv->p5_intf_sel = P5_INTF_SEL_GMAC5;
64 - ret = of_get_phy_mode(dsa_to_port(ds, 5)->dn, &interface);
65 - if (ret && ret != -ENODEV)
66 - return ret;
67 } else {
68 - /* Scan the ethernet nodes. look for GMAC1, lookup used phy */
69 + /* Scan the ethernet nodes. Look for GMAC1, lookup the used PHY.
70 + * Set priv->p5_intf_sel to the appropriate value if PHY muxing
71 + * is detected.
72 + */
73 + interface = PHY_INTERFACE_MODE_NA;
74 +
75 for_each_child_of_node(dn, mac_np) {
76 if (!of_device_is_compatible(mac_np,
77 "mediatek,eth-mac"))
78 @@ -2563,6 +2562,8 @@ mt7530_setup(struct dsa_switch *ds)
79 of_node_put(phy_node);
80 break;
81 }
82 +
83 + mt7530_setup_port5(ds, interface);
84 }
85
86 #ifdef CONFIG_GPIOLIB
87 @@ -2573,8 +2574,6 @@ mt7530_setup(struct dsa_switch *ds)
88 }
89 #endif /* CONFIG_GPIOLIB */
90
91 - mt7530_setup_port5(ds, interface);
92 -
93 /* Flush the FDB table */
94 ret = mt7530_fdb_cmd(priv, MT7530_FDB_FLUSH, NULL);
95 if (ret < 0)