From johnpol@2ka.mipt.ru Fri Jun 3 14:34:19 2005 Date: Sat, 4 Jun 2005 01:31:02 +0400 From: Evgeniy Polyakov To: Greg Kroah-Hartman Cc: BGardner@Wabtec.com, lm-sensors@lm-sensors.org Subject: [3/6] w1: Adds a sysfs entry (w1_master_search) that allows you to disable/enable periodic searches. Message-ID: <20050604013102.4e0e866a@zanzibar.2ka.mipt.ru> Adds a sysfs entry (w1_master_search) that allows you to disable/enable periodic searches. Signed-off-by: Ben Gardner Signed-off-by: Evgeniy Polyakov Signed-off-by: Greg Kroah-Hartman --- drivers/w1/w1.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- drivers/w1/w1.h | 1 + drivers/w1/w1_int.c | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) --- gregkh-2.6.orig/drivers/w1/w1.c 2005-06-09 22:23:32.000000000 -0700 +++ gregkh-2.6/drivers/w1/w1.c 2005-06-09 22:23:35.000000000 -0700 @@ -148,6 +148,39 @@ return count; } +static ssize_t w1_master_attribute_store_search(struct device * dev, + struct device_attribute *attr, + const char * buf, size_t count) +{ + struct w1_master *md = container_of(dev, struct w1_master, dev); + + if (down_interruptible (&md->mutex)) + return -EBUSY; + + md->search_count = simple_strtol(buf, NULL, 0); + + up(&md->mutex); + + return count; +} + +static ssize_t w1_master_attribute_show_search(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct w1_master *md = container_of(dev, struct w1_master, dev); + ssize_t count; + + if (down_interruptible (&md->mutex)) + return -EBUSY; + + count = sprintf(buf, "%d\n", md->search_count); + + up(&md->mutex); + + return count; +} + static ssize_t w1_master_attribute_show_pointer(struct device *dev, struct device_attribute *attr, char *buf) { struct w1_master *md = container_of(dev, struct w1_master, dev); @@ -242,6 +275,12 @@ __ATTR(w1_master_##_name, _mode, \ w1_master_attribute_show_##_name, NULL) +#define W1_MASTER_ATTR_RW(_name, _mode) \ + struct device_attribute w1_master_attribute_##_name = \ + __ATTR(w1_master_##_name, _mode, \ + w1_master_attribute_show_##_name, \ + w1_master_attribute_store_##_name) + static W1_MASTER_ATTR_RO(name, S_IRUGO); static W1_MASTER_ATTR_RO(slaves, S_IRUGO); static W1_MASTER_ATTR_RO(slave_count, S_IRUGO); @@ -249,6 +288,7 @@ static W1_MASTER_ATTR_RO(attempts, S_IRUGO); static W1_MASTER_ATTR_RO(timeout, S_IRUGO); static W1_MASTER_ATTR_RO(pointer, S_IRUGO); +static W1_MASTER_ATTR_RW(search, S_IRUGO | S_IWUGO); static struct attribute *w1_master_default_attrs[] = { &w1_master_attribute_name.attr, @@ -258,6 +298,7 @@ &w1_master_attribute_attempts.attr, &w1_master_attribute_timeout.attr, &w1_master_attribute_pointer.attr, + &w1_master_attribute_search.attr, NULL }; @@ -643,11 +684,14 @@ if (!dev->initialized) continue; + if (dev->search_count == 0) + continue; + if (down_interruptible(&dev->mutex)) continue; list_for_each_entry(sl, &dev->slist, w1_slave_entry) - clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); + clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); w1_search_devices(dev, w1_slave_found); @@ -662,6 +706,10 @@ } else if (test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags)) sl->ttl = dev->slave_ttl; } + + if (dev->search_count > 0) + dev->search_count--; + up(&dev->mutex); } --- gregkh-2.6.orig/drivers/w1/w1.h 2005-06-09 22:23:32.000000000 -0700 +++ gregkh-2.6/drivers/w1/w1.h 2005-06-09 22:23:35.000000000 -0700 @@ -162,6 +162,7 @@ int slave_ttl; int initialized; u32 id; + int search_count; atomic_t refcnt; --- gregkh-2.6.orig/drivers/w1/w1_int.c 2005-06-09 22:23:24.000000000 -0700 +++ gregkh-2.6/drivers/w1/w1_int.c 2005-06-09 22:23:35.000000000 -0700 @@ -69,6 +69,7 @@ dev->initialized = 0; dev->id = id; dev->slave_ttl = slave_ttl; + dev->search_count = -1; /* continual scan */ atomic_set(&dev->refcnt, 2);