Commit a5440cbe authored by Russell King's avatar Russell King Committed by David S. Miller
Browse files

net: dsa/ar9331: convert to mac_link_up()



Convert the ar9331 DSA driver to use the finalised link parameters in
mac_link_up() rather than the parameters in mac_config().

Tested-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6d293026
Loading
Loading
Loading
Loading
+31 −29
Original line number Diff line number Diff line
@@ -97,8 +97,7 @@
	(AR9331_SW_PORT_STATUS_TXMAC | AR9331_SW_PORT_STATUS_RXMAC)

#define AR9331_SW_PORT_STATUS_LINK_MASK \
	(AR9331_SW_PORT_STATUS_LINK_EN | AR9331_SW_PORT_STATUS_FLOW_LINK_EN | \
	 AR9331_SW_PORT_STATUS_DUPLEX_MODE | \
	(AR9331_SW_PORT_STATUS_DUPLEX_MODE | \
	 AR9331_SW_PORT_STATUS_RX_FLOW_EN | AR9331_SW_PORT_STATUS_TX_FLOW_EN | \
	 AR9331_SW_PORT_STATUS_SPEED_M)

@@ -410,33 +409,10 @@ static void ar9331_sw_phylink_mac_config(struct dsa_switch *ds, int port,
	struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv;
	struct regmap *regmap = priv->regmap;
	int ret;
	u32 val;

	switch (state->speed) {
	case SPEED_1000:
		val = AR9331_SW_PORT_STATUS_SPEED_1000;
		break;
	case SPEED_100:
		val = AR9331_SW_PORT_STATUS_SPEED_100;
		break;
	case SPEED_10:
		val = AR9331_SW_PORT_STATUS_SPEED_10;
		break;
	default:
		return;
	}

	if (state->duplex)
		val |= AR9331_SW_PORT_STATUS_DUPLEX_MODE;

	if (state->pause & MLO_PAUSE_TX)
		val |= AR9331_SW_PORT_STATUS_TX_FLOW_EN;

	if (state->pause & MLO_PAUSE_RX)
		val |= AR9331_SW_PORT_STATUS_RX_FLOW_EN;

	ret = regmap_update_bits(regmap, AR9331_SW_REG_PORT_STATUS(port),
				 AR9331_SW_PORT_STATUS_LINK_MASK, val);
				 AR9331_SW_PORT_STATUS_LINK_EN |
				 AR9331_SW_PORT_STATUS_FLOW_LINK_EN, 0);
	if (ret)
		dev_err_ratelimited(priv->dev, "%s: %i\n", __func__, ret);
}
@@ -464,11 +440,37 @@ static void ar9331_sw_phylink_mac_link_up(struct dsa_switch *ds, int port,
{
	struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv;
	struct regmap *regmap = priv->regmap;
	u32 val;
	int ret;

	val = AR9331_SW_PORT_STATUS_MAC_MASK;
	switch (speed) {
	case SPEED_1000:
		val |= AR9331_SW_PORT_STATUS_SPEED_1000;
		break;
	case SPEED_100:
		val |= AR9331_SW_PORT_STATUS_SPEED_100;
		break;
	case SPEED_10:
		val |= AR9331_SW_PORT_STATUS_SPEED_10;
		break;
	default:
		return;
	}

	if (duplex)
		val |= AR9331_SW_PORT_STATUS_DUPLEX_MODE;

	if (tx_pause)
		val |= AR9331_SW_PORT_STATUS_TX_FLOW_EN;

	if (rx_pause)
		val |= AR9331_SW_PORT_STATUS_RX_FLOW_EN;

	ret = regmap_update_bits(regmap, AR9331_SW_REG_PORT_STATUS(port),
				 AR9331_SW_PORT_STATUS_MAC_MASK,
				 AR9331_SW_PORT_STATUS_MAC_MASK);
				 AR9331_SW_PORT_STATUS_MAC_MASK |
				 AR9331_SW_PORT_STATUS_LINK_MASK,
				 val);
	if (ret)
		dev_err_ratelimited(priv->dev, "%s: %i\n", __func__, ret);
}