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