aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/rtl8192c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c523
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c81
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c128
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h76
6 files changed, 609 insertions, 205 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
index c228b9ee3711..97183829b9be 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
@@ -28,10 +28,26 @@
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include "dm_common.h" 30#include "dm_common.h"
31#include "phy_common.h"
32#include "../pci.h"
33#include "../base.h"
31 34
32struct dig_t dm_digtable; 35struct dig_t dm_digtable;
33static struct ps_t dm_pstable; 36static struct ps_t dm_pstable;
34 37
38#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1)
39#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1)
40#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
41#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
42#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
43
44#define RTLPRIV (struct rtl_priv *)
45#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
46 ((RTLPRIV(_priv))->mac80211.opmode == \
47 NL80211_IFTYPE_ADHOC) ? \
48 ((RTLPRIV(_priv))->dm.entry_min_undecoratedsmoothed_pwdb) : \
49 ((RTLPRIV(_priv))->dm.undecorated_smoothed_pwdb)
50
35static const u32 ofdmswing_table[OFDM_TABLE_SIZE] = { 51static const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
36 0x7f8001fe, 52 0x7f8001fe,
37 0x788001e2, 53 0x788001e2,
@@ -304,7 +320,7 @@ static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)
304 320
305static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw) 321static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
306{ 322{
307 static u8 binitialized; /* initialized to false */ 323 static u8 initialized; /* initialized to false */
308 struct rtl_priv *rtlpriv = rtl_priv(hw); 324 struct rtl_priv *rtlpriv = rtl_priv(hw);
309 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 325 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
310 long rssi_strength = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb; 326 long rssi_strength = rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
@@ -315,11 +331,11 @@ static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
315 331
316 if ((multi_sta == false) || (dm_digtable.cursta_connectctate != 332 if ((multi_sta == false) || (dm_digtable.cursta_connectctate !=
317 DIG_STA_DISCONNECT)) { 333 DIG_STA_DISCONNECT)) {
318 binitialized = false; 334 initialized = false;
319 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 335 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
320 return; 336 return;
321 } else if (binitialized == false) { 337 } else if (initialized == false) {
322 binitialized = true; 338 initialized = true;
323 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_0; 339 dm_digtable.dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
324 dm_digtable.cur_igvalue = 0x20; 340 dm_digtable.cur_igvalue = 0x20;
325 rtl92c_dm_write_dig(hw); 341 rtl92c_dm_write_dig(hw);
@@ -461,10 +477,7 @@ static void rtl92c_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
461 if (mac->act_scanning == true) 477 if (mac->act_scanning == true)
462 return; 478 return;
463 479
464 if ((mac->link_state > MAC80211_NOLINK) && 480 if (mac->link_state >= MAC80211_LINKED)
465 (mac->link_state < MAC80211_LINKED))
466 dm_digtable.cursta_connectctate = DIG_STA_BEFORE_CONNECT;
467 else if (mac->link_state >= MAC80211_LINKED)
468 dm_digtable.cursta_connectctate = DIG_STA_CONNECT; 481 dm_digtable.cursta_connectctate = DIG_STA_CONNECT;
469 else 482 else
470 dm_digtable.cursta_connectctate = DIG_STA_DISCONNECT; 483 dm_digtable.cursta_connectctate = DIG_STA_DISCONNECT;
@@ -562,23 +575,42 @@ EXPORT_SYMBOL(rtl92c_dm_init_edca_turbo);
562static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw) 575static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw)
563{ 576{
564 struct rtl_priv *rtlpriv = rtl_priv(hw); 577 struct rtl_priv *rtlpriv = rtl_priv(hw);
578 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
565 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 579 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
580
566 static u64 last_txok_cnt; 581 static u64 last_txok_cnt;
567 static u64 last_rxok_cnt; 582 static u64 last_rxok_cnt;
568 u64 cur_txok_cnt; 583 static u32 last_bt_edca_ul;
569 u64 cur_rxok_cnt; 584 static u32 last_bt_edca_dl;
585 u64 cur_txok_cnt = 0;
586 u64 cur_rxok_cnt = 0;
570 u32 edca_be_ul = 0x5ea42b; 587 u32 edca_be_ul = 0x5ea42b;
571 u32 edca_be_dl = 0x5ea42b; 588 u32 edca_be_dl = 0x5ea42b;
589 bool bt_change_edca = false;
572 590
573 if (mac->opmode == NL80211_IFTYPE_ADHOC) 591 if ((last_bt_edca_ul != rtlpcipriv->bt_coexist.bt_edca_ul) ||
574 goto dm_checkedcaturbo_exit; 592 (last_bt_edca_dl != rtlpcipriv->bt_coexist.bt_edca_dl)) {
593 rtlpriv->dm.current_turbo_edca = false;
594 last_bt_edca_ul = rtlpcipriv->bt_coexist.bt_edca_ul;
595 last_bt_edca_dl = rtlpcipriv->bt_coexist.bt_edca_dl;
596 }
597
598 if (rtlpcipriv->bt_coexist.bt_edca_ul != 0) {
599 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_ul;
600 bt_change_edca = true;
601 }
602
603 if (rtlpcipriv->bt_coexist.bt_edca_dl != 0) {
604 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_dl;
605 bt_change_edca = true;
606 }
575 607
576 if (mac->link_state != MAC80211_LINKED) { 608 if (mac->link_state != MAC80211_LINKED) {
577 rtlpriv->dm.current_turbo_edca = false; 609 rtlpriv->dm.current_turbo_edca = false;
578 return; 610 return;
579 } 611 }
580 612
581 if (!mac->ht_enable) { /*FIX MERGE */ 613 if ((!mac->ht_enable) && (!rtlpcipriv->bt_coexist.bt_coexistence)) {
582 if (!(edca_be_ul & 0xffff0000)) 614 if (!(edca_be_ul & 0xffff0000))
583 edca_be_ul |= 0x005e0000; 615 edca_be_ul |= 0x005e0000;
584 616
@@ -586,10 +618,12 @@ static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw)
586 edca_be_dl |= 0x005e0000; 618 edca_be_dl |= 0x005e0000;
587 } 619 }
588 620
589 if ((!rtlpriv->dm.is_any_nonbepkts) && 621 if ((bt_change_edca) || ((!rtlpriv->dm.is_any_nonbepkts) &&
590 (!rtlpriv->dm.disable_framebursting)) { 622 (!rtlpriv->dm.disable_framebursting))) {
623
591 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt; 624 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
592 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt; 625 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
626
593 if (cur_rxok_cnt > 4 * cur_txok_cnt) { 627 if (cur_rxok_cnt > 4 * cur_txok_cnt) {
594 if (!rtlpriv->dm.is_cur_rdlstate || 628 if (!rtlpriv->dm.is_cur_rdlstate ||
595 !rtlpriv->dm.current_turbo_edca) { 629 !rtlpriv->dm.current_turbo_edca) {
@@ -618,7 +652,6 @@ static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw)
618 } 652 }
619 } 653 }
620 654
621dm_checkedcaturbo_exit:
622 rtlpriv->dm.is_any_nonbepkts = false; 655 rtlpriv->dm.is_any_nonbepkts = false;
623 last_txok_cnt = rtlpriv->stats.txbytesunicast; 656 last_txok_cnt = rtlpriv->stats.txbytesunicast;
624 last_rxok_cnt = rtlpriv->stats.rxbytesunicast; 657 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
@@ -633,14 +666,14 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
633 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 666 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
634 u8 thermalvalue, delta, delta_lck, delta_iqk; 667 u8 thermalvalue, delta, delta_lck, delta_iqk;
635 long ele_a, ele_d, temp_cck, val_x, value32; 668 long ele_a, ele_d, temp_cck, val_x, value32;
636 long val_y, ele_c; 669 long val_y, ele_c = 0;
637 u8 ofdm_index[2], cck_index = 0, ofdm_index_old[2], cck_index_old = 0; 670 u8 ofdm_index[2], cck_index = 0, ofdm_index_old[2], cck_index_old = 0;
638 int i; 671 int i;
639 bool is2t = IS_92C_SERIAL(rtlhal->version); 672 bool is2t = IS_92C_SERIAL(rtlhal->version);
640 u8 txpwr_level[2] = {0, 0}; 673 u8 txpwr_level[2] = {0, 0};
641 u8 ofdm_min_index = 6, rf; 674 u8 ofdm_min_index = 6, rf;
642 675
643 rtlpriv->dm.txpower_trackingInit = true; 676 rtlpriv->dm.txpower_trackinginit = true;
644 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 677 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
645 ("rtl92c_dm_txpower_tracking_callback_thermalmeter\n")); 678 ("rtl92c_dm_txpower_tracking_callback_thermalmeter\n"));
646 679
@@ -683,7 +716,6 @@ static void rtl92c_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
683 for (i = 0; i < OFDM_TABLE_LENGTH; i++) { 716 for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
684 if (ele_d == (ofdmswing_table[i] & 717 if (ele_d == (ofdmswing_table[i] &
685 MASKOFDM_D)) { 718 MASKOFDM_D)) {
686 ofdm_index_old[1] = (u8) i;
687 719
688 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, 720 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
689 DBG_LOUD, 721 DBG_LOUD,
@@ -1062,7 +1094,7 @@ static void rtl92c_dm_initialize_txpower_tracking_thermalmeter(
1062 struct rtl_priv *rtlpriv = rtl_priv(hw); 1094 struct rtl_priv *rtlpriv = rtl_priv(hw);
1063 1095
1064 rtlpriv->dm.txpower_tracking = true; 1096 rtlpriv->dm.txpower_tracking = true;
1065 rtlpriv->dm.txpower_trackingInit = false; 1097 rtlpriv->dm.txpower_trackinginit = false;
1066 1098
1067 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 1099 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1068 ("pMgntInfo->txpower_tracking = %d\n", 1100 ("pMgntInfo->txpower_tracking = %d\n",
@@ -1132,6 +1164,7 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1132 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1164 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1133 struct rate_adaptive *p_ra = &(rtlpriv->ra); 1165 struct rate_adaptive *p_ra = &(rtlpriv->ra);
1134 u32 low_rssithresh_for_ra, high_rssithresh_for_ra; 1166 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
1167 struct ieee80211_sta *sta = NULL;
1135 1168
1136 if (is_hal_stop(rtlhal)) { 1169 if (is_hal_stop(rtlhal)) {
1137 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1170 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
@@ -1145,8 +1178,8 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1145 return; 1178 return;
1146 } 1179 }
1147 1180
1148 if (mac->link_state == MAC80211_LINKED) { 1181 if (mac->link_state == MAC80211_LINKED &&
1149 1182 mac->opmode == NL80211_IFTYPE_STATION) {
1150 switch (p_ra->pre_ratr_state) { 1183 switch (p_ra->pre_ratr_state) {
1151 case DM_RATR_STA_HIGH: 1184 case DM_RATR_STA_HIGH:
1152 high_rssithresh_for_ra = 50; 1185 high_rssithresh_for_ra = 50;
@@ -1185,10 +1218,13 @@ static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1185 ("PreState = %d, CurState = %d\n", 1218 ("PreState = %d, CurState = %d\n",
1186 p_ra->pre_ratr_state, p_ra->ratr_state)); 1219 p_ra->pre_ratr_state, p_ra->ratr_state));
1187 1220
1188 rtlpriv->cfg->ops->update_rate_mask(hw, 1221 rcu_read_lock();
1222 sta = ieee80211_find_sta(mac->vif, mac->bssid);
1223 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1189 p_ra->ratr_state); 1224 p_ra->ratr_state);
1190 1225
1191 p_ra->pre_ratr_state = p_ra->ratr_state; 1226 p_ra->pre_ratr_state = p_ra->ratr_state;
1227 rcu_read_unlock();
1192 } 1228 }
1193 } 1229 }
1194} 1230}
@@ -1202,51 +1238,6 @@ static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1202 dm_pstable.rssi_val_min = 0; 1238 dm_pstable.rssi_val_min = 0;
1203} 1239}
1204 1240
1205static void rtl92c_dm_1r_cca(struct ieee80211_hw *hw)
1206{
1207 struct rtl_priv *rtlpriv = rtl_priv(hw);
1208 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1209
1210 if (dm_pstable.rssi_val_min != 0) {
1211 if (dm_pstable.pre_ccastate == CCA_2R) {
1212 if (dm_pstable.rssi_val_min >= 35)
1213 dm_pstable.cur_ccasate = CCA_1R;
1214 else
1215 dm_pstable.cur_ccasate = CCA_2R;
1216 } else {
1217 if (dm_pstable.rssi_val_min <= 30)
1218 dm_pstable.cur_ccasate = CCA_2R;
1219 else
1220 dm_pstable.cur_ccasate = CCA_1R;
1221 }
1222 } else {
1223 dm_pstable.cur_ccasate = CCA_MAX;
1224 }
1225
1226 if (dm_pstable.pre_ccastate != dm_pstable.cur_ccasate) {
1227 if (dm_pstable.cur_ccasate == CCA_1R) {
1228 if (get_rf_type(rtlphy) == RF_2T2R) {
1229 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
1230 MASKBYTE0, 0x13);
1231 rtl_set_bbreg(hw, 0xe70, MASKBYTE3, 0x20);
1232 } else {
1233 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE,
1234 MASKBYTE0, 0x23);
1235 rtl_set_bbreg(hw, 0xe70, 0x7fc00000, 0x10c);
1236 }
1237 } else {
1238 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0,
1239 0x33);
1240 rtl_set_bbreg(hw, 0xe70, MASKBYTE3, 0x63);
1241 }
1242 dm_pstable.pre_ccastate = dm_pstable.cur_ccasate;
1243 }
1244
1245 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, ("CCAStage = %s\n",
1246 (dm_pstable.cur_ccasate ==
1247 0) ? "1RCCA" : "2RCCA"));
1248}
1249
1250void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal) 1241void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
1251{ 1242{
1252 static u8 initialize; 1243 static u8 initialize;
@@ -1352,7 +1343,9 @@ static void rtl92c_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1352 } 1343 }
1353 1344
1354 if (IS_92C_SERIAL(rtlhal->version)) 1345 if (IS_92C_SERIAL(rtlhal->version))
1355 rtl92c_dm_1r_cca(hw); 1346 ;/* rtl92c_dm_1r_cca(hw); */
1347 else
1348 rtl92c_dm_rf_saving(hw, false);
1356} 1349}
1357 1350
1358void rtl92c_dm_init(struct ieee80211_hw *hw) 1351void rtl92c_dm_init(struct ieee80211_hw *hw)
@@ -1369,6 +1362,84 @@ void rtl92c_dm_init(struct ieee80211_hw *hw)
1369} 1362}
1370EXPORT_SYMBOL(rtl92c_dm_init); 1363EXPORT_SYMBOL(rtl92c_dm_init);
1371 1364
1365void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
1366{
1367 struct rtl_priv *rtlpriv = rtl_priv(hw);
1368 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1369 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1370 long undecorated_smoothed_pwdb;
1371
1372 if (!rtlpriv->dm.dynamic_txpower_enable)
1373 return;
1374
1375 if (rtlpriv->dm.dm_flag & HAL_DM_HIPWR_DISABLE) {
1376 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1377 return;
1378 }
1379
1380 if ((mac->link_state < MAC80211_LINKED) &&
1381 (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)) {
1382 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1383 ("Not connected to any\n"));
1384
1385 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1386
1387 rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
1388 return;
1389 }
1390
1391 if (mac->link_state >= MAC80211_LINKED) {
1392 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
1393 undecorated_smoothed_pwdb =
1394 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
1395 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1396 ("AP Client PWDB = 0x%lx\n",
1397 undecorated_smoothed_pwdb));
1398 } else {
1399 undecorated_smoothed_pwdb =
1400 rtlpriv->dm.undecorated_smoothed_pwdb;
1401 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1402 ("STA Default Port PWDB = 0x%lx\n",
1403 undecorated_smoothed_pwdb));
1404 }
1405 } else {
1406 undecorated_smoothed_pwdb =
1407 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
1408
1409 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1410 ("AP Ext Port PWDB = 0x%lx\n",
1411 undecorated_smoothed_pwdb));
1412 }
1413
1414 if (undecorated_smoothed_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
1415 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
1416 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1417 ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"));
1418 } else if ((undecorated_smoothed_pwdb <
1419 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
1420 (undecorated_smoothed_pwdb >=
1421 TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
1422
1423 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
1424 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1425 ("TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"));
1426 } else if (undecorated_smoothed_pwdb <
1427 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
1428 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
1429 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1430 ("TXHIGHPWRLEVEL_NORMAL\n"));
1431 }
1432
1433 if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) {
1434 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1435 ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
1436 rtlphy->current_channel));
1437 rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
1438 }
1439
1440 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
1441}
1442
1372void rtl92c_dm_watchdog(struct ieee80211_hw *hw) 1443void rtl92c_dm_watchdog(struct ieee80211_hw *hw)
1373{ 1444{
1374 struct rtl_priv *rtlpriv = rtl_priv(hw); 1445 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1388,11 +1459,321 @@ void rtl92c_dm_watchdog(struct ieee80211_hw *hw)
1388 rtl92c_dm_dig(hw); 1459 rtl92c_dm_dig(hw);
1389 rtl92c_dm_false_alarm_counter_statistics(hw); 1460 rtl92c_dm_false_alarm_counter_statistics(hw);
1390 rtl92c_dm_dynamic_bb_powersaving(hw); 1461 rtl92c_dm_dynamic_bb_powersaving(hw);
1391 rtlpriv->cfg->ops->dm_dynamic_txpower(hw); 1462 rtl92c_dm_dynamic_txpower(hw);
1392 rtl92c_dm_check_txpower_tracking(hw); 1463 rtl92c_dm_check_txpower_tracking(hw);
1393 rtl92c_dm_refresh_rate_adaptive_mask(hw); 1464 rtl92c_dm_refresh_rate_adaptive_mask(hw);
1465 rtl92c_dm_bt_coexist(hw);
1394 rtl92c_dm_check_edca_turbo(hw); 1466 rtl92c_dm_check_edca_turbo(hw);
1395
1396 } 1467 }
1397} 1468}
1398EXPORT_SYMBOL(rtl92c_dm_watchdog); 1469EXPORT_SYMBOL(rtl92c_dm_watchdog);
1470
1471u8 rtl92c_bt_rssi_state_change(struct ieee80211_hw *hw)
1472{
1473 struct rtl_priv *rtlpriv = rtl_priv(hw);
1474 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1475 long undecorated_smoothed_pwdb;
1476 u8 curr_bt_rssi_state = 0x00;
1477
1478 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1479 undecorated_smoothed_pwdb =
1480 GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
1481 } else {
1482 if (rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb == 0)
1483 undecorated_smoothed_pwdb = 100;
1484 else
1485 undecorated_smoothed_pwdb =
1486 rtlpriv->dm.entry_min_undecoratedsmoothed_pwdb;
1487 }
1488
1489 /* Check RSSI to determine HighPower/NormalPower state for
1490 * BT coexistence. */
1491 if (undecorated_smoothed_pwdb >= 67)
1492 curr_bt_rssi_state &= (~BT_RSSI_STATE_NORMAL_POWER);
1493 else if (undecorated_smoothed_pwdb < 62)
1494 curr_bt_rssi_state |= BT_RSSI_STATE_NORMAL_POWER;
1495
1496 /* Check RSSI to determine AMPDU setting for BT coexistence. */
1497 if (undecorated_smoothed_pwdb >= 40)
1498 curr_bt_rssi_state &= (~BT_RSSI_STATE_AMDPU_OFF);
1499 else if (undecorated_smoothed_pwdb <= 32)
1500 curr_bt_rssi_state |= BT_RSSI_STATE_AMDPU_OFF;
1501
1502 /* Marked RSSI state. It will be used to determine BT coexistence
1503 * setting later. */
1504 if (undecorated_smoothed_pwdb < 35)
1505 curr_bt_rssi_state |= BT_RSSI_STATE_SPECIAL_LOW;
1506 else
1507 curr_bt_rssi_state &= (~BT_RSSI_STATE_SPECIAL_LOW);
1508
1509 /* Set Tx Power according to BT status. */
1510 if (undecorated_smoothed_pwdb >= 30)
1511 curr_bt_rssi_state |= BT_RSSI_STATE_TXPOWER_LOW;
1512 else if (undecorated_smoothed_pwdb < 25)
1513 curr_bt_rssi_state &= (~BT_RSSI_STATE_TXPOWER_LOW);
1514
1515 /* Check BT state related to BT_Idle in B/G mode. */
1516 if (undecorated_smoothed_pwdb < 15)
1517 curr_bt_rssi_state |= BT_RSSI_STATE_BG_EDCA_LOW;
1518 else
1519 curr_bt_rssi_state &= (~BT_RSSI_STATE_BG_EDCA_LOW);
1520
1521 if (curr_bt_rssi_state != rtlpcipriv->bt_coexist.bt_rssi_state) {
1522 rtlpcipriv->bt_coexist.bt_rssi_state = curr_bt_rssi_state;
1523 return true;
1524 } else {
1525 return false;
1526 }
1527}
1528EXPORT_SYMBOL(rtl92c_bt_rssi_state_change);
1529
1530static bool rtl92c_bt_state_change(struct ieee80211_hw *hw)
1531{
1532 struct rtl_priv *rtlpriv = rtl_priv(hw);
1533 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1534
1535 u32 polling, ratio_tx, ratio_pri;
1536 u32 bt_tx, bt_pri;
1537 u8 bt_state;
1538 u8 cur_service_type;
1539
1540 if (rtlpriv->mac80211.link_state < MAC80211_LINKED)
1541 return false;
1542
1543 bt_state = rtl_read_byte(rtlpriv, 0x4fd);
1544 bt_tx = rtl_read_dword(rtlpriv, 0x488);
1545 bt_tx = bt_tx & 0x00ffffff;
1546 bt_pri = rtl_read_dword(rtlpriv, 0x48c);
1547 bt_pri = bt_pri & 0x00ffffff;
1548 polling = rtl_read_dword(rtlpriv, 0x490);
1549
1550 if (bt_tx == 0xffffffff && bt_pri == 0xffffffff &&
1551 polling == 0xffffffff && bt_state == 0xff)
1552 return false;
1553
1554 bt_state &= BIT_OFFSET_LEN_MASK_32(0, 1);
1555 if (bt_state != rtlpcipriv->bt_coexist.bt_cur_state) {
1556 rtlpcipriv->bt_coexist.bt_cur_state = bt_state;
1557
1558 if (rtlpcipriv->bt_coexist.reg_bt_sco == 3) {
1559 rtlpcipriv->bt_coexist.bt_service = BT_IDLE;
1560
1561 bt_state = bt_state |
1562 ((rtlpcipriv->bt_coexist.bt_ant_isolation == 1) ?
1563 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
1564 BIT_OFFSET_LEN_MASK_32(2, 1);
1565 rtl_write_byte(rtlpriv, 0x4fd, bt_state);
1566 }
1567 return true;
1568 }
1569
1570 ratio_tx = bt_tx * 1000 / polling;
1571 ratio_pri = bt_pri * 1000 / polling;
1572 rtlpcipriv->bt_coexist.ratio_tx = ratio_tx;
1573 rtlpcipriv->bt_coexist.ratio_pri = ratio_pri;
1574
1575 if (bt_state && rtlpcipriv->bt_coexist.reg_bt_sco == 3) {
1576
1577 if ((ratio_tx < 30) && (ratio_pri < 30))
1578 cur_service_type = BT_IDLE;
1579 else if ((ratio_pri > 110) && (ratio_pri < 250))
1580 cur_service_type = BT_SCO;
1581 else if ((ratio_tx >= 200) && (ratio_pri >= 200))
1582 cur_service_type = BT_BUSY;
1583 else if ((ratio_tx >= 350) && (ratio_tx < 500))
1584 cur_service_type = BT_OTHERBUSY;
1585 else if (ratio_tx >= 500)
1586 cur_service_type = BT_PAN;
1587 else
1588 cur_service_type = BT_OTHER_ACTION;
1589
1590 if (cur_service_type != rtlpcipriv->bt_coexist.bt_service) {
1591 rtlpcipriv->bt_coexist.bt_service = cur_service_type;
1592 bt_state = bt_state |
1593 ((rtlpcipriv->bt_coexist.bt_ant_isolation == 1) ?
1594 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
1595 ((rtlpcipriv->bt_coexist.bt_service != BT_IDLE) ?
1596 0 : BIT_OFFSET_LEN_MASK_32(2, 1));
1597
1598 /* Add interrupt migration when bt is not ini
1599 * idle state (no traffic). */
1600 if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1601 rtl_write_word(rtlpriv, 0x504, 0x0ccc);
1602 rtl_write_byte(rtlpriv, 0x506, 0x54);
1603 rtl_write_byte(rtlpriv, 0x507, 0x54);
1604 } else {
1605 rtl_write_byte(rtlpriv, 0x506, 0x00);
1606 rtl_write_byte(rtlpriv, 0x507, 0x00);
1607 }
1608
1609 rtl_write_byte(rtlpriv, 0x4fd, bt_state);
1610 return true;
1611 }
1612 }
1613
1614 return false;
1615
1616}
1617
1618static bool rtl92c_bt_wifi_connect_change(struct ieee80211_hw *hw)
1619{
1620 struct rtl_priv *rtlpriv = rtl_priv(hw);
1621 static bool media_connect;
1622
1623 if (rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1624 media_connect = false;
1625 } else {
1626 if (!media_connect) {
1627 media_connect = true;
1628 return true;
1629 }
1630 media_connect = true;
1631 }
1632
1633 return false;
1634}
1635
1636static void rtl92c_bt_set_normal(struct ieee80211_hw *hw)
1637{
1638 struct rtl_priv *rtlpriv = rtl_priv(hw);
1639 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1640
1641
1642 if (rtlpcipriv->bt_coexist.bt_service == BT_OTHERBUSY) {
1643 rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea72b;
1644 rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea72b;
1645 } else if (rtlpcipriv->bt_coexist.bt_service == BT_BUSY) {
1646 rtlpcipriv->bt_coexist.bt_edca_ul = 0x5eb82f;
1647 rtlpcipriv->bt_coexist.bt_edca_dl = 0x5eb82f;
1648 } else if (rtlpcipriv->bt_coexist.bt_service == BT_SCO) {
1649 if (rtlpcipriv->bt_coexist.ratio_tx > 160) {
1650 rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea72f;
1651 rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea72f;
1652 } else {
1653 rtlpcipriv->bt_coexist.bt_edca_ul = 0x5ea32b;
1654 rtlpcipriv->bt_coexist.bt_edca_dl = 0x5ea42b;
1655 }
1656 } else {
1657 rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1658 rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1659 }
1660
1661 if ((rtlpcipriv->bt_coexist.bt_service != BT_IDLE) &&
1662 (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
1663 (rtlpriv->mac80211.mode == (WIRELESS_MODE_G | WIRELESS_MODE_B))) &&
1664 (rtlpcipriv->bt_coexist.bt_rssi_state &
1665 BT_RSSI_STATE_BG_EDCA_LOW)) {
1666 rtlpcipriv->bt_coexist.bt_edca_ul = 0x5eb82b;
1667 rtlpcipriv->bt_coexist.bt_edca_dl = 0x5eb82b;
1668 }
1669}
1670
1671static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw)
1672{
1673 struct rtl_priv *rtlpriv = rtl_priv(hw);
1674 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1675
1676
1677 /* Only enable HW BT coexist when BT in "Busy" state. */
1678 if (rtlpriv->mac80211.vendor == PEER_CISCO &&
1679 rtlpcipriv->bt_coexist.bt_service == BT_OTHER_ACTION) {
1680 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1681 } else {
1682 if ((rtlpcipriv->bt_coexist.bt_service == BT_BUSY) &&
1683 (rtlpcipriv->bt_coexist.bt_rssi_state &
1684 BT_RSSI_STATE_NORMAL_POWER)) {
1685 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1686 } else if ((rtlpcipriv->bt_coexist.bt_service ==
1687 BT_OTHER_ACTION) && (rtlpriv->mac80211.mode <
1688 WIRELESS_MODE_N_24G) &&
1689 (rtlpcipriv->bt_coexist.bt_rssi_state &
1690 BT_RSSI_STATE_SPECIAL_LOW)) {
1691 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
1692 } else if (rtlpcipriv->bt_coexist.bt_service == BT_PAN) {
1693 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00);
1694 } else {
1695 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00);
1696 }
1697 }
1698
1699 if (rtlpcipriv->bt_coexist.bt_service == BT_PAN)
1700 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, 0x10100);
1701 else
1702 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, 0x0);
1703
1704 if (rtlpcipriv->bt_coexist.bt_rssi_state &
1705 BT_RSSI_STATE_NORMAL_POWER) {
1706 rtl92c_bt_set_normal(hw);
1707 } else {
1708 rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1709 rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1710 }
1711
1712 if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1713 rtlpriv->cfg->ops->set_rfreg(hw,
1714 RF90_PATH_A,
1715 0x1e,
1716 0xf0, 0xf);
1717 } else {
1718 rtlpriv->cfg->ops->set_rfreg(hw,
1719 RF90_PATH_A, 0x1e, 0xf0,
1720 rtlpcipriv->bt_coexist.bt_rfreg_origin_1e);
1721 }
1722
1723 if (!rtlpriv->dm.dynamic_txpower_enable) {
1724 if (rtlpcipriv->bt_coexist.bt_service != BT_IDLE) {
1725 if (rtlpcipriv->bt_coexist.bt_rssi_state &
1726 BT_RSSI_STATE_TXPOWER_LOW) {
1727 rtlpriv->dm.dynamic_txhighpower_lvl =
1728 TXHIGHPWRLEVEL_BT2;
1729 } else {
1730 rtlpriv->dm.dynamic_txhighpower_lvl =
1731 TXHIGHPWRLEVEL_BT1;
1732 }
1733 } else {
1734 rtlpriv->dm.dynamic_txhighpower_lvl =
1735 TXHIGHPWRLEVEL_NORMAL;
1736 }
1737 rtl92c_phy_set_txpower_level(hw,
1738 rtlpriv->phy.current_channel);
1739 }
1740}
1741
1742static void rtl92c_check_bt_change(struct ieee80211_hw *hw)
1743{
1744 struct rtl_priv *rtlpriv = rtl_priv(hw);
1745 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1746
1747 if (rtlpcipriv->bt_coexist.bt_cur_state) {
1748 if (rtlpcipriv->bt_coexist.bt_ant_isolation)
1749 rtl92c_bt_ant_isolation(hw);
1750 } else {
1751 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00);
1752 rtlpriv->cfg->ops->set_rfreg(hw, RF90_PATH_A, 0x1e, 0xf0,
1753 rtlpcipriv->bt_coexist.bt_rfreg_origin_1e);
1754
1755 rtlpcipriv->bt_coexist.bt_edca_ul = 0;
1756 rtlpcipriv->bt_coexist.bt_edca_dl = 0;
1757 }
1758}
1759
1760void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw)
1761{
1762 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1763
1764 bool wifi_connect_change;
1765 bool bt_state_change;
1766 bool rssi_state_change;
1767
1768 if ((rtlpcipriv->bt_coexist.bt_coexistence) &&
1769 (rtlpcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) {
1770
1771 wifi_connect_change = rtl92c_bt_wifi_connect_change(hw);
1772 bt_state_change = rtl92c_bt_state_change(hw);
1773 rssi_state_change = rtl92c_bt_rssi_state_change(hw);
1774
1775 if (wifi_connect_change || bt_state_change || rssi_state_change)
1776 rtl92c_check_bt_change(hw);
1777 }
1778}
1779EXPORT_SYMBOL(rtl92c_dm_bt_coexist);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
index b9cbb0a3c03f..b9736d3e9a39 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
@@ -200,5 +200,7 @@ void rtl92c_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal);
200void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta); 200void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
201void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw); 201void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw);
202void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery); 202void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery);
203void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw);
204void rtl92c_dm_bt_coexist(struct ieee80211_hw *hw);
203 205
204#endif 206#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
index bc9d24134ac4..50303e1adff1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
@@ -223,29 +223,15 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
223 u8 *pfwdata; 223 u8 *pfwdata;
224 u32 fwsize; 224 u32 fwsize;
225 enum version_8192c version = rtlhal->version; 225 enum version_8192c version = rtlhal->version;
226 const struct firmware *firmware;
227 226
228 printk(KERN_INFO "rtl8192c: Loading firmware file %s\n", 227 printk(KERN_INFO "rtl8192c: Loading firmware file %s\n",
229 rtlpriv->cfg->fw_name); 228 rtlpriv->cfg->fw_name);
230 if (request_firmware(&firmware, rtlpriv->cfg->fw_name, 229 if (!rtlhal->pfirmware)
231 rtlpriv->io.dev)) {
232 printk(KERN_ERR "rtl8192c: Firmware loading failed\n");
233 return 1; 230 return 1;
234 }
235
236 if (firmware->size > 0x4000) {
237 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
238 ("Firmware is too big!\n"));
239 release_firmware(firmware);
240 return 1;
241 }
242
243 memcpy(rtlhal->pfirmware, firmware->data, firmware->size);
244 fwsize = firmware->size;
245 release_firmware(firmware);
246 231
247 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; 232 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
248 pfwdata = (u8 *) rtlhal->pfirmware; 233 pfwdata = (u8 *) rtlhal->pfirmware;
234 fwsize = rtlhal->fwsize;
249 235
250 if (IS_FW_HEADER_EXIST(pfwheader)) { 236 if (IS_FW_HEADER_EXIST(pfwheader)) {
251 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 237 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
@@ -553,6 +539,39 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
553} 539}
554EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd); 540EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd);
555 541
542static bool _rtl92c_cmd_send_packet(struct ieee80211_hw *hw,
543 struct sk_buff *skb)
544{
545 struct rtl_priv *rtlpriv = rtl_priv(hw);
546 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
547 struct rtl8192_tx_ring *ring;
548 struct rtl_tx_desc *pdesc;
549 u8 own;
550 unsigned long flags;
551 struct sk_buff *pskb = NULL;
552
553 ring = &rtlpci->tx_ring[BEACON_QUEUE];
554
555 pskb = __skb_dequeue(&ring->queue);
556 if (pskb)
557 kfree_skb(pskb);
558
559 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
560
561 pdesc = &ring->desc[0];
562 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, true, HW_DESC_OWN);
563
564 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb);
565
566 __skb_queue_tail(&ring->queue, skb);
567
568 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
569
570 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
571
572 return true;
573}
574
556#define BEACON_PG 0 /*->1*/ 575#define BEACON_PG 0 /*->1*/
557#define PSPOLL_PG 2 576#define PSPOLL_PG 2
558#define NULL_PG 3 577#define NULL_PG 3
@@ -670,7 +689,7 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671}; 690};
672 691
673void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) 692void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
674{ 693{
675 struct rtl_priv *rtlpriv = rtl_priv(hw); 694 struct rtl_priv *rtlpriv = rtl_priv(hw);
676 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 695 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -679,12 +698,12 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
679 u32 totalpacketlen; 698 u32 totalpacketlen;
680 bool rtstatus; 699 bool rtstatus;
681 u8 u1RsvdPageLoc[3] = {0}; 700 u8 u1RsvdPageLoc[3] = {0};
682 bool b_dlok = false; 701 bool dlok = false;
683 702
684 u8 *beacon; 703 u8 *beacon;
685 u8 *p_pspoll; 704 u8 *pspoll;
686 u8 *nullfunc; 705 u8 *nullfunc;
687 u8 *p_probersp; 706 u8 *probersp;
688 /*--------------------------------------------------------- 707 /*---------------------------------------------------------
689 (1) beacon 708 (1) beacon
690 ---------------------------------------------------------*/ 709 ---------------------------------------------------------*/
@@ -695,10 +714,10 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
695 /*------------------------------------------------------- 714 /*-------------------------------------------------------
696 (2) ps-poll 715 (2) ps-poll
697 --------------------------------------------------------*/ 716 --------------------------------------------------------*/
698 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128]; 717 pspoll = &reserved_page_packet[PSPOLL_PG * 128];
699 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000)); 718 SET_80211_PS_POLL_AID(pspoll, (mac->assoc_id | 0xc000));
700 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid); 719 SET_80211_PS_POLL_BSSID(pspoll, mac->bssid);
701 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr); 720 SET_80211_PS_POLL_TA(pspoll, mac->mac_addr);
702 721
703 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 722 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
704 723
@@ -715,10 +734,10 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
715 /*--------------------------------------------------------- 734 /*---------------------------------------------------------
716 (4) probe response 735 (4) probe response
717 ----------------------------------------------------------*/ 736 ----------------------------------------------------------*/
718 p_probersp = &reserved_page_packet[PROBERSP_PG * 128]; 737 probersp = &reserved_page_packet[PROBERSP_PG * 128];
719 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid); 738 SET_80211_HDR_ADDRESS1(probersp, mac->bssid);
720 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr); 739 SET_80211_HDR_ADDRESS2(probersp, mac->mac_addr);
721 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid); 740 SET_80211_HDR_ADDRESS3(probersp, mac->bssid);
722 741
723 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); 742 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG);
724 743
@@ -736,12 +755,12 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
736 memcpy((u8 *) skb_put(skb, totalpacketlen), 755 memcpy((u8 *) skb_put(skb, totalpacketlen),
737 &reserved_page_packet, totalpacketlen); 756 &reserved_page_packet, totalpacketlen);
738 757
739 rtstatus = rtlpriv->cfg->ops->cmd_send_packet(hw, skb); 758 rtstatus = _rtl92c_cmd_send_packet(hw, skb);
740 759
741 if (rtstatus) 760 if (rtstatus)
742 b_dlok = true; 761 dlok = true;
743 762
744 if (b_dlok) { 763 if (dlok) {
745 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 764 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
746 ("Set RSVD page location to Fw.\n")); 765 ("Set RSVD page location to Fw.\n"));
747 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 766 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
index 3db33bd14666..3d5823c12621 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
@@ -27,8 +27,8 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#ifndef __RTL92C__FW__H__ 30#ifndef __RTL92C__FW__COMMON__H__
31#define __RTL92C__FW__H__ 31#define __RTL92C__FW__COMMON__H__
32 32
33#define FW_8192C_SIZE 0x3000 33#define FW_8192C_SIZE 0x3000
34#define FW_8192C_START_ADDRESS 0x1000 34#define FW_8192C_START_ADDRESS 0x1000
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
index a70228278398..c5424cad43cb 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
@@ -78,27 +78,29 @@ void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
78 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x)," 78 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
79 " data(%#x)\n", regaddr, bitmask, 79 " data(%#x)\n", regaddr, bitmask,
80 data)); 80 data));
81
81} 82}
82EXPORT_SYMBOL(rtl92c_phy_set_bb_reg); 83EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
83 84
84u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw, 85u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
85 enum radio_path rfpath, u32 offset) 86 enum radio_path rfpath, u32 offset)
86{ 87{
87 RT_ASSERT(false, ("deprecated!\n")); 88 RT_ASSERT(false, ("deprecated!\n"));
88 return 0; 89 return 0;
90
89} 91}
90EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read); 92EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read);
91 93
92void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw, 94void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
93 enum radio_path rfpath, u32 offset, 95 enum radio_path rfpath, u32 offset,
94 u32 data) 96 u32 data)
95{ 97{
96 RT_ASSERT(false, ("deprecated!\n")); 98 RT_ASSERT(false, ("deprecated!\n"));
97} 99}
98EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_write); 100EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_write);
99 101
100u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw, 102u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
101 enum radio_path rfpath, u32 offset) 103 enum radio_path rfpath, u32 offset)
102{ 104{
103 struct rtl_priv *rtlpriv = rtl_priv(hw); 105 struct rtl_priv *rtlpriv = rtl_priv(hw);
104 struct rtl_phy *rtlphy = &(rtlpriv->phy); 106 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -149,8 +151,8 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
149EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read); 151EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read);
150 152
151void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw, 153void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
152 enum radio_path rfpath, u32 offset, 154 enum radio_path rfpath, u32 offset,
153 u32 data) 155 u32 data)
154{ 156{
155 u32 data_and_addr; 157 u32 data_and_addr;
156 u32 newoffset; 158 u32 newoffset;
@@ -197,6 +199,7 @@ static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw)
197 rtl_set_bbreg(hw, 0xe80, 0x0c000000, 0x2); 199 rtl_set_bbreg(hw, 0xe80, 0x0c000000, 0x2);
198 rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2); 200 rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2);
199} 201}
202
200bool rtl92c_phy_rf_config(struct ieee80211_hw *hw) 203bool rtl92c_phy_rf_config(struct ieee80211_hw *hw)
201{ 204{
202 struct rtl_priv *rtlpriv = rtl_priv(hw); 205 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -241,13 +244,14 @@ bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
241 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw, 244 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
242 RFPGA0_XA_HSSIPARAMETER2, 245 RFPGA0_XA_HSSIPARAMETER2,
243 0x200)); 246 0x200));
247
244 return true; 248 return true;
245} 249}
246EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile); 250EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile);
247 251
248void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw, 252void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
249 u32 regaddr, u32 bitmask, 253 u32 regaddr, u32 bitmask,
250 u32 data) 254 u32 data)
251{ 255{
252 struct rtl_priv *rtlpriv = rtl_priv(hw); 256 struct rtl_priv *rtlpriv = rtl_priv(hw);
253 struct rtl_phy *rtlphy = &(rtlpriv->phy); 257 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -317,61 +321,48 @@ void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
317 } 321 }
318 if (regaddr == RTXAGC_B_RATE54_24) { 322 if (regaddr == RTXAGC_B_RATE54_24) {
319 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9] = data; 323 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9] = data;
320
321 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 324 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
322 ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n", 325 ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
323 rtlphy->pwrgroup_cnt, 326 rtlphy->pwrgroup_cnt,
324 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9])); 327 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9]));
325 } 328 }
326
327 if (regaddr == RTXAGC_B_CCK1_55_MCS32) { 329 if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
328 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14] = data; 330 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14] = data;
329
330 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 331 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
331 ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n", 332 ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
332 rtlphy->pwrgroup_cnt, 333 rtlphy->pwrgroup_cnt,
333 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14])); 334 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14]));
334 } 335 }
335
336 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) { 336 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
337 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15] = data; 337 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15] = data;
338
339 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 338 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
340 ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n", 339 ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
341 rtlphy->pwrgroup_cnt, 340 rtlphy->pwrgroup_cnt,
342 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15])); 341 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15]));
343 } 342 }
344
345 if (regaddr == RTXAGC_B_MCS03_MCS00) { 343 if (regaddr == RTXAGC_B_MCS03_MCS00) {
346 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10] = data; 344 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10] = data;
347
348 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 345 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
349 ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n", 346 ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
350 rtlphy->pwrgroup_cnt, 347 rtlphy->pwrgroup_cnt,
351 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10])); 348 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10]));
352 } 349 }
353
354 if (regaddr == RTXAGC_B_MCS07_MCS04) { 350 if (regaddr == RTXAGC_B_MCS07_MCS04) {
355 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11] = data; 351 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11] = data;
356
357 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 352 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
358 ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n", 353 ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
359 rtlphy->pwrgroup_cnt, 354 rtlphy->pwrgroup_cnt,
360 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11])); 355 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11]));
361 } 356 }
362
363 if (regaddr == RTXAGC_B_MCS11_MCS08) { 357 if (regaddr == RTXAGC_B_MCS11_MCS08) {
364 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12] = data; 358 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12] = data;
365
366 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 359 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
367 ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n", 360 ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
368 rtlphy->pwrgroup_cnt, 361 rtlphy->pwrgroup_cnt,
369 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12])); 362 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12]));
370 } 363 }
371
372 if (regaddr == RTXAGC_B_MCS15_MCS12) { 364 if (regaddr == RTXAGC_B_MCS15_MCS12) {
373 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13] = data; 365 rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13] = data;
374
375 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 366 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
376 ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n", 367 ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
377 rtlphy->pwrgroup_cnt, 368 rtlphy->pwrgroup_cnt,
@@ -583,6 +574,7 @@ static void _rtl92c_ccxpower_index_check(struct ieee80211_hw *hw,
583 574
584 rtlphy->cur_cck_txpwridx = cckpowerlevel[0]; 575 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
585 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0]; 576 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
577
586} 578}
587 579
588void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 580void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
@@ -611,7 +603,6 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
611 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 603 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
612 u8 idx; 604 u8 idx;
613 u8 rf_path; 605 u8 rf_path;
614
615 u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw, 606 u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
616 WIRELESS_MODE_B, 607 WIRELESS_MODE_B,
617 power_indbm); 608 power_indbm);
@@ -639,11 +630,6 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
639} 630}
640EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm); 631EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm);
641 632
642void rtl92c_phy_set_beacon_hw_reg(struct ieee80211_hw *hw, u16 beaconinterval)
643{
644}
645EXPORT_SYMBOL(rtl92c_phy_set_beacon_hw_reg);
646
647u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw, 633u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
648 enum wireless_mode wirelessmode, 634 enum wireless_mode wirelessmode,
649 long power_indbm) 635 long power_indbm)
@@ -741,9 +727,9 @@ void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
741 if (rtlphy->set_bwmode_inprogress) 727 if (rtlphy->set_bwmode_inprogress)
742 return; 728 return;
743 rtlphy->set_bwmode_inprogress = true; 729 rtlphy->set_bwmode_inprogress = true;
744 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) 730 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
745 rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw); 731 rtlphy->set_bwmode_inprogress = false;
746 else { 732 } else {
747 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 733 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
748 ("FALSE driver sleep or unload\n")); 734 ("FALSE driver sleep or unload\n"));
749 rtlphy->set_bwmode_inprogress = false; 735 rtlphy->set_bwmode_inprogress = false;
@@ -773,8 +759,9 @@ void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
773 mdelay(delay); 759 mdelay(delay);
774 else 760 else
775 continue; 761 continue;
776 } else 762 } else {
777 rtlphy->sw_chnl_inprogress = false; 763 rtlphy->sw_chnl_inprogress = false;
764 }
778 break; 765 break;
779 } while (true); 766 } while (true);
780 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n")); 767 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
@@ -811,9 +798,32 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
811} 798}
812EXPORT_SYMBOL(rtl92c_phy_sw_chnl); 799EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
813 800
814static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, 801static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
815 u8 channel, u8 *stage, u8 *step, 802 u32 cmdtableidx, u32 cmdtablesz,
816 u32 *delay) 803 enum swchnlcmd_id cmdid,
804 u32 para1, u32 para2, u32 msdelay)
805{
806 struct swchnlcmd *pcmd;
807
808 if (cmdtable == NULL) {
809 RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
810 return false;
811 }
812
813 if (cmdtableidx >= cmdtablesz)
814 return false;
815
816 pcmd = cmdtable + cmdtableidx;
817 pcmd->cmdid = cmdid;
818 pcmd->para1 = para1;
819 pcmd->para2 = para2;
820 pcmd->msdelay = msdelay;
821 return true;
822}
823
824bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
825 u8 channel, u8 *stage, u8 *step,
826 u32 *delay)
817{ 827{
818 struct rtl_priv *rtlpriv = rtl_priv(hw); 828 struct rtl_priv *rtlpriv = rtl_priv(hw);
819 struct rtl_phy *rtlphy = &(rtlpriv->phy); 829 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -917,29 +927,6 @@ static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
917 return false; 927 return false;
918} 928}
919 929
920static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
921 u32 cmdtableidx, u32 cmdtablesz,
922 enum swchnlcmd_id cmdid,
923 u32 para1, u32 para2, u32 msdelay)
924{
925 struct swchnlcmd *pcmd;
926
927 if (cmdtable == NULL) {
928 RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
929 return false;
930 }
931
932 if (cmdtableidx >= cmdtablesz)
933 return false;
934
935 pcmd = cmdtable + cmdtableidx;
936 pcmd->cmdid = cmdid;
937 pcmd->para1 = para1;
938 pcmd->para2 = para2;
939 pcmd->msdelay = msdelay;
940 return true;
941}
942
943bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath) 930bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath)
944{ 931{
945 return true; 932 return true;
@@ -1002,13 +989,13 @@ static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
1002 reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD); 989 reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1003 reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD); 990 reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1004 reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD); 991 reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
992
1005 if (!(reg_eac & BIT(31)) && 993 if (!(reg_eac & BIT(31)) &&
1006 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) && 994 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
1007 (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) 995 (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
1008 result |= 0x01; 996 result |= 0x01;
1009 else 997 else
1010 return result; 998 return result;
1011
1012 if (!(reg_eac & BIT(30)) && 999 if (!(reg_eac & BIT(30)) &&
1013 (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) && 1000 (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
1014 (((reg_ecc & 0x03FF0000) >> 16) != 0x36)) 1001 (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
@@ -1023,9 +1010,9 @@ static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
1023 u32 oldval_0, x, tx0_a, reg; 1010 u32 oldval_0, x, tx0_a, reg;
1024 long y, tx0_c; 1011 long y, tx0_c;
1025 1012
1026 if (final_candidate == 0xFF) 1013 if (final_candidate == 0xFF) {
1027 return; 1014 return;
1028 else if (iqk_ok) { 1015 } else if (iqk_ok) {
1029 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 1016 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
1030 MASKDWORD) >> 22) & 0x3FF; 1017 MASKDWORD) >> 22) & 0x3FF;
1031 x = result[final_candidate][0]; 1018 x = result[final_candidate][0];
@@ -1063,9 +1050,9 @@ static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
1063 u32 oldval_1, x, tx1_a, reg; 1050 u32 oldval_1, x, tx1_a, reg;
1064 long y, tx1_c; 1051 long y, tx1_c;
1065 1052
1066 if (final_candidate == 0xFF) 1053 if (final_candidate == 0xFF) {
1067 return; 1054 return;
1068 else if (iqk_ok) { 1055 } else if (iqk_ok) {
1069 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 1056 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
1070 MASKDWORD) >> 22) & 0x3FF; 1057 MASKDWORD) >> 22) & 0x3FF;
1071 x = result[final_candidate][4]; 1058 x = result[final_candidate][4];
@@ -1282,6 +1269,7 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1282 RFPGA0_XA_HSSIPARAMETER1, 1269 RFPGA0_XA_HSSIPARAMETER1,
1283 BIT(8)); 1270 BIT(8));
1284 } 1271 }
1272
1285 if (!rtlphy->rfpi_enable) 1273 if (!rtlphy->rfpi_enable)
1286 _rtl92c_phy_pi_mode_switch(hw, true); 1274 _rtl92c_phy_pi_mode_switch(hw, true);
1287 if (t == 0) { 1275 if (t == 0) {
@@ -1317,9 +1305,10 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1317 0x3FF0000) >> 16; 1305 0x3FF0000) >> 16;
1318 break; 1306 break;
1319 } else if (i == (retrycount - 1) && patha_ok == 0x01) 1307 } else if (i == (retrycount - 1) && patha_ok == 0x01)
1308
1320 result[t][0] = (rtl_get_bbreg(hw, 0xe94, 1309 result[t][0] = (rtl_get_bbreg(hw, 0xe94,
1321 MASKDWORD) & 0x3FF0000) >> 1310 MASKDWORD) & 0x3FF0000) >>
1322 16; 1311 16;
1323 result[t][1] = 1312 result[t][1] =
1324 (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16; 1313 (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
1325 1314
@@ -1375,8 +1364,7 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1375static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, 1364static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
1376 char delta, bool is2t) 1365 char delta, bool is2t)
1377{ 1366{
1378 /* This routine is deliberately dummied out for later fixes */ 1367#if 0 /* This routine is deliberately dummied out for later fixes */
1379#if 0
1380 struct rtl_priv *rtlpriv = rtl_priv(hw); 1368 struct rtl_priv *rtlpriv = rtl_priv(hw);
1381 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1369 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1382 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1370 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -1434,7 +1422,7 @@ static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
1434 0x04db25a4, 0x0b1b25a4 1422 0x04db25a4, 0x0b1b25a4
1435 }; 1423 };
1436 1424
1437 u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c }; 1425 const u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
1438 1426
1439 u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 }; 1427 u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
1440 1428
@@ -1463,13 +1451,15 @@ static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
1463 0x00050006 1451 0x00050006
1464 }; 1452 };
1465 1453
1466 const u32 apk_result[PATH_NUM][APK_BB_REG_NUM]; 1454 u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
1467 1455
1468 long bb_offset, delta_v, delta_offset; 1456 long bb_offset, delta_v, delta_offset;
1469 1457
1470 if (!is2t) 1458 if (!is2t)
1471 pathbound = 1; 1459 pathbound = 1;
1472 1460
1461 return;
1462
1473 for (index = 0; index < PATH_NUM; index++) { 1463 for (index = 0; index < PATH_NUM; index++) {
1474 apk_offset[index] = apk_normal_offset[index]; 1464 apk_offset[index] = apk_normal_offset[index];
1475 apk_value[index] = apk_normal_value[index]; 1465 apk_value[index] = apk_normal_value[index];
@@ -1730,8 +1720,7 @@ static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
1730 0x08)); 1720 0x08));
1731 1721
1732 } 1722 }
1733 1723 rtlphy->b_apk_done = true;
1734 rtlphy->apk_done = true;
1735#endif 1724#endif
1736} 1725}
1737 1726
@@ -1758,6 +1747,7 @@ static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1758 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1); 1747 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
1759 1748
1760 } 1749 }
1750
1761} 1751}
1762 1752
1763#undef IQK_ADDA_REG_NUM 1753#undef IQK_ADDA_REG_NUM
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
index 53ffb0981586..9a264c0d6127 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
@@ -27,8 +27,8 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#ifndef __RTL92C_PHY_H__ 30#ifndef __RTL92C_PHY_COMMON_H__
31#define __RTL92C_PHY_H__ 31#define __RTL92C_PHY_COMMON_H__
32 32
33#define MAX_PRECMD_CNT 16 33#define MAX_PRECMD_CNT 16
34#define MAX_RFDEPENDCMD_CNT 16 34#define MAX_RFDEPENDCMD_CNT 16
@@ -39,6 +39,7 @@
39#define RT_CANNOT_IO(hw) false 39#define RT_CANNOT_IO(hw) false
40#define HIGHPOWER_RADIOA_ARRAYLEN 22 40#define HIGHPOWER_RADIOA_ARRAYLEN 22
41 41
42#define IQK_ADDA_REG_NUM 16
42#define MAX_TOLERANCE 5 43#define MAX_TOLERANCE 5
43#define IQK_DELAY_TIME 1 44#define IQK_DELAY_TIME 1
44 45
@@ -56,6 +57,7 @@
56#define IQK_ADDA_REG_NUM 16 57#define IQK_ADDA_REG_NUM 16
57#define IQK_MAC_REG_NUM 4 58#define IQK_MAC_REG_NUM 4
58 59
60#define IQK_DELAY_TIME 1
59#define RF90_PATH_MAX 2 61#define RF90_PATH_MAX 2
60 62
61#define CT_OFFSET_MAC_ADDR 0X16 63#define CT_OFFSET_MAC_ADDR 0X16
@@ -77,6 +79,7 @@
77 79
78#define RTL92C_MAX_PATH_NUM 2 80#define RTL92C_MAX_PATH_NUM 2
79#define LLT_LAST_ENTRY_OF_TX_PKT_BUFFER 255 81#define LLT_LAST_ENTRY_OF_TX_PKT_BUFFER 255
82
80enum swchnlcmd_id { 83enum swchnlcmd_id {
81 CMDID_END, 84 CMDID_END,
82 CMDID_SET_TXPOWEROWER_LEVEL, 85 CMDID_SET_TXPOWEROWER_LEVEL,
@@ -184,45 +187,41 @@ struct tx_power_struct {
184 u32 mcs_original_offset[4][16]; 187 u32 mcs_original_offset[4][16];
185}; 188};
186 189
187extern u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, 190u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw,
188 u32 regaddr, u32 bitmask); 191 u32 regaddr, u32 bitmask);
189extern void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw, 192void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
190 u32 regaddr, u32 bitmask, u32 data); 193 u32 regaddr, u32 bitmask, u32 data);
191extern u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw, 194u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
192 enum radio_path rfpath, u32 regaddr, 195 enum radio_path rfpath, u32 regaddr,
193 u32 bitmask); 196 u32 bitmask);
194extern void rtl92c_phy_set_rf_reg(struct ieee80211_hw *hw, 197bool rtl92c_phy_mac_config(struct ieee80211_hw *hw);
195 enum radio_path rfpath, u32 regaddr, 198bool rtl92c_phy_bb_config(struct ieee80211_hw *hw);
196 u32 bitmask, u32 data); 199bool rtl92c_phy_rf_config(struct ieee80211_hw *hw);
197extern bool rtl92c_phy_mac_config(struct ieee80211_hw *hw); 200bool rtl92c_phy_config_rf_with_feaderfile(struct ieee80211_hw *hw,
198extern bool rtl92c_phy_bb_config(struct ieee80211_hw *hw);
199extern bool rtl92c_phy_rf_config(struct ieee80211_hw *hw);
200extern bool rtl92c_phy_config_rf_with_feaderfile(struct ieee80211_hw *hw,
201 enum radio_path rfpath); 201 enum radio_path rfpath);
202extern void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw); 202void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
203extern void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw, 203void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw,
204 long *powerlevel); 204 long *powerlevel);
205extern void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel); 205void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
206extern bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, 206bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw,
207 long power_indbm); 207 long power_indbm);
208extern void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, 208void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw,
209 u8 operation); 209 u8 operation);
210extern void rtl92c_phy_set_bw_mode_callback(struct ieee80211_hw *hw); 210void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
211extern void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
212 enum nl80211_channel_type ch_type); 211 enum nl80211_channel_type ch_type);
213extern void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw); 212void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw);
214extern u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw); 213u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw);
215extern void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery); 214void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery);
216extern void rtl92c_phy_set_beacon_hw_reg(struct ieee80211_hw *hw, 215void rtl92c_phy_set_beacon_hw_reg(struct ieee80211_hw *hw,
217 u16 beaconinterval); 216 u16 beaconinterval);
218void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta); 217void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
219void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw); 218void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw);
220void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain); 219void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
221bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 220bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
222 enum radio_path rfpath); 221 enum radio_path rfpath);
223extern bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, 222bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw,
224 u32 rfpath); 223 u32 rfpath);
225extern bool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw, 224bool rtl92c_phy_set_rf_power_state(struct ieee80211_hw *hw,
226 enum rf_pwrstate rfpwr_state); 225 enum rf_pwrstate rfpwr_state);
227void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw); 226void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw);
228void rtl92c_phy_set_io(struct ieee80211_hw *hw); 227void rtl92c_phy_set_io(struct ieee80211_hw *hw);
@@ -235,12 +234,25 @@ u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
235 enum wireless_mode wirelessmode, 234 enum wireless_mode wirelessmode,
236 long power_indbm); 235 long power_indbm);
237void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw); 236void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
238static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable, 237void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw);
239 u32 cmdtableidx, u32 cmdtablesz, 238bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
240 enum swchnlcmd_id cmdid, u32 para1, 239 u8 channel, u8 *stage, u8 *step,
241 u32 para2, u32 msdelay); 240 u32 *delay);
242static bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, 241u8 rtl92c_bt_rssi_state_change(struct ieee80211_hw *hw);
243 u8 channel, u8 *stage, u8 *step, 242u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
244 u32 *delay); 243 enum radio_path rfpath, u32 offset);
244void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
245 enum radio_path rfpath, u32 offset,
246 u32 data);
247u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
248 enum radio_path rfpath, u32 offset);
249void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
250 enum radio_path rfpath, u32 offset,
251 u32 data);
252bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw);
253void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
254 u32 regaddr, u32 bitmask,
255 u32 data);
256bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
245 257
246#endif 258#endif