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

net: dsa: mv88e6xxx: configure interface settings in mac_config



Only configure the interface settings in mac_config(), leaving the
speed and duplex settings to mac_link_up to deal with.

Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c8b7350
Loading
Loading
Loading
Loading
+35 −32
Original line number Original line Diff line number Diff line
@@ -397,6 +397,28 @@ static void mv88e6xxx_irq_poll_free(struct mv88e6xxx_chip *chip)
	mv88e6xxx_reg_unlock(chip);
	mv88e6xxx_reg_unlock(chip);
}
}


static int mv88e6xxx_port_config_interface(struct mv88e6xxx_chip *chip,
					   int port, phy_interface_t interface)
{
	int err;

	if (chip->info->ops->port_set_rgmii_delay) {
		err = chip->info->ops->port_set_rgmii_delay(chip, port,
							    interface);
		if (err && err != -EOPNOTSUPP)
			return err;
	}

	if (chip->info->ops->port_set_cmode) {
		err = chip->info->ops->port_set_cmode(chip, port,
						      interface);
		if (err && err != -EOPNOTSUPP)
			return err;
	}

	return 0;
}

int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, int link,
int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, int link,
			     int speed, int duplex, int pause,
			     int speed, int duplex, int pause,
			     phy_interface_t mode)
			     phy_interface_t mode)
@@ -451,19 +473,7 @@ int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, int link,
			goto restore_link;
			goto restore_link;
	}
	}


	if (chip->info->ops->port_set_rgmii_delay) {
	err = mv88e6xxx_port_config_interface(chip, port, mode);
		err = chip->info->ops->port_set_rgmii_delay(chip, port, mode);
		if (err && err != -EOPNOTSUPP)
			goto restore_link;
	}

	if (chip->info->ops->port_set_cmode) {
		err = chip->info->ops->port_set_cmode(chip, port, mode);
		if (err && err != -EOPNOTSUPP)
			goto restore_link;
	}

	err = 0;
restore_link:
restore_link:
	if (chip->info->ops->port_set_link(chip, port, link))
	if (chip->info->ops->port_set_link(chip, port, link))
		dev_err(chip->dev, "p%d: failed to restore MAC's link\n", port);
		dev_err(chip->dev, "p%d: failed to restore MAC's link\n", port);
@@ -603,33 +613,26 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
				 const struct phylink_link_state *state)
				 const struct phylink_link_state *state)
{
{
	struct mv88e6xxx_chip *chip = ds->priv;
	struct mv88e6xxx_chip *chip = ds->priv;
	int speed, duplex, link, pause, err;
	int err;


	/* FIXME: is this the correct test? If we're in fixed mode on an
	 * internal port, why should we process this any different from
	 * PHY mode? On the other hand, the port may be automedia between
	 * an internal PHY and the serdes...
	 */
	if ((mode == MLO_AN_PHY) && mv88e6xxx_phy_is_internal(ds, port))
	if ((mode == MLO_AN_PHY) && mv88e6xxx_phy_is_internal(ds, port))
		return;
		return;


	if (mode == MLO_AN_FIXED) {
		link = LINK_FORCED_UP;
		speed = state->speed;
		duplex = state->duplex;
	} else if (!mv88e6xxx_phy_is_internal(ds, port)) {
		link = state->link;
		speed = state->speed;
		duplex = state->duplex;
	} else {
		speed = SPEED_UNFORCED;
		duplex = DUPLEX_UNFORCED;
		link = LINK_UNFORCED;
	}
	pause = !!phylink_test(state->advertising, Pause);

	mv88e6xxx_reg_lock(chip);
	mv88e6xxx_reg_lock(chip);
	err = mv88e6xxx_port_setup_mac(chip, port, link, speed, duplex, pause,
	/* FIXME: should we force the link down here - but if we do, how
				       state->interface);
	 * do we restore the link force/unforce state? The driver layering
	 * gets in the way.
	 */
	err = mv88e6xxx_port_config_interface(chip, port, state->interface);
	mv88e6xxx_reg_unlock(chip);
	mv88e6xxx_reg_unlock(chip);


	if (err && err != -EOPNOTSUPP)
	if (err && err != -EOPNOTSUPP)
		dev_err(ds->dev, "p%d: failed to configure MAC\n", port);
		dev_err(ds->dev, "p%d: failed to configure MAC/PCS\n", port);
}
}


static void mv88e6xxx_mac_link_down(struct dsa_switch *ds, int port,
static void mv88e6xxx_mac_link_down(struct dsa_switch *ds, int port,