net: dsa: bcm_sf2: convert to phylink_generic_validate()
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Wed, 2 Feb 2022 10:24:13 +0000 (10:24 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Feb 2022 11:47:06 +0000 (11:47 +0000)
Populate the supported interfaces and MAC capabilities for the bcm_sf2
DSA switch and remove the old validate implementation to allow DSA to
use phylink_generic_validate() for this switch driver.

The exclusion of Gigabit linkmodes for MII and Reverse MII links is
handled within phylink_generic_validate() in phylink, so there is no
need to make them conditional on the interface mode in the driver.

Thanks to Florian Fainelli for suggesting how to populate the supported
interfaces.

Link: https://lore.kernel.org/r/3b3fed98-0c82-99e9-dc72-09fe01c2bcf3@gmail.com
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/bcm_sf2.c

index 33499fc..9161ce4 100644 (file)
@@ -709,49 +709,25 @@ static u32 bcm_sf2_sw_get_phy_flags(struct dsa_switch *ds, int port)
                       PHY_BRCM_IDDQ_SUSPEND;
 }
 
-static void bcm_sf2_sw_validate(struct dsa_switch *ds, int port,
-                               unsigned long *supported,
-                               struct phylink_link_state *state)
+static void bcm_sf2_sw_get_caps(struct dsa_switch *ds, int port,
+                               struct phylink_config *config)
 {
+       unsigned long *interfaces = config->supported_interfaces;
        struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
-       __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
-
-       if (!phy_interface_mode_is_rgmii(state->interface) &&
-           state->interface != PHY_INTERFACE_MODE_MII &&
-           state->interface != PHY_INTERFACE_MODE_REVMII &&
-           state->interface != PHY_INTERFACE_MODE_GMII &&
-           state->interface != PHY_INTERFACE_MODE_INTERNAL &&
-           state->interface != PHY_INTERFACE_MODE_MOCA) {
-               linkmode_zero(supported);
-               if (port != core_readl(priv, CORE_IMP0_PRT_ID))
-                       dev_err(ds->dev,
-                               "Unsupported interface: %d for port %d\n",
-                               state->interface, port);
-               return;
-       }
-
-       /* Allow all the expected bits */
-       phylink_set(mask, Autoneg);
-       phylink_set_port_modes(mask);
-       phylink_set(mask, Pause);
-       phylink_set(mask, Asym_Pause);
 
-       /* With the exclusion of MII and Reverse MII, we support Gigabit,
-        * including Half duplex
-        */
-       if (state->interface != PHY_INTERFACE_MODE_MII &&
-           state->interface != PHY_INTERFACE_MODE_REVMII) {
-               phylink_set(mask, 1000baseT_Full);
-               phylink_set(mask, 1000baseT_Half);
+       if (priv->int_phy_mask & BIT(port)) {
+               __set_bit(PHY_INTERFACE_MODE_INTERNAL, interfaces);
+       } else if (priv->moca_port == port) {
+               __set_bit(PHY_INTERFACE_MODE_MOCA, interfaces);
+       } else {
+               __set_bit(PHY_INTERFACE_MODE_MII, interfaces);
+               __set_bit(PHY_INTERFACE_MODE_REVMII, interfaces);
+               __set_bit(PHY_INTERFACE_MODE_GMII, interfaces);
+               phy_interface_set_rgmii(interfaces);
        }
 
-       phylink_set(mask, 10baseT_Half);
-       phylink_set(mask, 10baseT_Full);
-       phylink_set(mask, 100baseT_Half);
-       phylink_set(mask, 100baseT_Full);
-
-       linkmode_and(supported, supported, mask);
-       linkmode_and(state->advertising, state->advertising, mask);
+       config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
+               MAC_10 | MAC_100 | MAC_1000;
 }
 
 static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port,
@@ -1218,7 +1194,7 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
        .get_sset_count         = bcm_sf2_sw_get_sset_count,
        .get_ethtool_phy_stats  = b53_get_ethtool_phy_stats,
        .get_phy_flags          = bcm_sf2_sw_get_phy_flags,
-       .phylink_validate       = bcm_sf2_sw_validate,
+       .phylink_get_caps       = bcm_sf2_sw_get_caps,
        .phylink_mac_config     = bcm_sf2_sw_mac_config,
        .phylink_mac_link_down  = bcm_sf2_sw_mac_link_down,
        .phylink_mac_link_up    = bcm_sf2_sw_mac_link_up,