Commit 0aeaaa8d authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-dsa-mv88e6xxx-get-rid-of-speed_max'

Russell King says:

====================
net: dsa: mv88e6xxx: get rid of SPEED_MAX

This series does two things:

1. it gets rid of mv88e6065_port_set_speed_duplex() which is completely
   unused (do we support this device? I couldn't find it in the tables
   in chip.c) This has a max speed of 200Mbps which we don't support.

2. get rid of the SPEED_MAX constant, which is used to configure a DSA
   or CPU port to their maximum speed during initialisation. We no
   longer need this as we can derive the maximum port speed from the
   mac_capabilities instead.

The reason for making this change is in preparation for phylink to be
used by DSA for CPU ports. This omission has come back to bite us with
the conversion of DSA drivers to phylink_pcs, since phylink_pcs won't
get used unless phylink is being used. Particularly with this driver,
it is very common for DT descriptions to omit the fixed-link details
which means "use maximum speed".

It will eventually be necessary to hoist the selection of "max speed"
into the DSA layer (trivial) and also have a way for the DSA driver
to tell the DSA layer which interface it should be using for these
ports.
====================

Link: https://lore.kernel.org/r/YrGQBssOvQBZiDS4@shell.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 93817be8 3c783b83
...@@ -449,9 +449,6 @@ static int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, ...@@ -449,9 +449,6 @@ static int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port,
goto restore_link; goto restore_link;
} }
if (speed == SPEED_MAX && chip->info->ops->port_max_speed_mode)
mode = chip->info->ops->port_max_speed_mode(port);
if (chip->info->ops->port_set_pause) { if (chip->info->ops->port_set_pause) {
err = chip->info->ops->port_set_pause(chip, port, pause); err = chip->info->ops->port_set_pause(chip, port, pause);
if (err) if (err)
...@@ -3280,28 +3277,51 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) ...@@ -3280,28 +3277,51 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
{ {
struct device_node *phy_handle = NULL; struct device_node *phy_handle = NULL;
struct dsa_switch *ds = chip->ds; struct dsa_switch *ds = chip->ds;
phy_interface_t mode;
struct dsa_port *dp; struct dsa_port *dp;
int tx_amp; int tx_amp, speed;
int err; int err;
u16 reg; u16 reg;
chip->ports[port].chip = chip; chip->ports[port].chip = chip;
chip->ports[port].port = port; chip->ports[port].port = port;
dp = dsa_to_port(ds, port);
/* MAC Forcing register: don't force link, speed, duplex or flow control /* MAC Forcing register: don't force link, speed, duplex or flow control
* state to any particular values on physical ports, but force the CPU * state to any particular values on physical ports, but force the CPU
* port and all DSA ports to their maximum bandwidth and full duplex. * port and all DSA ports to their maximum bandwidth and full duplex.
*/ */
if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
unsigned long caps = dp->pl_config.mac_capabilities;
if (chip->info->ops->port_max_speed_mode)
mode = chip->info->ops->port_max_speed_mode(port);
else
mode = PHY_INTERFACE_MODE_NA;
if (caps & MAC_10000FD)
speed = SPEED_10000;
else if (caps & MAC_5000FD)
speed = SPEED_5000;
else if (caps & MAC_2500FD)
speed = SPEED_2500;
else if (caps & MAC_1000)
speed = SPEED_1000;
else if (caps & MAC_100)
speed = SPEED_100;
else
speed = SPEED_10;
err = mv88e6xxx_port_setup_mac(chip, port, LINK_FORCED_UP, err = mv88e6xxx_port_setup_mac(chip, port, LINK_FORCED_UP,
SPEED_MAX, DUPLEX_FULL, speed, DUPLEX_FULL,
PAUSE_OFF, PAUSE_OFF, mode);
PHY_INTERFACE_MODE_NA); } else {
else
err = mv88e6xxx_port_setup_mac(chip, port, LINK_UNFORCED, err = mv88e6xxx_port_setup_mac(chip, port, LINK_UNFORCED,
SPEED_UNFORCED, DUPLEX_UNFORCED, SPEED_UNFORCED, DUPLEX_UNFORCED,
PAUSE_ON, PAUSE_ON,
PHY_INTERFACE_MODE_NA); PHY_INTERFACE_MODE_NA);
}
if (err) if (err)
return err; return err;
...@@ -3473,7 +3493,6 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) ...@@ -3473,7 +3493,6 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
} }
if (chip->info->ops->serdes_set_tx_amplitude) { if (chip->info->ops->serdes_set_tx_amplitude) {
dp = dsa_to_port(ds, port);
if (dp) if (dp)
phy_handle = of_parse_phandle(dp->dn, "phy-handle", 0); phy_handle = of_parse_phandle(dp->dn, "phy-handle", 0);
......
...@@ -488,14 +488,13 @@ struct mv88e6xxx_ops { ...@@ -488,14 +488,13 @@ struct mv88e6xxx_ops {
int (*port_set_pause)(struct mv88e6xxx_chip *chip, int port, int (*port_set_pause)(struct mv88e6xxx_chip *chip, int port,
int pause); int pause);
#define SPEED_MAX INT_MAX
#define SPEED_UNFORCED -2 #define SPEED_UNFORCED -2
#define DUPLEX_UNFORCED -2 #define DUPLEX_UNFORCED -2
/* Port's MAC speed (in Mbps) and MAC duplex mode /* Port's MAC speed (in Mbps) and MAC duplex mode
* *
* Depending on the chip, 10, 100, 200, 1000, 2500, 10000 are valid. * Depending on the chip, 10, 100, 200, 1000, 2500, 10000 are valid.
* Use SPEED_UNFORCED for normal detection, SPEED_MAX for max value. * Use SPEED_UNFORCED for normal detection.
* *
* Use DUPLEX_HALF or DUPLEX_FULL to force half or full duplex, * Use DUPLEX_HALF or DUPLEX_FULL to force half or full duplex,
* or DUPLEX_UNFORCED for normal duplex detection. * or DUPLEX_UNFORCED for normal duplex detection.
......
...@@ -294,28 +294,10 @@ static int mv88e6xxx_port_set_speed_duplex(struct mv88e6xxx_chip *chip, ...@@ -294,28 +294,10 @@ static int mv88e6xxx_port_set_speed_duplex(struct mv88e6xxx_chip *chip,
return 0; return 0;
} }
/* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
int mv88e6065_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex)
{
if (speed == SPEED_MAX)
speed = 200;
if (speed > 200)
return -EOPNOTSUPP;
/* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
return mv88e6xxx_port_set_speed_duplex(chip, port, speed, false, false,
duplex);
}
/* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */ /* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = 1000;
if (speed == 200 || speed > 1000) if (speed == 200 || speed > 1000)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -327,9 +309,6 @@ int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, ...@@ -327,9 +309,6 @@ int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = 100;
if (speed > 100) if (speed > 100)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -341,9 +320,6 @@ int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, ...@@ -341,9 +320,6 @@ int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int mv88e6341_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6341_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = port < 5 ? 1000 : 2500;
if (speed > 2500) if (speed > 2500)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -369,9 +345,6 @@ phy_interface_t mv88e6341_port_max_speed_mode(int port) ...@@ -369,9 +345,6 @@ phy_interface_t mv88e6341_port_max_speed_mode(int port)
int mv88e6352_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6352_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = 1000;
if (speed > 1000) if (speed > 1000)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -386,9 +359,6 @@ int mv88e6352_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, ...@@ -386,9 +359,6 @@ int mv88e6352_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int mv88e6390_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6390_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = port < 9 ? 1000 : 2500;
if (speed > 2500) if (speed > 2500)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -414,9 +384,6 @@ phy_interface_t mv88e6390_port_max_speed_mode(int port) ...@@ -414,9 +384,6 @@ phy_interface_t mv88e6390_port_max_speed_mode(int port)
int mv88e6390x_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6390x_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex) int speed, int duplex)
{ {
if (speed == SPEED_MAX)
speed = port < 9 ? 1000 : 10000;
if (speed == 200 && port != 0) if (speed == 200 && port != 0)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -445,9 +412,6 @@ int mv88e6393x_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, ...@@ -445,9 +412,6 @@ int mv88e6393x_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
u16 reg, ctrl; u16 reg, ctrl;
int err; int err;
if (speed == SPEED_MAX)
speed = (port > 0 && port < 9) ? 1000 : 10000;
if (speed == 200 && port != 0) if (speed == 200 && port != 0)
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -342,8 +342,6 @@ int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link); ...@@ -342,8 +342,6 @@ int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link);
int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup); int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);
int mv88e6185_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup); int mv88e6185_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);
int mv88e6065_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex);
int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6185_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
int speed, int duplex); int speed, int duplex);
int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port, int mv88e6250_port_set_speed_duplex(struct mv88e6xxx_chip *chip, int port,
......
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