git: 1198b0ca9d6d - stable/14 - asmc: add Wake-on-LAN control via sysctl
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 25 Apr 2026 16:26:53 UTC
The branch stable/14 has been updated by ngie:
URL: https://cgit.FreeBSD.org/src/commit/?id=1198b0ca9d6d7b579304404bc38ed17d394fc5a4
commit 1198b0ca9d6d7b579304404bc38ed17d394fc5a4
Author: Abdelkader Boudih <freebsd@seuros.com>
AuthorDate: 2026-02-25 06:32:42 +0000
Commit: Enji Cooper <ngie@FreeBSD.org>
CommitDate: 2026-04-25 16:25:42 +0000
asmc: add Wake-on-LAN control via sysctl
Apple Mac systems support Wake-on-LAN from powered-off state (S5/G2) via
the AUPO SMC key.
This change adds a convenience sysctl, `dev.asmc.0.wol`. This can be
disabled if set to 0 and enabled if set to 1.
The AUPO key is volatile and resets to 0x00 on every boot, so WoL must
be manually enabled before each shutdown to work from powered-off state.
Users need to run: `sysctl dev.asmc.0.wol=1` before shutting down the
system. The sysctl is best set to persist in `/etc/sysctl.conf`.
MFC after: 1 week
Reviewed By: markj, ngie
Differential Revision: https://reviews.freebsd.org/D54439
(cherry picked from commit 94db365042d35ff7e3ee7365a87a89bab1560030)
---
sys/dev/asmc/asmc.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
sys/dev/asmc/asmcvar.h | 5 +++++
2 files changed, 50 insertions(+)
diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
index 56518269be07..40aa74202a67 100644
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -108,6 +108,7 @@ static int asmc_mbp_sysctl_light_left(SYSCTL_HANDLER_ARGS);
static int asmc_mbp_sysctl_light_right(SYSCTL_HANDLER_ARGS);
static int asmc_mbp_sysctl_light_control(SYSCTL_HANDLER_ARGS);
static int asmc_mbp_sysctl_light_left_10byte(SYSCTL_HANDLER_ARGS);
+static int asmc_wol_sysctl(SYSCTL_HANDLER_ARGS);
struct asmc_model {
const char *smc_model; /* smbios.system.product env var. */
@@ -915,9 +916,12 @@ static int
asmc_init(device_t dev)
{
struct asmc_softc *sc = device_get_softc(dev);
+ struct sysctl_ctx_list *sysctlctx;
int i, error = 1;
uint8_t buf[4];
+ sysctlctx = device_get_sysctl_ctx(dev);
+
if (sc->sc_model->smc_sms_x == NULL)
goto nosms;
@@ -987,6 +991,16 @@ asmc_init(device_t dev)
out:
asmc_sms_calibrate(dev);
nosms:
+ /* Wake-on-LAN convenience sysctl */
+ if (asmc_key_read(dev, ASMC_KEY_AUPO, buf, 1) == 0) {
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "wol",
+ CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+ dev, 0, asmc_wol_sysctl, "I",
+ "Wake-on-LAN enable (0=off, 1=on)");
+ }
+
sc->sc_nfan = asmc_fan_count(dev);
if (sc->sc_nfan > ASMC_MAXFANS) {
device_printf(dev, "more than %d fans were detected. Please "
@@ -1741,3 +1755,34 @@ asmc_mbp_sysctl_light_left_10byte(SYSCTL_HANDLER_ARGS)
return (error);
}
+
+/*
+ * Wake-on-LAN convenience sysctl.
+ * Reading returns 1 if WoL is enabled, 0 if disabled.
+ * Writing 1 enables WoL, 0 disables it.
+ */
+static int
+asmc_wol_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ device_t dev = (device_t)arg1;
+ uint8_t aupo;
+ int val, error;
+
+ /* Read current AUPO value */
+ if (asmc_key_read(dev, ASMC_KEY_AUPO, &aupo, 1) != 0)
+ return (EIO);
+
+ val = (aupo != 0) ? 1 : 0;
+ error = sysctl_handle_int(oidp, &val, 0, req);
+ if (error != 0 || req->newptr == NULL)
+ return (error);
+
+ /* Clamp to 0 or 1 */
+ aupo = (val != 0) ? 1 : 0;
+
+ /* Write AUPO */
+ if (asmc_key_write(dev, ASMC_KEY_AUPO, &aupo, 1) != 0)
+ return (EIO);
+
+ return (0);
+}
diff --git a/sys/dev/asmc/asmcvar.h b/sys/dev/asmc/asmcvar.h
index 102bee8a15b7..602f363594b9 100644
--- a/sys/dev/asmc/asmcvar.h
+++ b/sys/dev/asmc/asmcvar.h
@@ -125,6 +125,11 @@ struct asmc_softc {
*/
#define ASMC_KEY_CLAMSHELL "MSLD" /* RO; 1 byte */
+/*
+ * Auto power on / Wake-on-LAN.
+ */
+#define ASMC_KEY_AUPO "AUPO" /* RW; 1 byte */
+
/*
* Interrupt keys.
*/