Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright(c) 2009-2012  Realtek Corporation.*/
0003 
0004 #include "hal_btc.h"
0005 #include "../pci.h"
0006 #include "phy.h"
0007 #include "fw.h"
0008 #include "reg.h"
0009 #include "def.h"
0010 #include "../rtl8723com/phy_common.h"
0011 
0012 static struct bt_coexist_8723 hal_coex_8723;
0013 
0014 void rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps(struct ieee80211_hw *hw)
0015 {
0016     struct rtl_priv *rtlpriv = rtl_priv(hw);
0017     struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0018 
0019     if (!rtlpriv->btcoexist.bt_coexistence)
0020         return;
0021 
0022     if (ppsc->inactiveps) {
0023         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0024             "[BT][DM], Before enter IPS, turn off all Coexist DM\n");
0025         rtlpriv->btcoexist.cstate = 0;
0026         rtlpriv->btcoexist.previous_state = 0;
0027         rtlpriv->btcoexist.cstate_h = 0;
0028         rtlpriv->btcoexist.previous_state_h = 0;
0029         rtl8723e_btdm_coex_all_off(hw);
0030     }
0031 }
0032 
0033 static enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
0034 {
0035     struct rtl_priv *rtlpriv = rtl_priv(hw);
0036     struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0037     enum rt_media_status    m_status = RT_MEDIA_DISCONNECT;
0038     u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
0039     if (bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED)
0040         m_status = RT_MEDIA_CONNECT;
0041 
0042     return m_status;
0043 }
0044 
0045 void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw,
0046                         bool mstatus)
0047 {
0048     struct rtl_priv *rtlpriv = rtl_priv(hw);
0049     struct rtl_phy *rtlphy = &(rtlpriv->phy);
0050     u8 h2c_parameter[3] = {0};
0051     u8 chnl;
0052 
0053     if (!rtlpriv->btcoexist.bt_coexistence)
0054         return;
0055 
0056     if (RT_MEDIA_CONNECT == mstatus)
0057         h2c_parameter[0] = 0x1; /* 0: disconnected, 1:connected */
0058     else
0059         h2c_parameter[0] = 0x0;
0060 
0061     if (mgnt_link_status_query(hw)) {
0062         chnl = rtlphy->current_channel;
0063         h2c_parameter[1] = chnl;
0064     }
0065 
0066     if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
0067         h2c_parameter[2] = 0x30;
0068     else
0069         h2c_parameter[2] = 0x20;
0070 
0071     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0072         "[BTCoex], FW write 0x19=0x%x\n",
0073         h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
0074         h2c_parameter[2]);
0075 
0076     rtl8723e_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter);
0077 }
0078 
0079 static bool rtl8723e_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)
0080 {
0081     struct rtl_priv *rtlpriv = rtl_priv(hw);
0082     if (rtlpriv->link_info.busytraffic ||
0083         rtlpriv->link_info.rx_busy_traffic ||
0084         rtlpriv->link_info.tx_busy_traffic)
0085         return true;
0086     else
0087         return false;
0088 }
0089 
0090 static void rtl8723e_dm_bt_set_fw_3a(struct ieee80211_hw *hw,
0091                      u8 byte1, u8 byte2, u8 byte3, u8 byte4,
0092                      u8 byte5)
0093 {
0094     struct rtl_priv *rtlpriv = rtl_priv(hw);
0095     u8 h2c_parameter[5];
0096 
0097     h2c_parameter[0] = byte1;
0098     h2c_parameter[1] = byte2;
0099     h2c_parameter[2] = byte3;
0100     h2c_parameter[3] = byte4;
0101     h2c_parameter[4] = byte5;
0102     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0103         "[BTCoex], FW write 0x3a(4bytes)=0x%x%8x\n",
0104         h2c_parameter[0], h2c_parameter[1]<<24 |
0105         h2c_parameter[2]<<16 | h2c_parameter[3]<<8 |
0106         h2c_parameter[4]);
0107     rtl8723e_fill_h2c_cmd(hw, 0x3a, 5, h2c_parameter);
0108 }
0109 
0110 static bool rtl8723e_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw)
0111 {
0112     struct rtl_priv *rtlpriv = rtl_priv(hw);
0113 
0114     if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {
0115         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0116             "Need to decrease bt power\n");
0117         rtlpriv->btcoexist.cstate |=
0118         BT_COEX_STATE_DEC_BT_POWER;
0119         return true;
0120     }
0121 
0122     rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_DEC_BT_POWER;
0123     return false;
0124 }
0125 
0126 static bool rtl8723e_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)
0127 {
0128     struct rtl_priv *rtlpriv = rtl_priv(hw);
0129 
0130     if ((rtlpriv->btcoexist.previous_state ==
0131          rtlpriv->btcoexist.cstate) &&
0132         (rtlpriv->btcoexist.previous_state_h ==
0133          rtlpriv->btcoexist.cstate_h)) {
0134         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0135             "[DM][BT], Coexist state do not change!!\n");
0136         return true;
0137     } else {
0138         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0139             "[DM][BT], Coexist state changed!!\n");
0140         return false;
0141     }
0142 }
0143 
0144 static void rtl8723e_dm_bt_set_coex_table(struct ieee80211_hw *hw,
0145                       u32 val_0x6c0, u32 val_0x6c8,
0146                       u32 val_0x6cc)
0147 {
0148     struct rtl_priv *rtlpriv = rtl_priv(hw);
0149 
0150     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0151         "set coex table, set 0x6c0=0x%x\n", val_0x6c0);
0152     rtl_write_dword(rtlpriv, 0x6c0, val_0x6c0);
0153 
0154     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0155         "set coex table, set 0x6c8=0x%x\n", val_0x6c8);
0156     rtl_write_dword(rtlpriv, 0x6c8, val_0x6c8);
0157 
0158     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0159         "set coex table, set 0x6cc=0x%x\n", val_0x6cc);
0160     rtl_write_byte(rtlpriv, 0x6cc, val_0x6cc);
0161 }
0162 
0163 static void rtl8723e_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool b_mode)
0164 {
0165     struct rtl_priv *rtlpriv = rtl_priv(hw);
0166 
0167     if (BT_PTA_MODE_ON == b_mode) {
0168         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode on\n");
0169         /*  Enable GPIO 0/1/2/3/8 pins for bt */
0170         rtl_write_byte(rtlpriv, 0x40, 0x20);
0171         rtlpriv->btcoexist.hw_coexist_all_off = false;
0172     } else {
0173         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode off\n");
0174         rtl_write_byte(rtlpriv, 0x40, 0x0);
0175     }
0176 }
0177 
0178 static void rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw,
0179                            u8 type)
0180 {
0181     struct rtl_priv *rtlpriv = rtl_priv(hw);
0182 
0183     if (BT_RF_RX_LPF_CORNER_SHRINK == type) {
0184         /* Shrink RF Rx LPF corner, 0x1e[7:4]=1111 ==> [11:4] */
0185         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0186             "Shrink RF Rx LPF corner!!\n");
0187         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e,
0188                     0xfffff, 0xf0ff7);
0189         rtlpriv->btcoexist.sw_coexist_all_off = false;
0190     } else if (BT_RF_RX_LPF_CORNER_RESUME == type) {
0191         /*Resume RF Rx LPF corner*/
0192         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0193             "Resume RF Rx LPF corner!!\n");
0194         rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff,
0195                     rtlpriv->btcoexist.bt_rfreg_origin_1e);
0196     }
0197 }
0198 
0199 static void dm_bt_set_sw_penalty_tx_rate_adapt(struct ieee80211_hw *hw,
0200                            u8 ra_type)
0201 {
0202     struct rtl_priv *rtlpriv = rtl_priv(hw);
0203     u8 tmp_u1;
0204 
0205     tmp_u1 = rtl_read_byte(rtlpriv, 0x4fd);
0206     tmp_u1 |= BIT(0);
0207     if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == ra_type) {
0208         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0209             "Tx rate adaptive, set low penalty!!\n");
0210         tmp_u1 &= ~BIT(2);
0211         rtlpriv->btcoexist.sw_coexist_all_off = false;
0212     } else if (BT_TX_RATE_ADAPTIVE_NORMAL == ra_type) {
0213         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0214             "Tx rate adaptive, set normal!!\n");
0215         tmp_u1 |= BIT(2);
0216     }
0217 
0218     rtl_write_byte(rtlpriv, 0x4fd, tmp_u1);
0219 }
0220 
0221 static void rtl8723e_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,
0222                          struct btdm_8723 *btdm)
0223 {
0224     btdm->all_off = false;
0225     btdm->agc_table_en = false;
0226     btdm->adc_back_off_on = false;
0227     btdm->b2_ant_hid_en = false;
0228     btdm->low_penalty_rate_adaptive = false;
0229     btdm->rf_rx_lpf_shrink = false;
0230     btdm->reject_aggre_pkt = false;
0231 
0232     btdm->tdma_on = false;
0233     btdm->tdma_ant = TDMA_2ANT;
0234     btdm->tdma_nav = TDMA_NAV_OFF;
0235     btdm->tdma_dac_swing = TDMA_DAC_SWING_OFF;
0236     btdm->fw_dac_swing_lvl = 0x20;
0237 
0238     btdm->tra_tdma_on = false;
0239     btdm->tra_tdma_ant = TDMA_2ANT;
0240     btdm->tra_tdma_nav = TDMA_NAV_OFF;
0241     btdm->ignore_wlan_act = false;
0242 
0243     btdm->ps_tdma_on = false;
0244     btdm->ps_tdma_byte[0] = 0x0;
0245     btdm->ps_tdma_byte[1] = 0x0;
0246     btdm->ps_tdma_byte[2] = 0x0;
0247     btdm->ps_tdma_byte[3] = 0x8;
0248     btdm->ps_tdma_byte[4] = 0x0;
0249 
0250     btdm->pta_on = true;
0251     btdm->val_0x6c0 = 0x5a5aaaaa;
0252     btdm->val_0x6c8 = 0xcc;
0253     btdm->val_0x6cc = 0x3;
0254 
0255     btdm->sw_dac_swing_on = false;
0256     btdm->sw_dac_swing_lvl = 0xc0;
0257     btdm->wlan_act_hi = 0x20;
0258     btdm->wlan_act_lo = 0x10;
0259     btdm->bt_retry_index = 2;
0260 
0261     btdm->dec_bt_pwr = false;
0262 }
0263 
0264 static void rtl8723e_dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw,
0265                              struct btdm_8723 *btdm)
0266 {
0267     rtl8723e_dm_bt_btdm_structure_reload(hw, btdm);
0268     btdm->all_off = true;
0269     btdm->pta_on = false;
0270     btdm->wlan_act_hi = 0x10;
0271 }
0272 
0273 static bool rtl8723e_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
0274 {
0275     struct rtl_priv *rtlpriv = rtl_priv(hw);
0276     struct btdm_8723 btdm8723;
0277     bool b_common = false;
0278 
0279     rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);
0280 
0281     if (!rtl8723e_dm_bt_is_wifi_busy(hw) &&
0282         !rtlpriv->btcoexist.bt_busy) {
0283         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0284             "Wifi idle + Bt idle, bt coex mechanism always off!!\n");
0285         rtl8723e_dm_bt_btdm_structure_reload_all_off(hw, &btdm8723);
0286         b_common = true;
0287     } else if (rtl8723e_dm_bt_is_wifi_busy(hw) &&
0288            !rtlpriv->btcoexist.bt_busy) {
0289         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0290             "Wifi non-idle + Bt disabled/idle!!\n");
0291         btdm8723.low_penalty_rate_adaptive = true;
0292         btdm8723.rf_rx_lpf_shrink = false;
0293         btdm8723.reject_aggre_pkt = false;
0294 
0295         /* sw mechanism */
0296         btdm8723.agc_table_en = false;
0297         btdm8723.adc_back_off_on = false;
0298         btdm8723.sw_dac_swing_on = false;
0299 
0300         btdm8723.pta_on = true;
0301         btdm8723.val_0x6c0 = 0x5a5aaaaa;
0302         btdm8723.val_0x6c8 = 0xcccc;
0303         btdm8723.val_0x6cc = 0x3;
0304 
0305         btdm8723.tdma_on = false;
0306         btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;
0307         btdm8723.b2_ant_hid_en = false;
0308 
0309         b_common = true;
0310     } else if (rtlpriv->btcoexist.bt_busy) {
0311         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0312             "Bt non-idle!\n");
0313         if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {
0314             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0315                 "Wifi connection exist\n");
0316             b_common = false;
0317         } else {
0318             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0319                 "No Wifi connection!\n");
0320             btdm8723.rf_rx_lpf_shrink = true;
0321             btdm8723.low_penalty_rate_adaptive = false;
0322             btdm8723.reject_aggre_pkt = false;
0323 
0324             /* sw mechanism */
0325             btdm8723.agc_table_en = false;
0326             btdm8723.adc_back_off_on = false;
0327             btdm8723.sw_dac_swing_on = false;
0328 
0329             btdm8723.pta_on = true;
0330             btdm8723.val_0x6c0 = 0x55555555;
0331             btdm8723.val_0x6c8 = 0x0000ffff;
0332             btdm8723.val_0x6cc = 0x3;
0333 
0334             btdm8723.tdma_on = false;
0335             btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;
0336             btdm8723.b2_ant_hid_en = false;
0337 
0338             b_common = true;
0339         }
0340     }
0341 
0342     if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))
0343         btdm8723.dec_bt_pwr = true;
0344 
0345     if (b_common)
0346         rtlpriv->btcoexist.cstate |=
0347             BT_COEX_STATE_BTINFO_COMMON;
0348 
0349     if (b_common && rtl8723e_dm_bt_is_coexist_state_changed(hw))
0350         rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);
0351 
0352     return b_common;
0353 }
0354 
0355 static void rtl8723e_dm_bt_set_sw_full_time_dac_swing(
0356         struct ieee80211_hw *hw,
0357         bool sw_dac_swing_on,
0358         u32 sw_dac_swing_lvl)
0359 {
0360     struct rtl_priv *rtlpriv = rtl_priv(hw);
0361 
0362     if (sw_dac_swing_on) {
0363         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0364             "[BTCoex], SwDacSwing = 0x%x\n", sw_dac_swing_lvl);
0365         rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000,
0366                        sw_dac_swing_lvl);
0367         rtlpriv->btcoexist.sw_coexist_all_off = false;
0368     } else {
0369         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0370             "[BTCoex], SwDacSwing Off!\n");
0371         rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000, 0xc0);
0372     }
0373 }
0374 
0375 static void rtl8723e_dm_bt_set_fw_dec_bt_pwr(
0376         struct ieee80211_hw *hw, bool dec_bt_pwr)
0377 {
0378     struct rtl_priv *rtlpriv = rtl_priv(hw);
0379     u8 h2c_parameter[1] = {0};
0380 
0381     h2c_parameter[0] = 0;
0382 
0383     if (dec_bt_pwr) {
0384         h2c_parameter[0] |= BIT(1);
0385         rtlpriv->btcoexist.fw_coexist_all_off = false;
0386     }
0387 
0388     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0389         "[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
0390         (dec_bt_pwr ? "Yes!!" : "No!!"), h2c_parameter[0]);
0391 
0392     rtl8723e_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter);
0393 }
0394 
0395 static void rtl8723e_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw,
0396                         bool b_enable, bool b_dac_swing_on)
0397 {
0398     struct rtl_priv *rtlpriv = rtl_priv(hw);
0399     u8 h2c_parameter[1] = {0};
0400 
0401     if (b_enable) {
0402         h2c_parameter[0] |= BIT(0);
0403         rtlpriv->btcoexist.fw_coexist_all_off = false;
0404     }
0405     if (b_dac_swing_on)
0406         h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */
0407 
0408     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0409         "[BTCoex], turn 2-Ant+HID mode %s, DACSwing:%s, write 0x15=0x%x\n",
0410         (b_enable ? "ON!!" : "OFF!!"), (b_dac_swing_on ? "ON" : "OFF"),
0411         h2c_parameter[0]);
0412 
0413     rtl8723e_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter);
0414 }
0415 
0416 static void rtl8723e_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw,
0417                         bool b_enable, u8 ant_num,
0418                         u8 nav_en, u8 dac_swing_en)
0419 {
0420     struct rtl_priv *rtlpriv = rtl_priv(hw);
0421     u8 h2c_parameter[1] = {0};
0422     u8 h2c_parameter1[1] = {0};
0423 
0424     h2c_parameter[0] = 0;
0425     h2c_parameter1[0] = 0;
0426 
0427     if (b_enable) {
0428         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0429             "[BTCoex], set BT PTA update manager to trigger update!!\n");
0430         h2c_parameter1[0] |= BIT(0);
0431 
0432         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0433             "[BTCoex], turn TDMA mode ON!!\n");
0434         h2c_parameter[0] |= BIT(0);     /* function enable */
0435         if (TDMA_1ANT == ant_num) {
0436             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0437                 "[BTCoex], TDMA_1ANT\n");
0438             h2c_parameter[0] |= BIT(1);
0439         } else if (TDMA_2ANT == ant_num) {
0440             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0441                 "[BTCoex], TDMA_2ANT\n");
0442         } else {
0443             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0444                 "[BTCoex], Unknown Ant\n");
0445         }
0446 
0447         if (TDMA_NAV_OFF == nav_en) {
0448             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0449                 "[BTCoex], TDMA_NAV_OFF\n");
0450         } else if (TDMA_NAV_ON == nav_en) {
0451             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0452                 "[BTCoex], TDMA_NAV_ON\n");
0453             h2c_parameter[0] |= BIT(2);
0454         }
0455 
0456         if (TDMA_DAC_SWING_OFF == dac_swing_en) {
0457             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0458                 "[BTCoex], TDMA_DAC_SWING_OFF\n");
0459         } else if (TDMA_DAC_SWING_ON == dac_swing_en) {
0460             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0461                 "[BTCoex], TDMA_DAC_SWING_ON\n");
0462             h2c_parameter[0] |= BIT(4);
0463         }
0464         rtlpriv->btcoexist.fw_coexist_all_off = false;
0465     } else {
0466         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0467             "[BTCoex], set BT PTA update manager to no update!!\n");
0468         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0469             "[BTCoex], turn TDMA mode OFF!!\n");
0470     }
0471 
0472     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0473         "[BTCoex], FW2AntTDMA, write 0x26=0x%x\n",
0474         h2c_parameter1[0]);
0475     rtl8723e_fill_h2c_cmd(hw, 0x26, 1, h2c_parameter1);
0476 
0477     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0478         "[BTCoex], FW2AntTDMA, write 0x14=0x%x\n",
0479         h2c_parameter[0]);
0480     rtl8723e_fill_h2c_cmd(hw, 0x14, 1, h2c_parameter);
0481 }
0482 
0483 static void rtl8723e_dm_bt_set_fw_ignore_wlan_act(struct ieee80211_hw *hw,
0484                           bool b_enable)
0485 {
0486     struct rtl_priv *rtlpriv = rtl_priv(hw);
0487     u8 h2c_parameter[1] = {0};
0488 
0489     if (b_enable) {
0490         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0491             "[BTCoex], BT Ignore Wlan_Act !!\n");
0492         h2c_parameter[0] |= BIT(0);     /* function enable */
0493         rtlpriv->btcoexist.fw_coexist_all_off = false;
0494     } else {
0495         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0496             "[BTCoex], BT don't ignore Wlan_Act !!\n");
0497     }
0498 
0499     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0500         "[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%x\n",
0501         h2c_parameter[0]);
0502 
0503     rtl8723e_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter);
0504 }
0505 
0506 static void rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,
0507                         bool b_enable, u8 ant_num,
0508                         u8 nav_en)
0509 {
0510     struct rtl_priv *rtlpriv = rtl_priv(hw);
0511     struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0512 
0513     u8 h2c_parameter[2] = {0};
0514 
0515     /* Only 8723 B cut should do this */
0516     if (IS_VENDOR_8723_A_CUT(rtlhal->version)) {
0517         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0518             "[BTCoex], not 8723B cut, don't set Traditional TDMA!!\n");
0519         return;
0520     }
0521 
0522     if (b_enable) {
0523         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0524             "[BTCoex], turn TTDMA mode ON!!\n");
0525         h2c_parameter[0] |= BIT(0); /* function enable */
0526         if (TDMA_1ANT == ant_num) {
0527             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0528                 "[BTCoex], TTDMA_1ANT\n");
0529             h2c_parameter[0] |= BIT(1);
0530         } else if (TDMA_2ANT == ant_num) {
0531             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0532                 "[BTCoex], TTDMA_2ANT\n");
0533         } else {
0534             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0535                 "[BTCoex], Unknown Ant\n");
0536         }
0537 
0538         if (TDMA_NAV_OFF == nav_en) {
0539             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0540                 "[BTCoex], TTDMA_NAV_OFF\n");
0541         } else if (TDMA_NAV_ON == nav_en) {
0542             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0543                 "[BTCoex], TTDMA_NAV_ON\n");
0544             h2c_parameter[1] |= BIT(0);
0545         }
0546 
0547         rtlpriv->btcoexist.fw_coexist_all_off = false;
0548     } else {
0549         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0550             "[BTCoex], turn TTDMA mode OFF!!\n");
0551     }
0552 
0553     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0554         "[BTCoex], FW Traditional TDMA, write 0x33=0x%x\n",
0555         h2c_parameter[0] << 8 | h2c_parameter[1]);
0556 
0557     rtl8723e_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter);
0558 }
0559 
0560 static void rtl8723e_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw,
0561                           u8 dac_swing_lvl)
0562 {
0563     struct rtl_priv *rtlpriv = rtl_priv(hw);
0564     u8 h2c_parameter[1] = {0};
0565     h2c_parameter[0] = dac_swing_lvl;
0566 
0567     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0568         "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
0569     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0570         "[BTCoex], write 0x29=0x%x\n", h2c_parameter[0]);
0571 
0572     rtl8723e_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter);
0573 }
0574 
0575 static void rtl8723e_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw,
0576                           bool b_enable)
0577 {
0578     struct rtl_priv *rtlpriv = rtl_priv(hw);
0579     u8 h2c_parameter[1] = {0};
0580     h2c_parameter[0] = 0;
0581 
0582     if (b_enable) {
0583         h2c_parameter[0] |= BIT(0);
0584         rtlpriv->btcoexist.fw_coexist_all_off = false;
0585     }
0586     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0587         "[BTCoex], Set BT HID information=0x%x\n", b_enable);
0588     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0589         "[BTCoex], write 0x24=0x%x\n", h2c_parameter[0]);
0590 
0591     rtl8723e_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter);
0592 }
0593 
0594 static void rtl8723e_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw,
0595                          u8 retry_index)
0596 {
0597     struct rtl_priv *rtlpriv = rtl_priv(hw);
0598     u8 h2c_parameter[1] = {0};
0599     h2c_parameter[0] = retry_index;
0600 
0601     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0602         "[BTCoex], Set BT Retry Index=%d\n", retry_index);
0603     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0604         "[BTCoex], write 0x23=0x%x\n", h2c_parameter[0]);
0605 
0606     rtl8723e_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter);
0607 }
0608 
0609 static void rtl8723e_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw,
0610                        u8 wlan_act_hi, u8 wlan_act_lo)
0611 {
0612     struct rtl_priv *rtlpriv = rtl_priv(hw);
0613     u8 h2c_parameter_hi[1] = {0};
0614     u8 h2c_parameter_lo[1] = {0};
0615     h2c_parameter_hi[0] = wlan_act_hi;
0616     h2c_parameter_lo[0] = wlan_act_lo;
0617 
0618     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0619         "[BTCoex], Set WLAN_ACT Hi:Lo=0x%x/0x%x\n",
0620         wlan_act_hi, wlan_act_lo);
0621     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0622         "[BTCoex], write 0x22=0x%x\n", h2c_parameter_hi[0]);
0623     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0624         "[BTCoex], write 0x11=0x%x\n", h2c_parameter_lo[0]);
0625 
0626     /* WLAN_ACT = High duration, unit:ms */
0627     rtl8723e_fill_h2c_cmd(hw, 0x22, 1, h2c_parameter_hi);
0628     /*  WLAN_ACT = Low duration, unit:3*625us */
0629     rtl8723e_fill_h2c_cmd(hw, 0x11, 1, h2c_parameter_lo);
0630 }
0631 
0632 void rtl8723e_dm_bt_set_bt_dm(struct ieee80211_hw *hw,
0633                   struct btdm_8723 *btdm)
0634 {
0635     struct rtl_priv *rtlpriv = rtl_priv(hw);
0636     struct btdm_8723 *btdm_8723 = &hal_coex_8723.btdm;
0637     u8 i;
0638 
0639     bool fw_current_inpsmode = false;
0640     bool fw_ps_awake = true;
0641 
0642     rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
0643                           (u8 *)(&fw_current_inpsmode));
0644     rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
0645                           (u8 *)(&fw_ps_awake));
0646 
0647     /* check new setting is different with the old one, */
0648     /* if all the same, don't do the setting again. */
0649     if (memcmp(btdm_8723, btdm, sizeof(struct btdm_8723)) == 0) {
0650         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0651             "[BTCoex], the same coexist setting, return!!\n");
0652         return;
0653     } else {    /* save the new coexist setting */
0654         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0655             "[BTCoex], UPDATE TO NEW COEX SETTING!!\n");
0656         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0657             "[BTCoex], original/new bAllOff=0x%x/ 0x%x\n",
0658             btdm_8723->all_off, btdm->all_off);
0659         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0660             "[BTCoex], original/new agc_table_en=0x%x/ 0x%x\n",
0661             btdm_8723->agc_table_en, btdm->agc_table_en);
0662         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0663             "[BTCoex], original/new adc_back_off_on=0x%x/ 0x%x\n",
0664             btdm_8723->adc_back_off_on,
0665             btdm->adc_back_off_on);
0666         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0667             "[BTCoex], original/new b2_ant_hid_en=0x%x/ 0x%x\n",
0668             btdm_8723->b2_ant_hid_en, btdm->b2_ant_hid_en);
0669         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0670             "[BTCoex], original/new bLowPenaltyRateAdaptive=0x%x/ 0x%x\n",
0671             btdm_8723->low_penalty_rate_adaptive,
0672             btdm->low_penalty_rate_adaptive);
0673         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0674             "[BTCoex], original/new bRfRxLpfShrink=0x%x/ 0x%x\n",
0675             btdm_8723->rf_rx_lpf_shrink,
0676             btdm->rf_rx_lpf_shrink);
0677         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0678             "[BTCoex], original/new bRejectAggrePkt=0x%x/ 0x%x\n",
0679             btdm_8723->reject_aggre_pkt,
0680             btdm->reject_aggre_pkt);
0681         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0682             "[BTCoex], original/new tdma_on=0x%x/ 0x%x\n",
0683             btdm_8723->tdma_on, btdm->tdma_on);
0684         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0685             "[BTCoex], original/new tdmaAnt=0x%x/ 0x%x\n",
0686             btdm_8723->tdma_ant, btdm->tdma_ant);
0687         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0688             "[BTCoex], original/new tdmaNav=0x%x/ 0x%x\n",
0689             btdm_8723->tdma_nav, btdm->tdma_nav);
0690         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0691             "[BTCoex], original/new tdma_dac_swing=0x%x/ 0x%x\n",
0692             btdm_8723->tdma_dac_swing, btdm->tdma_dac_swing);
0693         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0694             "[BTCoex], original/new fw_dac_swing_lvl=0x%x/ 0x%x\n",
0695             btdm_8723->fw_dac_swing_lvl,
0696             btdm->fw_dac_swing_lvl);
0697 
0698         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0699             "[BTCoex], original/new bTraTdmaOn=0x%x/ 0x%x\n",
0700             btdm_8723->tra_tdma_on, btdm->tra_tdma_on);
0701         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0702             "[BTCoex], original/new traTdmaAnt=0x%x/ 0x%x\n",
0703             btdm_8723->tra_tdma_ant, btdm->tra_tdma_ant);
0704         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0705             "[BTCoex], original/new traTdmaNav=0x%x/ 0x%x\n",
0706             btdm_8723->tra_tdma_nav, btdm->tra_tdma_nav);
0707         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0708             "[BTCoex], original/new bPsTdmaOn=0x%x/ 0x%x\n",
0709             btdm_8723->ps_tdma_on, btdm->ps_tdma_on);
0710         for (i = 0; i < 5; i++) {
0711             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0712                 "[BTCoex], original/new psTdmaByte[i]=0x%x/ 0x%x\n",
0713                 btdm_8723->ps_tdma_byte[i],
0714                 btdm->ps_tdma_byte[i]);
0715         }
0716         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0717             "[BTCoex], original/new bIgnoreWlanAct=0x%x/ 0x%x\n",
0718             btdm_8723->ignore_wlan_act,
0719             btdm->ignore_wlan_act);
0720 
0721 
0722         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0723             "[BTCoex], original/new bPtaOn=0x%x/ 0x%x\n",
0724             btdm_8723->pta_on, btdm->pta_on);
0725         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0726             "[BTCoex], original/new val_0x6c0=0x%x/ 0x%x\n",
0727             btdm_8723->val_0x6c0, btdm->val_0x6c0);
0728         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0729             "[BTCoex], original/new val_0x6c8=0x%x/ 0x%x\n",
0730             btdm_8723->val_0x6c8, btdm->val_0x6c8);
0731         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0732             "[BTCoex], original/new val_0x6cc=0x%x/ 0x%x\n",
0733             btdm_8723->val_0x6cc, btdm->val_0x6cc);
0734         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0735             "[BTCoex], original/new sw_dac_swing_on=0x%x/ 0x%x\n",
0736             btdm_8723->sw_dac_swing_on,
0737             btdm->sw_dac_swing_on);
0738         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0739             "[BTCoex], original/new sw_dac_swing_lvl=0x%x/ 0x%x\n",
0740             btdm_8723->sw_dac_swing_lvl,
0741             btdm->sw_dac_swing_lvl);
0742         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0743             "[BTCoex], original/new wlanActHi=0x%x/ 0x%x\n",
0744             btdm_8723->wlan_act_hi, btdm->wlan_act_hi);
0745         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0746             "[BTCoex], original/new wlanActLo=0x%x/ 0x%x\n",
0747             btdm_8723->wlan_act_lo, btdm->wlan_act_lo);
0748         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0749             "[BTCoex], original/new btRetryIndex=0x%x/ 0x%x\n",
0750             btdm_8723->bt_retry_index, btdm->bt_retry_index);
0751 
0752         memcpy(btdm_8723, btdm, sizeof(struct btdm_8723));
0753     }
0754     /* Here we only consider when Bt Operation
0755      * inquiry/paging/pairing is ON
0756      * we only need to turn off TDMA
0757      */
0758 
0759     if (rtlpriv->btcoexist.hold_for_bt_operation) {
0760         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0761             "[BTCoex], set to ignore wlanAct for BT OP!!\n");
0762         rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, true);
0763         return;
0764     }
0765 
0766     if (btdm->all_off) {
0767         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
0768             "[BTCoex], disable all coexist mechanism !!\n");
0769         rtl8723e_btdm_coex_all_off(hw);
0770         return;
0771     }
0772 
0773     rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, btdm->reject_aggre_pkt);
0774 
0775     if (btdm->low_penalty_rate_adaptive)
0776         dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
0777     else
0778         dm_bt_set_sw_penalty_tx_rate_adapt(hw,
0779                            BT_TX_RATE_ADAPTIVE_NORMAL);
0780 
0781     if (btdm->rf_rx_lpf_shrink)
0782         rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,
0783                 BT_RF_RX_LPF_CORNER_SHRINK);
0784     else
0785         rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,
0786                 BT_RF_RX_LPF_CORNER_RESUME);
0787 
0788     if (btdm->agc_table_en)
0789         rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_ON);
0790     else
0791         rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
0792 
0793     if (btdm->adc_back_off_on)
0794         rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_ON);
0795     else
0796         rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
0797 
0798     rtl8723e_dm_bt_set_fw_bt_retry_index(hw, btdm->bt_retry_index);
0799 
0800     rtl8723e_dm_bt_set_fw_dac_swing_level(hw, btdm->fw_dac_swing_lvl);
0801     rtl8723e_dm_bt_set_fw_wlan_act(hw, btdm->wlan_act_hi,
0802                        btdm->wlan_act_lo);
0803 
0804     rtl8723e_dm_bt_set_coex_table(hw, btdm->val_0x6c0,
0805                       btdm->val_0x6c8, btdm->val_0x6cc);
0806     rtl8723e_dm_bt_set_hw_pta_mode(hw, btdm->pta_on);
0807 
0808     /* Note: There is a constraint between TDMA and 2AntHID
0809      * Only one of 2AntHid and tdma can be turn on
0810      * We should turn off those mechanisms should be turned off first
0811      * and then turn on those mechanisms should be turned on.
0812     */
0813     if (btdm->b2_ant_hid_en) {
0814         /* turn off tdma */
0815         rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
0816                             btdm->tra_tdma_ant,
0817                             btdm->tra_tdma_nav);
0818         rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
0819                         btdm->tdma_nav,
0820                         btdm->tdma_dac_swing);
0821 
0822         /* turn off Pstdma */
0823         rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
0824                               btdm->ignore_wlan_act);
0825         /* Antenna control by PTA, 0x870 = 0x300. */
0826         rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
0827 
0828         /* turn on 2AntHid */
0829         rtl8723e_dm_bt_set_fw_bt_hid_info(hw, true);
0830         rtl8723e_dm_bt_set_fw_2_ant_hid(hw, true, true);
0831     } else if (btdm->tdma_on) {
0832         /* turn off 2AntHid */
0833         rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
0834         rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
0835 
0836         /* turn off pstdma */
0837         rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
0838                               btdm->ignore_wlan_act);
0839         /* Antenna control by PTA, 0x870 = 0x300. */
0840         rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
0841 
0842         /* turn on tdma */
0843         rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
0844                             btdm->tra_tdma_ant,
0845                             btdm->tra_tdma_nav);
0846         rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, true, btdm->tdma_ant,
0847                         btdm->tdma_nav,
0848                         btdm->tdma_dac_swing);
0849     } else if (btdm->ps_tdma_on) {
0850         /* turn off 2AntHid */
0851         rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
0852         rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
0853 
0854         /* turn off tdma */
0855         rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
0856                             btdm->tra_tdma_ant,
0857                             btdm->tra_tdma_nav);
0858         rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
0859                         btdm->tdma_nav,
0860                         btdm->tdma_dac_swing);
0861 
0862         /* turn on pstdma */
0863         rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
0864                               btdm->ignore_wlan_act);
0865         rtl8723e_dm_bt_set_fw_3a(hw, btdm->ps_tdma_byte[0],
0866                      btdm->ps_tdma_byte[1],
0867                      btdm->ps_tdma_byte[2],
0868                      btdm->ps_tdma_byte[3],
0869                      btdm->ps_tdma_byte[4]);
0870     } else {
0871         /* turn off 2AntHid */
0872         rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
0873         rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
0874 
0875         /* turn off tdma */
0876         rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
0877                             btdm->tra_tdma_ant,
0878                             btdm->tra_tdma_nav);
0879         rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
0880                         btdm->tdma_nav,
0881                         btdm->tdma_dac_swing);
0882 
0883         /* turn off pstdma */
0884         rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
0885                         btdm->ignore_wlan_act);
0886         /* Antenna control by PTA, 0x870 = 0x300. */
0887         rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
0888     }
0889 
0890     /* Note:
0891      * We should add delay for making sure
0892      *  sw DacSwing can be set sucessfully.
0893      * because of that rtl8723e_dm_bt_set_fw_2_ant_hid()
0894      *  and rtl8723e_dm_bt_set_fw_tdma_ctrl()
0895      * will overwrite the reg 0x880.
0896     */
0897     mdelay(30);
0898     rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, btdm->sw_dac_swing_on,
0899                           btdm->sw_dac_swing_lvl);
0900     rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, btdm->dec_bt_pwr);
0901 }
0902 
0903 /* ============================================================ */
0904 /* extern function start with BTDM_ */
0905 /* ============================================================i
0906  */
0907 static u32 rtl8723e_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw)
0908 {
0909     u32 counters = 0;
0910 
0911     counters = hal_coex_8723.high_priority_tx +
0912             hal_coex_8723.high_priority_rx;
0913     return counters;
0914 }
0915 
0916 static u32 rtl8723e_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw)
0917 {
0918     u32 counters = 0;
0919 
0920     counters = hal_coex_8723.low_priority_tx +
0921             hal_coex_8723.low_priority_rx;
0922     return counters;
0923 }
0924 
0925 static u8 rtl8723e_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw)
0926 {
0927     struct rtl_priv *rtlpriv = rtl_priv(hw);
0928     u32 bt_tx_rx_cnt = 0;
0929     u8  bt_tx_rx_cnt_lvl = 0;
0930 
0931     bt_tx_rx_cnt = rtl8723e_dm_bt_tx_rx_couter_h(hw)
0932                 + rtl8723e_dm_bt_tx_rx_couter_l(hw);
0933     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0934         "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt);
0935 
0936     rtlpriv->btcoexist.cstate_h &= ~
0937          (BT_COEX_STATE_BT_CNT_LEVEL_0 | BT_COEX_STATE_BT_CNT_LEVEL_1|
0938           BT_COEX_STATE_BT_CNT_LEVEL_2);
0939 
0940     if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_3) {
0941         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0942             "[BTCoex], BT TxRx Counters at level 3\n");
0943         bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_3;
0944         rtlpriv->btcoexist.cstate_h |=
0945             BT_COEX_STATE_BT_CNT_LEVEL_3;
0946     } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_2) {
0947         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0948             "[BTCoex], BT TxRx Counters at level 2\n");
0949         bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_2;
0950         rtlpriv->btcoexist.cstate_h |=
0951             BT_COEX_STATE_BT_CNT_LEVEL_2;
0952     } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_1) {
0953         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0954             "[BTCoex], BT TxRx Counters at level 1\n");
0955         bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_1;
0956         rtlpriv->btcoexist.cstate_h  |=
0957             BT_COEX_STATE_BT_CNT_LEVEL_1;
0958     } else {
0959         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0960             "[BTCoex], BT TxRx Counters at level 0\n");
0961         bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_0;
0962         rtlpriv->btcoexist.cstate_h |=
0963             BT_COEX_STATE_BT_CNT_LEVEL_0;
0964     }
0965     return bt_tx_rx_cnt_lvl;
0966 }
0967 
0968 static void rtl8723e_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
0969 {
0970     struct rtl_priv *rtlpriv = rtl_priv(hw);
0971     struct rtl_phy *rtlphy = &(rtlpriv->phy);
0972     struct btdm_8723 btdm8723;
0973     u8 bt_rssi_state, bt_rssi_state1;
0974     u8  bt_tx_rx_cnt_lvl = 0;
0975 
0976     rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);
0977 
0978     btdm8723.rf_rx_lpf_shrink = true;
0979     btdm8723.low_penalty_rate_adaptive = true;
0980     btdm8723.reject_aggre_pkt = false;
0981 
0982     bt_tx_rx_cnt_lvl = rtl8723e_dm_bt_bt_tx_rx_counter_level(hw);
0983     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
0984         "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl);
0985 
0986     if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
0987         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, "HT40\n");
0988         /* coex table */
0989         btdm8723.val_0x6c0 = 0x55555555;
0990         btdm8723.val_0x6c8 = 0xffff;
0991         btdm8723.val_0x6cc = 0x3;
0992 
0993         /* sw mechanism */
0994         btdm8723.agc_table_en = false;
0995         btdm8723.adc_back_off_on = false;
0996         btdm8723.sw_dac_swing_on = false;
0997 
0998         /* fw mechanism */
0999         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%x, 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 
1144 static 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%x, 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 
1358 static void rtl8723e_dm_bt_inq_page_monitor(struct ieee80211_hw *hw)
1359 {
1360     struct rtl_priv *rtlpriv = rtl_priv(hw);
1361     u32 cur_time;
1362 
1363     cur_time = jiffies;
1364     if (hal_coex_8723.c2h_bt_inquiry_page) {
1365         /* bt inquiry or page is started. */
1366         if (hal_coex_8723.bt_inq_page_start_time == 0) {
1367             rtlpriv->btcoexist.cstate  |=
1368             BT_COEX_STATE_BT_INQ_PAGE;
1369             hal_coex_8723.bt_inq_page_start_time = cur_time;
1370             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1371                 "[BTCoex], BT Inquiry/page is started at time : 0x%x\n",
1372                 hal_coex_8723.bt_inq_page_start_time);
1373         }
1374     }
1375     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1376         "[BTCoex], BT Inquiry/page started time : 0x%x, cur_time : 0x%x\n",
1377         hal_coex_8723.bt_inq_page_start_time, cur_time);
1378 
1379     if (hal_coex_8723.bt_inq_page_start_time) {
1380         if ((((long)cur_time -
1381             (long)hal_coex_8723.bt_inq_page_start_time) / HZ)
1382             >= 10) {
1383             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1384                 "[BTCoex], BT Inquiry/page >= 10sec!!!\n");
1385             hal_coex_8723.bt_inq_page_start_time = 0;
1386             rtlpriv->btcoexist.cstate &=
1387                 ~BT_COEX_STATE_BT_INQ_PAGE;
1388         }
1389     }
1390 }
1391 
1392 static void rtl8723e_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)
1393 {
1394     struct rtl_priv *rtlpriv = rtl_priv(hw);
1395 
1396     rtlpriv->btcoexist.cstate &= ~
1397         (BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP|
1398         BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO);
1399 
1400     rtlpriv->btcoexist.cstate &= ~
1401         (BT_COEX_STATE_BTINFO_COMMON |
1402         BT_COEX_STATE_BTINFO_B_HID_SCOESCO|
1403         BT_COEX_STATE_BTINFO_B_FTP_A2DP);
1404 }
1405 
1406 static void _rtl8723e_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)
1407 {
1408     struct rtl_priv *rtlpriv = rtl_priv(hw);
1409     u8 bt_info_original;
1410     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1411         "[BTCoex] Get bt info by fw!!\n");
1412 
1413     _rtl8723_dm_bt_check_wifi_state(hw);
1414 
1415     if (hal_coex_8723.c2h_bt_info_req_sent) {
1416         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1417             "[BTCoex] c2h for bt_info not rcvd yet!!\n");
1418     }
1419 
1420     bt_info_original = hal_coex_8723.c2h_bt_info_original;
1421 
1422     /* when bt inquiry or page scan, we have to set h2c 0x25 */
1423     /* ignore wlanact for continuous 4x2secs */
1424     rtl8723e_dm_bt_inq_page_monitor(hw);
1425     rtl8723e_dm_bt_reset_action_profile_state(hw);
1426 
1427     if (rtl8723e_dm_bt_is_2_ant_common_action(hw)) {
1428         rtlpriv->btcoexist.bt_profile_case = BT_COEX_MECH_COMMON;
1429         rtlpriv->btcoexist.bt_profile_action = BT_COEX_MECH_COMMON;
1430         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1431             "Action 2-Ant common.\n");
1432     } else {
1433         if ((bt_info_original & BTINFO_B_HID) ||
1434             (bt_info_original & BTINFO_B_SCO_BUSY) ||
1435             (bt_info_original & BTINFO_B_SCO_ESCO)) {
1436                 rtlpriv->btcoexist.cstate |=
1437                     BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1438                 rtlpriv->btcoexist.bt_profile_case =
1439                     BT_COEX_MECH_HID_SCO_ESCO;
1440                 rtlpriv->btcoexist.bt_profile_action =
1441                     BT_COEX_MECH_HID_SCO_ESCO;
1442                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1443                     "[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n");
1444                 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);
1445         } else if ((bt_info_original & BTINFO_B_FTP) ||
1446                 (bt_info_original & BTINFO_B_A2DP)) {
1447                 rtlpriv->btcoexist.cstate |=
1448                     BT_COEX_STATE_BTINFO_B_FTP_A2DP;
1449                 rtlpriv->btcoexist.bt_profile_case =
1450                     BT_COEX_MECH_FTP_A2DP;
1451                 rtlpriv->btcoexist.bt_profile_action =
1452                     BT_COEX_MECH_FTP_A2DP;
1453                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1454                     "BTInfo: bFTP|bA2DP\n");
1455                 rtl8723e_dm_bt_2_ant_ftp_a2dp(hw);
1456         } else {
1457                 rtlpriv->btcoexist.cstate |=
1458                     BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1459                 rtlpriv->btcoexist.bt_profile_case =
1460                     BT_COEX_MECH_NONE;
1461                 rtlpriv->btcoexist.bt_profile_action =
1462                     BT_COEX_MECH_NONE;
1463                 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1464                     "[BTCoex], BTInfo: undefined case!!!!\n");
1465                 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);
1466         }
1467     }
1468 }
1469 
1470 static void _rtl8723e_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)
1471 {
1472     return;
1473 }
1474 
1475 void rtl8723e_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)
1476 {
1477     rtl8723e_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);
1478     rtl8723e_dm_bt_set_hw_pta_mode(hw, true);
1479 }
1480 
1481 void rtl8723e_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)
1482 {
1483     rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, false);
1484     rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
1485     rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
1486     rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, false, TDMA_2ANT,
1487                         TDMA_NAV_OFF);
1488     rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT, TDMA_NAV_OFF,
1489                     TDMA_DAC_SWING_OFF);
1490     rtl8723e_dm_bt_set_fw_dac_swing_level(hw, 0);
1491     rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
1492     rtl8723e_dm_bt_set_fw_bt_retry_index(hw, 2);
1493     rtl8723e_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10);
1494     rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, false);
1495 }
1496 
1497 void rtl8723e_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)
1498 {
1499     rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
1500     rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
1501     rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, false);
1502 
1503     dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_NORMAL);
1504     rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
1505     rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0);
1506 }
1507 
1508 static void rtl8723e_dm_bt_query_bt_information(struct ieee80211_hw *hw)
1509 {
1510     struct rtl_priv *rtlpriv = rtl_priv(hw);
1511     u8 h2c_parameter[1] = {0};
1512 
1513     hal_coex_8723.c2h_bt_info_req_sent = true;
1514 
1515     h2c_parameter[0] |=  BIT(0);
1516 
1517     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1518         "Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]);
1519 
1520     rtl8723e_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);
1521 }
1522 
1523 static void rtl8723e_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)
1524 {
1525     struct rtl_priv *rtlpriv = rtl_priv(hw);
1526     u32 reg_hp_tx_rx, reg_lp_tx_rx, u32_tmp;
1527     u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
1528 
1529     reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;
1530     reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;
1531 
1532     u32_tmp = rtl_read_dword(rtlpriv, reg_hp_tx_rx);
1533     reg_hp_tx = u32_tmp & MASKLWORD;
1534     reg_hp_rx = (u32_tmp & MASKHWORD)>>16;
1535 
1536     u32_tmp = rtl_read_dword(rtlpriv, reg_lp_tx_rx);
1537     reg_lp_tx = u32_tmp & MASKLWORD;
1538     reg_lp_rx = (u32_tmp & MASKHWORD)>>16;
1539 
1540     if (rtlpriv->btcoexist.lps_counter > 1) {
1541         reg_hp_tx %= rtlpriv->btcoexist.lps_counter;
1542         reg_hp_rx %= rtlpriv->btcoexist.lps_counter;
1543         reg_lp_tx %= rtlpriv->btcoexist.lps_counter;
1544         reg_lp_rx %= rtlpriv->btcoexist.lps_counter;
1545     }
1546 
1547     hal_coex_8723.high_priority_tx = reg_hp_tx;
1548     hal_coex_8723.high_priority_rx = reg_hp_rx;
1549     hal_coex_8723.low_priority_tx = reg_lp_tx;
1550     hal_coex_8723.low_priority_rx = reg_lp_rx;
1551 
1552     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1553         "High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1554         reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
1555     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1556         "Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1557         reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
1558     rtlpriv->btcoexist.lps_counter = 0;
1559     /* rtl_write_byte(rtlpriv, 0x76e, 0xc); */
1560 }
1561 
1562 static void rtl8723e_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)
1563 {
1564     struct rtl_priv *rtlpriv = rtl_priv(hw);
1565     bool bt_alife = true;
1566 
1567     if (hal_coex_8723.high_priority_tx == 0 &&
1568         hal_coex_8723.high_priority_rx == 0 &&
1569         hal_coex_8723.low_priority_tx == 0 &&
1570         hal_coex_8723.low_priority_rx == 0) {
1571         bt_alife = false;
1572     }
1573     if (hal_coex_8723.high_priority_tx == 0xeaea &&
1574         hal_coex_8723.high_priority_rx == 0xeaea &&
1575         hal_coex_8723.low_priority_tx == 0xeaea &&
1576         hal_coex_8723.low_priority_rx == 0xeaea) {
1577         bt_alife = false;
1578     }
1579     if (hal_coex_8723.high_priority_tx == 0xffff &&
1580         hal_coex_8723.high_priority_rx == 0xffff &&
1581         hal_coex_8723.low_priority_tx == 0xffff &&
1582         hal_coex_8723.low_priority_rx == 0xffff) {
1583         bt_alife = false;
1584     }
1585     if (bt_alife) {
1586         rtlpriv->btcoexist.bt_active_zero_cnt = 0;
1587         rtlpriv->btcoexist.cur_bt_disabled = false;
1588         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1589             "8723A BT is enabled !!\n");
1590     } else {
1591         rtlpriv->btcoexist.bt_active_zero_cnt++;
1592         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1593             "8723A bt all counters=0, %d times!!\n",
1594             rtlpriv->btcoexist.bt_active_zero_cnt);
1595         if (rtlpriv->btcoexist.bt_active_zero_cnt >= 2) {
1596             rtlpriv->btcoexist.cur_bt_disabled = true;
1597             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1598                 "8723A BT is disabled !!\n");
1599         }
1600     }
1601     if (rtlpriv->btcoexist.pre_bt_disabled !=
1602         rtlpriv->btcoexist.cur_bt_disabled) {
1603         rtl_dbg(rtlpriv, COMP_BT_COEXIST,
1604             DBG_TRACE, "8723A BT is from %s to %s!!\n",
1605             (rtlpriv->btcoexist.pre_bt_disabled ?
1606                 "disabled" : "enabled"),
1607             (rtlpriv->btcoexist.cur_bt_disabled ?
1608                 "disabled" : "enabled"));
1609         rtlpriv->btcoexist.pre_bt_disabled
1610             = rtlpriv->btcoexist.cur_bt_disabled;
1611     }
1612 }
1613 
1614 
1615 void rtl8723e_dm_bt_coexist_8723(struct ieee80211_hw *hw)
1616 {
1617     struct rtl_priv *rtlpriv = rtl_priv(hw);
1618 
1619     rtl8723e_dm_bt_query_bt_information(hw);
1620     rtl8723e_dm_bt_bt_hw_counters_monitor(hw);
1621     rtl8723e_dm_bt_bt_enable_disable_check(hw);
1622 
1623     if (rtlpriv->btcoexist.bt_ant_num == ANT_X2) {
1624         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1625             "[BTCoex], 2 Ant mechanism\n");
1626         _rtl8723e_dm_bt_coexist_2_ant(hw);
1627     } else {
1628         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1629             "[BTCoex], 1 Ant mechanism\n");
1630         _rtl8723e_dm_bt_coexist_1_ant(hw);
1631     }
1632 
1633     if (!rtl8723e_dm_bt_is_same_coexist_state(hw)) {
1634         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1635             "[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n",
1636             rtlpriv->btcoexist.previous_state_h,
1637             rtlpriv->btcoexist.previous_state,
1638             rtlpriv->btcoexist.cstate_h,
1639             rtlpriv->btcoexist.cstate);
1640         rtlpriv->btcoexist.previous_state
1641             = rtlpriv->btcoexist.cstate;
1642         rtlpriv->btcoexist.previous_state_h
1643             = rtlpriv->btcoexist.cstate_h;
1644     }
1645 }
1646 
1647 static void rtl8723e_dm_bt_parse_bt_info(struct ieee80211_hw *hw,
1648                      u8 *tmp_buf, u8 len)
1649 {
1650     struct rtl_priv *rtlpriv = rtl_priv(hw);
1651     u8 bt_info;
1652     u8 i;
1653 
1654     hal_coex_8723.c2h_bt_info_req_sent = false;
1655     hal_coex_8723.bt_retry_cnt = 0;
1656     for (i = 0; i < len; i++) {
1657         if (i == 0)
1658             hal_coex_8723.c2h_bt_info_original = tmp_buf[i];
1659         else if (i == 1)
1660             hal_coex_8723.bt_retry_cnt = tmp_buf[i];
1661         if (i == len-1)
1662             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1663                 "0x%2x]", tmp_buf[i]);
1664         else
1665             rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1666                 "0x%2x, ", tmp_buf[i]);
1667 
1668     }
1669     rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1670         "BT info bt_info (Data)= 0x%x\n",
1671             hal_coex_8723.c2h_bt_info_original);
1672     bt_info = hal_coex_8723.c2h_bt_info_original;
1673 
1674     if (bt_info & BIT(2))
1675         hal_coex_8723.c2h_bt_inquiry_page = true;
1676     else
1677         hal_coex_8723.c2h_bt_inquiry_page = false;
1678 
1679 
1680     if (bt_info & BTINFO_B_CONNECTION) {
1681         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1682             "[BTC2H], BTInfo: bConnect=true\n");
1683         rtlpriv->btcoexist.bt_busy = true;
1684         rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT_IDLE;
1685     } else {
1686         rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1687             "[BTC2H], BTInfo: bConnect=false\n");
1688         rtlpriv->btcoexist.bt_busy = false;
1689         rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT_IDLE;
1690     }
1691 }
1692 void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw)
1693 {
1694     struct rtl_priv *rtlpriv = rtl_priv(hw);
1695     struct c2h_evt_hdr c2h_event;
1696     u8 *ptmp_buf = NULL;
1697     u8 index = 0;
1698     u8 u1b_tmp = 0;
1699     memset(&c2h_event, 0, sizeof(c2h_event));
1700     u1b_tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL);
1701     rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
1702         "&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1b_tmp);
1703     c2h_event.cmd_id = u1b_tmp & 0xF;
1704     c2h_event.cmd_len = (u1b_tmp & 0xF0) >> 4;
1705     c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1);
1706     rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
1707         "cmd_id: %d, cmd_len: %d, cmd_seq: %d\n",
1708         c2h_event.cmd_id, c2h_event.cmd_len, c2h_event.cmd_seq);
1709     u1b_tmp = rtl_read_byte(rtlpriv, 0x01AF);
1710     if (u1b_tmp == C2H_EVT_HOST_CLOSE) {
1711         return;
1712     } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {
1713         rtl_write_byte(rtlpriv, 0x1AF, 0x00);
1714         return;
1715     }
1716     ptmp_buf = kzalloc(c2h_event.cmd_len, GFP_KERNEL);
1717     if (ptmp_buf == NULL) {
1718         rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
1719             "malloc cmd buf failed\n");
1720         return;
1721     }
1722 
1723     /* Read the content */
1724     for (index = 0; index < c2h_event.cmd_len; index++)
1725         ptmp_buf[index] = rtl_read_byte(rtlpriv,
1726                     REG_C2HEVT_MSG_NORMAL + 2 + index);
1727 
1728 
1729     switch (c2h_event.cmd_id) {
1730     case C2H_V0_BT_RSSI:
1731             break;
1732 
1733     case C2H_V0_BT_OP_MODE:
1734             break;
1735 
1736     case C2H_V0_BT_INFO:
1737         rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
1738             "BT info Byte[0] (ID) is 0x%x\n",
1739             c2h_event.cmd_id);
1740         rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
1741             "BT info Byte[1] (Seq) is 0x%x\n",
1742             c2h_event.cmd_seq);
1743         rtl_dbg(rtlpriv, COMP_FW, DBG_TRACE,
1744             "BT info Byte[2] (Data)= 0x%x\n", ptmp_buf[0]);
1745 
1746         rtl8723e_dm_bt_parse_bt_info(hw, ptmp_buf, c2h_event.cmd_len);
1747 
1748         if (rtlpriv->cfg->ops->get_btc_status())
1749             rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
1750 
1751         break;
1752     default:
1753         break;
1754     }
1755     kfree(ptmp_buf);
1756 
1757     rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);
1758 }