On Tue, May 28, 2024 at 09:09:28AM +0200, Thomas Weißschuh wrote: > On 2024-05-28 06:39:25+0000, Tzung-Bi Shih wrote: > > On Mon, May 27, 2024 at 10:58:32PM +0200, Thomas Weißschuh wrote: > > > +struct cros_ec_hwmon_priv { > > > + struct cros_ec_device *cros_ec; > > > + const char *temp_sensor_names[EC_TEMP_SENSOR_ENTRIES + EC_TEMP_SENSOR_B_ENTRIES]; > > > + u8 usable_fans; > > > +}; > > > + > > > +static int cros_ec_hwmon_read_fan_speed(struct cros_ec_device *cros_ec, u8 index, u16 *speed) > > > +{ > > > + u16 data; > > > + int ret; > > > + > > > + ret = cros_ec_cmd_readmem(cros_ec, EC_MEMMAP_FAN + index * 2, 2, &data); > > > + if (ret < 0) > > > + return ret; > > > + > > > + data = le16_to_cpu(data); > > > + *speed = data; > > > + > > > + if (data == EC_FAN_SPEED_NOT_PRESENT || data == EC_FAN_SPEED_STALLED) > > > + return -EIO; > > > > `data` could be eliminated; use `*speed` instead. > > Then the le16 value would need to be written directly to the out > parameter. The current usage relies on *speed (sometimes) being set even > if ret != 0. > > (See next response block) > > > > > > +static int cros_ec_hwmon_read(struct device *dev, enum hwmon_sensor_types type, > > > + u32 attr, int channel, long *val) > > > +{ > > [...] > > > + u16 speed = 0; > > > + u8 temp = 0; > > > > They don't need to initialize. > > They need to. > > The logic > > if (ret == -EIO && speed == EC_FAN_SPEED_STALLED) > ret = 0; > > relies on -EIO and a write to speed from cros_ec_hwmon_read_fan_speed(). > > But if cros_ec_cmd_readmem() already returns -EIO, then speed would be > uninitialized. I see.