net: mvpp2: use .mac_select_pcs() interface
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Wed, 15 Dec 2021 15:34:25 +0000 (15:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Dec 2021 10:37:13 +0000 (10:37 +0000)
Use the mac_select_pcs() method to choose between the GMAC and XLG
PCS implementations.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvpp2/mvpp2.h
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

index cf8acab..ad73a48 100644 (file)
@@ -1239,7 +1239,8 @@ struct mvpp2_port {
        phy_interface_t phy_interface;
        struct phylink *phylink;
        struct phylink_config phylink_config;
-       struct phylink_pcs phylink_pcs;
+       struct phylink_pcs pcs_gmac;
+       struct phylink_pcs pcs_xlg;
        struct phy *comphy;
 
        struct mvpp2_bm_pool *pool_long;
index b1cce44..4424ac4 100644 (file)
@@ -6115,15 +6115,20 @@ static struct mvpp2_port *mvpp2_phylink_to_port(struct phylink_config *config)
        return container_of(config, struct mvpp2_port, phylink_config);
 }
 
-static struct mvpp2_port *mvpp2_pcs_to_port(struct phylink_pcs *pcs)
+static struct mvpp2_port *mvpp2_pcs_xlg_to_port(struct phylink_pcs *pcs)
 {
-       return container_of(pcs, struct mvpp2_port, phylink_pcs);
+       return container_of(pcs, struct mvpp2_port, pcs_xlg);
+}
+
+static struct mvpp2_port *mvpp2_pcs_gmac_to_port(struct phylink_pcs *pcs)
+{
+       return container_of(pcs, struct mvpp2_port, pcs_gmac);
 }
 
 static void mvpp2_xlg_pcs_get_state(struct phylink_pcs *pcs,
                                    struct phylink_link_state *state)
 {
-       struct mvpp2_port *port = mvpp2_pcs_to_port(pcs);
+       struct mvpp2_port *port = mvpp2_pcs_xlg_to_port(pcs);
        u32 val;
 
        if (port->phy_interface == PHY_INTERFACE_MODE_5GBASER)
@@ -6161,7 +6166,7 @@ static const struct phylink_pcs_ops mvpp2_phylink_xlg_pcs_ops = {
 static void mvpp2_gmac_pcs_get_state(struct phylink_pcs *pcs,
                                     struct phylink_link_state *state)
 {
-       struct mvpp2_port *port = mvpp2_pcs_to_port(pcs);
+       struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
        u32 val;
 
        val = readl(port->base + MVPP2_GMAC_STATUS0);
@@ -6198,7 +6203,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
                                 const unsigned long *advertising,
                                 bool permit_pause_to_mac)
 {
-       struct mvpp2_port *port = mvpp2_pcs_to_port(pcs);
+       struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
        u32 mask, val, an, old_an, changed;
 
        mask = MVPP2_GMAC_IN_BAND_AUTONEG_BYPASS |
@@ -6252,7 +6257,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
 
 static void mvpp2_gmac_pcs_an_restart(struct phylink_pcs *pcs)
 {
-       struct mvpp2_port *port = mvpp2_pcs_to_port(pcs);
+       struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
        u32 val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
 
        writel(val | MVPP2_GMAC_IN_BAND_RESTART_AN,
@@ -6365,8 +6370,23 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
                writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG);
 }
 
-static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode,
-                             phy_interface_t interface)
+static struct phylink_pcs *mvpp2_select_pcs(struct phylink_config *config,
+                                           phy_interface_t interface)
+{
+       struct mvpp2_port *port = mvpp2_phylink_to_port(config);
+
+       /* Select the appropriate PCS operations depending on the
+        * configured interface mode. We will only switch to a mode
+        * that the validate() checks have already passed.
+        */
+       if (mvpp2_is_xlg(interface))
+               return &port->pcs_xlg;
+       else
+               return &port->pcs_gmac;
+}
+
+static int mvpp2_mac_prepare(struct phylink_config *config, unsigned int mode,
+                            phy_interface_t interface)
 {
        struct mvpp2_port *port = mvpp2_phylink_to_port(config);
 
@@ -6415,31 +6435,9 @@ static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode,
                }
        }
 
-       /* Select the appropriate PCS operations depending on the
-        * configured interface mode. We will only switch to a mode
-        * that the validate() checks have already passed.
-        */
-       if (mvpp2_is_xlg(interface))
-               port->phylink_pcs.ops = &mvpp2_phylink_xlg_pcs_ops;
-       else
-               port->phylink_pcs.ops = &mvpp2_phylink_gmac_pcs_ops;
-
        return 0;
 }
 
-static int mvpp2_mac_prepare(struct phylink_config *config, unsigned int mode,
-                            phy_interface_t interface)
-{
-       struct mvpp2_port *port = mvpp2_phylink_to_port(config);
-       int ret;
-
-       ret = mvpp2__mac_prepare(config, mode, interface);
-       if (ret == 0)
-               phylink_set_pcs(port->phylink, &port->phylink_pcs);
-
-       return ret;
-}
-
 static void mvpp2_mac_config(struct phylink_config *config, unsigned int mode,
                             const struct phylink_link_state *state)
 {
@@ -6611,6 +6609,7 @@ static void mvpp2_mac_link_down(struct phylink_config *config,
 
 static const struct phylink_mac_ops mvpp2_phylink_ops = {
        .validate = mvpp2_phylink_validate,
+       .mac_select_pcs = mvpp2_select_pcs,
        .mac_prepare = mvpp2_mac_prepare,
        .mac_config = mvpp2_mac_config,
        .mac_finish = mvpp2_mac_finish,
@@ -6628,12 +6627,15 @@ static void mvpp2_acpi_start(struct mvpp2_port *port)
        struct phylink_link_state state = {
                .interface = port->phy_interface,
        };
-       mvpp2__mac_prepare(&port->phylink_config, MLO_AN_INBAND,
-                          port->phy_interface);
+       struct phylink_pcs *pcs;
+
+       pcs = mvpp2_select_pcs(&port->phylink_config, port->phy_interface);
+
+       mvpp2_mac_prepare(&port->phylink_config, MLO_AN_INBAND,
+                         port->phy_interface);
        mvpp2_mac_config(&port->phylink_config, MLO_AN_INBAND, &state);
-       port->phylink_pcs.ops->pcs_config(&port->phylink_pcs, MLO_AN_INBAND,
-                                         port->phy_interface,
-                                         state.advertising, false);
+       pcs->ops->pcs_config(pcs, MLO_AN_INBAND, port->phy_interface,
+                            state.advertising, false);
        mvpp2_mac_finish(&port->phylink_config, MLO_AN_INBAND,
                         port->phy_interface);
        mvpp2_mac_link_up(&port->phylink_config, NULL,
@@ -6941,6 +6943,9 @@ static int mvpp2_port_probe(struct platform_device *pdev,
                                  port->phylink_config.supported_interfaces);
                }
 
+               port->pcs_gmac.ops = &mvpp2_phylink_gmac_pcs_ops;
+               port->pcs_xlg.ops = &mvpp2_phylink_xlg_pcs_ops;
+
                phylink = phylink_create(&port->phylink_config, port_fwnode,
                                         phy_mode, &mvpp2_phylink_ops);
                if (IS_ERR(phylink)) {