Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec...
[linux-2.6] / net / mac80211 / led.c
1 /*
2  * Copyright 2006, Johannes Berg <johannes@sipsolutions.net>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 /* just for IFNAMSIZ */
10 #include <linux/if.h>
11 #include "led.h"
12
13 void ieee80211_led_rx(struct ieee80211_local *local)
14 {
15         if (unlikely(!local->rx_led))
16                 return;
17         if (local->rx_led_counter++ % 2 == 0)
18                 led_trigger_event(local->rx_led, LED_OFF);
19         else
20                 led_trigger_event(local->rx_led, LED_FULL);
21 }
22
23 /* q is 1 if a packet was enqueued, 0 if it has been transmitted */
24 void ieee80211_led_tx(struct ieee80211_local *local, int q)
25 {
26         if (unlikely(!local->tx_led))
27                 return;
28         /* not sure how this is supposed to work ... */
29         local->tx_led_counter += 2*q-1;
30         if (local->tx_led_counter % 2 == 0)
31                 led_trigger_event(local->tx_led, LED_OFF);
32         else
33                 led_trigger_event(local->tx_led, LED_FULL);
34 }
35
36 void ieee80211_led_assoc(struct ieee80211_local *local, bool associated)
37 {
38         if (unlikely(!local->assoc_led))
39                 return;
40         if (associated)
41                 led_trigger_event(local->assoc_led, LED_FULL);
42         else
43                 led_trigger_event(local->assoc_led, LED_OFF);
44 }
45
46 void ieee80211_led_radio(struct ieee80211_local *local, bool enabled)
47 {
48         if (unlikely(!local->radio_led))
49                 return;
50         if (enabled)
51                 led_trigger_event(local->radio_led, LED_FULL);
52         else
53                 led_trigger_event(local->radio_led, LED_OFF);
54 }
55
56 void ieee80211_led_init(struct ieee80211_local *local)
57 {
58         local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
59         if (local->rx_led) {
60                 snprintf(local->rx_led_name, sizeof(local->rx_led_name),
61                          "%srx", wiphy_name(local->hw.wiphy));
62                 local->rx_led->name = local->rx_led_name;
63                 if (led_trigger_register(local->rx_led)) {
64                         kfree(local->rx_led);
65                         local->rx_led = NULL;
66                 }
67         }
68
69         local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
70         if (local->tx_led) {
71                 snprintf(local->tx_led_name, sizeof(local->tx_led_name),
72                          "%stx", wiphy_name(local->hw.wiphy));
73                 local->tx_led->name = local->tx_led_name;
74                 if (led_trigger_register(local->tx_led)) {
75                         kfree(local->tx_led);
76                         local->tx_led = NULL;
77                 }
78         }
79
80         local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
81         if (local->assoc_led) {
82                 snprintf(local->assoc_led_name, sizeof(local->assoc_led_name),
83                          "%sassoc", wiphy_name(local->hw.wiphy));
84                 local->assoc_led->name = local->assoc_led_name;
85                 if (led_trigger_register(local->assoc_led)) {
86                         kfree(local->assoc_led);
87                         local->assoc_led = NULL;
88                 }
89         }
90
91         local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
92         if (local->radio_led) {
93                 snprintf(local->radio_led_name, sizeof(local->radio_led_name),
94                          "%sradio", wiphy_name(local->hw.wiphy));
95                 local->radio_led->name = local->radio_led_name;
96                 if (led_trigger_register(local->radio_led)) {
97                         kfree(local->radio_led);
98                         local->radio_led = NULL;
99                 }
100         }
101 }
102
103 void ieee80211_led_exit(struct ieee80211_local *local)
104 {
105         if (local->radio_led) {
106                 led_trigger_unregister(local->radio_led);
107                 kfree(local->radio_led);
108         }
109         if (local->assoc_led) {
110                 led_trigger_unregister(local->assoc_led);
111                 kfree(local->assoc_led);
112         }
113         if (local->tx_led) {
114                 led_trigger_unregister(local->tx_led);
115                 kfree(local->tx_led);
116         }
117         if (local->rx_led) {
118                 led_trigger_unregister(local->rx_led);
119                 kfree(local->rx_led);
120         }
121 }
122
123 char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
124 {
125         struct ieee80211_local *local = hw_to_local(hw);
126
127         if (local->radio_led)
128                 return local->radio_led_name;
129         return NULL;
130 }
131 EXPORT_SYMBOL(__ieee80211_get_radio_led_name);
132
133 char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
134 {
135         struct ieee80211_local *local = hw_to_local(hw);
136
137         if (local->assoc_led)
138                 return local->assoc_led_name;
139         return NULL;
140 }
141 EXPORT_SYMBOL(__ieee80211_get_assoc_led_name);
142
143 char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw)
144 {
145         struct ieee80211_local *local = hw_to_local(hw);
146
147         if (local->tx_led)
148                 return local->tx_led_name;
149         return NULL;
150 }
151 EXPORT_SYMBOL(__ieee80211_get_tx_led_name);
152
153 char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw)
154 {
155         struct ieee80211_local *local = hw_to_local(hw);
156
157         if (local->rx_led)
158                 return local->rx_led_name;
159         return NULL;
160 }
161 EXPORT_SYMBOL(__ieee80211_get_rx_led_name);