Commit f7a48b68 authored by Baruch Siach's avatar Baruch Siach Committed by David S. Miller

net: dsa: mv88e6xxx: force cmode write on 6141/6341

mv88e6xxx_port_set_cmode() relies on cmode stored in struct
mv88e6xxx_port to skip cmode update when the requested value matches the
cached value. It turns out that mv88e6xxx_port_hidden_write() might
change the port cmode setting as a side effect, so we can't rely on the
cached value to determine that cmode update in not necessary.

Force cmode update in mv88e6341_port_set_cmode(), to make
serdes configuration work again. Other mv88e6xxx_port_set_cmode()
callers keep the current behaviour.

This fixes serdes configuration of the 6141 switch on SolidRun Clearfog
GT-8K.

Fixes: 7a3007d2 ("net: dsa: mv88e6xxx: fully support SERDES on Topaz family")
Reported-by: default avatarDenis Odintsov <d.odintsov@traviangames.com>
Signed-off-by: default avatarBaruch Siach <baruch@tkos.co.il>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 738d2902
...@@ -393,7 +393,7 @@ phy_interface_t mv88e6390x_port_max_speed_mode(int port) ...@@ -393,7 +393,7 @@ phy_interface_t mv88e6390x_port_max_speed_mode(int port)
} }
static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port, static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
phy_interface_t mode) phy_interface_t mode, bool force)
{ {
u8 lane; u8 lane;
u16 cmode; u16 cmode;
...@@ -427,8 +427,8 @@ static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port, ...@@ -427,8 +427,8 @@ static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
cmode = 0; cmode = 0;
} }
/* cmode doesn't change, nothing to do for us */ /* cmode doesn't change, nothing to do for us unless forced */
if (cmode == chip->ports[port].cmode) if (cmode == chip->ports[port].cmode && !force)
return 0; return 0;
lane = mv88e6xxx_serdes_get_lane(chip, port); lane = mv88e6xxx_serdes_get_lane(chip, port);
...@@ -484,7 +484,7 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port, ...@@ -484,7 +484,7 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
if (port != 9 && port != 10) if (port != 9 && port != 10)
return -EOPNOTSUPP; return -EOPNOTSUPP;
return mv88e6xxx_port_set_cmode(chip, port, mode); return mv88e6xxx_port_set_cmode(chip, port, mode, false);
} }
int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port, int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
...@@ -504,7 +504,7 @@ int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port, ...@@ -504,7 +504,7 @@ int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
break; break;
} }
return mv88e6xxx_port_set_cmode(chip, port, mode); return mv88e6xxx_port_set_cmode(chip, port, mode, false);
} }
static int mv88e6341_port_set_cmode_writable(struct mv88e6xxx_chip *chip, static int mv88e6341_port_set_cmode_writable(struct mv88e6xxx_chip *chip,
...@@ -555,7 +555,7 @@ int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port, ...@@ -555,7 +555,7 @@ int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
if (err) if (err)
return err; return err;
return mv88e6xxx_port_set_cmode(chip, port, mode); return mv88e6xxx_port_set_cmode(chip, port, mode, true);
} }
int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode) int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
......
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