Files
eternalwrt-mt798x/target/linux/generic/pending-6.18/711-07-net-dsa-qca8k-use-correct-CPU-port-when-having-multi.patch
T
Rosen PenevandJonas Jelonek 9716066e80 kernel: add qualcommax patches to generic
Move upstreamed patches to backports.

Move the others to pending.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/24013
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-07-05 13:02:07 +02:00

91 lines
2.4 KiB
Diff

From 08740093ef69e94613f19323f3abc55cb5d6863d Mon Sep 17 00:00:00 2001
From: Ziyang Huang <hzyitc@outlook.com>
Date: Wed, 14 Jan 2026 23:38:30 +0800
Subject: [PATCH 2/3] net: dsa: qca8k: use correct CPU port when having multi
CPU ports
DSA framework call dsa_tree_setup_cpu_ports() to find a default CPU port.
If .preferred_default_local_cpu_port() isn't implemented, it will use the
first CPU port, which is different from qca8k_find_cpu_port().
Signed-off-by: Ziyang Huang <hzyitc@outlook.com>
---
drivers/net/dsa/qca/qca8k-8xxx.c | 38 ++++++--------------------------
1 file changed, 7 insertions(+), 31 deletions(-)
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -1087,24 +1087,6 @@ qca8k_setup_mac_pwr_sel(struct qca8k_pri
return ret;
}
-static int qca8k_find_cpu_port(struct dsa_switch *ds)
-{
- int i;
-
- if (dsa_is_cpu_port(ds, 0))
- return 0;
-
- if (dsa_is_cpu_port(ds, 6))
- return 6;
-
- /* PHY-to-PHY link */
- for (i = 1; i <= 5; i++)
- if (dsa_is_cpu_port(ds, i))
- return i;
-
- return -EINVAL;
-}
-
static int
qca8k_setup_of_pws_reg(struct qca8k_priv *priv)
{
@@ -1957,15 +1939,9 @@ qca8k_setup(struct dsa_switch *ds)
{
struct qca8k_priv *priv = ds->priv;
struct dsa_port *dp;
- int cpu_port, ret;
+ int ret;
u32 mask;
- cpu_port = qca8k_find_cpu_port(ds);
- if (cpu_port < 0) {
- dev_err(priv->dev, "No cpu port configured");
- return cpu_port;
- }
-
/* Parse CPU port config to be later used in phy_link mac_config */
ret = qca8k_parse_port_config(priv);
if (ret)
@@ -2044,17 +2020,12 @@ qca8k_setup(struct dsa_switch *ds)
if (ret)
return ret;
- /* CPU port gets connected to all user ports of the switch */
- ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
- QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
- if (ret)
- return ret;
-
/* Setup connection between CPU port & user ports
* Individual user ports get connected to CPU port only
*/
dsa_switch_for_each_user_port(dp, ds) {
u8 port = dp->index;
+ u8 cpu_port = dp->cpu_dp->index;
ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
QCA8K_PORT_LOOKUP_MEMBER,
@@ -2067,6 +2038,11 @@ qca8k_setup(struct dsa_switch *ds)
if (ret)
return ret;
+ ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
+ BIT(port), BIT(port));
+ if (ret)
+ return ret;
+
/* For port based vlans to work we need to set the
* default egress vid
*/