@@ -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+
12121252static 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
0 commit comments