led.c revision 5a0e3ad6af8660be21ca98a971cd00f331318c05
1f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc/*
2f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc * Copyright 2006, Johannes Berg <johannes@sipsolutions.net>
3f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc *
4f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc * This program is free software; you can redistribute it and/or modify
5f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc * it under the terms of the GNU General Public License version 2 as
6f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc * published by the Free Software Foundation.
7f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc */
8f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
9f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc/* just for IFNAMSIZ */
10f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc#include <linux/if.h>
115a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
122c8dccc77420fb7433da5674818959d3499d35beJohannes Berg#include "led.h"
13f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
14f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencvoid ieee80211_led_rx(struct ieee80211_local *local)
15f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
16f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (unlikely(!local->rx_led))
17f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		return;
18f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->rx_led_counter++ % 2 == 0)
19f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_event(local->rx_led, LED_OFF);
20f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	else
21f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_event(local->rx_led, LED_FULL);
22f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
23f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
24f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc/* q is 1 if a packet was enqueued, 0 if it has been transmitted */
25f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencvoid ieee80211_led_tx(struct ieee80211_local *local, int q)
26f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
27f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (unlikely(!local->tx_led))
28f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		return;
29f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	/* not sure how this is supposed to work ... */
30f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	local->tx_led_counter += 2*q-1;
31f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->tx_led_counter % 2 == 0)
32f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_event(local->tx_led, LED_OFF);
33f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	else
34f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_event(local->tx_led, LED_FULL);
35f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
36f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
3747f0c502209056da728e6a306a43d5e19a37f4faMichael Bueschvoid ieee80211_led_assoc(struct ieee80211_local *local, bool associated)
3847f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch{
3947f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (unlikely(!local->assoc_led))
4047f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		return;
4147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (associated)
4247f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		led_trigger_event(local->assoc_led, LED_FULL);
4347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	else
4447f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		led_trigger_event(local->assoc_led, LED_OFF);
4547f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch}
4647f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch
47cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doornvoid ieee80211_led_radio(struct ieee80211_local *local, bool enabled)
48cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn{
49cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	if (unlikely(!local->radio_led))
50cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		return;
51cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	if (enabled)
52cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		led_trigger_event(local->radio_led, LED_FULL);
53cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	else
54cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		led_trigger_event(local->radio_led, LED_OFF);
55cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn}
56cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn
57f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencvoid ieee80211_led_init(struct ieee80211_local *local)
58f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
59f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
6047f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (local->rx_led) {
6147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		snprintf(local->rx_led_name, sizeof(local->rx_led_name),
6247f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			 "%srx", wiphy_name(local->hw.wiphy));
6347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		local->rx_led->name = local->rx_led_name;
6447f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		if (led_trigger_register(local->rx_led)) {
6547f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			kfree(local->rx_led);
6647f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			local->rx_led = NULL;
6747f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		}
68f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	}
69f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
70f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
7147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (local->tx_led) {
7247f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		snprintf(local->tx_led_name, sizeof(local->tx_led_name),
7347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			 "%stx", wiphy_name(local->hw.wiphy));
7447f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		local->tx_led->name = local->tx_led_name;
7547f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		if (led_trigger_register(local->tx_led)) {
7647f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			kfree(local->tx_led);
7747f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			local->tx_led = NULL;
7847f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		}
7947f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	}
8047f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch
8147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	local->assoc_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
8247f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (local->assoc_led) {
8347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		snprintf(local->assoc_led_name, sizeof(local->assoc_led_name),
8447f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			 "%sassoc", wiphy_name(local->hw.wiphy));
8547f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		local->assoc_led->name = local->assoc_led_name;
8647f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		if (led_trigger_register(local->assoc_led)) {
8747f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			kfree(local->assoc_led);
8847f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch			local->assoc_led = NULL;
8947f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		}
90f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	}
91cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn
92cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	local->radio_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
93cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	if (local->radio_led) {
94cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		snprintf(local->radio_led_name, sizeof(local->radio_led_name),
95cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn			 "%sradio", wiphy_name(local->hw.wiphy));
96cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		local->radio_led->name = local->radio_led_name;
97cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		if (led_trigger_register(local->radio_led)) {
98cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn			kfree(local->radio_led);
99cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn			local->radio_led = NULL;
100cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		}
101cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	}
102f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
103f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
104f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencvoid ieee80211_led_exit(struct ieee80211_local *local)
105f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
106cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	if (local->radio_led) {
107cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		led_trigger_unregister(local->radio_led);
108cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		kfree(local->radio_led);
109cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	}
11047f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (local->assoc_led) {
11147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		led_trigger_unregister(local->assoc_led);
11247f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		kfree(local->assoc_led);
11347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	}
114f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->tx_led) {
115f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_unregister(local->tx_led);
116f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		kfree(local->tx_led);
117f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	}
118f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->rx_led) {
119f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		led_trigger_unregister(local->rx_led);
120f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		kfree(local->rx_led);
121f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	}
122f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
123f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
124cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doornchar *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
125cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn{
126cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	struct ieee80211_local *local = hw_to_local(hw);
127cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn
128cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	if (local->radio_led)
129cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn		return local->radio_led_name;
130cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn	return NULL;
131cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn}
132cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van DoornEXPORT_SYMBOL(__ieee80211_get_radio_led_name);
133cdcb006fbe7a74b5f7827f5c5c27e11399a2fab7Ivo van Doorn
13447f0c502209056da728e6a306a43d5e19a37f4faMichael Bueschchar *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)
13547f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch{
13647f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	struct ieee80211_local *local = hw_to_local(hw);
13747f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch
13847f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	if (local->assoc_led)
13947f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch		return local->assoc_led_name;
14047f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch	return NULL;
14147f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch}
14247f0c502209056da728e6a306a43d5e19a37f4faMichael BueschEXPORT_SYMBOL(__ieee80211_get_assoc_led_name);
14347f0c502209056da728e6a306a43d5e19a37f4faMichael Buesch
144f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencchar *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw)
145f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
146f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	struct ieee80211_local *local = hw_to_local(hw);
147f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
148f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->tx_led)
149f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		return local->tx_led_name;
150f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	return NULL;
151f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
152f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri BencEXPORT_SYMBOL(__ieee80211_get_tx_led_name);
153f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
154f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Bencchar *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw)
155f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc{
156f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	struct ieee80211_local *local = hw_to_local(hw);
157f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc
158f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	if (local->rx_led)
159f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc		return local->rx_led_name;
160f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc	return NULL;
161f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri Benc}
162f0706e828e96d0fa4e80c0d25aa98523f6d589a0Jiri BencEXPORT_SYMBOL(__ieee80211_get_rx_led_name);
163