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 "ieee80211_led.h"
12
13void 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 */
24void 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
36void ieee80211_led_init(struct ieee80211_local *local)
37{
38	local->rx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
39	if (!local->rx_led)
40		return;
41	snprintf(local->rx_led_name, sizeof(local->rx_led_name),
42		 "%srx", wiphy_name(local->hw.wiphy));
43	local->rx_led->name = local->rx_led_name;
44	if (led_trigger_register(local->rx_led)) {
45		kfree(local->rx_led);
46		local->rx_led = NULL;
47	}
48
49	local->tx_led = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
50	if (!local->tx_led)
51		return;
52	snprintf(local->tx_led_name, sizeof(local->tx_led_name),
53		 "%stx", wiphy_name(local->hw.wiphy));
54	local->tx_led->name = local->tx_led_name;
55	if (led_trigger_register(local->tx_led)) {
56		kfree(local->tx_led);
57		local->tx_led = NULL;
58	}
59}
60
61void ieee80211_led_exit(struct ieee80211_local *local)
62{
63	if (local->tx_led) {
64		led_trigger_unregister(local->tx_led);
65		kfree(local->tx_led);
66	}
67	if (local->rx_led) {
68		led_trigger_unregister(local->rx_led);
69		kfree(local->rx_led);
70	}
71}
72
73char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw)
74{
75	struct ieee80211_local *local = hw_to_local(hw);
76
77	if (local->tx_led)
78		return local->tx_led_name;
79	return NULL;
80}
81EXPORT_SYMBOL(__ieee80211_get_tx_led_name);
82
83char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw)
84{
85	struct ieee80211_local *local = hw_to_local(hw);
86
87	if (local->rx_led)
88		return local->rx_led_name;
89	return NULL;
90}
91EXPORT_SYMBOL(__ieee80211_get_rx_led_name);
92