Commit 9a1730245e41 for kernel

commit 9a1730245e416d11ad5c0f2c100061d61cc43f60
Author: Nicolai Buchwitz <nb@tipi-net.de>
Date:   Wed May 20 20:43:20 2026 +0200

    net: bcmgenet: keep RBUF EEE/PM disabled

    Setting RBUF_EEE_EN | RBUF_PM_EN in RBUF_ENERGY_CTRL breaks the RX
    path on GENET hardware once MAC EEE becomes active. RX traffic stops
    flowing while the link stays up and the usual descriptor/RX error
    counters remain quiet. In that state the MAC still accepts frames
    (rbuf_ovflow_cnt keeps climbing) but RBUF no longer forwards them to
    DMA, so rx_packets is no longer incremented at the netdev level. On
    some boards the corruption ends up as a paging fault in
    skb_release_data via bcmgenet_rx_poll on an LPI exit.

    Reproduced on Pi 4B (BCM2711 + BCM54213PE) and confirmed by Florian
    Fainelli on an internal Broadcom 4908-family board with the same crash
    signature. RBUF_PM_EN is not publicly documented.

    This shows up more often now that phy_support_eee() enables EEE by
    default, but it also affects older kernels as soon as TX LPI is
    turned on via ethtool, so it is not specific to recent changes.

    Always clear RBUF_EEE_EN | RBUF_PM_EN in bcmgenet_eee_enable_set so
    the bits stay off across resets. UMAC and TBUF setup is left alone so
    TX-side EEE keeps working.

    Link: https://github.com/raspberrypi/linux/issues/7304
    Fixes: 6ef398ea60d9 ("net: bcmgenet: add EEE support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Nicolai Buchwitz <nb@tipi-net.de>
    Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
    Link: https://patch.msgid.link/20260520184320.652053-1-nb@tipi-net.de
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 54f71b1e85fc..7c11cf916762 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1368,13 +1368,12 @@ void bcmgenet_eee_enable_set(struct net_device *dev, bool enable)
 		reg &= ~(TBUF_EEE_EN | TBUF_PM_EN);
 	bcmgenet_writel(reg, priv->base + off);

-	/* Do the same for thing for RBUF */
+	/* RBUF EEE/PM can break the RX path on GENET. Keep it disabled. */
 	reg = bcmgenet_rbuf_readl(priv, RBUF_ENERGY_CTRL);
-	if (enable)
-		reg |= RBUF_EEE_EN | RBUF_PM_EN;
-	else
+	if (reg & (RBUF_EEE_EN | RBUF_PM_EN)) {
 		reg &= ~(RBUF_EEE_EN | RBUF_PM_EN);
-	bcmgenet_rbuf_writel(priv, reg, RBUF_ENERGY_CTRL);
+		bcmgenet_rbuf_writel(priv, reg, RBUF_ENERGY_CTRL);
+	}

 	if (!enable && priv->clk_eee_enabled) {
 		clk_disable_unprepare(priv->clk_eee);