]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: hp-wmi: fix ignored return values in fan settings
authorEmre Cecanpunar <emreleno@gmail.com>
Tue, 7 Apr 2026 14:25:10 +0000 (17:25 +0300)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 9 Apr 2026 11:46:29 +0000 (14:46 +0300)
hp_wmi_get_fan_count_userdefine_trigger() can fail, but its return
value was silently ignored in hp_wmi_apply_fan_settings() for
PWM_MODE_MAX/AUTO. Propagate these errors consistently.

Additionally, handle the return value of hp_wmi_apply_fan_settings()
in its callers by adding appropriate warnings on failure, and remove an
unreachable "return 0" at the end of the function.

Fixes: 46be1453e6e6 ("platform/x86: hp-wmi: add manual fan control for Victus S models")
Signed-off-by: Emre Cecanpunar <emreleno@gmail.com>
Link: https://patch.msgid.link/20260407142515.20683-2-emreleno@gmail.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/hp/hp-wmi.c

index 988a0acc9622b8b5039c1bbba7e31628dc82e034..eac39f68d762c547814ea44224e255079af4fed5 100644 (file)
@@ -2353,8 +2353,11 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
 
        switch (priv->mode) {
        case PWM_MODE_MAX:
-               if (is_victus_s_thermal_profile())
-                       hp_wmi_get_fan_count_userdefine_trigger();
+               if (is_victus_s_thermal_profile()) {
+                       ret = hp_wmi_get_fan_count_userdefine_trigger();
+                       if (ret < 0)
+                               return ret;
+               }
                ret = hp_wmi_fan_speed_max_set(1);
                if (ret < 0)
                        return ret;
@@ -2372,7 +2375,9 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
                return 0;
        case PWM_MODE_AUTO:
                if (is_victus_s_thermal_profile()) {
-                       hp_wmi_get_fan_count_userdefine_trigger();
+                       ret = hp_wmi_get_fan_count_userdefine_trigger();
+                       if (ret < 0)
+                               return ret;
                        ret = hp_wmi_fan_speed_max_reset(priv);
                } else {
                        ret = hp_wmi_fan_speed_max_set(0);
@@ -2385,8 +2390,6 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)
                /* shouldn't happen */
                return -EINVAL;
        }
-
-       return 0;
 }
 
 static umode_t hp_wmi_hwmon_is_visible(const void *data,
@@ -2528,6 +2531,7 @@ static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work)
 {
        struct delayed_work *dwork;
        struct hp_wmi_hwmon_priv *priv;
+       int ret;
 
        dwork = to_delayed_work(work);
        priv = container_of(dwork, struct hp_wmi_hwmon_priv, keep_alive_dwork);
@@ -2535,7 +2539,10 @@ static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work)
         * Re-apply the current hwmon context settings.
         * NOTE: hp_wmi_apply_fan_settings will handle the re-scheduling.
         */
-       hp_wmi_apply_fan_settings(priv);
+       ret = hp_wmi_apply_fan_settings(priv);
+       if (ret)
+               pr_warn_ratelimited("keep-alive failed to refresh fan settings: %d\n",
+                                   ret);
 }
 
 static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)
@@ -2597,7 +2604,9 @@ static int hp_wmi_hwmon_init(void)
 
        INIT_DELAYED_WORK(&priv->keep_alive_dwork, hp_wmi_hwmon_keep_alive_handler);
        platform_set_drvdata(hp_wmi_platform_dev, priv);
-       hp_wmi_apply_fan_settings(priv);
+       ret = hp_wmi_apply_fan_settings(priv);
+       if (ret)
+               dev_warn(dev, "Failed to apply initial fan settings: %d\n", ret);
 
        return 0;
 }