]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/net/wireless/ath9k/rc.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / ath9k / rc.c
1 /*
2  * Copyright (c) 2004 Video54 Technologies, Inc.
3  * Copyright (c) 2004-2008 Atheros Communications, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /*
19  * Atheros rate control algorithm
20  */
21
22 #include "core.h"
23 /* FIXME: remove this include! */
24 #include "../net/mac80211/rate.h"
25
26 static u32 tx_triglevel_max;
27
28 static struct ath_rate_table ar5416_11na_ratetable = {
29         42,
30         {
31                 { TRUE, TRUE, WLAN_PHY_OFDM, 6000, /* 6 Mb */
32                         5400, 0x0b, 0x00, 12,
33                         0, 2, 1, 0, 0, 0, 0, 0 },
34                 { TRUE, TRUE, WLAN_PHY_OFDM, 9000, /* 9 Mb */
35                         7800,  0x0f, 0x00, 18,
36                         0, 3, 1, 1, 1, 1, 1, 0 },
37                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 12 Mb */
38                         10000, 0x0a, 0x00, 24,
39                         2, 4, 2, 2, 2, 2, 2, 0 },
40                 { TRUE, TRUE, WLAN_PHY_OFDM, 18000, /* 18 Mb */
41                         13900, 0x0e, 0x00, 36,
42                         2, 6,  2, 3, 3, 3, 3, 0 },
43                 { TRUE, TRUE, WLAN_PHY_OFDM, 24000, /* 24 Mb */
44                         17300, 0x09, 0x00, 48,
45                         4, 10, 3, 4, 4, 4, 4, 0 },
46                 { TRUE, TRUE, WLAN_PHY_OFDM, 36000, /* 36 Mb */
47                         23000, 0x0d, 0x00, 72,
48                         4, 14, 3, 5, 5, 5, 5, 0 },
49                 { TRUE, TRUE, WLAN_PHY_OFDM, 48000, /* 48 Mb */
50                         27400, 0x08, 0x00, 96,
51                         4, 20, 3, 6, 6, 6, 6, 0 },
52                 { TRUE, TRUE, WLAN_PHY_OFDM, 54000, /* 54 Mb */
53                         29300, 0x0c, 0x00, 108,
54                         4, 23, 3, 7, 7, 7, 7, 0 },
55                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 6500, /* 6.5 Mb */
56                         6400, 0x80, 0x00, 0,
57                         0, 2, 3, 8, 24, 8, 24, 3216 },
58                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 13000, /* 13 Mb */
59                         12700, 0x81, 0x00, 1,
60                         2, 4, 3, 9, 25, 9, 25, 6434 },
61                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 19500, /* 19.5 Mb */
62                         18800, 0x82, 0x00, 2,
63                         2, 6, 3, 10, 26, 10, 26, 9650 },
64                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 26000, /* 26 Mb */
65                         25000, 0x83, 0x00, 3,
66                         4, 10, 3, 11, 27, 11, 27, 12868 },
67                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 39000, /* 39 Mb */
68                         36700, 0x84, 0x00, 4,
69                         4, 14, 3, 12, 28, 12, 28, 19304 },
70                 { FALSE, TRUE_20, WLAN_PHY_HT_20_SS, 52000, /* 52 Mb */
71                         48100, 0x85, 0x00, 5,
72                         4, 20, 3, 13, 29, 13, 29, 25740 },
73                 { FALSE, TRUE_20, WLAN_PHY_HT_20_SS, 58500, /* 58.5 Mb */
74                         53500, 0x86, 0x00, 6,
75                         4, 23, 3, 14, 30, 14, 30,  28956 },
76                 { FALSE, TRUE_20, WLAN_PHY_HT_20_SS, 65000, /* 65 Mb */
77                         59000, 0x87, 0x00, 7,
78                         4, 25, 3, 15, 31, 15, 32, 32180 },
79                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 13000, /* 13 Mb */
80                         12700, 0x88, 0x00,
81                         8, 0, 2, 3, 16, 33, 16, 33, 6430 },
82                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 26000, /* 26 Mb */
83                         24800, 0x89, 0x00, 9,
84                         2, 4, 3, 17, 34, 17, 34, 12860 },
85                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 39000, /* 39 Mb */
86                         36600, 0x8a, 0x00, 10,
87                         2, 6, 3, 18, 35, 18, 35, 19300 },
88                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 52000, /* 52 Mb */
89                         48100, 0x8b, 0x00, 11,
90                         4, 10, 3, 19, 36, 19, 36, 25736 },
91                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 78000, /* 78 Mb */
92                         69500, 0x8c, 0x00, 12,
93                         4, 14, 3, 20, 37, 20, 37, 38600 },
94                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 104000, /* 104 Mb */
95                         89500, 0x8d, 0x00, 13,
96                         4, 20, 3, 21, 38, 21, 38, 51472 },
97                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 117000, /* 117 Mb */
98                         98900, 0x8e, 0x00, 14,
99                         4, 23, 3, 22, 39, 22, 39, 57890 },
100                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 130000, /* 130 Mb */
101                         108300, 0x8f, 0x00, 15,
102                         4, 25, 3, 23, 40, 23, 41, 64320 },
103                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 13500, /* 13.5 Mb */
104                         13200, 0x80, 0x00, 0,
105                         0, 2, 3, 8, 24, 24, 24, 6684 },
106                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 27500, /* 27.0 Mb */
107                         25900, 0x81, 0x00, 1,
108                         2, 4, 3, 9, 25, 25, 25, 13368 },
109                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 40500, /* 40.5 Mb */
110                         38600, 0x82, 0x00, 2,
111                         2, 6, 3, 10, 26, 26, 26, 20052 },
112                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 54000, /* 54 Mb */
113                         49800, 0x83, 0x00, 3,
114                         4, 10, 3, 11, 27, 27, 27, 26738 },
115                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 81500, /* 81 Mb */
116                         72200, 0x84, 0x00, 4,
117                         4, 14, 3, 12, 28, 28, 28, 40104 },
118                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS, 108000, /* 108 Mb */
119                         92900, 0x85, 0x00, 5,
120                         4, 20, 3, 13, 29, 29, 29, 53476 },
121                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS, 121500, /* 121.5 Mb */
122                         102700, 0x86, 0x00, 6,
123                         4, 23, 3, 14, 30, 30, 30, 60156 },
124                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS, 135000, /* 135 Mb */
125                         112000, 0x87, 0x00, 7,
126                         4, 25, 3, 15, 31, 32, 32, 66840 },
127                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
128                         122000, 0x87, 0x00, 7,
129                         4, 25, 3, 15, 31, 32, 32, 74200 },
130                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 27000, /* 27 Mb */
131                         25800, 0x88, 0x00, 8,
132                         0, 2, 3, 16, 33, 33, 33, 13360 },
133                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 54000, /* 54 Mb */
134                         49800, 0x89, 0x00, 9,
135                         2, 4, 3, 17, 34, 34, 34, 26720 },
136                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 81000, /* 81 Mb */
137                         71900, 0x8a, 0x00, 10,
138                         2, 6, 3, 18, 35, 35, 35, 40080 },
139                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 108000, /* 108 Mb */
140                         92500, 0x8b, 0x00, 11,
141                         4, 10, 3, 19, 36, 36, 36, 53440 },
142                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 162000, /* 162 Mb */
143                         130300, 0x8c, 0x00, 12,
144                         4, 14, 3, 20, 37, 37, 37, 80160 },
145                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 216000, /* 216 Mb */
146                         162800, 0x8d, 0x00, 13,
147                         4, 20, 3, 21, 38, 38, 38, 106880 },
148                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 243000, /* 243 Mb */
149                         178200, 0x8e, 0x00, 14,
150                         4, 23, 3, 22, 39, 39, 39, 120240 },
151                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 270000, /* 270 Mb */
152                         192100, 0x8f, 0x00, 15,
153                         4, 25, 3, 23, 40, 41, 41, 133600 },
154                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
155                         207000, 0x8f, 0x00, 15,
156                         4, 25, 3, 23, 40, 41, 41, 148400 },
157         },
158         50,  /* probe interval */
159         50,  /* rssi reduce interval */
160         WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
161 };
162
163 /* TRUE_ALL - valid for 20/40/Legacy,
164  * TRUE - Legacy only,
165  * TRUE_20 - HT 20 only,
166  * TRUE_40 - HT 40 only */
167
168 /* 4ms frame limit not used for NG mode.  The values filled
169  * for HT are the 64K max aggregate limit */
170
171 static struct ath_rate_table ar5416_11ng_ratetable = {
172         46,
173         {
174                 { TRUE_ALL, TRUE_ALL, WLAN_PHY_CCK, 1000, /* 1 Mb */
175                         900, 0x1b, 0x00, 2,
176                         0, 0, 1, 0, 0, 0, 0, 0 },
177                 { TRUE_ALL, TRUE_ALL, WLAN_PHY_CCK, 2000, /* 2 Mb */
178                         1900, 0x1a, 0x04, 4,
179                         1, 1, 1, 1, 1, 1, 1, 0 },
180                 { TRUE_ALL, TRUE_ALL, WLAN_PHY_CCK, 5500, /* 5.5 Mb */
181                         4900, 0x19, 0x04, 11,
182                         2, 2, 2, 2, 2, 2, 2, 0 },
183                 { TRUE_ALL, TRUE_ALL, WLAN_PHY_CCK, 11000, /* 11 Mb */
184                         8100, 0x18, 0x04, 22,
185                         3, 3, 2, 3, 3, 3, 3, 0 },
186                 { FALSE, FALSE, WLAN_PHY_OFDM, 6000, /* 6 Mb */
187                         5400, 0x0b, 0x00, 12,
188                         4, 2, 1, 4, 4, 4, 4, 0 },
189                 { FALSE, FALSE, WLAN_PHY_OFDM, 9000, /* 9 Mb */
190                         7800, 0x0f, 0x00, 18,
191                         4, 3, 1, 5, 5, 5, 5, 0 },
192                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 12 Mb */
193                         10100, 0x0a, 0x00, 24,
194                         6, 4, 1, 6, 6, 6, 6, 0 },
195                 { TRUE, TRUE, WLAN_PHY_OFDM, 18000, /* 18 Mb */
196                         14100,  0x0e, 0x00, 36,
197                         6, 6, 2, 7, 7, 7, 7, 0 },
198                 { TRUE, TRUE, WLAN_PHY_OFDM, 24000, /* 24 Mb */
199                         17700, 0x09, 0x00, 48,
200                         8, 10, 3, 8, 8, 8, 8, 0 },
201                 { TRUE, TRUE, WLAN_PHY_OFDM, 36000, /* 36 Mb */
202                         23700, 0x0d, 0x00, 72,
203                         8, 14, 3, 9, 9, 9, 9, 0 },
204                 { TRUE, TRUE, WLAN_PHY_OFDM, 48000, /* 48 Mb */
205                         27400, 0x08, 0x00, 96,
206                         8, 20, 3, 10, 10, 10, 10, 0 },
207                 { TRUE, TRUE, WLAN_PHY_OFDM, 54000, /* 54 Mb */
208                         30900, 0x0c, 0x00, 108,
209                         8, 23, 3, 11, 11, 11, 11, 0 },
210                 { FALSE, FALSE, WLAN_PHY_HT_20_SS, 6500, /* 6.5 Mb */
211                         6400, 0x80, 0x00, 0,
212                         4, 2, 3, 12, 28, 12, 28, 3216 },
213                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 13000, /* 13 Mb */
214                         12700, 0x81, 0x00, 1,
215                         6, 4, 3, 13, 29, 13, 29, 6434 },
216                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 19500, /* 19.5 Mb */
217                         18800, 0x82, 0x00, 2,
218                         6, 6, 3, 14, 30, 14, 30, 9650 },
219                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 26000, /* 26 Mb */
220                         25000, 0x83, 0x00, 3,
221                         8, 10, 3, 15, 31, 15, 31, 12868 },
222                 { TRUE_20, TRUE_20, WLAN_PHY_HT_20_SS, 39000, /* 39 Mb */
223                         36700, 0x84, 0x00, 4,
224                         8, 14, 3, 16, 32, 16, 32, 19304 },
225                 { FALSE, TRUE_20, WLAN_PHY_HT_20_SS, 52000, /* 52 Mb */
226                         48100, 0x85, 0x00, 5,
227                         8, 20, 3, 17, 33, 17, 33, 25740 },
228                 { FALSE,  TRUE_20, WLAN_PHY_HT_20_SS, 58500, /* 58.5 Mb */
229                         53500, 0x86, 0x00, 6,
230                         8, 23, 3, 18, 34, 18, 34, 28956 },
231                 { FALSE, TRUE_20, WLAN_PHY_HT_20_SS, 65000, /* 65 Mb */
232                         59000, 0x87, 0x00, 7,
233                         8, 25, 3, 19, 35, 19, 36, 32180 },
234                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 13000, /* 13 Mb */
235                         12700, 0x88, 0x00, 8,
236                         4, 2, 3, 20, 37, 20, 37, 6430 },
237                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 26000, /* 26 Mb */
238                         24800, 0x89, 0x00, 9,
239                         6, 4, 3, 21, 38, 21, 38, 12860 },
240                 { FALSE, FALSE, WLAN_PHY_HT_20_DS, 39000, /* 39 Mb */
241                         36600, 0x8a, 0x00, 10,
242                         6, 6, 3, 22, 39, 22, 39, 19300 },
243                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 52000, /* 52 Mb */
244                         48100, 0x8b, 0x00, 11,
245                         8, 10, 3, 23, 40, 23, 40, 25736 },
246                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 78000, /* 78 Mb */
247                         69500, 0x8c, 0x00, 12,
248                         8, 14, 3, 24, 41, 24, 41, 38600 },
249                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 104000, /* 104 Mb */
250                         89500, 0x8d, 0x00, 13,
251                         8, 20, 3, 25, 42, 25, 42, 51472 },
252                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 117000, /* 117 Mb */
253                         98900, 0x8e, 0x00, 14,
254                         8, 23, 3, 26, 43, 26, 44, 57890 },
255                 { TRUE_20, FALSE, WLAN_PHY_HT_20_DS, 130000, /* 130 Mb */
256                         108300, 0x8f, 0x00, 15,
257                         8, 25, 3, 27, 44, 27, 45, 64320 },
258                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 13500, /* 13.5 Mb */
259                         13200, 0x80, 0x00, 0,
260                         8, 2, 3, 12, 28, 28, 28, 6684 },
261                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 27500, /* 27.0 Mb */
262                         25900, 0x81, 0x00, 1,
263                         8, 4, 3, 13, 29, 29, 29, 13368 },
264                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 40500, /* 40.5 Mb */
265                         38600, 0x82, 0x00, 2,
266                         8, 6, 3, 14, 30, 30, 30, 20052 },
267                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 54000, /* 54 Mb */
268                         49800, 0x83, 0x00, 3,
269                         8, 10, 3, 15, 31, 31, 31, 26738 },
270                 { TRUE_40, TRUE_40, WLAN_PHY_HT_40_SS, 81500, /* 81 Mb */
271                         72200, 0x84, 0x00, 4,
272                         8, 14, 3, 16, 32, 32, 32, 40104 },
273                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS, 108000, /* 108 Mb */
274                         92900, 0x85, 0x00, 5,
275                         8, 20, 3, 17, 33, 33, 33, 53476 },
276                 { FALSE,  TRUE_40, WLAN_PHY_HT_40_SS, 121500, /* 121.5 Mb */
277                         102700, 0x86, 0x00, 6,
278                         8, 23, 3, 18, 34, 34, 34, 60156 },
279                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS, 135000, /* 135 Mb */
280                         112000, 0x87, 0x00, 7,
281                         8, 23, 3, 19, 35, 36, 36, 66840 },
282                 { FALSE, TRUE_40, WLAN_PHY_HT_40_SS_HGI, 150000, /* 150 Mb */
283                         122000, 0x87, 0x00, 7,
284                         8, 25, 3, 19, 35, 36, 36, 74200 },
285                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 27000, /* 27 Mb */
286                         25800, 0x88, 0x00, 8,
287                         8, 2, 3, 20, 37, 37, 37, 13360 },
288                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 54000, /* 54 Mb */
289                         49800, 0x89, 0x00, 9,
290                         8, 4, 3, 21, 38, 38, 38, 26720 },
291                 { FALSE, FALSE, WLAN_PHY_HT_40_DS, 81000, /* 81 Mb */
292                         71900, 0x8a, 0x00, 10,
293                         8, 6, 3, 22, 39, 39, 39, 40080 },
294                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 108000, /* 108 Mb */
295                         92500, 0x8b, 0x00, 11,
296                         8, 10, 3, 23, 40, 40, 40, 53440 },
297                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 162000, /* 162 Mb */
298                         130300, 0x8c, 0x00, 12,
299                         8, 14, 3, 24, 41, 41, 41, 80160 },
300                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 216000, /* 216 Mb */
301                         162800, 0x8d, 0x00, 13,
302                         8, 20, 3, 25, 42, 42, 42, 106880 },
303                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 243000, /* 243 Mb */
304                         178200, 0x8e, 0x00, 14,
305                         8, 23, 3, 26, 43, 43, 43, 120240 },
306                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS, 270000, /* 270 Mb */
307                         192100, 0x8f, 0x00, 15,
308                         8, 23, 3, 27, 44, 45, 45, 133600 },
309                 { TRUE_40, FALSE, WLAN_PHY_HT_40_DS_HGI, 300000, /* 300 Mb */
310                         207000, 0x8f, 0x00, 15,
311                         8, 25, 3, 27, 44, 45, 45, 148400 },
312                 },
313         50,  /* probe interval */
314         50,  /* rssi reduce interval */
315         WLAN_RC_HT_FLAG,  /* Phy rates allowed initially */
316 };
317
318 static struct ath_rate_table ar5416_11a_ratetable = {
319         8,
320         {
321                 { TRUE, TRUE, WLAN_PHY_OFDM, 6000, /* 6 Mb */
322                         5400, 0x0b, 0x00, (0x80|12),
323                         0, 2, 1, 0, 0 },
324                 { TRUE, TRUE, WLAN_PHY_OFDM, 9000, /* 9 Mb */
325                         7800, 0x0f, 0x00, 18,
326                         0, 3, 1, 1, 0 },
327                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 12 Mb */
328                         10000, 0x0a, 0x00, (0x80|24),
329                         2, 4, 2, 2, 0 },
330                 { TRUE, TRUE, WLAN_PHY_OFDM, 18000, /* 18 Mb */
331                         13900, 0x0e, 0x00, 36,
332                         2, 6, 2, 3, 0 },
333                 { TRUE, TRUE, WLAN_PHY_OFDM, 24000, /* 24 Mb */
334                         17300, 0x09, 0x00, (0x80|48),
335                         4, 10, 3, 4, 0 },
336                 { TRUE, TRUE, WLAN_PHY_OFDM, 36000, /* 36 Mb */
337                         23000, 0x0d, 0x00, 72,
338                         4, 14, 3, 5, 0 },
339                 { TRUE, TRUE, WLAN_PHY_OFDM, 48000, /* 48 Mb */
340                         27400, 0x08, 0x00, 96,
341                         4, 19, 3, 6, 0 },
342                 { TRUE, TRUE, WLAN_PHY_OFDM, 54000, /* 54 Mb */
343                         29300, 0x0c, 0x00, 108,
344                         4, 23, 3, 7, 0 },
345         },
346         50,  /* probe interval */
347         50,  /* rssi reduce interval */
348         0,   /* Phy rates allowed initially */
349 };
350
351 static struct ath_rate_table ar5416_11a_ratetable_Half = {
352         8,
353         {
354                 { TRUE, TRUE, WLAN_PHY_OFDM, 3000, /* 6 Mb */
355                         2700, 0x0b, 0x00, (0x80|6),
356                         0, 2,  1, 0, 0},
357                 { TRUE, TRUE,  WLAN_PHY_OFDM, 4500, /* 9 Mb */
358                         3900, 0x0f, 0x00, 9,
359                         0, 3, 1, 1, 0 },
360                 { TRUE, TRUE, WLAN_PHY_OFDM, 6000, /* 12 Mb */
361                         5000, 0x0a, 0x00, (0x80|12),
362                         2, 4, 2, 2, 0 },
363                 { TRUE, TRUE, WLAN_PHY_OFDM, 9000, /* 18 Mb */
364                         6950, 0x0e, 0x00, 18,
365                         2, 6, 2, 3, 0 },
366                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 24 Mb */
367                         8650, 0x09, 0x00, (0x80|24),
368                         4, 10, 3, 4, 0 },
369                 { TRUE, TRUE, WLAN_PHY_OFDM, 18000, /* 36 Mb */
370                         11500, 0x0d, 0x00, 36,
371                         4, 14, 3, 5, 0 },
372                 { TRUE, TRUE, WLAN_PHY_OFDM, 24000, /* 48 Mb */
373                         13700, 0x08, 0x00, 48,
374                         4, 19, 3, 6, 0 },
375                 { TRUE, TRUE, WLAN_PHY_OFDM, 27000, /* 54 Mb */
376                         14650, 0x0c, 0x00, 54,
377                         4, 23, 3, 7, 0 },
378         },
379         50,  /* probe interval */
380         50,  /* rssi reduce interval */
381         0,   /* Phy rates allowed initially */
382 };
383
384 static struct ath_rate_table ar5416_11a_ratetable_Quarter = {
385         8,
386         {
387                 { TRUE, TRUE, WLAN_PHY_OFDM, 1500, /* 6 Mb */
388                         1350, 0x0b, 0x00, (0x80|3),
389                         0, 2, 1, 0, 0 },
390                 { TRUE, TRUE, WLAN_PHY_OFDM, 2250, /* 9 Mb */
391                         1950, 0x0f, 0x00, 4,
392                         0, 3, 1, 1, 0 },
393                 { TRUE, TRUE, WLAN_PHY_OFDM, 3000, /* 12 Mb */
394                         2500, 0x0a, 0x00, (0x80|6),
395                         2, 4, 2, 2, 0 },
396                 { TRUE, TRUE, WLAN_PHY_OFDM, 4500, /* 18 Mb */
397                         3475, 0x0e, 0x00, 9,
398                         2, 6, 2, 3, 0 },
399                 { TRUE, TRUE, WLAN_PHY_OFDM, 6000, /* 25 Mb */
400                         4325, 0x09, 0x00, (0x80|12),
401                         4, 10, 3, 4, 0 },
402                 { TRUE, TRUE, WLAN_PHY_OFDM, 9000, /* 36 Mb */
403                         5750, 0x0d, 0x00, 18,
404                         4, 14, 3, 5, 0 },
405                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 48 Mb */
406                         6850, 0x08, 0x00, 24,
407                         4, 19, 3, 6, 0 },
408                 { TRUE, TRUE, WLAN_PHY_OFDM, 13500, /* 54 Mb */
409                         7325, 0x0c, 0x00, 27,
410                         4, 23, 3, 7, 0 },
411         },
412         50,  /* probe interval */
413         50,  /* rssi reduce interval */
414         0,   /* Phy rates allowed initially */
415 };
416
417 static struct ath_rate_table ar5416_11g_ratetable = {
418         12,
419         {
420                 { TRUE, TRUE, WLAN_PHY_CCK, 1000, /* 1 Mb */
421                         900, 0x1b, 0x00, 2,
422                         0, 0, 1, 0, 0 },
423                 { TRUE, TRUE, WLAN_PHY_CCK, 2000, /* 2 Mb */
424                         1900, 0x1a, 0x04, 4,
425                         1, 1, 1, 1, 0 },
426                 { TRUE, TRUE, WLAN_PHY_CCK, 5500, /* 5.5 Mb */
427                         4900, 0x19, 0x04, 11,
428                         2, 2, 2, 2, 0 },
429                 { TRUE, TRUE, WLAN_PHY_CCK, 11000, /* 11 Mb */
430                         8100, 0x18, 0x04, 22,
431                         3, 3, 2, 3, 0 },
432                 { FALSE, FALSE, WLAN_PHY_OFDM, 6000, /* 6 Mb */
433                         5400, 0x0b, 0x00, 12,
434                         4, 2, 1, 4, 0 },
435                 { FALSE, FALSE, WLAN_PHY_OFDM, 9000, /* 9 Mb */
436                         7800, 0x0f, 0x00, 18,
437                         4, 3, 1, 5, 0 },
438                 { TRUE, TRUE, WLAN_PHY_OFDM, 12000, /* 12 Mb */
439                         10000, 0x0a, 0x00, 24,
440                         6, 4, 1, 6, 0 },
441                 { TRUE, TRUE, WLAN_PHY_OFDM, 18000, /* 18 Mb */
442                         13900, 0x0e, 0x00, 36,
443                         6, 6, 2, 7, 0 },
444                 { TRUE, TRUE, WLAN_PHY_OFDM, 24000, /* 24 Mb */
445                         17300, 0x09, 0x00, 48,
446                         8, 10, 3, 8, 0 },
447                 { TRUE, TRUE, WLAN_PHY_OFDM, 36000, /* 36 Mb */
448                         23000, 0x0d, 0x00, 72,
449                         8, 14, 3, 9, 0 },
450                 { TRUE, TRUE, WLAN_PHY_OFDM, 48000, /* 48 Mb */
451                         27400, 0x08, 0x00, 96,
452                         8, 19, 3, 10, 0 },
453                 { TRUE, TRUE, WLAN_PHY_OFDM, 54000, /* 54 Mb */
454                         29300, 0x0c, 0x00, 108,
455                         8, 23, 3, 11, 0 },
456         },
457         50,  /* probe interval */
458         50,  /* rssi reduce interval */
459         0,   /* Phy rates allowed initially */
460 };
461
462 static struct ath_rate_table ar5416_11b_ratetable = {
463         4,
464         {
465                 { TRUE, TRUE, WLAN_PHY_CCK, 1000, /* 1 Mb */
466                         900, 0x1b,  0x00, (0x80|2),
467                         0, 0, 1, 0, 0 },
468                 { TRUE, TRUE, WLAN_PHY_CCK, 2000, /* 2 Mb */
469                         1800, 0x1a, 0x04, (0x80|4),
470                         1, 1, 1, 1, 0 },
471                 { TRUE, TRUE, WLAN_PHY_CCK, 5500, /* 5.5 Mb */
472                         4300, 0x19, 0x04, (0x80|11),
473                         1, 2, 2, 2, 0 },
474                 { TRUE, TRUE, WLAN_PHY_CCK, 11000, /* 11 Mb */
475                         7100, 0x18, 0x04, (0x80|22),
476                         1, 4, 100, 3, 0 },
477         },
478         100, /* probe interval */
479         100, /* rssi reduce interval */
480         0,   /* Phy rates allowed initially */
481 };
482
483 static void ar5416_attach_ratetables(struct ath_rate_softc *sc)
484 {
485         /*
486          * Attach rate tables.
487          */
488         sc->hw_rate_table[ATH9K_MODE_11B] = &ar5416_11b_ratetable;
489         sc->hw_rate_table[ATH9K_MODE_11A] = &ar5416_11a_ratetable;
490         sc->hw_rate_table[ATH9K_MODE_11G] = &ar5416_11g_ratetable;
491
492         sc->hw_rate_table[ATH9K_MODE_11NA_HT20] = &ar5416_11na_ratetable;
493         sc->hw_rate_table[ATH9K_MODE_11NG_HT20] = &ar5416_11ng_ratetable;
494         sc->hw_rate_table[ATH9K_MODE_11NA_HT40PLUS] =
495                 &ar5416_11na_ratetable;
496         sc->hw_rate_table[ATH9K_MODE_11NA_HT40MINUS] =
497                 &ar5416_11na_ratetable;
498         sc->hw_rate_table[ATH9K_MODE_11NG_HT40PLUS] =
499                 &ar5416_11ng_ratetable;
500         sc->hw_rate_table[ATH9K_MODE_11NG_HT40MINUS] =
501                 &ar5416_11ng_ratetable;
502 }
503
504 static void ar5416_setquarter_ratetable(struct ath_rate_softc *sc)
505 {
506         sc->hw_rate_table[ATH9K_MODE_11A] = &ar5416_11a_ratetable_Quarter;
507         return;
508 }
509
510 static void ar5416_sethalf_ratetable(struct ath_rate_softc *sc)
511 {
512         sc->hw_rate_table[ATH9K_MODE_11A] = &ar5416_11a_ratetable_Half;
513         return;
514 }
515
516 static void ar5416_setfull_ratetable(struct ath_rate_softc *sc)
517 {
518         sc->hw_rate_table[ATH9K_MODE_11A] = &ar5416_11a_ratetable;
519         return;
520 }
521
522 /*
523  * Return the median of three numbers
524  */
525 static inline int8_t median(int8_t a, int8_t b, int8_t c)
526 {
527         if (a >= b) {
528                 if (b >= c)
529                         return b;
530                 else if (a > c)
531                         return c;
532                 else
533                         return a;
534         } else {
535                 if (a >= c)
536                         return a;
537                 else if (b >= c)
538                         return c;
539                 else
540                         return b;
541         }
542 }
543
544 static void ath_rc_sort_validrates(const struct ath_rate_table *rate_table,
545                                    struct ath_tx_ratectrl *rate_ctrl)
546 {
547         u8 i, j, idx, idx_next;
548
549         for (i = rate_ctrl->max_valid_rate - 1; i > 0; i--) {
550                 for (j = 0; j <= i-1; j++) {
551                         idx = rate_ctrl->valid_rate_index[j];
552                         idx_next = rate_ctrl->valid_rate_index[j+1];
553
554                         if (rate_table->info[idx].ratekbps >
555                                 rate_table->info[idx_next].ratekbps) {
556                                 rate_ctrl->valid_rate_index[j] = idx_next;
557                                 rate_ctrl->valid_rate_index[j+1] = idx;
558                         }
559                 }
560         }
561 }
562
563 /* Access functions for valid_txrate_mask */
564
565 static void ath_rc_init_valid_txmask(struct ath_tx_ratectrl *rate_ctrl)
566 {
567         u8 i;
568
569         for (i = 0; i < rate_ctrl->rate_table_size; i++)
570                 rate_ctrl->valid_rate_index[i] = FALSE;
571 }
572
573 static inline void ath_rc_set_valid_txmask(struct ath_tx_ratectrl *rate_ctrl,
574                                            u8 index, int valid_tx_rate)
575 {
576         ASSERT(index <= rate_ctrl->rate_table_size);
577         rate_ctrl->valid_rate_index[index] = valid_tx_rate ? TRUE : FALSE;
578 }
579
580 static inline int ath_rc_isvalid_txmask(struct ath_tx_ratectrl *rate_ctrl,
581                                         u8 index)
582 {
583         ASSERT(index <= rate_ctrl->rate_table_size);
584         return rate_ctrl->valid_rate_index[index];
585 }
586
587 /* Iterators for valid_txrate_mask */
588 static inline int
589 ath_rc_get_nextvalid_txrate(const struct ath_rate_table *rate_table,
590                             struct ath_tx_ratectrl *rate_ctrl,
591                             u8 cur_valid_txrate,
592                             u8 *next_idx)
593 {
594         u8 i;
595
596         for (i = 0; i < rate_ctrl->max_valid_rate - 1; i++) {
597                 if (rate_ctrl->valid_rate_index[i] == cur_valid_txrate) {
598                         *next_idx = rate_ctrl->valid_rate_index[i+1];
599                         return TRUE;
600                 }
601         }
602
603         /* No more valid rates */
604         *next_idx = 0;
605         return FALSE;
606 }
607
608 /* Return true only for single stream */
609
610 static int ath_rc_valid_phyrate(u32 phy, u32 capflag, int ignore_cw)
611 {
612         if (WLAN_RC_PHY_HT(phy) & !(capflag & WLAN_RC_HT_FLAG))
613                 return FALSE;
614         if (WLAN_RC_PHY_DS(phy) && !(capflag & WLAN_RC_DS_FLAG))
615                 return FALSE;
616         if (WLAN_RC_PHY_SGI(phy) && !(capflag & WLAN_RC_SGI_FLAG))
617                 return FALSE;
618         if (!ignore_cw && WLAN_RC_PHY_HT(phy))
619                 if (WLAN_RC_PHY_40(phy) && !(capflag & WLAN_RC_40_FLAG))
620                         return FALSE;
621                 if (!WLAN_RC_PHY_40(phy) && (capflag & WLAN_RC_40_FLAG))
622                         return FALSE;
623         return TRUE;
624 }
625
626 static inline int
627 ath_rc_get_nextlowervalid_txrate(const struct ath_rate_table *rate_table,
628                                  struct ath_tx_ratectrl *rate_ctrl,
629                                  u8 cur_valid_txrate, u8 *next_idx)
630 {
631         int8_t i;
632
633         for (i = 1; i < rate_ctrl->max_valid_rate ; i++) {
634                 if (rate_ctrl->valid_rate_index[i] == cur_valid_txrate) {
635                         *next_idx = rate_ctrl->valid_rate_index[i-1];
636                         return TRUE;
637                 }
638         }
639         return FALSE;
640 }
641
642 /*
643  * Initialize the Valid Rate Index from valid entries in Rate Table
644  */
645 static u8
646 ath_rc_sib_init_validrates(struct ath_rate_node *ath_rc_priv,
647                            const struct ath_rate_table *rate_table,
648                            u32 capflag)
649 {
650         struct ath_tx_ratectrl *rate_ctrl;
651         u8 i, hi = 0;
652         u32 valid;
653
654         rate_ctrl = (struct ath_tx_ratectrl *)(ath_rc_priv);
655         for (i = 0; i < rate_table->rate_cnt; i++) {
656                 valid = (ath_rc_priv->single_stream ?
657                          rate_table->info[i].valid_single_stream :
658                          rate_table->info[i].valid);
659                 if (valid == TRUE) {
660                         u32 phy = rate_table->info[i].phy;
661                         u8 valid_rate_count = 0;
662
663                         if (!ath_rc_valid_phyrate(phy, capflag, FALSE))
664                                 continue;
665
666                         valid_rate_count = rate_ctrl->valid_phy_ratecnt[phy];
667
668                         rate_ctrl->valid_phy_rateidx[phy][valid_rate_count] = i;
669                         rate_ctrl->valid_phy_ratecnt[phy] += 1;
670                         ath_rc_set_valid_txmask(rate_ctrl, i, TRUE);
671                         hi = A_MAX(hi, i);
672                 }
673         }
674         return hi;
675 }
676
677 /*
678  * Initialize the Valid Rate Index from Rate Set
679  */
680 static u8
681 ath_rc_sib_setvalid_rates(struct ath_rate_node *ath_rc_priv,
682                           const struct ath_rate_table *rate_table,
683                           struct ath_rateset *rateset,
684                           u32 capflag)
685 {
686         /* XXX: Clean me up and make identation friendly */
687         u8 i, j, hi = 0;
688         struct ath_tx_ratectrl *rate_ctrl =
689                 (struct ath_tx_ratectrl *)(ath_rc_priv);
690
691         /* Use intersection of working rates and valid rates */
692         for (i = 0; i < rateset->rs_nrates; i++) {
693                 for (j = 0; j < rate_table->rate_cnt; j++) {
694                         u32 phy = rate_table->info[j].phy;
695                         u32 valid = (ath_rc_priv->single_stream ?
696                                 rate_table->info[j].valid_single_stream :
697                                 rate_table->info[j].valid);
698
699                         /* We allow a rate only if its valid and the
700                          * capflag matches one of the validity
701                          * (TRUE/TRUE_20/TRUE_40) flags */
702
703                         /* XXX: catch the negative of this branch
704                          * first and then continue */
705                         if (((rateset->rs_rates[i] & 0x7F) ==
706                                 (rate_table->info[j].dot11rate & 0x7F)) &&
707                                 ((valid & WLAN_RC_CAP_MODE(capflag)) ==
708                                 WLAN_RC_CAP_MODE(capflag)) &&
709                                 !WLAN_RC_PHY_HT(phy)) {
710
711                                 u8 valid_rate_count = 0;
712
713                                 if (!ath_rc_valid_phyrate(phy, capflag, FALSE))
714                                         continue;
715
716                                 valid_rate_count =
717                                         rate_ctrl->valid_phy_ratecnt[phy];
718
719                                 rate_ctrl->valid_phy_rateidx[phy]
720                                         [valid_rate_count] = j;
721                                 rate_ctrl->valid_phy_ratecnt[phy] += 1;
722                                 ath_rc_set_valid_txmask(rate_ctrl, j, TRUE);
723                                 hi = A_MAX(hi, j);
724                         }
725                 }
726         }
727         return hi;
728 }
729
730 static u8
731 ath_rc_sib_setvalid_htrates(struct ath_rate_node *ath_rc_priv,
732                             const struct ath_rate_table *rate_table,
733                             u8 *mcs_set, u32 capflag)
734 {
735         u8 i, j, hi = 0;
736         struct ath_tx_ratectrl *rate_ctrl =
737                 (struct ath_tx_ratectrl *)(ath_rc_priv);
738
739         /* Use intersection of working rates and valid rates */
740         for (i = 0; i <  ((struct ath_rateset *)mcs_set)->rs_nrates; i++) {
741                 for (j = 0; j < rate_table->rate_cnt; j++) {
742                         u32 phy = rate_table->info[j].phy;
743                         u32 valid = (ath_rc_priv->single_stream ?
744                                      rate_table->info[j].valid_single_stream :
745                                      rate_table->info[j].valid);
746
747                         if (((((struct ath_rateset *)
748                                mcs_set)->rs_rates[i] & 0x7F) !=
749                              (rate_table->info[j].dot11rate & 0x7F)) ||
750                             !WLAN_RC_PHY_HT(phy) ||
751                             !WLAN_RC_PHY_HT_VALID(valid, capflag))
752                                 continue;
753
754                         if (!ath_rc_valid_phyrate(phy, capflag, FALSE))
755                                 continue;
756
757                         rate_ctrl->valid_phy_rateidx[phy]
758                                 [rate_ctrl->valid_phy_ratecnt[phy]] = j;
759                         rate_ctrl->valid_phy_ratecnt[phy] += 1;
760                         ath_rc_set_valid_txmask(rate_ctrl, j, TRUE);
761                         hi = A_MAX(hi, j);
762                 }
763         }
764         return hi;
765 }
766
767 /*
768  * Attach to a device instance.  Setup the public definition
769  * of how much per-node space we need and setup the private
770  * phy tables that have rate control parameters.
771  */
772 struct ath_rate_softc *ath_rate_attach(struct ath_hal *ah)
773 {
774         struct ath_rate_softc *asc;
775
776         /* we are only in user context so we can sleep for memory */
777         asc = kzalloc(sizeof(struct ath_rate_softc), GFP_KERNEL);
778         if (asc == NULL)
779                 return NULL;
780
781         ar5416_attach_ratetables(asc);
782
783         /* Save Maximum TX Trigger Level (used for 11n) */
784         tx_triglevel_max = ah->ah_caps.tx_triglevel_max;
785         /*  return alias for ath_rate_softc * */
786         return asc;
787 }
788
789 static struct ath_rate_node *ath_rate_node_alloc(struct ath_vap *avp,
790                                                  struct ath_rate_softc *rsc,
791                                                  gfp_t gfp)
792 {
793         struct ath_rate_node *anode;
794
795         anode = kzalloc(sizeof(struct ath_rate_node), gfp);
796         if (anode == NULL)
797                 return NULL;
798
799         anode->avp = avp;
800         anode->asc = rsc;
801         avp->rc_node = anode;
802
803         return anode;
804 }
805
806 static void ath_rate_node_free(struct ath_rate_node *anode)
807 {
808         if (anode != NULL)
809                 kfree(anode);
810 }
811
812 void ath_rate_detach(struct ath_rate_softc *asc)
813 {
814         if (asc != NULL)
815                 kfree(asc);
816 }
817
818 u8 ath_rate_findrateix(struct ath_softc *sc,
819                              u8 dot11rate)
820 {
821         const struct ath_rate_table *ratetable;
822         struct ath_rate_softc *rsc = sc->sc_rc;
823         int i;
824
825         ratetable = rsc->hw_rate_table[sc->sc_curmode];
826
827         if (WARN_ON(!ratetable))
828                 return 0;
829
830         for (i = 0; i < ratetable->rate_cnt; i++) {
831                 if ((ratetable->info[i].dot11rate & 0x7f) == (dot11rate & 0x7f))
832                         return i;
833         }
834
835         return 0;
836 }
837
838 /*
839  * Update rate-control state on a device state change.  When
840  * operating as a station this includes associate/reassociate
841  * with an AP.  Otherwise this gets called, for example, when
842  * the we transition to run state when operating as an AP.
843  */
844 void ath_rate_newstate(struct ath_softc *sc, struct ath_vap *avp)
845 {
846         struct ath_rate_softc *asc = sc->sc_rc;
847
848         /* For half and quarter rate channles use different
849          * rate tables
850          */
851         if (sc->sc_ah->ah_curchan->channelFlags & CHANNEL_HALF)
852                 ar5416_sethalf_ratetable(asc);
853         else if (sc->sc_ah->ah_curchan->channelFlags & CHANNEL_QUARTER)
854                 ar5416_setquarter_ratetable(asc);
855         else /* full rate */
856                 ar5416_setfull_ratetable(asc);
857
858         if (avp->av_config.av_fixed_rateset != IEEE80211_FIXED_RATE_NONE) {
859                 asc->fixedrix =
860                         sc->sc_rixmap[avp->av_config.av_fixed_rateset & 0xff];
861                 /* NB: check the fixed rate exists */
862                 if (asc->fixedrix == 0xff)
863                         asc->fixedrix = IEEE80211_FIXED_RATE_NONE;
864         } else {
865                 asc->fixedrix = IEEE80211_FIXED_RATE_NONE;
866         }
867 }
868
869 static u8 ath_rc_ratefind_ht(struct ath_softc *sc,
870                              struct ath_rate_node *ath_rc_priv,
871                              const struct ath_rate_table *rate_table,
872                              int probe_allowed, int *is_probing,
873                              int is_retry)
874 {
875         u32 dt, best_thruput, this_thruput, now_msec;
876         u8 rate, next_rate, best_rate, maxindex, minindex;
877         int8_t  rssi_last, rssi_reduce = 0, index = 0;
878         struct ath_tx_ratectrl  *rate_ctrl = NULL;
879
880         rate_ctrl = (struct ath_tx_ratectrl *)(ath_rc_priv ?
881                                                (ath_rc_priv) : NULL);
882
883         *is_probing = FALSE;
884
885         rssi_last = median(rate_ctrl->rssi_last,
886                            rate_ctrl->rssi_last_prev,
887                            rate_ctrl->rssi_last_prev2);
888
889         /*
890          * Age (reduce) last ack rssi based on how old it is.
891          * The bizarre numbers are so the delta is 160msec,
892          * meaning we divide by 16.
893          *   0msec   <= dt <= 25msec:   don't derate
894          *   25msec  <= dt <= 185msec:  derate linearly from 0 to 10dB
895          *   185msec <= dt:             derate by 10dB
896          */
897
898         now_msec = jiffies_to_msecs(jiffies);
899         dt = now_msec - rate_ctrl->rssi_time;
900
901         if (dt >= 185)
902                 rssi_reduce = 10;
903         else if (dt >= 25)
904                 rssi_reduce = (u8)((dt - 25) >> 4);
905
906         /* Now reduce rssi_last by rssi_reduce */
907         if (rssi_last < rssi_reduce)
908                 rssi_last = 0;
909         else
910                 rssi_last -= rssi_reduce;
911
912         /*
913          * Now look up the rate in the rssi table and return it.
914          * If no rates match then we return 0 (lowest rate)
915          */
916
917         best_thruput = 0;
918         maxindex = rate_ctrl->max_valid_rate-1;
919
920         minindex = 0;
921         best_rate = minindex;
922
923         /*
924          * Try the higher rate first. It will reduce memory moving time
925          * if we have very good channel characteristics.
926          */
927         for (index = maxindex; index >= minindex ; index--) {
928                 u8 per_thres;
929
930                 rate = rate_ctrl->valid_rate_index[index];
931                 if (rate > rate_ctrl->rate_max_phy)
932                         continue;
933
934                 /*
935                  * For TCP the average collision rate is around 11%,
936                  * so we ignore PERs less than this.  This is to
937                  * prevent the rate we are currently using (whose
938                  * PER might be in the 10-15 range because of TCP
939                  * collisions) looking worse than the next lower
940                  * rate whose PER has decayed close to 0.  If we
941                  * used to next lower rate, its PER would grow to
942                  * 10-15 and we would be worse off then staying
943                  * at the current rate.
944                  */
945                 per_thres = rate_ctrl->state[rate].per;
946                 if (per_thres < 12)
947                         per_thres = 12;
948
949                 this_thruput = rate_table->info[rate].user_ratekbps *
950                         (100 - per_thres);
951
952                 if (best_thruput <= this_thruput) {
953                         best_thruput = this_thruput;
954                         best_rate    = rate;
955                 }
956         }
957
958         rate = best_rate;
959
960         /* if we are retrying for more than half the number
961          * of max retries, use the min rate for the next retry
962          */
963         if (is_retry)
964                 rate = rate_ctrl->valid_rate_index[minindex];
965
966         rate_ctrl->rssi_last_lookup = rssi_last;
967
968         /*
969          * Must check the actual rate (ratekbps) to account for
970          * non-monoticity of 11g's rate table
971          */
972
973         if (rate >= rate_ctrl->rate_max_phy && probe_allowed) {
974                 rate = rate_ctrl->rate_max_phy;
975
976                 /* Probe the next allowed phy state */
977                 /* FIXME:XXXX Check to make sure ratMax is checked properly */
978                 if (ath_rc_get_nextvalid_txrate(rate_table,
979                                                 rate_ctrl, rate, &next_rate) &&
980                     (now_msec - rate_ctrl->probe_time >
981                      rate_table->probe_interval) &&
982                     (rate_ctrl->hw_maxretry_pktcnt >= 1)) {
983                         rate = next_rate;
984                         rate_ctrl->probe_rate = rate;
985                         rate_ctrl->probe_time = now_msec;
986                         rate_ctrl->hw_maxretry_pktcnt = 0;
987                         *is_probing = TRUE;
988                 }
989         }
990
991         /*
992          * Make sure rate is not higher than the allowed maximum.
993          * We should also enforce the min, but I suspect the min is
994          * normally 1 rather than 0 because of the rate 9 vs 6 issue
995          * in the old code.
996          */
997         if (rate > (rate_ctrl->rate_table_size - 1))
998                 rate = rate_ctrl->rate_table_size - 1;
999
1000         ASSERT((rate_table->info[rate].valid && !ath_rc_priv->single_stream) ||
1001                (rate_table->info[rate].valid_single_stream &&
1002                 ath_rc_priv->single_stream));
1003
1004         return rate;
1005 }
1006
1007 static void ath_rc_rate_set_series(const struct ath_rate_table *rate_table ,
1008                                    struct ath_rc_series *series,
1009                                    u8 tries,
1010                                    u8 rix,
1011                                    int rtsctsenable)
1012 {
1013         series->tries = tries;
1014         series->flags = (rtsctsenable ? ATH_RC_RTSCTS_FLAG : 0) |
1015                 (WLAN_RC_PHY_DS(rate_table->info[rix].phy) ?
1016                  ATH_RC_DS_FLAG : 0) |
1017                 (WLAN_RC_PHY_40(rate_table->info[rix].phy) ?
1018                  ATH_RC_CW40_FLAG : 0) |
1019                 (WLAN_RC_PHY_SGI(rate_table->info[rix].phy) ?
1020                  ATH_RC_SGI_FLAG : 0);
1021
1022         series->rix = rate_table->info[rix].base_index;
1023         series->max_4ms_framelen = rate_table->info[rix].max_4ms_framelen;
1024 }
1025
1026 static u8 ath_rc_rate_getidx(struct ath_softc *sc,
1027                              struct ath_rate_node *ath_rc_priv,
1028                              const struct ath_rate_table *rate_table,
1029                              u8 rix, u16 stepdown,
1030                              u16 min_rate)
1031 {
1032         u32 j;
1033         u8 nextindex;
1034         struct ath_tx_ratectrl *rate_ctrl =
1035                 (struct ath_tx_ratectrl *)(ath_rc_priv);
1036
1037         if (min_rate) {
1038                 for (j = RATE_TABLE_SIZE; j > 0; j--) {
1039                         if (ath_rc_get_nextlowervalid_txrate(rate_table,
1040                                                 rate_ctrl, rix, &nextindex))
1041                                 rix = nextindex;
1042                         else
1043                                 break;
1044                 }
1045         } else {
1046                 for (j = stepdown; j > 0; j--) {
1047                         if (ath_rc_get_nextlowervalid_txrate(rate_table,
1048                                                 rate_ctrl, rix, &nextindex))
1049                                 rix = nextindex;
1050                         else
1051                                 break;
1052                 }
1053         }
1054         return rix;
1055 }
1056
1057 static void ath_rc_ratefind(struct ath_softc *sc,
1058                             struct ath_rate_node *ath_rc_priv,
1059                             int num_tries, int num_rates, unsigned int rcflag,
1060                             struct ath_rc_series series[], int *is_probe,
1061                             int is_retry)
1062 {
1063         u8 try_per_rate = 0, i = 0, rix, nrix;
1064         struct ath_rate_softc  *asc = (struct ath_rate_softc *)sc->sc_rc;
1065         struct ath_rate_table *rate_table;
1066
1067         rate_table =
1068                 (struct ath_rate_table *)asc->hw_rate_table[sc->sc_curmode];
1069         rix = ath_rc_ratefind_ht(sc, ath_rc_priv, rate_table,
1070                                  (rcflag & ATH_RC_PROBE_ALLOWED) ? 1 : 0,
1071                                  is_probe, is_retry);
1072         nrix = rix;
1073
1074         if ((rcflag & ATH_RC_PROBE_ALLOWED) && (*is_probe)) {
1075                 /* set one try for probe rates. For the
1076                  * probes don't enable rts */
1077                 ath_rc_rate_set_series(rate_table,
1078                         &series[i++], 1, nrix, FALSE);
1079
1080                 try_per_rate = (num_tries/num_rates);
1081                 /* Get the next tried/allowed rate. No RTS for the next series
1082                  * after the probe rate
1083                  */
1084                 nrix = ath_rc_rate_getidx(sc,
1085                         ath_rc_priv, rate_table, nrix, 1, FALSE);
1086                 ath_rc_rate_set_series(rate_table,
1087                         &series[i++], try_per_rate, nrix, 0);
1088         } else {
1089                 try_per_rate = (num_tries/num_rates);
1090                 /* Set the choosen rate. No RTS for first series entry. */
1091                 ath_rc_rate_set_series(rate_table,
1092                         &series[i++], try_per_rate, nrix, FALSE);
1093         }
1094
1095         /* Fill in the other rates for multirate retry */
1096         for ( ; i < num_rates; i++) {
1097                 u8 try_num;
1098                 u8 min_rate;
1099
1100                 try_num = ((i + 1) == num_rates) ?
1101                         num_tries - (try_per_rate * i) : try_per_rate ;
1102                 min_rate = (((i + 1) == num_rates) &&
1103                             (rcflag & ATH_RC_MINRATE_LASTRATE)) ? 1 : 0;
1104
1105                 nrix = ath_rc_rate_getidx(sc, ath_rc_priv,
1106                                           rate_table, nrix, 1, min_rate);
1107                 /* All other rates in the series have RTS enabled */
1108                 ath_rc_rate_set_series(rate_table,
1109                                        &series[i], try_num, nrix, TRUE);
1110         }
1111
1112         /*
1113          * NB:Change rate series to enable aggregation when operating
1114          * at lower MCS rates. When first rate in series is MCS2
1115          * in HT40 @ 2.4GHz, series should look like:
1116          *
1117          * {MCS2, MCS1, MCS0, MCS0}.
1118          *
1119          * When first rate in series is MCS3 in HT20 @ 2.4GHz, series should
1120          * look like:
1121          *
1122          * {MCS3, MCS2, MCS1, MCS1}
1123          *
1124          * So, set fourth rate in series to be same as third one for
1125          * above conditions.
1126          */
1127         if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) ||
1128             (sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) ||
1129             (sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) {
1130                 u8  dot11rate = rate_table->info[rix].dot11rate;
1131                 u8 phy = rate_table->info[rix].phy;
1132                 if (i == 4 &&
1133                     ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) ||
1134                      (dot11rate == 3 && phy == WLAN_RC_PHY_HT_20_SS))) {
1135                         series[3].rix = series[2].rix;
1136                         series[3].flags = series[2].flags;
1137                         series[3].max_4ms_framelen = series[2].max_4ms_framelen;
1138                 }
1139         }
1140 }
1141
1142 /*
1143  * Return the Tx rate series.
1144  */
1145 static void ath_rate_findrate(struct ath_softc *sc,
1146                               struct ath_rate_node *ath_rc_priv,
1147                               int num_tries,
1148                               int num_rates,
1149                               unsigned int rcflag,
1150                               struct ath_rc_series series[],
1151                               int *is_probe,
1152                               int is_retry)
1153 {
1154         struct ath_vap *avp = ath_rc_priv->avp;
1155
1156         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
1157
1158         if (!num_rates || !num_tries)
1159                 return;
1160
1161         if (avp->av_config.av_fixed_rateset == IEEE80211_FIXED_RATE_NONE) {
1162                 ath_rc_ratefind(sc, ath_rc_priv, num_tries, num_rates,
1163                                 rcflag, series, is_probe, is_retry);
1164         } else {
1165                 /* Fixed rate */
1166                 int idx;
1167                 u8 flags;
1168                 u32 rix;
1169                 struct ath_rate_softc *asc = ath_rc_priv->asc;
1170                 struct ath_rate_table *rate_table;
1171
1172                 rate_table = (struct ath_rate_table *)
1173                         asc->hw_rate_table[sc->sc_curmode];
1174
1175                 for (idx = 0; idx < 4; idx++) {
1176                         unsigned int    mcs;
1177                         u8 series_rix = 0;
1178
1179                         series[idx].tries = IEEE80211_RATE_IDX_ENTRY(
1180                                 avp->av_config.av_fixed_retryset, idx);
1181
1182                         mcs = IEEE80211_RATE_IDX_ENTRY(
1183                                 avp->av_config.av_fixed_rateset, idx);
1184
1185                         if (idx == 3 && (mcs & 0xf0) == 0x70)
1186                                 mcs = (mcs & ~0xf0)|0x80;
1187
1188                         if (!(mcs & 0x80))
1189                                 flags = 0;
1190                         else
1191                                 flags = ((ath_rc_priv->ht_cap &
1192                                                 WLAN_RC_DS_FLAG) ?
1193                                                 ATH_RC_DS_FLAG : 0) |
1194                                         ((ath_rc_priv->ht_cap &
1195                                                 WLAN_RC_40_FLAG) ?
1196                                                 ATH_RC_CW40_FLAG : 0) |
1197                                         ((ath_rc_priv->ht_cap &
1198                                                 WLAN_RC_SGI_FLAG) ?
1199                                         ((ath_rc_priv->ht_cap &
1200                                                 WLAN_RC_40_FLAG) ?
1201                                                 ATH_RC_SGI_FLAG : 0) : 0);
1202
1203                         series[idx].rix = sc->sc_rixmap[mcs];
1204                         series_rix  = series[idx].rix;
1205
1206                         /* XXX: Give me some cleanup love */
1207                         if ((flags & ATH_RC_CW40_FLAG) &&
1208                                 (flags & ATH_RC_SGI_FLAG))
1209                                 rix = rate_table->info[series_rix].ht_index;
1210                         else if (flags & ATH_RC_SGI_FLAG)
1211                                 rix = rate_table->info[series_rix].sgi_index;
1212                         else if (flags & ATH_RC_CW40_FLAG)
1213                                 rix = rate_table->info[series_rix].cw40index;
1214                         else
1215                                 rix = rate_table->info[series_rix].base_index;
1216                         series[idx].max_4ms_framelen =
1217                                 rate_table->info[rix].max_4ms_framelen;
1218                         series[idx].flags = flags;
1219                 }
1220         }
1221 }
1222
1223 static void ath_rc_update_ht(struct ath_softc *sc,
1224                              struct ath_rate_node *ath_rc_priv,
1225                              struct ath_tx_info_priv *info_priv,
1226                              int tx_rate, int xretries, int retries)
1227 {
1228         struct ath_tx_ratectrl *rate_ctrl;
1229         u32 now_msec = jiffies_to_msecs(jiffies);
1230         int state_change = FALSE, rate, count;
1231         u8 last_per;
1232         struct ath_rate_softc *asc = (struct ath_rate_softc *)sc->sc_rc;
1233         struct ath_rate_table *rate_table =
1234                 (struct ath_rate_table *)asc->hw_rate_table[sc->sc_curmode];
1235
1236         static u32 nretry_to_per_lookup[10] = {
1237                 100 * 0 / 1,
1238                 100 * 1 / 4,
1239                 100 * 1 / 2,
1240                 100 * 3 / 4,
1241                 100 * 4 / 5,
1242                 100 * 5 / 6,
1243                 100 * 6 / 7,
1244                 100 * 7 / 8,
1245                 100 * 8 / 9,
1246                 100 * 9 / 10
1247         };
1248
1249         if (!ath_rc_priv)
1250                 return;
1251
1252         rate_ctrl = (struct ath_tx_ratectrl *)(ath_rc_priv);
1253
1254         ASSERT(tx_rate >= 0);
1255         if (tx_rate < 0)
1256                 return;
1257
1258         /* To compensate for some imbalance between ctrl and ext. channel */
1259
1260         if (WLAN_RC_PHY_40(rate_table->info[tx_rate].phy))
1261                 info_priv->tx.ts_rssi =
1262                         info_priv->tx.ts_rssi < 3 ? 0 :
1263                         info_priv->tx.ts_rssi - 3;
1264
1265         last_per = rate_ctrl->state[tx_rate].per;
1266
1267         if (xretries) {
1268                 /* Update the PER. */
1269                 if (xretries == 1) {
1270                         rate_ctrl->state[tx_rate].per += 30;
1271                         if (rate_ctrl->state[tx_rate].per > 100)
1272                                 rate_ctrl->state[tx_rate].per = 100;
1273                 } else {
1274                         /* xretries == 2 */
1275                         count = sizeof(nretry_to_per_lookup) /
1276                                 sizeof(nretry_to_per_lookup[0]);
1277                         if (retries >= count)
1278                                 retries = count - 1;
1279                         /* new_PER = 7/8*old_PER + 1/8*(currentPER) */
1280                         rate_ctrl->state[tx_rate].per =
1281                                 (u8)(rate_ctrl->state[tx_rate].per -
1282                                      (rate_ctrl->state[tx_rate].per >> 3) +
1283                                      ((100) >> 3));
1284                 }
1285
1286                 /* xretries == 1 or 2 */
1287
1288                 if (rate_ctrl->probe_rate == tx_rate)
1289                         rate_ctrl->probe_rate = 0;
1290
1291         } else {        /* xretries == 0 */
1292                 /* Update the PER. */
1293                 /* Make sure it doesn't index out of array's bounds. */
1294                 count = sizeof(nretry_to_per_lookup) /
1295                         sizeof(nretry_to_per_lookup[0]);
1296                 if (retries >= count)
1297                         retries = count - 1;
1298                 if (info_priv->n_bad_frames) {
1299                         /* new_PER = 7/8*old_PER + 1/8*(currentPER)
1300                          * Assuming that n_frames is not 0.  The current PER
1301                          * from the retries is 100 * retries / (retries+1),
1302                          * since the first retries attempts failed, and the
1303                          * next one worked.  For the one that worked,
1304                          * n_bad_frames subframes out of n_frames wored,
1305                          * so the PER for that part is
1306                          * 100 * n_bad_frames / n_frames, and it contributes
1307                          * 100 * n_bad_frames / (n_frames * (retries+1)) to
1308                          * the above PER.  The expression below is a
1309                          * simplified version of the sum of these two terms.
1310                          */
1311                         if (info_priv->n_frames > 0)
1312                                 rate_ctrl->state[tx_rate].per
1313                                       = (u8)
1314                                         (rate_ctrl->state[tx_rate].per -
1315                                         (rate_ctrl->state[tx_rate].per >> 3) +
1316                                         ((100*(retries*info_priv->n_frames +
1317                                         info_priv->n_bad_frames) /
1318                                         (info_priv->n_frames *
1319                                                 (retries+1))) >> 3));
1320                 } else {
1321                         /* new_PER = 7/8*old_PER + 1/8*(currentPER) */
1322
1323                         rate_ctrl->state[tx_rate].per = (u8)
1324                                 (rate_ctrl->state[tx_rate].per -
1325                                 (rate_ctrl->state[tx_rate].per >> 3) +
1326                                 (nretry_to_per_lookup[retries] >> 3));
1327                 }
1328
1329                 rate_ctrl->rssi_last_prev2 = rate_ctrl->rssi_last_prev;
1330                 rate_ctrl->rssi_last_prev  = rate_ctrl->rssi_last;
1331                 rate_ctrl->rssi_last = info_priv->tx.ts_rssi;
1332                 rate_ctrl->rssi_time = now_msec;
1333
1334                 /*
1335                  * If we got at most one retry then increase the max rate if
1336                  * this was a probe.  Otherwise, ignore the probe.
1337                  */
1338
1339                 if (rate_ctrl->probe_rate && rate_ctrl->probe_rate == tx_rate) {
1340                         if (retries > 0 || 2 * info_priv->n_bad_frames >
1341                                 info_priv->n_frames) {
1342                                 /*
1343                                  * Since we probed with just a single attempt,
1344                                  * any retries means the probe failed.  Also,
1345                                  * if the attempt worked, but more than half
1346                                  * the subframes were bad then also consider
1347                                  * the probe a failure.
1348                                  */
1349                                 rate_ctrl->probe_rate = 0;
1350                         } else {
1351                                 u8 probe_rate = 0;
1352
1353                                 rate_ctrl->rate_max_phy = rate_ctrl->probe_rate;
1354                                 probe_rate = rate_ctrl->probe_rate;
1355
1356                                 if (rate_ctrl->state[probe_rate].per > 30)
1357                                         rate_ctrl->state[probe_rate].per = 20;
1358
1359                                 rate_ctrl->probe_rate = 0;
1360
1361                                 /*
1362                                  * Since this probe succeeded, we allow the next
1363                                  * probe twice as soon.  This allows the maxRate
1364                                  * to move up faster if the probes are
1365                                  * succesful.
1366                                  */
1367                                 rate_ctrl->probe_time = now_msec -
1368                                         rate_table->probe_interval / 2;
1369                         }
1370                 }
1371
1372                 if (retries > 0) {
1373                         /*
1374                          * Don't update anything.  We don't know if
1375                          * this was because of collisions or poor signal.
1376                          *
1377                          * Later: if rssi_ack is close to
1378                          * rate_ctrl->state[txRate].rssi_thres and we see lots
1379                          * of retries, then we could increase
1380                          * rate_ctrl->state[txRate].rssi_thres.
1381                          */
1382                         rate_ctrl->hw_maxretry_pktcnt = 0;
1383                 } else {
1384                         /*
1385                          * It worked with no retries. First ignore bogus (small)
1386                          * rssi_ack values.
1387                          */
1388                         if (tx_rate == rate_ctrl->rate_max_phy &&
1389                             rate_ctrl->hw_maxretry_pktcnt < 255) {
1390                                 rate_ctrl->hw_maxretry_pktcnt++;
1391                         }
1392
1393                         if (info_priv->tx.ts_rssi >=
1394                                 rate_table->info[tx_rate].rssi_ack_validmin) {
1395                                 /* Average the rssi */
1396                                 if (tx_rate != rate_ctrl->rssi_sum_rate) {
1397                                         rate_ctrl->rssi_sum_rate = tx_rate;
1398                                         rate_ctrl->rssi_sum =
1399                                                 rate_ctrl->rssi_sum_cnt = 0;
1400                                 }
1401
1402                                 rate_ctrl->rssi_sum += info_priv->tx.ts_rssi;
1403                                 rate_ctrl->rssi_sum_cnt++;
1404
1405                                 if (rate_ctrl->rssi_sum_cnt > 4) {
1406                                         int32_t rssi_ackAvg =
1407                                                 (rate_ctrl->rssi_sum + 2) / 4;
1408                                         int8_t rssi_thres =
1409                                                 rate_ctrl->state[tx_rate].
1410                                                 rssi_thres;
1411                                         int8_t rssi_ack_vmin =
1412                                                 rate_table->info[tx_rate].
1413                                                 rssi_ack_validmin;
1414
1415                                         rate_ctrl->rssi_sum =
1416                                                 rate_ctrl->rssi_sum_cnt = 0;
1417
1418                                         /* Now reduce the current
1419                                          * rssi threshold. */
1420                                         if ((rssi_ackAvg < rssi_thres + 2) &&
1421                                             (rssi_thres > rssi_ack_vmin)) {
1422                                                 rate_ctrl->state[tx_rate].
1423                                                         rssi_thres--;
1424                                         }
1425
1426                                         state_change = TRUE;
1427                                 }
1428                         }
1429                 }
1430         }
1431
1432         /* For all cases */
1433
1434         /*
1435          * If this rate looks bad (high PER) then stop using it for
1436          * a while (except if we are probing).
1437          */
1438         if (rate_ctrl->state[tx_rate].per >= 55 && tx_rate > 0 &&
1439             rate_table->info[tx_rate].ratekbps <=
1440             rate_table->info[rate_ctrl->rate_max_phy].ratekbps) {
1441                 ath_rc_get_nextlowervalid_txrate(rate_table, rate_ctrl,
1442                                  (u8) tx_rate, &rate_ctrl->rate_max_phy);
1443
1444                 /* Don't probe for a little while. */
1445                 rate_ctrl->probe_time = now_msec;
1446         }
1447
1448         if (state_change) {
1449                 /*
1450                  * Make sure the rates above this have higher rssi thresholds.
1451                  * (Note:  Monotonicity is kept within the OFDM rates and
1452                  *         within the CCK rates. However, no adjustment is
1453                  *         made to keep the rssi thresholds monotonically
1454                  *         increasing between the CCK and OFDM rates.)
1455                  */
1456                 for (rate = tx_rate; rate <
1457                                 rate_ctrl->rate_table_size - 1; rate++) {
1458                         if (rate_table->info[rate+1].phy !=
1459                                 rate_table->info[tx_rate].phy)
1460                                 break;
1461
1462                         if (rate_ctrl->state[rate].rssi_thres +
1463                             rate_table->info[rate].rssi_ack_deltamin >
1464                             rate_ctrl->state[rate+1].rssi_thres) {
1465                                 rate_ctrl->state[rate+1].rssi_thres =
1466                                         rate_ctrl->state[rate].
1467                                         rssi_thres +
1468                                         rate_table->info[rate].
1469                                         rssi_ack_deltamin;
1470                         }
1471                 }
1472
1473                 /* Make sure the rates below this have lower rssi thresholds. */
1474                 for (rate = tx_rate - 1; rate >= 0; rate--) {
1475                         if (rate_table->info[rate].phy !=
1476                             rate_table->info[tx_rate].phy)
1477                                 break;
1478
1479                         if (rate_ctrl->state[rate].rssi_thres +
1480                             rate_table->info[rate].rssi_ack_deltamin >
1481                             rate_ctrl->state[rate+1].rssi_thres) {
1482                                 if (rate_ctrl->state[rate+1].rssi_thres <
1483                                     rate_table->info[rate].
1484                                     rssi_ack_deltamin)
1485                                         rate_ctrl->state[rate].rssi_thres = 0;
1486                                 else {
1487                                         rate_ctrl->state[rate].rssi_thres =
1488                                                 rate_ctrl->state[rate+1].
1489                                                 rssi_thres -
1490                                                 rate_table->info[rate].
1491                                                 rssi_ack_deltamin;
1492                                 }
1493
1494                                 if (rate_ctrl->state[rate].rssi_thres <
1495                                     rate_table->info[rate].
1496                                     rssi_ack_validmin) {
1497                                         rate_ctrl->state[rate].rssi_thres =
1498                                                 rate_table->info[rate].
1499                                                 rssi_ack_validmin;
1500                                 }
1501                         }
1502                 }
1503         }
1504
1505         /* Make sure the rates below this have lower PER */
1506         /* Monotonicity is kept only for rates below the current rate. */
1507         if (rate_ctrl->state[tx_rate].per < last_per) {
1508                 for (rate = tx_rate - 1; rate >= 0; rate--) {
1509                         if (rate_table->info[rate].phy !=
1510                             rate_table->info[tx_rate].phy)
1511                                 break;
1512
1513                         if (rate_ctrl->state[rate].per >
1514                             rate_ctrl->state[rate+1].per) {
1515                                 rate_ctrl->state[rate].per =
1516                                         rate_ctrl->state[rate+1].per;
1517                         }
1518                 }
1519         }
1520
1521         /* Maintain monotonicity for rates above the current rate */
1522         for (rate = tx_rate; rate < rate_ctrl->rate_table_size - 1; rate++) {
1523                 if (rate_ctrl->state[rate+1].per < rate_ctrl->state[rate].per)
1524                         rate_ctrl->state[rate+1].per =
1525                                 rate_ctrl->state[rate].per;
1526         }
1527
1528         /* Every so often, we reduce the thresholds and
1529          * PER (different for CCK and OFDM). */
1530         if (now_msec - rate_ctrl->rssi_down_time >=
1531             rate_table->rssi_reduce_interval) {
1532
1533                 for (rate = 0; rate < rate_ctrl->rate_table_size; rate++) {
1534                         if (rate_ctrl->state[rate].rssi_thres >
1535                             rate_table->info[rate].rssi_ack_validmin)
1536                                 rate_ctrl->state[rate].rssi_thres -= 1;
1537                 }
1538                 rate_ctrl->rssi_down_time = now_msec;
1539         }
1540
1541         /* Every so often, we reduce the thresholds
1542          * and PER (different for CCK and OFDM). */
1543         if (now_msec - rate_ctrl->per_down_time >=
1544             rate_table->rssi_reduce_interval) {
1545                 for (rate = 0; rate < rate_ctrl->rate_table_size; rate++) {
1546                         rate_ctrl->state[rate].per =
1547                                 7 * rate_ctrl->state[rate].per / 8;
1548                 }
1549
1550                 rate_ctrl->per_down_time = now_msec;
1551         }
1552 }
1553
1554 /*
1555  * This routine is called in rate control callback tx_status() to give
1556  * the status of previous frames.
1557  */
1558 static void ath_rc_update(struct ath_softc *sc,
1559                           struct ath_rate_node *ath_rc_priv,
1560                           struct ath_tx_info_priv *info_priv, int final_ts_idx,
1561                           int xretries, int long_retry)
1562 {
1563         struct ath_rate_softc *asc = (struct ath_rate_softc *)sc->sc_rc;
1564         struct ath_rate_table *rate_table;
1565         struct ath_tx_ratectrl *rate_ctrl;
1566         struct ath_rc_series rcs[4];
1567         u8 flags;
1568         u32 series = 0, rix;
1569
1570         memcpy(rcs, info_priv->rcs, 4 * sizeof(rcs[0]));
1571         rate_table = (struct ath_rate_table *)
1572                 asc->hw_rate_table[sc->sc_curmode];
1573         rate_ctrl = (struct ath_tx_ratectrl *)(ath_rc_priv);
1574         ASSERT(rcs[0].tries != 0);
1575
1576         /*
1577          * If the first rate is not the final index, there
1578          * are intermediate rate failures to be processed.
1579          */
1580         if (final_ts_idx != 0) {
1581                 /* Process intermediate rates that failed.*/
1582                 for (series = 0; series < final_ts_idx ; series++) {
1583                         if (rcs[series].tries != 0) {
1584                                 flags = rcs[series].flags;
1585                                 /* If HT40 and we have switched mode from
1586                                  * 40 to 20 => don't update */
1587                                 if ((flags & ATH_RC_CW40_FLAG) &&
1588                                         (rate_ctrl->rc_phy_mode !=
1589                                         (flags & ATH_RC_CW40_FLAG)))
1590                                         return;
1591                                 if ((flags & ATH_RC_CW40_FLAG) &&
1592                                         (flags & ATH_RC_SGI_FLAG))
1593                                         rix = rate_table->info[
1594                                                 rcs[series].rix].ht_index;
1595                                 else if (flags & ATH_RC_SGI_FLAG)
1596                                         rix = rate_table->info[
1597                                                 rcs[series].rix].sgi_index;
1598                                 else if (flags & ATH_RC_CW40_FLAG)
1599                                         rix = rate_table->info[
1600                                                 rcs[series].rix].cw40index;
1601                                 else
1602                                         rix = rate_table->info[
1603                                                 rcs[series].rix].base_index;
1604                                 ath_rc_update_ht(sc, ath_rc_priv,
1605                                                 info_priv, rix,
1606                                                 xretries ? 1 : 2,
1607                                                 rcs[series].tries);
1608                         }
1609                 }
1610         } else {
1611                 /*
1612                  * Handle the special case of MIMO PS burst, where the second
1613                  * aggregate is sent out with only one rate and one try.
1614                  * Treating it as an excessive retry penalizes the rate
1615                  * inordinately.
1616                  */
1617                 if (rcs[0].tries == 1 && xretries == 1)
1618                         xretries = 2;
1619         }
1620
1621         flags = rcs[series].flags;
1622         /* If HT40 and we have switched mode from 40 to 20 => don't update */
1623         if ((flags & ATH_RC_CW40_FLAG) &&
1624                 (rate_ctrl->rc_phy_mode != (flags & ATH_RC_CW40_FLAG)))
1625                 return;
1626
1627         if ((flags & ATH_RC_CW40_FLAG) && (flags & ATH_RC_SGI_FLAG))
1628                 rix = rate_table->info[rcs[series].rix].ht_index;
1629         else if (flags & ATH_RC_SGI_FLAG)
1630                 rix = rate_table->info[rcs[series].rix].sgi_index;
1631         else if (flags & ATH_RC_CW40_FLAG)
1632                 rix = rate_table->info[rcs[series].rix].cw40index;
1633         else
1634                 rix = rate_table->info[rcs[series].rix].base_index;
1635
1636         ath_rc_update_ht(sc, ath_rc_priv, info_priv, rix,
1637                 xretries, long_retry);
1638 }
1639
1640 /*
1641  * Process a tx descriptor for a completed transmit (success or failure).
1642  */
1643 static void ath_rate_tx_complete(struct ath_softc *sc,
1644                                  struct ath_node *an,
1645                                  struct ath_rate_node *rc_priv,
1646                                  struct ath_tx_info_priv *info_priv)
1647 {
1648         int final_ts_idx = info_priv->tx.ts_rateindex;
1649         int tx_status = 0, is_underrun = 0;
1650         struct ath_vap *avp;
1651
1652         avp = rc_priv->avp;
1653         if ((avp->av_config.av_fixed_rateset != IEEE80211_FIXED_RATE_NONE) ||
1654             (info_priv->tx.ts_status & ATH9K_TXERR_FILT))
1655                 return;
1656
1657         if (info_priv->tx.ts_rssi > 0) {
1658                 ATH_RSSI_LPF(an->an_chainmask_sel.tx_avgrssi,
1659                              info_priv->tx.ts_rssi);
1660         }
1661
1662         /*
1663          * If underrun error is seen assume it as an excessive retry only
1664          * if prefetch trigger level have reached the max (0x3f for 5416)
1665          * Adjust the long retry as if the frame was tried ATH_11N_TXMAXTRY
1666          * times. This affects how ratectrl updates PER for the failed rate.
1667          */
1668         if (info_priv->tx.ts_flags &
1669                 (ATH9K_TX_DATA_UNDERRUN | ATH9K_TX_DELIM_UNDERRUN) &&
1670                 ((sc->sc_ah->ah_txTrigLevel) >= tx_triglevel_max)) {
1671                 tx_status = 1;
1672                 is_underrun = 1;
1673         }
1674
1675         if ((info_priv->tx.ts_status & ATH9K_TXERR_XRETRY) ||
1676                         (info_priv->tx.ts_status & ATH9K_TXERR_FIFO))
1677                 tx_status = 1;
1678
1679         ath_rc_update(sc, rc_priv, info_priv, final_ts_idx, tx_status,
1680                       (is_underrun) ? ATH_11N_TXMAXTRY :
1681                       info_priv->tx.ts_longretry);
1682 }
1683
1684 /*
1685  *  Update the SIB's rate control information
1686  *
1687  *  This should be called when the supported rates change
1688  *  (e.g. SME operation, wireless mode change)
1689  *
1690  *  It will determine which rates are valid for use.
1691  */
1692 static void ath_rc_sib_update(struct ath_softc *sc,
1693                               struct ath_rate_node *ath_rc_priv,
1694                               u32 capflag, int keep_state,
1695                               struct ath_rateset *negotiated_rates,
1696                               struct ath_rateset *negotiated_htrates)
1697 {
1698         struct ath_rate_table *rate_table = NULL;
1699         struct ath_rate_softc *asc = (struct ath_rate_softc *)sc->sc_rc;
1700         struct ath_rateset *rateset = negotiated_rates;
1701         u8 *ht_mcs = (u8 *)negotiated_htrates;
1702         struct ath_tx_ratectrl *rate_ctrl =
1703                 (struct ath_tx_ratectrl *)ath_rc_priv;
1704         u8 i, j, k, hi = 0, hthi = 0;
1705
1706         rate_table = (struct ath_rate_table *)
1707                 asc->hw_rate_table[sc->sc_curmode];
1708
1709         /* Initial rate table size. Will change depending
1710          * on the working rate set */
1711         rate_ctrl->rate_table_size = MAX_TX_RATE_TBL;
1712
1713         /* Initialize thresholds according to the global rate table */
1714         for (i = 0 ; (i < rate_ctrl->rate_table_size) && (!keep_state); i++) {
1715                 rate_ctrl->state[i].rssi_thres =
1716                         rate_table->info[i].rssi_ack_validmin;
1717                 rate_ctrl->state[i].per = 0;
1718         }
1719
1720         /* Determine the valid rates */
1721         ath_rc_init_valid_txmask(rate_ctrl);
1722
1723         for (i = 0; i < WLAN_RC_PHY_MAX; i++) {
1724                 for (j = 0; j < MAX_TX_RATE_PHY; j++)
1725                         rate_ctrl->valid_phy_rateidx[i][j] = 0;
1726                 rate_ctrl->valid_phy_ratecnt[i] = 0;
1727         }
1728         rate_ctrl->rc_phy_mode = (capflag & WLAN_RC_40_FLAG);
1729
1730         /* Set stream capability */
1731         ath_rc_priv->single_stream = (capflag & WLAN_RC_DS_FLAG) ? 0 : 1;
1732
1733         if (!rateset->rs_nrates) {
1734                 /* No working rate, just initialize valid rates */
1735                 hi = ath_rc_sib_init_validrates(ath_rc_priv, rate_table,
1736                                                 capflag);
1737         } else {
1738                 /* Use intersection of working rates and valid rates */
1739                 hi = ath_rc_sib_setvalid_rates(ath_rc_priv, rate_table,
1740                                                rateset, capflag);
1741                 if (capflag & WLAN_RC_HT_FLAG) {
1742                         hthi = ath_rc_sib_setvalid_htrates(ath_rc_priv,
1743                                                            rate_table,
1744                                                            ht_mcs,
1745                                                            capflag);
1746                 }
1747                 hi = A_MAX(hi, hthi);
1748         }
1749
1750         rate_ctrl->rate_table_size = hi + 1;
1751         rate_ctrl->rate_max_phy = 0;
1752         ASSERT(rate_ctrl->rate_table_size <= MAX_TX_RATE_TBL);
1753
1754         for (i = 0, k = 0; i < WLAN_RC_PHY_MAX; i++) {
1755                 for (j = 0; j < rate_ctrl->valid_phy_ratecnt[i]; j++) {
1756                         rate_ctrl->valid_rate_index[k++] =
1757                                 rate_ctrl->valid_phy_rateidx[i][j];
1758                 }
1759
1760                 if (!ath_rc_valid_phyrate(i, rate_table->initial_ratemax, TRUE)
1761                     || !rate_ctrl->valid_phy_ratecnt[i])
1762                         continue;
1763
1764                 rate_ctrl->rate_max_phy = rate_ctrl->valid_phy_rateidx[i][j-1];
1765         }
1766         ASSERT(rate_ctrl->rate_table_size <= MAX_TX_RATE_TBL);
1767         ASSERT(k <= MAX_TX_RATE_TBL);
1768
1769         rate_ctrl->max_valid_rate = k;
1770         /*
1771          * Some third party vendors don't send the supported rate series in
1772          * order. So sorting to make sure its in order, otherwise our RateFind
1773          * Algo will select wrong rates
1774          */
1775         ath_rc_sort_validrates(rate_table, rate_ctrl);
1776         rate_ctrl->rate_max_phy = rate_ctrl->valid_rate_index[k-4];
1777 }
1778
1779 /*
1780  * Update rate-control state on station associate/reassociate.
1781  */
1782 static int ath_rate_newassoc(struct ath_softc *sc,
1783                              struct ath_rate_node *ath_rc_priv,
1784                              unsigned int capflag,
1785                              struct ath_rateset *negotiated_rates,
1786                              struct ath_rateset *negotiated_htrates)
1787 {
1788
1789
1790         ath_rc_priv->ht_cap =
1791                 ((capflag & ATH_RC_DS_FLAG) ? WLAN_RC_DS_FLAG : 0) |
1792                 ((capflag & ATH_RC_SGI_FLAG) ? WLAN_RC_SGI_FLAG : 0) |
1793                 ((capflag & ATH_RC_HT_FLAG)  ? WLAN_RC_HT_FLAG : 0) |
1794                 ((capflag & ATH_RC_CW40_FLAG) ? WLAN_RC_40_FLAG : 0);
1795
1796         ath_rc_sib_update(sc, ath_rc_priv, ath_rc_priv->ht_cap, 0,
1797                           negotiated_rates, negotiated_htrates);
1798
1799         return 0;
1800 }
1801
1802 /*
1803  *  This routine is called to initialize the rate control parameters
1804  *  in the SIB. It is called initially during system initialization
1805  *  or when a station is associated with the AP.
1806  */
1807 static void ath_rc_sib_init(struct ath_rate_node *ath_rc_priv)
1808 {
1809         struct ath_tx_ratectrl *rate_ctrl;
1810
1811         rate_ctrl = (struct ath_tx_ratectrl *)(ath_rc_priv);
1812         rate_ctrl->rssi_down_time = jiffies_to_msecs(jiffies);
1813 }
1814
1815
1816 static void ath_setup_rates(struct ath_softc *sc,
1817                             struct ieee80211_supported_band *sband,
1818                             struct ieee80211_sta *sta,
1819                             struct ath_rate_node *rc_priv)
1820
1821 {
1822         int i, j = 0;
1823
1824         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
1825
1826         for (i = 0; i < sband->n_bitrates; i++) {
1827                 if (sta->supp_rates[sband->band] & BIT(i)) {
1828                         rc_priv->neg_rates.rs_rates[j]
1829                                 = (sband->bitrates[i].bitrate * 2) / 10;
1830                         j++;
1831                 }
1832         }
1833         rc_priv->neg_rates.rs_nrates = j;
1834 }
1835
1836 void ath_rc_node_update(struct ieee80211_hw *hw, struct ath_rate_node *rc_priv)
1837 {
1838         struct ath_softc *sc = hw->priv;
1839         u32 capflag = 0;
1840
1841         if (hw->conf.ht_conf.ht_supported) {
1842                 capflag |= ATH_RC_HT_FLAG | ATH_RC_DS_FLAG;
1843                 if (sc->sc_ht_info.tx_chan_width == ATH9K_HT_MACMODE_2040)
1844                         capflag |= ATH_RC_CW40_FLAG;
1845         }
1846
1847         ath_rate_newassoc(sc, rc_priv, capflag,
1848                           &rc_priv->neg_rates,
1849                           &rc_priv->neg_ht_rates);
1850
1851 }
1852
1853 /* Rate Control callbacks */
1854 static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
1855                           struct ieee80211_sta *sta, void *priv_sta,
1856                           struct sk_buff *skb)
1857 {
1858         struct ath_softc *sc = priv;
1859         struct ath_tx_info_priv *tx_info_priv;
1860         struct ath_node *an;
1861         struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1862         struct ieee80211_hdr *hdr;
1863         __le16 fc;
1864
1865         hdr = (struct ieee80211_hdr *)skb->data;
1866         fc = hdr->frame_control;
1867         tx_info_priv = (struct ath_tx_info_priv *)tx_info->driver_data[0];
1868
1869         spin_lock_bh(&sc->node_lock);
1870         an = ath_node_find(sc, hdr->addr1);
1871         spin_unlock_bh(&sc->node_lock);
1872
1873         if (!an || !priv_sta || !ieee80211_is_data(fc)) {
1874                 if (tx_info->driver_data[0] != NULL) {
1875                         kfree(tx_info->driver_data[0]);
1876                         tx_info->driver_data[0] = NULL;
1877                 }
1878                 return;
1879         }
1880         if (tx_info->driver_data[0] != NULL) {
1881                 ath_rate_tx_complete(sc, an, priv_sta, tx_info_priv);
1882                 kfree(tx_info->driver_data[0]);
1883                 tx_info->driver_data[0] = NULL;
1884         }
1885 }
1886
1887 static void ath_tx_aggr_resp(struct ath_softc *sc,
1888                              struct ieee80211_supported_band *sband,
1889                              struct ieee80211_sta *sta,
1890                              struct ath_node *an,
1891                              u8 tidno)
1892 {
1893         struct ath_atx_tid *txtid;
1894         u16 buffersize = 0;
1895         int state;
1896         struct sta_info *si;
1897
1898         if (!(sc->sc_flags & SC_OP_TXAGGR))
1899                 return;
1900
1901         txtid = ATH_AN_2_TID(an, tidno);
1902         if (!txtid->paused)
1903                 return;
1904
1905         /*
1906          * XXX: This is entirely busted, we aren't supposed to
1907          *      access the sta from here because it's internal
1908          *      to mac80211, and looking at the state without
1909          *      locking is wrong too.
1910          */
1911         si = container_of(sta, struct sta_info, sta);
1912         buffersize = IEEE80211_MIN_AMPDU_BUF <<
1913                 sband->ht_info.ampdu_factor; /* FIXME */
1914         state = si->ampdu_mlme.tid_state_tx[tidno];
1915
1916         if (state & HT_ADDBA_RECEIVED_MSK) {
1917                 txtid->addba_exchangecomplete = 1;
1918                 txtid->addba_exchangeinprogress = 0;
1919                 txtid->baw_size = buffersize;
1920
1921                 DPRINTF(sc, ATH_DBG_AGGR,
1922                         "%s: Resuming tid, buffersize: %d\n",
1923                         __func__,
1924                         buffersize);
1925
1926                 ath_tx_resume_tid(sc, txtid);
1927         }
1928 }
1929
1930 static void ath_get_rate(void *priv, struct ieee80211_supported_band *sband,
1931                          struct ieee80211_sta *sta, void *priv_sta,
1932                          struct sk_buff *skb, struct rate_selection *sel)
1933 {
1934         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1935         struct ath_softc *sc = priv;
1936         struct ieee80211_hw *hw = sc->hw;
1937         struct ath_tx_info_priv *tx_info_priv;
1938         struct ath_rate_node *ath_rc_priv = priv_sta;
1939         struct ath_node *an;
1940         struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1941         int is_probe = FALSE, chk, ret;
1942         s8 lowest_idx;
1943         __le16 fc = hdr->frame_control;
1944         u8 *qc, tid;
1945         DECLARE_MAC_BUF(mac);
1946
1947         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
1948
1949         /* allocate driver private area of tx_info */
1950         tx_info->driver_data[0] = kzalloc(sizeof(*tx_info_priv), GFP_ATOMIC);
1951         ASSERT(tx_info->driver_data[0] != NULL);
1952         tx_info_priv = (struct ath_tx_info_priv *)tx_info->driver_data[0];
1953
1954         lowest_idx = rate_lowest_index(sband, sta);
1955         tx_info_priv->min_rate = (sband->bitrates[lowest_idx].bitrate * 2) / 10;
1956         /* lowest rate for management and multicast/broadcast frames */
1957         if (!ieee80211_is_data(fc) ||
1958             is_multicast_ether_addr(hdr->addr1) || !sta) {
1959                 sel->rate_idx = lowest_idx;
1960                 return;
1961         }
1962
1963         /* Find tx rate for unicast frames */
1964         ath_rate_findrate(sc, ath_rc_priv,
1965                           ATH_11N_TXMAXTRY, 4,
1966                           ATH_RC_PROBE_ALLOWED,
1967                           tx_info_priv->rcs,
1968                           &is_probe,
1969                           false);
1970         if (is_probe)
1971                 sel->probe_idx = ath_rc_priv->tx_ratectrl.probe_rate;
1972
1973         /* Ratecontrol sometimes returns invalid rate index */
1974         if (tx_info_priv->rcs[0].rix != 0xff)
1975                 ath_rc_priv->prev_data_rix = tx_info_priv->rcs[0].rix;
1976         else
1977                 tx_info_priv->rcs[0].rix = ath_rc_priv->prev_data_rix;
1978
1979         sel->rate_idx = tx_info_priv->rcs[0].rix;
1980
1981         /* Check if aggregation has to be enabled for this tid */
1982
1983         if (hw->conf.ht_conf.ht_supported) {
1984                 if (ieee80211_is_data_qos(fc)) {
1985                         qc = ieee80211_get_qos_ctl(hdr);
1986                         tid = qc[0] & 0xf;
1987
1988                         spin_lock_bh(&sc->node_lock);
1989                         an = ath_node_find(sc, hdr->addr1);
1990                         spin_unlock_bh(&sc->node_lock);
1991
1992                         if (!an) {
1993                                 DPRINTF(sc, ATH_DBG_AGGR,
1994                                         "%s: Node not found to "
1995                                         "init/chk TX aggr\n", __func__);
1996                                 return;
1997                         }
1998
1999                         chk = ath_tx_aggr_check(sc, an, tid);
2000                         if (chk == AGGR_REQUIRED) {
2001                                 ret = ieee80211_start_tx_ba_session(hw,
2002                                         hdr->addr1, tid);
2003                                 if (ret)
2004                                         DPRINTF(sc, ATH_DBG_AGGR,
2005                                                 "%s: Unable to start tx "
2006                                                 "aggr for: %s\n",
2007                                                 __func__,
2008                                                 print_mac(mac, hdr->addr1));
2009                                 else
2010                                         DPRINTF(sc, ATH_DBG_AGGR,
2011                                                 "%s: Started tx aggr for: %s\n",
2012                                                 __func__,
2013                                                 print_mac(mac, hdr->addr1));
2014                         } else if (chk == AGGR_EXCHANGE_PROGRESS)
2015                                 ath_tx_aggr_resp(sc, sband, sta, an, tid);
2016                 }
2017         }
2018 }
2019
2020 static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
2021                           struct ieee80211_sta *sta, void *priv_sta)
2022 {
2023         struct ath_softc *sc = priv;
2024         struct ath_rate_node *ath_rc_priv = priv_sta;
2025         int i, j = 0;
2026
2027         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
2028
2029         ath_setup_rates(sc, sband, sta, ath_rc_priv);
2030         if (sc->hw->conf.flags & IEEE80211_CONF_SUPPORT_HT_MODE) {
2031                 for (i = 0; i < MCS_SET_SIZE; i++) {
2032                         if (sc->hw->conf.ht_conf.supp_mcs_set[i/8] & (1<<(i%8)))
2033                                 ath_rc_priv->neg_ht_rates.rs_rates[j++] = i;
2034                         if (j == ATH_RATE_MAX)
2035                                 break;
2036                 }
2037                 ath_rc_priv->neg_ht_rates.rs_nrates = j;
2038         }
2039         ath_rc_node_update(sc->hw, priv_sta);
2040 }
2041
2042 static void ath_rate_clear(void *priv)
2043 {
2044         return;
2045 }
2046
2047 static void *ath_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
2048 {
2049         struct ath_softc *sc = hw->priv;
2050
2051         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
2052         return hw->priv;
2053 }
2054
2055 static void ath_rate_free(void *priv)
2056 {
2057         return;
2058 }
2059
2060 static void *ath_rate_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
2061 {
2062         struct ath_softc *sc = priv;
2063         struct ath_vap *avp = sc->sc_vaps[0];
2064         struct ath_rate_node *rate_priv;
2065
2066         DPRINTF(sc, ATH_DBG_RATE, "%s\n", __func__);
2067
2068         rate_priv = ath_rate_node_alloc(avp, sc->sc_rc, gfp);
2069         if (!rate_priv) {
2070                 DPRINTF(sc, ATH_DBG_FATAL,
2071                         "%s: Unable to allocate private rc structure\n",
2072                         __func__);
2073                 return NULL;
2074         }
2075         ath_rc_sib_init(rate_priv);
2076
2077         return rate_priv;
2078 }
2079
2080 static void ath_rate_free_sta(void *priv, struct ieee80211_sta *sta,
2081                               void *priv_sta)
2082 {
2083         struct ath_rate_node *rate_priv = priv_sta;
2084         struct ath_softc *sc = priv;
2085
2086         DPRINTF(sc, ATH_DBG_RATE, "%s", __func__);
2087         ath_rate_node_free(rate_priv);
2088 }
2089
2090 static struct rate_control_ops ath_rate_ops = {
2091         .module = NULL,
2092         .name = "ath9k_rate_control",
2093         .tx_status = ath_tx_status,
2094         .get_rate = ath_get_rate,
2095         .rate_init = ath_rate_init,
2096         .clear = ath_rate_clear,
2097         .alloc = ath_rate_alloc,
2098         .free = ath_rate_free,
2099         .alloc_sta = ath_rate_alloc_sta,
2100         .free_sta = ath_rate_free_sta,
2101 };
2102
2103 int ath_rate_control_register(void)
2104 {
2105         return ieee80211_rate_control_register(&ath_rate_ops);
2106 }
2107
2108 void ath_rate_control_unregister(void)
2109 {
2110         ieee80211_rate_control_unregister(&ath_rate_ops);
2111 }
2112