Re: RFC: phylink: disable PHY autonomous EEE when MAC manages LPI

Andrew Lunn
2026-03-31T22:56:20Z

On Tue, Mar 31, 2026 at 11:27:20PM +0200, Nicolai Buchwitz wrote:
> Hi
>
> Some PHYs (e.g. Broadcom BCM54xx "AutogrEEEn") manage EEE LPI
> autonomously without forwarding LPI signaling to the MAC. This works
> fine when the MAC doesn't support EEE, but conflicts with MACs that
> implement their own LPI control via phylink's mac_enable_tx_lpi /
> mac_disable_tx_lpi.
>
> When the MAC has lpi_capabilities set, the PHY should use Native EEE
> mode so the MAC can control LPI entry/exit and observe RX LPI
> transitions.
>
> I'm thinking of a flag on phy_device (similar to mac_managed_pm) that
> phylink sets when the MAC has lpi_capabilities, and that PHY drivers
> check in config_init to disable their autonomous EEE mode:
>
> /* set by phylink when MAC manages LPI */
> phydev->mac_managed_lpi = true;
>
> /* in bcm54xx_config_init: */
> if (phydev->mac_managed_lpi)
> bcm_phy_modify_exp(phydev, MII_BUF_CNTL0,
> AUTOGREEEN_EN, 0);
>
> This came up while adding EEE support to the Cadence macb driver (used
> on Raspberry Pi 5 with a BCM54210PE PHY). The PHY's AutogrEEEn mode
> prevented the MAC from tracking LPI state. As a workaround, the
> Raspberry Pi tree currently carries a downstream patch that
> unconditionally disables AutogrEEEn for all BCM54xx PHYs, since both
> genet and macb now support EEE properly. That's obviously not suitable
> for upstream where other MACs paired with BCM54xx may not have LPI
> support.
>
> Does this seem like a reasonable approach, or is there a better way to
> handle PHY autonomous EEE within phylink?

You should also think about it from the other direction. What happens
with the MAC does not indicate it supports EEE, but the PHY has
autonomous EEE. At some point in the future we are going to want the
PHY drivers to export API calls so that phylink/phylib can implement
ethtool set_eee and get_eee using this autonomous EEE.

Maybe it makes more sense for Broadcom BCM54xx etc, to implement a
.set_eee() call which only accepts eee_enable == False, and when
called so, disables autonomous EEE. .get_eee() can similarly return
that EEE is disabled. When phylink sees the MAC implements EEE it can
calll into the PHY driver to turn off autonomous EEE. And we have a
path to later add support for turning on and fully configuring
autonomous EEE.

Andrew