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); 162