0001
0002
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 }