forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/net/wireless/realtek/rtlwifi/rtl8192de/dm.c
....@@ -1,27 +1,5 @@
1
-/******************************************************************************
2
- *
3
- * Copyright(c) 2009-2012 Realtek Corporation.
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms of version 2 of the GNU General Public License as
7
- * published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope that it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
13
- *
14
- * The full GNU General Public License is included in this distribution in the
15
- * file called LICENSE.
16
- *
17
- * Contact Information:
18
- * wlanfae <wlanfae@realtek.com>
19
- * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
- * Hsinchu 300, Taiwan.
21
- *
22
- * Larry Finger <Larry.Finger@lwfinger.net>
23
- *
24
- *****************************************************************************/
1
+// SPDX-License-Identifier: GPL-2.0
2
+/* Copyright(c) 2009-2012 Realtek Corporation.*/
253
264 #include "../wifi.h"
275 #include "../base.h"
....@@ -216,21 +194,21 @@
216194 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2);
217195 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
218196 }
219
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
220
- "Cnt_Fast_Fsync_fail = %x, Cnt_SB_Search_fail = %x\n",
221
- falsealm_cnt->cnt_fast_fsync_fail,
222
- falsealm_cnt->cnt_sb_search_fail);
223
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
224
- "Cnt_Parity_Fail = %x, Cnt_Rate_Illegal = %x, Cnt_Crc8_fail = %x, Cnt_Mcs_fail = %x\n",
225
- falsealm_cnt->cnt_parity_fail,
226
- falsealm_cnt->cnt_rate_illegal,
227
- falsealm_cnt->cnt_crc8_fail,
228
- falsealm_cnt->cnt_mcs_fail);
229
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
230
- "Cnt_Ofdm_fail = %x, Cnt_Cck_fail = %x, Cnt_all = %x\n",
231
- falsealm_cnt->cnt_ofdm_fail,
232
- falsealm_cnt->cnt_cck_fail,
233
- falsealm_cnt->cnt_all);
197
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
198
+ "Cnt_Fast_Fsync_fail = %x, Cnt_SB_Search_fail = %x\n",
199
+ falsealm_cnt->cnt_fast_fsync_fail,
200
+ falsealm_cnt->cnt_sb_search_fail);
201
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
202
+ "Cnt_Parity_Fail = %x, Cnt_Rate_Illegal = %x, Cnt_Crc8_fail = %x, Cnt_Mcs_fail = %x\n",
203
+ falsealm_cnt->cnt_parity_fail,
204
+ falsealm_cnt->cnt_rate_illegal,
205
+ falsealm_cnt->cnt_crc8_fail,
206
+ falsealm_cnt->cnt_mcs_fail);
207
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
208
+ "Cnt_Ofdm_fail = %x, Cnt_Cck_fail = %x, Cnt_all = %x\n",
209
+ falsealm_cnt->cnt_ofdm_fail,
210
+ falsealm_cnt->cnt_cck_fail,
211
+ falsealm_cnt->cnt_all);
234212 }
235213
236214 static void rtl92d_dm_find_minimum_rssi(struct ieee80211_hw *hw)
....@@ -243,33 +221,33 @@
243221 if ((mac->link_state < MAC80211_LINKED) &&
244222 (rtlpriv->dm.UNDEC_SM_PWDB == 0)) {
245223 de_digtable->min_undec_pwdb_for_dm = 0;
246
- RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
247
- "Not connected to any\n");
224
+ rtl_dbg(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
225
+ "Not connected to any\n");
248226 }
249227 if (mac->link_state >= MAC80211_LINKED) {
250228 if (mac->opmode == NL80211_IFTYPE_AP ||
251229 mac->opmode == NL80211_IFTYPE_ADHOC) {
252230 de_digtable->min_undec_pwdb_for_dm =
253231 rtlpriv->dm.UNDEC_SM_PWDB;
254
- RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
255
- "AP Client PWDB = 0x%lx\n",
232
+ rtl_dbg(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
233
+ "AP Client PWDB = 0x%lx\n",
256234 rtlpriv->dm.UNDEC_SM_PWDB);
257235 } else {
258236 de_digtable->min_undec_pwdb_for_dm =
259237 rtlpriv->dm.undec_sm_pwdb;
260
- RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
261
- "STA Default Port PWDB = 0x%x\n",
262
- de_digtable->min_undec_pwdb_for_dm);
238
+ rtl_dbg(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
239
+ "STA Default Port PWDB = 0x%x\n",
240
+ de_digtable->min_undec_pwdb_for_dm);
263241 }
264242 } else {
265243 de_digtable->min_undec_pwdb_for_dm = rtlpriv->dm.UNDEC_SM_PWDB;
266
- RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
267
- "AP Ext Port or disconnect PWDB = 0x%x\n",
268
- de_digtable->min_undec_pwdb_for_dm);
244
+ rtl_dbg(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
245
+ "AP Ext Port or disconnect PWDB = 0x%x\n",
246
+ de_digtable->min_undec_pwdb_for_dm);
269247 }
270248
271
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n",
272
- de_digtable->min_undec_pwdb_for_dm);
249
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n",
250
+ de_digtable->min_undec_pwdb_for_dm);
273251 }
274252
275253 static void rtl92d_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
....@@ -309,14 +287,14 @@
309287 }
310288 de_digtable->pre_cck_pd_state = de_digtable->cur_cck_pd_state;
311289 }
312
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CurSTAConnectState=%s\n",
313
- de_digtable->cursta_cstate == DIG_STA_CONNECT ?
314
- "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT");
315
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "CCKPDStage=%s\n",
316
- de_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ?
317
- "Low RSSI " : "High RSSI ");
318
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "is92d single phy =%x\n",
319
- IS_92D_SINGLEPHY(rtlpriv->rtlhal.version));
290
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "CurSTAConnectState=%s\n",
291
+ de_digtable->cursta_cstate == DIG_STA_CONNECT ?
292
+ "DIG_STA_CONNECT " : "DIG_STA_DISCONNECT");
293
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "CCKPDStage=%s\n",
294
+ de_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI ?
295
+ "Low RSSI " : "High RSSI ");
296
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "is92d single phy =%x\n",
297
+ IS_92D_SINGLEPHY(rtlpriv->rtlhal.version));
320298
321299 }
322300
....@@ -325,12 +303,12 @@
325303 struct rtl_priv *rtlpriv = rtl_priv(hw);
326304 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
327305
328
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
329
- "cur_igvalue = 0x%x, pre_igvalue = 0x%x, back_val = %d\n",
330
- de_digtable->cur_igvalue, de_digtable->pre_igvalue,
331
- de_digtable->back_val);
306
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
307
+ "cur_igvalue = 0x%x, pre_igvalue = 0x%x, back_val = %d\n",
308
+ de_digtable->cur_igvalue, de_digtable->pre_igvalue,
309
+ de_digtable->back_val);
332310 if (de_digtable->dig_enable_flag == false) {
333
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "DIG is disabled\n");
311
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "DIG is disabled\n");
334312 de_digtable->pre_igvalue = 0x17;
335313 return;
336314 }
....@@ -349,21 +327,21 @@
349327
350328 if ((rtlpriv->mac80211.link_state >= MAC80211_LINKED) &&
351329 (rtlpriv->mac80211.vendor == PEER_CISCO)) {
352
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "IOT_PEER = CISCO\n");
330
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "IOT_PEER = CISCO\n");
353331 if (de_digtable->last_min_undec_pwdb_for_dm >= 50
354332 && de_digtable->min_undec_pwdb_for_dm < 50) {
355333 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x00);
356
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
357
- "Early Mode Off\n");
334
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
335
+ "Early Mode Off\n");
358336 } else if (de_digtable->last_min_undec_pwdb_for_dm <= 55 &&
359337 de_digtable->min_undec_pwdb_for_dm > 55) {
360338 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f);
361
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
362
- "Early Mode On\n");
339
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
340
+ "Early Mode On\n");
363341 }
364342 } else if (!(rtl_read_byte(rtlpriv, REG_EARLY_MODE_CONTROL) & 0xf)) {
365343 rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f);
366
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Early Mode On\n");
344
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "Early Mode On\n");
367345 }
368346 }
369347
....@@ -374,7 +352,7 @@
374352 u8 value_igi = de_digtable->cur_igvalue;
375353 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt);
376354
377
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "==>\n");
355
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "==>\n");
378356 if (rtlpriv->rtlhal.earlymode_enable) {
379357 rtl92d_early_mode_enabled(rtlpriv);
380358 de_digtable->last_min_undec_pwdb_for_dm =
....@@ -393,7 +371,7 @@
393371 /* Not STA mode return tmp */
394372 if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
395373 return;
396
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "progress\n");
374
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "progress\n");
397375 /* Decide the current status and if modify initial gain or not */
398376 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
399377 de_digtable->cursta_cstate = DIG_STA_CONNECT;
....@@ -409,17 +387,17 @@
409387 value_igi++;
410388 else if (falsealm_cnt->cnt_all >= DM_DIG_FA_TH2)
411389 value_igi += 2;
412
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
413
- "dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n",
414
- de_digtable->large_fa_hit, de_digtable->forbidden_igi);
415
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
416
- "dm_DIG() Before: Recover_cnt=%d, rx_gain_min=%x\n",
417
- de_digtable->recover_cnt, de_digtable->rx_gain_min);
390
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
391
+ "dm_DIG() Before: large_fa_hit=%d, forbidden_igi=%x\n",
392
+ de_digtable->large_fa_hit, de_digtable->forbidden_igi);
393
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
394
+ "dm_DIG() Before: Recover_cnt=%d, rx_gain_min=%x\n",
395
+ de_digtable->recover_cnt, de_digtable->rx_gain_min);
418396
419397 /* deal with abnormally large false alarm */
420398 if (falsealm_cnt->cnt_all > 10000) {
421
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
422
- "dm_DIG(): Abnormally false alarm case\n");
399
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
400
+ "dm_DIG(): Abnormally false alarm case\n");
423401
424402 de_digtable->large_fa_hit++;
425403 if (de_digtable->forbidden_igi < de_digtable->cur_igvalue) {
....@@ -457,12 +435,12 @@
457435 }
458436 }
459437 }
460
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
461
- "dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n",
462
- de_digtable->large_fa_hit, de_digtable->forbidden_igi);
463
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
464
- "dm_DIG() After: recover_cnt=%d, rx_gain_min=%x\n",
465
- de_digtable->recover_cnt, de_digtable->rx_gain_min);
438
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
439
+ "dm_DIG() After: large_fa_hit=%d, forbidden_igi=%x\n",
440
+ de_digtable->large_fa_hit, de_digtable->forbidden_igi);
441
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD,
442
+ "dm_DIG() After: recover_cnt=%d, rx_gain_min=%x\n",
443
+ de_digtable->recover_cnt, de_digtable->rx_gain_min);
466444
467445 if (value_igi > DM_DIG_MAX)
468446 value_igi = DM_DIG_MAX;
....@@ -472,7 +450,7 @@
472450 rtl92d_dm_write_dig(hw);
473451 if (rtlpriv->rtlhal.current_bandtype != BAND_ON_5G)
474452 rtl92d_dm_cck_packet_detection_thresh(hw);
475
- RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "<<==\n");
453
+ rtl_dbg(rtlpriv, COMP_DIG, DBG_LOUD, "<<==\n");
476454 }
477455
478456 static void rtl92d_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
....@@ -499,8 +477,8 @@
499477 }
500478 if ((mac->link_state < MAC80211_LINKED) &&
501479 (rtlpriv->dm.UNDEC_SM_PWDB == 0)) {
502
- RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
503
- "Not connected to any\n");
480
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
481
+ "Not connected to any\n");
504482 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
505483 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
506484 return;
....@@ -509,49 +487,49 @@
509487 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
510488 undec_sm_pwdb =
511489 rtlpriv->dm.UNDEC_SM_PWDB;
512
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
513
- "IBSS Client PWDB = 0x%lx\n",
514
- undec_sm_pwdb);
490
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
491
+ "IBSS Client PWDB = 0x%lx\n",
492
+ undec_sm_pwdb);
515493 } else {
516494 undec_sm_pwdb =
517495 rtlpriv->dm.undec_sm_pwdb;
518
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
519
- "STA Default Port PWDB = 0x%lx\n",
520
- undec_sm_pwdb);
496
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
497
+ "STA Default Port PWDB = 0x%lx\n",
498
+ undec_sm_pwdb);
521499 }
522500 } else {
523501 undec_sm_pwdb =
524502 rtlpriv->dm.UNDEC_SM_PWDB;
525503
526
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
527
- "AP Ext Port PWDB = 0x%lx\n",
528
- undec_sm_pwdb);
504
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
505
+ "AP Ext Port PWDB = 0x%lx\n",
506
+ undec_sm_pwdb);
529507 }
530508 if (rtlhal->current_bandtype == BAND_ON_5G) {
531509 if (undec_sm_pwdb >= 0x33) {
532510 rtlpriv->dm.dynamic_txhighpower_lvl =
533511 TXHIGHPWRLEVEL_LEVEL2;
534
- RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
535
- "5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n");
512
+ rtl_dbg(rtlpriv, COMP_HIPWR, DBG_LOUD,
513
+ "5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n");
536514 } else if ((undec_sm_pwdb < 0x33)
537515 && (undec_sm_pwdb >= 0x2b)) {
538516 rtlpriv->dm.dynamic_txhighpower_lvl =
539517 TXHIGHPWRLEVEL_LEVEL1;
540
- RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
541
- "5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n");
518
+ rtl_dbg(rtlpriv, COMP_HIPWR, DBG_LOUD,
519
+ "5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n");
542520 } else if (undec_sm_pwdb < 0x2b) {
543521 rtlpriv->dm.dynamic_txhighpower_lvl =
544522 TXHIGHPWRLEVEL_NORMAL;
545
- RT_TRACE(rtlpriv, COMP_HIPWR, DBG_LOUD,
546
- "5G:TxHighPwrLevel_Normal\n");
523
+ rtl_dbg(rtlpriv, COMP_HIPWR, DBG_LOUD,
524
+ "5G:TxHighPwrLevel_Normal\n");
547525 }
548526 } else {
549527 if (undec_sm_pwdb >=
550528 TX_POWER_NEAR_FIELD_THRESH_LVL2) {
551529 rtlpriv->dm.dynamic_txhighpower_lvl =
552530 TXHIGHPWRLEVEL_LEVEL2;
553
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
554
- "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
531
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
532
+ "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
555533 } else
556534 if ((undec_sm_pwdb <
557535 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3))
....@@ -560,20 +538,20 @@
560538
561539 rtlpriv->dm.dynamic_txhighpower_lvl =
562540 TXHIGHPWRLEVEL_LEVEL1;
563
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
564
- "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
541
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
542
+ "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
565543 } else if (undec_sm_pwdb <
566544 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
567545 rtlpriv->dm.dynamic_txhighpower_lvl =
568546 TXHIGHPWRLEVEL_NORMAL;
569
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
570
- "TXHIGHPWRLEVEL_NORMAL\n");
547
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
548
+ "TXHIGHPWRLEVEL_NORMAL\n");
571549 }
572550 }
573551 if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
574
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
575
- "PHY_SetTxPowerLevel8192S() Channel = %d\n",
576
- rtlphy->current_channel);
552
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
553
+ "PHY_SetTxPowerLevel8192S() Channel = %d\n",
554
+ rtlphy->current_channel);
577555 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
578556 }
579557 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
....@@ -688,8 +666,8 @@
688666
689667 u4tmp = (index_mapping[(rtlpriv->efuse.eeprom_thermalmeter -
690668 rtlpriv->dm.thermalvalue_rxgain)]) << 12;
691
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
692
- "===> Rx Gain %x\n", u4tmp);
669
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
670
+ "===> Rx Gain %x\n", u4tmp);
693671 for (i = RF90_PATH_A; i < rtlpriv->phy.num_total_rfpath; i++)
694672 rtl_set_rfreg(hw, i, 0x3C, RFREG_OFFSET_MASK,
695673 (rtlpriv->phy.reg_rf3c[i] & (~(0xF000))) | u4tmp);
....@@ -702,6 +680,7 @@
702680 int i;
703681 unsigned long flag = 0;
704682 long temp_cck;
683
+ const u8 *cckswing;
705684
706685 /* Query CCK default setting From 0xa24 */
707686 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
....@@ -709,28 +688,19 @@
709688 MASKDWORD) & MASKCCK;
710689 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
711690 for (i = 0; i < CCK_TABLE_LENGTH; i++) {
712
- if (rtlpriv->dm.cck_inch14) {
713
- if (!memcmp((void *)&temp_cck,
714
- (void *)&cckswing_table_ch14[i][2], 4)) {
715
- *cck_index_old = (u8) i;
716
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
717
- "Initial reg0x%x = 0x%lx, cck_index=0x%x, ch 14 %d\n",
718
- RCCK0_TXFILTER2, temp_cck,
719
- *cck_index_old,
720
- rtlpriv->dm.cck_inch14);
721
- break;
722
- }
723
- } else {
724
- if (!memcmp((void *) &temp_cck,
725
- &cckswing_table_ch1ch13[i][2], 4)) {
726
- *cck_index_old = (u8) i;
727
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
728
- "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
729
- RCCK0_TXFILTER2, temp_cck,
730
- *cck_index_old,
731
- rtlpriv->dm.cck_inch14);
732
- break;
733
- }
691
+ if (rtlpriv->dm.cck_inch14)
692
+ cckswing = &cckswing_table_ch14[i][2];
693
+ else
694
+ cckswing = &cckswing_table_ch1ch13[i][2];
695
+
696
+ if (temp_cck == le32_to_cpu(*((__le32 *)cckswing))) {
697
+ *cck_index_old = (u8)i;
698
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
699
+ "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
700
+ RCCK0_TXFILTER2, temp_cck,
701
+ *cck_index_old,
702
+ rtlpriv->dm.cck_inch14);
703
+ break;
734704 }
735705 }
736706 *temp_cckg = temp_cck;
....@@ -740,8 +710,8 @@
740710 bool *internal_pa, u8 thermalvalue, u8 delta,
741711 u8 rf, struct rtl_efuse *rtlefuse,
742712 struct rtl_priv *rtlpriv, struct rtl_phy *rtlphy,
743
- u8 index_mapping[5][INDEX_MAPPING_NUM],
744
- u8 index_mapping_pa[8][INDEX_MAPPING_NUM])
713
+ const u8 index_mapping[5][INDEX_MAPPING_NUM],
714
+ const u8 index_mapping_pa[8][INDEX_MAPPING_NUM])
745715 {
746716 int i;
747717 u8 index;
....@@ -809,9 +779,9 @@
809779 bool internal_pa = false;
810780 long ele_a = 0, ele_d, temp_cck, val_x, value32;
811781 long val_y, ele_c = 0;
812
- u8 ofdm_index[3];
782
+ u8 ofdm_index[2];
813783 s8 cck_index = 0;
814
- u8 ofdm_index_old[3] = {0, 0, 0};
784
+ u8 ofdm_index_old[2] = {0, 0};
815785 s8 cck_index_old = 0;
816786 u8 index;
817787 int i;
....@@ -819,7 +789,7 @@
819789 u8 ofdm_min_index = 6, ofdm_min_index_internal_pa = 3, rf;
820790 u8 indexforchannel =
821791 rtl92d_get_rightchnlplace_for_iqk(rtlphy->current_channel);
822
- u8 index_mapping[5][INDEX_MAPPING_NUM] = {
792
+ static const u8 index_mapping[5][INDEX_MAPPING_NUM] = {
823793 /* 5G, path A/MAC 0, decrease power */
824794 {0, 1, 3, 6, 8, 9, 11, 13, 14, 16, 17, 18, 18},
825795 /* 5G, path A/MAC 0, increase power */
....@@ -831,7 +801,7 @@
831801 /* 2.4G, for decreas power */
832802 {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10},
833803 };
834
- u8 index_mapping_internal_pa[8][INDEX_MAPPING_NUM] = {
804
+ static const u8 index_mapping_internal_pa[8][INDEX_MAPPING_NUM] = {
835805 /* 5G, path A/MAC 0, ch36-64, decrease power */
836806 {0, 1, 2, 4, 6, 7, 9, 11, 12, 14, 15, 16, 16},
837807 /* 5G, path A/MAC 0, ch36-64, increase power */
....@@ -851,374 +821,347 @@
851821 };
852822
853823 rtlpriv->dm.txpower_trackinginit = true;
854
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "\n");
824
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "\n");
855825 thermalvalue = (u8) rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0xf800);
856
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
857
- "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
858
- thermalvalue,
859
- rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter);
826
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
827
+ "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
828
+ thermalvalue,
829
+ rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter);
860830 rtl92d_phy_ap_calibrate(hw, (thermalvalue -
861831 rtlefuse->eeprom_thermalmeter));
832
+
833
+ if (!thermalvalue)
834
+ goto exit;
835
+
862836 if (is2t)
863837 rf = 2;
864838 else
865839 rf = 1;
866
- if (thermalvalue) {
867
- ele_d = rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
840
+
841
+ if (rtlpriv->dm.thermalvalue && !rtlhal->reloadtxpowerindex)
842
+ goto old_index_done;
843
+
844
+ ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD) & MASKOFDM_D;
845
+ for (i = 0; i < OFDM_TABLE_SIZE_92D; i++) {
846
+ if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
847
+ ofdm_index_old[0] = (u8)i;
848
+
849
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
850
+ "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
851
+ ROFDM0_XATXIQIMBALANCE,
852
+ ele_d, ofdm_index_old[0]);
853
+ break;
854
+ }
855
+ }
856
+ if (is2t) {
857
+ ele_d = rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
868858 MASKDWORD) & MASKOFDM_D;
869859 for (i = 0; i < OFDM_TABLE_SIZE_92D; i++) {
870
- if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
871
- ofdm_index_old[0] = (u8) i;
872
-
873
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
874
- "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index=0x%x\n",
875
- ROFDM0_XATxIQIMBALANCE,
876
- ele_d, ofdm_index_old[0]);
860
+ if (ele_d ==
861
+ (ofdmswing_table[i] & MASKOFDM_D)) {
862
+ ofdm_index_old[1] = (u8)i;
863
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING,
864
+ DBG_LOUD,
865
+ "Initial pathB ele_d reg 0x%x = 0x%lx, ofdm_index = 0x%x\n",
866
+ ROFDM0_XBTXIQIMBALANCE, ele_d,
867
+ ofdm_index_old[1]);
877868 break;
878869 }
879870 }
880
- if (is2t) {
881
- ele_d = rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
882
- MASKDWORD) & MASKOFDM_D;
883
- for (i = 0; i < OFDM_TABLE_SIZE_92D; i++) {
884
- if (ele_d ==
885
- (ofdmswing_table[i] & MASKOFDM_D)) {
886
- ofdm_index_old[1] = (u8) i;
887
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
888
- DBG_LOUD,
889
- "Initial pathB ele_d reg 0x%x = 0x%lx, ofdm_index = 0x%x\n",
890
- ROFDM0_XBTxIQIMBALANCE, ele_d,
891
- ofdm_index_old[1]);
892
- break;
893
- }
894
- }
895
- }
896
- if (rtlhal->current_bandtype == BAND_ON_2_4G) {
897
- rtl92d_bandtype_2_4G(hw, &temp_cck, &cck_index_old);
898
- } else {
899
- temp_cck = 0x090e1317;
900
- cck_index_old = 12;
901
- }
902
-
903
- if (!rtlpriv->dm.thermalvalue) {
904
- rtlpriv->dm.thermalvalue =
905
- rtlefuse->eeprom_thermalmeter;
906
- rtlpriv->dm.thermalvalue_lck = thermalvalue;
907
- rtlpriv->dm.thermalvalue_iqk = thermalvalue;
908
- rtlpriv->dm.thermalvalue_rxgain =
909
- rtlefuse->eeprom_thermalmeter;
910
- for (i = 0; i < rf; i++)
911
- rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
912
- rtlpriv->dm.cck_index = cck_index_old;
913
- }
914
- if (rtlhal->reloadtxpowerindex) {
915
- for (i = 0; i < rf; i++)
916
- rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
917
- rtlpriv->dm.cck_index = cck_index_old;
918
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
919
- "reload ofdm index for band switch\n");
920
- }
921
- rtlpriv->dm.thermalvalue_avg
922
- [rtlpriv->dm.thermalvalue_avg_index] = thermalvalue;
923
- rtlpriv->dm.thermalvalue_avg_index++;
924
- if (rtlpriv->dm.thermalvalue_avg_index == AVG_THERMAL_NUM)
925
- rtlpriv->dm.thermalvalue_avg_index = 0;
926
- for (i = 0; i < AVG_THERMAL_NUM; i++) {
927
- if (rtlpriv->dm.thermalvalue_avg[i]) {
928
- thermalvalue_avg +=
929
- rtlpriv->dm.thermalvalue_avg[i];
930
- thermalvalue_avg_count++;
931
- }
932
- }
933
- if (thermalvalue_avg_count)
934
- thermalvalue = (u8) (thermalvalue_avg /
935
- thermalvalue_avg_count);
936
- if (rtlhal->reloadtxpowerindex) {
937
- delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
938
- (thermalvalue - rtlefuse->eeprom_thermalmeter) :
939
- (rtlefuse->eeprom_thermalmeter - thermalvalue);
940
- rtlhal->reloadtxpowerindex = false;
941
- rtlpriv->dm.done_txpower = false;
942
- } else if (rtlpriv->dm.done_txpower) {
943
- delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
944
- (thermalvalue - rtlpriv->dm.thermalvalue) :
945
- (rtlpriv->dm.thermalvalue - thermalvalue);
946
- } else {
947
- delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
948
- (thermalvalue - rtlefuse->eeprom_thermalmeter) :
949
- (rtlefuse->eeprom_thermalmeter - thermalvalue);
950
- }
951
- delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
952
- (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
953
- (rtlpriv->dm.thermalvalue_lck - thermalvalue);
954
- delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
955
- (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
956
- (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
957
- delta_rxgain =
958
- (thermalvalue > rtlpriv->dm.thermalvalue_rxgain) ?
959
- (thermalvalue - rtlpriv->dm.thermalvalue_rxgain) :
960
- (rtlpriv->dm.thermalvalue_rxgain - thermalvalue);
961
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
962
- "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
963
- thermalvalue, rtlpriv->dm.thermalvalue,
964
- rtlefuse->eeprom_thermalmeter, delta, delta_lck,
965
- delta_iqk);
966
- if ((delta_lck > rtlefuse->delta_lck) &&
967
- (rtlefuse->delta_lck != 0)) {
968
- rtlpriv->dm.thermalvalue_lck = thermalvalue;
969
- rtl92d_phy_lc_calibrate(hw);
970
- }
971
- if (delta > 0 && rtlpriv->dm.txpower_track_control) {
972
- rtlpriv->dm.done_txpower = true;
973
- delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
974
- (thermalvalue - rtlefuse->eeprom_thermalmeter) :
975
- (rtlefuse->eeprom_thermalmeter - thermalvalue);
976
- if (rtlhal->current_bandtype == BAND_ON_2_4G) {
977
- offset = 4;
978
- if (delta > INDEX_MAPPING_NUM - 1)
979
- index = index_mapping[offset]
980
- [INDEX_MAPPING_NUM - 1];
981
- else
982
- index = index_mapping[offset][delta];
983
- if (thermalvalue > rtlpriv->dm.thermalvalue) {
984
- for (i = 0; i < rf; i++)
985
- ofdm_index[i] -= delta;
986
- cck_index -= delta;
987
- } else {
988
- for (i = 0; i < rf; i++)
989
- ofdm_index[i] += index;
990
- cck_index += index;
991
- }
992
- } else if (rtlhal->current_bandtype == BAND_ON_5G) {
993
- rtl92d_bandtype_5G(rtlhal, ofdm_index,
994
- &internal_pa, thermalvalue,
995
- delta, rf, rtlefuse, rtlpriv,
996
- rtlphy, index_mapping,
997
- index_mapping_internal_pa);
998
- }
999
- if (is2t) {
1000
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1001
- "temp OFDM_A_index=0x%x, OFDM_B_index = 0x%x,cck_index=0x%x\n",
1002
- rtlpriv->dm.ofdm_index[0],
1003
- rtlpriv->dm.ofdm_index[1],
1004
- rtlpriv->dm.cck_index);
1005
- } else {
1006
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1007
- "temp OFDM_A_index=0x%x,cck_index = 0x%x\n",
1008
- rtlpriv->dm.ofdm_index[0],
1009
- rtlpriv->dm.cck_index);
1010
- }
1011
- for (i = 0; i < rf; i++) {
1012
- if (ofdm_index[i] > OFDM_TABLE_SIZE_92D - 1)
1013
- ofdm_index[i] = OFDM_TABLE_SIZE_92D - 1;
1014
- else if (ofdm_index[i] < ofdm_min_index)
1015
- ofdm_index[i] = ofdm_min_index;
1016
- }
1017
- if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1018
- if (cck_index > CCK_TABLE_SIZE - 1) {
1019
- cck_index = CCK_TABLE_SIZE - 1;
1020
- } else if (internal_pa ||
1021
- rtlhal->current_bandtype ==
1022
- BAND_ON_2_4G) {
1023
- if (ofdm_index[i] <
1024
- ofdm_min_index_internal_pa)
1025
- ofdm_index[i] =
1026
- ofdm_min_index_internal_pa;
1027
- } else if (cck_index < 0) {
1028
- cck_index = 0;
1029
- }
1030
- }
1031
- if (is2t) {
1032
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1033
- "new OFDM_A_index=0x%x, OFDM_B_index = 0x%x, cck_index=0x%x\n",
1034
- ofdm_index[0], ofdm_index[1],
1035
- cck_index);
1036
- } else {
1037
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1038
- "new OFDM_A_index=0x%x,cck_index = 0x%x\n",
1039
- ofdm_index[0], cck_index);
1040
- }
1041
- ele_d = (ofdmswing_table[(u8) ofdm_index[0]] &
1042
- 0xFFC00000) >> 22;
1043
- val_x = rtlphy->iqk_matrix
1044
- [indexforchannel].value[0][0];
1045
- val_y = rtlphy->iqk_matrix
1046
- [indexforchannel].value[0][1];
1047
- if (val_x != 0) {
1048
- if ((val_x & 0x00000200) != 0)
1049
- val_x = val_x | 0xFFFFFC00;
1050
- ele_a =
1051
- ((val_x * ele_d) >> 8) & 0x000003FF;
1052
-
1053
- /* new element C = element D x Y */
1054
- if ((val_y & 0x00000200) != 0)
1055
- val_y = val_y | 0xFFFFFC00;
1056
- ele_c = ((val_y * ele_d) >> 8) & 0x000003FF;
1057
-
1058
- /* wirte new elements A, C, D to regC80 and
1059
- * regC94, element B is always 0 */
1060
- value32 = (ele_d << 22) | ((ele_c & 0x3F) <<
1061
- 16) | ele_a;
1062
- rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
1063
- MASKDWORD, value32);
1064
-
1065
- value32 = (ele_c & 0x000003C0) >> 6;
1066
- rtl_set_bbreg(hw, ROFDM0_XCTxAFE, MASKH4BITS,
1067
- value32);
1068
-
1069
- value32 = ((val_x * ele_d) >> 7) & 0x01;
1070
- rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
1071
- value32);
1072
-
1073
- } else {
1074
- rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
1075
- MASKDWORD,
1076
- ofdmswing_table
1077
- [(u8)ofdm_index[0]]);
1078
- rtl_set_bbreg(hw, ROFDM0_XCTxAFE, MASKH4BITS,
1079
- 0x00);
1080
- rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1081
- BIT(24), 0x00);
1082
- }
1083
-
1084
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1085
- "TxPwrTracking for interface %d path A: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xe94 = 0x%lx 0xe9c = 0x%lx\n",
1086
- rtlhal->interfaceindex,
1087
- val_x, val_y, ele_a, ele_c, ele_d,
1088
- val_x, val_y);
1089
-
1090
- if (cck_index >= CCK_TABLE_SIZE)
1091
- cck_index = CCK_TABLE_SIZE - 1;
1092
- if (cck_index < 0)
1093
- cck_index = 0;
1094
- if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1095
- /* Adjust CCK according to IQK result */
1096
- if (!rtlpriv->dm.cck_inch14) {
1097
- rtl_write_byte(rtlpriv, 0xa22,
1098
- cckswing_table_ch1ch13
1099
- [(u8)cck_index][0]);
1100
- rtl_write_byte(rtlpriv, 0xa23,
1101
- cckswing_table_ch1ch13
1102
- [(u8)cck_index][1]);
1103
- rtl_write_byte(rtlpriv, 0xa24,
1104
- cckswing_table_ch1ch13
1105
- [(u8)cck_index][2]);
1106
- rtl_write_byte(rtlpriv, 0xa25,
1107
- cckswing_table_ch1ch13
1108
- [(u8)cck_index][3]);
1109
- rtl_write_byte(rtlpriv, 0xa26,
1110
- cckswing_table_ch1ch13
1111
- [(u8)cck_index][4]);
1112
- rtl_write_byte(rtlpriv, 0xa27,
1113
- cckswing_table_ch1ch13
1114
- [(u8)cck_index][5]);
1115
- rtl_write_byte(rtlpriv, 0xa28,
1116
- cckswing_table_ch1ch13
1117
- [(u8)cck_index][6]);
1118
- rtl_write_byte(rtlpriv, 0xa29,
1119
- cckswing_table_ch1ch13
1120
- [(u8)cck_index][7]);
1121
- } else {
1122
- rtl_write_byte(rtlpriv, 0xa22,
1123
- cckswing_table_ch14
1124
- [(u8)cck_index][0]);
1125
- rtl_write_byte(rtlpriv, 0xa23,
1126
- cckswing_table_ch14
1127
- [(u8)cck_index][1]);
1128
- rtl_write_byte(rtlpriv, 0xa24,
1129
- cckswing_table_ch14
1130
- [(u8)cck_index][2]);
1131
- rtl_write_byte(rtlpriv, 0xa25,
1132
- cckswing_table_ch14
1133
- [(u8)cck_index][3]);
1134
- rtl_write_byte(rtlpriv, 0xa26,
1135
- cckswing_table_ch14
1136
- [(u8)cck_index][4]);
1137
- rtl_write_byte(rtlpriv, 0xa27,
1138
- cckswing_table_ch14
1139
- [(u8)cck_index][5]);
1140
- rtl_write_byte(rtlpriv, 0xa28,
1141
- cckswing_table_ch14
1142
- [(u8)cck_index][6]);
1143
- rtl_write_byte(rtlpriv, 0xa29,
1144
- cckswing_table_ch14
1145
- [(u8)cck_index][7]);
1146
- }
1147
- }
1148
- if (is2t) {
1149
- ele_d = (ofdmswing_table[(u8) ofdm_index[1]] &
1150
- 0xFFC00000) >> 22;
1151
- val_x = rtlphy->iqk_matrix
1152
- [indexforchannel].value[0][4];
1153
- val_y = rtlphy->iqk_matrix
1154
- [indexforchannel].value[0][5];
1155
- if (val_x != 0) {
1156
- if ((val_x & 0x00000200) != 0)
1157
- /* consider minus */
1158
- val_x = val_x | 0xFFFFFC00;
1159
- ele_a = ((val_x * ele_d) >> 8) &
1160
- 0x000003FF;
1161
- /* new element C = element D x Y */
1162
- if ((val_y & 0x00000200) != 0)
1163
- val_y =
1164
- val_y | 0xFFFFFC00;
1165
- ele_c =
1166
- ((val_y *
1167
- ele_d) >> 8) & 0x00003FF;
1168
- /* write new elements A, C, D to regC88
1169
- * and regC9C, element B is always 0
1170
- */
1171
- value32 = (ele_d << 22) |
1172
- ((ele_c & 0x3F) << 16) |
1173
- ele_a;
1174
- rtl_set_bbreg(hw,
1175
- ROFDM0_XBTxIQIMBALANCE,
1176
- MASKDWORD, value32);
1177
- value32 = (ele_c & 0x000003C0) >> 6;
1178
- rtl_set_bbreg(hw, ROFDM0_XDTxAFE,
1179
- MASKH4BITS, value32);
1180
- value32 = ((val_x * ele_d) >> 7) & 0x01;
1181
- rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1182
- BIT(28), value32);
1183
- } else {
1184
- rtl_set_bbreg(hw,
1185
- ROFDM0_XBTxIQIMBALANCE,
1186
- MASKDWORD,
1187
- ofdmswing_table
1188
- [(u8) ofdm_index[1]]);
1189
- rtl_set_bbreg(hw, ROFDM0_XDTxAFE,
1190
- MASKH4BITS, 0x00);
1191
- rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1192
- BIT(28), 0x00);
1193
- }
1194
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1195
- "TxPwrTracking path B: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xeb4 = 0x%lx 0xebc = 0x%lx\n",
1196
- val_x, val_y, ele_a, ele_c,
1197
- ele_d, val_x, val_y);
1198
- }
1199
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1200
- "TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n",
1201
- rtl_get_bbreg(hw, 0xc80, MASKDWORD),
1202
- rtl_get_bbreg(hw, 0xc94, MASKDWORD),
1203
- rtl_get_rfreg(hw, RF90_PATH_A, 0x24,
1204
- RFREG_OFFSET_MASK));
1205
- }
1206
- if ((delta_iqk > rtlefuse->delta_iqk) &&
1207
- (rtlefuse->delta_iqk != 0)) {
1208
- rtl92d_phy_reset_iqk_result(hw);
1209
- rtlpriv->dm.thermalvalue_iqk = thermalvalue;
1210
- rtl92d_phy_iq_calibrate(hw);
1211
- }
1212
- if (delta_rxgain > 0 && rtlhal->current_bandtype == BAND_ON_5G
1213
- && thermalvalue <= rtlefuse->eeprom_thermalmeter) {
1214
- rtlpriv->dm.thermalvalue_rxgain = thermalvalue;
1215
- rtl92d_dm_rxgain_tracking_thermalmeter(hw);
1216
- }
1217
- if (rtlpriv->dm.txpower_track_control)
1218
- rtlpriv->dm.thermalvalue = thermalvalue;
871
+ }
872
+ if (rtlhal->current_bandtype == BAND_ON_2_4G) {
873
+ rtl92d_bandtype_2_4G(hw, &temp_cck, &cck_index_old);
874
+ } else {
875
+ temp_cck = 0x090e1317;
876
+ cck_index_old = 12;
1219877 }
1220878
1221
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===\n");
879
+ if (!rtlpriv->dm.thermalvalue) {
880
+ rtlpriv->dm.thermalvalue = rtlefuse->eeprom_thermalmeter;
881
+ rtlpriv->dm.thermalvalue_lck = thermalvalue;
882
+ rtlpriv->dm.thermalvalue_iqk = thermalvalue;
883
+ rtlpriv->dm.thermalvalue_rxgain = rtlefuse->eeprom_thermalmeter;
884
+ for (i = 0; i < rf; i++)
885
+ rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
886
+ rtlpriv->dm.cck_index = cck_index_old;
887
+ }
888
+ if (rtlhal->reloadtxpowerindex) {
889
+ for (i = 0; i < rf; i++)
890
+ rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
891
+ rtlpriv->dm.cck_index = cck_index_old;
892
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
893
+ "reload ofdm index for band switch\n");
894
+ }
895
+old_index_done:
896
+ for (i = 0; i < rf; i++)
897
+ ofdm_index[i] = rtlpriv->dm.ofdm_index[i];
898
+
899
+ rtlpriv->dm.thermalvalue_avg
900
+ [rtlpriv->dm.thermalvalue_avg_index] = thermalvalue;
901
+ rtlpriv->dm.thermalvalue_avg_index++;
902
+ if (rtlpriv->dm.thermalvalue_avg_index == AVG_THERMAL_NUM)
903
+ rtlpriv->dm.thermalvalue_avg_index = 0;
904
+ for (i = 0; i < AVG_THERMAL_NUM; i++) {
905
+ if (rtlpriv->dm.thermalvalue_avg[i]) {
906
+ thermalvalue_avg += rtlpriv->dm.thermalvalue_avg[i];
907
+ thermalvalue_avg_count++;
908
+ }
909
+ }
910
+ if (thermalvalue_avg_count)
911
+ thermalvalue = (u8)(thermalvalue_avg / thermalvalue_avg_count);
912
+ if (rtlhal->reloadtxpowerindex) {
913
+ delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
914
+ (thermalvalue - rtlefuse->eeprom_thermalmeter) :
915
+ (rtlefuse->eeprom_thermalmeter - thermalvalue);
916
+ rtlhal->reloadtxpowerindex = false;
917
+ rtlpriv->dm.done_txpower = false;
918
+ } else if (rtlpriv->dm.done_txpower) {
919
+ delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
920
+ (thermalvalue - rtlpriv->dm.thermalvalue) :
921
+ (rtlpriv->dm.thermalvalue - thermalvalue);
922
+ } else {
923
+ delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
924
+ (thermalvalue - rtlefuse->eeprom_thermalmeter) :
925
+ (rtlefuse->eeprom_thermalmeter - thermalvalue);
926
+ }
927
+ delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
928
+ (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
929
+ (rtlpriv->dm.thermalvalue_lck - thermalvalue);
930
+ delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
931
+ (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
932
+ (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
933
+ delta_rxgain =
934
+ (thermalvalue > rtlpriv->dm.thermalvalue_rxgain) ?
935
+ (thermalvalue - rtlpriv->dm.thermalvalue_rxgain) :
936
+ (rtlpriv->dm.thermalvalue_rxgain - thermalvalue);
937
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
938
+ "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
939
+ thermalvalue, rtlpriv->dm.thermalvalue,
940
+ rtlefuse->eeprom_thermalmeter, delta, delta_lck,
941
+ delta_iqk);
942
+ if (delta_lck > rtlefuse->delta_lck && rtlefuse->delta_lck != 0) {
943
+ rtlpriv->dm.thermalvalue_lck = thermalvalue;
944
+ rtl92d_phy_lc_calibrate(hw);
945
+ }
946
+
947
+ if (delta == 0 || !rtlpriv->dm.txpower_track_control)
948
+ goto check_delta;
949
+
950
+ rtlpriv->dm.done_txpower = true;
951
+ delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
952
+ (thermalvalue - rtlefuse->eeprom_thermalmeter) :
953
+ (rtlefuse->eeprom_thermalmeter - thermalvalue);
954
+ if (rtlhal->current_bandtype == BAND_ON_2_4G) {
955
+ offset = 4;
956
+ if (delta > INDEX_MAPPING_NUM - 1)
957
+ index = index_mapping[offset][INDEX_MAPPING_NUM - 1];
958
+ else
959
+ index = index_mapping[offset][delta];
960
+ if (thermalvalue > rtlpriv->dm.thermalvalue) {
961
+ for (i = 0; i < rf; i++)
962
+ ofdm_index[i] -= delta;
963
+ cck_index -= delta;
964
+ } else {
965
+ for (i = 0; i < rf; i++)
966
+ ofdm_index[i] += index;
967
+ cck_index += index;
968
+ }
969
+ } else if (rtlhal->current_bandtype == BAND_ON_5G) {
970
+ rtl92d_bandtype_5G(rtlhal, ofdm_index,
971
+ &internal_pa, thermalvalue,
972
+ delta, rf, rtlefuse, rtlpriv,
973
+ rtlphy, index_mapping,
974
+ index_mapping_internal_pa);
975
+ }
976
+ if (is2t) {
977
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
978
+ "temp OFDM_A_index=0x%x, OFDM_B_index = 0x%x,cck_index=0x%x\n",
979
+ rtlpriv->dm.ofdm_index[0],
980
+ rtlpriv->dm.ofdm_index[1],
981
+ rtlpriv->dm.cck_index);
982
+ } else {
983
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
984
+ "temp OFDM_A_index=0x%x,cck_index = 0x%x\n",
985
+ rtlpriv->dm.ofdm_index[0],
986
+ rtlpriv->dm.cck_index);
987
+ }
988
+ for (i = 0; i < rf; i++) {
989
+ if (ofdm_index[i] > OFDM_TABLE_SIZE_92D - 1)
990
+ ofdm_index[i] = OFDM_TABLE_SIZE_92D - 1;
991
+ else if (ofdm_index[i] < ofdm_min_index)
992
+ ofdm_index[i] = ofdm_min_index;
993
+ }
994
+ if (rtlhal->current_bandtype == BAND_ON_2_4G) {
995
+ if (cck_index > CCK_TABLE_SIZE - 1) {
996
+ cck_index = CCK_TABLE_SIZE - 1;
997
+ } else if (internal_pa ||
998
+ rtlhal->current_bandtype == BAND_ON_2_4G) {
999
+ if (ofdm_index[i] < ofdm_min_index_internal_pa)
1000
+ ofdm_index[i] = ofdm_min_index_internal_pa;
1001
+ } else if (cck_index < 0) {
1002
+ cck_index = 0;
1003
+ }
1004
+ }
1005
+ if (is2t) {
1006
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1007
+ "new OFDM_A_index=0x%x, OFDM_B_index = 0x%x, cck_index=0x%x\n",
1008
+ ofdm_index[0], ofdm_index[1],
1009
+ cck_index);
1010
+ } else {
1011
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1012
+ "new OFDM_A_index=0x%x,cck_index = 0x%x\n",
1013
+ ofdm_index[0], cck_index);
1014
+ }
1015
+ ele_d = (ofdmswing_table[ofdm_index[0]] & 0xFFC00000) >> 22;
1016
+ val_x = rtlphy->iqk_matrix[indexforchannel].value[0][0];
1017
+ val_y = rtlphy->iqk_matrix[indexforchannel].value[0][1];
1018
+ if (val_x != 0) {
1019
+ if ((val_x & 0x00000200) != 0)
1020
+ val_x = val_x | 0xFFFFFC00;
1021
+ ele_a = ((val_x * ele_d) >> 8) & 0x000003FF;
1022
+
1023
+ /* new element C = element D x Y */
1024
+ if ((val_y & 0x00000200) != 0)
1025
+ val_y = val_y | 0xFFFFFC00;
1026
+ ele_c = ((val_y * ele_d) >> 8) & 0x000003FF;
1027
+
1028
+ /* write new elements A, C, D to regC80 and
1029
+ * regC94, element B is always 0
1030
+ */
1031
+ value32 = (ele_d << 22) | ((ele_c & 0x3F) << 16) | ele_a;
1032
+ rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
1033
+ MASKDWORD, value32);
1034
+
1035
+ value32 = (ele_c & 0x000003C0) >> 6;
1036
+ rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
1037
+ value32);
1038
+
1039
+ value32 = ((val_x * ele_d) >> 7) & 0x01;
1040
+ rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
1041
+ value32);
1042
+
1043
+ } else {
1044
+ rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
1045
+ MASKDWORD,
1046
+ ofdmswing_table[(u8)ofdm_index[0]]);
1047
+ rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
1048
+ 0x00);
1049
+ rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1050
+ BIT(24), 0x00);
1051
+ }
1052
+
1053
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1054
+ "TxPwrTracking for interface %d path A: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xe94 = 0x%lx 0xe9c = 0x%lx\n",
1055
+ rtlhal->interfaceindex,
1056
+ val_x, val_y, ele_a, ele_c, ele_d,
1057
+ val_x, val_y);
1058
+
1059
+ if (cck_index >= CCK_TABLE_SIZE)
1060
+ cck_index = CCK_TABLE_SIZE - 1;
1061
+ if (cck_index < 0)
1062
+ cck_index = 0;
1063
+ if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1064
+ /* Adjust CCK according to IQK result */
1065
+ if (!rtlpriv->dm.cck_inch14) {
1066
+ rtl_write_byte(rtlpriv, 0xa22,
1067
+ cckswing_table_ch1ch13[cck_index][0]);
1068
+ rtl_write_byte(rtlpriv, 0xa23,
1069
+ cckswing_table_ch1ch13[cck_index][1]);
1070
+ rtl_write_byte(rtlpriv, 0xa24,
1071
+ cckswing_table_ch1ch13[cck_index][2]);
1072
+ rtl_write_byte(rtlpriv, 0xa25,
1073
+ cckswing_table_ch1ch13[cck_index][3]);
1074
+ rtl_write_byte(rtlpriv, 0xa26,
1075
+ cckswing_table_ch1ch13[cck_index][4]);
1076
+ rtl_write_byte(rtlpriv, 0xa27,
1077
+ cckswing_table_ch1ch13[cck_index][5]);
1078
+ rtl_write_byte(rtlpriv, 0xa28,
1079
+ cckswing_table_ch1ch13[cck_index][6]);
1080
+ rtl_write_byte(rtlpriv, 0xa29,
1081
+ cckswing_table_ch1ch13[cck_index][7]);
1082
+ } else {
1083
+ rtl_write_byte(rtlpriv, 0xa22,
1084
+ cckswing_table_ch14[cck_index][0]);
1085
+ rtl_write_byte(rtlpriv, 0xa23,
1086
+ cckswing_table_ch14[cck_index][1]);
1087
+ rtl_write_byte(rtlpriv, 0xa24,
1088
+ cckswing_table_ch14[cck_index][2]);
1089
+ rtl_write_byte(rtlpriv, 0xa25,
1090
+ cckswing_table_ch14[cck_index][3]);
1091
+ rtl_write_byte(rtlpriv, 0xa26,
1092
+ cckswing_table_ch14[cck_index][4]);
1093
+ rtl_write_byte(rtlpriv, 0xa27,
1094
+ cckswing_table_ch14[cck_index][5]);
1095
+ rtl_write_byte(rtlpriv, 0xa28,
1096
+ cckswing_table_ch14[cck_index][6]);
1097
+ rtl_write_byte(rtlpriv, 0xa29,
1098
+ cckswing_table_ch14[cck_index][7]);
1099
+ }
1100
+ }
1101
+ if (is2t) {
1102
+ ele_d = (ofdmswing_table[ofdm_index[1]] & 0xFFC00000) >> 22;
1103
+ val_x = rtlphy->iqk_matrix[indexforchannel].value[0][4];
1104
+ val_y = rtlphy->iqk_matrix[indexforchannel].value[0][5];
1105
+ if (val_x != 0) {
1106
+ if ((val_x & 0x00000200) != 0)
1107
+ /* consider minus */
1108
+ val_x = val_x | 0xFFFFFC00;
1109
+ ele_a = ((val_x * ele_d) >> 8) & 0x000003FF;
1110
+ /* new element C = element D x Y */
1111
+ if ((val_y & 0x00000200) != 0)
1112
+ val_y = val_y | 0xFFFFFC00;
1113
+ ele_c = ((val_y * ele_d) >> 8) & 0x00003FF;
1114
+ /* write new elements A, C, D to regC88
1115
+ * and regC9C, element B is always 0
1116
+ */
1117
+ value32 = (ele_d << 22) | ((ele_c & 0x3F) << 16) | ele_a;
1118
+ rtl_set_bbreg(hw,
1119
+ ROFDM0_XBTXIQIMBALANCE,
1120
+ MASKDWORD, value32);
1121
+ value32 = (ele_c & 0x000003C0) >> 6;
1122
+ rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
1123
+ MASKH4BITS, value32);
1124
+ value32 = ((val_x * ele_d) >> 7) & 0x01;
1125
+ rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1126
+ BIT(28), value32);
1127
+ } else {
1128
+ rtl_set_bbreg(hw,
1129
+ ROFDM0_XBTXIQIMBALANCE,
1130
+ MASKDWORD,
1131
+ ofdmswing_table[ofdm_index[1]]);
1132
+ rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
1133
+ MASKH4BITS, 0x00);
1134
+ rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
1135
+ BIT(28), 0x00);
1136
+ }
1137
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1138
+ "TxPwrTracking path B: X = 0x%lx, Y = 0x%lx ele_A = 0x%lx ele_C = 0x%lx ele_D = 0x%lx 0xeb4 = 0x%lx 0xebc = 0x%lx\n",
1139
+ val_x, val_y, ele_a, ele_c,
1140
+ ele_d, val_x, val_y);
1141
+ }
1142
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1143
+ "TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n",
1144
+ rtl_get_bbreg(hw, 0xc80, MASKDWORD),
1145
+ rtl_get_bbreg(hw, 0xc94, MASKDWORD),
1146
+ rtl_get_rfreg(hw, RF90_PATH_A, 0x24,
1147
+ RFREG_OFFSET_MASK));
1148
+
1149
+check_delta:
1150
+ if (delta_iqk > rtlefuse->delta_iqk && rtlefuse->delta_iqk != 0) {
1151
+ rtl92d_phy_reset_iqk_result(hw);
1152
+ rtlpriv->dm.thermalvalue_iqk = thermalvalue;
1153
+ rtl92d_phy_iq_calibrate(hw);
1154
+ }
1155
+ if (delta_rxgain > 0 && rtlhal->current_bandtype == BAND_ON_5G &&
1156
+ thermalvalue <= rtlefuse->eeprom_thermalmeter) {
1157
+ rtlpriv->dm.thermalvalue_rxgain = thermalvalue;
1158
+ rtl92d_dm_rxgain_tracking_thermalmeter(hw);
1159
+ }
1160
+ if (rtlpriv->dm.txpower_track_control)
1161
+ rtlpriv->dm.thermalvalue = thermalvalue;
1162
+
1163
+exit:
1164
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===\n");
12221165 }
12231166
12241167 static void rtl92d_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
....@@ -1228,9 +1171,9 @@
12281171 rtlpriv->dm.txpower_tracking = true;
12291172 rtlpriv->dm.txpower_trackinginit = false;
12301173 rtlpriv->dm.txpower_track_control = true;
1231
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1232
- "pMgntInfo->txpower_tracking = %d\n",
1233
- rtlpriv->dm.txpower_tracking);
1174
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1175
+ "pMgntInfo->txpower_tracking = %d\n",
1176
+ rtlpriv->dm.txpower_tracking);
12341177 }
12351178
12361179 void rtl92d_dm_check_txpower_tracking_thermal_meter(struct ieee80211_hw *hw)
....@@ -1243,13 +1186,13 @@
12431186 if (!rtlpriv->dm.tm_trigger) {
12441187 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER, BIT(17) |
12451188 BIT(16), 0x03);
1246
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1247
- "Trigger 92S Thermal Meter!!\n");
1189
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1190
+ "Trigger 92S Thermal Meter!!\n");
12481191 rtlpriv->dm.tm_trigger = 1;
12491192 return;
12501193 } else {
1251
- RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1252
- "Schedule TxPowerTracking direct call!!\n");
1194
+ rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1195
+ "Schedule TxPowerTracking direct call!!\n");
12531196 rtl92d_dm_txpower_tracking_callback_thermalmeter(hw);
12541197 rtlpriv->dm.tm_trigger = 0;
12551198 }