1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3 *
4 * Copyright(c) Semiconductor - 2017 Realtek Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 *****************************************************************************/
16 #include "mp_precomp.h"
17
18 #include "../phydm_precomp.h"
19
20 #if (RATE_ADAPTIVE_SUPPORT == 1)
21 /* rate adaptive parameters */
22
23 static u8 RETRY_PENALTY[PERENTRY][RETRYSIZE + 1] = {{5, 4, 3, 2, 0, 3}, /* 92 , idx=0 */
24 {6, 5, 4, 3, 0, 4}, /* 86 , idx=1 */
25 {6, 5, 4, 2, 0, 4}, /* 81 , idx=2 */
26 {8, 7, 6, 4, 0, 6}, /* 75 , idx=3 */
27 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
28 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
29 {10, 9, 7, 6, 0, 8}, /*71 , idx=4*/
30 {10, 9, 7, 4, 0, 8}, /*66 , idx=5*/
31 #else
32 {10, 9, 8, 6, 0, 8}, /* 71 , idx=4 */
33 {10, 9, 8, 4, 0, 8}, /* 66 , idx=5 */
34 #endif
35 {10, 9, 8, 2, 0, 8}, /* 62 , idx=6 */
36 {10, 9, 8, 0, 0, 8}, /* 59 , idx=7 */
37 {18, 17, 16, 8, 0, 16}, /* 53 , idx=8 */
38 {26, 25, 24, 16, 0, 24}, /* 50 , idx=9 */
39 {34, 33, 32, 24, 0, 32}, /* 47 , idx=0x0a */
40 /* {34,33,32,16,0,32}, */ /* 43 , idx=0x0b */
41 /* {34,33,32,8,0,32}, */ /* 40 , idx=0x0c */
42 /* {34,33,28,8,0,32}, */ /* 37 , idx=0x0d */
43 /* {34,33,20,8,0,32}, */ /* 32 , idx=0x0e */
44 /* {34,32,24,8,0,32}, */ /* 26 , idx=0x0f */
45 /* {49,48,32,16,0,48}, */ /* 20 , idx=0x10 */
46 /* {49,48,24,0,0,48}, */ /* 17 , idx=0x11 */
47 /* {49,47,16,16,0,48}, */ /* 15 , idx=0x12 */
48 /* {49,44,16,16,0,48}, */ /* 12 , idx=0x13 */
49 /* {49,40,16,0,0,48}, */ /* 9 , idx=0x14 */
50 {34, 31, 28, 20, 0, 32}, /* 43 , idx=0x0b */
51 {34, 31, 27, 18, 0, 32}, /* 40 , idx=0x0c */
52 {34, 31, 26, 16, 0, 32}, /* 37 , idx=0x0d */
53 {34, 30, 22, 16, 0, 32}, /* 32 , idx=0x0e */
54 {34, 30, 24, 16, 0, 32}, /* 26 , idx=0x0f */
55 {49, 46, 40, 16, 0, 48}, /* 20 , idx=0x10 */
56 {49, 45, 32, 0, 0, 48}, /* 17 , idx=0x11 */
57 {49, 45, 22, 18, 0, 48}, /* 15 , idx=0x12 */
58 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
59 {49, 40, 28, 18, 0, 48}, /* 12 , idx=0x13 */
60 {49, 34, 20, 16, 0, 48}, /* 9 , idx=0x14 */
61 #else
62 {49, 40, 24, 16, 0, 48}, /* 12 , idx=0x13 */
63 {49, 32, 18, 12, 0, 48}, /* 9 , idx=0x14 */
64 #endif
65 {49, 22, 18, 14, 0, 48}, /* 6 , idx=0x15 */
66 {49, 16, 16, 0, 0, 48}};
67 /* 3 */ /* 3, idx=0x16 */
68
69 static u8 RETRY_PENALTY_UP[RETRYSIZE + 1] = {49, 44, 16, 16, 0, 48}; /* 12% for rate up */
70
71 static u8 PT_PENALTY[RETRYSIZE + 1] = {34, 31, 30, 24, 0, 32};
72
73 #if 0
74 static u8 RETRY_PENALTY_IDX[2][RATESIZE] = {{
75 4, 4, 4, 5, 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */
76 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
77 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f
78 }, /* 0329 R01 */
79 {
80 4, 4, 4, 5, 7, 7, 9, 9, 0x0c, 0x0e, 0x10, 0x12, /* SS<TH */
81 4, 4, 5, 5, 6, 0x0a, 0x11, 0x13,
82 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13
83 }
84 };
85 #endif
86
87 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
88 static u8 RETRY_PENALTY_IDX[2][RATESIZE] = {{4, 4, 4, 5, 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */
89 #if (DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)
90 4, 4, 4, 4, 0x0d, 0x0d, 0x0f, 0x0f,
91 #else
92 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
93 #endif
94 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f}, /* 0329 R01 */
95 {
96 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x10, 0x11, 0x12, 0x12, 0x13, /* SS<TH */
97 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x14, 0x14, 0x15,
98 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13}};
99
100 static u8 RETRY_PENALTY_UP_IDX[RATESIZE] = {0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x13, 0x14, /* SS>TH */
101 0x13, 0x13, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15,
102 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15};
103
104 static u8 RSSI_THRESHOLD[RATESIZE] = {0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0x24, 0x26, 0x2a,
106 0x17, 0x1a, 0x1c, 0x1f, 0x23, 0x28, 0x2a, 0x2c,
107 0, 0, 0, 0x1f, 0x23, 0x28, 0x2a, 0x2c};
108 #else
109
110 /* wilson modify */
111 #if 0
112 static u8 RETRY_PENALTY_IDX[2][RATESIZE] = {{
113 4, 4, 4, 5, 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */
114 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
115 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f
116 }, /* 0329 R01 */
117 {
118 0x0a, 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x14, /* SS<TH */
119 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x15,
120 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13
121 }
122 };
123 #endif
124
125 static u8 RETRY_PENALTY_IDX[2][RATESIZE] = {{4, 4, 4, 5, 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */
126 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
127 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f}, /* 0329 R01 */
128 {
129 0x0a, 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13, /* SS<TH */
130 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x13,
131 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13}};
132
133 static u8 RETRY_PENALTY_UP_IDX[RATESIZE] = {0x0c, 0x0d, 0x0d, 0x0f, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14, /* SS>TH */
134 0x0f, 0x10, 0x10, 0x12, 0x12, 0x13, 0x14, 0x15,
135 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15};
136
137 static u8 RSSI_THRESHOLD[RATESIZE] = {0, 0, 0, 0,
138 0, 0, 0, 0, 0, 0x24, 0x26, 0x2a,
139 0x18, 0x1a, 0x1d, 0x1f, 0x21, 0x27, 0x29, 0x2a,
140 0, 0, 0, 0x1f, 0x23, 0x28, 0x2a, 0x2c};
141
142 #endif
143
144 /*static u8 RSSI_THRESHOLD[RATESIZE] = {0,0,0,0,
145 0,0,0,0,0,0x24,0x26,0x2a,
146 0x1a,0x1c,0x1e,0x21,0x24,0x2a,0x2b,0x2d,
147 0,0,0,0x1f,0x23,0x28,0x2a,0x2c};*/
148 /*static u16 N_THRESHOLD_HIGH[RATESIZE] = {4,4,8,16,
149 24,36,48,72,96,144,192,216,
150 60,80,100,160,240,400,560,640,
151 300,320,480,720,1000,1200,1600,2000};
152 static u16 N_THRESHOLD_LOW[RATESIZE] = {2,2,4,8,
153 12,18,24,36,48,72,96,108,
154 30,40,50,80,120,200,280,320,
155 150,160,240,360,500,600,800,1000};*/
156 static u16 N_THRESHOLD_HIGH[RATESIZE] = {4, 4, 8, 16,
157 24, 36, 48, 72, 96, 144, 192, 216,
158 60, 80, 100, 160, 240, 400, 600, 800,
159 300, 320, 480, 720, 1000, 1200, 1600, 2000};
160 static u16 N_THRESHOLD_LOW[RATESIZE] = {2, 2, 4, 8,
161 12, 18, 24, 36, 48, 72, 96, 108,
162 30, 40, 50, 80, 120, 200, 300, 400,
163 150, 160, 240, 360, 500, 600, 800, 1000};
164 static u8 TRYING_NECESSARY[RATESIZE] = {2, 2, 2, 2,
165 2, 2, 3, 3, 4, 4, 5, 7,
166 4, 4, 7, 10, 10, 12, 12, 18,
167 5, 7, 7, 8, 11, 18, 36, 60};
168 /* 0329 */ /* 1207 */
169 #if 0
170 static u8 POOL_RETRY_TH[RATESIZE] = {30, 30, 30, 30,
171 30, 30, 25, 25, 20, 15, 15, 10,
172 30, 25, 25, 20, 15, 10, 10, 10,
173 30, 25, 25, 20, 15, 10, 10, 10
174 };
175 #endif
176
177 static u8 DROPING_NECESSARY[RATESIZE] = {1, 1, 1, 1,
178 1, 2, 3, 4, 5, 6, 7, 8,
179 1, 2, 3, 4, 5, 6, 7, 8,
180 5, 6, 7, 8, 9, 10, 11, 12};
181
182 static u32 INIT_RATE_FALLBACK_TABLE[16] = {
183 0x0f8ff015, /* 0: 40M BGN mode */
184 0x0f8ff010, /* 1: 40M GN mode */
185 0x0f8ff005, /* 2: BN mode/ 40M BGN mode */
186 0x0f8ff000, /* 3: N mode */
187 0x00000ff5, /* 4: BG mode */
188 0x00000ff0, /* 5: G mode */
189 0x0000000d, /* 6: B mode */
190 0, /* 7: */
191 0, /* 8: */
192 0, /* 9: */
193 0, /* 10: */
194 0, /* 11: */
195 0, /* 12: */
196 0, /* 13: */
197 0, /* 14: */
198 0, /* 15: */
199
200 };
201 static u8 pending_for_rate_up_fail[5] = {2, 10, 24, 40, 60};
202 static u16 dynamic_tx_rpt_timing[6] = {0x186a, 0x30d4, 0x493e, 0x61a8, 0x7a12, 0x927c}; /*200ms-1200ms*/
203
204 /* End rate adaptive parameters */
205
206 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
207 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
208 static int
odm_ra_learn_bounding(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info)209 odm_ra_learn_bounding(
210 struct dm_struct *dm,
211 struct _odm_ra_info_ *p_ra_info)
212 {
213 PHYDM_DBG(dm, DBG_RA, " %s\n", __func__);
214 if (DM_RA_RATE_UP != p_ra_info->rate_direction) {
215 /* Check if previous RA adjustment trend as +++--- or ++++----*/
216 if (((3 == p_ra_info->rate_up_counter && p_ra_info->bounding_learning_time <= 10) || (4 == p_ra_info->rate_up_counter && p_ra_info->bounding_learning_time <= 16)) && p_ra_info->rate_up_counter == p_ra_info->rate_down_counter) {
217 if (1 != p_ra_info->bounding_type) {
218 p_ra_info->bounding_type = 1;
219 p_ra_info->bounding_counter = 0;
220 }
221 p_ra_info->bounding_counter++;
222 /* Check if previous RA adjustment trend as ++--*/
223 } else if ((2 == p_ra_info->rate_up_counter) && (p_ra_info->bounding_learning_time <= 7) && (p_ra_info->rate_up_counter == p_ra_info->rate_down_counter)) {
224 if (2 != p_ra_info->bounding_type) {
225 p_ra_info->bounding_type = 2;
226 p_ra_info->bounding_counter = 0;
227 }
228 p_ra_info->bounding_counter++;
229 /* Check if previous RA adjustment trend as +++++-----*/
230 } else if ((5 == p_ra_info->rate_up_counter) && (p_ra_info->bounding_learning_time <= 17) && (p_ra_info->rate_up_counter == p_ra_info->rate_down_counter)) {
231 if (3 != p_ra_info->bounding_type) {
232 p_ra_info->bounding_type = 3;
233 p_ra_info->bounding_counter = 0;
234 }
235 p_ra_info->bounding_counter++;
236 } else
237 p_ra_info->bounding_type = 0;
238
239 p_ra_info->rate_down_counter = 0;
240 p_ra_info->rate_up_counter = 0;
241 p_ra_info->bounding_learning_time = 1;
242 } else if (p_ra_info->bounding_type) {
243 /* Check if RA adjustment trend as +++---++(+) or ++++----++(+)*/
244 if ((1 == p_ra_info->bounding_type) && (1 == p_ra_info->bounding_counter) && (2 == p_ra_info->rate_up_counter)) {
245 p_ra_info->bounding_type = 0;
246 if (p_ra_info->bounding_learning_time <= 5)
247 return 1;
248 /* Check if RA adjustment trend as ++--++--+(+)*/
249 } else if ((2 == p_ra_info->bounding_type) && (2 == p_ra_info->bounding_counter) && (1 == p_ra_info->rate_up_counter)) {
250 p_ra_info->bounding_type = 0;
251 if (p_ra_info->bounding_learning_time <= 2)
252 return 1;
253 /* Check if RA adjustment trend as +++++-----++(+)*/
254 } else if ((3 == p_ra_info->bounding_type) && (1 == p_ra_info->bounding_counter) && (2 == p_ra_info->rate_up_counter)) {
255 p_ra_info->bounding_type = 0;
256 if (p_ra_info->bounding_learning_time <= 4)
257 return 1;
258 }
259 }
260
261 return 0;
262 }
263 #endif
264
265 static void
odm_set_tx_rpt_timing_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info,u8 extend)266 odm_set_tx_rpt_timing_8188e(
267 struct dm_struct *dm,
268 struct _odm_ra_info_ *p_ra_info,
269 u8 extend)
270 {
271 u8 idx = 0;
272
273 for (idx = 0; idx < 5; idx++)
274 if (dynamic_tx_rpt_timing[idx] == p_ra_info->rpt_time)
275 break;
276
277 if (extend == 0) /* back to default timing */
278 idx = 0; /* 200ms */
279 else if (extend == 1) { /* increase the timing */
280 idx += 1;
281 if (idx > 5)
282 idx = 5;
283 } else if (extend == 2) { /* decrease the timing */
284 if (idx != 0)
285 idx -= 1;
286 }
287 p_ra_info->rpt_time = dynamic_tx_rpt_timing[idx];
288
289 PHYDM_DBG(dm, DBG_RA, "p_ra_info->rpt_time=0x%x\n",
290 p_ra_info->rpt_time);
291 }
292
293 static int
odm_rate_down_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info)294 odm_rate_down_8188e(
295 struct dm_struct *dm,
296 struct _odm_ra_info_ *p_ra_info)
297 {
298 u8 rate_id, lowest_rate, highest_rate;
299 s8 i;
300
301 PHYDM_DBG(dm, DBG_RA, "=====>%s\n", __func__);
302 if (NULL == p_ra_info) {
303 PHYDM_DBG(dm, DBG_RA, "%s: p_ra_info is NULL\n", __func__);
304 return -1;
305 }
306 rate_id = p_ra_info->pre_rate;
307 lowest_rate = p_ra_info->lowest_rate;
308 highest_rate = p_ra_info->highest_rate;
309
310 PHYDM_DBG(dm, DBG_RA,
311 " rate_id=%d lowest_rate=%d highest_rate=%d rate_sgi=%d\n",
312 rate_id, lowest_rate, highest_rate, p_ra_info->rate_sgi);
313 if (rate_id > highest_rate)
314 rate_id = highest_rate;
315 else if (p_ra_info->rate_sgi)
316 p_ra_info->rate_sgi = 0;
317 else if (rate_id > lowest_rate) {
318 if (rate_id > 0) {
319 for (i = rate_id - 1; i >= lowest_rate; i--) {
320 if (p_ra_info->ra_use_rate & BIT(i)) {
321 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
322 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
323 p_ra_info->rate_down_counter++;
324 p_ra_info->rate_direction = DM_RA_RATE_DOWN;
325
326 /* Learning +(0)-(-)(-)+ and ++(0)--(-)(-)(0)+ after the persistence of learned TX rate expire*/
327 if (0xFF == p_ra_info->rate_down_start_time) {
328 if ((0 == p_ra_info->rate_up_counter) || (p_ra_info->rate_up_counter + 2 < p_ra_info->bounding_learning_time))
329 p_ra_info->rate_down_start_time = 0;
330 else
331 p_ra_info->rate_down_start_time = p_ra_info->bounding_learning_time;
332 }
333 #endif
334 rate_id = i;
335 goto rate_down_finish;
336 }
337 }
338 }
339 } else if (rate_id <= lowest_rate)
340 rate_id = lowest_rate;
341 rate_down_finish:
342 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
343 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
344 /*if (p_ra_info->RTY[2] >= 100) {
345 p_ra_info->ra_waiting_counter = 2;
346 p_ra_info->ra_pending_counter += 1;
347 } else */ if ((0 != p_ra_info->rate_down_start_time) && (0xFF != p_ra_info->rate_down_start_time)) {
348 /* Learning +(0)-(-)(-)+ and ++(0)--(-)(-)(0)+ after the persistence of learned TX rate expire*/
349 if (p_ra_info->rate_down_counter < p_ra_info->rate_up_counter) {
350 } else if (p_ra_info->rate_down_counter == p_ra_info->rate_up_counter) {
351 p_ra_info->ra_waiting_counter = 2;
352 p_ra_info->ra_pending_counter += 1;
353 } else if (p_ra_info->rate_down_counter <= p_ra_info->rate_up_counter + 2)
354 rate_id = p_ra_info->pre_rate;
355 else {
356 p_ra_info->ra_waiting_counter = 0;
357 p_ra_info->ra_pending_counter = 0;
358 p_ra_info->rate_down_start_time = 0;
359 }
360 } else
361 #endif
362 if (p_ra_info->ra_waiting_counter == 1) {
363 p_ra_info->ra_waiting_counter += 1;
364 p_ra_info->ra_pending_counter += 1;
365 } else if (p_ra_info->ra_waiting_counter == 0) {
366 } else {
367 p_ra_info->ra_waiting_counter = 0;
368 p_ra_info->ra_pending_counter = 0;
369 }
370
371 if (p_ra_info->ra_pending_counter >= 4)
372 p_ra_info->ra_pending_counter = 4;
373 p_ra_info->ra_drop_after_down = 1;
374 p_ra_info->decision_rate = rate_id;
375 odm_set_tx_rpt_timing_8188e(dm, p_ra_info, 2);
376 PHYDM_DBG(dm, DBG_RA, "rate down, Decrease RPT Timing\n");
377 PHYDM_DBG(dm, DBG_RA,
378 "ra_waiting_counter %d, ra_pending_counter %d RADrop %d",
379 p_ra_info->ra_waiting_counter, p_ra_info->ra_pending_counter,
380 p_ra_info->ra_drop_after_down);
381 PHYDM_DBG(dm, DBG_RA, "rate down to rate_id %d rate_sgi %d\n", rate_id,
382 p_ra_info->rate_sgi);
383 PHYDM_DBG(dm, DBG_RA, "<=====%s\n", __func__);
384 return 0;
385 }
386
387 static int
odm_rate_up_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info)388 odm_rate_up_8188e(
389 struct dm_struct *dm,
390 struct _odm_ra_info_ *p_ra_info)
391 {
392 u8 rate_id, highest_rate;
393 u8 i;
394
395 PHYDM_DBG(dm, DBG_RA, "=====>%s\n", __func__);
396 if (NULL == p_ra_info) {
397 PHYDM_DBG(dm, DBG_RA, "%s: p_ra_info is NULL\n", __func__);
398 return -1;
399 }
400 rate_id = p_ra_info->pre_rate;
401 highest_rate = p_ra_info->highest_rate;
402 PHYDM_DBG(dm, DBG_RA, " rate_id=%d highest_rate=%d\n", rate_id,
403 highest_rate);
404 if (p_ra_info->ra_waiting_counter == 1) {
405 p_ra_info->ra_waiting_counter = 0;
406 p_ra_info->ra_pending_counter = 0;
407 } else if (p_ra_info->ra_waiting_counter > 1) {
408 p_ra_info->pre_rssi_sta_ra = p_ra_info->rssi_sta_ra;
409 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
410 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
411 p_ra_info->rate_down_start_time = 0;
412 #endif
413 goto rate_up_finish;
414 }
415 odm_set_tx_rpt_timing_8188e(dm, p_ra_info, 0);
416 PHYDM_DBG(dm, DBG_RA, "%s: default RPT Timing\n", __func__);
417
418 if (rate_id < highest_rate) {
419 for (i = rate_id + 1; i <= highest_rate; i++) {
420 if (p_ra_info->ra_use_rate & BIT(i)) {
421 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
422 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
423 if (odm_ra_learn_bounding(dm, p_ra_info)) {
424 p_ra_info->ra_waiting_counter = 2;
425 p_ra_info->ra_pending_counter = 1;
426 goto rate_up_finish;
427 }
428 p_ra_info->rate_up_counter++;
429 p_ra_info->rate_direction = DM_RA_RATE_UP;
430 #endif
431 rate_id = i;
432 goto rate_up_finish;
433 }
434 }
435 } else if (rate_id == highest_rate) {
436 if (p_ra_info->sgi_enable && p_ra_info->rate_sgi != 1)
437 p_ra_info->rate_sgi = 1;
438 else if ((p_ra_info->sgi_enable) != 1)
439 p_ra_info->rate_sgi = 0;
440 } else /* if((sta_info_ra->Decision_rate) > (sta_info_ra->Highest_rate)) */
441 rate_id = highest_rate;
442
443 rate_up_finish:
444 /* if(p_ra_info->ra_waiting_counter==10) */
445 if (p_ra_info->ra_waiting_counter == (4 + pending_for_rate_up_fail[p_ra_info->ra_pending_counter])) {
446 p_ra_info->ra_waiting_counter = 0;
447 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
448 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
449 /* Mark persistence expiration state*/
450 p_ra_info->rate_down_start_time = 0xFF;
451 /* Clear state to avoid wrong bounding check*/
452 p_ra_info->rate_down_counter = 0;
453 p_ra_info->rate_up_counter = 0;
454 p_ra_info->rate_direction = 0;
455 #endif
456 } else
457 p_ra_info->ra_waiting_counter++;
458
459 p_ra_info->decision_rate = rate_id;
460 PHYDM_DBG(dm, DBG_RA, "rate up to rate_id %d\n", rate_id);
461 PHYDM_DBG(dm, DBG_RA, "ra_waiting_counter %d, ra_pending_counter %d",
462 p_ra_info->ra_waiting_counter, p_ra_info->ra_pending_counter);
463 PHYDM_DBG(dm, DBG_RA, "<=====%s\n", __func__);
464 return 0;
465 }
466
odm_reset_ra_counter_8188e(struct _odm_ra_info_ * p_ra_info)467 static void odm_reset_ra_counter_8188e(struct _odm_ra_info_ *p_ra_info)
468 {
469 u8 rate_id;
470 rate_id = p_ra_info->decision_rate;
471 p_ra_info->nsc_up = (N_THRESHOLD_HIGH[rate_id] + N_THRESHOLD_LOW[rate_id]) >> 1;
472 p_ra_info->nsc_down = (N_THRESHOLD_HIGH[rate_id] + N_THRESHOLD_LOW[rate_id]) >> 1;
473 }
474
475 static void
odm_rate_decision_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info,u8 mac_id)476 odm_rate_decision_8188e(
477 struct dm_struct *dm,
478 struct _odm_ra_info_ *p_ra_info,
479 u8 mac_id)
480 {
481 u8 rate_id = 0, rty_pt_id = 0, penalty_id1 = 0, penalty_id2 = 0;
482 static u8 dynamic_tx_rpt_timing_counter = 0;
483 u8 cmd_buf[3];
484
485 PHYDM_DBG(dm, DBG_RA, "%s ======>\n", __func__);
486
487 if (p_ra_info->active && p_ra_info->TOTAL > 0) { /* STA used and data packet exits */
488
489 #if AP_USB_SDIO
490 if ((p_ra_info->rssi_sta_ra <= 17 && p_ra_info->rssi_sta_ra > p_ra_info->pre_rssi_sta_ra) || (p_ra_info->pre_rssi_sta_ra <= 17 && p_ra_info->pre_rssi_sta_ra > p_ra_info->rssi_sta_ra)) {
491 /* don't reset state in low signal due to the power different between CCK and MCS is large.*/
492 } else
493 #endif
494 if (p_ra_info->ra_drop_after_down) {
495 p_ra_info->ra_drop_after_down--;
496 odm_reset_ra_counter_8188e(p_ra_info);
497 return;
498 }
499 if ((p_ra_info->rssi_sta_ra < (p_ra_info->pre_rssi_sta_ra - 3)) || (p_ra_info->rssi_sta_ra > (p_ra_info->pre_rssi_sta_ra + 3))) {
500 p_ra_info->pre_rssi_sta_ra = p_ra_info->rssi_sta_ra;
501 p_ra_info->ra_waiting_counter = 0;
502 p_ra_info->ra_pending_counter = 0;
503 #if AP_USB_SDIO
504 p_ra_info->bounding_type = 0;
505 #endif
506 }
507
508 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
509 if (dm->priv->pshare->rf_ft_var.txforce != 0xff) {
510 p_ra_info->pre_rate = dm->priv->pshare->rf_ft_var.txforce;
511 odm_reset_ra_counter_8188e(p_ra_info);
512 }
513 #endif
514
515 /* Start RA decision */
516 if (p_ra_info->pre_rate > p_ra_info->highest_rate)
517 rate_id = p_ra_info->highest_rate;
518 else
519 rate_id = p_ra_info->pre_rate;
520
521 if (p_ra_info->rssi_sta_ra > RSSI_THRESHOLD[rate_id])
522 rty_pt_id = 0;
523 else
524 rty_pt_id = 1;
525
526 penalty_id1 = RETRY_PENALTY_IDX[rty_pt_id][rate_id]; /* TODO by page */
527
528 PHYDM_DBG(dm, DBG_RA, "nsc_down=%d\n", p_ra_info->nsc_down);
529
530 p_ra_info->nsc_down += p_ra_info->RTY[0] * RETRY_PENALTY[penalty_id1][0];
531 p_ra_info->nsc_down += p_ra_info->RTY[1] * RETRY_PENALTY[penalty_id1][1];
532 p_ra_info->nsc_down += p_ra_info->RTY[2] * RETRY_PENALTY[penalty_id1][2];
533 p_ra_info->nsc_down += p_ra_info->RTY[3] * RETRY_PENALTY[penalty_id1][3];
534 p_ra_info->nsc_down += p_ra_info->RTY[4] * RETRY_PENALTY[penalty_id1][4];
535
536 PHYDM_DBG(dm, DBG_RA, " nsc_down=%d, total*penalty[5]=%d\n",
537 p_ra_info->nsc_down,
538 (p_ra_info->TOTAL * RETRY_PENALTY[penalty_id1][5]));
539
540 if (p_ra_info->nsc_down > (p_ra_info->TOTAL * RETRY_PENALTY[penalty_id1][5]))
541 p_ra_info->nsc_down -= p_ra_info->TOTAL * RETRY_PENALTY[penalty_id1][5];
542 else
543 p_ra_info->nsc_down = 0;
544
545 /* rate up */
546 penalty_id2 = RETRY_PENALTY_UP_IDX[rate_id];
547
548 PHYDM_DBG(dm, DBG_RA, " nsc_up=%d\n", p_ra_info->nsc_up);
549
550 p_ra_info->nsc_up += p_ra_info->RTY[0] * RETRY_PENALTY[penalty_id2][0];
551 p_ra_info->nsc_up += p_ra_info->RTY[1] * RETRY_PENALTY[penalty_id2][1];
552 p_ra_info->nsc_up += p_ra_info->RTY[2] * RETRY_PENALTY[penalty_id2][2];
553 p_ra_info->nsc_up += p_ra_info->RTY[3] * RETRY_PENALTY[penalty_id2][3];
554 p_ra_info->nsc_up += p_ra_info->RTY[4] * RETRY_PENALTY[penalty_id2][4];
555
556 PHYDM_DBG(dm, DBG_RA, "nsc_up=%d, total*up[5]=%d\n",
557 p_ra_info->nsc_up,
558 (p_ra_info->TOTAL * RETRY_PENALTY[penalty_id2][5]));
559
560 if (p_ra_info->nsc_up > (p_ra_info->TOTAL * RETRY_PENALTY[penalty_id2][5]))
561 p_ra_info->nsc_up -= p_ra_info->TOTAL * RETRY_PENALTY[penalty_id2][5];
562 else
563 p_ra_info->nsc_up = 0;
564
565 PHYDM_DBG(dm, DBG_RA | ODM_COMP_INIT,
566 " RssiStaRa= %d rty_pt_id=%d penalty_id1=0x%x penalty_id2=0x%x rate_id=%d nsc_down=%d nsc_up=%d SGI=%d\n",
567 p_ra_info->rssi_sta_ra, rty_pt_id, penalty_id1,
568 penalty_id2, rate_id, p_ra_info->nsc_down,
569 p_ra_info->nsc_up, p_ra_info->rate_sgi);
570
571 #if AP_USB_SDIO
572 if (0xFF != p_ra_info->bounding_learning_time)
573 p_ra_info->bounding_learning_time++;
574 #endif
575
576 if ((p_ra_info->nsc_down < N_THRESHOLD_LOW[rate_id]) || (p_ra_info->DROP > DROPING_NECESSARY[rate_id]))
577 odm_rate_down_8188e(dm, p_ra_info);
578 /* else if ((p_ra_info->nsc_up > N_THRESHOLD_HIGH[rate_id])&&(pool_retry<POOL_RETRY_TH[rate_id])) */
579 else if (p_ra_info->nsc_up > N_THRESHOLD_HIGH[rate_id])
580 odm_rate_up_8188e(dm, p_ra_info);
581
582 #if AP_USB_SDIO
583 else if ((p_ra_info->RTY[2] >= 100) && (*dm->band_width == CHANNEL_WIDTH_20))
584 odm_rate_down_8188e(dm, p_ra_info);
585 #endif
586
587 if (p_ra_info->decision_rate == p_ra_info->pre_rate) {
588 PHYDM_DBG(dm, DBG_RA,
589 "[Rate stay] macid=%d, dec_rate=0x%x, pre_rate=0x%x\n",
590 mac_id, p_ra_info->decision_rate,
591 p_ra_info->pre_rate);
592 dynamic_tx_rpt_timing_counter += 1;
593 } else { /*rate update*/
594
595 PHYDM_DBG(dm, DBG_RA,
596 "[Rate update] macid=%d, dec_rate=0x%x, pre_rate=0x%x\n",
597 mac_id, p_ra_info->decision_rate,
598 p_ra_info->pre_rate);
599 dynamic_tx_rpt_timing_counter = 0;
600 /*update rate information*/
601 cmd_buf[0] = (p_ra_info->rate_sgi << 7) | (p_ra_info->decision_rate & 0x7f);
602 cmd_buf[1] = mac_id;
603 phydm_c2h_ra_report_handler(dm, &(cmd_buf[0]), 3);
604 }
605
606 if (dynamic_tx_rpt_timing_counter >= 4) {
607 odm_set_tx_rpt_timing_8188e(dm, p_ra_info, 1);
608 PHYDM_DBG(dm, DBG_RA,
609 "<=====rate don't change 4 times, Extend RPT Timing\n");
610 dynamic_tx_rpt_timing_counter = 0;
611 }
612
613 p_ra_info->pre_rate = p_ra_info->decision_rate;
614
615 odm_reset_ra_counter_8188e(p_ra_info);
616 }
617 PHYDM_DBG(dm, DBG_RA, "RA end\n");
618 }
619
620 static int
odm_arfb_refresh_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info)621 odm_arfb_refresh_8188e(
622 struct dm_struct *dm,
623 struct _odm_ra_info_ *p_ra_info)
624 {
625 /* Wilson 2011/10/26 */
626 u32 mask_from_reg;
627 u8 i;
628
629 switch (p_ra_info->rate_id) {
630 case RATR_INX_WIRELESS_NGB:
631 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x0f8fe00f;
632 break;
633 case RATR_INX_WIRELESS_NG:
634 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x0f8ff010;
635 break;
636 case RATR_INX_WIRELESS_NB:
637 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x0f8fe00f;
638 break;
639 case RATR_INX_WIRELESS_N:
640 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x0f8ff000;
641 break;
642 case RATR_INX_WIRELESS_GB:
643 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x00000fef;
644 break;
645 case RATR_INX_WIRELESS_G:
646 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x00000ff0;
647 break;
648 case RATR_INX_WIRELESS_B:
649 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & 0x0000000d;
650 break;
651 case 12:
652 mask_from_reg = odm_read_4byte(dm, REG_ARFR0);
653 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & mask_from_reg;
654 break;
655 case 13:
656 mask_from_reg = odm_read_4byte(dm, REG_ARFR1);
657 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & mask_from_reg;
658 break;
659 case 14:
660 mask_from_reg = odm_read_4byte(dm, REG_ARFR2);
661 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & mask_from_reg;
662 break;
663 case 15:
664 mask_from_reg = odm_read_4byte(dm, REG_ARFR3);
665 p_ra_info->ra_use_rate = (p_ra_info->rate_mask) & mask_from_reg;
666 break;
667
668 default:
669 p_ra_info->ra_use_rate = (p_ra_info->rate_mask);
670 break;
671 }
672 /* Highest rate */
673 if (p_ra_info->ra_use_rate)
674 for (i = RATESIZE; i >= 0; i--) {
675 if (p_ra_info->ra_use_rate & BIT(i)) {
676 p_ra_info->highest_rate = i;
677 break;
678 }
679 }
680 else
681 p_ra_info->highest_rate = 0;
682 /* Lowest rate */
683 if (p_ra_info->ra_use_rate)
684 for (i = 0; i < RATESIZE; i++) {
685 if (p_ra_info->ra_use_rate & BIT(i)) {
686 p_ra_info->lowest_rate = i;
687 break;
688 }
689 }
690 else
691 p_ra_info->lowest_rate = 0;
692
693 #if POWER_TRAINING_ACTIVE == 1
694 if (p_ra_info->highest_rate > 0x13)
695 p_ra_info->pt_mode_ss = 3;
696 else if (p_ra_info->highest_rate > 0x0b)
697 p_ra_info->pt_mode_ss = 2;
698 else if (p_ra_info->highest_rate > 0x0b)
699 p_ra_info->pt_mode_ss = 1;
700 else
701 p_ra_info->pt_mode_ss = 0;
702 PHYDM_DBG(dm, DBG_RA, "ODM_ARFBRefresh_8188E(): pt_mode_ss=%d\n",
703 p_ra_info->pt_mode_ss);
704
705 #endif
706 PHYDM_DBG(dm, DBG_RA,
707 "ODM_ARFBRefresh_8188E(): rate_id=%d rate_mask=%8.8x ra_use_rate=%8.8x highest_rate=%d\n",
708 p_ra_info->rate_id, p_ra_info->rate_mask,
709 p_ra_info->ra_use_rate, p_ra_info->highest_rate);
710 return 0;
711 }
712
713 #if POWER_TRAINING_ACTIVE == 1
714 static void
odm_pt_try_state_8188e(struct dm_struct * dm,struct _odm_ra_info_ * p_ra_info)715 odm_pt_try_state_8188e(
716 struct dm_struct *dm,
717 struct _odm_ra_info_ *p_ra_info)
718 {
719 p_ra_info->pt_try_state = 0;
720 switch (p_ra_info->pt_mode_ss) {
721 case 3:
722 if (p_ra_info->decision_rate >= 0x19)
723 p_ra_info->pt_try_state = 1;
724 break;
725 case 2:
726 if (p_ra_info->decision_rate >= 0x11)
727 p_ra_info->pt_try_state = 1;
728 break;
729 case 1:
730 if (p_ra_info->decision_rate >= 0x0a)
731 p_ra_info->pt_try_state = 1;
732 break;
733 case 0:
734 if (p_ra_info->decision_rate >= 0x03)
735 p_ra_info->pt_try_state = 1;
736 break;
737 default:
738 p_ra_info->pt_try_state = 0;
739 }
740
741 if (p_ra_info->rssi_sta_ra < 48)
742 p_ra_info->pt_stage = 0;
743 else if (p_ra_info->pt_try_state == 1) {
744 if (p_ra_info->pt_stop_count >= 10 || (p_ra_info->pt_pre_rssi > p_ra_info->rssi_sta_ra + 5) || (p_ra_info->pt_pre_rssi < p_ra_info->rssi_sta_ra - 5) || p_ra_info->decision_rate != p_ra_info->pt_pre_rate) {
745 if (p_ra_info->pt_stage == 0)
746 p_ra_info->pt_stage = 1;
747 else if (p_ra_info->pt_stage == 1)
748 p_ra_info->pt_stage = 3;
749 else
750 p_ra_info->pt_stage = 5;
751
752 p_ra_info->pt_pre_rssi = p_ra_info->rssi_sta_ra;
753 p_ra_info->pt_stop_count = 0;
754
755 } else {
756 p_ra_info->ra_stage = 0;
757 p_ra_info->pt_stop_count++;
758 }
759 } else {
760 p_ra_info->pt_stage = 0;
761 p_ra_info->ra_stage = 0;
762 }
763 p_ra_info->pt_pre_rate = p_ra_info->decision_rate;
764
765 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
766 /* Disable power training when noisy environment */
767 if (dm->is_disable_power_training) {
768 PHYDM_DBG(dm, DBG_PWR_TRAIN, "Disable pow train when noisy\n");
769 p_ra_info->pt_stage = 0;
770 p_ra_info->ra_stage = 0;
771 p_ra_info->pt_stop_count = 0;
772 }
773 #endif
774 }
775
776 static void
odm_pt_decision_8188e(struct _odm_ra_info_ * p_ra_info)777 odm_pt_decision_8188e(
778 struct _odm_ra_info_ *p_ra_info)
779 {
780 u8 stage_BUF;
781 u8 j;
782 u8 temp_stage;
783 u32 numsc;
784 u32 num_total;
785 u8 stage_id;
786
787 stage_BUF = p_ra_info->pt_stage;
788 numsc = 0;
789 num_total = p_ra_info->TOTAL * PT_PENALTY[5];
790 for (j = 0; j <= 4; j++) {
791 numsc += p_ra_info->RTY[j] * PT_PENALTY[j];
792 if (numsc > num_total)
793 break;
794 }
795
796 j = j >> 1;
797 temp_stage = (p_ra_info->pt_stage + 1) >> 1;
798 if (temp_stage > j)
799 stage_id = temp_stage - j;
800 else
801 stage_id = 0;
802
803 p_ra_info->pt_smooth_factor = (p_ra_info->pt_smooth_factor >> 1) + (p_ra_info->pt_smooth_factor >> 2) + stage_id * 16 + 2;
804 if (p_ra_info->pt_smooth_factor > 192)
805 p_ra_info->pt_smooth_factor = 192;
806 stage_id = p_ra_info->pt_smooth_factor >> 6;
807 temp_stage = stage_id * 2;
808 if (temp_stage != 0)
809 temp_stage -= 1;
810 if (p_ra_info->DROP > 3)
811 temp_stage = 0;
812 p_ra_info->pt_stage = temp_stage;
813 }
814 #endif
815
816 static void
odm_ra_tx_rpt_timer_setting(struct dm_struct * dm,u16 min_rpt_time)817 odm_ra_tx_rpt_timer_setting(
818 struct dm_struct *dm,
819 u16 min_rpt_time)
820 {
821 PHYDM_DBG(dm, DBG_RA, " =====>%s\n", __func__);
822
823 if (dm->currmin_rpt_time != min_rpt_time) {
824 PHYDM_DBG(dm, DBG_RA,
825 " currmin_rpt_time =0x%04x min_rpt_time=0x%04x\n",
826 dm->currmin_rpt_time, min_rpt_time);
827 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_AP))
828 odm_ra_set_tx_rpt_time(dm, min_rpt_time);
829 #else
830 rtw_rpt_timer_cfg_cmd(dm->adapter, min_rpt_time);
831 #endif
832 dm->currmin_rpt_time = min_rpt_time;
833 }
834 PHYDM_DBG(dm, DBG_RA, " <=====%s\n", __func__);
835 }
836
odm_ra_support_init(struct dm_struct * dm)837 void odm_ra_support_init(struct dm_struct *dm)
838 {
839 PHYDM_DBG(dm, DBG_RA, "=====>%s\n", __func__);
840
841 /* 2012/02/14 MH Be noticed, the init must be after IC type is recognized!!!!! */
842 if (dm->support_ic_type == ODM_RTL8188E)
843 dm->ra_support88e = true;
844 }
845
phydm_tx_stats_rst(struct dm_struct * dm)846 void phydm_tx_stats_rst(struct dm_struct *dm)
847 {
848 struct _phydm_txstatistic_ *tx_stats = NULL;
849 tx_stats = &(dm->hw_stats);
850 tx_stats->hw_total_tx = 0;
851 tx_stats->hw_tx_drop = 0;
852 tx_stats->hw_tx_rty = 0;
853 tx_stats->hw_tx_success = 0;
854 }
855
odm_ra_info_init(struct dm_struct * dm,u32 mac_id)856 int odm_ra_info_init(struct dm_struct *dm, u32 mac_id)
857 {
858 struct _odm_ra_info_ *p_ra_info = &dm->ra_info[mac_id];
859
860 p_ra_info->decision_rate = ODM_RATEMCS7;
861 p_ra_info->pre_rate = ODM_RATEMCS7;
862 p_ra_info->highest_rate = ODM_RATEMCS7;
863 p_ra_info->lowest_rate = 0;
864 p_ra_info->rate_id = 0;
865 p_ra_info->rate_mask = 0xffffffff;
866 p_ra_info->rssi_sta_ra = 0;
867 p_ra_info->pre_rssi_sta_ra = 0;
868 p_ra_info->sgi_enable = 0;
869 p_ra_info->ra_use_rate = 0xffffffff;
870 p_ra_info->nsc_down = (N_THRESHOLD_HIGH[0x13] + N_THRESHOLD_LOW[0x13]) / 2;
871 p_ra_info->nsc_up = (N_THRESHOLD_HIGH[0x13] + N_THRESHOLD_LOW[0x13]) / 2;
872 p_ra_info->rate_sgi = 0;
873 p_ra_info->active = 1; /* active is not used at present. by page, 110819 */
874 p_ra_info->rpt_time = 0x927c;
875 p_ra_info->DROP = 0;
876 p_ra_info->RTY[0] = 0;
877 p_ra_info->RTY[1] = 0;
878 p_ra_info->RTY[2] = 0;
879 p_ra_info->RTY[3] = 0;
880 p_ra_info->RTY[4] = 0;
881 p_ra_info->TOTAL = 0;
882 p_ra_info->ra_waiting_counter = 0;
883 p_ra_info->ra_pending_counter = 0;
884 p_ra_info->ra_drop_after_down = 0;
885 #if POWER_TRAINING_ACTIVE == 1
886 p_ra_info->pt_active = 1; /* active when this STA is use */
887 p_ra_info->pt_try_state = 0;
888 p_ra_info->pt_stage = 5; /* Need to fill into HW_PWR_STATUS */
889 p_ra_info->pt_smooth_factor = 192;
890 p_ra_info->pt_stop_count = 0;
891 p_ra_info->pt_pre_rate = 0;
892 p_ra_info->pt_pre_rssi = 0;
893 p_ra_info->pt_mode_ss = 0;
894 p_ra_info->ra_stage = 0;
895 #endif
896 #if AP_USB_SDIO
897 p_ra_info->rate_down_counter = 0;
898 p_ra_info->rate_up_counter = 0;
899 p_ra_info->rate_direction = 0;
900 p_ra_info->bounding_type = 0;
901 p_ra_info->bounding_counter = 0;
902 p_ra_info->bounding_learning_time = 0;
903 p_ra_info->rate_down_start_time = 0;
904 #endif
905 return 0;
906 }
907
odm_ra_info_init_all(struct dm_struct * dm)908 void odm_ra_info_init_all(struct dm_struct *dm)
909 {
910 u32 mac_id = 0;
911
912 if (dm->support_ic_type != ODM_RTL8188E)
913 return;
914
915 PHYDM_DBG(dm, DBG_RA, "=====>\n");
916 dm->currmin_rpt_time = 0;
917
918 for (mac_id = 0; mac_id < ODM_ASSOCIATE_ENTRY_NUM; mac_id++)
919 odm_ra_info_init(dm, mac_id);
920
921 /* Init Tx stats*/
922 phydm_tx_stats_rst(dm);
923
924 /* Redifine arrays for I-cut NIC */
925 if (dm->cut_version == ODM_CUT_I) {
926 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
927
928 u8 i;
929 u8 RETRY_PENALTY_IDX_S[2][RATESIZE] = {{4, 4, 4, 5,
930 4, 4, 5, 7, 7, 7, 8, 0x0a, /* SS>TH */
931 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d,
932 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f}, /* 0329 R01 */
933 {
934 0x0a, 0x0a, 0x0b, 0x0c,
935 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13, /* SS<TH */
936 0x06, 0x07, 0x08, 0x0d, 0x0e, 0x11, 0x11, 0x11,
937 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13}};
938
939 u8 RETRY_PENALTY_UP_IDX_S[RATESIZE] = {0x0c, 0x0d, 0x0d, 0x0f,
940 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14, /* SS>TH */
941 0x0b, 0x0b, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12,
942 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15};
943
944 for (i = 0; i < RATESIZE; i++) {
945 RETRY_PENALTY_IDX[0][i] = RETRY_PENALTY_IDX_S[0][i];
946 RETRY_PENALTY_IDX[1][i] = RETRY_PENALTY_IDX_S[1][i];
947
948 RETRY_PENALTY_UP_IDX[i] = RETRY_PENALTY_UP_IDX_S[i];
949 }
950 return;
951 #endif
952 }
953
954 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) /* This is for non-I-cut */
955 {
956 void *adapter = dm->adapter;
957
958 /* dbg_print("adapter->mgnt_info.reg_ra_lvl = %d\n", adapter->mgnt_info.reg_ra_lvl); */
959
960 /* 2012/09/14 MH Add for different Ra pattern init. For TPLINK case, we */
961 /* need to to adjust different RA pattern for middle range RA. 20-30dB degarde */
962 /* 88E rate adptve will raise too slow. */
963 if (((PADAPTER)adapter)->MgntInfo.RegRALvl == 0) {
964 RETRY_PENALTY_UP_IDX[11] = 0x14;
965
966 RETRY_PENALTY_UP_IDX[17] = 0x13;
967 RETRY_PENALTY_UP_IDX[18] = 0x14;
968 RETRY_PENALTY_UP_IDX[19] = 0x15;
969
970 RETRY_PENALTY_UP_IDX[23] = 0x13;
971 RETRY_PENALTY_UP_IDX[24] = 0x13;
972 RETRY_PENALTY_UP_IDX[25] = 0x13;
973 RETRY_PENALTY_UP_IDX[26] = 0x14;
974 RETRY_PENALTY_UP_IDX[27] = 0x15;
975 } else if (((PADAPTER)adapter)->MgntInfo.RegRALvl == 1) {
976 RETRY_PENALTY_UP_IDX[17] = 0x13;
977 RETRY_PENALTY_UP_IDX[18] = 0x13;
978 RETRY_PENALTY_UP_IDX[19] = 0x14;
979
980 RETRY_PENALTY_UP_IDX[23] = 0x12;
981 RETRY_PENALTY_UP_IDX[24] = 0x13;
982 RETRY_PENALTY_UP_IDX[25] = 0x13;
983 RETRY_PENALTY_UP_IDX[26] = 0x13;
984 RETRY_PENALTY_UP_IDX[27] = 0x14;
985 } else if (((PADAPTER)adapter)->MgntInfo.RegRALvl == 2) {
986 /* Compile flag default is lvl2, we need not to update. */
987 } else if (((PADAPTER)adapter)->MgntInfo.RegRALvl >= 0x80) {
988 u8 index = 0, offset = ((PADAPTER)adapter)->MgntInfo.RegRALvl - 0x80;
989
990 /* Reset to default rate adaptive value. */
991 RETRY_PENALTY_UP_IDX[11] = 0x14;
992
993 RETRY_PENALTY_UP_IDX[17] = 0x13;
994 RETRY_PENALTY_UP_IDX[18] = 0x14;
995 RETRY_PENALTY_UP_IDX[19] = 0x15;
996
997 RETRY_PENALTY_UP_IDX[23] = 0x13;
998 RETRY_PENALTY_UP_IDX[24] = 0x13;
999 RETRY_PENALTY_UP_IDX[25] = 0x13;
1000 RETRY_PENALTY_UP_IDX[26] = 0x14;
1001 RETRY_PENALTY_UP_IDX[27] = 0x15;
1002
1003 if (((PADAPTER)adapter)->MgntInfo.RegRALvl >= 0x90) {
1004 offset = ((PADAPTER)adapter)->MgntInfo.RegRALvl - 0x90;
1005 /* Lazy mode. */
1006 for (index = 0; index < 28; index++)
1007 RETRY_PENALTY_UP_IDX[index] += (offset);
1008 } else {
1009 /* Aggrasive side. */
1010 for (index = 0; index < 28; index++)
1011 RETRY_PENALTY_UP_IDX[index] -= (offset);
1012 }
1013 }
1014 }
1015 #endif
1016 return;
1017 }
1018
odm_ra_get_sgi_8188e(struct dm_struct * dm,u8 mac_id)1019 u8 odm_ra_get_sgi_8188e(struct dm_struct *dm, u8 mac_id)
1020 {
1021 if (dm == NULL || mac_id >= ASSOCIATE_ENTRY_NUM)
1022 return 0;
1023 PHYDM_DBG(dm, DBG_RA, "mac_id=%d SGI=%d\n", mac_id,
1024 dm->ra_info[mac_id].rate_sgi);
1025 return dm->ra_info[mac_id].rate_sgi;
1026 }
1027
odm_ra_get_decision_rate_8188e(struct dm_struct * dm,u8 mac_id)1028 u8 odm_ra_get_decision_rate_8188e(struct dm_struct *dm, u8 mac_id)
1029 {
1030 u8 rate = 0;
1031
1032 if (dm == NULL || mac_id >= ASSOCIATE_ENTRY_NUM)
1033 return 0;
1034
1035 rate = (dm->ra_info[mac_id].decision_rate);
1036
1037 /*PHYDM_DBG(dm, DBG_RA, "Rate[%d]=0x%x\n", mac_id, rate);*/
1038 return rate;
1039 }
1040
odm_ra_get_hw_pwr_status_8188e(struct dm_struct * dm,u8 mac_id)1041 u8 odm_ra_get_hw_pwr_status_8188e(struct dm_struct *dm, u8 mac_id)
1042 {
1043 u8 pt_stage = 5;
1044 if (dm == NULL || mac_id >= ASSOCIATE_ENTRY_NUM)
1045 return 0;
1046 pt_stage = (dm->ra_info[mac_id].pt_stage);
1047 PHYDM_DBG(dm, DBG_RA, "mac_id=%d pt_stage=0x%x\n", mac_id, pt_stage);
1048 return pt_stage;
1049 }
1050
phydm_get_rate_id_88e(void * dm_void,u8 sta_idx)1051 u8 phydm_get_rate_id_88e(void *dm_void, u8 sta_idx)
1052 {
1053 struct dm_struct *dm = (struct dm_struct *)dm_void;
1054 struct cmn_sta_info *sta = dm->phydm_sta_info[sta_idx];
1055 struct ra_sta_info *ra = NULL;
1056 enum channel_width bw = (enum channel_width)0;
1057 enum wireless_set wireless_mode = WIRELESS_HT;
1058 u8 rate_id_idx = PHYDM_BGN_20M_1SS;
1059
1060 if (is_sta_active(sta)) {
1061 ra = &(sta->ra_info);
1062 bw = sta->bw_mode;
1063 wireless_mode = sta->support_wireless_set;
1064
1065 } else {
1066 PHYDM_DBG(dm, DBG_RA, "[Warning] %s: invalid sta_info\n",
1067 __func__);
1068 return 0;
1069 }
1070
1071 PHYDM_DBG(dm, DBG_RA, "[88E] macid=%d, wireless_set=0x%x, BW=0x%x\n",
1072 sta->mac_id, wireless_mode, bw);
1073
1074 if (wireless_mode == WIRELESS_CCK) /*B mode*/
1075 rate_id_idx = PHYDM_RAID_88E_B;
1076 else if (wireless_mode == WIRELESS_OFDM) /*G mode*/
1077 rate_id_idx = PHYDM_RAID_88E_G;
1078 else if (wireless_mode == (WIRELESS_CCK | WIRELESS_OFDM)) /*BG mode*/
1079 rate_id_idx = PHYDM_RAID_88E_GB;
1080 else if (wireless_mode == WIRELESS_HT) /*N mode*/
1081 rate_id_idx = PHYDM_RAID_88E_N;
1082 else if (wireless_mode == (WIRELESS_OFDM | WIRELESS_HT)) /*GN mode*/
1083 rate_id_idx = PHYDM_RAID_88E_NG;
1084 else if (wireless_mode == (WIRELESS_CCK | WIRELESS_OFDM | WIRELESS_HT)) /*BGN mode*/
1085 rate_id_idx = PHYDM_RAID_88E_NGB;
1086 else {
1087 PHYDM_DBG(dm, DBG_RA, "[Warrning] No rate_id is found\n");
1088 rate_id_idx = RATR_INX_WIRELESS_GB;
1089 }
1090
1091 PHYDM_DBG(dm, DBG_RA, "88E Rate_ID=((0x%x))\n", rate_id_idx);
1092 return rate_id_idx;
1093 }
1094
phydm_ra_update_8188e(struct dm_struct * dm,u8 sta_idx,u8 rate_id,u32 rate_mask,u8 sgi_enable)1095 void phydm_ra_update_8188e(struct dm_struct *dm, u8 sta_idx, u8 rate_id,
1096 u32 rate_mask, u8 sgi_enable)
1097 {
1098 struct _odm_ra_info_ *p_ra_info = NULL;
1099 struct cmn_sta_info *sta = dm->phydm_sta_info[sta_idx];
1100
1101 PHYDM_DBG(dm, DBG_RA,
1102 "mac_id=%d rate_id=0x%x rate_mask=0x%x sgi_enable=%d\n",
1103 sta->mac_id, rate_id, rate_mask, sgi_enable);
1104 if (dm == NULL || sta->mac_id >= ASSOCIATE_ENTRY_NUM)
1105 return;
1106
1107 p_ra_info = &(dm->ra_info[sta->mac_id]);
1108 p_ra_info->rate_id = rate_id;
1109 p_ra_info->rate_mask = rate_mask;
1110 p_ra_info->sgi_enable = sgi_enable;
1111 odm_arfb_refresh_8188e(dm, p_ra_info);
1112 }
1113
odm_ra_set_rssi_8188e(struct dm_struct * dm,u8 mac_id,u8 rssi)1114 void odm_ra_set_rssi_8188e(struct dm_struct *dm, u8 mac_id, u8 rssi)
1115 {
1116 struct _odm_ra_info_ *p_ra_info = NULL;
1117
1118 PHYDM_DBG(dm, DBG_RA, " mac_id=%d rssi=%d\n", mac_id, rssi);
1119 if (dm == NULL || mac_id >= ASSOCIATE_ENTRY_NUM)
1120 return;
1121
1122 p_ra_info = &(dm->ra_info[mac_id]);
1123 p_ra_info->rssi_sta_ra = rssi;
1124 }
1125
odm_ra_set_tx_rpt_time(struct dm_struct * dm,u16 min_rpt_time)1126 void odm_ra_set_tx_rpt_time(struct dm_struct *dm, u16 min_rpt_time)
1127 {
1128 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1129 if (min_rpt_time != 0xffff) {
1130 #if defined(CONFIG_PCI_HCI)
1131 odm_write_2byte(dm, REG_TX_RPT_TIME, min_rpt_time);
1132 #elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
1133 notify_tx_report_interval_change(dm->priv, min_rpt_time);
1134 #endif
1135 }
1136 #else
1137 odm_write_2byte(dm, REG_TX_RPT_TIME, min_rpt_time);
1138 #endif
1139 }
1140
odm_ra_tx_rpt2_handle_8188e(struct dm_struct * dm,u8 * tx_rpt_buf,u16 tx_rpt_len,u32 mac_id_valid_entry0,u32 mac_id_valid_entry1)1141 void odm_ra_tx_rpt2_handle_8188e(struct dm_struct *dm, u8 *tx_rpt_buf,
1142 u16 tx_rpt_len, u32 mac_id_valid_entry0,
1143 u32 mac_id_valid_entry1)
1144 {
1145 struct _odm_ra_info_ *p_ra_info = NULL;
1146 struct _phydm_txstatistic_ *tx_stats = NULL;
1147 u8 mac_id = 0;
1148 u8 *p_buffer = NULL;
1149 u32 valid = 0, item_num = 0;
1150 u16 min_rpt_time = 0x927c;
1151
1152 PHYDM_DBG(dm, DBG_RA, "=====>%s: valid0=%d valid1=%d BufferLength=%d\n",
1153 __func__, mac_id_valid_entry0, mac_id_valid_entry1,
1154 tx_rpt_len);
1155
1156 item_num = tx_rpt_len >> 3;
1157 p_buffer = tx_rpt_buf;
1158
1159 do {
1160 valid = 0;
1161 if (mac_id < 32)
1162 valid = (1 << mac_id) & mac_id_valid_entry0;
1163 /*else if (mac_id < 64)*/
1164 /* valid = (1 << (mac_id - 32)) & mac_id_valid_entry1;*/
1165
1166 p_ra_info = &(dm->ra_info[mac_id]);
1167 tx_stats = &(dm->hw_stats);
1168
1169 if (valid) {
1170 p_ra_info->RTY[0] = (u16)GET_TX_REPORT_TYPE1_RERTY_0(p_buffer);
1171 p_ra_info->RTY[1] = (u16)GET_TX_REPORT_TYPE1_RERTY_1(p_buffer);
1172 p_ra_info->RTY[2] = (u16)GET_TX_REPORT_TYPE1_RERTY_2(p_buffer);
1173 p_ra_info->RTY[3] = (u16)GET_TX_REPORT_TYPE1_RERTY_3(p_buffer);
1174 p_ra_info->RTY[4] = (u16)GET_TX_REPORT_TYPE1_RERTY_4(p_buffer);
1175 p_ra_info->DROP = (u16)GET_TX_REPORT_TYPE1_DROP_0(p_buffer);
1176
1177 p_ra_info->TOTAL = p_ra_info->RTY[0] +
1178 p_ra_info->RTY[1] +
1179 p_ra_info->RTY[2] +
1180 p_ra_info->RTY[3] +
1181 p_ra_info->RTY[4] +
1182 p_ra_info->DROP;
1183 tx_stats->hw_total_tx += p_ra_info->TOTAL;
1184 tx_stats->hw_tx_success += p_ra_info->TOTAL - p_ra_info->DROP;
1185 tx_stats->hw_tx_drop += p_ra_info->DROP;
1186 tx_stats->hw_tx_rty += p_ra_info->RTY[1] + p_ra_info->RTY[2] * 2 + p_ra_info->RTY[3] * 3 + p_ra_info->RTY[4] * 4;
1187 #if defined(TXRETRY_CNT)
1188 extern struct stat_info *get_macidinfo(struct rtl8192cd_priv * priv, unsigned int aid);
1189
1190 {
1191 struct stat_info *pstat = get_macidinfo(dm->priv, mac_id);
1192 if (pstat) {
1193 pstat->cur_tx_ok += p_ra_info->RTY[0];
1194 pstat->cur_tx_retry_pkts += p_ra_info->RTY[1] + p_ra_info->RTY[2] + p_ra_info->RTY[3] + p_ra_info->RTY[4];
1195 pstat->cur_tx_retry_cnt += p_ra_info->RTY[1] + p_ra_info->RTY[2] * 2 + p_ra_info->RTY[3] * 3 + p_ra_info->RTY[4] * 4;
1196 pstat->total_tx_retry_cnt += pstat->cur_tx_retry_cnt;
1197 pstat->total_tx_retry_pkts += pstat->cur_tx_retry_pkts;
1198 pstat->cur_tx_fail += p_ra_info->DROP;
1199 }
1200 }
1201 #endif
1202 if (p_ra_info->TOTAL != 0) {
1203 PHYDM_DBG(dm, DBG_RA,
1204 "macid=%d Total=%d R0=%d R1=%d R2=%d R3=%d R4=%d D0=%d valid0=%x valid1=%x\n",
1205 mac_id, p_ra_info->TOTAL,
1206 p_ra_info->RTY[0], p_ra_info->RTY[1],
1207 p_ra_info->RTY[2], p_ra_info->RTY[3],
1208 p_ra_info->RTY[4], p_ra_info->DROP,
1209 mac_id_valid_entry0,
1210 mac_id_valid_entry1);
1211 #if POWER_TRAINING_ACTIVE == 1
1212 if (p_ra_info->pt_active) {
1213 if (p_ra_info->ra_stage < 5)
1214 odm_rate_decision_8188e(dm, p_ra_info, mac_id);
1215 else if (p_ra_info->ra_stage == 5) /* Power training try state */
1216 odm_pt_try_state_8188e(dm, p_ra_info);
1217 else /* ra_stage==6 */
1218 odm_pt_decision_8188e(p_ra_info);
1219
1220 /* Stage_RA counter */
1221 if (p_ra_info->ra_stage <= 5)
1222 p_ra_info->ra_stage++;
1223 else
1224 p_ra_info->ra_stage = 0;
1225 } else
1226 odm_rate_decision_8188e(dm, p_ra_info, mac_id);
1227 #else
1228 odm_rate_decision_8188e(dm, p_ra_info, mac_id);
1229 #endif
1230
1231 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1232 extern void rtl8188e_set_station_tx_rate_info(struct dm_struct *, struct _odm_ra_info_ *, int);
1233 rtl8188e_set_station_tx_rate_info(dm, p_ra_info, mac_id);
1234 #if 0
1235 void rtl8188e_detect_sta_existance(struct dm_struct *dm, struct _odm_ra_info_ *p_ra_info, int mac_id);
1236 rtl8188e_detect_sta_existance(dm, p_ra_info, mac_id);
1237 #endif
1238 #endif
1239
1240 PHYDM_DBG(dm, DBG_RA,
1241 "macid=%d R0=%d R1=%d R2=%d R3=%d R4=%d drop=%d valid0=%x rate_id=%d SGI=%d\n",
1242 mac_id, p_ra_info->RTY[0],
1243 p_ra_info->RTY[1], p_ra_info->RTY[2],
1244 p_ra_info->RTY[3], p_ra_info->RTY[4],
1245 p_ra_info->DROP, mac_id_valid_entry0,
1246 p_ra_info->decision_rate,
1247 p_ra_info->rate_sgi);
1248 } else
1249 PHYDM_DBG(dm, DBG_RA, " TOTAL=0!!!!\n");
1250
1251 if (min_rpt_time > p_ra_info->rpt_time)
1252 min_rpt_time = p_ra_info->rpt_time;
1253 }
1254
1255 p_buffer += TX_RPT2_ITEM_SIZE;
1256
1257 mac_id++;
1258 } while (mac_id < item_num);
1259
1260 odm_ra_tx_rpt_timer_setting(dm, min_rpt_time);
1261
1262 PHYDM_DBG(dm, DBG_RA, "<===== %s\n", __func__);
1263 }
1264
1265 #else
1266
1267 static void
odm_ra_tx_rpt_timer_setting(struct dm_struct * dm,u16 min_rpt_time)1268 odm_ra_tx_rpt_timer_setting(
1269 struct dm_struct *dm,
1270 u16 min_rpt_time)
1271 {
1272 return;
1273 }
1274
odm_ra_support_init(struct dm_struct * dm)1275 void odm_ra_support_init(struct dm_struct *dm)
1276 {
1277 return;
1278 }
1279
odm_ra_info_init(struct dm_struct * dm,u32 mac_id)1280 int odm_ra_info_init(struct dm_struct *dm, u32 mac_id)
1281 {
1282 return 0;
1283 }
1284
odm_ra_info_init_all(struct dm_struct * dm)1285 void odm_ra_info_init_all(struct dm_struct *dm)
1286 {
1287 return;
1288 }
1289
odm_ra_get_sgi_8188e(struct dm_struct * dm,u8 mac_id)1290 u8 odm_ra_get_sgi_8188e(struct dm_struct *dm, u8 mac_id)
1291 {
1292 return 0;
1293 }
1294
odm_ra_get_decision_rate_8188e(struct dm_struct * dm,u8 mac_id)1295 u8 odm_ra_get_decision_rate_8188e(struct dm_struct *dm, u8 mac_id)
1296 {
1297 return 0;
1298 }
odm_ra_get_hw_pwr_status_8188e(struct dm_struct * dm,u8 mac_id)1299 u8 odm_ra_get_hw_pwr_status_8188e(struct dm_struct *dm, u8 mac_id)
1300 {
1301 return 0;
1302 }
1303
phydm_ra_update_8188e(struct dm_struct * dm,u8 mac_id,u8 rate_id,u32 rate_mask,u8 sgi_enable)1304 void phydm_ra_update_8188e(struct dm_struct *dm, u8 mac_id, u8 rate_id,
1305 u32 rate_mask, u8 sgi_enable)
1306 {
1307 return;
1308 }
1309
odm_ra_set_rssi_8188e(struct dm_struct * dm,u8 mac_id,u8 rssi)1310 void odm_ra_set_rssi_8188e(struct dm_struct *dm, u8 mac_id, u8 rssi)
1311 {
1312 return;
1313 }
1314
odm_ra_set_tx_rpt_time(struct dm_struct * dm,u16 min_rpt_time)1315 void odm_ra_set_tx_rpt_time(struct dm_struct *dm, u16 min_rpt_time)
1316 {
1317 return;
1318 }
1319
odm_ra_tx_rpt2_handle_8188e(struct dm_struct * dm,u8 * tx_rpt_buf,u16 tx_rpt_len,u32 mac_id_valid_entry0,u32 mac_id_valid_entry1)1320 void odm_ra_tx_rpt2_handle_8188e(struct dm_struct *dm, u8 *tx_rpt_buf,
1321 u16 tx_rpt_len, u32 mac_id_valid_entry0,
1322 u32 mac_id_valid_entry1)
1323 {
1324 return;
1325 }
1326
1327 #endif
1328