net: phy: mscc: add support for RGMII MAC mode
authorAntoine Tenart <antoine.tenart@bootlin.com>
Thu, 19 Mar 2020 14:19:57 +0000 (15:19 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Mar 2020 04:14:46 +0000 (21:14 -0700)
This patch adds support for connecting VSC8584 PHYs to the MAC using
RGMII.

Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/mscc/mscc.h
drivers/net/phy/mscc/mscc_main.c

index 29ccb2c..d1b8bbe 100644 (file)
@@ -241,6 +241,7 @@ enum rgmii_rx_clock_delay {
 #define MAC_CFG_MASK                     0xc000
 #define MAC_CFG_SGMII                    0x0000
 #define MAC_CFG_QSGMII                   0x4000
+#define MAC_CFG_RGMII                    0x8000
 
 /* Test page Registers */
 #define MSCC_PHY_TEST_PAGE_5             5
index bc6beec..86bb5c3 100644 (file)
@@ -1360,27 +1360,35 @@ static int vsc8584_config_init(struct phy_device *phydev)
 
        val = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK);
        val &= ~MAC_CFG_MASK;
-       if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
+       if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
                val |= MAC_CFG_QSGMII;
-       else
+       } else if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
                val |= MAC_CFG_SGMII;
+       } else if (phy_interface_is_rgmii(phydev)) {
+               val |= MAC_CFG_RGMII;
+       } else {
+               ret = -EINVAL;
+               goto err;
+       }
 
        ret = phy_base_write(phydev, MSCC_PHY_MAC_CFG_FASTLINK, val);
        if (ret)
                goto err;
 
-       val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT |
-               PROC_CMD_READ_MOD_WRITE_PORT;
-       if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
-               val |= PROC_CMD_QSGMII_MAC;
-       else
-               val |= PROC_CMD_SGMII_MAC;
+       if (!phy_interface_is_rgmii(phydev)) {
+               val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT |
+                       PROC_CMD_READ_MOD_WRITE_PORT;
+               if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
+                       val |= PROC_CMD_QSGMII_MAC;
+               else
+                       val |= PROC_CMD_SGMII_MAC;
 
-       ret = vsc8584_cmd(phydev, val);
-       if (ret)
-               goto err;
+               ret = vsc8584_cmd(phydev, val);
+               if (ret)
+                       goto err;
 
-       usleep_range(10000, 20000);
+               usleep_range(10000, 20000);
+       }
 
        /* Disable SerDes for 100Base-FX */
        ret = vsc8584_cmd(phydev, PROC_CMD_FIBER_MEDIA_CONF |