Skip to content

Commit ce3bf94

Browse files
NoltariPaolo Abeni
authored andcommitted
net: dsa: b53: add support for BCM63xx RGMIIs
BCM63xx RGMII ports require additional configuration in order to work. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/20230319220805.124024-1-noltari@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 9ef70d0 commit ce3bf94

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

drivers/net/dsa/b53/b53_common.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,46 @@ static void b53_force_port_config(struct b53_device *dev, int port,
12091209
b53_write8(dev, B53_CTRL_PAGE, off, reg);
12101210
}
12111211

1212+
static void b53_adjust_63xx_rgmii(struct dsa_switch *ds, int port,
1213+
phy_interface_t interface)
1214+
{
1215+
struct b53_device *dev = ds->priv;
1216+
u8 rgmii_ctrl = 0, off;
1217+
1218+
if (port == dev->imp_port)
1219+
off = B53_RGMII_CTRL_IMP;
1220+
else
1221+
off = B53_RGMII_CTRL_P(port);
1222+
1223+
b53_read8(dev, B53_CTRL_PAGE, off, &rgmii_ctrl);
1224+
1225+
switch (interface) {
1226+
case PHY_INTERFACE_MODE_RGMII_ID:
1227+
rgmii_ctrl |= (RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
1228+
break;
1229+
case PHY_INTERFACE_MODE_RGMII_RXID:
1230+
rgmii_ctrl &= ~(RGMII_CTRL_DLL_TXC);
1231+
rgmii_ctrl |= RGMII_CTRL_DLL_RXC;
1232+
break;
1233+
case PHY_INTERFACE_MODE_RGMII_TXID:
1234+
rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC);
1235+
rgmii_ctrl |= RGMII_CTRL_DLL_TXC;
1236+
break;
1237+
case PHY_INTERFACE_MODE_RGMII:
1238+
default:
1239+
rgmii_ctrl &= ~(RGMII_CTRL_DLL_RXC | RGMII_CTRL_DLL_TXC);
1240+
break;
1241+
}
1242+
1243+
if (port != dev->imp_port)
1244+
rgmii_ctrl |= RGMII_CTRL_ENABLE_GMII;
1245+
1246+
b53_write8(dev, B53_CTRL_PAGE, off, rgmii_ctrl);
1247+
1248+
dev_dbg(ds->dev, "Configured port %d for %s\n", port,
1249+
phy_modes(interface));
1250+
}
1251+
12121252
static void b53_adjust_link(struct dsa_switch *ds, int port,
12131253
struct phy_device *phydev)
12141254
{
@@ -1235,6 +1275,9 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
12351275
tx_pause, rx_pause);
12361276
b53_force_link(dev, port, phydev->link);
12371277

1278+
if (is63xx(dev) && port >= B53_63XX_RGMII0)
1279+
b53_adjust_63xx_rgmii(ds, port, phydev->interface);
1280+
12381281
if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {
12391282
if (port == dev->imp_port)
12401283
off = B53_RGMII_CTRL_IMP;
@@ -1402,6 +1445,9 @@ void b53_phylink_mac_link_up(struct dsa_switch *ds, int port,
14021445
{
14031446
struct b53_device *dev = ds->priv;
14041447

1448+
if (is63xx(dev) && port >= B53_63XX_RGMII0)
1449+
b53_adjust_63xx_rgmii(ds, port, interface);
1450+
14051451
if (mode == MLO_AN_PHY)
14061452
return;
14071453

drivers/net/dsa/b53/b53_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ static inline int is58xx(struct b53_device *dev)
211211
dev->chip_id == BCM7278_DEVICE_ID;
212212
}
213213

214+
#define B53_63XX_RGMII0 4
214215
#define B53_CPU_PORT_25 5
215216
#define B53_CPU_PORT 8
216217

0 commit comments

Comments
 (0)