diff options
| author | David Fries <David@Fries.net> | 2011-05-26 19:26:03 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-26 20:12:38 -0400 |
| commit | 963bb101010169b9bb32b5c21af785e2f9abdaf3 (patch) | |
| tree | 8e5d4cfae208bf5ac1044994291e7cde9570362a /drivers/w1 | |
| parent | 26a6afb917a8e3eb603358be1238a69e8a16d0ee (diff) | |
w1: have netlink search update kernel list
Reorganize so the netlink connector one wire search command will update
the kernel list of detected slave devices. Otherwise, a newly detected
device is unusable because unless it's in the kernel list of known devices
any commands will result in ENODEV status.
Signed-off-by: David Fries <David@Fries.net>
Cc: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/w1')
| -rw-r--r-- | drivers/w1/w1.c | 12 | ||||
| -rw-r--r-- | drivers/w1/w1.h | 4 | ||||
| -rw-r--r-- | drivers/w1/w1_netlink.c | 5 |
3 files changed, 16 insertions, 5 deletions
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index b7b5014ff714..10606c822756 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
| @@ -827,7 +827,7 @@ void w1_reconnect_slaves(struct w1_family *f, int attach) | |||
| 827 | mutex_unlock(&w1_mlock); | 827 | mutex_unlock(&w1_mlock); |
| 828 | } | 828 | } |
| 829 | 829 | ||
| 830 | static void w1_slave_found(struct w1_master *dev, u64 rn) | 830 | void w1_slave_found(struct w1_master *dev, u64 rn) |
| 831 | { | 831 | { |
| 832 | struct w1_slave *sl; | 832 | struct w1_slave *sl; |
| 833 | struct w1_reg_num *tmp; | 833 | struct w1_reg_num *tmp; |
| @@ -933,14 +933,15 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb | |||
| 933 | } | 933 | } |
| 934 | } | 934 | } |
| 935 | 935 | ||
| 936 | void w1_search_process(struct w1_master *dev, u8 search_type) | 936 | void w1_search_process_cb(struct w1_master *dev, u8 search_type, |
| 937 | w1_slave_found_callback cb) | ||
| 937 | { | 938 | { |
| 938 | struct w1_slave *sl, *sln; | 939 | struct w1_slave *sl, *sln; |
| 939 | 940 | ||
| 940 | list_for_each_entry(sl, &dev->slist, w1_slave_entry) | 941 | list_for_each_entry(sl, &dev->slist, w1_slave_entry) |
| 941 | clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); | 942 | clear_bit(W1_SLAVE_ACTIVE, (long *)&sl->flags); |
| 942 | 943 | ||
| 943 | w1_search_devices(dev, search_type, w1_slave_found); | 944 | w1_search_devices(dev, search_type, cb); |
| 944 | 945 | ||
| 945 | list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { | 946 | list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { |
| 946 | if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl) | 947 | if (!test_bit(W1_SLAVE_ACTIVE, (unsigned long *)&sl->flags) && !--sl->ttl) |
| @@ -953,6 +954,11 @@ void w1_search_process(struct w1_master *dev, u8 search_type) | |||
| 953 | dev->search_count--; | 954 | dev->search_count--; |
| 954 | } | 955 | } |
| 955 | 956 | ||
| 957 | static void w1_search_process(struct w1_master *dev, u8 search_type) | ||
| 958 | { | ||
| 959 | w1_search_process_cb(dev, search_type, w1_slave_found); | ||
| 960 | } | ||
| 961 | |||
| 956 | int w1_process(void *data) | 962 | int w1_process(void *data) |
| 957 | { | 963 | { |
| 958 | struct w1_master *dev = (struct w1_master *) data; | 964 | struct w1_master *dev = (struct w1_master *) data; |
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index f804eba89b7b..1ce23fc6186c 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h | |||
| @@ -194,7 +194,9 @@ void w1_destroy_master_attributes(struct w1_master *master); | |||
| 194 | void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); | 194 | void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); |
| 195 | void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); | 195 | void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb); |
| 196 | struct w1_slave *w1_search_slave(struct w1_reg_num *id); | 196 | struct w1_slave *w1_search_slave(struct w1_reg_num *id); |
| 197 | void w1_search_process(struct w1_master *dev, u8 search_type); | 197 | void w1_slave_found(struct w1_master *dev, u64 rn); |
| 198 | void w1_search_process_cb(struct w1_master *dev, u8 search_type, | ||
| 199 | w1_slave_found_callback cb); | ||
| 198 | struct w1_master *w1_search_master_id(u32 id); | 200 | struct w1_master *w1_search_master_id(u32 id); |
| 199 | 201 | ||
| 200 | /* Disconnect and reconnect devices in the given family. Used for finding | 202 | /* Disconnect and reconnect devices in the given family. Used for finding |
diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c index 7e667bc77ef2..55aabd927c60 100644 --- a/drivers/w1/w1_netlink.c +++ b/drivers/w1/w1_netlink.c | |||
| @@ -55,6 +55,9 @@ static void w1_send_slave(struct w1_master *dev, u64 rn) | |||
| 55 | struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1); | 55 | struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1); |
| 56 | int avail; | 56 | int avail; |
| 57 | 57 | ||
| 58 | /* update kernel slave list */ | ||
| 59 | w1_slave_found(dev, rn); | ||
| 60 | |||
| 58 | avail = dev->priv_size - cmd->len; | 61 | avail = dev->priv_size - cmd->len; |
| 59 | 62 | ||
| 60 | if (avail > 8) { | 63 | if (avail > 8) { |
| @@ -85,7 +88,7 @@ static int w1_process_search_command(struct w1_master *dev, struct cn_msg *msg, | |||
| 85 | dev->priv = msg; | 88 | dev->priv = msg; |
| 86 | dev->priv_size = avail; | 89 | dev->priv_size = avail; |
| 87 | 90 | ||
| 88 | w1_search_devices(dev, search_type, w1_send_slave); | 91 | w1_search_process_cb(dev, search_type, w1_send_slave); |
| 89 | 92 | ||
| 90 | msg->ack = 0; | 93 | msg->ack = 0; |
| 91 | cn_netlink_send(msg, 0, GFP_KERNEL); | 94 | cn_netlink_send(msg, 0, GFP_KERNEL); |
