Commit 636d022c authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Paolo Abeni
Browse files

net: dsa: qca8k: provide own phylink MAC operations



Convert qca8k to provide its own phylink MAC operations, thus
avoiding the shim layer in DSA's port.c.

Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/E1rvIce-006bQi-58@rmk-PC.armlinux.org.uk


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent e3ef87ef
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -1283,11 +1283,13 @@ qca8k_mac_config_setup_internal_delay(struct qca8k_priv *priv, int cpu_port_inde
}

static struct phylink_pcs *
qca8k_phylink_mac_select_pcs(struct dsa_switch *ds, int port,
qca8k_phylink_mac_select_pcs(struct phylink_config *config,
			     phy_interface_t interface)
{
	struct qca8k_priv *priv = ds->priv;
	struct dsa_port *dp = dsa_phylink_to_port(config);
	struct qca8k_priv *priv = dp->ds->priv;
	struct phylink_pcs *pcs = NULL;
	int port = dp->index;

	switch (interface) {
	case PHY_INTERFACE_MODE_SGMII:
@@ -1311,13 +1313,18 @@ qca8k_phylink_mac_select_pcs(struct dsa_switch *ds, int port,
}

static void
qca8k_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
qca8k_phylink_mac_config(struct phylink_config *config, unsigned int mode,
			 const struct phylink_link_state *state)
{
	struct qca8k_priv *priv = ds->priv;
	struct dsa_port *dp = dsa_phylink_to_port(config);
	struct dsa_switch *ds = dp->ds;
	struct qca8k_priv *priv;
	int port = dp->index;
	int cpu_port_index;
	u32 reg;

	priv = ds->priv;

	switch (port) {
	case 0: /* 1st CPU port */
		if (state->interface != PHY_INTERFACE_MODE_RGMII &&
@@ -1426,20 +1433,24 @@ static void qca8k_phylink_get_caps(struct dsa_switch *ds, int port,
}

static void
qca8k_phylink_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode,
qca8k_phylink_mac_link_down(struct phylink_config *config, unsigned int mode,
			    phy_interface_t interface)
{
	struct qca8k_priv *priv = ds->priv;
	struct dsa_port *dp = dsa_phylink_to_port(config);
	struct qca8k_priv *priv = dp->ds->priv;

	qca8k_port_set_status(priv, port, 0);
	qca8k_port_set_status(priv, dp->index, 0);
}

static void
qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode,
			  phy_interface_t interface, struct phy_device *phydev,
			  int speed, int duplex, bool tx_pause, bool rx_pause)
qca8k_phylink_mac_link_up(struct phylink_config *config,
			  struct phy_device *phydev, unsigned int mode,
			  phy_interface_t interface, int speed, int duplex,
			  bool tx_pause, bool rx_pause)
{
	struct qca8k_priv *priv = ds->priv;
	struct dsa_port *dp = dsa_phylink_to_port(config);
	struct qca8k_priv *priv = dp->ds->priv;
	int port = dp->index;
	u32 reg;

	if (phylink_autoneg_inband(mode)) {
@@ -1463,10 +1474,10 @@ qca8k_phylink_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode,
		if (duplex == DUPLEX_FULL)
			reg |= QCA8K_PORT_STATUS_DUPLEX;

		if (rx_pause || dsa_is_cpu_port(ds, port))
		if (rx_pause || dsa_port_is_cpu(dp))
			reg |= QCA8K_PORT_STATUS_RXFLOW;

		if (tx_pause || dsa_is_cpu_port(ds, port))
		if (tx_pause || dsa_port_is_cpu(dp))
			reg |= QCA8K_PORT_STATUS_TXFLOW;
	}

@@ -1991,6 +2002,13 @@ qca8k_setup(struct dsa_switch *ds)
	return 0;
}

static const struct phylink_mac_ops qca8k_phylink_mac_ops = {
	.mac_select_pcs	= qca8k_phylink_mac_select_pcs,
	.mac_config	= qca8k_phylink_mac_config,
	.mac_link_down	= qca8k_phylink_mac_link_down,
	.mac_link_up	= qca8k_phylink_mac_link_up,
};

static const struct dsa_switch_ops qca8k_switch_ops = {
	.get_tag_protocol	= qca8k_get_tag_protocol,
	.setup			= qca8k_setup,
@@ -2021,10 +2039,6 @@ static const struct dsa_switch_ops qca8k_switch_ops = {
	.port_vlan_add		= qca8k_port_vlan_add,
	.port_vlan_del		= qca8k_port_vlan_del,
	.phylink_get_caps	= qca8k_phylink_get_caps,
	.phylink_mac_select_pcs	= qca8k_phylink_mac_select_pcs,
	.phylink_mac_config	= qca8k_phylink_mac_config,
	.phylink_mac_link_down	= qca8k_phylink_mac_link_down,
	.phylink_mac_link_up	= qca8k_phylink_mac_link_up,
	.get_phy_flags		= qca8k_get_phy_flags,
	.port_lag_join		= qca8k_port_lag_join,
	.port_lag_leave		= qca8k_port_lag_leave,
@@ -2091,6 +2105,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
	priv->ds->num_ports = QCA8K_NUM_PORTS;
	priv->ds->priv = priv;
	priv->ds->ops = &qca8k_switch_ops;
	priv->ds->phylink_mac_ops = &qca8k_phylink_mac_ops;
	mutex_init(&priv->reg_mutex);
	dev_set_drvdata(&mdiodev->dev, priv);