enetc: Clean up serdes configuration

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>
This commit is contained in:
Claudiu Manoil 2020-10-07 12:48:21 +03:00 committed by Jakub Kicinski
parent 08f90fc9d1
commit 46456ccfd9

View 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);