Commit 11059740 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller
Browse files

net: pcs: xpcs: convert to phylink_pcs_ops



Since all the remaining members of struct mdio_xpcs_ops have direct
equivalents in struct phylink_pcs_ops, it is about time we remove it
altogether.

Since the phylink ops return void, we need to remove the error
propagation from the various xpcs methods and simply print an error
message where appropriate.

Since xpcs_get_state_c73() detects link faults and attempts to reset the
link on its own by calling xpcs_config(), but xpcs_config() now has a
lot of phylink arguments which are not needed and cannot be simply
fabricated by anybody else except phylink, the actual implementation has
been moved into a smaller xpcs_do_config().

The const struct mdio_xpcs_ops *priv->hw->xpcs has been removed, so we
need to look at the struct mdio_xpcs_args pointer now as an indication
whether the port has an XPCS or not.

Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2cac15da
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -503,8 +503,7 @@ struct mac_device_info {
	const struct stmmac_hwtimestamp *ptp;
	const struct stmmac_tc_ops *tc;
	const struct stmmac_mmc_ops *mmc;
	const struct mdio_xpcs_ops *xpcs;
	struct mdio_xpcs_args *xpcs_args;
	struct mdio_xpcs_args *xpcs;
	struct mii_regs mii;	/* MII register Addresses */
	struct mac_link link;
	void __iomem *pcsr;     /* vpointer to device CSRs */
+0 −8
Original line number Diff line number Diff line
@@ -613,14 +613,6 @@ struct stmmac_mmc_ops {
#define stmmac_mmc_read(__priv, __args...) \
	stmmac_do_void_callback(__priv, mmc, read, __args)

/* XPCS callbacks */
#define stmmac_xpcs_config(__priv, __args...) \
	stmmac_do_callback(__priv, xpcs, config, __args)
#define stmmac_xpcs_get_state(__priv, __args...) \
	stmmac_do_callback(__priv, xpcs, get_state, __args)
#define stmmac_xpcs_link_up(__priv, __args...) \
	stmmac_do_callback(__priv, xpcs, link_up, __args)

struct stmmac_regs_off {
	u32 ptp_off;
	u32 mmc_off;
+1 −1
Original line number Diff line number Diff line
@@ -721,7 +721,7 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
			    "Setting EEE tx-lpi is not supported\n");

	if (priv->hw->xpcs) {
		ret = xpcs_config_eee(priv->hw->xpcs_args,
		ret = xpcs_config_eee(priv->hw->xpcs,
				      priv->plat->mult_fact_100ns,
				      edata->eee_enabled);
		if (ret)
+11 −25
Original line number Diff line number Diff line
@@ -997,29 +997,13 @@ static void stmmac_validate(struct phylink_config *config,

	/* If PCS is supported, check which modes it supports. */
	if (priv->hw->xpcs)
		xpcs_validate(priv->hw->xpcs_args, supported, state);
}

static void stmmac_mac_pcs_get_state(struct phylink_config *config,
				     struct phylink_link_state *state)
{
	struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));

	state->link = 0;
	stmmac_xpcs_get_state(priv, priv->hw->xpcs_args, state);
		xpcs_validate(priv->hw->xpcs, supported, state);
}

static void stmmac_mac_config(struct phylink_config *config, unsigned int mode,
			      const struct phylink_link_state *state)
{
	struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));

	stmmac_xpcs_config(priv, priv->hw->xpcs_args, state);
}

static void stmmac_mac_an_restart(struct phylink_config *config)
{
	/* Not Supported */
	/* Nothing to do, xpcs_config() handles everything */
}

static void stmmac_fpe_link_state_handle(struct stmmac_priv *priv, bool is_up)
@@ -1061,8 +1045,6 @@ static void stmmac_mac_link_up(struct phylink_config *config,
	struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));
	u32 ctrl;

	stmmac_xpcs_link_up(priv, priv->hw->xpcs_args, speed, interface);

	ctrl = readl(priv->ioaddr + MAC_CTRL_REG);
	ctrl &= ~priv->hw->link.speed_mask;

@@ -1155,9 +1137,7 @@ static void stmmac_mac_link_up(struct phylink_config *config,

static const struct phylink_mac_ops stmmac_phylink_mac_ops = {
	.validate = stmmac_validate,
	.mac_pcs_get_state = stmmac_mac_pcs_get_state,
	.mac_config = stmmac_mac_config,
	.mac_an_restart = stmmac_mac_an_restart,
	.mac_link_down = stmmac_mac_link_down,
	.mac_link_up = stmmac_mac_link_up,
};
@@ -1234,6 +1214,7 @@ static int stmmac_init_phy(struct net_device *dev)

static int stmmac_phy_setup(struct stmmac_priv *priv)
{
	struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
	struct fwnode_handle *fwnode = of_fwnode_handle(priv->plat->phylink_node);
	int mode = priv->plat->phy_interface;
	struct phylink *phylink;
@@ -1241,8 +1222,7 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)
	priv->phylink_config.dev = &priv->dev->dev;
	priv->phylink_config.type = PHYLINK_NETDEV;
	priv->phylink_config.pcs_poll = true;
	priv->phylink_config.ovr_an_inband =
		priv->plat->mdio_bus_data->xpcs_an_inband;
	priv->phylink_config.ovr_an_inband = mdio_bus_data->xpcs_an_inband;

	if (!fwnode)
		fwnode = dev_fwnode(priv->device);
@@ -1252,6 +1232,12 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)
	if (IS_ERR(phylink))
		return PTR_ERR(phylink);

	if (mdio_bus_data->has_xpcs) {
		struct mdio_xpcs_args *xpcs = priv->hw->xpcs;

		phylink_set_pcs(phylink, &xpcs->pcs);
	}

	priv->phylink = phylink;
	return 0;
}
@@ -3653,7 +3639,7 @@ int stmmac_open(struct net_device *dev)
	if (priv->hw->pcs != STMMAC_PCS_TBI &&
	    priv->hw->pcs != STMMAC_PCS_RTBI &&
	    (!priv->hw->xpcs ||
	     xpcs_get_an_mode(priv->hw->xpcs_args, mode) != DW_AN_C73)) {
	     xpcs_get_an_mode(priv->hw->xpcs, mode) != DW_AN_C73)) {
		ret = stmmac_init_phy(dev);
		if (ret) {
			netdev_err(priv->dev,
+4 −12
Original line number Diff line number Diff line
@@ -444,14 +444,6 @@ int stmmac_mdio_register(struct net_device *ndev)
		max_addr = PHY_MAX_ADDR;
	}

	if (mdio_bus_data->has_xpcs) {
		priv->hw->xpcs = mdio_xpcs_get_ops();
		if (!priv->hw->xpcs) {
			err = -ENODEV;
			goto bus_register_fail;
		}
	}

	if (mdio_bus_data->needs_reset)
		new_bus->reset = &stmmac_mdio_reset;

@@ -526,11 +518,11 @@ int stmmac_mdio_register(struct net_device *ndev)
				continue;
			}

			priv->hw->xpcs_args = xpcs;
			priv->hw->xpcs = xpcs;
			break;
		}

		if (!priv->hw->xpcs_args) {
		if (!priv->hw->xpcs) {
			dev_warn(dev, "No XPCS found\n");
			err = -ENODEV;
			goto no_xpcs_found;
@@ -563,8 +555,8 @@ int stmmac_mdio_unregister(struct net_device *ndev)
		return 0;

	if (priv->hw->xpcs) {
		mdio_device_free(priv->hw->xpcs_args->mdiodev);
		xpcs_destroy(priv->hw->xpcs_args);
		mdio_device_free(priv->hw->xpcs->mdiodev);
		xpcs_destroy(priv->hw->xpcs);
	}

	mdiobus_unregister(priv->mii);
Loading