diff options
Diffstat (limited to 'drivers/w1/w1_int.c')
| -rw-r--r-- | drivers/w1/w1_int.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c index 5f0bafbbd575..35e85d961702 100644 --- a/drivers/w1/w1_int.c +++ b/drivers/w1/w1_int.c | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * w1_int.c | 2 | * w1_int.c |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru> | 4 | * Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru> |
| 5 | * | 5 | * |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
| @@ -39,8 +39,9 @@ extern spinlock_t w1_mlock; | |||
| 39 | 39 | ||
| 40 | extern int w1_process(void *); | 40 | extern int w1_process(void *); |
| 41 | 41 | ||
| 42 | struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl, | 42 | static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl, |
| 43 | struct device_driver *driver, struct device *device) | 43 | struct device_driver *driver, |
| 44 | struct device *device) | ||
| 44 | { | 45 | { |
| 45 | struct w1_master *dev; | 46 | struct w1_master *dev; |
| 46 | int err; | 47 | int err; |
| @@ -60,14 +61,15 @@ struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl, | |||
| 60 | 61 | ||
| 61 | dev->bus_master = (struct w1_bus_master *)(dev + 1); | 62 | dev->bus_master = (struct w1_bus_master *)(dev + 1); |
| 62 | 63 | ||
| 63 | dev->owner = THIS_MODULE; | 64 | dev->owner = THIS_MODULE; |
| 64 | dev->max_slave_count = slave_count; | 65 | dev->max_slave_count = slave_count; |
| 65 | dev->slave_count = 0; | 66 | dev->slave_count = 0; |
| 66 | dev->attempts = 0; | 67 | dev->attempts = 0; |
| 67 | dev->kpid = -1; | 68 | dev->kpid = -1; |
| 68 | dev->initialized = 0; | 69 | dev->initialized = 0; |
| 69 | dev->id = id; | 70 | dev->id = id; |
| 70 | dev->slave_ttl = slave_ttl; | 71 | dev->slave_ttl = slave_ttl; |
| 72 | dev->search_count = -1; /* continual scan */ | ||
| 71 | 73 | ||
| 72 | atomic_set(&dev->refcnt, 2); | 74 | atomic_set(&dev->refcnt, 2); |
| 73 | 75 | ||
| @@ -105,7 +107,7 @@ struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl, | |||
| 105 | return dev; | 107 | return dev; |
| 106 | } | 108 | } |
| 107 | 109 | ||
| 108 | void w1_free_dev(struct w1_master *dev) | 110 | static void w1_free_dev(struct w1_master *dev) |
| 109 | { | 111 | { |
| 110 | device_unregister(&dev->dev); | 112 | device_unregister(&dev->dev); |
| 111 | if (dev->nls && dev->nls->sk_socket) | 113 | if (dev->nls && dev->nls->sk_socket) |
| @@ -120,6 +122,13 @@ int w1_add_master_device(struct w1_bus_master *master) | |||
| 120 | int retval = 0; | 122 | int retval = 0; |
| 121 | struct w1_netlink_msg msg; | 123 | struct w1_netlink_msg msg; |
| 122 | 124 | ||
| 125 | /* validate minimum functionality */ | ||
| 126 | if (!(master->touch_bit && master->reset_bus) && | ||
| 127 | !(master->write_bit && master->read_bit)) { | ||
| 128 | printk(KERN_ERR "w1_add_master_device: invalid function set\n"); | ||
| 129 | return(-EINVAL); | ||
| 130 | } | ||
| 131 | |||
| 123 | dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_driver, &w1_device); | 132 | dev = w1_alloc_dev(w1_ids++, w1_max_slave_count, w1_max_slave_ttl, &w1_driver, &w1_device); |
| 124 | if (!dev) | 133 | if (!dev) |
| 125 | return -ENOMEM; | 134 | return -ENOMEM; |
| @@ -153,7 +162,7 @@ int w1_add_master_device(struct w1_bus_master *master) | |||
| 153 | return 0; | 162 | return 0; |
| 154 | 163 | ||
| 155 | err_out_kill_thread: | 164 | err_out_kill_thread: |
| 156 | dev->need_exit = 1; | 165 | set_bit(W1_MASTER_NEED_EXIT, &dev->flags); |
| 157 | if (kill_proc(dev->kpid, SIGTERM, 1)) | 166 | if (kill_proc(dev->kpid, SIGTERM, 1)) |
| 158 | dev_err(&dev->dev, | 167 | dev_err(&dev->dev, |
| 159 | "Failed to send signal to w1 kernel thread %d.\n", | 168 | "Failed to send signal to w1 kernel thread %d.\n", |
| @@ -171,7 +180,7 @@ void __w1_remove_master_device(struct w1_master *dev) | |||
| 171 | int err; | 180 | int err; |
| 172 | struct w1_netlink_msg msg; | 181 | struct w1_netlink_msg msg; |
| 173 | 182 | ||
| 174 | dev->need_exit = 1; | 183 | set_bit(W1_MASTER_NEED_EXIT, &dev->flags); |
| 175 | err = kill_proc(dev->kpid, SIGTERM, 1); | 184 | err = kill_proc(dev->kpid, SIGTERM, 1); |
| 176 | if (err) | 185 | if (err) |
| 177 | dev_err(&dev->dev, | 186 | dev_err(&dev->dev, |
| @@ -197,10 +206,8 @@ void __w1_remove_master_device(struct w1_master *dev) | |||
| 197 | void w1_remove_master_device(struct w1_bus_master *bm) | 206 | void w1_remove_master_device(struct w1_bus_master *bm) |
| 198 | { | 207 | { |
| 199 | struct w1_master *dev = NULL; | 208 | struct w1_master *dev = NULL; |
| 200 | struct list_head *ent, *n; | ||
| 201 | 209 | ||
| 202 | list_for_each_safe(ent, n, &w1_masters) { | 210 | list_for_each_entry(dev, &w1_masters, w1_master_entry) { |
| 203 | dev = list_entry(ent, struct w1_master, w1_master_entry); | ||
| 204 | if (!dev->initialized) | 211 | if (!dev->initialized) |
| 205 | continue; | 212 | continue; |
| 206 | 213 | ||
