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
125