Commit cff05632 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by David S. Miller
Browse files

net: mvpp2: use .mac_select_pcs() interface



Use the mac_select_pcs() method to choose between the GMAC and XLG
PCS implementations.

Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d22d4b6
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;
+40 −35
Original line number Diff line number Diff line
@@ -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,7 +6370,22 @@ 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,
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,11 +6627,14 @@ 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,
	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,
	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);
@@ -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)) {