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