Re: [PATCH 1/4] hwmon: (adm9240) Implement the standard intrusion detection interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jean,

On Wed, Nov 03, 2010 at 06:11:35AM -0400, Jean Delvare wrote:
> Hi Guenter,
> 
> Thanks for the fast review.
> 
> On Tue, 2 Nov 2010 11:40:37 -0700, Guenter Roeck wrote:
> > Hi Jean,
> > 
> > On Tue, 2010-11-02 at 12:40 -0400, Jean Delvare wrote:
> > > We have a standard intrusion detection interface now, drivers should
> > > implement it. I've left the old interface in place for the time being,
> > > with a deprecation warning, it will be removed later.
> > > 
> > Good idea!
> > 
> > > Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx>
> > > ---
> > >  Documentation/hwmon/adm9240 |    2 +-
> > >  drivers/hwmon/adm9240.c     |   31 ++++++++++++++++++++++++++++---
> > >  2 files changed, 29 insertions(+), 4 deletions(-)
> > > 
> > > --- linux-2.6.37-rc1.orig/drivers/hwmon/adm9240.c	2010-11-02 14:32:58.000000000 +0100
> > > +++ linux-2.6.37-rc1/drivers/hwmon/adm9240.c	2010-11-02 16:50:55.000000000 +0100
> > > @@ -20,7 +20,7 @@
> > >   * Alarms	16-bit map of active alarms
> > >   * Analog Out	0..1250 mV output
> > >   *
> > > - * Chassis Intrusion: clear CI latch with 'echo 1 > chassis_clear'
> > > + * Chassis Intrusion: clear CI latch with 'echo 0 > intrusion0_alarm'
> > >   *
> > >   * Test hardware: Intel SE440BX-2 desktop motherboard --Grant
> > >   *
> > > @@ -476,13 +476,15 @@ static ssize_t set_aout(struct device *d
> > >  static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout);
> > >  
> > >  /* chassis_clear */
> > > -static ssize_t chassis_clear(struct device *dev,
> > > +static ssize_t chassis_clear_legacy(struct device *dev,
> > >  		struct device_attribute *attr,
> > >  		const char *buf, size_t count)
> > >  {
> > >  	struct i2c_client *client = to_i2c_client(dev);
> > >  	unsigned long val = simple_strtol(buf, NULL, 10);
> > >  
> > > +	dev_warn(&client->dev, "Attribute chassis_clear is deprecated, "
> > > +		 "use intrusion0_alarm instead\n");
> > >  	if (val == 1) {
> > >  		i2c_smbus_write_byte_data(client,
> > >  				ADM9240_REG_CHASSIS_CLEAR, 0x80);
> > > @@ -490,7 +492,29 @@ static ssize_t chassis_clear(struct devi
> > >  	}
> > >  	return count;
> > >  }
> > > -static DEVICE_ATTR(chassis_clear, S_IWUSR, NULL, chassis_clear);
> > > +static DEVICE_ATTR(chassis_clear, S_IWUSR, NULL, chassis_clear_legacy);
> > > +
> > > +static ssize_t chassis_clear(struct device *dev,
> > > +		struct device_attribute *attr,
> > > +		const char *buf, size_t count)
> > > +{
> > > +	struct i2c_client *client = to_i2c_client(dev);
> > > +	struct adm9240_data *data = i2c_get_clientdata(client);
> > > +	unsigned long val;
> > > +
> > > +	if (strict_strtoul(buf, 10, &val) || val != 0)
> > > +		return -EINVAL;
> > > +
> > > +	mutex_lock(&data->update_lock);
> > > +	data->alarms &= ~(1 << 12);
> > 
> > Not sure if that is a good idea. The original code doesn't do it,
> 
> Hardly a valid reason per se... There are plenty of cases where the
> original code does the wrong thing ;)
> 
Yes, but it is a data point ...

> > and you can not really know for sure if the alarm will be reset;
> > after all, the chassis might still be open.
> 
> This OTOH is a very valid point, which I had missed.
> 
> > I think it would be better 
> > to leave updating the flag to the attribute update handler.
> 
> The problem is that this infringes the rule that register value caching
> should be transparent to the caller. When we set limits, we make sure
> that the cache contains the new value as it is written to the chip, so
> that user-space sees the change immediately. Behaving differently for
> the intrusion detection case would be unexpected and confusing.
> 
> > If you
> > really want to update the flag immediately, I think you should re-read
> > the register and not just reset the flag.
> 
> It's not so easy. For most chips, the intrusion alarm flag is part of
> an alarm register which contains many other flags, which are latched
> when the error condition is spotted and cleared when the register is
> read. Reading such registers other than on user request may lose
> temporary error condition alarms. 
> 
> What I can offer is resetting data->valid to 0, to force a cache
> refresh on next access from user-space. This should let the driver
> always return the right value. This also has the advantage of being
> cheap from a code perspective. The run-time overhead is negligible
> IMHO, as I don't expect the chassis intrusion alarm to be cleared by
> the user frequently.

Ok, that makes sense.

Since you are at it, would it make sense to make that change
in the w83795 driver as well (ie set data->valid to 0) ?

Guenter


> 
> -- 
> Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux