aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2007-09-27 09:10:44 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:54:20 -0400
commit47f0c502209056da728e6a306a43d5e19a37f4fa (patch)
treedb62b1f47c0c37f8c5e7943a1410737721803614
parentddd3d2be85e3207c47f2b3c431723e6c758b4b0d (diff)
[MAC80211]: Add association LED trigger
Many devices have LEDs to indicate the link status. Export this functionality to drivers. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/mac80211.h11
-rw-r--r--net/mac80211/ieee80211_i.h4
-rw-r--r--net/mac80211/ieee80211_led.c67
-rw-r--r--net/mac80211/ieee80211_led.h6
-rw-r--r--net/mac80211/ieee80211_sta.c5
5 files changed, 74 insertions, 19 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 1a2114b8d221..eac670a22ef4 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1069,6 +1069,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw);
1069#ifdef CONFIG_MAC80211_LEDS 1069#ifdef CONFIG_MAC80211_LEDS
1070extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw); 1070extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
1071extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw); 1071extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
1072extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
1072#endif 1073#endif
1073/** 1074/**
1074 * ieee80211_get_tx_led_name - get name of TX LED 1075 * ieee80211_get_tx_led_name - get name of TX LED
@@ -1108,6 +1109,16 @@ static inline char *ieee80211_get_rx_led_name(struct ieee80211_hw *hw)
1108#endif 1109#endif
1109} 1110}
1110 1111
1112static inline char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
1113{
1114#ifdef CONFIG_MAC80211_LEDS
1115 return __ieee80211_get_assoc_led_name(hw);
1116#else
1117 return NULL;
1118#endif
1119}
1120
1121
1111/* Register a new hardware PHYMODE capability to the stack. */ 1122/* Register a new hardware PHYMODE capability to the stack. */
1112int ieee80211_register_hwmode(struct ieee80211_hw *hw, 1123int ieee80211_register_hwmode(struct ieee80211_hw *hw,
1113 struct ieee80211_hw_mode *mode); 1124 struct ieee80211_hw_mode *mode);
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index db80e1be1dcb..d34a9deca67a 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -503,8 +503,8 @@ struct ieee80211_local {
503 503
504#ifdef CONFIG_MAC80211_LEDS 504#ifdef CONFIG_MAC80211_LEDS
505 int tx_led_counter, rx_led_counter; 505 int tx_led_counter, rx_led_counter;
506 struct led_trigger *tx_led, *rx_led; 506 struct led_trigger *tx_led, *rx_led, *assoc_led;
507 char tx_led_name[32], rx_led_name[32]; 507 char tx_led_name[32], rx_led_name[32], assoc_led_name[32];
508#endif 508#endif
509 509
510 u32 channel_use; 510 u32 channel_use;
diff --git a/net/mac80211/ieee80211_led.c b/net/mac80211/ieee80211_led.c
index 719d75b20707..4cf89af9d100 100644
--- a/net/mac80211/ieee80211_led.c
+++ b/net/mac80211/ieee80211_led.c
@@ -33,33 +33,58 @@ void ieee80211_led_tx(struct ieee80211_local *local, int q)
33 led_trigger_event(local->tx_led, LED_FULL); 33 led_trigger_event(local->tx_led, LED_FULL);
34} 34}
35 35
36void 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
36void ieee80211_led_init(struct ieee80211_local *local) 46void ieee80211_led_init(struct ieee80211_local *local)
37{ 47{
38 local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); 48 local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
39 if (!local->rx_led) 49 if (local->rx_led) {
40 return; 50 snprintf(local->rx_led_name, sizeof(local->rx_led_name),
41 snprintf(local->rx_led_name, sizeof(local->rx_led_name), 51 "%srx", wiphy_name(local->hw.wiphy));
42 "%srx", wiphy_name(local->hw.wiphy)); 52 local->rx_led->name = local->rx_led_name;
43 local->rx_led->name = local->rx_led_name; 53 if (led_trigger_register(local->rx_led)) {
44 if (led_trigger_register(local->rx_led)) { 54 kfree(local->rx_led);
45 kfree(local->rx_led); 55 local->rx_led = NULL;
46 local->rx_led = NULL; 56 }
47 } 57 }
48 58
49 local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); 59 local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
50 if (!local->tx_led) 60 if (local->tx_led) {
51 return; 61 snprintf(local->tx_led_name, sizeof(local->tx_led_name),
52 snprintf(local->tx_led_name, sizeof(local->tx_led_name), 62 "%stx", wiphy_name(local->hw.wiphy));
53 "%stx", wiphy_name(local->hw.wiphy)); 63 local->tx_led->name = local->tx_led_name;
54 local->tx_led->name = local->tx_led_name; 64 if (led_trigger_register(local->tx_led)) {
55 if (led_trigger_register(local->tx_led)) { 65 kfree(local->tx_led);
56 kfree(local->tx_led); 66 local->tx_led = NULL;
57 local->tx_led = NULL; 67 }
68 }
69
70 local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
71 if (local->assoc_led) {
72 snprintf(local->assoc_led_name, sizeof(local->assoc_led_name),
73 "%sassoc", wiphy_name(local->hw.wiphy));
74 local->assoc_led->name = local->assoc_led_name;
75 if (led_trigger_register(local->assoc_led)) {
76 kfree(local->assoc_led);
77 local->assoc_led = NULL;
78 }
58 } 79 }
59} 80}
60 81
61void ieee80211_led_exit(struct ieee80211_local *local) 82void ieee80211_led_exit(struct ieee80211_local *local)
62{ 83{
84 if (local->assoc_led) {
85 led_trigger_unregister(local->assoc_led);
86 kfree(local->assoc_led);
87 }
63 if (local->tx_led) { 88 if (local->tx_led) {
64 led_trigger_unregister(local->tx_led); 89 led_trigger_unregister(local->tx_led);
65 kfree(local->tx_led); 90 kfree(local->tx_led);
@@ -70,6 +95,16 @@ void ieee80211_led_exit(struct ieee80211_local *local)
70 } 95 }
71} 96}
72 97
98char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
99{
100 struct ieee80211_local *local = hw_to_local(hw);
101
102 if (local->assoc_led)
103 return local->assoc_led_name;
104 return NULL;
105}
106EXPORT_SYMBOL(__ieee80211_get_assoc_led_name);
107
73char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw) 108char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw)
74{ 109{
75 struct ieee80211_local *local = hw_to_local(hw); 110 struct ieee80211_local *local = hw_to_local(hw);
diff --git a/net/mac80211/ieee80211_led.h b/net/mac80211/ieee80211_led.h
index 5c8ab8263878..0feb22619835 100644
--- a/net/mac80211/ieee80211_led.h
+++ b/net/mac80211/ieee80211_led.h
@@ -14,6 +14,8 @@
14#ifdef CONFIG_MAC80211_LEDS 14#ifdef CONFIG_MAC80211_LEDS
15extern void ieee80211_led_rx(struct ieee80211_local *local); 15extern void ieee80211_led_rx(struct ieee80211_local *local);
16extern void ieee80211_led_tx(struct ieee80211_local *local, int q); 16extern void ieee80211_led_tx(struct ieee80211_local *local, int q);
17extern void ieee80211_led_assoc(struct ieee80211_local *local,
18 bool associated);
17extern void ieee80211_led_init(struct ieee80211_local *local); 19extern void ieee80211_led_init(struct ieee80211_local *local);
18extern void ieee80211_led_exit(struct ieee80211_local *local); 20extern void ieee80211_led_exit(struct ieee80211_local *local);
19#else 21#else
@@ -23,6 +25,10 @@ static inline void ieee80211_led_rx(struct ieee80211_local *local)
23static inline void ieee80211_led_tx(struct ieee80211_local *local, int q) 25static inline void ieee80211_led_tx(struct ieee80211_local *local, int q)
24{ 26{
25} 27}
28static inline void ieee80211_led_assoc(struct ieee80211_local *local,
29 bool associated)
30{
31}
26static inline void ieee80211_led_init(struct ieee80211_local *local) 32static inline void ieee80211_led_init(struct ieee80211_local *local)
27{ 33{
28} 34}
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index bd9d7aa74083..1641e8fe44b7 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -31,6 +31,7 @@
31#include <net/mac80211.h> 31#include <net/mac80211.h>
32#include "ieee80211_i.h" 32#include "ieee80211_i.h"
33#include "ieee80211_rate.h" 33#include "ieee80211_rate.h"
34#include "ieee80211_led.h"
34 35
35#define IEEE80211_AUTH_TIMEOUT (HZ / 5) 36#define IEEE80211_AUTH_TIMEOUT (HZ / 5)
36#define IEEE80211_AUTH_MAX_TRIES 3 37#define IEEE80211_AUTH_MAX_TRIES 3
@@ -408,8 +409,9 @@ static void ieee80211_sta_send_associnfo(struct net_device *dev,
408 409
409static void ieee80211_set_associated(struct net_device *dev, 410static void ieee80211_set_associated(struct net_device *dev,
410 struct ieee80211_if_sta *ifsta, 411 struct ieee80211_if_sta *ifsta,
411 unsigned int assoc) 412 bool assoc)
412{ 413{
414 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
413 union iwreq_data wrqu; 415 union iwreq_data wrqu;
414 416
415 if (!!(ifsta->flags & IEEE80211_STA_ASSOCIATED) == assoc) 417 if (!!(ifsta->flags & IEEE80211_STA_ASSOCIATED) == assoc)
@@ -447,6 +449,7 @@ static void ieee80211_set_associated(struct net_device *dev,
447 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 449 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
448 wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); 450 wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
449 ifsta->last_probe = jiffies; 451 ifsta->last_probe = jiffies;
452 ieee80211_led_assoc(local, assoc);
450} 453}
451 454
452static void ieee80211_set_disassoc(struct net_device *dev, 455static void ieee80211_set_disassoc(struct net_device *dev,