* [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support
@ 2025-05-31 10:12 Álvaro Fernández Rojas
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
` (10 more replies)
0 siblings, 11 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:12 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
These patches get the BCM5325 switch working with b53.
There are still some sporadic errors related to FDB, but at least the
switch is working now:
bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add d6:67:0c:XX:XX:XX vid 1 to fdb: -28
bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add 5c:4c:a9:XX:XX:XX vid 0 to fdb: -28
bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add 5c:4c:a9:XX:XX:XX vid 1 to fdb: -28
bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to delete d6:67:0c:XX:XX:XX vid 1 from fdb: -2
I'm not really sure that everything here is correct since I don't work for
Broadcom and all this is based on the public datasheet available for the
BCM5325 and my own experiments with a Huawei HG556a (BCM6358).
Florian Fainelli (1):
net: dsa: b53: add support for FDB operations on 5325/5365
Álvaro Fernández Rojas (9):
net: dsa: b53: prevent FAST_AGE access on BCM5325
net: dsa: b53: prevent SWITCH_CTRL access on BCM5325
net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
net: dsa: b53: prevent DIS_LEARNING access on BCM5325
net: dsa: b53: prevent BRCM_HDR access on BCM5325
net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
net: dsa: b53: fix unicast/multicast flooding on BCM5325
net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
net: dsa: b53: ensure BCM5325 PHYs are enabled
drivers/net/dsa/b53/b53_common.c | 213 +++++++++++++++++++++++--------
drivers/net/dsa/b53/b53_priv.h | 57 ++++++---
drivers/net/dsa/b53/b53_regs.h | 47 ++++++-
3 files changed, 246 insertions(+), 71 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 33+ messages in thread
* [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
@ 2025-05-31 10:12 ` Álvaro Fernández Rojas
2025-06-02 18:22 ` Florian Fainelli
2025-06-02 20:09 ` Jonas Gorski
2025-05-31 10:13 ` [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325 Álvaro Fernández Rojas
` (9 subsequent siblings)
10 siblings, 2 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:12 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Florian Fainelli, Álvaro Fernández Rojas
From: Florian Fainelli <f.fainelli@gmail.com>
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 <f.fainelli@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 60 +++++++++++++++++++++-----------
drivers/net/dsa/b53/b53_priv.h | 57 +++++++++++++++++++++---------
drivers/net/dsa/b53/b53_regs.h | 7 ++--
3 files changed, 84 insertions(+), 40 deletions(-)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 132683ed3abe..03c1e2e75061 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -1760,9 +1760,11 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
b53_read64(dev, B53_ARLIO_PAGE,
B53_ARLTBL_MAC_VID_ENTRY(i), &mac_vid);
- b53_read32(dev, B53_ARLIO_PAGE,
- B53_ARLTBL_DATA_ENTRY(i), &fwd_entry);
- b53_arl_to_entry(ent, mac_vid, fwd_entry);
+
+ if (!is5325(dev) && !is5365(dev))
+ b53_read32(dev, B53_ARLIO_PAGE,
+ B53_ARLTBL_DATA_ENTRY(i), &fwd_entry);
+ b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
if (!(fwd_entry & ARLTBL_VALID)) {
set_bit(i, free_bins);
@@ -1795,7 +1797,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
/* 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 (!is5325(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);
@@ -1846,12 +1849,14 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
ent.is_static = true;
ent.is_age = false;
memcpy(ent.mac, addr, ETH_ALEN);
- b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
+ b53_arl_from_entry(dev, &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);
}
@@ -1863,12 +1868,6 @@ int b53_fdb_add(struct dsa_switch *ds, int port,
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);
@@ -1895,10 +1894,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, ®);
+ b53_read8(dev, B53_ARLIO_PAGE, offset, ®);
if (!(reg & ARL_SRCH_STDN))
return 0;
@@ -1917,11 +1921,19 @@ static void b53_arl_search_rd(struct b53_device *dev, u8 idx,
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);
+ } else if (is5365(dev)) {
+ b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
+ &mac_vid);
+ } else {
+ 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(dev, ent, mac_vid, fwd_entry);
}
static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
@@ -1942,14 +1954,20 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
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);
diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h
index a5ef7071ba07..05c5b9239bda 100644
--- a/drivers/net/dsa/b53/b53_priv.h
+++ b/drivers/net/dsa/b53/b53_priv.h
@@ -286,30 +286,55 @@ struct b53_arl_entry {
u8 is_static:1;
};
-static inline void b53_arl_to_entry(struct b53_arl_entry *ent,
+static inline void b53_arl_to_entry(struct b53_device *dev,
+ struct b53_arl_entry *ent,
u64 mac_vid, u32 fwd_entry)
{
memset(ent, 0, sizeof(*ent));
- ent->port = fwd_entry & ARLTBL_DATA_PORT_ID_MASK;
- ent->is_valid = !!(fwd_entry & ARLTBL_VALID);
- ent->is_age = !!(fwd_entry & ARLTBL_AGE);
- ent->is_static = !!(fwd_entry & ARLTBL_STATIC);
- u64_to_ether_addr(mac_vid, ent->mac);
- ent->vid = mac_vid >> ARLTBL_VID_S;
+ if (is5325(dev) || is5365(dev)) {
+ 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;
+ } else {
+ ent->port = fwd_entry & ARLTBL_DATA_PORT_ID_MASK;
+ ent->is_valid = !!(fwd_entry & ARLTBL_VALID);
+ ent->is_age = !!(fwd_entry & ARLTBL_AGE);
+ ent->is_static = !!(fwd_entry & ARLTBL_STATIC);
+ u64_to_ether_addr(mac_vid, ent->mac);
+ ent->vid = mac_vid >> ARLTBL_VID_S;
+ }
}
-static inline void b53_arl_from_entry(u64 *mac_vid, u32 *fwd_entry,
+static inline void b53_arl_from_entry(struct b53_device *dev,
+ u64 *mac_vid, u32 *fwd_entry,
const struct b53_arl_entry *ent)
{
*mac_vid = ether_addr_to_u64(ent->mac);
- *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK) << ARLTBL_VID_S;
- *fwd_entry = ent->port & ARLTBL_DATA_PORT_ID_MASK;
- if (ent->is_valid)
- *fwd_entry |= ARLTBL_VALID;
- if (ent->is_static)
- *fwd_entry |= ARLTBL_STATIC;
- if (ent->is_age)
- *fwd_entry |= ARLTBL_AGE;
+ if (is5325(dev) || is5365(dev)) {
+ *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;
+ } else {
+ *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK) << ARLTBL_VID_S;
+ *fwd_entry = ent->port & ARLTBL_DATA_PORT_ID_MASK;
+ if (ent->is_valid)
+ *fwd_entry |= ARLTBL_VALID;
+ if (ent->is_static)
+ *fwd_entry |= ARLTBL_STATIC;
+ if (ent->is_age)
+ *fwd_entry |= ARLTBL_AGE;
+ }
}
#ifdef CONFIG_BCM47XX
diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h
index 1fbc5a204bc7..1f15332fb2a7 100644
--- a/drivers/net/dsa/b53/b53_regs.h
+++ b/drivers/net/dsa/b53/b53_regs.h
@@ -324,9 +324,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)
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 9:37 ` Vladimir Oltean
2025-05-31 10:13 ` [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL " Álvaro Fernández Rojas
` (8 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
writing them.
Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 03c1e2e75061..d1249aac6136 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -486,6 +486,9 @@ static int b53_flush_arl(struct b53_device *dev, u8 mask)
{
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);
@@ -510,6 +513,9 @@ static int b53_flush_arl(struct b53_device *dev, u8 mask)
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);
@@ -517,6 +523,9 @@ static int b53_fast_age_port(struct b53_device *dev, int port)
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);
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL access on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
2025-05-31 10:13 ` [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325 Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 18:03 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL " Álvaro Fernández Rojas
` (7 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement SWITCH_CTRL register so we should avoid reading
or writing it.
Fixes: a424f0de6163 ("net: dsa: b53: Include IMP/CPU port in dumb forwarding mode")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index d1249aac6136..f314aeb81643 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -360,11 +360,12 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
- /* Include IMP port in dumb forwarding mode
- */
- b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, &mgmt);
- mgmt |= B53_MII_DUMB_FWDG_EN;
- b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
+ if (!is5325(dev)) {
+ /* Include IMP port in dumb forwarding mode */
+ b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, &mgmt);
+ mgmt |= B53_MII_DUMB_FWDG_EN;
+ b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
+ }
/* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
* frames should be flooded or not.
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (2 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 18:06 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access " Álvaro Fernández Rojas
` (6 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement B53_UC_FWD_EN, B53_MC_FWD_EN or B53_IPMC_FWD_EN.
Fixes: 53568438e381 ("net: dsa: b53: Add support for port_egress_floods callback")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 13 +++++++++----
drivers/net/dsa/b53/b53_regs.h | 1 +
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index f314aeb81643..6b2ad82aa95f 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -367,11 +367,16 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
}
- /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
- * frames should be flooded or not.
- */
b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
- mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
+ if (is5325(dev)) {
+ /* Enable IP multicast address scheme. */
+ mgmt |= B53_IP_MCAST_25;
+ } else {
+ /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
+ * frames should be flooded or not.
+ */
+ mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
+ }
b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
}
diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h
index 1f15332fb2a7..896684d7f594 100644
--- a/drivers/net/dsa/b53/b53_regs.h
+++ b/drivers/net/dsa/b53/b53_regs.h
@@ -106,6 +106,7 @@
/* IP Multicast control (8 bit) */
#define B53_IP_MULTICAST_CTRL 0x21
+#define B53_IP_MCAST_25 BIT(0)
#define B53_IPMC_FWD_EN BIT(1)
#define B53_UC_FWD_EN BIT(6)
#define B53_MC_FWD_EN BIT(7)
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (3 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 9:40 ` Vladimir Oltean
2025-05-31 10:13 ` [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR " Álvaro Fernández Rojas
` (5 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement DIS_LEARNING register so we should avoid reading
or writing it.
Fixes: f9b3827ee66c ("net: dsa: b53: Support setting learning on port")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 6b2ad82aa95f..9667d4107139 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -593,6 +593,9 @@ static void b53_port_set_learning(struct b53_device *dev, int port,
{
u16 reg;
+ if (is5325(dev))
+ return;
+
b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, ®);
if (learning)
reg &= ~BIT(port);
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR access on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (4 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 18:07 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL " Álvaro Fernández Rojas
` (4 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement BRCM_HDR register so we should avoid reading or
writing it.
Fixes: b409a9efa183 ("net: dsa: b53: Move Broadcom header setup to b53")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 9667d4107139..fd0752100df8 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -730,6 +730,10 @@ void b53_brcm_hdr_setup(struct dsa_switch *ds, int port)
hdr_ctl |= GC_FRM_MGMT_PORT_M;
b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, hdr_ctl);
+ /* B53_BRCM_HDR not present on BCM5325 */
+ if (is5325(dev))
+ return;
+
/* Enable Broadcom tags for IMP port */
b53_read8(dev, B53_MGMT_PAGE, B53_BRCM_HDR, &hdr_ctl);
if (tag_en)
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (5 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 18:08 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding " Álvaro Fernández Rojas
` (3 subsequent siblings)
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
BCM5325 doesn't implement GMII_PORT_OVERRIDE_CTRL register so we should
avoid reading or writing it.
PORT_OVERRIDE_RX_FLOW and PORT_OVERRIDE_TX_FLOW aren't defined on BCM5325
and we should use PORT_OVERRIDE_LP_FLOW_25 instead.
Fixes: 5e004460f874 ("net: dsa: b53: Add helper to set link parameters")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 21 +++++++++++++++++----
drivers/net/dsa/b53/b53_regs.h | 1 +
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index fd0752100df8..387e1e7ec749 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -1278,6 +1278,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link)
if (port == dev->imp_port) {
off = B53_PORT_OVERRIDE_CTRL;
val = PORT_OVERRIDE_EN;
+ } else if (is5325(dev)) {
+ return;
} else {
off = B53_GMII_PORT_OVERRIDE_CTRL(port);
val = GMII_PO_EN;
@@ -1302,6 +1304,8 @@ static void b53_force_port_config(struct b53_device *dev, int port,
if (port == dev->imp_port) {
off = B53_PORT_OVERRIDE_CTRL;
val = PORT_OVERRIDE_EN;
+ } else if (is5325(dev)) {
+ return;
} else {
off = B53_GMII_PORT_OVERRIDE_CTRL(port);
val = GMII_PO_EN;
@@ -1332,10 +1336,19 @@ static void b53_force_port_config(struct b53_device *dev, int port,
return;
}
- if (rx_pause)
- reg |= PORT_OVERRIDE_RX_FLOW;
- if (tx_pause)
- reg |= PORT_OVERRIDE_TX_FLOW;
+ if (rx_pause) {
+ if (is5325(dev))
+ reg |= PORT_OVERRIDE_LP_FLOW_25;
+ else
+ reg |= PORT_OVERRIDE_RX_FLOW;
+ }
+
+ if (tx_pause) {
+ if (is5325(dev))
+ reg |= PORT_OVERRIDE_LP_FLOW_25;
+ else
+ reg |= PORT_OVERRIDE_TX_FLOW;
+ }
b53_write8(dev, B53_CTRL_PAGE, off, reg);
}
diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h
index 896684d7f594..ab15f36a135a 100644
--- a/drivers/net/dsa/b53/b53_regs.h
+++ b/drivers/net/dsa/b53/b53_regs.h
@@ -95,6 +95,7 @@
#define PORT_OVERRIDE_SPEED_10M (0 << PORT_OVERRIDE_SPEED_S)
#define PORT_OVERRIDE_SPEED_100M (1 << PORT_OVERRIDE_SPEED_S)
#define PORT_OVERRIDE_SPEED_1000M (2 << PORT_OVERRIDE_SPEED_S)
+#define PORT_OVERRIDE_LP_FLOW_25 BIT(3) /* BCM5325 only */
#define PORT_OVERRIDE_RV_MII_25 BIT(4) /* BCM5325 only */
#define PORT_OVERRIDE_RX_FLOW BIT(4)
#define PORT_OVERRIDE_TX_FLOW BIT(5)
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (6 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 9:44 ` Vladimir Oltean
2025-06-02 18:09 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325 Álvaro Fernández Rojas
` (2 subsequent siblings)
10 siblings, 2 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
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.
Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 85 +++++++++++++++++++++++++-------
drivers/net/dsa/b53/b53_regs.h | 38 ++++++++++++++
2 files changed, 105 insertions(+), 18 deletions(-)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 387e1e7ec749..d5216ea2c984 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -560,12 +560,36 @@ static void b53_port_set_ucast_flood(struct b53_device *dev, int port,
{
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)) {
+ u8 rc;
+
+ 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);
+
+ if (port >= B53_CPU_PORT_25)
+ return;
+
+ b53_read8(dev, B53_RATE_CTL_PAGE, B53_RATE_CONTROL(port), &rc);
+ if (unicast)
+ rc |= (RC_DLF_EN | RC_BKT_SIZE_8K | RC_PERCENT_40);
+ else
+ rc &= ~(RC_DLF_EN);
+ b53_write8(dev, B53_RATE_CTL_PAGE, B53_RATE_CONTROL(port), rc);
+ } 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,
@@ -573,19 +597,44 @@ static void b53_port_set_mcast_flood(struct b53_device *dev, int port,
{
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);
+ if (is5325(dev)) {
+ u8 rc;
- 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 (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);
+
+ if (port >= B53_CPU_PORT_25)
+ return;
+
+ b53_read8(dev, B53_RATE_CTL_PAGE, B53_RATE_CONTROL(port), &rc);
+ if (multicast)
+ rc |= (RC_BCAST_EN | RC_MCAST_EN | RC_BKT_SIZE_8K |
+ RC_PERCENT_40);
+ else
+ rc &= ~(RC_BCAST_EN | RC_MCAST_EN);
+ b53_write8(dev, B53_RATE_CTL_PAGE, B53_RATE_CONTROL(port), rc);
+ } 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,
diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h
index ab15f36a135a..b0a7ba3d9b65 100644
--- 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 */
@@ -47,6 +48,9 @@
/* VLAN Registers */
#define B53_VLAN_PAGE 0x34
+/* Rate Control Registers */
+#define B53_RATE_CTL_PAGE 0x35
+
/* Jumbo Frame Registers */
#define B53_JUMBO_PAGE 0x40
@@ -368,6 +372,18 @@
#define B53_ARL_SRCH_RSTL_MACVID(x) (B53_ARL_SRCH_RSTL_0_MACVID + ((x) * 0x10))
#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
*************************************************************************/
@@ -478,6 +494,28 @@
/* VLAN Port Default Tag (16 bit) */
#define B53_VLAN_PORT_DEF_TAG(i) (0x10 + 2 * (i))
+/*************************************************************************
+ * Rate Control Page Registers
+ *************************************************************************/
+
+#define B53_RATE_CONTROL(i) (0x00 + (i))
+#define RC_PERCENT_S 0
+#define RC_PERCENT_10 (0 << RC_PERCENT_S)
+#define RC_PERCENT_20 (1 << RC_PERCENT_S)
+#define RC_PERCENT_30 (2 << RC_PERCENT_S)
+#define RC_PERCENT_40 (3 << RC_PERCENT_S)
+#define RC_PERCENT_MASK (3 << RC_PERCENT_S)
+#define RC_BKT_SIZE_S 2
+#define RC_BKT_SIZE_2K (0 << RC_BKT_SIZE_S)
+#define RC_BKT_SIZE_4K (1 << RC_BKT_SIZE_S)
+#define RC_BKT_SIZE_6K (2 << RC_BKT_SIZE_S)
+#define RC_BKT_SIZE_8K (3 << RC_BKT_SIZE_S)
+#define RC_BKT_SIZE_MASK (3 << RC_BKT_SIZE_S)
+#define RC_DLF_EN BIT(4)
+#define RC_BCAST_EN BIT(5)
+#define RC_MCAST_EN BIT(6)
+#define RC_DROP_FRAME BIT(7)
+
/*************************************************************************
* Jumbo Frame Page Registers
*************************************************************************/
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (7 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding " Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 18:11 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled Álvaro Fernández Rojas
2025-06-02 20:14 ` [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Jonas Gorski
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
CPU port should be B53_CPU_PORT instead of B53_CPU_PORT_25 for
B53_PVLAN_PORT_MASK register.
Fixes: ff39c2d68679 ("net: dsa: b53: Add bridge support")
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index d5216ea2c984..802020eaea44 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -543,6 +543,10 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
unsigned int i;
u16 pvlan;
+ /* BCM5325 CPU port is at 8 */
+ if ((is5325(dev) || is5365(dev)) && cpu_port == B53_CPU_PORT_25)
+ cpu_port = B53_CPU_PORT;
+
/* Enable the IMP port to be in the same VLAN as the other ports
* on a per-port basis such that we only have Port i and IMP in
* the same VLAN.
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (8 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325 Álvaro Fernández Rojas
@ 2025-05-31 10:13 ` Álvaro Fernández Rojas
2025-06-02 16:00 ` Florian Fainelli
2025-06-02 20:14 ` [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Jonas Gorski
10 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-05-31 10:13 UTC (permalink / raw)
To: jonas.gorski, florian.fainelli, andrew, olteanv, davem, edumazet,
kuba, pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Cc: Álvaro Fernández Rojas
According to the datasheet, BCM5325 uses B53_PD_MODE_CTRL_25 register to
disable clocking to individual PHYs.
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
---
drivers/net/dsa/b53/b53_common.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 802020eaea44..7b786d0d14cd 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -1299,6 +1299,9 @@ static int b53_setup(struct dsa_switch *ds)
b53_reset_mib(dev);
+ if (is5325(dev))
+ b53_write8(dev, B53_CTRL_PAGE, B53_PD_MODE_CTRL_25, 0);
+
ret = b53_apply_config(dev);
if (ret) {
dev_err(ds->dev, "failed to apply configuration\n");
--
2.39.5
^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325
2025-05-31 10:13 ` [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325 Álvaro Fernández Rojas
@ 2025-06-02 9:37 ` Vladimir Oltean
2025-06-02 18:01 ` Florian Fainelli
0 siblings, 1 reply; 33+ messages in thread
From: Vladimir Oltean @ 2025-06-02 9:37 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: jonas.gorski, florian.fainelli, andrew, davem, edumazet, kuba,
pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
Hello,
On Sat, May 31, 2025 at 12:13:00PM +0200, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
> writing them.
>
> Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
How about implementing a "slow age" procedure instead? Walk through the
FDB, and delete the dynamically learned entries for the port?
Address aging is important for STP state transitions.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access on BCM5325
2025-05-31 10:13 ` [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access " Álvaro Fernández Rojas
@ 2025-06-02 9:40 ` Vladimir Oltean
0 siblings, 0 replies; 33+ messages in thread
From: Vladimir Oltean @ 2025-06-02 9:40 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: jonas.gorski, florian.fainelli, andrew, davem, edumazet, kuba,
pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
On Sat, May 31, 2025 at 12:13:03PM +0200, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement DIS_LEARNING register so we should avoid reading
> or writing it.
>
> Fixes: f9b3827ee66c ("net: dsa: b53: Support setting learning on port")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index 6b2ad82aa95f..9667d4107139 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -593,6 +593,9 @@ static void b53_port_set_learning(struct b53_device *dev, int port,
> {
> u16 reg;
>
> + if (is5325(dev))
> + return;
> +
> b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, ®);
> if (learning)
> reg &= ~BIT(port);
> --
> 2.39.5
>
I think if this switch family has that limitation, you should also patch
b53_br_flags_pre() to not permit BR_LEARNING in flags.val, and return
-EINVAL in that case. Otherwise, the "ip link set swp0 type bridge_slave
learning off" command will go through.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-05-31 10:13 ` [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding " Álvaro Fernández Rojas
@ 2025-06-02 9:44 ` Vladimir Oltean
2025-06-02 18:09 ` Florian Fainelli
1 sibling, 0 replies; 33+ messages in thread
From: Vladimir Oltean @ 2025-06-02 9:44 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: jonas.gorski, florian.fainelli, andrew, davem, edumazet, kuba,
pabeni, vivien.didelot, netdev, linux-kernel, dgcbueu
On Sat, May 31, 2025 at 12:13:06PM +0200, Álvaro Fernández Rojas wrote:
> 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.
>
> Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 85 +++++++++++++++++++++++++-------
> drivers/net/dsa/b53/b53_regs.h | 38 ++++++++++++++
> 2 files changed, 105 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index 387e1e7ec749..d5216ea2c984 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -560,12 +560,36 @@ static void b53_port_set_ucast_flood(struct b53_device *dev, int port,
> {
> 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)) {
Maybe instead of a big "if (is5325(dev)) else", you could have this instead?
if (is5325(dev))
return b5325_port_set_ucast_flood();
... // go on with regular procedure
Here and in other places.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled
2025-05-31 10:13 ` [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled Álvaro Fernández Rojas
@ 2025-06-02 16:00 ` Florian Fainelli
2025-06-03 10:13 ` Álvaro Fernández Rojas
0 siblings, 1 reply; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 16:00 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, florian.fainelli,
andrew, olteanv, davem, edumazet, kuba, pabeni, vivien.didelot,
netdev, linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> According to the datasheet, BCM5325 uses B53_PD_MODE_CTRL_25 register to
> disable clocking to individual PHYs.
>
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Would this be more natural and power efficient to move to
b53_port_setup() instead?
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325
2025-06-02 9:37 ` Vladimir Oltean
@ 2025-06-02 18:01 ` Florian Fainelli
2025-06-03 10:19 ` Vladimir Oltean
0 siblings, 1 reply; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:01 UTC (permalink / raw)
To: Vladimir Oltean, Álvaro Fernández Rojas
Cc: jonas.gorski, andrew, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
On 6/2/25 02:37, Vladimir Oltean wrote:
> Hello,
>
> On Sat, May 31, 2025 at 12:13:00PM +0200, Álvaro Fernández Rojas wrote:
>> BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
>> writing them.
>>
>> Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
>> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
>> ---
>
> How about implementing a "slow age" procedure instead? Walk through the
> FDB, and delete the dynamically learned entries for the port?
>
> Address aging is important for STP state transitions.
That's a good suggestion, I suppose for now this can be b53 specific
until we encounter another 20 year old switch and then we move that
logic within the DSA framework?
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL access on BCM5325
2025-05-31 10:13 ` [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL " Álvaro Fernández Rojas
@ 2025-06-02 18:03 ` Florian Fainelli
0 siblings, 0 replies; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:03 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement SWITCH_CTRL register so we should avoid reading
> or writing it.
>
> Fixes: a424f0de6163 ("net: dsa: b53: Include IMP/CPU port in dumb forwarding mode")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
2025-05-31 10:13 ` [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL " Álvaro Fernández Rojas
@ 2025-06-02 18:06 ` Florian Fainelli
2025-06-02 19:59 ` Jonas Gorski
0 siblings, 1 reply; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:06 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement B53_UC_FWD_EN, B53_MC_FWD_EN or B53_IPMC_FWD_EN.
>
> Fixes: 53568438e381 ("net: dsa: b53: Add support for port_egress_floods callback")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 13 +++++++++----
> drivers/net/dsa/b53/b53_regs.h | 1 +
> 2 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index f314aeb81643..6b2ad82aa95f 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -367,11 +367,16 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
> b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
> }
>
> - /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> - * frames should be flooded or not.
> - */
> b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
> - mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> + if (is5325(dev)) {
> + /* Enable IP multicast address scheme. */
> + mgmt |= B53_IP_MCAST_25;
> + } else {
> + /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> + * frames should be flooded or not.
> + */
> + mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> + }
> b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
I don't think B53_IPM_MULTICAST_CTRL is a valid register offset within
B53_CTRL_PAGE, or elsewhere for that matter, do you have a datasheet
that says this exists?
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR access on BCM5325
2025-05-31 10:13 ` [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR " Álvaro Fernández Rojas
@ 2025-06-02 18:07 ` Florian Fainelli
0 siblings, 0 replies; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:07 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement BRCM_HDR register so we should avoid reading or
> writing it.
>
> Fixes: b409a9efa183 ("net: dsa: b53: Move Broadcom header setup to b53")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
2025-05-31 10:13 ` [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL " Álvaro Fernández Rojas
@ 2025-06-02 18:08 ` Florian Fainelli
0 siblings, 0 replies; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:08 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> BCM5325 doesn't implement GMII_PORT_OVERRIDE_CTRL register so we should
> avoid reading or writing it.
> PORT_OVERRIDE_RX_FLOW and PORT_OVERRIDE_TX_FLOW aren't defined on BCM5325
> and we should use PORT_OVERRIDE_LP_FLOW_25 instead.
>
> Fixes: 5e004460f874 ("net: dsa: b53: Add helper to set link parameters")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-05-31 10:13 ` [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding " Álvaro Fernández Rojas
2025-06-02 9:44 ` Vladimir Oltean
@ 2025-06-02 18:09 ` Florian Fainelli
2025-06-02 20:08 ` Jonas Gorski
1 sibling, 1 reply; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:09 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> 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.
>
> Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
[snip]
> +/*************************************************************************
> + * 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)
Are you positive the 5325 implements all of those registers? They are
not documented in my databook.
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
2025-05-31 10:13 ` [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325 Álvaro Fernández Rojas
@ 2025-06-02 18:11 ` Florian Fainelli
2025-06-03 10:12 ` Álvaro Fernández Rojas
0 siblings, 1 reply; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:11 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> CPU port should be B53_CPU_PORT instead of B53_CPU_PORT_25 for
> B53_PVLAN_PORT_MASK register.
>
> Fixes: ff39c2d68679 ("net: dsa: b53: Add bridge support")
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index d5216ea2c984..802020eaea44 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -543,6 +543,10 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
> unsigned int i;
> u16 pvlan;
>
> + /* BCM5325 CPU port is at 8 */
> + if ((is5325(dev) || is5365(dev)) && cpu_port == B53_CPU_PORT_25)
> + cpu_port = B53_CPU_PORT;
Don't we get to that point only if we have invalid Device Tree settings?
In which case wouldn't a WARN_ON() be more adequate?
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
@ 2025-06-02 18:22 ` Florian Fainelli
2025-06-02 20:09 ` Jonas Gorski
1 sibling, 0 replies; 33+ messages in thread
From: Florian Fainelli @ 2025-06-02 18:22 UTC (permalink / raw)
To: Álvaro Fernández Rojas, jonas.gorski, andrew, olteanv,
davem, edumazet, kuba, pabeni, vivien.didelot, netdev,
linux-kernel, dgcbueu
Cc: Florian Fainelli
On 5/31/25 03:12, Álvaro Fernández Rojas wrote:
> From: Florian Fainelli <f.fainelli@gmail.com>
>
> 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 <f.fainelli@gmail.com>
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Regarding your error in the cover letter which are mostly -ENOSPC, I
believe the problem is that b53_arl_read() is still looking for
ARLTBL_VALID rather than ARLTBL_VALID_25.
Given there is no VID returned upon an ARL ready with the 5325, I don't
know how to also reconcile that line:
if (dev->vlan_enabled &&
((mac_vid >> ARLTBL_VID_S) & ARLTBL_VID_MASK) != vid)
continue;
--
Florian
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
2025-06-02 18:06 ` Florian Fainelli
@ 2025-06-02 19:59 ` Jonas Gorski
2025-06-03 10:50 ` Álvaro Fernández Rojas
0 siblings, 1 reply; 33+ messages in thread
From: Jonas Gorski @ 2025-06-02 19:59 UTC (permalink / raw)
To: Florian Fainelli
Cc: Álvaro Fernández Rojas, andrew, olteanv, davem,
edumazet, kuba, pabeni, vivien.didelot, netdev, linux-kernel,
dgcbueu
On Mon, Jun 2, 2025 at 8:06 PM Florian Fainelli
<florian.fainelli@broadcom.com> wrote:
>
> On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > BCM5325 doesn't implement B53_UC_FWD_EN, B53_MC_FWD_EN or B53_IPMC_FWD_EN.
> >
> > Fixes: 53568438e381 ("net: dsa: b53: Add support for port_egress_floods callback")
> > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > ---
> > drivers/net/dsa/b53/b53_common.c | 13 +++++++++----
> > drivers/net/dsa/b53/b53_regs.h | 1 +
> > 2 files changed, 10 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> > index f314aeb81643..6b2ad82aa95f 100644
> > --- a/drivers/net/dsa/b53/b53_common.c
> > +++ b/drivers/net/dsa/b53/b53_common.c
> > @@ -367,11 +367,16 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
> > b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
> > }
> >
> > - /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> > - * frames should be flooded or not.
> > - */
> > b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
> > - mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> > + if (is5325(dev)) {
> > + /* Enable IP multicast address scheme. */
> > + mgmt |= B53_IP_MCAST_25;
> > + } else {
> > + /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> > + * frames should be flooded or not.
> > + */
> > + mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> > + }
> > b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
Since the only common thing is the register name, maybe it would make
more sense to have the flow here
if (is5325) {
enable IP_MULTICAST
} else {
enable DUMB_FWD_EN
enable {UC,MC,IPMC}_FWD_EN
}
>
> I don't think B53_IPM_MULTICAST_CTRL is a valid register offset within
> B53_CTRL_PAGE, or elsewhere for that matter, do you have a datasheet
> that says this exists?
5325E-DS14-R, page 83 (or 105 in pdf paging) on the top.
Regards,
Jonas
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-06-02 18:09 ` Florian Fainelli
@ 2025-06-02 20:08 ` Jonas Gorski
2025-06-03 10:18 ` Álvaro Fernández Rojas
0 siblings, 1 reply; 33+ messages in thread
From: Jonas Gorski @ 2025-06-02 20:08 UTC (permalink / raw)
To: Florian Fainelli
Cc: Álvaro Fernández Rojas, andrew, olteanv, davem,
edumazet, kuba, pabeni, vivien.didelot, netdev, linux-kernel,
dgcbueu
On Mon, Jun 2, 2025 at 8:09 PM Florian Fainelli
<florian.fainelli@broadcom.com> wrote:
>
> On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > 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.
> >
> > Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
> > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > ---
>
> [snip]
>
> > +/*************************************************************************
> > + * 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)
>
> Are you positive the 5325 implements all of those registers? They are
> not documented in my databook.
They are in 5325E-DS14-R pages 112 - 112 (134/135)
That being said, I don't thing we need to touch the MC/BC/DLF rate
control registers when enabling/disabling flooding - these only limit
how much traffic may be UC / MC on a port, but apart from that they
do not limit flooding. We don't limit this on other switch models
either.
Regards,
Jonas
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
2025-06-02 18:22 ` Florian Fainelli
@ 2025-06-02 20:09 ` Jonas Gorski
1 sibling, 0 replies; 33+ messages in thread
From: Jonas Gorski @ 2025-06-02 20:09 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: florian.fainelli, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu, Florian Fainelli
On Sat, May 31, 2025 at 12:13 PM Álvaro Fernández Rojas
<noltari@gmail.com> wrote:
>
> From: Florian Fainelli <f.fainelli@gmail.com>
>
> 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 <f.fainelli@gmail.com>
> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> ---
> drivers/net/dsa/b53/b53_common.c | 60 +++++++++++++++++++++-----------
> drivers/net/dsa/b53/b53_priv.h | 57 +++++++++++++++++++++---------
> drivers/net/dsa/b53/b53_regs.h | 7 ++--
> 3 files changed, 84 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> index 132683ed3abe..03c1e2e75061 100644
> --- a/drivers/net/dsa/b53/b53_common.c
> +++ b/drivers/net/dsa/b53/b53_common.c
> @@ -1760,9 +1760,11 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
>
> b53_read64(dev, B53_ARLIO_PAGE,
> B53_ARLTBL_MAC_VID_ENTRY(i), &mac_vid);
> - b53_read32(dev, B53_ARLIO_PAGE,
> - B53_ARLTBL_DATA_ENTRY(i), &fwd_entry);
> - b53_arl_to_entry(ent, mac_vid, fwd_entry);
> +
> + if (!is5325(dev) && !is5365(dev))
> + b53_read32(dev, B53_ARLIO_PAGE,
> + B53_ARLTBL_DATA_ENTRY(i), &fwd_entry);
> + b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
>
> if (!(fwd_entry & ARLTBL_VALID)) {
> set_bit(i, free_bins);
> @@ -1795,7 +1797,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
>
> /* 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 (!is5325(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);
> @@ -1846,12 +1849,14 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
> ent.is_static = true;
> ent.is_age = false;
> memcpy(ent.mac, addr, ETH_ALEN);
> - b53_arl_from_entry(&mac_vid, &fwd_entry, &ent);
> + b53_arl_from_entry(dev, &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);
> }
> @@ -1863,12 +1868,6 @@ int b53_fdb_add(struct dsa_switch *ds, int port,
> 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);
> @@ -1895,10 +1894,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, ®);
> + b53_read8(dev, B53_ARLIO_PAGE, offset, ®);
> if (!(reg & ARL_SRCH_STDN))
> return 0;
>
> @@ -1917,11 +1921,19 @@ static void b53_arl_search_rd(struct b53_device *dev, u8 idx,
> 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);
> + } else if (is5365(dev)) {
> + b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
> + &mac_vid);
> + } else {
> + 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(dev, ent, mac_vid, fwd_entry);
> }
>
> static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
> @@ -1942,14 +1954,20 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
> 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);
> diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h
> index a5ef7071ba07..05c5b9239bda 100644
> --- a/drivers/net/dsa/b53/b53_priv.h
> +++ b/drivers/net/dsa/b53/b53_priv.h
> @@ -286,30 +286,55 @@ struct b53_arl_entry {
> u8 is_static:1;
> };
>
> -static inline void b53_arl_to_entry(struct b53_arl_entry *ent,
> +static inline void b53_arl_to_entry(struct b53_device *dev,
> + struct b53_arl_entry *ent,
> u64 mac_vid, u32 fwd_entry)
> {
> memset(ent, 0, sizeof(*ent));
> - ent->port = fwd_entry & ARLTBL_DATA_PORT_ID_MASK;
> - ent->is_valid = !!(fwd_entry & ARLTBL_VALID);
> - ent->is_age = !!(fwd_entry & ARLTBL_AGE);
> - ent->is_static = !!(fwd_entry & ARLTBL_STATIC);
> - u64_to_ether_addr(mac_vid, ent->mac);
> - ent->vid = mac_vid >> ARLTBL_VID_S;
> + if (is5325(dev) || is5365(dev)) {
> + 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;
> + } else {
> + ent->port = fwd_entry & ARLTBL_DATA_PORT_ID_MASK;
> + ent->is_valid = !!(fwd_entry & ARLTBL_VALID);
> + ent->is_age = !!(fwd_entry & ARLTBL_AGE);
> + ent->is_static = !!(fwd_entry & ARLTBL_STATIC);
> + u64_to_ether_addr(mac_vid, ent->mac);
> + ent->vid = mac_vid >> ARLTBL_VID_S;
> + }
> }
>
> -static inline void b53_arl_from_entry(u64 *mac_vid, u32 *fwd_entry,
> +static inline void b53_arl_from_entry(struct b53_device *dev,
> + u64 *mac_vid, u32 *fwd_entry,
> const struct b53_arl_entry *ent)
> {
> *mac_vid = ether_addr_to_u64(ent->mac);
> - *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK) << ARLTBL_VID_S;
> - *fwd_entry = ent->port & ARLTBL_DATA_PORT_ID_MASK;
> - if (ent->is_valid)
> - *fwd_entry |= ARLTBL_VALID;
> - if (ent->is_static)
> - *fwd_entry |= ARLTBL_STATIC;
> - if (ent->is_age)
> - *fwd_entry |= ARLTBL_AGE;
> + if (is5325(dev) || is5365(dev)) {
> + *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;
> + } else {
> + *mac_vid |= (u64)(ent->vid & ARLTBL_VID_MASK) << ARLTBL_VID_S;
> + *fwd_entry = ent->port & ARLTBL_DATA_PORT_ID_MASK;
> + if (ent->is_valid)
> + *fwd_entry |= ARLTBL_VALID;
> + if (ent->is_static)
> + *fwd_entry |= ARLTBL_STATIC;
> + if (ent->is_age)
> + *fwd_entry |= ARLTBL_AGE;
> + }
> }
Looking at the low amount of shared code in all of these changes,
maybe it would make more sense to have separate functions for 5325
instead, e.g. have a b53_arl_from_entry_25() that doesn't take a
fwd_entry etc.
Regards,
Jonas
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
` (9 preceding siblings ...)
2025-05-31 10:13 ` [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled Álvaro Fernández Rojas
@ 2025-06-02 20:14 ` Jonas Gorski
10 siblings, 0 replies; 33+ messages in thread
From: Jonas Gorski @ 2025-06-02 20:14 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: florian.fainelli, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
On Sat, May 31, 2025 at 12:13 PM Álvaro Fernández Rojas
<noltari@gmail.com> wrote:
>
> These patches get the BCM5325 switch working with b53.
>
> There are still some sporadic errors related to FDB, but at least the
> switch is working now:
> bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add d6:67:0c:XX:XX:XX vid 1 to fdb: -28
> bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add 5c:4c:a9:XX:XX:XX vid 0 to fdb: -28
> bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to add 5c:4c:a9:XX:XX:XX vid 1 to fdb: -28
> bcm53xx fffe4800.ethernet-mii:1e: port 0 failed to delete d6:67:0c:XX:XX:XX vid 1 from fdb: -2
>
> I'm not really sure that everything here is correct since I don't work for
> Broadcom and all this is based on the public datasheet available for the
> BCM5325 and my own experiments with a Huawei HG556a (BCM6358).
The number of buckets is wrong for 5325, and it actually has only half
of that: "The address table is organized into 512 buckets with two
entries in each bucket."
Might be related, might be not.
Regards,
Jonas
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
2025-06-02 18:11 ` Florian Fainelli
@ 2025-06-03 10:12 ` Álvaro Fernández Rojas
0 siblings, 0 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-06-03 10:12 UTC (permalink / raw)
To: Florian Fainelli
Cc: jonas.gorski, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
Hi Florian,
El lun, 2 jun 2025 a las 20:11, Florian Fainelli
(<florian.fainelli@broadcom.com>) escribió:
>
> On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > CPU port should be B53_CPU_PORT instead of B53_CPU_PORT_25 for
> > B53_PVLAN_PORT_MASK register.
> >
> > Fixes: ff39c2d68679 ("net: dsa: b53: Add bridge support")
> > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > ---
> > drivers/net/dsa/b53/b53_common.c | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> > index d5216ea2c984..802020eaea44 100644
> > --- a/drivers/net/dsa/b53/b53_common.c
> > +++ b/drivers/net/dsa/b53/b53_common.c
> > @@ -543,6 +543,10 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
> > unsigned int i;
> > u16 pvlan;
> >
> > + /* BCM5325 CPU port is at 8 */
> > + if ((is5325(dev) || is5365(dev)) && cpu_port == B53_CPU_PORT_25)
> > + cpu_port = B53_CPU_PORT;
>
> Don't we get to that point only if we have invalid Device Tree settings?
> In which case wouldn't a WARN_ON() be more adequate?
I just copied the same code that's already present on b53_enable_cpu_port:
https://github.com/torvalds/linux/blob/master/drivers/net/dsa/b53/b53_common.c#L753-L755
I believe that the correct configuration should have the CPU port at
#5, but certain registers expect it at #8:
https://github.com/openwrt/openwrt/blob/cc5421128e44effd5df05227cec4d4c5d05be8dc/target/linux/bmips/dts/bcm6358-huawei-hg556a-b.dts#L155-L204
> --
> Florian
Best regards,
Álvaro.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled
2025-06-02 16:00 ` Florian Fainelli
@ 2025-06-03 10:13 ` Álvaro Fernández Rojas
0 siblings, 0 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-06-03 10:13 UTC (permalink / raw)
To: Florian Fainelli
Cc: jonas.gorski, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
Hi Florian,
El lun, 2 jun 2025 a las 18:00, Florian Fainelli
(<florian.fainelli@broadcom.com>) escribió:
>
> On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > According to the datasheet, BCM5325 uses B53_PD_MODE_CTRL_25 register to
> > disable clocking to individual PHYs.
> >
> > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
>
> Would this be more natural and power efficient to move to
> b53_port_setup() instead?
OK, I will move this to b53_setup_port on v2.
> --
> Florian
>
Best regards,
Álvaro.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-06-02 20:08 ` Jonas Gorski
@ 2025-06-03 10:18 ` Álvaro Fernández Rojas
2025-06-03 10:31 ` Jonas Gorski
0 siblings, 1 reply; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-06-03 10:18 UTC (permalink / raw)
To: Jonas Gorski
Cc: Florian Fainelli, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
Hi Jonas,
El lun, 2 jun 2025 a las 22:08, Jonas Gorski
(<jonas.gorski@gmail.com>) escribió:
>
> On Mon, Jun 2, 2025 at 8:09 PM Florian Fainelli
> <florian.fainelli@broadcom.com> wrote:
> >
> > On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > > 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.
> > >
> > > Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
> > > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > > ---
> >
> > [snip]
> >
> > > +/*************************************************************************
> > > + * 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)
> >
> > Are you positive the 5325 implements all of those registers? They are
> > not documented in my databook.
>
> They are in 5325E-DS14-R pages 112 - 112 (134/135)
>
> That being said, I don't thing we need to touch the MC/BC/DLF rate
> control registers when enabling/disabling flooding - these only limit
> how much traffic may be UC / MC on a port, but apart from that they
> do not limit flooding. We don't limit this on other switch models
> either.
In that case there's nothing to enable/disable on the BCM5325 and we
should do an early return on b53_port_set_ucast_flood and
b53_port_set_mcast_flood since UC_FLOOD_MASK, MC_FLOOD_MASK and
IPMC_FLOOD_MASK don't exist.
>
> Regards,
> Jonas
Best regards,
Álvaro.
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325
2025-06-02 18:01 ` Florian Fainelli
@ 2025-06-03 10:19 ` Vladimir Oltean
0 siblings, 0 replies; 33+ messages in thread
From: Vladimir Oltean @ 2025-06-03 10:19 UTC (permalink / raw)
To: Florian Fainelli
Cc: Álvaro Fernández Rojas, jonas.gorski, andrew, davem,
edumazet, kuba, pabeni, vivien.didelot, netdev, linux-kernel,
dgcbueu
[-- Attachment #1: Type: text/plain, Size: 1616 bytes --]
On Mon, Jun 02, 2025 at 11:01:40AM -0700, Florian Fainelli wrote:
> On 6/2/25 02:37, Vladimir Oltean wrote:
> > Hello,
> >
> > On Sat, May 31, 2025 at 12:13:00PM +0200, Álvaro Fernández Rojas wrote:
> > > BCM5325 doesn't implement FAST_AGE registers so we should avoid reading or
> > > writing them.
> > >
> > > Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
> > > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > > ---
> >
> > How about implementing a "slow age" procedure instead? Walk through the
> > FDB, and delete the dynamically learned entries for the port?
> >
> > Address aging is important for STP state transitions.
>
> That's a good suggestion, I suppose for now this can be b53 specific until
> we encounter another 20 year old switch and then we move that logic within
> the DSA framework?
> --
> Florian
Hmm, thank you for saying that, I didn't even consider consolidating the
logic in the DSA framework, but it sure makes sense and we already have
almost all API required to do that.
So I now have a WIP patch attached, but the consolidation into the
framework is definitely a net-next activity, since it will also affect
mt7530, hellcreek and vsc73xx, and those need testing. Also, for b53 it
further requires changing the port_fast_age() prototype.
The question further becomes whether for stable kernels we should
implement a local slow age procedure in b53 like the one from sja1105,
only to delete it in net-next, or to skip it altogether, go with
Álvaro's patch as is and concentrate on the net-next implementation
directly. I'm ok both ways.
[-- Attachment #2: 0001-net-dsa-centralize-the-slow-aging-procedure-from-sja.patch --]
[-- Type: text/x-diff, Size: 7257 bytes --]
From ceb0f0b25ecd3bae6629bbb74fe30f030ddd3a0a Mon Sep 17 00:00:00 2001
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: Tue, 3 Jun 2025 12:40:30 +0300
Subject: [PATCH] net: dsa: centralize the slow aging procedure from sja1105
(WIP)
With more hardware drivers which are unable to perform a dynamic FDB
flush on a port (see
https://lore.kernel.org/netdev/20250531101308.155757-3-noltari@gmail.com/),
it makes sense to move the sja1105 logic to the framework level, so that
more drivers can flush out dynamically learned entries (relevant when
transitioning to a bridge port STP state incompatible with learning).
The drivers which have .port_fdb_dump() and .port_fdb_del() but not
.port_fast_age() are mt7530, hellcreek, vsc73xx. These will go through
dsa_port_slow_age() now.
TODO: multi-generational drivers like b53 cannot signal that old
hardware cannot do fast ageing and should fall back to
dsa_port_slow_age(), because they offer a single ds->ops->port_fast_age()
to the framework (which returns void), and the framework relies purely
on the presence of the function pointer to determine that the function
is implemented. We should change ds->ops->port_fast_age() to return int,
and treat -EOPNOTSUPP, so as to fall back to slow aging even in that
case.
Also, this change also has squashed the conversion of some function
prototypes from "struct dsa_port *" to "const struct dsa_port *", to be
compatible with the dsa_port_fast_age() caller where dp is a const
pointer. Eventualy, these changes should be split out into a preparatory
change.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/net/dsa/sja1105/sja1105_main.c | 53 --------------------------
net/dsa/port.c | 50 +++++++++++++++++++++---
net/dsa/port.h | 5 ++-
3 files changed, 48 insertions(+), 60 deletions(-)
diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c
index f8454f3b6f9c..77faa43880ed 100644
--- a/drivers/net/dsa/sja1105/sja1105_main.c
+++ b/drivers/net/dsa/sja1105/sja1105_main.c
@@ -1910,58 +1910,6 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
return 0;
}
-static void sja1105_fast_age(struct dsa_switch *ds, int port)
-{
- struct dsa_port *dp = dsa_to_port(ds, port);
- struct sja1105_private *priv = ds->priv;
- struct dsa_db db = {
- .type = DSA_DB_BRIDGE,
- .bridge = {
- .dev = dsa_port_bridge_dev_get(dp),
- .num = dsa_port_bridge_num_get(dp),
- },
- };
- int i;
-
- mutex_lock(&priv->fdb_lock);
-
- for (i = 0; i < SJA1105_MAX_L2_LOOKUP_COUNT; i++) {
- struct sja1105_l2_lookup_entry l2_lookup = {0};
- u8 macaddr[ETH_ALEN];
- int rc;
-
- rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
- i, &l2_lookup);
- /* No fdb entry at i, not an issue */
- if (rc == -ENOENT)
- continue;
- if (rc) {
- dev_err(ds->dev, "Failed to read FDB: %pe\n",
- ERR_PTR(rc));
- break;
- }
-
- if (!(l2_lookup.destports & BIT(port)))
- continue;
-
- /* Don't delete static FDB entries */
- if (l2_lookup.lockeds)
- continue;
-
- u64_to_ether_addr(l2_lookup.macaddr, macaddr);
-
- rc = __sja1105_fdb_del(ds, port, macaddr, l2_lookup.vlanid, db);
- if (rc) {
- dev_err(ds->dev,
- "Failed to delete FDB entry %pM vid %lld: %pe\n",
- macaddr, l2_lookup.vlanid, ERR_PTR(rc));
- break;
- }
- }
-
- mutex_unlock(&priv->fdb_lock);
-}
-
static int sja1105_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb,
struct dsa_db db)
@@ -3222,7 +3170,6 @@ static const struct dsa_switch_ops sja1105_switch_ops = {
.port_fdb_dump = sja1105_fdb_dump,
.port_fdb_add = sja1105_fdb_add,
.port_fdb_del = sja1105_fdb_del,
- .port_fast_age = sja1105_fast_age,
.port_bridge_join = sja1105_bridge_join,
.port_bridge_leave = sja1105_bridge_leave,
.port_pre_bridge_flags = sja1105_port_pre_bridge_flags,
diff --git a/net/dsa/port.c b/net/dsa/port.c
index 082573ae6864..2875bda2603f 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -52,14 +52,53 @@ static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp, u16 vid)
brport_dev, &info.info, NULL);
}
+struct dsa_port_slow_age_ctx {
+ const struct dsa_port *dp;
+};
+
+static int
+dsa_port_slow_age_entry(const unsigned char *addr, u16 vid,
+ bool is_static, void *data)
+{
+ struct dsa_port_slow_age_ctx *ctx = data;
+ const struct dsa_port *dp = ctx->dp;
+
+ if (is_static)
+ return 0;
+
+ dev_dbg(dp->ds->dev,
+ "Flushing dynamic FDB entry %pM vid %u on port %d\n",
+ addr, vid, dp->index);
+
+ return dsa_port_fdb_del(dp, addr, vid);
+}
+
+static int dsa_port_slow_age(const struct dsa_port *dp)
+{
+ struct dsa_port_slow_age_ctx ctx = {
+ .dp = dp,
+ };
+
+ return dsa_port_fdb_dump(dp, dsa_port_slow_age_entry, &ctx);
+}
+
static void dsa_port_fast_age(const struct dsa_port *dp)
{
struct dsa_switch *ds = dp->ds;
+ int err = 0;
- if (!ds->ops->port_fast_age)
- return;
+ if (ds->ops->port_fast_age)
+ ds->ops->port_fast_age(ds, dp->index);
+ else
+ err = dsa_port_slow_age(dp);
- ds->ops->port_fast_age(ds, dp->index);
+ if (err && err != -EOPNOTSUPP) {
+ dev_err(ds->dev,
+ "Port %d failed to age dynamic FDB entries: %pe\n",
+ dp->index, ERR_PTR(err));
+ }
+ if (err)
+ return;
/* flush all VLANs */
dsa_port_notify_bridge_fdb_flush(dp, 0);
@@ -996,7 +1035,7 @@ int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
return dsa_port_notify(dp, DSA_NOTIFIER_FDB_ADD, &info);
}
-int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr,
+int dsa_port_fdb_del(const struct dsa_port *dp, const unsigned char *addr,
u16 vid)
{
struct dsa_notifier_fdb_info info = {
@@ -1151,7 +1190,8 @@ int dsa_port_lag_fdb_del(struct dsa_port *dp, const unsigned char *addr,
return dsa_port_notify(dp, DSA_NOTIFIER_LAG_FDB_DEL, &info);
}
-int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data)
+int dsa_port_fdb_dump(const struct dsa_port *dp, dsa_fdb_dump_cb_t *cb,
+ void *data)
{
struct dsa_switch *ds = dp->ds;
int port = dp->index;
diff --git a/net/dsa/port.h b/net/dsa/port.h
index 6bc3291573c0..ea20ed6d706e 100644
--- a/net/dsa/port.h
+++ b/net/dsa/port.h
@@ -48,7 +48,7 @@ int dsa_port_vlan_msti(struct dsa_port *dp,
int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu);
int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
u16 vid);
-int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr,
+int dsa_port_fdb_del(const struct dsa_port *dp, const unsigned char *addr,
u16 vid);
int dsa_port_standalone_host_fdb_add(struct dsa_port *dp,
const unsigned char *addr, u16 vid);
@@ -62,7 +62,8 @@ int dsa_port_lag_fdb_add(struct dsa_port *dp, const unsigned char *addr,
u16 vid);
int dsa_port_lag_fdb_del(struct dsa_port *dp, const unsigned char *addr,
u16 vid);
-int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data);
+int dsa_port_fdb_dump(const struct dsa_port *dp, dsa_fdb_dump_cb_t *cb,
+ void *data);
int dsa_port_mdb_add(const struct dsa_port *dp,
const struct switchdev_obj_port_mdb *mdb);
int dsa_port_mdb_del(const struct dsa_port *dp,
--
2.43.0
^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding on BCM5325
2025-06-03 10:18 ` Álvaro Fernández Rojas
@ 2025-06-03 10:31 ` Jonas Gorski
0 siblings, 0 replies; 33+ messages in thread
From: Jonas Gorski @ 2025-06-03 10:31 UTC (permalink / raw)
To: Álvaro Fernández Rojas
Cc: Florian Fainelli, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
On Tue, Jun 3, 2025 at 12:18 PM Álvaro Fernández Rojas
<noltari@gmail.com> wrote:
>
> Hi Jonas,
>
> El lun, 2 jun 2025 a las 22:08, Jonas Gorski
> (<jonas.gorski@gmail.com>) escribió:
> >
> > On Mon, Jun 2, 2025 at 8:09 PM Florian Fainelli
> > <florian.fainelli@broadcom.com> wrote:
> > >
> > > On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > > > 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.
> > > >
> > > > Fixes: a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags")
> > > > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > > > ---
> > >
> > > [snip]
> > >
> > > > +/*************************************************************************
> > > > + * 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)
> > >
> > > Are you positive the 5325 implements all of those registers? They are
> > > not documented in my databook.
> >
> > They are in 5325E-DS14-R pages 112 - 112 (134/135)
> >
> > That being said, I don't thing we need to touch the MC/BC/DLF rate
> > control registers when enabling/disabling flooding - these only limit
> > how much traffic may be UC / MC on a port, but apart from that they
> > do not limit flooding. We don't limit this on other switch models
> > either.
>
> In that case there's nothing to enable/disable on the BCM5325 and we
> should do an early return on b53_port_set_ucast_flood and
> b53_port_set_mcast_flood since UC_FLOOD_MASK, MC_FLOOD_MASK and
> IPMC_FLOOD_MASK don't exist.
You are adding calls to modify the B53_IEEE_UCAST_DLF and
B53_IEEE_MCAST_DLF registers, which are fine and look correct. And
AFAICT these are the equivalent to UC_FLOOD_MASK and MC_FLOOD_MASK,
with no IPMC_FLOOD_MASK equivalent.
It's only the rate control ones I'm not sure are the right thing to
do, at least in the same patch.
Regards,
Jonas
^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
2025-06-02 19:59 ` Jonas Gorski
@ 2025-06-03 10:50 ` Álvaro Fernández Rojas
0 siblings, 0 replies; 33+ messages in thread
From: Álvaro Fernández Rojas @ 2025-06-03 10:50 UTC (permalink / raw)
To: Jonas Gorski
Cc: Florian Fainelli, andrew, olteanv, davem, edumazet, kuba, pabeni,
vivien.didelot, netdev, linux-kernel, dgcbueu
Hi Jonas,
El lun, 2 jun 2025 a las 21:59, Jonas Gorski
(<jonas.gorski@gmail.com>) escribió:
>
> On Mon, Jun 2, 2025 at 8:06 PM Florian Fainelli
> <florian.fainelli@broadcom.com> wrote:
> >
> > On 5/31/25 03:13, Álvaro Fernández Rojas wrote:
> > > BCM5325 doesn't implement B53_UC_FWD_EN, B53_MC_FWD_EN or B53_IPMC_FWD_EN.
> > >
> > > Fixes: 53568438e381 ("net: dsa: b53: Add support for port_egress_floods callback")
> > > Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
> > > ---
> > > drivers/net/dsa/b53/b53_common.c | 13 +++++++++----
> > > drivers/net/dsa/b53/b53_regs.h | 1 +
> > > 2 files changed, 10 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
> > > index f314aeb81643..6b2ad82aa95f 100644
> > > --- a/drivers/net/dsa/b53/b53_common.c
> > > +++ b/drivers/net/dsa/b53/b53_common.c
> > > @@ -367,11 +367,16 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
> > > b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt);
> > > }
> > >
> > > - /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> > > - * frames should be flooded or not.
> > > - */
> > > b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
> > > - mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> > > + if (is5325(dev)) {
> > > + /* Enable IP multicast address scheme. */
> > > + mgmt |= B53_IP_MCAST_25;
> > > + } else {
> > > + /* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether
> > > + * frames should be flooded or not.
> > > + */
> > > + mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
> > > + }
> > > b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
>
> Since the only common thing is the register name, maybe it would make
> more sense to have the flow here
>
> if (is5325) {
> enable IP_MULTICAST
> } else {
> enable DUMB_FWD_EN
> enable {UC,MC,IPMC}_FWD_EN
> }
OK, then I will do that by merging this patch with #3.
>
> >
> > I don't think B53_IPM_MULTICAST_CTRL is a valid register offset within
> > B53_CTRL_PAGE, or elsewhere for that matter, do you have a datasheet
> > that says this exists?
>
> 5325E-DS14-R, page 83 (or 105 in pdf paging) on the top.
>
> Regards,
> Jonas
Best regards,
Álvaro.
^ permalink raw reply [flat|nested] 33+ messages in thread
end of thread, other threads:[~2025-06-03 10:50 UTC | newest]
Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-31 10:12 [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Álvaro Fernández Rojas
2025-05-31 10:12 ` [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365 Álvaro Fernández Rojas
2025-06-02 18:22 ` Florian Fainelli
2025-06-02 20:09 ` Jonas Gorski
2025-05-31 10:13 ` [RFC PATCH 02/10] net: dsa: b53: prevent FAST_AGE access on BCM5325 Álvaro Fernández Rojas
2025-06-02 9:37 ` Vladimir Oltean
2025-06-02 18:01 ` Florian Fainelli
2025-06-03 10:19 ` Vladimir Oltean
2025-05-31 10:13 ` [RFC PATCH 03/10] net: dsa: b53: prevent SWITCH_CTRL " Álvaro Fernández Rojas
2025-06-02 18:03 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 04/10] net: dsa: b53: fix IP_MULTICAST_CTRL " Álvaro Fernández Rojas
2025-06-02 18:06 ` Florian Fainelli
2025-06-02 19:59 ` Jonas Gorski
2025-06-03 10:50 ` Álvaro Fernández Rojas
2025-05-31 10:13 ` [RFC PATCH 05/10] net: dsa: b53: prevent DIS_LEARNING access " Álvaro Fernández Rojas
2025-06-02 9:40 ` Vladimir Oltean
2025-05-31 10:13 ` [RFC PATCH 06/10] net: dsa: b53: prevent BRCM_HDR " Álvaro Fernández Rojas
2025-06-02 18:07 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 07/10] net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL " Álvaro Fernández Rojas
2025-06-02 18:08 ` Florian Fainelli
2025-05-31 10:13 ` [RFC PATCH 08/10] net: dsa: b53: fix unicast/multicast flooding " Álvaro Fernández Rojas
2025-06-02 9:44 ` Vladimir Oltean
2025-06-02 18:09 ` Florian Fainelli
2025-06-02 20:08 ` Jonas Gorski
2025-06-03 10:18 ` Álvaro Fernández Rojas
2025-06-03 10:31 ` Jonas Gorski
2025-05-31 10:13 ` [RFC PATCH 09/10] net: dsa: b53: fix b53_imp_vlan_setup for BCM5325 Álvaro Fernández Rojas
2025-06-02 18:11 ` Florian Fainelli
2025-06-03 10:12 ` Álvaro Fernández Rojas
2025-05-31 10:13 ` [RFC PATCH 10/10] net: dsa: b53: ensure BCM5325 PHYs are enabled Álvaro Fernández Rojas
2025-06-02 16:00 ` Florian Fainelli
2025-06-03 10:13 ` Álvaro Fernández Rojas
2025-06-02 20:14 ` [RFC PATCH 00/10] net: dsa: b53: fix BCM5325 support Jonas Gorski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).