1757 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright(c) 2009-2012 Realtek Corporation.*/3 4#include "hal_btc.h"5#include "../pci.h"6#include "phy.h"7#include "fw.h"8#include "reg.h"9#include "def.h"10#include "../rtl8723com/phy_common.h"11 12static struct bt_coexist_8723 hal_coex_8723;13 14void rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps(struct ieee80211_hw *hw)15{16 struct rtl_priv *rtlpriv = rtl_priv(hw);17 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));18 19 if (!rtlpriv->btcoexist.bt_coexistence)20 return;21 22 if (ppsc->inactiveps) {23 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,24 "[BT][DM], Before enter IPS, turn off all Coexist DM\n");25 rtlpriv->btcoexist.cstate = 0;26 rtlpriv->btcoexist.previous_state = 0;27 rtlpriv->btcoexist.cstate_h = 0;28 rtlpriv->btcoexist.previous_state_h = 0;29 rtl8723e_btdm_coex_all_off(hw);30 }31}32 33static enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)34{35 struct rtl_priv *rtlpriv = rtl_priv(hw);36 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));37 enum rt_media_status m_status = RT_MEDIA_DISCONNECT;38 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;39 if (bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED)40 m_status = RT_MEDIA_CONNECT;41 42 return m_status;43}44 45void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw,46 bool mstatus)47{48 struct rtl_priv *rtlpriv = rtl_priv(hw);49 struct rtl_phy *rtlphy = &(rtlpriv->phy);50 u8 h2c_parameter[3] = {0};51 u8 chnl;52 53 if (!rtlpriv->btcoexist.bt_coexistence)54 return;55 56 if (RT_MEDIA_CONNECT == mstatus)57 h2c_parameter[0] = 0x1; /* 0: disconnected, 1:connected */58 else59 h2c_parameter[0] = 0x0;60 61 if (mgnt_link_status_query(hw)) {62 chnl = rtlphy->current_channel;63 h2c_parameter[1] = chnl;64 }65 66 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)67 h2c_parameter[2] = 0x30;68 else69 h2c_parameter[2] = 0x20;70 71 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,72 "[BTCoex], FW write 0x19=0x%x\n",73 h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |74 h2c_parameter[2]);75 76 rtl8723e_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter);77}78 79static bool rtl8723e_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)80{81 struct rtl_priv *rtlpriv = rtl_priv(hw);82 if (rtlpriv->link_info.busytraffic ||83 rtlpriv->link_info.rx_busy_traffic ||84 rtlpriv->link_info.tx_busy_traffic)85 return true;86 else87 return false;88}89 90static void rtl8723e_dm_bt_set_fw_3a(struct ieee80211_hw *hw,91 u8 byte1, u8 byte2, u8 byte3, u8 byte4,92 u8 byte5)93{94 struct rtl_priv *rtlpriv = rtl_priv(hw);95 u8 h2c_parameter[5];96 97 h2c_parameter[0] = byte1;98 h2c_parameter[1] = byte2;99 h2c_parameter[2] = byte3;100 h2c_parameter[3] = byte4;101 h2c_parameter[4] = byte5;102 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,103 "[BTCoex], FW write 0x3a(4bytes)=0x%x%8x\n",104 h2c_parameter[0], h2c_parameter[1]<<24 |105 h2c_parameter[2]<<16 | h2c_parameter[3]<<8 |106 h2c_parameter[4]);107 rtl8723e_fill_h2c_cmd(hw, 0x3a, 5, h2c_parameter);108}109 110static bool rtl8723e_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw)111{112 struct rtl_priv *rtlpriv = rtl_priv(hw);113 114 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {115 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,116 "Need to decrease bt power\n");117 rtlpriv->btcoexist.cstate |=118 BT_COEX_STATE_DEC_BT_POWER;119 return true;120 }121 122 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_DEC_BT_POWER;123 return false;124}125 126static bool rtl8723e_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)127{128 struct rtl_priv *rtlpriv = rtl_priv(hw);129 130 if ((rtlpriv->btcoexist.previous_state ==131 rtlpriv->btcoexist.cstate) &&132 (rtlpriv->btcoexist.previous_state_h ==133 rtlpriv->btcoexist.cstate_h)) {134 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,135 "[DM][BT], Coexist state do not change!!\n");136 return true;137 } else {138 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,139 "[DM][BT], Coexist state changed!!\n");140 return false;141 }142}143 144static void rtl8723e_dm_bt_set_coex_table(struct ieee80211_hw *hw,145 u32 val_0x6c0, u32 val_0x6c8,146 u32 val_0x6cc)147{148 struct rtl_priv *rtlpriv = rtl_priv(hw);149 150 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,151 "set coex table, set 0x6c0=0x%x\n", val_0x6c0);152 rtl_write_dword(rtlpriv, 0x6c0, val_0x6c0);153 154 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,155 "set coex table, set 0x6c8=0x%x\n", val_0x6c8);156 rtl_write_dword(rtlpriv, 0x6c8, val_0x6c8);157 158 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,159 "set coex table, set 0x6cc=0x%x\n", val_0x6cc);160 rtl_write_byte(rtlpriv, 0x6cc, val_0x6cc);161}162 163static void rtl8723e_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool b_mode)164{165 struct rtl_priv *rtlpriv = rtl_priv(hw);166 167 if (BT_PTA_MODE_ON == b_mode) {168 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode on\n");169 /* Enable GPIO 0/1/2/3/8 pins for bt */170 rtl_write_byte(rtlpriv, 0x40, 0x20);171 rtlpriv->btcoexist.hw_coexist_all_off = false;172 } else {173 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode off\n");174 rtl_write_byte(rtlpriv, 0x40, 0x0);175 }176}177 178static void rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw,179 u8 type)180{181 struct rtl_priv *rtlpriv = rtl_priv(hw);182 183 if (BT_RF_RX_LPF_CORNER_SHRINK == type) {184 /* Shrink RF Rx LPF corner, 0x1e[7:4]=1111 ==> [11:4] */185 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,186 "Shrink RF Rx LPF corner!!\n");187 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e,188 0xfffff, 0xf0ff7);189 rtlpriv->btcoexist.sw_coexist_all_off = false;190 } else if (BT_RF_RX_LPF_CORNER_RESUME == type) {191 /*Resume RF Rx LPF corner*/192 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,193 "Resume RF Rx LPF corner!!\n");194 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff,195 rtlpriv->btcoexist.bt_rfreg_origin_1e);196 }197}198 199static void dm_bt_set_sw_penalty_tx_rate_adapt(struct ieee80211_hw *hw,200 u8 ra_type)201{202 struct rtl_priv *rtlpriv = rtl_priv(hw);203 u8 tmp_u1;204 205 tmp_u1 = rtl_read_byte(rtlpriv, 0x4fd);206 tmp_u1 |= BIT(0);207 if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == ra_type) {208 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,209 "Tx rate adaptive, set low penalty!!\n");210 tmp_u1 &= ~BIT(2);211 rtlpriv->btcoexist.sw_coexist_all_off = false;212 } else if (BT_TX_RATE_ADAPTIVE_NORMAL == ra_type) {213 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,214 "Tx rate adaptive, set normal!!\n");215 tmp_u1 |= BIT(2);216 }217 218 rtl_write_byte(rtlpriv, 0x4fd, tmp_u1);219}220 221static void rtl8723e_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,222 struct btdm_8723 *btdm)223{224 btdm->all_off = false;225 btdm->agc_table_en = false;226 btdm->adc_back_off_on = false;227 btdm->b2_ant_hid_en = false;228 btdm->low_penalty_rate_adaptive = false;229 btdm->rf_rx_lpf_shrink = false;230 btdm->reject_aggre_pkt = false;231 232 btdm->tdma_on = false;233 btdm->tdma_ant = TDMA_2ANT;234 btdm->tdma_nav = TDMA_NAV_OFF;235 btdm->tdma_dac_swing = TDMA_DAC_SWING_OFF;236 btdm->fw_dac_swing_lvl = 0x20;237 238 btdm->tra_tdma_on = false;239 btdm->tra_tdma_ant = TDMA_2ANT;240 btdm->tra_tdma_nav = TDMA_NAV_OFF;241 btdm->ignore_wlan_act = false;242 243 btdm->ps_tdma_on = false;244 btdm->ps_tdma_byte[0] = 0x0;245 btdm->ps_tdma_byte[1] = 0x0;246 btdm->ps_tdma_byte[2] = 0x0;247 btdm->ps_tdma_byte[3] = 0x8;248 btdm->ps_tdma_byte[4] = 0x0;249 250 btdm->pta_on = true;251 btdm->val_0x6c0 = 0x5a5aaaaa;252 btdm->val_0x6c8 = 0xcc;253 btdm->val_0x6cc = 0x3;254 255 btdm->sw_dac_swing_on = false;256 btdm->sw_dac_swing_lvl = 0xc0;257 btdm->wlan_act_hi = 0x20;258 btdm->wlan_act_lo = 0x10;259 btdm->bt_retry_index = 2;260 261 btdm->dec_bt_pwr = false;262}263 264static void rtl8723e_dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw,265 struct btdm_8723 *btdm)266{267 rtl8723e_dm_bt_btdm_structure_reload(hw, btdm);268 btdm->all_off = true;269 btdm->pta_on = false;270 btdm->wlan_act_hi = 0x10;271}272 273static bool rtl8723e_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)274{275 struct rtl_priv *rtlpriv = rtl_priv(hw);276 struct btdm_8723 btdm8723;277 bool b_common = false;278 279 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);280 281 if (!rtl8723e_dm_bt_is_wifi_busy(hw) &&282 !rtlpriv->btcoexist.bt_busy) {283 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,284 "Wifi idle + Bt idle, bt coex mechanism always off!!\n");285 rtl8723e_dm_bt_btdm_structure_reload_all_off(hw, &btdm8723);286 b_common = true;287 } else if (rtl8723e_dm_bt_is_wifi_busy(hw) &&288 !rtlpriv->btcoexist.bt_busy) {289 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,290 "Wifi non-idle + Bt disabled/idle!!\n");291 btdm8723.low_penalty_rate_adaptive = true;292 btdm8723.rf_rx_lpf_shrink = false;293 btdm8723.reject_aggre_pkt = false;294 295 /* sw mechanism */296 btdm8723.agc_table_en = false;297 btdm8723.adc_back_off_on = false;298 btdm8723.sw_dac_swing_on = false;299 300 btdm8723.pta_on = true;301 btdm8723.val_0x6c0 = 0x5a5aaaaa;302 btdm8723.val_0x6c8 = 0xcccc;303 btdm8723.val_0x6cc = 0x3;304 305 btdm8723.tdma_on = false;306 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;307 btdm8723.b2_ant_hid_en = false;308 309 b_common = true;310 } else if (rtlpriv->btcoexist.bt_busy) {311 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,312 "Bt non-idle!\n");313 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {314 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,315 "Wifi connection exist\n");316 b_common = false;317 } else {318 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,319 "No Wifi connection!\n");320 btdm8723.rf_rx_lpf_shrink = true;321 btdm8723.low_penalty_rate_adaptive = false;322 btdm8723.reject_aggre_pkt = false;323 324 /* sw mechanism */325 btdm8723.agc_table_en = false;326 btdm8723.adc_back_off_on = false;327 btdm8723.sw_dac_swing_on = false;328 329 btdm8723.pta_on = true;330 btdm8723.val_0x6c0 = 0x55555555;331 btdm8723.val_0x6c8 = 0x0000ffff;332 btdm8723.val_0x6cc = 0x3;333 334 btdm8723.tdma_on = false;335 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;336 btdm8723.b2_ant_hid_en = false;337 338 b_common = true;339 }340 }341 342 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))343 btdm8723.dec_bt_pwr = true;344 345 if (b_common)346 rtlpriv->btcoexist.cstate |=347 BT_COEX_STATE_BTINFO_COMMON;348 349 if (b_common && rtl8723e_dm_bt_is_coexist_state_changed(hw))350 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);351 352 return b_common;353}354 355static void rtl8723e_dm_bt_set_sw_full_time_dac_swing(356 struct ieee80211_hw *hw,357 bool sw_dac_swing_on,358 u32 sw_dac_swing_lvl)359{360 struct rtl_priv *rtlpriv = rtl_priv(hw);361 362 if (sw_dac_swing_on) {363 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,364 "[BTCoex], SwDacSwing = 0x%x\n", sw_dac_swing_lvl);365 rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000,366 sw_dac_swing_lvl);367 rtlpriv->btcoexist.sw_coexist_all_off = false;368 } else {369 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,370 "[BTCoex], SwDacSwing Off!\n");371 rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000, 0xc0);372 }373}374 375static void rtl8723e_dm_bt_set_fw_dec_bt_pwr(376 struct ieee80211_hw *hw, bool dec_bt_pwr)377{378 struct rtl_priv *rtlpriv = rtl_priv(hw);379 u8 h2c_parameter[1] = {0};380 381 h2c_parameter[0] = 0;382 383 if (dec_bt_pwr) {384 h2c_parameter[0] |= BIT(1);385 rtlpriv->btcoexist.fw_coexist_all_off = false;386 }387 388 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,389 "[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",390 (dec_bt_pwr ? "Yes!!" : "No!!"), h2c_parameter[0]);391 392 rtl8723e_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter);393}394 395static void rtl8723e_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw,396 bool b_enable, bool b_dac_swing_on)397{398 struct rtl_priv *rtlpriv = rtl_priv(hw);399 u8 h2c_parameter[1] = {0};400 401 if (b_enable) {402 h2c_parameter[0] |= BIT(0);403 rtlpriv->btcoexist.fw_coexist_all_off = false;404 }405 if (b_dac_swing_on)406 h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */407 408 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,409 "[BTCoex], turn 2-Ant+HID mode %s, DACSwing:%s, write 0x15=0x%x\n",410 (b_enable ? "ON!!" : "OFF!!"), (b_dac_swing_on ? "ON" : "OFF"),411 h2c_parameter[0]);412 413 rtl8723e_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter);414}415 416static void rtl8723e_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw,417 bool b_enable, u8 ant_num,418 u8 nav_en, u8 dac_swing_en)419{420 struct rtl_priv *rtlpriv = rtl_priv(hw);421 u8 h2c_parameter[1] = {0};422 u8 h2c_parameter1[1] = {0};423 424 h2c_parameter[0] = 0;425 h2c_parameter1[0] = 0;426 427 if (b_enable) {428 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,429 "[BTCoex], set BT PTA update manager to trigger update!!\n");430 h2c_parameter1[0] |= BIT(0);431 432 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,433 "[BTCoex], turn TDMA mode ON!!\n");434 h2c_parameter[0] |= BIT(0); /* function enable */435 if (TDMA_1ANT == ant_num) {436 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,437 "[BTCoex], TDMA_1ANT\n");438 h2c_parameter[0] |= BIT(1);439 } else if (TDMA_2ANT == ant_num) {440 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,441 "[BTCoex], TDMA_2ANT\n");442 } else {443 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,444 "[BTCoex], Unknown Ant\n");445 }446 447 if (TDMA_NAV_OFF == nav_en) {448 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,449 "[BTCoex], TDMA_NAV_OFF\n");450 } else if (TDMA_NAV_ON == nav_en) {451 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,452 "[BTCoex], TDMA_NAV_ON\n");453 h2c_parameter[0] |= BIT(2);454 }455 456 if (TDMA_DAC_SWING_OFF == dac_swing_en) {457 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,458 "[BTCoex], TDMA_DAC_SWING_OFF\n");459 } else if (TDMA_DAC_SWING_ON == dac_swing_en) {460 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,461 "[BTCoex], TDMA_DAC_SWING_ON\n");462 h2c_parameter[0] |= BIT(4);463 }464 rtlpriv->btcoexist.fw_coexist_all_off = false;465 } else {466 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,467 "[BTCoex], set BT PTA update manager to no update!!\n");468 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,469 "[BTCoex], turn TDMA mode OFF!!\n");470 }471 472 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,473 "[BTCoex], FW2AntTDMA, write 0x26=0x%x\n",474 h2c_parameter1[0]);475 rtl8723e_fill_h2c_cmd(hw, 0x26, 1, h2c_parameter1);476 477 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,478 "[BTCoex], FW2AntTDMA, write 0x14=0x%x\n",479 h2c_parameter[0]);480 rtl8723e_fill_h2c_cmd(hw, 0x14, 1, h2c_parameter);481}482 483static void rtl8723e_dm_bt_set_fw_ignore_wlan_act(struct ieee80211_hw *hw,484 bool b_enable)485{486 struct rtl_priv *rtlpriv = rtl_priv(hw);487 u8 h2c_parameter[1] = {0};488 489 if (b_enable) {490 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,491 "[BTCoex], BT Ignore Wlan_Act !!\n");492 h2c_parameter[0] |= BIT(0); /* function enable */493 rtlpriv->btcoexist.fw_coexist_all_off = false;494 } else {495 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,496 "[BTCoex], BT don't ignore Wlan_Act !!\n");497 }498 499 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,500 "[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%x\n",501 h2c_parameter[0]);502 503 rtl8723e_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter);504}505 506static void rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,507 bool b_enable, u8 ant_num,508 u8 nav_en)509{510 struct rtl_priv *rtlpriv = rtl_priv(hw);511 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));512 513 u8 h2c_parameter[2] = {0};514 515 /* Only 8723 B cut should do this */516 if (IS_VENDOR_8723_A_CUT(rtlhal->version)) {517 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,518 "[BTCoex], not 8723B cut, don't set Traditional TDMA!!\n");519 return;520 }521 522 if (b_enable) {523 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,524 "[BTCoex], turn TTDMA mode ON!!\n");525 h2c_parameter[0] |= BIT(0); /* function enable */526 if (TDMA_1ANT == ant_num) {527 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,528 "[BTCoex], TTDMA_1ANT\n");529 h2c_parameter[0] |= BIT(1);530 } else if (TDMA_2ANT == ant_num) {531 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,532 "[BTCoex], TTDMA_2ANT\n");533 } else {534 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,535 "[BTCoex], Unknown Ant\n");536 }537 538 if (TDMA_NAV_OFF == nav_en) {539 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,540 "[BTCoex], TTDMA_NAV_OFF\n");541 } else if (TDMA_NAV_ON == nav_en) {542 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,543 "[BTCoex], TTDMA_NAV_ON\n");544 h2c_parameter[1] |= BIT(0);545 }546 547 rtlpriv->btcoexist.fw_coexist_all_off = false;548 } else {549 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,550 "[BTCoex], turn TTDMA mode OFF!!\n");551 }552 553 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,554 "[BTCoex], FW Traditional TDMA, write 0x33=0x%x\n",555 h2c_parameter[0] << 8 | h2c_parameter[1]);556 557 rtl8723e_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter);558}559 560static void rtl8723e_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw,561 u8 dac_swing_lvl)562{563 struct rtl_priv *rtlpriv = rtl_priv(hw);564 u8 h2c_parameter[1] = {0};565 h2c_parameter[0] = dac_swing_lvl;566 567 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,568 "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);569 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,570 "[BTCoex], write 0x29=0x%x\n", h2c_parameter[0]);571 572 rtl8723e_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter);573}574 575static void rtl8723e_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw,576 bool b_enable)577{578 struct rtl_priv *rtlpriv = rtl_priv(hw);579 u8 h2c_parameter[1] = {0};580 h2c_parameter[0] = 0;581 582 if (b_enable) {583 h2c_parameter[0] |= BIT(0);584 rtlpriv->btcoexist.fw_coexist_all_off = false;585 }586 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,587 "[BTCoex], Set BT HID information=0x%x\n", b_enable);588 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,589 "[BTCoex], write 0x24=0x%x\n", h2c_parameter[0]);590 591 rtl8723e_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter);592}593 594static void rtl8723e_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw,595 u8 retry_index)596{597 struct rtl_priv *rtlpriv = rtl_priv(hw);598 u8 h2c_parameter[1] = {0};599 h2c_parameter[0] = retry_index;600 601 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,602 "[BTCoex], Set BT Retry Index=%d\n", retry_index);603 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,604 "[BTCoex], write 0x23=0x%x\n", h2c_parameter[0]);605 606 rtl8723e_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter);607}608 609static void rtl8723e_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw,610 u8 wlan_act_hi, u8 wlan_act_lo)611{612 struct rtl_priv *rtlpriv = rtl_priv(hw);613 u8 h2c_parameter_hi[1] = {0};614 u8 h2c_parameter_lo[1] = {0};615 h2c_parameter_hi[0] = wlan_act_hi;616 h2c_parameter_lo[0] = wlan_act_lo;617 618 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,619 "[BTCoex], Set WLAN_ACT Hi:Lo=0x%x/0x%x\n",620 wlan_act_hi, wlan_act_lo);621 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,622 "[BTCoex], write 0x22=0x%x\n", h2c_parameter_hi[0]);623 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,624 "[BTCoex], write 0x11=0x%x\n", h2c_parameter_lo[0]);625 626 /* WLAN_ACT = High duration, unit:ms */627 rtl8723e_fill_h2c_cmd(hw, 0x22, 1, h2c_parameter_hi);628 /* WLAN_ACT = Low duration, unit:3*625us */629 rtl8723e_fill_h2c_cmd(hw, 0x11, 1, h2c_parameter_lo);630}631 632void rtl8723e_dm_bt_set_bt_dm(struct ieee80211_hw *hw,633 struct btdm_8723 *btdm)634{635 struct rtl_priv *rtlpriv = rtl_priv(hw);636 struct btdm_8723 *btdm_8723 = &hal_coex_8723.btdm;637 u8 i;638 639 bool fw_current_inpsmode = false;640 bool fw_ps_awake = true;641 642 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,643 (u8 *)(&fw_current_inpsmode));644 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,645 (u8 *)(&fw_ps_awake));646 647 /* check new setting is different with the old one, */648 /* if all the same, don't do the setting again. */649 if (memcmp(btdm_8723, btdm, sizeof(struct btdm_8723)) == 0) {650 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,651 "[BTCoex], the same coexist setting, return!!\n");652 return;653 } else { /* save the new coexist setting */654 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,655 "[BTCoex], UPDATE TO NEW COEX SETTING!!\n");656 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,657 "[BTCoex], original/new bAllOff=0x%x/ 0x%x\n",658 btdm_8723->all_off, btdm->all_off);659 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,660 "[BTCoex], original/new agc_table_en=0x%x/ 0x%x\n",661 btdm_8723->agc_table_en, btdm->agc_table_en);662 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,663 "[BTCoex], original/new adc_back_off_on=0x%x/ 0x%x\n",664 btdm_8723->adc_back_off_on,665 btdm->adc_back_off_on);666 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,667 "[BTCoex], original/new b2_ant_hid_en=0x%x/ 0x%x\n",668 btdm_8723->b2_ant_hid_en, btdm->b2_ant_hid_en);669 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,670 "[BTCoex], original/new bLowPenaltyRateAdaptive=0x%x/ 0x%x\n",671 btdm_8723->low_penalty_rate_adaptive,672 btdm->low_penalty_rate_adaptive);673 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,674 "[BTCoex], original/new bRfRxLpfShrink=0x%x/ 0x%x\n",675 btdm_8723->rf_rx_lpf_shrink,676 btdm->rf_rx_lpf_shrink);677 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,678 "[BTCoex], original/new bRejectAggrePkt=0x%x/ 0x%x\n",679 btdm_8723->reject_aggre_pkt,680 btdm->reject_aggre_pkt);681 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,682 "[BTCoex], original/new tdma_on=0x%x/ 0x%x\n",683 btdm_8723->tdma_on, btdm->tdma_on);684 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,685 "[BTCoex], original/new tdmaAnt=0x%x/ 0x%x\n",686 btdm_8723->tdma_ant, btdm->tdma_ant);687 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,688 "[BTCoex], original/new tdmaNav=0x%x/ 0x%x\n",689 btdm_8723->tdma_nav, btdm->tdma_nav);690 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,691 "[BTCoex], original/new tdma_dac_swing=0x%x/ 0x%x\n",692 btdm_8723->tdma_dac_swing, btdm->tdma_dac_swing);693 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,694 "[BTCoex], original/new fw_dac_swing_lvl=0x%x/ 0x%x\n",695 btdm_8723->fw_dac_swing_lvl,696 btdm->fw_dac_swing_lvl);697 698 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,699 "[BTCoex], original/new bTraTdmaOn=0x%x/ 0x%x\n",700 btdm_8723->tra_tdma_on, btdm->tra_tdma_on);701 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,702 "[BTCoex], original/new traTdmaAnt=0x%x/ 0x%x\n",703 btdm_8723->tra_tdma_ant, btdm->tra_tdma_ant);704 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,705 "[BTCoex], original/new traTdmaNav=0x%x/ 0x%x\n",706 btdm_8723->tra_tdma_nav, btdm->tra_tdma_nav);707 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,708 "[BTCoex], original/new bPsTdmaOn=0x%x/ 0x%x\n",709 btdm_8723->ps_tdma_on, btdm->ps_tdma_on);710 for (i = 0; i < 5; i++) {711 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,712 "[BTCoex], original/new psTdmaByte[i]=0x%x/ 0x%x\n",713 btdm_8723->ps_tdma_byte[i],714 btdm->ps_tdma_byte[i]);715 }716 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,717 "[BTCoex], original/new bIgnoreWlanAct=0x%x/ 0x%x\n",718 btdm_8723->ignore_wlan_act,719 btdm->ignore_wlan_act);720 721 722 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,723 "[BTCoex], original/new bPtaOn=0x%x/ 0x%x\n",724 btdm_8723->pta_on, btdm->pta_on);725 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,726 "[BTCoex], original/new val_0x6c0=0x%x/ 0x%x\n",727 btdm_8723->val_0x6c0, btdm->val_0x6c0);728 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,729 "[BTCoex], original/new val_0x6c8=0x%x/ 0x%x\n",730 btdm_8723->val_0x6c8, btdm->val_0x6c8);731 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,732 "[BTCoex], original/new val_0x6cc=0x%x/ 0x%x\n",733 btdm_8723->val_0x6cc, btdm->val_0x6cc);734 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,735 "[BTCoex], original/new sw_dac_swing_on=0x%x/ 0x%x\n",736 btdm_8723->sw_dac_swing_on,737 btdm->sw_dac_swing_on);738 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,739 "[BTCoex], original/new sw_dac_swing_lvl=0x%x/ 0x%x\n",740 btdm_8723->sw_dac_swing_lvl,741 btdm->sw_dac_swing_lvl);742 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,743 "[BTCoex], original/new wlanActHi=0x%x/ 0x%x\n",744 btdm_8723->wlan_act_hi, btdm->wlan_act_hi);745 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,746 "[BTCoex], original/new wlanActLo=0x%x/ 0x%x\n",747 btdm_8723->wlan_act_lo, btdm->wlan_act_lo);748 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,749 "[BTCoex], original/new btRetryIndex=0x%x/ 0x%x\n",750 btdm_8723->bt_retry_index, btdm->bt_retry_index);751 752 memcpy(btdm_8723, btdm, sizeof(struct btdm_8723));753 }754 /* Here we only consider when Bt Operation755 * inquiry/paging/pairing is ON756 * we only need to turn off TDMA757 */758 759 if (rtlpriv->btcoexist.hold_for_bt_operation) {760 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,761 "[BTCoex], set to ignore wlanAct for BT OP!!\n");762 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, true);763 return;764 }765 766 if (btdm->all_off) {767 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,768 "[BTCoex], disable all coexist mechanism !!\n");769 rtl8723e_btdm_coex_all_off(hw);770 return;771 }772 773 rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, btdm->reject_aggre_pkt);774 775 if (btdm->low_penalty_rate_adaptive)776 dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);777 else778 dm_bt_set_sw_penalty_tx_rate_adapt(hw,779 BT_TX_RATE_ADAPTIVE_NORMAL);780 781 if (btdm->rf_rx_lpf_shrink)782 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,783 BT_RF_RX_LPF_CORNER_SHRINK);784 else785 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,786 BT_RF_RX_LPF_CORNER_RESUME);787 788 if (btdm->agc_table_en)789 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_ON);790 else791 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);792 793 if (btdm->adc_back_off_on)794 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_ON);795 else796 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);797 798 rtl8723e_dm_bt_set_fw_bt_retry_index(hw, btdm->bt_retry_index);799 800 rtl8723e_dm_bt_set_fw_dac_swing_level(hw, btdm->fw_dac_swing_lvl);801 rtl8723e_dm_bt_set_fw_wlan_act(hw, btdm->wlan_act_hi,802 btdm->wlan_act_lo);803 804 rtl8723e_dm_bt_set_coex_table(hw, btdm->val_0x6c0,805 btdm->val_0x6c8, btdm->val_0x6cc);806 rtl8723e_dm_bt_set_hw_pta_mode(hw, btdm->pta_on);807 808 /* Note: There is a constraint between TDMA and 2AntHID809 * Only one of 2AntHid and tdma can be turn on810 * We should turn off those mechanisms should be turned off first811 * and then turn on those mechanisms should be turned on.812 */813 if (btdm->b2_ant_hid_en) {814 /* turn off tdma */815 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,816 btdm->tra_tdma_ant,817 btdm->tra_tdma_nav);818 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,819 btdm->tdma_nav,820 btdm->tdma_dac_swing);821 822 /* turn off Pstdma */823 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,824 btdm->ignore_wlan_act);825 /* Antenna control by PTA, 0x870 = 0x300. */826 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);827 828 /* turn on 2AntHid */829 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, true);830 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, true, true);831 } else if (btdm->tdma_on) {832 /* turn off 2AntHid */833 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);834 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);835 836 /* turn off pstdma */837 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,838 btdm->ignore_wlan_act);839 /* Antenna control by PTA, 0x870 = 0x300. */840 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);841 842 /* turn on tdma */843 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,844 btdm->tra_tdma_ant,845 btdm->tra_tdma_nav);846 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, true, btdm->tdma_ant,847 btdm->tdma_nav,848 btdm->tdma_dac_swing);849 } else if (btdm->ps_tdma_on) {850 /* turn off 2AntHid */851 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);852 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);853 854 /* turn off tdma */855 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,856 btdm->tra_tdma_ant,857 btdm->tra_tdma_nav);858 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,859 btdm->tdma_nav,860 btdm->tdma_dac_swing);861 862 /* turn on pstdma */863 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,864 btdm->ignore_wlan_act);865 rtl8723e_dm_bt_set_fw_3a(hw, btdm->ps_tdma_byte[0],866 btdm->ps_tdma_byte[1],867 btdm->ps_tdma_byte[2],868 btdm->ps_tdma_byte[3],869 btdm->ps_tdma_byte[4]);870 } else {871 /* turn off 2AntHid */872 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);873 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);874 875 /* turn off tdma */876 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,877 btdm->tra_tdma_ant,878 btdm->tra_tdma_nav);879 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,880 btdm->tdma_nav,881 btdm->tdma_dac_swing);882 883 /* turn off pstdma */884 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,885 btdm->ignore_wlan_act);886 /* Antenna control by PTA, 0x870 = 0x300. */887 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);888 }889 890 /* Note:891 * We should add delay for making sure892 * sw DacSwing can be set sucessfully.893 * because of that rtl8723e_dm_bt_set_fw_2_ant_hid()894 * and rtl8723e_dm_bt_set_fw_tdma_ctrl()895 * will overwrite the reg 0x880.896 */897 mdelay(30);898 rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, btdm->sw_dac_swing_on,899 btdm->sw_dac_swing_lvl);900 rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, btdm->dec_bt_pwr);901}902 903/* ============================================================ */904/* extern function start with BTDM_ */905/* ============================================================i906 */907static u32 rtl8723e_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw)908{909 u32 counters = 0;910 911 counters = hal_coex_8723.high_priority_tx +912 hal_coex_8723.high_priority_rx;913 return counters;914}915 916static u32 rtl8723e_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw)917{918 u32 counters = 0;919 920 counters = hal_coex_8723.low_priority_tx +921 hal_coex_8723.low_priority_rx;922 return counters;923}924 925static u8 rtl8723e_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw)926{927 struct rtl_priv *rtlpriv = rtl_priv(hw);928 u32 bt_tx_rx_cnt = 0;929 u8 bt_tx_rx_cnt_lvl = 0;930 931 bt_tx_rx_cnt = rtl8723e_dm_bt_tx_rx_couter_h(hw)932 + rtl8723e_dm_bt_tx_rx_couter_l(hw);933 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,934 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt);935 936 rtlpriv->btcoexist.cstate_h &= ~937 (BT_COEX_STATE_BT_CNT_LEVEL_0 | BT_COEX_STATE_BT_CNT_LEVEL_1|938 BT_COEX_STATE_BT_CNT_LEVEL_2);939 940 if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_3) {941 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,942 "[BTCoex], BT TxRx Counters at level 3\n");943 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_3;944 rtlpriv->btcoexist.cstate_h |=945 BT_COEX_STATE_BT_CNT_LEVEL_3;946 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_2) {947 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,948 "[BTCoex], BT TxRx Counters at level 2\n");949 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_2;950 rtlpriv->btcoexist.cstate_h |=951 BT_COEX_STATE_BT_CNT_LEVEL_2;952 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_1) {953 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,954 "[BTCoex], BT TxRx Counters at level 1\n");955 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_1;956 rtlpriv->btcoexist.cstate_h |=957 BT_COEX_STATE_BT_CNT_LEVEL_1;958 } else {959 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,960 "[BTCoex], BT TxRx Counters at level 0\n");961 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_0;962 rtlpriv->btcoexist.cstate_h |=963 BT_COEX_STATE_BT_CNT_LEVEL_0;964 }965 return bt_tx_rx_cnt_lvl;966}967 968static void rtl8723e_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)969{970 struct rtl_priv *rtlpriv = rtl_priv(hw);971 struct rtl_phy *rtlphy = &(rtlpriv->phy);972 struct btdm_8723 btdm8723;973 u8 bt_rssi_state, bt_rssi_state1;974 u8 bt_tx_rx_cnt_lvl = 0;975 976 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);977 978 btdm8723.rf_rx_lpf_shrink = true;979 btdm8723.low_penalty_rate_adaptive = true;980 btdm8723.reject_aggre_pkt = false;981 982 bt_tx_rx_cnt_lvl = rtl8723e_dm_bt_bt_tx_rx_counter_level(hw);983 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,984 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl);985 986 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {987 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, "HT40\n");988 /* coex table */989 btdm8723.val_0x6c0 = 0x55555555;990 btdm8723.val_0x6c8 = 0xffff;991 btdm8723.val_0x6cc = 0x3;992 993 /* sw mechanism */994 btdm8723.agc_table_en = false;995 btdm8723.adc_back_off_on = false;996 btdm8723.sw_dac_swing_on = false;997 998 /* fw mechanism */999 btdm8723.ps_tdma_on = true;1000 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1001 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1002 "[BTCoex], BT TxRx Counters >= 1400\n");1003 btdm8723.ps_tdma_byte[0] = 0xa3;1004 btdm8723.ps_tdma_byte[1] = 0x5;1005 btdm8723.ps_tdma_byte[2] = 0x5;1006 btdm8723.ps_tdma_byte[3] = 0x2;1007 btdm8723.ps_tdma_byte[4] = 0x80;1008 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1009 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1010 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1011 btdm8723.ps_tdma_byte[0] = 0xa3;1012 btdm8723.ps_tdma_byte[1] = 0xa;1013 btdm8723.ps_tdma_byte[2] = 0xa;1014 btdm8723.ps_tdma_byte[3] = 0x2;1015 btdm8723.ps_tdma_byte[4] = 0x80;1016 } else {1017 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1018 "[BTCoex], BT TxRx Counters < 1200\n");1019 btdm8723.ps_tdma_byte[0] = 0xa3;1020 btdm8723.ps_tdma_byte[1] = 0xf;1021 btdm8723.ps_tdma_byte[2] = 0xf;1022 btdm8723.ps_tdma_byte[3] = 0x2;1023 btdm8723.ps_tdma_byte[4] = 0x80;1024 }1025 } else {1026 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1027 "HT20 or Legacy\n");1028 bt_rssi_state =1029 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);1030 bt_rssi_state1 =1031 rtl8723e_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);1032 1033 /* coex table */1034 btdm8723.val_0x6c0 = 0x55555555;1035 btdm8723.val_0x6c8 = 0xffff;1036 btdm8723.val_0x6cc = 0x3;1037 1038 /* sw mechanism */1039 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||1040 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {1041 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1042 "Wifi rssi high\n");1043 btdm8723.agc_table_en = true;1044 btdm8723.adc_back_off_on = true;1045 btdm8723.sw_dac_swing_on = false;1046 } else {1047 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1048 "Wifi rssi low\n");1049 btdm8723.agc_table_en = false;1050 btdm8723.adc_back_off_on = false;1051 btdm8723.sw_dac_swing_on = false;1052 }1053 1054 /* fw mechanism */1055 btdm8723.ps_tdma_on = true;1056 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||1057 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) {1058 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1059 "Wifi rssi-1 high\n");1060 /* only rssi high we need to do this, */1061 /* when rssi low, the value will modified by fw */1062 rtl_write_byte(rtlpriv, 0x883, 0x40);1063 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1064 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1065 "[BTCoex], BT TxRx Counters >= 1400\n");1066 btdm8723.ps_tdma_byte[0] = 0xa3;1067 btdm8723.ps_tdma_byte[1] = 0x5;1068 btdm8723.ps_tdma_byte[2] = 0x5;1069 btdm8723.ps_tdma_byte[3] = 0x83;1070 btdm8723.ps_tdma_byte[4] = 0x80;1071 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1072 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1073 "[BTCoex], BT TxRx Counters>= 1200 && < 1400\n");1074 btdm8723.ps_tdma_byte[0] = 0xa3;1075 btdm8723.ps_tdma_byte[1] = 0xa;1076 btdm8723.ps_tdma_byte[2] = 0xa;1077 btdm8723.ps_tdma_byte[3] = 0x83;1078 btdm8723.ps_tdma_byte[4] = 0x80;1079 } else {1080 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1081 "[BTCoex], BT TxRx Counters < 1200\n");1082 btdm8723.ps_tdma_byte[0] = 0xa3;1083 btdm8723.ps_tdma_byte[1] = 0xf;1084 btdm8723.ps_tdma_byte[2] = 0xf;1085 btdm8723.ps_tdma_byte[3] = 0x83;1086 btdm8723.ps_tdma_byte[4] = 0x80;1087 }1088 } else {1089 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1090 "Wifi rssi-1 low\n");1091 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1092 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1093 "[BTCoex], BT TxRx Counters >= 1400\n");1094 btdm8723.ps_tdma_byte[0] = 0xa3;1095 btdm8723.ps_tdma_byte[1] = 0x5;1096 btdm8723.ps_tdma_byte[2] = 0x5;1097 btdm8723.ps_tdma_byte[3] = 0x2;1098 btdm8723.ps_tdma_byte[4] = 0x80;1099 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1100 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1101 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1102 btdm8723.ps_tdma_byte[0] = 0xa3;1103 btdm8723.ps_tdma_byte[1] = 0xa;1104 btdm8723.ps_tdma_byte[2] = 0xa;1105 btdm8723.ps_tdma_byte[3] = 0x2;1106 btdm8723.ps_tdma_byte[4] = 0x80;1107 } else {1108 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1109 "[BTCoex], BT TxRx Counters < 1200\n");1110 btdm8723.ps_tdma_byte[0] = 0xa3;1111 btdm8723.ps_tdma_byte[1] = 0xf;1112 btdm8723.ps_tdma_byte[2] = 0xf;1113 btdm8723.ps_tdma_byte[3] = 0x2;1114 btdm8723.ps_tdma_byte[4] = 0x80;1115 }1116 }1117 }1118 1119 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))1120 btdm8723.dec_bt_pwr = true;1121 1122 /* Always ignore WlanAct if bHid|bSCOBusy|bSCOeSCO */1123 1124 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1125 "[BTCoex], BT btInqPageStartTime = 0x%lx, btTxRxCntLvl = %d\n",1126 hal_coex_8723.bt_inq_page_start_time, bt_tx_rx_cnt_lvl);1127 if ((hal_coex_8723.bt_inq_page_start_time) ||1128 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) {1129 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1130 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n");1131 btdm8723.ps_tdma_on = true;1132 btdm8723.ps_tdma_byte[0] = 0xa3;1133 btdm8723.ps_tdma_byte[1] = 0x5;1134 btdm8723.ps_tdma_byte[2] = 0x5;1135 btdm8723.ps_tdma_byte[3] = 0x2;1136 btdm8723.ps_tdma_byte[4] = 0x80;1137 }1138 1139 if (rtl8723e_dm_bt_is_coexist_state_changed(hw))1140 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);1141 1142}1143 1144static void rtl8723e_dm_bt_2_ant_ftp_a2dp(struct ieee80211_hw *hw)1145{1146 struct rtl_priv *rtlpriv = rtl_priv(hw);1147 struct rtl_phy *rtlphy = &(rtlpriv->phy);1148 struct btdm_8723 btdm8723;1149 1150 u8 bt_rssi_state, bt_rssi_state1;1151 u32 bt_tx_rx_cnt_lvl = 0;1152 1153 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);1154 1155 btdm8723.rf_rx_lpf_shrink = true;1156 btdm8723.low_penalty_rate_adaptive = true;1157 btdm8723.reject_aggre_pkt = false;1158 1159 bt_tx_rx_cnt_lvl = rtl8723e_dm_bt_bt_tx_rx_counter_level(hw);1160 1161 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1162 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl);1163 1164 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {1165 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, "HT40\n");1166 bt_rssi_state =1167 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 37, 0);1168 1169 /* coex table */1170 btdm8723.val_0x6c0 = 0x55555555;1171 btdm8723.val_0x6c8 = 0xffff;1172 btdm8723.val_0x6cc = 0x3;1173 1174 /* sw mechanism */1175 btdm8723.agc_table_en = false;1176 btdm8723.adc_back_off_on = true;1177 btdm8723.sw_dac_swing_on = false;1178 1179 /* fw mechanism */1180 btdm8723.ps_tdma_on = true;1181 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||1182 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {1183 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1184 "Wifi rssi high\n");1185 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1186 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1187 "[BTCoex], BT TxRx Counters >= 1400\n");1188 btdm8723.ps_tdma_byte[0] = 0xa3;1189 btdm8723.ps_tdma_byte[1] = 0x5;1190 btdm8723.ps_tdma_byte[2] = 0x5;1191 btdm8723.ps_tdma_byte[3] = 0x81;1192 btdm8723.ps_tdma_byte[4] = 0x80;1193 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1194 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1195 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1196 btdm8723.ps_tdma_byte[0] = 0xa3;1197 btdm8723.ps_tdma_byte[1] = 0xa;1198 btdm8723.ps_tdma_byte[2] = 0xa;1199 btdm8723.ps_tdma_byte[3] = 0x81;1200 btdm8723.ps_tdma_byte[4] = 0x80;1201 } else {1202 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1203 "[BTCoex], BT TxRx Counters < 1200\n");1204 btdm8723.ps_tdma_byte[0] = 0xa3;1205 btdm8723.ps_tdma_byte[1] = 0xf;1206 btdm8723.ps_tdma_byte[2] = 0xf;1207 btdm8723.ps_tdma_byte[3] = 0x81;1208 btdm8723.ps_tdma_byte[4] = 0x80;1209 }1210 } else {1211 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1212 "Wifi rssi low\n");1213 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1214 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1215 "[BTCoex], BT TxRx Counters >= 1400\n");1216 btdm8723.ps_tdma_byte[0] = 0xa3;1217 btdm8723.ps_tdma_byte[1] = 0x5;1218 btdm8723.ps_tdma_byte[2] = 0x5;1219 btdm8723.ps_tdma_byte[3] = 0x0;1220 btdm8723.ps_tdma_byte[4] = 0x80;1221 } else if (bt_tx_rx_cnt_lvl ==1222 BT_TXRX_CNT_LEVEL_1) {1223 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1224 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1225 btdm8723.ps_tdma_byte[0] = 0xa3;1226 btdm8723.ps_tdma_byte[1] = 0xa;1227 btdm8723.ps_tdma_byte[2] = 0xa;1228 btdm8723.ps_tdma_byte[3] = 0x0;1229 btdm8723.ps_tdma_byte[4] = 0x80;1230 } else {1231 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1232 "[BTCoex], BT TxRx Counters < 1200\n");1233 btdm8723.ps_tdma_byte[0] = 0xa3;1234 btdm8723.ps_tdma_byte[1] = 0xf;1235 btdm8723.ps_tdma_byte[2] = 0xf;1236 btdm8723.ps_tdma_byte[3] = 0x0;1237 btdm8723.ps_tdma_byte[4] = 0x80;1238 }1239 }1240 } else {1241 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1242 "HT20 or Legacy\n");1243 bt_rssi_state =1244 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);1245 bt_rssi_state1 =1246 rtl8723e_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);1247 1248 /* coex table */1249 btdm8723.val_0x6c0 = 0x55555555;1250 btdm8723.val_0x6c8 = 0xffff;1251 btdm8723.val_0x6cc = 0x3;1252 1253 /* sw mechanism */1254 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||1255 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {1256 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1257 "Wifi rssi high\n");1258 btdm8723.agc_table_en = true;1259 btdm8723.adc_back_off_on = true;1260 btdm8723.sw_dac_swing_on = false;1261 } else {1262 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1263 "Wifi rssi low\n");1264 btdm8723.agc_table_en = false;1265 btdm8723.adc_back_off_on = false;1266 btdm8723.sw_dac_swing_on = false;1267 }1268 1269 /* fw mechanism */1270 btdm8723.ps_tdma_on = true;1271 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||1272 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) {1273 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1274 "Wifi rssi-1 high\n");1275 /* only rssi high we need to do this, */1276 /* when rssi low, the value will modified by fw */1277 rtl_write_byte(rtlpriv, 0x883, 0x40);1278 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1279 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1280 "[BTCoex], BT TxRx Counters >= 1400\n");1281 btdm8723.ps_tdma_byte[0] = 0xa3;1282 btdm8723.ps_tdma_byte[1] = 0x5;1283 btdm8723.ps_tdma_byte[2] = 0x5;1284 btdm8723.ps_tdma_byte[3] = 0x81;1285 btdm8723.ps_tdma_byte[4] = 0x80;1286 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1287 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1288 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1289 btdm8723.ps_tdma_byte[0] = 0xa3;1290 btdm8723.ps_tdma_byte[1] = 0xa;1291 btdm8723.ps_tdma_byte[2] = 0xa;1292 btdm8723.ps_tdma_byte[3] = 0x81;1293 btdm8723.ps_tdma_byte[4] = 0x80;1294 } else {1295 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1296 "[BTCoex], BT TxRx Counters < 1200\n");1297 btdm8723.ps_tdma_byte[0] = 0xa3;1298 btdm8723.ps_tdma_byte[1] = 0xf;1299 btdm8723.ps_tdma_byte[2] = 0xf;1300 btdm8723.ps_tdma_byte[3] = 0x81;1301 btdm8723.ps_tdma_byte[4] = 0x80;1302 }1303 } else {1304 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1305 "Wifi rssi-1 low\n");1306 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {1307 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1308 "[BTCoex], BT TxRx Counters >= 1400\n");1309 btdm8723.ps_tdma_byte[0] = 0xa3;1310 btdm8723.ps_tdma_byte[1] = 0x5;1311 btdm8723.ps_tdma_byte[2] = 0x5;1312 btdm8723.ps_tdma_byte[3] = 0x0;1313 btdm8723.ps_tdma_byte[4] = 0x80;1314 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {1315 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1316 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");1317 btdm8723.ps_tdma_byte[0] = 0xa3;1318 btdm8723.ps_tdma_byte[1] = 0xa;1319 btdm8723.ps_tdma_byte[2] = 0xa;1320 btdm8723.ps_tdma_byte[3] = 0x0;1321 btdm8723.ps_tdma_byte[4] = 0x80;1322 } else {1323 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1324 "[BTCoex], BT TxRx Counters < 1200\n");1325 btdm8723.ps_tdma_byte[0] = 0xa3;1326 btdm8723.ps_tdma_byte[1] = 0xf;1327 btdm8723.ps_tdma_byte[2] = 0xf;1328 btdm8723.ps_tdma_byte[3] = 0x0;1329 btdm8723.ps_tdma_byte[4] = 0x80;1330 }1331 }1332 }1333 1334 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))1335 btdm8723.dec_bt_pwr = true;1336 1337 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1338 "[BTCoex], BT btInqPageStartTime = 0x%lx, btTxRxCntLvl = %d\n",1339 hal_coex_8723.bt_inq_page_start_time, bt_tx_rx_cnt_lvl);1340 1341 if ((hal_coex_8723.bt_inq_page_start_time) ||1342 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) {1343 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1344 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n");1345 btdm8723.ps_tdma_on = true;1346 btdm8723.ps_tdma_byte[0] = 0xa3;1347 btdm8723.ps_tdma_byte[1] = 0x5;1348 btdm8723.ps_tdma_byte[2] = 0x5;1349 btdm8723.ps_tdma_byte[3] = 0x83;1350 btdm8723.ps_tdma_byte[4] = 0x80;1351 }1352 1353 if (rtl8723e_dm_bt_is_coexist_state_changed(hw))1354 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);1355 1356}1357 1358static void rtl8723e_dm_bt_inq_page_monitor(struct ieee80211_hw *hw)1359{1360 struct rtl_priv *rtlpriv = rtl_priv(hw);1361 unsigned long cur_time = jiffies;1362 1363 if (hal_coex_8723.c2h_bt_inquiry_page) {1364 /* bt inquiry or page is started. */1365 if (hal_coex_8723.bt_inq_page_start_time == 0) {1366 rtlpriv->btcoexist.cstate |=1367 BT_COEX_STATE_BT_INQ_PAGE;1368 hal_coex_8723.bt_inq_page_start_time = cur_time;1369 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1370 "[BTCoex], BT Inquiry/page is started at time : 0x%lx\n",1371 hal_coex_8723.bt_inq_page_start_time);1372 }1373 }1374 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1375 "[BTCoex], BT Inquiry/page started time : 0x%lx, cur_time : 0x%lx\n",1376 hal_coex_8723.bt_inq_page_start_time, cur_time);1377 1378 if (hal_coex_8723.bt_inq_page_start_time) {1379 if (jiffies_to_msecs(cur_time -1380 hal_coex_8723.bt_inq_page_start_time) >= 10000) {1381 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1382 "[BTCoex], BT Inquiry/page >= 10sec!!!\n");1383 hal_coex_8723.bt_inq_page_start_time = 0;1384 rtlpriv->btcoexist.cstate &=1385 ~BT_COEX_STATE_BT_INQ_PAGE;1386 }1387 }1388}1389 1390static void rtl8723e_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)1391{1392 struct rtl_priv *rtlpriv = rtl_priv(hw);1393 1394 rtlpriv->btcoexist.cstate &= ~1395 (BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP|1396 BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO);1397 1398 rtlpriv->btcoexist.cstate &= ~1399 (BT_COEX_STATE_BTINFO_COMMON |1400 BT_COEX_STATE_BTINFO_B_HID_SCOESCO|1401 BT_COEX_STATE_BTINFO_B_FTP_A2DP);1402}1403 1404static void _rtl8723e_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)1405{1406 struct rtl_priv *rtlpriv = rtl_priv(hw);1407 u8 bt_info_original;1408 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1409 "[BTCoex] Get bt info by fw!!\n");1410 1411 _rtl8723_dm_bt_check_wifi_state(hw);1412 1413 if (hal_coex_8723.c2h_bt_info_req_sent) {1414 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1415 "[BTCoex] c2h for bt_info not rcvd yet!!\n");1416 }1417 1418 bt_info_original = hal_coex_8723.c2h_bt_info_original;1419 1420 /* when bt inquiry or page scan, we have to set h2c 0x25 */1421 /* ignore wlanact for continuous 4x2secs */1422 rtl8723e_dm_bt_inq_page_monitor(hw);1423 rtl8723e_dm_bt_reset_action_profile_state(hw);1424 1425 if (rtl8723e_dm_bt_is_2_ant_common_action(hw)) {1426 rtlpriv->btcoexist.bt_profile_case = BT_COEX_MECH_COMMON;1427 rtlpriv->btcoexist.bt_profile_action = BT_COEX_MECH_COMMON;1428 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1429 "Action 2-Ant common.\n");1430 } else {1431 if ((bt_info_original & BTINFO_B_HID) ||1432 (bt_info_original & BTINFO_B_SCO_BUSY) ||1433 (bt_info_original & BTINFO_B_SCO_ESCO)) {1434 rtlpriv->btcoexist.cstate |=1435 BT_COEX_STATE_BTINFO_B_HID_SCOESCO;1436 rtlpriv->btcoexist.bt_profile_case =1437 BT_COEX_MECH_HID_SCO_ESCO;1438 rtlpriv->btcoexist.bt_profile_action =1439 BT_COEX_MECH_HID_SCO_ESCO;1440 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1441 "[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n");1442 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);1443 } else if ((bt_info_original & BTINFO_B_FTP) ||1444 (bt_info_original & BTINFO_B_A2DP)) {1445 rtlpriv->btcoexist.cstate |=1446 BT_COEX_STATE_BTINFO_B_FTP_A2DP;1447 rtlpriv->btcoexist.bt_profile_case =1448 BT_COEX_MECH_FTP_A2DP;1449 rtlpriv->btcoexist.bt_profile_action =1450 BT_COEX_MECH_FTP_A2DP;1451 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1452 "BTInfo: bFTP|bA2DP\n");1453 rtl8723e_dm_bt_2_ant_ftp_a2dp(hw);1454 } else {1455 rtlpriv->btcoexist.cstate |=1456 BT_COEX_STATE_BTINFO_B_HID_SCOESCO;1457 rtlpriv->btcoexist.bt_profile_case =1458 BT_COEX_MECH_NONE;1459 rtlpriv->btcoexist.bt_profile_action =1460 BT_COEX_MECH_NONE;1461 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1462 "[BTCoex], BTInfo: undefined case!!!!\n");1463 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);1464 }1465 }1466}1467 1468static void _rtl8723e_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)1469{1470 return;1471}1472 1473void rtl8723e_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)1474{1475 rtl8723e_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);1476 rtl8723e_dm_bt_set_hw_pta_mode(hw, true);1477}1478 1479void rtl8723e_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)1480{1481 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, false);1482 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);1483 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);1484 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, false, TDMA_2ANT,1485 TDMA_NAV_OFF);1486 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT, TDMA_NAV_OFF,1487 TDMA_DAC_SWING_OFF);1488 rtl8723e_dm_bt_set_fw_dac_swing_level(hw, 0);1489 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);1490 rtl8723e_dm_bt_set_fw_bt_retry_index(hw, 2);1491 rtl8723e_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10);1492 rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, false);1493}1494 1495void rtl8723e_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)1496{1497 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);1498 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);1499 rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, false);1500 1501 dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_NORMAL);1502 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);1503 rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0);1504}1505 1506static void rtl8723e_dm_bt_query_bt_information(struct ieee80211_hw *hw)1507{1508 struct rtl_priv *rtlpriv = rtl_priv(hw);1509 u8 h2c_parameter[1] = {0};1510 1511 hal_coex_8723.c2h_bt_info_req_sent = true;1512 1513 h2c_parameter[0] |= BIT(0);1514 1515 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1516 "Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]);1517 1518 rtl8723e_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);1519}1520 1521static void rtl8723e_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)1522{1523 struct rtl_priv *rtlpriv = rtl_priv(hw);1524 u32 reg_hp_tx_rx, reg_lp_tx_rx, u32_tmp;1525 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;1526 1527 reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;1528 reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;1529 1530 u32_tmp = rtl_read_dword(rtlpriv, reg_hp_tx_rx);1531 reg_hp_tx = u32_tmp & MASKLWORD;1532 reg_hp_rx = (u32_tmp & MASKHWORD)>>16;1533 1534 u32_tmp = rtl_read_dword(rtlpriv, reg_lp_tx_rx);1535 reg_lp_tx = u32_tmp & MASKLWORD;1536 reg_lp_rx = (u32_tmp & MASKHWORD)>>16;1537 1538 if (rtlpriv->btcoexist.lps_counter > 1) {1539 reg_hp_tx %= rtlpriv->btcoexist.lps_counter;1540 reg_hp_rx %= rtlpriv->btcoexist.lps_counter;1541 reg_lp_tx %= rtlpriv->btcoexist.lps_counter;1542 reg_lp_rx %= rtlpriv->btcoexist.lps_counter;1543 }1544 1545 hal_coex_8723.high_priority_tx = reg_hp_tx;1546 hal_coex_8723.high_priority_rx = reg_hp_rx;1547 hal_coex_8723.low_priority_tx = reg_lp_tx;1548 hal_coex_8723.low_priority_rx = reg_lp_rx;1549 1550 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1551 "High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",1552 reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);1553 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1554 "Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",1555 reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);1556 rtlpriv->btcoexist.lps_counter = 0;1557 /* rtl_write_byte(rtlpriv, 0x76e, 0xc); */1558}1559 1560static void rtl8723e_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)1561{1562 struct rtl_priv *rtlpriv = rtl_priv(hw);1563 bool bt_alife = true;1564 1565 if (hal_coex_8723.high_priority_tx == 0 &&1566 hal_coex_8723.high_priority_rx == 0 &&1567 hal_coex_8723.low_priority_tx == 0 &&1568 hal_coex_8723.low_priority_rx == 0) {1569 bt_alife = false;1570 }1571 if (hal_coex_8723.high_priority_tx == 0xeaea &&1572 hal_coex_8723.high_priority_rx == 0xeaea &&1573 hal_coex_8723.low_priority_tx == 0xeaea &&1574 hal_coex_8723.low_priority_rx == 0xeaea) {1575 bt_alife = false;1576 }1577 if (hal_coex_8723.high_priority_tx == 0xffff &&1578 hal_coex_8723.high_priority_rx == 0xffff &&1579 hal_coex_8723.low_priority_tx == 0xffff &&1580 hal_coex_8723.low_priority_rx == 0xffff) {1581 bt_alife = false;1582 }1583 if (bt_alife) {1584 rtlpriv->btcoexist.bt_active_zero_cnt = 0;1585 rtlpriv->btcoexist.cur_bt_disabled = false;1586 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1587 "8723A BT is enabled !!\n");1588 } else {1589 rtlpriv->btcoexist.bt_active_zero_cnt++;1590 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1591 "8723A bt all counters=0, %d times!!\n",1592 rtlpriv->btcoexist.bt_active_zero_cnt);1593 if (rtlpriv->btcoexist.bt_active_zero_cnt >= 2) {1594 rtlpriv->btcoexist.cur_bt_disabled = true;1595 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1596 "8723A BT is disabled !!\n");1597 }1598 }1599 if (rtlpriv->btcoexist.pre_bt_disabled !=1600 rtlpriv->btcoexist.cur_bt_disabled) {1601 rtl_dbg(rtlpriv, COMP_BT_COEXIST,1602 DBG_TRACE, "8723A BT is from %s to %s!!\n",1603 (rtlpriv->btcoexist.pre_bt_disabled ?1604 "disabled" : "enabled"),1605 (rtlpriv->btcoexist.cur_bt_disabled ?1606 "disabled" : "enabled"));1607 rtlpriv->btcoexist.pre_bt_disabled1608 = rtlpriv->btcoexist.cur_bt_disabled;1609 }1610}1611 1612 1613void rtl8723e_dm_bt_coexist_8723(struct ieee80211_hw *hw)1614{1615 struct rtl_priv *rtlpriv = rtl_priv(hw);1616 1617 rtl8723e_dm_bt_query_bt_information(hw);1618 rtl8723e_dm_bt_bt_hw_counters_monitor(hw);1619 rtl8723e_dm_bt_bt_enable_disable_check(hw);1620 1621 if (rtlpriv->btcoexist.bt_ant_num == ANT_X2) {1622 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1623 "[BTCoex], 2 Ant mechanism\n");1624 _rtl8723e_dm_bt_coexist_2_ant(hw);1625 } else {1626 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1627 "[BTCoex], 1 Ant mechanism\n");1628 _rtl8723e_dm_bt_coexist_1_ant(hw);1629 }1630 1631 if (!rtl8723e_dm_bt_is_same_coexist_state(hw)) {1632 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1633 "[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n",1634 rtlpriv->btcoexist.previous_state_h,1635 rtlpriv->btcoexist.previous_state,1636 rtlpriv->btcoexist.cstate_h,1637 rtlpriv->btcoexist.cstate);1638 rtlpriv->btcoexist.previous_state1639 = rtlpriv->btcoexist.cstate;1640 rtlpriv->btcoexist.previous_state_h1641 = rtlpriv->btcoexist.cstate_h;1642 }1643}1644 1645static void rtl8723e_dm_bt_parse_bt_info(struct ieee80211_hw *hw,1646 u8 *tmp_buf, u8 len)1647{1648 struct rtl_priv *rtlpriv = rtl_priv(hw);1649 u8 bt_info;1650 u8 i;1651 1652 hal_coex_8723.c2h_bt_info_req_sent = false;1653 hal_coex_8723.bt_retry_cnt = 0;1654 for (i = 0; i < len; i++) {1655 if (i == 0)1656 hal_coex_8723.c2h_bt_info_original = tmp_buf[i];1657 else if (i == 1)1658 hal_coex_8723.bt_retry_cnt = tmp_buf[i];1659 if (i == len-1)1660 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1661 "0x%2x]", tmp_buf[i]);1662 else1663 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,1664 "0x%2x, ", tmp_buf[i]);1665 1666 }1667 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1668 "BT info bt_info (Data)= 0x%x\n",1669 hal_coex_8723.c2h_bt_info_original);1670 bt_info = hal_coex_8723.c2h_bt_info_original;1671 1672 if (bt_info & BIT(2))1673 hal_coex_8723.c2h_bt_inquiry_page = true;1674 else1675 hal_coex_8723.c2h_bt_inquiry_page = false;1676 1677 1678 if (bt_info & BTINFO_B_CONNECTION) {1679 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1680 "[BTC2H], BTInfo: bConnect=true\n");1681 rtlpriv->btcoexist.bt_busy = true;1682 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT_IDLE;1683 } else {1684 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,1685 "[BTC2H], BTInfo: bConnect=false\n");1686 rtlpriv->btcoexist.bt_busy = false;1687 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT_IDLE;1688 }1689}1690void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw)1691{1692 struct rtl_priv *rtlpriv = rtl_priv(hw);1693 struct c2h_evt_hdr c2h_event;1694 u8 *ptmp_buf = NULL;1695 u8 index = 0;1696 u8 u1b_tmp = 0;1697 memset(&c2h_event, 0, sizeof(c2h_event));1698 u1b_tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL);1699 rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,1700 "&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1b_tmp);1701 c2h_event.cmd_id = u1b_tmp & 0xF;1702 c2h_event.cmd_len = (u1b_tmp & 0xF0) >> 4;1703 c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1);1704 rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,1705 "cmd_id: %d, cmd_len: %d, cmd_seq: %d\n",1706 c2h_event.cmd_id, c2h_event.cmd_len, c2h_event.cmd_seq);1707 u1b_tmp = rtl_read_byte(rtlpriv, 0x01AF);1708 if (u1b_tmp == C2H_EVT_HOST_CLOSE) {1709 return;1710 } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {1711 rtl_write_byte(rtlpriv, 0x1AF, 0x00);1712 return;1713 }1714 ptmp_buf = kzalloc(c2h_event.cmd_len, GFP_KERNEL);1715 if (ptmp_buf == NULL) {1716 rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,1717 "malloc cmd buf failed\n");1718 return;1719 }1720 1721 /* Read the content */1722 for (index = 0; index < c2h_event.cmd_len; index++)1723 ptmp_buf[index] = rtl_read_byte(rtlpriv,1724 REG_C2HEVT_MSG_NORMAL + 2 + index);1725 1726 1727 switch (c2h_event.cmd_id) {1728 case C2H_V0_BT_RSSI:1729 break;1730 1731 case C2H_V0_BT_OP_MODE:1732 break;1733 1734 case C2H_V0_BT_INFO:1735 rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,1736 "BT info Byte[0] (ID) is 0x%x\n",1737 c2h_event.cmd_id);1738 rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,1739 "BT info Byte[1] (Seq) is 0x%x\n",1740 c2h_event.cmd_seq);1741 rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,1742 "BT info Byte[2] (Data)= 0x%x\n", ptmp_buf[0]);1743 1744 rtl8723e_dm_bt_parse_bt_info(hw, ptmp_buf, c2h_event.cmd_len);1745 1746 if (rtlpriv->cfg->ops->get_btc_status())1747 rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);1748 1749 break;1750 default:1751 break;1752 }1753 kfree(ptmp_buf);1754 1755 rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);1756}1757