Linux-libre 3.16.78-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8821ae / rtl8821ae / hal_btc.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2010  Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  * The full GNU General Public License is included in this distribution in the
19  * file called LICENSE.
20  *
21  * Contact Information:
22  * wlanfae <wlanfae@realtek.com>
23  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24  * Hsinchu 300, Taiwan.
25  *
26  * Larry Finger <Larry.Finger@lwfinger.net>
27  *
28  *****************************************************************************/
29 #include "hal_btc.h"
30 #include "../pci.h"
31 #include "phy.h"
32 #include "fw.h"
33 #include "reg.h"
34 #include "def.h"
35 #include "../btcoexist/rtl_btc.h"
36
37 static struct bt_coexist_8821ae hal_coex_8821ae;
38
39 void rtl8821ae_dm_bt_turn_off_bt_coexist_before_enter_lps(struct ieee80211_hw *hw)
40 {
41         struct rtl_priv *rtlpriv = rtl_priv(hw);
42         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
43     struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
44
45         if(!rtlpcipriv->btcoexist.bt_coexistence)
46                 return;
47
48         if(ppsc->b_inactiveps) {
49                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,("[BT][DM], Before enter IPS, turn off all Coexist DM\n"));
50                 rtlpcipriv->btcoexist.current_state = 0;
51                 rtlpcipriv->btcoexist.previous_state = 0;
52                 rtlpcipriv->btcoexist.current_state_h = 0;
53                 rtlpcipriv->btcoexist.previous_state_h = 0;
54                 rtl8821ae_btdm_coex_all_off(hw);
55         }
56 }
57
58
59 enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
60 {
61     struct rtl_priv *rtlpriv = rtl_priv(hw);
62     struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
63     enum rt_media_status    m_status = RT_MEDIA_DISCONNECT;
64
65     u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
66
67     if(bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
68             m_status = RT_MEDIA_CONNECT;
69     }
70
71     return m_status;
72 }
73
74 void rtl_8821ae_bt_wifi_media_status_notify(struct ieee80211_hw *hw, bool mstatus)
75 {
76         struct rtl_priv *rtlpriv = rtl_priv(hw);
77         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
78         struct rtl_phy *rtlphy = &(rtlpriv->phy);
79         u8 h2c_parameter[3] ={0};
80         u8 chnl;
81
82         if(!rtlpcipriv->btcoexist.bt_coexistence)
83                 return;
84
85         if(RT_MEDIA_CONNECT == mstatus)
86                 h2c_parameter[0] = 0x1; // 0: disconnected, 1:connected
87         else
88                 h2c_parameter[0] = 0x0;
89
90         if(mgnt_link_status_query(hw))  {
91                 chnl = rtlphy->current_channel;
92                 h2c_parameter[1] = chnl;
93         }
94
95         if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40){
96                 h2c_parameter[2] = 0x30;
97         } else {
98                 h2c_parameter[2] = 0x20;
99         }
100
101         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,("[BTCoex], FW write 0x19=0x%x\n",
102                 h2c_parameter[0]<<16|h2c_parameter[1]<<8|h2c_parameter[2]));
103
104         rtl8821ae_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter);
105
106 }
107
108
109 bool rtl8821ae_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)
110 {
111         struct rtl_priv *rtlpriv = rtl_priv(hw);
112         if(rtlpriv->link_info.b_busytraffic ||
113                 rtlpriv->link_info.b_rx_busy_traffic ||
114                 rtlpriv->link_info.b_tx_busy_traffic)
115                 return true;
116         else
117                 return false;
118 }
119 void rtl8821ae_dm_bt_set_fw_3a(struct ieee80211_hw *hw,
120                                                 u8 byte1, u8 byte2, u8 byte3, u8 byte4, u8 byte5)
121 {
122         struct rtl_priv *rtlpriv = rtl_priv(hw);
123         u8 h2c_parameter[5] ={0};
124         h2c_parameter[0] = byte1;
125         h2c_parameter[1] = byte2;
126         h2c_parameter[2] = byte3;
127         h2c_parameter[3] = byte4;
128         h2c_parameter[4] = byte5;
129         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], FW write 0x3a(4bytes)=0x%x%8x\n",
130                 h2c_parameter[0], h2c_parameter[1]<<24 | h2c_parameter[2]<<16 | h2c_parameter[3]<<8 | h2c_parameter[4]));
131         rtl8821ae_fill_h2c_cmd(hw, 0x3a, 5, h2c_parameter);
132 }
133
134 bool rtl8821ae_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw)
135 {
136         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
137         struct rtl_priv *rtlpriv = rtl_priv(hw);
138
139         if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {
140                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Need to decrease bt power\n"));
141                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_DEC_BT_POWER;
142                         return true;
143         }
144
145         rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_DEC_BT_POWER;
146         return false;
147 }
148
149
150 bool rtl8821ae_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)
151 {
152         struct rtl_priv *rtlpriv = rtl_priv(hw);
153         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
154
155         if ((rtlpcipriv->btcoexist.previous_state
156                 == rtlpcipriv->btcoexist.current_state)
157                 &&(rtlpcipriv->btcoexist.previous_state_h
158                 == rtlpcipriv->btcoexist.current_state_h)) {
159                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
160                                 ("[DM][BT], Coexist state do not change!!\n"));
161                 return true;
162         } else {
163                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
164                                 ("[DM][BT], Coexist state changed!!\n"));
165                 return false;
166         }
167 }
168
169 void rtl8821ae_dm_bt_set_coex_table(struct ieee80211_hw *hw,
170                                                 u32 val_0x6c0, u32 val_0x6c8, u32 val_0x6cc)
171 {
172         struct rtl_priv *rtlpriv = rtl_priv(hw);
173
174         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("set coex table, set 0x6c0=0x%x\n", val_0x6c0));
175         rtl_write_dword(rtlpriv, 0x6c0, val_0x6c0);
176
177         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("set coex table, set 0x6c8=0x%x\n", val_0x6c8));
178         rtl_write_dword(rtlpriv, 0x6c8, val_0x6c8);
179
180         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("set coex table, set 0x6cc=0x%x\n", val_0x6cc));
181         rtl_write_byte(rtlpriv, 0x6cc, val_0x6cc);
182 }
183
184 void rtl8821ae_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool b_mode)
185 {
186         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
187         struct rtl_priv *rtlpriv = rtl_priv(hw);
188
189         if (BT_PTA_MODE_ON == b_mode) {
190                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("PTA mode on, "));
191                 /*  Enable GPIO 0/1/2/3/8 pins for bt */
192                 rtl_write_byte(rtlpriv, 0x40, 0x20);
193                 rtlpcipriv->btcoexist.b_hw_coexist_all_off = false;
194         } else {
195                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("PTA mode off\n"));
196                 rtl_write_byte(rtlpriv, 0x40, 0x0);
197         }
198 }
199
200 void rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw, u8 type)
201 {
202         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
203         struct rtl_priv *rtlpriv = rtl_priv(hw);
204
205         if (BT_RF_RX_LPF_CORNER_SHRINK == type) {
206                 /* Shrink RF Rx LPF corner, 0x1e[7:4]=1111 ==> [11:4] by Jenyu */
207                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Shrink RF Rx LPF corner!!\n"));
208                 /* PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)PathA, 0x1e, 0xf0, 0xf); */
209                 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff, 0xf0ff7);
210                 rtlpcipriv->btcoexist.b_sw_coexist_all_off = false;
211         } else if(BT_RF_RX_LPF_CORNER_RESUME == type) {
212                 /*Resume RF Rx LPF corner*/
213                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Resume RF Rx LPF corner!!\n"));
214                 /* PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)PathA, 0x1e, 0xf0,
215                  * pHalData->btcoexist.BtRfRegOrigin1E); */
216                 rtl8821ae_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff,
217                         rtlpcipriv->btcoexist.bt_rfreg_origin_1e);
218         }
219 }
220
221 void rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(struct ieee80211_hw *hw,
222                                                                                                                                         u8 ra_type)
223 {
224         struct rtl_priv *rtlpriv = rtl_priv(hw);
225         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
226         u8 tmp_u1;
227
228         tmp_u1 = rtl_read_byte(rtlpriv, 0x4fd);
229         tmp_u1 |= BIT(0);
230         if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == ra_type) {
231                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Tx rate adaptive, set low penalty!!\n"));
232                 tmp_u1 &= ~BIT(2);
233                 rtlpcipriv->btcoexist.b_sw_coexist_all_off = false;
234         } else if(BT_TX_RATE_ADAPTIVE_NORMAL == ra_type) {
235                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Tx rate adaptive, set normal!!\n"));
236                 tmp_u1 |= BIT(2);
237         }
238
239         rtl_write_byte(rtlpriv, 0x4fd, tmp_u1);
240 }
241
242 void rtl8821ae_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,
243                                                                                                         struct btdm_8821ae      *p_btdm)
244 {
245         p_btdm->b_all_off = false;
246         p_btdm->b_agc_table_en = false;
247         p_btdm->b_adc_back_off_on = false;
248         p_btdm->b2_ant_hid_en = false;
249         p_btdm->b_low_penalty_rate_adaptive = false;
250         p_btdm->b_rf_rx_lpf_shrink = false;
251         p_btdm->b_reject_aggre_pkt= false;
252
253         p_btdm->b_tdma_on = false;
254         p_btdm->tdma_ant = TDMA_2ANT;
255         p_btdm->tdma_nav = TDMA_NAV_OFF;
256         p_btdm->tdma_dac_swing = TDMA_DAC_SWING_OFF;
257         p_btdm->fw_dac_swing_lvl = 0x20;
258
259         p_btdm->b_tra_tdma_on = false;
260         p_btdm->tra_tdma_ant = TDMA_2ANT;
261         p_btdm->tra_tdma_nav = TDMA_NAV_OFF;
262         p_btdm->b_ignore_wlan_act = false;
263
264         p_btdm->b_ps_tdma_on = false;
265         p_btdm->ps_tdma_byte[0] = 0x0;
266         p_btdm->ps_tdma_byte[1] = 0x0;
267         p_btdm->ps_tdma_byte[2] = 0x0;
268         p_btdm->ps_tdma_byte[3] = 0x8;
269         p_btdm->ps_tdma_byte[4] = 0x0;
270
271         p_btdm->b_pta_on = true;
272         p_btdm->val_0x6c0 = 0x5a5aaaaa;
273         p_btdm->val_0x6c8 = 0xcc;
274         p_btdm->val_0x6cc = 0x3;
275
276         p_btdm->b_sw_dac_swing_on = false;
277         p_btdm->sw_dac_swing_lvl = 0xc0;
278         p_btdm->wlan_act_hi = 0x20;
279         p_btdm->wlan_act_lo = 0x10;
280         p_btdm->bt_retry_index = 2;
281
282         p_btdm->b_dec_bt_pwr = false;
283 }
284
285 void rtl8821ae_dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw,
286                                                                                                         struct btdm_8821ae      *p_btdm)
287 {
288         rtl8821ae_dm_bt_btdm_structure_reload(hw, p_btdm);
289         p_btdm->b_all_off = true;
290         p_btdm->b_pta_on = false;
291         p_btdm->wlan_act_hi = 0x10;
292 }
293
294 bool rtl8821ae_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
295 {
296         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
297         struct rtl_priv *rtlpriv = rtl_priv(hw);
298         struct btdm_8821ae btdm8821ae;
299         bool b_common = false;
300
301         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
302
303         if(!rtl8821ae_dm_bt_is_wifi_busy(hw)
304                 && !rtlpcipriv->btcoexist.b_bt_busy) {
305                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
306                         ("Wifi idle + Bt idle, bt coex mechanism always off!!\n"));
307                 rtl8821ae_dm_bt_btdm_structure_reload_all_off(hw, &btdm8821ae);
308                 b_common = true;
309         } else if (rtl8821ae_dm_bt_is_wifi_busy(hw)
310                 && !rtlpcipriv->btcoexist.b_bt_busy) {
311                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
312                         ("Wifi non-idle + Bt disabled/idle!!\n"));
313                 btdm8821ae.b_low_penalty_rate_adaptive = true;
314                 btdm8821ae.b_rf_rx_lpf_shrink = false;
315                 btdm8821ae.b_reject_aggre_pkt = false;
316
317                 /* sw mechanism */
318                 btdm8821ae.b_agc_table_en = false;
319                 btdm8821ae.b_adc_back_off_on = false;
320                 btdm8821ae.b_sw_dac_swing_on = false;
321
322                 btdm8821ae.b_pta_on = true;
323                 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
324                 btdm8821ae.val_0x6c8 = 0xcccc;
325                 btdm8821ae.val_0x6cc = 0x3;
326
327                 btdm8821ae.b_tdma_on = false;
328                 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
329                 btdm8821ae.b2_ant_hid_en = false;
330
331                 b_common = true;
332         }else if (rtlpcipriv->btcoexist.b_bt_busy) {
333                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
334                         ("Bt non-idle!\n"));
335                 if(mgnt_link_status_query(hw) == RT_MEDIA_CONNECT){
336                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi connection exist\n"))
337                         b_common = false;
338                 } else {
339                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
340                                 ("No Wifi connection!\n"));
341                         btdm8821ae.b_rf_rx_lpf_shrink = true;
342                         btdm8821ae.b_low_penalty_rate_adaptive = false;
343                         btdm8821ae.b_reject_aggre_pkt = false;
344
345                         /* sw mechanism */
346                         btdm8821ae.b_agc_table_en = false;
347                         btdm8821ae.b_adc_back_off_on = false;
348                         btdm8821ae.b_sw_dac_swing_on = false;
349
350                         btdm8821ae.b_pta_on = true;
351                         btdm8821ae.val_0x6c0 = 0x55555555;
352                         btdm8821ae.val_0x6c8 = 0x0000ffff;
353                         btdm8821ae.val_0x6cc = 0x3;
354
355                         btdm8821ae.b_tdma_on = false;
356                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
357                         btdm8821ae.b2_ant_hid_en = false;
358
359                         b_common = true;
360                 }
361         }
362
363         if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
364                 btdm8821ae.b_dec_bt_pwr = true;
365         }
366
367         if(b_common)
368                  rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_COMMON;
369
370         if (b_common && rtl8821ae_dm_bt_is_coexist_state_changed(hw))
371                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
372
373         return b_common;
374 }
375
376 void rtl8821ae_dm_bt_set_sw_full_time_dac_swing(
377                 struct ieee80211_hw * hw, bool b_sw_dac_swing_on, u32 sw_dac_swing_lvl)
378 {
379         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
380         struct rtl_priv *rtlpriv = rtl_priv(hw);
381
382         if (b_sw_dac_swing_on) {
383                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
384                         ("[BTCoex], SwDacSwing = 0x%x\n", sw_dac_swing_lvl));
385                 rtl8821ae_phy_set_bb_reg(hw, 0x880, 0xff000000, sw_dac_swing_lvl);
386                 rtlpcipriv->btcoexist.b_sw_coexist_all_off = false;
387         } else {
388                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], SwDacSwing Off!\n"));
389                 rtl8821ae_phy_set_bb_reg(hw, 0x880, 0xff000000, 0xc0);
390         }
391 }
392
393 void rtl8821ae_dm_bt_set_fw_dec_bt_pwr(
394                 struct ieee80211_hw *hw, bool b_dec_bt_pwr)
395 {
396         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
397         struct rtl_priv *rtlpriv = rtl_priv(hw);
398         u8 h2c_parameter[1] ={0};
399
400         h2c_parameter[0] = 0;
401
402         if (b_dec_bt_pwr) {
403                 h2c_parameter[0] |= BIT(1);
404                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
405         }
406
407         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
408                 ("[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
409                 (b_dec_bt_pwr? "Yes!!":"No!!"), h2c_parameter[0]));
410
411         rtl8821ae_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter);
412 }
413
414
415 void rtl8821ae_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw,
416                                                                         bool b_enable, bool b_dac_swing_on)
417 {
418         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
419         struct rtl_priv *rtlpriv = rtl_priv(hw);
420         u8 h2c_parameter[1] ={0};
421
422         if (b_enable) {
423                 h2c_parameter[0] |= BIT(0);
424                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
425         }
426         if (b_dac_swing_on) {
427                 h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */
428         }
429         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
430                 ("[BTCoex], turn 2-Ant+HID mode %s, DACSwing:%s, write 0x15=0x%x\n",
431                 (b_enable ? "ON!!":"OFF!!"), (b_dac_swing_on ? "ON":"OFF"),
432                 h2c_parameter[0]));
433
434         rtl8821ae_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter);
435 }
436
437 void rtl8821ae_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw,
438                                 bool b_enable, u8 ant_num, u8 nav_en, u8 dac_swing_en)
439 {
440         struct rtl_priv *rtlpriv = rtl_priv(hw);
441         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
442         u8 h2c_parameter[1] ={0};
443         u8 h2c_parameter1[1] = {0};
444
445         h2c_parameter[0] = 0;
446         h2c_parameter1[0] = 0;
447
448         if(b_enable) {
449                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
450                         ("[BTCoex], set BT PTA update manager to trigger update!!\n"));
451                 h2c_parameter1[0] |= BIT(0);
452
453                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
454                         ("[BTCoex], turn TDMA mode ON!!\n"));
455                 h2c_parameter[0] |= BIT(0);             /* function enable */
456                 if (TDMA_1ANT == ant_num) {
457                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TDMA_1ANT\n"));
458                         h2c_parameter[0] |= BIT(1);
459                 } else if(TDMA_2ANT == ant_num) {
460                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TDMA_2ANT\n"));
461                 } else {
462                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], Unknown Ant\n"));
463                 }
464
465                 if (TDMA_NAV_OFF == nav_en) {
466                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TDMA_NAV_OFF\n"));
467                 } else if (TDMA_NAV_ON == nav_en) {
468                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TDMA_NAV_ON\n"));
469                         h2c_parameter[0] |= BIT(2);
470                 }
471
472                 if (TDMA_DAC_SWING_OFF == dac_swing_en) {
473                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
474                                 ("[BTCoex], TDMA_DAC_SWING_OFF\n"));
475                 } else if(TDMA_DAC_SWING_ON == dac_swing_en) {
476                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
477                                 ("[BTCoex], TDMA_DAC_SWING_ON\n"));
478                         h2c_parameter[0] |= BIT(4);
479                 }
480                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
481         } else {
482                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
483                         ("[BTCoex], set BT PTA update manager to no update!!\n"));
484                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
485                         ("[BTCoex], turn TDMA mode OFF!!\n"));
486         }
487
488         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
489                 ("[BTCoex], FW2AntTDMA, write 0x26=0x%x\n", h2c_parameter1[0]));
490         rtl8821ae_fill_h2c_cmd(hw, 0x26, 1, h2c_parameter1);
491
492         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
493                 ("[BTCoex], FW2AntTDMA, write 0x14=0x%x\n", h2c_parameter[0]));
494         rtl8821ae_fill_h2c_cmd(hw, 0x14, 1, h2c_parameter);
495
496         if (!b_enable) {
497                 /* delay_ms(2);
498                  * PlatformEFIOWrite1Byte(Adapter, 0x778, 0x1); */
499         }
500 }
501
502
503 void rtl8821ae_dm_bt_set_fw_ignore_wlan_act( struct ieee80211_hw *hw, bool b_enable)
504 {
505         struct rtl_priv *rtlpriv = rtl_priv(hw);
506         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
507         u8 h2c_parameter[1] ={0};
508
509         if (b_enable) {
510                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], BT Ignore Wlan_Act !!\n"));
511                 h2c_parameter[0] |= BIT(0);             // function enable
512                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
513         } else {
514                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], BT don't ignore Wlan_Act !!\n"));
515         }
516
517     RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%x\n",
518                 h2c_parameter[0]));
519
520         rtl8821ae_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter);
521 }
522
523
524 void rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,
525                 bool b_enable, u8 ant_num, u8 nav_en
526         )
527 {
528         struct rtl_priv *rtlpriv = rtl_priv(hw);
529         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
530         //struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
531
532         u8 h2c_parameter[2] ={0};
533
534
535         if (b_enable) {
536                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
537                         ("[BTCoex], turn TTDMA mode ON!!\n"));
538                 h2c_parameter[0] |= BIT(0);             // function enable
539                 if (TDMA_1ANT == ant_num) {
540                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TTDMA_1ANT\n"));
541                         h2c_parameter[0] |= BIT(1);
542                 } else if (TDMA_2ANT == ant_num) {
543                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TTDMA_2ANT\n"));
544                 } else {
545                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], Unknown Ant\n"));
546                 }
547
548                 if (TDMA_NAV_OFF == nav_en) {
549                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TTDMA_NAV_OFF\n"));
550                 } else if (TDMA_NAV_ON == nav_en) {
551                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], TTDMA_NAV_ON\n"));
552                         h2c_parameter[1] |= BIT(0);
553                 }
554
555                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
556         } else {
557                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
558                         ("[BTCoex], turn TTDMA mode OFF!!\n"));
559         }
560
561         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
562                 ("[BTCoex], FW Traditional TDMA, write 0x33=0x%x\n",
563                 h2c_parameter[0] << 8| h2c_parameter[1]));
564
565         rtl8821ae_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter);
566 }
567
568
569 void rtl8821ae_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw,
570                                                                                                         u8 dac_swing_lvl)
571 {
572         struct rtl_priv *rtlpriv = rtl_priv(hw);
573         u8 h2c_parameter[1] ={0};
574         h2c_parameter[0] = dac_swing_lvl;
575
576         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
577                 ("[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl));
578         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
579                 ("[BTCoex], write 0x29=0x%x\n", h2c_parameter[0]));
580
581         rtl8821ae_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter);
582 }
583
584 void rtl8821ae_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw, bool b_enable)
585 {
586         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
587         struct rtl_priv *rtlpriv = rtl_priv(hw);
588         u8 h2c_parameter[1] ={0};
589         h2c_parameter[0] = 0;
590
591         if(b_enable){
592                 h2c_parameter[0] |= BIT(0);
593                 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
594         }
595         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
596                 ("[BTCoex], Set BT HID information=0x%x\n", b_enable));
597         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
598                 ("[BTCoex], write 0x24=0x%x\n", h2c_parameter[0]));
599
600         rtl8821ae_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter);
601 }
602
603 void rtl8821ae_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw,
604                                                                                                         u8 retry_index)
605 {
606         struct rtl_priv *rtlpriv = rtl_priv(hw);
607         u8 h2c_parameter[1] ={0};
608         h2c_parameter[0] = retry_index;
609
610         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
611                 ("[BTCoex], Set BT Retry Index=%d\n", retry_index));
612         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
613                 ("[BTCoex], write 0x23=0x%x\n", h2c_parameter[0]));
614
615         rtl8821ae_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter);
616 }
617
618 void rtl8821ae_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw,
619                                                                                         u8 wlan_act_hi, u8 wlan_act_lo)
620 {
621         struct rtl_priv *rtlpriv = rtl_priv(hw);
622         u8 h2c_parameter_hi[1] ={0};
623         u8 h2c_parameter_lo[1] ={0};
624         h2c_parameter_hi[0] = wlan_act_hi;
625         h2c_parameter_lo[0] = wlan_act_lo;
626
627         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
628                 ("[BTCoex], Set WLAN_ACT Hi:Lo=0x%x/0x%x\n", wlan_act_hi, wlan_act_lo));
629         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
630                 ("[BTCoex], write 0x22=0x%x\n", h2c_parameter_hi[0]));
631         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
632                 ("[BTCoex], write 0x11=0x%x\n", h2c_parameter_lo[0]));
633
634         /* WLAN_ACT = High duration, unit:ms */
635         rtl8821ae_fill_h2c_cmd(hw, 0x22, 1, h2c_parameter_hi);
636         /*  WLAN_ACT = Low duration, unit:3*625us */
637         rtl8821ae_fill_h2c_cmd(hw, 0x11, 1, h2c_parameter_lo);
638 }
639
640 void rtl8821ae_dm_bt_set_bt_dm(struct ieee80211_hw *hw, struct btdm_8821ae *p_btdm)
641 {
642         struct rtl_pci_priv     *rtlpcipriv = rtl_pcipriv(hw);
643         struct rtl_priv *rtlpriv = rtl_priv(hw);
644         struct btdm_8821ae *p_btdm_8821ae = &hal_coex_8821ae.btdm;
645         u8 i;
646
647         bool b_fw_current_inpsmode = false;
648     bool b_fw_ps_awake = true;
649
650     rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
651                                               (u8 *) (&b_fw_current_inpsmode));
652     rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
653                                               (u8 *) (&b_fw_ps_awake));
654
655         // check new setting is different with the old one,
656         // if all the same, don't do the setting again.
657         if (memcmp(p_btdm_8821ae, p_btdm, sizeof(struct btdm_8821ae)) == 0) {
658                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
659                         ("[BTCoex], the same coexist setting, return!!\n"));
660                 return;
661         } else {        //save the new coexist setting
662                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
663                         ("[BTCoex], UPDATE TO NEW COEX SETTING!!\n"));
664                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
665                         ("[BTCoex], original/new bAllOff=0x%x/ 0x%x \n",
666                         p_btdm_8821ae->b_all_off, p_btdm->b_all_off));
667                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
668                         ("[BTCoex], original/new b_agc_table_en=0x%x/ 0x%x \n",
669                         p_btdm_8821ae->b_agc_table_en, p_btdm->b_agc_table_en));
670                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
671                         ("[BTCoex], original/new b_adc_back_off_on=0x%x/ 0x%x \n",
672                         p_btdm_8821ae->b_adc_back_off_on, p_btdm->b_adc_back_off_on));
673                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
674                         ("[BTCoex], original/new b2_ant_hid_en=0x%x/ 0x%x \n",
675                         p_btdm_8821ae->b2_ant_hid_en, p_btdm->b2_ant_hid_en));
676                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
677                         ("[BTCoex], original/new bLowPenaltyRateAdaptive=0x%x/ 0x%x \n",
678                         p_btdm_8821ae->b_low_penalty_rate_adaptive,
679                         p_btdm->b_low_penalty_rate_adaptive));
680                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
681                         ("[BTCoex], original/new bRfRxLpfShrink=0x%x/ 0x%x \n",
682                         p_btdm_8821ae->b_rf_rx_lpf_shrink, p_btdm->b_rf_rx_lpf_shrink));
683                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
684                         ("[BTCoex], original/new bRejectAggrePkt=0x%x/ 0x%x \n",
685                         p_btdm_8821ae->b_reject_aggre_pkt, p_btdm->b_reject_aggre_pkt));
686                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
687                         ("[BTCoex], original/new b_tdma_on=0x%x/ 0x%x \n",
688                         p_btdm_8821ae->b_tdma_on, p_btdm->b_tdma_on));
689                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
690                         ("[BTCoex], original/new tdmaAnt=0x%x/ 0x%x \n",
691                         p_btdm_8821ae->tdma_ant, p_btdm->tdma_ant));
692                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
693                         ("[BTCoex], original/new tdmaNav=0x%x/ 0x%x \n",
694                         p_btdm_8821ae->tdma_nav, p_btdm->tdma_nav));
695                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
696                         ("[BTCoex], original/new tdma_dac_swing=0x%x/ 0x%x \n",
697                         p_btdm_8821ae->tdma_dac_swing, p_btdm->tdma_dac_swing));
698                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
699                         ("[BTCoex], original/new fw_dac_swing_lvl=0x%x/ 0x%x \n",
700                         p_btdm_8821ae->fw_dac_swing_lvl, p_btdm->fw_dac_swing_lvl));
701
702                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
703                         ("[BTCoex], original/new bTraTdmaOn=0x%x/ 0x%x \n",
704                         p_btdm_8821ae->b_tra_tdma_on, p_btdm->b_tra_tdma_on));
705                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
706                         ("[BTCoex], original/new traTdmaAnt=0x%x/ 0x%x \n",
707                         p_btdm_8821ae->tra_tdma_ant, p_btdm->tra_tdma_ant));
708                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
709                         ("[BTCoex], original/new traTdmaNav=0x%x/ 0x%x \n",
710                         p_btdm_8821ae->tra_tdma_nav, p_btdm->tra_tdma_nav));
711                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
712                         ("[BTCoex], original/new bPsTdmaOn=0x%x/ 0x%x \n",
713                         p_btdm_8821ae->b_ps_tdma_on, p_btdm->b_ps_tdma_on));
714                 for(i=0; i<5; i++)
715                 {
716                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
717                                 ("[BTCoex], original/new psTdmaByte[i]=0x%x/ 0x%x \n",
718                                 p_btdm_8821ae->ps_tdma_byte[i], p_btdm->ps_tdma_byte[i]));
719                 }
720                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
721                         ("[BTCoex], original/new bIgnoreWlanAct=0x%x/ 0x%x \n",
722                         p_btdm_8821ae->b_ignore_wlan_act, p_btdm->b_ignore_wlan_act));
723
724
725                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
726                         ("[BTCoex], original/new bPtaOn=0x%x/ 0x%x \n",
727                         p_btdm_8821ae->b_pta_on, p_btdm->b_pta_on));
728                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
729                         ("[BTCoex], original/new val_0x6c0=0x%x/ 0x%x \n",
730                         p_btdm_8821ae->val_0x6c0, p_btdm->val_0x6c0));
731                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
732                         ("[BTCoex], original/new val_0x6c8=0x%x/ 0x%x \n",
733                         p_btdm_8821ae->val_0x6c8, p_btdm->val_0x6c8));
734                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
735                         ("[BTCoex], original/new val_0x6cc=0x%x/ 0x%x \n",
736                         p_btdm_8821ae->val_0x6cc, p_btdm->val_0x6cc));
737                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
738                         ("[BTCoex], original/new b_sw_dac_swing_on=0x%x/ 0x%x \n",
739                         p_btdm_8821ae->b_sw_dac_swing_on, p_btdm->b_sw_dac_swing_on));
740                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
741                         ("[BTCoex], original/new sw_dac_swing_lvl=0x%x/ 0x%x \n",
742                         p_btdm_8821ae->sw_dac_swing_lvl, p_btdm->sw_dac_swing_lvl));
743                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
744                         ("[BTCoex], original/new wlanActHi=0x%x/ 0x%x \n",
745                         p_btdm_8821ae->wlan_act_hi, p_btdm->wlan_act_hi));
746                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
747                         ("[BTCoex], original/new wlanActLo=0x%x/ 0x%x \n",
748                         p_btdm_8821ae->wlan_act_lo, p_btdm->wlan_act_lo));
749                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
750                         ("[BTCoex], original/new btRetryIndex=0x%x/ 0x%x \n",
751                         p_btdm_8821ae->bt_retry_index, p_btdm->bt_retry_index));
752
753                 memcpy(p_btdm_8821ae, p_btdm, sizeof(struct btdm_8821ae));
754         }
755         /*
756          * Here we only consider when Bt Operation
757          * inquiry/paging/pairing is ON
758          * we only need to turn off TDMA */
759
760         if (rtlpcipriv->btcoexist.b_hold_for_bt_operation) {
761                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
762                         ("[BTCoex], set to ignore wlanAct for BT OP!!\n"));
763                 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, true);
764                 return;
765         }
766
767         if (p_btdm->b_all_off) {
768                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
769                         ("[BTCoex], disable all coexist mechanism !!\n"));
770                 rtl8821ae_btdm_coex_all_off(hw);
771                 return;
772         }
773
774         rtl8821ae_dm_bt_reject_ap_aggregated_packet(hw, p_btdm->b_reject_aggre_pkt);
775
776         if(p_btdm->b_low_penalty_rate_adaptive)
777                 rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(hw,
778                         BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
779         else
780                 rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(hw,
781                         BT_TX_RATE_ADAPTIVE_NORMAL);
782
783         if(p_btdm->b_rf_rx_lpf_shrink)
784                 rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_SHRINK);
785         else
786                 rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
787
788         if(p_btdm->b_agc_table_en)
789                 rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_ON);
790         else
791                 rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
792
793         if(p_btdm->b_adc_back_off_on)
794                 rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_ON);
795         else
796                 rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
797
798         rtl8821ae_dm_bt_set_fw_bt_retry_index(hw, p_btdm->bt_retry_index);
799
800         rtl8821ae_dm_bt_set_fw_dac_swing_level(hw, p_btdm->fw_dac_swing_lvl);
801         rtl8821ae_dm_bt_set_fw_wlan_act(hw, p_btdm->wlan_act_hi, p_btdm->wlan_act_lo);
802
803         rtl8821ae_dm_bt_set_coex_table(hw, p_btdm->val_0x6c0,
804                 p_btdm->val_0x6c8, p_btdm->val_0x6cc);
805         rtl8821ae_dm_bt_set_hw_pta_mode(hw, p_btdm->b_pta_on);
806
807         /*
808          * Note: There is a constraint between TDMA and 2AntHID
809          * Only one of 2AntHid and tdma can be turn on
810          * We should turn off those mechanisms should be turned off first
811          * and then turn on those mechanisms should be turned on.
812         */
813 #if 1
814         if(p_btdm->b2_ant_hid_en) {
815                 // turn off tdma
816                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on,
817                                                         p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
818                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, p_btdm->tdma_ant,
819                                                         p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
820
821                 // turn off Pstdma
822                 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, p_btdm->b_ignore_wlan_act);
823                 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);         // Antenna control by PTA, 0x870 = 0x300.
824
825                 // turn on 2AntHid
826                 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, true);
827                 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, true, true);
828         } else if(p_btdm->b_tdma_on) {
829                 // turn off 2AntHid
830                 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
831                 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
832
833                 // turn off pstdma
834                 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, p_btdm->b_ignore_wlan_act);
835                 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);         // Antenna control by PTA, 0x870 = 0x300.
836
837                 // turn on tdma
838                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on, p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
839                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, true, p_btdm->tdma_ant, p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
840         } else if(p_btdm->b_ps_tdma_on) {
841                 // turn off 2AntHid
842                 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
843                 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
844
845                 // turn off tdma
846                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on, p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
847                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, p_btdm->tdma_ant, p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
848
849                 // turn on pstdma
850                 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, p_btdm->b_ignore_wlan_act);
851                 rtl8821ae_dm_bt_set_fw_3a(hw,
852                         p_btdm->ps_tdma_byte[0],
853                         p_btdm->ps_tdma_byte[1],
854                         p_btdm->ps_tdma_byte[2],
855                         p_btdm->ps_tdma_byte[3],
856                         p_btdm->ps_tdma_byte[4]);
857         } else {
858                 // turn off 2AntHid
859                 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
860                 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
861
862                 // turn off tdma
863                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on, p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
864                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, p_btdm->tdma_ant, p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
865
866                 // turn off pstdma
867                 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, p_btdm->b_ignore_wlan_act);
868                 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);         // Antenna control by PTA, 0x870 = 0x300.
869         }
870 #else
871         if (p_btdm->b_tdma_on) {
872                 if(p_btdm->b_ps_tdma_on) {
873                 } else {
874                         rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
875                 }
876                 /* Turn off 2AntHID first then turn tdma ON */
877                 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
878                 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
879                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on, p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
880                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, true,
881                         p_btdm->tdma_ant, p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
882         } else {
883                 /* Turn off tdma first then turn 2AntHID ON if need */
884                 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, p_btdm->b_tra_tdma_on, p_btdm->tra_tdma_ant, p_btdm->tra_tdma_nav);
885                 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, p_btdm->tdma_ant,
886                         p_btdm->tdma_nav, p_btdm->tdma_dac_swing);
887                 if (p_btdm->b2_ant_hid_en) {
888                         rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, true);
889                         rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, true, true);
890                 } else {
891                         rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
892                         rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
893                 }
894                 if(p_btdm->b_ps_tdma_on) {
895                         rtl8821ae_dm_bt_set_fw_3a(hw, p_btdm->ps_tdma_byte[0], p_btdm->ps_tdma_byte[1],
896                                 p_btdm->ps_tdma_byte[2], p_btdm->ps_tdma_byte[3], p_btdm->ps_tdma_byte[4]);
897                 } else {
898                         rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
899                 }
900         }
901 #endif
902
903         /*
904          * Note:
905          * We should add delay for making sure sw DacSwing can be set successfully.
906          * because of that rtl8821ae_dm_bt_set_fw_2_ant_hid() and rtl8821ae_dm_bt_set_fw_tdma_ctrl()
907          * will overwrite the reg 0x880.
908         */
909         mdelay(30);
910         rtl8821ae_dm_bt_set_sw_full_time_dac_swing(hw,
911                 p_btdm->b_sw_dac_swing_on, p_btdm->sw_dac_swing_lvl);
912         rtl8821ae_dm_bt_set_fw_dec_bt_pwr(hw, p_btdm->b_dec_bt_pwr);
913 }
914
915 void rtl8821ae_dm_bt_bt_state_update_2_ant_hid(struct ieee80211_hw *hw)
916 {
917         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
918         struct rtl_priv *rtlpriv = rtl_priv(hw);
919
920         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], HID busy!!\n"));
921         rtlpcipriv->btcoexist.b_bt_busy = true;
922         rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_BT_IDLE;
923 }
924
925 void rtl8821ae_dm_bt_bt_state_update_2_ant_pan(struct ieee80211_hw *hw)
926 {
927         struct rtl_priv *rtlpriv = rtl_priv(hw);
928         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
929         bool b_idle = false;
930
931         if (hal_coex_8821ae.low_priority_tx >=
932                 hal_coex_8821ae.low_priority_rx) {
933                 if((hal_coex_8821ae.low_priority_tx/
934                         hal_coex_8821ae.low_priority_rx) > 10) {
935                         b_idle = true;
936                 }
937         } else {
938                 if((hal_coex_8821ae.low_priority_rx/
939                         hal_coex_8821ae.low_priority_tx) > 10) {
940                         b_idle = true;
941                 }
942         }
943
944         if(!b_idle) {
945                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], PAN busy!!\n"));
946                 rtlpcipriv->btcoexist.b_bt_busy = true;
947                 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_BT_IDLE;
948         } else {
949                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], PAN idle!!\n"));
950         }
951 }
952
953 void rtl8821ae_dm_bt_2_ant_sco_action(struct ieee80211_hw *hw)
954 {
955         struct rtl_priv *rtlpriv = rtl_priv(hw);
956         struct rtl_phy *rtlphy = &(rtlpriv->phy);
957         struct btdm_8821ae btdm8821ae;
958         u8 bt_rssi_state;
959
960         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
961         btdm8821ae.b_rf_rx_lpf_shrink = true;
962         btdm8821ae.b_low_penalty_rate_adaptive = true;
963         btdm8821ae.b_reject_aggre_pkt = false;
964
965         if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
966                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
967                 /*  coex table */
968                 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
969                 btdm8821ae.val_0x6c8 = 0xcc;
970                 btdm8821ae.val_0x6cc = 0x3;
971                 /* sw mechanism */
972                 btdm8821ae.b_agc_table_en = false;
973                 btdm8821ae.b_adc_back_off_on = true;
974                 btdm8821ae.b_sw_dac_swing_on = false;
975                 /* fw mechanism */
976                 btdm8821ae.b_tdma_on = false;
977                 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
978         } else {
979                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
980                 bt_rssi_state
981                         = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, BT_FW_COEX_THRESH_47, 0);
982
983                 /* coex table */
984                 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
985                 btdm8821ae.val_0x6c8 = 0xcc;
986                 btdm8821ae.val_0x6cc = 0x3;
987                 /* sw mechanism */
988                 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||
989                         (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) ) {
990                         btdm8821ae.b_agc_table_en = true;
991                         btdm8821ae.b_adc_back_off_on = true;
992                         btdm8821ae.b_sw_dac_swing_on = false;
993                 } else {
994                         btdm8821ae.b_agc_table_en = false;
995                         btdm8821ae.b_adc_back_off_on = false;
996                         btdm8821ae.b_sw_dac_swing_on = false;
997                 }
998                 /* fw mechanism */
999                 btdm8821ae.b_tdma_on = false;
1000                 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
1001         }
1002
1003         if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1004                 btdm8821ae.b_dec_bt_pwr = true;
1005         }
1006
1007         if(rtl8821ae_dm_bt_is_coexist_state_changed(hw))
1008                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1009 }
1010
1011 void rtl8821ae_dm_bt_2_ant_hid_action(struct ieee80211_hw *hw)
1012 {
1013         struct rtl_priv *rtlpriv = rtl_priv(hw);
1014         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1015         struct btdm_8821ae btdm8821ae;
1016         u8 bt_rssi_state;
1017
1018         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1019
1020         btdm8821ae.b_rf_rx_lpf_shrink = true;
1021         btdm8821ae.b_low_penalty_rate_adaptive = true;
1022         btdm8821ae.b_reject_aggre_pkt = false;
1023
1024         // coex table
1025         btdm8821ae.val_0x6c0 = 0x55555555;
1026         btdm8821ae.val_0x6c8 = 0xffff;
1027         btdm8821ae.val_0x6cc = 0x3;
1028         btdm8821ae.b_ignore_wlan_act = true;
1029
1030         if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
1031                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
1032                 // sw mechanism
1033                 btdm8821ae.b_agc_table_en = false;
1034                 btdm8821ae.b_adc_back_off_on = false;
1035                 btdm8821ae.b_sw_dac_swing_on = false;
1036
1037                 // fw mechanism
1038                 btdm8821ae.b_ps_tdma_on = true;
1039                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1040                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1041                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1042                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1043                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1044
1045                 btdm8821ae.b_tra_tdma_on = false;
1046                 btdm8821ae.b_tdma_on = false;
1047                 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
1048                 btdm8821ae.b2_ant_hid_en = false;
1049         } else {
1050                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
1051                 bt_rssi_state =
1052                         rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
1053
1054                 if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1055                         (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) ) {
1056                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi high \n"));
1057                         // sw mechanism
1058                         btdm8821ae.b_agc_table_en = false;
1059                         btdm8821ae.b_adc_back_off_on = false;
1060                         btdm8821ae.b_sw_dac_swing_on = true;
1061                         btdm8821ae.sw_dac_swing_lvl = 0x20;
1062
1063                         // fw mechanism
1064                         btdm8821ae.b_ps_tdma_on = false;
1065                         btdm8821ae.b_tdma_on = false;
1066                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
1067                         btdm8821ae.b2_ant_hid_en = false;
1068                 } else {
1069                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi low \n"));
1070                         // sw mechanism
1071                         btdm8821ae.b_agc_table_en = false;
1072                         btdm8821ae.b_adc_back_off_on = false;
1073                         btdm8821ae.b_sw_dac_swing_on = false;
1074
1075                         // fw mechanism
1076                         btdm8821ae.b_ps_tdma_on = false;
1077                         btdm8821ae.b_tdma_on = false;
1078                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
1079                         btdm8821ae.b2_ant_hid_en = true;
1080                         btdm8821ae.fw_dac_swing_lvl = 0x20;
1081                 }
1082         }
1083
1084         if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1085                 btdm8821ae.b_dec_bt_pwr = true;
1086         }
1087
1088         if (rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1089                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1090         }
1091 }
1092
1093
1094 void rtl8821ae_dm_bt_2_ant_2_dp_action_no_profile(struct ieee80211_hw *hw)
1095 {
1096         struct rtl_priv *rtlpriv = rtl_priv(hw);
1097         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1098         struct btdm_8821ae btdm8821ae;
1099         u8 bt_rssi_state;
1100
1101         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1102
1103         btdm8821ae.b_rf_rx_lpf_shrink = true;
1104         btdm8821ae.b_low_penalty_rate_adaptive = true;
1105         btdm8821ae.b_reject_aggre_pkt = false;
1106
1107         if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
1108                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("HT40\n"));
1109                 if (rtl8821ae_dm_bt_is_wifi_up_link(hw)) {
1110                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Uplink\n"));
1111                         /* coex table */
1112                         btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1113                         btdm8821ae.val_0x6c8 = 0xcccc;
1114                         btdm8821ae.val_0x6cc = 0x3;
1115                         // sw mechanism
1116                         btdm8821ae.b_agc_table_en = false;
1117                         btdm8821ae.b_adc_back_off_on = true;
1118                         btdm8821ae.b_sw_dac_swing_on = false;
1119                         // fw mechanism
1120                         btdm8821ae.b_tra_tdma_on = true;
1121                         btdm8821ae.b_tdma_on = true;
1122                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_ON;
1123                         btdm8821ae.b2_ant_hid_en = false;
1124                         //btSpec = BTHCI_GetBTCoreSpecByProf(Adapter, BT_PROFILE_A2DP);
1125                         //if(btSpec >= BT_SPEC_2_1_EDR)
1126                         {
1127                                 btdm8821ae.wlan_act_hi = 0x10;
1128                                 btdm8821ae.wlan_act_lo = 0x10;
1129                         }
1130                         //else
1131                         //{
1132                                 //btdm8821ae.wlanActHi = 0x20;
1133                                 //btdm8821ae.wlanActLo = 0x20;
1134                         //}
1135                         btdm8821ae.bt_retry_index = 2;
1136                         btdm8821ae.fw_dac_swing_lvl = 0x18;
1137                 } else {
1138                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Downlink\n"));
1139                         // coex table
1140                         btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1141                         btdm8821ae.val_0x6c8 = 0xcc;
1142                         btdm8821ae.val_0x6cc = 0x3;
1143                         // sw mechanism
1144                         btdm8821ae.b_agc_table_en = false;
1145                         btdm8821ae.b_adc_back_off_on = true;
1146                         btdm8821ae.b_sw_dac_swing_on = false;
1147                         // fw mechanism
1148                         btdm8821ae.b_tra_tdma_on = true;
1149                         btdm8821ae.b_tdma_on = true;
1150                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_ON;
1151                         btdm8821ae.b2_ant_hid_en = false;
1152                         //btSpec = BTHCI_GetBTCoreSpecByProf(Adapter, BT_PROFILE_A2DP);
1153                         //if(btSpec >= BT_SPEC_2_1_EDR)
1154                         {
1155                                 btdm8821ae.wlan_act_hi = 0x10;
1156                                 btdm8821ae.wlan_act_lo = 0x10;
1157                         }
1158                         //else
1159                         //{
1160                         //      btdm8821ae.wlanActHi = 0x20;
1161                         //      btdm8821ae.wlanActLo = 0x20;
1162                         //}
1163                         btdm8821ae.bt_retry_index = 2;
1164                         btdm8821ae.fw_dac_swing_lvl = 0x40;
1165                 }
1166         } else {
1167                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("HT20 or Legacy\n"));
1168                 bt_rssi_state = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, BT_FW_COEX_THRESH_47, 0);
1169
1170                 if(rtl8821ae_dm_bt_is_wifi_up_link(hw))
1171                 {
1172                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Uplink\n"));
1173                         // coex table
1174                         btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1175                         btdm8821ae.val_0x6c8 = 0xcccc;
1176                         btdm8821ae.val_0x6cc = 0x3;
1177                         // sw mechanism
1178                         if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1179                                 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) )
1180                         {
1181                                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi rssi high \n"));
1182                                 btdm8821ae.b_agc_table_en = true;
1183                                 btdm8821ae.b_adc_back_off_on = true;
1184                                 btdm8821ae.b_sw_dac_swing_on = false;
1185                         } else {
1186                                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi rssi low \n"));
1187                                 btdm8821ae.b_agc_table_en = false;
1188                                 btdm8821ae.b_adc_back_off_on = false;
1189                                 btdm8821ae.b_sw_dac_swing_on = false;
1190                         }
1191                         // fw mechanism
1192                         btdm8821ae.b_tra_tdma_on = true;
1193                         btdm8821ae.b_tdma_on = true;
1194                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_ON;
1195                         btdm8821ae.b2_ant_hid_en = false;
1196                         //btSpec = BTHCI_GetBTCoreSpecByProf(Adapter, BT_PROFILE_A2DP);
1197                         //if(btSpec >= BT_SPEC_2_1_EDR)
1198                         {
1199                                 btdm8821ae.wlan_act_hi = 0x10;
1200                                 btdm8821ae.wlan_act_lo = 0x10;
1201                         }
1202                         //else
1203                         //{
1204                                 //btdm8821ae.wlanActHi = 0x20;
1205                                 //btdm8821ae.wlanActLo = 0x20;
1206                         //}
1207                         btdm8821ae.bt_retry_index = 2;
1208                         btdm8821ae.fw_dac_swing_lvl = 0x18;
1209                 }
1210                 else
1211                 {
1212                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Downlink\n"));
1213                         // coex table
1214                         btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1215                         btdm8821ae.val_0x6c8 = 0xcc;
1216                         btdm8821ae.val_0x6cc = 0x3;
1217                         // sw mechanism
1218                         if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1219                                 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) )
1220                         {
1221                                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi rssi high \n"));
1222                                 btdm8821ae.b_agc_table_en = true;
1223                                 btdm8821ae.b_adc_back_off_on = true;
1224                                 btdm8821ae.b_sw_dac_swing_on = false;
1225                         }
1226                         else
1227                         {
1228                                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi rssi low \n"));
1229                                 btdm8821ae.b_agc_table_en = false;
1230                                 btdm8821ae.b_adc_back_off_on = false;
1231                                 btdm8821ae.b_sw_dac_swing_on = false;
1232                         }
1233                         // fw mechanism
1234                         btdm8821ae.b_tra_tdma_on = true;
1235                         btdm8821ae.b_tdma_on = true;
1236                         btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_ON;
1237                         btdm8821ae.b2_ant_hid_en = false;
1238                         //btSpec = BTHCI_GetBTCoreSpecByProf(Adapter, BT_PROFILE_A2DP);
1239                         //if(btSpec >= BT_SPEC_2_1_EDR)
1240                         {
1241                                 btdm8821ae.wlan_act_hi = 0x10;
1242                                 btdm8821ae.wlan_act_lo = 0x10;
1243                         }
1244                         //else
1245                         //{
1246                                 //btdm8821ae.wlanActHi = 0x20;
1247                                 //btdm8821ae.wlanActLo = 0x20;
1248                         //}
1249                         btdm8821ae.bt_retry_index = 2;
1250                         btdm8821ae.fw_dac_swing_lvl = 0x40;
1251                 }
1252         }
1253
1254         if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1255                 btdm8821ae.b_dec_bt_pwr = true;
1256         }
1257
1258         if (rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1259                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1260         }
1261 }
1262
1263
1264 //============================================================
1265 // extern function start with BTDM_
1266 //============================================================
1267 u32 rtl8821ae_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw)
1268 {
1269         u32     counters=0;
1270
1271         counters = hal_coex_8821ae.high_priority_tx + hal_coex_8821ae.high_priority_rx ;
1272         return counters;
1273 }
1274
1275 u32 rtl8821ae_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw)
1276 {
1277         u32 counters=0;
1278
1279         counters = hal_coex_8821ae.low_priority_tx + hal_coex_8821ae.low_priority_rx ;
1280         return counters;
1281 }
1282
1283 u8 rtl8821ae_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw)
1284 {
1285         struct rtl_priv *rtlpriv = rtl_priv(hw);
1286         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1287         u32     bt_tx_rx_cnt = 0;
1288         u8      bt_tx_rx_cnt_lvl = 0;
1289
1290         bt_tx_rx_cnt = rtl8821ae_dm_bt_tx_rx_couter_h(hw)
1291                                 + rtl8821ae_dm_bt_tx_rx_couter_l(hw);
1292         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1293                 ("[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt));
1294
1295         rtlpcipriv->btcoexist.current_state_h &= ~\
1296                  (BT_COEX_STATE_BT_CNT_LEVEL_0 | BT_COEX_STATE_BT_CNT_LEVEL_1|
1297                   BT_COEX_STATE_BT_CNT_LEVEL_2);
1298
1299         if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_3) {
1300                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1301                         ("[BTCoex], BT TxRx Counters at level 3\n"));
1302                 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_3;
1303                 rtlpcipriv->btcoexist.current_state_h |= BT_COEX_STATE_BT_CNT_LEVEL_3;
1304         } else if(bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_2) {
1305                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1306                         ("[BTCoex], BT TxRx Counters at level 2\n"));
1307                 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_2;
1308                 rtlpcipriv->btcoexist.current_state_h |= BT_COEX_STATE_BT_CNT_LEVEL_2;
1309         } else if(bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_1) {
1310                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1311                         ("[BTCoex], BT TxRx Counters at level 1\n"));
1312                 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_1;
1313                 rtlpcipriv->btcoexist.current_state_h  |= BT_COEX_STATE_BT_CNT_LEVEL_1;
1314         } else {
1315                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1316                         ("[BTCoex], BT TxRx Counters at level 0\n"));
1317                 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_0;
1318                 rtlpcipriv->btcoexist.current_state_h |= BT_COEX_STATE_BT_CNT_LEVEL_0;
1319         }
1320         return bt_tx_rx_cnt_lvl;
1321 }
1322
1323
1324 void rtl8821ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1325 {
1326         struct rtl_priv *rtlpriv = rtl_priv(hw);
1327         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1328         struct btdm_8821ae btdm8821ae;
1329
1330         u8 bt_rssi_state, bt_rssi_state1;
1331         u8      bt_tx_rx_cnt_lvl = 0;
1332
1333         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1334
1335
1336         btdm8821ae.b_rf_rx_lpf_shrink = true;
1337         btdm8821ae.b_low_penalty_rate_adaptive = true;
1338         btdm8821ae.b_reject_aggre_pkt = false;
1339
1340         bt_tx_rx_cnt_lvl = rtl8821ae_dm_bt_bt_tx_rx_counter_level(hw);
1341         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl));
1342
1343         if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
1344         {
1345                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
1346                 // coex table
1347                 btdm8821ae.val_0x6c0 = 0x55555555;
1348                 btdm8821ae.val_0x6c8 = 0xffff;
1349                 btdm8821ae.val_0x6cc = 0x3;
1350
1351                 // sw mechanism
1352                 btdm8821ae.b_agc_table_en = false;
1353                 btdm8821ae.b_adc_back_off_on = false;
1354                 btdm8821ae.b_sw_dac_swing_on = false;
1355
1356                 // fw mechanism
1357                 btdm8821ae.b_ps_tdma_on = true;
1358                 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1359                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1360                         btdm8821ae.ps_tdma_byte[0] = 0xa3;
1361                         btdm8821ae.ps_tdma_byte[1] = 0x5;
1362                         btdm8821ae.ps_tdma_byte[2] = 0x5;
1363                         btdm8821ae.ps_tdma_byte[3] = 0x2;
1364                         btdm8821ae.ps_tdma_byte[4] = 0x80;
1365                 } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1366                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1367                         btdm8821ae.ps_tdma_byte[0] = 0xa3;
1368                         btdm8821ae.ps_tdma_byte[1] = 0xa;
1369                         btdm8821ae.ps_tdma_byte[2] = 0xa;
1370                         btdm8821ae.ps_tdma_byte[3] = 0x2;
1371                         btdm8821ae.ps_tdma_byte[4] = 0x80;
1372                 } else {
1373                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1374                         btdm8821ae.ps_tdma_byte[0] = 0xa3;
1375                         btdm8821ae.ps_tdma_byte[1] = 0xf;
1376                         btdm8821ae.ps_tdma_byte[2] = 0xf;
1377                         btdm8821ae.ps_tdma_byte[3] = 0x2;
1378                         btdm8821ae.ps_tdma_byte[4] = 0x80;
1379                 }
1380         } else {
1381                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
1382                 bt_rssi_state = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
1383                 bt_rssi_state1 = rtl8821ae_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);
1384
1385                 // coex table
1386                 btdm8821ae.val_0x6c0 = 0x55555555;
1387                 btdm8821ae.val_0x6c8 = 0xffff;
1388                 btdm8821ae.val_0x6cc = 0x3;
1389
1390                 // sw mechanism
1391                 if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1392                         (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) ) {
1393                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi high \n"));
1394                         btdm8821ae.b_agc_table_en = true;
1395                         btdm8821ae.b_adc_back_off_on = true;
1396                         btdm8821ae.b_sw_dac_swing_on = false;
1397                 } else {
1398                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi low \n"));
1399                         btdm8821ae.b_agc_table_en = false;
1400                         btdm8821ae.b_adc_back_off_on = false;
1401                         btdm8821ae.b_sw_dac_swing_on = false;
1402                 }
1403
1404                 // fw mechanism
1405                 btdm8821ae.b_ps_tdma_on = true;
1406                 if( (bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||
1407                         (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH) ) {
1408                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,("Wifi rssi-1 high \n"));
1409                         // only rssi high we need to do this,
1410                         // when rssi low, the value will modified by fw
1411                         rtl_write_byte(rtlpriv, 0x883, 0x40);
1412                         if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1413                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1414                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1415                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1416                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1417                                 btdm8821ae.ps_tdma_byte[3] = 0x83;
1418                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1419                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1420                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1421                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1422                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1423                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1424                                 btdm8821ae.ps_tdma_byte[3] = 0x83;
1425                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1426                         } else {
1427                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1428                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1429                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1430                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1431                                 btdm8821ae.ps_tdma_byte[3] = 0x83;
1432                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1433                         }
1434                 } else {
1435                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi-1 low \n"));
1436                         if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2)
1437                         {
1438                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1439                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1440                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1441                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1442                                 btdm8821ae.ps_tdma_byte[3] = 0x2;
1443                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1444                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1445                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1446                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1447                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1448                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1449                                 btdm8821ae.ps_tdma_byte[3] = 0x2;
1450                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1451                         } else {
1452                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1453                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1454                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1455                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1456                                 btdm8821ae.ps_tdma_byte[3] = 0x2;
1457                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1458                         }
1459                 }
1460         }
1461
1462         if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1463                 btdm8821ae.b_dec_bt_pwr = true;
1464         }
1465
1466         // Always ignore WlanAct if bHid|bSCOBusy|bSCOeSCO
1467
1468         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1469                 ("[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n",
1470                 hal_coex_8821ae.bt_inq_page_start_time, bt_tx_rx_cnt_lvl));
1471         if( (hal_coex_8821ae.bt_inq_page_start_time) ||
1472                 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl) ) {
1473                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1474                         ("[BTCoex], Set BT inquiry / page scan 0x3a setting\n"));
1475                 btdm8821ae.b_ps_tdma_on = true;
1476                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1477                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1478                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1479                 btdm8821ae.ps_tdma_byte[3] = 0x2;
1480                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1481         }
1482
1483         if(rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1484                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1485         }
1486 }
1487
1488 void rtl8821ae_dm_bt_2_ant_ftp_a2dp(struct ieee80211_hw *hw)
1489 {
1490         struct rtl_priv *rtlpriv = rtl_priv(hw);
1491         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1492         struct btdm_8821ae btdm8821ae;
1493
1494         u8 bt_rssi_state, bt_rssi_state1;
1495         u32 bt_tx_rx_cnt_lvl = 0;
1496
1497         rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1498
1499         btdm8821ae.b_rf_rx_lpf_shrink = true;
1500         btdm8821ae.b_low_penalty_rate_adaptive = true;
1501         btdm8821ae.b_reject_aggre_pkt = false;
1502
1503         bt_tx_rx_cnt_lvl = rtl8821ae_dm_bt_bt_tx_rx_counter_level(hw);
1504
1505         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl));
1506
1507         if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
1508         {
1509                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
1510                 bt_rssi_state = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, 37, 0);
1511
1512                 // coex table
1513                 btdm8821ae.val_0x6c0 = 0x55555555;
1514                 btdm8821ae.val_0x6c8 = 0xffff;
1515                 btdm8821ae.val_0x6cc = 0x3;
1516
1517                 // sw mechanism
1518                 btdm8821ae.b_agc_table_en = false;
1519                 btdm8821ae.b_adc_back_off_on = true;
1520                 btdm8821ae.b_sw_dac_swing_on = false;
1521
1522                 // fw mechanism
1523                 btdm8821ae.b_ps_tdma_on = true;
1524                 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1525                         (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) ) {
1526                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi high \n"));
1527                         if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1528                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1529                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1530                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1531                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1532                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1533                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1534                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1535                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1536                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1537                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1538                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1539                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1540                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1541                         } else {
1542                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1543                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1544                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1545                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1546                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1547                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1548                         }
1549                 } else {
1550                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi low \n"));
1551                         if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1552                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1553                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1554                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1555                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1556                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1557                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1558                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1559                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1560                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1561                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1562                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1563                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1564                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1565                         } else {
1566                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1567                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1568                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1569                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1570                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1571                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1572                         }
1573                 }
1574         } else {
1575                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
1576                 bt_rssi_state = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
1577                 bt_rssi_state1 = rtl8821ae_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);
1578
1579                 // coex table
1580                 btdm8821ae.val_0x6c0 = 0x55555555;
1581                 btdm8821ae.val_0x6c8 = 0xffff;
1582                 btdm8821ae.val_0x6cc = 0x3;
1583
1584                 // sw mechanism
1585                 if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1586                         (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) ) {
1587                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi high \n"));
1588                         btdm8821ae.b_agc_table_en = true;
1589                         btdm8821ae.b_adc_back_off_on = true;
1590                         btdm8821ae.b_sw_dac_swing_on = false;
1591                 } else {
1592                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi low \n"));
1593                         btdm8821ae.b_agc_table_en = false;
1594                         btdm8821ae.b_adc_back_off_on = false;
1595                         btdm8821ae.b_sw_dac_swing_on = false;
1596                 }
1597
1598                 // fw mechanism
1599                 btdm8821ae.b_ps_tdma_on = true;
1600                 if( (bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||
1601                         (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH) ) {
1602                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi-1 high \n"));
1603                         // only rssi high we need to do this,
1604                         // when rssi low, the value will modified by fw
1605                         rtl_write_byte(rtlpriv, 0x883, 0x40);
1606                         if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1607                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1608                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1609                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1610                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1611                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1612                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1613                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1614                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1615                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1616                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1617                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1618                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1619                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1620                         } else {
1621                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1622                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1623                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1624                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1625                                 btdm8821ae.ps_tdma_byte[3] = 0x81;
1626                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1627                         }
1628                 } else {
1629                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi-1 low \n"));
1630                         if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1631                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1400\n"));
1632                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1633                                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1634                                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1635                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1636                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1637                         } else if(bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1638                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"));
1639                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1640                                 btdm8821ae.ps_tdma_byte[1] = 0xa;
1641                                 btdm8821ae.ps_tdma_byte[2] = 0xa;
1642                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1643                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1644                         } else {
1645                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters < 1200\n"));
1646                                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1647                                 btdm8821ae.ps_tdma_byte[1] = 0xf;
1648                                 btdm8821ae.ps_tdma_byte[2] = 0xf;
1649                                 btdm8821ae.ps_tdma_byte[3] = 0x0;
1650                                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1651                         }
1652                 }
1653         }
1654
1655         if(rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1656                 btdm8821ae.b_dec_bt_pwr = true;
1657         }
1658
1659         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1660                ("[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n",
1661                 hal_coex_8821ae.bt_inq_page_start_time, bt_tx_rx_cnt_lvl));
1662
1663         if( (hal_coex_8821ae.bt_inq_page_start_time) ||
1664                 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl) )
1665         {
1666                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1667                                 ("[BTCoex], Set BT inquiry / page scan 0x3a setting\n"));
1668                 btdm8821ae.b_ps_tdma_on = true;
1669                 btdm8821ae.ps_tdma_byte[0] = 0xa3;
1670                 btdm8821ae.ps_tdma_byte[1] = 0x5;
1671                 btdm8821ae.ps_tdma_byte[2] = 0x5;
1672                 btdm8821ae.ps_tdma_byte[3] = 0x83;
1673                 btdm8821ae.ps_tdma_byte[4] = 0x80;
1674         }
1675
1676         if(rtl8821ae_dm_bt_is_coexist_state_changed(hw)){
1677                 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1678         }
1679 }
1680
1681 void rtl8821ae_dm_bt_inq_page_monitor(struct ieee80211_hw *hw)
1682 {
1683         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1684         struct rtl_priv *rtlpriv = rtl_priv(hw);
1685         u32 cur_time;
1686         cur_time = jiffies;
1687         if (hal_coex_8821ae.b_c2h_bt_inquiry_page) {
1688                 //pHalData->btcoexist.halCoex8821ae.btInquiryPageCnt++;
1689                 // bt inquiry or page is started.
1690                 if(hal_coex_8821ae.bt_inq_page_start_time == 0){
1691                         rtlpcipriv->btcoexist.current_state  |= BT_COEX_STATE_BT_INQ_PAGE;
1692                         hal_coex_8821ae.bt_inq_page_start_time = cur_time;
1693                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1694                                 ("[BTCoex], BT Inquiry/page is started at time : 0x%x \n",
1695                                 hal_coex_8821ae.bt_inq_page_start_time));
1696                 }
1697         }
1698         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1699                 ("[BTCoex], BT Inquiry/page started time : 0x%x, cur_time : 0x%x \n",
1700                 hal_coex_8821ae.bt_inq_page_start_time, cur_time));
1701
1702         if (hal_coex_8821ae.bt_inq_page_start_time) {
1703                 if ((((long)cur_time - (long)hal_coex_8821ae.bt_inq_page_start_time) / HZ) >= 10) {
1704                         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,  ("[BTCoex], BT Inquiry/page >= 10sec!!!"));
1705                         hal_coex_8821ae.bt_inq_page_start_time = 0;
1706                         rtlpcipriv->btcoexist.current_state &=~ BT_COEX_STATE_BT_INQ_PAGE;
1707                 }
1708         }
1709
1710 #if 0
1711         if (hal_coex_8821ae.b_c2h_bt_inquiry_page) {
1712                 hal_coex_8821ae.b_c2h_bt_inquiry_page++;
1713                 // bt inquiry or page is started.
1714         } if(hal_coex_8821ae.b_c2h_bt_inquiry_page) {
1715                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BT_INQ_PAGE;
1716                 if(hal_coex_8821ae.bt_inquiry_page_cnt >= 4)
1717                         hal_coex_8821ae.bt_inquiry_page_cnt = 0;
1718                 hal_coex_8821ae.bt_inquiry_page_cnt++;
1719         } else {
1720                 rtlpcipriv->btcoexist.current_state &=~ BT_COEX_STATE_BT_INQ_PAGE;
1721         }
1722 #endif
1723 }
1724
1725 void rtl8821ae_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)
1726 {
1727         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1728
1729         rtlpcipriv->btcoexist.current_state &= ~\
1730                 (BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP|
1731                 BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO);
1732
1733         rtlpcipriv->btcoexist.current_state &= ~\
1734                 (BT_COEX_STATE_BTINFO_COMMON | BT_COEX_STATE_BTINFO_B_HID_SCOESCO|
1735                 BT_COEX_STATE_BTINFO_B_FTP_A2DP);
1736 }
1737
1738 void _rtl8821ae_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)
1739 {
1740         struct rtl_priv *rtlpriv = rtl_priv(hw);
1741         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1742         u8 bt_retry_cnt;
1743         u8 bt_info_original;
1744         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex] Get bt info by fw!!\n"));
1745
1746         _rtl8821ae_dm_bt_check_wifi_state(hw);
1747
1748         if (hal_coex_8821ae.b_c2h_bt_info_req_sent) {
1749                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1750                                 ("[BTCoex] c2h for bt_info not rcvd yet!!\n"));
1751         }
1752
1753         bt_retry_cnt = hal_coex_8821ae.bt_retry_cnt;
1754         bt_info_original = hal_coex_8821ae.c2h_bt_info_original;
1755
1756         // when bt inquiry or page scan, we have to set h2c 0x25
1757         // ignore wlanact for continuous 4x2secs
1758         rtl8821ae_dm_bt_inq_page_monitor(hw);
1759         rtl8821ae_dm_bt_reset_action_profile_state(hw);
1760
1761         if(rtl8821ae_dm_bt_is_2_ant_common_action(hw)) {
1762                 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_COMMON;
1763                 rtlpcipriv->btcoexist.bt_profile_action= BT_COEX_MECH_COMMON;
1764                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Action 2-Ant common.\n"));
1765         } else {
1766                 if( (bt_info_original & BTINFO_B_HID) ||
1767                         (bt_info_original & BTINFO_B_SCO_BUSY) ||
1768                         (bt_info_original & BTINFO_B_SCO_ESCO) ) {
1769                                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1770                                 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_HID_SCO_ESCO;
1771                                 rtlpcipriv->btcoexist.bt_profile_action = BT_COEX_MECH_HID_SCO_ESCO;
1772                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n"));
1773                                 rtl8821ae_dm_bt_2_ant_hid_sco_esco(hw);
1774                 } else if( (bt_info_original & BTINFO_B_FTP) ||
1775                                 (bt_info_original & BTINFO_B_A2DP) ) {
1776                                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_FTP_A2DP;
1777                                 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_FTP_A2DP;
1778                                 rtlpcipriv->btcoexist.bt_profile_action = BT_COEX_MECH_FTP_A2DP;
1779                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("BTInfo: bFTP|bA2DP\n"));
1780                                 rtl8821ae_dm_bt_2_ant_ftp_a2dp(hw);
1781                 } else {
1782                                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1783                                 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_NONE;
1784                                 rtlpcipriv->btcoexist.bt_profile_action= BT_COEX_MECH_NONE;
1785                                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BTInfo: undefined case!!!!\n"));
1786                                 rtl8821ae_dm_bt_2_ant_hid_sco_esco(hw);
1787                 }
1788         }
1789 }
1790
1791 void _rtl8821ae_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)
1792 {
1793         return;
1794 }
1795
1796 void rtl8821ae_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)
1797 {
1798         rtl8821ae_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);
1799         rtl8821ae_dm_bt_set_hw_pta_mode(hw, true);
1800 }
1801
1802 void rtl8821ae_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)
1803 {
1804         rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, false);
1805         rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
1806         rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
1807         rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, false, TDMA_2ANT, TDMA_NAV_OFF);
1808         rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT,
1809                                 TDMA_NAV_OFF, TDMA_DAC_SWING_OFF);
1810         rtl8821ae_dm_bt_set_fw_dac_swing_level(hw, 0);
1811         rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
1812         rtl8821ae_dm_bt_set_fw_bt_retry_index(hw, 2);
1813         rtl8821ae_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10);
1814         rtl8821ae_dm_bt_set_fw_dec_bt_pwr(hw, false);
1815 }
1816
1817 void rtl8821ae_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)
1818 {
1819         rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
1820         rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
1821         rtl8821ae_dm_bt_reject_ap_aggregated_packet(hw, false);
1822
1823         rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(hw,
1824                                                         BT_TX_RATE_ADAPTIVE_NORMAL);
1825         rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
1826         rtl8821ae_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0);
1827 }
1828
1829 void rtl8821ae_dm_bt_query_bt_information(struct ieee80211_hw *hw)
1830 {
1831         struct rtl_priv *rtlpriv = rtl_priv(hw);
1832         u8 h2c_parameter[1] = {0};
1833
1834         hal_coex_8821ae.b_c2h_bt_info_req_sent = true;
1835
1836         h2c_parameter[0] |=  BIT(0);
1837
1838         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1839                 ("Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]));
1840
1841         rtl8821ae_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);
1842 }
1843
1844 void rtl8821ae_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)
1845 {
1846         struct rtl_priv *rtlpriv = rtl_priv(hw);
1847         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1848         u32 reg_hp_tx_rx, reg_lp_tx_rx, u32_tmp;
1849         u32 reg_hp_tx=0, reg_hp_rx=0, reg_lp_tx=0, reg_lp_rx=0;
1850
1851         reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;
1852         reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;
1853
1854         u32_tmp = rtl_read_dword(rtlpriv, reg_hp_tx_rx);
1855         reg_hp_tx = u32_tmp & MASKLWORD;
1856         reg_hp_rx = (u32_tmp & MASKHWORD)>>16;
1857
1858         u32_tmp = rtl_read_dword(rtlpriv, reg_lp_tx_rx);
1859         reg_lp_tx = u32_tmp & MASKLWORD;
1860         reg_lp_rx = (u32_tmp & MASKHWORD)>>16;
1861
1862         if(rtlpcipriv->btcoexist.lps_counter > 1) {
1863                 reg_hp_tx %= rtlpcipriv->btcoexist.lps_counter;
1864                 reg_hp_rx %= rtlpcipriv->btcoexist.lps_counter;
1865                 reg_lp_tx %= rtlpcipriv->btcoexist.lps_counter;
1866                 reg_lp_rx %= rtlpcipriv->btcoexist.lps_counter;
1867         }
1868
1869         hal_coex_8821ae.high_priority_tx = reg_hp_tx;
1870         hal_coex_8821ae.high_priority_rx = reg_hp_rx;
1871         hal_coex_8821ae.low_priority_tx = reg_lp_tx;
1872         hal_coex_8821ae.low_priority_rx = reg_lp_rx;
1873
1874         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1875                 ("High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1876                 reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx));
1877         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1878                 ("Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1879                 reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx));
1880         rtlpcipriv->btcoexist.lps_counter = 0;
1881         //rtl_write_byte(rtlpriv, 0x76e, 0xc);
1882 }
1883
1884 void rtl8821ae_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)
1885 {
1886         struct rtl_priv *rtlpriv = rtl_priv(hw);
1887         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1888         bool bt_alife = true;
1889
1890         if (hal_coex_8821ae.high_priority_tx == 0 &&
1891                 hal_coex_8821ae.high_priority_rx == 0 &&
1892                 hal_coex_8821ae.low_priority_tx == 0 &&
1893                 hal_coex_8821ae.low_priority_rx == 0) {
1894                 bt_alife = false;
1895         }
1896         if (hal_coex_8821ae.high_priority_tx == 0xeaea &&
1897                 hal_coex_8821ae.high_priority_rx == 0xeaea &&
1898                 hal_coex_8821ae.low_priority_tx == 0xeaea &&
1899                 hal_coex_8821ae.low_priority_rx == 0xeaea) {
1900                 bt_alife = false;
1901         }
1902         if (hal_coex_8821ae.high_priority_tx == 0xffff &&
1903                 hal_coex_8821ae.high_priority_rx == 0xffff &&
1904                 hal_coex_8821ae.low_priority_tx == 0xffff &&
1905                 hal_coex_8821ae.low_priority_rx == 0xffff) {
1906                 bt_alife = false;
1907         }
1908         if (bt_alife) {
1909                 rtlpcipriv->btcoexist.bt_active_zero_cnt = 0;
1910                 rtlpcipriv->btcoexist.b_cur_bt_disabled = false;
1911                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is enabled !!\n"));
1912         } else {
1913                 rtlpcipriv->btcoexist.bt_active_zero_cnt++;
1914                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1915                         ("8821AE bt all counters=0, %d times!!\n",
1916                         rtlpcipriv->btcoexist.bt_active_zero_cnt));
1917                 if (rtlpcipriv->btcoexist.bt_active_zero_cnt >= 2) {
1918                         rtlpcipriv->btcoexist.b_cur_bt_disabled = true;
1919                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is disabled !!\n"));
1920                 }
1921         }
1922         if (rtlpcipriv->btcoexist.b_pre_bt_disabled !=
1923                 rtlpcipriv->btcoexist.b_cur_bt_disabled) {
1924                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is from %s to %s!!\n",
1925                         (rtlpcipriv->btcoexist.b_pre_bt_disabled ? "disabled":"enabled"),
1926                         (rtlpcipriv->btcoexist.b_cur_bt_disabled ? "disabled":"enabled")));
1927                 rtlpcipriv->btcoexist.b_pre_bt_disabled
1928                         = rtlpcipriv->btcoexist.b_cur_bt_disabled;
1929         }
1930 }
1931
1932
1933 void rtl8821ae_dm_bt_coexist(struct ieee80211_hw *hw)
1934 {
1935         struct rtl_priv *rtlpriv = rtl_priv(hw);
1936         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1937
1938         rtl8821ae_dm_bt_query_bt_information(hw);
1939         rtl8821ae_dm_bt_bt_hw_counters_monitor(hw);
1940         rtl8821ae_dm_bt_bt_enable_disable_check(hw);
1941
1942         if (rtlpcipriv->btcoexist.bt_ant_num == ANT_X2) {
1943                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], 2 Ant mechanism\n"));
1944                 _rtl8821ae_dm_bt_coexist_2_ant(hw);
1945         } else {
1946                 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
1947                 _rtl8821ae_dm_bt_coexist_1_ant(hw);
1948         }
1949
1950         if (!rtl8821ae_dm_bt_is_same_coexist_state(hw)) {
1951                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1952                         ("[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n",
1953                         rtlpcipriv->btcoexist.previous_state_h,
1954                         rtlpcipriv->btcoexist.previous_state,
1955                         rtlpcipriv->btcoexist.current_state_h,
1956                         rtlpcipriv->btcoexist.current_state));
1957                 rtlpcipriv->btcoexist.previous_state
1958                         = rtlpcipriv->btcoexist.current_state;
1959                 rtlpcipriv->btcoexist.previous_state_h
1960                         = rtlpcipriv->btcoexist.current_state_h;
1961         }
1962 }
1963
1964 void rtl8821ae_dm_bt_parse_bt_info(struct ieee80211_hw *hw, u8 * tmp_buf, u8 len)
1965 {
1966         struct rtl_priv *rtlpriv = rtl_priv(hw);
1967         struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1968         u8 bt_info;
1969         u8 i;
1970
1971         hal_coex_8821ae.b_c2h_bt_info_req_sent = false;
1972         hal_coex_8821ae.bt_retry_cnt = 0;
1973         for (i = 0; i < len; i++) {
1974                 if (i == 0) {
1975                         hal_coex_8821ae.c2h_bt_info_original = tmp_buf[i];
1976                 } else if (i == 1) {
1977                         hal_coex_8821ae.bt_retry_cnt = tmp_buf[i];
1978                 }
1979                 if(i == len-1) {
1980                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x]", tmp_buf[i]));
1981                 } else {
1982                         RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x, ", tmp_buf[i]));
1983                 }
1984         }
1985         RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1986                 ("BT info bt_info (Data)= 0x%x\n",hal_coex_8821ae.c2h_bt_info_original));
1987         bt_info = hal_coex_8821ae.c2h_bt_info_original;
1988
1989         if(bt_info & BIT(2)){
1990                 hal_coex_8821ae.b_c2h_bt_inquiry_page = true;
1991         } else {
1992                 hal_coex_8821ae.b_c2h_bt_inquiry_page = false;
1993         }
1994
1995         if (bt_info & BTINFO_B_CONNECTION) {
1996                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTC2H], BTInfo: bConnect=true\n"));
1997                 rtlpcipriv->btcoexist.b_bt_busy = true;
1998                 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_BT_IDLE;
1999         } else {
2000                 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTC2H], BTInfo: bConnect=false\n"));
2001                 rtlpcipriv->btcoexist.b_bt_busy = false;
2002                 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BT_IDLE;
2003         }
2004 }
2005 void rtl_8821ae_c2h_command_handle(struct ieee80211_hw *hw)
2006 {
2007         struct rtl_priv *rtlpriv = rtl_priv(hw);
2008         struct c2h_evt_hdr c2h_event;
2009         u8 * ptmp_buf = NULL;
2010         u8 index = 0;
2011         u8 u1b_tmp = 0;
2012         memset(&c2h_event, 0, sizeof(c2h_event));
2013         u1b_tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL);
2014         RT_TRACE(COMP_FW, DBG_DMESG,
2015                 ("&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1b_tmp));
2016         c2h_event.cmd_id = u1b_tmp & 0xF;
2017         c2h_event.cmd_len = (u1b_tmp & 0xF0) >> 4;
2018         c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1);
2019         RT_TRACE(COMP_FW, DBG_DMESG, ("cmd_id: %d, cmd_len: %d, cmd_seq: %d\n",
2020                 c2h_event.cmd_id , c2h_event.cmd_len, c2h_event.cmd_seq));
2021         u1b_tmp = rtl_read_byte(rtlpriv, 0x01AF);
2022         if (u1b_tmp == C2H_EVT_HOST_CLOSE) {
2023                 return;
2024         } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {
2025                 rtl_write_byte(rtlpriv, 0x1AF, 0x00);
2026                 return;
2027         }
2028         ptmp_buf = kmalloc(c2h_event.cmd_len, GFP_KERNEL);
2029         if(ptmp_buf == NULL) {
2030                 RT_TRACE(COMP_FW, DBG_TRACE, ("malloc cmd buf failed\n"));
2031                 return;
2032         }
2033
2034         /* Read the content */
2035         for (index = 0; index < c2h_event.cmd_len; index ++) {
2036                 ptmp_buf[index] = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 2+ index);
2037         }
2038
2039         switch(c2h_event.cmd_id) {
2040                 case C2H_BT_RSSI:
2041                         break;
2042
2043         case C2H_BT_OP_MODE:
2044                         break;
2045
2046         case BT_INFO:
2047                 RT_TRACE(COMP_FW, DBG_TRACE,
2048                         ("BT info Byte[0] (ID) is 0x%x\n", c2h_event.cmd_id));
2049                 RT_TRACE(COMP_FW, DBG_TRACE,
2050                         ("BT info Byte[1] (Seq) is 0x%x\n", c2h_event.cmd_seq));
2051                 RT_TRACE(COMP_FW, DBG_TRACE,
2052                         ("BT info Byte[2] (Data)= 0x%x\n", ptmp_buf[0]));
2053
2054                 if (rtlpriv->cfg->ops->get_btc_status()){
2055                         rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, ptmp_buf, c2h_event.cmd_len);
2056                 }
2057                 break;
2058         default:
2059                 break;
2060         }
2061
2062         if(ptmp_buf)
2063                 kfree(ptmp_buf);
2064
2065         rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);
2066 }
2067
2068
2069