Message ID | 20230929200822.964-2-zev@bewilderbeest.net (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | hwmon: nct6775: Fix incorrect variable reuse in fan_div calculation | expand |
On Fri, Sep 29, 2023 at 01:08:23PM -0700, Zev Weiss wrote: > In the regmap conversion in commit 4ef2774511dc ("hwmon: (nct6775) > Convert register access to regmap API") I reused the 'reg' variable > for all three register reads in the fan speed calculation loop in > nct6775_update_device(), but failed to notice that the value from the > first one (data->REG_FAN[i]) is actually used in the call to > nct6775_select_fan_div() at the end of the loop body. Since that > patch the register value passed to nct6775_select_fan_div() has been > (conditionally) incorrectly clobbered with the value of a different > register than intended, which has in at least some cases resulted in > fan speeds being adjusted down to zero. > > Fix this by using dedicated temporaries for the two intermediate > register reads instead of 'reg'. > > Signed-off-by: Zev Weiss <zev@bewilderbeest.net> > Fixes: 4ef2774511dc ("hwmon: (nct6775) Convert register access to regmap API") > Reported-by: Thomas Zajic <zlatko@gmx.at> > Tested-by: Thomas Zajic <zlatko@gmx.at> > Cc: stable@vger.kernel.org # v5.19+ Applied. Thanks, Guenter
diff --git a/drivers/hwmon/nct6775-core.c b/drivers/hwmon/nct6775-core.c index b5b81bd83bb1..d928eb8ae5a3 100644 --- a/drivers/hwmon/nct6775-core.c +++ b/drivers/hwmon/nct6775-core.c @@ -1614,17 +1614,21 @@ struct nct6775_data *nct6775_update_device(struct device *dev) data->fan_div[i]); if (data->has_fan_min & BIT(i)) { - err = nct6775_read_value(data, data->REG_FAN_MIN[i], ®); + u16 tmp; + + err = nct6775_read_value(data, data->REG_FAN_MIN[i], &tmp); if (err) goto out; - data->fan_min[i] = reg; + data->fan_min[i] = tmp; } if (data->REG_FAN_PULSES[i]) { - err = nct6775_read_value(data, data->REG_FAN_PULSES[i], ®); + u16 tmp; + + err = nct6775_read_value(data, data->REG_FAN_PULSES[i], &tmp); if (err) goto out; - data->fan_pulses[i] = (reg >> data->FAN_PULSE_SHIFT[i]) & 0x03; + data->fan_pulses[i] = (tmp >> data->FAN_PULSE_SHIFT[i]) & 0x03; } err = nct6775_select_fan_div(dev, data, i, reg);