rc.c 51.2 KB
Newer Older
1 2
/*
 * Copyright (c) 2004 Video54 Technologies, Inc.
3
 * Copyright (c) 2004-2009 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 382 383
static int ath_rc_get_rateindex(const struct ath_rate_table *rate_table,
				struct ieee80211_tx_rate *rate);

384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
static inline int8_t median(int8_t a, int8_t b, int8_t c)
{
	if (a >= b) {
		if (b >= c)
			return b;
		else if (a > c)
			return c;
		else
			return a;
	} else {
		if (a >= c)
			return a;
		else if (b >= c)
			return c;
		else
			return b;
	}
}

403
static void ath_rc_sort_validrates(const struct ath_rate_table *rate_table,
S
Sujith 已提交
404
				   struct ath_rate_priv *ath_rc_priv)
405 406 407
{
	u8 i, j, idx, idx_next;

408
	for (i = ath_rc_priv->max_valid_rate - 1; i > 0; i--) {
409
		for (j = 0; j <= i-1; j++) {
410 411
			idx = ath_rc_priv->valid_rate_index[j];
			idx_next = ath_rc_priv->valid_rate_index[j+1];
412 413 414

			if (rate_table->info[idx].ratekbps >
				rate_table->info[idx_next].ratekbps) {
415 416
				ath_rc_priv->valid_rate_index[j] = idx_next;
				ath_rc_priv->valid_rate_index[j+1] = idx;
417 418 419 420 421
			}
		}
	}
}

S
Sujith 已提交
422
static void ath_rc_init_valid_txmask(struct ath_rate_priv *ath_rc_priv)
423 424 425
{
	u8 i;

426
	for (i = 0; i < ath_rc_priv->rate_table_size; i++)
S
Sujith 已提交
427
		ath_rc_priv->valid_rate_index[i] = 0;
428 429
}

S
Sujith 已提交
430
static inline void ath_rc_set_valid_txmask(struct ath_rate_priv *ath_rc_priv,
431 432
					   u8 index, int valid_tx_rate)
{
433
	BUG_ON(index > ath_rc_priv->rate_table_size);
434
	ath_rc_priv->valid_rate_index[index] = !!valid_tx_rate;
435 436
}

437 438 439 440 441
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)
442 443 444
{
	u8 i;

445 446 447
	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 已提交
448
			return 1;
449 450 451 452 453
		}
	}

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

S
Sujith 已提交
455
	return 0;
456 457 458 459 460 461
}

/* Return true only for single stream */

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

static inline int
477 478 479
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)
480 481 482
{
	int8_t i;

483 484 485
	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 已提交
486
			return 1;
487 488
		}
	}
S
Sujith 已提交
489

S
Sujith 已提交
490
	return 0;
491 492
}

S
Sujith 已提交
493
static u8 ath_rc_init_validrates(struct ath_rate_priv *ath_rc_priv,
494
				 const struct ath_rate_table *rate_table,
S
Sujith 已提交
495
				 u32 capflag)
496 497 498 499
{
	u8 i, hi = 0;

	for (i = 0; i < rate_table->rate_cnt; i++) {
500
		if (rate_table->info[i].rate_flags & RC_LEGACY) {
501 502 503
			u32 phy = rate_table->info[i].phy;
			u8 valid_rate_count = 0;

S
Sujith 已提交
504
			if (!ath_rc_valid_phyrate(phy, capflag, 0))
505 506
				continue;

507
			valid_rate_count = ath_rc_priv->valid_phy_ratecnt[phy];
508

509 510
			ath_rc_priv->valid_phy_rateidx[phy][valid_rate_count] = i;
			ath_rc_priv->valid_phy_ratecnt[phy] += 1;
S
Sujith 已提交
511
			ath_rc_set_valid_txmask(ath_rc_priv, i, 1);
512
			hi = i;
513 514
		}
	}
S
Sujith 已提交
515

516 517 518
	return hi;
}

S
Sujith 已提交
519
static u8 ath_rc_setvalid_rates(struct ath_rate_priv *ath_rc_priv,
520
				const struct ath_rate_table *rate_table,
S
Sujith 已提交
521 522
				struct ath_rateset *rateset,
				u32 capflag)
523 524 525 526 527 528 529
{
	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;
530
			u16 rate_flags = rate_table->info[j].rate_flags;
S
Sujith 已提交
531 532
			u8 rate = rateset->rs_rates[i];
			u8 dot11rate = rate_table->info[j].dot11rate;
533 534 535

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

538
			if ((rate == dot11rate) &&
539 540 541
			    (rate_flags & WLAN_RC_CAP_MODE(capflag)) ==
			    WLAN_RC_CAP_MODE(capflag) &&
			    (rate_flags & WLAN_RC_CAP_STREAM(capflag)) &&
S
Sujith 已提交
542
			    !WLAN_RC_PHY_HT(phy)) {
543 544
				u8 valid_rate_count = 0;

S
Sujith 已提交
545
				if (!ath_rc_valid_phyrate(phy, capflag, 0))
546 547 548
					continue;

				valid_rate_count =
549
					ath_rc_priv->valid_phy_ratecnt[phy];
550

551
				ath_rc_priv->valid_phy_rateidx[phy]
552
					[valid_rate_count] = j;
553
				ath_rc_priv->valid_phy_ratecnt[phy] += 1;
S
Sujith 已提交
554
				ath_rc_set_valid_txmask(ath_rc_priv, j, 1);
555 556 557 558
				hi = A_MAX(hi, j);
			}
		}
	}
S
Sujith 已提交
559

560 561 562
	return hi;
}

S
Sujith 已提交
563
static u8 ath_rc_setvalid_htrates(struct ath_rate_priv *ath_rc_priv,
564
				  const struct ath_rate_table *rate_table,
S
Sujith 已提交
565
				  u8 *mcs_set, u32 capflag)
566
{
S
Sujith 已提交
567 568
	struct ath_rateset *rateset = (struct ath_rateset *)mcs_set;

569 570 571
	u8 i, j, hi = 0;

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

579
			if ((rate != dot11rate) || !WLAN_RC_PHY_HT(phy) ||
580 581
			    !(rate_flags & WLAN_RC_CAP_STREAM(capflag)) ||
			    !WLAN_RC_PHY_HT_VALID(rate_flags, capflag))
582 583
				continue;

S
Sujith 已提交
584
			if (!ath_rc_valid_phyrate(phy, capflag, 0))
585 586
				continue;

587 588 589
			ath_rc_priv->valid_phy_rateidx[phy]
				[ath_rc_priv->valid_phy_ratecnt[phy]] = j;
			ath_rc_priv->valid_phy_ratecnt[phy] += 1;
S
Sujith 已提交
590
			ath_rc_set_valid_txmask(ath_rc_priv, j, 1);
591 592 593 594
			hi = A_MAX(hi, j);
		}
	}

S
Sujith 已提交
595
	return hi;
596 597
}

598 599 600 601 602
/* 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)
603
{
604
	u32 best_thruput, this_thruput, now_msec;
605
	u8 rate, next_rate, best_rate, maxindex, minindex;
606
	int8_t index = 0;
607 608

	now_msec = jiffies_to_msecs(jiffies);
609
	*is_probing = 0;
610
	best_thruput = 0;
611
	maxindex = ath_rc_priv->max_valid_rate-1;
612 613 614 615 616 617 618 619 620 621
	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;

622 623
		rate = ath_rc_priv->valid_rate_index[index];
		if (rate > ath_rc_priv->rate_max_phy)
624 625 626 627 628 629 630 631 632 633 634 635 636
			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.
		 */
637
		per_thres = ath_rc_priv->per[rate];
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
		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 已提交
657
	if (rate >= ath_rc_priv->rate_max_phy) {
658
		rate = ath_rc_priv->rate_max_phy;
659 660 661

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

674 675
	if (rate > (ath_rc_priv->rate_table_size - 1))
		rate = ath_rc_priv->rate_table_size - 1;
676

677 678 679 680 681 682
	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)))
683 684
		return rate;

685
	if (RC_SS_OR_LEGACY(rate_table->info[rate].rate_flags))
686 687 688 689 690 691
		return rate;

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

	rate = ath_rc_priv->valid_rate_index[0];
692 693 694 695

	return rate;
}

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

704 705 706
	if (txrc->short_preamble)
		rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE;
	if (txrc->rts || rtsctsenable)
S
Sujith 已提交
707
		rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS;
708 709

	if (WLAN_RC_PHY_HT(rate_table->info[rix].phy)) {
S
Sujith 已提交
710
		rate->flags |= IEEE80211_TX_RC_MCS;
711 712 713 714 715
		if (WLAN_RC_PHY_40(rate_table->info[rix].phy))
			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;
	}
716 717
}

718
static void ath_rc_rate_set_rtscts(struct ath_softc *sc,
719
				   const struct ath_rate_table *rate_table,
720 721 722 723 724 725 726 727
				   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)) {
728
			rix = ath_rc_get_rateindex(rate_table, &rates[i]);
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
			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;
}

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

768 769 770
	if (rate_control_send_low(sta, priv_sta, txrc))
		return;

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

783
	rate_table = ath_rc_priv->rate_table;
784
	rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe);
785

L
Luis R. Rodriguez 已提交
786 787 788 789 790 791 792 793 794
	/*
	 * 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;

795 796 797 798
	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 已提交
799
	if (is_probe) {
800 801
		/* set one try for probe rates. For the
		 * probes don't enable rts */
802
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
803
				       1, rix, 0);
804 805 806 807

		/* Get the next tried/allowed rate. No RTS for the next series
		 * after the probe rate
		 */
808
		ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
809
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
810
				       try_per_rate, rix, 0);
811 812

		tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
813 814
	} else {
		/* Set the choosen rate. No RTS for first series entry. */
815
		ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
816
				       try_per_rate, rix, 0);
817 818 819
	}

	/* Fill in the other rates for multirate retry */
S
Sujith 已提交
820
	for ( ; i < 4; i++) {
821 822
		/* Use twice the number of tries for the last MRR segment. */
		if (i + 1 == 4)
823
			try_per_rate = 8;
824

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

	/*
	 * 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.
	 */
846
	if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
847
	    (conf_is_ht(&sc->hw->conf))) {
S
Sujith 已提交
848
		u8 dot11rate = rate_table->info[rix].dot11rate;
849 850 851
		u8 phy = rate_table->info[rix].phy;
		if (i == 4 &&
		    ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) ||
S
Sujith 已提交
852
		     (dot11rate == 3 && phy == WLAN_RC_PHY_HT_20_SS))) {
S
Sujith 已提交
853 854
			rates[3].idx = rates[2].idx;
			rates[3].flags = rates[2].flags;
855 856
		}
	}
857 858 859 860 861 862 863 864

	/*
	 * 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
	 */
865 866
	if (ieee80211_has_morefrags(fc) ||
	    (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG)) {
867 868 869 870 871 872 873
		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);
874 875
}

S
Sujith 已提交
876
static bool ath_rc_update_per(struct ath_softc *sc,
877
			      const struct ath_rate_table *rate_table,
S
Sujith 已提交
878
			      struct ath_rate_priv *ath_rc_priv,
F
Felix Fietkau 已提交
879
				  struct ieee80211_tx_info *tx_info,
S
Sujith 已提交
880 881
			      int tx_rate, int xretries, int retries,
			      u32 now_msec)
882
{
S
Sujith 已提交
883
	bool state_change = false;
F
Felix Fietkau 已提交
884
	int count, n_bad_frames;
885 886 887 888 889 890 891 892 893 894 895 896 897 898
	u8 last_per;
	static u32 nretry_to_per_lookup[10] = {
		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
	};

899
	last_per = ath_rc_priv->per[tx_rate];
F
Felix Fietkau 已提交
900
	n_bad_frames = tx_info->status.ampdu_len - tx_info->status.ampdu_ack_len;
901 902 903

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

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

		/* xretries == 1 or 2 */

920 921
		if (ath_rc_priv->probe_rate == tx_rate)
			ath_rc_priv->probe_rate = 0;
922

S
Sujith 已提交
923
	} else { /* xretries == 0 */
924
		count = ARRAY_SIZE(nretry_to_per_lookup);
925 926
		if (retries >= count)
			retries = count - 1;
S
Sujith 已提交
927

F
Felix Fietkau 已提交
928
		if (n_bad_frames) {
S
Sujith 已提交
929
			/* new_PER = 7/8*old_PER + 1/8*(currentPER)
930 931 932 933 934 935 936 937 938 939 940
			 * 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 已提交
941 942
			if (tx_info->status.ampdu_len > 0) {
				int n_frames, n_bad_tries;
S
Sujith 已提交
943 944
				u8 cur_per, new_per;

F
Felix Fietkau 已提交
945 946 947 948
				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 已提交
949
				new_per = (u8)(last_per - (last_per >> 3) + cur_per);
950
				ath_rc_priv->per[tx_rate] = new_per;
S
Sujith 已提交
951
			}
952
		} else {
953
			ath_rc_priv->per[tx_rate] =
S
Sujith 已提交
954 955
				(u8)(last_per - (last_per >> 3) +
				     (nretry_to_per_lookup[retries] >> 3));
956 957 958 959 960 961 962
		}


		/*
		 * If we got at most one retry then increase the max rate if
		 * this was a probe.  Otherwise, ignore the probe.
		 */
963
		if (ath_rc_priv->probe_rate && ath_rc_priv->probe_rate == tx_rate) {
F
Felix Fietkau 已提交
964
			if (retries > 0 || 2 * n_bad_frames > tx_info->status.ampdu_len) {
965 966 967 968 969 970 971
				/*
				 * 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.
				 */
972
				ath_rc_priv->probe_rate = 0;
973 974 975
			} else {
				u8 probe_rate = 0;

S
Sujith 已提交
976 977
				ath_rc_priv->rate_max_phy =
					ath_rc_priv->probe_rate;
978
				probe_rate = ath_rc_priv->probe_rate;
979

980 981
				if (ath_rc_priv->per[probe_rate] > 30)
					ath_rc_priv->per[probe_rate] = 20;
982

983
				ath_rc_priv->probe_rate = 0;
984 985 986 987 988

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

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

		}
	}
1014

S
Sujith 已提交
1015 1016 1017
	return state_change;
}

1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
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 已提交
1028 1029 1030 1031 1032
/* 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 已提交
1033
			     struct ieee80211_tx_info *tx_info,
S
Sujith 已提交
1034 1035 1036 1037 1038 1039
			     int tx_rate, int xretries, int retries)
{
	u32 now_msec = jiffies_to_msecs(jiffies);
	int rate;
	u8 last_per;
	bool state_change = false;
1040
	const struct ath_rate_table *rate_table = ath_rc_priv->rate_table;
S
Sujith 已提交
1041 1042 1043 1044
	int size = ath_rc_priv->rate_table_size;

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

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

	/* Update PER first */
	state_change = ath_rc_update_per(sc, rate_table, ath_rc_priv,
F
Felix Fietkau 已提交
1050
					 tx_info, tx_rate, xretries,
S
Sujith 已提交
1051
					 retries, now_msec);
1052 1053 1054 1055 1056

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

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

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

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

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

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

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

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

S
Sujith 已提交
1103 1104
}

1105
static int ath_rc_get_rateindex(const struct ath_rate_table *rate_table,
S
Sujith 已提交
1106 1107
				struct ieee80211_tx_rate *rate)
{
1108 1109
	int rix = 0, i = 0;
	int mcs_rix_off[] = { 7, 15, 20, 21, 22, 23 };
S
Sujith 已提交
1110

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

1114 1115 1116 1117 1118 1119 1120
	while (rate->idx > mcs_rix_off[i] &&
	      i < sizeof(mcs_rix_off)/sizeof(int)) {
		rix++; i++;
	}

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

S
Sujith 已提交
1121 1122
	if ((rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
	    (rate->flags & IEEE80211_TX_RC_SHORT_GI))
1123
		rix = rate_table->info[rix].ht_index;
S
Sujith 已提交
1124
	else if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
1125
		rix = rate_table->info[rix].sgi_index;
S
Sujith 已提交
1126
	else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
1127
		rix = rate_table->info[rix].cw40index;
S
Sujith 已提交
1128 1129

	return rix;
1130 1131
}

S
Sujith 已提交
1132 1133 1134 1135
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)
1136
{
1137
	const struct ath_rate_table *rate_table;
S
Sujith 已提交
1138
	struct ieee80211_tx_rate *rates = tx_info->status.rates;
1139
	u8 flags;
S
Sujith 已提交
1140
	u32 i = 0, rix;
1141

1142
	rate_table = ath_rc_priv->rate_table;
1143 1144 1145 1146 1147 1148 1149

	/*
	 * 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 已提交
1150 1151 1152 1153
		for (i = 0; i < final_ts_idx ; i++) {
			if (rates[i].count != 0 && (rates[i].idx >= 0)) {
				flags = rates[i].flags;

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

S
Sujith 已提交
1157
				if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
S
Sujith 已提交
1158
				    !(ath_rc_priv->ht_cap & WLAN_RC_40_FLAG))
1159
					return;
S
Sujith 已提交
1160

S
Sujith 已提交
1161
				rix = ath_rc_get_rateindex(rate_table, &rates[i]);
F
Felix Fietkau 已提交
1162 1163
				ath_rc_update_ht(sc, ath_rc_priv, tx_info,
						rix, xretries ? 1 : 2,
S
Sujith 已提交
1164
						rates[i].count);
1165 1166 1167 1168 1169 1170 1171 1172 1173
			}
		}
	} 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 已提交
1174
		if (rates[0].count == 1 && xretries == 1)
1175 1176 1177
			xretries = 2;
	}

S
Sujith 已提交
1178 1179
	flags = rates[i].flags;

1180
	/* If HT40 and we have switched mode from 40 to 20 => don't update */
S
Sujith 已提交
1181
	if ((flags & IEEE80211_TX_RC_40_MHZ_WIDTH) &&
S
Sujith 已提交
1182
	    !(ath_rc_priv->ht_cap & WLAN_RC_40_FLAG))
1183 1184
		return;

S
Sujith 已提交
1185
	rix = ath_rc_get_rateindex(rate_table, &rates[i]);
F
Felix Fietkau 已提交
1186
	ath_rc_update_ht(sc, ath_rc_priv, tx_info, rix, xretries, long_retry);
1187 1188
}

1189 1190 1191
static const
struct ath_rate_table *ath_choose_rate_table(struct ath_softc *sc,
					     enum ieee80211_band band,
1192
					     bool is_ht)
1193
{
1194
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1195 1196 1197 1198

	switch(band) {
	case IEEE80211_BAND_2GHZ:
		if (is_ht)
1199 1200
			return &ar5416_11ng_ratetable;
		return &ar5416_11g_ratetable;
1201 1202
	case IEEE80211_BAND_5GHZ:
		if (is_ht)
1203 1204
			return &ar5416_11na_ratetable;
		return &ar5416_11a_ratetable;
1205
	default:
1206
		ath_print(common, ATH_DBG_CONFIG, "Invalid band\n");
1207 1208 1209 1210
		return NULL;
	}
}

1211
static void ath_rc_init(struct ath_softc *sc,
S
Sujith 已提交
1212
			struct ath_rate_priv *ath_rc_priv,
1213
			struct ieee80211_supported_band *sband,
1214
			struct ieee80211_sta *sta,
1215
			const struct ath_rate_table *rate_table)
1216
{
1217
	struct ath_rateset *rateset = &ath_rc_priv->neg_rates;
1218
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1219
	u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates;
1220 1221 1222 1223
	u8 i, j, k, hi = 0, hthi = 0;

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

	/* Initialize thresholds according to the global rate table */
1227
	for (i = 0 ; i < ath_rc_priv->rate_table_size; i++) {
1228
		ath_rc_priv->per[i] = 0;
1229 1230 1231
	}

	/* Determine the valid rates */
1232
	ath_rc_init_valid_txmask(ath_rc_priv);
1233 1234 1235

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

	if (!rateset->rs_nrates) {
		/* No working rate, just initialize valid rates */
S
Sujith 已提交
1242
		hi = ath_rc_init_validrates(ath_rc_priv, rate_table,
1243
					    ath_rc_priv->ht_cap);
1244 1245
	} else {
		/* Use intersection of working rates and valid rates */
S
Sujith 已提交
1246
		hi = ath_rc_setvalid_rates(ath_rc_priv, rate_table,
1247
					   rateset, ath_rc_priv->ht_cap);
1248
		if (ath_rc_priv->ht_cap & WLAN_RC_HT_FLAG) {
S
Sujith 已提交
1249
			hthi = ath_rc_setvalid_htrates(ath_rc_priv,
1250 1251 1252
						       rate_table,
						       ht_mcs,
						       ath_rc_priv->ht_cap);
1253 1254 1255 1256
		}
		hi = A_MAX(hi, hthi);
	}

1257 1258
	ath_rc_priv->rate_table_size = hi + 1;
	ath_rc_priv->rate_max_phy = 0;
1259
	BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
1260 1261

	for (i = 0, k = 0; i < WLAN_RC_PHY_MAX; i++) {
1262 1263 1264
		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];
1265 1266
		}

S
Sujith 已提交
1267
		if (!ath_rc_valid_phyrate(i, rate_table->initial_ratemax, 1)
1268
		    || !ath_rc_priv->valid_phy_ratecnt[i])
1269 1270
			continue;

1271
		ath_rc_priv->rate_max_phy = ath_rc_priv->valid_phy_rateidx[i][j-1];
1272
	}
1273 1274
	BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
	BUG_ON(k > RATE_TABLE_SIZE);
1275

1276 1277 1278
	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];
1279
	ath_rc_priv->rate_table = rate_table;
1280

1281 1282 1283
	ath_print(common, ATH_DBG_CONFIG,
		  "RC Initialized with capabilities: 0x%x\n",
		  ath_rc_priv->ht_cap);
1284 1285
}

1286
static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
1287
			       bool is_cw40, bool is_sgi)
1288 1289 1290
{
	u8 caps = 0;

1291
	if (sta->ht_cap.ht_supported) {
1292
		caps = WLAN_RC_HT_FLAG;
1293 1294 1295
		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])
1296
			caps |= WLAN_RC_DS_FLAG;
1297 1298
		if (is_cw40)
			caps |= WLAN_RC_40_FLAG;
1299
		if (is_sgi)
1300 1301 1302 1303 1304 1305
			caps |= WLAN_RC_SGI_FLAG;
	}

	return caps;
}

1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321
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;
}


1322 1323 1324 1325
/***********************************/
/* mac80211 Rate Control callbacks */
/***********************************/

1326 1327 1328 1329 1330 1331 1332 1333 1334
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++;
}


1335 1336
static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
			  struct ieee80211_sta *sta, void *priv_sta,
1337 1338 1339
			  struct sk_buff *skb)
{
	struct ath_softc *sc = priv;
S
Sujith 已提交
1340
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1341 1342
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
	struct ieee80211_hdr *hdr;
F
Felix Fietkau 已提交
1343 1344
	int final_ts_idx = 0, tx_status = 0, is_underrun = 0;
	int long_retry = 0;
1345
	__le16 fc;
F
Felix Fietkau 已提交
1346
	int i;
1347 1348 1349

	hdr = (struct ieee80211_hdr *)skb->data;
	fc = hdr->frame_control;
F
Felix Fietkau 已提交
1350 1351 1352 1353 1354 1355 1356 1357
	for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
		struct ieee80211_tx_rate *rate = &tx_info->status.rates[i];
		if (!rate->count)
			break;

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

1359 1360 1361 1362 1363 1364
	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 已提交
1365
		return;
1366

F
Felix Fietkau 已提交
1367 1368
	if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED)
		return;
1369

1370 1371 1372 1373 1374 1375
	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;
	}

S
Sujith 已提交
1376
	/*
1377 1378 1379 1380 1381 1382 1383 1384
	 * If an underrun error is seen assume it as an excessive retry only
	 * if max frame trigger level has been reached (2 KB for singel stream,
	 * and 4 KB for dual stream). Adjust the long retry as if the frame was
	 * tried hw->max_rate_tries times to affect how ratectrl updates PER for
	 * the failed rate. In case of congestion on the bus penalizing these
	 * type of underruns should help hardware actually transmit new frames
	 * successfully by eventually preferring slower rates. This itself
	 * should also alleviate congestion on the bus.
S
Sujith 已提交
1385
	 */
F
Felix Fietkau 已提交
1386 1387
	if ((tx_info->pad[0] & ATH_TX_INFO_UNDERRUN) &&
	    (sc->sc_ah->tx_trig_level >= ath_rc_priv->tx_triglevel_max)) {
S
Sujith 已提交
1388 1389 1390 1391
		tx_status = 1;
		is_underrun = 1;
	}

F
Felix Fietkau 已提交
1392
	if (tx_info->pad[0] & ATH_TX_INFO_XRETRY)
S
Sujith 已提交
1393 1394 1395
		tx_status = 1;

	ath_rc_tx_status(sc, ath_rc_priv, tx_info, final_ts_idx, tx_status,
F
Felix Fietkau 已提交
1396
			 (is_underrun) ? sc->hw->max_rate_tries : long_retry);
S
Sujith 已提交
1397

S
Sujith 已提交
1398
	/* Check if aggregation has to be enabled for this tid */
1399 1400
	if (conf_is_ht(&sc->hw->conf) &&
	    !(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
S
Sujith 已提交
1401 1402 1403 1404 1405 1406 1407 1408 1409
		if (ieee80211_is_data_qos(fc)) {
			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))
1410
				ieee80211_start_tx_ba_session(sta, tid);
S
Sujith 已提交
1411 1412
		}
	}
1413

1414 1415 1416
	ath_debug_stat_rc(ath_rc_priv,
		ath_rc_get_rateindex(ath_rc_priv->rate_table,
			&tx_info->status.rates[final_ts_idx]));
1417 1418
}

1419 1420
static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
                          struct ieee80211_sta *sta, void *priv_sta)
1421
{
1422
	struct ath_softc *sc = priv;
S
Sujith 已提交
1423
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1424
	const struct ath_rate_table *rate_table;
1425
	bool is_cw40, is_sgi = false;
1426 1427
	int i, j = 0;

S
Sujith 已提交
1428 1429 1430 1431 1432 1433 1434 1435
	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;
1436

1437
	if (sta->ht_cap.ht_supported) {
S
Sujith 已提交
1438
		for (i = 0, j = 0; i < 77; i++) {
J
Johannes Berg 已提交
1439
			if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
S
Sujith 已提交
1440
				ath_rc_priv->neg_ht_rates.rs_rates[j++] = i;
1441 1442 1443
			if (j == ATH_RATE_MAX)
				break;
		}
S
Sujith 已提交
1444
		ath_rc_priv->neg_ht_rates.rs_nrates = j;
1445
	}
S
Sujith 已提交
1446

1447
	is_cw40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
1448 1449 1450 1451 1452

	if (is_cw40)
		is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
	else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
		is_sgi = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
1453 1454 1455

	/* Choose rate table first */

1456
	rate_table = ath_choose_rate_table(sc, sband->band,
1457
	                      sta->ht_cap.ht_supported);
1458

1459
	ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi);
1460 1461 1462 1463 1464
	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,
1465
			    u32 changed, enum nl80211_channel_type oper_chan_type)
1466 1467 1468
{
	struct ath_softc *sc = priv;
	struct ath_rate_priv *ath_rc_priv = priv_sta;
1469
	const struct ath_rate_table *rate_table = NULL;
1470
	bool oper_cw40 = false, oper_sgi;
1471 1472
	bool local_cw40 = (ath_rc_priv->ht_cap & WLAN_RC_40_FLAG) ?
		true : false;
1473
	bool local_sgi = (ath_rc_priv->ht_cap & WLAN_RC_SGI_FLAG) ?
1474 1475 1476 1477 1478 1479 1480 1481
		true : false;

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

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

1482 1483
		if (oper_chan_type == NL80211_CHAN_HT40MINUS ||
		    oper_chan_type == NL80211_CHAN_HT40PLUS)
1484 1485
			oper_cw40 = true;

1486 1487 1488 1489 1490 1491 1492 1493
		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;
1494

1495
		if ((local_cw40 != oper_cw40) || (local_sgi != oper_sgi)) {
1496
			rate_table = ath_choose_rate_table(sc, sband->band,
1497
						   sta->ht_cap.ht_supported);
1498
			ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta,
1499
						   oper_cw40, oper_sgi);
1500 1501
			ath_rc_init(sc, priv_sta, sband, sta, rate_table);

1502 1503 1504
			ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
				  "Operating HT Bandwidth changed to: %d\n",
				  sc->hw->conf.channel_type);
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 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
#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;

	max = 80 + rc->rate_table->rate_cnt * 1024 + 1;
	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");

	for (i = 0; i < rc->rate_table->rate_cnt; i++) {
		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 */

1597
static void *ath_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
1598
{
1599 1600
	struct ath_wiphy *aphy = hw->priv;
	return aphy->sc;
1601 1602 1603 1604 1605 1606 1607
}

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

1608
static void *ath_rate_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
1609 1610
{
	struct ath_softc *sc = priv;
S
Sujith 已提交
1611
	struct ath_rate_priv *rate_priv;
1612

S
Sujith 已提交
1613
	rate_priv = kzalloc(sizeof(struct ath_rate_priv), gfp);
1614
	if (!rate_priv) {
1615 1616
		ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
			  "Unable to allocate private rc structure\n");
1617 1618
		return NULL;
	}
S
Sujith 已提交
1619

1620
	rate_priv->tx_triglevel_max = sc->sc_ah->caps.tx_triglevel_max;
S
Sujith 已提交
1621

1622 1623 1624
	return rate_priv;
}

1625 1626
static void ath_rate_free_sta(void *priv, struct ieee80211_sta *sta,
			      void *priv_sta)
1627
{
S
Sujith 已提交
1628
	struct ath_rate_priv *rate_priv = priv_sta;
S
Sujith 已提交
1629
	kfree(rate_priv);
1630 1631 1632 1633 1634 1635 1636 1637
}

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,
1638
	.rate_update = ath_rate_update,
1639 1640 1641
	.alloc = ath_rate_alloc,
	.free = ath_rate_free,
	.alloc_sta = ath_rate_alloc_sta,
1642
	.free_sta = ath_rate_free_sta,
1643 1644 1645
#ifdef CONFIG_ATH9K_DEBUGFS
	.add_sta_debugfs = ath_rate_add_sta_debugfs,
#endif
1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656
};

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);
}