mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
![Johannes Berg](/assets/img/avatar_default.png)
When LED triggers are compiled in, but not used, mac80211 will still call them to update the status. This isn't really a problem for the assoc and radio ones, but the TX/RX (and to a certain extend TPT) ones can be called very frequently (for every packet.) In order to avoid that when they're not used, track their activation and call the corresponding trigger (and in the TPT case, account for throughput) only when the trigger is actually used by an LED. Additionally, make those trigger functions inlines since theyre only used once in the remaining code. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
93 lines
2.6 KiB
C
93 lines
2.6 KiB
C
/*
|
|
* Copyright 2006, Johannes Berg <johannes@sipsolutions.net>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/leds.h>
|
|
#include "ieee80211_i.h"
|
|
|
|
#define MAC80211_BLINK_DELAY 50 /* ms */
|
|
|
|
static inline void ieee80211_led_rx(struct ieee80211_local *local)
|
|
{
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
unsigned long led_delay = MAC80211_BLINK_DELAY;
|
|
|
|
if (!atomic_read(&local->rx_led_active))
|
|
return;
|
|
led_trigger_blink_oneshot(&local->rx_led, &led_delay, &led_delay, 0);
|
|
#endif
|
|
}
|
|
|
|
static inline void ieee80211_led_tx(struct ieee80211_local *local)
|
|
{
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
unsigned long led_delay = MAC80211_BLINK_DELAY;
|
|
|
|
if (!atomic_read(&local->tx_led_active))
|
|
return;
|
|
led_trigger_blink_oneshot(&local->tx_led, &led_delay, &led_delay, 0);
|
|
#endif
|
|
}
|
|
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
void ieee80211_led_assoc(struct ieee80211_local *local,
|
|
bool associated);
|
|
void ieee80211_led_radio(struct ieee80211_local *local,
|
|
bool enabled);
|
|
void ieee80211_alloc_led_names(struct ieee80211_local *local);
|
|
void ieee80211_free_led_names(struct ieee80211_local *local);
|
|
void ieee80211_led_init(struct ieee80211_local *local);
|
|
void ieee80211_led_exit(struct ieee80211_local *local);
|
|
void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
|
|
unsigned int types_on, unsigned int types_off);
|
|
#else
|
|
static inline void ieee80211_led_assoc(struct ieee80211_local *local,
|
|
bool associated)
|
|
{
|
|
}
|
|
static inline void ieee80211_led_radio(struct ieee80211_local *local,
|
|
bool enabled)
|
|
{
|
|
}
|
|
static inline void ieee80211_alloc_led_names(struct ieee80211_local *local)
|
|
{
|
|
}
|
|
static inline void ieee80211_free_led_names(struct ieee80211_local *local)
|
|
{
|
|
}
|
|
static inline void ieee80211_led_init(struct ieee80211_local *local)
|
|
{
|
|
}
|
|
static inline void ieee80211_led_exit(struct ieee80211_local *local)
|
|
{
|
|
}
|
|
static inline void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
|
|
unsigned int types_on,
|
|
unsigned int types_off)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
static inline void
|
|
ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes)
|
|
{
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
if (ieee80211_is_data(fc) && atomic_read(&local->tpt_led_active))
|
|
local->tpt_led_trigger->tx_bytes += bytes;
|
|
#endif
|
|
}
|
|
|
|
static inline void
|
|
ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes)
|
|
{
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
if (ieee80211_is_data(fc) && atomic_read(&local->tpt_led_active))
|
|
local->tpt_led_trigger->rx_bytes += bytes;
|
|
#endif
|
|
}
|