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 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;
636 powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24);
637 RF_Type = priv->rf_type;
638 Value = (RF_Type<<8) | powerlevelOFDM24G;
640 RT_TRACE(COMP_POWER_TRACKING, "powerlevelOFDM24G = %x\n",
644 for (j = 0; j <= 30; j++) {
646 tx_cmd.Op = TXCMD_SET_TX_PWR_TRACKING;
648 tx_cmd.Value = Value;
649 rtl92e_send_cmd_pkt(dev, DESC_PACKET_TYPE_NORMAL, (u8 *)&tx_cmd,
650 sizeof(struct dcmd_txcmd));
652 for (i = 0; i <= 30; i++) {
653 Pwr_Flag = rtl92e_readb(dev, Pw_Track_Flag);
658 if (priv->bResetInProgress) {
659 RT_TRACE(COMP_POWER_TRACKING,
660 "we are in silent reset progress, so return\n");
661 rtl92e_writeb(dev, Pw_Track_Flag, 0);
662 rtl92e_writeb(dev, FW_Busy_Flag, 0);
665 if (priv->rtllib->eRFPowerState != eRfOn) {
666 RT_TRACE(COMP_POWER_TRACKING,
667 "we are in power save, so return\n");
668 rtl92e_writeb(dev, Pw_Track_Flag, 0);
669 rtl92e_writeb(dev, FW_Busy_Flag, 0);
676 Avg_TSSI_Meas = rtl92e_readw(dev, Tssi_Mea_Value);
678 if (Avg_TSSI_Meas == 0) {
679 rtl92e_writeb(dev, Pw_Track_Flag, 0);
680 rtl92e_writeb(dev, FW_Busy_Flag, 0);
684 for (k = 0; k < 5; k++) {
686 tmp_report[k] = rtl92e_readb(dev,
687 Tssi_Report_Value1+k);
689 tmp_report[k] = rtl92e_readb(dev,
692 RT_TRACE(COMP_POWER_TRACKING,
693 "TSSI_report_value = %d\n",
696 if (tmp_report[k] <= 20) {
703 rtl92e_writeb(dev, Pw_Track_Flag, 0);
705 RT_TRACE(COMP_POWER_TRACKING,
706 "we filted this data\n");
707 for (k = 0; k < 5; k++)
712 for (k = 0; k < 5; k++)
713 Avg_TSSI_Meas_from_driver += tmp_report[k];
715 Avg_TSSI_Meas_from_driver *= 100 / 5;
716 RT_TRACE(COMP_POWER_TRACKING,
717 "Avg_TSSI_Meas_from_driver = %d\n",
718 Avg_TSSI_Meas_from_driver);
719 TSSI_13dBm = priv->TSSI_13dBm;
720 RT_TRACE(COMP_POWER_TRACKING, "TSSI_13dBm = %d\n",
723 if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
724 delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
726 delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
728 if (delta <= E_FOR_TX_POWER_TRACK) {
729 priv->rtllib->bdynamic_txpower_enable = true;
730 rtl92e_writeb(dev, Pw_Track_Flag, 0);
731 rtl92e_writeb(dev, FW_Busy_Flag, 0);
732 RT_TRACE(COMP_POWER_TRACKING,
733 "tx power track is done\n");
734 RT_TRACE(COMP_POWER_TRACKING,
735 "priv->rfa_txpowertrackingindex = %d\n",
736 priv->rfa_txpowertrackingindex);
737 RT_TRACE(COMP_POWER_TRACKING,
738 "priv->rfa_txpowertrackingindex_real = %d\n",
739 priv->rfa_txpowertrackingindex_real);
740 RT_TRACE(COMP_POWER_TRACKING,
741 "priv->CCKPresentAttentuation_difference = %d\n",
742 priv->CCKPresentAttentuation_difference);
743 RT_TRACE(COMP_POWER_TRACKING,
744 "priv->CCKPresentAttentuation = %d\n",
745 priv->CCKPresentAttentuation);
748 if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK)
749 _rtl92e_dm_tx_update_tssi_weak_signal(dev,
752 _rtl92e_dm_tx_update_tssi_strong_signal(dev, RF_Type);
754 if (RF_Type == RF_2T4R) {
755 priv->CCKPresentAttentuation_difference
756 = priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
758 priv->CCKPresentAttentuation_difference
759 = priv->rfa_txpowertrackingindex_real - priv->rfa_txpowertracking_default;
762 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
763 priv->CCKPresentAttentuation =
764 priv->CCKPresentAttentuation_20Mdefault +
765 priv->CCKPresentAttentuation_difference;
767 priv->CCKPresentAttentuation =
768 priv->CCKPresentAttentuation_40Mdefault +
769 priv->CCKPresentAttentuation_difference;
771 if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
772 priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
773 if (priv->CCKPresentAttentuation < 0)
774 priv->CCKPresentAttentuation = 0;
776 if (priv->CCKPresentAttentuation > -1 &&
777 priv->CCKPresentAttentuation < CCKTxBBGainTableLength) {
778 if (priv->rtllib->current_network.channel == 14 &&
779 !priv->bcck_in_ch14) {
780 priv->bcck_in_ch14 = true;
781 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
782 } else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14) {
783 priv->bcck_in_ch14 = false;
784 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
786 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
788 RT_TRACE(COMP_POWER_TRACKING,
789 "priv->rfa_txpowertrackingindex = %d\n",
790 priv->rfa_txpowertrackingindex);
791 RT_TRACE(COMP_POWER_TRACKING,
792 "priv->rfa_txpowertrackingindex_real = %d\n",
793 priv->rfa_txpowertrackingindex_real);
794 RT_TRACE(COMP_POWER_TRACKING,
795 "priv->CCKPresentAttentuation_difference = %d\n",
796 priv->CCKPresentAttentuation_difference);
797 RT_TRACE(COMP_POWER_TRACKING,
798 "priv->CCKPresentAttentuation = %d\n",
799 priv->CCKPresentAttentuation);
801 if (priv->CCKPresentAttentuation_difference <= -12 ||
802 priv->CCKPresentAttentuation_difference >= 24) {
803 priv->rtllib->bdynamic_txpower_enable = true;
804 rtl92e_writeb(dev, Pw_Track_Flag, 0);
805 rtl92e_writeb(dev, FW_Busy_Flag, 0);
806 RT_TRACE(COMP_POWER_TRACKING,
807 "tx power track--->limited\n");
811 rtl92e_writeb(dev, Pw_Track_Flag, 0);
812 Avg_TSSI_Meas_from_driver = 0;
813 for (k = 0; k < 5; k++)
817 rtl92e_writeb(dev, FW_Busy_Flag, 0);
819 priv->rtllib->bdynamic_txpower_enable = true;
820 rtl92e_writeb(dev, Pw_Track_Flag, 0);
823 static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev)
825 #define ThermalMeterVal 9
826 struct r8192_priv *priv = rtllib_priv(dev);
827 u32 tmpRegA, TempCCk;
828 u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
829 int i = 0, CCKSwingNeedUpdate = 0;
831 if (!priv->btxpower_trackingInit) {
832 tmpRegA = rtl92e_get_bb_reg(dev, rOFDM0_XATxIQImbalance,
834 for (i = 0; i < OFDM_Table_Length; i++) {
835 if (tmpRegA == OFDMSwingTable[i]) {
836 priv->OFDM_index[0] = (u8)i;
837 RT_TRACE(COMP_POWER_TRACKING,
838 "Initial reg0x%x = 0x%x, OFDM_index = 0x%x\n",
839 rOFDM0_XATxIQImbalance, tmpRegA,
840 priv->OFDM_index[0]);
844 TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1, bMaskByte2);
845 for (i = 0; i < CCK_Table_length; i++) {
846 if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) {
847 priv->CCK_index = (u8) i;
848 RT_TRACE(COMP_POWER_TRACKING,
849 "Initial reg0x%x = 0x%x, CCK_index = 0x%x\n",
850 rCCK0_TxFilter1, TempCCk,
855 priv->btxpower_trackingInit = true;
859 tmpRegA = rtl92e_get_rf_reg(dev, RF90_PATH_A, 0x12, 0x078);
860 RT_TRACE(COMP_POWER_TRACKING, "Readback ThermalMeterA = %d\n", tmpRegA);
861 if (tmpRegA < 3 || tmpRegA > 13)
865 RT_TRACE(COMP_POWER_TRACKING, "Valid ThermalMeterA = %d\n", tmpRegA);
866 priv->ThermalMeter[0] = ThermalMeterVal;
867 priv->ThermalMeter[1] = ThermalMeterVal;
869 if (priv->ThermalMeter[0] >= (u8)tmpRegA) {
870 tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0] -
872 tmpCCK40Mindex = tmpCCK20Mindex - 6;
873 if (tmpOFDMindex >= OFDM_Table_Length)
874 tmpOFDMindex = OFDM_Table_Length-1;
875 if (tmpCCK20Mindex >= CCK_Table_length)
876 tmpCCK20Mindex = CCK_Table_length-1;
877 if (tmpCCK40Mindex >= CCK_Table_length)
878 tmpCCK40Mindex = CCK_Table_length-1;
880 tmpval = (u8)tmpRegA - priv->ThermalMeter[0];
885 tmpOFDMindex = 6 - tmpval;
886 tmpCCK20Mindex = 6 - tmpval;
890 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
891 tmpCCKindex = tmpCCK40Mindex;
893 tmpCCKindex = tmpCCK20Mindex;
895 priv->Record_CCK_20Mindex = tmpCCK20Mindex;
896 priv->Record_CCK_40Mindex = tmpCCK40Mindex;
897 RT_TRACE(COMP_POWER_TRACKING,
898 "Record_CCK_20Mindex / Record_CCK_40Mindex = %d / %d.\n",
899 priv->Record_CCK_20Mindex, priv->Record_CCK_40Mindex);
901 if (priv->rtllib->current_network.channel == 14 &&
902 !priv->bcck_in_ch14) {
903 priv->bcck_in_ch14 = true;
904 CCKSwingNeedUpdate = 1;
905 } else if (priv->rtllib->current_network.channel != 14 &&
906 priv->bcck_in_ch14) {
907 priv->bcck_in_ch14 = false;
908 CCKSwingNeedUpdate = 1;
911 if (priv->CCK_index != tmpCCKindex) {
912 priv->CCK_index = tmpCCKindex;
913 CCKSwingNeedUpdate = 1;
916 if (CCKSwingNeedUpdate)
917 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
918 if (priv->OFDM_index[0] != tmpOFDMindex) {
919 priv->OFDM_index[0] = tmpOFDMindex;
920 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
921 OFDMSwingTable[priv->OFDM_index[0]]);
922 RT_TRACE(COMP_POWER_TRACKING, "Update OFDMSwing[%d] = 0x%x\n",
924 OFDMSwingTable[priv->OFDM_index[0]]);
926 priv->txpower_count = 0;
929 void rtl92e_dm_txpower_tracking_wq(void *data)
931 struct r8192_priv *priv = container_of_dwork_rsl(data,
932 struct r8192_priv, txpower_tracking_wq);
933 struct net_device *dev = priv->rtllib->dev;
935 if (priv->IC_Cut >= IC_VersionCut_D)
936 _rtl92e_dm_tx_power_tracking_callback_tssi(dev);
938 _rtl92e_dm_tx_power_tracking_cb_thermal(dev);
941 static void _rtl92e_dm_initialize_tx_power_tracking_tssi(struct net_device *dev)
944 struct r8192_priv *priv = rtllib_priv(dev);
946 priv->btxpower_tracking = true;
947 priv->txpower_count = 0;
948 priv->btxpower_trackingInit = false;
952 static void _rtl92e_dm_init_tx_power_tracking_thermal(struct net_device *dev)
954 struct r8192_priv *priv = rtllib_priv(dev);
957 if (priv->rtllib->FwRWRF)
958 priv->btxpower_tracking = true;
960 priv->btxpower_tracking = false;
961 priv->txpower_count = 0;
962 priv->btxpower_trackingInit = false;
963 RT_TRACE(COMP_POWER_TRACKING, "pMgntInfo->bTXPowerTracking = %d\n",
964 priv->btxpower_tracking);
967 void rtl92e_dm_init_txpower_tracking(struct net_device *dev)
969 struct r8192_priv *priv = rtllib_priv(dev);
971 if (priv->IC_Cut >= IC_VersionCut_D)
972 _rtl92e_dm_initialize_tx_power_tracking_tssi(dev);
974 _rtl92e_dm_init_tx_power_tracking_thermal(dev);
977 static void _rtl92e_dm_check_tx_power_tracking_tssi(struct net_device *dev)
979 struct r8192_priv *priv = rtllib_priv(dev);
980 static u32 tx_power_track_counter;
982 RT_TRACE(COMP_POWER_TRACKING, "%s()\n", __func__);
983 if (rtl92e_readb(dev, 0x11e) == 1)
985 if (!priv->btxpower_tracking)
987 tx_power_track_counter++;
990 if (tx_power_track_counter >= 180) {
991 schedule_delayed_work(&priv->txpower_tracking_wq, 0);
992 tx_power_track_counter = 0;
997 static void _rtl92e_dm_check_tx_power_tracking_thermal(struct net_device *dev)
999 struct r8192_priv *priv = rtllib_priv(dev);
1000 static u8 TM_Trigger;
1001 u8 TxPowerCheckCnt = 0;
1003 if (IS_HARDWARE_TYPE_8192SE(dev))
1004 TxPowerCheckCnt = 5;
1006 TxPowerCheckCnt = 2;
1007 if (!priv->btxpower_tracking)
1010 if (priv->txpower_count <= TxPowerCheckCnt) {
1011 priv->txpower_count++;
1016 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1017 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1018 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1019 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1023 netdev_info(dev, "===============>Schedule TxPowerTrackingWorkItem\n");
1024 schedule_delayed_work(&priv->txpower_tracking_wq, 0);
1029 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev)
1031 struct r8192_priv *priv = rtllib_priv(dev);
1033 if (priv->IC_Cut >= IC_VersionCut_D)
1034 _rtl92e_dm_check_tx_power_tracking_tssi(dev);
1036 _rtl92e_dm_check_tx_power_tracking_thermal(dev);
1039 static void _rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device *dev,
1043 struct r8192_priv *priv = rtllib_priv(dev);
1044 u8 attenuation = (u8)priv->CCKPresentAttentuation;
1048 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][0] +
1049 (dm_cck_tx_bb_gain[attenuation][1] << 8));
1051 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1052 TempVal = (u32)((dm_cck_tx_bb_gain[attenuation][2]) +
1053 (dm_cck_tx_bb_gain[attenuation][3] << 8) +
1054 (dm_cck_tx_bb_gain[attenuation][4] << 16)+
1055 (dm_cck_tx_bb_gain[attenuation][5] << 24));
1056 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1057 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][6] +
1058 (dm_cck_tx_bb_gain[attenuation][7] << 8));
1060 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1062 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][0]) +
1063 (dm_cck_tx_bb_gain_ch14[attenuation][1] << 8));
1065 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1066 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][2]) +
1067 (dm_cck_tx_bb_gain_ch14[attenuation][3] << 8) +
1068 (dm_cck_tx_bb_gain_ch14[attenuation][4] << 16)+
1069 (dm_cck_tx_bb_gain_ch14[attenuation][5] << 24));
1070 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1071 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][6]) +
1072 (dm_cck_tx_bb_gain_ch14[attenuation][7] << 8));
1074 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1078 static void _rtl92e_dm_cck_tx_power_adjust_thermal_meter(struct net_device *dev,
1082 struct r8192_priv *priv = rtllib_priv(dev);
1086 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
1087 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1] << 8);
1088 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1089 RT_TRACE(COMP_POWER_TRACKING,
1090 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter1,
1092 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
1093 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3] << 8) +
1094 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4] << 16)+
1095 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5] << 24);
1096 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1097 RT_TRACE(COMP_POWER_TRACKING,
1098 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter2,
1100 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
1101 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7] << 8);
1103 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1104 RT_TRACE(COMP_POWER_TRACKING,
1105 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_DebugPort,
1108 TempVal = CCKSwingTable_Ch14[priv->CCK_index][0] +
1109 (CCKSwingTable_Ch14[priv->CCK_index][1] << 8);
1111 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1112 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1113 rCCK0_TxFilter1, TempVal);
1114 TempVal = CCKSwingTable_Ch14[priv->CCK_index][2] +
1115 (CCKSwingTable_Ch14[priv->CCK_index][3] << 8) +
1116 (CCKSwingTable_Ch14[priv->CCK_index][4] << 16)+
1117 (CCKSwingTable_Ch14[priv->CCK_index][5] << 24);
1118 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1119 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1120 rCCK0_TxFilter2, TempVal);
1121 TempVal = CCKSwingTable_Ch14[priv->CCK_index][6] +
1122 (CCKSwingTable_Ch14[priv->CCK_index][7]<<8);
1124 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1125 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1126 rCCK0_DebugPort, TempVal);
1130 void rtl92e_dm_cck_txpower_adjust(struct net_device *dev, bool binch14)
1132 struct r8192_priv *priv = rtllib_priv(dev);
1134 if (priv->IC_Cut >= IC_VersionCut_D)
1135 _rtl92e_dm_cck_tx_power_adjust_tssi(dev, binch14);
1137 _rtl92e_dm_cck_tx_power_adjust_thermal_meter(dev, binch14);
1140 static void _rtl92e_dm_tx_power_reset_recovery(struct net_device *dev)
1142 struct r8192_priv *priv = rtllib_priv(dev);
1144 RT_TRACE(COMP_POWER_TRACKING, "Start Reset Recovery ==>\n");
1145 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
1146 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1147 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc80 is %08x\n",
1148 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1149 RT_TRACE(COMP_POWER_TRACKING,
1150 "Reset Recovery: Fill in RFA_txPowerTrackingIndex is %x\n",
1151 priv->rfa_txpowertrackingindex);
1152 RT_TRACE(COMP_POWER_TRACKING,
1153 "Reset Recovery : RF A I/Q Amplify Gain is %d\n",
1154 dm_tx_bb_gain_idx_to_amplify(priv->rfa_txpowertrackingindex));
1155 RT_TRACE(COMP_POWER_TRACKING,
1156 "Reset Recovery: CCK Attenuation is %d dB\n",
1157 priv->CCKPresentAttentuation);
1158 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1160 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord,
1161 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1162 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc90 is %08x\n",
1163 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1164 RT_TRACE(COMP_POWER_TRACKING,
1165 "Reset Recovery: Fill in RFC_txPowerTrackingIndex is %x\n",
1166 priv->rfc_txpowertrackingindex);
1167 RT_TRACE(COMP_POWER_TRACKING,
1168 "Reset Recovery : RF C I/Q Amplify Gain is %d\n",
1169 dm_tx_bb_gain_idx_to_amplify(priv->rfc_txpowertrackingindex));
1172 void rtl92e_dm_restore_state(struct net_device *dev)
1174 struct r8192_priv *priv = rtllib_priv(dev);
1175 u32 reg_ratr = priv->rate_adaptive.last_ratr;
1180 "<---- %s: driver is going to unload\n", __func__);
1184 if (priv->rate_adaptive.rate_adaptive_disabled)
1186 if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
1187 priv->rtllib->mode == WIRELESS_MODE_N_5G))
1189 ratr_value = reg_ratr;
1190 if (priv->rf_type == RF_1T2R)
1191 ratr_value &= ~(RATE_ALL_OFDM_2SS);
1192 rtl92e_writel(dev, RATR0, ratr_value);
1193 rtl92e_writeb(dev, UFWP, 1);
1194 if (priv->btxpower_trackingInit && priv->btxpower_tracking)
1195 _rtl92e_dm_tx_power_reset_recovery(dev);
1197 _rtl92e_dm_bb_initialgain_restore(dev);
1201 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev)
1203 struct r8192_priv *priv = rtllib_priv(dev);
1204 u32 bit_mask = 0x7f;
1206 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1209 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1210 rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask,
1211 (u32)priv->initgain_backup.xaagccore1);
1212 rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask,
1213 (u32)priv->initgain_backup.xbagccore1);
1214 rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask,
1215 (u32)priv->initgain_backup.xcagccore1);
1216 rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask,
1217 (u32)priv->initgain_backup.xdagccore1);
1218 bit_mask = bMaskByte2;
1219 rtl92e_set_bb_reg(dev, rCCK0_CCA, bit_mask,
1220 (u32)priv->initgain_backup.cca);
1222 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc50 is %x\n",
1223 priv->initgain_backup.xaagccore1);
1224 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc58 is %x\n",
1225 priv->initgain_backup.xbagccore1);
1226 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc60 is %x\n",
1227 priv->initgain_backup.xcagccore1);
1228 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc68 is %x\n",
1229 priv->initgain_backup.xdagccore1);
1230 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xa0a is %x\n",
1231 priv->initgain_backup.cca);
1232 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1236 void rtl92e_dm_backup_state(struct net_device *dev)
1238 struct r8192_priv *priv = rtllib_priv(dev);
1239 u32 bit_mask = bMaskByte0;
1241 priv->bswitch_fsync = false;
1242 priv->bfsync_processing = false;
1244 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1247 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1248 priv->initgain_backup.xaagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask);
1249 priv->initgain_backup.xbagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask);
1250 priv->initgain_backup.xcagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask);
1251 priv->initgain_backup.xdagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask);
1252 bit_mask = bMaskByte2;
1253 priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, bit_mask);
1255 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc50 is %x\n",
1256 priv->initgain_backup.xaagccore1);
1257 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc58 is %x\n",
1258 priv->initgain_backup.xbagccore1);
1259 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc60 is %x\n",
1260 priv->initgain_backup.xcagccore1);
1261 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc68 is %x\n",
1262 priv->initgain_backup.xdagccore1);
1263 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xa0a is %x\n",
1264 priv->initgain_backup.cca);
1267 static void _rtl92e_dm_dig_init(struct net_device *dev)
1269 struct r8192_priv *priv = rtllib_priv(dev);
1271 dm_digtable.dig_enable_flag = true;
1273 dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
1275 dm_digtable.dig_algorithm_switch = 0;
1277 dm_digtable.dig_state = DM_STA_DIG_MAX;
1278 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1279 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1280 dm_digtable.PreSTAConnectState = DIG_STA_DISCONNECT;
1282 dm_digtable.rssi_low_thresh = DM_DIG_THRESH_LOW;
1283 dm_digtable.rssi_high_thresh = DM_DIG_THRESH_HIGH;
1285 dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
1286 dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
1288 dm_digtable.rssi_val = 50;
1289 dm_digtable.backoff_val = DM_DIG_BACKOFF;
1290 dm_digtable.rx_gain_range_max = DM_DIG_MAX;
1291 if (priv->CustomerID == RT_CID_819x_Netcore)
1292 dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
1294 dm_digtable.rx_gain_range_min = DM_DIG_MIN;
1297 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev)
1300 if (dm_digtable.dig_enable_flag == false)
1303 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
1304 _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(dev);
1305 else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1306 _rtl92e_dm_ctrl_initgain_byrssi_driver(dev);
1311 /*-----------------------------------------------------------------------------
1312 * Function: dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm()
1314 * Overview: Driver monitor RSSI and False Alarm to change initial gain.
1315 Only change initial gain during link in progress.
1317 * Input: IN PADAPTER pAdapter
1325 * 03/04/2009 hpfan Create Version 0.
1327 ******************************************************************************/
1329 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev)
1331 struct r8192_priv *priv = rtllib_priv(dev);
1335 if (dm_digtable.dig_enable_flag == false)
1338 if (dm_digtable.dig_algorithm_switch)
1341 for (i = 0; i < 3; i++)
1342 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1344 dm_digtable.dig_state = DM_STA_DIG_OFF;
1347 if (priv->rtllib->state == RTLLIB_LINKED)
1348 dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
1350 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1353 dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
1354 _rtl92e_dm_initial_gain(dev);
1355 _rtl92e_dm_pd_th(dev);
1356 _rtl92e_dm_cs_ratio(dev);
1357 if (dm_digtable.dig_algorithm_switch)
1358 dm_digtable.dig_algorithm_switch = 0;
1359 dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
1363 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev)
1365 struct r8192_priv *priv = rtllib_priv(dev);
1366 static u32 reset_cnt;
1369 if (dm_digtable.dig_enable_flag == false)
1372 if (dm_digtable.dig_algorithm_switch) {
1373 dm_digtable.dig_state = DM_STA_DIG_MAX;
1374 for (i = 0; i < 3; i++)
1375 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1376 dm_digtable.dig_algorithm_switch = 0;
1379 if (priv->rtllib->state != RTLLIB_LINKED)
1382 if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
1383 (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
1385 if (priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh) {
1386 if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
1387 (priv->reset_count == reset_cnt))
1389 reset_cnt = priv->reset_count;
1391 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1392 dm_digtable.dig_state = DM_STA_DIG_OFF;
1394 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1396 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x17);
1397 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x17);
1398 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x17);
1399 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x17);
1401 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1402 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1404 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1406 rtl92e_writeb(dev, 0xa0a, 0x08);
1411 if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
1414 if (dm_digtable.dig_state == DM_STA_DIG_ON &&
1415 (priv->reset_count == reset_cnt)) {
1416 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1419 if (priv->reset_count != reset_cnt)
1422 reset_cnt = priv->reset_count;
1424 dm_digtable.dig_state = DM_STA_DIG_ON;
1426 if (reset_flag == 1) {
1427 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x2c);
1428 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x2c);
1429 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x2c);
1430 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x2c);
1432 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x20);
1433 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x20);
1434 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x20);
1435 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x20);
1438 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1439 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1441 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1443 rtl92e_writeb(dev, 0xa0a, 0xcd);
1445 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1447 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1451 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev)
1453 struct r8192_priv *priv = rtllib_priv(dev);
1454 static u32 reset_cnt_highpwr;
1456 if ((priv->undecorated_smoothed_pwdb >
1457 dm_digtable.rssi_high_power_lowthresh) &&
1458 (priv->undecorated_smoothed_pwdb <
1459 dm_digtable.rssi_high_power_highthresh))
1462 if (priv->undecorated_smoothed_pwdb >=
1463 dm_digtable.rssi_high_power_highthresh) {
1464 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
1465 (priv->reset_count == reset_cnt_highpwr))
1467 dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
1469 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1470 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1472 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1474 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF &&
1475 (priv->reset_count == reset_cnt_highpwr))
1477 dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
1479 if ((priv->undecorated_smoothed_pwdb <
1480 dm_digtable.rssi_high_power_lowthresh) &&
1481 (priv->undecorated_smoothed_pwdb >=
1482 dm_digtable.rssi_high_thresh)) {
1483 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1484 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1486 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1489 reset_cnt_highpwr = priv->reset_count;
1492 static void _rtl92e_dm_initial_gain(struct net_device *dev)
1494 struct r8192_priv *priv = rtllib_priv(dev);
1495 u8 initial_gain = 0;
1496 static u8 initialized, force_write;
1497 static u32 reset_cnt;
1499 if (dm_digtable.dig_algorithm_switch) {
1504 if (rtllib_act_scanning(priv->rtllib, true) == true) {
1509 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1510 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1511 long gain_range = dm_digtable.rssi_val + 10 -
1512 dm_digtable.backoff_val;
1513 gain_range = clamp_t(long, gain_range,
1514 dm_digtable.rx_gain_range_min,
1515 dm_digtable.rx_gain_range_max);
1516 dm_digtable.cur_ig_value = gain_range;
1518 if (dm_digtable.cur_ig_value == 0)
1519 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1521 dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
1524 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1525 dm_digtable.pre_ig_value = 0;
1528 if (priv->reset_count != reset_cnt) {
1530 reset_cnt = priv->reset_count;
1533 if (dm_digtable.pre_ig_value != rtl92e_readb(dev, rOFDM0_XAAGCCore1))
1536 if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
1537 || !initialized || force_write) {
1538 initial_gain = (u8)dm_digtable.cur_ig_value;
1539 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain);
1540 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain);
1541 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain);
1542 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, initial_gain);
1543 dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
1549 static void _rtl92e_dm_pd_th(struct net_device *dev)
1551 struct r8192_priv *priv = rtllib_priv(dev);
1552 static u8 initialized, force_write;
1553 static u32 reset_cnt;
1555 if (dm_digtable.dig_algorithm_switch) {
1560 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1561 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1562 if (dm_digtable.rssi_val >=
1563 dm_digtable.rssi_high_power_highthresh)
1564 dm_digtable.curpd_thstate =
1565 DIG_PD_AT_HIGH_POWER;
1566 else if (dm_digtable.rssi_val <=
1567 dm_digtable.rssi_low_thresh)
1568 dm_digtable.curpd_thstate =
1569 DIG_PD_AT_LOW_POWER;
1570 else if ((dm_digtable.rssi_val >=
1571 dm_digtable.rssi_high_thresh) &&
1572 (dm_digtable.rssi_val <
1573 dm_digtable.rssi_high_power_lowthresh))
1574 dm_digtable.curpd_thstate =
1575 DIG_PD_AT_NORMAL_POWER;
1577 dm_digtable.curpd_thstate =
1578 dm_digtable.prepd_thstate;
1580 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1583 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1586 if (priv->reset_count != reset_cnt) {
1588 reset_cnt = priv->reset_count;
1591 if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
1592 (initialized <= 3) || force_write) {
1593 if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER) {
1594 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1595 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1597 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1598 } else if (dm_digtable.curpd_thstate ==
1599 DIG_PD_AT_NORMAL_POWER) {
1600 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1601 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1603 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1604 } else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER) {
1605 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1606 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1608 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1610 dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
1611 if (initialized <= 3)
1617 static void _rtl92e_dm_cs_ratio(struct net_device *dev)
1619 struct r8192_priv *priv = rtllib_priv(dev);
1620 static u8 initialized, force_write;
1621 static u32 reset_cnt;
1623 if (dm_digtable.dig_algorithm_switch) {
1628 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1629 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1630 if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
1631 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1632 else if (dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh)
1633 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
1635 dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
1637 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1640 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1643 if (priv->reset_count != reset_cnt) {
1645 reset_cnt = priv->reset_count;
1649 if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
1650 !initialized || force_write) {
1651 if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER)
1652 rtl92e_writeb(dev, 0xa0a, 0x08);
1653 else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER)
1654 rtl92e_writeb(dev, 0xa0a, 0xcd);
1655 dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
1661 void rtl92e_dm_init_edca_turbo(struct net_device *dev)
1663 struct r8192_priv *priv = rtllib_priv(dev);
1665 priv->bcurrent_turbo_EDCA = false;
1666 priv->rtllib->bis_any_nonbepkts = false;
1667 priv->bis_cur_rdlstate = false;
1670 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
1672 struct r8192_priv *priv = rtllib_priv(dev);
1673 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1675 static unsigned long lastTxOkCnt;
1676 static unsigned long lastRxOkCnt;
1677 unsigned long curTxOkCnt = 0;
1678 unsigned long curRxOkCnt = 0;
1680 if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
1681 goto dm_CheckEdcaTurbo_EXIT;
1682 if (priv->rtllib->state != RTLLIB_LINKED)
1683 goto dm_CheckEdcaTurbo_EXIT;
1684 if (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO)
1685 goto dm_CheckEdcaTurbo_EXIT;
1687 if (!priv->rtllib->bis_any_nonbepkts) {
1688 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1689 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1690 if (pHTInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX) {
1691 if (curTxOkCnt > 4*curRxOkCnt) {
1692 if (priv->bis_cur_rdlstate ||
1693 !priv->bcurrent_turbo_EDCA) {
1694 rtl92e_writel(dev, EDCAPARA_BE,
1695 edca_setting_UL[pHTInfo->IOTPeer]);
1696 priv->bis_cur_rdlstate = false;
1699 if (!priv->bis_cur_rdlstate ||
1700 !priv->bcurrent_turbo_EDCA) {
1701 if (priv->rtllib->mode == WIRELESS_MODE_G)
1702 rtl92e_writel(dev, EDCAPARA_BE,
1703 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1705 rtl92e_writel(dev, EDCAPARA_BE,
1706 edca_setting_DL[pHTInfo->IOTPeer]);
1707 priv->bis_cur_rdlstate = true;
1710 priv->bcurrent_turbo_EDCA = true;
1712 if (curRxOkCnt > 4*curTxOkCnt) {
1713 if (!priv->bis_cur_rdlstate ||
1714 !priv->bcurrent_turbo_EDCA) {
1715 if (priv->rtllib->mode == WIRELESS_MODE_G)
1716 rtl92e_writel(dev, EDCAPARA_BE,
1717 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1719 rtl92e_writel(dev, EDCAPARA_BE,
1720 edca_setting_DL[pHTInfo->IOTPeer]);
1721 priv->bis_cur_rdlstate = true;
1724 if (priv->bis_cur_rdlstate ||
1725 !priv->bcurrent_turbo_EDCA) {
1726 rtl92e_writel(dev, EDCAPARA_BE,
1727 edca_setting_UL[pHTInfo->IOTPeer]);
1728 priv->bis_cur_rdlstate = false;
1733 priv->bcurrent_turbo_EDCA = true;
1736 if (priv->bcurrent_turbo_EDCA) {
1739 priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM,
1741 priv->bcurrent_turbo_EDCA = false;
1746 dm_CheckEdcaTurbo_EXIT:
1747 priv->rtllib->bis_any_nonbepkts = false;
1748 lastTxOkCnt = priv->stats.txbytesunicast;
1749 lastRxOkCnt = priv->stats.rxbytesunicast;
1752 static void _rtl92e_dm_init_cts_to_self(struct net_device *dev)
1754 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1756 priv->rtllib->bCTSToSelfEnable = true;
1759 static void _rtl92e_dm_cts_to_self(struct net_device *dev)
1761 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1762 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1763 static unsigned long lastTxOkCnt;
1764 static unsigned long lastRxOkCnt;
1765 unsigned long curTxOkCnt = 0;
1766 unsigned long curRxOkCnt = 0;
1768 if (priv->rtllib->bCTSToSelfEnable != true) {
1769 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1772 if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
1773 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1774 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1775 if (curRxOkCnt > 4*curTxOkCnt)
1776 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1778 pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
1780 lastTxOkCnt = priv->stats.txbytesunicast;
1781 lastRxOkCnt = priv->stats.rxbytesunicast;
1786 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev)
1788 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1789 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1791 pHTInfo->bWAIotBroadcom = false;
1792 pHTInfo->WAIotTH = WAIotTHVal;
1795 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data)
1797 struct r8192_priv *priv = container_of_dwork_rsl(data,
1798 struct r8192_priv, gpio_change_rf_wq);
1799 struct net_device *dev = priv->rtllib->dev;
1801 enum rt_rf_power_state eRfPowerStateToSet;
1802 bool bActuallySet = false;
1804 static char const RadioPowerPath[] = "/etc/acpi/events/RadioPower.sh";
1805 static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin",
1808 bActuallySet = false;
1810 if ((priv->up_first_time == 1) || (priv->being_init_adapter))
1813 if (priv->bfirst_after_down) {
1814 priv->bfirst_after_down = true;
1818 tmp1byte = rtl92e_readb(dev, GPI);
1820 eRfPowerStateToSet = (tmp1byte&BIT1) ? eRfOn : eRfOff;
1822 if (priv->bHwRadioOff && (eRfPowerStateToSet == eRfOn)) {
1823 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio ON\n");
1824 netdev_info(dev, "gpiochangeRF - HW Radio ON\n");
1825 priv->bHwRadioOff = false;
1826 bActuallySet = true;
1827 } else if (!priv->bHwRadioOff && (eRfPowerStateToSet == eRfOff)) {
1828 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio OFF\n");
1829 netdev_info(dev, "gpiochangeRF - HW Radio OFF\n");
1830 priv->bHwRadioOff = true;
1831 bActuallySet = true;
1836 priv->bHwRfOffAction = 1;
1837 rtl92e_set_rf_state(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
1838 if (priv->bHwRadioOff)
1843 argv[0] = (char *)RadioPowerPath;
1845 call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
1849 void rtl92e_dm_rf_pathcheck_wq(void *data)
1851 struct r8192_priv *priv = container_of_dwork_rsl(data,
1854 struct net_device *dev = priv->rtllib->dev;
1857 rfpath = rtl92e_readb(dev, 0xc04);
1859 for (i = 0; i < RF90_PATH_MAX; i++) {
1860 if (rfpath & (0x01<<i))
1861 priv->brfpath_rxenable[i] = true;
1863 priv->brfpath_rxenable[i] = false;
1865 if (!DM_RxPathSelTable.Enable)
1868 _rtl92e_dm_rx_path_sel_byrssi(dev);
1871 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev)
1874 struct r8192_priv *priv = rtllib_priv(dev);
1876 DM_RxPathSelTable.Enable = 1;
1877 DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
1878 DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
1879 if (priv->CustomerID == RT_CID_819x_Netcore)
1880 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1882 DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
1883 DM_RxPathSelTable.disabledRF = 0;
1884 for (i = 0; i < 4; i++) {
1885 DM_RxPathSelTable.rf_rssi[i] = 50;
1886 DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
1887 DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
1891 #define PWDB_IN_RANGE ((cur_cck_pwdb < tmp_cck_max_pwdb) && \
1892 (cur_cck_pwdb > tmp_cck_sec_pwdb))
1894 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev)
1896 struct r8192_priv *priv = rtllib_priv(dev);
1897 u8 i, max_rssi_index = 0, min_rssi_index = 0;
1898 u8 sec_rssi_index = 0, rf_num = 0;
1899 u8 tmp_max_rssi = 0, tmp_min_rssi = 0, tmp_sec_rssi = 0;
1900 u8 cck_default_Rx = 0x2;
1901 u8 cck_optional_Rx = 0x3;
1902 long tmp_cck_max_pwdb = 0, tmp_cck_min_pwdb = 0, tmp_cck_sec_pwdb = 0;
1903 u8 cck_rx_ver2_max_index = 0;
1904 u8 cck_rx_ver2_sec_index = 0;
1907 static u8 disabled_rf_cnt, cck_Rx_Path_initialized;
1908 u8 update_cck_rx_path;
1910 if (priv->rf_type != RF_2T4R)
1913 if (!cck_Rx_Path_initialized) {
1914 DM_RxPathSelTable.cck_Rx_path = (rtl92e_readb(dev, 0xa07)&0xf);
1915 cck_Rx_Path_initialized = 1;
1918 DM_RxPathSelTable.disabledRF = 0xf;
1919 DM_RxPathSelTable.disabledRF &= ~(rtl92e_readb(dev, 0xc04));
1921 if (priv->rtllib->mode == WIRELESS_MODE_B)
1922 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1924 for (i = 0; i < RF90_PATH_MAX; i++) {
1925 DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
1927 if (priv->brfpath_rxenable[i]) {
1929 cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
1932 max_rssi_index = min_rssi_index = sec_rssi_index = i;
1933 tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
1934 } else if (rf_num == 2) {
1935 if (cur_rf_rssi >= tmp_max_rssi) {
1936 tmp_max_rssi = cur_rf_rssi;
1939 tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
1940 sec_rssi_index = min_rssi_index = i;
1943 if (cur_rf_rssi > tmp_max_rssi) {
1944 tmp_sec_rssi = tmp_max_rssi;
1945 sec_rssi_index = max_rssi_index;
1946 tmp_max_rssi = cur_rf_rssi;
1948 } else if (cur_rf_rssi == tmp_max_rssi) {
1949 tmp_sec_rssi = cur_rf_rssi;
1951 } else if ((cur_rf_rssi < tmp_max_rssi) &&
1952 (cur_rf_rssi > tmp_sec_rssi)) {
1953 tmp_sec_rssi = cur_rf_rssi;
1955 } else if (cur_rf_rssi == tmp_sec_rssi) {
1956 if (tmp_sec_rssi == tmp_min_rssi) {
1957 tmp_sec_rssi = cur_rf_rssi;
1960 } else if ((cur_rf_rssi < tmp_sec_rssi) &&
1961 (cur_rf_rssi > tmp_min_rssi)) {
1963 } else if (cur_rf_rssi == tmp_min_rssi) {
1964 if (tmp_sec_rssi == tmp_min_rssi) {
1965 tmp_min_rssi = cur_rf_rssi;
1968 } else if (cur_rf_rssi < tmp_min_rssi) {
1969 tmp_min_rssi = cur_rf_rssi;
1977 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
1978 for (i = 0; i < RF90_PATH_MAX; i++) {
1979 if (priv->brfpath_rxenable[i]) {
1982 DM_RxPathSelTable.cck_pwdb_sta[i];
1985 cck_rx_ver2_max_index = i;
1986 cck_rx_ver2_sec_index = i;
1987 tmp_cck_max_pwdb = cur_cck_pwdb;
1988 tmp_cck_min_pwdb = cur_cck_pwdb;
1989 tmp_cck_sec_pwdb = cur_cck_pwdb;
1990 } else if (rf_num == 2) {
1991 if (cur_cck_pwdb >= tmp_cck_max_pwdb) {
1992 tmp_cck_max_pwdb = cur_cck_pwdb;
1993 cck_rx_ver2_max_index = i;
1995 tmp_cck_sec_pwdb = cur_cck_pwdb;
1996 tmp_cck_min_pwdb = cur_cck_pwdb;
1997 cck_rx_ver2_sec_index = i;
2000 if (cur_cck_pwdb > tmp_cck_max_pwdb) {
2003 cck_rx_ver2_sec_index =
2004 cck_rx_ver2_max_index;
2005 tmp_cck_max_pwdb = cur_cck_pwdb;
2006 cck_rx_ver2_max_index = i;
2007 } else if (cur_cck_pwdb ==
2009 tmp_cck_sec_pwdb = cur_cck_pwdb;
2010 cck_rx_ver2_sec_index = i;
2011 } else if (PWDB_IN_RANGE) {
2012 tmp_cck_sec_pwdb = cur_cck_pwdb;
2013 cck_rx_ver2_sec_index = i;
2014 } else if (cur_cck_pwdb ==
2016 if (tmp_cck_sec_pwdb ==
2020 cck_rx_ver2_sec_index =
2023 } else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) &&
2024 (cur_cck_pwdb > tmp_cck_min_pwdb)) {
2026 } else if (cur_cck_pwdb == tmp_cck_min_pwdb) {
2027 if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb)
2028 tmp_cck_min_pwdb = cur_cck_pwdb;
2029 } else if (cur_cck_pwdb < tmp_cck_min_pwdb) {
2030 tmp_cck_min_pwdb = cur_cck_pwdb;
2038 update_cck_rx_path = 0;
2039 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
2040 cck_default_Rx = cck_rx_ver2_max_index;
2041 cck_optional_Rx = cck_rx_ver2_sec_index;
2042 if (tmp_cck_max_pwdb != -64)
2043 update_cck_rx_path = 1;
2046 if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2) {
2047 if ((tmp_max_rssi - tmp_min_rssi) >=
2048 DM_RxPathSelTable.diff_TH) {
2049 DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] =
2051 rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable,
2052 0x1<<min_rssi_index, 0x0);
2053 rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable,
2054 0x1<<min_rssi_index, 0x0);
2057 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1) {
2058 cck_default_Rx = max_rssi_index;
2059 cck_optional_Rx = sec_rssi_index;
2061 update_cck_rx_path = 1;
2065 if (update_cck_rx_path) {
2066 DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2) |
2068 rtl92e_set_bb_reg(dev, rCCK0_AFESetting, 0x0f000000,
2069 DM_RxPathSelTable.cck_Rx_path);
2072 if (DM_RxPathSelTable.disabledRF) {
2073 for (i = 0; i < 4; i++) {
2074 if ((DM_RxPathSelTable.disabledRF>>i) & 0x1) {
2076 DM_RxPathSelTable.rf_enable_rssi_th[i]) {
2077 rtl92e_set_bb_reg(dev,
2078 rOFDM0_TRxPathEnable,
2080 rtl92e_set_bb_reg(dev,
2081 rOFDM1_TRxPathEnable,
2083 DM_RxPathSelTable.rf_enable_rssi_th[i]
2092 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev)
2094 struct r8192_priv *priv = rtllib_priv(dev);
2096 schedule_delayed_work(&priv->rfpath_check_wq, 0);
2100 static void _rtl92e_dm_init_fsync(struct net_device *dev)
2102 struct r8192_priv *priv = rtllib_priv(dev);
2104 priv->rtllib->fsync_time_interval = 500;
2105 priv->rtllib->fsync_rate_bitmap = 0x0f000800;
2106 priv->rtllib->fsync_rssi_threshold = 30;
2107 priv->rtllib->bfsync_enable = false;
2108 priv->rtllib->fsync_multiple_timeinterval = 3;
2109 priv->rtllib->fsync_firstdiff_ratethreshold = 100;
2110 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2111 priv->rtllib->fsync_state = Default_Fsync;
2112 priv->framesyncMonitor = 1;
2114 timer_setup(&priv->fsync_timer, _rtl92e_dm_fsync_timer_callback, 0);
2118 static void _rtl92e_dm_deinit_fsync(struct net_device *dev)
2120 struct r8192_priv *priv = rtllib_priv(dev);
2122 del_timer_sync(&priv->fsync_timer);
2125 static void _rtl92e_dm_fsync_timer_callback(struct timer_list *t)
2127 struct r8192_priv *priv = from_timer(priv, t, fsync_timer);
2128 struct net_device *dev = priv->rtllib->dev;
2129 u32 rate_index, rate_count = 0, rate_count_diff = 0;
2130 bool bSwitchFromCountDiff = false;
2131 bool bDoubleTimeInterval = false;
2133 if (priv->rtllib->state == RTLLIB_LINKED &&
2134 priv->rtllib->bfsync_enable &&
2135 (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC)) {
2138 for (rate_index = 0; rate_index <= 27; rate_index++) {
2139 rate_bitmap = 1 << rate_index;
2140 if (priv->rtllib->fsync_rate_bitmap & rate_bitmap)
2142 priv->stats.received_rate_histogram[1]
2146 if (rate_count < priv->rate_record)
2147 rate_count_diff = 0xffffffff - rate_count +
2150 rate_count_diff = rate_count - priv->rate_record;
2151 if (rate_count_diff < priv->rateCountDiffRecord) {
2153 u32 DiffNum = priv->rateCountDiffRecord -
2156 priv->rtllib->fsync_seconddiff_ratethreshold)
2157 priv->ContinueDiffCount++;
2159 priv->ContinueDiffCount = 0;
2161 if (priv->ContinueDiffCount >= 2) {
2162 bSwitchFromCountDiff = true;
2163 priv->ContinueDiffCount = 0;
2166 priv->ContinueDiffCount = 0;
2169 if (rate_count_diff <=
2170 priv->rtllib->fsync_firstdiff_ratethreshold) {
2171 bSwitchFromCountDiff = true;
2172 priv->ContinueDiffCount = 0;
2174 priv->rate_record = rate_count;
2175 priv->rateCountDiffRecord = rate_count_diff;
2176 RT_TRACE(COMP_HALDM,
2177 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2178 priv->rate_record, rate_count, rate_count_diff,
2179 priv->bswitch_fsync);
2180 if (priv->undecorated_smoothed_pwdb >
2181 priv->rtllib->fsync_rssi_threshold &&
2182 bSwitchFromCountDiff) {
2183 bDoubleTimeInterval = true;
2184 priv->bswitch_fsync = !priv->bswitch_fsync;
2185 if (priv->bswitch_fsync) {
2186 rtl92e_writeb(dev, 0xC36, 0x1c);
2187 rtl92e_writeb(dev, 0xC3e, 0x90);
2189 rtl92e_writeb(dev, 0xC36, 0x5c);
2190 rtl92e_writeb(dev, 0xC3e, 0x96);
2192 } else if (priv->undecorated_smoothed_pwdb <=
2193 priv->rtllib->fsync_rssi_threshold) {
2194 if (priv->bswitch_fsync) {
2195 priv->bswitch_fsync = false;
2196 rtl92e_writeb(dev, 0xC36, 0x5c);
2197 rtl92e_writeb(dev, 0xC3e, 0x96);
2200 if (bDoubleTimeInterval) {
2201 if (timer_pending(&priv->fsync_timer))
2202 del_timer_sync(&priv->fsync_timer);
2203 priv->fsync_timer.expires = jiffies +
2204 msecs_to_jiffies(priv->rtllib->fsync_time_interval *
2205 priv->rtllib->fsync_multiple_timeinterval);
2206 add_timer(&priv->fsync_timer);
2208 if (timer_pending(&priv->fsync_timer))
2209 del_timer_sync(&priv->fsync_timer);
2210 priv->fsync_timer.expires = jiffies +
2211 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2212 add_timer(&priv->fsync_timer);
2215 if (priv->bswitch_fsync) {
2216 priv->bswitch_fsync = false;
2217 rtl92e_writeb(dev, 0xC36, 0x5c);
2218 rtl92e_writeb(dev, 0xC3e, 0x96);
2220 priv->ContinueDiffCount = 0;
2221 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2223 RT_TRACE(COMP_HALDM, "ContinueDiffCount %d\n", priv->ContinueDiffCount);
2224 RT_TRACE(COMP_HALDM,
2225 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2226 priv->rate_record, rate_count, rate_count_diff,
2227 priv->bswitch_fsync);
2230 static void _rtl92e_dm_start_hw_fsync(struct net_device *dev)
2232 u8 rf_timing = 0x77;
2233 struct r8192_priv *priv = rtllib_priv(dev);
2235 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2236 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cf);
2237 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING,
2238 (u8 *)(&rf_timing));
2239 rtl92e_writeb(dev, 0xc3b, 0x41);
2242 static void _rtl92e_dm_end_hw_fsync(struct net_device *dev)
2244 u8 rf_timing = 0xaa;
2245 struct r8192_priv *priv = rtllib_priv(dev);
2247 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2248 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2249 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8 *)
2251 rtl92e_writeb(dev, 0xc3b, 0x49);
2254 static void _rtl92e_dm_end_sw_fsync(struct net_device *dev)
2256 struct r8192_priv *priv = rtllib_priv(dev);
2258 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2259 del_timer_sync(&(priv->fsync_timer));
2261 if (priv->bswitch_fsync) {
2262 priv->bswitch_fsync = false;
2264 rtl92e_writeb(dev, 0xC36, 0x5c);
2266 rtl92e_writeb(dev, 0xC3e, 0x96);
2269 priv->ContinueDiffCount = 0;
2270 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2273 static void _rtl92e_dm_start_sw_fsync(struct net_device *dev)
2275 struct r8192_priv *priv = rtllib_priv(dev);
2279 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2280 priv->rate_record = 0;
2281 priv->ContinueDiffCount = 0;
2282 priv->rateCountDiffRecord = 0;
2283 priv->bswitch_fsync = false;
2285 if (priv->rtllib->mode == WIRELESS_MODE_N_24G) {
2286 priv->rtllib->fsync_firstdiff_ratethreshold = 600;
2287 priv->rtllib->fsync_seconddiff_ratethreshold = 0xffff;
2289 priv->rtllib->fsync_firstdiff_ratethreshold = 200;
2290 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2292 for (rateIndex = 0; rateIndex <= 27; rateIndex++) {
2293 rateBitmap = 1 << rateIndex;
2294 if (priv->rtllib->fsync_rate_bitmap & rateBitmap)
2295 priv->rate_record +=
2296 priv->stats.received_rate_histogram[1]
2299 if (timer_pending(&priv->fsync_timer))
2300 del_timer_sync(&priv->fsync_timer);
2301 priv->fsync_timer.expires = jiffies +
2302 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2303 add_timer(&priv->fsync_timer);
2305 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cd);
2309 static void _rtl92e_dm_check_fsync(struct net_device *dev)
2311 #define RegC38_Default 0
2312 #define RegC38_NonFsync_Other_AP 1
2313 #define RegC38_Fsync_AP_BCM 2
2314 struct r8192_priv *priv = rtllib_priv(dev);
2315 static u8 reg_c38_State = RegC38_Default;
2316 static u32 reset_cnt;
2318 RT_TRACE(COMP_HALDM,
2319 "RSSI %d TimeInterval %d MultipleTimeInterval %d\n",
2320 priv->rtllib->fsync_rssi_threshold,
2321 priv->rtllib->fsync_time_interval,
2322 priv->rtllib->fsync_multiple_timeinterval);
2323 RT_TRACE(COMP_HALDM,
2324 "RateBitmap 0x%x FirstDiffRateThreshold %d SecondDiffRateThreshold %d\n",
2325 priv->rtllib->fsync_rate_bitmap,
2326 priv->rtllib->fsync_firstdiff_ratethreshold,
2327 priv->rtllib->fsync_seconddiff_ratethreshold);
2329 if (priv->rtllib->state == RTLLIB_LINKED &&
2330 priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
2331 if (priv->rtllib->bfsync_enable == 0) {
2332 switch (priv->rtllib->fsync_state) {
2334 _rtl92e_dm_start_hw_fsync(dev);
2335 priv->rtllib->fsync_state = HW_Fsync;
2338 _rtl92e_dm_end_sw_fsync(dev);
2339 _rtl92e_dm_start_hw_fsync(dev);
2340 priv->rtllib->fsync_state = HW_Fsync;
2347 switch (priv->rtllib->fsync_state) {
2349 _rtl92e_dm_start_sw_fsync(dev);
2350 priv->rtllib->fsync_state = SW_Fsync;
2353 _rtl92e_dm_end_hw_fsync(dev);
2354 _rtl92e_dm_start_sw_fsync(dev);
2355 priv->rtllib->fsync_state = SW_Fsync;
2363 if (priv->framesyncMonitor) {
2364 if (reg_c38_State != RegC38_Fsync_AP_BCM) {
2365 rtl92e_writeb(dev, rOFDM0_RxDetector3, 0x95);
2367 reg_c38_State = RegC38_Fsync_AP_BCM;
2371 switch (priv->rtllib->fsync_state) {
2373 _rtl92e_dm_end_hw_fsync(dev);
2374 priv->rtllib->fsync_state = Default_Fsync;
2377 _rtl92e_dm_end_sw_fsync(dev);
2378 priv->rtllib->fsync_state = Default_Fsync;
2385 if (priv->framesyncMonitor) {
2386 if (priv->rtllib->state == RTLLIB_LINKED) {
2387 if (priv->undecorated_smoothed_pwdb <=
2389 if (reg_c38_State !=
2390 RegC38_NonFsync_Other_AP) {
2396 RegC38_NonFsync_Other_AP;
2398 } else if (priv->undecorated_smoothed_pwdb >=
2400 if (reg_c38_State) {
2404 reg_c38_State = RegC38_Default;
2408 if (reg_c38_State) {
2409 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2411 reg_c38_State = RegC38_Default;
2416 if (priv->framesyncMonitor) {
2417 if (priv->reset_count != reset_cnt) {
2418 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2420 reg_c38_State = RegC38_Default;
2421 reset_cnt = priv->reset_count;
2424 if (reg_c38_State) {
2425 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2427 reg_c38_State = RegC38_Default;
2432 /*---------------------------Define function prototype------------------------*/
2433 static void _rtl92e_dm_init_dynamic_tx_power(struct net_device *dev)
2435 struct r8192_priv *priv = rtllib_priv(dev);
2437 priv->rtllib->bdynamic_txpower_enable = true;
2438 priv->bLastDTPFlag_High = false;
2439 priv->bLastDTPFlag_Low = false;
2440 priv->bDynamicTxHighPower = false;
2441 priv->bDynamicTxLowPower = false;
2444 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev)
2446 struct r8192_priv *priv = rtllib_priv(dev);
2447 unsigned int txhipower_threshhold = 0;
2448 unsigned int txlowpower_threshold = 0;
2450 if (priv->rtllib->bdynamic_txpower_enable != true) {
2451 priv->bDynamicTxHighPower = false;
2452 priv->bDynamicTxLowPower = false;
2455 if ((priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) &&
2456 (priv->rtllib->mode == IEEE_G)) {
2457 txhipower_threshhold = TX_POWER_ATHEROAP_THRESH_HIGH;
2458 txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
2460 txhipower_threshhold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
2461 txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
2464 RT_TRACE(COMP_TXAGC, "priv->undecorated_smoothed_pwdb = %ld\n",
2465 priv->undecorated_smoothed_pwdb);
2467 if (priv->rtllib->state == RTLLIB_LINKED) {
2468 if (priv->undecorated_smoothed_pwdb >= txhipower_threshhold) {
2469 priv->bDynamicTxHighPower = true;
2470 priv->bDynamicTxLowPower = false;
2472 if (priv->undecorated_smoothed_pwdb <
2473 txlowpower_threshold && priv->bDynamicTxHighPower)
2474 priv->bDynamicTxHighPower = false;
2475 if (priv->undecorated_smoothed_pwdb < 35)
2476 priv->bDynamicTxLowPower = true;
2477 else if (priv->undecorated_smoothed_pwdb >= 40)
2478 priv->bDynamicTxLowPower = false;
2481 priv->bDynamicTxHighPower = false;
2482 priv->bDynamicTxLowPower = false;
2485 if ((priv->bDynamicTxHighPower != priv->bLastDTPFlag_High) ||
2486 (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low)) {
2487 RT_TRACE(COMP_TXAGC, "SetTxPowerLevel8190() channel = %d\n",
2488 priv->rtllib->current_network.channel);
2490 rtl92e_set_tx_power(dev, priv->rtllib->current_network.channel);
2492 priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
2493 priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
2497 static void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev)
2499 struct r8192_priv *priv = rtllib_priv(dev);
2500 struct rtllib_device *ieee = priv->rtllib;
2502 ieee->softmac_stats.CurrentShowTxate = rtl92e_readb(dev,
2503 Current_Tx_Rate_Reg);
2505 ieee->softmac_stats.last_packet_rate = rtl92e_readb(dev,
2506 Initial_Tx_Rate_Reg);
2508 ieee->softmac_stats.txretrycount = rtl92e_readl(dev,
2509 Tx_Retry_Count_Reg);
2512 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev)
2514 struct r8192_priv *priv = rtllib_priv(dev);
2516 rtl92e_writeb(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb);