rc80211_minstrel.h revision f744bf81f7501d03f45ba23f9cf947abc3b422c9
1/* 2 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9#ifndef __RC_MINSTREL_H 10#define __RC_MINSTREL_H 11 12#define EWMA_LEVEL 75 /* ewma weighting factor [%] */ 13#define SAMPLE_COLUMNS 10 /* number of columns in sample table */ 14 15 16/* scaled fraction values */ 17#define MINSTREL_SCALE 16 18#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div) 19#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE) 20 21/* 22 * Perform EWMA (Exponentially Weighted Moving Average) calculation 23 */ 24static inline int 25minstrel_ewma(int old, int new, int weight) 26{ 27 return (new * (100 - weight) + old * weight) / 100; 28} 29 30 31struct minstrel_rate { 32 int bitrate; 33 int rix; 34 35 unsigned int perfect_tx_time; 36 unsigned int ack_time; 37 38 int sample_limit; 39 unsigned int retry_count; 40 unsigned int retry_count_cts; 41 unsigned int retry_count_rtscts; 42 unsigned int adjusted_retry_count; 43 44 u32 success; 45 u32 attempts; 46 u32 last_attempts; 47 u32 last_success; 48 u8 sample_skipped; 49 50 /* parts per thousand */ 51 u32 cur_prob; 52 u32 probability; 53 54 /* per-rate throughput */ 55 u32 cur_tp; 56 57 u64 succ_hist; 58 u64 att_hist; 59}; 60 61struct minstrel_sta_info { 62 unsigned long stats_update; 63 unsigned int sp_ack_dur; 64 unsigned int rate_avg; 65 66 unsigned int lowest_rix; 67 68 unsigned int max_tp_rate; 69 unsigned int max_tp_rate2; 70 unsigned int max_prob_rate; 71 unsigned int packet_count; 72 unsigned int sample_count; 73 int sample_deferred; 74 75 unsigned int sample_row; 76 unsigned int sample_column; 77 78 int n_rates; 79 struct minstrel_rate *r; 80 bool prev_sample; 81 82 /* sampling table */ 83 u8 *sample_table; 84 85#ifdef CONFIG_MAC80211_DEBUGFS 86 struct dentry *dbg_stats; 87#endif 88}; 89 90struct minstrel_priv { 91 struct ieee80211_hw *hw; 92 bool has_mrr; 93 unsigned int cw_min; 94 unsigned int cw_max; 95 unsigned int max_retry; 96 unsigned int segment_size; 97 unsigned int update_interval; 98 unsigned int lookaround_rate; 99 unsigned int lookaround_rate_mrr; 100 101 u8 cck_rates[4]; 102 103#ifdef CONFIG_MAC80211_DEBUGFS 104 /* 105 * enable fixed rate processing per RC 106 * - write static index to debugfs:ieee80211/phyX/rc/fixed_rate_idx 107 * - write -1 to enable RC processing again 108 * - setting will be applied on next update 109 */ 110 u32 fixed_rate_idx; 111 struct dentry *dbg_fixed_rate; 112#endif 113 114}; 115 116struct minstrel_debugfs_info { 117 size_t len; 118 char buf[]; 119}; 120 121extern struct rate_control_ops mac80211_minstrel; 122void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); 123void minstrel_remove_sta_debugfs(void *priv, void *priv_sta); 124 125/* debugfs */ 126int minstrel_stats_open(struct inode *inode, struct file *file); 127ssize_t minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos); 128int minstrel_stats_release(struct inode *inode, struct file *file); 129 130#endif 131