rc80211_minstrel.h revision c8ca8c2f933a516b5f4586d7dc6055b72107f246
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
14/* scaled fraction values */
15#define MINSTREL_SCALE  16
16#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
17#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
18
19/*
20 * Perform EWMA (Exponentially Weighted Moving Average) calculation
21  */
22static inline int
23minstrel_ewma(int old, int new, int weight)
24{
25	return (new * (100 - weight) + old * weight) / 100;
26}
27
28
29struct minstrel_rate {
30	int bitrate;
31	int rix;
32
33	unsigned int perfect_tx_time;
34	unsigned int ack_time;
35
36	int sample_limit;
37	unsigned int retry_count;
38	unsigned int retry_count_cts;
39	unsigned int retry_count_rtscts;
40	unsigned int adjusted_retry_count;
41
42	u32 success;
43	u32 attempts;
44	u32 last_attempts;
45	u32 last_success;
46
47	/* parts per thousand */
48	u32 cur_prob;
49	u32 probability;
50
51	/* per-rate throughput */
52	u32 cur_tp;
53
54	u64 succ_hist;
55	u64 att_hist;
56};
57
58struct minstrel_sta_info {
59	unsigned long stats_update;
60	unsigned int sp_ack_dur;
61	unsigned int rate_avg;
62
63	unsigned int lowest_rix;
64
65	unsigned int max_tp_rate;
66	unsigned int max_tp_rate2;
67	unsigned int max_prob_rate;
68	unsigned int packet_count;
69	unsigned int sample_count;
70	int sample_deferred;
71
72	unsigned int sample_idx;
73	unsigned int sample_column;
74
75	int n_rates;
76	struct minstrel_rate *r;
77	bool prev_sample;
78
79	/* sampling table */
80	u8 *sample_table;
81
82#ifdef CONFIG_MAC80211_DEBUGFS
83	struct dentry *dbg_stats;
84#endif
85};
86
87struct minstrel_priv {
88	struct ieee80211_hw *hw;
89	bool has_mrr;
90	unsigned int cw_min;
91	unsigned int cw_max;
92	unsigned int max_retry;
93	unsigned int segment_size;
94	unsigned int update_interval;
95	unsigned int lookaround_rate;
96	unsigned int lookaround_rate_mrr;
97
98	u8 cck_rates[4];
99
100#ifdef CONFIG_MAC80211_DEBUGFS
101	/*
102	 * enable fixed rate processing per RC
103	 *   - write static index to debugfs:ieee80211/phyX/rc/fixed_rate_idx
104	 *   - write -1 to enable RC processing again
105	 *   - setting will be applied on next update
106	 */
107	u32 fixed_rate_idx;
108	struct dentry *dbg_fixed_rate;
109#endif
110
111};
112
113struct minstrel_debugfs_info {
114	size_t len;
115	char buf[];
116};
117
118extern struct rate_control_ops mac80211_minstrel;
119void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
120void minstrel_remove_sta_debugfs(void *priv, void *priv_sta);
121
122/* debugfs */
123int minstrel_stats_open(struct inode *inode, struct file *file);
124ssize_t minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos);
125int minstrel_stats_release(struct inode *inode, struct file *file);
126
127#endif
128