public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v6 0/5] net: cadence: macb: add IEEE 802.3az EEE support
@ 2026-03-04 10:54 Nicolai Buchwitz
  2026-03-04 10:54 ` [PATCH net-next v6 1/5] net: cadence: macb: add EEE LPI statistics counters Nicolai Buchwitz
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Nicolai Buchwitz @ 2026-03-04 10:54 UTC (permalink / raw)
  To: netdev
  Cc: Nicolas Ferre, Claudiu Beznea, Andrew Lunn, David S . Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Théo Lebrun, phil,
	Nicolai Buchwitz

Add Energy Efficient Ethernet (IEEE 802.3az) support to the Cadence GEM
(macb) driver using phylink's managed EEE framework. The GEM MAC has
hardware LPI registers but no built-in idle timer, so the driver
implements software-managed TX LPI using a delayed_work timer while
delegating EEE negotiation and ethtool state to phylink.

Changes from v5:
  - macb_tx_lpi_set() no longer manages its own spinlock; it now
    requires bp->lock to be held by the caller and asserts this with
    lockdep_assert_held(). All callers (macb_tx_lpi_work_fn,
    macb_mac_enable_tx_lpi, macb_mac_disable_tx_lpi) take bp->lock
    explicitly. Based on feedback from Jakub Kicinski.
  - macb_tx_lpi_wake() is now called under the existing bp->lock in
    macb_start_xmit(), eliminating the redundant lock acquire/release.
    An eee_active check at the top of macb_tx_lpi_wake() short-circuits
    the register read on the common (EEE-disabled) path. Based on
    feedback from Jakub Kicinski.
  - macb_tx_all_queues_idle() uses READ_ONCE for tx_head/tx_tail
    (called under bp->lock; taking tx_ptr_lock here would invert the
    established lock order). Loop rewritten to match the driver
    convention: for (q = 0, queue = bp->queues; ...; ++q, ++queue).
    Based on feedback from Jakub Kicinski and Claudiu Beznea.
  - Added Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev> to
    patches 1-4.

Changes from v4:
  - Removed redundant MACB_CAPS_EEE guards from macb_get_eee/set_eee;
    phylink already returns -EOPNOTSUPP when lpi_capabilities and
    lpi_interfaces are not populated. Based on feedback from Russell King.
  - Added patch 5 enabling EEE for Mobileye EyeQ5, tested by Théo Lebrun
    using a hardware loopback.

Changes from v3:
  - Dropped the register-definitions-only patch; LPI counter offsets
    (GEM_RXLPI/RXLPITIME/TXLPI/TXLPITIME) now land in the statistics
    patch, and TXLPIEN + MACB_CAPS_EEE are introduced alongside the TX
    LPI implementation where they are first used. Series is now 4 patches.
  - Add Reviewed-by: Théo Lebrun <theo.lebrun@bootlin.com> to all patches.
  - Split chained assignment in macb_tx_lpi_set() (suggested by
    checkpatch).

Changes from v2:
  - macb_tx_lpi_set() now returns bool indicating whether the register
    value actually changed, avoiding redundant writes.
  - Removed tx_lpi_enabled field from struct macb; LPI state is tracked
    entirely within the spinlock-protected register read/modify/write.
  - macb_tx_lpi_wake() uses the return value of macb_tx_lpi_set() to
    skip the cancel/udelay when TXLPIEN was already clear.
  All changes based on feedback from Russell King.

Changes from v1:
  - Rewrote to use phylink managed EEE (mac_enable_tx_lpi /
    mac_disable_tx_lpi callbacks) instead of the obsolete
    phy_init_eee() approach, as recommended by Russell King.
  - ethtool get_eee/set_eee are now pure phylink passthroughs.
  - Removed all manual EEE state tracking from mac_link_up/down;
    phylink handles the lifecycle.

The series is structured as follows:

  1. LPI statistics: Expose the four hardware EEE counters (RX/TX LPI
     transitions and time) through ethtool -S, accumulated in software
     since they are clear-on-read. Adds register offset definitions
     GEM_RXLPI/RXLPITIME/TXLPI/TXLPITIME (0x270-0x27c).

  2. TX LPI engine: Introduces GEM_TXLPIEN (NCR bit 19) and
     MACB_CAPS_EEE alongside the implementation that uses them.
     phylink mac_enable_tx_lpi / mac_disable_tx_lpi callbacks with a
     delayed_work-based idle timer. LPI entry is deferred 1 second
     after link-up per IEEE 802.3az. Wake before transmit with a
     conservative 50us PHY wake delay (IEEE 802.3az Tw_sys_tx).

  3. ethtool EEE ops: get_eee/set_eee delegating to phylink for PHY
     negotiation and timer management.

  4. RP1 enablement: Set MACB_CAPS_EEE for the Raspberry Pi 5's RP1
     southbridge (Cadence GEM_GXL rev 0x00070109 + BCM54213PE PHY).

  5. EyeQ5 enablement: Set MACB_CAPS_EEE for the Mobileye EyeQ5 GEM
     instance, verified with a hardware loopback by Théo Lebrun.

Tested on Raspberry Pi 5 (1000BASE-T, BCM54213PE PHY, 250ms LPI timer):

  iperf3 throughput (no regression):
    TCP TX: 937.8 Mbit/s (EEE on) vs 937.0 Mbit/s (EEE off)
    TCP RX: 936.5 Mbit/s both

  Latency (ping RTT, small expected increase from LPI wake):
    1s interval:  0.273 ms (EEE on) vs 0.181 ms (EEE off)
    10ms interval: 0.206 ms (EEE on) vs 0.168 ms (EEE off)
    flood ping:   0.200 ms (EEE on) vs 0.156 ms (EEE off)

  LPI counters (ethtool -S, 1s-interval ping, EEE on):
    tx_lpi_transitions: 112
    tx_lpi_time: 15574651

  Zero packet loss across all tests. Also verified with
  ethtool --show-eee / --set-eee and cable unplug/replug cycling.

Nicolai Buchwitz (5):
  net: cadence: macb: add EEE LPI statistics counters
  net: cadence: macb: implement EEE TX LPI support
  net: cadence: macb: add ethtool EEE support
  net: cadence: macb: enable EEE for Raspberry Pi RP1
  net: cadence: macb: enable EEE for Mobileye EyeQ5

 drivers/net/ethernet/cadence/macb.h      |  20 +++++
 drivers/net/ethernet/cadence/macb_main.c | 145 ++++++++++++++++++++++++++++++-
 2 files changed, 163 insertions(+), 2 deletions(-)

--
2.51.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-03-06  3:33 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-04 10:54 [PATCH net-next v6 0/5] net: cadence: macb: add IEEE 802.3az EEE support Nicolai Buchwitz
2026-03-04 10:54 ` [PATCH net-next v6 1/5] net: cadence: macb: add EEE LPI statistics counters Nicolai Buchwitz
2026-03-04 10:54 ` [PATCH net-next v6 2/5] net: cadence: macb: implement EEE TX LPI support Nicolai Buchwitz
2026-03-04 10:54 ` [PATCH net-next v6 3/5] net: cadence: macb: add ethtool EEE support Nicolai Buchwitz
2026-03-04 10:54 ` [PATCH net-next v6 4/5] net: cadence: macb: enable EEE for Raspberry Pi RP1 Nicolai Buchwitz
2026-03-04 10:54 ` [PATCH net-next v6 5/5] net: cadence: macb: enable EEE for Mobileye EyeQ5 Nicolai Buchwitz
2026-03-06  3:33 ` [PATCH net-next v6 0/5] net: cadence: macb: add IEEE 802.3az EEE support patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox