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