1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
5 * Contact Information: wlanfae <wlanfae@realtek.com>
10 #include "r8192E_phy.h"
11 #include "r8192E_phyreg.h"
12 #include "r8190P_rtl8256.h"
13 #include "r8192E_cmdpkt.h"
15 /*---------------------------Define Local Constant---------------------------*/
16 static u32 edca_setting_DL[HT_IOT_PEER_MAX] = {
27 static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] = {
38 static u32 edca_setting_UL[HT_IOT_PEER_MAX] = {
49 const u32 dm_tx_bb_gain[TxBBGainTableLength] = {
50 0x7f8001fe, /* 12 dB */
51 0x788001e2, /* 11 dB */
86 0x10000040, /* -24 dB */
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}
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}
141 /*---------------------------Define Local Constant---------------------------*/
144 /*------------------------Define global variable-----------------------------*/
145 struct dig_t dm_digtable;
147 struct drx_path_sel DM_RxPathSelTable;
148 /*------------------------Define global variable-----------------------------*/
151 /*------------------------Define local variable------------------------------*/
152 /*------------------------Define local variable------------------------------*/
156 /*---------------------Define local function prototype-----------------------*/
157 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev);
159 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev);
160 static void _rtl92e_dm_bandwidth_autoswitch(struct net_device *dev);
163 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev);
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);
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);
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);
184 static void _rtl92e_dm_init_fsync(struct net_device *dev);
185 static void _rtl92e_dm_deinit_fsync(struct net_device *dev);
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);
193 /*---------------------Define local function prototype-----------------------*/
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);
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------------------------*/
202 void rtl92e_dm_init(struct net_device *dev)
204 struct r8192_priv *priv = rtllib_priv(dev);
206 priv->DM_Type = DM_Type_ByDriver;
208 priv->undecorated_smoothed_pwdb = -1;
210 _rtl92e_dm_init_dynamic_tx_power(dev);
212 rtl92e_init_adaptive_rate(dev);
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);
223 INIT_DELAYED_WORK_RSL(&priv->gpio_change_rf_wq,
224 (void *)_rtl92e_dm_check_rf_ctrl_gpio, dev);
227 void rtl92e_dm_deinit(struct net_device *dev)
230 _rtl92e_dm_deinit_fsync(dev);
234 void rtl92e_dm_watchdog(struct net_device *dev)
236 struct r8192_priv *priv = rtllib_priv(dev);
238 if (priv->being_init_adapter)
241 _rtl92e_dm_check_ac_dc_power(dev);
243 _rtl92e_dm_check_txrateandretrycount(dev);
244 _rtl92e_dm_check_edca_turbo(dev);
246 _rtl92e_dm_check_rate_adaptive(dev);
247 _rtl92e_dm_dynamic_tx_power(dev);
248 _rtl92e_dm_check_tx_power_tracking(dev);
250 _rtl92e_dm_ctrl_initgain_byrssi(dev);
251 _rtl92e_dm_bandwidth_autoswitch(dev);
253 _rtl92e_dm_check_rx_path_selection(dev);
254 _rtl92e_dm_check_fsync(dev);
256 _rtl92e_dm_send_rssi_to_fw(dev);
257 _rtl92e_dm_cts_to_self(dev);
260 static void _rtl92e_dm_check_ac_dc_power(struct net_device *dev)
262 struct r8192_priv *priv = rtllib_priv(dev);
263 static char const 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=/",
267 "PATH=/usr/bin:/bin",
270 if (priv->ResetProgress == RESET_TYPE_SILENT) {
271 RT_TRACE((COMP_INIT | COMP_POWER | COMP_RF),
272 "GPIOChangeRFWorkItemCallBack(): Silent Reset!!!!!!!\n");
276 if (priv->rtllib->state != RTLLIB_LINKED)
278 call_usermodehelper(ac_dc_script, argv, envp, UMH_WAIT_PROC);
284 void rtl92e_init_adaptive_rate(struct net_device *dev)
287 struct r8192_priv *priv = rtllib_priv(dev);
288 struct rate_adaptive *pra = &priv->rate_adaptive;
290 pra->ratr_state = DM_RATR_STA_MAX;
291 pra->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
292 pra->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
293 pra->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
295 pra->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
296 pra->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
297 pra->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
299 if (priv->CustomerID == RT_CID_819x_Netcore)
300 pra->ping_rssi_enable = 1;
302 pra->ping_rssi_enable = 0;
303 pra->ping_rssi_thresh_for_ra = 15;
306 if (priv->rf_type == RF_2T4R) {
307 pra->upper_rssi_threshold_ratr = 0x8f0f0000;
308 pra->middle_rssi_threshold_ratr = 0x8f0ff000;
309 pra->low_rssi_threshold_ratr = 0x8f0ff001;
310 pra->low_rssi_threshold_ratr_40M = 0x8f0ff005;
311 pra->low_rssi_threshold_ratr_20M = 0x8f0ff001;
312 pra->ping_rssi_ratr = 0x0000000d;
313 } else if (priv->rf_type == RF_1T2R) {
314 pra->upper_rssi_threshold_ratr = 0x000fc000;
315 pra->middle_rssi_threshold_ratr = 0x000ff000;
316 pra->low_rssi_threshold_ratr = 0x000ff001;
317 pra->low_rssi_threshold_ratr_40M = 0x000ff005;
318 pra->low_rssi_threshold_ratr_20M = 0x000ff001;
319 pra->ping_rssi_ratr = 0x0000000d;
325 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev)
327 struct r8192_priv *priv = rtllib_priv(dev);
328 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
329 struct rate_adaptive *pra = &priv->rate_adaptive;
330 u32 currentRATR, targetRATR = 0;
331 u32 LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
332 bool bshort_gi_enabled = false;
333 static u8 ping_rssi_state;
337 "<---- %s: driver is going to unload\n", __func__);
341 if (pra->rate_adaptive_disabled)
344 if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
345 priv->rtllib->mode == WIRELESS_MODE_N_5G))
348 if (priv->rtllib->state == RTLLIB_LINKED) {
350 bshort_gi_enabled = (pHTInfo->bCurTxBW40MHz &&
351 pHTInfo->bCurShortGI40MHz) ||
352 (!pHTInfo->bCurTxBW40MHz &&
353 pHTInfo->bCurShortGI20MHz);
355 pra->upper_rssi_threshold_ratr =
356 (pra->upper_rssi_threshold_ratr & (~BIT31)) |
357 ((bshort_gi_enabled) ? BIT31 : 0);
359 pra->middle_rssi_threshold_ratr =
360 (pra->middle_rssi_threshold_ratr & (~BIT31)) |
361 ((bshort_gi_enabled) ? BIT31 : 0);
363 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
364 pra->low_rssi_threshold_ratr =
365 (pra->low_rssi_threshold_ratr_40M & (~BIT31)) |
366 ((bshort_gi_enabled) ? BIT31 : 0);
368 pra->low_rssi_threshold_ratr =
369 (pra->low_rssi_threshold_ratr_20M & (~BIT31)) |
370 ((bshort_gi_enabled) ? BIT31 : 0);
372 pra->ping_rssi_ratr =
373 (pra->ping_rssi_ratr & (~BIT31)) |
374 ((bshort_gi_enabled) ? BIT31 : 0);
376 if (pra->ratr_state == DM_RATR_STA_HIGH) {
377 HighRSSIThreshForRA = pra->high2low_rssi_thresh_for_ra;
378 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
379 (pra->low_rssi_thresh_for_ra40M) : (pra->low_rssi_thresh_for_ra20M);
380 } else if (pra->ratr_state == DM_RATR_STA_LOW) {
381 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
382 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
383 (pra->low2high_rssi_thresh_for_ra40M) : (pra->low2high_rssi_thresh_for_ra20M);
385 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
386 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
387 (pra->low_rssi_thresh_for_ra40M) : (pra->low_rssi_thresh_for_ra20M);
390 if (priv->undecorated_smoothed_pwdb >=
391 (long)HighRSSIThreshForRA) {
392 pra->ratr_state = DM_RATR_STA_HIGH;
393 targetRATR = pra->upper_rssi_threshold_ratr;
394 } else if (priv->undecorated_smoothed_pwdb >=
395 (long)LowRSSIThreshForRA) {
396 pra->ratr_state = DM_RATR_STA_MIDDLE;
397 targetRATR = pra->middle_rssi_threshold_ratr;
399 pra->ratr_state = DM_RATR_STA_LOW;
400 targetRATR = pra->low_rssi_threshold_ratr;
403 if (pra->ping_rssi_enable) {
404 if (priv->undecorated_smoothed_pwdb <
405 (long)(pra->ping_rssi_thresh_for_ra+5)) {
406 if ((priv->undecorated_smoothed_pwdb <
407 (long)pra->ping_rssi_thresh_for_ra) ||
409 pra->ratr_state = DM_RATR_STA_LOW;
410 targetRATR = pra->ping_rssi_ratr;
418 if (priv->rtllib->GetHalfNmodeSupportByAPsHandler(dev))
419 targetRATR &= 0xf00fffff;
421 currentRATR = rtl92e_readl(dev, RATR0);
422 if (targetRATR != currentRATR) {
425 ratr_value = targetRATR;
427 "currentRATR = %x, targetRATR = %x\n",
428 currentRATR, targetRATR);
429 if (priv->rf_type == RF_1T2R)
430 ratr_value &= ~(RATE_ALL_OFDM_2SS);
431 rtl92e_writel(dev, RATR0, ratr_value);
432 rtl92e_writeb(dev, UFWP, 1);
434 pra->last_ratr = targetRATR;
438 pra->ratr_state = DM_RATR_STA_MAX;
442 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev)
444 struct r8192_priv *priv = rtllib_priv(dev);
446 priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz = BW_AUTO_SWITCH_LOW_HIGH;
447 priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz = BW_AUTO_SWITCH_HIGH_LOW;
448 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
449 priv->rtllib->bandwidth_auto_switch.bautoswitch_enable = false;
452 static void _rtl92e_dm_bandwidth_autoswitch(struct net_device *dev)
454 struct r8192_priv *priv = rtllib_priv(dev);
456 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ||
457 !priv->rtllib->bandwidth_auto_switch.bautoswitch_enable)
459 if (priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz == false) {
460 if (priv->undecorated_smoothed_pwdb <=
461 priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz)
462 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = true;
464 if (priv->undecorated_smoothed_pwdb >=
465 priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz)
466 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
470 static u32 OFDMSwingTable[OFDM_Table_Length] = {
492 static u8 CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
493 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
494 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
495 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
496 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
497 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
498 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
499 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
500 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
501 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
502 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
503 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
504 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
507 static u8 CCKSwingTable_Ch14[CCK_Table_length][8] = {
508 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
509 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
510 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
511 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
512 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
513 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
514 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
515 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
516 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
517 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
518 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
519 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
522 #define Pw_Track_Flag 0x11d
523 #define Tssi_Mea_Value 0x13c
524 #define Tssi_Report_Value1 0x134
525 #define Tssi_Report_Value2 0x13e
526 #define FW_Busy_Flag 0x13f
528 static void _rtl92e_dm_tx_update_tssi_weak_signal(struct net_device *dev,
531 struct r8192_priv *p = rtllib_priv(dev);
533 if (RF_Type == RF_2T4R) {
534 if ((p->rfa_txpowertrackingindex > 0) &&
535 (p->rfc_txpowertrackingindex > 0)) {
536 p->rfa_txpowertrackingindex--;
537 if (p->rfa_txpowertrackingindex_real > 4) {
538 p->rfa_txpowertrackingindex_real--;
539 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
541 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
544 p->rfc_txpowertrackingindex--;
545 if (p->rfc_txpowertrackingindex_real > 4) {
546 p->rfc_txpowertrackingindex_real--;
547 rtl92e_set_bb_reg(dev,
548 rOFDM0_XCTxIQImbalance,
550 dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
553 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
556 rtl92e_set_bb_reg(dev,
557 rOFDM0_XCTxIQImbalance,
558 bMaskDWord, dm_tx_bb_gain[4]);
561 if (p->rfa_txpowertrackingindex > 0) {
562 p->rfa_txpowertrackingindex--;
563 if (p->rfa_txpowertrackingindex_real > 4) {
564 p->rfa_txpowertrackingindex_real--;
565 rtl92e_set_bb_reg(dev,
566 rOFDM0_XATxIQImbalance,
568 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
571 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
572 bMaskDWord, dm_tx_bb_gain[4]);
577 static void _rtl92e_dm_tx_update_tssi_strong_signal(struct net_device *dev,
580 struct r8192_priv *p = rtllib_priv(dev);
582 if (RF_Type == RF_2T4R) {
583 if ((p->rfa_txpowertrackingindex < TxBBGainTableLength - 1) &&
584 (p->rfc_txpowertrackingindex < TxBBGainTableLength - 1)) {
585 p->rfa_txpowertrackingindex++;
586 p->rfa_txpowertrackingindex_real++;
587 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
589 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
590 p->rfc_txpowertrackingindex++;
591 p->rfc_txpowertrackingindex_real++;
592 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
594 dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
596 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
598 dm_tx_bb_gain[TxBBGainTableLength - 1]);
599 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
601 dm_tx_bb_gain[TxBBGainTableLength - 1]);
604 if (p->rfa_txpowertrackingindex < (TxBBGainTableLength - 1)) {
605 p->rfa_txpowertrackingindex++;
606 p->rfa_txpowertrackingindex_real++;
607 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
609 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
611 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
613 dm_tx_bb_gain[TxBBGainTableLength - 1]);
618 static void _rtl92e_dm_tx_power_tracking_callback_tssi(struct net_device *dev)
620 struct r8192_priv *priv = rtllib_priv(dev);
621 bool bHighpowerstate, viviflag = false;
622 struct dcmd_txcmd tx_cmd;
623 u8 powerlevelOFDM24G;
624 int i = 0, j = 0, k = 0;
625 u8 RF_Type, tmp_report[5] = {0, 0, 0, 0, 0};
628 u16 Avg_TSSI_Meas, TSSI_13dBm, Avg_TSSI_Meas_from_driver = 0;
631 RT_TRACE(COMP_POWER_TRACKING, "%s()\n", __func__);
632 rtl92e_writeb(dev, Pw_Track_Flag, 0);
633 rtl92e_writeb(dev, FW_Busy_Flag, 0);
634 priv->rtllib->bdynamic_txpower_enable = false;
635 bHighpowerstate = priv->bDynamicTxHighPower;
637 powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24);
638 RF_Type = priv->rf_type;
639 Value = (RF_Type<<8) | powerlevelOFDM24G;
641 RT_TRACE(COMP_POWER_TRACKING, "powerlevelOFDM24G = %x\n",
645 for (j = 0; j <= 30; j++) {
647 tx_cmd.Op = TXCMD_SET_TX_PWR_TRACKING;
649 tx_cmd.Value = Value;
650 rtl92e_send_cmd_pkt(dev, DESC_PACKET_TYPE_NORMAL, (u8 *)&tx_cmd,
651 sizeof(struct dcmd_txcmd));
653 for (i = 0; i <= 30; i++) {
654 Pwr_Flag = rtl92e_readb(dev, Pw_Track_Flag);
659 if (priv->bResetInProgress) {
660 RT_TRACE(COMP_POWER_TRACKING,
661 "we are in silent reset progress, so return\n");
662 rtl92e_writeb(dev, Pw_Track_Flag, 0);
663 rtl92e_writeb(dev, FW_Busy_Flag, 0);
666 if (priv->rtllib->eRFPowerState != eRfOn) {
667 RT_TRACE(COMP_POWER_TRACKING,
668 "we are in power save, so return\n");
669 rtl92e_writeb(dev, Pw_Track_Flag, 0);
670 rtl92e_writeb(dev, FW_Busy_Flag, 0);
677 Avg_TSSI_Meas = rtl92e_readw(dev, Tssi_Mea_Value);
679 if (Avg_TSSI_Meas == 0) {
680 rtl92e_writeb(dev, Pw_Track_Flag, 0);
681 rtl92e_writeb(dev, FW_Busy_Flag, 0);
685 for (k = 0; k < 5; k++) {
687 tmp_report[k] = rtl92e_readb(dev,
688 Tssi_Report_Value1+k);
690 tmp_report[k] = rtl92e_readb(dev,
693 RT_TRACE(COMP_POWER_TRACKING,
694 "TSSI_report_value = %d\n",
697 if (tmp_report[k] <= 20) {
704 rtl92e_writeb(dev, Pw_Track_Flag, 0);
706 RT_TRACE(COMP_POWER_TRACKING,
707 "we filted this data\n");
708 for (k = 0; k < 5; k++)
713 for (k = 0; k < 5; k++)
714 Avg_TSSI_Meas_from_driver += tmp_report[k];
716 Avg_TSSI_Meas_from_driver *= 100 / 5;
717 RT_TRACE(COMP_POWER_TRACKING,
718 "Avg_TSSI_Meas_from_driver = %d\n",
719 Avg_TSSI_Meas_from_driver);
720 TSSI_13dBm = priv->TSSI_13dBm;
721 RT_TRACE(COMP_POWER_TRACKING, "TSSI_13dBm = %d\n",
724 if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
725 delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
727 delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
729 if (delta <= E_FOR_TX_POWER_TRACK) {
730 priv->rtllib->bdynamic_txpower_enable = true;
731 rtl92e_writeb(dev, Pw_Track_Flag, 0);
732 rtl92e_writeb(dev, FW_Busy_Flag, 0);
733 RT_TRACE(COMP_POWER_TRACKING,
734 "tx power track is done\n");
735 RT_TRACE(COMP_POWER_TRACKING,
736 "priv->rfa_txpowertrackingindex = %d\n",
737 priv->rfa_txpowertrackingindex);
738 RT_TRACE(COMP_POWER_TRACKING,
739 "priv->rfa_txpowertrackingindex_real = %d\n",
740 priv->rfa_txpowertrackingindex_real);
741 RT_TRACE(COMP_POWER_TRACKING,
742 "priv->CCKPresentAttentuation_difference = %d\n",
743 priv->CCKPresentAttentuation_difference);
744 RT_TRACE(COMP_POWER_TRACKING,
745 "priv->CCKPresentAttentuation = %d\n",
746 priv->CCKPresentAttentuation);
749 if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK)
750 _rtl92e_dm_tx_update_tssi_weak_signal(dev,
753 _rtl92e_dm_tx_update_tssi_strong_signal(dev, RF_Type);
755 if (RF_Type == RF_2T4R) {
756 priv->CCKPresentAttentuation_difference
757 = priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
759 priv->CCKPresentAttentuation_difference
760 = priv->rfa_txpowertrackingindex_real - priv->rfa_txpowertracking_default;
763 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
764 priv->CCKPresentAttentuation =
765 priv->CCKPresentAttentuation_20Mdefault +
766 priv->CCKPresentAttentuation_difference;
768 priv->CCKPresentAttentuation =
769 priv->CCKPresentAttentuation_40Mdefault +
770 priv->CCKPresentAttentuation_difference;
772 if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
773 priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
774 if (priv->CCKPresentAttentuation < 0)
775 priv->CCKPresentAttentuation = 0;
777 if (priv->CCKPresentAttentuation > -1 &&
778 priv->CCKPresentAttentuation < CCKTxBBGainTableLength) {
779 if (priv->rtllib->current_network.channel == 14 &&
780 !priv->bcck_in_ch14) {
781 priv->bcck_in_ch14 = true;
782 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
783 } else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14) {
784 priv->bcck_in_ch14 = false;
785 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
787 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
789 RT_TRACE(COMP_POWER_TRACKING,
790 "priv->rfa_txpowertrackingindex = %d\n",
791 priv->rfa_txpowertrackingindex);
792 RT_TRACE(COMP_POWER_TRACKING,
793 "priv->rfa_txpowertrackingindex_real = %d\n",
794 priv->rfa_txpowertrackingindex_real);
795 RT_TRACE(COMP_POWER_TRACKING,
796 "priv->CCKPresentAttentuation_difference = %d\n",
797 priv->CCKPresentAttentuation_difference);
798 RT_TRACE(COMP_POWER_TRACKING,
799 "priv->CCKPresentAttentuation = %d\n",
800 priv->CCKPresentAttentuation);
802 if (priv->CCKPresentAttentuation_difference <= -12 ||
803 priv->CCKPresentAttentuation_difference >= 24) {
804 priv->rtllib->bdynamic_txpower_enable = true;
805 rtl92e_writeb(dev, Pw_Track_Flag, 0);
806 rtl92e_writeb(dev, FW_Busy_Flag, 0);
807 RT_TRACE(COMP_POWER_TRACKING,
808 "tx power track--->limited\n");
812 rtl92e_writeb(dev, Pw_Track_Flag, 0);
813 Avg_TSSI_Meas_from_driver = 0;
814 for (k = 0; k < 5; k++)
818 rtl92e_writeb(dev, FW_Busy_Flag, 0);
820 priv->rtllib->bdynamic_txpower_enable = true;
821 rtl92e_writeb(dev, Pw_Track_Flag, 0);
824 static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev)
826 #define ThermalMeterVal 9
827 struct r8192_priv *priv = rtllib_priv(dev);
828 u32 tmpRegA, TempCCk;
829 u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
830 int i = 0, CCKSwingNeedUpdate = 0;
832 if (!priv->btxpower_trackingInit) {
833 tmpRegA = rtl92e_get_bb_reg(dev, rOFDM0_XATxIQImbalance,
835 for (i = 0; i < OFDM_Table_Length; i++) {
836 if (tmpRegA == OFDMSwingTable[i]) {
837 priv->OFDM_index[0] = (u8)i;
838 RT_TRACE(COMP_POWER_TRACKING,
839 "Initial reg0x%x = 0x%x, OFDM_index = 0x%x\n",
840 rOFDM0_XATxIQImbalance, tmpRegA,
841 priv->OFDM_index[0]);
845 TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1, bMaskByte2);
846 for (i = 0; i < CCK_Table_length; i++) {
847 if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) {
848 priv->CCK_index = (u8) i;
849 RT_TRACE(COMP_POWER_TRACKING,
850 "Initial reg0x%x = 0x%x, CCK_index = 0x%x\n",
851 rCCK0_TxFilter1, TempCCk,
856 priv->btxpower_trackingInit = true;
860 tmpRegA = rtl92e_get_rf_reg(dev, RF90_PATH_A, 0x12, 0x078);
861 RT_TRACE(COMP_POWER_TRACKING, "Readback ThermalMeterA = %d\n", tmpRegA);
862 if (tmpRegA < 3 || tmpRegA > 13)
866 RT_TRACE(COMP_POWER_TRACKING, "Valid ThermalMeterA = %d\n", tmpRegA);
867 priv->ThermalMeter[0] = ThermalMeterVal;
868 priv->ThermalMeter[1] = ThermalMeterVal;
870 if (priv->ThermalMeter[0] >= (u8)tmpRegA) {
871 tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0] -
873 tmpCCK40Mindex = tmpCCK20Mindex - 6;
874 if (tmpOFDMindex >= OFDM_Table_Length)
875 tmpOFDMindex = OFDM_Table_Length-1;
876 if (tmpCCK20Mindex >= CCK_Table_length)
877 tmpCCK20Mindex = CCK_Table_length-1;
878 if (tmpCCK40Mindex >= CCK_Table_length)
879 tmpCCK40Mindex = CCK_Table_length-1;
881 tmpval = (u8)tmpRegA - priv->ThermalMeter[0];
886 tmpOFDMindex = 6 - tmpval;
887 tmpCCK20Mindex = 6 - tmpval;
891 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
892 tmpCCKindex = tmpCCK40Mindex;
894 tmpCCKindex = tmpCCK20Mindex;
896 priv->Record_CCK_20Mindex = tmpCCK20Mindex;
897 priv->Record_CCK_40Mindex = tmpCCK40Mindex;
898 RT_TRACE(COMP_POWER_TRACKING,
899 "Record_CCK_20Mindex / Record_CCK_40Mindex = %d / %d.\n",
900 priv->Record_CCK_20Mindex, priv->Record_CCK_40Mindex);
902 if (priv->rtllib->current_network.channel == 14 &&
903 !priv->bcck_in_ch14) {
904 priv->bcck_in_ch14 = true;
905 CCKSwingNeedUpdate = 1;
906 } else if (priv->rtllib->current_network.channel != 14 &&
907 priv->bcck_in_ch14) {
908 priv->bcck_in_ch14 = false;
909 CCKSwingNeedUpdate = 1;
912 if (priv->CCK_index != tmpCCKindex) {
913 priv->CCK_index = tmpCCKindex;
914 CCKSwingNeedUpdate = 1;
917 if (CCKSwingNeedUpdate)
918 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
919 if (priv->OFDM_index[0] != tmpOFDMindex) {
920 priv->OFDM_index[0] = tmpOFDMindex;
921 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
922 OFDMSwingTable[priv->OFDM_index[0]]);
923 RT_TRACE(COMP_POWER_TRACKING, "Update OFDMSwing[%d] = 0x%x\n",
925 OFDMSwingTable[priv->OFDM_index[0]]);
927 priv->txpower_count = 0;
930 void rtl92e_dm_txpower_tracking_wq(void *data)
932 struct r8192_priv *priv = container_of_dwork_rsl(data,
933 struct r8192_priv, txpower_tracking_wq);
934 struct net_device *dev = priv->rtllib->dev;
936 if (priv->IC_Cut >= IC_VersionCut_D)
937 _rtl92e_dm_tx_power_tracking_callback_tssi(dev);
939 _rtl92e_dm_tx_power_tracking_cb_thermal(dev);
942 static void _rtl92e_dm_initialize_tx_power_tracking_tssi(struct net_device *dev)
945 struct r8192_priv *priv = rtllib_priv(dev);
947 priv->btxpower_tracking = true;
948 priv->txpower_count = 0;
949 priv->btxpower_trackingInit = false;
953 static void _rtl92e_dm_init_tx_power_tracking_thermal(struct net_device *dev)
955 struct r8192_priv *priv = rtllib_priv(dev);
958 if (priv->rtllib->FwRWRF)
959 priv->btxpower_tracking = true;
961 priv->btxpower_tracking = false;
962 priv->txpower_count = 0;
963 priv->btxpower_trackingInit = false;
964 RT_TRACE(COMP_POWER_TRACKING, "pMgntInfo->bTXPowerTracking = %d\n",
965 priv->btxpower_tracking);
968 void rtl92e_dm_init_txpower_tracking(struct net_device *dev)
970 struct r8192_priv *priv = rtllib_priv(dev);
972 if (priv->IC_Cut >= IC_VersionCut_D)
973 _rtl92e_dm_initialize_tx_power_tracking_tssi(dev);
975 _rtl92e_dm_init_tx_power_tracking_thermal(dev);
978 static void _rtl92e_dm_check_tx_power_tracking_tssi(struct net_device *dev)
980 struct r8192_priv *priv = rtllib_priv(dev);
981 static u32 tx_power_track_counter;
983 RT_TRACE(COMP_POWER_TRACKING, "%s()\n", __func__);
984 if (rtl92e_readb(dev, 0x11e) == 1)
986 if (!priv->btxpower_tracking)
988 tx_power_track_counter++;
991 if (tx_power_track_counter >= 180) {
992 schedule_delayed_work(&priv->txpower_tracking_wq, 0);
993 tx_power_track_counter = 0;
998 static void _rtl92e_dm_check_tx_power_tracking_thermal(struct net_device *dev)
1000 struct r8192_priv *priv = rtllib_priv(dev);
1001 static u8 TM_Trigger;
1002 u8 TxPowerCheckCnt = 0;
1004 if (IS_HARDWARE_TYPE_8192SE(dev))
1005 TxPowerCheckCnt = 5;
1007 TxPowerCheckCnt = 2;
1008 if (!priv->btxpower_tracking)
1011 if (priv->txpower_count <= TxPowerCheckCnt) {
1012 priv->txpower_count++;
1017 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1018 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1019 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1020 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1024 netdev_info(dev, "===============>Schedule TxPowerTrackingWorkItem\n");
1025 schedule_delayed_work(&priv->txpower_tracking_wq, 0);
1030 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev)
1032 struct r8192_priv *priv = rtllib_priv(dev);
1034 if (priv->IC_Cut >= IC_VersionCut_D)
1035 _rtl92e_dm_check_tx_power_tracking_tssi(dev);
1037 _rtl92e_dm_check_tx_power_tracking_thermal(dev);
1040 static void _rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device *dev,
1044 struct r8192_priv *priv = rtllib_priv(dev);
1045 u8 attenuation = (u8)priv->CCKPresentAttentuation;
1049 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][0] +
1050 (dm_cck_tx_bb_gain[attenuation][1] << 8));
1052 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1053 TempVal = (u32)((dm_cck_tx_bb_gain[attenuation][2]) +
1054 (dm_cck_tx_bb_gain[attenuation][3] << 8) +
1055 (dm_cck_tx_bb_gain[attenuation][4] << 16)+
1056 (dm_cck_tx_bb_gain[attenuation][5] << 24));
1057 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1058 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][6] +
1059 (dm_cck_tx_bb_gain[attenuation][7] << 8));
1061 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1063 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][0]) +
1064 (dm_cck_tx_bb_gain_ch14[attenuation][1] << 8));
1066 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1067 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][2]) +
1068 (dm_cck_tx_bb_gain_ch14[attenuation][3] << 8) +
1069 (dm_cck_tx_bb_gain_ch14[attenuation][4] << 16)+
1070 (dm_cck_tx_bb_gain_ch14[attenuation][5] << 24));
1071 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1072 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][6]) +
1073 (dm_cck_tx_bb_gain_ch14[attenuation][7] << 8));
1075 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1079 static void _rtl92e_dm_cck_tx_power_adjust_thermal_meter(struct net_device *dev,
1083 struct r8192_priv *priv = rtllib_priv(dev);
1087 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
1088 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1] << 8);
1089 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1090 RT_TRACE(COMP_POWER_TRACKING,
1091 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter1,
1093 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
1094 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3] << 8) +
1095 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4] << 16)+
1096 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5] << 24);
1097 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1098 RT_TRACE(COMP_POWER_TRACKING,
1099 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter2,
1101 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
1102 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7] << 8);
1104 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1105 RT_TRACE(COMP_POWER_TRACKING,
1106 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_DebugPort,
1109 TempVal = CCKSwingTable_Ch14[priv->CCK_index][0] +
1110 (CCKSwingTable_Ch14[priv->CCK_index][1] << 8);
1112 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1113 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1114 rCCK0_TxFilter1, TempVal);
1115 TempVal = CCKSwingTable_Ch14[priv->CCK_index][2] +
1116 (CCKSwingTable_Ch14[priv->CCK_index][3] << 8) +
1117 (CCKSwingTable_Ch14[priv->CCK_index][4] << 16)+
1118 (CCKSwingTable_Ch14[priv->CCK_index][5] << 24);
1119 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1120 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1121 rCCK0_TxFilter2, TempVal);
1122 TempVal = CCKSwingTable_Ch14[priv->CCK_index][6] +
1123 (CCKSwingTable_Ch14[priv->CCK_index][7]<<8);
1125 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1126 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1127 rCCK0_DebugPort, TempVal);
1131 void rtl92e_dm_cck_txpower_adjust(struct net_device *dev, bool binch14)
1133 struct r8192_priv *priv = rtllib_priv(dev);
1135 if (priv->IC_Cut >= IC_VersionCut_D)
1136 _rtl92e_dm_cck_tx_power_adjust_tssi(dev, binch14);
1138 _rtl92e_dm_cck_tx_power_adjust_thermal_meter(dev, binch14);
1141 static void _rtl92e_dm_tx_power_reset_recovery(struct net_device *dev)
1143 struct r8192_priv *priv = rtllib_priv(dev);
1145 RT_TRACE(COMP_POWER_TRACKING, "Start Reset Recovery ==>\n");
1146 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
1147 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1148 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc80 is %08x\n",
1149 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1150 RT_TRACE(COMP_POWER_TRACKING,
1151 "Reset Recovery: Fill in RFA_txPowerTrackingIndex is %x\n",
1152 priv->rfa_txpowertrackingindex);
1153 RT_TRACE(COMP_POWER_TRACKING,
1154 "Reset Recovery : RF A I/Q Amplify Gain is %d\n",
1155 dm_tx_bb_gain_idx_to_amplify(priv->rfa_txpowertrackingindex));
1156 RT_TRACE(COMP_POWER_TRACKING,
1157 "Reset Recovery: CCK Attenuation is %d dB\n",
1158 priv->CCKPresentAttentuation);
1159 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1161 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord,
1162 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1163 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc90 is %08x\n",
1164 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1165 RT_TRACE(COMP_POWER_TRACKING,
1166 "Reset Recovery: Fill in RFC_txPowerTrackingIndex is %x\n",
1167 priv->rfc_txpowertrackingindex);
1168 RT_TRACE(COMP_POWER_TRACKING,
1169 "Reset Recovery : RF C I/Q Amplify Gain is %d\n",
1170 dm_tx_bb_gain_idx_to_amplify(priv->rfc_txpowertrackingindex));
1173 void rtl92e_dm_restore_state(struct net_device *dev)
1175 struct r8192_priv *priv = rtllib_priv(dev);
1176 u32 reg_ratr = priv->rate_adaptive.last_ratr;
1181 "<---- %s: driver is going to unload\n", __func__);
1185 if (priv->rate_adaptive.rate_adaptive_disabled)
1187 if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
1188 priv->rtllib->mode == WIRELESS_MODE_N_5G))
1190 ratr_value = reg_ratr;
1191 if (priv->rf_type == RF_1T2R)
1192 ratr_value &= ~(RATE_ALL_OFDM_2SS);
1193 rtl92e_writel(dev, RATR0, ratr_value);
1194 rtl92e_writeb(dev, UFWP, 1);
1195 if (priv->btxpower_trackingInit && priv->btxpower_tracking)
1196 _rtl92e_dm_tx_power_reset_recovery(dev);
1198 _rtl92e_dm_bb_initialgain_restore(dev);
1202 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev)
1204 struct r8192_priv *priv = rtllib_priv(dev);
1205 u32 bit_mask = 0x7f;
1207 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1210 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1211 rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask,
1212 (u32)priv->initgain_backup.xaagccore1);
1213 rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask,
1214 (u32)priv->initgain_backup.xbagccore1);
1215 rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask,
1216 (u32)priv->initgain_backup.xcagccore1);
1217 rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask,
1218 (u32)priv->initgain_backup.xdagccore1);
1219 bit_mask = bMaskByte2;
1220 rtl92e_set_bb_reg(dev, rCCK0_CCA, bit_mask,
1221 (u32)priv->initgain_backup.cca);
1223 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc50 is %x\n",
1224 priv->initgain_backup.xaagccore1);
1225 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc58 is %x\n",
1226 priv->initgain_backup.xbagccore1);
1227 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc60 is %x\n",
1228 priv->initgain_backup.xcagccore1);
1229 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc68 is %x\n",
1230 priv->initgain_backup.xdagccore1);
1231 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xa0a is %x\n",
1232 priv->initgain_backup.cca);
1233 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1237 void rtl92e_dm_backup_state(struct net_device *dev)
1239 struct r8192_priv *priv = rtllib_priv(dev);
1240 u32 bit_mask = bMaskByte0;
1242 priv->bswitch_fsync = false;
1243 priv->bfsync_processing = false;
1245 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1248 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1249 priv->initgain_backup.xaagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask);
1250 priv->initgain_backup.xbagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask);
1251 priv->initgain_backup.xcagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask);
1252 priv->initgain_backup.xdagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask);
1253 bit_mask = bMaskByte2;
1254 priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, bit_mask);
1256 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc50 is %x\n",
1257 priv->initgain_backup.xaagccore1);
1258 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc58 is %x\n",
1259 priv->initgain_backup.xbagccore1);
1260 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc60 is %x\n",
1261 priv->initgain_backup.xcagccore1);
1262 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc68 is %x\n",
1263 priv->initgain_backup.xdagccore1);
1264 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xa0a is %x\n",
1265 priv->initgain_backup.cca);
1268 static void _rtl92e_dm_dig_init(struct net_device *dev)
1270 struct r8192_priv *priv = rtllib_priv(dev);
1272 dm_digtable.dig_enable_flag = true;
1274 dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
1276 dm_digtable.dig_algorithm_switch = 0;
1278 dm_digtable.dig_state = DM_STA_DIG_MAX;
1279 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1280 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1281 dm_digtable.PreSTAConnectState = DIG_STA_DISCONNECT;
1283 dm_digtable.rssi_low_thresh = DM_DIG_THRESH_LOW;
1284 dm_digtable.rssi_high_thresh = DM_DIG_THRESH_HIGH;
1286 dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
1287 dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
1289 dm_digtable.rssi_val = 50;
1290 dm_digtable.backoff_val = DM_DIG_BACKOFF;
1291 dm_digtable.rx_gain_range_max = DM_DIG_MAX;
1292 if (priv->CustomerID == RT_CID_819x_Netcore)
1293 dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
1295 dm_digtable.rx_gain_range_min = DM_DIG_MIN;
1298 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev)
1301 if (dm_digtable.dig_enable_flag == false)
1304 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
1305 _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(dev);
1306 else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1307 _rtl92e_dm_ctrl_initgain_byrssi_driver(dev);
1312 /*-----------------------------------------------------------------------------
1313 * Function: dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm()
1315 * Overview: Driver monitor RSSI and False Alarm to change initial gain.
1316 Only change initial gain during link in progress.
1318 * Input: IN PADAPTER pAdapter
1326 * 03/04/2009 hpfan Create Version 0.
1328 ******************************************************************************/
1330 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev)
1332 struct r8192_priv *priv = rtllib_priv(dev);
1336 if (dm_digtable.dig_enable_flag == false)
1339 if (dm_digtable.dig_algorithm_switch)
1342 for (i = 0; i < 3; i++)
1343 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1345 dm_digtable.dig_state = DM_STA_DIG_OFF;
1348 if (priv->rtllib->state == RTLLIB_LINKED)
1349 dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
1351 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1354 dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
1355 _rtl92e_dm_initial_gain(dev);
1356 _rtl92e_dm_pd_th(dev);
1357 _rtl92e_dm_cs_ratio(dev);
1358 if (dm_digtable.dig_algorithm_switch)
1359 dm_digtable.dig_algorithm_switch = 0;
1360 dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
1364 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev)
1366 struct r8192_priv *priv = rtllib_priv(dev);
1367 static u32 reset_cnt;
1370 if (dm_digtable.dig_enable_flag == false)
1373 if (dm_digtable.dig_algorithm_switch) {
1374 dm_digtable.dig_state = DM_STA_DIG_MAX;
1375 for (i = 0; i < 3; i++)
1376 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1377 dm_digtable.dig_algorithm_switch = 0;
1380 if (priv->rtllib->state != RTLLIB_LINKED)
1383 if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
1384 (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
1386 if (priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh) {
1387 if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
1388 (priv->reset_count == reset_cnt))
1390 reset_cnt = priv->reset_count;
1392 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1393 dm_digtable.dig_state = DM_STA_DIG_OFF;
1395 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1397 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x17);
1398 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x17);
1399 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x17);
1400 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x17);
1402 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1403 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1405 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1407 rtl92e_writeb(dev, 0xa0a, 0x08);
1412 if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
1415 if (dm_digtable.dig_state == DM_STA_DIG_ON &&
1416 (priv->reset_count == reset_cnt)) {
1417 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1420 if (priv->reset_count != reset_cnt)
1423 reset_cnt = priv->reset_count;
1425 dm_digtable.dig_state = DM_STA_DIG_ON;
1427 if (reset_flag == 1) {
1428 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x2c);
1429 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x2c);
1430 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x2c);
1431 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x2c);
1433 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x20);
1434 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x20);
1435 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x20);
1436 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x20);
1439 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1440 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1442 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1444 rtl92e_writeb(dev, 0xa0a, 0xcd);
1446 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1448 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1452 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev)
1454 struct r8192_priv *priv = rtllib_priv(dev);
1455 static u32 reset_cnt_highpwr;
1457 if ((priv->undecorated_smoothed_pwdb >
1458 dm_digtable.rssi_high_power_lowthresh) &&
1459 (priv->undecorated_smoothed_pwdb <
1460 dm_digtable.rssi_high_power_highthresh))
1463 if (priv->undecorated_smoothed_pwdb >=
1464 dm_digtable.rssi_high_power_highthresh) {
1465 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
1466 (priv->reset_count == reset_cnt_highpwr))
1468 dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
1470 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1471 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1473 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1475 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF &&
1476 (priv->reset_count == reset_cnt_highpwr))
1478 dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
1480 if ((priv->undecorated_smoothed_pwdb <
1481 dm_digtable.rssi_high_power_lowthresh) &&
1482 (priv->undecorated_smoothed_pwdb >=
1483 dm_digtable.rssi_high_thresh)) {
1484 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1485 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1487 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1490 reset_cnt_highpwr = priv->reset_count;
1493 static void _rtl92e_dm_initial_gain(struct net_device *dev)
1495 struct r8192_priv *priv = rtllib_priv(dev);
1496 u8 initial_gain = 0;
1497 static u8 initialized, force_write;
1498 static u32 reset_cnt;
1500 if (dm_digtable.dig_algorithm_switch) {
1505 if (rtllib_act_scanning(priv->rtllib, true) == true) {
1510 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1511 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1512 long gain_range = dm_digtable.rssi_val + 10 -
1513 dm_digtable.backoff_val;
1514 gain_range = clamp_t(long, gain_range,
1515 dm_digtable.rx_gain_range_min,
1516 dm_digtable.rx_gain_range_max);
1517 dm_digtable.cur_ig_value = gain_range;
1519 if (dm_digtable.cur_ig_value == 0)
1520 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1522 dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
1525 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1526 dm_digtable.pre_ig_value = 0;
1529 if (priv->reset_count != reset_cnt) {
1531 reset_cnt = priv->reset_count;
1534 if (dm_digtable.pre_ig_value != rtl92e_readb(dev, rOFDM0_XAAGCCore1))
1537 if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
1538 || !initialized || force_write) {
1539 initial_gain = (u8)dm_digtable.cur_ig_value;
1540 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain);
1541 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain);
1542 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain);
1543 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, initial_gain);
1544 dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
1550 static void _rtl92e_dm_pd_th(struct net_device *dev)
1552 struct r8192_priv *priv = rtllib_priv(dev);
1553 static u8 initialized, force_write;
1554 static u32 reset_cnt;
1556 if (dm_digtable.dig_algorithm_switch) {
1561 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1562 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1563 if (dm_digtable.rssi_val >=
1564 dm_digtable.rssi_high_power_highthresh)
1565 dm_digtable.curpd_thstate =
1566 DIG_PD_AT_HIGH_POWER;
1567 else if (dm_digtable.rssi_val <=
1568 dm_digtable.rssi_low_thresh)
1569 dm_digtable.curpd_thstate =
1570 DIG_PD_AT_LOW_POWER;
1571 else if ((dm_digtable.rssi_val >=
1572 dm_digtable.rssi_high_thresh) &&
1573 (dm_digtable.rssi_val <
1574 dm_digtable.rssi_high_power_lowthresh))
1575 dm_digtable.curpd_thstate =
1576 DIG_PD_AT_NORMAL_POWER;
1578 dm_digtable.curpd_thstate =
1579 dm_digtable.prepd_thstate;
1581 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1584 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1587 if (priv->reset_count != reset_cnt) {
1589 reset_cnt = priv->reset_count;
1592 if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
1593 (initialized <= 3) || force_write) {
1594 if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER) {
1595 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1596 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1598 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1599 } else if (dm_digtable.curpd_thstate ==
1600 DIG_PD_AT_NORMAL_POWER) {
1601 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1602 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1604 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1605 } else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER) {
1606 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1607 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1609 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1611 dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
1612 if (initialized <= 3)
1618 static void _rtl92e_dm_cs_ratio(struct net_device *dev)
1620 struct r8192_priv *priv = rtllib_priv(dev);
1621 static u8 initialized, force_write;
1622 static u32 reset_cnt;
1624 if (dm_digtable.dig_algorithm_switch) {
1629 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1630 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1631 if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
1632 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1633 else if (dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh)
1634 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
1636 dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
1638 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1641 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1644 if (priv->reset_count != reset_cnt) {
1646 reset_cnt = priv->reset_count;
1650 if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
1651 !initialized || force_write) {
1652 if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER)
1653 rtl92e_writeb(dev, 0xa0a, 0x08);
1654 else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER)
1655 rtl92e_writeb(dev, 0xa0a, 0xcd);
1656 dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
1662 void rtl92e_dm_init_edca_turbo(struct net_device *dev)
1664 struct r8192_priv *priv = rtllib_priv(dev);
1666 priv->bcurrent_turbo_EDCA = false;
1667 priv->rtllib->bis_any_nonbepkts = false;
1668 priv->bis_cur_rdlstate = false;
1671 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
1673 struct r8192_priv *priv = rtllib_priv(dev);
1674 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1676 static unsigned long lastTxOkCnt;
1677 static unsigned long lastRxOkCnt;
1678 unsigned long curTxOkCnt = 0;
1679 unsigned long curRxOkCnt = 0;
1681 if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
1682 goto dm_CheckEdcaTurbo_EXIT;
1683 if (priv->rtllib->state != RTLLIB_LINKED)
1684 goto dm_CheckEdcaTurbo_EXIT;
1685 if (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO)
1686 goto dm_CheckEdcaTurbo_EXIT;
1688 if (!priv->rtllib->bis_any_nonbepkts) {
1689 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1690 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1691 if (pHTInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX) {
1692 if (curTxOkCnt > 4*curRxOkCnt) {
1693 if (priv->bis_cur_rdlstate ||
1694 !priv->bcurrent_turbo_EDCA) {
1695 rtl92e_writel(dev, EDCAPARA_BE,
1696 edca_setting_UL[pHTInfo->IOTPeer]);
1697 priv->bis_cur_rdlstate = false;
1700 if (!priv->bis_cur_rdlstate ||
1701 !priv->bcurrent_turbo_EDCA) {
1702 if (priv->rtllib->mode == WIRELESS_MODE_G)
1703 rtl92e_writel(dev, EDCAPARA_BE,
1704 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1706 rtl92e_writel(dev, EDCAPARA_BE,
1707 edca_setting_DL[pHTInfo->IOTPeer]);
1708 priv->bis_cur_rdlstate = true;
1711 priv->bcurrent_turbo_EDCA = true;
1713 if (curRxOkCnt > 4*curTxOkCnt) {
1714 if (!priv->bis_cur_rdlstate ||
1715 !priv->bcurrent_turbo_EDCA) {
1716 if (priv->rtllib->mode == WIRELESS_MODE_G)
1717 rtl92e_writel(dev, EDCAPARA_BE,
1718 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1720 rtl92e_writel(dev, EDCAPARA_BE,
1721 edca_setting_DL[pHTInfo->IOTPeer]);
1722 priv->bis_cur_rdlstate = true;
1725 if (priv->bis_cur_rdlstate ||
1726 !priv->bcurrent_turbo_EDCA) {
1727 rtl92e_writel(dev, EDCAPARA_BE,
1728 edca_setting_UL[pHTInfo->IOTPeer]);
1729 priv->bis_cur_rdlstate = false;
1734 priv->bcurrent_turbo_EDCA = true;
1737 if (priv->bcurrent_turbo_EDCA) {
1740 priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM,
1742 priv->bcurrent_turbo_EDCA = false;
1747 dm_CheckEdcaTurbo_EXIT:
1748 priv->rtllib->bis_any_nonbepkts = false;
1749 lastTxOkCnt = priv->stats.txbytesunicast;
1750 lastRxOkCnt = priv->stats.rxbytesunicast;
1753 static void _rtl92e_dm_init_cts_to_self(struct net_device *dev)
1755 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1757 priv->rtllib->bCTSToSelfEnable = true;
1760 static void _rtl92e_dm_cts_to_self(struct net_device *dev)
1762 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1763 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1764 static unsigned long lastTxOkCnt;
1765 static unsigned long lastRxOkCnt;
1766 unsigned long curTxOkCnt = 0;
1767 unsigned long curRxOkCnt = 0;
1769 if (priv->rtllib->bCTSToSelfEnable != true) {
1770 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1773 if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
1774 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1775 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1776 if (curRxOkCnt > 4*curTxOkCnt)
1777 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1779 pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
1781 lastTxOkCnt = priv->stats.txbytesunicast;
1782 lastRxOkCnt = priv->stats.rxbytesunicast;
1787 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev)
1789 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1790 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1792 pHTInfo->bWAIotBroadcom = false;
1793 pHTInfo->WAIotTH = WAIotTHVal;
1796 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data)
1798 struct r8192_priv *priv = container_of_dwork_rsl(data,
1799 struct r8192_priv, gpio_change_rf_wq);
1800 struct net_device *dev = priv->rtllib->dev;
1802 enum rt_rf_power_state eRfPowerStateToSet;
1803 bool bActuallySet = false;
1805 static char const RadioPowerPath[] = "/etc/acpi/events/RadioPower.sh";
1806 static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin",
1809 bActuallySet = false;
1811 if ((priv->up_first_time == 1) || (priv->being_init_adapter))
1814 if (priv->bfirst_after_down) {
1815 priv->bfirst_after_down = true;
1819 tmp1byte = rtl92e_readb(dev, GPI);
1821 eRfPowerStateToSet = (tmp1byte&BIT1) ? eRfOn : eRfOff;
1823 if (priv->bHwRadioOff && (eRfPowerStateToSet == eRfOn)) {
1824 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio ON\n");
1825 netdev_info(dev, "gpiochangeRF - HW Radio ON\n");
1826 priv->bHwRadioOff = false;
1827 bActuallySet = true;
1828 } else if (!priv->bHwRadioOff && (eRfPowerStateToSet == eRfOff)) {
1829 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio OFF\n");
1830 netdev_info(dev, "gpiochangeRF - HW Radio OFF\n");
1831 priv->bHwRadioOff = true;
1832 bActuallySet = true;
1837 priv->bHwRfOffAction = 1;
1838 rtl92e_set_rf_state(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
1839 if (priv->bHwRadioOff)
1844 argv[0] = (char *)RadioPowerPath;
1846 call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
1850 void rtl92e_dm_rf_pathcheck_wq(void *data)
1852 struct r8192_priv *priv = container_of_dwork_rsl(data,
1855 struct net_device *dev = priv->rtllib->dev;
1858 rfpath = rtl92e_readb(dev, 0xc04);
1860 for (i = 0; i < RF90_PATH_MAX; i++) {
1861 if (rfpath & (0x01<<i))
1862 priv->brfpath_rxenable[i] = true;
1864 priv->brfpath_rxenable[i] = false;
1866 if (!DM_RxPathSelTable.Enable)
1869 _rtl92e_dm_rx_path_sel_byrssi(dev);
1872 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev)
1875 struct r8192_priv *priv = rtllib_priv(dev);
1877 DM_RxPathSelTable.Enable = 1;
1878 DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
1879 DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
1880 if (priv->CustomerID == RT_CID_819x_Netcore)
1881 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1883 DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
1884 DM_RxPathSelTable.disabledRF = 0;
1885 for (i = 0; i < 4; i++) {
1886 DM_RxPathSelTable.rf_rssi[i] = 50;
1887 DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
1888 DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
1892 #define PWDB_IN_RANGE ((cur_cck_pwdb < tmp_cck_max_pwdb) && \
1893 (cur_cck_pwdb > tmp_cck_sec_pwdb))
1895 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev)
1897 struct r8192_priv *priv = rtllib_priv(dev);
1898 u8 i, max_rssi_index = 0, min_rssi_index = 0;
1899 u8 sec_rssi_index = 0, rf_num = 0;
1900 u8 tmp_max_rssi = 0, tmp_min_rssi = 0, tmp_sec_rssi = 0;
1901 u8 cck_default_Rx = 0x2;
1902 u8 cck_optional_Rx = 0x3;
1903 long tmp_cck_max_pwdb = 0, tmp_cck_min_pwdb = 0, tmp_cck_sec_pwdb = 0;
1904 u8 cck_rx_ver2_max_index = 0, cck_rx_ver2_min_index = 0;
1905 u8 cck_rx_ver2_sec_index = 0;
1908 static u8 disabled_rf_cnt, cck_Rx_Path_initialized;
1909 u8 update_cck_rx_path;
1911 if (priv->rf_type != RF_2T4R)
1914 if (!cck_Rx_Path_initialized) {
1915 DM_RxPathSelTable.cck_Rx_path = (rtl92e_readb(dev, 0xa07)&0xf);
1916 cck_Rx_Path_initialized = 1;
1919 DM_RxPathSelTable.disabledRF = 0xf;
1920 DM_RxPathSelTable.disabledRF &= ~(rtl92e_readb(dev, 0xc04));
1922 if (priv->rtllib->mode == WIRELESS_MODE_B)
1923 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1925 for (i = 0; i < RF90_PATH_MAX; i++) {
1926 DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
1928 if (priv->brfpath_rxenable[i]) {
1930 cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
1933 max_rssi_index = min_rssi_index = sec_rssi_index = i;
1934 tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
1935 } else if (rf_num == 2) {
1936 if (cur_rf_rssi >= tmp_max_rssi) {
1937 tmp_max_rssi = cur_rf_rssi;
1940 tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
1941 sec_rssi_index = min_rssi_index = i;
1944 if (cur_rf_rssi > tmp_max_rssi) {
1945 tmp_sec_rssi = tmp_max_rssi;
1946 sec_rssi_index = max_rssi_index;
1947 tmp_max_rssi = cur_rf_rssi;
1949 } else if (cur_rf_rssi == tmp_max_rssi) {
1950 tmp_sec_rssi = cur_rf_rssi;
1952 } else if ((cur_rf_rssi < tmp_max_rssi) &&
1953 (cur_rf_rssi > tmp_sec_rssi)) {
1954 tmp_sec_rssi = cur_rf_rssi;
1956 } else if (cur_rf_rssi == tmp_sec_rssi) {
1957 if (tmp_sec_rssi == tmp_min_rssi) {
1958 tmp_sec_rssi = cur_rf_rssi;
1961 } else if ((cur_rf_rssi < tmp_sec_rssi) &&
1962 (cur_rf_rssi > tmp_min_rssi)) {
1964 } else if (cur_rf_rssi == tmp_min_rssi) {
1965 if (tmp_sec_rssi == tmp_min_rssi) {
1966 tmp_min_rssi = cur_rf_rssi;
1969 } else if (cur_rf_rssi < tmp_min_rssi) {
1970 tmp_min_rssi = cur_rf_rssi;
1978 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
1979 for (i = 0; i < RF90_PATH_MAX; i++) {
1980 if (priv->brfpath_rxenable[i]) {
1983 DM_RxPathSelTable.cck_pwdb_sta[i];
1986 cck_rx_ver2_max_index = i;
1987 cck_rx_ver2_min_index = i;
1988 cck_rx_ver2_sec_index = i;
1989 tmp_cck_max_pwdb = cur_cck_pwdb;
1990 tmp_cck_min_pwdb = cur_cck_pwdb;
1991 tmp_cck_sec_pwdb = cur_cck_pwdb;
1992 } else if (rf_num == 2) {
1993 if (cur_cck_pwdb >= tmp_cck_max_pwdb) {
1994 tmp_cck_max_pwdb = cur_cck_pwdb;
1995 cck_rx_ver2_max_index = i;
1997 tmp_cck_sec_pwdb = cur_cck_pwdb;
1998 tmp_cck_min_pwdb = cur_cck_pwdb;
1999 cck_rx_ver2_sec_index = i;
2000 cck_rx_ver2_min_index = i;
2003 if (cur_cck_pwdb > tmp_cck_max_pwdb) {
2006 cck_rx_ver2_sec_index =
2007 cck_rx_ver2_max_index;
2008 tmp_cck_max_pwdb = cur_cck_pwdb;
2009 cck_rx_ver2_max_index = i;
2010 } else if (cur_cck_pwdb ==
2012 tmp_cck_sec_pwdb = cur_cck_pwdb;
2013 cck_rx_ver2_sec_index = i;
2014 } else if (PWDB_IN_RANGE) {
2015 tmp_cck_sec_pwdb = cur_cck_pwdb;
2016 cck_rx_ver2_sec_index = i;
2017 } else if (cur_cck_pwdb ==
2019 if (tmp_cck_sec_pwdb ==
2023 cck_rx_ver2_sec_index =
2026 } else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) &&
2027 (cur_cck_pwdb > tmp_cck_min_pwdb)) {
2029 } else if (cur_cck_pwdb == tmp_cck_min_pwdb) {
2030 if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb) {
2031 tmp_cck_min_pwdb = cur_cck_pwdb;
2032 cck_rx_ver2_min_index = i;
2034 } else if (cur_cck_pwdb < tmp_cck_min_pwdb) {
2035 tmp_cck_min_pwdb = cur_cck_pwdb;
2036 cck_rx_ver2_min_index = i;
2044 update_cck_rx_path = 0;
2045 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
2046 cck_default_Rx = cck_rx_ver2_max_index;
2047 cck_optional_Rx = cck_rx_ver2_sec_index;
2048 if (tmp_cck_max_pwdb != -64)
2049 update_cck_rx_path = 1;
2052 if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2) {
2053 if ((tmp_max_rssi - tmp_min_rssi) >=
2054 DM_RxPathSelTable.diff_TH) {
2055 DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] =
2057 rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable,
2058 0x1<<min_rssi_index, 0x0);
2059 rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable,
2060 0x1<<min_rssi_index, 0x0);
2063 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1) {
2064 cck_default_Rx = max_rssi_index;
2065 cck_optional_Rx = sec_rssi_index;
2067 update_cck_rx_path = 1;
2071 if (update_cck_rx_path) {
2072 DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2) |
2074 rtl92e_set_bb_reg(dev, rCCK0_AFESetting, 0x0f000000,
2075 DM_RxPathSelTable.cck_Rx_path);
2078 if (DM_RxPathSelTable.disabledRF) {
2079 for (i = 0; i < 4; i++) {
2080 if ((DM_RxPathSelTable.disabledRF>>i) & 0x1) {
2082 DM_RxPathSelTable.rf_enable_rssi_th[i]) {
2083 rtl92e_set_bb_reg(dev,
2084 rOFDM0_TRxPathEnable,
2086 rtl92e_set_bb_reg(dev,
2087 rOFDM1_TRxPathEnable,
2089 DM_RxPathSelTable.rf_enable_rssi_th[i]
2098 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev)
2100 struct r8192_priv *priv = rtllib_priv(dev);
2102 schedule_delayed_work(&priv->rfpath_check_wq, 0);
2106 static void _rtl92e_dm_init_fsync(struct net_device *dev)
2108 struct r8192_priv *priv = rtllib_priv(dev);
2110 priv->rtllib->fsync_time_interval = 500;
2111 priv->rtllib->fsync_rate_bitmap = 0x0f000800;
2112 priv->rtllib->fsync_rssi_threshold = 30;
2113 priv->rtllib->bfsync_enable = false;
2114 priv->rtllib->fsync_multiple_timeinterval = 3;
2115 priv->rtllib->fsync_firstdiff_ratethreshold = 100;
2116 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2117 priv->rtllib->fsync_state = Default_Fsync;
2118 priv->framesyncMonitor = 1;
2120 timer_setup(&priv->fsync_timer, _rtl92e_dm_fsync_timer_callback, 0);
2124 static void _rtl92e_dm_deinit_fsync(struct net_device *dev)
2126 struct r8192_priv *priv = rtllib_priv(dev);
2128 del_timer_sync(&priv->fsync_timer);
2131 static void _rtl92e_dm_fsync_timer_callback(struct timer_list *t)
2133 struct r8192_priv *priv = from_timer(priv, t, fsync_timer);
2134 struct net_device *dev = priv->rtllib->dev;
2135 u32 rate_index, rate_count = 0, rate_count_diff = 0;
2136 bool bSwitchFromCountDiff = false;
2137 bool bDoubleTimeInterval = false;
2139 if (priv->rtllib->state == RTLLIB_LINKED &&
2140 priv->rtllib->bfsync_enable &&
2141 (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC)) {
2144 for (rate_index = 0; rate_index <= 27; rate_index++) {
2145 rate_bitmap = 1 << rate_index;
2146 if (priv->rtllib->fsync_rate_bitmap & rate_bitmap)
2148 priv->stats.received_rate_histogram[1]
2152 if (rate_count < priv->rate_record)
2153 rate_count_diff = 0xffffffff - rate_count +
2156 rate_count_diff = rate_count - priv->rate_record;
2157 if (rate_count_diff < priv->rateCountDiffRecord) {
2159 u32 DiffNum = priv->rateCountDiffRecord -
2162 priv->rtllib->fsync_seconddiff_ratethreshold)
2163 priv->ContinueDiffCount++;
2165 priv->ContinueDiffCount = 0;
2167 if (priv->ContinueDiffCount >= 2) {
2168 bSwitchFromCountDiff = true;
2169 priv->ContinueDiffCount = 0;
2172 priv->ContinueDiffCount = 0;
2175 if (rate_count_diff <=
2176 priv->rtllib->fsync_firstdiff_ratethreshold) {
2177 bSwitchFromCountDiff = true;
2178 priv->ContinueDiffCount = 0;
2180 priv->rate_record = rate_count;
2181 priv->rateCountDiffRecord = rate_count_diff;
2182 RT_TRACE(COMP_HALDM,
2183 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2184 priv->rate_record, rate_count, rate_count_diff,
2185 priv->bswitch_fsync);
2186 if (priv->undecorated_smoothed_pwdb >
2187 priv->rtllib->fsync_rssi_threshold &&
2188 bSwitchFromCountDiff) {
2189 bDoubleTimeInterval = true;
2190 priv->bswitch_fsync = !priv->bswitch_fsync;
2191 if (priv->bswitch_fsync) {
2192 rtl92e_writeb(dev, 0xC36, 0x1c);
2193 rtl92e_writeb(dev, 0xC3e, 0x90);
2195 rtl92e_writeb(dev, 0xC36, 0x5c);
2196 rtl92e_writeb(dev, 0xC3e, 0x96);
2198 } else if (priv->undecorated_smoothed_pwdb <=
2199 priv->rtllib->fsync_rssi_threshold) {
2200 if (priv->bswitch_fsync) {
2201 priv->bswitch_fsync = false;
2202 rtl92e_writeb(dev, 0xC36, 0x5c);
2203 rtl92e_writeb(dev, 0xC3e, 0x96);
2206 if (bDoubleTimeInterval) {
2207 if (timer_pending(&priv->fsync_timer))
2208 del_timer_sync(&priv->fsync_timer);
2209 priv->fsync_timer.expires = jiffies +
2210 msecs_to_jiffies(priv->rtllib->fsync_time_interval *
2211 priv->rtllib->fsync_multiple_timeinterval);
2212 add_timer(&priv->fsync_timer);
2214 if (timer_pending(&priv->fsync_timer))
2215 del_timer_sync(&priv->fsync_timer);
2216 priv->fsync_timer.expires = jiffies +
2217 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2218 add_timer(&priv->fsync_timer);
2221 if (priv->bswitch_fsync) {
2222 priv->bswitch_fsync = false;
2223 rtl92e_writeb(dev, 0xC36, 0x5c);
2224 rtl92e_writeb(dev, 0xC3e, 0x96);
2226 priv->ContinueDiffCount = 0;
2227 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2229 RT_TRACE(COMP_HALDM, "ContinueDiffCount %d\n", priv->ContinueDiffCount);
2230 RT_TRACE(COMP_HALDM,
2231 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2232 priv->rate_record, rate_count, rate_count_diff,
2233 priv->bswitch_fsync);
2236 static void _rtl92e_dm_start_hw_fsync(struct net_device *dev)
2238 u8 rf_timing = 0x77;
2239 struct r8192_priv *priv = rtllib_priv(dev);
2241 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2242 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cf);
2243 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING,
2244 (u8 *)(&rf_timing));
2245 rtl92e_writeb(dev, 0xc3b, 0x41);
2248 static void _rtl92e_dm_end_hw_fsync(struct net_device *dev)
2250 u8 rf_timing = 0xaa;
2251 struct r8192_priv *priv = rtllib_priv(dev);
2253 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2254 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2255 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8 *)
2257 rtl92e_writeb(dev, 0xc3b, 0x49);
2260 static void _rtl92e_dm_end_sw_fsync(struct net_device *dev)
2262 struct r8192_priv *priv = rtllib_priv(dev);
2264 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2265 del_timer_sync(&(priv->fsync_timer));
2267 if (priv->bswitch_fsync) {
2268 priv->bswitch_fsync = false;
2270 rtl92e_writeb(dev, 0xC36, 0x5c);
2272 rtl92e_writeb(dev, 0xC3e, 0x96);
2275 priv->ContinueDiffCount = 0;
2276 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2279 static void _rtl92e_dm_start_sw_fsync(struct net_device *dev)
2281 struct r8192_priv *priv = rtllib_priv(dev);
2285 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2286 priv->rate_record = 0;
2287 priv->ContinueDiffCount = 0;
2288 priv->rateCountDiffRecord = 0;
2289 priv->bswitch_fsync = false;
2291 if (priv->rtllib->mode == WIRELESS_MODE_N_24G) {
2292 priv->rtllib->fsync_firstdiff_ratethreshold = 600;
2293 priv->rtllib->fsync_seconddiff_ratethreshold = 0xffff;
2295 priv->rtllib->fsync_firstdiff_ratethreshold = 200;
2296 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2298 for (rateIndex = 0; rateIndex <= 27; rateIndex++) {
2299 rateBitmap = 1 << rateIndex;
2300 if (priv->rtllib->fsync_rate_bitmap & rateBitmap)
2301 priv->rate_record +=
2302 priv->stats.received_rate_histogram[1]
2305 if (timer_pending(&priv->fsync_timer))
2306 del_timer_sync(&priv->fsync_timer);
2307 priv->fsync_timer.expires = jiffies +
2308 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2309 add_timer(&priv->fsync_timer);
2311 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cd);
2315 static void _rtl92e_dm_check_fsync(struct net_device *dev)
2317 #define RegC38_Default 0
2318 #define RegC38_NonFsync_Other_AP 1
2319 #define RegC38_Fsync_AP_BCM 2
2320 struct r8192_priv *priv = rtllib_priv(dev);
2321 static u8 reg_c38_State = RegC38_Default;
2322 static u32 reset_cnt;
2324 RT_TRACE(COMP_HALDM,
2325 "RSSI %d TimeInterval %d MultipleTimeInterval %d\n",
2326 priv->rtllib->fsync_rssi_threshold,
2327 priv->rtllib->fsync_time_interval,
2328 priv->rtllib->fsync_multiple_timeinterval);
2329 RT_TRACE(COMP_HALDM,
2330 "RateBitmap 0x%x FirstDiffRateThreshold %d SecondDiffRateThreshold %d\n",
2331 priv->rtllib->fsync_rate_bitmap,
2332 priv->rtllib->fsync_firstdiff_ratethreshold,
2333 priv->rtllib->fsync_seconddiff_ratethreshold);
2335 if (priv->rtllib->state == RTLLIB_LINKED &&
2336 priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
2337 if (priv->rtllib->bfsync_enable == 0) {
2338 switch (priv->rtllib->fsync_state) {
2340 _rtl92e_dm_start_hw_fsync(dev);
2341 priv->rtllib->fsync_state = HW_Fsync;
2344 _rtl92e_dm_end_sw_fsync(dev);
2345 _rtl92e_dm_start_hw_fsync(dev);
2346 priv->rtllib->fsync_state = HW_Fsync;
2353 switch (priv->rtllib->fsync_state) {
2355 _rtl92e_dm_start_sw_fsync(dev);
2356 priv->rtllib->fsync_state = SW_Fsync;
2359 _rtl92e_dm_end_hw_fsync(dev);
2360 _rtl92e_dm_start_sw_fsync(dev);
2361 priv->rtllib->fsync_state = SW_Fsync;
2369 if (priv->framesyncMonitor) {
2370 if (reg_c38_State != RegC38_Fsync_AP_BCM) {
2371 rtl92e_writeb(dev, rOFDM0_RxDetector3, 0x95);
2373 reg_c38_State = RegC38_Fsync_AP_BCM;
2377 switch (priv->rtllib->fsync_state) {
2379 _rtl92e_dm_end_hw_fsync(dev);
2380 priv->rtllib->fsync_state = Default_Fsync;
2383 _rtl92e_dm_end_sw_fsync(dev);
2384 priv->rtllib->fsync_state = Default_Fsync;
2391 if (priv->framesyncMonitor) {
2392 if (priv->rtllib->state == RTLLIB_LINKED) {
2393 if (priv->undecorated_smoothed_pwdb <=
2395 if (reg_c38_State !=
2396 RegC38_NonFsync_Other_AP) {
2402 RegC38_NonFsync_Other_AP;
2404 } else if (priv->undecorated_smoothed_pwdb >=
2406 if (reg_c38_State) {
2410 reg_c38_State = RegC38_Default;
2414 if (reg_c38_State) {
2415 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2417 reg_c38_State = RegC38_Default;
2422 if (priv->framesyncMonitor) {
2423 if (priv->reset_count != reset_cnt) {
2424 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2426 reg_c38_State = RegC38_Default;
2427 reset_cnt = priv->reset_count;
2430 if (reg_c38_State) {
2431 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2433 reg_c38_State = RegC38_Default;
2438 /*---------------------------Define function prototype------------------------*/
2439 static void _rtl92e_dm_init_dynamic_tx_power(struct net_device *dev)
2441 struct r8192_priv *priv = rtllib_priv(dev);
2443 priv->rtllib->bdynamic_txpower_enable = true;
2444 priv->bLastDTPFlag_High = false;
2445 priv->bLastDTPFlag_Low = false;
2446 priv->bDynamicTxHighPower = false;
2447 priv->bDynamicTxLowPower = false;
2450 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev)
2452 struct r8192_priv *priv = rtllib_priv(dev);
2453 unsigned int txhipower_threshhold = 0;
2454 unsigned int txlowpower_threshold = 0;
2456 if (priv->rtllib->bdynamic_txpower_enable != true) {
2457 priv->bDynamicTxHighPower = false;
2458 priv->bDynamicTxLowPower = false;
2461 if ((priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) &&
2462 (priv->rtllib->mode == IEEE_G)) {
2463 txhipower_threshhold = TX_POWER_ATHEROAP_THRESH_HIGH;
2464 txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
2466 txhipower_threshhold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
2467 txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
2470 RT_TRACE(COMP_TXAGC, "priv->undecorated_smoothed_pwdb = %ld\n",
2471 priv->undecorated_smoothed_pwdb);
2473 if (priv->rtllib->state == RTLLIB_LINKED) {
2474 if (priv->undecorated_smoothed_pwdb >= txhipower_threshhold) {
2475 priv->bDynamicTxHighPower = true;
2476 priv->bDynamicTxLowPower = false;
2478 if (priv->undecorated_smoothed_pwdb <
2479 txlowpower_threshold && priv->bDynamicTxHighPower)
2480 priv->bDynamicTxHighPower = false;
2481 if (priv->undecorated_smoothed_pwdb < 35)
2482 priv->bDynamicTxLowPower = true;
2483 else if (priv->undecorated_smoothed_pwdb >= 40)
2484 priv->bDynamicTxLowPower = false;
2487 priv->bDynamicTxHighPower = false;
2488 priv->bDynamicTxLowPower = false;
2491 if ((priv->bDynamicTxHighPower != priv->bLastDTPFlag_High) ||
2492 (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low)) {
2493 RT_TRACE(COMP_TXAGC, "SetTxPowerLevel8190() channel = %d\n",
2494 priv->rtllib->current_network.channel);
2496 rtl92e_set_tx_power(dev, priv->rtllib->current_network.channel);
2498 priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
2499 priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
2503 static void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev)
2505 struct r8192_priv *priv = rtllib_priv(dev);
2506 struct rtllib_device *ieee = priv->rtllib;
2508 ieee->softmac_stats.CurrentShowTxate = rtl92e_readb(dev,
2509 Current_Tx_Rate_Reg);
2511 ieee->softmac_stats.last_packet_rate = rtl92e_readb(dev,
2512 Initial_Tx_Rate_Reg);
2514 ieee->softmac_stats.txretrycount = rtl92e_readl(dev,
2515 Tx_Retry_Count_Reg);
2518 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev)
2520 struct r8192_priv *priv = rtllib_priv(dev);
2522 rtl92e_writeb(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb);