]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
mac80211: merge EWMA calculation of minstrel_ht and minstrel
authorThomas Huehn <thomas@net.t-labs.tu-berlin.de>
Mon, 4 Mar 2013 22:30:01 +0000 (23:30 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 6 Mar 2013 15:36:06 +0000 (16:36 +0100)
Both rate control algorithms (minstrel and minstrel_ht) calculate
averages based on EWMA. Shift function minstrel_ewma() into
rc80211_minstrel.h and make use of it in both minstrel version.
Also shift the default EWMA level (75%) definition to the header file
and clean up variable usage.

Acked-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Thomas Huehn <thomas@net.t-labs.tu-berlin.de>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rc80211_minstrel.c
net/mac80211/rc80211_minstrel.h
net/mac80211/rc80211_minstrel_ht.c

index eea45a2c7c35aee3bf4a30ed809f9504cb82a547..d78f629179c7e2168625310d02d965a82d49c917 100644 (file)
@@ -76,7 +76,6 @@ minstrel_update_stats(struct minstrel_priv *mp, struct minstrel_sta_info *mi)
        u32 max_tp = 0, index_max_tp = 0, index_max_tp2 = 0;
        u32 max_prob = 0, index_max_prob = 0;
        u32 usecs;
-       u32 p;
        int i;
 
        mi->stats_update = jiffies;
@@ -90,14 +89,13 @@ minstrel_update_stats(struct minstrel_priv *mp, struct minstrel_sta_info *mi)
                /* To avoid rounding issues, probabilities scale from 0 (0%)
                 * to 18000 (100%) */
                if (mr->attempts) {
-                       p = (mr->success * 18000) / mr->attempts;
+                       mr->cur_prob = (mr->success * 18000) / mr->attempts;
                        mr->succ_hist += mr->success;
                        mr->att_hist += mr->attempts;
-                       mr->cur_prob = p;
-                       p = ((p * (100 - mp->ewma_level)) + (mr->probability *
-                               mp->ewma_level)) / 100;
-                       mr->probability = p;
-                       mr->cur_tp = p * (1000000 / usecs);
+                       mr->probability = minstrel_ewma(mr->probability,
+                                                       mr->cur_prob,
+                                                       EWMA_LEVEL);
+                       mr->cur_tp = mr->probability * (1000000 / usecs);
                }
 
                mr->last_success = mr->success;
@@ -542,9 +540,6 @@ minstrel_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
        mp->lookaround_rate = 5;
        mp->lookaround_rate_mrr = 10;
 
-       /* moving average weight for EWMA */
-       mp->ewma_level = 75;
-
        /* maximum time that the hw is allowed to stay in one MRR segment */
        mp->segment_size = 6000;
 
index 5ecf757817f289f76eee112093fae345c7f4cc0f..98db93f96addb3a7b1761f742e8eec6e7c54e45b 100644 (file)
@@ -9,6 +9,18 @@
 #ifndef __RC_MINSTREL_H
 #define __RC_MINSTREL_H
 
+#define EWMA_LEVEL 75  /* ewma weighting factor [%] */
+
+/*
+ * Perform EWMA (Exponentially Weighted Moving Average) calculation
+  */
+static inline int
+minstrel_ewma(int old, int new, int weight)
+{
+       return (new * (100 - weight) + old * weight) / 100;
+}
+
+
 struct minstrel_rate {
        int bitrate;
        int rix;
@@ -73,7 +85,6 @@ struct minstrel_priv {
        unsigned int cw_min;
        unsigned int cw_max;
        unsigned int max_retry;
-       unsigned int ewma_level;
        unsigned int segment_size;
        unsigned int update_interval;
        unsigned int lookaround_rate;
index aa59539e5b27ddd9af414e8794119c1dd534154a..3009e457e7587c57373dbfda067735307b07f6b7 100644 (file)
@@ -18,7 +18,6 @@
 
 #define AVG_PKT_SIZE   1200
 #define SAMPLE_COLUMNS 10
-#define EWMA_LEVEL             75
 
 /* Number of bits for an average sized packet */
 #define MCS_NBITS (AVG_PKT_SIZE << 3)
@@ -128,15 +127,6 @@ const struct mcs_group minstrel_mcs_groups[] = {
 
 static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES];
 
-/*
- * Perform EWMA (Exponentially Weighted Moving Average) calculation
- */
-static int
-minstrel_ewma(int old, int new, int weight)
-{
-       return (new * (100 - weight) + old * weight) / 100;
-}
-
 /*
  * Look up an MCS group index based on mac80211 rate information
  */