1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4  *
5  * Contact Information: wlanfae <wlanfae@realtek.com>
6  */
7 #include "rtl_core.h"
8 #include "rtl_dm.h"
9 #include "r8192E_hw.h"
10 #include "r8192E_phy.h"
11 #include "r8192E_phyreg.h"
12 #include "r8190P_rtl8256.h"
13 #include "r8192E_cmdpkt.h"
14 
15 /*---------------------------Define Local Constant---------------------------*/
16 static u32 edca_setting_DL[HT_IOT_PEER_MAX] = {
17 	0x5e4322,
18 	0x5e4322,
19 	0x5ea44f,
20 	0x5e4322,
21 	0x604322,
22 	0xa44f,
23 	0x5e4322,
24 	0x5e4332
25 };
26 
27 static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] = {
28 	0x5e4322,
29 	0x5e4322,
30 	0x5e4322,
31 	0x5e4322,
32 	0x604322,
33 	0xa44f,
34 	0x5e4322,
35 	0x5e4322
36 };
37 
38 static u32 edca_setting_UL[HT_IOT_PEER_MAX] = {
39 	0x5e4322,
40 	0xa44f,
41 	0x5ea44f,
42 	0x5e4322,
43 	0x604322,
44 	0x5e4322,
45 	0x5e4322,
46 	0x5e4332
47 };
48 
49 const u32 dm_tx_bb_gain[TxBBGainTableLength] = {
50 	0x7f8001fe, /* 12 dB */
51 	0x788001e2, /* 11 dB */
52 	0x71c001c7,
53 	0x6b8001ae,
54 	0x65400195,
55 	0x5fc0017f,
56 	0x5a400169,
57 	0x55400155,
58 	0x50800142,
59 	0x4c000130,
60 	0x47c0011f,
61 	0x43c0010f,
62 	0x40000100,
63 	0x3c8000f2,
64 	0x390000e4,
65 	0x35c000d7,
66 	0x32c000cb,
67 	0x300000c0,
68 	0x2d4000b5,
69 	0x2ac000ab,
70 	0x288000a2,
71 	0x26000098,
72 	0x24000090,
73 	0x22000088,
74 	0x20000080,
75 	0x1a00006c,
76 	0x1c800072,
77 	0x18000060,
78 	0x19800066,
79 	0x15800056,
80 	0x26c0005b,
81 	0x14400051,
82 	0x24400051,
83 	0x1300004c,
84 	0x12000048,
85 	0x11000044,
86 	0x10000040, /* -24 dB */
87 };
88 
89 const u8 dm_cck_tx_bb_gain[CCKTxBBGainTableLength][8] = {
90 	{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
91 	{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
92 	{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
93 	{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
94 	{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
95 	{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
96 	{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
97 	{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
98 	{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
99 	{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
100 	{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
101 	{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
102 	{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
103 	{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
104 	{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
105 	{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
106 	{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
107 	{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
108 	{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
109 	{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
110 	{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
111 	{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
112 	{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
113 };
114 
115 const u8 dm_cck_tx_bb_gain_ch14[CCKTxBBGainTableLength][8] = {
116 	{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
117 	{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
118 	{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
119 	{0x2d, 0x2d, 0x27, 0x17, 0x00, 0x00, 0x00, 0x00},
120 	{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
121 	{0x28, 0x28, 0x22, 0x14, 0x00, 0x00, 0x00, 0x00},
122 	{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
123 	{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
124 	{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
125 	{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
126 	{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
127 	{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
128 	{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
129 	{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
130 	{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
131 	{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
132 	{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
133 	{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
134 	{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
135 	{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
136 	{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
137 	{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
138 	{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
139 };
140 
141 /*---------------------------Define Local Constant---------------------------*/
142 
143 
144 /*------------------------Define global variable-----------------------------*/
145 struct dig_t dm_digtable;
146 
147 struct drx_path_sel DM_RxPathSelTable;
148 /*------------------------Define global variable-----------------------------*/
149 
150 
151 /*------------------------Define local variable------------------------------*/
152 /*------------------------Define local variable------------------------------*/
153 
154 
155 
156 /*---------------------Define local function prototype-----------------------*/
157 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev);
158 
159 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev);
160 static	void	_rtl92e_dm_bandwidth_autoswitch(struct net_device *dev);
161 
162 
163 static	void	_rtl92e_dm_check_tx_power_tracking(struct net_device *dev);
164 
165 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev);
166 static void _rtl92e_dm_dig_init(struct net_device *dev);
167 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev);
168 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev);
169 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev);
170 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev);
171 static void _rtl92e_dm_initial_gain(struct net_device *dev);
172 static void _rtl92e_dm_pd_th(struct net_device *dev);
173 static void _rtl92e_dm_cs_ratio(struct net_device *dev);
174 
175 static	void _rtl92e_dm_init_cts_to_self(struct net_device *dev);
176 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev);
177 
178 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev);
179 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev);
180 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev);
181 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev);
182 
183 
184 static void _rtl92e_dm_init_fsync(struct net_device *dev);
185 static void _rtl92e_dm_deinit_fsync(struct net_device *dev);
186 
187 static	void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev);
188 static  void _rtl92e_dm_check_ac_dc_power(struct net_device *dev);
189 static void _rtl92e_dm_check_fsync(struct net_device *dev);
190 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data);
191 static void _rtl92e_dm_fsync_timer_callback(struct timer_list *t);
192 
193 /*---------------------Define local function prototype-----------------------*/
194 
195 static	void	_rtl92e_dm_init_dynamic_tx_power(struct net_device *dev);
196 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev);
197 
198 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev);
199 static void _rtl92e_dm_cts_to_self(struct net_device *dev);
200 /*---------------------------Define function prototype------------------------*/
201 
rtl92e_dm_init(struct net_device * dev)202 void rtl92e_dm_init(struct net_device *dev)
203 {
204 	struct r8192_priv *priv = rtllib_priv(dev);
205 
206 	priv->DM_Type = DM_Type_ByDriver;
207 
208 	priv->undecorated_smoothed_pwdb = -1;
209 
210 	_rtl92e_dm_init_dynamic_tx_power(dev);
211 
212 	rtl92e_init_adaptive_rate(dev);
213 
214 	_rtl92e_dm_dig_init(dev);
215 	rtl92e_dm_init_edca_turbo(dev);
216 	_rtl92e_dm_init_bandwidth_autoswitch(dev);
217 	_rtl92e_dm_init_fsync(dev);
218 	_rtl92e_dm_init_rx_path_selection(dev);
219 	_rtl92e_dm_init_cts_to_self(dev);
220 	if (IS_HARDWARE_TYPE_8192SE(dev))
221 		_rtl92e_dm_init_wa_broadcom_iot(dev);
222 
223 	INIT_DELAYED_WORK_RSL(&priv->gpio_change_rf_wq,
224 			      (void *)_rtl92e_dm_check_rf_ctrl_gpio, dev);
225 }
226 
rtl92e_dm_deinit(struct net_device * dev)227 void rtl92e_dm_deinit(struct net_device *dev)
228 {
229 
230 	_rtl92e_dm_deinit_fsync(dev);
231 
232 }
233 
rtl92e_dm_watchdog(struct net_device * dev)234 void rtl92e_dm_watchdog(struct net_device *dev)
235 {
236 	struct r8192_priv *priv = rtllib_priv(dev);
237 
238 	if (priv->being_init_adapter)
239 		return;
240 
241 	_rtl92e_dm_check_ac_dc_power(dev);
242 
243 	_rtl92e_dm_check_txrateandretrycount(dev);
244 	_rtl92e_dm_check_edca_turbo(dev);
245 
246 	_rtl92e_dm_check_rate_adaptive(dev);
247 	_rtl92e_dm_dynamic_tx_power(dev);
248 	_rtl92e_dm_check_tx_power_tracking(dev);
249 
250 	_rtl92e_dm_ctrl_initgain_byrssi(dev);
251 	_rtl92e_dm_bandwidth_autoswitch(dev);
252 
253 	_rtl92e_dm_check_rx_path_selection(dev);
254 	_rtl92e_dm_check_fsync(dev);
255 
256 	_rtl92e_dm_send_rssi_to_fw(dev);
257 	_rtl92e_dm_cts_to_self(dev);
258 }
259 
_rtl92e_dm_check_ac_dc_power(struct net_device * dev)260 static void _rtl92e_dm_check_ac_dc_power(struct net_device *dev)
261 {
262 	struct r8192_priv *priv = rtllib_priv(dev);
263 	static const char ac_dc_script[] = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
264 	char *argv[] = {(char *)ac_dc_script, DRV_NAME, NULL};
265 	static char *envp[] = {"HOME=/",
266 			"TERM=linux",
267 			"PATH=/usr/bin:/bin",
268 			 NULL};
269 
270 	if (priv->ResetProgress == RESET_TYPE_SILENT) {
271 		return;
272 	}
273 
274 	if (priv->rtllib->state != RTLLIB_LINKED)
275 		return;
276 	call_usermodehelper(ac_dc_script, argv, envp, UMH_WAIT_PROC);
277 
278 	return;
279 };
280 
281 
rtl92e_init_adaptive_rate(struct net_device * dev)282 void rtl92e_init_adaptive_rate(struct net_device *dev)
283 {
284 
285 	struct r8192_priv *priv = rtllib_priv(dev);
286 	struct rate_adaptive *pra = &priv->rate_adaptive;
287 
288 	pra->ratr_state = DM_RATR_STA_MAX;
289 	pra->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
290 	pra->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
291 	pra->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
292 
293 	pra->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
294 	pra->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
295 	pra->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
296 
297 	if (priv->CustomerID == RT_CID_819x_Netcore)
298 		pra->ping_rssi_enable = 1;
299 	else
300 		pra->ping_rssi_enable = 0;
301 	pra->ping_rssi_thresh_for_ra = 15;
302 
303 
304 	if (priv->rf_type == RF_2T4R) {
305 		pra->upper_rssi_threshold_ratr		=	0x8f0f0000;
306 		pra->middle_rssi_threshold_ratr		=	0x8f0ff000;
307 		pra->low_rssi_threshold_ratr		=	0x8f0ff001;
308 		pra->low_rssi_threshold_ratr_40M	=	0x8f0ff005;
309 		pra->low_rssi_threshold_ratr_20M	=	0x8f0ff001;
310 		pra->ping_rssi_ratr	=	0x0000000d;
311 	} else if (priv->rf_type == RF_1T2R) {
312 		pra->upper_rssi_threshold_ratr		=	0x000fc000;
313 		pra->middle_rssi_threshold_ratr		=	0x000ff000;
314 		pra->low_rssi_threshold_ratr		=	0x000ff001;
315 		pra->low_rssi_threshold_ratr_40M	=	0x000ff005;
316 		pra->low_rssi_threshold_ratr_20M	=	0x000ff001;
317 		pra->ping_rssi_ratr	=	0x0000000d;
318 	}
319 
320 }
321 
322 
_rtl92e_dm_check_rate_adaptive(struct net_device * dev)323 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev)
324 {
325 	struct r8192_priv *priv = rtllib_priv(dev);
326 	struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
327 	struct rate_adaptive *pra = &priv->rate_adaptive;
328 	u32 currentRATR, targetRATR = 0;
329 	u32 LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
330 	bool bshort_gi_enabled = false;
331 	static u8 ping_rssi_state;
332 
333 	if (!priv->up) {
334 		return;
335 	}
336 
337 	if (pra->rate_adaptive_disabled)
338 		return;
339 
340 	if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
341 	    priv->rtllib->mode == WIRELESS_MODE_N_5G))
342 		return;
343 
344 	if (priv->rtllib->state == RTLLIB_LINKED) {
345 
346 		bshort_gi_enabled = (pHTInfo->cur_tx_bw40mhz &&
347 				     pHTInfo->bCurShortGI40MHz) ||
348 				    (!pHTInfo->cur_tx_bw40mhz &&
349 				     pHTInfo->bCurShortGI20MHz);
350 
351 		pra->upper_rssi_threshold_ratr =
352 				(pra->upper_rssi_threshold_ratr & (~BIT31)) |
353 				((bshort_gi_enabled) ? BIT31 : 0);
354 
355 		pra->middle_rssi_threshold_ratr =
356 				(pra->middle_rssi_threshold_ratr & (~BIT31)) |
357 				((bshort_gi_enabled) ? BIT31 : 0);
358 
359 		if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
360 			pra->low_rssi_threshold_ratr =
361 				(pra->low_rssi_threshold_ratr_40M & (~BIT31)) |
362 				((bshort_gi_enabled) ? BIT31 : 0);
363 		} else {
364 			pra->low_rssi_threshold_ratr =
365 				(pra->low_rssi_threshold_ratr_20M & (~BIT31)) |
366 				((bshort_gi_enabled) ? BIT31 : 0);
367 		}
368 		pra->ping_rssi_ratr =
369 				(pra->ping_rssi_ratr & (~BIT31)) |
370 				((bshort_gi_enabled) ? BIT31 : 0);
371 
372 		if (pra->ratr_state == DM_RATR_STA_HIGH) {
373 			HighRSSIThreshForRA = pra->high2low_rssi_thresh_for_ra;
374 			LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
375 					(pra->low_rssi_thresh_for_ra40M) : (pra->low_rssi_thresh_for_ra20M);
376 		} else if (pra->ratr_state == DM_RATR_STA_LOW) {
377 			HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
378 			LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
379 					(pra->low2high_rssi_thresh_for_ra40M) : (pra->low2high_rssi_thresh_for_ra20M);
380 		} else {
381 			HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
382 			LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
383 					(pra->low_rssi_thresh_for_ra40M) : (pra->low_rssi_thresh_for_ra20M);
384 		}
385 
386 		if (priv->undecorated_smoothed_pwdb >=
387 		    (long)HighRSSIThreshForRA) {
388 			pra->ratr_state = DM_RATR_STA_HIGH;
389 			targetRATR = pra->upper_rssi_threshold_ratr;
390 		} else if (priv->undecorated_smoothed_pwdb >=
391 			   (long)LowRSSIThreshForRA) {
392 			pra->ratr_state = DM_RATR_STA_MIDDLE;
393 			targetRATR = pra->middle_rssi_threshold_ratr;
394 		} else {
395 			pra->ratr_state = DM_RATR_STA_LOW;
396 			targetRATR = pra->low_rssi_threshold_ratr;
397 		}
398 
399 		if (pra->ping_rssi_enable) {
400 			if (priv->undecorated_smoothed_pwdb <
401 			    (long)(pra->ping_rssi_thresh_for_ra+5)) {
402 				if ((priv->undecorated_smoothed_pwdb <
403 				     (long)pra->ping_rssi_thresh_for_ra) ||
404 				    ping_rssi_state) {
405 					pra->ratr_state = DM_RATR_STA_LOW;
406 					targetRATR = pra->ping_rssi_ratr;
407 					ping_rssi_state = 1;
408 				}
409 			} else {
410 				ping_rssi_state = 0;
411 			}
412 		}
413 
414 		if (priv->rtllib->GetHalfNmodeSupportByAPsHandler(dev))
415 			targetRATR &=  0xf00fffff;
416 
417 		currentRATR = rtl92e_readl(dev, RATR0);
418 		if (targetRATR !=  currentRATR) {
419 			u32 ratr_value;
420 
421 			ratr_value = targetRATR;
422 			if (priv->rf_type == RF_1T2R)
423 				ratr_value &= ~(RATE_ALL_OFDM_2SS);
424 			rtl92e_writel(dev, RATR0, ratr_value);
425 			rtl92e_writeb(dev, UFWP, 1);
426 
427 			pra->last_ratr = targetRATR;
428 		}
429 
430 	} else {
431 		pra->ratr_state = DM_RATR_STA_MAX;
432 	}
433 }
434 
_rtl92e_dm_init_bandwidth_autoswitch(struct net_device * dev)435 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev)
436 {
437 	struct r8192_priv *priv = rtllib_priv(dev);
438 
439 	priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz = BW_AUTO_SWITCH_LOW_HIGH;
440 	priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz = BW_AUTO_SWITCH_HIGH_LOW;
441 	priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
442 	priv->rtllib->bandwidth_auto_switch.bautoswitch_enable = false;
443 }
444 
_rtl92e_dm_bandwidth_autoswitch(struct net_device * dev)445 static void _rtl92e_dm_bandwidth_autoswitch(struct net_device *dev)
446 {
447 	struct r8192_priv *priv = rtllib_priv(dev);
448 
449 	if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ||
450 	   !priv->rtllib->bandwidth_auto_switch.bautoswitch_enable)
451 		return;
452 	if (!priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz) {
453 		if (priv->undecorated_smoothed_pwdb <=
454 		    priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz)
455 			priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = true;
456 	} else {
457 		if (priv->undecorated_smoothed_pwdb >=
458 		    priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz)
459 			priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
460 	}
461 }
462 
463 static u32 OFDMSwingTable[OFDM_Table_Length] = {
464 	0x7f8001fe,
465 	0x71c001c7,
466 	0x65400195,
467 	0x5a400169,
468 	0x50800142,
469 	0x47c0011f,
470 	0x40000100,
471 	0x390000e4,
472 	0x32c000cb,
473 	0x2d4000b5,
474 	0x288000a2,
475 	0x24000090,
476 	0x20000080,
477 	0x1c800072,
478 	0x19800066,
479 	0x26c0005b,
480 	0x24400051,
481 	0x12000048,
482 	0x10000040
483 };
484 
485 static u8	CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
486 	{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
487 	{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
488 	{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
489 	{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
490 	{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
491 	{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
492 	{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
493 	{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
494 	{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
495 	{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
496 	{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
497 	{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
498 };
499 
500 static u8	CCKSwingTable_Ch14[CCK_Table_length][8] = {
501 	{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
502 	{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
503 	{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
504 	{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
505 	{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
506 	{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
507 	{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
508 	{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
509 	{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
510 	{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
511 	{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
512 	{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
513 };
514 
515 #define		Pw_Track_Flag				0x11d
516 #define		Tssi_Mea_Value				0x13c
517 #define		Tssi_Report_Value1			0x134
518 #define		Tssi_Report_Value2			0x13e
519 #define		FW_Busy_Flag				0x13f
520 
_rtl92e_dm_tx_update_tssi_weak_signal(struct net_device * dev,u8 RF_Type)521 static void _rtl92e_dm_tx_update_tssi_weak_signal(struct net_device *dev,
522 						  u8 RF_Type)
523 {
524 	struct r8192_priv *p = rtllib_priv(dev);
525 
526 	if (RF_Type == RF_2T4R) {
527 		if ((p->rfa_txpowertrackingindex > 0) &&
528 		    (p->rfc_txpowertrackingindex > 0)) {
529 			p->rfa_txpowertrackingindex--;
530 			if (p->rfa_txpowertrackingindex_real > 4) {
531 				p->rfa_txpowertrackingindex_real--;
532 				rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
533 						  bMaskDWord,
534 						  dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
535 			}
536 
537 			p->rfc_txpowertrackingindex--;
538 			if (p->rfc_txpowertrackingindex_real > 4) {
539 				p->rfc_txpowertrackingindex_real--;
540 				rtl92e_set_bb_reg(dev,
541 						  rOFDM0_XCTxIQImbalance,
542 						  bMaskDWord,
543 						  dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
544 			}
545 		} else {
546 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
547 					  bMaskDWord,
548 					  dm_tx_bb_gain[4]);
549 			rtl92e_set_bb_reg(dev,
550 					  rOFDM0_XCTxIQImbalance,
551 					  bMaskDWord, dm_tx_bb_gain[4]);
552 		}
553 	} else {
554 		if (p->rfa_txpowertrackingindex > 0) {
555 			p->rfa_txpowertrackingindex--;
556 			if (p->rfa_txpowertrackingindex_real > 4) {
557 				p->rfa_txpowertrackingindex_real--;
558 				rtl92e_set_bb_reg(dev,
559 						  rOFDM0_XATxIQImbalance,
560 						  bMaskDWord,
561 						  dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
562 			}
563 		} else {
564 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
565 					  bMaskDWord, dm_tx_bb_gain[4]);
566 		}
567 	}
568 }
569 
_rtl92e_dm_tx_update_tssi_strong_signal(struct net_device * dev,u8 RF_Type)570 static void _rtl92e_dm_tx_update_tssi_strong_signal(struct net_device *dev,
571 						    u8 RF_Type)
572 {
573 	struct r8192_priv *p = rtllib_priv(dev);
574 
575 	if (RF_Type == RF_2T4R) {
576 		if ((p->rfa_txpowertrackingindex < TxBBGainTableLength - 1) &&
577 		    (p->rfc_txpowertrackingindex < TxBBGainTableLength - 1)) {
578 			p->rfa_txpowertrackingindex++;
579 			p->rfa_txpowertrackingindex_real++;
580 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
581 					  bMaskDWord,
582 					  dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
583 			p->rfc_txpowertrackingindex++;
584 			p->rfc_txpowertrackingindex_real++;
585 			rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
586 					  bMaskDWord,
587 					  dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
588 		} else {
589 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
590 					  bMaskDWord,
591 					  dm_tx_bb_gain[TxBBGainTableLength - 1]);
592 			rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
593 					  bMaskDWord,
594 					  dm_tx_bb_gain[TxBBGainTableLength - 1]);
595 		}
596 	} else {
597 		if (p->rfa_txpowertrackingindex < (TxBBGainTableLength - 1)) {
598 			p->rfa_txpowertrackingindex++;
599 			p->rfa_txpowertrackingindex_real++;
600 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
601 					  bMaskDWord,
602 					  dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
603 		} else {
604 			rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
605 					  bMaskDWord,
606 					  dm_tx_bb_gain[TxBBGainTableLength - 1]);
607 		}
608 	}
609 }
610 
_rtl92e_dm_tx_power_tracking_callback_tssi(struct net_device * dev)611 static void _rtl92e_dm_tx_power_tracking_callback_tssi(struct net_device *dev)
612 {
613 	struct r8192_priv *priv = rtllib_priv(dev);
614 	bool	viviflag = false;
615 	struct dcmd_txcmd tx_cmd;
616 	u8	powerlevelOFDM24G;
617 	int	i = 0, j = 0, k = 0;
618 	u8	RF_Type, tmp_report[5] = {0, 0, 0, 0, 0};
619 	u32	Value;
620 	u8	Pwr_Flag;
621 	u16	Avg_TSSI_Meas, TSSI_13dBm, Avg_TSSI_Meas_from_driver = 0;
622 	u32	delta = 0;
623 
624 	rtl92e_writeb(dev, Pw_Track_Flag, 0);
625 	rtl92e_writeb(dev, FW_Busy_Flag, 0);
626 	priv->rtllib->bdynamic_txpower_enable = false;
627 
628 	powerlevelOFDM24G = priv->Pwr_Track >> 24;
629 	RF_Type = priv->rf_type;
630 	Value = (RF_Type<<8) | powerlevelOFDM24G;
631 
632 	for (j = 0; j <= 30; j++) {
633 
634 		tx_cmd.Op		= TXCMD_SET_TX_PWR_TRACKING;
635 		tx_cmd.Length	= 4;
636 		tx_cmd.Value		= Value;
637 		rtl92e_send_cmd_pkt(dev, DESC_PACKET_TYPE_NORMAL, (u8 *)&tx_cmd,
638 				    sizeof(struct dcmd_txcmd));
639 		mdelay(1);
640 		for (i = 0; i <= 30; i++) {
641 			Pwr_Flag = rtl92e_readb(dev, Pw_Track_Flag);
642 
643 			if (Pwr_Flag == 0) {
644 				mdelay(1);
645 
646 				if (priv->bResetInProgress) {
647 					rtl92e_writeb(dev, Pw_Track_Flag, 0);
648 					rtl92e_writeb(dev, FW_Busy_Flag, 0);
649 					return;
650 				}
651 				if (priv->rtllib->rf_power_state != rf_on) {
652 					rtl92e_writeb(dev, Pw_Track_Flag, 0);
653 					rtl92e_writeb(dev, FW_Busy_Flag, 0);
654 					return;
655 				}
656 
657 				continue;
658 			}
659 
660 			Avg_TSSI_Meas = rtl92e_readw(dev, Tssi_Mea_Value);
661 
662 			if (Avg_TSSI_Meas == 0) {
663 				rtl92e_writeb(dev, Pw_Track_Flag, 0);
664 				rtl92e_writeb(dev, FW_Busy_Flag, 0);
665 				return;
666 			}
667 
668 			for (k = 0; k < 5; k++) {
669 				if (k != 4)
670 					tmp_report[k] = rtl92e_readb(dev,
671 							 Tssi_Report_Value1+k);
672 				else
673 					tmp_report[k] = rtl92e_readb(dev,
674 							 Tssi_Report_Value2);
675 
676 				if (tmp_report[k] <= 20) {
677 					viviflag = true;
678 					break;
679 				}
680 			}
681 
682 			if (viviflag) {
683 				rtl92e_writeb(dev, Pw_Track_Flag, 0);
684 				viviflag = false;
685 				for (k = 0; k < 5; k++)
686 					tmp_report[k] = 0;
687 				break;
688 			}
689 
690 			for (k = 0; k < 5; k++)
691 				Avg_TSSI_Meas_from_driver += tmp_report[k];
692 
693 			Avg_TSSI_Meas_from_driver *= 100 / 5;
694 			TSSI_13dBm = priv->TSSI_13dBm;
695 
696 			if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
697 				delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
698 			else
699 				delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
700 
701 			if (delta <= E_FOR_TX_POWER_TRACK) {
702 				priv->rtllib->bdynamic_txpower_enable = true;
703 				rtl92e_writeb(dev, Pw_Track_Flag, 0);
704 				rtl92e_writeb(dev, FW_Busy_Flag, 0);
705 				return;
706 			}
707 			if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK)
708 				_rtl92e_dm_tx_update_tssi_weak_signal(dev,
709 								      RF_Type);
710 			else
711 				_rtl92e_dm_tx_update_tssi_strong_signal(dev, RF_Type);
712 
713 			if (RF_Type == RF_2T4R) {
714 				priv->CCKPresentAttentuation_difference
715 					= priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
716 			} else {
717 				priv->CCKPresentAttentuation_difference
718 					= priv->rfa_txpowertrackingindex_real - priv->rfa_txpowertracking_default;
719 			}
720 
721 			if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
722 				priv->CCKPresentAttentuation =
723 					 priv->CCKPresentAttentuation_20Mdefault +
724 					 priv->CCKPresentAttentuation_difference;
725 			else
726 				priv->CCKPresentAttentuation =
727 					 priv->CCKPresentAttentuation_40Mdefault +
728 					 priv->CCKPresentAttentuation_difference;
729 
730 			if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
731 				priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
732 			if (priv->CCKPresentAttentuation < 0)
733 				priv->CCKPresentAttentuation = 0;
734 
735 			if (priv->CCKPresentAttentuation > -1 &&
736 			    priv->CCKPresentAttentuation < CCKTxBBGainTableLength) {
737 				if (priv->rtllib->current_network.channel == 14 &&
738 				    !priv->bcck_in_ch14) {
739 					priv->bcck_in_ch14 = true;
740 					rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
741 				} else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14) {
742 					priv->bcck_in_ch14 = false;
743 					rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
744 				} else
745 					rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
746 			}
747 
748 			if (priv->CCKPresentAttentuation_difference <= -12 ||
749 			    priv->CCKPresentAttentuation_difference >= 24) {
750 				priv->rtllib->bdynamic_txpower_enable = true;
751 				rtl92e_writeb(dev, Pw_Track_Flag, 0);
752 				rtl92e_writeb(dev, FW_Busy_Flag, 0);
753 				return;
754 			}
755 
756 			rtl92e_writeb(dev, Pw_Track_Flag, 0);
757 			Avg_TSSI_Meas_from_driver = 0;
758 			for (k = 0; k < 5; k++)
759 				tmp_report[k] = 0;
760 			break;
761 		}
762 		rtl92e_writeb(dev, FW_Busy_Flag, 0);
763 	}
764 	priv->rtllib->bdynamic_txpower_enable = true;
765 	rtl92e_writeb(dev, Pw_Track_Flag, 0);
766 }
767 
_rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device * dev)768 static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev)
769 {
770 #define ThermalMeterVal	9
771 	struct r8192_priv *priv = rtllib_priv(dev);
772 	u32 tmpRegA, TempCCk;
773 	u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
774 	int i = 0, CCKSwingNeedUpdate = 0;
775 
776 	if (!priv->btxpower_trackingInit) {
777 		tmpRegA = rtl92e_get_bb_reg(dev, rOFDM0_XATxIQImbalance,
778 					    bMaskDWord);
779 		for (i = 0; i < OFDM_Table_Length; i++) {
780 			if (tmpRegA == OFDMSwingTable[i]) {
781 				priv->OFDM_index[0] = i;
782 			}
783 		}
784 
785 		TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1, bMaskByte2);
786 		for (i = 0; i < CCK_Table_length; i++) {
787 			if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) {
788 				priv->CCK_index = i;
789 				break;
790 			}
791 		}
792 		priv->btxpower_trackingInit = true;
793 		return;
794 	}
795 
796 	tmpRegA = rtl92e_get_rf_reg(dev, RF90_PATH_A, 0x12, 0x078);
797 	if (tmpRegA < 3 || tmpRegA > 13)
798 		return;
799 	if (tmpRegA >= 12)
800 		tmpRegA = 12;
801 	priv->ThermalMeter[0] = ThermalMeterVal;
802 	priv->ThermalMeter[1] = ThermalMeterVal;
803 
804 	if (priv->ThermalMeter[0] >= (u8)tmpRegA) {
805 		tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0] -
806 			      (u8)tmpRegA);
807 		tmpCCK40Mindex = tmpCCK20Mindex - 6;
808 		if (tmpOFDMindex >= OFDM_Table_Length)
809 			tmpOFDMindex = OFDM_Table_Length-1;
810 		if (tmpCCK20Mindex >= CCK_Table_length)
811 			tmpCCK20Mindex = CCK_Table_length-1;
812 		if (tmpCCK40Mindex >= CCK_Table_length)
813 			tmpCCK40Mindex = CCK_Table_length-1;
814 	} else {
815 		tmpval = (u8)tmpRegA - priv->ThermalMeter[0];
816 		if (tmpval >= 6) {
817 			tmpOFDMindex = 0;
818 			tmpCCK20Mindex = 0;
819 		} else {
820 			tmpOFDMindex = 6 - tmpval;
821 			tmpCCK20Mindex = 6 - tmpval;
822 		}
823 		tmpCCK40Mindex = 0;
824 	}
825 	if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
826 		tmpCCKindex = tmpCCK40Mindex;
827 	else
828 		tmpCCKindex = tmpCCK20Mindex;
829 
830 	priv->Record_CCK_20Mindex = tmpCCK20Mindex;
831 	priv->Record_CCK_40Mindex = tmpCCK40Mindex;
832 
833 	if (priv->rtllib->current_network.channel == 14 &&
834 	    !priv->bcck_in_ch14) {
835 		priv->bcck_in_ch14 = true;
836 		CCKSwingNeedUpdate = 1;
837 	} else if (priv->rtllib->current_network.channel != 14 &&
838 		   priv->bcck_in_ch14) {
839 		priv->bcck_in_ch14 = false;
840 		CCKSwingNeedUpdate = 1;
841 	}
842 
843 	if (priv->CCK_index != tmpCCKindex) {
844 		priv->CCK_index = tmpCCKindex;
845 		CCKSwingNeedUpdate = 1;
846 	}
847 
848 	if (CCKSwingNeedUpdate)
849 		rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
850 	if (priv->OFDM_index[0] != tmpOFDMindex) {
851 		priv->OFDM_index[0] = tmpOFDMindex;
852 		rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
853 				  OFDMSwingTable[priv->OFDM_index[0]]);
854 	}
855 	priv->txpower_count = 0;
856 }
857 
rtl92e_dm_txpower_tracking_wq(void * data)858 void rtl92e_dm_txpower_tracking_wq(void *data)
859 {
860 	struct r8192_priv *priv = container_of_dwork_rsl(data,
861 				  struct r8192_priv, txpower_tracking_wq);
862 	struct net_device *dev = priv->rtllib->dev;
863 
864 	if (priv->IC_Cut >= IC_VersionCut_D)
865 		_rtl92e_dm_tx_power_tracking_callback_tssi(dev);
866 	else
867 		_rtl92e_dm_tx_power_tracking_cb_thermal(dev);
868 }
869 
_rtl92e_dm_initialize_tx_power_tracking_tssi(struct net_device * dev)870 static void _rtl92e_dm_initialize_tx_power_tracking_tssi(struct net_device *dev)
871 {
872 
873 	struct r8192_priv *priv = rtllib_priv(dev);
874 
875 	priv->btxpower_tracking = true;
876 	priv->txpower_count       = 0;
877 	priv->btxpower_trackingInit = false;
878 
879 }
880 
_rtl92e_dm_init_tx_power_tracking_thermal(struct net_device * dev)881 static void _rtl92e_dm_init_tx_power_tracking_thermal(struct net_device *dev)
882 {
883 	struct r8192_priv *priv = rtllib_priv(dev);
884 
885 
886 	if (priv->rtllib->FwRWRF)
887 		priv->btxpower_tracking = true;
888 	else
889 		priv->btxpower_tracking = false;
890 	priv->txpower_count       = 0;
891 	priv->btxpower_trackingInit = false;
892 }
893 
rtl92e_dm_init_txpower_tracking(struct net_device * dev)894 void rtl92e_dm_init_txpower_tracking(struct net_device *dev)
895 {
896 	struct r8192_priv *priv = rtllib_priv(dev);
897 
898 	if (priv->IC_Cut >= IC_VersionCut_D)
899 		_rtl92e_dm_initialize_tx_power_tracking_tssi(dev);
900 	else
901 		_rtl92e_dm_init_tx_power_tracking_thermal(dev);
902 }
903 
_rtl92e_dm_check_tx_power_tracking_tssi(struct net_device * dev)904 static void _rtl92e_dm_check_tx_power_tracking_tssi(struct net_device *dev)
905 {
906 	struct r8192_priv *priv = rtllib_priv(dev);
907 	static u32 tx_power_track_counter;
908 
909 	if (rtl92e_readb(dev, 0x11e) == 1)
910 		return;
911 	if (!priv->btxpower_tracking)
912 		return;
913 	tx_power_track_counter++;
914 
915 
916 	if (tx_power_track_counter >= 180) {
917 		schedule_delayed_work(&priv->txpower_tracking_wq, 0);
918 		tx_power_track_counter = 0;
919 	}
920 
921 }
922 
_rtl92e_dm_check_tx_power_tracking_thermal(struct net_device * dev)923 static void _rtl92e_dm_check_tx_power_tracking_thermal(struct net_device *dev)
924 {
925 	struct r8192_priv *priv = rtllib_priv(dev);
926 	static u8	TM_Trigger;
927 	u8		TxPowerCheckCnt = 0;
928 
929 	if (IS_HARDWARE_TYPE_8192SE(dev))
930 		TxPowerCheckCnt = 5;
931 	else
932 		TxPowerCheckCnt = 2;
933 	if (!priv->btxpower_tracking)
934 		return;
935 
936 	if (priv->txpower_count  <= TxPowerCheckCnt) {
937 		priv->txpower_count++;
938 		return;
939 	}
940 
941 	if (!TM_Trigger) {
942 		rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
943 		rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
944 		rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
945 		rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
946 		TM_Trigger = 1;
947 		return;
948 	}
949 	netdev_info(dev, "===============>Schedule TxPowerTrackingWorkItem\n");
950 	schedule_delayed_work(&priv->txpower_tracking_wq, 0);
951 	TM_Trigger = 0;
952 
953 }
954 
_rtl92e_dm_check_tx_power_tracking(struct net_device * dev)955 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev)
956 {
957 	struct r8192_priv *priv = rtllib_priv(dev);
958 
959 	if (priv->IC_Cut >= IC_VersionCut_D)
960 		_rtl92e_dm_check_tx_power_tracking_tssi(dev);
961 	else
962 		_rtl92e_dm_check_tx_power_tracking_thermal(dev);
963 }
964 
_rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device * dev,bool bInCH14)965 static void _rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device *dev,
966 						bool bInCH14)
967 {
968 	u32 TempVal;
969 	struct r8192_priv *priv = rtllib_priv(dev);
970 	u8 attenuation = priv->CCKPresentAttentuation;
971 
972 	TempVal = 0;
973 	if (!bInCH14) {
974 		TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][0] +
975 			  (dm_cck_tx_bb_gain[attenuation][1] << 8));
976 
977 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
978 		TempVal = (u32)((dm_cck_tx_bb_gain[attenuation][2]) +
979 			  (dm_cck_tx_bb_gain[attenuation][3] << 8) +
980 			  (dm_cck_tx_bb_gain[attenuation][4] << 16)+
981 			  (dm_cck_tx_bb_gain[attenuation][5] << 24));
982 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
983 		TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][6] +
984 			  (dm_cck_tx_bb_gain[attenuation][7] << 8));
985 
986 		rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
987 	} else {
988 		TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][0]) +
989 			  (dm_cck_tx_bb_gain_ch14[attenuation][1] << 8));
990 
991 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
992 		TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][2]) +
993 			  (dm_cck_tx_bb_gain_ch14[attenuation][3] << 8) +
994 			  (dm_cck_tx_bb_gain_ch14[attenuation][4] << 16)+
995 			  (dm_cck_tx_bb_gain_ch14[attenuation][5] << 24));
996 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
997 		TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][6]) +
998 			  (dm_cck_tx_bb_gain_ch14[attenuation][7] << 8));
999 
1000 		rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1001 	}
1002 }
1003 
_rtl92e_dm_cck_tx_power_adjust_thermal_meter(struct net_device * dev,bool bInCH14)1004 static void _rtl92e_dm_cck_tx_power_adjust_thermal_meter(struct net_device *dev,
1005 							 bool bInCH14)
1006 {
1007 	u32 TempVal;
1008 	struct r8192_priv *priv = rtllib_priv(dev);
1009 
1010 	TempVal = 0;
1011 	if (!bInCH14) {
1012 		TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
1013 			  (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1] << 8);
1014 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1015 		TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
1016 			  (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3] << 8) +
1017 			  (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4] << 16)+
1018 			  (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5] << 24);
1019 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1020 		TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
1021 			  (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7] << 8);
1022 
1023 		rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1024 	} else {
1025 		TempVal = CCKSwingTable_Ch14[priv->CCK_index][0] +
1026 			  (CCKSwingTable_Ch14[priv->CCK_index][1] << 8);
1027 
1028 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1029 		TempVal = CCKSwingTable_Ch14[priv->CCK_index][2] +
1030 			  (CCKSwingTable_Ch14[priv->CCK_index][3] << 8) +
1031 			  (CCKSwingTable_Ch14[priv->CCK_index][4] << 16)+
1032 			  (CCKSwingTable_Ch14[priv->CCK_index][5] << 24);
1033 		rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1034 		TempVal = CCKSwingTable_Ch14[priv->CCK_index][6] +
1035 			  (CCKSwingTable_Ch14[priv->CCK_index][7]<<8);
1036 
1037 		rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1038 	}
1039 }
1040 
rtl92e_dm_cck_txpower_adjust(struct net_device * dev,bool binch14)1041 void rtl92e_dm_cck_txpower_adjust(struct net_device *dev, bool binch14)
1042 {
1043 	struct r8192_priv *priv = rtllib_priv(dev);
1044 
1045 	if (priv->IC_Cut >= IC_VersionCut_D)
1046 		_rtl92e_dm_cck_tx_power_adjust_tssi(dev, binch14);
1047 	else
1048 		_rtl92e_dm_cck_tx_power_adjust_thermal_meter(dev, binch14);
1049 }
1050 
_rtl92e_dm_tx_power_reset_recovery(struct net_device * dev)1051 static void _rtl92e_dm_tx_power_reset_recovery(struct net_device *dev)
1052 {
1053 	struct r8192_priv *priv = rtllib_priv(dev);
1054 
1055 	rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
1056 			  dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1057 	rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1058 
1059 	rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord,
1060 			  dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1061 }
1062 
rtl92e_dm_restore_state(struct net_device * dev)1063 void rtl92e_dm_restore_state(struct net_device *dev)
1064 {
1065 	struct r8192_priv *priv = rtllib_priv(dev);
1066 	u32	reg_ratr = priv->rate_adaptive.last_ratr;
1067 	u32 ratr_value;
1068 
1069 	if (!priv->up) {
1070 		return;
1071 	}
1072 
1073 	if (priv->rate_adaptive.rate_adaptive_disabled)
1074 		return;
1075 	if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
1076 	      priv->rtllib->mode == WIRELESS_MODE_N_5G))
1077 		return;
1078 	ratr_value = reg_ratr;
1079 	if (priv->rf_type == RF_1T2R)
1080 		ratr_value &= ~(RATE_ALL_OFDM_2SS);
1081 	rtl92e_writel(dev, RATR0, ratr_value);
1082 	rtl92e_writeb(dev, UFWP, 1);
1083 	if (priv->btxpower_trackingInit && priv->btxpower_tracking)
1084 		_rtl92e_dm_tx_power_reset_recovery(dev);
1085 
1086 	_rtl92e_dm_bb_initialgain_restore(dev);
1087 
1088 }
1089 
_rtl92e_dm_bb_initialgain_restore(struct net_device * dev)1090 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev)
1091 {
1092 	struct r8192_priv *priv = rtllib_priv(dev);
1093 	u32 bit_mask = 0x7f;
1094 
1095 	if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1096 		return;
1097 
1098 	rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1099 	rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask,
1100 			  (u32)priv->initgain_backup.xaagccore1);
1101 	rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask,
1102 			  (u32)priv->initgain_backup.xbagccore1);
1103 	rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask,
1104 			  (u32)priv->initgain_backup.xcagccore1);
1105 	rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask,
1106 			  (u32)priv->initgain_backup.xdagccore1);
1107 	bit_mask  = bMaskByte2;
1108 	rtl92e_set_bb_reg(dev, rCCK0_CCA, bit_mask,
1109 			  (u32)priv->initgain_backup.cca);
1110 	rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1111 
1112 }
1113 
rtl92e_dm_backup_state(struct net_device * dev)1114 void rtl92e_dm_backup_state(struct net_device *dev)
1115 {
1116 	struct r8192_priv *priv = rtllib_priv(dev);
1117 	u32 bit_mask = bMaskByte0;
1118 
1119 	priv->bswitch_fsync  = false;
1120 	priv->bfsync_processing = false;
1121 
1122 	if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1123 		return;
1124 
1125 	rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1126 	priv->initgain_backup.xaagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask);
1127 	priv->initgain_backup.xbagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask);
1128 	priv->initgain_backup.xcagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask);
1129 	priv->initgain_backup.xdagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask);
1130 	bit_mask  = bMaskByte2;
1131 	priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, bit_mask);
1132 }
1133 
_rtl92e_dm_dig_init(struct net_device * dev)1134 static void _rtl92e_dm_dig_init(struct net_device *dev)
1135 {
1136 	struct r8192_priv *priv = rtllib_priv(dev);
1137 
1138 	dm_digtable.dig_enable_flag	= true;
1139 
1140 	dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
1141 
1142 	dm_digtable.dig_algorithm_switch = 0;
1143 
1144 	dm_digtable.dig_state		= DM_STA_DIG_MAX;
1145 	dm_digtable.dig_highpwr_state	= DM_STA_DIG_MAX;
1146 	dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1147 	dm_digtable.PreSTAConnectState = DIG_STA_DISCONNECT;
1148 
1149 	dm_digtable.rssi_low_thresh	= DM_DIG_THRESH_LOW;
1150 	dm_digtable.rssi_high_thresh	= DM_DIG_THRESH_HIGH;
1151 
1152 	dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
1153 	dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
1154 
1155 	dm_digtable.rssi_val = 50;
1156 	dm_digtable.backoff_val = DM_DIG_BACKOFF;
1157 	dm_digtable.rx_gain_range_max = DM_DIG_MAX;
1158 	if (priv->CustomerID == RT_CID_819x_Netcore)
1159 		dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
1160 	else
1161 		dm_digtable.rx_gain_range_min = DM_DIG_MIN;
1162 }
1163 
_rtl92e_dm_ctrl_initgain_byrssi(struct net_device * dev)1164 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev)
1165 {
1166 
1167 	if (!dm_digtable.dig_enable_flag)
1168 		return;
1169 
1170 	if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
1171 		_rtl92e_dm_ctrl_initgain_byrssi_false_alarm(dev);
1172 	else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1173 		_rtl92e_dm_ctrl_initgain_byrssi_driver(dev);
1174 	else
1175 		return;
1176 }
1177 
1178 /*-----------------------------------------------------------------------------
1179  * Function:	dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm()
1180  *
1181  * Overview:	Driver monitor RSSI and False Alarm to change initial gain.
1182 			Only change initial gain during link in progress.
1183  *
1184  * Input:		IN	PADAPTER	pAdapter
1185  *
1186  * Output:		NONE
1187  *
1188  * Return:		NONE
1189  *
1190  * Revised History:
1191  *	When		Who		Remark
1192  *	03/04/2009	hpfan	Create Version 0.
1193  *
1194  ******************************************************************************/
1195 
_rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device * dev)1196 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev)
1197 {
1198 	struct r8192_priv *priv = rtllib_priv(dev);
1199 	u8 i;
1200 	static u8	fw_dig;
1201 
1202 	if (!dm_digtable.dig_enable_flag)
1203 		return;
1204 
1205 	if (dm_digtable.dig_algorithm_switch)
1206 		fw_dig = 0;
1207 	if (fw_dig <= 3) {
1208 		for (i = 0; i < 3; i++)
1209 			rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1210 		fw_dig++;
1211 		dm_digtable.dig_state = DM_STA_DIG_OFF;
1212 	}
1213 
1214 	if (priv->rtllib->state == RTLLIB_LINKED)
1215 		dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
1216 	else
1217 		dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1218 
1219 
1220 	dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
1221 	_rtl92e_dm_initial_gain(dev);
1222 	_rtl92e_dm_pd_th(dev);
1223 	_rtl92e_dm_cs_ratio(dev);
1224 	if (dm_digtable.dig_algorithm_switch)
1225 		dm_digtable.dig_algorithm_switch = 0;
1226 	dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
1227 
1228 }
1229 
_rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device * dev)1230 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev)
1231 {
1232 	struct r8192_priv *priv = rtllib_priv(dev);
1233 	static u32 reset_cnt;
1234 	u8 i;
1235 
1236 	if (!dm_digtable.dig_enable_flag)
1237 		return;
1238 
1239 	if (dm_digtable.dig_algorithm_switch) {
1240 		dm_digtable.dig_state = DM_STA_DIG_MAX;
1241 		for (i = 0; i < 3; i++)
1242 			rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1243 		dm_digtable.dig_algorithm_switch = 0;
1244 	}
1245 
1246 	if (priv->rtllib->state != RTLLIB_LINKED)
1247 		return;
1248 
1249 	if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
1250 		(priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
1251 		return;
1252 	if (priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh) {
1253 		if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
1254 			(priv->reset_count == reset_cnt))
1255 			return;
1256 		reset_cnt = priv->reset_count;
1257 
1258 		dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1259 		dm_digtable.dig_state = DM_STA_DIG_OFF;
1260 
1261 		rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1262 
1263 		rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x17);
1264 		rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x17);
1265 		rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x17);
1266 		rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x17);
1267 
1268 		if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1269 			rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1270 		else
1271 			rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1272 
1273 		rtl92e_writeb(dev, 0xa0a, 0x08);
1274 
1275 		return;
1276 	}
1277 
1278 	if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
1279 		u8 reset_flag = 0;
1280 
1281 		if (dm_digtable.dig_state == DM_STA_DIG_ON &&
1282 		    (priv->reset_count == reset_cnt)) {
1283 			_rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1284 			return;
1285 		}
1286 		if (priv->reset_count != reset_cnt)
1287 			reset_flag = 1;
1288 
1289 		reset_cnt = priv->reset_count;
1290 
1291 		dm_digtable.dig_state = DM_STA_DIG_ON;
1292 
1293 		if (reset_flag == 1) {
1294 			rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x2c);
1295 			rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x2c);
1296 			rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x2c);
1297 			rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x2c);
1298 		} else {
1299 			rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x20);
1300 			rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x20);
1301 			rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x20);
1302 			rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x20);
1303 		}
1304 
1305 		if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1306 			rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1307 		else
1308 			rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1309 
1310 		rtl92e_writeb(dev, 0xa0a, 0xcd);
1311 
1312 		rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1313 	}
1314 	_rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1315 }
1316 
1317 
_rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device * dev)1318 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev)
1319 {
1320 	struct r8192_priv *priv = rtllib_priv(dev);
1321 	static u32 reset_cnt_highpwr;
1322 
1323 	if ((priv->undecorated_smoothed_pwdb >
1324 	     dm_digtable.rssi_high_power_lowthresh) &&
1325 	    (priv->undecorated_smoothed_pwdb <
1326 	     dm_digtable.rssi_high_power_highthresh))
1327 		return;
1328 
1329 	if (priv->undecorated_smoothed_pwdb >=
1330 	    dm_digtable.rssi_high_power_highthresh) {
1331 		if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
1332 			(priv->reset_count == reset_cnt_highpwr))
1333 			return;
1334 		dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
1335 
1336 		if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1337 			rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1338 		else
1339 			rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1340 	} else {
1341 		if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF &&
1342 			(priv->reset_count == reset_cnt_highpwr))
1343 			return;
1344 		dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
1345 
1346 		if ((priv->undecorated_smoothed_pwdb <
1347 		     dm_digtable.rssi_high_power_lowthresh) &&
1348 		    (priv->undecorated_smoothed_pwdb >=
1349 		    dm_digtable.rssi_high_thresh)) {
1350 			if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1351 				rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1352 			else
1353 				rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1354 		}
1355 	}
1356 	reset_cnt_highpwr = priv->reset_count;
1357 }
1358 
_rtl92e_dm_initial_gain(struct net_device * dev)1359 static void _rtl92e_dm_initial_gain(struct net_device *dev)
1360 {
1361 	struct r8192_priv *priv = rtllib_priv(dev);
1362 	u8 initial_gain = 0;
1363 	static u8 initialized, force_write;
1364 	static u32 reset_cnt;
1365 
1366 	if (dm_digtable.dig_algorithm_switch) {
1367 		initialized = 0;
1368 		reset_cnt = 0;
1369 	}
1370 
1371 	if (rtllib_act_scanning(priv->rtllib, true)) {
1372 		force_write = 1;
1373 		return;
1374 	}
1375 
1376 	if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1377 		if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1378 			long gain_range = dm_digtable.rssi_val + 10 -
1379 					  dm_digtable.backoff_val;
1380 			gain_range = clamp_t(long, gain_range,
1381 					     dm_digtable.rx_gain_range_min,
1382 					     dm_digtable.rx_gain_range_max);
1383 			dm_digtable.cur_ig_value = gain_range;
1384 		} else {
1385 			if (dm_digtable.cur_ig_value == 0)
1386 				dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1387 			else
1388 				dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
1389 		}
1390 	} else {
1391 		dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1392 		dm_digtable.pre_ig_value = 0;
1393 	}
1394 
1395 	if (priv->reset_count != reset_cnt) {
1396 		force_write = 1;
1397 		reset_cnt = priv->reset_count;
1398 	}
1399 
1400 	if (dm_digtable.pre_ig_value != rtl92e_readb(dev, rOFDM0_XAAGCCore1))
1401 		force_write = 1;
1402 
1403 	if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
1404 	    || !initialized || force_write) {
1405 		initial_gain = dm_digtable.cur_ig_value;
1406 		rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain);
1407 		rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain);
1408 		rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain);
1409 		rtl92e_writeb(dev, rOFDM0_XDAGCCore1, initial_gain);
1410 		dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
1411 		initialized = 1;
1412 		force_write = 0;
1413 	}
1414 }
1415 
_rtl92e_dm_pd_th(struct net_device * dev)1416 static void _rtl92e_dm_pd_th(struct net_device *dev)
1417 {
1418 	struct r8192_priv *priv = rtllib_priv(dev);
1419 	static u8 initialized, force_write;
1420 	static u32 reset_cnt;
1421 
1422 	if (dm_digtable.dig_algorithm_switch) {
1423 		initialized = 0;
1424 		reset_cnt = 0;
1425 	}
1426 
1427 	if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1428 		if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1429 			if (dm_digtable.rssi_val >=
1430 			    dm_digtable.rssi_high_power_highthresh)
1431 				dm_digtable.curpd_thstate =
1432 							DIG_PD_AT_HIGH_POWER;
1433 			else if (dm_digtable.rssi_val <=
1434 				 dm_digtable.rssi_low_thresh)
1435 				dm_digtable.curpd_thstate =
1436 							DIG_PD_AT_LOW_POWER;
1437 			else if ((dm_digtable.rssi_val >=
1438 				  dm_digtable.rssi_high_thresh) &&
1439 				 (dm_digtable.rssi_val <
1440 				  dm_digtable.rssi_high_power_lowthresh))
1441 				dm_digtable.curpd_thstate =
1442 							DIG_PD_AT_NORMAL_POWER;
1443 			else
1444 				dm_digtable.curpd_thstate =
1445 						dm_digtable.prepd_thstate;
1446 		} else {
1447 			dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1448 		}
1449 	} else {
1450 		dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1451 	}
1452 
1453 	if (priv->reset_count != reset_cnt) {
1454 		force_write = 1;
1455 		reset_cnt = priv->reset_count;
1456 	}
1457 
1458 	if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
1459 	    (initialized <= 3) || force_write) {
1460 		if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER) {
1461 			if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1462 				rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1463 			else
1464 				rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1465 		} else if (dm_digtable.curpd_thstate ==
1466 			   DIG_PD_AT_NORMAL_POWER) {
1467 			if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1468 				rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1469 			else
1470 				rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1471 		} else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER) {
1472 			if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1473 				rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1474 			else
1475 				rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1476 		}
1477 		dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
1478 		if (initialized <= 3)
1479 			initialized++;
1480 		force_write = 0;
1481 	}
1482 }
1483 
_rtl92e_dm_cs_ratio(struct net_device * dev)1484 static void _rtl92e_dm_cs_ratio(struct net_device *dev)
1485 {
1486 	struct r8192_priv *priv = rtllib_priv(dev);
1487 	static u8 initialized, force_write;
1488 	static u32 reset_cnt;
1489 
1490 	if (dm_digtable.dig_algorithm_switch) {
1491 		initialized = 0;
1492 		reset_cnt = 0;
1493 	}
1494 
1495 	if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1496 		if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1497 			if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
1498 				dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1499 			else if (dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh)
1500 				dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
1501 			else
1502 				dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
1503 		} else {
1504 			dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1505 		}
1506 	} else {
1507 		dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1508 	}
1509 
1510 	if (priv->reset_count != reset_cnt) {
1511 		force_write = 1;
1512 		reset_cnt = priv->reset_count;
1513 	}
1514 
1515 
1516 	if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
1517 	    !initialized || force_write) {
1518 		if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER)
1519 			rtl92e_writeb(dev, 0xa0a, 0x08);
1520 		else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER)
1521 			rtl92e_writeb(dev, 0xa0a, 0xcd);
1522 		dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
1523 		initialized = 1;
1524 		force_write = 0;
1525 	}
1526 }
1527 
rtl92e_dm_init_edca_turbo(struct net_device * dev)1528 void rtl92e_dm_init_edca_turbo(struct net_device *dev)
1529 {
1530 	struct r8192_priv *priv = rtllib_priv(dev);
1531 
1532 	priv->bcurrent_turbo_EDCA = false;
1533 	priv->rtllib->bis_any_nonbepkts = false;
1534 	priv->bis_cur_rdlstate = false;
1535 }
1536 
_rtl92e_dm_check_edca_turbo(struct net_device * dev)1537 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
1538 {
1539 	struct r8192_priv *priv = rtllib_priv(dev);
1540 	struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1541 
1542 	static unsigned long lastTxOkCnt;
1543 	static unsigned long lastRxOkCnt;
1544 	unsigned long curTxOkCnt = 0;
1545 	unsigned long curRxOkCnt = 0;
1546 
1547 	if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
1548 		goto dm_CheckEdcaTurbo_EXIT;
1549 	if (priv->rtllib->state != RTLLIB_LINKED)
1550 		goto dm_CheckEdcaTurbo_EXIT;
1551 	if (priv->rtllib->pHTInfo->iot_action & HT_IOT_ACT_DISABLE_EDCA_TURBO)
1552 		goto dm_CheckEdcaTurbo_EXIT;
1553 
1554 	if (!priv->rtllib->bis_any_nonbepkts) {
1555 		curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1556 		curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1557 		if (pHTInfo->iot_action & HT_IOT_ACT_EDCA_BIAS_ON_RX) {
1558 			if (curTxOkCnt > 4*curRxOkCnt) {
1559 				if (priv->bis_cur_rdlstate ||
1560 				    !priv->bcurrent_turbo_EDCA) {
1561 					rtl92e_writel(dev, EDCAPARA_BE,
1562 						      edca_setting_UL[pHTInfo->IOTPeer]);
1563 					priv->bis_cur_rdlstate = false;
1564 				}
1565 			} else {
1566 				if (!priv->bis_cur_rdlstate ||
1567 				    !priv->bcurrent_turbo_EDCA) {
1568 					if (priv->rtllib->mode == WIRELESS_MODE_G)
1569 						rtl92e_writel(dev, EDCAPARA_BE,
1570 							      edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1571 					else
1572 						rtl92e_writel(dev, EDCAPARA_BE,
1573 							      edca_setting_DL[pHTInfo->IOTPeer]);
1574 					priv->bis_cur_rdlstate = true;
1575 				}
1576 			}
1577 			priv->bcurrent_turbo_EDCA = true;
1578 		} else {
1579 			if (curRxOkCnt > 4*curTxOkCnt) {
1580 				if (!priv->bis_cur_rdlstate ||
1581 				    !priv->bcurrent_turbo_EDCA) {
1582 					if (priv->rtllib->mode == WIRELESS_MODE_G)
1583 						rtl92e_writel(dev, EDCAPARA_BE,
1584 							      edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1585 					else
1586 						rtl92e_writel(dev, EDCAPARA_BE,
1587 							      edca_setting_DL[pHTInfo->IOTPeer]);
1588 					priv->bis_cur_rdlstate = true;
1589 				}
1590 			} else {
1591 				if (priv->bis_cur_rdlstate ||
1592 				    !priv->bcurrent_turbo_EDCA) {
1593 					rtl92e_writel(dev, EDCAPARA_BE,
1594 						      edca_setting_UL[pHTInfo->IOTPeer]);
1595 					priv->bis_cur_rdlstate = false;
1596 				}
1597 
1598 			}
1599 
1600 			priv->bcurrent_turbo_EDCA = true;
1601 		}
1602 	} else {
1603 		if (priv->bcurrent_turbo_EDCA) {
1604 			u8 tmp = AC0_BE;
1605 
1606 			priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM,
1607 						      (u8 *)(&tmp));
1608 			priv->bcurrent_turbo_EDCA = false;
1609 		}
1610 	}
1611 
1612 
1613 dm_CheckEdcaTurbo_EXIT:
1614 	priv->rtllib->bis_any_nonbepkts = false;
1615 	lastTxOkCnt = priv->stats.txbytesunicast;
1616 	lastRxOkCnt = priv->stats.rxbytesunicast;
1617 }
1618 
_rtl92e_dm_init_cts_to_self(struct net_device * dev)1619 static void _rtl92e_dm_init_cts_to_self(struct net_device *dev)
1620 {
1621 	struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1622 
1623 	priv->rtllib->bCTSToSelfEnable = true;
1624 }
1625 
_rtl92e_dm_cts_to_self(struct net_device * dev)1626 static void _rtl92e_dm_cts_to_self(struct net_device *dev)
1627 {
1628 	struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1629 	struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1630 	static unsigned long lastTxOkCnt;
1631 	static unsigned long lastRxOkCnt;
1632 	unsigned long curTxOkCnt = 0;
1633 	unsigned long curRxOkCnt = 0;
1634 
1635 	if (!priv->rtllib->bCTSToSelfEnable) {
1636 		pHTInfo->iot_action &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1637 		return;
1638 	}
1639 	if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
1640 		curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1641 		curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1642 		if (curRxOkCnt > 4*curTxOkCnt)
1643 			pHTInfo->iot_action &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1644 		else
1645 			pHTInfo->iot_action |= HT_IOT_ACT_FORCED_CTS2SELF;
1646 
1647 		lastTxOkCnt = priv->stats.txbytesunicast;
1648 		lastRxOkCnt = priv->stats.rxbytesunicast;
1649 	}
1650 }
1651 
1652 
_rtl92e_dm_init_wa_broadcom_iot(struct net_device * dev)1653 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev)
1654 {
1655 	struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1656 	struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1657 
1658 	pHTInfo->bWAIotBroadcom = false;
1659 	pHTInfo->WAIotTH = WAIotTHVal;
1660 }
1661 
_rtl92e_dm_check_rf_ctrl_gpio(void * data)1662 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data)
1663 {
1664 	struct r8192_priv *priv = container_of_dwork_rsl(data,
1665 				  struct r8192_priv, gpio_change_rf_wq);
1666 	struct net_device *dev = priv->rtllib->dev;
1667 	u8 tmp1byte;
1668 	enum rt_rf_power_state rf_power_state_to_set;
1669 	bool bActuallySet = false;
1670 	char *argv[3];
1671 	static const char RadioPowerPath[] = "/etc/acpi/events/RadioPower.sh";
1672 	static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin",
1673 			       NULL};
1674 
1675 	bActuallySet = false;
1676 
1677 	if ((priv->up_first_time == 1) || (priv->being_init_adapter))
1678 		return;
1679 
1680 	if (priv->bfirst_after_down) {
1681 		priv->bfirst_after_down = true;
1682 		return;
1683 	}
1684 
1685 	tmp1byte = rtl92e_readb(dev, GPI);
1686 
1687 	rf_power_state_to_set = (tmp1byte&BIT1) ?  rf_on : rf_off;
1688 
1689 	if (priv->hw_radio_off && (rf_power_state_to_set == rf_on)) {
1690 		netdev_info(dev, "gpiochangeRF  - HW Radio ON\n");
1691 		priv->hw_radio_off = false;
1692 		bActuallySet = true;
1693 	} else if (!priv->hw_radio_off && (rf_power_state_to_set == rf_off)) {
1694 		netdev_info(dev, "gpiochangeRF  - HW Radio OFF\n");
1695 		priv->hw_radio_off = true;
1696 		bActuallySet = true;
1697 	}
1698 
1699 	if (bActuallySet) {
1700 		mdelay(1000);
1701 		priv->bHwRfOffAction = 1;
1702 		rtl92e_set_rf_state(dev, rf_power_state_to_set, RF_CHANGE_BY_HW);
1703 		if (priv->hw_radio_off)
1704 			argv[1] = "RFOFF";
1705 		else
1706 			argv[1] = "RFON";
1707 
1708 		argv[0] = (char *)RadioPowerPath;
1709 		argv[2] = NULL;
1710 		call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
1711 	}
1712 }
1713 
rtl92e_dm_rf_pathcheck_wq(void * data)1714 void rtl92e_dm_rf_pathcheck_wq(void *data)
1715 {
1716 	struct r8192_priv *priv = container_of_dwork_rsl(data,
1717 				  struct r8192_priv,
1718 				  rfpath_check_wq);
1719 	struct net_device *dev = priv->rtllib->dev;
1720 	u8 rfpath, i;
1721 
1722 	rfpath = rtl92e_readb(dev, 0xc04);
1723 
1724 	for (i = 0; i < RF90_PATH_MAX; i++) {
1725 		if (rfpath & (0x01<<i))
1726 			priv->brfpath_rxenable[i] = true;
1727 		else
1728 			priv->brfpath_rxenable[i] = false;
1729 	}
1730 	if (!DM_RxPathSelTable.Enable)
1731 		return;
1732 
1733 	_rtl92e_dm_rx_path_sel_byrssi(dev);
1734 }
1735 
_rtl92e_dm_init_rx_path_selection(struct net_device * dev)1736 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev)
1737 {
1738 	u8 i;
1739 	struct r8192_priv *priv = rtllib_priv(dev);
1740 
1741 	DM_RxPathSelTable.Enable = 1;
1742 	DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
1743 	DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
1744 	if (priv->CustomerID == RT_CID_819x_Netcore)
1745 		DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1746 	else
1747 		DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
1748 	DM_RxPathSelTable.disabledRF = 0;
1749 	for (i = 0; i < 4; i++) {
1750 		DM_RxPathSelTable.rf_rssi[i] = 50;
1751 		DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
1752 		DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
1753 	}
1754 }
1755 
1756 #define PWDB_IN_RANGE	((cur_cck_pwdb < tmp_cck_max_pwdb) &&	\
1757 			(cur_cck_pwdb > tmp_cck_sec_pwdb))
1758 
_rtl92e_dm_rx_path_sel_byrssi(struct net_device * dev)1759 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev)
1760 {
1761 	struct r8192_priv *priv = rtllib_priv(dev);
1762 	u8 i, max_rssi_index = 0, min_rssi_index = 0;
1763 	u8 sec_rssi_index = 0, rf_num = 0;
1764 	u8 tmp_max_rssi = 0, tmp_min_rssi = 0, tmp_sec_rssi = 0;
1765 	u8 cck_default_Rx = 0x2;
1766 	u8 cck_optional_Rx = 0x3;
1767 	long tmp_cck_max_pwdb = 0, tmp_cck_min_pwdb = 0, tmp_cck_sec_pwdb = 0;
1768 	u8 cck_rx_ver2_max_index = 0;
1769 	u8 cck_rx_ver2_sec_index = 0;
1770 	u8 cur_rf_rssi;
1771 	long cur_cck_pwdb;
1772 	static u8 disabled_rf_cnt, cck_Rx_Path_initialized;
1773 	u8 update_cck_rx_path;
1774 
1775 	if (priv->rf_type != RF_2T4R)
1776 		return;
1777 
1778 	if (!cck_Rx_Path_initialized) {
1779 		DM_RxPathSelTable.cck_Rx_path = (rtl92e_readb(dev, 0xa07)&0xf);
1780 		cck_Rx_Path_initialized = 1;
1781 	}
1782 
1783 	DM_RxPathSelTable.disabledRF = 0xf;
1784 	DM_RxPathSelTable.disabledRF &= ~(rtl92e_readb(dev, 0xc04));
1785 
1786 	if (priv->rtllib->mode == WIRELESS_MODE_B)
1787 		DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1788 
1789 	for (i = 0; i < RF90_PATH_MAX; i++) {
1790 		DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
1791 
1792 		if (priv->brfpath_rxenable[i]) {
1793 			rf_num++;
1794 			cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
1795 
1796 			if (rf_num == 1) {
1797 				max_rssi_index = min_rssi_index = sec_rssi_index = i;
1798 				tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
1799 			} else if (rf_num == 2) {
1800 				if (cur_rf_rssi >= tmp_max_rssi) {
1801 					tmp_max_rssi = cur_rf_rssi;
1802 					max_rssi_index = i;
1803 				} else {
1804 					tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
1805 					sec_rssi_index = min_rssi_index = i;
1806 				}
1807 			} else {
1808 				if (cur_rf_rssi > tmp_max_rssi) {
1809 					tmp_sec_rssi = tmp_max_rssi;
1810 					sec_rssi_index = max_rssi_index;
1811 					tmp_max_rssi = cur_rf_rssi;
1812 					max_rssi_index = i;
1813 				} else if (cur_rf_rssi == tmp_max_rssi) {
1814 					tmp_sec_rssi = cur_rf_rssi;
1815 					sec_rssi_index = i;
1816 				} else if ((cur_rf_rssi < tmp_max_rssi) &&
1817 					   (cur_rf_rssi > tmp_sec_rssi)) {
1818 					tmp_sec_rssi = cur_rf_rssi;
1819 					sec_rssi_index = i;
1820 				} else if (cur_rf_rssi == tmp_sec_rssi) {
1821 					if (tmp_sec_rssi == tmp_min_rssi) {
1822 						tmp_sec_rssi = cur_rf_rssi;
1823 						sec_rssi_index = i;
1824 					}
1825 				} else if ((cur_rf_rssi < tmp_sec_rssi) &&
1826 					   (cur_rf_rssi > tmp_min_rssi)) {
1827 					;
1828 				} else if (cur_rf_rssi == tmp_min_rssi) {
1829 					if (tmp_sec_rssi == tmp_min_rssi) {
1830 						tmp_min_rssi = cur_rf_rssi;
1831 						min_rssi_index = i;
1832 					}
1833 				} else if (cur_rf_rssi < tmp_min_rssi) {
1834 					tmp_min_rssi = cur_rf_rssi;
1835 					min_rssi_index = i;
1836 				}
1837 			}
1838 		}
1839 	}
1840 
1841 	rf_num = 0;
1842 	if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
1843 		for (i = 0; i < RF90_PATH_MAX; i++) {
1844 			if (priv->brfpath_rxenable[i]) {
1845 				rf_num++;
1846 				cur_cck_pwdb =
1847 					 DM_RxPathSelTable.cck_pwdb_sta[i];
1848 
1849 				if (rf_num == 1) {
1850 					cck_rx_ver2_max_index = i;
1851 					cck_rx_ver2_sec_index = i;
1852 					tmp_cck_max_pwdb = cur_cck_pwdb;
1853 					tmp_cck_min_pwdb = cur_cck_pwdb;
1854 					tmp_cck_sec_pwdb = cur_cck_pwdb;
1855 				} else if (rf_num == 2) {
1856 					if (cur_cck_pwdb >= tmp_cck_max_pwdb) {
1857 						tmp_cck_max_pwdb = cur_cck_pwdb;
1858 						cck_rx_ver2_max_index = i;
1859 					} else {
1860 						tmp_cck_sec_pwdb = cur_cck_pwdb;
1861 						tmp_cck_min_pwdb = cur_cck_pwdb;
1862 						cck_rx_ver2_sec_index = i;
1863 					}
1864 				} else {
1865 					if (cur_cck_pwdb > tmp_cck_max_pwdb) {
1866 						tmp_cck_sec_pwdb =
1867 							 tmp_cck_max_pwdb;
1868 						cck_rx_ver2_sec_index =
1869 							 cck_rx_ver2_max_index;
1870 						tmp_cck_max_pwdb = cur_cck_pwdb;
1871 						cck_rx_ver2_max_index = i;
1872 					} else if (cur_cck_pwdb ==
1873 						   tmp_cck_max_pwdb) {
1874 						tmp_cck_sec_pwdb = cur_cck_pwdb;
1875 						cck_rx_ver2_sec_index = i;
1876 					} else if (PWDB_IN_RANGE) {
1877 						tmp_cck_sec_pwdb = cur_cck_pwdb;
1878 						cck_rx_ver2_sec_index = i;
1879 					} else if (cur_cck_pwdb ==
1880 						   tmp_cck_sec_pwdb) {
1881 						if (tmp_cck_sec_pwdb ==
1882 						    tmp_cck_min_pwdb) {
1883 							tmp_cck_sec_pwdb =
1884 								 cur_cck_pwdb;
1885 							cck_rx_ver2_sec_index =
1886 								 i;
1887 						}
1888 					} else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) &&
1889 						   (cur_cck_pwdb > tmp_cck_min_pwdb)) {
1890 						;
1891 					} else if (cur_cck_pwdb == tmp_cck_min_pwdb) {
1892 						if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb)
1893 							tmp_cck_min_pwdb = cur_cck_pwdb;
1894 					} else if (cur_cck_pwdb < tmp_cck_min_pwdb) {
1895 						tmp_cck_min_pwdb = cur_cck_pwdb;
1896 					}
1897 				}
1898 
1899 			}
1900 		}
1901 	}
1902 
1903 	update_cck_rx_path = 0;
1904 	if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
1905 		cck_default_Rx = cck_rx_ver2_max_index;
1906 		cck_optional_Rx = cck_rx_ver2_sec_index;
1907 		if (tmp_cck_max_pwdb != -64)
1908 			update_cck_rx_path = 1;
1909 	}
1910 
1911 	if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2) {
1912 		if ((tmp_max_rssi - tmp_min_rssi) >=
1913 		     DM_RxPathSelTable.diff_TH) {
1914 			DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] =
1915 				 tmp_max_rssi+5;
1916 			rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable,
1917 					  0x1<<min_rssi_index, 0x0);
1918 			rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable,
1919 					  0x1<<min_rssi_index, 0x0);
1920 			disabled_rf_cnt++;
1921 		}
1922 		if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1) {
1923 			cck_default_Rx = max_rssi_index;
1924 			cck_optional_Rx = sec_rssi_index;
1925 			if (tmp_max_rssi)
1926 				update_cck_rx_path = 1;
1927 		}
1928 	}
1929 
1930 	if (update_cck_rx_path) {
1931 		DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2) |
1932 						(cck_optional_Rx);
1933 		rtl92e_set_bb_reg(dev, rCCK0_AFESetting, 0x0f000000,
1934 				  DM_RxPathSelTable.cck_Rx_path);
1935 	}
1936 
1937 	if (DM_RxPathSelTable.disabledRF) {
1938 		for (i = 0; i < 4; i++) {
1939 			if ((DM_RxPathSelTable.disabledRF>>i) & 0x1) {
1940 				if (tmp_max_rssi >=
1941 				    DM_RxPathSelTable.rf_enable_rssi_th[i]) {
1942 					rtl92e_set_bb_reg(dev,
1943 							  rOFDM0_TRxPathEnable,
1944 							  0x1 << i, 0x1);
1945 					rtl92e_set_bb_reg(dev,
1946 							  rOFDM1_TRxPathEnable,
1947 							  0x1 << i, 0x1);
1948 					DM_RxPathSelTable.rf_enable_rssi_th[i]
1949 						 = 100;
1950 					disabled_rf_cnt--;
1951 				}
1952 			}
1953 		}
1954 	}
1955 }
1956 
_rtl92e_dm_check_rx_path_selection(struct net_device * dev)1957 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev)
1958 {
1959 	struct r8192_priv *priv = rtllib_priv(dev);
1960 
1961 	schedule_delayed_work(&priv->rfpath_check_wq, 0);
1962 }
1963 
1964 
_rtl92e_dm_init_fsync(struct net_device * dev)1965 static void _rtl92e_dm_init_fsync(struct net_device *dev)
1966 {
1967 	struct r8192_priv *priv = rtllib_priv(dev);
1968 
1969 	priv->rtllib->fsync_time_interval = 500;
1970 	priv->rtllib->fsync_rate_bitmap = 0x0f000800;
1971 	priv->rtllib->fsync_rssi_threshold = 30;
1972 	priv->rtllib->bfsync_enable = false;
1973 	priv->rtllib->fsync_multiple_timeinterval = 3;
1974 	priv->rtllib->fsync_firstdiff_ratethreshold = 100;
1975 	priv->rtllib->fsync_seconddiff_ratethreshold = 200;
1976 	priv->rtllib->fsync_state = Default_Fsync;
1977 	priv->framesyncMonitor = 1;
1978 
1979 	timer_setup(&priv->fsync_timer, _rtl92e_dm_fsync_timer_callback, 0);
1980 }
1981 
1982 
_rtl92e_dm_deinit_fsync(struct net_device * dev)1983 static void _rtl92e_dm_deinit_fsync(struct net_device *dev)
1984 {
1985 	struct r8192_priv *priv = rtllib_priv(dev);
1986 
1987 	del_timer_sync(&priv->fsync_timer);
1988 }
1989 
_rtl92e_dm_fsync_timer_callback(struct timer_list * t)1990 static void _rtl92e_dm_fsync_timer_callback(struct timer_list *t)
1991 {
1992 	struct r8192_priv *priv = from_timer(priv, t, fsync_timer);
1993 	struct net_device *dev = priv->rtllib->dev;
1994 	u32 rate_index, rate_count = 0, rate_count_diff = 0;
1995 	bool		bSwitchFromCountDiff = false;
1996 	bool		bDoubleTimeInterval = false;
1997 
1998 	if (priv->rtllib->state == RTLLIB_LINKED &&
1999 	    priv->rtllib->bfsync_enable &&
2000 	    (priv->rtllib->pHTInfo->iot_action & HT_IOT_ACT_CDD_FSYNC)) {
2001 		u32 rate_bitmap;
2002 
2003 		for (rate_index = 0; rate_index <= 27; rate_index++) {
2004 			rate_bitmap  = 1 << rate_index;
2005 			if (priv->rtllib->fsync_rate_bitmap &  rate_bitmap)
2006 				rate_count +=
2007 				   priv->stats.received_rate_histogram[1]
2008 				   [rate_index];
2009 		}
2010 
2011 		if (rate_count < priv->rate_record)
2012 			rate_count_diff = 0xffffffff - rate_count +
2013 					  priv->rate_record;
2014 		else
2015 			rate_count_diff = rate_count - priv->rate_record;
2016 		if (rate_count_diff < priv->rateCountDiffRecord) {
2017 
2018 			u32 DiffNum = priv->rateCountDiffRecord -
2019 				      rate_count_diff;
2020 			if (DiffNum >=
2021 			    priv->rtllib->fsync_seconddiff_ratethreshold)
2022 				priv->ContinueDiffCount++;
2023 			else
2024 				priv->ContinueDiffCount = 0;
2025 
2026 			if (priv->ContinueDiffCount >= 2) {
2027 				bSwitchFromCountDiff = true;
2028 				priv->ContinueDiffCount = 0;
2029 			}
2030 		} else {
2031 			priv->ContinueDiffCount = 0;
2032 		}
2033 
2034 		if (rate_count_diff <=
2035 		    priv->rtllib->fsync_firstdiff_ratethreshold) {
2036 			bSwitchFromCountDiff = true;
2037 			priv->ContinueDiffCount = 0;
2038 		}
2039 		priv->rate_record = rate_count;
2040 		priv->rateCountDiffRecord = rate_count_diff;
2041 		if (priv->undecorated_smoothed_pwdb >
2042 		    priv->rtllib->fsync_rssi_threshold &&
2043 		    bSwitchFromCountDiff) {
2044 			bDoubleTimeInterval = true;
2045 			priv->bswitch_fsync = !priv->bswitch_fsync;
2046 			if (priv->bswitch_fsync) {
2047 				rtl92e_writeb(dev, 0xC36, 0x1c);
2048 				rtl92e_writeb(dev, 0xC3e, 0x90);
2049 			} else {
2050 				rtl92e_writeb(dev, 0xC36, 0x5c);
2051 				rtl92e_writeb(dev, 0xC3e, 0x96);
2052 			}
2053 		} else if (priv->undecorated_smoothed_pwdb <=
2054 			   priv->rtllib->fsync_rssi_threshold) {
2055 			if (priv->bswitch_fsync) {
2056 				priv->bswitch_fsync  = false;
2057 				rtl92e_writeb(dev, 0xC36, 0x5c);
2058 				rtl92e_writeb(dev, 0xC3e, 0x96);
2059 			}
2060 		}
2061 		if (bDoubleTimeInterval) {
2062 			if (timer_pending(&priv->fsync_timer))
2063 				del_timer_sync(&priv->fsync_timer);
2064 			priv->fsync_timer.expires = jiffies +
2065 				 msecs_to_jiffies(priv->rtllib->fsync_time_interval *
2066 				 priv->rtllib->fsync_multiple_timeinterval);
2067 			add_timer(&priv->fsync_timer);
2068 		} else {
2069 			if (timer_pending(&priv->fsync_timer))
2070 				del_timer_sync(&priv->fsync_timer);
2071 			priv->fsync_timer.expires = jiffies +
2072 				 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2073 			add_timer(&priv->fsync_timer);
2074 		}
2075 	} else {
2076 		if (priv->bswitch_fsync) {
2077 			priv->bswitch_fsync  = false;
2078 			rtl92e_writeb(dev, 0xC36, 0x5c);
2079 			rtl92e_writeb(dev, 0xC3e, 0x96);
2080 		}
2081 		priv->ContinueDiffCount = 0;
2082 		rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2083 	}
2084 }
2085 
_rtl92e_dm_start_hw_fsync(struct net_device * dev)2086 static void _rtl92e_dm_start_hw_fsync(struct net_device *dev)
2087 {
2088 	u8 rf_timing = 0x77;
2089 	struct r8192_priv *priv = rtllib_priv(dev);
2090 
2091 	rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cf);
2092 	priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING,
2093 				      (u8 *)(&rf_timing));
2094 	rtl92e_writeb(dev, 0xc3b, 0x41);
2095 }
2096 
_rtl92e_dm_end_hw_fsync(struct net_device * dev)2097 static void _rtl92e_dm_end_hw_fsync(struct net_device *dev)
2098 {
2099 	u8 rf_timing = 0xaa;
2100 	struct r8192_priv *priv = rtllib_priv(dev);
2101 
2102 	rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2103 	priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8 *)
2104 				     (&rf_timing));
2105 	rtl92e_writeb(dev, 0xc3b, 0x49);
2106 }
2107 
_rtl92e_dm_end_sw_fsync(struct net_device * dev)2108 static void _rtl92e_dm_end_sw_fsync(struct net_device *dev)
2109 {
2110 	struct r8192_priv *priv = rtllib_priv(dev);
2111 
2112 	del_timer_sync(&(priv->fsync_timer));
2113 
2114 	if (priv->bswitch_fsync) {
2115 		priv->bswitch_fsync  = false;
2116 
2117 		rtl92e_writeb(dev, 0xC36, 0x5c);
2118 
2119 		rtl92e_writeb(dev, 0xC3e, 0x96);
2120 	}
2121 
2122 	priv->ContinueDiffCount = 0;
2123 	rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2124 }
2125 
_rtl92e_dm_start_sw_fsync(struct net_device * dev)2126 static void _rtl92e_dm_start_sw_fsync(struct net_device *dev)
2127 {
2128 	struct r8192_priv *priv = rtllib_priv(dev);
2129 	u32			rateIndex;
2130 	u32			rateBitmap;
2131 
2132 	priv->rate_record = 0;
2133 	priv->ContinueDiffCount = 0;
2134 	priv->rateCountDiffRecord = 0;
2135 	priv->bswitch_fsync  = false;
2136 
2137 	if (priv->rtllib->mode == WIRELESS_MODE_N_24G) {
2138 		priv->rtllib->fsync_firstdiff_ratethreshold = 600;
2139 		priv->rtllib->fsync_seconddiff_ratethreshold = 0xffff;
2140 	} else {
2141 		priv->rtllib->fsync_firstdiff_ratethreshold = 200;
2142 		priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2143 	}
2144 	for (rateIndex = 0; rateIndex <= 27; rateIndex++) {
2145 		rateBitmap  = 1 << rateIndex;
2146 		if (priv->rtllib->fsync_rate_bitmap & rateBitmap)
2147 			priv->rate_record +=
2148 				 priv->stats.received_rate_histogram[1]
2149 				[rateIndex];
2150 	}
2151 	if (timer_pending(&priv->fsync_timer))
2152 		del_timer_sync(&priv->fsync_timer);
2153 	priv->fsync_timer.expires = jiffies +
2154 				    msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2155 	add_timer(&priv->fsync_timer);
2156 
2157 	rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cd);
2158 
2159 }
2160 
_rtl92e_dm_check_fsync(struct net_device * dev)2161 static void _rtl92e_dm_check_fsync(struct net_device *dev)
2162 {
2163 #define	RegC38_Default			0
2164 #define	RegC38_NonFsync_Other_AP	1
2165 #define	RegC38_Fsync_AP_BCM		2
2166 	struct r8192_priv *priv = rtllib_priv(dev);
2167 	static u8 reg_c38_State = RegC38_Default;
2168 	static u32 reset_cnt;
2169 
2170 	if (priv->rtllib->state == RTLLIB_LINKED &&
2171 	    priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
2172 		if (priv->rtllib->bfsync_enable == 0) {
2173 			switch (priv->rtllib->fsync_state) {
2174 			case Default_Fsync:
2175 				_rtl92e_dm_start_hw_fsync(dev);
2176 				priv->rtllib->fsync_state = HW_Fsync;
2177 				break;
2178 			case SW_Fsync:
2179 				_rtl92e_dm_end_sw_fsync(dev);
2180 				_rtl92e_dm_start_hw_fsync(dev);
2181 				priv->rtllib->fsync_state = HW_Fsync;
2182 				break;
2183 			case HW_Fsync:
2184 			default:
2185 				break;
2186 			}
2187 		} else {
2188 			switch (priv->rtllib->fsync_state) {
2189 			case Default_Fsync:
2190 				_rtl92e_dm_start_sw_fsync(dev);
2191 				priv->rtllib->fsync_state = SW_Fsync;
2192 				break;
2193 			case HW_Fsync:
2194 				_rtl92e_dm_end_hw_fsync(dev);
2195 				_rtl92e_dm_start_sw_fsync(dev);
2196 				priv->rtllib->fsync_state = SW_Fsync;
2197 				break;
2198 			case SW_Fsync:
2199 			default:
2200 				break;
2201 
2202 			}
2203 		}
2204 		if (priv->framesyncMonitor) {
2205 			if (reg_c38_State != RegC38_Fsync_AP_BCM) {
2206 				rtl92e_writeb(dev, rOFDM0_RxDetector3, 0x95);
2207 
2208 				reg_c38_State = RegC38_Fsync_AP_BCM;
2209 			}
2210 		}
2211 	} else {
2212 		switch (priv->rtllib->fsync_state) {
2213 		case HW_Fsync:
2214 			_rtl92e_dm_end_hw_fsync(dev);
2215 			priv->rtllib->fsync_state = Default_Fsync;
2216 			break;
2217 		case SW_Fsync:
2218 			_rtl92e_dm_end_sw_fsync(dev);
2219 			priv->rtllib->fsync_state = Default_Fsync;
2220 			break;
2221 		case Default_Fsync:
2222 		default:
2223 			break;
2224 		}
2225 
2226 		if (priv->framesyncMonitor) {
2227 			if (priv->rtllib->state == RTLLIB_LINKED) {
2228 				if (priv->undecorated_smoothed_pwdb <=
2229 				    RegC38_TH) {
2230 					if (reg_c38_State !=
2231 					    RegC38_NonFsync_Other_AP) {
2232 						rtl92e_writeb(dev,
2233 							      rOFDM0_RxDetector3,
2234 							      0x90);
2235 
2236 						reg_c38_State =
2237 						     RegC38_NonFsync_Other_AP;
2238 					}
2239 				} else if (priv->undecorated_smoothed_pwdb >=
2240 					   (RegC38_TH+5)) {
2241 					if (reg_c38_State) {
2242 						rtl92e_writeb(dev,
2243 							rOFDM0_RxDetector3,
2244 							priv->framesync);
2245 						reg_c38_State = RegC38_Default;
2246 					}
2247 				}
2248 			} else {
2249 				if (reg_c38_State) {
2250 					rtl92e_writeb(dev, rOFDM0_RxDetector3,
2251 						      priv->framesync);
2252 					reg_c38_State = RegC38_Default;
2253 				}
2254 			}
2255 		}
2256 	}
2257 	if (priv->framesyncMonitor) {
2258 		if (priv->reset_count != reset_cnt) {
2259 			rtl92e_writeb(dev, rOFDM0_RxDetector3,
2260 				       priv->framesync);
2261 			reg_c38_State = RegC38_Default;
2262 			reset_cnt = priv->reset_count;
2263 		}
2264 	} else {
2265 		if (reg_c38_State) {
2266 			rtl92e_writeb(dev, rOFDM0_RxDetector3,
2267 				       priv->framesync);
2268 			reg_c38_State = RegC38_Default;
2269 		}
2270 	}
2271 }
2272 
2273 /*---------------------------Define function prototype------------------------*/
_rtl92e_dm_init_dynamic_tx_power(struct net_device * dev)2274 static void _rtl92e_dm_init_dynamic_tx_power(struct net_device *dev)
2275 {
2276 	struct r8192_priv *priv = rtllib_priv(dev);
2277 
2278 	priv->rtllib->bdynamic_txpower_enable = true;
2279 	priv->bLastDTPFlag_High = false;
2280 	priv->bLastDTPFlag_Low = false;
2281 	priv->bDynamicTxHighPower = false;
2282 	priv->bDynamicTxLowPower = false;
2283 }
2284 
_rtl92e_dm_dynamic_tx_power(struct net_device * dev)2285 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev)
2286 {
2287 	struct r8192_priv *priv = rtllib_priv(dev);
2288 	unsigned int txhipower_threshold = 0;
2289 	unsigned int txlowpower_threshold = 0;
2290 
2291 	if (!priv->rtllib->bdynamic_txpower_enable) {
2292 		priv->bDynamicTxHighPower = false;
2293 		priv->bDynamicTxLowPower = false;
2294 		return;
2295 	}
2296 	if ((priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) &&
2297 	    (priv->rtllib->mode == IEEE_G)) {
2298 		txhipower_threshold = TX_POWER_ATHEROAP_THRESH_HIGH;
2299 		txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
2300 	} else {
2301 		txhipower_threshold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
2302 		txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
2303 	}
2304 
2305 	if (priv->rtllib->state == RTLLIB_LINKED) {
2306 		if (priv->undecorated_smoothed_pwdb >= txhipower_threshold) {
2307 			priv->bDynamicTxHighPower = true;
2308 			priv->bDynamicTxLowPower = false;
2309 		} else {
2310 			if (priv->undecorated_smoothed_pwdb <
2311 			    txlowpower_threshold && priv->bDynamicTxHighPower)
2312 				priv->bDynamicTxHighPower = false;
2313 			if (priv->undecorated_smoothed_pwdb < 35)
2314 				priv->bDynamicTxLowPower = true;
2315 			else if (priv->undecorated_smoothed_pwdb >= 40)
2316 				priv->bDynamicTxLowPower = false;
2317 		}
2318 	} else {
2319 		priv->bDynamicTxHighPower = false;
2320 		priv->bDynamicTxLowPower = false;
2321 	}
2322 
2323 	if ((priv->bDynamicTxHighPower != priv->bLastDTPFlag_High) ||
2324 	    (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low)) {
2325 		rtl92e_set_tx_power(dev, priv->rtllib->current_network.channel);
2326 	}
2327 	priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
2328 	priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
2329 
2330 }
2331 
_rtl92e_dm_check_txrateandretrycount(struct net_device * dev)2332 static void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev)
2333 {
2334 	struct r8192_priv *priv = rtllib_priv(dev);
2335 	struct rtllib_device *ieee = priv->rtllib;
2336 
2337 	ieee->softmac_stats.CurrentShowTxate = rtl92e_readb(dev, CURRENT_TX_RATE_REG);
2338 	ieee->softmac_stats.last_packet_rate = rtl92e_readb(dev, INITIAL_TX_RATE_REG);
2339 	ieee->softmac_stats.txretrycount = rtl92e_readl(dev, TX_RETRY_COUNT_REG);
2340 }
2341 
_rtl92e_dm_send_rssi_to_fw(struct net_device * dev)2342 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev)
2343 {
2344 	struct r8192_priv *priv = rtllib_priv(dev);
2345 
2346 	rtl92e_writeb(dev, DRIVER_RSSI, priv->undecorated_smoothed_pwdb);
2347 }
2348