summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2023-08-17 15:36:22 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2025-04-04 14:39:48 +0100
commit743404aecfeb62105432b5155a7dd0e5db69f609 (patch)
tree9b2187a8f46724ca55d0db3eeaa650e40ea25355
parentb8cd119e414670cd52ac1b47ef87688768dc4192 (diff)
net: dsa: mv88e6xxx: add support for EEE forcing
Add support for EEE forcing using the MAC control register. Replace the 88e6393x errata 4.5 EEE disable code with a call to the new EEE forcing code. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/net/dsa/mv88e6xxx/port.c39
-rw-r--r--drivers/net/dsa/mv88e6xxx/port.h1
2 files changed, 32 insertions, 8 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c
index 66b1b7277281..3b74ec043ef1 100644
--- a/drivers/net/dsa/mv88e6xxx/port.c
+++ b/drivers/net/dsa/mv88e6xxx/port.c
@@ -522,6 +522,36 @@ phy_interface_t mv88e6393x_port_max_speed_mode(struct mv88e6xxx_chip *chip,
return PHY_INTERFACE_MODE_10GBASER;
}
+int mv88e6xxx_port_set_eee(struct mv88e6xxx_chip *chip, int port, int eee)
+{
+ u16 reg, val = 0;
+ int err;
+
+ switch (eee) {
+ case EEE_FORCE_ENABLE:
+ val = MV88E6XXX_PORT_MAC_CTL_EEE;
+ fallthrough;
+ case EEE_FORCE_DISABLE:
+ val |= MV88E6XXX_PORT_MAC_CTL_FORCE_EEE;
+ break;
+ default:
+ break;
+ }
+
+ dev_dbg(chip->dev, "p%d: %s eee %sable\n", port,
+ val & MV88E6XXX_PORT_MAC_CTL_FORCE_EEE ? "Force" : "Unforce",
+ val & MV88E6XXX_PORT_MAC_CTL_EEE ? "en" : "dis");
+
+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
+ if (err < 0)
+ return err;
+
+ reg &= ~(MV88E6XXX_PORT_MAC_CTL_EEE | MV88E6XXX_PORT_MAC_CTL_FORCE_EEE);
+ reg |= val;
+
+ return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
+}
+
static int mv88e6xxx_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
phy_interface_t mode, bool force)
{
@@ -631,7 +661,6 @@ int mv88e6393x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
phy_interface_t mode)
{
int err;
- u16 reg;
if (port != 0 && port != 9 && port != 10)
return -EOPNOTSUPP;
@@ -650,13 +679,7 @@ int mv88e6393x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
}
/* mv88e6393x errata 4.5: EEE should be disabled on SERDES ports */
- err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, &reg);
- if (err)
- return err;
-
- reg &= ~MV88E6XXX_PORT_MAC_CTL_EEE;
- reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_EEE;
- err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
+ err = mv88e6xxx_port_set_eee(chip, port, EEE_FORCE_DISABLE);
if (err)
return err;
diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h
index c1d2f99efb1c..78e15c45ca74 100644
--- a/drivers/net/dsa/mv88e6xxx/port.h
+++ b/drivers/net/dsa/mv88e6xxx/port.h
@@ -571,6 +571,7 @@ int mv88e6097_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
u8 out);
int mv88e6390_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
u8 out);
+int mv88e6xxx_port_set_eee(struct mv88e6xxx_chip *chip, int port, int eee);
int mv88e6341_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
phy_interface_t mode);
int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,