On 2015-02-13 15:57, Thomas Huehn wrote:
> This patch moves Minstrels and Minstrel-HTs per-rate throughput
> calculation (EWMA(thr)) into a dedicated function to be called.
> Therefore the variable "unsigned int cur_tp" within struct
> "minstrel_rate_stats" becomes obsolete.  and is removed to free
> up its space.
> 
> Signed-off-by: Thomas Huehn <[email protected]>
> ---
>  net/mac80211/rc80211_minstrel.c            | 46 +++++++++++------
>  net/mac80211/rc80211_minstrel.h            |  4 +-
>  net/mac80211/rc80211_minstrel_debugfs.c    | 12 ++---
>  net/mac80211/rc80211_minstrel_ht.c         | 79 
> ++++++++++++++++++------------
>  net/mac80211/rc80211_minstrel_ht.h         |  1 +
>  net/mac80211/rc80211_minstrel_ht_debugfs.c | 12 ++---
>  6 files changed, 94 insertions(+), 60 deletions(-)
> 
> diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
> index 89db6cf..28de2f7a 100644
> --- a/net/mac80211/rc80211_minstrel.c
> +++ b/net/mac80211/rc80211_minstrel.c
> @@ -69,13 +69,34 @@ rix_to_ndx(struct minstrel_sta_info *mi, int rix)
>       return i;
>  }
>  
> +/* return current EMWA throughput */
> +int minstrel_get_tp_avg(struct minstrel_rate *mr)
> +{
> +     int tp_avg, usecs;
> +
> +     usecs = mr->perfect_tx_time;
> +     if (!usecs)
> +             usecs = 1000000;
> +
> +     /* reset thr. below 10% success */
> +     if (mr->stats.prob_ewma < MINSTREL_FRAC(10, 100))
> +             tp_avg = 0;
You don't really need a variable, you can just do return 0 here and
reduce indentation of the line below.

> +     else
> +             tp_avg = MINSTREL_TRUNC(mr->stats.prob_ewma * (100000 / usecs));
> +
> +     return tp_avg;
> +}
> +
> +
> +
>  /* find & sort topmost throughput rates */
>  static inline void
>  minstrel_sort_best_tp_rates(struct minstrel_sta_info *mi, int i, u8 *tp_list)
>  {
>       int j = MAX_THR_RATES;
>  
> -     while (j > 0 && mi->r[i].stats.cur_tp > mi->r[tp_list[j - 
> 1]].stats.cur_tp)
> +     while (j > 0 && (minstrel_get_tp_avg(&mi->r[i]) >
> +                             minstrel_get_tp_avg(&mi->r[tp_list[j - 1]])))
Indentation seems off.

>               j--;
>       if (j < MAX_THR_RATES - 1)
>               memmove(&tp_list[j + 1], &tp_list[j], MAX_THR_RATES - (j + 1));
> @@ -158,8 +179,7 @@ minstrel_update_stats(struct minstrel_priv *mp, struct 
> minstrel_sta_info *mi)
>  {
>       u8 tmp_tp_rate[MAX_THR_RATES];
>       u8 tmp_prob_rate = 0;
> -     u32 usecs;
> -     int i;
> +     int i, tmp_cur_tp, tmp_prob_tp;
>  
>       for (i = 0; i < MAX_THR_RATES; i++)
>           tmp_tp_rate[i] = 0;
> diff --git a/net/mac80211/rc80211_minstrel_ht.c 
> b/net/mac80211/rc80211_minstrel_ht.c
> index 6b07686..2a55f63 100644
> --- a/net/mac80211/rc80211_minstrel_ht.c
> +++ b/net/mac80211/rc80211_minstrel_ht.c
> @@ -312,23 +312,23 @@ minstrel_get_ratestats(struct minstrel_ht_sta *mi, int 
> index)
>  }
>  
>  /*
> - * Calculate throughput based on the average A-MPDU length, taking into 
> account
> - * the expected number of retransmissions and their expected length
> + * Return current throughput based on the average A-MPDU length, taking into
> + * account the expected number of retransmissions and their expected length
>   */
> -static void
> -minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int group, int rate)
> +int
> +minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate)
>  {
>       struct minstrel_rate_stats *mrs;
>       unsigned int nsecs = 0;
> -     unsigned int tmp_prob_ewma;
> +     unsigned int tmp_prob_ewma, tp_avg;
>  
>       mrs = &mi->groups[group].rates[rate];
>       tmp_prob_ewma = mrs->prob_ewma;
>  
>       /* do not account throughput if sucess prob is below 10% */
>       if (mrs->prob_ewma < MINSTREL_FRAC(10, 100)) {
> -             mrs->cur_tp = 0;
> -             return;
> +             tp_avg = 0;
> +             return tp_avg;
No need for the tp_avg variable.

>       }
>  
>       /*
> @@ -344,7 +344,9 @@ minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int 
> group, int rate)
>       nsecs += minstrel_mcs_groups[group].duration[rate];
>  
>       /* prob is scaled - see MINSTREL_FRAC above */
> -     mrs->cur_tp = MINSTREL_TRUNC(1000000 * ((tmp_prob_ewma * 1000) / 
> nsecs));
> +     tp_avg = MINSTREL_TRUNC(100000 * ((tmp_prob_ewma * 1000) / nsecs));
> +
> +     return tp_avg;
>  }
>  
>  /*
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to