rc.c 50.0 KB
Newer Older
1 2
/*
 * Copyright (c) 2004 Video54 Technologies, Inc.
3
 * Copyright (c) 2004-2011 Atheros Communications, Inc.
4 5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

18 19
#include <linux/slab.h>

S
Sujith 已提交
20
#include "ath9k.h"
21

22
static const struct ath_rate_table ar5416_11na_ratetable = {
23
	68,
24
	8, /* MCS start */
25
	{
26
		[0] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 6000,
27
			5400, 0, 12, 0, 0, 0, 0 }, /* 6 Mb */
28
		[1] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 9000,
29
			7800,  1, 18, 0, 1, 1, 1 }, /* 9 Mb */
30
		[2] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 12000,
31
			10000, 2, 24, 2, 2, 2, 2 }, /* 12 Mb */
32
		[3] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 18000,
33
			13900, 3, 36, 2, 3, 3, 3 }, /* 18 Mb */
34
		[4] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 24000,
35
			17300, 4, 48, 4, 4, 4, 4 }, /* 24 Mb */
36
		[5] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 36000,
37
			23000, 5, 72, 4, 5, 5, 5 }, /* 36 Mb */
38
		[6] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 48000,
39
			27400, 6, 96, 4, 6, 6, 6 }, /* 48 Mb */
40
		[7] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 54000,
41
			29300, 7, 108, 4, 7, 7, 7 }, /* 54 Mb */
42
		[8] = { RC_HT_SDT_2040, WLAN_RC_PHY_HT_20_SS, 6500,
43
			6400, 0, 0, 0, 38, 8, 38 }, /* 6.5 Mb */
44
		[9] = { RC_HT_SDT_20, WLAN_RC_PHY_HT_20_SS, 13000,
45
			12700, 1, 1, 2, 39, 9, 39 }, /* 13 Mb */
46
		[10] = { RC_HT_SDT_20, WLAN_RC_PHY_HT_20_SS, 19500,
47
			18800, 2, 2, 2, 40, 10, 40 }, /* 19.5 Mb */
48
		[11] = { RC_HT_SD_20, WLAN_RC_PHY_HT_20_SS, 26000,
49
			25000, 3, 3, 4, 41, 11, 41 }, /* 26 Mb */
50
		[12] = { RC_HT_SD_20, WLAN_RC_PHY_HT_20_SS, 39000,
51
			36700, 4, 4, 4, 42, 12, 42 }, /* 39 Mb */
52
		[13] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 52000,
53
			48100, 5, 5, 4, 43, 13, 43 }, /* 52 Mb */
54
		[14] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 58500,
55
			53500, 6, 6, 4, 44, 14, 44 }, /* 58.5 Mb */
56
		[15] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 65000,
57
			59000, 7, 7, 4, 45, 16, 46 }, /* 65 Mb */
58
		[16] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS_HGI, 72200,
59
			65400, 7, 7, 4, 45, 16, 46 }, /* 75 Mb */
60
		[17] = { RC_INVALID, WLAN_RC_PHY_HT_20_DS, 13000,
61
			12700, 8, 8, 0, 47, 17, 47 }, /* 13 Mb */
62
		[18] = { RC_HT_T_20, WLAN_RC_PHY_HT_20_DS, 26000,
63
			24800, 9, 9, 2, 48, 18, 48 }, /* 26 Mb */
64
		[19] = { RC_HT_T_20, WLAN_RC_PHY_HT_20_DS, 39000,
65
			36600, 10, 10, 2, 49, 19, 49 }, /* 39 Mb */
66
		[20] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 52000,
67
			48100, 11, 11, 4, 50, 20, 50 }, /* 52 Mb */
68
		[21] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 78000,
69
			69500, 12, 12, 4, 51, 21, 51 }, /* 78 Mb */
70
		[22] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 104000,
71
			89500, 13, 13, 4, 52, 22, 52 }, /* 104 Mb */
72
		[23] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 117000,
73
			98900, 14, 14, 4, 53, 23, 53 }, /* 117 Mb */
74
		[24] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 130000,
75
			108300, 15, 15, 4, 54, 25, 55 }, /* 130 Mb */
76
		[25] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS_HGI, 144400,
77
			120000, 15, 15, 4, 54, 25, 55 }, /* 144.4 Mb */
78
		[26] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 19500,
79
			17400, 16, 16, 0, 56, 26, 56 }, /* 19.5 Mb */
80
		[27] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 39000,
81
			35100, 17, 17, 2, 57, 27, 57 }, /* 39 Mb */
82
		[28] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 58500,
83
			52600, 18, 18, 2, 58, 28, 58 }, /* 58.5 Mb */
84
		[29] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 78000,
85
			70400, 19, 19, 4, 59, 29, 59 }, /* 78 Mb */
86
		[30] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 117000,
87
			104900, 20, 20, 4, 60, 31, 61 }, /* 117 Mb */
88
		[31] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS_HGI, 130000,
89
			115800, 20, 20, 4, 60, 31, 61 }, /* 130 Mb*/
90
		[32] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 156000,
91
			137200, 21, 21, 4, 62, 33, 63 }, /* 156 Mb */
92
		[33] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 173300,
93
			151100, 21, 21, 4, 62, 33, 63 }, /* 173.3 Mb */
94
		[34] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 175500,
95
			152800, 22, 22, 4, 64, 35, 65 }, /* 175.5 Mb */
96
		[35] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 195000,
97
			168400, 22, 22, 4, 64, 35, 65 }, /* 195 Mb*/
98
		[36] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 195000,
99
			168400, 23, 23, 4, 66, 37, 67 }, /* 195 Mb */
100
		[37] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 216700,
101
			185000, 23, 23, 4, 66, 37, 67 }, /* 216.7 Mb */
102
		[38] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 13500,
103
			13200, 0, 0, 0, 38, 38, 38 }, /* 13.5 Mb*/
104
		[39] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 27500,
105
			25900, 1, 1, 2, 39, 39, 39 }, /* 27.0 Mb*/
106
		[40] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 40500,
107
			38600, 2, 2, 2, 40, 40, 40 }, /* 40.5 Mb*/
108
		[41] = { RC_HT_SD_40, WLAN_RC_PHY_HT_40_SS, 54000,
109
			49800, 3, 3, 4, 41, 41, 41 }, /* 54 Mb */
110
		[42] = { RC_HT_SD_40, WLAN_RC_PHY_HT_40_SS, 81500,
111
			72200, 4, 4, 4, 42, 42, 42 }, /* 81 Mb */
112
		[43] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS, 108000,
113
			92900, 5, 5, 4, 43, 43, 43 }, /* 108 Mb */
114
		[44] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS, 121500,
115
			102700, 6, 6, 4, 44, 44, 44 }, /* 121.5 Mb*/
116
		[45] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS, 135000,
117
			112000, 7, 7, 4, 45, 46, 46 }, /* 135 Mb */
118
		[46] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000,
119
			122000, 7, 7, 4, 45, 46, 46 }, /* 150 Mb */
120
		[47] = { RC_INVALID, WLAN_RC_PHY_HT_40_DS, 27000,
121
			25800, 8, 8, 0, 47, 47, 47 }, /* 27 Mb */
122
		[48] = { RC_HT_T_40, WLAN_RC_PHY_HT_40_DS, 54000,
123
			49800, 9, 9, 2, 48, 48, 48 }, /* 54 Mb */
124
		[49] = { RC_HT_T_40, WLAN_RC_PHY_HT_40_DS, 81000,
125
			71900, 10, 10, 2, 49, 49, 49 }, /* 81 Mb */
126
		[50] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 108000,
127
			92500, 11, 11, 4, 50, 50, 50 }, /* 108 Mb */
128
		[51] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 162000,
129
			130300, 12, 12, 4, 51, 51, 51 }, /* 162 Mb */
130
		[52] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 216000,
131
			162800, 13, 13, 4, 52, 52, 52 }, /* 216 Mb */
132
		[53] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 243000,
133
			178200, 14, 14, 4, 53, 53, 53 }, /* 243 Mb */
134
		[54] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 270000,
135
			192100, 15, 15, 4, 54, 55, 55 }, /* 270 Mb */
136
		[55] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS_HGI, 300000,
137
			207000, 15, 15, 4, 54, 55, 55 }, /* 300 Mb */
138
		[56] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 40500,
139
			36100, 16, 16, 0, 56, 56, 56 }, /* 40.5 Mb */
140
		[57] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 81000,
141
			72900, 17, 17, 2, 57, 57, 57 }, /* 81 Mb */
142
		[58] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 121500,
143
			108300, 18, 18, 2, 58, 58, 58 }, /* 121.5 Mb */
144
		[59] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 162000,
145
			142000, 19, 19, 4, 59, 59, 59 }, /*  162 Mb */
146
		[60] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 243000,
147
			205100, 20, 20, 4, 60, 61, 61 }, /*  243 Mb */
148
		[61] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS_HGI, 270000,
149
			224700, 20, 20, 4, 60, 61, 61 }, /*  270 Mb */
150
		[62] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 324000,
151
			263100, 21, 21, 4, 62, 63, 63 }, /*  324 Mb */
152
		[63] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 360000,
153
			288000, 21, 21, 4, 62, 63, 63 }, /*  360 Mb */
154
		[64] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 364500,
155
			290700, 22, 22, 4, 64, 65, 65 }, /* 364.5 Mb */
156
		[65] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 405000,
157
			317200, 22, 22, 4, 64, 65, 65 }, /* 405 Mb */
158
		[66] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 405000,
159
			317200, 23, 23, 4, 66, 67, 67 }, /* 405 Mb */
160
		[67] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 450000,
161
			346400, 23, 23, 4, 66, 67, 67 }, /* 450 Mb */
162 163 164 165 166 167 168 169
	},
	50,  /* probe interval */
	WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
};

/* 4ms frame limit not used for NG mode.  The values filled
 * for HT are the 64K max aggregate limit */

170
static const struct ath_rate_table ar5416_11ng_ratetable = {
171
	72,
172
	12, /* MCS start */
173
	{
174
		[0] = { RC_ALL, WLAN_RC_PHY_CCK, 1000,
175
			900, 0, 2, 0, 0, 0, 0 }, /* 1 Mb */
176
		[1] = { RC_ALL, WLAN_RC_PHY_CCK, 2000,
177
			1900, 1, 4, 1, 1, 1, 1 }, /* 2 Mb */
178
		[2] = { RC_ALL, WLAN_RC_PHY_CCK, 5500,
179
			4900, 2, 11, 2, 2, 2, 2 }, /* 5.5 Mb */
180
		[3] = { RC_ALL, WLAN_RC_PHY_CCK, 11000,
181
			8100, 3, 22, 3, 3, 3, 3 }, /* 11 Mb */
182
		[4] = { RC_INVALID, WLAN_RC_PHY_OFDM, 6000,
183
			5400, 4, 12, 4, 4, 4, 4 }, /* 6 Mb */
184
		[5] = { RC_INVALID, WLAN_RC_PHY_OFDM, 9000,
185
			7800, 5, 18, 4, 5, 5, 5 }, /* 9 Mb */
186
		[6] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 12000,
187
			10100, 6, 24, 6, 6, 6, 6 }, /* 12 Mb */
188
		[7] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 18000,
189
			14100, 7, 36, 6, 7, 7, 7 }, /* 18 Mb */
190
		[8] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 24000,
191
			17700, 8, 48, 8, 8, 8, 8 }, /* 24 Mb */
192
		[9] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 36000,
193
			23700, 9, 72, 8, 9, 9, 9 }, /* 36 Mb */
194
		[10] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 48000,
195
			27400, 10, 96, 8, 10, 10, 10 }, /* 48 Mb */
196
		[11] = { RC_L_SDT, WLAN_RC_PHY_OFDM, 54000,
197
			30900, 11, 108, 8, 11, 11, 11 }, /* 54 Mb */
198
		[12] = { RC_INVALID, WLAN_RC_PHY_HT_20_SS, 6500,
199
			6400, 0, 0, 4, 42, 12, 42 }, /* 6.5 Mb */
200
		[13] = { RC_HT_SDT_20, WLAN_RC_PHY_HT_20_SS, 13000,
201
			12700, 1, 1, 6, 43, 13, 43 }, /* 13 Mb */
202
		[14] = { RC_HT_SDT_20, WLAN_RC_PHY_HT_20_SS, 19500,
203
			18800, 2, 2, 6, 44, 14, 44 }, /* 19.5 Mb*/
204
		[15] = { RC_HT_SD_20, WLAN_RC_PHY_HT_20_SS, 26000,
205
			25000, 3, 3, 8, 45, 15, 45 }, /* 26 Mb */
206
		[16] = { RC_HT_SD_20, WLAN_RC_PHY_HT_20_SS, 39000,
207
			36700, 4, 4, 8, 46, 16, 46 }, /* 39 Mb */
208
		[17] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 52000,
209
			48100, 5, 5, 8, 47, 17, 47 }, /* 52 Mb */
210
		[18] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 58500,
211
			53500, 6, 6, 8, 48, 18, 48 }, /* 58.5 Mb */
212
		[19] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS, 65000,
213
			59000, 7, 7, 8, 49, 20, 50 }, /* 65 Mb */
214
		[20] = { RC_HT_S_20, WLAN_RC_PHY_HT_20_SS_HGI, 72200,
215
			65400, 7, 7, 8, 49, 20, 50 }, /* 65 Mb*/
216
		[21] = { RC_INVALID, WLAN_RC_PHY_HT_20_DS, 13000,
217
			12700, 8, 8, 4, 51, 21, 51 }, /* 13 Mb */
218
		[22] = { RC_HT_T_20, WLAN_RC_PHY_HT_20_DS, 26000,
219
			24800, 9, 9, 6, 52, 22, 52 }, /* 26 Mb */
220
		[23] = { RC_HT_T_20, WLAN_RC_PHY_HT_20_DS, 39000,
221
			36600, 10, 10, 6, 53, 23, 53 }, /* 39 Mb */
222
		[24] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 52000,
223
			48100, 11, 11, 8, 54, 24, 54 }, /* 52 Mb */
224
		[25] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 78000,
225
			69500, 12, 12, 8, 55, 25, 55 }, /* 78 Mb */
226
		[26] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 104000,
227
			89500, 13, 13, 8, 56, 26, 56 }, /* 104 Mb */
228
		[27] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 117000,
229
			98900, 14, 14, 8, 57, 27, 57 }, /* 117 Mb */
230
		[28] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS, 130000,
231
			108300, 15, 15, 8, 58, 29, 59 }, /* 130 Mb */
232
		[29] = { RC_HT_DT_20, WLAN_RC_PHY_HT_20_DS_HGI, 144400,
233
			120000, 15, 15, 8, 58, 29, 59 }, /* 144.4 Mb */
234
		[30] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 19500,
235
			17400, 16, 16, 4, 60, 30, 60 }, /* 19.5 Mb */
236
		[31] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 39000,
237
			35100, 17, 17, 6, 61, 31, 61 }, /* 39 Mb */
238
		[32] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 58500,
239
			52600, 18, 18, 6, 62, 32, 62 }, /* 58.5 Mb */
240
		[33] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 78000,
241
			70400, 19, 19, 8, 63, 33, 63 }, /* 78 Mb */
242
		[34] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS, 117000,
243
			104900, 20, 20, 8, 64, 35, 65 }, /* 117 Mb */
244
		[35] = {  RC_INVALID, WLAN_RC_PHY_HT_20_TS_HGI, 130000,
245
			115800, 20, 20, 8, 64, 35, 65 }, /* 130 Mb */
246
		[36] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 156000,
247
			137200, 21, 21, 8, 66, 37, 67 }, /* 156 Mb */
248
		[37] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 173300,
249
			151100, 21, 21, 8, 66, 37, 67 }, /* 173.3 Mb */
250
		[38] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 175500,
251
			152800, 22, 22, 8, 68, 39, 69 }, /* 175.5 Mb */
252
		[39] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 195000,
253
			168400, 22, 22, 8, 68, 39, 69 }, /* 195 Mb */
254
		[40] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS, 195000,
255
			168400, 23, 23, 8, 70, 41, 71 }, /* 195 Mb */
256
		[41] = {  RC_HT_T_20, WLAN_RC_PHY_HT_20_TS_HGI, 216700,
257
			185000, 23, 23, 8, 70, 41, 71 }, /* 216.7 Mb */
258
		[42] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 13500,
259
			13200, 0, 0, 8, 42, 42, 42 }, /* 13.5 Mb */
260
		[43] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 27500,
261
			25900, 1, 1, 8, 43, 43, 43 }, /* 27.0 Mb */
262
		[44] = { RC_HT_SDT_40, WLAN_RC_PHY_HT_40_SS, 40500,
263
			38600, 2, 2, 8, 44, 44, 44 }, /* 40.5 Mb */
264
		[45] = { RC_HT_SD_40, WLAN_RC_PHY_HT_40_SS, 54000,
265
			49800, 3, 3, 8, 45, 45, 45 }, /* 54 Mb */
266
		[46] = { RC_HT_SD_40, WLAN_RC_PHY_HT_40_SS, 81500,
267
			72200, 4, 4, 8, 46, 46, 46 }, /* 81 Mb */
268
		[47] = { RC_HT_S_40 , WLAN_RC_PHY_HT_40_SS, 108000,
269
			92900, 5, 5, 8, 47, 47, 47 }, /* 108 Mb */
270
		[48] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS, 121500,
271
			102700, 6, 6, 8, 48, 48, 48 }, /* 121.5 Mb */
272
		[49] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS, 135000,
273
			112000, 7, 7, 8, 49, 50, 50 }, /* 135 Mb */
274
		[50] = { RC_HT_S_40, WLAN_RC_PHY_HT_40_SS_HGI, 150000,
275
			122000, 7, 7, 8, 49, 50, 50 }, /* 150 Mb */
276
		[51] = { RC_INVALID, WLAN_RC_PHY_HT_40_DS, 27000,
277
			25800, 8, 8, 8, 51, 51, 51 }, /* 27 Mb */
278
		[52] = { RC_HT_T_40, WLAN_RC_PHY_HT_40_DS, 54000,
279
			49800, 9, 9, 8, 52, 52, 52 }, /* 54 Mb */
280
		[53] = { RC_HT_T_40, WLAN_RC_PHY_HT_40_DS, 81000,
281
			71900, 10, 10, 8, 53, 53, 53 }, /* 81 Mb */
282
		[54] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 108000,
283
			92500, 11, 11, 8, 54, 54, 54 }, /* 108 Mb */
284
		[55] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 162000,
285
			130300, 12, 12, 8, 55, 55, 55 }, /* 162 Mb */
286
		[56] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 216000,
287
			162800, 13, 13, 8, 56, 56, 56 }, /* 216 Mb */
288
		[57] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 243000,
289
			178200, 14, 14, 8, 57, 57, 57 }, /* 243 Mb */
290
		[58] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS, 270000,
291
			192100, 15, 15, 8, 58, 59, 59 }, /* 270 Mb */
292
		[59] = { RC_HT_DT_40, WLAN_RC_PHY_HT_40_DS_HGI, 300000,
293
			207000, 15, 15, 8, 58, 59, 59 }, /* 300 Mb */
294
		[60] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 40500,
295
			36100, 16, 16, 8, 60, 60, 60 }, /* 40.5 Mb */
296
		[61] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 81000,
297
			72900, 17, 17, 8, 61, 61, 61 }, /* 81 Mb */
298
		[62] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 121500,
299
			108300, 18, 18, 8, 62, 62, 62 }, /* 121.5 Mb */
300
		[63] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 162000,
301
			142000, 19, 19, 8, 63, 63, 63 }, /* 162 Mb */
302
		[64] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS, 243000,
303
			205100, 20, 20, 8, 64, 65, 65 }, /* 243 Mb */
304
		[65] = {  RC_INVALID, WLAN_RC_PHY_HT_40_TS_HGI, 270000,
305
			224700, 20, 20, 8, 64, 65, 65 }, /* 270 Mb */
306
		[66] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 324000,
307
			263100, 21, 21, 8, 66, 67, 67 }, /* 324 Mb */
308
		[67] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 360000,
309
			288000, 21, 21, 8, 66, 67, 67 }, /* 360 Mb */
310
		[68] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 364500,
311
			290700, 22, 22, 8, 68, 69, 69 }, /* 364.5 Mb */
312
		[69] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 405000,
313
			317200, 22, 22, 8, 68, 69, 69 }, /* 405 Mb */
314
		[70] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS, 405000,
315
			317200, 23, 23, 8, 70, 71, 71 }, /* 405 Mb */
316
		[71] = {  RC_HT_T_40, WLAN_RC_PHY_HT_40_TS_HGI, 450000,
317
			346400, 23, 23, 8, 70, 71, 71 }, /* 450 Mb */
F
Felix Fietkau 已提交
318
	},
319 320 321 322
	50,  /* probe interval */
	WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
};

323
static const struct ath_rate_table ar5416_11a_ratetable = {
324
	8,
325
	0,
326
	{
327
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 6000, /* 6 Mb */
328
			5400, 0, 12, 0},
329
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 9000, /* 9 Mb */
330
			7800,  1, 18, 0},
331
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 12000, /* 12 Mb */
332
			10000, 2, 24, 2},
333
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 18000, /* 18 Mb */
334
			13900, 3, 36, 2},
335
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 24000, /* 24 Mb */
336
			17300, 4, 48, 4},
337
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 36000, /* 36 Mb */
338
			23000, 5, 72, 4},
339
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 48000, /* 48 Mb */
340
			27400, 6, 96, 4},
341
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
342
			29300, 7, 108, 4},
343 344 345 346 347
	},
	50,  /* probe interval */
	0,   /* Phy rates allowed initially */
};

348
static const struct ath_rate_table ar5416_11g_ratetable = {
349
	12,
350
	0,
351
	{
352
		{ RC_L_SDT, WLAN_RC_PHY_CCK, 1000, /* 1 Mb */
353
			900, 0, 2, 0},
354
		{ RC_L_SDT, WLAN_RC_PHY_CCK, 2000, /* 2 Mb */
355
			1900, 1, 4, 1},
356
		{ RC_L_SDT, WLAN_RC_PHY_CCK, 5500, /* 5.5 Mb */
357
			4900, 2, 11, 2},
358
		{ RC_L_SDT, WLAN_RC_PHY_CCK, 11000, /* 11 Mb */
359
			8100, 3, 22, 3},
360
		{ RC_INVALID, WLAN_RC_PHY_OFDM, 6000, /* 6 Mb */
361
			5400, 4, 12, 4},
362
		{ RC_INVALID, WLAN_RC_PHY_OFDM, 9000, /* 9 Mb */
363
			7800, 5, 18, 4},
364
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 12000, /* 12 Mb */
365
			10000, 6, 24, 6},
366
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 18000, /* 18 Mb */
367
			13900, 7, 36, 6},
368
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 24000, /* 24 Mb */
369
			17300, 8, 48, 8},
370
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 36000, /* 36 Mb */
371
			23000, 9, 72, 8},
372
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 48000, /* 48 Mb */
373
			27400, 10, 96, 8},
374
		{ RC_L_SDT, WLAN_RC_PHY_OFDM, 54000, /* 54 Mb */
375
			29300, 11, 108, 8},
376 377 378 379 380
	},
	50,  /* probe interval */
	0,   /* Phy rates allowed initially */
};

381
static int ath_rc_get_rateindex(const struct ath_rate_table *rate_table,
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
				struct ieee80211_tx_rate *rate)
{
	int rix = 0, i = 0;
	static const int mcs_rix_off[] = { 7, 15, 20, 21, 22, 23 };

	if (!(rate->flags & IEEE80211_TX_RC_MCS))
		return rate->idx;

	while (i < ARRAY_SIZE(mcs_rix_off) && rate->idx > mcs_rix_off[i]) {
		rix++; i++;
	}

	rix += rate->idx + rate_table->mcs_start;

	if ((rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
	    (rate->flags & IEEE80211_TX_RC_SHORT_GI))
		rix = rate_table->info[rix].ht_index;
	else if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
		rix = rate_table->info[rix].sgi_index;
	else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
		rix = rate_table->info[rix].cw40index;

	return rix;
}
406

407
static void ath_rc_sort_validrates(const struct ath_rate_table *rate_table,
S
Sujith 已提交
408
				   struct ath_rate_priv *ath_rc_priv)
409 410 411
{
	u8 i, j, idx, idx_next;

412
	for (i = ath_rc_priv->max_valid_rate - 1; i > 0; i--) {
413
		for (j = 0; j <= i-1; j++) {
414 415
			idx = ath_rc_priv->valid_rate_index[j];
			idx_next = ath_rc_priv->valid_rate_index[j+1];
416 417 418

			if (rate_table->info[idx].ratekbps >
				rate_table->info[idx_next].ratekbps) {
419 420
				ath_rc_priv->valid_rate_index[j] = idx_next;
				ath_rc_priv->valid_rate_index[j+1] = idx;
421 422 423 424 425
			}
		}
	}
}

426
static void ath_rc_init_valid_rate_idx(struct ath_rate_priv *ath_rc_priv)
427 428 429
{
	u8 i;

430
	for (i = 0; i < ath_rc_priv->rate_table_size; i++)
S
Sujith 已提交
431
		ath_rc_priv->valid_rate_index[i] = 0;
432 433
}

434
static inline void ath_rc_set_valid_rate_idx(struct ath_rate_priv *ath_rc_priv,
435 436
					   u8 index, int valid_tx_rate)
{
437
	BUG_ON(index > ath_rc_priv->rate_table_size);
438
	ath_rc_priv->valid_rate_index[index] = !!valid_tx_rate;
439 440
}

441 442 443 444 445
static inline
int ath_rc_get_nextvalid_txrate(const struct ath_rate_table *rate_table,
				struct ath_rate_priv *ath_rc_priv,
				u8 cur_valid_txrate,
				u8 *next_idx)
446 447 448
{
	u8 i;

449 450 451
	for (i = 0; i < ath_rc_priv->max_valid_rate - 1; i++) {
		if (ath_rc_priv->valid_rate_index[i] == cur_valid_txrate) {
			*next_idx = ath_rc_priv->valid_rate_index[i+1];
S
Sujith 已提交
452
			return 1;
453 454 455 456 457
		}
	}

	/* No more valid rates */
	*next_idx = 0;
S
Sujith 已提交
458

S
Sujith 已提交
459
	return 0;
460 461 462 463 464 465
}

/* Return true only for single stream */

static int ath_rc_valid_phyrate(u32 phy, u32 capflag, int ignore_cw)
{
466
	if (WLAN_RC_PHY_HT(phy) && !(capflag & WLAN_RC_HT_FLAG))
S
Sujith 已提交
467
		return 0;
468
	if (WLAN_RC_PHY_DS(phy) && !(capflag & WLAN_RC_DS_FLAG))
S
Sujith 已提交
469
		return 0;
470 471
	if (WLAN_RC_PHY_TS(phy) && !(capflag & WLAN_RC_TS_FLAG))
		return 0;
472
	if (WLAN_RC_PHY_SGI(phy) && !(capflag & WLAN_RC_SGI_FLAG))
S
Sujith 已提交
473
		return 0;
474 475
	if (!ignore_cw && WLAN_RC_PHY_HT(phy))
		if (WLAN_RC_PHY_40(phy) && !(capflag & WLAN_RC_40_FLAG))
S
Sujith 已提交
476 477
			return 0;
	return 1;
478 479 480
}

static inline int
481 482 483
ath_rc_get_lower_rix(const struct ath_rate_table *rate_table,
		     struct ath_rate_priv *ath_rc_priv,
		     u8 cur_valid_txrate, u8 *next_idx)
484 485 486
{
	int8_t i;

487 488 489
	for (i = 1; i < ath_rc_priv->max_valid_rate ; i++) {
		if (ath_rc_priv->valid_rate_index[i] == cur_valid_txrate) {
			*next_idx = ath_rc_priv->valid_rate_index[i-1];
S
Sujith 已提交
490
			return 1;
491 492
		}
	}
S
Sujith 已提交
493

S
Sujith 已提交
494
	return 0;
495 496
}

S
Sujith 已提交
497
static u8 ath_rc_init_validrates(struct ath_rate_priv *ath_rc_priv,
498
				 const struct ath_rate_table *rate_table,
S
Sujith 已提交
499
				 u32 capflag)
500 501 502 503
{
	u8 i, hi = 0;

	for (i = 0; i < rate_table->rate_cnt; i++) {
504
		if (rate_table->info[i].rate_flags & RC_LEGACY) {
505 506 507
			u32 phy = rate_table->info[i].phy;
			u8 valid_rate_count = 0;

S
Sujith 已提交
508
			if (!ath_rc_valid_phyrate(phy, capflag, 0))
509 510
				continue;

511
			valid_rate_count = ath_rc_priv->valid_phy_ratecnt[phy];
512

513 514
			ath_rc_priv->valid_phy_rateidx[phy][valid_rate_count] = i;
			ath_rc_priv->valid_phy_ratecnt[phy] += 1;
515
			ath_rc_set_valid_rate_idx(ath_rc_priv, i, 1);
516
			hi = i;
517 518
		}
	}
S
Sujith 已提交
519

520 521 522
	return hi;
}

S
Sujith 已提交
523
static u8 ath_rc_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
524
				const struct ath_rate_table *rate_table,
S
Sujith 已提交
525 526
				struct ath_rateset *rateset,
				u32 capflag)
527 528 529 530 531 532 533
{
	u8 i, j, hi = 0;

	/* Use intersection of working rates and valid rates */
	for (i = 0; i < rateset->rs_nrates; i++) {
		for (j = 0; j < rate_table->rate_cnt; j++) {
			u32 phy = rate_table->info[j].phy;
534
			u16 rate_flags = rate_table->info[j].rate_flags;
S
Sujith 已提交
535 536
			u8 rate = rateset->rs_rates[i];
			u8 dot11rate = rate_table->info[j].dot11rate;
537 538 539

			/* We allow a rate only if its valid and the
			 * capflag matches one of the validity
S
Sujith 已提交
540
			 * (VALID/VALID_20/VALID_40) flags */
541

542
			if ((rate == dot11rate) &&
543 544 545
			    (rate_flags & WLAN_RC_CAP_MODE(capflag)) ==
			    WLAN_RC_CAP_MODE(capflag) &&
			    (rate_flags & WLAN_RC_CAP_STREAM(capflag)) &&
S
Sujith 已提交
546
			    !WLAN_RC_PHY_HT(phy)) {
547 548
				u8 valid_rate_count = 0;

S
Sujith 已提交
549
				if (!ath_rc_valid_phyrate(phy, capflag, 0))
550 551 552
					continue;

				valid_rate_count =
553
					ath_rc_priv->valid_phy_ratecnt[phy];
554

555
				ath_rc_priv->valid_phy_rateidx[phy]
556
					[valid_rate_count] = j;
557
				ath_rc_priv->valid_phy_ratecnt[phy] += 1;
558
				ath_rc_set_valid_rate_idx(ath_rc_priv, j, 1);
559
				hi = max(hi, j);
560 561 562
			}
		}
	}
S
Sujith 已提交
563

564 565 566
	return hi;
}

S
Sujith 已提交
567
static u8 ath_rc_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
568
				  const struct ath_rate_table *rate_table,
S
Sujith 已提交
569
				  u8 *mcs_set, u32 capflag)
570
{
S
Sujith 已提交
571 572
	struct ath_rateset *rateset = (struct ath_rateset *)mcs_set;

573 574 575
	u8 i, j, hi = 0;

	/* Use intersection of working rates and valid rates */
S
Sujith 已提交
576
	for (i = 0; i < rateset->rs_nrates; i++) {
577 578
		for (j = 0; j < rate_table->rate_cnt; j++) {
			u32 phy = rate_table->info[j].phy;
579
			u16 rate_flags = rate_table->info[j].rate_flags;
S
Sujith 已提交
580 581
			u8 rate = rateset->rs_rates[i];
			u8 dot11rate = rate_table->info[j].dot11rate;
582

583
			if ((rate != dot11rate) || !WLAN_RC_PHY_HT(phy) ||
584 585
			    !(rate_flags & WLAN_RC_CAP_STREAM(capflag)) ||
			    !WLAN_RC_PHY_HT_VALID(rate_flags, capflag))
586 587
				continue;

S
Sujith 已提交
588
			if (!ath_rc_valid_phyrate(phy, capflag, 0))
589 590
				continue;

591 592 593
			ath_rc_priv->valid_phy_rateidx[phy]
				[ath_rc_priv->valid_phy_ratecnt[phy]] = j;
			ath_rc_priv->valid_phy_ratecnt[phy] += 1;
594
			ath_rc_set_valid_rate_idx(ath_rc_priv, j, 1);
595
			hi = max(hi, j);
596 597 598
		}
	}

S
Sujith 已提交
599
	return hi;
600 601
}

602 603 604 605 606
/* Finds the highest rate index we can use */
static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
			         struct ath_rate_priv *ath_rc_priv,
				 const struct ath_rate_table *rate_table,
				 int *is_probing)
607
{
608
	u32 best_thruput, this_thruput, now_msec;
609
	u8 rate, next_rate, best_rate, maxindex, minindex;
610
	int8_t index = 0;
611 612

	now_msec = jiffies_to_msecs(jiffies);
613
	*is_probing = 0;
614
	best_thruput = 0;
615
	maxindex = ath_rc_priv->max_valid_rate-1;
616 617 618 619 620 621 622 623 624 625
	minindex = 0;
	best_rate = minindex;

	/*
	 * Try the higher rate first. It will reduce memory moving time
	 * if we have very good channel characteristics.
	 */
	for (index = maxindex; index >= minindex ; index--) {
		u8 per_thres;

626 627
		rate = ath_rc_priv->valid_rate_index[index];
		if (rate > ath_rc_priv->rate_max_phy)
628 629 630 631 632 633 634 635 636 637 638 639 640
			continue;

		/*
		 * For TCP the average collision rate is around 11%,
		 * so we ignore PERs less than this.  This is to
		 * prevent the rate we are currently using (whose
		 * PER might be in the 10-15 range because of TCP
		 * collisions) looking worse than the next lower
		 * rate whose PER has decayed close to 0.  If we
		 * used to next lower rate, its PER would grow to
		 * 10-15 and we would be worse off then staying
		 * at the current rate.
		 */
641
		per_thres = ath_rc_priv->per[rate];
642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
		if (per_thres < 12)
			per_thres = 12;

		this_thruput = rate_table->info[rate].user_ratekbps *
			(100 - per_thres);

		if (best_thruput <= this_thruput) {
			best_thruput = this_thruput;
			best_rate    = rate;
		}
	}

	rate = best_rate;

	/*
	 * Must check the actual rate (ratekbps) to account for
	 * non-monoticity of 11g's rate table
	 */

S
Sujith 已提交
661
	if (rate >= ath_rc_priv->rate_max_phy) {
662
		rate = ath_rc_priv->rate_max_phy;
663 664 665

		/* Probe the next allowed phy state */
		if (ath_rc_get_nextvalid_txrate(rate_table,
S
Sujith 已提交
666
					ath_rc_priv, rate, &next_rate) &&
667
		    (now_msec - ath_rc_priv->probe_time >
668
		     rate_table->probe_interval) &&
669
		    (ath_rc_priv->hw_maxretry_pktcnt >= 1)) {
670
			rate = next_rate;
671 672 673
			ath_rc_priv->probe_rate = rate;
			ath_rc_priv->probe_time = now_msec;
			ath_rc_priv->hw_maxretry_pktcnt = 0;
S
Sujith 已提交
674
			*is_probing = 1;
675 676 677
		}
	}

678 679
	if (rate > (ath_rc_priv->rate_table_size - 1))
		rate = ath_rc_priv->rate_table_size - 1;
680

681 682 683 684 685 686
	if (RC_TS_ONLY(rate_table->info[rate].rate_flags) &&
	    (ath_rc_priv->ht_cap & WLAN_RC_TS_FLAG))
		return rate;

	if (RC_DS_OR_LATER(rate_table->info[rate].rate_flags) &&
	    (ath_rc_priv->ht_cap & (WLAN_RC_DS_FLAG | WLAN_RC_TS_FLAG)))
687 688
		return rate;

689
	if (RC_SS_OR_LEGACY(rate_table->info[rate].rate_flags))
690 691 692 693 694 695
		return rate;

	/* This should not happen */
	WARN_ON(1);

	rate = ath_rc_priv->valid_rate_index[0];
696 697 698 699

	return rate;
}

700
static void ath_rc_rate_set_series(const struct ath_rate_table *rate_table,
S
Sujith 已提交
701
				   struct ieee80211_tx_rate *rate,
702
				   struct ieee80211_tx_rate_control *txrc,
S
Sujith 已提交
703
				   u8 tries, u8 rix, int rtsctsenable)
704
{
S
Sujith 已提交
705
	rate->count = tries;
706
	rate->idx = rate_table->info[rix].ratecode;
S
Sujith 已提交
707

708 709 710
	if (txrc->short_preamble)
		rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE;
	if (txrc->rts || rtsctsenable)
S
Sujith 已提交
711
		rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS;
712 713

	if (WLAN_RC_PHY_HT(rate_table->info[rix].phy)) {
S
Sujith 已提交
714
		rate->flags |= IEEE80211_TX_RC_MCS;
715 716
		if (WLAN_RC_PHY_40(rate_table->info[rix].phy) &&
		    conf_is_ht40(&txrc->hw->conf))
717 718 719 720
			rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
		if (WLAN_RC_PHY_SGI(rate_table->info[rix].phy))
			rate->flags |= IEEE80211_TX_RC_SHORT_GI;
	}
721 722
}

723
static void ath_rc_rate_set_rtscts(struct ath_softc *sc,
724
				   const struct ath_rate_table *rate_table,
725 726 727 728 729 730 731 732
				   struct ieee80211_tx_info *tx_info)
{
	struct ieee80211_tx_rate *rates = tx_info->control.rates;
	int i = 0, rix = 0, cix, enable_g_protection = 0;

	/* get the cix for the lowest valid rix */
	for (i = 3; i >= 0; i--) {
		if (rates[i].count && (rates[i].idx >= 0)) {
733
			rix = ath_rc_get_rateindex(rate_table, &rates[i]);
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
			break;
		}
	}
	cix = rate_table->info[rix].ctrl_rate;

	/* All protection frames are transmited at 2Mb/s for 802.11g,
	 * otherwise we transmit them at 1Mb/s */
	if (sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ &&
	    !conf_is_ht(&sc->hw->conf))
		enable_g_protection = 1;

	/*
	 * If 802.11g protection is enabled, determine whether to use RTS/CTS or
	 * just CTS.  Note that this is only done for OFDM/HT unicast frames.
	 */
	if ((sc->sc_flags & SC_OP_PROTECT_ENABLE) &&
	    (rate_table->info[rix].phy == WLAN_RC_PHY_OFDM ||
	     WLAN_RC_PHY_HT(rate_table->info[rix].phy))) {
		rates[0].flags |= IEEE80211_TX_RC_USE_CTS_PROTECT;
		cix = rate_table->info[enable_g_protection].ctrl_rate;
	}

	tx_info->control.rts_cts_rate_idx = cix;
}

759 760
static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
			 struct ieee80211_tx_rate_control *txrc)
761
{
762 763
	struct ath_softc *sc = priv;
	struct ath_rate_priv *ath_rc_priv = priv_sta;
764
	const struct ath_rate_table *rate_table;
S
Sujith 已提交
765 766
	struct sk_buff *skb = txrc->skb;
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
S
Sujith 已提交
767
	struct ieee80211_tx_rate *rates = tx_info->control.rates;
768 769
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
	__le16 fc = hdr->frame_control;
770
	u8 try_per_rate, i = 0, rix;
S
Sujith 已提交
771
	int is_probe = 0;
772

773 774 775
	if (rate_control_send_low(sta, priv_sta, txrc))
		return;

776 777 778 779
	/*
	 * For Multi Rate Retry we use a different number of
	 * retry attempt counts. This ends up looking like this:
	 *
780 781 782 783
	 * MRR[0] = 4
	 * MRR[1] = 4
	 * MRR[2] = 4
	 * MRR[3] = 8
784 785
	 *
	 */
786
	try_per_rate = 4;
787

788
	rate_table = ath_rc_priv->rate_table;
789
	rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe);
790

L
Luis R. Rodriguez 已提交
791 792 793 794 795 796 797 798 799
	/*
	 * If we're in HT mode and both us and our peer supports LDPC.
	 * We don't need to check our own device's capabilities as our own
	 * ht capabilities would have already been intersected with our peer's.
	 */
	if (conf_is_ht(&sc->hw->conf) &&
	    (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
		tx_info->flags |= IEEE80211_TX_CTL_LDPC;

800 801 802 803
	if (conf_is_ht(&sc->hw->conf) &&
	    (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC))
		tx_info->flags |= (1 << IEEE80211_TX_CTL_STBC_SHIFT);

S
Sujith 已提交
804
	if (is_probe) {
805 806
		/* set one try for probe rates. For the
		 * probes don't enable rts */
807
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
808
				       1, rix, 0);
809 810 811 812

		/* Get the next tried/allowed rate. No RTS for the next series
		 * after the probe rate
		 */
813
		ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
814
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
815
				       try_per_rate, rix, 0);
816 817

		tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
818
	} else {
L
Lucas De Marchi 已提交
819
		/* Set the chosen rate. No RTS for first series entry. */
820
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
821
				       try_per_rate, rix, 0);
822 823 824
	}

	/* Fill in the other rates for multirate retry */
S
Sujith 已提交
825
	for ( ; i < 4; i++) {
826 827
		/* Use twice the number of tries for the last MRR segment. */
		if (i + 1 == 4)
828
			try_per_rate = 8;
829

830
		ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
831
		/* All other rates in the series have RTS enabled */
832
		ath_rc_rate_set_series(rate_table, &rates[i], txrc,
833
				       try_per_rate, rix, 1);
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
	}

	/*
	 * NB:Change rate series to enable aggregation when operating
	 * at lower MCS rates. When first rate in series is MCS2
	 * in HT40 @ 2.4GHz, series should look like:
	 *
	 * {MCS2, MCS1, MCS0, MCS0}.
	 *
	 * When first rate in series is MCS3 in HT20 @ 2.4GHz, series should
	 * look like:
	 *
	 * {MCS3, MCS2, MCS1, MCS1}
	 *
	 * So, set fourth rate in series to be same as third one for
	 * above conditions.
	 */
851
	if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
852
	    (conf_is_ht(&sc->hw->conf))) {
S
Sujith 已提交
853
		u8 dot11rate = rate_table->info[rix].dot11rate;
854 855 856
		u8 phy = rate_table->info[rix].phy;
		if (i == 4 &&
		    ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) ||
S
Sujith 已提交
857
		     (dot11rate == 3 && phy == WLAN_RC_PHY_HT_20_SS))) {
S
Sujith 已提交
858 859
			rates[3].idx = rates[2].idx;
			rates[3].flags = rates[2].flags;
860 861
		}
	}
862 863 864 865 866 867 868 869

	/*
	 * Force hardware to use computed duration for next
	 * fragment by disabling multi-rate retry, which
	 * updates duration based on the multi-rate duration table.
	 *
	 * FIXME: Fix duration
	 */
870 871
	if (ieee80211_has_morefrags(fc) ||
	    (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG)) {
872 873 874 875 876 877 878
		rates[1].count = rates[2].count = rates[3].count = 0;
		rates[1].idx = rates[2].idx = rates[3].idx = 0;
		rates[0].count = ATH_TXMAXTRY;
	}

	/* Setup RTS/CTS */
	ath_rc_rate_set_rtscts(sc, rate_table, tx_info);
879 880
}

881
static void ath_rc_update_per(struct ath_softc *sc,
882
			      const struct ath_rate_table *rate_table,
S
Sujith 已提交
883
			      struct ath_rate_priv *ath_rc_priv,
F
Felix Fietkau 已提交
884
				  struct ieee80211_tx_info *tx_info,
S
Sujith 已提交
885 886
			      int tx_rate, int xretries, int retries,
			      u32 now_msec)
887
{
F
Felix Fietkau 已提交
888
	int count, n_bad_frames;
889
	u8 last_per;
J
Joe Perches 已提交
890
	static const u32 nretry_to_per_lookup[10] = {
891 892 893 894 895 896 897 898 899 900 901 902
		100 * 0 / 1,
		100 * 1 / 4,
		100 * 1 / 2,
		100 * 3 / 4,
		100 * 4 / 5,
		100 * 5 / 6,
		100 * 6 / 7,
		100 * 7 / 8,
		100 * 8 / 9,
		100 * 9 / 10
	};

903
	last_per = ath_rc_priv->per[tx_rate];
F
Felix Fietkau 已提交
904
	n_bad_frames = tx_info->status.ampdu_len - tx_info->status.ampdu_ack_len;
905 906 907

	if (xretries) {
		if (xretries == 1) {
908 909 910
			ath_rc_priv->per[tx_rate] += 30;
			if (ath_rc_priv->per[tx_rate] > 100)
				ath_rc_priv->per[tx_rate] = 100;
911 912
		} else {
			/* xretries == 2 */
913
			count = ARRAY_SIZE(nretry_to_per_lookup);
914 915
			if (retries >= count)
				retries = count - 1;
S
Sujith 已提交
916

917
			/* new_PER = 7/8*old_PER + 1/8*(currentPER) */
918
			ath_rc_priv->per[tx_rate] =
S
Sujith 已提交
919
				(u8)(last_per - (last_per >> 3) + (100 >> 3));
920 921 922 923
		}

		/* xretries == 1 or 2 */

924 925
		if (ath_rc_priv->probe_rate == tx_rate)
			ath_rc_priv->probe_rate = 0;
926

S
Sujith 已提交
927
	} else { /* xretries == 0 */
928
		count = ARRAY_SIZE(nretry_to_per_lookup);
929 930
		if (retries >= count)
			retries = count - 1;
S
Sujith 已提交
931

F
Felix Fietkau 已提交
932
		if (n_bad_frames) {
S
Sujith 已提交
933
			/* new_PER = 7/8*old_PER + 1/8*(currentPER)
934 935 936 937 938 939 940 941 942 943 944
			 * Assuming that n_frames is not 0.  The current PER
			 * from the retries is 100 * retries / (retries+1),
			 * since the first retries attempts failed, and the
			 * next one worked.  For the one that worked,
			 * n_bad_frames subframes out of n_frames wored,
			 * so the PER for that part is
			 * 100 * n_bad_frames / n_frames, and it contributes
			 * 100 * n_bad_frames / (n_frames * (retries+1)) to
			 * the above PER.  The expression below is a
			 * simplified version of the sum of these two terms.
			 */
F
Felix Fietkau 已提交
945 946
			if (tx_info->status.ampdu_len > 0) {
				int n_frames, n_bad_tries;
S
Sujith 已提交
947 948
				u8 cur_per, new_per;

F
Felix Fietkau 已提交
949 950 951 952
				n_bad_tries = retries * tx_info->status.ampdu_len +
					n_bad_frames;
				n_frames = tx_info->status.ampdu_len * (retries + 1);
				cur_per = (100 * n_bad_tries / n_frames) >> 3;
S
Sujith 已提交
953
				new_per = (u8)(last_per - (last_per >> 3) + cur_per);
954
				ath_rc_priv->per[tx_rate] = new_per;
S
Sujith 已提交
955
			}
956
		} else {
957
			ath_rc_priv->per[tx_rate] =
S
Sujith 已提交
958 959
				(u8)(last_per - (last_per >> 3) +
				     (nretry_to_per_lookup[retries] >> 3));
960 961 962 963 964 965 966
		}


		/*
		 * If we got at most one retry then increase the max rate if
		 * this was a probe.  Otherwise, ignore the probe.
		 */
967
		if (ath_rc_priv->probe_rate && ath_rc_priv->probe_rate == tx_rate) {
F
Felix Fietkau 已提交
968
			if (retries > 0 || 2 * n_bad_frames > tx_info->status.ampdu_len) {
969 970 971 972 973 974 975
				/*
				 * Since we probed with just a single attempt,
				 * any retries means the probe failed.  Also,
				 * if the attempt worked, but more than half
				 * the subframes were bad then also consider
				 * the probe a failure.
				 */
976
				ath_rc_priv->probe_rate = 0;
977 978 979
			} else {
				u8 probe_rate = 0;

S
Sujith 已提交
980 981
				ath_rc_priv->rate_max_phy =
					ath_rc_priv->probe_rate;
982
				probe_rate = ath_rc_priv->probe_rate;
983

984 985
				if (ath_rc_priv->per[probe_rate] > 30)
					ath_rc_priv->per[probe_rate] = 20;
986

987
				ath_rc_priv->probe_rate = 0;
988 989 990 991 992

				/*
				 * Since this probe succeeded, we allow the next
				 * probe twice as soon.  This allows the maxRate
				 * to move up faster if the probes are
993
				 * successful.
994
				 */
S
Sujith 已提交
995 996
				ath_rc_priv->probe_time =
					now_msec - rate_table->probe_interval / 2;
997 998 999 1000 1001 1002 1003 1004
			}
		}

		if (retries > 0) {
			/*
			 * Don't update anything.  We don't know if
			 * this was because of collisions or poor signal.
			 */
1005
			ath_rc_priv->hw_maxretry_pktcnt = 0;
1006 1007 1008 1009 1010
		} else {
			/*
			 * It worked with no retries. First ignore bogus (small)
			 * rssi_ack values.
			 */
1011 1012 1013
			if (tx_rate == ath_rc_priv->rate_max_phy &&
			    ath_rc_priv->hw_maxretry_pktcnt < 255) {
				ath_rc_priv->hw_maxretry_pktcnt++;
1014 1015 1016 1017
			}

		}
	}
S
Sujith 已提交
1018 1019
}

1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
static void ath_debug_stat_retries(struct ath_rate_priv *rc, int rix,
				   int xretries, int retries, u8 per)
{
	struct ath_rc_stats *stats = &rc->rcstats[rix];

	stats->xretries += xretries;
	stats->retries += retries;
	stats->per = per;
}

S
Sujith 已提交
1030 1031 1032 1033 1034
/* Update PER, RSSI and whatever else that the code thinks it is doing.
   If you can make sense of all this, you really need to go out more. */

static void ath_rc_update_ht(struct ath_softc *sc,
			     struct ath_rate_priv *ath_rc_priv,
F
Felix Fietkau 已提交
1035
			     struct ieee80211_tx_info *tx_info,
S
Sujith 已提交
1036 1037 1038 1039 1040
			     int tx_rate, int xretries, int retries)
{
	u32 now_msec = jiffies_to_msecs(jiffies);
	int rate;
	u8 last_per;
1041
	const struct ath_rate_table *rate_table = ath_rc_priv->rate_table;
S
Sujith 已提交
1042 1043 1044 1045
	int size = ath_rc_priv->rate_table_size;

	if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt))
		return;
1046

1047
	last_per = ath_rc_priv->per[tx_rate];
S
Sujith 已提交
1048 1049

	/* Update PER first */
1050 1051 1052
	ath_rc_update_per(sc, rate_table, ath_rc_priv,
			  tx_info, tx_rate, xretries,
			  retries, now_msec);
1053 1054 1055 1056 1057

	/*
	 * If this rate looks bad (high PER) then stop using it for
	 * a while (except if we are probing).
	 */
1058
	if (ath_rc_priv->per[tx_rate] >= 55 && tx_rate > 0 &&
S
Sujith 已提交
1059
	    rate_table->info[tx_rate].ratekbps <=
1060
	    rate_table->info[ath_rc_priv->rate_max_phy].ratekbps) {
1061 1062
		ath_rc_get_lower_rix(rate_table, ath_rc_priv,
				     (u8)tx_rate, &ath_rc_priv->rate_max_phy);
1063 1064

		/* Don't probe for a little while. */
1065
		ath_rc_priv->probe_time = now_msec;
1066 1067 1068 1069
	}

	/* Make sure the rates below this have lower PER */
	/* Monotonicity is kept only for rates below the current rate. */
1070
	if (ath_rc_priv->per[tx_rate] < last_per) {
1071 1072
		for (rate = tx_rate - 1; rate >= 0; rate--) {

1073 1074 1075 1076
			if (ath_rc_priv->per[rate] >
			    ath_rc_priv->per[rate+1]) {
				ath_rc_priv->per[rate] =
					ath_rc_priv->per[rate+1];
1077 1078 1079 1080 1081
			}
		}
	}

	/* Maintain monotonicity for rates above the current rate */
S
Sujith 已提交
1082
	for (rate = tx_rate; rate < size - 1; rate++) {
1083 1084 1085 1086
		if (ath_rc_priv->per[rate+1] <
		    ath_rc_priv->per[rate])
			ath_rc_priv->per[rate+1] =
				ath_rc_priv->per[rate];
1087 1088 1089 1090
	}

	/* Every so often, we reduce the thresholds
	 * and PER (different for CCK and OFDM). */
1091
	if (now_msec - ath_rc_priv->per_down_time >=
1092
	    rate_table->probe_interval) {
S
Sujith 已提交
1093
		for (rate = 0; rate < size; rate++) {
1094 1095
			ath_rc_priv->per[rate] =
				7 * ath_rc_priv->per[rate] / 8;
1096 1097
		}

1098
		ath_rc_priv->per_down_time = now_msec;
1099
	}
S
Sujith 已提交
1100

1101
	ath_debug_stat_retries(ath_rc_priv, tx_rate, xretries, retries,
1102
			       ath_rc_priv->per[tx_rate]);
1103

S
Sujith 已提交
1104 1105
}

1106

S
Sujith 已提交
1107 1108 1109 1110
static void ath_rc_tx_status(struct ath_softc *sc,
			     struct ath_rate_priv *ath_rc_priv,
			     struct ieee80211_tx_info *tx_info,
			     int final_ts_idx, int xretries, int long_retry)
1111
{
1112
	const struct ath_rate_table *rate_table;
S
Sujith 已提交
1113
	struct ieee80211_tx_rate *rates = tx_info->status.rates;
1114
	u8 flags;
S
Sujith 已提交
1115
	u32 i = 0, rix;
1116

1117
	rate_table = ath_rc_priv->rate_table;
1118 1119 1120 1121 1122 1123 1124

	/*
	 * If the first rate is not the final index, there
	 * are intermediate rate failures to be processed.
	 */
	if (final_ts_idx != 0) {
		/* Process intermediate rates that failed.*/
S
Sujith 已提交
1125 1126 1127 1128
		for (i = 0; i < final_ts_idx ; i++) {
			if (rates[i].count != 0 && (rates[i].idx >= 0)) {
				flags = rates[i].flags;

1129 1130
				/* If HT40 and we have switched mode from
				 * 40 to 20 => don't update */
S
Sujith 已提交
1131

S
Sujith 已提交
1132
				if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
S
Sujith 已提交
1133
				    !(ath_rc_priv->ht_cap & WLAN_RC_40_FLAG))
1134
					return;
S
Sujith 已提交
1135

S
Sujith 已提交
1136
				rix = ath_rc_get_rateindex(rate_table, &rates[i]);
F
Felix Fietkau 已提交
1137 1138
				ath_rc_update_ht(sc, ath_rc_priv, tx_info,
						rix, xretries ? 1 : 2,
S
Sujith 已提交
1139
						rates[i].count);
1140 1141 1142 1143 1144 1145 1146 1147 1148
			}
		}
	} else {
		/*
		 * Handle the special case of MIMO PS burst, where the second
		 * aggregate is sent out with only one rate and one try.
		 * Treating it as an excessive retry penalizes the rate
		 * inordinately.
		 */
S
Sujith 已提交
1149
		if (rates[0].count == 1 && xretries == 1)
1150 1151 1152
			xretries = 2;
	}

S
Sujith 已提交
1153 1154
	flags = rates[i].flags;

1155
	/* If HT40 and we have switched mode from 40 to 20 => don't update */
S
Sujith 已提交
1156
	if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
S
Sujith 已提交
1157
	    !(ath_rc_priv->ht_cap & WLAN_RC_40_FLAG))
1158 1159
		return;

S
Sujith 已提交
1160
	rix = ath_rc_get_rateindex(rate_table, &rates[i]);
F
Felix Fietkau 已提交
1161
	ath_rc_update_ht(sc, ath_rc_priv, tx_info, rix, xretries, long_retry);
1162 1163
}

1164 1165 1166
static const
struct ath_rate_table *ath_choose_rate_table(struct ath_softc *sc,
					     enum ieee80211_band band,
1167
					     bool is_ht)
1168
{
1169
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1170 1171 1172 1173

	switch(band) {
	case IEEE80211_BAND_2GHZ:
		if (is_ht)
1174 1175
			return &ar5416_11ng_ratetable;
		return &ar5416_11g_ratetable;
1176 1177
	case IEEE80211_BAND_5GHZ:
		if (is_ht)
1178 1179
			return &ar5416_11na_ratetable;
		return &ar5416_11a_ratetable;
1180
	default:
J
Joe Perches 已提交
1181
		ath_dbg(common, ATH_DBG_CONFIG, "Invalid band\n");
1182 1183 1184 1185
		return NULL;
	}
}

1186
static void ath_rc_init(struct ath_softc *sc,
S
Sujith 已提交
1187
			struct ath_rate_priv *ath_rc_priv,
1188
			struct ieee80211_supported_band *sband,
1189
			struct ieee80211_sta *sta,
1190
			const struct ath_rate_table *rate_table)
1191
{
1192
	struct ath_rateset *rateset = &ath_rc_priv->neg_rates;
1193
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1194
	u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates;
1195 1196 1197 1198
	u8 i, j, k, hi = 0, hthi = 0;

	/* Initial rate table size. Will change depending
	 * on the working rate set */
S
Sujith 已提交
1199
	ath_rc_priv->rate_table_size = RATE_TABLE_SIZE;
1200 1201

	/* Initialize thresholds according to the global rate table */
1202
	for (i = 0 ; i < ath_rc_priv->rate_table_size; i++) {
1203
		ath_rc_priv->per[i] = 0;
1204 1205 1206
	}

	/* Determine the valid rates */
1207
	ath_rc_init_valid_rate_idx(ath_rc_priv);
1208 1209 1210

	for (i = 0; i < WLAN_RC_PHY_MAX; i++) {
		for (j = 0; j < MAX_TX_RATE_PHY; j++)
1211 1212
			ath_rc_priv->valid_phy_rateidx[i][j] = 0;
		ath_rc_priv->valid_phy_ratecnt[i] = 0;
1213 1214 1215 1216
	}

	if (!rateset->rs_nrates) {
		/* No working rate, just initialize valid rates */
S
Sujith 已提交
1217
		hi = ath_rc_init_validrates(ath_rc_priv, rate_table,
1218
					    ath_rc_priv->ht_cap);
1219 1220
	} else {
		/* Use intersection of working rates and valid rates */
S
Sujith 已提交
1221
		hi = ath_rc_setvalid_rates(ath_rc_priv, rate_table,
1222
					   rateset, ath_rc_priv->ht_cap);
1223
		if (ath_rc_priv->ht_cap & WLAN_RC_HT_FLAG) {
S
Sujith 已提交
1224
			hthi = ath_rc_setvalid_htrates(ath_rc_priv,
1225 1226 1227
						       rate_table,
						       ht_mcs,
						       ath_rc_priv->ht_cap);
1228
		}
1229
		hi = max(hi, hthi);
1230 1231
	}

1232 1233
	ath_rc_priv->rate_table_size = hi + 1;
	ath_rc_priv->rate_max_phy = 0;
1234
	BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
1235 1236

	for (i = 0, k = 0; i < WLAN_RC_PHY_MAX; i++) {
1237 1238 1239
		for (j = 0; j < ath_rc_priv->valid_phy_ratecnt[i]; j++) {
			ath_rc_priv->valid_rate_index[k++] =
				ath_rc_priv->valid_phy_rateidx[i][j];
1240 1241
		}

S
Sujith 已提交
1242
		if (!ath_rc_valid_phyrate(i, rate_table->initial_ratemax, 1)
1243
		    || !ath_rc_priv->valid_phy_ratecnt[i])
1244 1245
			continue;

1246
		ath_rc_priv->rate_max_phy = ath_rc_priv->valid_phy_rateidx[i][j-1];
1247
	}
1248 1249
	BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
	BUG_ON(k > RATE_TABLE_SIZE);
1250

1251 1252 1253
	ath_rc_priv->max_valid_rate = k;
	ath_rc_sort_validrates(rate_table, ath_rc_priv);
	ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4];
1254
	ath_rc_priv->rate_table = rate_table;
1255

J
Joe Perches 已提交
1256 1257 1258
	ath_dbg(common, ATH_DBG_CONFIG,
		"RC Initialized with capabilities: 0x%x\n",
		ath_rc_priv->ht_cap);
1259 1260
}

1261
static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
1262
			       bool is_cw40, bool is_sgi)
1263 1264 1265
{
	u8 caps = 0;

1266
	if (sta->ht_cap.ht_supported) {
1267
		caps = WLAN_RC_HT_FLAG;
1268 1269 1270
		if (sta->ht_cap.mcs.rx_mask[1] && sta->ht_cap.mcs.rx_mask[2])
			caps |= WLAN_RC_TS_FLAG | WLAN_RC_DS_FLAG;
		else if (sta->ht_cap.mcs.rx_mask[1])
1271
			caps |= WLAN_RC_DS_FLAG;
1272 1273
		if (is_cw40)
			caps |= WLAN_RC_40_FLAG;
1274
		if (is_sgi)
1275 1276 1277 1278 1279 1280
			caps |= WLAN_RC_SGI_FLAG;
	}

	return caps;
}

1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296
static bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an,
			      u8 tidno)
{
	struct ath_atx_tid *txtid;

	if (!(sc->sc_flags & SC_OP_TXAGGR))
		return false;

	txtid = ATH_AN_2_TID(an, tidno);

	if (!(txtid->state & (AGGR_ADDBA_COMPLETE | AGGR_ADDBA_PROGRESS)))
			return true;
	return false;
}


1297 1298 1299 1300
/***********************************/
/* mac80211 Rate Control callbacks */
/***********************************/

1301 1302 1303 1304 1305 1306 1307 1308 1309
static void ath_debug_stat_rc(struct ath_rate_priv *rc, int final_rate)
{
	struct ath_rc_stats *stats;

	stats = &rc->rcstats[final_rate];
	stats->success++;
}


1310 1311
static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
			  struct ieee80211_sta *sta, void *priv_sta,
1312 1313 1314
			  struct sk_buff *skb)
{
	struct ath_softc *sc = priv;
S
Sujith 已提交
1315
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1316 1317
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	struct ieee80211_hdr *hdr;
1318
	int final_ts_idx = 0, tx_status = 0;
F
Felix Fietkau 已提交
1319
	int long_retry = 0;
1320
	__le16 fc;
F
Felix Fietkau 已提交
1321
	int i;
1322 1323 1324

	hdr = (struct ieee80211_hdr *)skb->data;
	fc = hdr->frame_control;
1325
	for (i = 0; i < sc->hw->max_rates; i++) {
F
Felix Fietkau 已提交
1326 1327 1328 1329 1330 1331 1332
		struct ieee80211_tx_rate *rate = &tx_info->status.rates[i];
		if (!rate->count)
			break;

		final_ts_idx = i;
		long_retry = rate->count - 1;
	}
1333

1334 1335 1336 1337 1338 1339
	if (!priv_sta || !ieee80211_is_data(fc))
		return;

	/* This packet was aggregated but doesn't carry status info */
	if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) &&
	    !(tx_info->flags & IEEE80211_TX_STAT_AMPDU))
F
Felix Fietkau 已提交
1340
		return;
1341

F
Felix Fietkau 已提交
1342 1343
	if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED)
		return;
1344

1345 1346 1347 1348 1349 1350
	if (!(tx_info->flags & IEEE80211_TX_STAT_AMPDU)) {
		tx_info->status.ampdu_ack_len =
			(tx_info->flags & IEEE80211_TX_STAT_ACK ? 1 : 0);
		tx_info->status.ampdu_len = 1;
	}

1351
	if (!(tx_info->flags & IEEE80211_TX_STAT_ACK))
S
Sujith 已提交
1352 1353 1354
		tx_status = 1;

	ath_rc_tx_status(sc, ath_rc_priv, tx_info, final_ts_idx, tx_status,
1355
			 long_retry);
S
Sujith 已提交
1356

S
Sujith 已提交
1357
	/* Check if aggregation has to be enabled for this tid */
1358 1359
	if (conf_is_ht(&sc->hw->conf) &&
	    !(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
1360 1361
		if (ieee80211_is_data_qos(fc) &&
		    skb_get_queue_mapping(skb) != IEEE80211_AC_VO) {
S
Sujith 已提交
1362 1363 1364 1365 1366 1367 1368 1369
			u8 *qc, tid;
			struct ath_node *an;

			qc = ieee80211_get_qos_ctl(hdr);
			tid = qc[0] & 0xf;
			an = (struct ath_node *)sta->drv_priv;

			if(ath_tx_aggr_check(sc, an, tid))
1370
				ieee80211_start_tx_ba_session(sta, tid, 0);
S
Sujith 已提交
1371 1372
		}
	}
1373

1374 1375 1376
	ath_debug_stat_rc(ath_rc_priv,
		ath_rc_get_rateindex(ath_rc_priv->rate_table,
			&tx_info->status.rates[final_ts_idx]));
1377 1378
}

1379 1380
static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
                          struct ieee80211_sta *sta, void *priv_sta)
1381
{
1382
	struct ath_softc *sc = priv;
S
Sujith 已提交
1383
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1384
	const struct ath_rate_table *rate_table;
1385
	bool is_cw40, is_sgi = false;
1386 1387
	int i, j = 0;

S
Sujith 已提交
1388 1389 1390 1391 1392 1393 1394 1395
	for (i = 0; i < sband->n_bitrates; i++) {
		if (sta->supp_rates[sband->band] & BIT(i)) {
			ath_rc_priv->neg_rates.rs_rates[j]
				= (sband->bitrates[i].bitrate * 2) / 10;
			j++;
		}
	}
	ath_rc_priv->neg_rates.rs_nrates = j;
1396

1397
	if (sta->ht_cap.ht_supported) {
S
Sujith 已提交
1398
		for (i = 0, j = 0; i < 77; i++) {
J
Johannes Berg 已提交
1399
			if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
S
Sujith 已提交
1400
				ath_rc_priv->neg_ht_rates.rs_rates[j++] = i;
1401 1402 1403
			if (j == ATH_RATE_MAX)
				break;
		}
S
Sujith 已提交
1404
		ath_rc_priv->neg_ht_rates.rs_nrates = j;
1405
	}
S
Sujith 已提交
1406

1407
	is_cw40 = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40);
1408 1409

	if (is_cw40)
1410
		is_sgi = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
1411
	else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
1412
		is_sgi = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
1413 1414 1415

	/* Choose rate table first */

1416
	rate_table = ath_choose_rate_table(sc, sband->band,
1417
	                      sta->ht_cap.ht_supported);
1418

1419
	ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi);
1420 1421 1422 1423 1424
	ath_rc_init(sc, priv_sta, sband, sta, rate_table);
}

static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,
			    struct ieee80211_sta *sta, void *priv_sta,
1425
			    u32 changed, enum nl80211_channel_type oper_chan_type)
1426 1427 1428
{
	struct ath_softc *sc = priv;
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1429
	const struct ath_rate_table *rate_table = NULL;
1430
	bool oper_cw40 = false, oper_sgi;
1431 1432
	bool local_cw40 = !!(ath_rc_priv->ht_cap & WLAN_RC_40_FLAG);
	bool local_sgi = !!(ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG);
1433 1434 1435 1436 1437 1438 1439

	/* FIXME: Handle AP mode later when we support CWM */

	if (changed & IEEE80211_RC_HT_CHANGED) {
		if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
			return;

1440 1441
		if (oper_chan_type == NL80211_CHAN_HT40MINUS ||
		    oper_chan_type == NL80211_CHAN_HT40PLUS)
1442 1443
			oper_cw40 = true;

1444 1445 1446 1447 1448 1449 1450 1451
		if (oper_cw40)
			oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
				   true : false;
		else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
			oper_sgi = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
				   true : false;
		else
			oper_sgi = false;
1452

1453
		if ((local_cw40 != oper_cw40) || (local_sgi != oper_sgi)) {
1454
			rate_table = ath_choose_rate_table(sc, sband->band,
1455
						   sta->ht_cap.ht_supported);
1456
			ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta,
1457
						   oper_cw40, oper_sgi);
1458 1459
			ath_rc_init(sc, priv_sta, sband, sta, rate_table);

J
Joe Perches 已提交
1460 1461 1462
			ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
				"Operating HT Bandwidth changed to: %d\n",
				sc->hw->conf.channel_type);
1463 1464
		}
	}
1465 1466
}

1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
#ifdef CONFIG_ATH9K_DEBUGFS

static int ath9k_debugfs_open(struct inode *inode, struct file *file)
{
	file->private_data = inode->i_private;
	return 0;
}

static ssize_t read_file_rcstat(struct file *file, char __user *user_buf,
				size_t count, loff_t *ppos)
{
	struct ath_rate_priv *rc = file->private_data;
	char *buf;
	unsigned int len = 0, max;
	int i = 0;
	ssize_t retval;

	if (rc->rate_table == NULL)
		return 0;

1487
	max = 80 + rc->rate_table_size * 1024 + 1;
1488 1489 1490 1491 1492 1493 1494 1495 1496
	buf = kmalloc(max, GFP_KERNEL);
	if (buf == NULL)
		return -ENOMEM;

	len += sprintf(buf, "%6s %6s %6s "
		       "%10s %10s %10s %10s\n",
		       "HT", "MCS", "Rate",
		       "Success", "Retries", "XRetries", "PER");

1497
	for (i = 0; i < rc->rate_table_size; i++) {
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554
		u32 ratekbps = rc->rate_table->info[i].ratekbps;
		struct ath_rc_stats *stats = &rc->rcstats[i];
		char mcs[5];
		char htmode[5];
		int used_mcs = 0, used_htmode = 0;

		if (WLAN_RC_PHY_HT(rc->rate_table->info[i].phy)) {
			used_mcs = snprintf(mcs, 5, "%d",
				rc->rate_table->info[i].ratecode);

			if (WLAN_RC_PHY_40(rc->rate_table->info[i].phy))
				used_htmode = snprintf(htmode, 5, "HT40");
			else if (WLAN_RC_PHY_20(rc->rate_table->info[i].phy))
				used_htmode = snprintf(htmode, 5, "HT20");
			else
				used_htmode = snprintf(htmode, 5, "????");
		}

		mcs[used_mcs] = '\0';
		htmode[used_htmode] = '\0';

		len += snprintf(buf + len, max - len,
			"%6s %6s %3u.%d: "
			"%10u %10u %10u %10u\n",
			htmode,
			mcs,
			ratekbps / 1000,
			(ratekbps % 1000) / 100,
			stats->success,
			stats->retries,
			stats->xretries,
			stats->per);
	}

	if (len > max)
		len = max;

	retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
	kfree(buf);
	return retval;
}

static const struct file_operations fops_rcstat = {
	.read = read_file_rcstat,
	.open = ath9k_debugfs_open,
	.owner = THIS_MODULE
};

static void ath_rate_add_sta_debugfs(void *priv, void *priv_sta,
				     struct dentry *dir)
{
	struct ath_rate_priv *rc = priv_sta;
	debugfs_create_file("rc_stats", S_IRUGO, dir, rc, &fops_rcstat);
}

#endif /* CONFIG_ATH9K_DEBUGFS */

1555
static void *ath_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
1556
{
1557
	return hw->priv;
1558 1559 1560 1561 1562 1563 1564
}

static void ath_rate_free(void *priv)
{
	return;
}

1565
static void *ath_rate_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
1566 1567
{
	struct ath_softc *sc = priv;
S
Sujith 已提交
1568
	struct ath_rate_priv *rate_priv;
1569

S
Sujith 已提交
1570
	rate_priv = kzalloc(sizeof(struct ath_rate_priv), gfp);
1571
	if (!rate_priv) {
1572 1573
		ath_err(ath9k_hw_common(sc->sc_ah),
			"Unable to allocate private rc structure\n");
1574 1575
		return NULL;
	}
S
Sujith 已提交
1576

1577 1578 1579
	return rate_priv;
}

1580 1581
static void ath_rate_free_sta(void *priv, struct ieee80211_sta *sta,
			      void *priv_sta)
1582
{
S
Sujith 已提交
1583
	struct ath_rate_priv *rate_priv = priv_sta;
S
Sujith 已提交
1584
	kfree(rate_priv);
1585 1586 1587 1588 1589 1590 1591 1592
}

static struct rate_control_ops ath_rate_ops = {
	.module = NULL,
	.name = "ath9k_rate_control",
	.tx_status = ath_tx_status,
	.get_rate = ath_get_rate,
	.rate_init = ath_rate_init,
1593
	.rate_update = ath_rate_update,
1594 1595 1596
	.alloc = ath_rate_alloc,
	.free = ath_rate_free,
	.alloc_sta = ath_rate_alloc_sta,
1597
	.free_sta = ath_rate_free_sta,
1598 1599 1600
#ifdef CONFIG_ATH9K_DEBUGFS
	.add_sta_debugfs = ath_rate_add_sta_debugfs,
#endif
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
};

int ath_rate_control_register(void)
{
	return ieee80211_rate_control_register(&ath_rate_ops);
}

void ath_rate_control_unregister(void)
{
	ieee80211_rate_control_unregister(&ath_rate_ops);
}