staging: et131x: Simplify for loop in et131x_init_send()
[deliverable/linux.git] / drivers / staging / rtl8821ae / rtl8821ae / hal_btc.c
CommitLineData
3c05bedb
GKH
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
37static struct bt_coexist_8821ae hal_coex_8821ae;
38
39void 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
59enum 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
74void 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
109bool 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}
119void 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
134bool 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
150bool 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,
1d80d842 160 ("[DM][BT], Coexist state do not change!!\n"));
3c05bedb
GKH
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
169void 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
184void 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
200void 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
221void 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
242void 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
285void 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
294bool 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
376void 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
393void 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
415void 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
437void 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
503void 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
524void 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
569void 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
584void 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
603void 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
618void 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
640void 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:
1d80d842 905 * We should add delay for making sure sw DacSwing can be set successfully.
3c05bedb
GKH
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
915void 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
925void 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
953void 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
1011void 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
1094void 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//============================================================
1267u32 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
1275u32 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
1283u8 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
1324void 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
1488void 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
1681void 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 }
3c05bedb
GKH
1709}
1710
1711void rtl8821ae_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)
1712{
1713 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1714
1715 rtlpcipriv->btcoexist.current_state &= ~\
1716 (BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP|
1717 BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO);
1718
1719 rtlpcipriv->btcoexist.current_state &= ~\
1720 (BT_COEX_STATE_BTINFO_COMMON | BT_COEX_STATE_BTINFO_B_HID_SCOESCO|
1721 BT_COEX_STATE_BTINFO_B_FTP_A2DP);
1722}
1723
1724void _rtl8821ae_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)
1725{
1726 struct rtl_priv *rtlpriv = rtl_priv(hw);
1727 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1728 u8 bt_retry_cnt;
1729 u8 bt_info_original;
1730 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex] Get bt info by fw!!\n"));
1731
1732 _rtl8821ae_dm_bt_check_wifi_state(hw);
1733
1734 if (hal_coex_8821ae.b_c2h_bt_info_req_sent) {
1735 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1736 ("[BTCoex] c2h for bt_info not rcvd yet!!\n"));
1737 }
1738
1739 bt_retry_cnt = hal_coex_8821ae.bt_retry_cnt;
1740 bt_info_original = hal_coex_8821ae.c2h_bt_info_original;
1741
1742 // when bt inquiry or page scan, we have to set h2c 0x25
1743 // ignore wlanact for continuous 4x2secs
1744 rtl8821ae_dm_bt_inq_page_monitor(hw);
1745 rtl8821ae_dm_bt_reset_action_profile_state(hw);
1746
1747 if(rtl8821ae_dm_bt_is_2_ant_common_action(hw)) {
1748 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_COMMON;
1749 rtlpcipriv->btcoexist.bt_profile_action= BT_COEX_MECH_COMMON;
1750 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("Action 2-Ant common.\n"));
1751 } else {
1752 if( (bt_info_original & BTINFO_B_HID) ||
1753 (bt_info_original & BTINFO_B_SCO_BUSY) ||
1754 (bt_info_original & BTINFO_B_SCO_ESCO) ) {
1755 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1756 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_HID_SCO_ESCO;
1757 rtlpcipriv->btcoexist.bt_profile_action = BT_COEX_MECH_HID_SCO_ESCO;
1758 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n"));
1759 rtl8821ae_dm_bt_2_ant_hid_sco_esco(hw);
1760 } else if( (bt_info_original & BTINFO_B_FTP) ||
1761 (bt_info_original & BTINFO_B_A2DP) ) {
1762 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_FTP_A2DP;
1763 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_FTP_A2DP;
1764 rtlpcipriv->btcoexist.bt_profile_action = BT_COEX_MECH_FTP_A2DP;
1765 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("BTInfo: bFTP|bA2DP\n"));
1766 rtl8821ae_dm_bt_2_ant_ftp_a2dp(hw);
1767 } else {
1768 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1769 rtlpcipriv->btcoexist.bt_profile_case = BT_COEX_MECH_NONE;
1770 rtlpcipriv->btcoexist.bt_profile_action= BT_COEX_MECH_NONE;
1771 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], BTInfo: undefined case!!!!\n"));
1772 rtl8821ae_dm_bt_2_ant_hid_sco_esco(hw);
1773 }
1774 }
1775}
1776
1777void _rtl8821ae_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)
1778{
1779 return;
1780}
1781
1782void rtl8821ae_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)
1783{
1784 rtl8821ae_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);
1785 rtl8821ae_dm_bt_set_hw_pta_mode(hw, true);
1786}
1787
1788void rtl8821ae_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)
1789{
1790 rtl8821ae_dm_bt_set_fw_ignore_wlan_act(hw, false);
1791 rtl8821ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
1792 rtl8821ae_dm_bt_set_fw_2_ant_hid(hw, false, false);
1793 rtl8821ae_dm_bt_set_fw_tra_tdma_ctrl(hw, false, TDMA_2ANT, TDMA_NAV_OFF);
1794 rtl8821ae_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT,
1795 TDMA_NAV_OFF, TDMA_DAC_SWING_OFF);
1796 rtl8821ae_dm_bt_set_fw_dac_swing_level(hw, 0);
1797 rtl8821ae_dm_bt_set_fw_bt_hid_info(hw, false);
1798 rtl8821ae_dm_bt_set_fw_bt_retry_index(hw, 2);
1799 rtl8821ae_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10);
1800 rtl8821ae_dm_bt_set_fw_dec_bt_pwr(hw, false);
1801}
1802
1803void rtl8821ae_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)
1804{
1805 rtl8821ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
1806 rtl8821ae_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
1807 rtl8821ae_dm_bt_reject_ap_aggregated_packet(hw, false);
1808
1809 rtl8821ae_dm_bt_set_sw_penalty_tx_rate_adaptive(hw,
1810 BT_TX_RATE_ADAPTIVE_NORMAL);
1811 rtl8821ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
1812 rtl8821ae_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0);
1813}
1814
1815void rtl8821ae_dm_bt_query_bt_information(struct ieee80211_hw *hw)
1816{
1817 struct rtl_priv *rtlpriv = rtl_priv(hw);
1818 u8 h2c_parameter[1] = {0};
1819
1820 hal_coex_8821ae.b_c2h_bt_info_req_sent = true;
1821
1822 h2c_parameter[0] |= BIT(0);
1823
1824 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1825 ("Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]));
1826
1827 rtl8821ae_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);
1828}
1829
1830void rtl8821ae_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)
1831{
1832 struct rtl_priv *rtlpriv = rtl_priv(hw);
1833 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1834 u32 reg_hp_tx_rx, reg_lp_tx_rx, u32_tmp;
1835 u32 reg_hp_tx=0, reg_hp_rx=0, reg_lp_tx=0, reg_lp_rx=0;
1836
1837 reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;
1838 reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;
1839
1840 u32_tmp = rtl_read_dword(rtlpriv, reg_hp_tx_rx);
1841 reg_hp_tx = u32_tmp & MASKLWORD;
1842 reg_hp_rx = (u32_tmp & MASKHWORD)>>16;
1843
1844 u32_tmp = rtl_read_dword(rtlpriv, reg_lp_tx_rx);
1845 reg_lp_tx = u32_tmp & MASKLWORD;
1846 reg_lp_rx = (u32_tmp & MASKHWORD)>>16;
1847
1848 if(rtlpcipriv->btcoexist.lps_counter > 1) {
1849 reg_hp_tx %= rtlpcipriv->btcoexist.lps_counter;
1850 reg_hp_rx %= rtlpcipriv->btcoexist.lps_counter;
1851 reg_lp_tx %= rtlpcipriv->btcoexist.lps_counter;
1852 reg_lp_rx %= rtlpcipriv->btcoexist.lps_counter;
1853 }
1854
1855 hal_coex_8821ae.high_priority_tx = reg_hp_tx;
1856 hal_coex_8821ae.high_priority_rx = reg_hp_rx;
1857 hal_coex_8821ae.low_priority_tx = reg_lp_tx;
1858 hal_coex_8821ae.low_priority_rx = reg_lp_rx;
1859
1860 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1861 ("High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1862 reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx));
1863 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1864 ("Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1865 reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx));
1866 rtlpcipriv->btcoexist.lps_counter = 0;
1867 //rtl_write_byte(rtlpriv, 0x76e, 0xc);
1868}
1869
1870void rtl8821ae_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)
1871{
1872 struct rtl_priv *rtlpriv = rtl_priv(hw);
1873 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1874 bool bt_alife = true;
1875
1876 if (hal_coex_8821ae.high_priority_tx == 0 &&
1877 hal_coex_8821ae.high_priority_rx == 0 &&
1878 hal_coex_8821ae.low_priority_tx == 0 &&
1879 hal_coex_8821ae.low_priority_rx == 0) {
1880 bt_alife = false;
1881 }
1882 if (hal_coex_8821ae.high_priority_tx == 0xeaea &&
1883 hal_coex_8821ae.high_priority_rx == 0xeaea &&
1884 hal_coex_8821ae.low_priority_tx == 0xeaea &&
1885 hal_coex_8821ae.low_priority_rx == 0xeaea) {
1886 bt_alife = false;
1887 }
1888 if (hal_coex_8821ae.high_priority_tx == 0xffff &&
1889 hal_coex_8821ae.high_priority_rx == 0xffff &&
1890 hal_coex_8821ae.low_priority_tx == 0xffff &&
1891 hal_coex_8821ae.low_priority_rx == 0xffff) {
1892 bt_alife = false;
1893 }
1894 if (bt_alife) {
1895 rtlpcipriv->btcoexist.bt_active_zero_cnt = 0;
1896 rtlpcipriv->btcoexist.b_cur_bt_disabled = false;
1897 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is enabled !!\n"));
1898 } else {
1899 rtlpcipriv->btcoexist.bt_active_zero_cnt++;
1900 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE,
1901 ("8821AE bt all counters=0, %d times!!\n",
1902 rtlpcipriv->btcoexist.bt_active_zero_cnt));
1903 if (rtlpcipriv->btcoexist.bt_active_zero_cnt >= 2) {
1904 rtlpcipriv->btcoexist.b_cur_bt_disabled = true;
1905 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is disabled !!\n"));
1906 }
1907 }
1908 if (rtlpcipriv->btcoexist.b_pre_bt_disabled !=
1909 rtlpcipriv->btcoexist.b_cur_bt_disabled) {
1910 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("8821AE BT is from %s to %s!!\n",
1911 (rtlpcipriv->btcoexist.b_pre_bt_disabled ? "disabled":"enabled"),
1912 (rtlpcipriv->btcoexist.b_cur_bt_disabled ? "disabled":"enabled")));
1913 rtlpcipriv->btcoexist.b_pre_bt_disabled
1914 = rtlpcipriv->btcoexist.b_cur_bt_disabled;
1915 }
1916}
1917
1918
1919void rtl8821ae_dm_bt_coexist(struct ieee80211_hw *hw)
1920{
1921 struct rtl_priv *rtlpriv = rtl_priv(hw);
1922 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1923
1924 rtl8821ae_dm_bt_query_bt_information(hw);
1925 rtl8821ae_dm_bt_bt_hw_counters_monitor(hw);
1926 rtl8821ae_dm_bt_bt_enable_disable_check(hw);
1927
1928 if (rtlpcipriv->btcoexist.bt_ant_num == ANT_X2) {
1929 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTCoex], 2 Ant mechanism\n"));
1930 _rtl8821ae_dm_bt_coexist_2_ant(hw);
1931 } else {
1932 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
1933 _rtl8821ae_dm_bt_coexist_1_ant(hw);
1934 }
1935
1936 if (!rtl8821ae_dm_bt_is_same_coexist_state(hw)) {
1937 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1938 ("[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n",
1939 rtlpcipriv->btcoexist.previous_state_h,
1940 rtlpcipriv->btcoexist.previous_state,
1941 rtlpcipriv->btcoexist.current_state_h,
1942 rtlpcipriv->btcoexist.current_state));
1943 rtlpcipriv->btcoexist.previous_state
1944 = rtlpcipriv->btcoexist.current_state;
1945 rtlpcipriv->btcoexist.previous_state_h
1946 = rtlpcipriv->btcoexist.current_state_h;
1947 }
1948}
1949
1950void rtl8821ae_dm_bt_parse_bt_info(struct ieee80211_hw *hw, u8 * tmp_buf, u8 len)
1951{
1952 struct rtl_priv *rtlpriv = rtl_priv(hw);
1953 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1954 u8 bt_info;
1955 u8 i;
1956
1957 hal_coex_8821ae.b_c2h_bt_info_req_sent = false;
1958 hal_coex_8821ae.bt_retry_cnt = 0;
1959 for (i = 0; i < len; i++) {
1960 if (i == 0) {
1961 hal_coex_8821ae.c2h_bt_info_original = tmp_buf[i];
1962 } else if (i == 1) {
1963 hal_coex_8821ae.bt_retry_cnt = tmp_buf[i];
1964 }
1965 if(i == len-1) {
1966 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x]", tmp_buf[i]));
1967 } else {
1968 RT_TRACE(COMP_BT_COEXIST, DBG_TRACE, ("0x%2x, ", tmp_buf[i]));
1969 }
1970 }
1971 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG,
1972 ("BT info bt_info (Data)= 0x%x\n",hal_coex_8821ae.c2h_bt_info_original));
1973 bt_info = hal_coex_8821ae.c2h_bt_info_original;
1974
1975 if(bt_info & BIT(2)){
1976 hal_coex_8821ae.b_c2h_bt_inquiry_page = true;
1977 } else {
1978 hal_coex_8821ae.b_c2h_bt_inquiry_page = false;
1979 }
1980
1981 if (bt_info & BTINFO_B_CONNECTION) {
1982 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTC2H], BTInfo: bConnect=true\n"));
1983 rtlpcipriv->btcoexist.b_bt_busy = true;
1984 rtlpcipriv->btcoexist.current_state &= ~BT_COEX_STATE_BT_IDLE;
1985 } else {
1986 RT_TRACE(COMP_BT_COEXIST, DBG_DMESG, ("[BTC2H], BTInfo: bConnect=false\n"));
1987 rtlpcipriv->btcoexist.b_bt_busy = false;
1988 rtlpcipriv->btcoexist.current_state |= BT_COEX_STATE_BT_IDLE;
1989 }
1990}
1991void rtl_8821ae_c2h_command_handle(struct ieee80211_hw *hw)
1992{
1993 struct rtl_priv *rtlpriv = rtl_priv(hw);
1994 struct c2h_evt_hdr c2h_event;
1995 u8 * ptmp_buf = NULL;
1996 u8 index = 0;
1997 u8 u1b_tmp = 0;
1998 memset(&c2h_event, 0, sizeof(c2h_event));
1999 u1b_tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL);
2000 RT_TRACE(COMP_FW, DBG_DMESG,
2001 ("&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1b_tmp));
2002 c2h_event.cmd_id = u1b_tmp & 0xF;
2003 c2h_event.cmd_len = (u1b_tmp & 0xF0) >> 4;
2004 c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1);
2005 RT_TRACE(COMP_FW, DBG_DMESG, ("cmd_id: %d, cmd_len: %d, cmd_seq: %d\n",
2006 c2h_event.cmd_id , c2h_event.cmd_len, c2h_event.cmd_seq));
2007 u1b_tmp = rtl_read_byte(rtlpriv, 0x01AF);
2008 if (u1b_tmp == C2H_EVT_HOST_CLOSE) {
2009 return;
2010 } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {
2011 rtl_write_byte(rtlpriv, 0x1AF, 0x00);
2012 return;
2013 }
0481dccb 2014 ptmp_buf = kmalloc(c2h_event.cmd_len, GFP_KERNEL);
3c05bedb
GKH
2015 if(ptmp_buf == NULL) {
2016 RT_TRACE(COMP_FW, DBG_TRACE, ("malloc cmd buf failed\n"));
2017 return;
2018 }
2019
2020 /* Read the content */
2021 for (index = 0; index < c2h_event.cmd_len; index ++) {
2022 ptmp_buf[index] = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 2+ index);
2023 }
2024
2025 switch(c2h_event.cmd_id) {
2026 case C2H_BT_RSSI:
2027 break;
2028
2029 case C2H_BT_OP_MODE:
2030 break;
2031
2032 case BT_INFO:
2033 RT_TRACE(COMP_FW, DBG_TRACE,
2034 ("BT info Byte[0] (ID) is 0x%x\n", c2h_event.cmd_id));
2035 RT_TRACE(COMP_FW, DBG_TRACE,
2036 ("BT info Byte[1] (Seq) is 0x%x\n", c2h_event.cmd_seq));
2037 RT_TRACE(COMP_FW, DBG_TRACE,
2038 ("BT info Byte[2] (Data)= 0x%x\n", ptmp_buf[0]));
2039
2040 if (rtlpriv->cfg->ops->get_btc_status()){
2041 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, ptmp_buf, c2h_event.cmd_len);
2042 }
2043 break;
2044 default:
2045 break;
2046 }
2047
fbc470d6 2048 kfree(ptmp_buf);
3c05bedb
GKH
2049
2050 rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);
2051}
2052
2053
2054
This page took 0.219205 seconds and 5 git commands to generate.