aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/rfkill/rfkill.c83
1 files changed, 5 insertions, 78 deletions
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
index 051d2c9ea66b..3c94f76d5525 100644
--- a/net/rfkill/rfkill.c
+++ b/net/rfkill/rfkill.c
@@ -53,51 +53,6 @@ static struct rfkill_gsw_state rfkill_global_states[RFKILL_TYPE_MAX];
53static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; 53static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)];
54static bool rfkill_epo_lock_active; 54static bool rfkill_epo_lock_active;
55 55
56static BLOCKING_NOTIFIER_HEAD(rfkill_notifier_list);
57
58
59/**
60 * register_rfkill_notifier - Add notifier to rfkill notifier chain
61 * @nb: pointer to the new entry to add to the chain
62 *
63 * See blocking_notifier_chain_register() for return value and further
64 * observations.
65 *
66 * Adds a notifier to the rfkill notifier chain. The chain will be
67 * called with a pointer to the relevant rfkill structure as a parameter,
68 * refer to include/linux/rfkill.h for the possible events.
69 *
70 * Notifiers added to this chain are to always return NOTIFY_DONE. This
71 * chain is a blocking notifier chain: notifiers can sleep.
72 *
73 * Calls to this chain may have been done through a workqueue. One must
74 * assume unordered asynchronous behaviour, there is no way to know if
75 * actions related to the event that generated the notification have been
76 * carried out already.
77 */
78int register_rfkill_notifier(struct notifier_block *nb)
79{
80 BUG_ON(!nb);
81 return blocking_notifier_chain_register(&rfkill_notifier_list, nb);
82}
83EXPORT_SYMBOL_GPL(register_rfkill_notifier);
84
85/**
86 * unregister_rfkill_notifier - remove notifier from rfkill notifier chain
87 * @nb: pointer to the entry to remove from the chain
88 *
89 * See blocking_notifier_chain_unregister() for return value and further
90 * observations.
91 *
92 * Removes a notifier from the rfkill notifier chain.
93 */
94int unregister_rfkill_notifier(struct notifier_block *nb)
95{
96 BUG_ON(!nb);
97 return blocking_notifier_chain_unregister(&rfkill_notifier_list, nb);
98}
99EXPORT_SYMBOL_GPL(unregister_rfkill_notifier);
100
101 56
102static void rfkill_led_trigger(struct rfkill *rfkill, 57static void rfkill_led_trigger(struct rfkill *rfkill,
103 enum rfkill_state state) 58 enum rfkill_state state)
@@ -124,12 +79,9 @@ static void rfkill_led_trigger_activate(struct led_classdev *led)
124} 79}
125#endif /* CONFIG_RFKILL_LEDS */ 80#endif /* CONFIG_RFKILL_LEDS */
126 81
127static void notify_rfkill_state_change(struct rfkill *rfkill) 82static void rfkill_uevent(struct rfkill *rfkill)
128{ 83{
129 rfkill_led_trigger(rfkill, rfkill->state); 84 kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE);
130 blocking_notifier_call_chain(&rfkill_notifier_list,
131 RFKILL_STATE_CHANGED,
132 rfkill);
133} 85}
134 86
135static void update_rfkill_state(struct rfkill *rfkill) 87static void update_rfkill_state(struct rfkill *rfkill)
@@ -142,7 +94,7 @@ static void update_rfkill_state(struct rfkill *rfkill)
142 oldstate = rfkill->state; 94 oldstate = rfkill->state;
143 rfkill->state = newstate; 95 rfkill->state = newstate;
144 if (oldstate != newstate) 96 if (oldstate != newstate)
145 notify_rfkill_state_change(rfkill); 97 rfkill_uevent(rfkill);
146 } 98 }
147 mutex_unlock(&rfkill->mutex); 99 mutex_unlock(&rfkill->mutex);
148 } 100 }
@@ -220,7 +172,7 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
220 } 172 }
221 173
222 if (force || rfkill->state != oldstate) 174 if (force || rfkill->state != oldstate)
223 notify_rfkill_state_change(rfkill); 175 rfkill_uevent(rfkill);
224 176
225 return retval; 177 return retval;
226} 178}
@@ -405,7 +357,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state)
405 rfkill->state = state; 357 rfkill->state = state;
406 358
407 if (state != oldstate) 359 if (state != oldstate)
408 notify_rfkill_state_change(rfkill); 360 rfkill_uevent(rfkill);
409 361
410 mutex_unlock(&rfkill->mutex); 362 mutex_unlock(&rfkill->mutex);
411 363
@@ -618,28 +570,6 @@ static int rfkill_resume(struct device *dev)
618#define rfkill_resume NULL 570#define rfkill_resume NULL
619#endif 571#endif
620 572
621static int rfkill_blocking_uevent_notifier(struct notifier_block *nb,
622 unsigned long eventid,
623 void *data)
624{
625 struct rfkill *rfkill = (struct rfkill *)data;
626
627 switch (eventid) {
628 case RFKILL_STATE_CHANGED:
629 kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE);
630 break;
631 default:
632 break;
633 }
634
635 return NOTIFY_DONE;
636}
637
638static struct notifier_block rfkill_blocking_uevent_nb = {
639 .notifier_call = rfkill_blocking_uevent_notifier,
640 .priority = 0,
641};
642
643static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env) 573static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
644{ 574{
645 struct rfkill *rfkill = to_rfkill(dev); 575 struct rfkill *rfkill = to_rfkill(dev);
@@ -942,14 +872,11 @@ static int __init rfkill_init(void)
942 return error; 872 return error;
943 } 873 }
944 874
945 register_rfkill_notifier(&rfkill_blocking_uevent_nb);
946
947 return 0; 875 return 0;
948} 876}
949 877
950static void __exit rfkill_exit(void) 878static void __exit rfkill_exit(void)
951{ 879{
952 unregister_rfkill_notifier(&rfkill_blocking_uevent_nb);
953 class_unregister(&rfkill_class); 880 class_unregister(&rfkill_class);
954} 881}
955 882