1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4 * This program is distributed in the hope that it will be useful, but WITHOUT
5 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
9 * The full GNU General Public License is included in this distribution in the
10 * file called LICENSE.
12 * Contact Information:
13 * wlanfae <wlanfae@realtek.com>
14 ******************************************************************************/
17 #include "r8192E_hw.h"
18 #include "r8192E_phy.h"
19 #include "r8192E_phyreg.h"
20 #include "r8190P_rtl8256.h"
21 #include "r8192E_cmdpkt.h"
23 /*---------------------------Define Local Constant---------------------------*/
24 static u32 edca_setting_DL[HT_IOT_PEER_MAX] = {
35 static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] = {
46 static u32 edca_setting_UL[HT_IOT_PEER_MAX] = {
57 const u32 dm_tx_bb_gain[TxBBGainTableLength] = {
58 0x7f8001fe, /* 12 dB */
59 0x788001e2, /* 11 dB */
94 0x10000040, /* -24 dB */
97 const u8 dm_cck_tx_bb_gain[CCKTxBBGainTableLength][8] = {
98 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
99 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
100 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
101 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
102 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
103 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
104 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
105 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
106 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
107 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
108 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
109 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
110 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
111 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
112 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
113 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
114 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
115 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
116 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
117 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
118 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
119 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
120 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
123 const u8 dm_cck_tx_bb_gain_ch14[CCKTxBBGainTableLength][8] = {
124 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
125 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
126 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
127 {0x2d, 0x2d, 0x27, 0x17, 0x00, 0x00, 0x00, 0x00},
128 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
129 {0x28, 0x28, 0x22, 0x14, 0x00, 0x00, 0x00, 0x00},
130 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
131 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
132 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
133 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
134 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
135 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
136 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
137 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
138 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
139 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
140 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
141 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
142 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
143 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
144 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
145 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
146 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
149 /*---------------------------Define Local Constant---------------------------*/
152 /*------------------------Define global variable-----------------------------*/
153 struct dig_t dm_digtable;
155 struct drx_path_sel DM_RxPathSelTable;
156 /*------------------------Define global variable-----------------------------*/
159 /*------------------------Define local variable------------------------------*/
160 /*------------------------Define local variable------------------------------*/
164 /*---------------------Define local function prototype-----------------------*/
165 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev);
167 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev);
168 static void _rtl92e_dm_bandwidth_autoswitch(struct net_device *dev);
171 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev);
173 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev);
174 static void _rtl92e_dm_dig_init(struct net_device *dev);
175 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev);
176 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev);
177 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev);
178 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev);
179 static void _rtl92e_dm_initial_gain(struct net_device *dev);
180 static void _rtl92e_dm_pd_th(struct net_device *dev);
181 static void _rtl92e_dm_cs_ratio(struct net_device *dev);
183 static void _rtl92e_dm_init_cts_to_self(struct net_device *dev);
184 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev);
186 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev);
187 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev);
188 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev);
189 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev);
192 static void _rtl92e_dm_init_fsync(struct net_device *dev);
193 static void _rtl92e_dm_deinit_fsync(struct net_device *dev);
195 static void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev);
196 static void _rtl92e_dm_check_ac_dc_power(struct net_device *dev);
197 static void _rtl92e_dm_check_fsync(struct net_device *dev);
198 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data);
199 static void _rtl92e_dm_fsync_timer_callback(unsigned long data);
201 /*---------------------Define local function prototype-----------------------*/
203 static void _rtl92e_dm_init_dynamic_tx_power(struct net_device *dev);
204 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev);
206 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev);
207 static void _rtl92e_dm_cts_to_self(struct net_device *dev);
208 /*---------------------------Define function prototype------------------------*/
210 void rtl92e_dm_init(struct net_device *dev)
212 struct r8192_priv *priv = rtllib_priv(dev);
214 priv->DM_Type = DM_Type_ByDriver;
216 priv->undecorated_smoothed_pwdb = -1;
218 _rtl92e_dm_init_dynamic_tx_power(dev);
220 rtl92e_init_adaptive_rate(dev);
222 _rtl92e_dm_dig_init(dev);
223 rtl92e_dm_init_edca_turbo(dev);
224 _rtl92e_dm_init_bandwidth_autoswitch(dev);
225 _rtl92e_dm_init_fsync(dev);
226 _rtl92e_dm_init_rx_path_selection(dev);
227 _rtl92e_dm_init_cts_to_self(dev);
228 if (IS_HARDWARE_TYPE_8192SE(dev))
229 _rtl92e_dm_init_wa_broadcom_iot(dev);
231 INIT_DELAYED_WORK_RSL(&priv->gpio_change_rf_wq,
232 (void *)_rtl92e_dm_check_rf_ctrl_gpio, dev);
235 void rtl92e_dm_deinit(struct net_device *dev)
238 _rtl92e_dm_deinit_fsync(dev);
242 void rtl92e_dm_watchdog(struct net_device *dev)
244 struct r8192_priv *priv = rtllib_priv(dev);
246 if (priv->being_init_adapter)
249 _rtl92e_dm_check_ac_dc_power(dev);
251 _rtl92e_dm_check_txrateandretrycount(dev);
252 _rtl92e_dm_check_edca_turbo(dev);
254 _rtl92e_dm_check_rate_adaptive(dev);
255 _rtl92e_dm_dynamic_tx_power(dev);
256 _rtl92e_dm_check_tx_power_tracking(dev);
258 _rtl92e_dm_ctrl_initgain_byrssi(dev);
259 _rtl92e_dm_bandwidth_autoswitch(dev);
261 _rtl92e_dm_check_rx_path_selection(dev);
262 _rtl92e_dm_check_fsync(dev);
264 _rtl92e_dm_send_rssi_to_fw(dev);
265 _rtl92e_dm_cts_to_self(dev);
268 static void _rtl92e_dm_check_ac_dc_power(struct net_device *dev)
270 struct r8192_priv *priv = rtllib_priv(dev);
271 static char *ac_dc_script = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
272 char *argv[] = {ac_dc_script, DRV_NAME, NULL};
273 static char *envp[] = {"HOME=/",
275 "PATH=/usr/bin:/bin",
278 if (priv->ResetProgress == RESET_TYPE_SILENT) {
279 RT_TRACE((COMP_INIT | COMP_POWER | COMP_RF),
280 "GPIOChangeRFWorkItemCallBack(): Silent Reset!!!!!!!\n");
284 if (priv->rtllib->state != RTLLIB_LINKED)
286 call_usermodehelper(ac_dc_script, argv, envp, UMH_WAIT_PROC);
292 void rtl92e_init_adaptive_rate(struct net_device *dev)
295 struct r8192_priv *priv = rtllib_priv(dev);
296 struct rate_adaptive *pra = &priv->rate_adaptive;
298 pra->ratr_state = DM_RATR_STA_MAX;
299 pra->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
300 pra->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
301 pra->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
303 pra->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
304 pra->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
305 pra->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
307 if (priv->CustomerID == RT_CID_819x_Netcore)
308 pra->ping_rssi_enable = 1;
310 pra->ping_rssi_enable = 0;
311 pra->ping_rssi_thresh_for_ra = 15;
314 if (priv->rf_type == RF_2T4R) {
315 pra->upper_rssi_threshold_ratr = 0x8f0f0000;
316 pra->middle_rssi_threshold_ratr = 0x8f0ff000;
317 pra->low_rssi_threshold_ratr = 0x8f0ff001;
318 pra->low_rssi_threshold_ratr_40M = 0x8f0ff005;
319 pra->low_rssi_threshold_ratr_20M = 0x8f0ff001;
320 pra->ping_rssi_ratr = 0x0000000d;
321 } else if (priv->rf_type == RF_1T2R) {
322 pra->upper_rssi_threshold_ratr = 0x000fc000;
323 pra->middle_rssi_threshold_ratr = 0x000ff000;
324 pra->low_rssi_threshold_ratr = 0x000ff001;
325 pra->low_rssi_threshold_ratr_40M = 0x000ff005;
326 pra->low_rssi_threshold_ratr_20M = 0x000ff001;
327 pra->ping_rssi_ratr = 0x0000000d;
333 static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev)
335 struct r8192_priv *priv = rtllib_priv(dev);
336 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
337 struct rate_adaptive *pra = &priv->rate_adaptive;
338 u32 currentRATR, targetRATR = 0;
339 u32 LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
340 bool bshort_gi_enabled = false;
341 static u8 ping_rssi_state;
345 "<---- _rtl92e_dm_check_rate_adaptive(): driver is going to unload\n");
349 if (pra->rate_adaptive_disabled)
352 if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
353 priv->rtllib->mode == WIRELESS_MODE_N_5G))
356 if (priv->rtllib->state == RTLLIB_LINKED) {
358 bshort_gi_enabled = (pHTInfo->bCurTxBW40MHz &&
359 pHTInfo->bCurShortGI40MHz) ||
360 (!pHTInfo->bCurTxBW40MHz &&
361 pHTInfo->bCurShortGI20MHz);
363 pra->upper_rssi_threshold_ratr =
364 (pra->upper_rssi_threshold_ratr & (~BIT31)) |
365 ((bshort_gi_enabled) ? BIT31 : 0);
367 pra->middle_rssi_threshold_ratr =
368 (pra->middle_rssi_threshold_ratr & (~BIT31)) |
369 ((bshort_gi_enabled) ? BIT31 : 0);
371 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) {
372 pra->low_rssi_threshold_ratr =
373 (pra->low_rssi_threshold_ratr_40M & (~BIT31)) |
374 ((bshort_gi_enabled) ? BIT31 : 0);
376 pra->low_rssi_threshold_ratr =
377 (pra->low_rssi_threshold_ratr_20M & (~BIT31)) |
378 ((bshort_gi_enabled) ? BIT31 : 0);
380 pra->ping_rssi_ratr =
381 (pra->ping_rssi_ratr & (~BIT31)) |
382 ((bshort_gi_enabled) ? BIT31 : 0);
384 if (pra->ratr_state == DM_RATR_STA_HIGH) {
385 HighRSSIThreshForRA = pra->high2low_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);
388 } else if (pra->ratr_state == DM_RATR_STA_LOW) {
389 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
390 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
391 (pra->low2high_rssi_thresh_for_ra40M) : (pra->low2high_rssi_thresh_for_ra20M);
393 HighRSSIThreshForRA = pra->high_rssi_thresh_for_ra;
394 LowRSSIThreshForRA = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) ?
395 (pra->low_rssi_thresh_for_ra40M) : (pra->low_rssi_thresh_for_ra20M);
398 if (priv->undecorated_smoothed_pwdb >=
399 (long)HighRSSIThreshForRA) {
400 pra->ratr_state = DM_RATR_STA_HIGH;
401 targetRATR = pra->upper_rssi_threshold_ratr;
402 } else if (priv->undecorated_smoothed_pwdb >=
403 (long)LowRSSIThreshForRA) {
404 pra->ratr_state = DM_RATR_STA_MIDDLE;
405 targetRATR = pra->middle_rssi_threshold_ratr;
407 pra->ratr_state = DM_RATR_STA_LOW;
408 targetRATR = pra->low_rssi_threshold_ratr;
411 if (pra->ping_rssi_enable) {
412 if (priv->undecorated_smoothed_pwdb <
413 (long)(pra->ping_rssi_thresh_for_ra+5)) {
414 if ((priv->undecorated_smoothed_pwdb <
415 (long)pra->ping_rssi_thresh_for_ra) ||
417 pra->ratr_state = DM_RATR_STA_LOW;
418 targetRATR = pra->ping_rssi_ratr;
426 if (priv->rtllib->GetHalfNmodeSupportByAPsHandler(dev))
427 targetRATR &= 0xf00fffff;
429 currentRATR = rtl92e_readl(dev, RATR0);
430 if (targetRATR != currentRATR) {
433 ratr_value = targetRATR;
435 "currentRATR = %x, targetRATR = %x\n",
436 currentRATR, targetRATR);
437 if (priv->rf_type == RF_1T2R)
438 ratr_value &= ~(RATE_ALL_OFDM_2SS);
439 rtl92e_writel(dev, RATR0, ratr_value);
440 rtl92e_writeb(dev, UFWP, 1);
442 pra->last_ratr = targetRATR;
446 pra->ratr_state = DM_RATR_STA_MAX;
450 static void _rtl92e_dm_init_bandwidth_autoswitch(struct net_device *dev)
452 struct r8192_priv *priv = rtllib_priv(dev);
454 priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz = BW_AUTO_SWITCH_LOW_HIGH;
455 priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz = BW_AUTO_SWITCH_HIGH_LOW;
456 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
457 priv->rtllib->bandwidth_auto_switch.bautoswitch_enable = false;
460 static void _rtl92e_dm_bandwidth_autoswitch(struct net_device *dev)
462 struct r8192_priv *priv = rtllib_priv(dev);
464 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ||
465 !priv->rtllib->bandwidth_auto_switch.bautoswitch_enable)
467 if (priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz == false) {
468 if (priv->undecorated_smoothed_pwdb <=
469 priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz)
470 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = true;
472 if (priv->undecorated_smoothed_pwdb >=
473 priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz)
474 priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
478 static u32 OFDMSwingTable[OFDM_Table_Length] = {
500 static u8 CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
501 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
502 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
503 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
504 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
505 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
506 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
507 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
508 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
509 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
510 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
511 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
512 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
515 static u8 CCKSwingTable_Ch14[CCK_Table_length][8] = {
516 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
517 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
518 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
519 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
520 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
521 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
522 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
523 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
524 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
525 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
526 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
527 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
530 #define Pw_Track_Flag 0x11d
531 #define Tssi_Mea_Value 0x13c
532 #define Tssi_Report_Value1 0x134
533 #define Tssi_Report_Value2 0x13e
534 #define FW_Busy_Flag 0x13f
536 static void _rtl92e_dm_tx_update_tssi_weak_signal(struct net_device *dev,
539 struct r8192_priv *p = rtllib_priv(dev);
541 if (RF_Type == RF_2T4R) {
542 if ((p->rfa_txpowertrackingindex > 0) &&
543 (p->rfc_txpowertrackingindex > 0)) {
544 p->rfa_txpowertrackingindex--;
545 if (p->rfa_txpowertrackingindex_real > 4) {
546 p->rfa_txpowertrackingindex_real--;
547 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
549 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
552 p->rfc_txpowertrackingindex--;
553 if (p->rfc_txpowertrackingindex_real > 4) {
554 p->rfc_txpowertrackingindex_real--;
555 rtl92e_set_bb_reg(dev,
556 rOFDM0_XCTxIQImbalance,
558 dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
561 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
564 rtl92e_set_bb_reg(dev,
565 rOFDM0_XCTxIQImbalance,
566 bMaskDWord, dm_tx_bb_gain[4]);
569 if (p->rfa_txpowertrackingindex > 0) {
570 p->rfa_txpowertrackingindex--;
571 if (p->rfa_txpowertrackingindex_real > 4) {
572 p->rfa_txpowertrackingindex_real--;
573 rtl92e_set_bb_reg(dev,
574 rOFDM0_XATxIQImbalance,
576 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
579 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
580 bMaskDWord, dm_tx_bb_gain[4]);
585 static void _rtl92e_dm_tx_update_tssi_strong_signal(struct net_device *dev,
588 struct r8192_priv *p = rtllib_priv(dev);
590 if (RF_Type == RF_2T4R) {
591 if ((p->rfa_txpowertrackingindex < TxBBGainTableLength - 1) &&
592 (p->rfc_txpowertrackingindex < TxBBGainTableLength - 1)) {
593 p->rfa_txpowertrackingindex++;
594 p->rfa_txpowertrackingindex_real++;
595 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
597 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
598 p->rfc_txpowertrackingindex++;
599 p->rfc_txpowertrackingindex_real++;
600 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
602 dm_tx_bb_gain[p->rfc_txpowertrackingindex_real]);
604 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
606 dm_tx_bb_gain[TxBBGainTableLength - 1]);
607 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance,
609 dm_tx_bb_gain[TxBBGainTableLength - 1]);
612 if (p->rfa_txpowertrackingindex < (TxBBGainTableLength - 1)) {
613 p->rfa_txpowertrackingindex++;
614 p->rfa_txpowertrackingindex_real++;
615 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
617 dm_tx_bb_gain[p->rfa_txpowertrackingindex_real]);
619 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance,
621 dm_tx_bb_gain[TxBBGainTableLength - 1]);
626 static void _rtl92e_dm_tx_power_tracking_callback_tssi(struct net_device *dev)
628 struct r8192_priv *priv = rtllib_priv(dev);
629 bool bHighpowerstate, viviflag = false;
630 struct dcmd_txcmd tx_cmd;
631 u8 powerlevelOFDM24G;
632 int i = 0, j = 0, k = 0;
633 u8 RF_Type, tmp_report[5] = {0, 0, 0, 0, 0};
636 u16 Avg_TSSI_Meas, TSSI_13dBm, Avg_TSSI_Meas_from_driver = 0;
639 RT_TRACE(COMP_POWER_TRACKING, "%s()\n", __func__);
640 rtl92e_writeb(dev, Pw_Track_Flag, 0);
641 rtl92e_writeb(dev, FW_Busy_Flag, 0);
642 priv->rtllib->bdynamic_txpower_enable = false;
643 bHighpowerstate = priv->bDynamicTxHighPower;
645 powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24);
646 RF_Type = priv->rf_type;
647 Value = (RF_Type<<8) | powerlevelOFDM24G;
649 RT_TRACE(COMP_POWER_TRACKING, "powerlevelOFDM24G = %x\n",
653 for (j = 0; j <= 30; j++) {
655 tx_cmd.Op = TXCMD_SET_TX_PWR_TRACKING;
657 tx_cmd.Value = Value;
658 rtl92e_send_cmd_pkt(dev, DESC_PACKET_TYPE_NORMAL, (u8 *)&tx_cmd,
659 sizeof(struct dcmd_txcmd));
661 for (i = 0; i <= 30; i++) {
662 Pwr_Flag = rtl92e_readb(dev, Pw_Track_Flag);
667 if (priv->bResetInProgress) {
668 RT_TRACE(COMP_POWER_TRACKING,
669 "we are in silent reset progress, so return\n");
670 rtl92e_writeb(dev, Pw_Track_Flag, 0);
671 rtl92e_writeb(dev, FW_Busy_Flag, 0);
674 if (priv->rtllib->eRFPowerState != eRfOn) {
675 RT_TRACE(COMP_POWER_TRACKING,
676 "we are in power save, so return\n");
677 rtl92e_writeb(dev, Pw_Track_Flag, 0);
678 rtl92e_writeb(dev, FW_Busy_Flag, 0);
685 Avg_TSSI_Meas = rtl92e_readw(dev, Tssi_Mea_Value);
687 if (Avg_TSSI_Meas == 0) {
688 rtl92e_writeb(dev, Pw_Track_Flag, 0);
689 rtl92e_writeb(dev, FW_Busy_Flag, 0);
693 for (k = 0; k < 5; k++) {
695 tmp_report[k] = rtl92e_readb(dev,
696 Tssi_Report_Value1+k);
698 tmp_report[k] = rtl92e_readb(dev,
701 RT_TRACE(COMP_POWER_TRACKING,
702 "TSSI_report_value = %d\n",
705 if (tmp_report[k] <= 20) {
712 rtl92e_writeb(dev, Pw_Track_Flag, 0);
714 RT_TRACE(COMP_POWER_TRACKING,
715 "we filted this data\n");
716 for (k = 0; k < 5; k++)
721 for (k = 0; k < 5; k++)
722 Avg_TSSI_Meas_from_driver += tmp_report[k];
724 Avg_TSSI_Meas_from_driver *= 100 / 5;
725 RT_TRACE(COMP_POWER_TRACKING,
726 "Avg_TSSI_Meas_from_driver = %d\n",
727 Avg_TSSI_Meas_from_driver);
728 TSSI_13dBm = priv->TSSI_13dBm;
729 RT_TRACE(COMP_POWER_TRACKING, "TSSI_13dBm = %d\n",
732 if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
733 delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
735 delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
737 if (delta <= E_FOR_TX_POWER_TRACK) {
738 priv->rtllib->bdynamic_txpower_enable = true;
739 rtl92e_writeb(dev, Pw_Track_Flag, 0);
740 rtl92e_writeb(dev, FW_Busy_Flag, 0);
741 RT_TRACE(COMP_POWER_TRACKING,
742 "tx power track is done\n");
743 RT_TRACE(COMP_POWER_TRACKING,
744 "priv->rfa_txpowertrackingindex = %d\n",
745 priv->rfa_txpowertrackingindex);
746 RT_TRACE(COMP_POWER_TRACKING,
747 "priv->rfa_txpowertrackingindex_real = %d\n",
748 priv->rfa_txpowertrackingindex_real);
749 RT_TRACE(COMP_POWER_TRACKING,
750 "priv->CCKPresentAttentuation_difference = %d\n",
751 priv->CCKPresentAttentuation_difference);
752 RT_TRACE(COMP_POWER_TRACKING,
753 "priv->CCKPresentAttentuation = %d\n",
754 priv->CCKPresentAttentuation);
757 if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK)
758 _rtl92e_dm_tx_update_tssi_weak_signal(dev,
761 _rtl92e_dm_tx_update_tssi_strong_signal(dev, RF_Type);
763 if (RF_Type == RF_2T4R) {
764 priv->CCKPresentAttentuation_difference
765 = priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
767 priv->CCKPresentAttentuation_difference
768 = priv->rfa_txpowertrackingindex_real - priv->rfa_txpowertracking_default;
771 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
772 priv->CCKPresentAttentuation =
773 priv->CCKPresentAttentuation_20Mdefault +
774 priv->CCKPresentAttentuation_difference;
776 priv->CCKPresentAttentuation =
777 priv->CCKPresentAttentuation_40Mdefault +
778 priv->CCKPresentAttentuation_difference;
780 if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
781 priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
782 if (priv->CCKPresentAttentuation < 0)
783 priv->CCKPresentAttentuation = 0;
785 if (priv->CCKPresentAttentuation > -1 &&
786 priv->CCKPresentAttentuation < CCKTxBBGainTableLength) {
787 if (priv->rtllib->current_network.channel == 14 &&
788 !priv->bcck_in_ch14) {
789 priv->bcck_in_ch14 = true;
790 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
791 } else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14) {
792 priv->bcck_in_ch14 = false;
793 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
795 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
797 RT_TRACE(COMP_POWER_TRACKING,
798 "priv->rfa_txpowertrackingindex = %d\n",
799 priv->rfa_txpowertrackingindex);
800 RT_TRACE(COMP_POWER_TRACKING,
801 "priv->rfa_txpowertrackingindex_real = %d\n",
802 priv->rfa_txpowertrackingindex_real);
803 RT_TRACE(COMP_POWER_TRACKING,
804 "priv->CCKPresentAttentuation_difference = %d\n",
805 priv->CCKPresentAttentuation_difference);
806 RT_TRACE(COMP_POWER_TRACKING,
807 "priv->CCKPresentAttentuation = %d\n",
808 priv->CCKPresentAttentuation);
810 if (priv->CCKPresentAttentuation_difference <= -12 ||
811 priv->CCKPresentAttentuation_difference >= 24) {
812 priv->rtllib->bdynamic_txpower_enable = true;
813 rtl92e_writeb(dev, Pw_Track_Flag, 0);
814 rtl92e_writeb(dev, FW_Busy_Flag, 0);
815 RT_TRACE(COMP_POWER_TRACKING,
816 "tx power track--->limited\n");
820 rtl92e_writeb(dev, Pw_Track_Flag, 0);
821 Avg_TSSI_Meas_from_driver = 0;
822 for (k = 0; k < 5; k++)
826 rtl92e_writeb(dev, FW_Busy_Flag, 0);
828 priv->rtllib->bdynamic_txpower_enable = true;
829 rtl92e_writeb(dev, Pw_Track_Flag, 0);
832 static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev)
834 #define ThermalMeterVal 9
835 struct r8192_priv *priv = rtllib_priv(dev);
836 u32 tmpRegA, TempCCk;
837 u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
838 int i = 0, CCKSwingNeedUpdate = 0;
840 if (!priv->btxpower_trackingInit) {
841 tmpRegA = rtl92e_get_bb_reg(dev, rOFDM0_XATxIQImbalance,
843 for (i = 0; i < OFDM_Table_Length; i++) {
844 if (tmpRegA == OFDMSwingTable[i]) {
845 priv->OFDM_index[0] = (u8)i;
846 RT_TRACE(COMP_POWER_TRACKING,
847 "Initial reg0x%x = 0x%x, OFDM_index = 0x%x\n",
848 rOFDM0_XATxIQImbalance, tmpRegA,
849 priv->OFDM_index[0]);
853 TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1, bMaskByte2);
854 for (i = 0; i < CCK_Table_length; i++) {
855 if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) {
856 priv->CCK_index = (u8) i;
857 RT_TRACE(COMP_POWER_TRACKING,
858 "Initial reg0x%x = 0x%x, CCK_index = 0x%x\n",
859 rCCK0_TxFilter1, TempCCk,
864 priv->btxpower_trackingInit = true;
868 tmpRegA = rtl92e_get_rf_reg(dev, RF90_PATH_A, 0x12, 0x078);
869 RT_TRACE(COMP_POWER_TRACKING, "Readback ThermalMeterA = %d\n", tmpRegA);
870 if (tmpRegA < 3 || tmpRegA > 13)
874 RT_TRACE(COMP_POWER_TRACKING, "Valid ThermalMeterA = %d\n", tmpRegA);
875 priv->ThermalMeter[0] = ThermalMeterVal;
876 priv->ThermalMeter[1] = ThermalMeterVal;
878 if (priv->ThermalMeter[0] >= (u8)tmpRegA) {
879 tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0] -
881 tmpCCK40Mindex = tmpCCK20Mindex - 6;
882 if (tmpOFDMindex >= OFDM_Table_Length)
883 tmpOFDMindex = OFDM_Table_Length-1;
884 if (tmpCCK20Mindex >= CCK_Table_length)
885 tmpCCK20Mindex = CCK_Table_length-1;
886 if (tmpCCK40Mindex >= CCK_Table_length)
887 tmpCCK40Mindex = CCK_Table_length-1;
889 tmpval = ((u8)tmpRegA - priv->ThermalMeter[0]);
891 tmpOFDMindex = tmpCCK20Mindex = 0;
893 tmpOFDMindex = tmpCCK20Mindex = 6 - tmpval;
896 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
897 tmpCCKindex = tmpCCK40Mindex;
899 tmpCCKindex = tmpCCK20Mindex;
901 priv->Record_CCK_20Mindex = tmpCCK20Mindex;
902 priv->Record_CCK_40Mindex = tmpCCK40Mindex;
903 RT_TRACE(COMP_POWER_TRACKING,
904 "Record_CCK_20Mindex / Record_CCK_40Mindex = %d / %d.\n",
905 priv->Record_CCK_20Mindex, priv->Record_CCK_40Mindex);
907 if (priv->rtllib->current_network.channel == 14 &&
908 !priv->bcck_in_ch14) {
909 priv->bcck_in_ch14 = true;
910 CCKSwingNeedUpdate = 1;
911 } else if (priv->rtllib->current_network.channel != 14 &&
912 priv->bcck_in_ch14) {
913 priv->bcck_in_ch14 = false;
914 CCKSwingNeedUpdate = 1;
917 if (priv->CCK_index != tmpCCKindex) {
918 priv->CCK_index = tmpCCKindex;
919 CCKSwingNeedUpdate = 1;
922 if (CCKSwingNeedUpdate)
923 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
924 if (priv->OFDM_index[0] != tmpOFDMindex) {
925 priv->OFDM_index[0] = tmpOFDMindex;
926 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
927 OFDMSwingTable[priv->OFDM_index[0]]);
928 RT_TRACE(COMP_POWER_TRACKING, "Update OFDMSwing[%d] = 0x%x\n",
930 OFDMSwingTable[priv->OFDM_index[0]]);
932 priv->txpower_count = 0;
935 void rtl92e_dm_txpower_tracking_wq(void *data)
937 struct r8192_priv *priv = container_of_dwork_rsl(data,
938 struct r8192_priv, txpower_tracking_wq);
939 struct net_device *dev = priv->rtllib->dev;
941 if (priv->IC_Cut >= IC_VersionCut_D)
942 _rtl92e_dm_tx_power_tracking_callback_tssi(dev);
944 _rtl92e_dm_tx_power_tracking_cb_thermal(dev);
947 static void _rtl92e_dm_initialize_tx_power_tracking_tssi(struct net_device *dev)
950 struct r8192_priv *priv = rtllib_priv(dev);
952 priv->btxpower_tracking = true;
953 priv->txpower_count = 0;
954 priv->btxpower_trackingInit = false;
958 static void _rtl92e_dm_init_tx_power_tracking_thermal(struct net_device *dev)
960 struct r8192_priv *priv = rtllib_priv(dev);
963 if (priv->rtllib->FwRWRF)
964 priv->btxpower_tracking = true;
966 priv->btxpower_tracking = false;
967 priv->txpower_count = 0;
968 priv->btxpower_trackingInit = false;
969 RT_TRACE(COMP_POWER_TRACKING, "pMgntInfo->bTXPowerTracking = %d\n",
970 priv->btxpower_tracking);
973 void rtl92e_dm_init_txpower_tracking(struct net_device *dev)
975 struct r8192_priv *priv = rtllib_priv(dev);
977 if (priv->IC_Cut >= IC_VersionCut_D)
978 _rtl92e_dm_initialize_tx_power_tracking_tssi(dev);
980 _rtl92e_dm_init_tx_power_tracking_thermal(dev);
983 static void _rtl92e_dm_check_tx_power_tracking_tssi(struct net_device *dev)
985 struct r8192_priv *priv = rtllib_priv(dev);
986 static u32 tx_power_track_counter;
988 RT_TRACE(COMP_POWER_TRACKING, "%s()\n", __func__);
989 if (rtl92e_readb(dev, 0x11e) == 1)
991 if (!priv->btxpower_tracking)
993 tx_power_track_counter++;
996 if (tx_power_track_counter >= 180) {
997 queue_delayed_work_rsl(priv->priv_wq,
998 &priv->txpower_tracking_wq, 0);
999 tx_power_track_counter = 0;
1004 static void _rtl92e_dm_check_tx_power_tracking_thermal(struct net_device *dev)
1006 struct r8192_priv *priv = rtllib_priv(dev);
1007 static u8 TM_Trigger;
1008 u8 TxPowerCheckCnt = 0;
1010 if (IS_HARDWARE_TYPE_8192SE(dev))
1011 TxPowerCheckCnt = 5;
1013 TxPowerCheckCnt = 2;
1014 if (!priv->btxpower_tracking)
1017 if (priv->txpower_count <= TxPowerCheckCnt) {
1018 priv->txpower_count++;
1023 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1024 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1025 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
1026 rtl92e_set_rf_reg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
1030 netdev_info(dev, "===============>Schedule TxPowerTrackingWorkItem\n");
1031 queue_delayed_work_rsl(priv->priv_wq, &priv->txpower_tracking_wq, 0);
1036 static void _rtl92e_dm_check_tx_power_tracking(struct net_device *dev)
1038 struct r8192_priv *priv = rtllib_priv(dev);
1040 if (priv->IC_Cut >= IC_VersionCut_D)
1041 _rtl92e_dm_check_tx_power_tracking_tssi(dev);
1043 _rtl92e_dm_check_tx_power_tracking_thermal(dev);
1046 static void _rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device *dev,
1050 struct r8192_priv *priv = rtllib_priv(dev);
1051 u8 attenuation = (u8)priv->CCKPresentAttentuation;
1055 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][0] +
1056 (dm_cck_tx_bb_gain[attenuation][1] << 8));
1058 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1059 TempVal = (u32)((dm_cck_tx_bb_gain[attenuation][2]) +
1060 (dm_cck_tx_bb_gain[attenuation][3] << 8) +
1061 (dm_cck_tx_bb_gain[attenuation][4] << 16)+
1062 (dm_cck_tx_bb_gain[attenuation][5] << 24));
1063 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1064 TempVal = (u32)(dm_cck_tx_bb_gain[attenuation][6] +
1065 (dm_cck_tx_bb_gain[attenuation][7] << 8));
1067 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1069 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][0]) +
1070 (dm_cck_tx_bb_gain_ch14[attenuation][1] << 8));
1072 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1073 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][2]) +
1074 (dm_cck_tx_bb_gain_ch14[attenuation][3] << 8) +
1075 (dm_cck_tx_bb_gain_ch14[attenuation][4] << 16)+
1076 (dm_cck_tx_bb_gain_ch14[attenuation][5] << 24));
1077 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1078 TempVal = (u32)((dm_cck_tx_bb_gain_ch14[attenuation][6]) +
1079 (dm_cck_tx_bb_gain_ch14[attenuation][7] << 8));
1081 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1085 static void _rtl92e_dm_cck_tx_power_adjust_thermal_meter(struct net_device *dev,
1089 struct r8192_priv *priv = rtllib_priv(dev);
1093 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
1094 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1] << 8);
1095 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1096 RT_TRACE(COMP_POWER_TRACKING,
1097 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter1,
1099 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
1100 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3] << 8) +
1101 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4] << 16)+
1102 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5] << 24);
1103 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1104 RT_TRACE(COMP_POWER_TRACKING,
1105 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_TxFilter2,
1107 TempVal = CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
1108 (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7] << 8);
1110 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1111 RT_TRACE(COMP_POWER_TRACKING,
1112 "CCK not chnl 14, reg 0x%x = 0x%x\n", rCCK0_DebugPort,
1115 TempVal = CCKSwingTable_Ch14[priv->CCK_index][0] +
1116 (CCKSwingTable_Ch14[priv->CCK_index][1] << 8);
1118 rtl92e_set_bb_reg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
1119 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1120 rCCK0_TxFilter1, TempVal);
1121 TempVal = CCKSwingTable_Ch14[priv->CCK_index][2] +
1122 (CCKSwingTable_Ch14[priv->CCK_index][3] << 8) +
1123 (CCKSwingTable_Ch14[priv->CCK_index][4] << 16)+
1124 (CCKSwingTable_Ch14[priv->CCK_index][5] << 24);
1125 rtl92e_set_bb_reg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
1126 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1127 rCCK0_TxFilter2, TempVal);
1128 TempVal = CCKSwingTable_Ch14[priv->CCK_index][6] +
1129 (CCKSwingTable_Ch14[priv->CCK_index][7]<<8);
1131 rtl92e_set_bb_reg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
1132 RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
1133 rCCK0_DebugPort, TempVal);
1137 void rtl92e_dm_cck_txpower_adjust(struct net_device *dev, bool binch14)
1139 struct r8192_priv *priv = rtllib_priv(dev);
1141 if (priv->IC_Cut >= IC_VersionCut_D)
1142 _rtl92e_dm_cck_tx_power_adjust_tssi(dev, binch14);
1144 _rtl92e_dm_cck_tx_power_adjust_thermal_meter(dev, binch14);
1147 static void _rtl92e_dm_tx_power_reset_recovery(struct net_device *dev)
1149 struct r8192_priv *priv = rtllib_priv(dev);
1151 RT_TRACE(COMP_POWER_TRACKING, "Start Reset Recovery ==>\n");
1152 rtl92e_set_bb_reg(dev, rOFDM0_XATxIQImbalance, bMaskDWord,
1153 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1154 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc80 is %08x\n",
1155 dm_tx_bb_gain[priv->rfa_txpowertrackingindex]);
1156 RT_TRACE(COMP_POWER_TRACKING,
1157 "Reset Recovery: Fill in RFA_txPowerTrackingIndex is %x\n",
1158 priv->rfa_txpowertrackingindex);
1159 RT_TRACE(COMP_POWER_TRACKING,
1160 "Reset Recovery : RF A I/Q Amplify Gain is %d\n",
1161 dm_tx_bb_gain_idx_to_amplify(priv->rfa_txpowertrackingindex));
1162 RT_TRACE(COMP_POWER_TRACKING,
1163 "Reset Recovery: CCK Attenuation is %d dB\n",
1164 priv->CCKPresentAttentuation);
1165 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1167 rtl92e_set_bb_reg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord,
1168 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1169 RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc90 is %08x\n",
1170 dm_tx_bb_gain[priv->rfc_txpowertrackingindex]);
1171 RT_TRACE(COMP_POWER_TRACKING,
1172 "Reset Recovery: Fill in RFC_txPowerTrackingIndex is %x\n",
1173 priv->rfc_txpowertrackingindex);
1174 RT_TRACE(COMP_POWER_TRACKING,
1175 "Reset Recovery : RF C I/Q Amplify Gain is %d\n",
1176 dm_tx_bb_gain_idx_to_amplify(priv->rfc_txpowertrackingindex));
1179 void rtl92e_dm_restore_state(struct net_device *dev)
1181 struct r8192_priv *priv = rtllib_priv(dev);
1182 u32 reg_ratr = priv->rate_adaptive.last_ratr;
1187 "<---- rtl92e_dm_restore_state(): driver is going to unload\n");
1191 if (priv->rate_adaptive.rate_adaptive_disabled)
1193 if (!(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
1194 priv->rtllib->mode == WIRELESS_MODE_N_5G))
1196 ratr_value = reg_ratr;
1197 if (priv->rf_type == RF_1T2R)
1198 ratr_value &= ~(RATE_ALL_OFDM_2SS);
1199 rtl92e_writel(dev, RATR0, ratr_value);
1200 rtl92e_writeb(dev, UFWP, 1);
1201 if (priv->btxpower_trackingInit && priv->btxpower_tracking)
1202 _rtl92e_dm_tx_power_reset_recovery(dev);
1204 _rtl92e_dm_bb_initialgain_restore(dev);
1208 static void _rtl92e_dm_bb_initialgain_restore(struct net_device *dev)
1210 struct r8192_priv *priv = rtllib_priv(dev);
1211 u32 bit_mask = 0x7f;
1213 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1216 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1217 rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask,
1218 (u32)priv->initgain_backup.xaagccore1);
1219 rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask,
1220 (u32)priv->initgain_backup.xbagccore1);
1221 rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask,
1222 (u32)priv->initgain_backup.xcagccore1);
1223 rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask,
1224 (u32)priv->initgain_backup.xdagccore1);
1225 bit_mask = bMaskByte2;
1226 rtl92e_set_bb_reg(dev, rCCK0_CCA, bit_mask,
1227 (u32)priv->initgain_backup.cca);
1229 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc50 is %x\n",
1230 priv->initgain_backup.xaagccore1);
1231 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc58 is %x\n",
1232 priv->initgain_backup.xbagccore1);
1233 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc60 is %x\n",
1234 priv->initgain_backup.xcagccore1);
1235 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc68 is %x\n",
1236 priv->initgain_backup.xdagccore1);
1237 RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xa0a is %x\n",
1238 priv->initgain_backup.cca);
1239 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1243 void rtl92e_dm_backup_state(struct net_device *dev)
1245 struct r8192_priv *priv = rtllib_priv(dev);
1246 u32 bit_mask = bMaskByte0;
1248 priv->bswitch_fsync = false;
1249 priv->bfsync_processing = false;
1251 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1254 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1255 priv->initgain_backup.xaagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask);
1256 priv->initgain_backup.xbagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask);
1257 priv->initgain_backup.xcagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask);
1258 priv->initgain_backup.xdagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask);
1259 bit_mask = bMaskByte2;
1260 priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, bit_mask);
1262 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc50 is %x\n",
1263 priv->initgain_backup.xaagccore1);
1264 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc58 is %x\n",
1265 priv->initgain_backup.xbagccore1);
1266 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc60 is %x\n",
1267 priv->initgain_backup.xcagccore1);
1268 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc68 is %x\n",
1269 priv->initgain_backup.xdagccore1);
1270 RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xa0a is %x\n",
1271 priv->initgain_backup.cca);
1274 static void _rtl92e_dm_dig_init(struct net_device *dev)
1276 struct r8192_priv *priv = rtllib_priv(dev);
1278 dm_digtable.dig_enable_flag = true;
1280 dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
1282 dm_digtable.dig_algorithm_switch = 0;
1284 dm_digtable.dig_state = DM_STA_DIG_MAX;
1285 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1286 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1287 dm_digtable.PreSTAConnectState = DIG_STA_DISCONNECT;
1289 dm_digtable.rssi_low_thresh = DM_DIG_THRESH_LOW;
1290 dm_digtable.rssi_high_thresh = DM_DIG_THRESH_HIGH;
1292 dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
1293 dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
1295 dm_digtable.rssi_val = 50;
1296 dm_digtable.backoff_val = DM_DIG_BACKOFF;
1297 dm_digtable.rx_gain_range_max = DM_DIG_MAX;
1298 if (priv->CustomerID == RT_CID_819x_Netcore)
1299 dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
1301 dm_digtable.rx_gain_range_min = DM_DIG_MIN;
1304 static void _rtl92e_dm_ctrl_initgain_byrssi(struct net_device *dev)
1307 if (dm_digtable.dig_enable_flag == false)
1310 if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
1311 _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(dev);
1312 else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
1313 _rtl92e_dm_ctrl_initgain_byrssi_driver(dev);
1318 /*-----------------------------------------------------------------------------
1319 * Function: dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm()
1321 * Overview: Driver monitor RSSI and False Alarm to change initial gain.
1322 Only change initial gain during link in progress.
1324 * Input: IN PADAPTER pAdapter
1332 * 03/04/2009 hpfan Create Version 0.
1334 *---------------------------------------------------------------------------*/
1336 static void _rtl92e_dm_ctrl_initgain_byrssi_driver(struct net_device *dev)
1338 struct r8192_priv *priv = rtllib_priv(dev);
1342 if (dm_digtable.dig_enable_flag == false)
1345 if (dm_digtable.dig_algorithm_switch)
1348 for (i = 0; i < 3; i++)
1349 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1351 dm_digtable.dig_state = DM_STA_DIG_OFF;
1354 if (priv->rtllib->state == RTLLIB_LINKED)
1355 dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
1357 dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
1360 dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
1361 _rtl92e_dm_initial_gain(dev);
1362 _rtl92e_dm_pd_th(dev);
1363 _rtl92e_dm_cs_ratio(dev);
1364 if (dm_digtable.dig_algorithm_switch)
1365 dm_digtable.dig_algorithm_switch = 0;
1366 dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
1370 static void _rtl92e_dm_ctrl_initgain_byrssi_false_alarm(struct net_device *dev)
1372 struct r8192_priv *priv = rtllib_priv(dev);
1373 static u32 reset_cnt;
1376 if (dm_digtable.dig_enable_flag == false)
1379 if (dm_digtable.dig_algorithm_switch) {
1380 dm_digtable.dig_state = DM_STA_DIG_MAX;
1381 for (i = 0; i < 3; i++)
1382 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1383 dm_digtable.dig_algorithm_switch = 0;
1386 if (priv->rtllib->state != RTLLIB_LINKED)
1389 if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
1390 (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
1392 if (priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh) {
1393 if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
1394 (priv->reset_count == reset_cnt))
1396 reset_cnt = priv->reset_count;
1398 dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
1399 dm_digtable.dig_state = DM_STA_DIG_OFF;
1401 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1403 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x17);
1404 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x17);
1405 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x17);
1406 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x17);
1408 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1409 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1411 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1413 rtl92e_writeb(dev, 0xa0a, 0x08);
1418 if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) {
1421 if (dm_digtable.dig_state == DM_STA_DIG_ON &&
1422 (priv->reset_count == reset_cnt)) {
1423 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1426 if (priv->reset_count != reset_cnt)
1429 reset_cnt = priv->reset_count;
1431 dm_digtable.dig_state = DM_STA_DIG_ON;
1433 if (reset_flag == 1) {
1434 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x2c);
1435 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x2c);
1436 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x2c);
1437 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x2c);
1439 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, 0x20);
1440 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, 0x20);
1441 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, 0x20);
1442 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, 0x20);
1445 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1446 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1448 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1450 rtl92e_writeb(dev, 0xa0a, 0xcd);
1452 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1454 _rtl92e_dm_ctrl_initgain_byrssi_highpwr(dev);
1458 static void _rtl92e_dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev)
1460 struct r8192_priv *priv = rtllib_priv(dev);
1461 static u32 reset_cnt_highpwr;
1463 if ((priv->undecorated_smoothed_pwdb >
1464 dm_digtable.rssi_high_power_lowthresh) &&
1465 (priv->undecorated_smoothed_pwdb <
1466 dm_digtable.rssi_high_power_highthresh))
1469 if (priv->undecorated_smoothed_pwdb >=
1470 dm_digtable.rssi_high_power_highthresh) {
1471 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
1472 (priv->reset_count == reset_cnt_highpwr))
1474 dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
1476 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1477 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1479 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1481 if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF &&
1482 (priv->reset_count == reset_cnt_highpwr))
1484 dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
1486 if ((priv->undecorated_smoothed_pwdb <
1487 dm_digtable.rssi_high_power_lowthresh) &&
1488 (priv->undecorated_smoothed_pwdb >=
1489 dm_digtable.rssi_high_thresh)) {
1490 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1491 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1493 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1496 reset_cnt_highpwr = priv->reset_count;
1499 static void _rtl92e_dm_initial_gain(struct net_device *dev)
1501 struct r8192_priv *priv = rtllib_priv(dev);
1502 u8 initial_gain = 0;
1503 static u8 initialized, force_write;
1504 static u32 reset_cnt;
1506 if (dm_digtable.dig_algorithm_switch) {
1511 if (rtllib_act_scanning(priv->rtllib, true) == true) {
1516 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1517 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1518 long gain_range = dm_digtable.rssi_val + 10 -
1519 dm_digtable.backoff_val;
1520 gain_range = clamp_t(long, gain_range,
1521 dm_digtable.rx_gain_range_min,
1522 dm_digtable.rx_gain_range_max);
1523 dm_digtable.cur_ig_value = gain_range;
1525 if (dm_digtable.cur_ig_value == 0)
1526 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1528 dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
1531 dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
1532 dm_digtable.pre_ig_value = 0;
1535 if (priv->reset_count != reset_cnt) {
1537 reset_cnt = priv->reset_count;
1540 if (dm_digtable.pre_ig_value != rtl92e_readb(dev, rOFDM0_XAAGCCore1))
1543 if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
1544 || !initialized || force_write) {
1545 initial_gain = (u8)dm_digtable.cur_ig_value;
1546 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain);
1547 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain);
1548 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain);
1549 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, initial_gain);
1550 dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
1556 static void _rtl92e_dm_pd_th(struct net_device *dev)
1558 struct r8192_priv *priv = rtllib_priv(dev);
1559 static u8 initialized, force_write;
1560 static u32 reset_cnt;
1562 if (dm_digtable.dig_algorithm_switch) {
1567 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1568 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1569 if (dm_digtable.rssi_val >=
1570 dm_digtable.rssi_high_power_highthresh)
1571 dm_digtable.curpd_thstate =
1572 DIG_PD_AT_HIGH_POWER;
1573 else if (dm_digtable.rssi_val <=
1574 dm_digtable.rssi_low_thresh)
1575 dm_digtable.curpd_thstate =
1576 DIG_PD_AT_LOW_POWER;
1577 else if ((dm_digtable.rssi_val >=
1578 dm_digtable.rssi_high_thresh) &&
1579 (dm_digtable.rssi_val <
1580 dm_digtable.rssi_high_power_lowthresh))
1581 dm_digtable.curpd_thstate =
1582 DIG_PD_AT_NORMAL_POWER;
1584 dm_digtable.curpd_thstate =
1585 dm_digtable.prepd_thstate;
1587 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1590 dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
1593 if (priv->reset_count != reset_cnt) {
1595 reset_cnt = priv->reset_count;
1598 if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
1599 (initialized <= 3) || force_write) {
1600 if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER) {
1601 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1602 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x00);
1604 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x42);
1605 } else if (dm_digtable.curpd_thstate ==
1606 DIG_PD_AT_NORMAL_POWER) {
1607 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1608 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x20);
1610 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x44);
1611 } else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER) {
1612 if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
1613 rtl92e_writeb(dev, (rOFDM0_XATxAFE+3), 0x10);
1615 rtl92e_writeb(dev, rOFDM0_RxDetector1, 0x43);
1617 dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
1618 if (initialized <= 3)
1624 static void _rtl92e_dm_cs_ratio(struct net_device *dev)
1626 struct r8192_priv *priv = rtllib_priv(dev);
1627 static u8 initialized, force_write;
1628 static u32 reset_cnt;
1630 if (dm_digtable.dig_algorithm_switch) {
1635 if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) {
1636 if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT) {
1637 if (dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh)
1638 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1639 else if (dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh)
1640 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
1642 dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
1644 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1647 dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
1650 if (priv->reset_count != reset_cnt) {
1652 reset_cnt = priv->reset_count;
1656 if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
1657 !initialized || force_write) {
1658 if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER)
1659 rtl92e_writeb(dev, 0xa0a, 0x08);
1660 else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER)
1661 rtl92e_writeb(dev, 0xa0a, 0xcd);
1662 dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
1668 void rtl92e_dm_init_edca_turbo(struct net_device *dev)
1670 struct r8192_priv *priv = rtllib_priv(dev);
1672 priv->bcurrent_turbo_EDCA = false;
1673 priv->rtllib->bis_any_nonbepkts = false;
1674 priv->bis_cur_rdlstate = false;
1677 static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
1679 struct r8192_priv *priv = rtllib_priv(dev);
1680 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1682 static unsigned long lastTxOkCnt;
1683 static unsigned long lastRxOkCnt;
1684 unsigned long curTxOkCnt = 0;
1685 unsigned long curRxOkCnt = 0;
1687 if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
1688 goto dm_CheckEdcaTurbo_EXIT;
1689 if (priv->rtllib->state != RTLLIB_LINKED)
1690 goto dm_CheckEdcaTurbo_EXIT;
1691 if (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO)
1692 goto dm_CheckEdcaTurbo_EXIT;
1695 u8 *peername[11] = {
1696 "unknown", "realtek_90", "realtek_92se", "broadcom",
1697 "ralink", "atheros", "cisco", "marvell", "92u_softap",
1704 "%s():iot peer is %s, bssid: %pM\n",
1705 __func__, peername[pHTInfo->IOTPeer],
1706 priv->rtllib->current_network.bssid);
1710 if (!priv->rtllib->bis_any_nonbepkts) {
1711 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1712 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1713 if (pHTInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX) {
1714 if (curTxOkCnt > 4*curRxOkCnt) {
1715 if (priv->bis_cur_rdlstate ||
1716 !priv->bcurrent_turbo_EDCA) {
1717 rtl92e_writel(dev, EDCAPARA_BE,
1718 edca_setting_UL[pHTInfo->IOTPeer]);
1719 priv->bis_cur_rdlstate = false;
1722 if (!priv->bis_cur_rdlstate ||
1723 !priv->bcurrent_turbo_EDCA) {
1724 if (priv->rtllib->mode == WIRELESS_MODE_G)
1725 rtl92e_writel(dev, EDCAPARA_BE,
1726 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1728 rtl92e_writel(dev, EDCAPARA_BE,
1729 edca_setting_DL[pHTInfo->IOTPeer]);
1730 priv->bis_cur_rdlstate = true;
1733 priv->bcurrent_turbo_EDCA = true;
1735 if (curRxOkCnt > 4*curTxOkCnt) {
1736 if (!priv->bis_cur_rdlstate ||
1737 !priv->bcurrent_turbo_EDCA) {
1738 if (priv->rtllib->mode == WIRELESS_MODE_G)
1739 rtl92e_writel(dev, EDCAPARA_BE,
1740 edca_setting_DL_GMode[pHTInfo->IOTPeer]);
1742 rtl92e_writel(dev, EDCAPARA_BE,
1743 edca_setting_DL[pHTInfo->IOTPeer]);
1744 priv->bis_cur_rdlstate = true;
1747 if (priv->bis_cur_rdlstate ||
1748 !priv->bcurrent_turbo_EDCA) {
1749 rtl92e_writel(dev, EDCAPARA_BE,
1750 edca_setting_UL[pHTInfo->IOTPeer]);
1751 priv->bis_cur_rdlstate = false;
1756 priv->bcurrent_turbo_EDCA = true;
1759 if (priv->bcurrent_turbo_EDCA) {
1762 priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM,
1764 priv->bcurrent_turbo_EDCA = false;
1769 dm_CheckEdcaTurbo_EXIT:
1770 priv->rtllib->bis_any_nonbepkts = false;
1771 lastTxOkCnt = priv->stats.txbytesunicast;
1772 lastRxOkCnt = priv->stats.rxbytesunicast;
1775 static void _rtl92e_dm_init_cts_to_self(struct net_device *dev)
1777 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1779 priv->rtllib->bCTSToSelfEnable = true;
1782 static void _rtl92e_dm_cts_to_self(struct net_device *dev)
1784 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1785 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1786 static unsigned long lastTxOkCnt;
1787 static unsigned long lastRxOkCnt;
1788 unsigned long curTxOkCnt = 0;
1789 unsigned long curRxOkCnt = 0;
1791 if (priv->rtllib->bCTSToSelfEnable != true) {
1792 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1795 if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
1796 curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
1797 curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
1798 if (curRxOkCnt > 4*curTxOkCnt)
1799 pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
1801 pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
1803 lastTxOkCnt = priv->stats.txbytesunicast;
1804 lastRxOkCnt = priv->stats.rxbytesunicast;
1809 static void _rtl92e_dm_init_wa_broadcom_iot(struct net_device *dev)
1811 struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
1812 struct rt_hi_throughput *pHTInfo = priv->rtllib->pHTInfo;
1814 pHTInfo->bWAIotBroadcom = false;
1815 pHTInfo->WAIotTH = WAIotTHVal;
1818 static void _rtl92e_dm_check_rf_ctrl_gpio(void *data)
1820 struct r8192_priv *priv = container_of_dwork_rsl(data,
1821 struct r8192_priv, gpio_change_rf_wq);
1822 struct net_device *dev = priv->rtllib->dev;
1824 enum rt_rf_power_state eRfPowerStateToSet;
1825 bool bActuallySet = false;
1827 static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
1828 static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin",
1831 bActuallySet = false;
1833 if ((priv->up_first_time == 1) || (priv->being_init_adapter))
1836 if (priv->bfirst_after_down) {
1837 priv->bfirst_after_down = true;
1841 tmp1byte = rtl92e_readb(dev, GPI);
1843 eRfPowerStateToSet = (tmp1byte&BIT1) ? eRfOn : eRfOff;
1845 if (priv->bHwRadioOff && (eRfPowerStateToSet == eRfOn)) {
1846 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio ON\n");
1847 netdev_info(dev, "gpiochangeRF - HW Radio ON\n");
1848 priv->bHwRadioOff = false;
1849 bActuallySet = true;
1850 } else if (!priv->bHwRadioOff && (eRfPowerStateToSet == eRfOff)) {
1851 RT_TRACE(COMP_RF, "gpiochangeRF - HW Radio OFF\n");
1852 netdev_info(dev, "gpiochangeRF - HW Radio OFF\n");
1853 priv->bHwRadioOff = true;
1854 bActuallySet = true;
1859 priv->bHwRfOffAction = 1;
1860 rtl92e_set_rf_state(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
1861 if (priv->bHwRadioOff)
1866 argv[0] = RadioPowerPath;
1868 call_usermodehelper(RadioPowerPath, argv, envp, UMH_WAIT_PROC);
1872 void rtl92e_dm_rf_pathcheck_wq(void *data)
1874 struct r8192_priv *priv = container_of_dwork_rsl(data,
1877 struct net_device *dev = priv->rtllib->dev;
1880 rfpath = rtl92e_readb(dev, 0xc04);
1882 for (i = 0; i < RF90_PATH_MAX; i++) {
1883 if (rfpath & (0x01<<i))
1884 priv->brfpath_rxenable[i] = true;
1886 priv->brfpath_rxenable[i] = false;
1888 if (!DM_RxPathSelTable.Enable)
1891 _rtl92e_dm_rx_path_sel_byrssi(dev);
1894 static void _rtl92e_dm_init_rx_path_selection(struct net_device *dev)
1897 struct r8192_priv *priv = rtllib_priv(dev);
1899 DM_RxPathSelTable.Enable = 1;
1900 DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
1901 DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
1902 if (priv->CustomerID == RT_CID_819x_Netcore)
1903 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1905 DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
1906 DM_RxPathSelTable.disabledRF = 0;
1907 for (i = 0; i < 4; i++) {
1908 DM_RxPathSelTable.rf_rssi[i] = 50;
1909 DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
1910 DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
1914 #define PWDB_IN_RANGE ((cur_cck_pwdb < tmp_cck_max_pwdb) && \
1915 (cur_cck_pwdb > tmp_cck_sec_pwdb))
1917 static void _rtl92e_dm_rx_path_sel_byrssi(struct net_device *dev)
1919 struct r8192_priv *priv = rtllib_priv(dev);
1920 u8 i, max_rssi_index = 0, min_rssi_index = 0;
1921 u8 sec_rssi_index = 0, rf_num = 0;
1922 u8 tmp_max_rssi = 0, tmp_min_rssi = 0, tmp_sec_rssi = 0;
1923 u8 cck_default_Rx = 0x2;
1924 u8 cck_optional_Rx = 0x3;
1925 long tmp_cck_max_pwdb = 0, tmp_cck_min_pwdb = 0, tmp_cck_sec_pwdb = 0;
1926 u8 cck_rx_ver2_max_index = 0, cck_rx_ver2_min_index = 0;
1927 u8 cck_rx_ver2_sec_index = 0;
1930 static u8 disabled_rf_cnt, cck_Rx_Path_initialized;
1931 u8 update_cck_rx_path;
1933 if (priv->rf_type != RF_2T4R)
1936 if (!cck_Rx_Path_initialized) {
1937 DM_RxPathSelTable.cck_Rx_path = (rtl92e_readb(dev, 0xa07)&0xf);
1938 cck_Rx_Path_initialized = 1;
1941 DM_RxPathSelTable.disabledRF = 0xf;
1942 DM_RxPathSelTable.disabledRF &= ~(rtl92e_readb(dev, 0xc04));
1944 if (priv->rtllib->mode == WIRELESS_MODE_B)
1945 DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
1947 for (i = 0; i < RF90_PATH_MAX; i++) {
1948 DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
1950 if (priv->brfpath_rxenable[i]) {
1952 cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
1955 max_rssi_index = min_rssi_index = sec_rssi_index = i;
1956 tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
1957 } else if (rf_num == 2) {
1958 if (cur_rf_rssi >= tmp_max_rssi) {
1959 tmp_max_rssi = cur_rf_rssi;
1962 tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
1963 sec_rssi_index = min_rssi_index = i;
1966 if (cur_rf_rssi > tmp_max_rssi) {
1967 tmp_sec_rssi = tmp_max_rssi;
1968 sec_rssi_index = max_rssi_index;
1969 tmp_max_rssi = cur_rf_rssi;
1971 } else if (cur_rf_rssi == tmp_max_rssi) {
1972 tmp_sec_rssi = cur_rf_rssi;
1974 } else if ((cur_rf_rssi < tmp_max_rssi) &&
1975 (cur_rf_rssi > tmp_sec_rssi)) {
1976 tmp_sec_rssi = cur_rf_rssi;
1978 } else if (cur_rf_rssi == tmp_sec_rssi) {
1979 if (tmp_sec_rssi == tmp_min_rssi) {
1980 tmp_sec_rssi = cur_rf_rssi;
1983 } else if ((cur_rf_rssi < tmp_sec_rssi) &&
1984 (cur_rf_rssi > tmp_min_rssi)) {
1986 } else if (cur_rf_rssi == tmp_min_rssi) {
1987 if (tmp_sec_rssi == tmp_min_rssi) {
1988 tmp_min_rssi = cur_rf_rssi;
1991 } else if (cur_rf_rssi < tmp_min_rssi) {
1992 tmp_min_rssi = cur_rf_rssi;
2000 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
2001 for (i = 0; i < RF90_PATH_MAX; i++) {
2002 if (priv->brfpath_rxenable[i]) {
2005 DM_RxPathSelTable.cck_pwdb_sta[i];
2008 cck_rx_ver2_max_index = i;
2009 cck_rx_ver2_min_index = i;
2010 cck_rx_ver2_sec_index = i;
2011 tmp_cck_max_pwdb = cur_cck_pwdb;
2012 tmp_cck_min_pwdb = cur_cck_pwdb;
2013 tmp_cck_sec_pwdb = cur_cck_pwdb;
2014 } else if (rf_num == 2) {
2015 if (cur_cck_pwdb >= tmp_cck_max_pwdb) {
2016 tmp_cck_max_pwdb = cur_cck_pwdb;
2017 cck_rx_ver2_max_index = i;
2019 tmp_cck_sec_pwdb = cur_cck_pwdb;
2020 tmp_cck_min_pwdb = cur_cck_pwdb;
2021 cck_rx_ver2_sec_index = i;
2022 cck_rx_ver2_min_index = i;
2025 if (cur_cck_pwdb > tmp_cck_max_pwdb) {
2028 cck_rx_ver2_sec_index =
2029 cck_rx_ver2_max_index;
2030 tmp_cck_max_pwdb = cur_cck_pwdb;
2031 cck_rx_ver2_max_index = i;
2032 } else if (cur_cck_pwdb ==
2034 tmp_cck_sec_pwdb = cur_cck_pwdb;
2035 cck_rx_ver2_sec_index = i;
2036 } else if (PWDB_IN_RANGE) {
2037 tmp_cck_sec_pwdb = cur_cck_pwdb;
2038 cck_rx_ver2_sec_index = i;
2039 } else if (cur_cck_pwdb ==
2041 if (tmp_cck_sec_pwdb ==
2045 cck_rx_ver2_sec_index =
2048 } else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) &&
2049 (cur_cck_pwdb > tmp_cck_min_pwdb)) {
2051 } else if (cur_cck_pwdb == tmp_cck_min_pwdb) {
2052 if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb) {
2053 tmp_cck_min_pwdb = cur_cck_pwdb;
2054 cck_rx_ver2_min_index = i;
2056 } else if (cur_cck_pwdb < tmp_cck_min_pwdb) {
2057 tmp_cck_min_pwdb = cur_cck_pwdb;
2058 cck_rx_ver2_min_index = i;
2066 update_cck_rx_path = 0;
2067 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2) {
2068 cck_default_Rx = cck_rx_ver2_max_index;
2069 cck_optional_Rx = cck_rx_ver2_sec_index;
2070 if (tmp_cck_max_pwdb != -64)
2071 update_cck_rx_path = 1;
2074 if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2) {
2075 if ((tmp_max_rssi - tmp_min_rssi) >=
2076 DM_RxPathSelTable.diff_TH) {
2077 DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] =
2079 rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable,
2080 0x1<<min_rssi_index, 0x0);
2081 rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable,
2082 0x1<<min_rssi_index, 0x0);
2085 if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1) {
2086 cck_default_Rx = max_rssi_index;
2087 cck_optional_Rx = sec_rssi_index;
2089 update_cck_rx_path = 1;
2093 if (update_cck_rx_path) {
2094 DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2) |
2096 rtl92e_set_bb_reg(dev, rCCK0_AFESetting, 0x0f000000,
2097 DM_RxPathSelTable.cck_Rx_path);
2100 if (DM_RxPathSelTable.disabledRF) {
2101 for (i = 0; i < 4; i++) {
2102 if ((DM_RxPathSelTable.disabledRF>>i) & 0x1) {
2104 DM_RxPathSelTable.rf_enable_rssi_th[i]) {
2105 rtl92e_set_bb_reg(dev,
2106 rOFDM0_TRxPathEnable,
2108 rtl92e_set_bb_reg(dev,
2109 rOFDM1_TRxPathEnable,
2111 DM_RxPathSelTable.rf_enable_rssi_th[i]
2120 static void _rtl92e_dm_check_rx_path_selection(struct net_device *dev)
2122 struct r8192_priv *priv = rtllib_priv(dev);
2124 queue_delayed_work_rsl(priv->priv_wq, &priv->rfpath_check_wq, 0);
2128 static void _rtl92e_dm_init_fsync(struct net_device *dev)
2130 struct r8192_priv *priv = rtllib_priv(dev);
2132 priv->rtllib->fsync_time_interval = 500;
2133 priv->rtllib->fsync_rate_bitmap = 0x0f000800;
2134 priv->rtllib->fsync_rssi_threshold = 30;
2135 priv->rtllib->bfsync_enable = false;
2136 priv->rtllib->fsync_multiple_timeinterval = 3;
2137 priv->rtllib->fsync_firstdiff_ratethreshold = 100;
2138 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2139 priv->rtllib->fsync_state = Default_Fsync;
2140 priv->framesyncMonitor = 1;
2142 setup_timer(&priv->fsync_timer, _rtl92e_dm_fsync_timer_callback,
2143 (unsigned long)dev);
2147 static void _rtl92e_dm_deinit_fsync(struct net_device *dev)
2149 struct r8192_priv *priv = rtllib_priv(dev);
2151 del_timer_sync(&priv->fsync_timer);
2154 static void _rtl92e_dm_fsync_timer_callback(unsigned long data)
2156 struct net_device *dev = (struct net_device *)data;
2157 struct r8192_priv *priv = rtllib_priv((struct net_device *)data);
2158 u32 rate_index, rate_count = 0, rate_count_diff = 0;
2159 bool bSwitchFromCountDiff = false;
2160 bool bDoubleTimeInterval = false;
2162 if (priv->rtllib->state == RTLLIB_LINKED &&
2163 priv->rtllib->bfsync_enable &&
2164 (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC)) {
2167 for (rate_index = 0; rate_index <= 27; rate_index++) {
2168 rate_bitmap = 1 << rate_index;
2169 if (priv->rtllib->fsync_rate_bitmap & rate_bitmap)
2171 priv->stats.received_rate_histogram[1]
2175 if (rate_count < priv->rate_record)
2176 rate_count_diff = 0xffffffff - rate_count +
2179 rate_count_diff = rate_count - priv->rate_record;
2180 if (rate_count_diff < priv->rateCountDiffRecord) {
2182 u32 DiffNum = priv->rateCountDiffRecord -
2185 priv->rtllib->fsync_seconddiff_ratethreshold)
2186 priv->ContinueDiffCount++;
2188 priv->ContinueDiffCount = 0;
2190 if (priv->ContinueDiffCount >= 2) {
2191 bSwitchFromCountDiff = true;
2192 priv->ContinueDiffCount = 0;
2195 priv->ContinueDiffCount = 0;
2198 if (rate_count_diff <=
2199 priv->rtllib->fsync_firstdiff_ratethreshold) {
2200 bSwitchFromCountDiff = true;
2201 priv->ContinueDiffCount = 0;
2203 priv->rate_record = rate_count;
2204 priv->rateCountDiffRecord = rate_count_diff;
2205 RT_TRACE(COMP_HALDM,
2206 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2207 priv->rate_record, rate_count, rate_count_diff,
2208 priv->bswitch_fsync);
2209 if (priv->undecorated_smoothed_pwdb >
2210 priv->rtllib->fsync_rssi_threshold &&
2211 bSwitchFromCountDiff) {
2212 bDoubleTimeInterval = true;
2213 priv->bswitch_fsync = !priv->bswitch_fsync;
2214 if (priv->bswitch_fsync) {
2215 rtl92e_writeb(dev, 0xC36, 0x1c);
2216 rtl92e_writeb(dev, 0xC3e, 0x90);
2218 rtl92e_writeb(dev, 0xC36, 0x5c);
2219 rtl92e_writeb(dev, 0xC3e, 0x96);
2221 } else if (priv->undecorated_smoothed_pwdb <=
2222 priv->rtllib->fsync_rssi_threshold) {
2223 if (priv->bswitch_fsync) {
2224 priv->bswitch_fsync = false;
2225 rtl92e_writeb(dev, 0xC36, 0x5c);
2226 rtl92e_writeb(dev, 0xC3e, 0x96);
2229 if (bDoubleTimeInterval) {
2230 if (timer_pending(&priv->fsync_timer))
2231 del_timer_sync(&priv->fsync_timer);
2232 priv->fsync_timer.expires = jiffies +
2233 msecs_to_jiffies(priv->rtllib->fsync_time_interval *
2234 priv->rtllib->fsync_multiple_timeinterval);
2235 add_timer(&priv->fsync_timer);
2237 if (timer_pending(&priv->fsync_timer))
2238 del_timer_sync(&priv->fsync_timer);
2239 priv->fsync_timer.expires = jiffies +
2240 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2241 add_timer(&priv->fsync_timer);
2244 if (priv->bswitch_fsync) {
2245 priv->bswitch_fsync = false;
2246 rtl92e_writeb(dev, 0xC36, 0x5c);
2247 rtl92e_writeb(dev, 0xC3e, 0x96);
2249 priv->ContinueDiffCount = 0;
2250 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2252 RT_TRACE(COMP_HALDM, "ContinueDiffCount %d\n", priv->ContinueDiffCount);
2253 RT_TRACE(COMP_HALDM,
2254 "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n",
2255 priv->rate_record, rate_count, rate_count_diff,
2256 priv->bswitch_fsync);
2259 static void _rtl92e_dm_start_hw_fsync(struct net_device *dev)
2261 u8 rf_timing = 0x77;
2262 struct r8192_priv *priv = rtllib_priv(dev);
2264 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2265 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cf);
2266 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING,
2267 (u8 *)(&rf_timing));
2268 rtl92e_writeb(dev, 0xc3b, 0x41);
2271 static void _rtl92e_dm_end_hw_fsync(struct net_device *dev)
2273 u8 rf_timing = 0xaa;
2274 struct r8192_priv *priv = rtllib_priv(dev);
2276 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2277 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2278 priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8 *)
2280 rtl92e_writeb(dev, 0xc3b, 0x49);
2283 static void _rtl92e_dm_end_sw_fsync(struct net_device *dev)
2285 struct r8192_priv *priv = rtllib_priv(dev);
2287 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2288 del_timer_sync(&(priv->fsync_timer));
2290 if (priv->bswitch_fsync) {
2291 priv->bswitch_fsync = false;
2293 rtl92e_writeb(dev, 0xC36, 0x5c);
2295 rtl92e_writeb(dev, 0xC3e, 0x96);
2298 priv->ContinueDiffCount = 0;
2299 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c52cd);
2302 static void _rtl92e_dm_start_sw_fsync(struct net_device *dev)
2304 struct r8192_priv *priv = rtllib_priv(dev);
2308 RT_TRACE(COMP_HALDM, "%s\n", __func__);
2309 priv->rate_record = 0;
2310 priv->ContinueDiffCount = 0;
2311 priv->rateCountDiffRecord = 0;
2312 priv->bswitch_fsync = false;
2314 if (priv->rtllib->mode == WIRELESS_MODE_N_24G) {
2315 priv->rtllib->fsync_firstdiff_ratethreshold = 600;
2316 priv->rtllib->fsync_seconddiff_ratethreshold = 0xffff;
2318 priv->rtllib->fsync_firstdiff_ratethreshold = 200;
2319 priv->rtllib->fsync_seconddiff_ratethreshold = 200;
2321 for (rateIndex = 0; rateIndex <= 27; rateIndex++) {
2322 rateBitmap = 1 << rateIndex;
2323 if (priv->rtllib->fsync_rate_bitmap & rateBitmap)
2324 priv->rate_record +=
2325 priv->stats.received_rate_histogram[1]
2328 if (timer_pending(&priv->fsync_timer))
2329 del_timer_sync(&priv->fsync_timer);
2330 priv->fsync_timer.expires = jiffies +
2331 msecs_to_jiffies(priv->rtllib->fsync_time_interval);
2332 add_timer(&priv->fsync_timer);
2334 rtl92e_writel(dev, rOFDM0_RxDetector2, 0x465c12cd);
2338 static void _rtl92e_dm_check_fsync(struct net_device *dev)
2340 #define RegC38_Default 0
2341 #define RegC38_NonFsync_Other_AP 1
2342 #define RegC38_Fsync_AP_BCM 2
2343 struct r8192_priv *priv = rtllib_priv(dev);
2344 static u8 reg_c38_State = RegC38_Default;
2345 static u32 reset_cnt;
2347 RT_TRACE(COMP_HALDM,
2348 "RSSI %d TimeInterval %d MultipleTimeInterval %d\n",
2349 priv->rtllib->fsync_rssi_threshold,
2350 priv->rtllib->fsync_time_interval,
2351 priv->rtllib->fsync_multiple_timeinterval);
2352 RT_TRACE(COMP_HALDM,
2353 "RateBitmap 0x%x FirstDiffRateThreshold %d SecondDiffRateThreshold %d\n",
2354 priv->rtllib->fsync_rate_bitmap,
2355 priv->rtllib->fsync_firstdiff_ratethreshold,
2356 priv->rtllib->fsync_seconddiff_ratethreshold);
2358 if (priv->rtllib->state == RTLLIB_LINKED &&
2359 priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) {
2360 if (priv->rtllib->bfsync_enable == 0) {
2361 switch (priv->rtllib->fsync_state) {
2363 _rtl92e_dm_start_hw_fsync(dev);
2364 priv->rtllib->fsync_state = HW_Fsync;
2367 _rtl92e_dm_end_sw_fsync(dev);
2368 _rtl92e_dm_start_hw_fsync(dev);
2369 priv->rtllib->fsync_state = HW_Fsync;
2376 switch (priv->rtllib->fsync_state) {
2378 _rtl92e_dm_start_sw_fsync(dev);
2379 priv->rtllib->fsync_state = SW_Fsync;
2382 _rtl92e_dm_end_hw_fsync(dev);
2383 _rtl92e_dm_start_sw_fsync(dev);
2384 priv->rtllib->fsync_state = SW_Fsync;
2392 if (priv->framesyncMonitor) {
2393 if (reg_c38_State != RegC38_Fsync_AP_BCM) {
2394 rtl92e_writeb(dev, rOFDM0_RxDetector3, 0x95);
2396 reg_c38_State = RegC38_Fsync_AP_BCM;
2400 switch (priv->rtllib->fsync_state) {
2402 _rtl92e_dm_end_hw_fsync(dev);
2403 priv->rtllib->fsync_state = Default_Fsync;
2406 _rtl92e_dm_end_sw_fsync(dev);
2407 priv->rtllib->fsync_state = Default_Fsync;
2414 if (priv->framesyncMonitor) {
2415 if (priv->rtllib->state == RTLLIB_LINKED) {
2416 if (priv->undecorated_smoothed_pwdb <=
2418 if (reg_c38_State !=
2419 RegC38_NonFsync_Other_AP) {
2425 RegC38_NonFsync_Other_AP;
2427 } else if (priv->undecorated_smoothed_pwdb >=
2429 if (reg_c38_State) {
2433 reg_c38_State = RegC38_Default;
2437 if (reg_c38_State) {
2438 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2440 reg_c38_State = RegC38_Default;
2445 if (priv->framesyncMonitor) {
2446 if (priv->reset_count != reset_cnt) {
2447 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2449 reg_c38_State = RegC38_Default;
2450 reset_cnt = priv->reset_count;
2453 if (reg_c38_State) {
2454 rtl92e_writeb(dev, rOFDM0_RxDetector3,
2456 reg_c38_State = RegC38_Default;
2461 /*---------------------------Define function prototype------------------------*/
2462 static void _rtl92e_dm_init_dynamic_tx_power(struct net_device *dev)
2464 struct r8192_priv *priv = rtllib_priv(dev);
2466 priv->rtllib->bdynamic_txpower_enable = true;
2467 priv->bLastDTPFlag_High = false;
2468 priv->bLastDTPFlag_Low = false;
2469 priv->bDynamicTxHighPower = false;
2470 priv->bDynamicTxLowPower = false;
2473 static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev)
2475 struct r8192_priv *priv = rtllib_priv(dev);
2476 unsigned int txhipower_threshhold = 0;
2477 unsigned int txlowpower_threshold = 0;
2479 if (priv->rtllib->bdynamic_txpower_enable != true) {
2480 priv->bDynamicTxHighPower = false;
2481 priv->bDynamicTxLowPower = false;
2484 if ((priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) &&
2485 (priv->rtllib->mode == IEEE_G)) {
2486 txhipower_threshhold = TX_POWER_ATHEROAP_THRESH_HIGH;
2487 txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
2489 txhipower_threshhold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
2490 txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
2493 RT_TRACE(COMP_TXAGC, "priv->undecorated_smoothed_pwdb = %ld\n",
2494 priv->undecorated_smoothed_pwdb);
2496 if (priv->rtllib->state == RTLLIB_LINKED) {
2497 if (priv->undecorated_smoothed_pwdb >= txhipower_threshhold) {
2498 priv->bDynamicTxHighPower = true;
2499 priv->bDynamicTxLowPower = false;
2501 if (priv->undecorated_smoothed_pwdb <
2502 txlowpower_threshold && priv->bDynamicTxHighPower)
2503 priv->bDynamicTxHighPower = false;
2504 if (priv->undecorated_smoothed_pwdb < 35)
2505 priv->bDynamicTxLowPower = true;
2506 else if (priv->undecorated_smoothed_pwdb >= 40)
2507 priv->bDynamicTxLowPower = false;
2510 priv->bDynamicTxHighPower = false;
2511 priv->bDynamicTxLowPower = false;
2514 if ((priv->bDynamicTxHighPower != priv->bLastDTPFlag_High) ||
2515 (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low)) {
2516 RT_TRACE(COMP_TXAGC, "SetTxPowerLevel8190() channel = %d\n",
2517 priv->rtllib->current_network.channel);
2519 rtl92e_set_tx_power(dev, priv->rtllib->current_network.channel);
2521 priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
2522 priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
2526 static void _rtl92e_dm_check_txrateandretrycount(struct net_device *dev)
2528 struct r8192_priv *priv = rtllib_priv(dev);
2529 struct rtllib_device *ieee = priv->rtllib;
2531 ieee->softmac_stats.CurrentShowTxate = rtl92e_readb(dev,
2532 Current_Tx_Rate_Reg);
2534 ieee->softmac_stats.last_packet_rate = rtl92e_readb(dev,
2535 Initial_Tx_Rate_Reg);
2537 ieee->softmac_stats.txretrycount = rtl92e_readl(dev,
2538 Tx_Retry_Count_Reg);
2541 static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev)
2543 struct r8192_priv *priv = rtllib_priv(dev);
2545 rtl92e_writeb(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb);