diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-12 14:12:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-12 14:12:06 -0500 |
| commit | e697b8d13ede3893724898d983eff3f8c9183643 (patch) | |
| tree | 0144d2d98d33e92a1d93739f0db12997c000d456 /net/rfkill/rfkill.c | |
| parent | 46015977e70f672ae6b20a1b5fb1e361208365ba (diff) | |
| parent | 2994c63863ac350c4c8c6a65d8110749c2abb95c (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (39 commits)
[INET]: Small possible memory leak in FIB rules
[NETNS]: init dev_base_lock only once
[UNIX]: The unix_nr_socks limit can be exceeded
[AF_UNIX]: Convert socks to unix_socks in scan_inflight, not in callbacks
[AF_UNIX]: Make unix_tot_inflight counter non-atomic
[AF_PACKET]: Allow multicast traffic to be caught by ORIGDEV when bonded
ssb: Fix PCMCIA-host lowlevel bus access
mac80211: fix MAC80211_RCSIMPLE Kconfig
mac80211: make "decrypt failed" messages conditional upon MAC80211_DEBUG
mac80211: use IW_AUTH_PRIVACY_INVOKED rather than IW_AUTH_KEY_MGMT
mac80211: remove unused driver ops
mac80211: remove ieee80211_common.h
softmac: MAINTAINERS update
rfkill: Fix sparse warning
rfkill: Use mutex_lock() at register and add sanity check
iwlwifi: select proper rate control algorithm
mac80211: allow driver to ask for a rate control algorithm
mac80211: don't allow registering the same rate control twice
rfkill: Use subsys_initcall
mac80211: make simple rate control algorithm built-in
...
Diffstat (limited to 'net/rfkill/rfkill.c')
| -rw-r--r-- | net/rfkill/rfkill.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 51d151c0e962..73d60a307129 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/rfkill.h> | 28 | #include <linux/rfkill.h> |
| 29 | 29 | ||
| 30 | /* Get declaration of rfkill_switch_all() to shut up sparse. */ | ||
| 31 | #include "rfkill-input.h" | ||
| 32 | |||
| 33 | |||
| 30 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); | 34 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); |
| 31 | MODULE_VERSION("1.0"); | 35 | MODULE_VERSION("1.0"); |
| 32 | MODULE_DESCRIPTION("RF switch support"); | 36 | MODULE_DESCRIPTION("RF switch support"); |
| @@ -276,21 +280,17 @@ static struct class rfkill_class = { | |||
| 276 | 280 | ||
| 277 | static int rfkill_add_switch(struct rfkill *rfkill) | 281 | static int rfkill_add_switch(struct rfkill *rfkill) |
| 278 | { | 282 | { |
| 279 | int retval; | 283 | int error; |
| 280 | |||
| 281 | retval = mutex_lock_interruptible(&rfkill_mutex); | ||
| 282 | if (retval) | ||
| 283 | return retval; | ||
| 284 | 284 | ||
| 285 | retval = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); | 285 | mutex_lock(&rfkill_mutex); |
| 286 | if (retval) | ||
| 287 | goto out; | ||
| 288 | 286 | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | 287 | error = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); |
| 288 | if (!error) | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | ||
| 290 | 290 | ||
| 291 | out: | ||
| 292 | mutex_unlock(&rfkill_mutex); | 291 | mutex_unlock(&rfkill_mutex); |
| 293 | return retval; | 292 | |
| 293 | return error; | ||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static void rfkill_remove_switch(struct rfkill *rfkill) | 296 | static void rfkill_remove_switch(struct rfkill *rfkill) |
| @@ -387,20 +387,23 @@ int rfkill_register(struct rfkill *rfkill) | |||
| 387 | 387 | ||
| 388 | if (!rfkill->toggle_radio) | 388 | if (!rfkill->toggle_radio) |
| 389 | return -EINVAL; | 389 | return -EINVAL; |
| 390 | if (rfkill->type >= RFKILL_TYPE_MAX) | ||
| 391 | return -EINVAL; | ||
| 392 | |||
| 393 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 394 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 395 | |||
| 396 | rfkill_led_trigger_register(rfkill); | ||
| 390 | 397 | ||
| 391 | error = rfkill_add_switch(rfkill); | 398 | error = rfkill_add_switch(rfkill); |
| 392 | if (error) | 399 | if (error) |
| 393 | return error; | 400 | return error; |
| 394 | 401 | ||
| 395 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 396 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 397 | |||
| 398 | error = device_add(dev); | 402 | error = device_add(dev); |
| 399 | if (error) { | 403 | if (error) { |
| 400 | rfkill_remove_switch(rfkill); | 404 | rfkill_remove_switch(rfkill); |
| 401 | return error; | 405 | return error; |
| 402 | } | 406 | } |
| 403 | rfkill_led_trigger_register(rfkill); | ||
| 404 | 407 | ||
| 405 | return 0; | 408 | return 0; |
| 406 | } | 409 | } |
| @@ -416,9 +419,9 @@ EXPORT_SYMBOL(rfkill_register); | |||
| 416 | */ | 419 | */ |
| 417 | void rfkill_unregister(struct rfkill *rfkill) | 420 | void rfkill_unregister(struct rfkill *rfkill) |
| 418 | { | 421 | { |
| 419 | rfkill_led_trigger_unregister(rfkill); | ||
| 420 | device_del(&rfkill->dev); | 422 | device_del(&rfkill->dev); |
| 421 | rfkill_remove_switch(rfkill); | 423 | rfkill_remove_switch(rfkill); |
| 424 | rfkill_led_trigger_unregister(rfkill); | ||
| 422 | put_device(&rfkill->dev); | 425 | put_device(&rfkill->dev); |
| 423 | } | 426 | } |
| 424 | EXPORT_SYMBOL(rfkill_unregister); | 427 | EXPORT_SYMBOL(rfkill_unregister); |
| @@ -448,5 +451,5 @@ static void __exit rfkill_exit(void) | |||
| 448 | class_unregister(&rfkill_class); | 451 | class_unregister(&rfkill_class); |
| 449 | } | 452 | } |
| 450 | 453 | ||
| 451 | module_init(rfkill_init); | 454 | subsys_initcall(rfkill_init); |
| 452 | module_exit(rfkill_exit); | 455 | module_exit(rfkill_exit); |
