Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eef39bef authored by Bruno Randolf's avatar Bruno Randolf Committed by John W. Linville
Browse files

ath5k: Use generic EWMA library



Remove ath5k's private moving average implementation in favour of the generic
library version.

Signed-off-by: default avatarBruno Randolf <br1@einfach.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c5485a7e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ config ATH5K
	select MAC80211_LEDS
	select LEDS_CLASS
	select NEW_LEDS
	select AVERAGE
	---help---
	  This module adds support for wireless adapters based on
	  Atheros 5xxx chipset.
+2 −2
Original line number Diff line number Diff line
@@ -216,7 +216,7 @@ static void
ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
			 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)",
		ofdm_trigger ? "ODFM" : "CCK");
@@ -301,7 +301,7 @@ ath5k_ani_raise_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as,
static void
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");

+2 −24
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

#include <linux/io.h>
#include <linux/types.h>
#include <linux/average.h>
#include <net/mac80211.h>

/* RX/TX descriptor hw structs
@@ -1102,7 +1103,7 @@ struct ath5k_hw {
	struct ath5k_nfcal_hist ah_nfcal_hist;

	/* 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 */
	s32			ah_noise_floor;
@@ -1315,27 +1316,4 @@ static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits)
	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
+2 −2
Original line number Diff line number Diff line
@@ -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)
		return;

	ah->ah_beacon_rssi_avg = ath5k_moving_average(ah->ah_beacon_rssi_avg,
						      rssi);
	ewma_add(&ah->ah_beacon_rssi_avg, rssi);

	/* in IBSS mode we should keep RSSI statistics per neighbour */
	/* 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_ani = 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;
+1 −1
Original line number Diff line number Diff line
@@ -719,7 +719,7 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf,
			st->mib_intr);
	len += snprintf(buf+len, sizeof(buf)-len,
			"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) \
	_struct._field, \