generic: 6.12: reorganize b53 patches
authorÁlvaro Fernández Rojas <[email protected]>
Wed, 19 Nov 2025 18:21:44 +0000 (19:21 +0100)
committerÁlvaro Fernández Rojas <[email protected]>
Fri, 21 Nov 2025 20:42:55 +0000 (21:42 +0100)
A considerable amount of b53 patches has been backported to 6.12, so we
can rename and group the remaining ones.

Signed-off-by: Álvaro Fernández Rojas <[email protected]>
20 files changed:
target/linux/generic/backport-6.12/610-02-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/610-03-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch [deleted file]
target/linux/generic/backport-6.12/610-03-v6.16-net-dsa-b53-implement-setting-ageing-time.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-implement-setting-ageing-time.patch [deleted file]
target/linux/generic/backport-6.12/610-07-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch [deleted file]
target/linux/generic/backport-6.12/611-01-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-02-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-03-v6.17-net-dsa-b53-detect-BCM5325-variants.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-04-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-05-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-06-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/611-07-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch [new file with mode: 0644]
target/linux/generic/backport-6.12/612-02-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch [deleted file]
target/linux/generic/backport-6.12/612-03-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch [deleted file]
target/linux/generic/backport-6.12/612-04-v6.17-net-dsa-b53-detect-BCM5325-variants.patch [deleted file]
target/linux/generic/backport-6.12/612-05-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch [deleted file]
target/linux/generic/backport-6.12/612-06-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch [deleted file]
target/linux/generic/backport-6.12/612-10-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch [deleted file]
target/linux/generic/backport-6.12/612-12-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch [deleted file]

diff --git a/target/linux/generic/backport-6.12/610-02-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch b/target/linux/generic/backport-6.12/610-02-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch
new file mode 100644 (file)
index 0000000..0ec9f51
--- /dev/null
@@ -0,0 +1,76 @@
+From c4f873c2b65c839ff5e7c996bd9ef5a1e7eae11a Mon Sep 17 00:00:00 2001
+From: Torben Nielsen <[email protected]>
+Date: Mon, 17 Feb 2025 09:05:01 +0100
+Subject: [PATCH] net: dsa: b53: mdio: add support for BCM53101
+
+BCM53101 is a ethernet switch, very similar to the BCM53115.
+Enable support for it, in the existing b53 dsa driver.
+
+Signed-off-by: Torben Nielsen <[email protected]>
+Signed-off-by: Claus Stovgaard <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 14 ++++++++++++++
+ drivers/net/dsa/b53/b53_mdio.c   |  1 +
+ drivers/net/dsa/b53/b53_priv.h   |  2 ++
+ 3 files changed, 17 insertions(+)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -2603,6 +2603,19 @@ static const struct b53_chip_data b53_sw
+               .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
+       },
+       {
++              .chip_id = BCM53101_DEVICE_ID,
++              .dev_name = "BCM53101",
++              .vlans = 4096,
++              .enabled_ports = 0x11f,
++              .arl_bins = 4,
++              .arl_buckets = 512,
++              .vta_regs = B53_VTA_REGS,
++              .imp_port = 8,
++              .duplex_reg = B53_DUPLEX_STAT_GE,
++              .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
++              .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
++      },
++      {
+               .chip_id = BCM53115_DEVICE_ID,
+               .dev_name = "BCM53115",
+               .vlans = 4096,
+@@ -2983,6 +2996,7 @@ int b53_switch_detect(struct b53_device
+                       return ret;
+               switch (id32) {
++              case BCM53101_DEVICE_ID:
+               case BCM53115_DEVICE_ID:
+               case BCM53125_DEVICE_ID:
+               case BCM53128_DEVICE_ID:
+--- a/drivers/net/dsa/b53/b53_mdio.c
++++ b/drivers/net/dsa/b53/b53_mdio.c
+@@ -374,6 +374,7 @@ static void b53_mdio_shutdown(struct mdi
+ static const struct of_device_id b53_of_match[] = {
+       { .compatible = "brcm,bcm5325" },
++      { .compatible = "brcm,bcm53101" },
+       { .compatible = "brcm,bcm53115" },
+       { .compatible = "brcm,bcm53125" },
+       { .compatible = "brcm,bcm53128" },
+--- a/drivers/net/dsa/b53/b53_priv.h
++++ b/drivers/net/dsa/b53/b53_priv.h
+@@ -66,6 +66,7 @@ enum {
+       BCM5395_DEVICE_ID = 0x95,
+       BCM5397_DEVICE_ID = 0x97,
+       BCM5398_DEVICE_ID = 0x98,
++      BCM53101_DEVICE_ID = 0x53101,
+       BCM53115_DEVICE_ID = 0x53115,
+       BCM53125_DEVICE_ID = 0x53125,
+       BCM53128_DEVICE_ID = 0x53128,
+@@ -190,6 +191,7 @@ static inline int is531x5(struct b53_dev
+ {
+       return dev->chip_id == BCM53115_DEVICE_ID ||
+               dev->chip_id == BCM53125_DEVICE_ID ||
++              dev->chip_id == BCM53101_DEVICE_ID ||
+               dev->chip_id == BCM53128_DEVICE_ID ||
+               dev->chip_id == BCM53134_DEVICE_ID;
+ }
diff --git a/target/linux/generic/backport-6.12/610-03-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch b/target/linux/generic/backport-6.12/610-03-v6.15-net-dsa-b53-mdio-add-support-for-BCM53101.patch
deleted file mode 100644 (file)
index 0ec9f51..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-From c4f873c2b65c839ff5e7c996bd9ef5a1e7eae11a Mon Sep 17 00:00:00 2001
-From: Torben Nielsen <[email protected]>
-Date: Mon, 17 Feb 2025 09:05:01 +0100
-Subject: [PATCH] net: dsa: b53: mdio: add support for BCM53101
-
-BCM53101 is a ethernet switch, very similar to the BCM53115.
-Enable support for it, in the existing b53 dsa driver.
-
-Signed-off-by: Torben Nielsen <[email protected]>
-Signed-off-by: Claus Stovgaard <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 14 ++++++++++++++
- drivers/net/dsa/b53/b53_mdio.c   |  1 +
- drivers/net/dsa/b53/b53_priv.h   |  2 ++
- 3 files changed, 17 insertions(+)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -2603,6 +2603,19 @@ static const struct b53_chip_data b53_sw
-               .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
-       },
-       {
-+              .chip_id = BCM53101_DEVICE_ID,
-+              .dev_name = "BCM53101",
-+              .vlans = 4096,
-+              .enabled_ports = 0x11f,
-+              .arl_bins = 4,
-+              .arl_buckets = 512,
-+              .vta_regs = B53_VTA_REGS,
-+              .imp_port = 8,
-+              .duplex_reg = B53_DUPLEX_STAT_GE,
-+              .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
-+              .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
-+      },
-+      {
-               .chip_id = BCM53115_DEVICE_ID,
-               .dev_name = "BCM53115",
-               .vlans = 4096,
-@@ -2983,6 +2996,7 @@ int b53_switch_detect(struct b53_device
-                       return ret;
-               switch (id32) {
-+              case BCM53101_DEVICE_ID:
-               case BCM53115_DEVICE_ID:
-               case BCM53125_DEVICE_ID:
-               case BCM53128_DEVICE_ID:
---- a/drivers/net/dsa/b53/b53_mdio.c
-+++ b/drivers/net/dsa/b53/b53_mdio.c
-@@ -374,6 +374,7 @@ static void b53_mdio_shutdown(struct mdi
- static const struct of_device_id b53_of_match[] = {
-       { .compatible = "brcm,bcm5325" },
-+      { .compatible = "brcm,bcm53101" },
-       { .compatible = "brcm,bcm53115" },
-       { .compatible = "brcm,bcm53125" },
-       { .compatible = "brcm,bcm53128" },
---- a/drivers/net/dsa/b53/b53_priv.h
-+++ b/drivers/net/dsa/b53/b53_priv.h
-@@ -66,6 +66,7 @@ enum {
-       BCM5395_DEVICE_ID = 0x95,
-       BCM5397_DEVICE_ID = 0x97,
-       BCM5398_DEVICE_ID = 0x98,
-+      BCM53101_DEVICE_ID = 0x53101,
-       BCM53115_DEVICE_ID = 0x53115,
-       BCM53125_DEVICE_ID = 0x53125,
-       BCM53128_DEVICE_ID = 0x53128,
-@@ -190,6 +191,7 @@ static inline int is531x5(struct b53_dev
- {
-       return dev->chip_id == BCM53115_DEVICE_ID ||
-               dev->chip_id == BCM53125_DEVICE_ID ||
-+              dev->chip_id == BCM53101_DEVICE_ID ||
-               dev->chip_id == BCM53128_DEVICE_ID ||
-               dev->chip_id == BCM53134_DEVICE_ID;
- }
diff --git a/target/linux/generic/backport-6.12/610-03-v6.16-net-dsa-b53-implement-setting-ageing-time.patch b/target/linux/generic/backport-6.12/610-03-v6.16-net-dsa-b53-implement-setting-ageing-time.patch
new file mode 100644 (file)
index 0000000..1e1756d
--- /dev/null
@@ -0,0 +1,105 @@
+From e39d14a760c039af0653e3df967e7525413924a0 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <[email protected]>
+Date: Sat, 10 May 2025 11:22:11 +0200
+Subject: [PATCH] net: dsa: b53: implement setting ageing time
+
+b53 supported switches support configuring ageing time between 1 and
+1,048,575 seconds, so add an appropriate setter.
+
+This allows b53 to pass the FDB learning test for both vlan aware and
+vlan unaware bridges.
+
+Signed-off-by: Jonas Gorski <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 28 ++++++++++++++++++++++++++++
+ drivers/net/dsa/b53/b53_priv.h   |  1 +
+ drivers/net/dsa/b53/b53_regs.h   |  7 +++++++
+ 3 files changed, 36 insertions(+)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -21,6 +21,7 @@
+ #include <linux/export.h>
+ #include <linux/gpio.h>
+ #include <linux/kernel.h>
++#include <linux/math.h>
+ #include <linux/module.h>
+ #include <linux/platform_data/b53.h>
+ #include <linux/phy.h>
+@@ -1227,6 +1228,10 @@ static int b53_setup(struct dsa_switch *
+        */
+       ds->untag_vlan_aware_bridge_pvid = true;
++      /* Ageing time is set in seconds */
++      ds->ageing_time_min = 1 * 1000;
++      ds->ageing_time_max = AGE_TIME_MAX * 1000;
++
+       ret = b53_reset_switch(dev);
+       if (ret) {
+               dev_err(ds->dev, "failed to reset switch\n");
+@@ -2463,6 +2468,28 @@ static int b53_get_max_mtu(struct dsa_sw
+       return B53_MAX_MTU;
+ }
++int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
++{
++      struct b53_device *dev = ds->priv;
++      u32 atc;
++      int reg;
++
++      if (is63xx(dev))
++              reg = B53_AGING_TIME_CONTROL_63XX;
++      else
++              reg = B53_AGING_TIME_CONTROL;
++
++      atc = DIV_ROUND_CLOSEST(msecs, 1000);
++
++      if (!is5325(dev) && !is5365(dev))
++              atc |= AGE_CHANGE;
++
++      b53_write32(dev, B53_MGMT_PAGE, reg, atc);
++
++      return 0;
++}
++EXPORT_SYMBOL_GPL(b53_set_ageing_time);
++
+ static const struct phylink_mac_ops b53_phylink_mac_ops = {
+       .mac_select_pcs = b53_phylink_mac_select_pcs,
+       .mac_config     = b53_phylink_mac_config,
+@@ -2487,6 +2514,7 @@ static const struct dsa_switch_ops b53_s
+       .support_eee            = b53_support_eee,
+       .get_mac_eee            = b53_get_mac_eee,
+       .set_mac_eee            = b53_set_mac_eee,
++      .set_ageing_time        = b53_set_ageing_time,
+       .port_bridge_join       = b53_br_join,
+       .port_bridge_leave      = b53_br_leave,
+       .port_pre_bridge_flags  = b53_br_flags_pre,
+--- a/drivers/net/dsa/b53/b53_priv.h
++++ b/drivers/net/dsa/b53/b53_priv.h
+@@ -343,6 +343,7 @@ void b53_get_strings(struct dsa_switch *
+ void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
+ int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
+ void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
++int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs);
+ int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
+               bool *tx_fwd_offload, struct netlink_ext_ack *extack);
+ void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
+--- a/drivers/net/dsa/b53/b53_regs.h
++++ b/drivers/net/dsa/b53/b53_regs.h
+@@ -224,6 +224,13 @@
+ #define   BRCM_HDR_P5_EN              BIT(1) /* Enable tagging on port 5 */
+ #define   BRCM_HDR_P7_EN              BIT(2) /* Enable tagging on port 7 */
++/* Aging Time control register (32 bit) */
++#define B53_AGING_TIME_CONTROL                0x06
++#define B53_AGING_TIME_CONTROL_63XX   0x08
++#define  AGE_CHANGE                   BIT(20)
++#define  AGE_TIME_MASK                        0x7ffff
++#define  AGE_TIME_MAX                 1048575
++
+ /* Mirror capture control register (16 bit) */
+ #define B53_MIR_CAP_CTL                       0x10
+ #define  CAP_PORT_MASK                        0xf
diff --git a/target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch b/target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch
new file mode 100644 (file)
index 0000000..e70f09e
--- /dev/null
@@ -0,0 +1,70 @@
+From 75f4f7b2b13008803f84768ff90396f9d7553221 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <[email protected]>
+Date: Mon, 2 Jun 2025 21:39:51 +0200
+Subject: [PATCH] net: dsa: b53: do not configure bcm63xx's IMP port interface
+
+The IMP port is not a valid RGMII interface, but hard wired to internal,
+so we shouldn't touch the undefined register B53_RGMII_CTRL_IMP.
+
+While this does not seem to have any side effects, let's not touch it at
+all, so limit RGMII configuration on bcm63xx to the actual RGMII ports.
+
+Fixes: ce3bf94871f7 ("net: dsa: b53: add support for BCM63xx RGMIIs")
+Signed-off-by: Jonas Gorski <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Paolo Abeni <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 22 ++++++++--------------
+ 1 file changed, 8 insertions(+), 14 deletions(-)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -22,6 +22,7 @@
+ #include <linux/gpio.h>
+ #include <linux/kernel.h>
+ #include <linux/math.h>
++#include <linux/minmax.h>
+ #include <linux/module.h>
+ #include <linux/platform_data/b53.h>
+ #include <linux/phy.h>
+@@ -1369,24 +1370,17 @@ static void b53_adjust_63xx_rgmii(struct
+                                 phy_interface_t interface)
+ {
+       struct b53_device *dev = ds->priv;
+-      u8 rgmii_ctrl = 0, off;
+-
+-      if (port == dev->imp_port)
+-              off = B53_RGMII_CTRL_IMP;
+-      else
+-              off = B53_RGMII_CTRL_P(port);
++      u8 rgmii_ctrl = 0;
+-      b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl);
++      b53_read8(dev, B53_CTRL_PAGE, B53_RGMII_CTRL_P(port), &rgmii_ctrl);
+       rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
+-      if (port != dev->imp_port) {
+-              if (is63268(dev))
+-                      rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE;
++      if (is63268(dev))
++              rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE;
+-              rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
+-      }
++      rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
+-      b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl);
++      b53_write8(dev, B53_CTRL_PAGE, B53_RGMII_CTRL_P(port), rgmii_ctrl);
+       dev_dbg(ds->dev, "Configured port %d for %s\n", port,
+               phy_modes(interface));
+@@ -1537,7 +1531,7 @@ static void b53_phylink_mac_config(struc
+       struct b53_device *dev = ds->priv;
+       int port = dp->index;
+-      if (is63xx(dev) && port >= B53_63XX_RGMII0)
++      if (is63xx(dev) && in_range(port, B53_63XX_RGMII0, 4))
+               b53_adjust_63xx_rgmii(ds, port, interface);
+       if (mode == MLO_AN_FIXED) {
diff --git a/target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-implement-setting-ageing-time.patch b/target/linux/generic/backport-6.12/610-04-v6.16-net-dsa-b53-implement-setting-ageing-time.patch
deleted file mode 100644 (file)
index 1e1756d..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From e39d14a760c039af0653e3df967e7525413924a0 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <[email protected]>
-Date: Sat, 10 May 2025 11:22:11 +0200
-Subject: [PATCH] net: dsa: b53: implement setting ageing time
-
-b53 supported switches support configuring ageing time between 1 and
-1,048,575 seconds, so add an appropriate setter.
-
-This allows b53 to pass the FDB learning test for both vlan aware and
-vlan unaware bridges.
-
-Signed-off-by: Jonas Gorski <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 28 ++++++++++++++++++++++++++++
- drivers/net/dsa/b53/b53_priv.h   |  1 +
- drivers/net/dsa/b53/b53_regs.h   |  7 +++++++
- 3 files changed, 36 insertions(+)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -21,6 +21,7 @@
- #include <linux/export.h>
- #include <linux/gpio.h>
- #include <linux/kernel.h>
-+#include <linux/math.h>
- #include <linux/module.h>
- #include <linux/platform_data/b53.h>
- #include <linux/phy.h>
-@@ -1227,6 +1228,10 @@ static int b53_setup(struct dsa_switch *
-        */
-       ds->untag_vlan_aware_bridge_pvid = true;
-+      /* Ageing time is set in seconds */
-+      ds->ageing_time_min = 1 * 1000;
-+      ds->ageing_time_max = AGE_TIME_MAX * 1000;
-+
-       ret = b53_reset_switch(dev);
-       if (ret) {
-               dev_err(ds->dev, "failed to reset switch\n");
-@@ -2463,6 +2468,28 @@ static int b53_get_max_mtu(struct dsa_sw
-       return B53_MAX_MTU;
- }
-+int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
-+{
-+      struct b53_device *dev = ds->priv;
-+      u32 atc;
-+      int reg;
-+
-+      if (is63xx(dev))
-+              reg = B53_AGING_TIME_CONTROL_63XX;
-+      else
-+              reg = B53_AGING_TIME_CONTROL;
-+
-+      atc = DIV_ROUND_CLOSEST(msecs, 1000);
-+
-+      if (!is5325(dev) && !is5365(dev))
-+              atc |= AGE_CHANGE;
-+
-+      b53_write32(dev, B53_MGMT_PAGE, reg, atc);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(b53_set_ageing_time);
-+
- static const struct phylink_mac_ops b53_phylink_mac_ops = {
-       .mac_select_pcs = b53_phylink_mac_select_pcs,
-       .mac_config     = b53_phylink_mac_config,
-@@ -2487,6 +2514,7 @@ static const struct dsa_switch_ops b53_s
-       .support_eee            = b53_support_eee,
-       .get_mac_eee            = b53_get_mac_eee,
-       .set_mac_eee            = b53_set_mac_eee,
-+      .set_ageing_time        = b53_set_ageing_time,
-       .port_bridge_join       = b53_br_join,
-       .port_bridge_leave      = b53_br_leave,
-       .port_pre_bridge_flags  = b53_br_flags_pre,
---- a/drivers/net/dsa/b53/b53_priv.h
-+++ b/drivers/net/dsa/b53/b53_priv.h
-@@ -343,6 +343,7 @@ void b53_get_strings(struct dsa_switch *
- void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
- int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
- void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
-+int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs);
- int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
-               bool *tx_fwd_offload, struct netlink_ext_ack *extack);
- void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
---- a/drivers/net/dsa/b53/b53_regs.h
-+++ b/drivers/net/dsa/b53/b53_regs.h
-@@ -224,6 +224,13 @@
- #define   BRCM_HDR_P5_EN              BIT(1) /* Enable tagging on port 5 */
- #define   BRCM_HDR_P7_EN              BIT(2) /* Enable tagging on port 7 */
-+/* Aging Time control register (32 bit) */
-+#define B53_AGING_TIME_CONTROL                0x06
-+#define B53_AGING_TIME_CONTROL_63XX   0x08
-+#define  AGE_CHANGE                   BIT(20)
-+#define  AGE_TIME_MASK                        0x7ffff
-+#define  AGE_TIME_MAX                 1048575
-+
- /* Mirror capture control register (16 bit) */
- #define B53_MIR_CAP_CTL                       0x10
- #define  CAP_PORT_MASK                        0xf
diff --git a/target/linux/generic/backport-6.12/610-07-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch b/target/linux/generic/backport-6.12/610-07-v6.16-net-dsa-b53-do-not-configure-bcm63xx-s-IMP-port-inte.patch
deleted file mode 100644 (file)
index e70f09e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-From 75f4f7b2b13008803f84768ff90396f9d7553221 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <[email protected]>
-Date: Mon, 2 Jun 2025 21:39:51 +0200
-Subject: [PATCH] net: dsa: b53: do not configure bcm63xx's IMP port interface
-
-The IMP port is not a valid RGMII interface, but hard wired to internal,
-so we shouldn't touch the undefined register B53_RGMII_CTRL_IMP.
-
-While this does not seem to have any side effects, let's not touch it at
-all, so limit RGMII configuration on bcm63xx to the actual RGMII ports.
-
-Fixes: ce3bf94871f7 ("net: dsa: b53: add support for BCM63xx RGMIIs")
-Signed-off-by: Jonas Gorski <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Paolo Abeni <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 22 ++++++++--------------
- 1 file changed, 8 insertions(+), 14 deletions(-)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -22,6 +22,7 @@
- #include <linux/gpio.h>
- #include <linux/kernel.h>
- #include <linux/math.h>
-+#include <linux/minmax.h>
- #include <linux/module.h>
- #include <linux/platform_data/b53.h>
- #include <linux/phy.h>
-@@ -1369,24 +1370,17 @@ static void b53_adjust_63xx_rgmii(struct
-                                 phy_interface_t interface)
- {
-       struct b53_device *dev = ds->priv;
--      u8 rgmii_ctrl = 0, off;
--
--      if (port == dev->imp_port)
--              off = B53_RGMII_CTRL_IMP;
--      else
--              off = B53_RGMII_CTRL_P(port);
-+      u8 rgmii_ctrl = 0;
--      b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl);
-+      b53_read8(dev, B53_CTRL_PAGE, B53_RGMII_CTRL_P(port), &rgmii_ctrl);
-       rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
--      if (port != dev->imp_port) {
--              if (is63268(dev))
--                      rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE;
-+      if (is63268(dev))
-+              rgmii_ctrl |= RGMII_CTRL_MII_OVERRIDE;
--              rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
--      }
-+      rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
--      b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl);
-+      b53_write8(dev, B53_CTRL_PAGE, B53_RGMII_CTRL_P(port), rgmii_ctrl);
-       dev_dbg(ds->dev, "Configured port %d for %s\n", port,
-               phy_modes(interface));
-@@ -1537,7 +1531,7 @@ static void b53_phylink_mac_config(struc
-       struct b53_device *dev = ds->priv;
-       int port = dp->index;
--      if (is63xx(dev) && port >= B53_63XX_RGMII0)
-+      if (is63xx(dev) && in_range(port, B53_63XX_RGMII0, 4))
-               b53_adjust_63xx_rgmii(ds, port, interface);
-       if (mode == MLO_AN_FIXED) {
diff --git a/target/linux/generic/backport-6.12/611-01-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch b/target/linux/generic/backport-6.12/611-01-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch
new file mode 100644 (file)
index 0000000..88f10be
--- /dev/null
@@ -0,0 +1,188 @@
+From ef07df397a621707903ef0d294a7df11f80cf206 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:48 +0200
+Subject: [PATCH] net: dsa: tag_brcm: add support for legacy FCS tags
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add support for legacy Broadcom FCS tags, which are similar to
+DSA_TAG_PROTO_BRCM_LEGACY.
+BCM5325 and BCM5365 switches require including the original FCS value and
+length, as opposed to BCM63xx switches.
+Adding the original FCS value and length to DSA_TAG_PROTO_BRCM_LEGACY would
+impact performance of BCM63xx switches, so it's better to create a new tag.
+
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ include/net/dsa.h  |  2 ++
+ net/dsa/Kconfig    | 16 ++++++++--
+ net/dsa/tag_brcm.c | 73 +++++++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 88 insertions(+), 3 deletions(-)
+
+--- a/include/net/dsa.h
++++ b/include/net/dsa.h
+@@ -54,11 +54,13 @@ struct tc_action;
+ #define DSA_TAG_PROTO_RZN1_A5PSW_VALUE                26
+ #define DSA_TAG_PROTO_LAN937X_VALUE           27
+ #define DSA_TAG_PROTO_VSC73XX_8021Q_VALUE     28
++#define DSA_TAG_PROTO_BRCM_LEGACY_FCS_VALUE   29
+ enum dsa_tag_protocol {
+       DSA_TAG_PROTO_NONE              = DSA_TAG_PROTO_NONE_VALUE,
+       DSA_TAG_PROTO_BRCM              = DSA_TAG_PROTO_BRCM_VALUE,
+       DSA_TAG_PROTO_BRCM_LEGACY       = DSA_TAG_PROTO_BRCM_LEGACY_VALUE,
++      DSA_TAG_PROTO_BRCM_LEGACY_FCS   = DSA_TAG_PROTO_BRCM_LEGACY_FCS_VALUE,
+       DSA_TAG_PROTO_BRCM_PREPEND      = DSA_TAG_PROTO_BRCM_PREPEND_VALUE,
+       DSA_TAG_PROTO_DSA               = DSA_TAG_PROTO_DSA_VALUE,
+       DSA_TAG_PROTO_EDSA              = DSA_TAG_PROTO_EDSA_VALUE,
+--- a/net/dsa/Kconfig
++++ b/net/dsa/Kconfig
+@@ -42,12 +42,24 @@ config NET_DSA_TAG_BRCM
+         Broadcom switches which place the tag after the MAC source address.
+ config NET_DSA_TAG_BRCM_LEGACY
+-      tristate "Tag driver for Broadcom legacy switches using in-frame headers"
++      tristate "Tag driver for BCM63xx legacy switches using in-frame headers"
+       select NET_DSA_TAG_BRCM_COMMON
+       help
+         Say Y if you want to enable support for tagging frames for the
+-        Broadcom legacy switches which place the tag after the MAC source
++        BCM63xx legacy switches which place the tag after the MAC source
+         address.
++        This tag is used in BCM63xx legacy switches which work without the
++        original FCS and length before the tag insertion.
++
++config NET_DSA_TAG_BRCM_LEGACY_FCS
++      tristate "Tag driver for BCM53xx legacy switches using in-frame headers"
++      select NET_DSA_TAG_BRCM_COMMON
++      help
++        Say Y if you want to enable support for tagging frames for the
++        BCM53xx legacy switches which place the tag after the MAC source
++        address.
++        This tag is used in BCM53xx legacy switches which expect original
++        FCS and length before the tag insertion to be present.
+ config NET_DSA_TAG_BRCM_PREPEND
+       tristate "Tag driver for Broadcom switches using prepended headers"
+--- a/net/dsa/tag_brcm.c
++++ b/net/dsa/tag_brcm.c
+@@ -15,6 +15,7 @@
+ #define BRCM_NAME             "brcm"
+ #define BRCM_LEGACY_NAME      "brcm-legacy"
++#define BRCM_LEGACY_FCS_NAME  "brcm-legacy-fcs"
+ #define BRCM_PREPEND_NAME     "brcm-prepend"
+ /* Legacy Broadcom tag (6 bytes) */
+@@ -32,6 +33,10 @@
+ #define BRCM_LEG_MULTICAST    (1 << 5)
+ #define BRCM_LEG_EGRESS               (2 << 5)
+ #define BRCM_LEG_INGRESS      (3 << 5)
++#define BRCM_LEG_LEN_HI(x)    (((x) >> 8) & 0x7)
++
++/* 4th byte in the tag */
++#define BRCM_LEG_LEN_LO(x)    ((x) & 0xff)
+ /* 6th byte in the tag */
+ #define BRCM_LEG_PORT_ID      (0xf)
+@@ -212,7 +217,8 @@ DSA_TAG_DRIVER(brcm_netdev_ops);
+ MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM, BRCM_NAME);
+ #endif
+-#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
++#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY) || \
++      IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
+ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,
+                                       struct net_device *dev)
+ {
+@@ -250,7 +256,9 @@ static struct sk_buff *brcm_leg_tag_rcv(
+       return skb;
+ }
++#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY || CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS */
++#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
+ static struct sk_buff *brcm_leg_tag_xmit(struct sk_buff *skb,
+                                        struct net_device *dev)
+ {
+@@ -300,6 +308,66 @@ DSA_TAG_DRIVER(brcm_legacy_netdev_ops);
+ MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY, BRCM_LEGACY_NAME);
+ #endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY */
++#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
++static struct sk_buff *brcm_leg_fcs_tag_xmit(struct sk_buff *skb,
++                                           struct net_device *dev)
++{
++      struct dsa_port *dp = dsa_user_to_port(dev);
++      unsigned int fcs_len;
++      __le32 fcs_val;
++      u8 *brcm_tag;
++
++      /* The Ethernet switch we are interfaced with needs packets to be at
++       * least 64 bytes (including FCS) otherwise they will be discarded when
++       * they enter the switch port logic. When Broadcom tags are enabled, we
++       * need to make sure that packets are at least 70 bytes (including FCS
++       * and tag) because the length verification is done after the Broadcom
++       * tag is stripped off the ingress packet.
++       *
++       * Let dsa_user_xmit() free the SKB.
++       */
++      if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false))
++              return NULL;
++
++      fcs_len = skb->len;
++      fcs_val = cpu_to_le32(crc32_le(~0, skb->data, fcs_len) ^ ~0);
++
++      skb_push(skb, BRCM_LEG_TAG_LEN);
++
++      dsa_alloc_etype_header(skb, BRCM_LEG_TAG_LEN);
++
++      brcm_tag = skb->data + 2 * ETH_ALEN;
++
++      /* Broadcom tag type */
++      brcm_tag[0] = BRCM_LEG_TYPE_HI;
++      brcm_tag[1] = BRCM_LEG_TYPE_LO;
++
++      /* Broadcom tag value */
++      brcm_tag[2] = BRCM_LEG_EGRESS | BRCM_LEG_LEN_HI(fcs_len);
++      brcm_tag[3] = BRCM_LEG_LEN_LO(fcs_len);
++      brcm_tag[4] = 0;
++      brcm_tag[5] = dp->index & BRCM_LEG_PORT_ID;
++
++      /* Original FCS value */
++      if (__skb_pad(skb, ETH_FCS_LEN, false))
++              return NULL;
++      skb_put_data(skb, &fcs_val, ETH_FCS_LEN);
++
++      return skb;
++}
++
++static const struct dsa_device_ops brcm_legacy_fcs_netdev_ops = {
++      .name = BRCM_LEGACY_FCS_NAME,
++      .proto = DSA_TAG_PROTO_BRCM_LEGACY_FCS,
++      .xmit = brcm_leg_fcs_tag_xmit,
++      .rcv = brcm_leg_tag_rcv,
++      .needed_headroom = BRCM_LEG_TAG_LEN,
++};
++
++DSA_TAG_DRIVER(brcm_legacy_fcs_netdev_ops);
++MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY_FCS, BRCM_LEGACY_FCS_NAME);
++#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS */
++
+ #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND)
+ static struct sk_buff *brcm_tag_xmit_prepend(struct sk_buff *skb,
+                                            struct net_device *dev)
+@@ -334,6 +402,9 @@ static struct dsa_tag_driver *dsa_tag_dr
+ #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
+       &DSA_TAG_DRIVER_NAME(brcm_legacy_netdev_ops),
+ #endif
++#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
++      &DSA_TAG_DRIVER_NAME(brcm_legacy_fcs_netdev_ops),
++#endif
+ #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND)
+       &DSA_TAG_DRIVER_NAME(brcm_prepend_netdev_ops),
+ #endif
diff --git a/target/linux/generic/backport-6.12/611-02-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch b/target/linux/generic/backport-6.12/611-02-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch
new file mode 100644 (file)
index 0000000..d04c97e
--- /dev/null
@@ -0,0 +1,48 @@
+From c3cf059a4d419b9c888ce7e9952fa13ba7569b61 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:49 +0200
+Subject: [PATCH] net: dsa: b53: support legacy FCS tags
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Commit 46c5176c586c ("net: dsa: b53: support legacy tags") introduced
+support for legacy tags, but it turns out that BCM5325 and BCM5365
+switches require the original FCS value and length, so they have to be
+treated differently.
+
+Reviewed-by: Florian Fainelli <[email protected]>
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/Kconfig      | 1 +
+ drivers/net/dsa/b53/b53_common.c | 7 +++++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/dsa/b53/Kconfig
++++ b/drivers/net/dsa/b53/Kconfig
+@@ -5,6 +5,7 @@ menuconfig B53
+       select NET_DSA_TAG_NONE
+       select NET_DSA_TAG_BRCM
+       select NET_DSA_TAG_BRCM_LEGACY
++      select NET_DSA_TAG_BRCM_LEGACY_FCS
+       select NET_DSA_TAG_BRCM_PREPEND
+       help
+         This driver adds support for Broadcom managed switch chips. It supports
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -2304,8 +2304,11 @@ enum dsa_tag_protocol b53_get_tag_protoc
+               goto out;
+       }
+-      /* Older models require a different 6 byte tag */
+-      if (is5325(dev) || is5365(dev) || is63xx(dev)) {
++      /* Older models require different 6 byte tags */
++      if (is5325(dev) || is5365(dev)) {
++              dev->tag_protocol = DSA_TAG_PROTO_BRCM_LEGACY_FCS;
++              goto out;
++      } else if (is63xx(dev)) {
+               dev->tag_protocol = DSA_TAG_PROTO_BRCM_LEGACY;
+               goto out;
+       }
diff --git a/target/linux/generic/backport-6.12/611-03-v6.17-net-dsa-b53-detect-BCM5325-variants.patch b/target/linux/generic/backport-6.12/611-03-v6.17-net-dsa-b53-detect-BCM5325-variants.patch
new file mode 100644 (file)
index 0000000..c7af2f2
--- /dev/null
@@ -0,0 +1,112 @@
+From 0cbec9aef5a86194117a956546dc1aec95031f37 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:50 +0200
+Subject: [PATCH] net: dsa: b53: detect BCM5325 variants
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We need to be able to differentiate the BCM5325 variants because:
+- BCM5325M switches lack the ARLIO_PAGE->VLAN_ID_IDX register.
+- BCM5325E have less 512 ARL buckets instead of 1024.
+
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 24 +++++++++++++++++++++---
+ drivers/net/dsa/b53/b53_priv.h   | 19 +++++++++++++++++++
+ 2 files changed, 40 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -1835,7 +1835,8 @@ static int b53_arl_op(struct b53_device
+       /* Perform a read for the given MAC and VID */
+       b53_write48(dev, B53_ARLIO_PAGE, B53_MAC_ADDR_IDX, mac);
+-      b53_write16(dev, B53_ARLIO_PAGE, B53_VLAN_ID_IDX, vid);
++      if (!is5325m(dev))
++              b53_write16(dev, B53_ARLIO_PAGE, B53_VLAN_ID_IDX, vid);
+       /* Issue a read operation for this MAC */
+       ret = b53_arl_rw_op(dev, 1);
+@@ -2903,6 +2904,9 @@ static int b53_switch_init(struct b53_de
+               }
+       }
++      if (is5325e(dev))
++              dev->num_arl_buckets = 512;
++
+       dev->num_ports = fls(dev->enabled_ports);
+       dev->ds->num_ports = min_t(unsigned int, dev->num_ports, DSA_MAX_PORTS);
+@@ -3004,10 +3008,24 @@ int b53_switch_detect(struct b53_device
+               b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, 0xf);
+               b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, &tmp);
+-              if (tmp == 0xf)
++              if (tmp == 0xf) {
++                      u32 phy_id;
++                      int val;
++
+                       dev->chip_id = BCM5325_DEVICE_ID;
+-              else
++
++                      val = b53_phy_read16(dev->ds, 0, MII_PHYSID1);
++                      phy_id = (val & 0xffff) << 16;
++                      val = b53_phy_read16(dev->ds, 0, MII_PHYSID2);
++                      phy_id |= (val & 0xfff0);
++
++                      if (phy_id == 0x00406330)
++                              dev->variant_id = B53_VARIANT_5325M;
++                      else if (phy_id == 0x0143bc30)
++                              dev->variant_id = B53_VARIANT_5325E;
++              } else {
+                       dev->chip_id = BCM5365_DEVICE_ID;
++              }
+               break;
+       case BCM5389_DEVICE_ID:
+       case BCM5395_DEVICE_ID:
+--- a/drivers/net/dsa/b53/b53_priv.h
++++ b/drivers/net/dsa/b53/b53_priv.h
+@@ -84,6 +84,12 @@ enum {
+       BCM53134_DEVICE_ID = 0x5075,
+ };
++enum b53_variant_id {
++      B53_VARIANT_NONE = 0,
++      B53_VARIANT_5325E,
++      B53_VARIANT_5325M,
++};
++
+ struct b53_pcs {
+       struct phylink_pcs pcs;
+       struct b53_device *dev;
+@@ -118,6 +124,7 @@ struct b53_device {
+       /* chip specific data */
+       u32 chip_id;
++      enum b53_variant_id variant_id;
+       u8 core_rev;
+       u8 vta_regs[3];
+       u8 duplex_reg;
+@@ -165,6 +172,18 @@ static inline int is5325(struct b53_devi
+       return dev->chip_id == BCM5325_DEVICE_ID;
+ }
++static inline int is5325e(struct b53_device *dev)
++{
++      return is5325(dev) &&
++              dev->variant_id == B53_VARIANT_5325E;
++}
++
++static inline int is5325m(struct b53_device *dev)
++{
++      return is5325(dev) &&
++              dev->variant_id == B53_VARIANT_5325M;
++}
++
+ static inline int is5365(struct b53_device *dev)
+ {
+ #ifdef CONFIG_BCM47XX
diff --git a/target/linux/generic/backport-6.12/611-04-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch b/target/linux/generic/backport-6.12/611-04-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch
new file mode 100644 (file)
index 0000000..509806a
--- /dev/null
@@ -0,0 +1,250 @@
+From c45655386e532c85ff1d679fc2aa40b3aaff9916 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:51 +0200
+Subject: [PATCH] net: dsa: b53: add support for FDB operations on 5325/5365
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM5325 and BCM5365 are part of a much older generation of switches which,
+due to their limited number of ports and VLAN entries (up to 256) allowed
+a single 64-bit register to hold a full ARL entry.
+This requires a little bit of massaging when reading, writing and
+converting ARL entries in both directions.
+
+Signed-off-by: Florian Fainelli <[email protected]>
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 101 +++++++++++++++++++++++++------
+ drivers/net/dsa/b53/b53_priv.h   |  29 +++++++++
+ drivers/net/dsa/b53/b53_regs.h   |   7 ++-
+ 3 files changed, 115 insertions(+), 22 deletions(-)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -1821,6 +1821,45 @@ static int b53_arl_read(struct b53_devic
+       return *idx >= dev->num_arl_bins ? -ENOSPC : -ENOENT;
+ }
++static int b53_arl_read_25(struct b53_device *dev, u64 mac,
++                         u16 vid, struct b53_arl_entry *ent, u8 *idx)
++{
++      DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES);
++      unsigned int i;
++      int ret;
++
++      ret = b53_arl_op_wait(dev);
++      if (ret)
++              return ret;
++
++      bitmap_zero(free_bins, dev->num_arl_bins);
++
++      /* Read the bins */
++      for (i = 0; i < dev->num_arl_bins; i++) {
++              u64 mac_vid;
++
++              b53_read64(dev, B53_ARLIO_PAGE,
++                         B53_ARLTBL_MAC_VID_ENTRY(i), &mac_vid);
++
++              b53_arl_to_entry_25(ent, mac_vid);
++
++              if (!(mac_vid & ARLTBL_VALID_25)) {
++                      set_bit(i, free_bins);
++                      continue;
++              }
++              if ((mac_vid & ARLTBL_MAC_MASK) != mac)
++                      continue;
++              if (dev->vlan_enabled &&
++                  ((mac_vid >> ARLTBL_VID_S_65) & ARLTBL_VID_MASK_25) != vid)
++                      continue;
++              *idx = i;
++              return 0;
++      }
++
++      *idx = find_first_bit(free_bins, dev->num_arl_bins);
++      return *idx >= dev->num_arl_bins ? -ENOSPC : -ENOENT;
++}
++
+ static int b53_arl_op(struct b53_device *dev, int op, int port,
+                     const unsigned char *addr, u16 vid, bool is_valid)
+ {
+@@ -1843,7 +1882,10 @@ static int b53_arl_op(struct b53_device
+       if (ret)
+               return ret;
+-      ret = b53_arl_read(dev, mac, vid, &ent, &idx);
++      if (is5325(dev) || is5365(dev))
++              ret = b53_arl_read_25(dev, mac, vid, &ent, &idx);
++      else
++              ret = b53_arl_read(dev, mac, vid, &ent, &idx);
+       /* If this is a read, just finish now */
+       if (op)
+@@ -1887,12 +1929,17 @@ static int b53_arl_op(struct b53_device
+       ent.is_static = true;
+       ent.is_age = false;
+       memcpy(ent.mac, addr, ETH_ALEN);
+-      b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
++      if (is5325(dev) || is5365(dev))
++              b53_arl_from_entry_25(&mac_vid, &ent);
++      else
++              b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
+       b53_write64(dev, B53_ARLIO_PAGE,
+                   B53_ARLTBL_MAC_VID_ENTRY(idx), mac_vid);
+-      b53_write32(dev, B53_ARLIO_PAGE,
+-                  B53_ARLTBL_DATA_ENTRY(idx), fwd_entry);
++
++      if (!is5325(dev) && !is5365(dev))
++              b53_write32(dev, B53_ARLIO_PAGE,
++                          B53_ARLTBL_DATA_ENTRY(idx), fwd_entry);
+       return b53_arl_rw_op(dev, 0);
+ }
+@@ -1904,12 +1951,6 @@ int b53_fdb_add(struct dsa_switch *ds, i
+       struct b53_device *priv = ds->priv;
+       int ret;
+-      /* 5325 and 5365 require some more massaging, but could
+-       * be supported eventually
+-       */
+-      if (is5325(priv) || is5365(priv))
+-              return -EOPNOTSUPP;
+-
+       mutex_lock(&priv->arl_mutex);
+       ret = b53_arl_op(priv, 0, port, addr, vid, true);
+       mutex_unlock(&priv->arl_mutex);
+@@ -1936,10 +1977,15 @@ EXPORT_SYMBOL(b53_fdb_del);
+ static int b53_arl_search_wait(struct b53_device *dev)
+ {
+       unsigned int timeout = 1000;
+-      u8 reg;
++      u8 reg, offset;
++
++      if (is5325(dev) || is5365(dev))
++              offset = B53_ARL_SRCH_CTL_25;
++      else
++              offset = B53_ARL_SRCH_CTL;
+       do {
+-              b53_read8(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, &reg);
++              b53_read8(dev, B53_ARLIO_PAGE, offset, &reg);
+               if (!(reg & ARL_SRCH_STDN))
+                       return -ENOENT;
+@@ -1956,13 +2002,24 @@ static void b53_arl_search_rd(struct b53
+                             struct b53_arl_entry *ent)
+ {
+       u64 mac_vid;
+-      u32 fwd_entry;
+-      b53_read64(dev, B53_ARLIO_PAGE,
+-                 B53_ARL_SRCH_RSTL_MACVID(idx), &mac_vid);
+-      b53_read32(dev, B53_ARLIO_PAGE,
+-                 B53_ARL_SRCH_RSTL(idx), &fwd_entry);
+-      b53_arl_to_entry(ent, mac_vid, fwd_entry);
++      if (is5325(dev)) {
++              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_25,
++                         &mac_vid);
++              b53_arl_to_entry_25(ent, mac_vid);
++      } else if (is5365(dev)) {
++              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
++                         &mac_vid);
++              b53_arl_to_entry_25(ent, mac_vid);
++      } else {
++              u32 fwd_entry;
++
++              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_MACVID(idx),
++                         &mac_vid);
++              b53_read32(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL(idx),
++                         &fwd_entry);
++              b53_arl_to_entry(ent, mac_vid, fwd_entry);
++      }
+ }
+ static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
+@@ -1983,14 +2040,20 @@ int b53_fdb_dump(struct dsa_switch *ds,
+       struct b53_device *priv = ds->priv;
+       struct b53_arl_entry results[2];
+       unsigned int count = 0;
++      u8 offset;
+       int ret;
+       u8 reg;
+       mutex_lock(&priv->arl_mutex);
++      if (is5325(priv) || is5365(priv))
++              offset = B53_ARL_SRCH_CTL_25;
++      else
++              offset = B53_ARL_SRCH_CTL;
++
+       /* Start search operation */
+       reg = ARL_SRCH_STDN;
+-      b53_write8(priv, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, reg);
++      b53_write8(priv, offset, B53_ARL_SRCH_CTL, reg);
+       do {
+               ret = b53_arl_search_wait(priv);
+--- a/drivers/net/dsa/b53/b53_priv.h
++++ b/drivers/net/dsa/b53/b53_priv.h
+@@ -317,6 +317,19 @@ static inline void b53_arl_to_entry(stru
+       ent->vid = mac_vid >> ARLTBL_VID_S;
+ }
++static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent,
++                                     u64 mac_vid)
++{
++      memset(ent, 0, sizeof(*ent));
++      ent->port = (mac_vid >> ARLTBL_DATA_PORT_ID_S_25) &
++                   ARLTBL_DATA_PORT_ID_MASK_25;
++      ent->is_valid = !!(mac_vid & ARLTBL_VALID_25);
++      ent->is_age = !!(mac_vid & ARLTBL_AGE_25);
++      ent->is_static = !!(mac_vid & ARLTBL_STATIC_25);
++      u64_to_ether_addr(mac_vid, ent->mac);
++      ent->vid = mac_vid >> ARLTBL_VID_S_65;
++}
++
+ static inline void b53_arl_from_entry(u64 *mac_vid, u32 *fwd_entry,
+                                     const struct b53_arl_entry *ent)
+ {
+@@ -331,6 +344,22 @@ static inline void b53_arl_from_entry(u6
+               *fwd_entry |= ARLTBL_AGE;
+ }
++static inline void b53_arl_from_entry_25(u64 *mac_vid,
++                                       const struct b53_arl_entry *ent)
++{
++      *mac_vid = ether_addr_to_u64(ent->mac);
++      *mac_vid |= (u64)(ent->port & ARLTBL_DATA_PORT_ID_MASK_25) <<
++                        ARLTBL_DATA_PORT_ID_S_25;
++      *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK_25) <<
++                        ARLTBL_VID_S_65;
++      if (ent->is_valid)
++              *mac_vid |= ARLTBL_VALID_25;
++      if (ent->is_static)
++              *mac_vid |= ARLTBL_STATIC_25;
++      if (ent->is_age)
++              *mac_vid |= ARLTBL_AGE_25;
++}
++
+ #ifdef CONFIG_BCM47XX
+ #include <linux/bcm47xx_nvram.h>
+--- a/drivers/net/dsa/b53/b53_regs.h
++++ b/drivers/net/dsa/b53/b53_regs.h
+@@ -328,9 +328,10 @@
+ #define   ARLTBL_VID_MASK             0xfff
+ #define   ARLTBL_DATA_PORT_ID_S_25    48
+ #define   ARLTBL_DATA_PORT_ID_MASK_25 0xf
+-#define   ARLTBL_AGE_25                       BIT(61)
+-#define   ARLTBL_STATIC_25            BIT(62)
+-#define   ARLTBL_VALID_25             BIT(63)
++#define   ARLTBL_VID_S_65             53
++#define   ARLTBL_AGE_25                       BIT_ULL(61)
++#define   ARLTBL_STATIC_25            BIT_ULL(62)
++#define   ARLTBL_VALID_25             BIT_ULL(63)
+ /* ARL Table Data Entry N Registers (32 bit) */
+ #define B53_ARLTBL_DATA_ENTRY(n)      ((0x10 * (n)) + 0x18)
diff --git a/target/linux/generic/backport-6.12/611-05-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch b/target/linux/generic/backport-6.12/611-05-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch
new file mode 100644 (file)
index 0000000..7397e33
--- /dev/null
@@ -0,0 +1,51 @@
+From 9b6c767c312b4709e9aeb2314a6b47863e7fb72d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:52 +0200
+Subject: [PATCH] net: dsa: b53: prevent FAST_AGE access on BCM5325
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
+writing them.
+
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -492,6 +492,9 @@ static int b53_flush_arl(struct b53_devi
+ {
+       unsigned int i;
++      if (is5325(dev))
++              return 0;
++
+       b53_write8(dev, B53_CTRL_PAGE, B53_FAST_AGE_CTRL,
+                  FAST_AGE_DONE | FAST_AGE_DYNAMIC | mask);
+@@ -516,6 +519,9 @@ out:
+ static int b53_fast_age_port(struct b53_device *dev, int port)
+ {
++      if (is5325(dev))
++              return 0;
++
+       b53_write8(dev, B53_CTRL_PAGE, B53_FAST_AGE_PORT_CTRL, port);
+       return b53_flush_arl(dev, FAST_AGE_PORT);
+@@ -523,6 +529,9 @@ static int b53_fast_age_port(struct b53_
+ static int b53_fast_age_vlan(struct b53_device *dev, u16 vid)
+ {
++      if (is5325(dev))
++              return 0;
++
+       b53_write16(dev, B53_CTRL_PAGE, B53_FAST_AGE_VID_CTRL, vid);
+       return b53_flush_arl(dev, FAST_AGE_VLAN);
diff --git a/target/linux/generic/backport-6.12/611-06-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch b/target/linux/generic/backport-6.12/611-06-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch
new file mode 100644 (file)
index 0000000..6ea8367
--- /dev/null
@@ -0,0 +1,33 @@
+From e17813968b08b1b09bf80699223dea48851cbd07 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:56 +0200
+Subject: [PATCH] net: dsa: b53: prevent BRCM_HDR access on older devices
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Older switches don't implement BRCM_HDR register so we should avoid
+reading or writing it.
+
+Reviewed-by: Florian Fainelli <[email protected]>
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -747,6 +747,11 @@ void b53_brcm_hdr_setup(struct dsa_switc
+               hdr_ctl |= GC_FRM_MGMT_PORT_M;
+       b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, hdr_ctl);
++      /* B53_BRCM_HDR not present on devices with legacy tags */
++      if (dev->tag_protocol == DSA_TAG_PROTO_BRCM_LEGACY ||
++          dev->tag_protocol == DSA_TAG_PROTO_BRCM_LEGACY_FCS)
++              return;
++
+       /* Enable Broadcom tags for IMP port */
+       b53_read8(dev, B53_MGMT_PAGE, B53_BRCM_HDR, &hdr_ctl);
+       if (tag_en)
diff --git a/target/linux/generic/backport-6.12/611-07-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch b/target/linux/generic/backport-6.12/611-07-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch
new file mode 100644 (file)
index 0000000..6b9c86e
--- /dev/null
@@ -0,0 +1,128 @@
+From 651c9e71ffe44e99b5a9b011271c2117f0353b32 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
+Date: Sat, 14 Jun 2025 09:59:58 +0200
+Subject: [PATCH] net: dsa: b53: fix unicast/multicast flooding on BCM5325
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM5325 doesn't implement UC_FLOOD_MASK, MC_FLOOD_MASK and IPMC_FLOOD_MASK
+registers.
+This has to be handled differently with other pages and registers.
+
+Signed-off-by: Álvaro Fernández Rojas <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Link: https://patch.msgid.link/[email protected]
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/dsa/b53/b53_common.c | 60 ++++++++++++++++++++++----------
+ drivers/net/dsa/b53/b53_regs.h   | 13 +++++++
+ 2 files changed, 55 insertions(+), 18 deletions(-)
+
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -564,12 +564,24 @@ static void b53_port_set_ucast_flood(str
+ {
+       u16 uc;
+-      b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
+-      if (unicast)
+-              uc |= BIT(port);
+-      else
+-              uc &= ~BIT(port);
+-      b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
++      if (is5325(dev)) {
++              if (port == B53_CPU_PORT_25)
++                      port = B53_CPU_PORT;
++
++              b53_read16(dev, B53_IEEE_PAGE, B53_IEEE_UCAST_DLF, &uc);
++              if (unicast)
++                      uc |= BIT(port) | B53_IEEE_UCAST_DROP_EN;
++              else
++                      uc &= ~BIT(port);
++              b53_write16(dev, B53_IEEE_PAGE, B53_IEEE_UCAST_DLF, uc);
++      } else {
++              b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
++              if (unicast)
++                      uc |= BIT(port);
++              else
++                      uc &= ~BIT(port);
++              b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
++      }
+ }
+ static void b53_port_set_mcast_flood(struct b53_device *dev, int port,
+@@ -577,19 +589,31 @@ static void b53_port_set_mcast_flood(str
+ {
+       u16 mc;
+-      b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
+-      if (multicast)
+-              mc |= BIT(port);
+-      else
+-              mc &= ~BIT(port);
+-      b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
+-
+-      b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
+-      if (multicast)
+-              mc |= BIT(port);
+-      else
+-              mc &= ~BIT(port);
+-      b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
++      if (is5325(dev)) {
++              if (port == B53_CPU_PORT_25)
++                      port = B53_CPU_PORT;
++
++              b53_read16(dev, B53_IEEE_PAGE, B53_IEEE_MCAST_DLF, &mc);
++              if (multicast)
++                      mc |= BIT(port) | B53_IEEE_MCAST_DROP_EN;
++              else
++                      mc &= ~BIT(port);
++              b53_write16(dev, B53_IEEE_PAGE, B53_IEEE_MCAST_DLF, mc);
++      } else {
++              b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
++              if (multicast)
++                      mc |= BIT(port);
++              else
++                      mc &= ~BIT(port);
++              b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
++
++              b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
++              if (multicast)
++                      mc |= BIT(port);
++              else
++                      mc &= ~BIT(port);
++              b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
++      }
+ }
+ static void b53_port_set_learning(struct b53_device *dev, int port,
+--- a/drivers/net/dsa/b53/b53_regs.h
++++ b/drivers/net/dsa/b53/b53_regs.h
+@@ -29,6 +29,7 @@
+ #define B53_ARLIO_PAGE                        0x05 /* ARL Access */
+ #define B53_FRAMEBUF_PAGE             0x06 /* Management frame access */
+ #define B53_MEM_ACCESS_PAGE           0x08 /* Memory access */
++#define B53_IEEE_PAGE                 0x0a /* IEEE 802.1X */
+ /* PHY Registers */
+ #define B53_PORT_MII_PAGE(i)          (0x10 + (i)) /* Port i MII Registers */
+@@ -371,6 +372,18 @@
+ #define B53_ARL_SRCH_RSTL(x)          (B53_ARL_SRCH_RSTL_0 + ((x) * 0x10))
+ /*************************************************************************
++ * IEEE 802.1X Registers
++ *************************************************************************/
++
++/* Multicast DLF Drop Control register (16 bit) */
++#define B53_IEEE_MCAST_DLF            0x94
++#define B53_IEEE_MCAST_DROP_EN                BIT(11)
++
++/* Unicast DLF Drop Control register (16 bit) */
++#define B53_IEEE_UCAST_DLF            0x96
++#define B53_IEEE_UCAST_DROP_EN                BIT(11)
++
++/*************************************************************************
+  * Port VLAN Registers
+  *************************************************************************/
diff --git a/target/linux/generic/backport-6.12/612-02-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch b/target/linux/generic/backport-6.12/612-02-v6.17-net-dsa-tag_brcm-add-support-for-legacy-FCS-tags.patch
deleted file mode 100644 (file)
index 88f10be..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-From ef07df397a621707903ef0d294a7df11f80cf206 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:48 +0200
-Subject: [PATCH] net: dsa: tag_brcm: add support for legacy FCS tags
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add support for legacy Broadcom FCS tags, which are similar to
-DSA_TAG_PROTO_BRCM_LEGACY.
-BCM5325 and BCM5365 switches require including the original FCS value and
-length, as opposed to BCM63xx switches.
-Adding the original FCS value and length to DSA_TAG_PROTO_BRCM_LEGACY would
-impact performance of BCM63xx switches, so it's better to create a new tag.
-
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- include/net/dsa.h  |  2 ++
- net/dsa/Kconfig    | 16 ++++++++--
- net/dsa/tag_brcm.c | 73 +++++++++++++++++++++++++++++++++++++++++++++-
- 3 files changed, 88 insertions(+), 3 deletions(-)
-
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -54,11 +54,13 @@ struct tc_action;
- #define DSA_TAG_PROTO_RZN1_A5PSW_VALUE                26
- #define DSA_TAG_PROTO_LAN937X_VALUE           27
- #define DSA_TAG_PROTO_VSC73XX_8021Q_VALUE     28
-+#define DSA_TAG_PROTO_BRCM_LEGACY_FCS_VALUE   29
- enum dsa_tag_protocol {
-       DSA_TAG_PROTO_NONE              = DSA_TAG_PROTO_NONE_VALUE,
-       DSA_TAG_PROTO_BRCM              = DSA_TAG_PROTO_BRCM_VALUE,
-       DSA_TAG_PROTO_BRCM_LEGACY       = DSA_TAG_PROTO_BRCM_LEGACY_VALUE,
-+      DSA_TAG_PROTO_BRCM_LEGACY_FCS   = DSA_TAG_PROTO_BRCM_LEGACY_FCS_VALUE,
-       DSA_TAG_PROTO_BRCM_PREPEND      = DSA_TAG_PROTO_BRCM_PREPEND_VALUE,
-       DSA_TAG_PROTO_DSA               = DSA_TAG_PROTO_DSA_VALUE,
-       DSA_TAG_PROTO_EDSA              = DSA_TAG_PROTO_EDSA_VALUE,
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -42,12 +42,24 @@ config NET_DSA_TAG_BRCM
-         Broadcom switches which place the tag after the MAC source address.
- config NET_DSA_TAG_BRCM_LEGACY
--      tristate "Tag driver for Broadcom legacy switches using in-frame headers"
-+      tristate "Tag driver for BCM63xx legacy switches using in-frame headers"
-       select NET_DSA_TAG_BRCM_COMMON
-       help
-         Say Y if you want to enable support for tagging frames for the
--        Broadcom legacy switches which place the tag after the MAC source
-+        BCM63xx legacy switches which place the tag after the MAC source
-         address.
-+        This tag is used in BCM63xx legacy switches which work without the
-+        original FCS and length before the tag insertion.
-+
-+config NET_DSA_TAG_BRCM_LEGACY_FCS
-+      tristate "Tag driver for BCM53xx legacy switches using in-frame headers"
-+      select NET_DSA_TAG_BRCM_COMMON
-+      help
-+        Say Y if you want to enable support for tagging frames for the
-+        BCM53xx legacy switches which place the tag after the MAC source
-+        address.
-+        This tag is used in BCM53xx legacy switches which expect original
-+        FCS and length before the tag insertion to be present.
- config NET_DSA_TAG_BRCM_PREPEND
-       tristate "Tag driver for Broadcom switches using prepended headers"
---- a/net/dsa/tag_brcm.c
-+++ b/net/dsa/tag_brcm.c
-@@ -15,6 +15,7 @@
- #define BRCM_NAME             "brcm"
- #define BRCM_LEGACY_NAME      "brcm-legacy"
-+#define BRCM_LEGACY_FCS_NAME  "brcm-legacy-fcs"
- #define BRCM_PREPEND_NAME     "brcm-prepend"
- /* Legacy Broadcom tag (6 bytes) */
-@@ -32,6 +33,10 @@
- #define BRCM_LEG_MULTICAST    (1 << 5)
- #define BRCM_LEG_EGRESS               (2 << 5)
- #define BRCM_LEG_INGRESS      (3 << 5)
-+#define BRCM_LEG_LEN_HI(x)    (((x) >> 8) & 0x7)
-+
-+/* 4th byte in the tag */
-+#define BRCM_LEG_LEN_LO(x)    ((x) & 0xff)
- /* 6th byte in the tag */
- #define BRCM_LEG_PORT_ID      (0xf)
-@@ -212,7 +217,8 @@ DSA_TAG_DRIVER(brcm_netdev_ops);
- MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM, BRCM_NAME);
- #endif
--#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
-+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY) || \
-+      IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
- static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,
-                                       struct net_device *dev)
- {
-@@ -250,7 +256,9 @@ static struct sk_buff *brcm_leg_tag_rcv(
-       return skb;
- }
-+#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY || CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS */
-+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
- static struct sk_buff *brcm_leg_tag_xmit(struct sk_buff *skb,
-                                        struct net_device *dev)
- {
-@@ -300,6 +308,66 @@ DSA_TAG_DRIVER(brcm_legacy_netdev_ops);
- MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY, BRCM_LEGACY_NAME);
- #endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY */
-+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
-+static struct sk_buff *brcm_leg_fcs_tag_xmit(struct sk_buff *skb,
-+                                           struct net_device *dev)
-+{
-+      struct dsa_port *dp = dsa_user_to_port(dev);
-+      unsigned int fcs_len;
-+      __le32 fcs_val;
-+      u8 *brcm_tag;
-+
-+      /* The Ethernet switch we are interfaced with needs packets to be at
-+       * least 64 bytes (including FCS) otherwise they will be discarded when
-+       * they enter the switch port logic. When Broadcom tags are enabled, we
-+       * need to make sure that packets are at least 70 bytes (including FCS
-+       * and tag) because the length verification is done after the Broadcom
-+       * tag is stripped off the ingress packet.
-+       *
-+       * Let dsa_user_xmit() free the SKB.
-+       */
-+      if (__skb_put_padto(skb, ETH_ZLEN + BRCM_LEG_TAG_LEN, false))
-+              return NULL;
-+
-+      fcs_len = skb->len;
-+      fcs_val = cpu_to_le32(crc32_le(~0, skb->data, fcs_len) ^ ~0);
-+
-+      skb_push(skb, BRCM_LEG_TAG_LEN);
-+
-+      dsa_alloc_etype_header(skb, BRCM_LEG_TAG_LEN);
-+
-+      brcm_tag = skb->data + 2 * ETH_ALEN;
-+
-+      /* Broadcom tag type */
-+      brcm_tag[0] = BRCM_LEG_TYPE_HI;
-+      brcm_tag[1] = BRCM_LEG_TYPE_LO;
-+
-+      /* Broadcom tag value */
-+      brcm_tag[2] = BRCM_LEG_EGRESS | BRCM_LEG_LEN_HI(fcs_len);
-+      brcm_tag[3] = BRCM_LEG_LEN_LO(fcs_len);
-+      brcm_tag[4] = 0;
-+      brcm_tag[5] = dp->index & BRCM_LEG_PORT_ID;
-+
-+      /* Original FCS value */
-+      if (__skb_pad(skb, ETH_FCS_LEN, false))
-+              return NULL;
-+      skb_put_data(skb, &fcs_val, ETH_FCS_LEN);
-+
-+      return skb;
-+}
-+
-+static const struct dsa_device_ops brcm_legacy_fcs_netdev_ops = {
-+      .name = BRCM_LEGACY_FCS_NAME,
-+      .proto = DSA_TAG_PROTO_BRCM_LEGACY_FCS,
-+      .xmit = brcm_leg_fcs_tag_xmit,
-+      .rcv = brcm_leg_tag_rcv,
-+      .needed_headroom = BRCM_LEG_TAG_LEN,
-+};
-+
-+DSA_TAG_DRIVER(brcm_legacy_fcs_netdev_ops);
-+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_BRCM_LEGACY_FCS, BRCM_LEGACY_FCS_NAME);
-+#endif /* CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS */
-+
- #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND)
- static struct sk_buff *brcm_tag_xmit_prepend(struct sk_buff *skb,
-                                            struct net_device *dev)
-@@ -334,6 +402,9 @@ static struct dsa_tag_driver *dsa_tag_dr
- #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY)
-       &DSA_TAG_DRIVER_NAME(brcm_legacy_netdev_ops),
- #endif
-+#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS)
-+      &DSA_TAG_DRIVER_NAME(brcm_legacy_fcs_netdev_ops),
-+#endif
- #if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM_PREPEND)
-       &DSA_TAG_DRIVER_NAME(brcm_prepend_netdev_ops),
- #endif
diff --git a/target/linux/generic/backport-6.12/612-03-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch b/target/linux/generic/backport-6.12/612-03-v6.17-net-dsa-b53-support-legacy-FCS-tags.patch
deleted file mode 100644 (file)
index d04c97e..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-From c3cf059a4d419b9c888ce7e9952fa13ba7569b61 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:49 +0200
-Subject: [PATCH] net: dsa: b53: support legacy FCS tags
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Commit 46c5176c586c ("net: dsa: b53: support legacy tags") introduced
-support for legacy tags, but it turns out that BCM5325 and BCM5365
-switches require the original FCS value and length, so they have to be
-treated differently.
-
-Reviewed-by: Florian Fainelli <[email protected]>
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/Kconfig      | 1 +
- drivers/net/dsa/b53/b53_common.c | 7 +++++--
- 2 files changed, 6 insertions(+), 2 deletions(-)
-
---- a/drivers/net/dsa/b53/Kconfig
-+++ b/drivers/net/dsa/b53/Kconfig
-@@ -5,6 +5,7 @@ menuconfig B53
-       select NET_DSA_TAG_NONE
-       select NET_DSA_TAG_BRCM
-       select NET_DSA_TAG_BRCM_LEGACY
-+      select NET_DSA_TAG_BRCM_LEGACY_FCS
-       select NET_DSA_TAG_BRCM_PREPEND
-       help
-         This driver adds support for Broadcom managed switch chips. It supports
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -2304,8 +2304,11 @@ enum dsa_tag_protocol b53_get_tag_protoc
-               goto out;
-       }
--      /* Older models require a different 6 byte tag */
--      if (is5325(dev) || is5365(dev) || is63xx(dev)) {
-+      /* Older models require different 6 byte tags */
-+      if (is5325(dev) || is5365(dev)) {
-+              dev->tag_protocol = DSA_TAG_PROTO_BRCM_LEGACY_FCS;
-+              goto out;
-+      } else if (is63xx(dev)) {
-               dev->tag_protocol = DSA_TAG_PROTO_BRCM_LEGACY;
-               goto out;
-       }
diff --git a/target/linux/generic/backport-6.12/612-04-v6.17-net-dsa-b53-detect-BCM5325-variants.patch b/target/linux/generic/backport-6.12/612-04-v6.17-net-dsa-b53-detect-BCM5325-variants.patch
deleted file mode 100644 (file)
index c7af2f2..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-From 0cbec9aef5a86194117a956546dc1aec95031f37 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:50 +0200
-Subject: [PATCH] net: dsa: b53: detect BCM5325 variants
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-We need to be able to differentiate the BCM5325 variants because:
-- BCM5325M switches lack the ARLIO_PAGE->VLAN_ID_IDX register.
-- BCM5325E have less 512 ARL buckets instead of 1024.
-
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 24 +++++++++++++++++++++---
- drivers/net/dsa/b53/b53_priv.h   | 19 +++++++++++++++++++
- 2 files changed, 40 insertions(+), 3 deletions(-)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -1835,7 +1835,8 @@ static int b53_arl_op(struct b53_device
-       /* Perform a read for the given MAC and VID */
-       b53_write48(dev, B53_ARLIO_PAGE, B53_MAC_ADDR_IDX, mac);
--      b53_write16(dev, B53_ARLIO_PAGE, B53_VLAN_ID_IDX, vid);
-+      if (!is5325m(dev))
-+              b53_write16(dev, B53_ARLIO_PAGE, B53_VLAN_ID_IDX, vid);
-       /* Issue a read operation for this MAC */
-       ret = b53_arl_rw_op(dev, 1);
-@@ -2903,6 +2904,9 @@ static int b53_switch_init(struct b53_de
-               }
-       }
-+      if (is5325e(dev))
-+              dev->num_arl_buckets = 512;
-+
-       dev->num_ports = fls(dev->enabled_ports);
-       dev->ds->num_ports = min_t(unsigned int, dev->num_ports, DSA_MAX_PORTS);
-@@ -3004,10 +3008,24 @@ int b53_switch_detect(struct b53_device
-               b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, 0xf);
-               b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, &tmp);
--              if (tmp == 0xf)
-+              if (tmp == 0xf) {
-+                      u32 phy_id;
-+                      int val;
-+
-                       dev->chip_id = BCM5325_DEVICE_ID;
--              else
-+
-+                      val = b53_phy_read16(dev->ds, 0, MII_PHYSID1);
-+                      phy_id = (val & 0xffff) << 16;
-+                      val = b53_phy_read16(dev->ds, 0, MII_PHYSID2);
-+                      phy_id |= (val & 0xfff0);
-+
-+                      if (phy_id == 0x00406330)
-+                              dev->variant_id = B53_VARIANT_5325M;
-+                      else if (phy_id == 0x0143bc30)
-+                              dev->variant_id = B53_VARIANT_5325E;
-+              } else {
-                       dev->chip_id = BCM5365_DEVICE_ID;
-+              }
-               break;
-       case BCM5389_DEVICE_ID:
-       case BCM5395_DEVICE_ID:
---- a/drivers/net/dsa/b53/b53_priv.h
-+++ b/drivers/net/dsa/b53/b53_priv.h
-@@ -84,6 +84,12 @@ enum {
-       BCM53134_DEVICE_ID = 0x5075,
- };
-+enum b53_variant_id {
-+      B53_VARIANT_NONE = 0,
-+      B53_VARIANT_5325E,
-+      B53_VARIANT_5325M,
-+};
-+
- struct b53_pcs {
-       struct phylink_pcs pcs;
-       struct b53_device *dev;
-@@ -118,6 +124,7 @@ struct b53_device {
-       /* chip specific data */
-       u32 chip_id;
-+      enum b53_variant_id variant_id;
-       u8 core_rev;
-       u8 vta_regs[3];
-       u8 duplex_reg;
-@@ -165,6 +172,18 @@ static inline int is5325(struct b53_devi
-       return dev->chip_id == BCM5325_DEVICE_ID;
- }
-+static inline int is5325e(struct b53_device *dev)
-+{
-+      return is5325(dev) &&
-+              dev->variant_id == B53_VARIANT_5325E;
-+}
-+
-+static inline int is5325m(struct b53_device *dev)
-+{
-+      return is5325(dev) &&
-+              dev->variant_id == B53_VARIANT_5325M;
-+}
-+
- static inline int is5365(struct b53_device *dev)
- {
- #ifdef CONFIG_BCM47XX
diff --git a/target/linux/generic/backport-6.12/612-05-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch b/target/linux/generic/backport-6.12/612-05-v6.17-net-dsa-b53-add-support-for-FDB-operations-on-5325-5365.patch
deleted file mode 100644 (file)
index 509806a..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-From c45655386e532c85ff1d679fc2aa40b3aaff9916 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:51 +0200
-Subject: [PATCH] net: dsa: b53: add support for FDB operations on 5325/5365
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-BCM5325 and BCM5365 are part of a much older generation of switches which,
-due to their limited number of ports and VLAN entries (up to 256) allowed
-a single 64-bit register to hold a full ARL entry.
-This requires a little bit of massaging when reading, writing and
-converting ARL entries in both directions.
-
-Signed-off-by: Florian Fainelli <[email protected]>
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 101 +++++++++++++++++++++++++------
- drivers/net/dsa/b53/b53_priv.h   |  29 +++++++++
- drivers/net/dsa/b53/b53_regs.h   |   7 ++-
- 3 files changed, 115 insertions(+), 22 deletions(-)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -1821,6 +1821,45 @@ static int b53_arl_read(struct b53_devic
-       return *idx >= dev->num_arl_bins ? -ENOSPC : -ENOENT;
- }
-+static int b53_arl_read_25(struct b53_device *dev, u64 mac,
-+                         u16 vid, struct b53_arl_entry *ent, u8 *idx)
-+{
-+      DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES);
-+      unsigned int i;
-+      int ret;
-+
-+      ret = b53_arl_op_wait(dev);
-+      if (ret)
-+              return ret;
-+
-+      bitmap_zero(free_bins, dev->num_arl_bins);
-+
-+      /* Read the bins */
-+      for (i = 0; i < dev->num_arl_bins; i++) {
-+              u64 mac_vid;
-+
-+              b53_read64(dev, B53_ARLIO_PAGE,
-+                         B53_ARLTBL_MAC_VID_ENTRY(i), &mac_vid);
-+
-+              b53_arl_to_entry_25(ent, mac_vid);
-+
-+              if (!(mac_vid & ARLTBL_VALID_25)) {
-+                      set_bit(i, free_bins);
-+                      continue;
-+              }
-+              if ((mac_vid & ARLTBL_MAC_MASK) != mac)
-+                      continue;
-+              if (dev->vlan_enabled &&
-+                  ((mac_vid >> ARLTBL_VID_S_65) & ARLTBL_VID_MASK_25) != vid)
-+                      continue;
-+              *idx = i;
-+              return 0;
-+      }
-+
-+      *idx = find_first_bit(free_bins, dev->num_arl_bins);
-+      return *idx >= dev->num_arl_bins ? -ENOSPC : -ENOENT;
-+}
-+
- static int b53_arl_op(struct b53_device *dev, int op, int port,
-                     const unsigned char *addr, u16 vid, bool is_valid)
- {
-@@ -1843,7 +1882,10 @@ static int b53_arl_op(struct b53_device
-       if (ret)
-               return ret;
--      ret = b53_arl_read(dev, mac, vid, &ent, &idx);
-+      if (is5325(dev) || is5365(dev))
-+              ret = b53_arl_read_25(dev, mac, vid, &ent, &idx);
-+      else
-+              ret = b53_arl_read(dev, mac, vid, &ent, &idx);
-       /* If this is a read, just finish now */
-       if (op)
-@@ -1887,12 +1929,17 @@ static int b53_arl_op(struct b53_device
-       ent.is_static = true;
-       ent.is_age = false;
-       memcpy(ent.mac, addr, ETH_ALEN);
--      b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
-+      if (is5325(dev) || is5365(dev))
-+              b53_arl_from_entry_25(&mac_vid, &ent);
-+      else
-+              b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
-       b53_write64(dev, B53_ARLIO_PAGE,
-                   B53_ARLTBL_MAC_VID_ENTRY(idx), mac_vid);
--      b53_write32(dev, B53_ARLIO_PAGE,
--                  B53_ARLTBL_DATA_ENTRY(idx), fwd_entry);
-+
-+      if (!is5325(dev) && !is5365(dev))
-+              b53_write32(dev, B53_ARLIO_PAGE,
-+                          B53_ARLTBL_DATA_ENTRY(idx), fwd_entry);
-       return b53_arl_rw_op(dev, 0);
- }
-@@ -1904,12 +1951,6 @@ int b53_fdb_add(struct dsa_switch *ds, i
-       struct b53_device *priv = ds->priv;
-       int ret;
--      /* 5325 and 5365 require some more massaging, but could
--       * be supported eventually
--       */
--      if (is5325(priv) || is5365(priv))
--              return -EOPNOTSUPP;
--
-       mutex_lock(&priv->arl_mutex);
-       ret = b53_arl_op(priv, 0, port, addr, vid, true);
-       mutex_unlock(&priv->arl_mutex);
-@@ -1936,10 +1977,15 @@ EXPORT_SYMBOL(b53_fdb_del);
- static int b53_arl_search_wait(struct b53_device *dev)
- {
-       unsigned int timeout = 1000;
--      u8 reg;
-+      u8 reg, offset;
-+
-+      if (is5325(dev) || is5365(dev))
-+              offset = B53_ARL_SRCH_CTL_25;
-+      else
-+              offset = B53_ARL_SRCH_CTL;
-       do {
--              b53_read8(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, &reg);
-+              b53_read8(dev, B53_ARLIO_PAGE, offset, &reg);
-               if (!(reg & ARL_SRCH_STDN))
-                       return -ENOENT;
-@@ -1956,13 +2002,24 @@ static void b53_arl_search_rd(struct b53
-                             struct b53_arl_entry *ent)
- {
-       u64 mac_vid;
--      u32 fwd_entry;
--      b53_read64(dev, B53_ARLIO_PAGE,
--                 B53_ARL_SRCH_RSTL_MACVID(idx), &mac_vid);
--      b53_read32(dev, B53_ARLIO_PAGE,
--                 B53_ARL_SRCH_RSTL(idx), &fwd_entry);
--      b53_arl_to_entry(ent, mac_vid, fwd_entry);
-+      if (is5325(dev)) {
-+              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_25,
-+                         &mac_vid);
-+              b53_arl_to_entry_25(ent, mac_vid);
-+      } else if (is5365(dev)) {
-+              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
-+                         &mac_vid);
-+              b53_arl_to_entry_25(ent, mac_vid);
-+      } else {
-+              u32 fwd_entry;
-+
-+              b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_MACVID(idx),
-+                         &mac_vid);
-+              b53_read32(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL(idx),
-+                         &fwd_entry);
-+              b53_arl_to_entry(ent, mac_vid, fwd_entry);
-+      }
- }
- static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
-@@ -1983,14 +2040,20 @@ int b53_fdb_dump(struct dsa_switch *ds,
-       struct b53_device *priv = ds->priv;
-       struct b53_arl_entry results[2];
-       unsigned int count = 0;
-+      u8 offset;
-       int ret;
-       u8 reg;
-       mutex_lock(&priv->arl_mutex);
-+      if (is5325(priv) || is5365(priv))
-+              offset = B53_ARL_SRCH_CTL_25;
-+      else
-+              offset = B53_ARL_SRCH_CTL;
-+
-       /* Start search operation */
-       reg = ARL_SRCH_STDN;
--      b53_write8(priv, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, reg);
-+      b53_write8(priv, offset, B53_ARL_SRCH_CTL, reg);
-       do {
-               ret = b53_arl_search_wait(priv);
---- a/drivers/net/dsa/b53/b53_priv.h
-+++ b/drivers/net/dsa/b53/b53_priv.h
-@@ -317,6 +317,19 @@ static inline void b53_arl_to_entry(stru
-       ent->vid = mac_vid >> ARLTBL_VID_S;
- }
-+static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent,
-+                                     u64 mac_vid)
-+{
-+      memset(ent, 0, sizeof(*ent));
-+      ent->port = (mac_vid >> ARLTBL_DATA_PORT_ID_S_25) &
-+                   ARLTBL_DATA_PORT_ID_MASK_25;
-+      ent->is_valid = !!(mac_vid & ARLTBL_VALID_25);
-+      ent->is_age = !!(mac_vid & ARLTBL_AGE_25);
-+      ent->is_static = !!(mac_vid & ARLTBL_STATIC_25);
-+      u64_to_ether_addr(mac_vid, ent->mac);
-+      ent->vid = mac_vid >> ARLTBL_VID_S_65;
-+}
-+
- static inline void b53_arl_from_entry(u64 *mac_vid, u32 *fwd_entry,
-                                     const struct b53_arl_entry *ent)
- {
-@@ -331,6 +344,22 @@ static inline void b53_arl_from_entry(u6
-               *fwd_entry |= ARLTBL_AGE;
- }
-+static inline void b53_arl_from_entry_25(u64 *mac_vid,
-+                                       const struct b53_arl_entry *ent)
-+{
-+      *mac_vid = ether_addr_to_u64(ent->mac);
-+      *mac_vid |= (u64)(ent->port & ARLTBL_DATA_PORT_ID_MASK_25) <<
-+                        ARLTBL_DATA_PORT_ID_S_25;
-+      *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK_25) <<
-+                        ARLTBL_VID_S_65;
-+      if (ent->is_valid)
-+              *mac_vid |= ARLTBL_VALID_25;
-+      if (ent->is_static)
-+              *mac_vid |= ARLTBL_STATIC_25;
-+      if (ent->is_age)
-+              *mac_vid |= ARLTBL_AGE_25;
-+}
-+
- #ifdef CONFIG_BCM47XX
- #include <linux/bcm47xx_nvram.h>
---- a/drivers/net/dsa/b53/b53_regs.h
-+++ b/drivers/net/dsa/b53/b53_regs.h
-@@ -328,9 +328,10 @@
- #define   ARLTBL_VID_MASK             0xfff
- #define   ARLTBL_DATA_PORT_ID_S_25    48
- #define   ARLTBL_DATA_PORT_ID_MASK_25 0xf
--#define   ARLTBL_AGE_25                       BIT(61)
--#define   ARLTBL_STATIC_25            BIT(62)
--#define   ARLTBL_VALID_25             BIT(63)
-+#define   ARLTBL_VID_S_65             53
-+#define   ARLTBL_AGE_25                       BIT_ULL(61)
-+#define   ARLTBL_STATIC_25            BIT_ULL(62)
-+#define   ARLTBL_VALID_25             BIT_ULL(63)
- /* ARL Table Data Entry N Registers (32 bit) */
- #define B53_ARLTBL_DATA_ENTRY(n)      ((0x10 * (n)) + 0x18)
diff --git a/target/linux/generic/backport-6.12/612-06-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch b/target/linux/generic/backport-6.12/612-06-v6.17-net-dsa-b53-prevent-FAST_AGE-access-on-BCM5325.patch
deleted file mode 100644 (file)
index 7397e33..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-From 9b6c767c312b4709e9aeb2314a6b47863e7fb72d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:52 +0200
-Subject: [PATCH] net: dsa: b53: prevent FAST_AGE access on BCM5325
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
-writing them.
-
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -492,6 +492,9 @@ static int b53_flush_arl(struct b53_devi
- {
-       unsigned int i;
-+      if (is5325(dev))
-+              return 0;
-+
-       b53_write8(dev, B53_CTRL_PAGE, B53_FAST_AGE_CTRL,
-                  FAST_AGE_DONE | FAST_AGE_DYNAMIC | mask);
-@@ -516,6 +519,9 @@ out:
- static int b53_fast_age_port(struct b53_device *dev, int port)
- {
-+      if (is5325(dev))
-+              return 0;
-+
-       b53_write8(dev, B53_CTRL_PAGE, B53_FAST_AGE_PORT_CTRL, port);
-       return b53_flush_arl(dev, FAST_AGE_PORT);
-@@ -523,6 +529,9 @@ static int b53_fast_age_port(struct b53_
- static int b53_fast_age_vlan(struct b53_device *dev, u16 vid)
- {
-+      if (is5325(dev))
-+              return 0;
-+
-       b53_write16(dev, B53_CTRL_PAGE, B53_FAST_AGE_VID_CTRL, vid);
-       return b53_flush_arl(dev, FAST_AGE_VLAN);
diff --git a/target/linux/generic/backport-6.12/612-10-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch b/target/linux/generic/backport-6.12/612-10-v6.17-net-dsa-b53-prevent-BRCM_HDR-access-on-older-devices.patch
deleted file mode 100644 (file)
index 6ea8367..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From e17813968b08b1b09bf80699223dea48851cbd07 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:56 +0200
-Subject: [PATCH] net: dsa: b53: prevent BRCM_HDR access on older devices
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Older switches don't implement BRCM_HDR register so we should avoid
-reading or writing it.
-
-Reviewed-by: Florian Fainelli <[email protected]>
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -747,6 +747,11 @@ void b53_brcm_hdr_setup(struct dsa_switc
-               hdr_ctl |= GC_FRM_MGMT_PORT_M;
-       b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, hdr_ctl);
-+      /* B53_BRCM_HDR not present on devices with legacy tags */
-+      if (dev->tag_protocol == DSA_TAG_PROTO_BRCM_LEGACY ||
-+          dev->tag_protocol == DSA_TAG_PROTO_BRCM_LEGACY_FCS)
-+              return;
-+
-       /* Enable Broadcom tags for IMP port */
-       b53_read8(dev, B53_MGMT_PAGE, B53_BRCM_HDR, &hdr_ctl);
-       if (tag_en)
diff --git a/target/linux/generic/backport-6.12/612-12-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch b/target/linux/generic/backport-6.12/612-12-v6.17-net-dsa-b53-fix-unicast-multicast-flooding-on-BCM5325.patch
deleted file mode 100644 (file)
index 6b9c86e..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-From 651c9e71ffe44e99b5a9b011271c2117f0353b32 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <[email protected]>
-Date: Sat, 14 Jun 2025 09:59:58 +0200
-Subject: [PATCH] net: dsa: b53: fix unicast/multicast flooding on BCM5325
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-BCM5325 doesn't implement UC_FLOOD_MASK, MC_FLOOD_MASK and IPMC_FLOOD_MASK
-registers.
-This has to be handled differently with other pages and registers.
-
-Signed-off-by: Álvaro Fernández Rojas <[email protected]>
-Reviewed-by: Florian Fainelli <[email protected]>
-Link: https://patch.msgid.link/[email protected]
-Signed-off-by: Jakub Kicinski <[email protected]>
----
- drivers/net/dsa/b53/b53_common.c | 60 ++++++++++++++++++++++----------
- drivers/net/dsa/b53/b53_regs.h   | 13 +++++++
- 2 files changed, 55 insertions(+), 18 deletions(-)
-
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -564,12 +564,24 @@ static void b53_port_set_ucast_flood(str
- {
-       u16 uc;
--      b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
--      if (unicast)
--              uc |= BIT(port);
--      else
--              uc &= ~BIT(port);
--      b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
-+      if (is5325(dev)) {
-+              if (port == B53_CPU_PORT_25)
-+                      port = B53_CPU_PORT;
-+
-+              b53_read16(dev, B53_IEEE_PAGE, B53_IEEE_UCAST_DLF, &uc);
-+              if (unicast)
-+                      uc |= BIT(port) | B53_IEEE_UCAST_DROP_EN;
-+              else
-+                      uc &= ~BIT(port);
-+              b53_write16(dev, B53_IEEE_PAGE, B53_IEEE_UCAST_DLF, uc);
-+      } else {
-+              b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
-+              if (unicast)
-+                      uc |= BIT(port);
-+              else
-+                      uc &= ~BIT(port);
-+              b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
-+      }
- }
- static void b53_port_set_mcast_flood(struct b53_device *dev, int port,
-@@ -577,19 +589,31 @@ static void b53_port_set_mcast_flood(str
- {
-       u16 mc;
--      b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
--      if (multicast)
--              mc |= BIT(port);
--      else
--              mc &= ~BIT(port);
--      b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
--
--      b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
--      if (multicast)
--              mc |= BIT(port);
--      else
--              mc &= ~BIT(port);
--      b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
-+      if (is5325(dev)) {
-+              if (port == B53_CPU_PORT_25)
-+                      port = B53_CPU_PORT;
-+
-+              b53_read16(dev, B53_IEEE_PAGE, B53_IEEE_MCAST_DLF, &mc);
-+              if (multicast)
-+                      mc |= BIT(port) | B53_IEEE_MCAST_DROP_EN;
-+              else
-+                      mc &= ~BIT(port);
-+              b53_write16(dev, B53_IEEE_PAGE, B53_IEEE_MCAST_DLF, mc);
-+      } else {
-+              b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
-+              if (multicast)
-+                      mc |= BIT(port);
-+              else
-+                      mc &= ~BIT(port);
-+              b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
-+
-+              b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
-+              if (multicast)
-+                      mc |= BIT(port);
-+              else
-+                      mc &= ~BIT(port);
-+              b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
-+      }
- }
- static void b53_port_set_learning(struct b53_device *dev, int port,
---- a/drivers/net/dsa/b53/b53_regs.h
-+++ b/drivers/net/dsa/b53/b53_regs.h
-@@ -29,6 +29,7 @@
- #define B53_ARLIO_PAGE                        0x05 /* ARL Access */
- #define B53_FRAMEBUF_PAGE             0x06 /* Management frame access */
- #define B53_MEM_ACCESS_PAGE           0x08 /* Memory access */
-+#define B53_IEEE_PAGE                 0x0a /* IEEE 802.1X */
- /* PHY Registers */
- #define B53_PORT_MII_PAGE(i)          (0x10 + (i)) /* Port i MII Registers */
-@@ -371,6 +372,18 @@
- #define B53_ARL_SRCH_RSTL(x)          (B53_ARL_SRCH_RSTL_0 + ((x) * 0x10))
- /*************************************************************************
-+ * IEEE 802.1X Registers
-+ *************************************************************************/
-+
-+/* Multicast DLF Drop Control register (16 bit) */
-+#define B53_IEEE_MCAST_DLF            0x94
-+#define B53_IEEE_MCAST_DROP_EN                BIT(11)
-+
-+/* Unicast DLF Drop Control register (16 bit) */
-+#define B53_IEEE_UCAST_DLF            0x96
-+#define B53_IEEE_UCAST_DROP_EN                BIT(11)
-+
-+/*************************************************************************
-  * Port VLAN Registers
-  *************************************************************************/