root/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_bt_coexist.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rtl8723e_dm_bt_reject_ap_aggregated_packet
  2. _rtl8723_dm_bt_check_wifi_state
  3. rtl8723e_dm_bt_check_coex_rssi_state1
  4. rtl8723e_dm_bt_check_coex_rssi_state
  5. rtl8723e_dm_bt_get_rx_ss
  6. rtl8723e_dm_bt_balance
  7. rtl8723e_dm_bt_agc_table
  8. rtl8723e_dm_bt_bb_back_off_level
  9. rtl8723e_dm_bt_fw_coex_all_off
  10. rtl8723e_dm_bt_sw_coex_all_off
  11. rtl8723e_dm_bt_hw_coex_all_off
  12. rtl8723e_btdm_coex_all_off
  13. rtl8723e_dm_bt_is_coexist_state_changed
  14. rtl8723e_dm_bt_is_wifi_up_link

   1 // SPDX-License-Identifier: GPL-2.0
   2 /* Copyright(c) 2009-2012  Realtek Corporation.*/
   3 
   4 #include "hal_bt_coexist.h"
   5 #include "../pci.h"
   6 #include "dm.h"
   7 #include "fw.h"
   8 #include "phy.h"
   9 #include "reg.h"
  10 #include "hal_btc.h"
  11 
  12 static bool bt_operation_on;
  13 
  14 void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
  15                                                 bool b_reject)
  16 {
  17 }
  18 
  19 void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
  20 {
  21         struct rtl_priv *rtlpriv = rtl_priv(hw);
  22         struct rtl_phy *rtlphy = &(rtlpriv->phy);
  23 
  24         if (rtlpriv->link_info.busytraffic) {
  25                 rtlpriv->btcoexist.cstate &=
  26                         ~BT_COEX_STATE_WIFI_IDLE;
  27 
  28                 if (rtlpriv->link_info.tx_busy_traffic)
  29                         rtlpriv->btcoexist.cstate |=
  30                                 BT_COEX_STATE_WIFI_UPLINK;
  31                 else
  32                         rtlpriv->btcoexist.cstate &=
  33                                 ~BT_COEX_STATE_WIFI_UPLINK;
  34 
  35                 if (rtlpriv->link_info.rx_busy_traffic)
  36                         rtlpriv->btcoexist.cstate |=
  37                                 BT_COEX_STATE_WIFI_DOWNLINK;
  38                 else
  39                         rtlpriv->btcoexist.cstate &=
  40                                 ~BT_COEX_STATE_WIFI_DOWNLINK;
  41         } else {
  42                 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_WIFI_IDLE;
  43                 rtlpriv->btcoexist.cstate &=
  44                         ~BT_COEX_STATE_WIFI_UPLINK;
  45                 rtlpriv->btcoexist.cstate &=
  46                         ~BT_COEX_STATE_WIFI_DOWNLINK;
  47         }
  48 
  49         if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
  50             rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
  51                 rtlpriv->btcoexist.cstate |=
  52                         BT_COEX_STATE_WIFI_LEGACY;
  53                 rtlpriv->btcoexist.cstate &=
  54                         ~BT_COEX_STATE_WIFI_HT20;
  55                 rtlpriv->btcoexist.cstate &=
  56                         ~BT_COEX_STATE_WIFI_HT40;
  57         } else {
  58                 rtlpriv->btcoexist.cstate &=
  59                         ~BT_COEX_STATE_WIFI_LEGACY;
  60                 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
  61                         rtlpriv->btcoexist.cstate |=
  62                                 BT_COEX_STATE_WIFI_HT40;
  63                         rtlpriv->btcoexist.cstate &=
  64                                 ~BT_COEX_STATE_WIFI_HT20;
  65                 } else {
  66                         rtlpriv->btcoexist.cstate |=
  67                                 BT_COEX_STATE_WIFI_HT20;
  68                         rtlpriv->btcoexist.cstate &=
  69                                 ~BT_COEX_STATE_WIFI_HT40;
  70                 }
  71         }
  72 
  73         if (bt_operation_on)
  74                 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT30;
  75         else
  76                 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT30;
  77 }
  78 
  79 u8 rtl8723e_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
  80                                          u8 level_num, u8 rssi_thresh,
  81                                          u8 rssi_thresh1)
  82 
  83 {
  84         struct rtl_priv *rtlpriv = rtl_priv(hw);
  85         long undecoratedsmoothed_pwdb;
  86         u8 bt_rssi_state = 0;
  87 
  88         undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
  89 
  90         if (level_num == 2) {
  91                 rtlpriv->btcoexist.cstate &=
  92                         ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
  93 
  94                 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
  95                      BT_RSSI_STATE_LOW) ||
  96                     (rtlpriv->btcoexist.bt_pre_rssi_state ==
  97                      BT_RSSI_STATE_STAY_LOW)) {
  98                         if (undecoratedsmoothed_pwdb >=
  99                             (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
 100                                 bt_rssi_state = BT_RSSI_STATE_HIGH;
 101                                 rtlpriv->btcoexist.cstate |=
 102                                         BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 103                                 rtlpriv->btcoexist.cstate &=
 104                                         ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
 105                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 106                                          "[DM][BT], RSSI_1 state switch to High\n");
 107                         } else {
 108                                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
 109                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 110                                          "[DM][BT], RSSI_1 state stay at Low\n");
 111                         }
 112                 } else {
 113                         if (undecoratedsmoothed_pwdb < rssi_thresh) {
 114                                 bt_rssi_state = BT_RSSI_STATE_LOW;
 115                                 rtlpriv->btcoexist.cstate |=
 116                                         BT_COEX_STATE_WIFI_RSSI_1_LOW;
 117                                 rtlpriv->btcoexist.cstate &=
 118                                         ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 119                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 120                                          "[DM][BT], RSSI_1 state switch to Low\n");
 121                         } else {
 122                                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
 123                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 124                                          "[DM][BT], RSSI_1 state stay at High\n");
 125                         }
 126                 }
 127         } else if (level_num == 3) {
 128                 if (rssi_thresh > rssi_thresh1) {
 129                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 130                                  "[DM][BT], RSSI_1 thresh error!!\n");
 131                         return rtlpriv->btcoexist.bt_pre_rssi_state;
 132                 }
 133 
 134                 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
 135                      BT_RSSI_STATE_LOW) ||
 136                     (rtlpriv->btcoexist.bt_pre_rssi_state ==
 137                      BT_RSSI_STATE_STAY_LOW)) {
 138                         if (undecoratedsmoothed_pwdb >=
 139                             (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
 140                                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
 141                                 rtlpriv->btcoexist.cstate |=
 142                                         BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
 143                                 rtlpriv->btcoexist.cstate &=
 144                                         ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
 145                                 rtlpriv->btcoexist.cstate &=
 146                                         ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 147                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 148                                          "[DM][BT], RSSI_1 state switch to Medium\n");
 149                         } else {
 150                                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
 151                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 152                                          "[DM][BT], RSSI_1 state stay at Low\n");
 153                         }
 154                 } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
 155                             BT_RSSI_STATE_MEDIUM) ||
 156                            (rtlpriv->btcoexist.bt_pre_rssi_state ==
 157                             BT_RSSI_STATE_STAY_MEDIUM)) {
 158                         if (undecoratedsmoothed_pwdb >=
 159                             (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
 160                                 bt_rssi_state = BT_RSSI_STATE_HIGH;
 161                                 rtlpriv->btcoexist.cstate |=
 162                                         BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 163                                 rtlpriv->btcoexist.cstate &=
 164                                         ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
 165                                 rtlpriv->btcoexist.cstate &=
 166                                         ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
 167                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 168                                          "[DM][BT], RSSI_1 state switch to High\n");
 169                         } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
 170                                 bt_rssi_state = BT_RSSI_STATE_LOW;
 171                                 rtlpriv->btcoexist.cstate |=
 172                                         BT_COEX_STATE_WIFI_RSSI_1_LOW;
 173                                 rtlpriv->btcoexist.cstate &=
 174                                         ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 175                                 rtlpriv->btcoexist.cstate &=
 176                                         ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
 177                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 178                                          "[DM][BT], RSSI_1 state switch to Low\n");
 179                         } else {
 180                                 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
 181                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 182                                          "[DM][BT], RSSI_1 state stay at Medium\n");
 183                         }
 184                 } else {
 185                         if (undecoratedsmoothed_pwdb < rssi_thresh1) {
 186                                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
 187                                 rtlpriv->btcoexist.cstate |=
 188                                         BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
 189                                 rtlpriv->btcoexist.cstate &=
 190                                         ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
 191                                 rtlpriv->btcoexist.cstate &=
 192                                         ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
 193                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 194                                          "[DM][BT], RSSI_1 state switch to Medium\n");
 195                         } else {
 196                                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
 197                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 198                                          "[DM][BT], RSSI_1 state stay at High\n");
 199                         }
 200                 }
 201         }
 202         rtlpriv->btcoexist.bt_pre_rssi_state1 = bt_rssi_state;
 203 
 204         return bt_rssi_state;
 205 }
 206 
 207 u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
 208                                         u8 level_num,
 209                                         u8 rssi_thresh,
 210                                         u8 rssi_thresh1)
 211 {
 212         struct rtl_priv *rtlpriv = rtl_priv(hw);
 213         long undecoratedsmoothed_pwdb = 0;
 214         u8 bt_rssi_state = 0;
 215 
 216         undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
 217 
 218         if (level_num == 2) {
 219                 rtlpriv->btcoexist.cstate &=
 220                         ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
 221 
 222                 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
 223                      BT_RSSI_STATE_LOW) ||
 224                     (rtlpriv->btcoexist.bt_pre_rssi_state ==
 225                      BT_RSSI_STATE_STAY_LOW)) {
 226                         if (undecoratedsmoothed_pwdb >=
 227                             (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
 228                                 bt_rssi_state = BT_RSSI_STATE_HIGH;
 229                                 rtlpriv->btcoexist.cstate
 230                                         |= BT_COEX_STATE_WIFI_RSSI_HIGH;
 231                                 rtlpriv->btcoexist.cstate
 232                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
 233                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 234                                          "[DM][BT], RSSI state switch to High\n");
 235                         } else {
 236                                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
 237                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 238                                          "[DM][BT], RSSI state stay at Low\n");
 239                         }
 240                 } else {
 241                         if (undecoratedsmoothed_pwdb < rssi_thresh) {
 242                                 bt_rssi_state = BT_RSSI_STATE_LOW;
 243                                 rtlpriv->btcoexist.cstate
 244                                         |= BT_COEX_STATE_WIFI_RSSI_LOW;
 245                                 rtlpriv->btcoexist.cstate
 246                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
 247                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 248                                          "[DM][BT], RSSI state switch to Low\n");
 249                         } else {
 250                                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
 251                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 252                                          "[DM][BT], RSSI state stay at High\n");
 253                         }
 254                 }
 255         } else if (level_num == 3) {
 256                 if (rssi_thresh > rssi_thresh1) {
 257                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 258                                  "[DM][BT], RSSI thresh error!!\n");
 259                         return rtlpriv->btcoexist.bt_pre_rssi_state;
 260                 }
 261                 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
 262                      BT_RSSI_STATE_LOW) ||
 263                     (rtlpriv->btcoexist.bt_pre_rssi_state ==
 264                      BT_RSSI_STATE_STAY_LOW)) {
 265                         if (undecoratedsmoothed_pwdb >=
 266                             (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
 267                                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
 268                                 rtlpriv->btcoexist.cstate
 269                                         |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
 270                                 rtlpriv->btcoexist.cstate
 271                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
 272                                 rtlpriv->btcoexist.cstate
 273                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
 274                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 275                                          "[DM][BT], RSSI state switch to Medium\n");
 276                         } else {
 277                                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
 278                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 279                                          "[DM][BT], RSSI state stay at Low\n");
 280                         }
 281                 } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
 282                                 BT_RSSI_STATE_MEDIUM) ||
 283                         (rtlpriv->btcoexist.bt_pre_rssi_state ==
 284                                 BT_RSSI_STATE_STAY_MEDIUM)) {
 285                         if (undecoratedsmoothed_pwdb >=
 286                             (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
 287                                 bt_rssi_state = BT_RSSI_STATE_HIGH;
 288                                 rtlpriv->btcoexist.cstate
 289                                         |= BT_COEX_STATE_WIFI_RSSI_HIGH;
 290                                 rtlpriv->btcoexist.cstate
 291                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
 292                                 rtlpriv->btcoexist.cstate
 293                                         &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
 294                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 295                                          "[DM][BT], RSSI state switch to High\n");
 296                         } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
 297                                 bt_rssi_state = BT_RSSI_STATE_LOW;
 298                                 rtlpriv->btcoexist.cstate
 299                                         |= BT_COEX_STATE_WIFI_RSSI_LOW;
 300                                 rtlpriv->btcoexist.cstate
 301                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
 302                                 rtlpriv->btcoexist.cstate
 303                                         &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
 304                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 305                                          "[DM][BT], RSSI state switch to Low\n");
 306                         } else {
 307                                 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
 308                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 309                                          "[DM][BT], RSSI state stay at Medium\n");
 310                         }
 311                 } else {
 312                         if (undecoratedsmoothed_pwdb < rssi_thresh1) {
 313                                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
 314                                 rtlpriv->btcoexist.cstate
 315                                         |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
 316                                 rtlpriv->btcoexist.cstate
 317                                         &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
 318                                 rtlpriv->btcoexist.cstate
 319                                         &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
 320                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 321                                          "[DM][BT], RSSI state switch to Medium\n");
 322                         } else {
 323                                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
 324                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 325                                          "[DM][BT], RSSI state stay at High\n");
 326                         }
 327                 }
 328         }
 329         rtlpriv->btcoexist.bt_pre_rssi_state = bt_rssi_state;
 330         return bt_rssi_state;
 331 }
 332 
 333 long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
 334 {
 335         struct rtl_priv *rtlpriv = rtl_priv(hw);
 336         long undecoratedsmoothed_pwdb = 0;
 337 
 338         if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
 339                 undecoratedsmoothed_pwdb =
 340                         GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
 341         } else {
 342                 undecoratedsmoothed_pwdb
 343                         = rtlpriv->dm.entry_min_undec_sm_pwdb;
 344         }
 345         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 346                  "rtl8723e_dm_bt_get_rx_ss() = %ld\n",
 347                  undecoratedsmoothed_pwdb);
 348 
 349         return undecoratedsmoothed_pwdb;
 350 }
 351 
 352 void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw,
 353                             bool balance_on, u8 ms0, u8 ms1)
 354 {
 355         struct rtl_priv *rtlpriv = rtl_priv(hw);
 356         u8 h2c_parameter[3] = {0};
 357 
 358         if (balance_on) {
 359                 h2c_parameter[2] = 1;
 360                 h2c_parameter[1] = ms1;
 361                 h2c_parameter[0] = ms0;
 362                 rtlpriv->btcoexist.fw_coexist_all_off = false;
 363         } else {
 364                 h2c_parameter[2] = 0;
 365                 h2c_parameter[1] = 0;
 366                 h2c_parameter[0] = 0;
 367         }
 368         rtlpriv->btcoexist.balance_on = balance_on;
 369 
 370         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 371                  "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
 372                  balance_on ? "ON" : "OFF", ms0, ms1, h2c_parameter[0]<<16 |
 373                  h2c_parameter[1]<<8 | h2c_parameter[2]);
 374 
 375         rtl8723e_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
 376 }
 377 
 378 
 379 void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
 380 {
 381         struct rtl_priv *rtlpriv = rtl_priv(hw);
 382 
 383         if (type == BT_AGCTABLE_OFF) {
 384                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 385                          "[BT]AGCTable Off!\n");
 386                 rtl_write_dword(rtlpriv, 0xc78, 0x641c0001);
 387                 rtl_write_dword(rtlpriv, 0xc78, 0x631d0001);
 388                 rtl_write_dword(rtlpriv, 0xc78, 0x621e0001);
 389                 rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);
 390                 rtl_write_dword(rtlpriv, 0xc78, 0x60200001);
 391 
 392                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 393                                         RF_RX_AGC_HP, 0xfffff, 0x32000);
 394                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 395                                         RF_RX_AGC_HP, 0xfffff, 0x71000);
 396                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 397                                         RF_RX_AGC_HP, 0xfffff, 0xb0000);
 398                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 399                                         RF_RX_AGC_HP, 0xfffff, 0xfc000);
 400                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 401                                         RF_RX_G1, 0xfffff, 0x30355);
 402         } else if (type == BT_AGCTABLE_ON) {
 403                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 404                          "[BT]AGCTable On!\n");
 405                 rtl_write_dword(rtlpriv, 0xc78, 0x4e1c0001);
 406                 rtl_write_dword(rtlpriv, 0xc78, 0x4d1d0001);
 407                 rtl_write_dword(rtlpriv, 0xc78, 0x4c1e0001);
 408                 rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);
 409                 rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);
 410 
 411                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 412                                         RF_RX_AGC_HP, 0xfffff, 0xdc000);
 413                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 414                                         RF_RX_AGC_HP, 0xfffff, 0x90000);
 415                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 416                                         RF_RX_AGC_HP, 0xfffff, 0x51000);
 417                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 418                                         RF_RX_AGC_HP, 0xfffff, 0x12000);
 419                 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
 420                                         RF_RX_G1, 0xfffff, 0x00355);
 421 
 422                 rtlpriv->btcoexist.sw_coexist_all_off = false;
 423         }
 424 }
 425 
 426 void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type)
 427 {
 428         struct rtl_priv *rtlpriv = rtl_priv(hw);
 429 
 430         if (type == BT_BB_BACKOFF_OFF) {
 431                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 432                          "[BT]BBBackOffLevel Off!\n");
 433                 rtl_write_dword(rtlpriv, 0xc04, 0x3a05611);
 434         } else if (type == BT_BB_BACKOFF_ON) {
 435                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 436                          "[BT]BBBackOffLevel On!\n");
 437                 rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);
 438                 rtlpriv->btcoexist.sw_coexist_all_off = false;
 439         }
 440 }
 441 
 442 void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
 443 {
 444         struct rtl_priv *rtlpriv = rtl_priv(hw);
 445         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 446                  "rtl8723e_dm_bt_fw_coex_all_off()\n");
 447 
 448         if (rtlpriv->btcoexist.fw_coexist_all_off)
 449                 return;
 450 
 451         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 452                  "rtl8723e_dm_bt_fw_coex_all_off(), real Do\n");
 453         rtl8723e_dm_bt_fw_coex_all_off_8723a(hw);
 454         rtlpriv->btcoexist.fw_coexist_all_off = true;
 455 }
 456 
 457 void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
 458 {
 459         struct rtl_priv *rtlpriv = rtl_priv(hw);
 460 
 461         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 462                  "rtl8723e_dm_bt_sw_coex_all_off()\n");
 463 
 464         if (rtlpriv->btcoexist.sw_coexist_all_off)
 465                 return;
 466 
 467         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 468                  "rtl8723e_dm_bt_sw_coex_all_off(), real Do\n");
 469         rtl8723e_dm_bt_sw_coex_all_off_8723a(hw);
 470         rtlpriv->btcoexist.sw_coexist_all_off = true;
 471 }
 472 
 473 void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
 474 {
 475         struct rtl_priv *rtlpriv = rtl_priv(hw);
 476 
 477         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 478                  "rtl8723e_dm_bt_hw_coex_all_off()\n");
 479 
 480         if (rtlpriv->btcoexist.hw_coexist_all_off)
 481                 return;
 482         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
 483                  "rtl8723e_dm_bt_hw_coex_all_off(), real Do\n");
 484 
 485         rtl8723e_dm_bt_hw_coex_all_off_8723a(hw);
 486 
 487         rtlpriv->btcoexist.hw_coexist_all_off = true;
 488 }
 489 
 490 void rtl8723e_btdm_coex_all_off(struct ieee80211_hw *hw)
 491 {
 492         rtl8723e_dm_bt_fw_coex_all_off(hw);
 493         rtl8723e_dm_bt_sw_coex_all_off(hw);
 494         rtl8723e_dm_bt_hw_coex_all_off(hw);
 495 }
 496 
 497 bool rtl8723e_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
 498 {
 499         struct rtl_priv *rtlpriv = rtl_priv(hw);
 500 
 501         if ((rtlpriv->btcoexist.previous_state == rtlpriv->btcoexist.cstate) &&
 502             (rtlpriv->btcoexist.previous_state_h ==
 503              rtlpriv->btcoexist.cstate_h))
 504                 return false;
 505         return true;
 506 }
 507 
 508 bool rtl8723e_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
 509 {
 510         struct rtl_priv *rtlpriv = rtl_priv(hw);
 511 
 512         if (rtlpriv->link_info.tx_busy_traffic)
 513                 return true;
 514         return false;
 515 }

/* [<][>][^][v][top][bottom][index][help] */