mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-24 05:18:14 +00:00
401a6ccfaf
Backport lots upstream changes, many of them fixes, for the mt7530 DSA driver. Some of them may or may not find they way into Linux 6.1 stable, some certainly won't because they are fixes for backported commits which aren't even present in Linux 6.1 upstream. Apart from adding new patches, also remove mutated patch 723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch which should never have been added for Linux 6.1 -- it was applied already upstream but coincidentally would fuzzy-apply in the wrong place as well (for MT7530 instead of MT7531). While that didn't really hurt anyone it is just unneeded. The other deleted patch 795-mt7530-register-OF-node-for-internal-MDIO-bus.patch has been replaced by an equivalent commit with a more complete patch description by upstream maintainer Arınç Ünal. The remaining differences compared to the upstream driver are: * C22/C45 MDIO ops aren't split Upstream did that, backporting it would require making changes to *all* DSA drivers * 'slave' -> 'user', 'master' -> 'conduit' language change in DSA * support for selecting preferred CPU port on MT7531 Also this would require too many DSA framework changes potentially affecting other devices. If we ever really use Linux 6.1 in a release (I hope not) we can still reconsider to make the effort to backport that. In addition to some minor bug fixes and style improvements the switch should now behave more conformant when it comes to link-local frames, and we will again be able to cleanly pick patches from upstream. MAINTAIERS NOTE: Three patches are already part of Linux stable and should be removed with the next minor kernel version bump: 789-STABLE-01-net-dsa-mt7530-prevent-possible-incorrect-XTAL-frequ.patch 789-STABLE-02-net-dsa-mt7530-fix-link-local-frames-that-ingress-vl.patch 789-STABLE-03-net-dsa-mt7530-fix-handling-of-all-link-local-frames.patch Signed-off-by: Daniel Golle <daniel@makrotopia.org>
134 lines
5.9 KiB
Diff
134 lines
5.9 KiB
Diff
From 86c0c154a759f2af9612a04bdf29110f02dce956 Mon Sep 17 00:00:00 2001
|
||
From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
|
||
Date: Thu, 14 Mar 2024 12:33:42 +0300
|
||
Subject: [PATCH 3/3] net: dsa: mt7530: fix handling of all link-local frames
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
[ Upstream commit 69ddba9d170bdaee1dc0eb4ced38d7e4bb7b92af ]
|
||
|
||
Currently, the MT753X switches treat frames with :01-0D and :0F MAC DAs as
|
||
regular multicast frames, therefore flooding them to user ports.
|
||
|
||
On page 205, section "8.6.3 Frame filtering" of the active standard, IEEE
|
||
Std 802.1Q™-2022, it is stated that frames with 01:80:C2:00:00:00-0F as MAC
|
||
DA must only be propagated to C-VLAN and MAC Bridge components. That means
|
||
VLAN-aware and VLAN-unaware bridges. On the switch designs with CPU ports,
|
||
these frames are supposed to be processed by the CPU (software). So we make
|
||
the switch only forward them to the CPU port. And if received from a CPU
|
||
port, forward to a single port. The software is responsible of making the
|
||
switch conform to the latter by setting a single port as destination port
|
||
on the special tag.
|
||
|
||
This switch intellectual property cannot conform to this part of the
|
||
standard fully. Whilst the REV_UN frame tag covers the remaining :04-0D and
|
||
:0F MAC DAs, it also includes :22-FF which the scope of propagation is not
|
||
supposed to be restricted for these MAC DAs.
|
||
|
||
Set frames with :01-03 MAC DAs to be trapped to the CPU port(s). Add a
|
||
comment for the remaining MAC DAs.
|
||
|
||
Note that the ingress port must have a PVID assigned to it for the switch
|
||
to forward untagged frames. A PVID is set by default on VLAN-aware and
|
||
VLAN-unaware ports. However, when the network interface that pertains to
|
||
the ingress port is attached to a vlan_filtering enabled bridge, the user
|
||
can remove the PVID assignment from it which would prevent the link-local
|
||
frames from being trapped to the CPU port. I am yet to see a way to forward
|
||
link-local frames while preventing other untagged frames from being
|
||
forwarded too.
|
||
|
||
Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch")
|
||
Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
|
||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
||
---
|
||
drivers/net/dsa/mt7530.c | 37 +++++++++++++++++++++++++++++++++----
|
||
drivers/net/dsa/mt7530.h | 13 +++++++++++++
|
||
2 files changed, 46 insertions(+), 4 deletions(-)
|
||
|
||
--- a/drivers/net/dsa/mt7530.c
|
||
+++ b/drivers/net/dsa/mt7530.c
|
||
@@ -998,6 +998,21 @@ unlock_exit:
|
||
mutex_unlock(&priv->reg_mutex);
|
||
}
|
||
|
||
+/* On page 205, section "8.6.3 Frame filtering" of the active standard, IEEE Std
|
||
+ * 802.1Q™-2022, it is stated that frames with 01:80:C2:00:00:00-0F as MAC DA
|
||
+ * must only be propagated to C-VLAN and MAC Bridge components. That means
|
||
+ * VLAN-aware and VLAN-unaware bridges. On the switch designs with CPU ports,
|
||
+ * these frames are supposed to be processed by the CPU (software). So we make
|
||
+ * the switch only forward them to the CPU port. And if received from a CPU
|
||
+ * port, forward to a single port. The software is responsible of making the
|
||
+ * switch conform to the latter by setting a single port as destination port on
|
||
+ * the special tag.
|
||
+ *
|
||
+ * This switch intellectual property cannot conform to this part of the standard
|
||
+ * fully. Whilst the REV_UN frame tag covers the remaining :04-0D and :0F MAC
|
||
+ * DAs, it also includes :22-FF which the scope of propagation is not supposed
|
||
+ * to be restricted for these MAC DAs.
|
||
+ */
|
||
static void
|
||
mt753x_trap_frames(struct mt7530_priv *priv)
|
||
{
|
||
@@ -1012,13 +1027,27 @@ mt753x_trap_frames(struct mt7530_priv *p
|
||
MT753X_BPDU_EG_TAG(MT7530_VLAN_EG_UNTAGGED) |
|
||
MT753X_BPDU_CPU_ONLY);
|
||
|
||
- /* Trap LLDP frames with :0E MAC DA to the CPU port(s) and egress them
|
||
- * VLAN-untagged.
|
||
+ /* Trap frames with :01 and :02 MAC DAs to the CPU port(s) and egress
|
||
+ * them VLAN-untagged.
|
||
+ */
|
||
+ mt7530_rmw(priv, MT753X_RGAC1, MT753X_R02_EG_TAG_MASK |
|
||
+ MT753X_R02_PORT_FW_MASK | MT753X_R01_EG_TAG_MASK |
|
||
+ MT753X_R01_PORT_FW_MASK,
|
||
+ MT753X_R02_EG_TAG(MT7530_VLAN_EG_UNTAGGED) |
|
||
+ MT753X_R02_PORT_FW(MT753X_BPDU_CPU_ONLY) |
|
||
+ MT753X_R01_EG_TAG(MT7530_VLAN_EG_UNTAGGED) |
|
||
+ MT753X_BPDU_CPU_ONLY);
|
||
+
|
||
+ /* Trap frames with :03 and :0E MAC DAs to the CPU port(s) and egress
|
||
+ * them VLAN-untagged.
|
||
*/
|
||
mt7530_rmw(priv, MT753X_RGAC2, MT753X_R0E_EG_TAG_MASK |
|
||
- MT753X_R0E_PORT_FW_MASK,
|
||
+ MT753X_R0E_PORT_FW_MASK | MT753X_R03_EG_TAG_MASK |
|
||
+ MT753X_R03_PORT_FW_MASK,
|
||
MT753X_R0E_EG_TAG(MT7530_VLAN_EG_UNTAGGED) |
|
||
- MT753X_R0E_PORT_FW(MT753X_BPDU_CPU_ONLY));
|
||
+ MT753X_R0E_PORT_FW(MT753X_BPDU_CPU_ONLY) |
|
||
+ MT753X_R03_EG_TAG(MT7530_VLAN_EG_UNTAGGED) |
|
||
+ MT753X_BPDU_CPU_ONLY);
|
||
}
|
||
|
||
static int
|
||
--- a/drivers/net/dsa/mt7530.h
|
||
+++ b/drivers/net/dsa/mt7530.h
|
||
@@ -71,12 +71,25 @@ enum mt753x_id {
|
||
#define MT753X_BPDU_EG_TAG(x) FIELD_PREP(MT753X_BPDU_EG_TAG_MASK, x)
|
||
#define MT753X_BPDU_PORT_FW_MASK GENMASK(2, 0)
|
||
|
||
+/* Register for :01 and :02 MAC DA frame control */
|
||
+#define MT753X_RGAC1 0x28
|
||
+#define MT753X_R02_EG_TAG_MASK GENMASK(24, 22)
|
||
+#define MT753X_R02_EG_TAG(x) FIELD_PREP(MT753X_R02_EG_TAG_MASK, x)
|
||
+#define MT753X_R02_PORT_FW_MASK GENMASK(18, 16)
|
||
+#define MT753X_R02_PORT_FW(x) FIELD_PREP(MT753X_R02_PORT_FW_MASK, x)
|
||
+#define MT753X_R01_EG_TAG_MASK GENMASK(8, 6)
|
||
+#define MT753X_R01_EG_TAG(x) FIELD_PREP(MT753X_R01_EG_TAG_MASK, x)
|
||
+#define MT753X_R01_PORT_FW_MASK GENMASK(2, 0)
|
||
+
|
||
/* Register for :03 and :0E MAC DA frame control */
|
||
#define MT753X_RGAC2 0x2c
|
||
#define MT753X_R0E_EG_TAG_MASK GENMASK(24, 22)
|
||
#define MT753X_R0E_EG_TAG(x) FIELD_PREP(MT753X_R0E_EG_TAG_MASK, x)
|
||
#define MT753X_R0E_PORT_FW_MASK GENMASK(18, 16)
|
||
#define MT753X_R0E_PORT_FW(x) FIELD_PREP(MT753X_R0E_PORT_FW_MASK, x)
|
||
+#define MT753X_R03_EG_TAG_MASK GENMASK(8, 6)
|
||
+#define MT753X_R03_EG_TAG(x) FIELD_PREP(MT753X_R03_EG_TAG_MASK, x)
|
||
+#define MT753X_R03_PORT_FW_MASK GENMASK(2, 0)
|
||
|
||
enum mt753x_bpdu_port_fw {
|
||
MT753X_BPDU_FOLLOW_MFC,
|