1 /******************************************************************************
3 * Copyright(c) 2012 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 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
26 /**************************************************************
29 * This file is for RTL8821A Co-exist mechanism
32 * 2012/11/15 Cosa first check in.
34 **************************************************************/
36 /**************************************************************
38 **************************************************************/
39 #include "halbt_precomp.h"
40 /**************************************************************
41 * Global variables, these are static variables
42 **************************************************************/
43 static struct coex_dm_8821a_1ant glcoex_dm_8821a_1ant;
44 static struct coex_dm_8821a_1ant *coex_dm = &glcoex_dm_8821a_1ant;
45 static struct coex_sta_8821a_1ant glcoex_sta_8821a_1ant;
46 static struct coex_sta_8821a_1ant *coex_sta = &glcoex_sta_8821a_1ant;
47 static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
50 static const char *const glbt_info_src_8821a_1ant[] = {
53 "BT Info[bt auto report]",
56 static u32 glcoex_ver_date_8821a_1ant = 20130816;
57 static u32 glcoex_ver_8821a_1ant = 0x41;
59 /**************************************************************
60 * local function proto type if needed
62 * local function start with btc8821a1ant_
63 **************************************************************/
64 static u8 btc8821a1ant_bt_rssi_state(struct btc_coexist *btcoexist,
65 u8 level_num, u8 rssi_thresh,
68 struct rtl_priv *rtlpriv = btcoexist->adapter;
70 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
72 bt_rssi = coex_sta->bt_rssi;
75 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
76 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
77 if (bt_rssi >= (rssi_thresh +
78 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
79 bt_rssi_state = BTC_RSSI_STATE_HIGH;
80 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
81 "[BTCoex], BT Rssi state switch to High\n");
83 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
84 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
85 "[BTCoex], BT Rssi state stay at Low\n");
88 if (bt_rssi < rssi_thresh) {
89 bt_rssi_state = BTC_RSSI_STATE_LOW;
90 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
91 "[BTCoex], BT Rssi state switch to Low\n");
93 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
94 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
95 "[BTCoex], BT Rssi state stay at High\n");
98 } else if (level_num == 3) {
99 if (rssi_thresh > rssi_thresh1) {
100 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
101 "[BTCoex], BT Rssi thresh error!!\n");
102 return coex_sta->pre_bt_rssi_state;
105 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
106 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
107 if (bt_rssi >= (rssi_thresh +
108 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
109 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
110 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
111 "[BTCoex], BT Rssi state switch to Medium\n");
113 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
114 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
115 "[BTCoex], BT Rssi state stay at Low\n");
117 } else if ((coex_sta->pre_bt_rssi_state ==
118 BTC_RSSI_STATE_MEDIUM) ||
119 (coex_sta->pre_bt_rssi_state ==
120 BTC_RSSI_STATE_STAY_MEDIUM)) {
121 if (bt_rssi >= (rssi_thresh1 +
122 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
123 bt_rssi_state = BTC_RSSI_STATE_HIGH;
124 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
125 "[BTCoex], BT Rssi state switch to High\n");
126 } else if (bt_rssi < rssi_thresh) {
127 bt_rssi_state = BTC_RSSI_STATE_LOW;
128 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
129 "[BTCoex], BT Rssi state switch to Low\n");
131 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
132 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
133 "[BTCoex], BT Rssi state stay at Medium\n");
136 if (bt_rssi < rssi_thresh1) {
137 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
138 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
139 "[BTCoex], BT Rssi state switch to Medium\n");
141 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
142 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
143 "[BTCoex], BT Rssi state stay at High\n");
147 coex_sta->pre_bt_rssi_state = bt_rssi_state;
149 return bt_rssi_state;
152 static u8 btc8821a1ant_wifi_rssi_state(struct btc_coexist *btcoexist,
153 u8 index, u8 level_num, u8 rssi_thresh,
156 struct rtl_priv *rtlpriv = btcoexist->adapter;
158 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
160 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
162 if (level_num == 2) {
163 if ((coex_sta->pre_wifi_rssi_state[index] ==
164 BTC_RSSI_STATE_LOW) ||
165 (coex_sta->pre_wifi_rssi_state[index] ==
166 BTC_RSSI_STATE_STAY_LOW)) {
167 if (wifi_rssi >= (rssi_thresh +
168 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
169 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
170 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
171 "[BTCoex], wifi RSSI state switch to High\n");
173 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
174 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
175 "[BTCoex], wifi RSSI state stay at Low\n");
178 if (wifi_rssi < rssi_thresh) {
179 wifi_rssi_state = BTC_RSSI_STATE_LOW;
180 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
181 "[BTCoex], wifi RSSI state switch to Low\n");
183 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
184 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
185 "[BTCoex], wifi RSSI state stay at High\n");
188 } else if (level_num == 3) {
189 if (rssi_thresh > rssi_thresh1) {
190 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
191 "[BTCoex], wifi RSSI thresh error!!\n");
192 return coex_sta->pre_wifi_rssi_state[index];
195 if ((coex_sta->pre_wifi_rssi_state[index] ==
196 BTC_RSSI_STATE_LOW) ||
197 (coex_sta->pre_wifi_rssi_state[index] ==
198 BTC_RSSI_STATE_STAY_LOW)) {
199 if (wifi_rssi >= (rssi_thresh +
200 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
201 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
202 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
203 "[BTCoex], wifi RSSI state switch to Medium\n");
205 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
206 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
207 "[BTCoex], wifi RSSI state stay at Low\n");
209 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
210 BTC_RSSI_STATE_MEDIUM) ||
211 (coex_sta->pre_wifi_rssi_state[index] ==
212 BTC_RSSI_STATE_STAY_MEDIUM)) {
213 if (wifi_rssi >= (rssi_thresh1 +
214 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
215 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
216 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
217 "[BTCoex], wifi RSSI state switch to High\n");
218 } else if (wifi_rssi < rssi_thresh) {
219 wifi_rssi_state = BTC_RSSI_STATE_LOW;
220 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
221 "[BTCoex], wifi RSSI state switch to Low\n");
223 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
224 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
225 "[BTCoex], wifi RSSI state stay at Medium\n");
228 if (wifi_rssi < rssi_thresh1) {
229 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
230 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
231 "[BTCoex], wifi RSSI state switch to Medium\n");
233 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
234 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
235 "[BTCoex], wifi RSSI state stay at High\n");
239 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
241 return wifi_rssi_state;
244 static void btc8821a1ant_update_ra_mask(struct btc_coexist *btcoexist,
245 bool force_exec, u32 dis_rate_mask)
247 coex_dm->cur_ra_mask = dis_rate_mask;
250 (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) {
251 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
252 &coex_dm->cur_ra_mask);
254 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
257 static void btc8821a1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
258 bool force_exec, u8 type)
260 bool wifi_under_b_mode = false;
262 coex_dm->cur_arfr_type = type;
265 (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
266 switch (coex_dm->cur_arfr_type) {
267 case 0: /* normal mode */
268 btcoexist->btc_write_4byte(btcoexist, 0x430,
269 coex_dm->backup_arfr_cnt1);
270 btcoexist->btc_write_4byte(btcoexist, 0x434,
271 coex_dm->backup_arfr_cnt2);
274 btcoexist->btc_get(btcoexist,
275 BTC_GET_BL_WIFI_UNDER_B_MODE,
277 if (wifi_under_b_mode) {
278 btcoexist->btc_write_4byte(btcoexist, 0x430,
280 btcoexist->btc_write_4byte(btcoexist, 0x434,
283 btcoexist->btc_write_4byte(btcoexist, 0x430,
285 btcoexist->btc_write_4byte(btcoexist, 0x434,
294 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
297 static void btc8821a1ant_retry_limit(struct btc_coexist *btcoexist,
298 bool force_exec, u8 type)
300 coex_dm->cur_retry_limit_type = type;
303 (coex_dm->pre_retry_limit_type != coex_dm->cur_retry_limit_type)) {
304 switch (coex_dm->cur_retry_limit_type) {
305 case 0: /* normal mode */
306 btcoexist->btc_write_2byte(btcoexist, 0x42a,
307 coex_dm->backup_retry_limit);
309 case 1: /* retry limit = 8 */
310 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
316 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
319 static void btc8821a1ant_ampdu_max_time(struct btc_coexist *btcoexist,
320 bool force_exec, u8 type)
322 coex_dm->cur_ampdu_time_type = type;
325 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
326 switch (coex_dm->cur_ampdu_time_type) {
327 case 0: /* normal mode */
328 btcoexist->btc_write_1byte(btcoexist, 0x456,
329 coex_dm->backup_ampdu_max_time);
331 case 1: /* AMPDU time = 0x38 * 32us */
332 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
339 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
342 static void btc8821a1ant_limited_tx(struct btc_coexist *btcoexist,
343 bool force_exec, u8 ra_mask_type,
344 u8 arfr_type, u8 retry_limit_type,
347 switch (ra_mask_type) {
348 case 0: /* normal mode */
349 btc8821a1ant_update_ra_mask(btcoexist, force_exec, 0x0);
351 case 1: /* disable cck 1/2 */
352 btc8821a1ant_update_ra_mask(btcoexist, force_exec,
355 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
356 btc8821a1ant_update_ra_mask(btcoexist, force_exec,
363 btc8821a1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
364 btc8821a1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
365 btc8821a1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
368 static void btc8821a1ant_limited_rx(struct btc_coexist *btcoexist,
369 bool force_exec, bool rej_ap_agg_pkt,
370 bool bt_ctrl_agg_buf_size, u8 agg_buf_size)
372 bool reject_rx_agg = rej_ap_agg_pkt;
373 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
374 u8 rx_agg_size = agg_buf_size;
376 /* Rx Aggregation related setting */
377 btcoexist->btc_set(btcoexist,
378 BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);
379 /* decide BT control aggregation buf size or not */
380 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
381 &bt_ctrl_rx_agg_size);
382 /* aggregation buf size, only work when BT control Rx agg size */
383 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
384 /* real update aggregation setting */
385 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
388 static void btc8821a1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
390 u32 reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;
391 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
393 reg_hp_tx_rx = 0x770;
394 reg_lp_tx_rx = 0x774;
396 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);
397 reg_hp_tx = u4_tmp & MASKLWORD;
398 reg_hp_rx = (u4_tmp & MASKHWORD) >> 16;
400 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);
401 reg_lp_tx = u4_tmp & MASKLWORD;
402 reg_lp_rx = (u4_tmp & MASKHWORD) >> 16;
404 coex_sta->high_priority_tx = reg_hp_tx;
405 coex_sta->high_priority_rx = reg_hp_rx;
406 coex_sta->low_priority_tx = reg_lp_tx;
407 coex_sta->low_priority_rx = reg_lp_rx;
410 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
413 static void btc8821a1ant_query_bt_info(struct btc_coexist *btcoexist)
415 struct rtl_priv *rtlpriv = btcoexist->adapter;
416 u8 h2c_parameter[1] = {0};
418 coex_sta->c2h_bt_info_req_sent = true;
420 h2c_parameter[0] |= BIT0; /* trigger */
422 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
423 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
426 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
429 static void btc8821a1ant_update_bt_link_info(struct btc_coexist *btcoexist)
431 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
432 bool bt_hs_on = false;
434 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
436 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
437 bt_link_info->sco_exist = coex_sta->sco_exist;
438 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
439 bt_link_info->pan_exist = coex_sta->pan_exist;
440 bt_link_info->hid_exist = coex_sta->hid_exist;
442 /* work around for HS mode */
444 bt_link_info->pan_exist = true;
445 bt_link_info->bt_link_exist = true;
448 /* check if Sco only */
449 if (bt_link_info->sco_exist &&
450 !bt_link_info->a2dp_exist &&
451 !bt_link_info->pan_exist &&
452 !bt_link_info->hid_exist)
453 bt_link_info->sco_only = true;
455 bt_link_info->sco_only = false;
457 /* check if A2dp only */
458 if (!bt_link_info->sco_exist &&
459 bt_link_info->a2dp_exist &&
460 !bt_link_info->pan_exist &&
461 !bt_link_info->hid_exist)
462 bt_link_info->a2dp_only = true;
464 bt_link_info->a2dp_only = false;
466 /* check if Pan only */
467 if (!bt_link_info->sco_exist &&
468 !bt_link_info->a2dp_exist &&
469 bt_link_info->pan_exist &&
470 !bt_link_info->hid_exist)
471 bt_link_info->pan_only = true;
473 bt_link_info->pan_only = false;
475 /* check if Hid only */
476 if (!bt_link_info->sco_exist &&
477 !bt_link_info->a2dp_exist &&
478 !bt_link_info->pan_exist &&
479 bt_link_info->hid_exist)
480 bt_link_info->hid_only = true;
482 bt_link_info->hid_only = false;
485 static u8 btc8821a1ant_action_algorithm(struct btc_coexist *btcoexist)
487 struct rtl_priv *rtlpriv = btcoexist->adapter;
488 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
489 bool bt_hs_on = false;
490 u8 algorithm = BT_8821A_1ANT_COEX_ALGO_UNDEFINED;
491 u8 num_of_diff_profile = 0;
493 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
495 if (!bt_link_info->bt_link_exist) {
496 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
497 "[BTCoex], No BT link exists!!!\n");
501 if (bt_link_info->sco_exist)
502 num_of_diff_profile++;
503 if (bt_link_info->hid_exist)
504 num_of_diff_profile++;
505 if (bt_link_info->pan_exist)
506 num_of_diff_profile++;
507 if (bt_link_info->a2dp_exist)
508 num_of_diff_profile++;
510 if (num_of_diff_profile == 1) {
511 if (bt_link_info->sco_exist) {
512 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
513 "[BTCoex], BT Profile = SCO only\n");
514 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
516 if (bt_link_info->hid_exist) {
517 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
518 "[BTCoex], BT Profile = HID only\n");
519 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
520 } else if (bt_link_info->a2dp_exist) {
521 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
522 "[BTCoex], BT Profile = A2DP only\n");
523 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;
524 } else if (bt_link_info->pan_exist) {
526 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
528 "[BTCoex], BT Profile = PAN(HS) only\n");
529 algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;
531 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
533 "[BTCoex], BT Profile = PAN(EDR) only\n");
534 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;
538 } else if (num_of_diff_profile == 2) {
539 if (bt_link_info->sco_exist) {
540 if (bt_link_info->hid_exist) {
541 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
542 "[BTCoex], BT Profile = SCO + HID\n");
543 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
544 } else if (bt_link_info->a2dp_exist) {
545 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
546 "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
547 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
548 } else if (bt_link_info->pan_exist) {
550 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
552 "[BTCoex], BT Profile = SCO + PAN(HS)\n");
553 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
555 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
557 "[BTCoex], BT Profile = SCO + PAN(EDR)\n");
558 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
562 if (bt_link_info->hid_exist &&
563 bt_link_info->a2dp_exist) {
564 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
565 "[BTCoex], BT Profile = HID + A2DP\n");
566 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
567 } else if (bt_link_info->hid_exist &&
568 bt_link_info->pan_exist) {
570 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
572 "[BTCoex], BT Profile = HID + PAN(HS)\n");
573 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
575 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
577 "[BTCoex], BT Profile = HID + PAN(EDR)\n");
578 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
580 } else if (bt_link_info->pan_exist &&
581 bt_link_info->a2dp_exist) {
583 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
585 "[BTCoex], BT Profile = A2DP + PAN(HS)\n");
586 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;
588 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
590 "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
591 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;
595 } else if (num_of_diff_profile == 3) {
596 if (bt_link_info->sco_exist) {
597 if (bt_link_info->hid_exist &&
598 bt_link_info->a2dp_exist) {
599 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
600 "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
601 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
602 } else if (bt_link_info->hid_exist &&
603 bt_link_info->pan_exist) {
605 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
607 "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
608 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
610 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
612 "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
613 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
615 } else if (bt_link_info->pan_exist &&
616 bt_link_info->a2dp_exist) {
618 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
620 "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
621 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
623 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
625 "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
626 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
630 if (bt_link_info->hid_exist &&
631 bt_link_info->pan_exist &&
632 bt_link_info->a2dp_exist) {
634 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
636 "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
637 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
639 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
641 "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
642 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
646 } else if (num_of_diff_profile >= 3) {
647 if (bt_link_info->sco_exist) {
648 if (bt_link_info->hid_exist &&
649 bt_link_info->pan_exist &&
650 bt_link_info->a2dp_exist) {
652 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
654 "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
657 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
659 "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
660 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
668 static void btc8821a1ant_set_sw_penalty_tx_rate(struct btc_coexist *btcoexist,
671 struct rtl_priv *rtlpriv = btcoexist->adapter;
672 u8 h2c_parameter[6] = {0};
674 h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty*/
676 if (low_penalty_ra) {
677 h2c_parameter[1] |= BIT0;
678 /* normal rate except MCS7/6/5, OFDM54/48/36 */
679 h2c_parameter[2] = 0x00;
680 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
681 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
682 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
685 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
686 "[BTCoex], set WiFi Low-Penalty Retry: %s",
687 (low_penalty_ra ? "ON!!" : "OFF!!"));
689 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
692 static void btc8821a1ant_low_penalty_ra(struct btc_coexist *btcoexist,
693 bool force_exec, bool low_penalty_ra)
695 coex_dm->cur_low_penalty_ra = low_penalty_ra;
698 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
701 btc8821a1ant_set_sw_penalty_tx_rate(btcoexist,
702 coex_dm->cur_low_penalty_ra);
704 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
707 static void btc8821a1ant_set_coex_table(struct btc_coexist *btcoexist,
708 u32 val0x6c0, u32 val0x6c4,
709 u32 val0x6c8, u8 val0x6cc)
711 struct rtl_priv *rtlpriv = btcoexist->adapter;
713 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
714 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
715 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
717 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
718 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
719 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
721 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
722 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
723 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
725 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
726 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
727 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
730 static void btc8821a1ant_coex_table(struct btc_coexist *btcoexist,
731 bool force_exec, u32 val0x6c0, u32 val0x6c4,
732 u32 val0x6c8, u8 val0x6cc)
734 struct rtl_priv *rtlpriv = btcoexist->adapter;
736 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
737 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
738 (force_exec ? "force to" : ""), val0x6c0, val0x6c4,
740 coex_dm->cur_val_0x6c0 = val0x6c0;
741 coex_dm->cur_val_0x6c4 = val0x6c4;
742 coex_dm->cur_val_0x6c8 = val0x6c8;
743 coex_dm->cur_val_0x6cc = val0x6cc;
746 if ((coex_dm->pre_val_0x6c0 == coex_dm->cur_val_0x6c0) &&
747 (coex_dm->pre_val_0x6c4 == coex_dm->cur_val_0x6c4) &&
748 (coex_dm->pre_val_0x6c8 == coex_dm->cur_val_0x6c8) &&
749 (coex_dm->pre_val_0x6cc == coex_dm->cur_val_0x6cc))
752 btc8821a1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
755 coex_dm->pre_val_0x6c0 = coex_dm->cur_val_0x6c0;
756 coex_dm->pre_val_0x6c4 = coex_dm->cur_val_0x6c4;
757 coex_dm->pre_val_0x6c8 = coex_dm->cur_val_0x6c8;
758 coex_dm->pre_val_0x6cc = coex_dm->cur_val_0x6cc;
761 static void btc8821a1ant_coex_table_with_type(struct btc_coexist *btcoexist,
762 bool force_exec, u8 type)
766 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
767 0x55555555, 0xffffff, 0x3);
770 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
771 0x5a5a5a5a, 0xffffff, 0x3);
774 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
775 0x5a5a5a5a, 0xffffff, 0x3);
778 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
779 0xaaaaaaaa, 0xffffff, 0x3);
782 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
783 0x5a5a5a5a, 0xffffff, 0x3);
786 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
787 0xaaaa5a5a, 0xffffff, 0x3);
790 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
791 0xaaaa5a5a, 0xffffff, 0x3);
794 btc8821a1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
795 0xaaaaaaaa, 0xffffff, 0x3);
802 static void btc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
805 struct rtl_priv *rtlpriv = btcoexist->adapter;
806 u8 h2c_parameter[1] = {0};
809 h2c_parameter[0] |= BIT0; /* function enable */
811 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
812 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
815 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
818 static void btc8821a1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
819 bool force_exec, bool enable)
821 struct rtl_priv *rtlpriv = btcoexist->adapter;
823 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
824 "[BTCoex], %s turn Ignore WlanAct %s\n",
825 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
826 coex_dm->cur_ignore_wlan_act = enable;
829 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
830 "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
831 coex_dm->pre_ignore_wlan_act,
832 coex_dm->cur_ignore_wlan_act);
834 if (coex_dm->pre_ignore_wlan_act ==
835 coex_dm->cur_ignore_wlan_act)
838 btc8821a1ant_set_fw_ignore_wlan_act(btcoexist, enable);
840 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
843 static void btc8821a1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
844 u8 byte2, u8 byte3, u8 byte4, u8 byte5)
846 struct rtl_priv *rtlpriv = btcoexist->adapter;
847 u8 h2c_parameter[5] = {0};
848 u8 real_byte1 = byte1, real_byte5 = byte5;
849 bool ap_enable = false;
851 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
855 if (byte1 & BIT4 && !(byte1 & BIT5)) {
856 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
857 "[BTCoex], FW for 1Ant AP mode\n");
866 h2c_parameter[0] = real_byte1;
867 h2c_parameter[1] = byte2;
868 h2c_parameter[2] = byte3;
869 h2c_parameter[3] = byte4;
870 h2c_parameter[4] = real_byte5;
872 coex_dm->ps_tdma_para[0] = real_byte1;
873 coex_dm->ps_tdma_para[1] = byte2;
874 coex_dm->ps_tdma_para[2] = byte3;
875 coex_dm->ps_tdma_para[3] = byte4;
876 coex_dm->ps_tdma_para[4] = real_byte5;
878 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
879 "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
881 h2c_parameter[1] << 24 |
882 h2c_parameter[2] << 16 |
883 h2c_parameter[3] << 8 |
885 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
888 static void btc8821a1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
889 u8 lps_val, u8 rpwm_val)
894 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
895 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
898 static void btc8821a1ant_lps_rpwm(struct btc_coexist *btcoexist,
899 bool force_exec, u8 lps_val, u8 rpwm_val)
901 struct rtl_priv *rtlpriv = btcoexist->adapter;
903 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
904 "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
905 (force_exec ? "force to" : ""), lps_val, rpwm_val);
906 coex_dm->cur_lps = lps_val;
907 coex_dm->cur_rpwm = rpwm_val;
910 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
911 "[BTCoex], LPS-RxBeaconMode = 0x%x, LPS-RPWM = 0x%x!!\n",
912 coex_dm->cur_lps, coex_dm->cur_rpwm);
914 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
915 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
916 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
917 "[BTCoex], LPS-RPWM_Last = 0x%x, LPS-RPWM_Now = 0x%x!!\n",
918 coex_dm->pre_rpwm, coex_dm->cur_rpwm);
923 btc8821a1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
925 coex_dm->pre_lps = coex_dm->cur_lps;
926 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
929 static void btc8821a1ant_sw_mechanism(struct btc_coexist *btcoexist,
932 struct rtl_priv *rtlpriv = btcoexist->adapter;
934 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
935 "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
937 btc8821a1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
940 static void btc8821a1ant_set_ant_path(struct btc_coexist *btcoexist,
941 u8 ant_pos_type, bool init_hw_cfg,
944 struct btc_board_info *board_info = &btcoexist->board_info;
946 u8 h2c_parameter[2] = {0};
949 /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */
950 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
953 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
955 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x975, 0x3, 0x3);
956 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
958 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
959 /* tell firmware "antenna inverse"
960 * WRONG firmware antenna control code, need fw to fix
962 h2c_parameter[0] = 1;
963 h2c_parameter[1] = 1;
964 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
967 /* tell firmware "no antenna inverse"
968 * WRONG firmware antenna control code, need fw to fix
970 h2c_parameter[0] = 0;
971 h2c_parameter[1] = 1;
972 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
975 } else if (wifi_off) {
976 /* 0x4c[24:23] = 00, Set Antenna control
977 * by BT_RFE_CTRL BT Vendor 0xac = 0xf002
979 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
982 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
985 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
988 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
991 /* ext switch setting */
992 switch (ant_pos_type) {
993 case BTC_ANT_PATH_WIFI:
994 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
995 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
996 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
999 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1002 case BTC_ANT_PATH_BT:
1003 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
1004 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1005 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1008 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1012 case BTC_ANT_PATH_PTA:
1013 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x66);
1014 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1015 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1018 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1024 static void btc8821a1ant_ps_tdma(struct btc_coexist *btcoexist,
1025 bool force_exec, bool turn_on, u8 type)
1027 struct rtl_priv *rtlpriv = btcoexist->adapter;
1028 u8 rssi_adjust_val = 0;
1030 coex_dm->cur_ps_tdma_on = turn_on;
1031 coex_dm->cur_ps_tdma = type;
1034 if (coex_dm->cur_ps_tdma_on) {
1035 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1036 "[BTCoex], ********** TDMA(on, %d) **********\n",
1037 coex_dm->cur_ps_tdma);
1039 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1040 "[BTCoex], ********** TDMA(off, %d) **********\n",
1041 coex_dm->cur_ps_tdma);
1043 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1044 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1050 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1054 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x3a,
1056 rssi_adjust_val = 11;
1059 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x2b,
1061 rssi_adjust_val = 14;
1064 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,
1068 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1070 rssi_adjust_val = 17;
1073 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
1077 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
1081 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1085 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1089 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
1091 rssi_adjust_val = 18;
1094 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1098 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1100 rssi_adjust_val = 20;
1103 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1107 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x12,
1111 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1e,
1115 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1119 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1121 rssi_adjust_val = 18;
1124 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1126 rssi_adjust_val = 14;
1129 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1133 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1137 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1141 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1143 rssi_adjust_val = 22;
1146 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1148 rssi_adjust_val = 22;
1151 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1153 rssi_adjust_val = 22;
1156 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1158 rssi_adjust_val = 22;
1161 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1163 rssi_adjust_val = 22;
1166 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1170 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1174 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1178 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1182 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1186 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,
1190 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1194 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1198 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1202 /* SoftAP only with no sta associated, BT disable, TDMA
1203 * mode for power saving
1205 * here softap mode screen off will cost 70-80mA for
1208 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1212 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1216 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x20,
1220 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1225 /* disable PS tdma */
1229 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0,
1231 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1236 /* Software control, Antenna at BT side */
1237 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1239 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1243 /* Software control, Antenna at WiFi side */
1244 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1246 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
1251 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1253 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1258 rssi_adjust_val = 0;
1259 btcoexist->btc_set(btcoexist,
1260 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1262 /* update pre state */
1263 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1264 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1267 static bool btc8821a1ant_is_common_action(struct btc_coexist *btcoexist)
1269 struct rtl_priv *rtlpriv = btcoexist->adapter;
1270 bool common = false, wifi_connected = false, wifi_busy = false;
1272 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1274 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1276 if (!wifi_connected &&
1277 BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1278 coex_dm->bt_status) {
1279 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1280 "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
1281 btc8821a1ant_sw_mechanism(btcoexist, false);
1284 } else if (wifi_connected &&
1285 (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1286 coex_dm->bt_status)) {
1287 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1288 "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1289 btc8821a1ant_sw_mechanism(btcoexist, false);
1292 } else if (!wifi_connected &&
1293 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1294 coex_dm->bt_status)) {
1295 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1296 "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
1297 btc8821a1ant_sw_mechanism(btcoexist, false);
1300 } else if (wifi_connected &&
1301 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1302 coex_dm->bt_status)) {
1303 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1304 "[BTCoex], Wifi connected + BT connected-idle!!\n");
1305 btc8821a1ant_sw_mechanism(btcoexist, false);
1308 } else if (!wifi_connected &&
1309 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE !=
1310 coex_dm->bt_status)) {
1311 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1312 "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
1313 btc8821a1ant_sw_mechanism(btcoexist, false);
1318 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1319 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1321 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1322 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1331 static void btc8821a1ant_ps_tdma_check_for_pwr_save(struct btc_coexist *btcoex,
1336 btcoex->btc_get(btcoex, BTC_GET_U1_LPS_MODE, &lps_mode);
1339 /* already under LPS state */
1341 /* keep state under LPS, do nothing */
1343 /* will leave LPS state, turn off psTdma first */
1344 btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1349 /* will enter LPS state, turn off psTdma first */
1350 btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1352 /* keep state under NO PS state, do nothing */
1357 static void btc8821a1ant_power_save_state(struct btc_coexist *btcoexist,
1358 u8 ps_type, u8 lps_val, u8 rpwm_val)
1360 bool low_pwr_disable = false;
1363 case BTC_PS_WIFI_NATIVE:
1364 /* recover to original 32k low power setting */
1365 low_pwr_disable = false;
1366 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1368 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1371 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist,
1373 btc8821a1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1375 /* when coex force to enter LPS, do not enter 32k low power */
1376 low_pwr_disable = true;
1377 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1379 /* power save must executed before psTdma */
1380 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1382 case BTC_PS_LPS_OFF:
1383 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist, false);
1384 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1391 static void btc8821a1ant_coex_under_5g(struct btc_coexist *btcoexist)
1393 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1395 btc8821a1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1397 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 10);
1399 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1401 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1403 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);
1406 /***********************************************
1408 * Software Coex Mechanism start
1410 ***********************************************/
1412 /* SCO only or SCO+PAN(HS) */
1413 static void btc8821a1ant_action_sco(struct btc_coexist *btcoexist)
1415 btc8821a1ant_sw_mechanism(btcoexist, true);
1418 static void btc8821a1ant_action_hid(struct btc_coexist *btcoexist)
1420 btc8821a1ant_sw_mechanism(btcoexist, true);
1423 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
1424 static void btc8821a1ant_action_a2dp(struct btc_coexist *btcoexist)
1426 btc8821a1ant_sw_mechanism(btcoexist, false);
1429 static void btc8821a1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
1431 btc8821a1ant_sw_mechanism(btcoexist, false);
1434 static void btc8821a1ant_action_pan_edr(struct btc_coexist *btcoexist)
1436 btc8821a1ant_sw_mechanism(btcoexist, false);
1440 static void btc8821a1ant_action_pan_hs(struct btc_coexist *btcoexist)
1442 btc8821a1ant_sw_mechanism(btcoexist, false);
1446 static void btc8821a1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
1448 btc8821a1ant_sw_mechanism(btcoexist, false);
1451 static void btc8821a1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
1453 btc8821a1ant_sw_mechanism(btcoexist, true);
1456 /* HID+A2DP+PAN(EDR) */
1457 static void btc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
1459 btc8821a1ant_sw_mechanism(btcoexist, true);
1462 static void btc8821a1ant_action_hid_a2dp(struct btc_coexist *btcoexist)
1464 btc8821a1ant_sw_mechanism(btcoexist, true);
1467 /***********************************************
1469 * Non-Software Coex Mechanism start
1471 ***********************************************/
1473 void btc8821a1ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
1475 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1477 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1478 /* tdma and coex table */
1479 if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1480 if (bt_link_info->a2dp_exist) {
1481 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1482 btc8821a1ant_coex_table_with_type(btcoexist,
1484 } else if (bt_link_info->a2dp_exist &&
1485 bt_link_info->pan_exist) {
1486 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1487 btc8821a1ant_coex_table_with_type(btcoexist,
1490 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1491 btc8821a1ant_coex_table_with_type(btcoexist,
1494 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1495 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1496 coex_dm->bt_status)) {
1497 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1498 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1500 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1501 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1506 void btc8821a1ant_action_wifi_not_connected_asso_auth(
1507 struct btc_coexist *btcoexist)
1509 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1511 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1514 /* tdma and coex table */
1515 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
1516 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1517 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1518 } else if ((bt_link_info->a2dp_exist) || (bt_link_info->pan_exist)) {
1519 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1520 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1522 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1523 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1528 static void btc8821a1ant_action_hs(struct btc_coexist *btcoexist)
1530 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1531 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1534 static void btc8821a1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1536 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1537 bool wifi_connected = false;
1538 bool ap_enable = false;
1539 bool wifi_busy = false, bt_busy = false;
1541 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1543 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1545 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1546 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1548 if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1549 btc8821a1ant_power_save_state(btcoexist,
1550 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1551 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1552 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1553 } else if ((bt_link_info->sco_exist) || (bt_link_info->a2dp_exist) ||
1554 (bt_link_info->hid_only)) {
1555 /* SCO/HID-only busy */
1556 btc8821a1ant_power_save_state(btcoexist,
1557 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1558 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1559 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1560 } else if ((bt_link_info->a2dp_exist) && (bt_link_info->hid_exist)) {
1562 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1564 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1566 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1567 } else if ((bt_link_info->pan_exist) || (wifi_busy)) {
1568 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1570 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1572 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1574 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1576 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1577 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1581 static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1584 /* tdma and coex table */
1585 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1587 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1590 static void btc8821a1ant_act_wifi_con_bt_acl_busy(struct btc_coexist *btcoexist,
1595 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1597 bt_rssi_state = btc8821a1ant_bt_rssi_state(btcoexist, 2, 28, 0);
1599 if (bt_link_info->hid_only) {
1601 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1603 coex_dm->auto_tdma_adjust = false;
1605 } else if (bt_link_info->a2dp_only) {
1607 if (wifi_status == BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1608 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1609 btc8821a1ant_coex_table_with_type(btcoexist,
1611 coex_dm->auto_tdma_adjust = false;
1612 } else if ((bt_rssi_state != BTC_RSSI_STATE_HIGH) &&
1613 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1614 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1615 btc8821a1ant_coex_table_with_type(btcoexist,
1618 /* for low BT RSSI */
1619 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1620 btc8821a1ant_coex_table_with_type(btcoexist,
1622 coex_dm->auto_tdma_adjust = false;
1624 } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1626 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1627 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1628 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1630 coex_dm->auto_tdma_adjust = false;
1633 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1635 coex_dm->auto_tdma_adjust = false;
1638 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1639 } else if ((bt_link_info->pan_only) ||
1640 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1641 /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */
1642 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1643 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
1644 coex_dm->auto_tdma_adjust = false;
1645 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1646 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1647 bt_link_info->pan_exist)) {
1648 /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */
1649 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 43);
1650 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1651 coex_dm->auto_tdma_adjust = false;
1653 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1654 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1655 coex_dm->auto_tdma_adjust = false;
1660 void btc8821a1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)
1662 /* power save state */
1663 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1665 /* tdma and coex table */
1666 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1667 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1670 static void btc8821a1ant_act_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1672 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1674 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1676 /* tdma and coex table */
1677 if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1678 if (bt_link_info->a2dp_exist) {
1679 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1680 btc8821a1ant_coex_table_with_type(btcoexist,
1682 } else if (bt_link_info->a2dp_exist &&
1683 bt_link_info->pan_exist) {
1684 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1685 btc8821a1ant_coex_table_with_type(btcoexist,
1688 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1689 btc8821a1ant_coex_table_with_type(btcoexist,
1692 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1693 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1694 coex_dm->bt_status)) {
1695 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1696 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1698 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1699 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1704 void btc8821a1ant_action_wifi_connected_scan(struct btc_coexist *btcoexist)
1706 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1708 /* power save state */
1709 btc8821a1ant_power_save_state(btcoexist,
1710 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1712 /* tdma and coex table */
1713 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1714 if (bt_link_info->a2dp_exist) {
1715 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1716 btc8821a1ant_coex_table_with_type(btcoexist,
1719 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1720 btc8821a1ant_coex_table_with_type(btcoexist,
1723 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1724 (coex_dm->bt_status ==
1725 BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY)) {
1726 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1727 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1729 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1730 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1734 static void btc8821a1ant_act_wifi_conn_sp_pkt(struct btc_coexist *btcoexist)
1736 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1738 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1741 /* tdma and coex table */
1742 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1743 (bt_link_info->a2dp_exist)) {
1744 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1745 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1748 if ((bt_link_info->hid_exist) && (bt_link_info->a2dp_exist)) {
1749 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1750 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1751 } else if (bt_link_info->pan_exist) {
1752 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1753 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1755 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1756 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1760 static void btc8821a1ant_action_wifi_connected(struct btc_coexist *btcoexist)
1762 struct rtl_priv *rtlpriv = btcoexist->adapter;
1763 bool wifi_busy = false;
1764 bool scan = false, link = false, roam = false;
1765 bool under_4way = false;
1766 bool ap_enable = false;
1768 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1769 "[BTCoex], CoexForWifiConnect()===>\n");
1771 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
1774 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1775 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1776 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
1780 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1781 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1782 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1783 if (scan || link || roam) {
1785 btc8821a1ant_action_wifi_connected_scan(btcoexist);
1787 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1789 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1790 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
1794 /* power save state*/
1795 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1797 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1798 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY ==
1799 coex_dm->bt_status && !ap_enable &&
1800 !btcoexist->bt_link_info.hid_only) {
1801 if (!wifi_busy && btcoexist->bt_link_info.a2dp_only)
1803 btc8821a1ant_power_save_state(btcoexist,
1804 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1806 btc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON,
1809 btc8821a1ant_power_save_state(btcoexist,
1814 /* tdma and coex table */
1816 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1817 btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1818 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1819 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1820 coex_dm->bt_status) ||
1821 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1822 coex_dm->bt_status)) {
1823 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1824 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1826 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1827 btc8821a1ant_coex_table_with_type(btcoexist,
1831 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1832 btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1833 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1834 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1835 coex_dm->bt_status) ||
1836 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1837 coex_dm->bt_status)) {
1838 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1839 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1841 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1842 btc8821a1ant_coex_table_with_type(btcoexist,
1848 static void btc8821a1ant_run_sw_coex_mech(struct btc_coexist *btcoexist)
1850 struct rtl_priv *rtlpriv = btcoexist->adapter;
1853 algorithm = btc8821a1ant_action_algorithm(btcoexist);
1854 coex_dm->cur_algorithm = algorithm;
1856 if (!btc8821a1ant_is_common_action(btcoexist)) {
1857 switch (coex_dm->cur_algorithm) {
1858 case BT_8821A_1ANT_COEX_ALGO_SCO:
1859 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1860 "[BTCoex], Action algorithm = SCO\n");
1861 btc8821a1ant_action_sco(btcoexist);
1863 case BT_8821A_1ANT_COEX_ALGO_HID:
1864 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1865 "[BTCoex], Action algorithm = HID\n");
1866 btc8821a1ant_action_hid(btcoexist);
1868 case BT_8821A_1ANT_COEX_ALGO_A2DP:
1869 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1870 "[BTCoex], Action algorithm = A2DP\n");
1871 btc8821a1ant_action_a2dp(btcoexist);
1873 case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:
1874 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1875 "[BTCoex], Action algorithm = A2DP+PAN(HS)\n");
1876 btc8821a1ant_action_a2dp_pan_hs(btcoexist);
1878 case BT_8821A_1ANT_COEX_ALGO_PANEDR:
1879 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1880 "[BTCoex], Action algorithm = PAN(EDR)\n");
1881 btc8821a1ant_action_pan_edr(btcoexist);
1883 case BT_8821A_1ANT_COEX_ALGO_PANHS:
1884 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1885 "[BTCoex], Action algorithm = HS mode\n");
1886 btc8821a1ant_action_pan_hs(btcoexist);
1888 case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:
1889 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1890 "[BTCoex], Action algorithm = PAN+A2DP\n");
1891 btc8821a1ant_action_pan_edr_a2dp(btcoexist);
1893 case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:
1894 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1895 "[BTCoex], Action algorithm = PAN(EDR)+HID\n");
1896 btc8821a1ant_action_pan_edr_hid(btcoexist);
1898 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
1899 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1900 "[BTCoex], Action algorithm = HID+A2DP+PAN\n");
1901 btc8821a1ant_action_hid_a2dp_pan_edr(btcoexist);
1903 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP:
1904 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1905 "[BTCoex], Action algorithm = HID+A2DP\n");
1906 btc8821a1ant_action_hid_a2dp(btcoexist);
1909 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1910 "[BTCoex], Action algorithm = coexist All Off!!\n");
1911 /*btc8821a1ant_coex_all_off(btcoexist);*/
1914 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
1918 static void btc8821a1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
1920 struct rtl_priv *rtlpriv = btcoexist->adapter;
1921 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1922 bool wifi_connected = false, bt_hs_on = false;
1923 bool increase_scan_dev_num = false;
1924 bool bt_ctrl_agg_buf_size = false;
1925 u8 agg_buf_size = 5;
1926 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
1927 u32 wifi_link_status = 0;
1928 u32 num_of_wifi_link = 0;
1929 bool wifi_under_5g = false;
1931 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1932 "[BTCoex], RunCoexistMechanism()===>\n");
1934 if (btcoexist->manual_control) {
1935 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1936 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
1940 if (btcoexist->stop_coex_dm) {
1941 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1942 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
1946 if (coex_sta->under_ips) {
1947 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1948 "[BTCoex], wifi is under IPS !!!\n");
1952 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
1953 if (wifi_under_5g) {
1954 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1955 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
1956 btc8821a1ant_coex_under_5g(btcoexist);
1960 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
1961 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1962 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
1963 increase_scan_dev_num = true;
1965 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
1966 &increase_scan_dev_num);
1968 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1971 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
1973 num_of_wifi_link = wifi_link_status >> 16;
1974 if ((num_of_wifi_link >= 2) ||
1975 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
1976 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1977 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1978 bt_ctrl_agg_buf_size, agg_buf_size);
1979 btc8821a1ant_action_wifi_multi_port(btcoexist);
1983 if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {
1984 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1986 if (wifi_connected) {
1988 btc8821a1ant_wifi_rssi_state(btcoexist, 1, 2,
1990 btc8821a1ant_limited_tx(btcoexist,
1994 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC,
1999 if (bt_link_info->sco_exist) {
2000 bt_ctrl_agg_buf_size = true;
2002 } else if (bt_link_info->hid_exist) {
2003 bt_ctrl_agg_buf_size = true;
2005 } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {
2006 bt_ctrl_agg_buf_size = true;
2009 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2010 bt_ctrl_agg_buf_size, agg_buf_size);
2012 btc8821a1ant_run_sw_coex_mech(btcoexist);
2014 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2015 if (coex_sta->c2h_bt_inquiry_page) {
2016 btc8821a1ant_action_bt_inquiry(btcoexist);
2018 } else if (bt_hs_on) {
2019 btc8821a1ant_action_hs(btcoexist);
2023 if (!wifi_connected) {
2024 bool scan = false, link = false, roam = false;
2026 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2027 "[BTCoex], wifi is non connected-idle !!!\n");
2029 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2030 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2031 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2033 if (scan || link || roam) {
2035 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2037 btc8821a1ant_action_wifi_not_connected_asso_auth(
2040 btc8821a1ant_action_wifi_not_connected(btcoexist);
2044 btc8821a1ant_action_wifi_connected(btcoexist);
2048 static void btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2050 /* force to reset coex mechanism
2053 btc8821a1ant_sw_mechanism(btcoexist, false);
2055 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2058 static void btc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,
2059 bool back_up, bool wifi_only)
2061 struct rtl_priv *rtlpriv = btcoexist->adapter;
2063 bool wifi_under_5g = false;
2065 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2066 "[BTCoex], 1Ant Init HW Config!!\n");
2072 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
2074 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
2076 coex_dm->backup_retry_limit =
2077 btcoexist->btc_read_2byte(btcoexist, 0x42a);
2078 coex_dm->backup_ampdu_max_time =
2079 btcoexist->btc_read_1byte(btcoexist, 0x456);
2082 /* 0x790[5:0] = 0x5 */
2083 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
2086 btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);
2088 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2090 /* Antenna config */
2092 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2095 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2098 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2100 /* Enable counter statistics
2101 * 0x76e[3] =1, WLAN_Act control by PTA
2103 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
2104 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
2105 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2108 /**************************************************************
2109 * extern function start with ex_btc8821a1ant_
2110 **************************************************************/
2111 void ex_btc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist, bool wifionly)
2113 btc8821a1ant_init_hw_config(btcoexist, true, wifionly);
2114 btcoexist->auto_report_1ant = true;
2117 void ex_btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2119 struct rtl_priv *rtlpriv = btcoexist->adapter;
2121 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2122 "[BTCoex], Coex Mechanism Init!!\n");
2124 btcoexist->stop_coex_dm = false;
2126 btc8821a1ant_init_coex_dm(btcoexist);
2128 btc8821a1ant_query_bt_info(btcoexist);
2131 void ex_btc8821a1ant_display_coex_info(struct btc_coexist *btcoexist,
2134 struct btc_board_info *board_info = &btcoexist->board_info;
2135 struct btc_stack_info *stack_info = &btcoexist->stack_info;
2136 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2137 u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;
2140 bool roam = false, scan = false, link = false, wifi_under_5g = false;
2141 bool bt_hs_on = false, wifi_busy = false;
2142 long wifi_rssi = 0, bt_hs_rssi = 0;
2143 u32 wifi_bw, wifi_traffic_dir;
2144 u8 wifi_dot11_chnl, wifi_hs_chnl;
2145 u32 fw_ver = 0, bt_patch_ver = 0;
2147 seq_puts(m, "\n ============[BT Coexist info]============");
2149 if (btcoexist->manual_control) {
2150 seq_puts(m, "\n ============[Under Manual Control]============");
2151 seq_puts(m, "\n ==========================================");
2153 if (btcoexist->stop_coex_dm) {
2154 seq_puts(m, "\n ============[Coex is STOPPED]============");
2155 seq_puts(m, "\n ==========================================");
2158 seq_printf(m, "\n %-35s = %d/ %d/ %d",
2159 "Ant PG Num/ Ant Mech/ Ant Pos:",
2160 board_info->pg_ant_num,
2161 board_info->btdm_ant_num,
2162 board_info->btdm_ant_pos);
2164 seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
2165 ((stack_info->profile_notified) ? "Yes" : "No"),
2166 stack_info->hci_version);
2168 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2170 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2171 seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2172 "CoexVer/ FwVer/ PatchVer",
2173 glcoex_ver_date_8821a_1ant,
2174 glcoex_ver_8821a_1ant,
2175 fw_ver, bt_patch_ver,
2178 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION,
2180 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2182 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL,
2184 seq_printf(m, "\n %-35s = %d / %d(%d)",
2185 "Dot11 channel / HsChnl(HsMode)",
2186 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2188 seq_printf(m, "\n %-35s = %3ph ",
2189 "H2C Wifi inform bt chnl Info",
2190 coex_dm->wifi_chnl_info);
2192 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2193 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2194 seq_printf(m, "\n %-35s = %d/ %d", "Wifi rssi/ HS rssi",
2195 (int)wifi_rssi, (int)bt_hs_rssi);
2197 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2198 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2199 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2200 seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
2203 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
2205 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
2207 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
2209 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2211 seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",
2212 (wifi_under_5g ? "5G" : "2.4G"),
2213 ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2214 (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),
2215 ((!wifi_busy) ? "idle" :
2216 ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2217 "uplink" : "downlink")));
2218 seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2219 "BT [status/ rssi/ retryCnt]",
2220 ((coex_sta->bt_disabled) ? ("disabled") :
2221 ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2222 ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2223 coex_dm->bt_status) ?
2224 "non-connected idle" :
2225 ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
2226 coex_dm->bt_status) ?
2227 "connected-idle" : "busy")))),
2228 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2230 seq_printf(m, "\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",
2231 bt_link_info->sco_exist,
2232 bt_link_info->hid_exist,
2233 bt_link_info->pan_exist,
2234 bt_link_info->a2dp_exist);
2235 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2237 bt_info_ext = coex_sta->bt_info_ext;
2238 seq_printf(m, "\n %-35s = %s",
2239 "BT Info A2DP rate",
2240 (bt_info_ext & BIT0) ?
2241 "Basic rate" : "EDR rate");
2243 for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {
2244 if (coex_sta->bt_info_c2h_cnt[i]) {
2245 seq_printf(m, "\n %-35s = %7ph(%d)",
2246 glbt_info_src_8821a_1ant[i],
2247 coex_sta->bt_info_c2h[i],
2248 coex_sta->bt_info_c2h_cnt[i]);
2251 seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2252 "PS state, IPS/LPS, (lps/rpwm)",
2253 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2254 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2255 btcoexist->bt_info.lps_val,
2256 btcoexist->bt_info.rpwm_val);
2257 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2259 if (!btcoexist->manual_control) {
2261 seq_printf(m, "\n %-35s",
2262 "============[Sw mechanism]============");
2264 seq_printf(m, "\n %-35s = %d", "SM[LowPenaltyRA]",
2265 coex_dm->cur_low_penalty_ra);
2267 seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2268 "DelBA/ BtCtrlAgg/ AggSize",
2269 (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2270 (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2271 btcoexist->bt_info.agg_buf_size);
2272 seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask",
2273 btcoexist->bt_info.ra_mask);
2276 seq_printf(m, "\n %-35s",
2277 "============[Fw mechanism]============");
2279 ps_tdma_case = coex_dm->cur_ps_tdma;
2280 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
2282 coex_dm->ps_tdma_para,
2284 coex_dm->auto_tdma_adjust);
2286 seq_printf(m, "\n %-35s = 0x%x ",
2287 "Latest error condition(should be 0)",
2288 coex_dm->error_condition);
2290 seq_printf(m, "\n %-35s = %d ", "IgnWlanAct",
2291 coex_dm->cur_ignore_wlan_act);
2295 seq_printf(m, "\n %-35s", "============[Hw setting]============");
2297 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2298 "backup ARFR1/ARFR2/RL/AMaxTime",
2299 coex_dm->backup_arfr_cnt1,
2300 coex_dm->backup_arfr_cnt2,
2301 coex_dm->backup_retry_limit,
2302 coex_dm->backup_ampdu_max_time);
2304 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2305 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2306 u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2307 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2308 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2309 "0x430/0x434/0x42a/0x456",
2310 u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);
2312 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2313 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);
2314 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",
2315 u1_tmp[0], (u4_tmp[0] & 0x3e000000) >> 25);
2317 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
2318 seq_printf(m, "\n %-35s = 0x%x", "0x8db[6:5]",
2319 ((u1_tmp[0] & 0x60) >> 5));
2321 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);
2322 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2323 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2324 "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",
2325 (u4_tmp[0] & 0x30000000) >> 28,
2329 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2330 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2331 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2332 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2333 "0x40/0x4c[24:23]/0x64[0]",
2334 u1_tmp[0], ((u4_tmp[0] & 0x01800000) >> 23),
2337 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2338 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2339 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522",
2340 u4_tmp[0], u1_tmp[0]);
2342 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2343 seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)",
2346 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
2347 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);
2348 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2349 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",
2350 u4_tmp[0], (u1_tmp[0] << 8) + u1_tmp[1]);
2352 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2353 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2354 u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2355 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
2356 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2357 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
2358 u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
2360 seq_printf(m, "\n %-35s = %d/ %d", "0x770(high-pri rx/tx)",
2361 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
2362 seq_printf(m, "\n %-35s = %d/ %d", "0x774(low-pri rx/tx)",
2363 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
2364 if (btcoexist->auto_report_1ant)
2365 btc8821a1ant_monitor_bt_ctr(btcoexist);
2366 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2369 void ex_btc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2371 struct rtl_priv *rtlpriv = btcoexist->adapter;
2372 bool wifi_under_5g = false;
2374 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2376 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2377 if (wifi_under_5g) {
2378 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2379 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2380 btc8821a1ant_coex_under_5g(btcoexist);
2384 if (BTC_IPS_ENTER == type) {
2385 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2386 "[BTCoex], IPS ENTER notify\n");
2387 coex_sta->under_ips = true;
2388 btc8821a1ant_set_ant_path(btcoexist,
2389 BTC_ANT_PATH_BT, false, true);
2390 /* set PTA control */
2391 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2392 btc8821a1ant_coex_table_with_type(btcoexist,
2394 } else if (BTC_IPS_LEAVE == type) {
2395 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2396 "[BTCoex], IPS LEAVE notify\n");
2397 coex_sta->under_ips = false;
2399 btc8821a1ant_init_hw_config(btcoexist, false, false);
2400 btc8821a1ant_init_coex_dm(btcoexist);
2401 btc8821a1ant_query_bt_info(btcoexist);
2405 void ex_btc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2407 struct rtl_priv *rtlpriv = btcoexist->adapter;
2409 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2412 if (BTC_LPS_ENABLE == type) {
2413 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2414 "[BTCoex], LPS ENABLE notify\n");
2415 coex_sta->under_lps = true;
2416 } else if (BTC_LPS_DISABLE == type) {
2417 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2418 "[BTCoex], LPS DISABLE notify\n");
2419 coex_sta->under_lps = false;
2423 void ex_btc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2425 struct rtl_priv *rtlpriv = btcoexist->adapter;
2426 bool wifi_connected = false, bt_hs_on = false;
2427 bool bt_ctrl_agg_buf_size = false;
2428 bool wifi_under_5g = false;
2429 u32 wifi_link_status = 0;
2430 u32 num_of_wifi_link = 0;
2431 u8 agg_buf_size = 5;
2433 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2435 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2436 if (wifi_under_5g) {
2437 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2438 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2439 btc8821a1ant_coex_under_5g(btcoexist);
2443 if (type == BTC_SCAN_START) {
2444 coex_sta->wifi_is_high_pri_task = true;
2445 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2446 "[BTCoex], SCAN START notify\n");
2448 /* Force antenna setup for no scan result issue */
2449 btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2451 coex_sta->wifi_is_high_pri_task = false;
2452 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2453 "[BTCoex], SCAN FINISH notify\n");
2456 if (coex_sta->bt_disabled)
2459 btcoexist->btc_get(btcoexist,
2460 BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2461 btcoexist->btc_get(btcoexist,
2462 BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2464 btc8821a1ant_query_bt_info(btcoexist);
2466 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2468 num_of_wifi_link = wifi_link_status >> 16;
2469 if (num_of_wifi_link >= 2) {
2470 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2471 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2472 bt_ctrl_agg_buf_size, agg_buf_size);
2473 btc8821a1ant_action_wifi_multi_port(btcoexist);
2477 if (coex_sta->c2h_bt_inquiry_page) {
2478 btc8821a1ant_action_bt_inquiry(btcoexist);
2480 } else if (bt_hs_on) {
2481 btc8821a1ant_action_hs(btcoexist);
2485 if (BTC_SCAN_START == type) {
2486 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2487 "[BTCoex], SCAN START notify\n");
2488 if (!wifi_connected) {
2489 /* non-connected scan */
2490 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2492 /* wifi is connected */
2493 btc8821a1ant_action_wifi_connected_scan(btcoexist);
2495 } else if (BTC_SCAN_FINISH == type) {
2496 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2497 "[BTCoex], SCAN FINISH notify\n");
2498 if (!wifi_connected) {
2499 /* non-connected scan */
2500 btc8821a1ant_action_wifi_not_connected(btcoexist);
2502 btc8821a1ant_action_wifi_connected(btcoexist);
2507 void ex_btc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2509 struct rtl_priv *rtlpriv = btcoexist->adapter;
2510 bool wifi_connected = false, bt_hs_on = false;
2511 u32 wifi_link_status = 0;
2512 u32 num_of_wifi_link = 0;
2513 bool bt_ctrl_agg_buf_size = false;
2514 bool wifi_under_5g = false;
2515 u8 agg_buf_size = 5;
2517 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2518 coex_sta->bt_disabled)
2520 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2521 if (wifi_under_5g) {
2522 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2523 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2524 btc8821a1ant_coex_under_5g(btcoexist);
2528 if (type == BTC_ASSOCIATE_START) {
2529 coex_sta->wifi_is_high_pri_task = true;
2530 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2531 "[BTCoex], CONNECT START notify\n");
2532 coex_dm->arp_cnt = 0;
2534 coex_sta->wifi_is_high_pri_task = false;
2535 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2536 "[BTCoex], CONNECT FINISH notify\n");
2537 coex_dm->arp_cnt = 0;
2540 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2542 num_of_wifi_link = wifi_link_status >> 16;
2543 if (num_of_wifi_link >= 2) {
2544 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2545 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2546 bt_ctrl_agg_buf_size, agg_buf_size);
2547 btc8821a1ant_action_wifi_multi_port(btcoexist);
2551 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2552 if (coex_sta->c2h_bt_inquiry_page) {
2553 btc8821a1ant_action_bt_inquiry(btcoexist);
2555 } else if (bt_hs_on) {
2556 btc8821a1ant_action_hs(btcoexist);
2560 if (BTC_ASSOCIATE_START == type) {
2561 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2562 "[BTCoex], CONNECT START notify\n");
2563 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2564 } else if (BTC_ASSOCIATE_FINISH == type) {
2565 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2566 "[BTCoex], CONNECT FINISH notify\n");
2568 btcoexist->btc_get(btcoexist,
2569 BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2570 if (!wifi_connected) {
2571 /* non-connected scan */
2572 btc8821a1ant_action_wifi_not_connected(btcoexist);
2574 btc8821a1ant_action_wifi_connected(btcoexist);
2579 void ex_btc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
2582 struct rtl_priv *rtlpriv = btcoexist->adapter;
2583 u8 h2c_parameter[3] = {0};
2585 u8 wifi_central_chnl;
2586 bool wifi_under_5g = false;
2588 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2589 coex_sta->bt_disabled)
2591 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2592 if (wifi_under_5g) {
2593 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2594 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2595 btc8821a1ant_coex_under_5g(btcoexist);
2599 if (BTC_MEDIA_CONNECT == type) {
2600 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2601 "[BTCoex], MEDIA connect notify\n");
2603 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2604 "[BTCoex], MEDIA disconnect notify\n");
2605 coex_dm->arp_cnt = 0;
2608 /* only 2.4G we need to inform bt the chnl mask */
2609 btcoexist->btc_get(btcoexist,
2610 BTC_GET_U1_WIFI_CENTRAL_CHNL,
2611 &wifi_central_chnl);
2612 if ((type == BTC_MEDIA_CONNECT) &&
2613 (wifi_central_chnl <= 14)) {
2614 h2c_parameter[0] = 0x0;
2615 h2c_parameter[1] = wifi_central_chnl;
2616 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2617 if (wifi_bw == BTC_WIFI_BW_HT40)
2618 h2c_parameter[2] = 0x30;
2620 h2c_parameter[2] = 0x20;
2623 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2624 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2625 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2627 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2628 "[BTCoex], FW write 0x66 = 0x%x\n",
2629 h2c_parameter[0] << 16 |
2630 h2c_parameter[1] << 8 |
2633 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2636 void ex_btc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
2639 struct rtl_priv *rtlpriv = btcoexist->adapter;
2640 bool bt_hs_on = false;
2641 bool bt_ctrl_agg_buf_size = false;
2642 bool wifi_under_5g = false;
2643 u32 wifi_link_status = 0;
2644 u32 num_of_wifi_link = 0;
2645 u8 agg_buf_size = 5;
2647 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2648 coex_sta->bt_disabled)
2651 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2652 if (wifi_under_5g) {
2653 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2654 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2655 btc8821a1ant_coex_under_5g(btcoexist);
2659 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2660 type == BTC_PACKET_ARP) {
2661 coex_sta->wifi_is_high_pri_task = true;
2663 if (type == BTC_PACKET_ARP) {
2664 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2665 "[BTCoex], specific Packet ARP notify\n");
2667 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2668 "[BTCoex], specific Packet DHCP or EAPOL notify\n");
2671 coex_sta->wifi_is_high_pri_task = false;
2672 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2673 "[BTCoex], specific Packet [Type = %d] notify\n",
2677 coex_sta->special_pkt_period_cnt = 0;
2679 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2681 num_of_wifi_link = wifi_link_status >> 16;
2682 if (num_of_wifi_link >= 2) {
2683 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2684 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2685 bt_ctrl_agg_buf_size, agg_buf_size);
2686 btc8821a1ant_action_wifi_multi_port(btcoexist);
2690 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2691 if (coex_sta->c2h_bt_inquiry_page) {
2692 btc8821a1ant_action_bt_inquiry(btcoexist);
2694 } else if (bt_hs_on) {
2695 btc8821a1ant_action_hs(btcoexist);
2699 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2700 type == BTC_PACKET_ARP) {
2701 if (type == BTC_PACKET_ARP) {
2703 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2704 "[BTCoex], ARP Packet Count = %d\n",
2706 if (coex_dm->arp_cnt >= 10)
2707 /* if APR PKT > 10 after connect, do not go to
2708 * btc8821a1ant_act_wifi_conn_sp_pkt
2713 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2714 "[BTCoex], special Packet(%d) notify\n", type);
2715 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
2719 void ex_btc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
2720 u8 *tmp_buf, u8 length)
2722 struct rtl_priv *rtlpriv = btcoexist->adapter;
2726 bool wifi_connected = false;
2727 bool bt_busy = false;
2728 bool wifi_under_5g = false;
2730 coex_sta->c2h_bt_info_req_sent = false;
2732 btcoexist->btc_get(btcoexist,
2733 BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2735 rsp_source = tmp_buf[0] & 0xf;
2736 if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)
2737 rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;
2738 coex_sta->bt_info_c2h_cnt[rsp_source]++;
2740 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2741 "[BTCoex], Bt info[%d], length = %d, hex data = [",
2742 rsp_source, length);
2743 for (i = 0; i < length; i++) {
2744 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
2746 bt_info = tmp_buf[i];
2747 if (i == length - 1) {
2748 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2749 "0x%02x]\n", tmp_buf[i]);
2751 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2752 "0x%02x, ", tmp_buf[i]);
2756 if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {
2758 coex_sta->bt_retry_cnt =
2759 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
2762 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
2764 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
2766 coex_sta->bt_tx_rx_mask =
2767 (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
2768 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
2769 &coex_sta->bt_tx_rx_mask);
2770 if (!coex_sta->bt_tx_rx_mask) {
2771 /* BT into is responded by BT FW and BT RF REG 0x3C !=
2772 * 0x15 => Need to switch BT TRx Mask
2774 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2775 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
2776 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
2780 /* Here we need to resend some wifi info to BT
2781 * because bt is reset and lost the info
2783 if (coex_sta->bt_info_ext & BIT1) {
2784 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2785 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
2786 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2788 if (wifi_connected) {
2789 ex_btc8821a1ant_media_status_notify(btcoexist,
2792 ex_btc8821a1ant_media_status_notify(btcoexist,
2793 BTC_MEDIA_DISCONNECT);
2797 if ((coex_sta->bt_info_ext & BIT3) && !wifi_under_5g) {
2798 if (!btcoexist->manual_control &&
2799 !btcoexist->stop_coex_dm) {
2800 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2801 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
2802 btc8821a1ant_ignore_wlan_act(btcoexist,
2809 /* check BIT2 first ==> check if bt is under inquiry or page scan */
2810 if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)
2811 coex_sta->c2h_bt_inquiry_page = true;
2813 coex_sta->c2h_bt_inquiry_page = false;
2815 /* set link exist status */
2816 if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2817 coex_sta->bt_link_exist = false;
2818 coex_sta->pan_exist = false;
2819 coex_sta->a2dp_exist = false;
2820 coex_sta->hid_exist = false;
2821 coex_sta->sco_exist = false;
2823 /* connection exists */
2824 coex_sta->bt_link_exist = true;
2825 if (bt_info & BT_INFO_8821A_1ANT_B_FTP)
2826 coex_sta->pan_exist = true;
2828 coex_sta->pan_exist = false;
2829 if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)
2830 coex_sta->a2dp_exist = true;
2832 coex_sta->a2dp_exist = false;
2833 if (bt_info & BT_INFO_8821A_1ANT_B_HID)
2834 coex_sta->hid_exist = true;
2836 coex_sta->hid_exist = false;
2837 if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)
2838 coex_sta->sco_exist = true;
2840 coex_sta->sco_exist = false;
2843 btc8821a1ant_update_bt_link_info(btcoexist);
2845 /* mask profile bit for connect-ilde identification
2846 * (for CSR case: A2DP idle --> 0x41)
2848 bt_info = bt_info & 0x1f;
2850 if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2851 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
2852 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2853 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
2854 } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {
2855 /* connection exists but no busy */
2856 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;
2857 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2858 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
2859 } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||
2860 (bt_info & BT_INFO_8821A_1ANT_B_SCO_BUSY)) {
2861 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;
2862 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2863 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
2864 } else if (bt_info & BT_INFO_8821A_1ANT_B_ACL_BUSY) {
2865 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
2866 coex_dm->auto_tdma_adjust = false;
2867 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;
2868 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2869 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
2871 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;
2872 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2873 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
2876 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
2877 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2878 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
2882 btcoexist->btc_set(btcoexist,
2883 BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2885 btc8821a1ant_run_coexist_mechanism(btcoexist);
2888 void ex_btc8821a1ant_halt_notify(struct btc_coexist *btcoexist)
2890 struct rtl_priv *rtlpriv = btcoexist->adapter;
2891 bool wifi_under_5g = false;
2893 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2894 "[BTCoex], Halt notify\n");
2895 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2896 if (wifi_under_5g) {
2897 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2898 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2899 btc8821a1ant_coex_under_5g(btcoexist);
2904 btcoexist->stop_coex_dm = true;
2906 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
2907 btc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
2909 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2910 btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
2912 ex_btc8821a1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
2915 void ex_btc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
2917 struct rtl_priv *rtlpriv = btcoexist->adapter;
2918 bool wifi_under_5g = false;
2920 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2921 if (wifi_under_5g) {
2922 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2923 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2924 btc8821a1ant_coex_under_5g(btcoexist);
2928 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2929 "[BTCoex], Pnp notify\n");
2931 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
2932 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2933 "[BTCoex], Pnp notify to SLEEP\n");
2934 /* BT should clear UnderIPS/UnderLPS state to avoid mismatch
2935 * state after wakeup.
2937 coex_sta->under_ips = false;
2938 coex_sta->under_lps = false;
2939 btcoexist->stop_coex_dm = true;
2940 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2942 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2943 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2944 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false,
2946 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
2947 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2948 "[BTCoex], Pnp notify to WAKE UP\n");
2949 btcoexist->stop_coex_dm = false;
2950 btc8821a1ant_init_hw_config(btcoexist, false, false);
2951 btc8821a1ant_init_coex_dm(btcoexist);
2952 btc8821a1ant_query_bt_info(btcoexist);
2956 void ex_btc8821a1ant_periodical(struct btc_coexist *btcoexist)
2958 struct rtl_priv *rtlpriv = btcoexist->adapter;
2959 static u8 dis_ver_info_cnt;
2960 u32 fw_ver = 0, bt_patch_ver = 0;
2961 struct btc_board_info *board_info = &btcoexist->board_info;
2962 struct btc_stack_info *stack_info = &btcoexist->stack_info;
2964 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2965 "[BTCoex], ==========================Periodical===========================\n");
2967 if (dis_ver_info_cnt <= 5) {
2968 dis_ver_info_cnt += 1;
2969 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2970 "[BTCoex], ****************************************************************\n");
2971 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2972 "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
2973 board_info->pg_ant_num,
2974 board_info->btdm_ant_num,
2975 board_info->btdm_ant_pos);
2976 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2977 "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
2978 stack_info->profile_notified ? "Yes" : "No",
2979 stack_info->hci_version);
2980 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2982 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2983 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2984 "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
2985 glcoex_ver_date_8821a_1ant,
2986 glcoex_ver_8821a_1ant,
2987 fw_ver, bt_patch_ver,
2989 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2990 "[BTCoex], ****************************************************************\n");
2993 if (!btcoexist->auto_report_1ant) {
2994 btc8821a1ant_query_bt_info(btcoexist);
2995 btc8821a1ant_monitor_bt_ctr(btcoexist);
2997 coex_sta->special_pkt_period_cnt++;