[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250612083747.26531-5-noltari@gmail.com>
Date: Thu, 12 Jun 2025 10:37:37 +0200
From: Álvaro Fernández Rojas <noltari@...il.com>
To: jonas.gorski@...il.com,
florian.fainelli@...adcom.com,
andrew@...n.ch,
olteanv@...il.com,
davem@...emloft.net,
edumazet@...gle.com,
kuba@...nel.org,
pabeni@...hat.com,
horms@...nel.org,
vivien.didelot@...il.com,
netdev@...r.kernel.org,
linux-kernel@...r.kernel.org,
dgcbueu@...il.com
Cc: Álvaro Fernández Rojas <noltari@...il.com>
Subject: [PATCH net-next v3 04/14] net: dsa: b53: detect BCM5325 variants
Older BCM5325M switches lack some registers that newer BCM5325E have, so
we need to be able to differentiate them in order to check whether the
registers are available or not.
Signed-off-by: Álvaro Fernández Rojas <noltari@...il.com>
---
drivers/net/dsa/b53/b53_common.c | 34 ++++++++++++++++++++++++++------
drivers/net/dsa/b53/b53_priv.h | 16 +++++++++++++--
2 files changed, 42 insertions(+), 8 deletions(-)
v3: detect BCM5325 variants as requested by Florian.
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 222107223d109..2975dab6ee0bb 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -2490,8 +2490,18 @@ struct b53_chip_data {
static const struct b53_chip_data b53_switch_chips[] = {
{
- .chip_id = BCM5325_DEVICE_ID,
- .dev_name = "BCM5325",
+ .chip_id = BCM5325M_DEVICE_ID,
+ .dev_name = "BCM5325M",
+ .vlans = 16,
+ .enabled_ports = 0x3f,
+ .arl_bins = 2,
+ .arl_buckets = 1024,
+ .imp_port = 5,
+ .duplex_reg = B53_DUPLEX_STAT_FE,
+ },
+ {
+ .chip_id = BCM5325E_DEVICE_ID,
+ .dev_name = "BCM5325E",
.vlans = 16,
.enabled_ports = 0x3f,
.arl_bins = 2,
@@ -2938,10 +2948,22 @@ int b53_switch_detect(struct b53_device *dev)
b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, 0xf);
b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, &tmp);
- if (tmp == 0xf)
- dev->chip_id = BCM5325_DEVICE_ID;
- else
+ if (tmp == 0xf) {
+ u32 phy_id;
+ int val;
+
+ val = b53_phy_read16(dev->ds, 0, MII_PHYSID1);
+ phy_id = (val & 0xffff) << 16;
+ val = b53_phy_read16(dev->ds, 0, MII_PHYSID2);
+ phy_id |= (val & 0xffff);
+
+ if (phy_id == 0x0143bc30)
+ dev->chip_id = BCM5325E_DEVICE_ID;
+ else
+ dev->chip_id = BCM5325M_DEVICE_ID;
+ } else {
dev->chip_id = BCM5365_DEVICE_ID;
+ }
break;
case BCM5389_DEVICE_ID:
case BCM5395_DEVICE_ID:
@@ -2975,7 +2997,7 @@ int b53_switch_detect(struct b53_device *dev)
}
}
- if (dev->chip_id == BCM5325_DEVICE_ID)
+ if (is5325(dev))
return b53_read8(dev, B53_STAT_PAGE, B53_REV_ID_25,
&dev->core_rev);
else
diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h
index a5ef7071ba07b..deea4d83f0e93 100644
--- a/drivers/net/dsa/b53/b53_priv.h
+++ b/drivers/net/dsa/b53/b53_priv.h
@@ -60,7 +60,8 @@ struct b53_io_ops {
enum {
BCM4908_DEVICE_ID = 0x4908,
- BCM5325_DEVICE_ID = 0x25,
+ BCM5325M_DEVICE_ID = 0x25,
+ BCM5325E_DEVICE_ID = 0x25e,
BCM5365_DEVICE_ID = 0x65,
BCM5389_DEVICE_ID = 0x89,
BCM5395_DEVICE_ID = 0x95,
@@ -162,7 +163,18 @@ struct b53_device {
static inline int is5325(struct b53_device *dev)
{
- return dev->chip_id == BCM5325_DEVICE_ID;
+ return dev->chip_id == BCM5325E_DEVICE_ID ||
+ dev->chip_id == BCM5325M_DEVICE_ID;
+}
+
+static inline int is5325e(struct b53_device *dev)
+{
+ return dev->chip_id == BCM5325E_DEVICE_ID;
+}
+
+static inline int is5325m(struct b53_device *dev)
+{
+ return dev->chip_id == BCM5325M_DEVICE_ID;
}
static inline int is5365(struct b53_device *dev)
--
2.39.5
Powered by blists - more mailing lists