Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright(c) 2009-2012  Realtek Corporation.*/
0003 
0004 #include "hal_bt_coexist.h"
0005 #include "../pci.h"
0006 #include "dm.h"
0007 #include "fw.h"
0008 #include "phy.h"
0009 #include "reg.h"
0010 #include "hal_btc.h"
0011 
0012 static bool bt_operation_on;
0013 
0014 void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
0015                         bool b_reject)
0016 {
0017 }
0018 
0019 void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
0020 {
0021     struct rtl_priv *rtlpriv = rtl_priv(hw);
0022     struct rtl_phy *rtlphy = &(rtlpriv->phy);
0023 
0024     if (rtlpriv->link_info.busytraffic) {
0025         rtlpriv->btcoexist.cstate &=
0026             ~BT_COEX_STATE_WIFI_IDLE;
0027 
0028         if (rtlpriv->link_info.tx_busy_traffic)
0029             rtlpriv->btcoexist.cstate |=
0030                 BT_COEX_STATE_WIFI_UPLINK;
0031         else
0032             rtlpriv->btcoexist.cstate &=
0033                 ~BT_COEX_STATE_WIFI_UPLINK;
0034 
0035         if (rtlpriv->link_info.rx_busy_traffic)
0036             rtlpriv->btcoexist.cstate |=
0037                 BT_COEX_STATE_WIFI_DOWNLINK;
0038         else
0039             rtlpriv->btcoexist.cstate &=
0040                 ~BT_COEX_STATE_WIFI_DOWNLINK;
0041     } else {
0042         rtlpriv->btcoexist.cstate |= BT_COEX_STATE_WIFI_IDLE;
0043         rtlpriv->btcoexist.cstate &=
0044             ~BT_COEX_STATE_WIFI_UPLINK;
0045         rtlpriv->btcoexist.cstate &=
0046             ~BT_COEX_STATE_WIFI_DOWNLINK;
0047     }
0048 
0049     if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
0050         rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
0051         rtlpriv->btcoexist.cstate |=
0052             BT_COEX_STATE_WIFI_LEGACY;
0053         rtlpriv->btcoexist.cstate &=
0054             ~BT_COEX_STATE_WIFI_HT20;
0055         rtlpriv->btcoexist.cstate &=
0056             ~BT_COEX_STATE_WIFI_HT40;
0057     } else {
0058         rtlpriv->btcoexist.cstate &=
0059             ~BT_COEX_STATE_WIFI_LEGACY;
0060         if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
0061             rtlpriv->btcoexist.cstate |=
0062                 BT_COEX_STATE_WIFI_HT40;
0063             rtlpriv->btcoexist.cstate &=
0064                 ~BT_COEX_STATE_WIFI_HT20;
0065         } else {
0066             rtlpriv->btcoexist.cstate |=
0067                 BT_COEX_STATE_WIFI_HT20;
0068             rtlpriv->btcoexist.cstate &=
0069                 ~BT_COEX_STATE_WIFI_HT40;
0070         }
0071     }
0072 
0073     if (bt_operation_on)
0074         rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT30;
0075     else
0076         rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT30;
0077 }
0078 
0079 u8 rtl8723e_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
0080                      u8 level_num, u8 rssi_thresh,
0081                      u8 rssi_thresh1)
0082 
0083 {
0084     struct rtl_priv *rtlpriv = rtl_priv(hw);
0085     long undecoratedsmoothed_pwdb;
0086     u8 bt_rssi_state = 0;
0087 
0088     undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
0089 
0090     if (level_num == 2) {
0091         rtlpriv->btcoexist.cstate &=
0092             ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
0093 
0094         if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0095              BT_RSSI_STATE_LOW) ||
0096             (rtlpriv->btcoexist.bt_pre_rssi_state ==
0097              BT_RSSI_STATE_STAY_LOW)) {
0098             if (undecoratedsmoothed_pwdb >=
0099                 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
0100                 bt_rssi_state = BT_RSSI_STATE_HIGH;
0101                 rtlpriv->btcoexist.cstate |=
0102                     BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0103                 rtlpriv->btcoexist.cstate &=
0104                     ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
0105                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0106                     "[DM][BT], RSSI_1 state switch to High\n");
0107             } else {
0108                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
0109                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0110                     "[DM][BT], RSSI_1 state stay at Low\n");
0111             }
0112         } else {
0113             if (undecoratedsmoothed_pwdb < rssi_thresh) {
0114                 bt_rssi_state = BT_RSSI_STATE_LOW;
0115                 rtlpriv->btcoexist.cstate |=
0116                     BT_COEX_STATE_WIFI_RSSI_1_LOW;
0117                 rtlpriv->btcoexist.cstate &=
0118                     ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0119                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0120                     "[DM][BT], RSSI_1 state switch to Low\n");
0121             } else {
0122                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
0123                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0124                     "[DM][BT], RSSI_1 state stay at High\n");
0125             }
0126         }
0127     } else if (level_num == 3) {
0128         if (rssi_thresh > rssi_thresh1) {
0129             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0130                 "[DM][BT], RSSI_1 thresh error!!\n");
0131             return rtlpriv->btcoexist.bt_pre_rssi_state;
0132         }
0133 
0134         if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0135              BT_RSSI_STATE_LOW) ||
0136             (rtlpriv->btcoexist.bt_pre_rssi_state ==
0137              BT_RSSI_STATE_STAY_LOW)) {
0138             if (undecoratedsmoothed_pwdb >=
0139                 (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
0140                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
0141                 rtlpriv->btcoexist.cstate |=
0142                     BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
0143                 rtlpriv->btcoexist.cstate &=
0144                     ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
0145                 rtlpriv->btcoexist.cstate &=
0146                     ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0147                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0148                     "[DM][BT], RSSI_1 state switch to Medium\n");
0149             } else {
0150                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
0151                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0152                     "[DM][BT], RSSI_1 state stay at Low\n");
0153             }
0154         } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0155                 BT_RSSI_STATE_MEDIUM) ||
0156                (rtlpriv->btcoexist.bt_pre_rssi_state ==
0157                 BT_RSSI_STATE_STAY_MEDIUM)) {
0158             if (undecoratedsmoothed_pwdb >=
0159                 (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
0160                 bt_rssi_state = BT_RSSI_STATE_HIGH;
0161                 rtlpriv->btcoexist.cstate |=
0162                     BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0163                 rtlpriv->btcoexist.cstate &=
0164                     ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
0165                 rtlpriv->btcoexist.cstate &=
0166                     ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
0167                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0168                     "[DM][BT], RSSI_1 state switch to High\n");
0169             } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
0170                 bt_rssi_state = BT_RSSI_STATE_LOW;
0171                 rtlpriv->btcoexist.cstate |=
0172                     BT_COEX_STATE_WIFI_RSSI_1_LOW;
0173                 rtlpriv->btcoexist.cstate &=
0174                     ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0175                 rtlpriv->btcoexist.cstate &=
0176                     ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
0177                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0178                     "[DM][BT], RSSI_1 state switch to Low\n");
0179             } else {
0180                 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
0181                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0182                     "[DM][BT], RSSI_1 state stay at Medium\n");
0183             }
0184         } else {
0185             if (undecoratedsmoothed_pwdb < rssi_thresh1) {
0186                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
0187                 rtlpriv->btcoexist.cstate |=
0188                     BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
0189                 rtlpriv->btcoexist.cstate &=
0190                     ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
0191                 rtlpriv->btcoexist.cstate &=
0192                     ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
0193                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0194                     "[DM][BT], RSSI_1 state switch to Medium\n");
0195             } else {
0196                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
0197                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0198                     "[DM][BT], RSSI_1 state stay at High\n");
0199             }
0200         }
0201     }
0202     rtlpriv->btcoexist.bt_pre_rssi_state1 = bt_rssi_state;
0203 
0204     return bt_rssi_state;
0205 }
0206 
0207 u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
0208                     u8 level_num,
0209                     u8 rssi_thresh,
0210                     u8 rssi_thresh1)
0211 {
0212     struct rtl_priv *rtlpriv = rtl_priv(hw);
0213     long undecoratedsmoothed_pwdb = 0;
0214     u8 bt_rssi_state = 0;
0215 
0216     undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
0217 
0218     if (level_num == 2) {
0219         rtlpriv->btcoexist.cstate &=
0220             ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
0221 
0222         if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0223              BT_RSSI_STATE_LOW) ||
0224             (rtlpriv->btcoexist.bt_pre_rssi_state ==
0225              BT_RSSI_STATE_STAY_LOW)) {
0226             if (undecoratedsmoothed_pwdb >=
0227                 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
0228                 bt_rssi_state = BT_RSSI_STATE_HIGH;
0229                 rtlpriv->btcoexist.cstate
0230                     |= BT_COEX_STATE_WIFI_RSSI_HIGH;
0231                 rtlpriv->btcoexist.cstate
0232                     &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
0233                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0234                     "[DM][BT], RSSI state switch to High\n");
0235             } else {
0236                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
0237                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0238                     "[DM][BT], RSSI state stay at Low\n");
0239             }
0240         } else {
0241             if (undecoratedsmoothed_pwdb < rssi_thresh) {
0242                 bt_rssi_state = BT_RSSI_STATE_LOW;
0243                 rtlpriv->btcoexist.cstate
0244                     |= BT_COEX_STATE_WIFI_RSSI_LOW;
0245                 rtlpriv->btcoexist.cstate
0246                     &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
0247                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0248                     "[DM][BT], RSSI state switch to Low\n");
0249             } else {
0250                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
0251                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0252                     "[DM][BT], RSSI state stay at High\n");
0253             }
0254         }
0255     } else if (level_num == 3) {
0256         if (rssi_thresh > rssi_thresh1) {
0257             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0258                 "[DM][BT], RSSI thresh error!!\n");
0259             return rtlpriv->btcoexist.bt_pre_rssi_state;
0260         }
0261         if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0262              BT_RSSI_STATE_LOW) ||
0263             (rtlpriv->btcoexist.bt_pre_rssi_state ==
0264              BT_RSSI_STATE_STAY_LOW)) {
0265             if (undecoratedsmoothed_pwdb >=
0266                 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
0267                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
0268                 rtlpriv->btcoexist.cstate
0269                     |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
0270                 rtlpriv->btcoexist.cstate
0271                     &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
0272                 rtlpriv->btcoexist.cstate
0273                     &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
0274                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0275                     "[DM][BT], RSSI state switch to Medium\n");
0276             } else {
0277                 bt_rssi_state = BT_RSSI_STATE_STAY_LOW;
0278                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0279                     "[DM][BT], RSSI state stay at Low\n");
0280             }
0281         } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
0282                 BT_RSSI_STATE_MEDIUM) ||
0283             (rtlpriv->btcoexist.bt_pre_rssi_state ==
0284                 BT_RSSI_STATE_STAY_MEDIUM)) {
0285             if (undecoratedsmoothed_pwdb >=
0286                 (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
0287                 bt_rssi_state = BT_RSSI_STATE_HIGH;
0288                 rtlpriv->btcoexist.cstate
0289                     |= BT_COEX_STATE_WIFI_RSSI_HIGH;
0290                 rtlpriv->btcoexist.cstate
0291                     &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
0292                 rtlpriv->btcoexist.cstate
0293                     &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
0294                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0295                     "[DM][BT], RSSI state switch to High\n");
0296             } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
0297                 bt_rssi_state = BT_RSSI_STATE_LOW;
0298                 rtlpriv->btcoexist.cstate
0299                     |= BT_COEX_STATE_WIFI_RSSI_LOW;
0300                 rtlpriv->btcoexist.cstate
0301                     &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
0302                 rtlpriv->btcoexist.cstate
0303                     &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
0304                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0305                     "[DM][BT], RSSI state switch to Low\n");
0306             } else {
0307                 bt_rssi_state = BT_RSSI_STATE_STAY_MEDIUM;
0308                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0309                     "[DM][BT], RSSI state stay at Medium\n");
0310             }
0311         } else {
0312             if (undecoratedsmoothed_pwdb < rssi_thresh1) {
0313                 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
0314                 rtlpriv->btcoexist.cstate
0315                     |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
0316                 rtlpriv->btcoexist.cstate
0317                     &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
0318                 rtlpriv->btcoexist.cstate
0319                     &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
0320                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0321                     "[DM][BT], RSSI state switch to Medium\n");
0322             } else {
0323                 bt_rssi_state = BT_RSSI_STATE_STAY_HIGH;
0324                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0325                     "[DM][BT], RSSI state stay at High\n");
0326             }
0327         }
0328     }
0329     rtlpriv->btcoexist.bt_pre_rssi_state = bt_rssi_state;
0330     return bt_rssi_state;
0331 }
0332 
0333 long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
0334 {
0335     struct rtl_priv *rtlpriv = rtl_priv(hw);
0336     long undecoratedsmoothed_pwdb = 0;
0337 
0338     if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
0339         undecoratedsmoothed_pwdb =
0340             GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
0341     } else {
0342         undecoratedsmoothed_pwdb
0343             = rtlpriv->dm.entry_min_undec_sm_pwdb;
0344     }
0345     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0346         "%s = %ld\n", __func__,
0347         undecoratedsmoothed_pwdb);
0348 
0349     return undecoratedsmoothed_pwdb;
0350 }
0351 
0352 void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw,
0353                 bool balance_on, u8 ms0, u8 ms1)
0354 {
0355     struct rtl_priv *rtlpriv = rtl_priv(hw);
0356     u8 h2c_parameter[3] = {0};
0357 
0358     if (balance_on) {
0359         h2c_parameter[2] = 1;
0360         h2c_parameter[1] = ms1;
0361         h2c_parameter[0] = ms0;
0362         rtlpriv->btcoexist.fw_coexist_all_off = false;
0363     } else {
0364         h2c_parameter[2] = 0;
0365         h2c_parameter[1] = 0;
0366         h2c_parameter[0] = 0;
0367     }
0368     rtlpriv->btcoexist.balance_on = balance_on;
0369 
0370     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0371         "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
0372         balance_on ? "ON" : "OFF", ms0, ms1, h2c_parameter[0] << 16 |
0373         h2c_parameter[1] << 8 | h2c_parameter[2]);
0374 
0375     rtl8723e_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
0376 }
0377 
0378 
0379 void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
0380 {
0381     struct rtl_priv *rtlpriv = rtl_priv(hw);
0382 
0383     if (type == BT_AGCTABLE_OFF) {
0384         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0385             "[BT]AGCTable Off!\n");
0386         rtl_write_dword(rtlpriv, 0xc78, 0x641c0001);
0387         rtl_write_dword(rtlpriv, 0xc78, 0x631d0001);
0388         rtl_write_dword(rtlpriv, 0xc78, 0x621e0001);
0389         rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);
0390         rtl_write_dword(rtlpriv, 0xc78, 0x60200001);
0391 
0392         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0393                     RF_RX_AGC_HP, 0xfffff, 0x32000);
0394         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0395                     RF_RX_AGC_HP, 0xfffff, 0x71000);
0396         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0397                     RF_RX_AGC_HP, 0xfffff, 0xb0000);
0398         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0399                     RF_RX_AGC_HP, 0xfffff, 0xfc000);
0400         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0401                     RF_RX_G1, 0xfffff, 0x30355);
0402     } else if (type == BT_AGCTABLE_ON) {
0403         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0404             "[BT]AGCTable On!\n");
0405         rtl_write_dword(rtlpriv, 0xc78, 0x4e1c0001);
0406         rtl_write_dword(rtlpriv, 0xc78, 0x4d1d0001);
0407         rtl_write_dword(rtlpriv, 0xc78, 0x4c1e0001);
0408         rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);
0409         rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);
0410 
0411         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0412                     RF_RX_AGC_HP, 0xfffff, 0xdc000);
0413         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0414                     RF_RX_AGC_HP, 0xfffff, 0x90000);
0415         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0416                     RF_RX_AGC_HP, 0xfffff, 0x51000);
0417         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0418                     RF_RX_AGC_HP, 0xfffff, 0x12000);
0419         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
0420                     RF_RX_G1, 0xfffff, 0x00355);
0421 
0422         rtlpriv->btcoexist.sw_coexist_all_off = false;
0423     }
0424 }
0425 
0426 void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type)
0427 {
0428     struct rtl_priv *rtlpriv = rtl_priv(hw);
0429 
0430     if (type == BT_BB_BACKOFF_OFF) {
0431         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0432             "[BT]BBBackOffLevel Off!\n");
0433         rtl_write_dword(rtlpriv, 0xc04, 0x3a05611);
0434     } else if (type == BT_BB_BACKOFF_ON) {
0435         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0436             "[BT]BBBackOffLevel On!\n");
0437         rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);
0438         rtlpriv->btcoexist.sw_coexist_all_off = false;
0439     }
0440 }
0441 
0442 void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
0443 {
0444     struct rtl_priv *rtlpriv = rtl_priv(hw);
0445     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0446         "rtl8723e_dm_bt_fw_coex_all_off()\n");
0447 
0448     if (rtlpriv->btcoexist.fw_coexist_all_off)
0449         return;
0450 
0451     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0452         "rtl8723e_dm_bt_fw_coex_all_off(), real Do\n");
0453     rtl8723e_dm_bt_fw_coex_all_off_8723a(hw);
0454     rtlpriv->btcoexist.fw_coexist_all_off = true;
0455 }
0456 
0457 void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
0458 {
0459     struct rtl_priv *rtlpriv = rtl_priv(hw);
0460 
0461     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0462         "%s\n", __func__);
0463 
0464     if (rtlpriv->btcoexist.sw_coexist_all_off)
0465         return;
0466 
0467     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0468         "%s, real Do\n", __func__);
0469     rtl8723e_dm_bt_sw_coex_all_off_8723a(hw);
0470     rtlpriv->btcoexist.sw_coexist_all_off = true;
0471 }
0472 
0473 void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
0474 {
0475     struct rtl_priv *rtlpriv = rtl_priv(hw);
0476 
0477     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0478         "%s\n", __func__);
0479 
0480     if (rtlpriv->btcoexist.hw_coexist_all_off)
0481         return;
0482     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0483         "%s, real Do\n", __func__);
0484 
0485     rtl8723e_dm_bt_hw_coex_all_off_8723a(hw);
0486 
0487     rtlpriv->btcoexist.hw_coexist_all_off = true;
0488 }
0489 
0490 void rtl8723e_btdm_coex_all_off(struct ieee80211_hw *hw)
0491 {
0492     rtl8723e_dm_bt_fw_coex_all_off(hw);
0493     rtl8723e_dm_bt_sw_coex_all_off(hw);
0494     rtl8723e_dm_bt_hw_coex_all_off(hw);
0495 }
0496 
0497 bool rtl8723e_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
0498 {
0499     struct rtl_priv *rtlpriv = rtl_priv(hw);
0500 
0501     if ((rtlpriv->btcoexist.previous_state == rtlpriv->btcoexist.cstate) &&
0502         (rtlpriv->btcoexist.previous_state_h ==
0503          rtlpriv->btcoexist.cstate_h))
0504         return false;
0505     return true;
0506 }
0507 
0508 bool rtl8723e_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
0509 {
0510     struct rtl_priv *rtlpriv = rtl_priv(hw);
0511 
0512     if (rtlpriv->link_info.tx_busy_traffic)
0513         return true;
0514     return false;
0515 }