enetc: Clean up serdes configuration
authorClaudiu Manoil <claudiu.manoil@nxp.com>
Wed, 7 Oct 2020 09:48:21 +0000 (12:48 +0300)
committerJakub Kicinski <kuba@kernel.org>
Sun, 11 Oct 2020 18:04:42 +0000 (11:04 -0700)
Decouple internal mdio bus creation from serdes
configuration, as a prerequisite to offloading
serdes configuration to a different module.
Group together mdio bus creation routines, cleanup.

Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc_pf.c

index 6459673..6c533bf 100644 (file)
@@ -775,25 +775,7 @@ static int enetc_mdio_probe(struct enetc_pf *pf, struct device_node *np)
        return 0;
 }
 
-static int enetc_mdiobus_create(struct enetc_pf *pf)
-{
-       struct device *dev = &pf->si->pdev->dev;
-       struct device_node *mdio_np;
-       int err;
-
-       mdio_np = of_get_child_by_name(dev->of_node, "mdio");
-       if (mdio_np) {
-               err = enetc_mdio_probe(pf, mdio_np);
-
-               of_node_put(mdio_np);
-               if (err)
-                       return err;
-       }
-
-       return 0;
-}
-
-static void enetc_mdiobus_destroy(struct enetc_pf *pf)
+static void enetc_mdio_remove(struct enetc_pf *pf)
 {
        if (pf->mdio)
                mdiobus_unregister(pf->mdio);
@@ -844,7 +826,7 @@ static void enetc_of_put_phy(struct enetc_pf *pf)
                of_node_put(pf->phy_node);
 }
 
-static int enetc_imdio_init(struct enetc_pf *pf, bool is_c45)
+static int enetc_imdio_create(struct enetc_pf *pf)
 {
        struct device *dev = &pf->si->pdev->dev;
        struct enetc_mdio_priv *mdio_priv;
@@ -872,7 +854,7 @@ static int enetc_imdio_init(struct enetc_pf *pf, bool is_c45)
                goto free_mdio_bus;
        }
 
-       pcs = get_phy_device(bus, 0, is_c45);
+       pcs = get_phy_device(bus, 0, pf->if_mode == PHY_INTERFACE_MODE_USXGMII);
        if (IS_ERR(pcs)) {
                err = PTR_ERR(pcs);
                dev_err(dev, "cannot get internal PCS PHY (%d)\n", err);
@@ -901,6 +883,45 @@ static void enetc_imdio_remove(struct enetc_pf *pf)
        }
 }
 
+static bool enetc_port_has_pcs(struct enetc_pf *pf)
+{
+       return (pf->if_mode == PHY_INTERFACE_MODE_SGMII ||
+               pf->if_mode == PHY_INTERFACE_MODE_2500BASEX ||
+               pf->if_mode == PHY_INTERFACE_MODE_USXGMII);
+}
+
+static int enetc_mdiobus_create(struct enetc_pf *pf)
+{
+       struct device *dev = &pf->si->pdev->dev;
+       struct device_node *mdio_np;
+       int err;
+
+       mdio_np = of_get_child_by_name(dev->of_node, "mdio");
+       if (mdio_np) {
+               err = enetc_mdio_probe(pf, mdio_np);
+
+               of_node_put(mdio_np);
+               if (err)
+                       return err;
+       }
+
+       if (enetc_port_has_pcs(pf)) {
+               err = enetc_imdio_create(pf);
+               if (err) {
+                       enetc_mdio_remove(pf);
+                       return err;
+               }
+       }
+
+       return 0;
+}
+
+static void enetc_mdiobus_destroy(struct enetc_pf *pf)
+{
+       enetc_mdio_remove(pf);
+       enetc_imdio_remove(pf);
+}
+
 static void enetc_configure_sgmii(struct phy_device *pcs)
 {
        /* SGMII spec requires tx_config_Reg[15:0] to be exactly 0x4001
@@ -940,22 +961,9 @@ static void enetc_configure_usxgmii(struct phy_device *pcs)
                      BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART);
 }
 
-static int enetc_configure_serdes(struct enetc_ndev_priv *priv)
+static void enetc_configure_serdes(struct enetc_pf *pf)
 {
-       bool is_c45 = priv->if_mode == PHY_INTERFACE_MODE_USXGMII;
-       struct enetc_pf *pf = enetc_si_priv(priv->si);
-       int err;
-
-       if (priv->if_mode != PHY_INTERFACE_MODE_SGMII &&
-           priv->if_mode != PHY_INTERFACE_MODE_2500BASEX &&
-           priv->if_mode != PHY_INTERFACE_MODE_USXGMII)
-               return 0;
-
-       err = enetc_imdio_init(pf, is_c45);
-       if (err)
-               return err;
-
-       switch (priv->if_mode) {
+       switch (pf->if_mode) {
        case PHY_INTERFACE_MODE_SGMII:
                enetc_configure_sgmii(pf->pcs);
                break;
@@ -966,18 +974,9 @@ static int enetc_configure_serdes(struct enetc_ndev_priv *priv)
                enetc_configure_usxgmii(pf->pcs);
                break;
        default:
-               dev_err(&pf->si->pdev->dev, "Unsupported link mode %s\n",
-                       phy_modes(priv->if_mode));
+               dev_dbg(&pf->si->pdev->dev, "Unsupported link mode %s\n",
+                       phy_modes(pf->if_mode));
        }
-
-       return 0;
-}
-
-static void enetc_teardown_serdes(struct enetc_ndev_priv *priv)
-{
-       struct enetc_pf *pf = enetc_si_priv(priv->si);
-
-       enetc_imdio_remove(pf);
 }
 
 static int enetc_pf_probe(struct pci_dev *pdev,
@@ -1052,9 +1051,8 @@ static int enetc_pf_probe(struct pci_dev *pdev,
                if (err)
                        goto err_mdiobus_create;
 
-               err = enetc_configure_serdes(priv);
-               if (err)
-                       goto err_configure_serdes;
+               if (enetc_port_has_pcs(pf))
+                       enetc_configure_serdes(pf);
 
                enetc_mac_config(&pf->si->hw, pf->if_mode);
        }
@@ -1068,8 +1066,6 @@ static int enetc_pf_probe(struct pci_dev *pdev,
        return 0;
 
 err_reg_netdev:
-       enetc_teardown_serdes(priv);
-err_configure_serdes:
        enetc_mdiobus_destroy(pf);
 err_mdiobus_create:
        enetc_of_put_phy(pf);
@@ -1094,7 +1090,6 @@ static void enetc_pf_remove(struct pci_dev *pdev)
        struct enetc_ndev_priv *priv;
 
        priv = netdev_priv(si->ndev);
-       enetc_teardown_serdes(priv);
        enetc_mdiobus_destroy(pf);
        enetc_of_put_phy(pf);