Skip to content

Commit a5c5ca0

Browse files
hzyitcrobimarko
authored andcommitted
qualcommax: qca8337: fix multi CPU links issue
Use correct CPU link when having multi CPU ports. Signed-off-by: Ziyang Huang <hzyitc@outlook.com> Link: openwrt/openwrt#21496 Signed-off-by: Robert Marko <robimarko@gmail.com>
1 parent 76eb777 commit a5c5ca0

3 files changed

Lines changed: 143 additions & 4 deletions

target/linux/qualcommax/patches-6.12/0752-net-dsa-qca8k-support-PHY-to-PHY-CPU-link.patch

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
From 8a56ac86c2eed13024413aa23a6cda85613d60f9 Mon Sep 17 00:00:00 2001
1+
From e82cfa658fc4a0429b3d159d0e1bedb6b5cc6d38 Mon Sep 17 00:00:00 2001
22
From: Ziyang Huang <hzyitc@outlook.com>
33
Date: Sat, 18 Jan 2025 16:18:40 +0800
4-
Subject: [PATCH 1/2] net: dsa: qca8k: support PHY-to-PHY CPU link
4+
Subject: [PATCH 1/3] net: dsa: qca8k: support PHY-to-PHY CPU link
55

66
PHY-to-PHY CPU link is a common/demo design in IPQ50xx platform, since it only has a SGMII/SGMII+ link and a MDI link.
77

88
For DSA, CPU tag is the only requirement. Fortunately, qca8337 can enable it on any port. So it's ok to trust a PHY-to-PHY link as a CPU link.
99

1010
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
1111
---
12-
drivers/net/dsa/qca/qca8k-8xxx.c | 12 +++++++-----
13-
1 file changed, 7 insertions(+), 5 deletions(-)
12+
drivers/net/dsa/qca/qca8k-8xxx.c | 14 ++++++++------
13+
1 file changed, 8 insertions(+), 6 deletions(-)
1414

1515
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
1616
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -47,3 +47,12 @@ Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
4747
return -EINVAL;
4848
}
4949

50+
@@ -1950,7 +1952,7 @@ qca8k_setup(struct dsa_switch *ds)
51+
52+
cpu_port = qca8k_find_cpu_port(ds);
53+
if (cpu_port < 0) {
54+
- dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6");
55+
+ dev_err(priv->dev, "No cpu port configured");
56+
return cpu_port;
57+
}
58+
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
From 08740093ef69e94613f19323f3abc55cb5d6863d Mon Sep 17 00:00:00 2001
2+
From: Ziyang Huang <hzyitc@outlook.com>
3+
Date: Wed, 14 Jan 2026 23:38:30 +0800
4+
Subject: [PATCH 2/3] net: dsa: qca8k: use correct CPU port when having multi
5+
CPU ports
6+
7+
DSA framework call dsa_tree_setup_cpu_ports() to find a default CPU port.
8+
If .preferred_default_local_cpu_port() isn't implemented, it will use the
9+
first CPU port, which is different from qca8k_find_cpu_port().
10+
11+
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
12+
---
13+
drivers/net/dsa/qca/qca8k-8xxx.c | 38 ++++++--------------------------
14+
1 file changed, 7 insertions(+), 31 deletions(-)
15+
16+
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
17+
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
18+
@@ -1087,24 +1087,6 @@ qca8k_setup_mac_pwr_sel(struct qca8k_pri
19+
return ret;
20+
}
21+
22+
-static int qca8k_find_cpu_port(struct dsa_switch *ds)
23+
-{
24+
- int i;
25+
-
26+
- if (dsa_is_cpu_port(ds, 0))
27+
- return 0;
28+
-
29+
- if (dsa_is_cpu_port(ds, 6))
30+
- return 6;
31+
-
32+
- /* PHY-to-PHY link */
33+
- for (i = 1; i <= 5; i++)
34+
- if (dsa_is_cpu_port(ds, i))
35+
- return i;
36+
-
37+
- return -EINVAL;
38+
-}
39+
-
40+
static int
41+
qca8k_setup_of_pws_reg(struct qca8k_priv *priv)
42+
{
43+
@@ -1947,15 +1929,9 @@ qca8k_setup(struct dsa_switch *ds)
44+
{
45+
struct qca8k_priv *priv = ds->priv;
46+
struct dsa_port *dp;
47+
- int cpu_port, ret;
48+
+ int ret;
49+
u32 mask;
50+
51+
- cpu_port = qca8k_find_cpu_port(ds);
52+
- if (cpu_port < 0) {
53+
- dev_err(priv->dev, "No cpu port configured");
54+
- return cpu_port;
55+
- }
56+
-
57+
/* Parse CPU port config to be later used in phy_link mac_config */
58+
ret = qca8k_parse_port_config(priv);
59+
if (ret)
60+
@@ -2040,17 +2016,12 @@ qca8k_setup(struct dsa_switch *ds)
61+
if (ret)
62+
return ret;
63+
64+
- /* CPU port gets connected to all user ports of the switch */
65+
- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
66+
- QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
67+
- if (ret)
68+
- return ret;
69+
-
70+
/* Setup connection between CPU port & user ports
71+
* Individual user ports get connected to CPU port only
72+
*/
73+
dsa_switch_for_each_user_port(dp, ds) {
74+
u8 port = dp->index;
75+
+ u8 cpu_port = dp->cpu_dp->index;
76+
77+
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
78+
QCA8K_PORT_LOOKUP_MEMBER,
79+
@@ -2058,6 +2029,11 @@ qca8k_setup(struct dsa_switch *ds)
80+
if (ret)
81+
return ret;
82+
83+
+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
84+
+ BIT(port), BIT(port));
85+
+ if (ret)
86+
+ return ret;
87+
+
88+
/* For port based vlans to work we need to set the
89+
* default egress vid
90+
*/
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
From a572f1020159294fe980606996e7e3af5fa7ba9a Mon Sep 17 00:00:00 2001
2+
From: Ziyang Huang <hzyitc@outlook.com>
3+
Date: Wed, 14 Jan 2026 23:38:30 +0800
4+
Subject: [PATCH 3/3] net: dsa: qca8k: implement
5+
ds->ops->preferred_default_local_cpu_port()
6+
7+
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
8+
---
9+
drivers/net/dsa/qca/qca8k-8xxx.c | 13 +++++++++++++
10+
1 file changed, 13 insertions(+)
11+
12+
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
13+
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
14+
@@ -1733,6 +1733,18 @@ qca8k_get_tag_protocol(struct dsa_switch
15+
return DSA_TAG_PROTO_QCA;
16+
}
17+
18+
+static struct dsa_port *
19+
+qca8k_preferred_default_local_cpu_port(struct dsa_switch *ds)
20+
+{
21+
+ if (dsa_is_cpu_port(ds, 0))
22+
+ return dsa_to_port(ds, 0);
23+
+
24+
+ if (dsa_is_cpu_port(ds, 6))
25+
+ return dsa_to_port(ds, 6);
26+
+
27+
+ return NULL;
28+
+}
29+
+
30+
static int qca8k_port_change_master(struct dsa_switch *ds, int port,
31+
struct net_device *master,
32+
struct netlink_ext_ack *extack)
33+
@@ -2133,6 +2145,7 @@ static const struct dsa_switch_ops qca8k
34+
.get_phy_flags = qca8k_get_phy_flags,
35+
.port_lag_join = qca8xxx_port_lag_join,
36+
.port_lag_leave = qca8xxx_port_lag_leave,
37+
+ .preferred_default_local_cpu_port = qca8k_preferred_default_local_cpu_port,
38+
.port_change_conduit = qca8k_port_change_master,
39+
.conduit_state_change = qca8k_conduit_change,
40+
.connect_tag_protocol = qca8k_connect_tag_protocol,

0 commit comments

Comments
 (0)