Commit d700ec41 authored by Marek Vasut's avatar Marek Vasut Committed by David S. Miller

net: dsa: mv88e6xxx: Make sure to configure ports with external PHYs

The MV88E6xxx can have external PHYs attached to certain ports and those
PHYs could even be on different MDIO bus than the one within the switch.
This patch makes sure that ports with such PHYs are configured correctly
according to the information provided by the PHY.
Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Cc: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f8a1988f
...@@ -575,6 +575,13 @@ static int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, ...@@ -575,6 +575,13 @@ static int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port,
return err; return err;
} }
static int mv88e6xxx_phy_is_internal(struct dsa_switch *ds, int port)
{
struct mv88e6xxx_chip *chip = ds->priv;
return port < chip->info->num_internal_phys;
}
/* We expect the switch to perform auto negotiation if there is a real /* We expect the switch to perform auto negotiation if there is a real
* phy. However, in the case of a fixed link phy, we force the port * phy. However, in the case of a fixed link phy, we force the port
* settings from the fixed link settings. * settings from the fixed link settings.
...@@ -585,7 +592,8 @@ static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port, ...@@ -585,7 +592,8 @@ static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
struct mv88e6xxx_chip *chip = ds->priv; struct mv88e6xxx_chip *chip = ds->priv;
int err; int err;
if (!phy_is_pseudo_fixed_link(phydev)) if (!phy_is_pseudo_fixed_link(phydev) &&
mv88e6xxx_phy_is_internal(ds, port))
return; return;
mutex_lock(&chip->reg_lock); mutex_lock(&chip->reg_lock);
...@@ -709,13 +717,17 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port, ...@@ -709,13 +717,17 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
struct mv88e6xxx_chip *chip = ds->priv; struct mv88e6xxx_chip *chip = ds->priv;
int speed, duplex, link, pause, err; int speed, duplex, link, pause, err;
if (mode == MLO_AN_PHY) if ((mode == MLO_AN_PHY) && mv88e6xxx_phy_is_internal(ds, port))
return; return;
if (mode == MLO_AN_FIXED) { if (mode == MLO_AN_FIXED) {
link = LINK_FORCED_UP; link = LINK_FORCED_UP;
speed = state->speed; speed = state->speed;
duplex = state->duplex; duplex = state->duplex;
} else if (!mv88e6xxx_phy_is_internal(ds, port)) {
link = state->link;
speed = state->speed;
duplex = state->duplex;
} else { } else {
speed = SPEED_UNFORCED; speed = SPEED_UNFORCED;
duplex = DUPLEX_UNFORCED; duplex = DUPLEX_UNFORCED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment