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>2024-02-27 15:37:55 +0000
commit5ee25e83ce1b78805cb4b15923c4431f7de39f25 (patch)
tree75af5af1afccb067fd7654f7302b47382e0dca5b
parent49782d38a37581816a6e280293468c2b47ab6660 (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 5394a8cf7bf1..02870f001f5f 100644
--- a/drivers/net/dsa/mv88e6xxx/port.c
+++ b/drivers/net/dsa/mv88e6xxx/port.c
@@ -520,6 +520,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)
{
@@ -629,7 +659,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;
@@ -648,13 +677,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 86deeb347cbc..1410677c415a 100644
--- a/drivers/net/dsa/mv88e6xxx/port.h
+++ b/drivers/net/dsa/mv88e6xxx/port.h
@@ -432,6 +432,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,