1 /******************************************************************************
3 * Copyright(c) 2009-2010 Realtek Corporation.
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.
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
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
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
26 * Larry Finger <Larry.Finger@lwfinger.net>
28 *****************************************************************************/
35 #include "../btcoexist/rtl_btc.h"
37 static struct bt_coexist_8821ae hal_coex_8821ae;
39 void rtl8821ae_dm_bt_turn_off_bt_coexist_before_enter_lps(struct ieee80211_hw *hw)
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));
45 if(!rtlpcipriv->btcoexist.bt_coexistence)
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);
59 enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
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;
65 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
67 if(bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
68 m_status = RT_MEDIA_CONNECT;
74 void rtl_8821ae_bt_wifi_media_status_notify(struct ieee80211_hw *hw, bool mstatus)
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};
82 if(!rtlpcipriv->btcoexist.bt_coexistence)
85 if(RT_MEDIA_CONNECT == mstatus)
86 h2c_parameter[0] = 0x1; // 0: disconnected, 1:connected
88 h2c_parameter[0] = 0x0;
90 if(mgnt_link_status_query(hw)) {
91 chnl = rtlphy->current_channel;
92 h2c_parameter[1] = chnl;
95 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40){
96 h2c_parameter[2] = 0x30;
98 h2c_parameter[2] = 0x20;
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]));
104 rtl8821ae_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter);
109 bool rtl8821ae_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)
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)
119 void rtl8821ae_dm_bt_set_fw_3a(struct ieee80211_hw *hw,
120 u8 byte1, u8 byte2, u8 byte3, u8 byte4, u8 byte5)
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);
134 bool rtl8821ae_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw)
136 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
137 struct rtl_priv *rtlpriv = rtl_priv(hw);
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;
145 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_DEC_BT_POWER;
150 bool rtl8821ae_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)
152 struct rtl_priv *rtlpriv = rtl_priv(hw);
153 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
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 chang!!\n"));
163 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
164 ("[DM][BT], Coexist state changed!!\n"));
169 void rtl8821ae_dm_bt_set_coex_table(struct ieee80211_hw *hw,
170 u32 val_0x6c0, u32 val_0x6c8, u32 val_0x6cc)
172 struct rtl_priv *rtlpriv = rtl_priv(hw);
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);
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);
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);
184 void rtl8821ae_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool b_mode)
186 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
187 struct rtl_priv *rtlpriv = rtl_priv(hw);
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;
195 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("PTA mode off\n"));
196 rtl_write_byte(rtlpriv, 0x40, 0x0);
200 void rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw, u8 type)
202 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
203 struct rtl_priv *rtlpriv = rtl_priv(hw);
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);
221 void rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(struct ieee80211_hw *hw,
224 struct rtl_priv *rtlpriv = rtl_priv(hw);
225 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
228 tmp_u1 = rtl_read_byte(rtlpriv, 0x4fd);
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"));
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"));
239 rtl_write_byte(rtlpriv, 0x4fd, tmp_u1);
242 void rtl8821ae_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,
243 struct btdm_8821ae *p_btdm)
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;
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;
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;
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;
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;
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;
282 p_btdm->b_dec_bt_pwr = false;
285 void rtl8821ae_dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw,
286 struct btdm_8821ae *p_btdm)
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;
294 bool rtl8821ae_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
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;
301 rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
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);
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;
318 btdm8821ae.b_agc_table_en = false;
319 btdm8821ae.b_adc_back_off_on = false;
320 btdm8821ae.b_sw_dac_swing_on = false;
322 btdm8821ae.b_pta_on = true;
323 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
324 btdm8821ae.val_0x6c8 = 0xcccc;
325 btdm8821ae.val_0x6cc = 0x3;
327 btdm8821ae.b_tdma_on = false;
328 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
329 btdm8821ae.b2_ant_hid_en = false;
332 }else if (rtlpcipriv->btcoexist.b_bt_busy) {
333 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
335 if(mgnt_link_status_query(hw) == RT_MEDIA_CONNECT){
336 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi connection exist\n"))
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;
346 btdm8821ae.b_agc_table_en = false;
347 btdm8821ae.b_adc_back_off_on = false;
348 btdm8821ae.b_sw_dac_swing_on = false;
350 btdm8821ae.b_pta_on = true;
351 btdm8821ae.val_0x6c0 = 0x55555555;
352 btdm8821ae.val_0x6c8 = 0x0000ffff;
353 btdm8821ae.val_0x6cc = 0x3;
355 btdm8821ae.b_tdma_on = false;
356 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
357 btdm8821ae.b2_ant_hid_en = false;
363 if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
364 btdm8821ae.b_dec_bt_pwr = true;
368 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_COMMON;
370 if (b_common && rtl8821ae_dm_bt_is_coexist_state_changed(hw))
371 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
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)
379 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
380 struct rtl_priv *rtlpriv = rtl_priv(hw);
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;
388 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], SwDacSwing Off!\n"));
389 rtl8821ae_phy_set_bb_reg(hw, 0x880, 0xff000000, 0xc0);
393 void rtl8821ae_dm_bt_set_fw_dec_bt_pwr(
394 struct ieee80211_hw *hw, bool b_dec_bt_pwr)
396 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
397 struct rtl_priv *rtlpriv = rtl_priv(hw);
398 u8 h2c_parameter[1] ={0};
400 h2c_parameter[0] = 0;
403 h2c_parameter[0] |= BIT(1);
404 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
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]));
411 rtl8821ae_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter);
415 void rtl8821ae_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw,
416 bool b_enable, bool b_dac_swing_on)
418 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
419 struct rtl_priv *rtlpriv = rtl_priv(hw);
420 u8 h2c_parameter[1] ={0};
423 h2c_parameter[0] |= BIT(0);
424 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
426 if (b_dac_swing_on) {
427 h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */
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"),
434 rtl8821ae_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter);
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)
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};
445 h2c_parameter[0] = 0;
446 h2c_parameter1[0] = 0;
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);
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"));
462 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], Unknown Ant\n"));
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);
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);
480 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
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"));
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);
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);
498 * PlatformEFIOWrite1Byte(Adapter, 0x778, 0x1); */
503 void rtl8821ae_dm_bt_set_fw_ignore_wlan_act( struct ieee80211_hw *hw, bool b_enable)
505 struct rtl_priv *rtlpriv = rtl_priv(hw);
506 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
507 u8 h2c_parameter[1] ={0};
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;
514 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], BT don't ignore Wlan_Act !!\n"));
517 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%x\n",
520 rtl8821ae_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter);
524 void rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,
525 bool b_enable, u8 ant_num, u8 nav_en
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));
532 u8 h2c_parameter[2] ={0};
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"));
545 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], Unknown Ant\n"));
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);
555 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
557 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
558 ("[BTCoex], turn TTDMA mode OFF!!\n"));
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]));
565 rtl8821ae_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter);
569 void rtl8821ae_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw,
572 struct rtl_priv *rtlpriv = rtl_priv(hw);
573 u8 h2c_parameter[1] ={0};
574 h2c_parameter[0] = dac_swing_lvl;
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]));
581 rtl8821ae_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter);
584 void rtl8821ae_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw, bool b_enable)
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;
592 h2c_parameter[0] |= BIT(0);
593 rtlpcipriv->btcoexist.b_fw_coexist_all_off = false;
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]));
600 rtl8821ae_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter);
603 void rtl8821ae_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw,
606 struct rtl_priv *rtlpriv = rtl_priv(hw);
607 u8 h2c_parameter[1] ={0};
608 h2c_parameter[0] = retry_index;
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]));
615 rtl8821ae_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter);
618 void rtl8821ae_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw,
619 u8 wlan_act_hi, u8 wlan_act_lo)
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;
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]));
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);
640 void rtl8821ae_dm_bt_set_bt_dm(struct ieee80211_hw *hw, struct btdm_8821ae *p_btdm)
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;
647 bool b_fw_current_inpsmode = false;
648 bool b_fw_ps_awake = true;
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));
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"));
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));
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));
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]));
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));
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));
753 memcpy(p_btdm_8821ae, p_btdm, sizeof(struct btdm_8821ae));
756 * Here we only consider when Bt Operation
757 * inquiry/paging/pairing is ON
758 * we only need to turn off TDMA */
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);
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);
774 rtl8821ae_dm_bt_reject_ap_aggregated_packet(hw, p_btdm->b_reject_aggre_pkt);
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);
780 rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(hw,
781 BT_TX_RATE_ADAPTIVE_NORMAL);
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);
786 rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
788 if(p_btdm->b_agc_table_en)
789 rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_ON);
791 rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
793 if(p_btdm->b_adc_back_off_on)
794 rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_ON);
796 rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
798 rtl8821ae_dm_bt_set_fw_bt_retry_index(hw, p_btdm->bt_retry_index);
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);
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);
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.
814 if(p_btdm->b2_ant_hid_en) {
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);
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.
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) {
830 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
831 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
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.
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) {
842 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
843 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
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);
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]);
859 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
860 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
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);
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.
871 if (p_btdm->b_tdma_on) {
872 if(p_btdm->b_ps_tdma_on) {
874 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
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);
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);
891 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
892 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
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]);
898 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
905 * We should add delay for making sure sw DacSwing can be set sucessfully.
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.
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);
915 void rtl8821ae_dm_bt_bt_state_update_2_ant_hid(struct ieee80211_hw *hw)
917 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
918 struct rtl_priv *rtlpriv = rtl_priv(hw);
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;
925 void rtl8821ae_dm_bt_bt_state_update_2_ant_pan(struct ieee80211_hw *hw)
927 struct rtl_priv *rtlpriv = rtl_priv(hw);
928 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
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) {
938 if((hal_coex_8821ae.low_priority_rx/
939 hal_coex_8821ae.low_priority_tx) > 10) {
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;
949 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], PAN idle!!\n"));
953 void rtl8821ae_dm_bt_2_ant_sco_action(struct ieee80211_hw *hw)
955 struct rtl_priv *rtlpriv = rtl_priv(hw);
956 struct rtl_phy *rtlphy = &(rtlpriv->phy);
957 struct btdm_8821ae btdm8821ae;
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;
965 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
966 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
968 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
969 btdm8821ae.val_0x6c8 = 0xcc;
970 btdm8821ae.val_0x6cc = 0x3;
972 btdm8821ae.b_agc_table_en = false;
973 btdm8821ae.b_adc_back_off_on = true;
974 btdm8821ae.b_sw_dac_swing_on = false;
976 btdm8821ae.b_tdma_on = false;
977 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
979 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
981 = rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, BT_FW_COEX_THRESH_47, 0);
984 btdm8821ae.val_0x6c0 = 0x5a5aaaaa;
985 btdm8821ae.val_0x6c8 = 0xcc;
986 btdm8821ae.val_0x6cc = 0x3;
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;
994 btdm8821ae.b_agc_table_en = false;
995 btdm8821ae.b_adc_back_off_on = false;
996 btdm8821ae.b_sw_dac_swing_on = false;
999 btdm8821ae.b_tdma_on = false;
1000 btdm8821ae.tdma_dac_swing = TDMA_DAC_SWING_OFF;
1003 if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1004 btdm8821ae.b_dec_bt_pwr = true;
1007 if(rtl8821ae_dm_bt_is_coexist_state_changed(hw))
1008 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1011 void rtl8821ae_dm_bt_2_ant_hid_action(struct ieee80211_hw *hw)
1013 struct rtl_priv *rtlpriv = rtl_priv(hw);
1014 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1015 struct btdm_8821ae btdm8821ae;
1018 rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1020 btdm8821ae.b_rf_rx_lpf_shrink = true;
1021 btdm8821ae.b_low_penalty_rate_adaptive = true;
1022 btdm8821ae.b_reject_aggre_pkt = false;
1025 btdm8821ae.val_0x6c0 = 0x55555555;
1026 btdm8821ae.val_0x6c8 = 0xffff;
1027 btdm8821ae.val_0x6cc = 0x3;
1028 btdm8821ae.b_ignore_wlan_act = true;
1030 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
1031 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
1033 btdm8821ae.b_agc_table_en = false;
1034 btdm8821ae.b_adc_back_off_on = false;
1035 btdm8821ae.b_sw_dac_swing_on = false;
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;
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;
1050 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT20 or Legacy\n"));
1052 rtl8821ae_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
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"));
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;
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;
1069 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Wifi rssi low \n"));
1071 btdm8821ae.b_agc_table_en = false;
1072 btdm8821ae.b_adc_back_off_on = false;
1073 btdm8821ae.b_sw_dac_swing_on = false;
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;
1084 if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1085 btdm8821ae.b_dec_bt_pwr = true;
1088 if (rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1089 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1094 void rtl8821ae_dm_bt_2_ant_2_dp_action_no_profile(struct ieee80211_hw *hw)
1096 struct rtl_priv *rtlpriv = rtl_priv(hw);
1097 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1098 struct btdm_8821ae btdm8821ae;
1101 rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1103 btdm8821ae.b_rf_rx_lpf_shrink = true;
1104 btdm8821ae.b_low_penalty_rate_adaptive = true;
1105 btdm8821ae.b_reject_aggre_pkt = false;
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"));
1112 btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1113 btdm8821ae.val_0x6c8 = 0xcccc;
1114 btdm8821ae.val_0x6cc = 0x3;
1116 btdm8821ae.b_agc_table_en = false;
1117 btdm8821ae.b_adc_back_off_on = true;
1118 btdm8821ae.b_sw_dac_swing_on = false;
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)
1127 btdm8821ae.wlan_act_hi = 0x10;
1128 btdm8821ae.wlan_act_lo = 0x10;
1132 //btdm8821ae.wlanActHi = 0x20;
1133 //btdm8821ae.wlanActLo = 0x20;
1135 btdm8821ae.bt_retry_index = 2;
1136 btdm8821ae.fw_dac_swing_lvl = 0x18;
1138 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Downlink\n"));
1140 btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1141 btdm8821ae.val_0x6c8 = 0xcc;
1142 btdm8821ae.val_0x6cc = 0x3;
1144 btdm8821ae.b_agc_table_en = false;
1145 btdm8821ae.b_adc_back_off_on = true;
1146 btdm8821ae.b_sw_dac_swing_on = false;
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)
1155 btdm8821ae.wlan_act_hi = 0x10;
1156 btdm8821ae.wlan_act_lo = 0x10;
1160 // btdm8821ae.wlanActHi = 0x20;
1161 // btdm8821ae.wlanActLo = 0x20;
1163 btdm8821ae.bt_retry_index = 2;
1164 btdm8821ae.fw_dac_swing_lvl = 0x40;
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);
1170 if(rtl8821ae_dm_bt_is_wifi_up_link(hw))
1172 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Uplink\n"));
1174 btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1175 btdm8821ae.val_0x6c8 = 0xcccc;
1176 btdm8821ae.val_0x6cc = 0x3;
1178 if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1179 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) )
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;
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;
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)
1199 btdm8821ae.wlan_act_hi = 0x10;
1200 btdm8821ae.wlan_act_lo = 0x10;
1204 //btdm8821ae.wlanActHi = 0x20;
1205 //btdm8821ae.wlanActLo = 0x20;
1207 btdm8821ae.bt_retry_index = 2;
1208 btdm8821ae.fw_dac_swing_lvl = 0x18;
1212 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("Wifi Downlink\n"));
1214 btdm8821ae.val_0x6c0 = 0x5a5a5a5a;
1215 btdm8821ae.val_0x6c8 = 0xcc;
1216 btdm8821ae.val_0x6cc = 0x3;
1218 if( (bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1219 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH) )
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;
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;
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)
1241 btdm8821ae.wlan_act_hi = 0x10;
1242 btdm8821ae.wlan_act_lo = 0x10;
1246 //btdm8821ae.wlanActHi = 0x20;
1247 //btdm8821ae.wlanActLo = 0x20;
1249 btdm8821ae.bt_retry_index = 2;
1250 btdm8821ae.fw_dac_swing_lvl = 0x40;
1254 if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1255 btdm8821ae.b_dec_bt_pwr = true;
1258 if (rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1259 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1264 //============================================================
1265 // extern function start with BTDM_
1266 //============================================================
1267 u32 rtl8821ae_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw)
1271 counters = hal_coex_8821ae.high_priority_tx + hal_coex_8821ae.high_priority_rx ;
1275 u32 rtl8821ae_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw)
1279 counters = hal_coex_8821ae.low_priority_tx + hal_coex_8821ae.low_priority_rx ;
1283 u8 rtl8821ae_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw)
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;
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));
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);
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;
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;
1320 return bt_tx_rx_cnt_lvl;
1324 void rtl8821ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1326 struct rtl_priv *rtlpriv = rtl_priv(hw);
1327 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1328 struct btdm_8821ae btdm8821ae;
1330 u8 bt_rssi_state, bt_rssi_state1;
1331 u8 bt_tx_rx_cnt_lvl = 0;
1333 rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1336 btdm8821ae.b_rf_rx_lpf_shrink = true;
1337 btdm8821ae.b_low_penalty_rate_adaptive = true;
1338 btdm8821ae.b_reject_aggre_pkt = false;
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));
1343 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
1345 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("HT40\n"));
1347 btdm8821ae.val_0x6c0 = 0x55555555;
1348 btdm8821ae.val_0x6c8 = 0xffff;
1349 btdm8821ae.val_0x6cc = 0x3;
1352 btdm8821ae.b_agc_table_en = false;
1353 btdm8821ae.b_adc_back_off_on = false;
1354 btdm8821ae.b_sw_dac_swing_on = false;
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;
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;
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);
1386 btdm8821ae.val_0x6c0 = 0x55555555;
1387 btdm8821ae.val_0x6c8 = 0xffff;
1388 btdm8821ae.val_0x6cc = 0x3;
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;
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;
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;
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;
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)
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;
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;
1462 if (rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1463 btdm8821ae.b_dec_bt_pwr = true;
1466 // Always ignore WlanAct if bHid|bSCOBusy|bSCOeSCO
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;
1483 if(rtl8821ae_dm_bt_is_coexist_state_changed(hw)) {
1484 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1488 void rtl8821ae_dm_bt_2_ant_ftp_a2dp(struct ieee80211_hw *hw)
1490 struct rtl_priv *rtlpriv = rtl_priv(hw);
1491 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1492 struct btdm_8821ae btdm8821ae;
1494 u8 bt_rssi_state, bt_rssi_state1;
1495 u32 bt_tx_rx_cnt_lvl = 0;
1497 rtl8821ae_dm_bt_btdm_structure_reload(hw, &btdm8821ae);
1499 btdm8821ae.b_rf_rx_lpf_shrink = true;
1500 btdm8821ae.b_low_penalty_rate_adaptive = true;
1501 btdm8821ae.b_reject_aggre_pkt = false;
1503 bt_tx_rx_cnt_lvl = rtl8821ae_dm_bt_bt_tx_rx_counter_level(hw);
1505 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl));
1507 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
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);
1513 btdm8821ae.val_0x6c0 = 0x55555555;
1514 btdm8821ae.val_0x6c8 = 0xffff;
1515 btdm8821ae.val_0x6cc = 0x3;
1518 btdm8821ae.b_agc_table_en = false;
1519 btdm8821ae.b_adc_back_off_on = true;
1520 btdm8821ae.b_sw_dac_swing_on = false;
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;
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;
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;
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;
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);
1580 btdm8821ae.val_0x6c0 = 0x55555555;
1581 btdm8821ae.val_0x6c8 = 0xffff;
1582 btdm8821ae.val_0x6cc = 0x3;
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;
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;
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;
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;
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;
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;
1655 if(rtl8821ae_dm_bt_need_to_dec_bt_pwr(hw)) {
1656 btdm8821ae.b_dec_bt_pwr = true;
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));
1663 if( (hal_coex_8821ae.bt_inq_page_start_time) ||
1664 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl) )
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;
1676 if(rtl8821ae_dm_bt_is_coexist_state_changed(hw)){
1677 rtl8821ae_dm_bt_set_bt_dm(hw, &btdm8821ae);
1681 void rtl8821ae_dm_bt_inq_page_monitor(struct ieee80211_hw *hw)
1683 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1684 struct rtl_priv *rtlpriv = rtl_priv(hw);
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));
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));
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;
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++;
1720 rtlpcipriv->btcoexist.current_state &=~ BT_COEX_STATE_BT_INQ_PAGE;
1725 void rtl8821ae_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)
1727 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
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);
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);
1738 void _rtl8821ae_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)
1740 struct rtl_priv *rtlpriv = rtl_priv(hw);
1741 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1743 u8 bt_info_original;
1744 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex] Get bt info by fw!!\n"));
1746 _rtl8821ae_dm_bt_check_wifi_state(hw);
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"));
1753 bt_retry_cnt = hal_coex_8821ae.bt_retry_cnt;
1754 bt_info_original = hal_coex_8821ae.c2h_bt_info_original;
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);
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"));
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);
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);
1791 void _rtl8821ae_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)
1796 void rtl8821ae_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)
1798 rtl8821ae_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);
1799 rtl8821ae_dm_bt_set_hw_pta_mode(hw, true);
1802 void rtl8821ae_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)
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);
1817 void rtl8821ae_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)
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);
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);
1829 void rtl8821ae_dm_bt_query_bt_information(struct ieee80211_hw *hw)
1831 struct rtl_priv *rtlpriv = rtl_priv(hw);
1832 u8 h2c_parameter[1] = {0};
1834 hal_coex_8821ae.b_c2h_bt_info_req_sent = true;
1836 h2c_parameter[0] |= BIT(0);
1838 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1839 ("Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]));
1841 rtl8821ae_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);
1844 void rtl8821ae_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)
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;
1851 reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;
1852 reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;
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;
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;
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;
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;
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);
1884 void rtl8821ae_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)
1886 struct rtl_priv *rtlpriv = rtl_priv(hw);
1887 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1888 bool bt_alife = true;
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) {
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) {
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) {
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"));
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"));
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;
1933 void rtl8821ae_dm_bt_coexist(struct ieee80211_hw *hw)
1935 struct rtl_priv *rtlpriv = rtl_priv(hw);
1936 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
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);
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);
1946 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
1947 _rtl8821ae_dm_bt_coexist_1_ant(hw);
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;
1964 void rtl8821ae_dm_bt_parse_bt_info(struct ieee80211_hw *hw, u8 * tmp_buf, u8 len)
1966 struct rtl_priv *rtlpriv = rtl_priv(hw);
1967 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
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++) {
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];
1980 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x]", tmp_buf[i]));
1982 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x, ", tmp_buf[i]));
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;
1989 if(bt_info & BIT(2)){
1990 hal_coex_8821ae.b_c2h_bt_inquiry_page = true;
1992 hal_coex_8821ae.b_c2h_bt_inquiry_page = false;
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;
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;
2005 void rtl_8821ae_c2h_command_handle(struct ieee80211_hw *hw)
2007 struct rtl_priv *rtlpriv = rtl_priv(hw);
2008 struct c2h_evt_hdr c2h_event;
2009 u8 * ptmp_buf = NULL;
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) {
2024 } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {
2025 rtl_write_byte(rtlpriv, 0x1AF, 0x00);
2028 ptmp_buf = (u8 *) kmalloc(c2h_event.cmd_len, GFP_KERNEL);
2029 if(ptmp_buf == NULL) {
2030 RT_TRACE(COMP_FW, DBG_TRACE, ("malloc cmd buf failed\n"));
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);
2039 switch(c2h_event.cmd_id) {
2043 case C2H_BT_OP_MODE:
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]));
2054 if (rtlpriv->cfg->ops->get_btc_status()){
2055 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, ptmp_buf, c2h_event.cmd_len);
2065 rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);