2008-10-05 20:07:45 +04:00
/*
* Copyright ( C ) 2008 Felix Fietkau < nbd @ openwrt . org >
*
* 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 .
*/
# ifndef __RC_MINSTREL_H
# define __RC_MINSTREL_H
2013-04-17 15:43:22 +04:00
# define EWMA_LEVEL 96 /* ewma weighting factor [/EWMA_DIV] */
# define EWMA_DIV 128
2013-03-05 02:30:05 +04:00
# define SAMPLE_COLUMNS 10 /* number of columns in sample table */
2013-03-05 02:30:01 +04:00
2013-03-05 02:30:02 +04:00
/* scaled fraction values */
# define MINSTREL_SCALE 16
# define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
# define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
2013-03-05 02:30:07 +04:00
/* number of highest throughput rates to consider*/
# define MAX_THR_RATES 4
2013-03-05 02:30:01 +04:00
/*
* Perform EWMA ( Exponentially Weighted Moving Average ) calculation
*/
static inline int
minstrel_ewma ( int old , int new , int weight )
{
2013-04-17 15:43:22 +04:00
return ( new * ( EWMA_DIV - weight ) + old * weight ) / EWMA_DIV ;
2013-03-05 02:30:01 +04:00
}
2008-10-05 20:07:45 +04:00
struct minstrel_rate {
int bitrate ;
int rix ;
unsigned int perfect_tx_time ;
unsigned int ack_time ;
2008-10-15 21:13:59 +04:00
int sample_limit ;
2008-10-05 20:07:45 +04:00
unsigned int retry_count ;
unsigned int retry_count_cts ;
unsigned int retry_count_rtscts ;
unsigned int adjusted_retry_count ;
u32 success ;
u32 attempts ;
u32 last_attempts ;
u32 last_success ;
2013-03-05 02:30:04 +04:00
u8 sample_skipped ;
2008-10-05 20:07:45 +04:00
/* parts per thousand */
u32 cur_prob ;
u32 probability ;
/* per-rate throughput */
u32 cur_tp ;
u64 succ_hist ;
u64 att_hist ;
} ;
struct minstrel_sta_info {
2013-04-22 18:14:43 +04:00
struct ieee80211_sta * sta ;
2008-10-05 20:07:45 +04:00
unsigned long stats_update ;
unsigned int sp_ack_dur ;
unsigned int rate_avg ;
unsigned int lowest_rix ;
2013-03-05 02:30:07 +04:00
u8 max_tp_rate [ MAX_THR_RATES ] ;
u8 max_prob_rate ;
2008-10-05 20:07:45 +04:00
unsigned int packet_count ;
unsigned int sample_count ;
int sample_deferred ;
2013-03-05 02:30:03 +04:00
unsigned int sample_row ;
2008-10-05 20:07:45 +04:00
unsigned int sample_column ;
int n_rates ;
struct minstrel_rate * r ;
2008-10-15 21:13:59 +04:00
bool prev_sample ;
2008-10-05 20:07:45 +04:00
/* sampling table */
u8 * sample_table ;
# ifdef CONFIG_MAC80211_DEBUGFS
struct dentry * dbg_stats ;
# endif
} ;
struct minstrel_priv {
struct ieee80211_hw * hw ;
bool has_mrr ;
unsigned int cw_min ;
unsigned int cw_max ;
unsigned int max_retry ;
unsigned int segment_size ;
unsigned int update_interval ;
unsigned int lookaround_rate ;
unsigned int lookaround_rate_mrr ;
2011-05-20 22:29:17 +04:00
2013-02-13 13:51:08 +04:00
u8 cck_rates [ 4 ] ;
2011-05-20 22:29:17 +04:00
# ifdef CONFIG_MAC80211_DEBUGFS
/*
* enable fixed rate processing per RC
* - write static index to debugfs : ieee80211 / phyX / rc / fixed_rate_idx
* - write - 1 to enable RC processing again
* - setting will be applied on next update
*/
u32 fixed_rate_idx ;
struct dentry * dbg_fixed_rate ;
# endif
2008-10-05 20:07:45 +04:00
} ;
2010-03-02 00:17:38 +03:00
struct minstrel_debugfs_info {
size_t len ;
char buf [ ] ;
} ;
2014-01-21 02:29:34 +04:00
extern const struct rate_control_ops mac80211_minstrel ;
2008-10-05 20:07:45 +04:00
void minstrel_add_sta_debugfs ( void * priv , void * priv_sta , struct dentry * dir ) ;
void minstrel_remove_sta_debugfs ( void * priv , void * priv_sta ) ;
2010-03-02 00:21:40 +03:00
/* debugfs */
int minstrel_stats_open ( struct inode * inode , struct file * file ) ;
ssize_t minstrel_stats_read ( struct file * file , char __user * buf , size_t len , loff_t * ppos ) ;
int minstrel_stats_release ( struct inode * inode , struct file * file ) ;
2008-10-05 20:07:45 +04:00
# endif