ath5k: Use generic EWMA library
Remove ath5k's private moving average implementation in favour of the generic library version. Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
c5485a7e75
commit
eef39befaa
@@ -4,6 +4,7 @@ config ATH5K
|
|||||||
select MAC80211_LEDS
|
select MAC80211_LEDS
|
||||||
select LEDS_CLASS
|
select LEDS_CLASS
|
||||||
select NEW_LEDS
|
select NEW_LEDS
|
||||||
|
select AVERAGE
|
||||||
---help---
|
---help---
|
||||||
This module adds support for wireless adapters based on
|
This module adds support for wireless adapters based on
|
||||||
Atheros 5xxx chipset.
|
Atheros 5xxx chipset.
|
||||||
|
@@ -216,7 +216,7 @@ static void
|
|||||||
ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
|
ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
|
||||||
bool ofdm_trigger)
|
bool ofdm_trigger)
|
||||||
{
|
{
|
||||||
int rssi = ah->ah_beacon_rssi_avg.avg;
|
int rssi = ewma_read(&ah->ah_beacon_rssi_avg);
|
||||||
|
|
||||||
ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_ANI, "raise immunity (%s)",
|
ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_ANI, "raise immunity (%s)",
|
||||||
ofdm_trigger ? "ODFM" : "CCK");
|
ofdm_trigger ? "ODFM" : "CCK");
|
||||||
@@ -301,7 +301,7 @@ ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
|
|||||||
static void
|
static void
|
||||||
ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as)
|
ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as)
|
||||||
{
|
{
|
||||||
int rssi = ah->ah_beacon_rssi_avg.avg;
|
int rssi = ewma_read(&ah->ah_beacon_rssi_avg);
|
||||||
|
|
||||||
ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_ANI, "lower immunity");
|
ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_ANI, "lower immunity");
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <linux/average.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
||||||
/* RX/TX descriptor hw structs
|
/* RX/TX descriptor hw structs
|
||||||
@@ -1102,7 +1103,7 @@ struct ath5k_hw {
|
|||||||
struct ath5k_nfcal_hist ah_nfcal_hist;
|
struct ath5k_nfcal_hist ah_nfcal_hist;
|
||||||
|
|
||||||
/* average beacon RSSI in our BSS (used by ANI) */
|
/* average beacon RSSI in our BSS (used by ANI) */
|
||||||
struct ath5k_avg_val ah_beacon_rssi_avg;
|
struct ewma ah_beacon_rssi_avg;
|
||||||
|
|
||||||
/* noise floor from last periodic calibration */
|
/* noise floor from last periodic calibration */
|
||||||
s32 ah_noise_floor;
|
s32 ah_noise_floor;
|
||||||
@@ -1315,27 +1316,4 @@ static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AVG_SAMPLES 8
|
|
||||||
#define AVG_FACTOR 1000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ath5k_moving_average - Exponentially weighted moving average
|
|
||||||
* @avg: average structure
|
|
||||||
* @val: current value
|
|
||||||
*
|
|
||||||
* This implementation make use of a struct ath5k_avg_val to prevent rounding
|
|
||||||
* errors.
|
|
||||||
*/
|
|
||||||
static inline struct ath5k_avg_val
|
|
||||||
ath5k_moving_average(const struct ath5k_avg_val avg, const int val)
|
|
||||||
{
|
|
||||||
struct ath5k_avg_val new;
|
|
||||||
new.avg_weight = avg.avg_weight ?
|
|
||||||
(((avg.avg_weight * ((AVG_SAMPLES) - 1)) +
|
|
||||||
(val * (AVG_FACTOR))) / (AVG_SAMPLES)) :
|
|
||||||
(val * (AVG_FACTOR));
|
|
||||||
new.avg = new.avg_weight / (AVG_FACTOR);
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1301,8 +1301,7 @@ ath5k_update_beacon_rssi(struct ath5k_softc *sc, struct sk_buff *skb, int rssi)
|
|||||||
memcmp(mgmt->bssid, common->curbssid, ETH_ALEN) != 0)
|
memcmp(mgmt->bssid, common->curbssid, ETH_ALEN) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ah->ah_beacon_rssi_avg = ath5k_moving_average(ah->ah_beacon_rssi_avg,
|
ewma_add(&ah->ah_beacon_rssi_avg, rssi);
|
||||||
rssi);
|
|
||||||
|
|
||||||
/* in IBSS mode we should keep RSSI statistics per neighbour */
|
/* in IBSS mode we should keep RSSI statistics per neighbour */
|
||||||
/* le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS */
|
/* le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS */
|
||||||
@@ -2556,6 +2555,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan)
|
|||||||
ah->ah_cal_next_full = jiffies;
|
ah->ah_cal_next_full = jiffies;
|
||||||
ah->ah_cal_next_ani = jiffies;
|
ah->ah_cal_next_ani = jiffies;
|
||||||
ah->ah_cal_next_nf = jiffies;
|
ah->ah_cal_next_nf = jiffies;
|
||||||
|
ewma_init(&ah->ah_beacon_rssi_avg, 1000, 8);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Change channels and update the h/w rate map if we're switching;
|
* Change channels and update the h/w rate map if we're switching;
|
||||||
|
@@ -719,7 +719,7 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf,
|
|||||||
st->mib_intr);
|
st->mib_intr);
|
||||||
len += snprintf(buf+len, sizeof(buf)-len,
|
len += snprintf(buf+len, sizeof(buf)-len,
|
||||||
"beacon RSSI average:\t%d\n",
|
"beacon RSSI average:\t%d\n",
|
||||||
sc->ah->ah_beacon_rssi_avg.avg);
|
(int)ewma_read(&sc->ah->ah_beacon_rssi_avg));
|
||||||
|
|
||||||
#define CC_PRINT(_struct, _field) \
|
#define CC_PRINT(_struct, _field) \
|
||||||
_struct._field, \
|
_struct._field, \
|
||||||
|
Reference in New Issue
Block a user