From 4a0095bce6fd3da164b4bdc0ce5911cb6f2b83eb Mon Sep 17 00:00:00 2001 From: Amin Ezzy Date: Sat, 18 Jul 2026 15:36:29 +0300 Subject: [PATCH] fan curves: don't factory-reset via pwmN_enable=3 when reading defaults Writing "3" to pwm_enable makes the kernel re-fetch factory defaults via the fan_curve_get_factory_default WMI call. On the 2025 TUF F16 (FX608JMR, BIOS 306) that call blocks ~30s, stalls the EC (input freezes), and returns EIO: asus_wmi: fan_curve_get_factory_default (0x00110024) failed: -5 asusd triggers this on first run when fetching default curves, so it never finishes starting: systemd kills it at the start timeout, Restart=on-failure loops it, and the machine's input freezes repeatedly. Read the curves the driver already reports (cached at probe time, reads verified instant and correct on affected hardware) instead of forcing a firmware re-fetch first. On first run these are the factory defaults. Verified on FX608JMR: asusd starts in ~1s, per-profile defaults are read correctly for all profiles, and no asus_wmi errors are logged. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014NneBinAM7WAFrqBqXZhA9 --- rog-profiles/src/lib.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rog-profiles/src/lib.rs b/rog-profiles/src/lib.rs index 51e91d88..78afc7b2 100644 --- a/rog-profiles/src/lib.rs +++ b/rog-profiles/src/lib.rs @@ -157,13 +157,11 @@ impl FanCurveProfiles { profile: PlatformProfile, device: &mut Device, ) -> Result<(), ProfileError> { - let fans = Self::supported_fans()?; - // Do reset for all - for fan in fans { - let pwm_num: char = fan.into(); - let pwm = format!("pwm{pwm_num}_enable"); - device.set_attribute_value(&pwm, "3")?; - } + // Writing "3" to pwm_enable makes the kernel re-fetch factory + // defaults via the fan_curve_get_factory_default WMI call. On some + // boards (TUF FX608JMR, BIOS 306) that call blocks ~30s, stalls the EC + // (input freezes) and returns EIO, so read the curves the driver + // already reports instead of resetting first. self.read_from_dev_profile(profile, device)?; Ok(()) }