Linux Audio

Check our new training course

Loading...
v5.9
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2010 Felix Fietkau <nbd@openwrt.org>
 
 
 
 
  4 */
  5
  6#ifndef __RC_MINSTREL_HT_H
  7#define __RC_MINSTREL_HT_H
  8
  9/*
 10 * The number of streams can be changed to 2 to reduce code
 11 * size and memory footprint.
 12 */
 13#define MINSTREL_MAX_STREAMS		4
 14#define MINSTREL_HT_STREAM_GROUPS	4 /* BW(=2) * SGI(=2) */
 15#define MINSTREL_VHT_STREAM_GROUPS	6 /* BW(=3) * SGI(=2) */
 16
 17#define MINSTREL_HT_GROUPS_NB	(MINSTREL_MAX_STREAMS *		\
 18				 MINSTREL_HT_STREAM_GROUPS)
 19#define MINSTREL_VHT_GROUPS_NB	(MINSTREL_MAX_STREAMS *		\
 20				 MINSTREL_VHT_STREAM_GROUPS)
 21#define MINSTREL_CCK_GROUPS_NB	1
 22#define MINSTREL_GROUPS_NB	(MINSTREL_HT_GROUPS_NB +	\
 23				 MINSTREL_VHT_GROUPS_NB +	\
 24				 MINSTREL_CCK_GROUPS_NB)
 25
 26#define MINSTREL_HT_GROUP_0	0
 27#define MINSTREL_CCK_GROUP	(MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB)
 28#define MINSTREL_VHT_GROUP_0	(MINSTREL_CCK_GROUP + 1)
 29
 30#define MCS_GROUP_RATES		10
 
 
 
 
 
 31
 32struct mcs_group {
 33	u16 flags;
 34	u8 streams;
 35	u8 shift;
 36	u8 bw;
 37	u16 duration[MCS_GROUP_RATES];
 38};
 39
 40extern const struct mcs_group minstrel_mcs_groups[];
 41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 42struct minstrel_mcs_group_data {
 43	u8 index;
 44	u8 column;
 45
 46	/* sorted rate set within a MCS group*/
 47	u16 max_group_tp_rate[MAX_THR_RATES];
 48	u16 max_group_prob_rate;
 
 
 
 
 49
 50	/* MCS rate statistics */
 51	struct minstrel_rate_stats rates[MCS_GROUP_RATES];
 52};
 53
 54enum minstrel_sample_mode {
 55	MINSTREL_SAMPLE_IDLE,
 56	MINSTREL_SAMPLE_ACTIVE,
 57	MINSTREL_SAMPLE_PENDING,
 58};
 59
 60struct minstrel_ht_sta {
 61	struct ieee80211_sta *sta;
 62
 63	/* ampdu length (average, per sampling interval) */
 64	unsigned int ampdu_len;
 65	unsigned int ampdu_packets;
 66
 67	/* ampdu length (EWMA) */
 68	unsigned int avg_ampdu_len;
 69
 70	/* overall sorted rate set */
 71	u16 max_tp_rate[MAX_THR_RATES];
 72	u16 max_prob_rate;
 
 
 
 
 
 73
 74	/* time of last status update */
 75	unsigned long last_stats_update;
 76
 77	/* overhead time in usec for each frame */
 78	unsigned int overhead;
 79	unsigned int overhead_rtscts;
 80
 81	unsigned int total_packets_last;
 82	unsigned int total_packets_cur;
 83	unsigned int total_packets;
 84	unsigned int sample_packets;
 85
 86	/* tx flags to add for frames for this sta */
 87	u32 tx_flags;
 88
 89	u8 sample_wait;
 90	u8 sample_tries;
 91	u8 sample_count;
 92	u8 sample_slow;
 93
 94	enum minstrel_sample_mode sample_mode;
 95	u16 sample_rate;
 96
 97	/* current MCS group to be sampled */
 98	u8 sample_group;
 99
100	u8 cck_supported;
101	u8 cck_supported_short;
102
103	/* Bitfield of supported MCS rates of all groups */
104	u16 supported[MINSTREL_GROUPS_NB];
105
106	/* MCS rate group info and statistics */
107	struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB];
108};
109
110struct minstrel_ht_sta_priv {
111	union {
112		struct minstrel_ht_sta ht;
113		struct minstrel_sta_info legacy;
114	};
 
 
 
115	void *ratelist;
116	void *sample_table;
117	bool is_ht;
118};
119
120void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
121int minstrel_ht_get_tp_avg(struct minstrel_ht_sta *mi, int group, int rate,
122			   int prob_avg);
123
124#endif
v3.1
 
  1/*
  2 * Copyright (C) 2010 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_HT_H
 10#define __RC_MINSTREL_HT_H
 11
 12/*
 13 * The number of streams can be changed to 2 to reduce code
 14 * size and memory footprint.
 15 */
 16#define MINSTREL_MAX_STREAMS	3
 17#define MINSTREL_STREAM_GROUPS	4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 18
 19/* scaled fraction values */
 20#define MINSTREL_SCALE	16
 21#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
 22#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE)
 23
 24#define MCS_GROUP_RATES	8
 25
 26struct mcs_group {
 27	u32 flags;
 28	unsigned int streams;
 29	unsigned int duration[MCS_GROUP_RATES];
 
 
 30};
 31
 32extern const struct mcs_group minstrel_mcs_groups[];
 33
 34struct minstrel_rate_stats {
 35	/* current / last sampling period attempts/success counters */
 36	unsigned int attempts, last_attempts;
 37	unsigned int success, last_success;
 38
 39	/* total attempts/success counters */
 40	u64 att_hist, succ_hist;
 41
 42	/* current throughput */
 43	unsigned int cur_tp;
 44
 45	/* packet delivery probabilities */
 46	unsigned int cur_prob, probability;
 47
 48	/* maximum retry counts */
 49	unsigned int retry_count;
 50	unsigned int retry_count_rtscts;
 51
 52	bool retry_updated;
 53	u8 sample_skipped;
 54};
 55
 56struct minstrel_mcs_group_data {
 57	u8 index;
 58	u8 column;
 59
 60	/* bitfield of supported MCS rates of this group */
 61	u8 supported;
 62
 63	/* selected primary rates */
 64	unsigned int max_tp_rate;
 65	unsigned int max_tp_rate2;
 66	unsigned int max_prob_rate;
 67
 68	/* MCS rate statistics */
 69	struct minstrel_rate_stats rates[MCS_GROUP_RATES];
 70};
 71
 
 
 
 
 
 
 72struct minstrel_ht_sta {
 
 
 73	/* ampdu length (average, per sampling interval) */
 74	unsigned int ampdu_len;
 75	unsigned int ampdu_packets;
 76
 77	/* ampdu length (EWMA) */
 78	unsigned int avg_ampdu_len;
 79
 80	/* best throughput rate */
 81	unsigned int max_tp_rate;
 82
 83	/* second best throughput rate */
 84	unsigned int max_tp_rate2;
 85
 86	/* best probability rate */
 87	unsigned int max_prob_rate;
 88
 89	/* time of last status update */
 90	unsigned long stats_update;
 91
 92	/* overhead time in usec for each frame */
 93	unsigned int overhead;
 94	unsigned int overhead_rtscts;
 95
 
 
 96	unsigned int total_packets;
 97	unsigned int sample_packets;
 98
 99	/* tx flags to add for frames for this sta */
100	u32 tx_flags;
101
102	u8 sample_wait;
103	u8 sample_tries;
104	u8 sample_count;
105	u8 sample_slow;
106
 
 
 
107	/* current MCS group to be sampled */
108	u8 sample_group;
109
 
 
 
 
 
 
110	/* MCS rate group info and statistics */
111	struct minstrel_mcs_group_data groups[MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS];
112};
113
114struct minstrel_ht_sta_priv {
115	union {
116		struct minstrel_ht_sta ht;
117		struct minstrel_sta_info legacy;
118	};
119#ifdef CONFIG_MAC80211_DEBUGFS
120	struct dentry *dbg_stats;
121#endif
122	void *ratelist;
123	void *sample_table;
124	bool is_ht;
125};
126
127void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir);
128void minstrel_ht_remove_sta_debugfs(void *priv, void *priv_sta);
 
129
130#endif