From nobody Fri Apr 10 17:43:17 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fskfy6tNCz6Y59Q for ; Fri, 10 Apr 2026 17:43:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fskfy5xRRz3tTp for ; Fri, 10 Apr 2026 17:43:22 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775843002; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X+p1Vi5ig1zOa95DtZke98idkpgShwI1d+fNbx8H5L4=; b=U/r1zjAEwNagCRkyMToHKj26wkZzFTnRpcVLR98pTGB3+cz+LyGBtLceHzanBRmCHXDEHs hW4rYoyvD4GcjWIzq/j8J4LLl9RjFcqag4gh4S1D8syBmCuXQif5NtAyrvWzWxrx0N35Xk dvA+ErIrRD47++GD46i9Oug3mM4vw4mPTZzf8wogVhu2FNHtAI8rokQsFKQky32SngK42t NrUVeuxR7KehXaWcDwATfbEUaf8WHKoYzEAt2S8v4BCJMsvXqHIC3YebzPdwM40XPbVlBJ cW3mDW1wNH+JzSLnxceAXBEWDPTOXnsD/FaECSZREH+k2ridail/eIheshMMuw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775843002; a=rsa-sha256; cv=none; b=IOcbFed5IS0jNEGPTz2DJbuh01H3PtjAQ5Dp+99f0tYCFn8XsMJqeS46Oqh61BdL3K+tbb ZCk6W3l75gW3GtF1uxdJVdP3VBCdHoYmIiEF9YN1ixFqtXhCWtiMk0IdU1OkT+gIylaySI G3V3KgcAMALAtfQ+r18cnDI4jKlATugS8JIFLe6vLyiTlt7gC9WyHvCt66whWWhNOXjamv h3h+ltQhmIExrQNIcjNbZd/xYXAqDjO1oJERB9bU1zM4KC4Re+VMFN72VzCji80xv0t8+S Nzw8++0cuFRm7jX5fxw5B0aNc06oD+7yzk+kCgp05ZQbCialH13vwP2x06ww1w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775843002; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X+p1Vi5ig1zOa95DtZke98idkpgShwI1d+fNbx8H5L4=; b=Ceg+he6HAaE1Mrk+ItiUE/a4bob/OVtnLPeA4GtBJRzBO3vTJazKK71WnmPoA3h1j0B+Ce 2TURSvuG+z+y41WPR6J9opQinUWJTSGU9/nu4DB9sbZIrI8TMtrFCM9Xdq7hY9KFz4ntQp 0slUViIwtEq1enbF0NKNZ6kbFb3Nonm2CAeki7EXHqIX59uTPLtas8v6gAbiqJLZGCog1n tVNkhybjyI+roNgEyFT01NIp+yacPCZvCGz66ggD0b6kCQlyD90P164eFbFavZm09zDTXP lk2BDAA1gE8zn/khBiKapbeGJ2/+dQV2F557bOPcfzLpVXfopyt6y3iapxs1pg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fskfy59bzzv8R for ; Fri, 10 Apr 2026 17:43:22 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 32c58 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 10 Apr 2026 17:43:17 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Christos Longros From: Adrian Chadd Subject: git: fc68534a9ad9 - main - rge: add Wake-on-LAN support for magic packet List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: fc68534a9ad93f6df1756ffa8e707c30a35ce4d7 Auto-Submitted: auto-generated Date: Fri, 10 Apr 2026 17:43:17 +0000 Message-Id: <69d936b5.32c58.504c3558@gitrepo.freebsd.org> The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=fc68534a9ad93f6df1756ffa8e707c30a35ce4d7 commit fc68534a9ad93f6df1756ffa8e707c30a35ce4d7 Author: Christos Longros AuthorDate: 2026-04-10 17:31:38 +0000 Commit: Adrian Chadd CommitDate: 2026-04-10 17:31:38 +0000 rge: add Wake-on-LAN support for magic packet Advertise IFCAP_WOL_MAGIC when PCI power management is available and enable it by default. On suspend or shutdown, rge_setwol() enables the WOL_MAGIC and WOL_LANWAKE bits in CFG3/CFG5, disables the RXDV gate, and enables PM so the NIC stays powered to watch for magic packets. Move hardware-specific WOL register configuration into rge_wol_config() in if_rge_hw.c to keep hardware-specific functions in sync with OpenBSD. Update rge.4 to document WoL support. Tested on FreeBSD 16.0-CURRENT bare metal with Realtek RTL8125 on a Gigabyte B650 Gaming X AX motherboard. Signed-off-by: Christos Longros Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D56259 --- share/man/man4/rge.4 | 6 +++--- sys/dev/rge/if_rge.c | 57 +++++++++++++++++++++++-------------------------- sys/dev/rge/if_rge_hw.c | 53 +++++++++++++++++---------------------------- sys/dev/rge/if_rge_hw.h | 1 + 4 files changed, 51 insertions(+), 66 deletions(-) diff --git a/share/man/man4/rge.4 b/share/man/man4/rge.4 index 2b781e287e3c..f9077a56f28b 100644 --- a/share/man/man4/rge.4 +++ b/share/man/man4/rge.4 @@ -3,7 +3,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.Dd December 18, 2025 +.Dd April 5, 2026 .Dt RGE 4 .Os .Sh NAME @@ -39,8 +39,8 @@ over CAT6 cable. .Pp All NICs supported by the .Nm -driver have TCP/IP checksum offload and hardware VLAN tagging/insertion -features, and use a descriptor-based DMA mechanism. +driver have TCP/IP checksum offload, hardware VLAN tagging/insertion +features, Wake On Lan (WOL), and use a descriptor-based DMA mechanism. They are also capable of TCP large send (TCP segmentation offload). .Pp diff --git a/sys/dev/rge/if_rge.c b/sys/dev/rge/if_rge.c index 0007b07e0fa6..17225e065482 100644 --- a/sys/dev/rge/if_rge.c +++ b/sys/dev/rge/if_rge.c @@ -103,12 +103,7 @@ static void rge_tx_task(void *, int); static void rge_txq_flush_mbufs(struct rge_softc *sc); static void rge_tick(void *); static void rge_link_state(struct rge_softc *); -#if 0 -#ifndef SMALL_KERNEL -int rge_wol(struct ifnet *, int); -void rge_wol_power(struct rge_softc *); -#endif -#endif +static void rge_setwol(struct rge_softc *); struct rge_matchid { uint16_t vendor; @@ -161,7 +156,11 @@ rge_attach_if(struct rge_softc *sc, const char *eaddr) if_setcapabilities(sc->sc_ifp, IFCAP_HWCSUM); if_setcapenable(sc->sc_ifp, if_getcapabilities(sc->sc_ifp)); - /* TODO: set WOL */ + /* Enable WOL if PM is supported. */ + if (pci_has_pm(sc->sc_dev)) { + if_setcapabilitiesbit(sc->sc_ifp, IFCAP_WOL_MAGIC, 0); + if_setcapenablebit(sc->sc_ifp, IFCAP_WOL_MAGIC, 0); + } /* Attach interface */ ether_ifattach(sc->sc_ifp, eaddr); @@ -654,26 +653,6 @@ rge_detach(device_t dev) return (0); } -#if 0 - -int -rge_activate(struct device *self, int act) -{ -#ifndef SMALL_KERNEL - struct rge_softc *sc = (struct rge_softc *)self; -#endif - - switch (act) { - case DVACT_POWERDOWN: -#ifndef SMALL_KERNEL - rge_wol_power(sc); -#endif - break; - } - return (0); -} -#endif - static void rge_intr_msi(void *arg) { @@ -1014,7 +993,9 @@ rge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) reinit = 1; } - /* TODO: WOL */ + if ((mask & IFCAP_WOL_MAGIC) != 0 && + (if_getcapabilities(ifp) & IFCAP_WOL_MAGIC) != 0) + if_togglecapenable(ifp, IFCAP_WOL_MAGIC); if ((mask & IFCAP_RXCSUM) != 0 && (if_getcapabilities(ifp) & IFCAP_RXCSUM) != 0) { @@ -2620,6 +2601,22 @@ rge_link_state(struct rge_softc *sc) } } +static void +rge_setwol(struct rge_softc *sc) +{ + if_t ifp = sc->sc_ifp; + int enable; + + mtx_assert(&sc->sc_mtx, MA_OWNED); + + if (!pci_has_pm(sc->sc_dev)) + return; + + enable = (if_getcapenable(ifp) & IFCAP_WOL_MAGIC) != 0; + + rge_wol_config(sc, enable); +} + /** * @brief Suspend */ @@ -2630,7 +2627,7 @@ rge_suspend(device_t dev) RGE_LOCK(sc); rge_stop_locked(sc); - /* TODO: wake on lan */ + rge_setwol(sc); sc->sc_suspended = true; RGE_UNLOCK(sc); @@ -2646,7 +2643,6 @@ rge_resume(device_t dev) struct rge_softc *sc = device_get_softc(dev); RGE_LOCK(sc); - /* TODO: wake on lan */ /* reinit if required */ if (if_getflags(sc->sc_ifp) & IFF_UP) @@ -2669,6 +2665,7 @@ rge_shutdown(device_t dev) RGE_LOCK(sc); rge_stop_locked(sc); + rge_setwol(sc); RGE_UNLOCK(sc); return (0); diff --git a/sys/dev/rge/if_rge_hw.c b/sys/dev/rge/if_rge_hw.c index 35a0e93dd193..ba01e389af14 100644 --- a/sys/dev/rge/if_rge_hw.c +++ b/sys/dev/rge/if_rge_hw.c @@ -2196,50 +2196,37 @@ rge_get_link_status(struct rge_softc *sc) return ((RGE_READ_2(sc, RGE_PHYSTAT) & RGE_PHYSTAT_LINK) ? 1 : 0); } -#if 0 -#ifndef SMALL_KERNEL -int -rge_wol(struct ifnet *ifp, int enable) +void +rge_wol_config(struct rge_softc *sc, int enable) { - struct rge_softc *sc = ifp->if_softc; - - if (enable) { - if (!(RGE_READ_1(sc, RGE_CFG1) & RGE_CFG1_PM_EN)) { - printf("%s: power management is disabled, " - "cannot do WOL\n", sc->sc_dev.dv_xname); - return (ENOTSUP); - } - - } - - rge_iff(sc); - if (enable) RGE_MAC_SETBIT(sc, 0xc0b6, 0x0001); else RGE_MAC_CLRBIT(sc, 0xc0b6, 0x0001); + /* Enable config register write. */ RGE_SETBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG); - RGE_CLRBIT_1(sc, RGE_CFG5, RGE_CFG5_WOL_LANWAKE | RGE_CFG5_WOL_UCAST | - RGE_CFG5_WOL_MCAST | RGE_CFG5_WOL_BCAST); + + /* Clear all WOL bits, then set as requested. */ RGE_CLRBIT_1(sc, RGE_CFG3, RGE_CFG3_WOL_LINK | RGE_CFG3_WOL_MAGIC); - if (enable) + RGE_CLRBIT_1(sc, RGE_CFG5, RGE_CFG5_WOL_LANWAKE | + RGE_CFG5_WOL_UCAST | RGE_CFG5_WOL_MCAST | RGE_CFG5_WOL_BCAST); + if (enable) { + RGE_SETBIT_1(sc, RGE_CFG3, RGE_CFG3_WOL_MAGIC); RGE_SETBIT_1(sc, RGE_CFG5, RGE_CFG5_WOL_LANWAKE); - RGE_CLRBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG); + } - return (0); -} + /* Config register write done. */ + RGE_CLRBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG); -void -rge_wol_power(struct rge_softc *sc) -{ - /* Disable RXDV gate. */ - RGE_CLRBIT_1(sc, RGE_PPSW, 0x08); - DELAY(2000); + if (enable) { + /* Disable RXDV gate so WOL packets can reach the NIC. */ + RGE_CLRBIT_1(sc, RGE_PPSW, 0x08); + DELAY(2000); - RGE_SETBIT_1(sc, RGE_CFG1, RGE_CFG1_PM_EN); - RGE_SETBIT_1(sc, RGE_CFG2, RGE_CFG2_PMSTS_EN); + /* Enable power management. */ + RGE_SETBIT_1(sc, RGE_CFG1, RGE_CFG1_PM_EN); + RGE_SETBIT_1(sc, RGE_CFG2, RGE_CFG2_PMSTS_EN); + } } -#endif -#endif diff --git a/sys/dev/rge/if_rge_hw.h b/sys/dev/rge/if_rge_hw.h index 86f0da7c87b3..4e6ee5f1975f 100644 --- a/sys/dev/rge/if_rge_hw.h +++ b/sys/dev/rge/if_rge_hw.h @@ -37,5 +37,6 @@ extern uint16_t rge_read_phy(struct rge_softc *, uint16_t, uint16_t); extern void rge_write_phy_ocp(struct rge_softc *, uint16_t, uint16_t); extern uint16_t rge_read_phy_ocp(struct rge_softc *sc, uint16_t reg); extern int rge_get_link_status(struct rge_softc *); +extern void rge_wol_config(struct rge_softc *, int); #endif /* __IF_RGE_HW_H__ */