Commit af00a2d5 authored by David Fries's avatar David Fries Committed by Linus Torvalds

W1: w1_int.c use first available master number

Follow the example of other devices (like the joystick device).  Pick the
first available id for each detected device.  Currently for USB devices,
suspending and resuming would cause the number to increment.
Signed-off-by: default avatarDavid Fries <david@fries.net>
Signed-off-by: default avatarEvgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e0d29c76
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include "w1_netlink.h" #include "w1_netlink.h"
#include "w1_int.h" #include "w1_int.h"
static u32 w1_ids = 1;
static int w1_search_count = -1; /* Default is continual scan */ static int w1_search_count = -1; /* Default is continual scan */
module_param_named(search_count, w1_search_count, int, 0); module_param_named(search_count, w1_search_count, int, 0);
...@@ -102,9 +101,10 @@ static void w1_free_dev(struct w1_master *dev) ...@@ -102,9 +101,10 @@ static void w1_free_dev(struct w1_master *dev)
int w1_add_master_device(struct w1_bus_master *master) int w1_add_master_device(struct w1_bus_master *master)
{ {
struct w1_master *dev; struct w1_master *dev, *entry;
int retval = 0; int retval = 0;
struct w1_netlink_msg msg; struct w1_netlink_msg msg;
int id, found;
/* validate minimum functionality */ /* validate minimum functionality */
if (!(master->touch_bit && master->reset_bus) && if (!(master->touch_bit && master->reset_bus) &&
...@@ -126,13 +126,33 @@ int w1_add_master_device(struct w1_bus_master *master) ...@@ -126,13 +126,33 @@ int w1_add_master_device(struct w1_bus_master *master)
master->set_pullup = NULL; master->set_pullup = NULL;
} }
dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_master_driver, &w1_master_device); /* Lock until the device is added (or not) to w1_masters. */
if (!dev) mutex_lock(&w1_mlock);
/* Search for the first available id (starting at 1). */
id = 0;
do {
++id;
found = 0;
list_for_each_entry(entry, &w1_masters, w1_master_entry) {
if (entry->id == id) {
found = 1;
break;
}
}
} while (found);
dev = w1_alloc_dev(id, w1_max_slave_count, w1_max_slave_ttl,
&w1_master_driver, &w1_master_device);
if (!dev) {
mutex_unlock(&w1_mlock);
return -ENOMEM; return -ENOMEM;
}
retval = w1_create_master_attributes(dev); retval = w1_create_master_attributes(dev);
if (retval) if (retval) {
mutex_unlock(&w1_mlock);
goto err_out_free_dev; goto err_out_free_dev;
}
memcpy(dev->bus_master, master, sizeof(struct w1_bus_master)); memcpy(dev->bus_master, master, sizeof(struct w1_bus_master));
...@@ -144,10 +164,10 @@ int w1_add_master_device(struct w1_bus_master *master) ...@@ -144,10 +164,10 @@ int w1_add_master_device(struct w1_bus_master *master)
dev_err(&dev->dev, dev_err(&dev->dev,
"Failed to create new kernel thread. err=%d\n", "Failed to create new kernel thread. err=%d\n",
retval); retval);
mutex_unlock(&w1_mlock);
goto err_out_rm_attr; goto err_out_rm_attr;
} }
mutex_lock(&w1_mlock);
list_add(&dev->w1_master_entry, &w1_masters); list_add(&dev->w1_master_entry, &w1_masters);
mutex_unlock(&w1_mlock); mutex_unlock(&w1_mlock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment