* [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; 34+ 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] 34+ 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-05-31 23:41 ` kernel test robot
` (2 more replies)
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, 3 replies; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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-05-31 23:41 ` kernel test robot
2025-06-02 18:22 ` Florian Fainelli
2025-06-02 20:09 ` Jonas Gorski
2 siblings, 0 replies; 34+ messages in thread
From: kernel test robot @ 2025-05-31 23:41 UTC (permalink / raw)
To: Álvaro Fernández Rojas; +Cc: llvm, oe-kbuild-all
Hi Álvaro,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
[also build test WARNING on net/main linus/master v6.15 next-20250530]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/lvaro-Fern-ndez-Rojas/net-dsa-b53-add-support-for-FDB-operations-on-5325-5365/20250531-181619
base: net-next/main
patch link: https://lore.kernel.org/r/20250531101308.155757-2-noltari%40gmail.com
patch subject: [RFC PATCH 01/10] net: dsa: b53: add support for FDB operations on 5325/5365
config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20250601/202506010756.N5VMksdd-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250601/202506010756.N5VMksdd-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506010756.N5VMksdd-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/net/dsa/b53/b53_common.c:1764:7: warning: variable 'fwd_entry' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
1764 | if (!is5325(dev) && !is5365(dev))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1767:39: note: uninitialized use occurs here
1767 | b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
| ^~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1764:3: note: remove the 'if' if its condition is always true
1764 | if (!is5325(dev) && !is5365(dev))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1765 | b53_read32(dev, B53_ARLIO_PAGE,
>> drivers/net/dsa/b53/b53_common.c:1764:7: warning: variable 'fwd_entry' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized]
1764 | if (!is5325(dev) && !is5365(dev))
| ^~~~~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1767:39: note: uninitialized use occurs here
1767 | b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
| ^~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1764:7: note: remove the '&&' if its condition is always true
1764 | if (!is5325(dev) && !is5365(dev))
| ^~~~~~~~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1759:16: note: initialize the variable 'fwd_entry' to silence this warning
1759 | u32 fwd_entry;
| ^
| = 0
>> drivers/net/dsa/b53/b53_common.c:1927:13: warning: variable 'fwd_entry' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1927 | } else if (is5365(dev)) {
| ^~~~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1936:38: note: uninitialized use occurs here
1936 | b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
| ^~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1927:9: note: remove the 'if' if its condition is always false
1927 | } else if (is5365(dev)) {
| ^~~~~~~~~~~~~~~~~~
1928 | b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1929 | &mac_vid);
| ~~~~~~~~~~
1930 | } else {
| ~~~~~~
drivers/net/dsa/b53/b53_common.c:1924:6: warning: variable 'fwd_entry' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
1924 | if (is5325(dev)) {
| ^~~~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1936:38: note: uninitialized use occurs here
1936 | b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
| ^~~~~~~~~
drivers/net/dsa/b53/b53_common.c:1924:2: note: remove the 'if' if its condition is always false
1924 | if (is5325(dev)) {
| ^~~~~~~~~~~~~~~~~~
1925 | b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_25,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1926 | &mac_vid);
| ~~~~~~~~~~
1927 | } else if (is5365(dev)) {
| ~~~~~~
drivers/net/dsa/b53/b53_common.c:1922:15: note: initialize the variable 'fwd_entry' to silence this warning
1922 | u32 fwd_entry;
| ^
| = 0
4 warnings generated.
vim +1764 drivers/net/dsa/b53/b53_common.c
1742
1743 static int b53_arl_read(struct b53_device *dev, u64 mac,
1744 u16 vid, struct b53_arl_entry *ent, u8 *idx)
1745 {
1746 DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES);
1747 unsigned int i;
1748 int ret;
1749
1750 ret = b53_arl_op_wait(dev);
1751 if (ret)
1752 return ret;
1753
1754 bitmap_zero(free_bins, dev->num_arl_bins);
1755
1756 /* Read the bins */
1757 for (i = 0; i < dev->num_arl_bins; i++) {
1758 u64 mac_vid;
1759 u32 fwd_entry;
1760
1761 b53_read64(dev, B53_ARLIO_PAGE,
1762 B53_ARLTBL_MAC_VID_ENTRY(i), &mac_vid);
1763
> 1764 if (!is5325(dev) && !is5365(dev))
1765 b53_read32(dev, B53_ARLIO_PAGE,
1766 B53_ARLTBL_DATA_ENTRY(i), &fwd_entry);
1767 b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
1768
1769 if (!(fwd_entry & ARLTBL_VALID)) {
1770 set_bit(i, free_bins);
1771 continue;
1772 }
1773 if ((mac_vid & ARLTBL_MAC_MASK) != mac)
1774 continue;
1775 if (dev->vlan_enabled &&
1776 ((mac_vid >> ARLTBL_VID_S) & ARLTBL_VID_MASK) != vid)
1777 continue;
1778 *idx = i;
1779 return 0;
1780 }
1781
1782 *idx = find_first_bit(free_bins, dev->num_arl_bins);
1783 return *idx >= dev->num_arl_bins ? -ENOSPC : -ENOENT;
1784 }
1785
1786 static int b53_arl_op(struct b53_device *dev, int op, int port,
1787 const unsigned char *addr, u16 vid, bool is_valid)
1788 {
1789 struct b53_arl_entry ent;
1790 u32 fwd_entry;
1791 u64 mac, mac_vid = 0;
1792 u8 idx = 0;
1793 int ret;
1794
1795 /* Convert the array into a 64-bit MAC */
1796 mac = ether_addr_to_u64(addr);
1797
1798 /* Perform a read for the given MAC and VID */
1799 b53_write48(dev, B53_ARLIO_PAGE, B53_MAC_ADDR_IDX, mac);
1800 if (!is5325(dev))
1801 b53_write16(dev, B53_ARLIO_PAGE, B53_VLAN_ID_IDX, vid);
1802
1803 /* Issue a read operation for this MAC */
1804 ret = b53_arl_rw_op(dev, 1);
1805 if (ret)
1806 return ret;
1807
1808 ret = b53_arl_read(dev, mac, vid, &ent, &idx);
1809
1810 /* If this is a read, just finish now */
1811 if (op)
1812 return ret;
1813
1814 switch (ret) {
1815 case -ETIMEDOUT:
1816 return ret;
1817 case -ENOSPC:
1818 dev_dbg(dev->dev, "{%pM,%.4d} no space left in ARL\n",
1819 addr, vid);
1820 return is_valid ? ret : 0;
1821 case -ENOENT:
1822 /* We could not find a matching MAC, so reset to a new entry */
1823 dev_dbg(dev->dev, "{%pM,%.4d} not found, using idx: %d\n",
1824 addr, vid, idx);
1825 fwd_entry = 0;
1826 break;
1827 default:
1828 dev_dbg(dev->dev, "{%pM,%.4d} found, using idx: %d\n",
1829 addr, vid, idx);
1830 break;
1831 }
1832
1833 /* For multicast address, the port is a bitmask and the validity
1834 * is determined by having at least one port being still active
1835 */
1836 if (!is_multicast_ether_addr(addr)) {
1837 ent.port = port;
1838 ent.is_valid = is_valid;
1839 } else {
1840 if (is_valid)
1841 ent.port |= BIT(port);
1842 else
1843 ent.port &= ~BIT(port);
1844
1845 ent.is_valid = !!(ent.port);
1846 }
1847
1848 ent.vid = vid;
1849 ent.is_static = true;
1850 ent.is_age = false;
1851 memcpy(ent.mac, addr, ETH_ALEN);
1852 b53_arl_from_entry(dev, &mac_vid, &fwd_entry, &ent);
1853
1854 b53_write64(dev, B53_ARLIO_PAGE,
1855 B53_ARLTBL_MAC_VID_ENTRY(idx), mac_vid);
1856
1857 if (!is5325(dev) && !is5365(dev))
1858 b53_write32(dev, B53_ARLIO_PAGE,
1859 B53_ARLTBL_DATA_ENTRY(idx), fwd_entry);
1860
1861 return b53_arl_rw_op(dev, 0);
1862 }
1863
1864 int b53_fdb_add(struct dsa_switch *ds, int port,
1865 const unsigned char *addr, u16 vid,
1866 struct dsa_db db)
1867 {
1868 struct b53_device *priv = ds->priv;
1869 int ret;
1870
1871 mutex_lock(&priv->arl_mutex);
1872 ret = b53_arl_op(priv, 0, port, addr, vid, true);
1873 mutex_unlock(&priv->arl_mutex);
1874
1875 return ret;
1876 }
1877 EXPORT_SYMBOL(b53_fdb_add);
1878
1879 int b53_fdb_del(struct dsa_switch *ds, int port,
1880 const unsigned char *addr, u16 vid,
1881 struct dsa_db db)
1882 {
1883 struct b53_device *priv = ds->priv;
1884 int ret;
1885
1886 mutex_lock(&priv->arl_mutex);
1887 ret = b53_arl_op(priv, 0, port, addr, vid, false);
1888 mutex_unlock(&priv->arl_mutex);
1889
1890 return ret;
1891 }
1892 EXPORT_SYMBOL(b53_fdb_del);
1893
1894 static int b53_arl_search_wait(struct b53_device *dev)
1895 {
1896 unsigned int timeout = 1000;
1897 u8 reg, offset;
1898
1899 if (is5325(dev) || is5365(dev))
1900 offset = B53_ARL_SRCH_CTL_25;
1901 else
1902 offset = B53_ARL_SRCH_CTL;
1903
1904 do {
1905 b53_read8(dev, B53_ARLIO_PAGE, offset, ®);
1906 if (!(reg & ARL_SRCH_STDN))
1907 return 0;
1908
1909 if (reg & ARL_SRCH_VLID)
1910 return 0;
1911
1912 usleep_range(1000, 2000);
1913 } while (timeout--);
1914
1915 return -ETIMEDOUT;
1916 }
1917
1918 static void b53_arl_search_rd(struct b53_device *dev, u8 idx,
1919 struct b53_arl_entry *ent)
1920 {
1921 u64 mac_vid;
1922 u32 fwd_entry;
1923
1924 if (is5325(dev)) {
1925 b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_25,
1926 &mac_vid);
> 1927 } else if (is5365(dev)) {
1928 b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_0_MACVID_65,
1929 &mac_vid);
1930 } else {
1931 b53_read64(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL_MACVID(idx),
1932 &mac_vid);
1933 b53_read32(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_RSTL(idx),
1934 &fwd_entry);
1935 }
1936 b53_arl_to_entry(dev, ent, mac_vid, fwd_entry);
1937 }
1938
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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-05-31 23:41 ` kernel test robot
@ 2025-06-02 18:22 ` Florian Fainelli
2025-06-02 20:09 ` Jonas Gorski
2 siblings, 0 replies; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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-05-31 23:41 ` kernel test robot
2025-06-02 18:22 ` Florian Fainelli
@ 2025-06-02 20:09 ` Jonas Gorski
2 siblings, 0 replies; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ 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; 34+ 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] 34+ messages in thread
end of thread, other threads:[~2025-06-03 10:50 UTC | newest]
Thread overview: 34+ 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-05-31 23:41 ` kernel test robot
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.