Commit 46456ccf authored by Claudiu Manoil's avatar Claudiu Manoil Committed by Jakub Kicinski
Browse files

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: default avatarClaudiu Manoil <claudiu.manoil@nxp.com>
Reviewed-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 08f90fc9
Loading
Loading
Loading
Loading
+48 −53
Original line number Diff line number Diff line
@@ -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));
	}

	return 0;
		dev_dbg(&pf->si->pdev->dev, "Unsupported link mode %s\n",
			phy_modes(pf->if_mode));
	}

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