1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright(c) 2016 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun * published by the Free Software Foundation.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun * more details.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun *****************************************************************************/
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include "mp_precomp.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun static u8 *trace_buf = &gl_btc_trace_buf[0];
21*4882a593Smuzhiyun static const u32 coex_ver_date = 20211210;
22*4882a593Smuzhiyun static const u32 coex_ver = 0x27;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun static u8
rtw_btc_rssi_state(struct btc_coexist * btc,u8 pre_state,u8 rssi,u8 rssi_thresh)25*4882a593Smuzhiyun rtw_btc_rssi_state(struct btc_coexist *btc, u8 pre_state,
26*4882a593Smuzhiyun u8 rssi, u8 rssi_thresh)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
29*4882a593Smuzhiyun u8 next_state, tol = chip_para->rssi_tolerance;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun if (pre_state == BTC_RSSI_STATE_LOW ||
32*4882a593Smuzhiyun pre_state == BTC_RSSI_STATE_STAY_LOW) {
33*4882a593Smuzhiyun if (rssi >= (rssi_thresh + tol))
34*4882a593Smuzhiyun next_state = BTC_RSSI_STATE_HIGH;
35*4882a593Smuzhiyun else
36*4882a593Smuzhiyun next_state = BTC_RSSI_STATE_STAY_LOW;
37*4882a593Smuzhiyun } else {
38*4882a593Smuzhiyun if (rssi < rssi_thresh)
39*4882a593Smuzhiyun next_state = BTC_RSSI_STATE_LOW;
40*4882a593Smuzhiyun else
41*4882a593Smuzhiyun next_state = BTC_RSSI_STATE_STAY_HIGH;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun return next_state;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun static void
rtw_btc_limited_tx(struct btc_coexist * btc,boolean force_exec,boolean tx_limit_en,boolean ampdu_limit_en)48*4882a593Smuzhiyun rtw_btc_limited_tx(struct btc_coexist *btc, boolean force_exec,
49*4882a593Smuzhiyun boolean tx_limit_en, boolean ampdu_limit_en)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
52*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
53*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
54*4882a593Smuzhiyun boolean wl_b_mode = FALSE;
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun if (!chip_para->scbd_support)
57*4882a593Smuzhiyun return;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /* Force Max Tx retry limit = 8 */
60*4882a593Smuzhiyun if (!force_exec && tx_limit_en == coex_sta->wl_tx_limit_en &&
61*4882a593Smuzhiyun ampdu_limit_en == coex_sta->wl_ampdu_limit_en)
62*4882a593Smuzhiyun return;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun /* backup MAC reg */
65*4882a593Smuzhiyun if (!coex_sta->wl_tx_limit_en) {
66*4882a593Smuzhiyun coex_sta->wl_arfb1 = btc->btc_read_4byte(btc, REG_DARFRC);
67*4882a593Smuzhiyun coex_sta->wl_arfb2 = btc->btc_read_4byte(btc, REG_DARFRCH);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun coex_sta->wl_txlimit = btc->btc_read_2byte(btc,
70*4882a593Smuzhiyun REG_RETRY_LIMIT);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun if (!coex_sta->wl_ampdu_limit_en)
74*4882a593Smuzhiyun coex_sta->wl_ampdulen =
75*4882a593Smuzhiyun btc->btc_read_1byte(btc, REG_AMPDU_MAX_TIME_V1);
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun coex_sta->wl_tx_limit_en = tx_limit_en;
78*4882a593Smuzhiyun coex_sta->wl_ampdu_limit_en = ampdu_limit_en;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun if (tx_limit_en) {
81*4882a593Smuzhiyun /* Set BT polluted packet on for Tx rate adaptive
82*4882a593Smuzhiyun * Set queue life time to avoid can't reach tx retry limit
83*4882a593Smuzhiyun * if tx is always break by GNT_BT.
84*4882a593Smuzhiyun */
85*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_TX_HANG_CTRL,
86*4882a593Smuzhiyun BIT_EN_GNT_BT_AWAKE, 0x1);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /* queue life time can't on if 2-port */
89*4882a593Smuzhiyun if (link_info_ext->num_of_active_port <= 1)
90*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_LIFETIME_EN, 0xf,
91*4882a593Smuzhiyun 0xf);
92*4882a593Smuzhiyun else
93*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_LIFETIME_EN, 0xf,
94*4882a593Smuzhiyun 0x0);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /* Max Tx retry limit = 8*/
97*4882a593Smuzhiyun btc->btc_write_2byte(btc, REG_RETRY_LIMIT, 0x0808);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_UNDER_B_MODE, &wl_b_mode);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* Auto rate fallback step within 8 retry*/
102*4882a593Smuzhiyun if (wl_b_mode) {
103*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRC, 0x1000000);
104*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRCH, 0x1010101);
105*4882a593Smuzhiyun } else {
106*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRC, 0x1000000);
107*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRCH, 0x4030201);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun } else {
110*4882a593Smuzhiyun /* Set BT polluted packet on for Tx rate adaptive not
111*4882a593Smuzhiyun *including Tx retry break by PTA, 0x45c[19] =1
112*4882a593Smuzhiyun */
113*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_TX_HANG_CTRL,
114*4882a593Smuzhiyun BIT_EN_GNT_BT_AWAKE, 0x0);
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /* Set queue life time to avoid can't reach tx retry limit
117*4882a593Smuzhiyun * if tx is always break by GNT_BT.
118*4882a593Smuzhiyun */
119*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_LIFETIME_EN, 0xf, 0x0);
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun /* Recovery Max Tx retry limit*/
122*4882a593Smuzhiyun btc->btc_write_2byte(btc, REG_RETRY_LIMIT,
123*4882a593Smuzhiyun coex_sta->wl_txlimit);
124*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRC, coex_sta->wl_arfb1);
125*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_DARFRCH, coex_sta->wl_arfb2);
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun if (ampdu_limit_en)
129*4882a593Smuzhiyun btc->btc_write_1byte(btc, REG_AMPDU_MAX_TIME_V1, 0x20);
130*4882a593Smuzhiyun else
131*4882a593Smuzhiyun btc->btc_write_1byte(btc, REG_AMPDU_MAX_TIME_V1,
132*4882a593Smuzhiyun coex_sta->wl_ampdulen);
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun static void
rtw_btc_limited_rx(struct btc_coexist * btc,boolean force_exec,boolean rej_ap_agg_pkt,boolean bt_ctrl_agg_buf_size,u8 agg_buf_size)136*4882a593Smuzhiyun rtw_btc_limited_rx(struct btc_coexist *btc, boolean force_exec,
137*4882a593Smuzhiyun boolean rej_ap_agg_pkt, boolean bt_ctrl_agg_buf_size,
138*4882a593Smuzhiyun u8 agg_buf_size)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
141*4882a593Smuzhiyun boolean reject_rx_agg = rej_ap_agg_pkt;
142*4882a593Smuzhiyun boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
143*4882a593Smuzhiyun u8 rx_agg_size = agg_buf_size;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun if (!force_exec &&
146*4882a593Smuzhiyun bt_ctrl_agg_buf_size == coex_sta->wl_rxagg_limit_en &&
147*4882a593Smuzhiyun agg_buf_size == coex_sta->wl_rxagg_size)
148*4882a593Smuzhiyun return;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun coex_sta->wl_rxagg_limit_en = bt_ctrl_agg_buf_size;
151*4882a593Smuzhiyun coex_sta->wl_rxagg_size = agg_buf_size;
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun /*btc->btc_set(btc, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);*/
154*4882a593Smuzhiyun /* decide BT control aggregation buf size or not */
155*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bt_ctrl_rx_agg_size);
156*4882a593Smuzhiyun /* aggregation buf size, only work
157*4882a593Smuzhiyun * when BT control Rx aggregation size
158*4882a593Smuzhiyun */
159*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
160*4882a593Smuzhiyun /* real update aggregation setting */
161*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
164*4882a593Smuzhiyun "[BTCoex], aggregation size = %d!!\n", agg_buf_size);
165*4882a593Smuzhiyun BTC_TRACE(trace_buf);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun static void
rtw_btc_low_penalty_ra(struct btc_coexist * btc,boolean force_exec,boolean low_penalty_ra,u8 thres)169*4882a593Smuzhiyun rtw_btc_low_penalty_ra(struct btc_coexist *btc, boolean force_exec,
170*4882a593Smuzhiyun boolean low_penalty_ra, u8 thres)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
173*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun if (!force_exec) {
176*4882a593Smuzhiyun if (low_penalty_ra == coex_dm->cur_low_penalty_ra &&
177*4882a593Smuzhiyun thres == coex_sta->wl_ra_thres)
178*4882a593Smuzhiyun return;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun if (low_penalty_ra)
182*4882a593Smuzhiyun btc->btc_phydm_modify_RA_PCR_threshold(btc, 0, thres);
183*4882a593Smuzhiyun else
184*4882a593Smuzhiyun btc->btc_phydm_modify_RA_PCR_threshold(btc, 0, 0);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra = low_penalty_ra;
187*4882a593Smuzhiyun coex_sta->wl_ra_thres = thres;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun static void
rtw_btc_limited_wl(struct btc_coexist * btc)191*4882a593Smuzhiyun rtw_btc_limited_wl(struct btc_coexist *btc)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
194*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
195*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun if (link_info_ext->is_all_under_5g ||
198*4882a593Smuzhiyun link_info_ext->num_of_active_port == 0 ||
199*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) {
200*4882a593Smuzhiyun rtw_btc_low_penalty_ra(btc, NM_EXCU, FALSE, 0);
201*4882a593Smuzhiyun rtw_btc_limited_tx(btc, NM_EXCU, FALSE, FALSE);
202*4882a593Smuzhiyun rtw_btc_limited_rx(btc, NM_EXCU, FALSE, TRUE, 64);
203*4882a593Smuzhiyun } else if (link_info_ext->num_of_active_port > 1) {
204*4882a593Smuzhiyun rtw_btc_low_penalty_ra(btc, NM_EXCU, TRUE, 30);
205*4882a593Smuzhiyun rtw_btc_limited_tx(btc, NM_EXCU, TRUE, TRUE);
206*4882a593Smuzhiyun rtw_btc_limited_rx(btc, NM_EXCU, FALSE, TRUE, 16);
207*4882a593Smuzhiyun } else {
208*4882a593Smuzhiyun if (link_info_ext->is_p2p_connected)
209*4882a593Smuzhiyun rtw_btc_low_penalty_ra(btc, NM_EXCU, TRUE, 30);
210*4882a593Smuzhiyun else
211*4882a593Smuzhiyun rtw_btc_low_penalty_ra(btc, NM_EXCU, TRUE, 15);
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun if (coex_sta->bt_hid_exist || coex_sta->bt_hid_pair_num > 0 ||
214*4882a593Smuzhiyun coex_sta->bt_hfp_exist)
215*4882a593Smuzhiyun rtw_btc_limited_tx(btc, NM_EXCU, TRUE, TRUE);
216*4882a593Smuzhiyun else
217*4882a593Smuzhiyun rtw_btc_limited_tx(btc, NM_EXCU, TRUE, FALSE);
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun /*COEX-361, solve wifi poor performance when BLE HID exists*/
220*4882a593Smuzhiyun if ((coex_sta->bt_ble_hid_exist || coex_sta->bt_hfp_exist) &&
221*4882a593Smuzhiyun coex_sta->wl_iot_peer != BTC_IOT_PEER_ATHEROS &&
222*4882a593Smuzhiyun btc->board_info.btdm_ant_num == 1)
223*4882a593Smuzhiyun rtw_btc_limited_rx(btc, NM_EXCU, FALSE, TRUE, 4);
224*4882a593Smuzhiyun else
225*4882a593Smuzhiyun rtw_btc_limited_rx(btc, NM_EXCU, FALSE, TRUE, 64);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun static void
rtw_btc_mailbox_operation(struct btc_coexist * btc,u8 h2c_id,u8 h2c_len,u8 * h2c_para)232*4882a593Smuzhiyun rtw_btc_mailbox_operation(struct btc_coexist *btc, u8 h2c_id, u8 h2c_len,
233*4882a593Smuzhiyun u8 *h2c_para)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
236*4882a593Smuzhiyun u8 buf[6] = {0};
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun if (chip_para->mailbox_support) {
239*4882a593Smuzhiyun btc->btc_fill_h2c(btc, h2c_id, h2c_len, h2c_para);
240*4882a593Smuzhiyun return;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun switch (h2c_id) {
244*4882a593Smuzhiyun case 0x61:
245*4882a593Smuzhiyun buf[0] = 3;
246*4882a593Smuzhiyun buf[1] = 0x1; /* polling enable, 1=enable, 0=disable */
247*4882a593Smuzhiyun buf[2] = 0x2; /* polling time in seconds */
248*4882a593Smuzhiyun buf[3] = 0x1; /* auto report enable, 1=enable, 0=disable */
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_CTRL_BT_INFO, (void *)&buf[0]);
251*4882a593Smuzhiyun break;
252*4882a593Smuzhiyun case 0x62:
253*4882a593Smuzhiyun buf[0] = 4;
254*4882a593Smuzhiyun buf[1] = 0x3; /* OP_Code */
255*4882a593Smuzhiyun buf[2] = 0x2; /* OP_Code_Length */
256*4882a593Smuzhiyun buf[3] = (h2c_para[0] != 0) ? 0x1 : 0x0; /* OP_Code_Content */
257*4882a593Smuzhiyun buf[4] = h2c_para[0];/* pwr_level */
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_CTRL_BT_COEX, (void *)&buf[0]);
260*4882a593Smuzhiyun break;
261*4882a593Smuzhiyun case 0x63:
262*4882a593Smuzhiyun buf[0] = 3;
263*4882a593Smuzhiyun buf[1] = 0x1; /* OP_Code */
264*4882a593Smuzhiyun buf[2] = 0x1; /* OP_Code_Length */
265*4882a593Smuzhiyun buf[3] = (h2c_para[0] == 0x1) ? 0x1 : 0x0; /* OP_Code_Content */
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_CTRL_BT_COEX, (void *)&buf[0]);
268*4882a593Smuzhiyun break;
269*4882a593Smuzhiyun case 0x66:
270*4882a593Smuzhiyun buf[0] = 5;
271*4882a593Smuzhiyun buf[1] = 0x5; /* OP_Code */
272*4882a593Smuzhiyun buf[2] = 0x3; /* OP_Code_Length */
273*4882a593Smuzhiyun buf[3] = h2c_para[0]; /* OP_Code_Content */
274*4882a593Smuzhiyun buf[4] = h2c_para[1];
275*4882a593Smuzhiyun buf[5] = h2c_para[2];
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_CTRL_BT_COEX, (void *)&buf[0]);
278*4882a593Smuzhiyun break;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun static boolean
rtw_btc_freerun_check(struct btc_coexist * btc)283*4882a593Smuzhiyun rtw_btc_freerun_check(struct btc_coexist *btc)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
286*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
287*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
288*4882a593Smuzhiyun u8 bt_rssi;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun if (coex_sta->force_freerun)
291*4882a593Smuzhiyun return TRUE;
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun if (coex_sta->force_tdd)
294*4882a593Smuzhiyun return FALSE;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun if (coex_sta->bt_disabled)
297*4882a593Smuzhiyun return FALSE;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1 ||
300*4882a593Smuzhiyun btc->board_info.ant_distance <= 5 || !coex_sta->wl_gl_busy)
301*4882a593Smuzhiyun return FALSE;
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun if (btc->board_info.ant_distance >= 40 ||
304*4882a593Smuzhiyun coex_sta->bt_hid_pair_num >= 2)
305*4882a593Smuzhiyun return TRUE;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun /* ant_distance = 5 ~ 40 */
308*4882a593Smuzhiyun if (BTC_RSSI_HIGH(coex_dm->wl_rssi_state[1]) &&
309*4882a593Smuzhiyun BTC_RSSI_HIGH(coex_dm->bt_rssi_state[0]))
310*4882a593Smuzhiyun return TRUE;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun if (link_info_ext->traffic_dir == BTC_WIFI_TRAFFIC_TX)
313*4882a593Smuzhiyun bt_rssi = coex_dm->bt_rssi_state[0];
314*4882a593Smuzhiyun else
315*4882a593Smuzhiyun bt_rssi = coex_dm->bt_rssi_state[1];
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun if (BTC_RSSI_HIGH(coex_dm->wl_rssi_state[3]) &&
318*4882a593Smuzhiyun BTC_RSSI_HIGH(bt_rssi) &&
319*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_SCANAP] <= 5)
320*4882a593Smuzhiyun return TRUE;
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun return FALSE;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun static void
rtw_btc_wl_leakap(struct btc_coexist * btc,boolean enable)326*4882a593Smuzhiyun rtw_btc_wl_leakap(struct btc_coexist *btc, boolean enable)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
329*4882a593Smuzhiyun u8 h2c_para[2] = {0xc, 0};
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun if (coex_sta->wl_leak_ap == enable)
332*4882a593Smuzhiyun return;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun if (enable) {
335*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
336*4882a593Smuzhiyun "[BTCoex], turn on Leak-AP Rx Protection!!\n");
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun h2c_para[1] = 0x0;
339*4882a593Smuzhiyun } else {
340*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
341*4882a593Smuzhiyun "[BTCoex], turn off Leak-AP Rx Protection!!\n");
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun h2c_para[1] = 0x1;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun BTC_TRACE(trace_buf);
347*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x69, 2, h2c_para);
348*4882a593Smuzhiyun coex_sta->wl_leak_ap = enable;
349*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX] = 0;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun static void
rtw_btc_wl_ccklock_action(struct btc_coexist * btc)353*4882a593Smuzhiyun rtw_btc_wl_ccklock_action(struct btc_coexist *btc)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
356*4882a593Smuzhiyun u8 h2c_parameter[2] = {0}, ap_leak_rx_cnt = 0;
357*4882a593Smuzhiyun boolean wifi_busy = FALSE;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
360*4882a593Smuzhiyun return;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun if (!coex_sta->wl_gl_busy ||
363*4882a593Smuzhiyun coex_sta->wl_iot_peer == BTC_IOT_PEER_CISCO) {
364*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX] = 0;
365*4882a593Smuzhiyun return;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun ap_leak_rx_cnt = coex_sta->wl_fw_dbg_info[7];
369*4882a593Smuzhiyun /* Get realtime wifi_busy status */
370*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun if (coex_sta->wl_leak_ap && coex_sta->wl_force_lps_ctrl &&
373*4882a593Smuzhiyun !coex_sta->wl_cck_lock_ever) {
374*4882a593Smuzhiyun if (ap_leak_rx_cnt <= 5 && wifi_busy)
375*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX]++;
376*4882a593Smuzhiyun else
377*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX] = 0;
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
380*4882a593Smuzhiyun "[BTCoex], Leak-AP Rx extend cnt = %d!!\n",
381*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX]);
382*4882a593Smuzhiyun BTC_TRACE(trace_buf);
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun /* If 7-streak ap_leak_rx_cnt <= 5, turn off leak-AP for TP*/
385*4882a593Smuzhiyun if (coex_sta->cnt_wl[BTC_CNT_WL_LEAKAP_NORX] >= 7)
386*4882a593Smuzhiyun rtw_btc_wl_leakap(btc, FALSE);
387*4882a593Smuzhiyun } else if (!coex_sta->wl_leak_ap && coex_sta->wl_cck_lock) {
388*4882a593Smuzhiyun rtw_btc_wl_leakap(btc, TRUE);
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun static void
rtw_btc_wl_ccklock_detect(struct btc_coexist * btc)393*4882a593Smuzhiyun rtw_btc_wl_ccklock_detect(struct btc_coexist *btc)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
396*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
397*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
398*4882a593Smuzhiyun boolean is_cck_lock_rate = FALSE;
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun if (coex_dm->bt_status == BTC_BTSTATUS_INQ_PAGE ||
401*4882a593Smuzhiyun coex_sta->bt_setup_link)
402*4882a593Smuzhiyun return;
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun if (coex_sta->wl_rx_rate <= BTC_CCK_2 ||
405*4882a593Smuzhiyun coex_sta->wl_rts_rx_rate <= BTC_CCK_2)
406*4882a593Smuzhiyun is_cck_lock_rate = TRUE;
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun if (link_info_ext->is_connected && coex_sta->wl_gl_busy &&
409*4882a593Smuzhiyun BTC_RSSI_HIGH(coex_dm->wl_rssi_state[3]) &&
410*4882a593Smuzhiyun (coex_dm->bt_status == BTC_BTSTATUS_ACL_BUSY ||
411*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_ACL_SCO_BUSY ||
412*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_SCO_BUSY)) {
413*4882a593Smuzhiyun if (is_cck_lock_rate) {
414*4882a593Smuzhiyun coex_sta->wl_cck_lock = TRUE;
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
417*4882a593Smuzhiyun "[BTCoex], cck locking...\n");
418*4882a593Smuzhiyun BTC_TRACE(trace_buf);
419*4882a593Smuzhiyun } else {
420*4882a593Smuzhiyun coex_sta->wl_cck_lock = FALSE;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
423*4882a593Smuzhiyun "[BTCoex], cck unlock...\n");
424*4882a593Smuzhiyun BTC_TRACE(trace_buf);
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun } else {
427*4882a593Smuzhiyun coex_sta->wl_cck_lock = FALSE;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun /* CCK lock identification */
431*4882a593Smuzhiyun if (coex_sta->wl_cck_lock && !coex_sta->wl_cck_lock_pre)
432*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_CCKLOCK, 6);
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun coex_sta->wl_cck_lock_pre = coex_sta->wl_cck_lock;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun static void
rtw_btc_set_extend_btautoslot(struct btc_coexist * btc,u8 thres)438*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(struct btc_coexist *btc, u8 thres)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
441*4882a593Smuzhiyun u8 h2c_para[2] = {0x9, 0x32};
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun if (coex_sta->bt_ext_autoslot_thres == thres)
444*4882a593Smuzhiyun return;
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun h2c_para[1] = thres; /* thres must be 50 ~ 80*/
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun coex_sta->bt_ext_autoslot_thres = h2c_para[1];
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x69, 2, h2c_para);
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun static void
rtw_btc_set_tdma_timer_base(struct btc_coexist * btc,u8 type)454*4882a593Smuzhiyun rtw_btc_set_tdma_timer_base(struct btc_coexist *btc, u8 type)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
457*4882a593Smuzhiyun u16 tbtt_interval = 100;
458*4882a593Smuzhiyun u8 h2c_para[2] = {0xb, 0x1};
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U2_BEACON_PERIOD, &tbtt_interval);
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
463*4882a593Smuzhiyun "[BTCoex], tbtt_interval = %d\n", tbtt_interval);
464*4882a593Smuzhiyun BTC_TRACE(trace_buf);
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun /* Add for JIRA coex-256 */
467*4882a593Smuzhiyun if (type == 3 && tbtt_interval >= 100) { /* 50ms-slot */
468*4882a593Smuzhiyun if (coex_sta->tdma_timer_base == 3)
469*4882a593Smuzhiyun return;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun h2c_para[1] = (tbtt_interval / 50) - 1;
472*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] | 0xc0; /* 50ms-slot */
473*4882a593Smuzhiyun coex_sta->tdma_timer_base = 3;
474*4882a593Smuzhiyun } else if (tbtt_interval < 80 && tbtt_interval > 0) {
475*4882a593Smuzhiyun if (coex_sta->tdma_timer_base == 2)
476*4882a593Smuzhiyun return;
477*4882a593Smuzhiyun h2c_para[1] = (100 / tbtt_interval);
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun if (100 % tbtt_interval != 0)
480*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] + 1;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] & 0x3f;
483*4882a593Smuzhiyun coex_sta->tdma_timer_base = 2;
484*4882a593Smuzhiyun } else if (tbtt_interval >= 180) {
485*4882a593Smuzhiyun if (coex_sta->tdma_timer_base == 1)
486*4882a593Smuzhiyun return;
487*4882a593Smuzhiyun h2c_para[1] = (tbtt_interval / 100);
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun if (tbtt_interval % 100 <= 80)
490*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] - 1;
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] & 0x3f;
493*4882a593Smuzhiyun h2c_para[1] = h2c_para[1] | 0x80;
494*4882a593Smuzhiyun coex_sta->tdma_timer_base = 1;
495*4882a593Smuzhiyun } else {
496*4882a593Smuzhiyun if (coex_sta->tdma_timer_base == 0)
497*4882a593Smuzhiyun return;
498*4882a593Smuzhiyun h2c_para[1] = 0x1;
499*4882a593Smuzhiyun coex_sta->tdma_timer_base = 0;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x69, 2, h2c_para);
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
505*4882a593Smuzhiyun "[BTCoex], %s(): h2c_0x69 = 0x%x\n", __func__, h2c_para[1]);
506*4882a593Smuzhiyun BTC_TRACE(trace_buf);
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun static void
rtw_btc_set_wl_pri_mask(struct btc_coexist * btc,u8 bitmap,u8 data)510*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(struct btc_coexist *btc, u8 bitmap, u8 data)
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun u32 addr;
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun addr = REG_BT_COEX_TABLE_H + (bitmap / 8);
515*4882a593Smuzhiyun bitmap = bitmap % 8;
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, addr, BIT(bitmap), data);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun static void
rtw_btc_set_bt_golden_rx_range(struct btc_coexist * btc,boolean force_exec,u8 profile_id,u8 shift_level)521*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(struct btc_coexist *btc, boolean force_exec,
522*4882a593Smuzhiyun u8 profile_id, u8 shift_level)
523*4882a593Smuzhiyun {
524*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
525*4882a593Smuzhiyun u16 para;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun if (profile_id > 3)
528*4882a593Smuzhiyun return;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun if (!force_exec &&
531*4882a593Smuzhiyun shift_level == coex_sta->bt_golden_rx_shift[profile_id])
532*4882a593Smuzhiyun return;
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun coex_sta->bt_golden_rx_shift[profile_id] = shift_level;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun para = (profile_id << 8) | ((0x100 - shift_level) & 0xff);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_BT_GOLDEN_RX_RANGE, ¶);
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
541*4882a593Smuzhiyun "[BTCoex], %s(): para = 0x%04x\n", __func__, para);
542*4882a593Smuzhiyun BTC_TRACE(trace_buf);
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun static void
rtw_btc_query_bt_info(struct btc_coexist * btc)546*4882a593Smuzhiyun rtw_btc_query_bt_info(struct btc_coexist *btc)
547*4882a593Smuzhiyun {
548*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
549*4882a593Smuzhiyun u8 h2c_parameter[1] = {0x1};
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun if (coex_sta->bt_disabled)
552*4882a593Smuzhiyun return;
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
555*4882a593Smuzhiyun BTC_TRACE(trace_buf);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun rtw_btc_mailbox_operation(btc, 0x61, 1, h2c_parameter);
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun static void
rtw_btc_gnt_debug(struct btc_coexist * btc,boolean isenable)561*4882a593Smuzhiyun rtw_btc_gnt_debug(struct btc_coexist *btc, boolean isenable)
562*4882a593Smuzhiyun {
563*4882a593Smuzhiyun if (!isenable)
564*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, 0x73, 0x8, 0x0);
565*4882a593Smuzhiyun else
566*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_GNT_DEBUG);
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun static void
rtw_btc_gnt_workaround(struct btc_coexist * btc,boolean force_exec,u8 mode)570*4882a593Smuzhiyun rtw_btc_gnt_workaround(struct btc_coexist *btc, boolean force_exec, u8 mode)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun if (!force_exec) {
575*4882a593Smuzhiyun if (coex_sta->gnt_workaround_state == coex_sta->wl_coex_mode)
576*4882a593Smuzhiyun return;
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun coex_sta->gnt_workaround_state = coex_sta->wl_coex_mode;
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_GNT_FIX);
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun static void
rtw_btc_monitor_bt_enable(struct btc_coexist * btc)585*4882a593Smuzhiyun rtw_btc_monitor_bt_enable(struct btc_coexist *btc)
586*4882a593Smuzhiyun {
587*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
588*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
589*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
590*4882a593Smuzhiyun boolean bt_disabled = FALSE;
591*4882a593Smuzhiyun u16 scbd;
592*4882a593Smuzhiyun u32 scbd_32;
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun if (chip_para->scbd_support) {
595*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT) {
596*4882a593Smuzhiyun btc->btc_read_scbd(btc, &scbd);
597*4882a593Smuzhiyun bt_disabled = (scbd & BTC_SCBD_BT_ONOFF) ? FALSE : TRUE;
598*4882a593Smuzhiyun } else {
599*4882a593Smuzhiyun btc->btc_read_scbd_32bit(btc, &scbd_32);
600*4882a593Smuzhiyun bt_disabled = (scbd_32 & BTC_SCBD_BT_ONOFF) ? FALSE : TRUE;
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun } else {
604*4882a593Smuzhiyun if (coex_sta->cnt_bt[BTC_CNT_BT_DISABLE] >= 2)
605*4882a593Smuzhiyun bt_disabled = TRUE;
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_BT_DISABLE, &bt_disabled);
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun if (coex_sta->bt_disabled != bt_disabled) {
611*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
612*4882a593Smuzhiyun "[BTCoex], BT is from %s to %s!!\n",
613*4882a593Smuzhiyun (coex_sta->bt_disabled ? "disabled" : "enabled"),
614*4882a593Smuzhiyun (bt_disabled ? "disabled" : "enabled"));
615*4882a593Smuzhiyun BTC_TRACE(trace_buf);
616*4882a593Smuzhiyun coex_sta->bt_disabled = bt_disabled;
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun coex_sta->bt_supported_feature = 0;
619*4882a593Smuzhiyun coex_sta->bt_supported_version = 0;
620*4882a593Smuzhiyun coex_sta->bt_ble_scan_type = 0;
621*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[0] = 0;
622*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[1] = 0;
623*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[2] = 0;
624*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac = 0xffff;
625*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ae = 0xffff;
626*4882a593Smuzhiyun coex_sta->bt_a2dp_vendor_id = 0;
627*4882a593Smuzhiyun coex_sta->bt_a2dp_device_name = 0;
628*4882a593Smuzhiyun coex_sta->bt_iqk_state = 0;
629*4882a593Smuzhiyun coex_dm->cur_bt_lna_lvl = 0;
630*4882a593Smuzhiyun btc->bt_info.bt_get_fw_ver = 0;
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun /*for win10 BT disable->enable trigger wifi scan issue */
633*4882a593Smuzhiyun if (!coex_sta->bt_disabled) {
634*4882a593Smuzhiyun coex_sta->bt_reenable = TRUE;
635*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_REENABLE, 15);
636*4882a593Smuzhiyun } else {
637*4882a593Smuzhiyun coex_sta->bt_reenable = FALSE;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun static void
rtw_btc_update_bt_sut_info(struct btc_coexist * btc)643*4882a593Smuzhiyun rtw_btc_update_bt_sut_info(struct btc_coexist *btc)
644*4882a593Smuzhiyun {
645*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
646*4882a593Smuzhiyun u32 val = 0;
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun if (coex_sta->bt_profile_num == 0) {
649*4882a593Smuzhiyun /* clear golden rx range if no PAN exist */
650*4882a593Smuzhiyun if (coex_sta->bt_golden_rx_shift[3] != 0)
651*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, FC_EXCU, 3, 0);
652*4882a593Smuzhiyun return;
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun if (coex_sta->bt_a2dp_exist)
656*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, FC_EXCU, 2, 0);
657*4882a593Smuzhiyun else
658*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[2] = 0xff;
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun if (coex_sta->bt_hfp_exist)
661*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, FC_EXCU, 0, 0);
662*4882a593Smuzhiyun else
663*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[0] = 0xff;
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun if (coex_sta->bt_hid_exist)
666*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, FC_EXCU, 1, 0);
667*4882a593Smuzhiyun else
668*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[1] = 0xff;
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun if (coex_sta->bt_pan_exist) {
671*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, FC_EXCU, 3,
672*4882a593Smuzhiyun coex_sta->bt_golden_rx_shift[3]);
673*4882a593Smuzhiyun } else {
674*4882a593Smuzhiyun coex_sta->bt_golden_rx_shift[3] = 0;
675*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[3] = 0xff;
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun }
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun static void
rtw_btc_update_wl_link_info(struct btc_coexist * btc,u8 reason)680*4882a593Smuzhiyun rtw_btc_update_wl_link_info(struct btc_coexist *btc, u8 reason)
681*4882a593Smuzhiyun {
682*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
683*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
684*4882a593Smuzhiyun struct btc_wifi_link_info_ext *linfo_ext = &btc->wifi_link_info_ext;
685*4882a593Smuzhiyun struct btc_wifi_link_info linfo;
686*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
687*4882a593Smuzhiyun u8 wifi_central_chnl = 0, num_of_wifi_link = 0, i, rssi_state;
688*4882a593Smuzhiyun u32 wifi_link_status = 0, wifi_bw;
689*4882a593Smuzhiyun s32 wl_rssi;
690*4882a593Smuzhiyun boolean isunder5G = FALSE, ismcc25g = FALSE, is_p2p_connected = FALSE,
691*4882a593Smuzhiyun plus_bt = FALSE;
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_SCAN, &linfo_ext->is_scan);
694*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_LINK, &linfo_ext->is_link);
695*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_ROAM, &linfo_ext->is_roam);
696*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_LW_PWR_STATE, &linfo_ext->is_32k);
697*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &linfo_ext->is_4way);
698*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_CONNECTED, &linfo_ext->is_connected);
699*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_WIFI_TRAFFIC_DIR, &linfo_ext->traffic_dir);
700*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_WIFI_BW, &linfo_ext->wifi_bw);
701*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_WIFI_LINK_STATUS, &wifi_link_status);
702*4882a593Smuzhiyun linfo_ext->port_connect_status = wifi_link_status & 0xffff;
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_LINK_INFO, &linfo);
705*4882a593Smuzhiyun btc->wifi_link_info = linfo;
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
708*4882a593Smuzhiyun coex_sta->wl_center_ch = wifi_central_chnl;
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_S4_WIFI_RSSI, &wl_rssi);
711*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
712*4882a593Smuzhiyun rssi_state = coex_dm->wl_rssi_state[i];
713*4882a593Smuzhiyun rssi_state = rtw_btc_rssi_state(btc, rssi_state,
714*4882a593Smuzhiyun (u8)(wl_rssi & 0xff),
715*4882a593Smuzhiyun chip_para->wl_rssi_step[i]);
716*4882a593Smuzhiyun coex_dm->wl_rssi_state[i] = rssi_state;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun if (coex_sta->wl_linkscan_proc || coex_sta->wl_hi_pri_task1 ||
720*4882a593Smuzhiyun coex_sta->wl_hi_pri_task2 || coex_sta->wl_gl_busy) {
721*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
722*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_SCAN, TRUE);
723*4882a593Smuzhiyun else
724*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_SCAN, TRUE);
725*4882a593Smuzhiyun } else {
726*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
727*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_SCAN, FALSE);
728*4882a593Smuzhiyun else
729*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_SCAN, FALSE);
730*4882a593Smuzhiyun }
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun /* Check scan/connect/special-pkt action first */
733*4882a593Smuzhiyun switch (reason) {
734*4882a593Smuzhiyun case BTC_RSN_5GSCANSTART:
735*4882a593Smuzhiyun case BTC_RSN_5GSWITCHBAND:
736*4882a593Smuzhiyun case BTC_RSN_5GCONSTART:
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun isunder5G = TRUE;
739*4882a593Smuzhiyun break;
740*4882a593Smuzhiyun case BTC_RSN_2GSCANSTART:
741*4882a593Smuzhiyun case BTC_RSN_2GSWITCHBAND:
742*4882a593Smuzhiyun case BTC_RSN_2GCONSTART:
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun isunder5G = FALSE;
745*4882a593Smuzhiyun break;
746*4882a593Smuzhiyun case BTC_RSN_2GCONFINISH:
747*4882a593Smuzhiyun case BTC_RSN_5GCONFINISH:
748*4882a593Smuzhiyun case BTC_RSN_2GMEDIA:
749*4882a593Smuzhiyun case BTC_RSN_5GMEDIA:
750*4882a593Smuzhiyun case BTC_RSN_BTINFO:
751*4882a593Smuzhiyun case BTC_RSN_PERIODICAL:
752*4882a593Smuzhiyun case BTC_RSN_TIMERUP:
753*4882a593Smuzhiyun case BTC_RSN_WLSTATUS:
754*4882a593Smuzhiyun case BTC_RSN_2GSPECIALPKT:
755*4882a593Smuzhiyun case BTC_RSN_5GSPECIALPKT:
756*4882a593Smuzhiyun default:
757*4882a593Smuzhiyun switch (linfo.link_mode) {
758*4882a593Smuzhiyun case BTC_LINK_5G_MCC_GO_STA:
759*4882a593Smuzhiyun case BTC_LINK_5G_MCC_GC_STA:
760*4882a593Smuzhiyun case BTC_LINK_5G_SCC_GO_STA:
761*4882a593Smuzhiyun case BTC_LINK_5G_SCC_GC_STA:
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun isunder5G = TRUE;
764*4882a593Smuzhiyun break;
765*4882a593Smuzhiyun case BTC_LINK_2G_MCC_GO_STA:
766*4882a593Smuzhiyun case BTC_LINK_2G_MCC_GC_STA:
767*4882a593Smuzhiyun case BTC_LINK_2G_SCC_GO_STA:
768*4882a593Smuzhiyun case BTC_LINK_2G_SCC_GC_STA:
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun isunder5G = FALSE;
771*4882a593Smuzhiyun break;
772*4882a593Smuzhiyun case BTC_LINK_25G_MCC_GO_STA:
773*4882a593Smuzhiyun case BTC_LINK_25G_MCC_GC_STA:
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun isunder5G = FALSE;
776*4882a593Smuzhiyun ismcc25g = TRUE;
777*4882a593Smuzhiyun break;
778*4882a593Smuzhiyun case BTC_LINK_ONLY_STA:
779*4882a593Smuzhiyun if (linfo.sta_center_channel > 14)
780*4882a593Smuzhiyun isunder5G = TRUE;
781*4882a593Smuzhiyun else
782*4882a593Smuzhiyun isunder5G = FALSE;
783*4882a593Smuzhiyun break;
784*4882a593Smuzhiyun case BTC_LINK_ONLY_GO:
785*4882a593Smuzhiyun case BTC_LINK_ONLY_GC:
786*4882a593Smuzhiyun case BTC_LINK_ONLY_AP:
787*4882a593Smuzhiyun default:
788*4882a593Smuzhiyun if (linfo.p2p_center_channel > 14)
789*4882a593Smuzhiyun isunder5G = TRUE;
790*4882a593Smuzhiyun else
791*4882a593Smuzhiyun isunder5G = FALSE;
792*4882a593Smuzhiyun break;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun break;
795*4882a593Smuzhiyun }
796*4882a593Smuzhiyun
797*4882a593Smuzhiyun linfo_ext->is_all_under_5g = isunder5G;
798*4882a593Smuzhiyun linfo_ext->is_mcc_25g = ismcc25g;
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun if (wifi_link_status & WIFI_STA_CONNECTED)
801*4882a593Smuzhiyun num_of_wifi_link++;
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun if (wifi_link_status & WIFI_AP_CONNECTED)
804*4882a593Smuzhiyun num_of_wifi_link++;
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun if (wifi_link_status & WIFI_P2P_GO_CONNECTED) {
807*4882a593Smuzhiyun if (!(wifi_link_status & WIFI_AP_CONNECTED))
808*4882a593Smuzhiyun num_of_wifi_link++;
809*4882a593Smuzhiyun is_p2p_connected = TRUE;
810*4882a593Smuzhiyun }
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun if (wifi_link_status & WIFI_P2P_GC_CONNECTED) {
813*4882a593Smuzhiyun num_of_wifi_link++;
814*4882a593Smuzhiyun is_p2p_connected = TRUE;
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun linfo_ext->num_of_active_port = num_of_wifi_link;
818*4882a593Smuzhiyun linfo_ext->is_p2p_connected = is_p2p_connected;
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun if (linfo.link_mode == BTC_LINK_ONLY_GO && linfo.bhotspot)
821*4882a593Smuzhiyun linfo_ext->is_ap_mode = TRUE;
822*4882a593Smuzhiyun else
823*4882a593Smuzhiyun linfo_ext->is_ap_mode = FALSE;
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun if (linfo_ext->is_p2p_connected && coex_sta->bt_link_exist)
826*4882a593Smuzhiyun plus_bt = TRUE;
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_MIRACAST_PLUS_BT, &plus_bt);
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun if (linfo_ext->is_scan || linfo_ext->is_link ||
831*4882a593Smuzhiyun linfo_ext->is_roam || linfo_ext->is_4way ||
832*4882a593Smuzhiyun reason == BTC_RSN_2GSCANSTART ||
833*4882a593Smuzhiyun reason == BTC_RSN_2GSWITCHBAND ||
834*4882a593Smuzhiyun reason == BTC_RSN_2GCONSTART ||
835*4882a593Smuzhiyun reason == BTC_RSN_2GSPECIALPKT)
836*4882a593Smuzhiyun coex_sta->wl_linkscan_proc = TRUE;
837*4882a593Smuzhiyun else
838*4882a593Smuzhiyun coex_sta->wl_linkscan_proc = FALSE;
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
841*4882a593Smuzhiyun "[BTCoex], scan = %d, link = %d, roam = %d 4way = %d!!!\n",
842*4882a593Smuzhiyun linfo_ext->is_scan, linfo_ext->is_link,
843*4882a593Smuzhiyun linfo_ext->is_roam,
844*4882a593Smuzhiyun linfo_ext->is_4way);
845*4882a593Smuzhiyun BTC_TRACE(trace_buf);
846*4882a593Smuzhiyun
847*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
848*4882a593Smuzhiyun "[BTCoex], wifi_link_info: link_mode=%d, STA_Ch=%d, P2P_Ch=%d, AnyClient_Join_Go=%d !\n",
849*4882a593Smuzhiyun linfo.link_mode,
850*4882a593Smuzhiyun linfo.sta_center_channel,
851*4882a593Smuzhiyun linfo.p2p_center_channel,
852*4882a593Smuzhiyun linfo.bany_client_join_go);
853*4882a593Smuzhiyun BTC_TRACE(trace_buf);
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
856*4882a593Smuzhiyun "[BTCoex], wifi_link_info: center_ch=%d, is_all_under_5g=%d, is_mcc_25g=%d!\n",
857*4882a593Smuzhiyun coex_sta->wl_center_ch,
858*4882a593Smuzhiyun linfo_ext->is_all_under_5g,
859*4882a593Smuzhiyun linfo_ext->is_mcc_25g);
860*4882a593Smuzhiyun BTC_TRACE(trace_buf);
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
863*4882a593Smuzhiyun "[BTCoex], wifi_link_info: port_connect_status=0x%x, active_port_cnt=%d, P2P_Connect=%d!\n",
864*4882a593Smuzhiyun linfo_ext->port_connect_status,
865*4882a593Smuzhiyun linfo_ext->num_of_active_port,
866*4882a593Smuzhiyun linfo_ext->is_p2p_connected);
867*4882a593Smuzhiyun BTC_TRACE(trace_buf);
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
870*4882a593Smuzhiyun "[BTCoex], Update reason = %s\n",
871*4882a593Smuzhiyun run_reason_string[reason]);
872*4882a593Smuzhiyun BTC_TRACE(trace_buf);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
875*4882a593Smuzhiyun return;
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun /* coex-276 P2P-Go beacon request can't release issue
878*4882a593Smuzhiyun * Only PCIe/USB can set 0x454[6] = 1 to solve this issue,
879*4882a593Smuzhiyun * WL SDIO/USB interface need driver support.
880*4882a593Smuzhiyun */
881*4882a593Smuzhiyun #ifdef PLATFORM_WINDOWS
882*4882a593Smuzhiyun if (btc->chip_interface != BTC_INTF_SDIO)
883*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_CCK_CHECK,
884*4882a593Smuzhiyun BIT_EN_BCN_PKT_REL, 0x1);
885*4882a593Smuzhiyun else
886*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_CCK_CHECK,
887*4882a593Smuzhiyun BIT_EN_BCN_PKT_REL, 0x0);
888*4882a593Smuzhiyun #endif
889*4882a593Smuzhiyun }
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun static void
rtw_btc_update_bt_link_info(struct btc_coexist * btc)892*4882a593Smuzhiyun rtw_btc_update_bt_link_info(struct btc_coexist *btc)
893*4882a593Smuzhiyun {
894*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
895*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
896*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
897*4882a593Smuzhiyun boolean bt_busy = FALSE, increase_scan_dev_num = FALSE,
898*4882a593Smuzhiyun scan_type_change = FALSE;
899*4882a593Smuzhiyun u8 i, scan_type, rssi_state;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun /* update wl/bt rssi by btinfo */
902*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
903*4882a593Smuzhiyun rssi_state = coex_dm->bt_rssi_state[i];
904*4882a593Smuzhiyun rssi_state = rtw_btc_rssi_state(btc, rssi_state,
905*4882a593Smuzhiyun coex_sta->bt_rssi,
906*4882a593Smuzhiyun chip_para->bt_rssi_step[i]);
907*4882a593Smuzhiyun coex_dm->bt_rssi_state[i] = rssi_state;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun if (coex_sta->bt_ble_scan_en) {
911*4882a593Smuzhiyun scan_type = btc->btc_get_ble_scan_type_from_bt(btc);
912*4882a593Smuzhiyun
913*4882a593Smuzhiyun if (scan_type != coex_sta->bt_ble_scan_type)
914*4882a593Smuzhiyun scan_type_change = TRUE;
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun coex_sta->bt_ble_scan_type = scan_type;
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun if (scan_type_change) {
920*4882a593Smuzhiyun u32 *p = NULL;
921*4882a593Smuzhiyun
922*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
923*4882a593Smuzhiyun "[BTCoex], BTinfo HiByte1[5] check, query BLE Scan type!!\n");
924*4882a593Smuzhiyun BTC_TRACE(trace_buf);
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun if ((coex_sta->bt_ble_scan_type & 0x1) == 0x1) {
927*4882a593Smuzhiyun coex_sta->bt_init_scan = TRUE;
928*4882a593Smuzhiyun p = &coex_sta->bt_ble_scan_para[0];
929*4882a593Smuzhiyun *p = btc->btc_get_ble_scan_para_from_bt(btc, 0x1);
930*4882a593Smuzhiyun } else {
931*4882a593Smuzhiyun coex_sta->bt_init_scan = FALSE;
932*4882a593Smuzhiyun }
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun if ((coex_sta->bt_ble_scan_type & 0x2) == 0x2) {
935*4882a593Smuzhiyun p = &coex_sta->bt_ble_scan_para[1];
936*4882a593Smuzhiyun *p = btc->btc_get_ble_scan_para_from_bt(btc, 0x2);
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun if ((coex_sta->bt_ble_scan_type & 0x4) == 0x4) {
940*4882a593Smuzhiyun p = &coex_sta->bt_ble_scan_para[2];
941*4882a593Smuzhiyun *p = btc->btc_get_ble_scan_para_from_bt(btc, 0x4);
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun }
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun coex_sta->bt_profile_num = 0;
946*4882a593Smuzhiyun
947*4882a593Smuzhiyun /* set link exist status */
948*4882a593Smuzhiyun if (!(coex_sta->bt_info_lb2 & BTC_INFO_CONNECTION)) {
949*4882a593Smuzhiyun coex_sta->bt_link_exist = FALSE;
950*4882a593Smuzhiyun coex_sta->bt_pan_exist = FALSE;
951*4882a593Smuzhiyun coex_sta->bt_a2dp_exist = FALSE;
952*4882a593Smuzhiyun coex_sta->bt_hid_exist = FALSE;
953*4882a593Smuzhiyun coex_sta->bt_hfp_exist = FALSE;
954*4882a593Smuzhiyun coex_sta->bt_msft_mr_exist = FALSE;
955*4882a593Smuzhiyun } else { /* connection exists */
956*4882a593Smuzhiyun coex_sta->bt_link_exist = TRUE;
957*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_FTP) {
958*4882a593Smuzhiyun coex_sta->bt_pan_exist = TRUE;
959*4882a593Smuzhiyun coex_sta->bt_profile_num++;
960*4882a593Smuzhiyun } else {
961*4882a593Smuzhiyun coex_sta->bt_pan_exist = FALSE;
962*4882a593Smuzhiyun }
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_A2DP) {
965*4882a593Smuzhiyun coex_sta->bt_a2dp_exist = TRUE;
966*4882a593Smuzhiyun coex_sta->bt_profile_num++;
967*4882a593Smuzhiyun } else {
968*4882a593Smuzhiyun coex_sta->bt_a2dp_exist = FALSE;
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_HID) {
972*4882a593Smuzhiyun coex_sta->bt_hid_exist = TRUE;
973*4882a593Smuzhiyun coex_sta->bt_profile_num++;
974*4882a593Smuzhiyun } else {
975*4882a593Smuzhiyun coex_sta->bt_hid_exist = FALSE;
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun
978*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_SCO_ESCO) {
979*4882a593Smuzhiyun coex_sta->bt_hfp_exist = TRUE;
980*4882a593Smuzhiyun coex_sta->bt_profile_num++;
981*4882a593Smuzhiyun } else {
982*4882a593Smuzhiyun coex_sta->bt_hfp_exist = FALSE;
983*4882a593Smuzhiyun }
984*4882a593Smuzhiyun }
985*4882a593Smuzhiyun
986*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_INQ_PAGE) {
987*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_INQ_PAGE;
988*4882a593Smuzhiyun } else if (!(coex_sta->bt_info_lb2 & BTC_INFO_CONNECTION)) {
989*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_NCON_IDLE;
990*4882a593Smuzhiyun coex_sta->bt_multi_link_remain = FALSE;
991*4882a593Smuzhiyun } else if (coex_sta->bt_info_lb2 == BTC_INFO_CONNECTION) {
992*4882a593Smuzhiyun if (coex_sta->bt_msft_mr_exist)
993*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_ACL_BUSY;
994*4882a593Smuzhiyun else
995*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_CON_IDLE;
996*4882a593Smuzhiyun } else if ((coex_sta->bt_info_lb2 & BTC_INFO_SCO_ESCO) ||
997*4882a593Smuzhiyun (coex_sta->bt_info_lb2 & BTC_INFO_SCO_BUSY)) {
998*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BTC_INFO_ACL_BUSY)
999*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_ACL_SCO_BUSY;
1000*4882a593Smuzhiyun else
1001*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_SCO_BUSY;
1002*4882a593Smuzhiyun } else if (coex_sta->bt_info_lb2 & BTC_INFO_ACL_BUSY) {
1003*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_ACL_BUSY;
1004*4882a593Smuzhiyun } else {
1005*4882a593Smuzhiyun coex_dm->bt_status = BTC_BTSTATUS_MAX;
1006*4882a593Smuzhiyun }
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s(), %s!!!\n",
1009*4882a593Smuzhiyun __func__, bt_status_string[coex_dm->bt_status]);
1010*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun if (coex_dm->bt_status == BTC_BTSTATUS_ACL_BUSY ||
1013*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_SCO_BUSY ||
1014*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_ACL_SCO_BUSY) {
1015*4882a593Smuzhiyun bt_busy = TRUE;
1016*4882a593Smuzhiyun increase_scan_dev_num = TRUE;
1017*4882a593Smuzhiyun } else {
1018*4882a593Smuzhiyun bt_busy = FALSE;
1019*4882a593Smuzhiyun increase_scan_dev_num = FALSE;
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1023*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_INC_SCAN_DEV_NUM, &increase_scan_dev_num);
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun if (coex_sta->bt_profile_num != coex_sta->bt_profile_num_pre) {
1026*4882a593Smuzhiyun rtw_btc_update_bt_sut_info(btc);
1027*4882a593Smuzhiyun coex_sta->bt_profile_num_pre = coex_sta->bt_profile_num;
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun if (!coex_sta->bt_a2dp_exist) {
1030*4882a593Smuzhiyun coex_sta->bt_a2dp_vendor_id = 0;
1031*4882a593Smuzhiyun coex_sta->bt_a2dp_device_name = 0;
1032*4882a593Smuzhiyun coex_sta->bt_a2dp_flush_time = 0;
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun }
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_INFOUPDATE]++;
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun static void
rtw_btc_update_wl_ch_info(struct btc_coexist * btc,u8 type)1040*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(struct btc_coexist *btc, u8 type)
1041*4882a593Smuzhiyun {
1042*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1043*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1044*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1045*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
1046*4882a593Smuzhiyun struct btc_wifi_link_info *link_info = &btc->wifi_link_info;
1047*4882a593Smuzhiyun u8 h2c_para[3] = {0}, i, wl_center_ch = 0;
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun if (btc->manual_control)
1050*4882a593Smuzhiyun return;
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun if (btc->stop_coex_dm || btc->wl_rf_state_off) {
1053*4882a593Smuzhiyun wl_center_ch = 0;
1054*4882a593Smuzhiyun } else if (type != BTC_MEDIA_DISCONNECT ||
1055*4882a593Smuzhiyun (type == BTC_MEDIA_DISCONNECT &&
1056*4882a593Smuzhiyun link_info_ext->num_of_active_port > 0)) {
1057*4882a593Smuzhiyun if (link_info_ext->num_of_active_port == 1) {
1058*4882a593Smuzhiyun if (link_info_ext->is_p2p_connected)
1059*4882a593Smuzhiyun wl_center_ch = link_info->p2p_center_channel;
1060*4882a593Smuzhiyun else
1061*4882a593Smuzhiyun wl_center_ch = link_info->sta_center_channel;
1062*4882a593Smuzhiyun } else { /* port > 2 */
1063*4882a593Smuzhiyun if (link_info->p2p_center_channel > 14 &&
1064*4882a593Smuzhiyun link_info->sta_center_channel > 14)
1065*4882a593Smuzhiyun wl_center_ch = link_info->p2p_center_channel;
1066*4882a593Smuzhiyun else if (link_info->p2p_center_channel <= 14)
1067*4882a593Smuzhiyun wl_center_ch = link_info->p2p_center_channel;
1068*4882a593Smuzhiyun else if (link_info->sta_center_channel <= 14)
1069*4882a593Smuzhiyun wl_center_ch = link_info->sta_center_channel;
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun }
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun if (wl_center_ch == 0) {
1074*4882a593Smuzhiyun h2c_para[0] = 0x0;
1075*4882a593Smuzhiyun h2c_para[1] = 0x0;
1076*4882a593Smuzhiyun h2c_para[2] = 0x0;
1077*4882a593Smuzhiyun } else if(btc->board_info.btdm_ant_num == 1 && wl_center_ch <= 14) {
1078*4882a593Smuzhiyun h2c_para[0] = 0x1;
1079*4882a593Smuzhiyun h2c_para[1] = wl_center_ch;
1080*4882a593Smuzhiyun /* 8723f shared ant, BT should avoid wifi channel */
1081*4882a593Smuzhiyun if (link_info_ext->wifi_bw == BTC_WIFI_BW_HT40)
1082*4882a593Smuzhiyun h2c_para[2] = 0x28;
1083*4882a593Smuzhiyun else
1084*4882a593Smuzhiyun h2c_para[2] = 0x14;
1085*4882a593Smuzhiyun } else if (wl_center_ch <= 14) {
1086*4882a593Smuzhiyun h2c_para[0] = 0x1;
1087*4882a593Smuzhiyun h2c_para[1] = wl_center_ch;
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun if (link_info_ext->wifi_bw == BTC_WIFI_BW_HT40)
1090*4882a593Smuzhiyun h2c_para[2] = chip_para->bt_afh_span_bw40;
1091*4882a593Smuzhiyun else
1092*4882a593Smuzhiyun h2c_para[2] = chip_para->bt_afh_span_bw20;
1093*4882a593Smuzhiyun } else if (chip_para->afh_5g_num > 1) { /* for 5G */
1094*4882a593Smuzhiyun for (i = 0; i < chip_para->afh_5g_num; i++) {
1095*4882a593Smuzhiyun if (wl_center_ch == chip_para->afh_5g[i].wl_5g_ch) {
1096*4882a593Smuzhiyun h2c_para[0] = 0x3;
1097*4882a593Smuzhiyun h2c_para[1] = chip_para->afh_5g[i].bt_skip_ch;
1098*4882a593Smuzhiyun h2c_para[2] = chip_para->afh_5g[i].bt_skip_span;
1099*4882a593Smuzhiyun break;
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun }
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun /* Only send mailbox if ch info change */
1105*4882a593Smuzhiyun if (coex_dm->wl_chnl_info[0] != h2c_para[0] &&
1106*4882a593Smuzhiyun coex_dm->wl_chnl_info[1] != h2c_para[1] &&
1107*4882a593Smuzhiyun coex_dm->wl_chnl_info[2] != h2c_para[2]) {
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun coex_dm->wl_chnl_info[0] = h2c_para[0];
1110*4882a593Smuzhiyun coex_dm->wl_chnl_info[1] = h2c_para[1];
1111*4882a593Smuzhiyun coex_dm->wl_chnl_info[2] = h2c_para[2];
1112*4882a593Smuzhiyun rtw_btc_mailbox_operation(btc, 0x66, 3, h2c_para);
1113*4882a593Smuzhiyun }
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1116*4882a593Smuzhiyun "[BTCoex], %s: para[0:2] = 0x%x 0x%x 0x%x\n",
1117*4882a593Smuzhiyun __func__, h2c_para[0], h2c_para[1], h2c_para[2]);
1118*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1119*4882a593Smuzhiyun }
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun static void
rtw_btc_set_wl_tx_power(struct btc_coexist * btc,boolean force_exec,u8 wl_pwr_dec_lvl)1122*4882a593Smuzhiyun rtw_btc_set_wl_tx_power(struct btc_coexist *btc,
1123*4882a593Smuzhiyun boolean force_exec, u8 wl_pwr_dec_lvl)
1124*4882a593Smuzhiyun {
1125*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1126*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun if (!force_exec && wl_pwr_dec_lvl == coex_dm->cur_wl_pwr_lvl)
1129*4882a593Smuzhiyun return;
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun coex_dm->cur_wl_pwr_lvl = wl_pwr_dec_lvl;
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun chip_para->chip_setup(btc, BTC_CSETUP_WL_TX_POWER);
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s(): level = %d\n",
1136*4882a593Smuzhiyun __func__, wl_pwr_dec_lvl);
1137*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1138*4882a593Smuzhiyun }
1139*4882a593Smuzhiyun
1140*4882a593Smuzhiyun static void
rtw_btc_set_bt_tx_power(struct btc_coexist * btc,boolean force_exec,u8 bt_pwr_dec_lvl)1141*4882a593Smuzhiyun rtw_btc_set_bt_tx_power(struct btc_coexist *btc,
1142*4882a593Smuzhiyun boolean force_exec, u8 bt_pwr_dec_lvl)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1145*4882a593Smuzhiyun u8 h2c_para[1] = {0};
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun if (!force_exec && bt_pwr_dec_lvl == coex_dm->cur_bt_pwr_lvl)
1148*4882a593Smuzhiyun return;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun h2c_para[0] = (0x100 - bt_pwr_dec_lvl) & 0xff;
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun rtw_btc_mailbox_operation(btc, 0x62, 1, h2c_para);
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun coex_dm->cur_bt_pwr_lvl = bt_pwr_dec_lvl;
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1157*4882a593Smuzhiyun "[BTCoex], %s(), bt_tx_power = 0x%x, level = %d\n",
1158*4882a593Smuzhiyun __func__, h2c_para[0], bt_pwr_dec_lvl);
1159*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun static void
rtw_btc_set_wl_rx_gain(struct btc_coexist * btc,boolean force_exec,boolean low_gain_en)1163*4882a593Smuzhiyun rtw_btc_set_wl_rx_gain(struct btc_coexist *btc, boolean force_exec,
1164*4882a593Smuzhiyun boolean low_gain_en)
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1167*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun if (!force_exec && low_gain_en == coex_dm->cur_wl_rx_low_gain_en)
1170*4882a593Smuzhiyun return;
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun coex_dm->cur_wl_rx_low_gain_en = low_gain_en;
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun if (low_gain_en)
1175*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Hi-L Rx!\n");
1176*4882a593Smuzhiyun else
1177*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Nm-L Rx!\n");
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun chip_para->chip_setup(btc, BTC_CSETUP_WL_RX_GAIN);
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun static void
rtw_btc_set_bt_rx_gain(struct btc_coexist * btc,boolean force_exec,u8 lna_lvl)1185*4882a593Smuzhiyun rtw_btc_set_bt_rx_gain(struct btc_coexist *btc, boolean force_exec, u8 lna_lvl)
1186*4882a593Smuzhiyun {
1187*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1188*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun if (!force_exec && lna_lvl == coex_dm->cur_bt_lna_lvl)
1191*4882a593Smuzhiyun return;
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun if (lna_lvl < 7) {
1194*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_BL_BT_LNA_CONSTRAIN_LEVEL, &lna_lvl);
1195*4882a593Smuzhiyun /* use scoreboard[4] to notify BT Rx gain table change */
1196*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
1197*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_RXGAIN, TRUE);
1198*4882a593Smuzhiyun else
1199*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_RXGAIN, TRUE);
1200*4882a593Smuzhiyun } else {
1201*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
1202*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_RXGAIN, FALSE);
1203*4882a593Smuzhiyun else
1204*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_RXGAIN, FALSE);
1205*4882a593Smuzhiyun }
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun coex_dm->cur_bt_lna_lvl = lna_lvl;
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1210*4882a593Smuzhiyun "[BTCoex], %s(): bt_rx_LNA_level = %d\n",
1211*4882a593Smuzhiyun __func__, lna_lvl);
1212*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1213*4882a593Smuzhiyun }
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun static void
rtw_btc_set_rf_para(struct btc_coexist * btc,boolean force_exec,struct btc_rf_para para)1216*4882a593Smuzhiyun rtw_btc_set_rf_para(struct btc_coexist *btc, boolean force_exec,
1217*4882a593Smuzhiyun struct btc_rf_para para)
1218*4882a593Smuzhiyun {
1219*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1220*4882a593Smuzhiyun u8 tmp = 0;
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun if (coex_sta->coex_freerun) {
1223*4882a593Smuzhiyun if (coex_sta->cnt_wl[BTC_CNT_WL_SCANAP] <= 5)
1224*4882a593Smuzhiyun tmp = 3;
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun rtw_btc_set_wl_tx_power(btc, force_exec, para.wl_pwr_dec_lvl);
1228*4882a593Smuzhiyun rtw_btc_set_bt_tx_power(btc, force_exec, para.bt_pwr_dec_lvl + tmp);
1229*4882a593Smuzhiyun rtw_btc_set_wl_rx_gain(btc, force_exec, para.wl_low_gain_en);
1230*4882a593Smuzhiyun rtw_btc_set_bt_rx_gain(btc, force_exec, para.bt_lna_lvl);
1231*4882a593Smuzhiyun }
1232*4882a593Smuzhiyun
1233*4882a593Smuzhiyun static void
rtw_btc_coex_ctrl_owner(struct btc_coexist * btc,boolean wifi_control)1234*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(struct btc_coexist *btc, boolean wifi_control)
1235*4882a593Smuzhiyun {
1236*4882a593Smuzhiyun u8 val;
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun val = (wifi_control) ? 1 : 0; /* 0x70[26] */
1239*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3, BIT(2), val);
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun if (!wifi_control)
1242*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_BT_CTRL_ACT);
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun static void
rtw_btc_set_gnt_bt(struct btc_coexist * btc,u8 state)1246*4882a593Smuzhiyun rtw_btc_set_gnt_bt(struct btc_coexist *btc, u8 state)
1247*4882a593Smuzhiyun {
1248*4882a593Smuzhiyun if (btc->chip_para->lte_indirect_access) {
1249*4882a593Smuzhiyun btc->btc_write_linderct(btc, REG_LTE_IDR_COEX_CTRL, 0xc000, state);
1250*4882a593Smuzhiyun btc->btc_write_linderct(btc, REG_LTE_IDR_COEX_CTRL, 0x0c00, state);
1251*4882a593Smuzhiyun } else {
1252*4882a593Smuzhiyun switch (state) {
1253*4882a593Smuzhiyun case BTC_GNT_HW_PTA:
1254*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, 0x765, 0x1e, 0x0);
1255*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1256*4882a593Smuzhiyun 0x70, 0x0);
1257*4882a593Smuzhiyun break;
1258*4882a593Smuzhiyun case BTC_GNT_SW_LOW:
1259*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, 0x765, 0x1e, 0xf);
1260*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1261*4882a593Smuzhiyun 0x70, 0x1);
1262*4882a593Smuzhiyun break;
1263*4882a593Smuzhiyun case BTC_GNT_SW_HIGH:
1264*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, 0x765, 0x1e, 0xf);
1265*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1266*4882a593Smuzhiyun 0x70, 0x7);
1267*4882a593Smuzhiyun break;
1268*4882a593Smuzhiyun default:
1269*4882a593Smuzhiyun break;
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun }
1273*4882a593Smuzhiyun
1274*4882a593Smuzhiyun static void
rtw_btc_set_gnt_wl(struct btc_coexist * btc,u8 state)1275*4882a593Smuzhiyun rtw_btc_set_gnt_wl(struct btc_coexist *btc, u8 state)
1276*4882a593Smuzhiyun {
1277*4882a593Smuzhiyun if (btc->chip_para->lte_indirect_access) {
1278*4882a593Smuzhiyun btc->btc_write_linderct(btc, REG_LTE_IDR_COEX_CTRL, 0x3000, state);
1279*4882a593Smuzhiyun btc->btc_write_linderct(btc, REG_LTE_IDR_COEX_CTRL, 0x0300, state);
1280*4882a593Smuzhiyun } else {
1281*4882a593Smuzhiyun switch (state) {
1282*4882a593Smuzhiyun case BTC_GNT_HW_PTA:
1283*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1284*4882a593Smuzhiyun BIT(4), 0x0);
1285*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1286*4882a593Smuzhiyun BIT(7), 0x0);
1287*4882a593Smuzhiyun break;
1288*4882a593Smuzhiyun case BTC_GNT_SW_LOW:
1289*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1290*4882a593Smuzhiyun BIT(4), 0x1);
1291*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1292*4882a593Smuzhiyun BIT(7), 0x0);
1293*4882a593Smuzhiyun break;
1294*4882a593Smuzhiyun case BTC_GNT_SW_HIGH:
1295*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1296*4882a593Smuzhiyun BIT(4), 0x1);
1297*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_SDIO_CTRL3,
1298*4882a593Smuzhiyun BIT(7), 0x1);
1299*4882a593Smuzhiyun break;
1300*4882a593Smuzhiyun default:
1301*4882a593Smuzhiyun break;
1302*4882a593Smuzhiyun }
1303*4882a593Smuzhiyun }
1304*4882a593Smuzhiyun }
1305*4882a593Smuzhiyun
1306*4882a593Smuzhiyun #ifdef PLATFORM_WINDOWS
1307*4882a593Smuzhiyun static void
rtw_btc_mimo_ps(struct btc_coexist * btc,boolean force_exec,u8 state)1308*4882a593Smuzhiyun rtw_btc_mimo_ps(struct btc_coexist *btc, boolean force_exec,
1309*4882a593Smuzhiyun u8 state)
1310*4882a593Smuzhiyun {
1311*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun if (!force_exec && state == coex_sta->wl_mimo_ps)
1314*4882a593Smuzhiyun return;
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun coex_sta->wl_mimo_ps = state;
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1319*4882a593Smuzhiyun "[BTCoex], %s(): state = %d\n", __func__, state);
1320*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1321*4882a593Smuzhiyun
1322*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_MIMO_PS_MODE, &state);
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun #endif
1325*4882a593Smuzhiyun
1326*4882a593Smuzhiyun static void
rtw_btc_wltoggle_tableA(IN struct btc_coexist * btc,IN boolean force_exec,IN u32 table_case)1327*4882a593Smuzhiyun rtw_btc_wltoggle_tableA(IN struct btc_coexist *btc,
1328*4882a593Smuzhiyun IN boolean force_exec, IN u32 table_case)
1329*4882a593Smuzhiyun {
1330*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1331*4882a593Smuzhiyun u8 h2c_para[6] = {0};
1332*4882a593Smuzhiyun u32 table_wl = 0x5a5a5a5a;
1333*4882a593Smuzhiyun
1334*4882a593Smuzhiyun h2c_para[0] = 0xd; /* op_code, 0xd= wlan slot toggle-A*/
1335*4882a593Smuzhiyun h2c_para[1] = 0x1; /* no definition */
1336*4882a593Smuzhiyun
1337*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) {
1338*4882a593Smuzhiyun if (table_case < chip_para->table_sant_num)
1339*4882a593Smuzhiyun table_wl = chip_para->table_sant[table_case].wl;
1340*4882a593Smuzhiyun } else {
1341*4882a593Smuzhiyun if (table_case < chip_para->table_nsant_num)
1342*4882a593Smuzhiyun table_wl = chip_para->table_nsant[table_case].wl;
1343*4882a593Smuzhiyun }
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun /* tell WL FW WL slot toggle table-A*/
1346*4882a593Smuzhiyun h2c_para[2] = (u8)(table_wl & 0xff);
1347*4882a593Smuzhiyun h2c_para[3] = (u8)((table_wl & 0xff00) >> 8);
1348*4882a593Smuzhiyun h2c_para[4] = (u8)((table_wl & 0xff0000) >> 16);
1349*4882a593Smuzhiyun h2c_para[5] = (u8)((table_wl & 0xff000000) >> 24);
1350*4882a593Smuzhiyun
1351*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x69, 6, h2c_para);
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1354*4882a593Smuzhiyun "[BTCoex], %s(): H2C = [%02x %02x %02x %02x %02x %02x]\n",
1355*4882a593Smuzhiyun __func__, h2c_para[0], h2c_para[1], h2c_para[2],
1356*4882a593Smuzhiyun h2c_para[3], h2c_para[4], h2c_para[5]);
1357*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1358*4882a593Smuzhiyun }
1359*4882a593Smuzhiyun
1360*4882a593Smuzhiyun static void
rtw_btc_wltoggle_tableB(IN struct btc_coexist * btc,IN boolean force_exec,IN u8 interval,IN u32 table)1361*4882a593Smuzhiyun rtw_btc_wltoggle_tableB(IN struct btc_coexist *btc, IN boolean force_exec,
1362*4882a593Smuzhiyun IN u8 interval, IN u32 table)
1363*4882a593Smuzhiyun {
1364*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1365*4882a593Smuzhiyun u8 cur_h2c_para[6] = {0};
1366*4882a593Smuzhiyun u8 i, match_cnt = 0;
1367*4882a593Smuzhiyun
1368*4882a593Smuzhiyun cur_h2c_para[0] = 0x7; /* op_code, 0x7= wlan slot toggle-B*/
1369*4882a593Smuzhiyun cur_h2c_para[1] = interval;
1370*4882a593Smuzhiyun cur_h2c_para[2] = (u8)(table & 0xff);
1371*4882a593Smuzhiyun cur_h2c_para[3] = (u8)((table & 0xff00) >> 8);
1372*4882a593Smuzhiyun cur_h2c_para[4] = (u8)((table & 0xff0000) >> 16);
1373*4882a593Smuzhiyun cur_h2c_para[5] = (u8)((table & 0xff000000) >> 24);
1374*4882a593Smuzhiyun
1375*4882a593Smuzhiyun if (ARRAY_SIZE(coex_sta->wl_toggle_para) != 6)
1376*4882a593Smuzhiyun return;
1377*4882a593Smuzhiyun
1378*4882a593Smuzhiyun coex_sta->wl_toggle_interval = interval;
1379*4882a593Smuzhiyun
1380*4882a593Smuzhiyun for (i = 0; i <= 5; i++)
1381*4882a593Smuzhiyun coex_sta->wl_toggle_para[i] = cur_h2c_para[i];
1382*4882a593Smuzhiyun
1383*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x69, 6, cur_h2c_para);
1384*4882a593Smuzhiyun
1385*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1386*4882a593Smuzhiyun "[BTCoex], %s(): H2C = [%02x %02x %02x %02x %02x %02x]\n",
1387*4882a593Smuzhiyun __func__, cur_h2c_para[0], cur_h2c_para[1], cur_h2c_para[2],
1388*4882a593Smuzhiyun cur_h2c_para[3], cur_h2c_para[4], cur_h2c_para[5]);
1389*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1390*4882a593Smuzhiyun }
1391*4882a593Smuzhiyun
1392*4882a593Smuzhiyun static void
rtw_btc_set_table(struct btc_coexist * btc,boolean force_exec,u32 val0x6c0,u32 val0x6c4)1393*4882a593Smuzhiyun rtw_btc_set_table(struct btc_coexist *btc, boolean force_exec, u32 val0x6c0,
1394*4882a593Smuzhiyun u32 val0x6c4)
1395*4882a593Smuzhiyun {
1396*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1397*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1398*4882a593Smuzhiyun
1399*4882a593Smuzhiyun /* If last tdma is wl slot toggle, force write table*/
1400*4882a593Smuzhiyun if (!force_exec && coex_sta->coex_run_reason != BTC_RSN_LPS) {
1401*4882a593Smuzhiyun if (val0x6c0 == btc->btc_read_4byte(btc, REG_BT_COEX_TABLE0) &&
1402*4882a593Smuzhiyun val0x6c4 == btc->btc_read_4byte(btc, REG_BT_COEX_TABLE1))
1403*4882a593Smuzhiyun return;
1404*4882a593Smuzhiyun }
1405*4882a593Smuzhiyun
1406*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_BT_COEX_TABLE0, val0x6c0);
1407*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_BT_COEX_TABLE1, val0x6c4);
1408*4882a593Smuzhiyun btc->btc_write_4byte(btc, REG_BT_COEX_BRK_TABLE, 0xf0ffffff);
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1411*4882a593Smuzhiyun "[BTCoex], %s(): 0x6c0 = %x, 0x6c4 = %x\n",
1412*4882a593Smuzhiyun __func__, val0x6c0, val0x6c4);
1413*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1414*4882a593Smuzhiyun }
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun static void
rtw_btc_table(struct btc_coexist * btc,boolean force_exec,u8 type)1417*4882a593Smuzhiyun rtw_btc_table(struct btc_coexist *btc, boolean force_exec, u8 type)
1418*4882a593Smuzhiyun {
1419*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1420*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1421*4882a593Smuzhiyun u32 table_wl = 0x0;
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun coex_sta->coex_table_type = type;
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1426*4882a593Smuzhiyun "[BTCoex], ***** Coex_Table - %d *****\n", type);
1427*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) {
1430*4882a593Smuzhiyun if (type < chip_para->table_sant_num)
1431*4882a593Smuzhiyun rtw_btc_set_table(btc, force_exec,
1432*4882a593Smuzhiyun chip_para->table_sant[type].bt,
1433*4882a593Smuzhiyun chip_para->table_sant[type].wl);
1434*4882a593Smuzhiyun } else {
1435*4882a593Smuzhiyun type = type - 100;
1436*4882a593Smuzhiyun if (type < chip_para->table_nsant_num)
1437*4882a593Smuzhiyun rtw_btc_set_table(btc, force_exec,
1438*4882a593Smuzhiyun chip_para->table_nsant[type].bt,
1439*4882a593Smuzhiyun chip_para->table_nsant[type].wl);
1440*4882a593Smuzhiyun }
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun if (coex_sta->wl_slot_toggle_change)
1443*4882a593Smuzhiyun rtw_btc_wltoggle_tableA(btc, FC_EXCU, type);
1444*4882a593Smuzhiyun }
1445*4882a593Smuzhiyun
1446*4882a593Smuzhiyun static void
rtw_btc_ignore_wlan_act(struct btc_coexist * btc,boolean force_exec,boolean enable)1447*4882a593Smuzhiyun rtw_btc_ignore_wlan_act(struct btc_coexist *btc, boolean force_exec,
1448*4882a593Smuzhiyun boolean enable)
1449*4882a593Smuzhiyun {
1450*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1451*4882a593Smuzhiyun u8 h2c_para[1] = {0};
1452*4882a593Smuzhiyun
1453*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
1454*4882a593Smuzhiyun return;
1455*4882a593Smuzhiyun
1456*4882a593Smuzhiyun if (!force_exec && enable == coex_dm->cur_ignore_wlan_act)
1457*4882a593Smuzhiyun return;
1458*4882a593Smuzhiyun
1459*4882a593Smuzhiyun if (enable)
1460*4882a593Smuzhiyun h2c_para[0] = 0x1; /* function enable */
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun rtw_btc_mailbox_operation(btc, 0x63, 1, h2c_para);
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act = enable;
1465*4882a593Smuzhiyun }
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun static void
rtw_btc_lps_rpwm(struct btc_coexist * btc,boolean force_exec,u8 lps_val,u8 rpwm_val)1468*4882a593Smuzhiyun rtw_btc_lps_rpwm(struct btc_coexist *btc, boolean force_exec, u8 lps_val,
1469*4882a593Smuzhiyun u8 rpwm_val)
1470*4882a593Smuzhiyun {
1471*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1472*4882a593Smuzhiyun
1473*4882a593Smuzhiyun if (!force_exec) {
1474*4882a593Smuzhiyun if (lps_val == coex_dm->cur_lps &&
1475*4882a593Smuzhiyun rpwm_val == coex_dm->cur_rpwm)
1476*4882a593Smuzhiyun return;
1477*4882a593Smuzhiyun }
1478*4882a593Smuzhiyun
1479*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_U1_LPS_VAL, &lps_val);
1480*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_U1_RPWM_VAL, &rpwm_val);
1481*4882a593Smuzhiyun
1482*4882a593Smuzhiyun coex_dm->cur_lps = lps_val;
1483*4882a593Smuzhiyun coex_dm->cur_rpwm = rpwm_val;
1484*4882a593Smuzhiyun }
1485*4882a593Smuzhiyun
1486*4882a593Smuzhiyun static void
rtw_btc_power_save_state(struct btc_coexist * btc,u8 ps_type,u8 lps_val,u8 rpwm_val)1487*4882a593Smuzhiyun rtw_btc_power_save_state(struct btc_coexist *btc, u8 ps_type, u8 lps_val,
1488*4882a593Smuzhiyun u8 rpwm_val)
1489*4882a593Smuzhiyun {
1490*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1491*4882a593Smuzhiyun boolean low_pwr_dis = FALSE;
1492*4882a593Smuzhiyun u8 lps_mode = 0x0;
1493*4882a593Smuzhiyun u8 h2c_para[5] = {0, 0, 0, 0, 0};
1494*4882a593Smuzhiyun
1495*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U1_LPS_MODE, &lps_mode);
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun switch (ps_type) {
1498*4882a593Smuzhiyun case BTC_PS_WIFI_NATIVE:
1499*4882a593Smuzhiyun /* recover to original 32k low power setting */
1500*4882a593Smuzhiyun coex_sta->wl_force_lps_ctrl = FALSE;
1501*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_PRE_NORMAL_LPS, NULL);
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1504*4882a593Smuzhiyun "[BTCoex], %s(): BTC_PS_WIFI_NATIVE\n", __func__);
1505*4882a593Smuzhiyun break;
1506*4882a593Smuzhiyun case BTC_PS_LPS_ON:
1507*4882a593Smuzhiyun /* WQCCE-1763: 8725A LPS lock issue*/
1508*4882a593Smuzhiyun if (coex_sta->coex_run_reason == BTC_RSN_LPS)
1509*4882a593Smuzhiyun break;
1510*4882a593Smuzhiyun
1511*4882a593Smuzhiyun coex_sta->wl_force_lps_ctrl = TRUE;
1512*4882a593Smuzhiyun /*set tdma off if LPS off */
1513*4882a593Smuzhiyun if (!lps_mode)
1514*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x60, 5, h2c_para);
1515*4882a593Smuzhiyun rtw_btc_lps_rpwm(btc, NM_EXCU, lps_val, rpwm_val);
1516*4882a593Smuzhiyun /* when coex force to enter LPS, do not enter 32k low power. */
1517*4882a593Smuzhiyun low_pwr_dis = TRUE;
1518*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_DISABLE_LOW_POWER, &low_pwr_dis);
1519*4882a593Smuzhiyun /* power save must executed before psTdma. */
1520*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_ENTER_LPS, NULL);
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1523*4882a593Smuzhiyun "[BTCoex], %s(): BTC_PS_LPS_ON\n", __func__);
1524*4882a593Smuzhiyun break;
1525*4882a593Smuzhiyun case BTC_PS_LPS_OFF:
1526*4882a593Smuzhiyun coex_sta->wl_force_lps_ctrl = TRUE;
1527*4882a593Smuzhiyun /*set tdma off if LPS on */
1528*4882a593Smuzhiyun if (lps_mode)
1529*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x60, 5, h2c_para);
1530*4882a593Smuzhiyun if (btc->btc_set(btc, BTC_SET_ACT_LEAVE_LPS, NULL))
1531*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1532*4882a593Smuzhiyun "[BTCoex], %s(): BTC_PS_LPS_OFF\n",
1533*4882a593Smuzhiyun __func__);
1534*4882a593Smuzhiyun else
1535*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1536*4882a593Smuzhiyun "[BTCoex], %s(): BTC_PS_LPS_OFF Fail!!\n",
1537*4882a593Smuzhiyun __func__);
1538*4882a593Smuzhiyun break;
1539*4882a593Smuzhiyun default:
1540*4882a593Smuzhiyun break;
1541*4882a593Smuzhiyun }
1542*4882a593Smuzhiyun
1543*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1544*4882a593Smuzhiyun }
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun static void
rtw_btc_set_tdma(struct btc_coexist * btc,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)1547*4882a593Smuzhiyun rtw_btc_set_tdma(struct btc_coexist *btc, u8 byte1, u8 byte2, u8 byte3,
1548*4882a593Smuzhiyun u8 byte4, u8 byte5)
1549*4882a593Smuzhiyun {
1550*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1551*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1552*4882a593Smuzhiyun struct btc_wifi_link_info_ext *linfo_ext = &btc->wifi_link_info_ext;
1553*4882a593Smuzhiyun u8 ps_type = BTC_PS_WIFI_NATIVE,
1554*4882a593Smuzhiyun real_byte1 = byte1, real_byte5 = byte5;
1555*4882a593Smuzhiyun
1556*4882a593Smuzhiyun if (linfo_ext->is_ap_mode && (byte1 & BIT(4) && !(byte1 & BIT(5)))) {
1557*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1558*4882a593Smuzhiyun "[BTCoex], %s(): AP mode\n", __func__);
1559*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1560*4882a593Smuzhiyun
1561*4882a593Smuzhiyun real_byte1 &= ~BIT(4);
1562*4882a593Smuzhiyun real_byte1 |= BIT(5);
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun real_byte5 |= BIT(5);
1565*4882a593Smuzhiyun real_byte5 &= ~BIT(6);
1566*4882a593Smuzhiyun
1567*4882a593Smuzhiyun ps_type = BTC_PS_WIFI_NATIVE;
1568*4882a593Smuzhiyun rtw_btc_power_save_state(btc, ps_type, 0x0, 0x0);
1569*4882a593Smuzhiyun } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1570*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1571*4882a593Smuzhiyun "[BTCoex], %s(): Force LPS (byte1 = 0x%x)\n",
1572*4882a593Smuzhiyun __func__, byte1);
1573*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1574*4882a593Smuzhiyun
1575*4882a593Smuzhiyun if (btc->chip_para->pstdma_type == BTC_PSTDMA_FORCE_LPSOFF)
1576*4882a593Smuzhiyun ps_type = BTC_PS_LPS_OFF;
1577*4882a593Smuzhiyun else
1578*4882a593Smuzhiyun ps_type = BTC_PS_LPS_ON;
1579*4882a593Smuzhiyun rtw_btc_power_save_state(btc, ps_type, 0x50, 0x4);
1580*4882a593Smuzhiyun } else {
1581*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1582*4882a593Smuzhiyun "[BTCoex], %s(): native power save (byte1 = 0x%x)\n",
1583*4882a593Smuzhiyun __func__, byte1);
1584*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1585*4882a593Smuzhiyun
1586*4882a593Smuzhiyun ps_type = BTC_PS_WIFI_NATIVE;
1587*4882a593Smuzhiyun rtw_btc_power_save_state(btc, ps_type, 0x0, 0x0);
1588*4882a593Smuzhiyun }
1589*4882a593Smuzhiyun
1590*4882a593Smuzhiyun coex_dm->ps_tdma_para[0] = real_byte1;
1591*4882a593Smuzhiyun coex_dm->ps_tdma_para[1] = byte2;
1592*4882a593Smuzhiyun coex_dm->ps_tdma_para[2] = byte3;
1593*4882a593Smuzhiyun coex_dm->ps_tdma_para[3] = byte4;
1594*4882a593Smuzhiyun coex_dm->ps_tdma_para[4] = real_byte5;
1595*4882a593Smuzhiyun
1596*4882a593Smuzhiyun btc->btc_fill_h2c(btc, 0x60, 5, coex_dm->ps_tdma_para);
1597*4882a593Smuzhiyun
1598*4882a593Smuzhiyun /* Always forec excute rtw_btc_set_table To avoid
1599*4882a593Smuzhiyun * coex table error if wl slot toggle mode on ->off
1600*4882a593Smuzhiyun * ex: 5508031054 next state -> rtw_btc_table + 5108031054
1601*4882a593Smuzhiyun * rtw_btc_table may be changed by 5508031054
1602*4882a593Smuzhiyun */
1603*4882a593Smuzhiyun if (real_byte1 & BIT(2)) {
1604*4882a593Smuzhiyun coex_sta->wl_slot_toggle = TRUE;
1605*4882a593Smuzhiyun coex_sta->wl_slot_toggle_change = FALSE;
1606*4882a593Smuzhiyun } else {
1607*4882a593Smuzhiyun coex_sta->wl_slot_toggle_change = coex_sta->wl_slot_toggle;
1608*4882a593Smuzhiyun coex_sta->wl_slot_toggle = FALSE;
1609*4882a593Smuzhiyun }
1610*4882a593Smuzhiyun
1611*4882a593Smuzhiyun if (ps_type == BTC_PS_WIFI_NATIVE)
1612*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_ACT_POST_NORMAL_LPS, NULL);
1613*4882a593Smuzhiyun }
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun static
rtw_btc_tdma(struct btc_coexist * btc,boolean force_exec,u32 tcase)1616*4882a593Smuzhiyun void rtw_btc_tdma(struct btc_coexist *btc, boolean force_exec, u32 tcase)
1617*4882a593Smuzhiyun {
1618*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1619*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1620*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1621*4882a593Smuzhiyun u8 type;
1622*4882a593Smuzhiyun boolean turn_on, wifi_busy = FALSE;
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1625*4882a593Smuzhiyun
1626*4882a593Smuzhiyun btc->btc_set_atomic(btc, &coex_dm->setting_tdma, TRUE);
1627*4882a593Smuzhiyun /* tcase: bit0~7 --> tdma case index
1628*4882a593Smuzhiyun * bit8 --> for 4-slot (50ms) mode
1629*4882a593Smuzhiyun */
1630*4882a593Smuzhiyun
1631*4882a593Smuzhiyun if (tcase & TDMA_4SLOT)/* 4-slot (50ms) mode */
1632*4882a593Smuzhiyun rtw_btc_set_tdma_timer_base(btc, 3);
1633*4882a593Smuzhiyun else
1634*4882a593Smuzhiyun rtw_btc_set_tdma_timer_base(btc, 0);
1635*4882a593Smuzhiyun
1636*4882a593Smuzhiyun type = (u8)(tcase & 0xff);
1637*4882a593Smuzhiyun turn_on = (type == 0 || type == 100) ? FALSE : TRUE;
1638*4882a593Smuzhiyun
1639*4882a593Smuzhiyun /* To avoid TDMA H2C fail before Last LPS enter */
1640*4882a593Smuzhiyun if (!force_exec && coex_sta->coex_run_reason != BTC_RSN_LPS) {
1641*4882a593Smuzhiyun if (turn_on == coex_dm->cur_ps_tdma_on &&
1642*4882a593Smuzhiyun type == coex_dm->cur_ps_tdma) {
1643*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1644*4882a593Smuzhiyun "[BTCoex], Skip TDMA because no change TDMA(%s, %d)\n",
1645*4882a593Smuzhiyun (coex_dm->cur_ps_tdma_on ? "on" : "off"),
1646*4882a593Smuzhiyun coex_dm->cur_ps_tdma);
1647*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1648*4882a593Smuzhiyun
1649*4882a593Smuzhiyun btc->btc_set_atomic(btc, &coex_dm->setting_tdma, FALSE);
1650*4882a593Smuzhiyun return;
1651*4882a593Smuzhiyun }
1652*4882a593Smuzhiyun }
1653*4882a593Smuzhiyun
1654*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1655*4882a593Smuzhiyun "[BTCoex], ***** TDMA - %d *****\n", type);
1656*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1657*4882a593Smuzhiyun
1658*4882a593Smuzhiyun /* TRUE -> Page scan > ACL */
1659*4882a593Smuzhiyun if (!wifi_busy ||
1660*4882a593Smuzhiyun (coex_sta->bt_a2dp_exist && coex_sta->bt_inq_page_remain)) {
1661*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
1662*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_TDMA, FALSE);
1663*4882a593Smuzhiyun else
1664*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_TDMA, FALSE);
1665*4882a593Smuzhiyun } else {
1666*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
1667*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_TDMA, TRUE);
1668*4882a593Smuzhiyun else
1669*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_TDMA, TRUE);
1670*4882a593Smuzhiyun }
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) {
1673*4882a593Smuzhiyun if (type < chip_para->tdma_sant_num)
1674*4882a593Smuzhiyun rtw_btc_set_tdma(btc,
1675*4882a593Smuzhiyun chip_para->tdma_sant[type].para[0],
1676*4882a593Smuzhiyun chip_para->tdma_sant[type].para[1],
1677*4882a593Smuzhiyun chip_para->tdma_sant[type].para[2],
1678*4882a593Smuzhiyun chip_para->tdma_sant[type].para[3],
1679*4882a593Smuzhiyun chip_para->tdma_sant[type].para[4]);
1680*4882a593Smuzhiyun } else {
1681*4882a593Smuzhiyun type = type - 100;
1682*4882a593Smuzhiyun if (type < chip_para->tdma_nsant_num)
1683*4882a593Smuzhiyun rtw_btc_set_tdma(btc,
1684*4882a593Smuzhiyun chip_para->tdma_nsant[type].para[0],
1685*4882a593Smuzhiyun chip_para->tdma_nsant[type].para[1],
1686*4882a593Smuzhiyun chip_para->tdma_nsant[type].para[2],
1687*4882a593Smuzhiyun chip_para->tdma_nsant[type].para[3],
1688*4882a593Smuzhiyun chip_para->tdma_nsant[type].para[4]);
1689*4882a593Smuzhiyun }
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun coex_dm->cur_ps_tdma_on = turn_on;
1692*4882a593Smuzhiyun coex_dm->cur_ps_tdma = type;
1693*4882a593Smuzhiyun
1694*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "change TDMA(%s, %d)\n",
1695*4882a593Smuzhiyun (coex_dm->cur_ps_tdma_on ? "on" : "off"),
1696*4882a593Smuzhiyun coex_dm->cur_ps_tdma);
1697*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1698*4882a593Smuzhiyun
1699*4882a593Smuzhiyun btc->btc_set_atomic(btc, &coex_dm->setting_tdma, FALSE);
1700*4882a593Smuzhiyun }
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun static
rtw_btc_set_ant_switch(struct btc_coexist * btc,boolean force_exec,u8 ctrl_type,u8 pos_type)1703*4882a593Smuzhiyun void rtw_btc_set_ant_switch(struct btc_coexist *btc, boolean force_exec,
1704*4882a593Smuzhiyun u8 ctrl_type, u8 pos_type)
1705*4882a593Smuzhiyun {
1706*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun if (!force_exec) {
1709*4882a593Smuzhiyun if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status)
1710*4882a593Smuzhiyun return;
1711*4882a593Smuzhiyun }
1712*4882a593Smuzhiyun
1713*4882a593Smuzhiyun coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type;
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_ANT_SWITCH);
1716*4882a593Smuzhiyun }
1717*4882a593Smuzhiyun
1718*4882a593Smuzhiyun static
rtw_btc_set_ant_path(struct btc_coexist * btc,boolean force_exec,u8 phase)1719*4882a593Smuzhiyun void rtw_btc_set_ant_path(struct btc_coexist *btc, boolean force_exec,
1720*4882a593Smuzhiyun u8 phase)
1721*4882a593Smuzhiyun {
1722*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1723*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
1724*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
1725*4882a593Smuzhiyun struct btc_wifi_link_info_ext *linfo_ext = &btc->wifi_link_info_ext;
1726*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
1727*4882a593Smuzhiyun u8 ctrl_type = BTC_SWITCH_CTRL_MAX,
1728*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_MAX, cnt = 0;
1729*4882a593Smuzhiyun u16 scbd = 0;
1730*4882a593Smuzhiyun u32 scbd_32 = 0;
1731*4882a593Smuzhiyun boolean is_btk = 0, is_wlk = 0;
1732*4882a593Smuzhiyun
1733*4882a593Smuzhiyun if (!force_exec && coex_dm->cur_ant_pos_type == phase)
1734*4882a593Smuzhiyun return;
1735*4882a593Smuzhiyun
1736*4882a593Smuzhiyun coex_dm->cur_ant_pos_type = phase;
1737*4882a593Smuzhiyun
1738*4882a593Smuzhiyun /* To avoid switch coex_ctrl_owner during BT IQK */
1739*4882a593Smuzhiyun if (btc->chip_para->scbd_support && coex_sta->bt_iqk_state != 0xff) {
1740*4882a593Smuzhiyun
1741*4882a593Smuzhiyun while (++cnt < 60) {
1742*4882a593Smuzhiyun /* BT RFK */
1743*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT) {
1744*4882a593Smuzhiyun if (btc->btc_read_scbd(btc, &scbd) & BIT(5))
1745*4882a593Smuzhiyun is_btk = TRUE;
1746*4882a593Smuzhiyun else
1747*4882a593Smuzhiyun is_btk = FALSE;
1748*4882a593Smuzhiyun } else {
1749*4882a593Smuzhiyun if (btc->btc_read_scbd_32bit(btc, &scbd_32) & BIT(5))
1750*4882a593Smuzhiyun is_btk = TRUE;
1751*4882a593Smuzhiyun else
1752*4882a593Smuzhiyun is_btk = FALSE;
1753*4882a593Smuzhiyun }
1754*4882a593Smuzhiyun /* WL RFK */
1755*4882a593Smuzhiyun if ((phase != BTC_ANT_WOFF) &&
1756*4882a593Smuzhiyun ((btc->btc_read_1byte(btc, 0x49c) & BIT(0)) ||
1757*4882a593Smuzhiyun coex_sta->wl_rfk))
1758*4882a593Smuzhiyun is_wlk = TRUE;
1759*4882a593Smuzhiyun else
1760*4882a593Smuzhiyun is_wlk = FALSE;
1761*4882a593Smuzhiyun
1762*4882a593Smuzhiyun if ((!is_btk && !is_wlk) || scbd == 0x7ff)
1763*4882a593Smuzhiyun break;
1764*4882a593Smuzhiyun
1765*4882a593Smuzhiyun delay_ms(10);
1766*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1767*4882a593Smuzhiyun "[BTCoex], Ant Setup Delay by IQK\n, wlk=%d, btk=%d, cnt=%d\n",
1768*4882a593Smuzhiyun is_wlk, is_btk, cnt);
1769*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1770*4882a593Smuzhiyun }
1771*4882a593Smuzhiyun /* wait timeout */
1772*4882a593Smuzhiyun if (cnt >= 60)
1773*4882a593Smuzhiyun coex_sta->bt_iqk_state = 0xff;
1774*4882a593Smuzhiyun }
1775*4882a593Smuzhiyun
1776*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1777*4882a593Smuzhiyun "[BTCoex], coex_sta->bt_disabled = 0x%x\n",
1778*4882a593Smuzhiyun coex_sta->bt_disabled);
1779*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1780*4882a593Smuzhiyun
1781*4882a593Smuzhiyun switch (phase) {
1782*4882a593Smuzhiyun case BTC_ANT_POWERON:
1783*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1784*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_COEX_POWERON\n", __func__);
1785*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun /* set Path control owner to BT at power-on step */
1788*4882a593Smuzhiyun if (coex_sta->bt_disabled)
1789*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1790*4882a593Smuzhiyun else
1791*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_BT);
1792*4882a593Smuzhiyun
1793*4882a593Smuzhiyun /*Caution: Don't indirect access while power on phase */
1794*4882a593Smuzhiyun
1795*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1796*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_BT;
1797*4882a593Smuzhiyun break;
1798*4882a593Smuzhiyun case BTC_ANT_INIT:
1799*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1800*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_COEX_INIT\n", __func__);
1801*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1802*4882a593Smuzhiyun
1803*4882a593Smuzhiyun if (coex_sta->bt_disabled) {
1804*4882a593Smuzhiyun /* set GNT_BT to SW low */
1805*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_LOW);
1806*4882a593Smuzhiyun /* set GNT_WL to SW high */
1807*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_HIGH);
1808*4882a593Smuzhiyun } else {
1809*4882a593Smuzhiyun /* set GNT_BT to SW high */
1810*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_HIGH);
1811*4882a593Smuzhiyun /* set GNT_WL to SW low */
1812*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_LOW);
1813*4882a593Smuzhiyun }
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun /* set Path control owner to WL at initial step */
1816*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1817*4882a593Smuzhiyun
1818*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1819*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_BT;
1820*4882a593Smuzhiyun break;
1821*4882a593Smuzhiyun case BTC_ANT_WONLY:
1822*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1823*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_WLANONLY_INIT\n", __func__);
1824*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1825*4882a593Smuzhiyun
1826*4882a593Smuzhiyun /* set GNT_BT to SW Low */
1827*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_LOW);
1828*4882a593Smuzhiyun /* Set GNT_WL to SW high */
1829*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_HIGH);
1830*4882a593Smuzhiyun /* set Path control owner to WL at initial step */
1831*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1832*4882a593Smuzhiyun
1833*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1834*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLG;
1835*4882a593Smuzhiyun break;
1836*4882a593Smuzhiyun case BTC_ANT_WOFF:
1837*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1838*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_WLAN_OFF\n", __func__);
1839*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1840*4882a593Smuzhiyun
1841*4882a593Smuzhiyun /* set Path control owner to BT */
1842*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_BT);
1843*4882a593Smuzhiyun
1844*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BT;
1845*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_NOCARE;
1846*4882a593Smuzhiyun break;
1847*4882a593Smuzhiyun case BTC_ANT_2G:
1848*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1849*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_2G_RUNTIME\n", __func__);
1850*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1851*4882a593Smuzhiyun
1852*4882a593Smuzhiyun /* set GNT_BT to PTA */
1853*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1854*4882a593Smuzhiyun /* Set GNT_WL to PTA */
1855*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_HW_PTA);
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1858*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1859*4882a593Smuzhiyun
1860*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_PTA;
1861*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_NOCARE;
1862*4882a593Smuzhiyun break;
1863*4882a593Smuzhiyun case BTC_ANT_5G:
1864*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1865*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_5G_RUNTIME\n", __func__);
1866*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun if (linfo_ext->is_ap_mode &&
1869*4882a593Smuzhiyun strcmp(btc->chip_para->chip_name, "8723f") != 0) {
1870*4882a593Smuzhiyun /* set GNT_BT to SW PTA
1871*4882a593Smuzhiyun 8723f cannot set GNT_BT PTA control when SW control*/
1872*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1873*4882a593Smuzhiyun } else {
1874*4882a593Smuzhiyun /* set GNT_BT to SW Hi */
1875*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_HIGH);
1876*4882a593Smuzhiyun }
1877*4882a593Smuzhiyun
1878*4882a593Smuzhiyun /* Set GNT_WL to SW Hi */
1879*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_HIGH);
1880*4882a593Smuzhiyun
1881*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1882*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1883*4882a593Smuzhiyun
1884*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1885*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLA;
1886*4882a593Smuzhiyun break;
1887*4882a593Smuzhiyun case BTC_ANT_2G_FREERUN:
1888*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1889*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_2G_FREERUN\n", __func__);
1890*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1891*4882a593Smuzhiyun
1892*4882a593Smuzhiyun /*8723f cannot set GNT_BT PTA control when SW control*/
1893*4882a593Smuzhiyun if (strcmp(btc->chip_para->chip_name, "8723f") == 0) {
1894*4882a593Smuzhiyun /* Set GNT_BT to SW Hi */
1895*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_HIGH);
1896*4882a593Smuzhiyun } else {
1897*4882a593Smuzhiyun /* set GNT_BT to SW PTA */
1898*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1899*4882a593Smuzhiyun }
1900*4882a593Smuzhiyun
1901*4882a593Smuzhiyun /* Set GNT_WL to SW Hi */
1902*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_HIGH);
1903*4882a593Smuzhiyun
1904*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1905*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1906*4882a593Smuzhiyun
1907*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1908*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLG_BT;
1909*4882a593Smuzhiyun break;
1910*4882a593Smuzhiyun case BTC_ANT_2G_WLBT:
1911*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1912*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_2G_WLBT\n", __func__);
1913*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun /* set GNT_BT to HW PTA */
1916*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1917*4882a593Smuzhiyun /* Set GNT_WL to HW PTA */
1918*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_HW_PTA);
1919*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1920*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1923*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLG_BT;
1924*4882a593Smuzhiyun break;
1925*4882a593Smuzhiyun case BTC_ANT_2G_WL:
1926*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1927*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_2G_WL\n", __func__);
1928*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1929*4882a593Smuzhiyun
1930*4882a593Smuzhiyun /* set GNT_BT to PTA */
1931*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1932*4882a593Smuzhiyun /* Set GNT_WL to PTA */
1933*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_HW_PTA);
1934*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1935*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1936*4882a593Smuzhiyun
1937*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1938*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLG;
1939*4882a593Smuzhiyun break;
1940*4882a593Smuzhiyun case BTC_ANT_2G_BT:
1941*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1942*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_2G_WL\n", __func__);
1943*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1944*4882a593Smuzhiyun
1945*4882a593Smuzhiyun /* set GNT_BT to PTA */
1946*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1947*4882a593Smuzhiyun /* Set GNT_WL to PTA */
1948*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_HW_PTA);
1949*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1950*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1951*4882a593Smuzhiyun
1952*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1953*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_BT;
1954*4882a593Smuzhiyun break;
1955*4882a593Smuzhiyun case BTC_ANT_BTMP:
1956*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1957*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_BTMP\n", __func__);
1958*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1959*4882a593Smuzhiyun
1960*4882a593Smuzhiyun /* set GNT_BT to SW Hi */
1961*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_SW_HIGH);
1962*4882a593Smuzhiyun /* Set GNT_WL to SW Lo */
1963*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_SW_LOW);
1964*4882a593Smuzhiyun /* set Path control owner to WL */
1965*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1966*4882a593Smuzhiyun
1967*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
1968*4882a593Smuzhiyun
1969*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_BBSW;
1970*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_BT;
1971*4882a593Smuzhiyun break;
1972*4882a593Smuzhiyun case BTC_ANT_MCC:
1973*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1974*4882a593Smuzhiyun "[BTCoex], %s() - PHASE_MCC\n", __func__);
1975*4882a593Smuzhiyun BTC_TRACE(trace_buf);
1976*4882a593Smuzhiyun
1977*4882a593Smuzhiyun /* set GNT_BT to PTA */
1978*4882a593Smuzhiyun rtw_btc_set_gnt_bt(btc, BTC_GNT_HW_PTA);
1979*4882a593Smuzhiyun /* Set GNT_WL to PTA */
1980*4882a593Smuzhiyun rtw_btc_set_gnt_wl(btc, BTC_GNT_HW_PTA);
1981*4882a593Smuzhiyun /* set Path control owner to WL at runtime step */
1982*4882a593Smuzhiyun rtw_btc_coex_ctrl_owner(btc, BTC_OWNER_WL);
1983*4882a593Smuzhiyun
1984*4882a593Smuzhiyun ctrl_type = BTC_SWITCH_CTRL_BY_FW;
1985*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_NOCARE;
1986*4882a593Smuzhiyun break;
1987*4882a593Smuzhiyun }
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun if (ctrl_type < BTC_SWITCH_CTRL_MAX && pos_type < BTC_SWITCH_TO_MAX &&
1990*4882a593Smuzhiyun rfe_type->ant_switch_exist)
1991*4882a593Smuzhiyun rtw_btc_set_ant_switch(btc, force_exec, ctrl_type, pos_type);
1992*4882a593Smuzhiyun }
1993*4882a593Smuzhiyun
rtw_btc_algorithm(struct btc_coexist * btc)1994*4882a593Smuzhiyun static u8 rtw_btc_algorithm(struct btc_coexist *btc)
1995*4882a593Smuzhiyun {
1996*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
1997*4882a593Smuzhiyun u8 algorithm = BTC_COEX_NOPROFILE;
1998*4882a593Smuzhiyun u8 profile_map = 0;
1999*4882a593Smuzhiyun
2000*4882a593Smuzhiyun if (coex_sta->bt_hfp_exist)
2001*4882a593Smuzhiyun profile_map = profile_map | BTC_BTPROFILE_HFP;
2002*4882a593Smuzhiyun
2003*4882a593Smuzhiyun if (coex_sta->bt_hid_exist)
2004*4882a593Smuzhiyun profile_map = profile_map | BTC_BTPROFILE_HID;
2005*4882a593Smuzhiyun
2006*4882a593Smuzhiyun if (coex_sta->bt_a2dp_exist)
2007*4882a593Smuzhiyun profile_map = profile_map | BTC_BTPROFILE_A2DP;
2008*4882a593Smuzhiyun
2009*4882a593Smuzhiyun if (coex_sta->bt_pan_exist)
2010*4882a593Smuzhiyun profile_map = profile_map | BTC_BTPROFILE_PAN;
2011*4882a593Smuzhiyun
2012*4882a593Smuzhiyun switch (profile_map) {
2013*4882a593Smuzhiyun case BTC_BTPROFILE_NONE:
2014*4882a593Smuzhiyun algorithm = BTC_COEX_NOPROFILE;
2015*4882a593Smuzhiyun break;
2016*4882a593Smuzhiyun case BTC_BTPROFILE_HFP:
2017*4882a593Smuzhiyun algorithm = BTC_COEX_HFP;
2018*4882a593Smuzhiyun break;
2019*4882a593Smuzhiyun case BTC_BTPROFILE_HID:
2020*4882a593Smuzhiyun algorithm = BTC_COEX_HID;
2021*4882a593Smuzhiyun break;
2022*4882a593Smuzhiyun case (BTC_BTPROFILE_HID | BTC_BTPROFILE_HFP):
2023*4882a593Smuzhiyun algorithm = BTC_COEX_HFP;
2024*4882a593Smuzhiyun break;
2025*4882a593Smuzhiyun case BTC_BTPROFILE_A2DP:
2026*4882a593Smuzhiyun /* OPP may disappear during CPT_for_WiFi test */
2027*4882a593Smuzhiyun if (coex_sta->bt_multi_link && coex_sta->bt_hid_pair_num > 0)
2028*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_HID;
2029*4882a593Smuzhiyun else if (coex_sta->bt_multi_link)
2030*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_PAN;
2031*4882a593Smuzhiyun else
2032*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP;
2033*4882a593Smuzhiyun break;
2034*4882a593Smuzhiyun case (BTC_BTPROFILE_A2DP | BTC_BTPROFILE_HFP):
2035*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_HID;
2036*4882a593Smuzhiyun break;
2037*4882a593Smuzhiyun case (BTC_BTPROFILE_A2DP | BTC_BTPROFILE_HID):
2038*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_HID;
2039*4882a593Smuzhiyun break;
2040*4882a593Smuzhiyun case (BTC_BTPROFILE_A2DP | BTC_BTPROFILE_HID | BTC_BTPROFILE_HFP):
2041*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_HID;
2042*4882a593Smuzhiyun break;
2043*4882a593Smuzhiyun case BTC_BTPROFILE_PAN:
2044*4882a593Smuzhiyun algorithm = BTC_COEX_PAN;
2045*4882a593Smuzhiyun break;
2046*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_HFP):
2047*4882a593Smuzhiyun algorithm = BTC_COEX_PAN_HID;
2048*4882a593Smuzhiyun break;
2049*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_HID):
2050*4882a593Smuzhiyun algorithm = BTC_COEX_PAN_HID;
2051*4882a593Smuzhiyun break;
2052*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_HID | BTC_BTPROFILE_HFP):
2053*4882a593Smuzhiyun algorithm = BTC_COEX_PAN_HID;
2054*4882a593Smuzhiyun break;
2055*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_A2DP):
2056*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_PAN;
2057*4882a593Smuzhiyun break;
2058*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_A2DP | BTC_BTPROFILE_HFP):
2059*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_PAN_HID;
2060*4882a593Smuzhiyun break;
2061*4882a593Smuzhiyun case (BTC_BTPROFILE_PAN | BTC_BTPROFILE_A2DP | BTC_BTPROFILE_HID):
2062*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_PAN_HID;
2063*4882a593Smuzhiyun break;
2064*4882a593Smuzhiyun case BTC_BTPROFILE_MAX:
2065*4882a593Smuzhiyun algorithm = BTC_COEX_A2DP_PAN_HID;
2066*4882a593Smuzhiyun break;
2067*4882a593Smuzhiyun }
2068*4882a593Smuzhiyun
2069*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2070*4882a593Smuzhiyun "[BTCoex], BT Profile = %s => Algorithm = %s\n",
2071*4882a593Smuzhiyun bt_profile_string[profile_map],
2072*4882a593Smuzhiyun coex_algo_string[algorithm]);
2073*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2074*4882a593Smuzhiyun
2075*4882a593Smuzhiyun return algorithm;
2076*4882a593Smuzhiyun }
2077*4882a593Smuzhiyun
rtw_btc_action_coex_all_off(struct btc_coexist * btc)2078*4882a593Smuzhiyun static void rtw_btc_action_coex_all_off(struct btc_coexist *btc)
2079*4882a593Smuzhiyun {
2080*4882a593Smuzhiyun u8 table_case, tdma_case;
2081*4882a593Smuzhiyun
2082*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2083*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2084*4882a593Smuzhiyun
2085*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2086*4882a593Smuzhiyun
2087*4882a593Smuzhiyun /* To avoid rtw_btc_set_ant_path here */
2088*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2089*4882a593Smuzhiyun table_case = 2;
2090*4882a593Smuzhiyun tdma_case = 0;
2091*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2092*4882a593Smuzhiyun table_case = 100;
2093*4882a593Smuzhiyun tdma_case = 100;
2094*4882a593Smuzhiyun }
2095*4882a593Smuzhiyun
2096*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2097*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2098*4882a593Smuzhiyun }
2099*4882a593Smuzhiyun
rtw_btc_action_freerun(struct btc_coexist * btc)2100*4882a593Smuzhiyun static void rtw_btc_action_freerun(struct btc_coexist *btc)
2101*4882a593Smuzhiyun {
2102*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2103*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2104*4882a593Smuzhiyun const struct btc_chip_para *cpara = btc->chip_para;
2105*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
2106*4882a593Smuzhiyun u8 level = 0, i, base = 0;
2107*4882a593Smuzhiyun boolean bt_afh_loss = TRUE;
2108*4882a593Smuzhiyun u32 ap_cnt;
2109*4882a593Smuzhiyun
2110*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num != 2)
2111*4882a593Smuzhiyun return;
2112*4882a593Smuzhiyun
2113*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2114*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2115*4882a593Smuzhiyun
2116*4882a593Smuzhiyun coex_sta->coex_freerun = TRUE;
2117*4882a593Smuzhiyun
2118*4882a593Smuzhiyun for (i = 0; i <= 8; i++) {
2119*4882a593Smuzhiyun if (coex_sta->bt_afh_map[i] != 0xff) {
2120*4882a593Smuzhiyun bt_afh_loss = FALSE;
2121*4882a593Smuzhiyun break;
2122*4882a593Smuzhiyun }
2123*4882a593Smuzhiyun }
2124*4882a593Smuzhiyun
2125*4882a593Smuzhiyun ap_cnt = coex_sta->cnt_wl[BTC_CNT_WL_SCANAP];
2126*4882a593Smuzhiyun
2127*4882a593Smuzhiyun if (bt_afh_loss)
2128*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, BTC_MEDIA_CONNECT);
2129*4882a593Smuzhiyun
2130*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G_FREERUN);
2131*4882a593Smuzhiyun
2132*4882a593Smuzhiyun if (cpara->scbd_bit_num == BTC_SCBD_16_BIT)
2133*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_FIX2M, FALSE);
2134*4882a593Smuzhiyun else
2135*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_FIX2M, FALSE);
2136*4882a593Smuzhiyun
2137*4882a593Smuzhiyun /* select array index base for profile */
2138*4882a593Smuzhiyun if (coex_sta->bt_hid_exist && !coex_sta->bt_multi_link)
2139*4882a593Smuzhiyun base = 2;
2140*4882a593Smuzhiyun else if (coex_sta->bt_a2dp_exist && !coex_sta->bt_multi_link)
2141*4882a593Smuzhiyun base = 10;
2142*4882a593Smuzhiyun else if (coex_sta->bt_hid_exist && coex_sta->bt_a2dp_exist
2143*4882a593Smuzhiyun && coex_sta->bt_profile_num == 2)
2144*4882a593Smuzhiyun base = 18;
2145*4882a593Smuzhiyun
2146*4882a593Smuzhiyun if (ap_cnt > 10) /* for office case */
2147*4882a593Smuzhiyun base = base + 4;
2148*4882a593Smuzhiyun
2149*4882a593Smuzhiyun /* decrease more BT Tx power for clear case */
2150*4882a593Smuzhiyun if (BTC_RSSI_HIGH(coex_dm->wl_rssi_state[0]))
2151*4882a593Smuzhiyun level = 0;
2152*4882a593Smuzhiyun else if (BTC_RSSI_HIGH(coex_dm->wl_rssi_state[1]))
2153*4882a593Smuzhiyun level = 1;
2154*4882a593Smuzhiyun else if (BTC_RSSI_HIGH(coex_dm->wl_rssi_state[2]))
2155*4882a593Smuzhiyun level = 2;
2156*4882a593Smuzhiyun else
2157*4882a593Smuzhiyun level = 3;
2158*4882a593Smuzhiyun
2159*4882a593Smuzhiyun level = level + base;
2160*4882a593Smuzhiyun
2161*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2162*4882a593Smuzhiyun "[BTCoex], level = %d\n",
2163*4882a593Smuzhiyun level);
2164*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2165*4882a593Smuzhiyun
2166*4882a593Smuzhiyun if (level > cpara->wl_rf_para_tx_num - 1)
2167*4882a593Smuzhiyun level = cpara->wl_rf_para_tx_num - 1;
2168*4882a593Smuzhiyun
2169*4882a593Smuzhiyun if (coex_sta->wl_coex_mode != BTC_WLINK_2G1PORT)
2170*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, cpara->wl_rf_para_rx[0]);
2171*4882a593Smuzhiyun else if (link_info_ext->traffic_dir == BTC_WIFI_TRAFFIC_TX)
2172*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, cpara->wl_rf_para_tx[level]);
2173*4882a593Smuzhiyun else
2174*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, cpara->wl_rf_para_rx[level]);
2175*4882a593Smuzhiyun
2176*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, 100);
2177*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, 100);
2178*4882a593Smuzhiyun }
2179*4882a593Smuzhiyun
rtw_btc_action_rf4ce(struct btc_coexist * btc)2180*4882a593Smuzhiyun static void rtw_btc_action_rf4ce(struct btc_coexist *btc)
2181*4882a593Smuzhiyun {
2182*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2183*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
2184*4882a593Smuzhiyun u8 table_case, tdma_case;
2185*4882a593Smuzhiyun
2186*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2187*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2188*4882a593Smuzhiyun
2189*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, chip_para->wl_rf_para_rx[0]);
2190*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2191*4882a593Smuzhiyun
2192*4882a593Smuzhiyun switch (coex_sta->ext_chip_mode) {
2193*4882a593Smuzhiyun case 0:
2194*4882a593Smuzhiyun table_case = 112;
2195*4882a593Smuzhiyun tdma_case = 115;
2196*4882a593Smuzhiyun
2197*4882a593Smuzhiyun if (coex_sta->bt_slave)
2198*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x3c);
2199*4882a593Smuzhiyun else
2200*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x32);
2201*4882a593Smuzhiyun
2202*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2203*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2204*4882a593Smuzhiyun break;
2205*4882a593Smuzhiyun case 1:
2206*4882a593Smuzhiyun table_case = 112;
2207*4882a593Smuzhiyun tdma_case = 121;
2208*4882a593Smuzhiyun
2209*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2210*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2211*4882a593Smuzhiyun break;
2212*4882a593Smuzhiyun }
2213*4882a593Smuzhiyun }
2214*4882a593Smuzhiyun
rtw_btc_action_ext_chip(struct btc_coexist * btc)2215*4882a593Smuzhiyun static void rtw_btc_action_ext_chip(struct btc_coexist *btc)
2216*4882a593Smuzhiyun {
2217*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2218*4882a593Smuzhiyun
2219*4882a593Smuzhiyun if (btc->board_info.ext_chip_id == BTC_EXT_CHIP_RF4CE)
2220*4882a593Smuzhiyun rtw_btc_action_rf4ce(btc);
2221*4882a593Smuzhiyun }
2222*4882a593Smuzhiyun
rtw_btc_action_rf4ce_new_tdma(struct btc_coexist * btc,u8 type)2223*4882a593Smuzhiyun u8 rtw_btc_action_rf4ce_new_tdma(struct btc_coexist *btc, u8 type)
2224*4882a593Smuzhiyun {
2225*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2226*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
2227*4882a593Smuzhiyun u8 table_case, tdma_case;
2228*4882a593Smuzhiyun
2229*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2230*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2231*4882a593Smuzhiyun
2232*4882a593Smuzhiyun switch (type) {
2233*4882a593Smuzhiyun case 0: /*BT idle*/
2234*4882a593Smuzhiyun if (coex_sta->ext_chip_mode == BTC_EXTMODE_VOICE)
2235*4882a593Smuzhiyun tdma_case = 121;
2236*4882a593Smuzhiyun else
2237*4882a593Smuzhiyun tdma_case = 117;
2238*4882a593Smuzhiyun break;
2239*4882a593Smuzhiyun case 1: /*BT relink*/
2240*4882a593Smuzhiyun if (coex_sta->ext_chip_mode == BTC_EXTMODE_VOICE)
2241*4882a593Smuzhiyun tdma_case = 121;
2242*4882a593Smuzhiyun else
2243*4882a593Smuzhiyun tdma_case = 117;
2244*4882a593Smuzhiyun break;
2245*4882a593Smuzhiyun case 2: /*WIFI linkscan*/
2246*4882a593Smuzhiyun if (coex_sta->ext_chip_mode == BTC_EXTMODE_VOICE) {
2247*4882a593Smuzhiyun tdma_case = 125;
2248*4882a593Smuzhiyun } else{
2249*4882a593Smuzhiyun if (coex_sta->bt_slave)
2250*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x3c);
2251*4882a593Smuzhiyun else
2252*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x32);
2253*4882a593Smuzhiyun
2254*4882a593Smuzhiyun tdma_case = 124;
2255*4882a593Smuzhiyun }
2256*4882a593Smuzhiyun break;
2257*4882a593Smuzhiyun case 3: /*WIFI only*/
2258*4882a593Smuzhiyun if (coex_sta->ext_chip_mode == BTC_EXTMODE_VOICE) {
2259*4882a593Smuzhiyun tdma_case = 121;
2260*4882a593Smuzhiyun } else{
2261*4882a593Smuzhiyun if (coex_sta->bt_slave)
2262*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x3c);
2263*4882a593Smuzhiyun else
2264*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x32);
2265*4882a593Smuzhiyun
2266*4882a593Smuzhiyun tdma_case = 115;
2267*4882a593Smuzhiyun }
2268*4882a593Smuzhiyun break;
2269*4882a593Smuzhiyun default:
2270*4882a593Smuzhiyun tdma_case = 0;
2271*4882a593Smuzhiyun break;
2272*4882a593Smuzhiyun }
2273*4882a593Smuzhiyun return tdma_case;
2274*4882a593Smuzhiyun }
2275*4882a593Smuzhiyun
rtw_btc_ext_chip_new_tdma(struct btc_coexist * btc,u8 type)2276*4882a593Smuzhiyun u8 rtw_btc_ext_chip_new_tdma(struct btc_coexist *btc, u8 type)
2277*4882a593Smuzhiyun {
2278*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2279*4882a593Smuzhiyun u8 tdma_case = 0;
2280*4882a593Smuzhiyun
2281*4882a593Smuzhiyun if (btc->board_info.ext_chip_id == BTC_EXT_CHIP_RF4CE)
2282*4882a593Smuzhiyun tdma_case = rtw_btc_action_rf4ce_new_tdma(btc, type);
2283*4882a593Smuzhiyun
2284*4882a593Smuzhiyun return tdma_case;
2285*4882a593Smuzhiyun }
2286*4882a593Smuzhiyun
rtw_btc_action_bt_whql_test(struct btc_coexist * btc)2287*4882a593Smuzhiyun static void rtw_btc_action_bt_whql_test(struct btc_coexist *btc)
2288*4882a593Smuzhiyun {
2289*4882a593Smuzhiyun u8 table_case, tdma_case;
2290*4882a593Smuzhiyun
2291*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2292*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2293*4882a593Smuzhiyun
2294*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2295*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2296*4882a593Smuzhiyun
2297*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2298*4882a593Smuzhiyun table_case = 2;
2299*4882a593Smuzhiyun tdma_case = 0;
2300*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2301*4882a593Smuzhiyun table_case = 100;
2302*4882a593Smuzhiyun tdma_case = 100;
2303*4882a593Smuzhiyun }
2304*4882a593Smuzhiyun
2305*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2306*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2307*4882a593Smuzhiyun }
2308*4882a593Smuzhiyun
rtw_btc_action_bt_relink(struct btc_coexist * btc)2309*4882a593Smuzhiyun static void rtw_btc_action_bt_relink(struct btc_coexist *btc)
2310*4882a593Smuzhiyun {
2311*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2312*4882a593Smuzhiyun u8 table_case, tdma_case;
2313*4882a593Smuzhiyun u32 slot_type = 0;
2314*4882a593Smuzhiyun
2315*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2316*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2317*4882a593Smuzhiyun
2318*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2319*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2320*4882a593Smuzhiyun
2321*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2322*4882a593Smuzhiyun if (coex_sta->wl_gl_busy) {
2323*4882a593Smuzhiyun table_case = 26;
2324*4882a593Smuzhiyun
2325*4882a593Smuzhiyun if (coex_sta->bt_hid_exist &&
2326*4882a593Smuzhiyun coex_sta->bt_profile_num == 1) {
2327*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2328*4882a593Smuzhiyun tdma_case = 20;
2329*4882a593Smuzhiyun } else {
2330*4882a593Smuzhiyun tdma_case = 20;
2331*4882a593Smuzhiyun }
2332*4882a593Smuzhiyun } else {
2333*4882a593Smuzhiyun table_case = 1;
2334*4882a593Smuzhiyun tdma_case = 0;
2335*4882a593Smuzhiyun }
2336*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2337*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2338*4882a593Smuzhiyun table_case = 115;
2339*4882a593Smuzhiyun else
2340*4882a593Smuzhiyun table_case = 100;
2341*4882a593Smuzhiyun tdma_case = 100;
2342*4882a593Smuzhiyun
2343*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
2344*4882a593Smuzhiyun btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE)
2345*4882a593Smuzhiyun tdma_case = rtw_btc_ext_chip_new_tdma(btc, 1);
2346*4882a593Smuzhiyun }
2347*4882a593Smuzhiyun
2348*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2349*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
2350*4882a593Smuzhiyun }
2351*4882a593Smuzhiyun
rtw_btc_action_bt_idle(struct btc_coexist * btc)2352*4882a593Smuzhiyun static void rtw_btc_action_bt_idle(struct btc_coexist *btc)
2353*4882a593Smuzhiyun {
2354*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2355*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2356*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
2357*4882a593Smuzhiyun struct btc_wifi_link_info *link_info = &btc->wifi_link_info;
2358*4882a593Smuzhiyun u8 table_case = 0xff, tdma_case = 0xff;
2359*4882a593Smuzhiyun
2360*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2361*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2362*4882a593Smuzhiyun
2363*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2364*4882a593Smuzhiyun
2365*4882a593Smuzhiyun if (rfe_type->ant_switch_with_bt &&
2366*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) {
2367*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1 &&
2368*4882a593Smuzhiyun BTC_RSSI_HIGH(coex_dm->wl_rssi_state[3]) &&
2369*4882a593Smuzhiyun coex_sta->wl_gl_busy) {
2370*4882a593Smuzhiyun table_case = 0;
2371*4882a593Smuzhiyun tdma_case = 0;
2372*4882a593Smuzhiyun } else if (btc->board_info.btdm_ant_num == 2) {
2373*4882a593Smuzhiyun table_case = 100;
2374*4882a593Smuzhiyun tdma_case = 100;
2375*4882a593Smuzhiyun }
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun if (table_case != 0xff && tdma_case != 0xff) {
2378*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G_FREERUN);
2379*4882a593Smuzhiyun goto exit;
2380*4882a593Smuzhiyun }
2381*4882a593Smuzhiyun }
2382*4882a593Smuzhiyun
2383*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2384*4882a593Smuzhiyun #if 0
2385*4882a593Smuzhiyun #ifndef PLATFORM_WINDOWS
2386*4882a593Smuzhiyun if (coex_sta->wl_noisy_level > 0) {
2387*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2388*4882a593Smuzhiyun table_case = 1;
2389*4882a593Smuzhiyun tdma_case = 0;
2390*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2391*4882a593Smuzhiyun table_case = 123;
2392*4882a593Smuzhiyun tdma_case = 0;
2393*4882a593Smuzhiyun }
2394*4882a593Smuzhiyun goto exit;
2395*4882a593Smuzhiyun }
2396*4882a593Smuzhiyun #endif
2397*4882a593Smuzhiyun #endif
2398*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2399*4882a593Smuzhiyun if (!coex_sta->wl_gl_busy) {
2400*4882a593Smuzhiyun table_case = 10;
2401*4882a593Smuzhiyun tdma_case = 3;
2402*4882a593Smuzhiyun } else if (coex_sta->bt_mesh) {
2403*4882a593Smuzhiyun table_case = 26;
2404*4882a593Smuzhiyun tdma_case = 7;
2405*4882a593Smuzhiyun } else if (coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) {
2406*4882a593Smuzhiyun table_case = 11;
2407*4882a593Smuzhiyun
2408*4882a593Smuzhiyun if (coex_sta->bt_ctr_ok &&
2409*4882a593Smuzhiyun (coex_sta->lo_pri_rx + coex_sta->lo_pri_tx > 250))
2410*4882a593Smuzhiyun tdma_case = 17;
2411*4882a593Smuzhiyun else
2412*4882a593Smuzhiyun tdma_case = 7;
2413*4882a593Smuzhiyun } else {
2414*4882a593Smuzhiyun table_case = 12;
2415*4882a593Smuzhiyun tdma_case = 7;
2416*4882a593Smuzhiyun }
2417*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2418*4882a593Smuzhiyun if (!coex_sta->wl_gl_busy) {
2419*4882a593Smuzhiyun table_case = 112;
2420*4882a593Smuzhiyun tdma_case = 104;
2421*4882a593Smuzhiyun } else if ((coex_sta->bt_ble_scan_type & 0x2) &&
2422*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) {
2423*4882a593Smuzhiyun table_case = 114;
2424*4882a593Smuzhiyun tdma_case = 103;
2425*4882a593Smuzhiyun } else {
2426*4882a593Smuzhiyun table_case = 112;
2427*4882a593Smuzhiyun tdma_case = 103;
2428*4882a593Smuzhiyun }
2429*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
2430*4882a593Smuzhiyun btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE)
2431*4882a593Smuzhiyun tdma_case = rtw_btc_ext_chip_new_tdma(btc, 0);
2432*4882a593Smuzhiyun }
2433*4882a593Smuzhiyun
2434*4882a593Smuzhiyun exit:
2435*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2436*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2437*4882a593Smuzhiyun }
2438*4882a593Smuzhiyun
rtw_btc_action_bt_inquiry(struct btc_coexist * btc)2439*4882a593Smuzhiyun static void rtw_btc_action_bt_inquiry(struct btc_coexist *btc)
2440*4882a593Smuzhiyun {
2441*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2442*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
2443*4882a593Smuzhiyun boolean wl_hi_pri = FALSE;
2444*4882a593Smuzhiyun u8 table_case, tdma_case;
2445*4882a593Smuzhiyun u32 slot_type = 0;
2446*4882a593Smuzhiyun
2447*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2448*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2449*4882a593Smuzhiyun
2450*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2451*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2452*4882a593Smuzhiyun
2453*4882a593Smuzhiyun if (coex_sta->wl_linkscan_proc || coex_sta->wl_hi_pri_task1 ||
2454*4882a593Smuzhiyun coex_sta->wl_hi_pri_task2)
2455*4882a593Smuzhiyun wl_hi_pri = TRUE;
2456*4882a593Smuzhiyun
2457*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2458*4882a593Smuzhiyun if (wl_hi_pri) {
2459*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2460*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi hi-pri task\n");
2461*4882a593Smuzhiyun
2462*4882a593Smuzhiyun table_case = 15;
2463*4882a593Smuzhiyun
2464*4882a593Smuzhiyun if (coex_sta->bt_profile_num > 0)
2465*4882a593Smuzhiyun tdma_case = 10;
2466*4882a593Smuzhiyun else if (coex_sta->wl_hi_pri_task1)
2467*4882a593Smuzhiyun tdma_case = 6;
2468*4882a593Smuzhiyun else if (!coex_sta->bt_page)
2469*4882a593Smuzhiyun tdma_case = 8;
2470*4882a593Smuzhiyun else
2471*4882a593Smuzhiyun tdma_case = 9;
2472*4882a593Smuzhiyun } else if (coex_sta->wl_gl_busy) {
2473*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2474*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi busy\n");
2475*4882a593Smuzhiyun #if 0
2476*4882a593Smuzhiyun table_case = 15;
2477*4882a593Smuzhiyun tdma_case = 20;
2478*4882a593Smuzhiyun #else
2479*4882a593Smuzhiyun if (coex_sta->bt_profile_num == 0) {
2480*4882a593Smuzhiyun table_case = 12;
2481*4882a593Smuzhiyun tdma_case = 18;
2482*4882a593Smuzhiyun } else if (coex_sta->bt_profile_num == 1 &&
2483*4882a593Smuzhiyun !coex_sta->bt_a2dp_exist) {
2484*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2485*4882a593Smuzhiyun table_case = 12;
2486*4882a593Smuzhiyun tdma_case = 20;
2487*4882a593Smuzhiyun } else {
2488*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2489*4882a593Smuzhiyun table_case = 12;
2490*4882a593Smuzhiyun tdma_case = 26;
2491*4882a593Smuzhiyun }
2492*4882a593Smuzhiyun #endif
2493*4882a593Smuzhiyun } else if (link_info_ext->is_connected) {
2494*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2495*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi connected\n");
2496*4882a593Smuzhiyun
2497*4882a593Smuzhiyun table_case = 9;
2498*4882a593Smuzhiyun tdma_case = 27;
2499*4882a593Smuzhiyun } else {
2500*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2501*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi not-connected\n");
2502*4882a593Smuzhiyun
2503*4882a593Smuzhiyun table_case = 1;
2504*4882a593Smuzhiyun tdma_case = 0;
2505*4882a593Smuzhiyun }
2506*4882a593Smuzhiyun } else { /* Non_Shared-Ant */
2507*4882a593Smuzhiyun if (wl_hi_pri) {
2508*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2509*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi hi-pri task\n");
2510*4882a593Smuzhiyun
2511*4882a593Smuzhiyun table_case = 100;
2512*4882a593Smuzhiyun tdma_case = 100;
2513*4882a593Smuzhiyun } else if (coex_sta->wl_gl_busy) {
2514*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2515*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi busy\n");
2516*4882a593Smuzhiyun
2517*4882a593Smuzhiyun table_case = 114;
2518*4882a593Smuzhiyun tdma_case = 121;
2519*4882a593Smuzhiyun } else if (link_info_ext->is_connected) {
2520*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2521*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi connected\n");
2522*4882a593Smuzhiyun
2523*4882a593Smuzhiyun table_case = 101;
2524*4882a593Smuzhiyun tdma_case = 100;
2525*4882a593Smuzhiyun } else {
2526*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2527*4882a593Smuzhiyun "[BTCoex], bt inq/page + wifi not-connected\n");
2528*4882a593Smuzhiyun
2529*4882a593Smuzhiyun table_case = 101;
2530*4882a593Smuzhiyun tdma_case = 100;
2531*4882a593Smuzhiyun }
2532*4882a593Smuzhiyun }
2533*4882a593Smuzhiyun
2534*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2535*4882a593Smuzhiyun
2536*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2537*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
2538*4882a593Smuzhiyun }
2539*4882a593Smuzhiyun
rtw_btc_action_bt_hfp(struct btc_coexist * btc)2540*4882a593Smuzhiyun static void rtw_btc_action_bt_hfp(struct btc_coexist *btc)
2541*4882a593Smuzhiyun {
2542*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2543*4882a593Smuzhiyun u8 table_case, tdma_case;
2544*4882a593Smuzhiyun
2545*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2546*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2547*4882a593Smuzhiyun
2548*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2549*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2550*4882a593Smuzhiyun
2551*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2552*4882a593Smuzhiyun if (coex_sta->wl_cck_lock_ever) {
2553*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2GFREE;
2554*4882a593Smuzhiyun table_case = 33;
2555*4882a593Smuzhiyun tdma_case = 0;
2556*4882a593Smuzhiyun } else {
2557*4882a593Smuzhiyun table_case = 10;
2558*4882a593Smuzhiyun tdma_case = 5;
2559*4882a593Smuzhiyun }
2560*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2561*4882a593Smuzhiyun if (coex_sta->bt_multi_link) {
2562*4882a593Smuzhiyun table_case = 112;
2563*4882a593Smuzhiyun tdma_case = 117;
2564*4882a593Smuzhiyun } else {
2565*4882a593Smuzhiyun table_case = 105;
2566*4882a593Smuzhiyun tdma_case = 100;
2567*4882a593Smuzhiyun }
2568*4882a593Smuzhiyun }
2569*4882a593Smuzhiyun
2570*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2571*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2572*4882a593Smuzhiyun }
2573*4882a593Smuzhiyun
rtw_btc_action_bt_hid(struct btc_coexist * btc)2574*4882a593Smuzhiyun static void rtw_btc_action_bt_hid(struct btc_coexist *btc)
2575*4882a593Smuzhiyun {
2576*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2577*4882a593Smuzhiyun u8 table_case, tdma_case;
2578*4882a593Smuzhiyun boolean is_toggle_table = FALSE, is_bt_ctr_hi = FALSE;
2579*4882a593Smuzhiyun u32 slot_type = 0;
2580*4882a593Smuzhiyun
2581*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2582*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2583*4882a593Smuzhiyun
2584*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2585*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2586*4882a593Smuzhiyun
2587*4882a593Smuzhiyun if (coex_sta->bt_ctr_ok &&
2588*4882a593Smuzhiyun (coex_sta->lo_pri_rx + coex_sta->lo_pri_tx > 360))
2589*4882a593Smuzhiyun is_bt_ctr_hi = TRUE;
2590*4882a593Smuzhiyun
2591*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2592*4882a593Smuzhiyun if (coex_sta->wl_cck_lock_ever) {
2593*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2GFREE;
2594*4882a593Smuzhiyun table_case = 33;
2595*4882a593Smuzhiyun tdma_case = 0;
2596*4882a593Smuzhiyun } else if (coex_sta->bt_ble_exist) { /* RCU */
2597*4882a593Smuzhiyun table_case = 26;
2598*4882a593Smuzhiyun tdma_case = 2;
2599*4882a593Smuzhiyun } else { /* Legacy HID */
2600*4882a593Smuzhiyun if (coex_sta->bt_a2dp_active ||
2601*4882a593Smuzhiyun coex_sta->bt_a2dp_active_remain) {
2602*4882a593Smuzhiyun table_case = 9;
2603*4882a593Smuzhiyun tdma_case = 18;
2604*4882a593Smuzhiyun } else if (coex_sta->bt_profile_num == 1 &&
2605*4882a593Smuzhiyun (coex_sta->bt_multi_link &&
2606*4882a593Smuzhiyun (is_bt_ctr_hi ||
2607*4882a593Smuzhiyun coex_sta->bt_slave ||
2608*4882a593Smuzhiyun coex_sta->bt_multi_link_remain))) {
2609*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2610*4882a593Smuzhiyun
2611*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
2612*4882a593Smuzhiyun (coex_sta->wl_rx_rate <= 3 ||
2613*4882a593Smuzhiyun coex_sta->wl_rts_rx_rate <= 3))
2614*4882a593Smuzhiyun table_case = 13;
2615*4882a593Smuzhiyun else
2616*4882a593Smuzhiyun table_case = 12;
2617*4882a593Smuzhiyun
2618*4882a593Smuzhiyun tdma_case = 26;
2619*4882a593Smuzhiyun } else if (coex_sta->bt_418_hid_exist &&
2620*4882a593Smuzhiyun coex_sta->wl_gl_busy) {
2621*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2622*4882a593Smuzhiyun table_case = 32;
2623*4882a593Smuzhiyun tdma_case = 27;
2624*4882a593Smuzhiyun } else if (coex_sta->bt_ble_hid_exist &&
2625*4882a593Smuzhiyun coex_sta->wl_gl_busy) {
2626*4882a593Smuzhiyun table_case = 32;
2627*4882a593Smuzhiyun tdma_case = 9;
2628*4882a593Smuzhiyun } else {
2629*4882a593Smuzhiyun table_case = 9;
2630*4882a593Smuzhiyun tdma_case = 9;
2631*4882a593Smuzhiyun }
2632*4882a593Smuzhiyun }
2633*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2634*4882a593Smuzhiyun if (coex_sta->bt_ble_exist) { /* BLE */
2635*4882a593Smuzhiyun table_case = 110;
2636*4882a593Smuzhiyun tdma_case = 105;
2637*4882a593Smuzhiyun } else if (coex_sta->bt_a2dp_active) {
2638*4882a593Smuzhiyun table_case = 113;
2639*4882a593Smuzhiyun tdma_case = 118;
2640*4882a593Smuzhiyun } else {
2641*4882a593Smuzhiyun table_case = 113;
2642*4882a593Smuzhiyun tdma_case = 104;
2643*4882a593Smuzhiyun }
2644*4882a593Smuzhiyun }
2645*4882a593Smuzhiyun
2646*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2647*4882a593Smuzhiyun if (is_toggle_table) {
2648*4882a593Smuzhiyun rtw_btc_wltoggle_tableA(btc, FC_EXCU, table_case);
2649*4882a593Smuzhiyun rtw_btc_wltoggle_tableB(btc, NM_EXCU, 1, 0x5a5a5aaa);
2650*4882a593Smuzhiyun }
2651*4882a593Smuzhiyun
2652*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
2653*4882a593Smuzhiyun }
2654*4882a593Smuzhiyun
rtw_btc_action_bt_a2dp(struct btc_coexist * btc)2655*4882a593Smuzhiyun static void rtw_btc_action_bt_a2dp(struct btc_coexist *btc)
2656*4882a593Smuzhiyun {
2657*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2658*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2659*4882a593Smuzhiyun u8 table_case, tdma_case;
2660*4882a593Smuzhiyun u32 slot_type = 0;
2661*4882a593Smuzhiyun
2662*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2663*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2664*4882a593Smuzhiyun
2665*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2666*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2667*4882a593Smuzhiyun
2668*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2669*4882a593Smuzhiyun
2670*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2671*4882a593Smuzhiyun if (coex_sta->wl_gl_busy && coex_sta->wl_noisy_level == 0)
2672*4882a593Smuzhiyun table_case = 12;
2673*4882a593Smuzhiyun else
2674*4882a593Smuzhiyun table_case = 9;
2675*4882a593Smuzhiyun
2676*4882a593Smuzhiyun if (coex_sta->wl_connecting || !coex_sta->wl_gl_busy)
2677*4882a593Smuzhiyun tdma_case = 14;
2678*4882a593Smuzhiyun else
2679*4882a593Smuzhiyun tdma_case = 13;
2680*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2681*4882a593Smuzhiyun table_case = 121;
2682*4882a593Smuzhiyun tdma_case = 113;
2683*4882a593Smuzhiyun }
2684*4882a593Smuzhiyun
2685*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2686*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
2687*4882a593Smuzhiyun }
2688*4882a593Smuzhiyun
rtw_btc_action_bt_a2dpsink(struct btc_coexist * btc)2689*4882a593Smuzhiyun static void rtw_btc_action_bt_a2dpsink(struct btc_coexist *btc)
2690*4882a593Smuzhiyun {
2691*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2692*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2693*4882a593Smuzhiyun struct btc_wifi_link_info_ext *linfo_ext = &btc->wifi_link_info_ext;
2694*4882a593Smuzhiyun u8 table_case, tdma_case;
2695*4882a593Smuzhiyun
2696*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2697*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2698*4882a593Smuzhiyun
2699*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2700*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2701*4882a593Smuzhiyun
2702*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2703*4882a593Smuzhiyun if (linfo_ext->is_ap_mode) {
2704*4882a593Smuzhiyun table_case = 2;
2705*4882a593Smuzhiyun tdma_case = 0;
2706*4882a593Smuzhiyun } else if (coex_sta->wl_gl_busy) {
2707*4882a593Smuzhiyun table_case = 28;
2708*4882a593Smuzhiyun tdma_case = 20;
2709*4882a593Smuzhiyun } else {
2710*4882a593Smuzhiyun table_case = 28;
2711*4882a593Smuzhiyun tdma_case = 26;
2712*4882a593Smuzhiyun }
2713*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2714*4882a593Smuzhiyun if (linfo_ext->is_ap_mode) {
2715*4882a593Smuzhiyun table_case = 100;
2716*4882a593Smuzhiyun tdma_case = 100;
2717*4882a593Smuzhiyun } else {
2718*4882a593Smuzhiyun table_case = 119;
2719*4882a593Smuzhiyun tdma_case = 120;
2720*4882a593Smuzhiyun }
2721*4882a593Smuzhiyun }
2722*4882a593Smuzhiyun
2723*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2724*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2725*4882a593Smuzhiyun }
2726*4882a593Smuzhiyun
rtw_btc_action_bt_pan(struct btc_coexist * btc)2727*4882a593Smuzhiyun static void rtw_btc_action_bt_pan(struct btc_coexist *btc)
2728*4882a593Smuzhiyun {
2729*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2730*4882a593Smuzhiyun u8 table_case, tdma_case;
2731*4882a593Smuzhiyun
2732*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2733*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2734*4882a593Smuzhiyun
2735*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2736*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2737*4882a593Smuzhiyun
2738*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2739*4882a593Smuzhiyun if (coex_sta->wl_gl_busy && coex_sta->wl_noisy_level == 0)
2740*4882a593Smuzhiyun table_case = 14;
2741*4882a593Smuzhiyun else
2742*4882a593Smuzhiyun table_case = 10;
2743*4882a593Smuzhiyun
2744*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2745*4882a593Smuzhiyun tdma_case = 17;
2746*4882a593Smuzhiyun else
2747*4882a593Smuzhiyun tdma_case = 20;
2748*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2749*4882a593Smuzhiyun table_case = 112;
2750*4882a593Smuzhiyun
2751*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2752*4882a593Smuzhiyun tdma_case = 117;
2753*4882a593Smuzhiyun else
2754*4882a593Smuzhiyun tdma_case = 119;
2755*4882a593Smuzhiyun }
2756*4882a593Smuzhiyun
2757*4882a593Smuzhiyun if (coex_sta->bt_slave && coex_sta->wl_gl_busy)
2758*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, NM_EXCU, 3, 20);
2759*4882a593Smuzhiyun else
2760*4882a593Smuzhiyun rtw_btc_set_bt_golden_rx_range(btc, NM_EXCU, 3, 0);
2761*4882a593Smuzhiyun
2762*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2763*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2764*4882a593Smuzhiyun }
2765*4882a593Smuzhiyun
rtw_btc_action_bt_a2dp_hid(struct btc_coexist * btc)2766*4882a593Smuzhiyun static void rtw_btc_action_bt_a2dp_hid(struct btc_coexist *btc)
2767*4882a593Smuzhiyun {
2768*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2769*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2770*4882a593Smuzhiyun u8 table_case = 0, tdma_case = 0, interval = 0;
2771*4882a593Smuzhiyun boolean is_toggle_table = FALSE;
2772*4882a593Smuzhiyun u32 slot_type = 0, tableB = 0;
2773*4882a593Smuzhiyun
2774*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2775*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2776*4882a593Smuzhiyun
2777*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2778*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2779*4882a593Smuzhiyun
2780*4882a593Smuzhiyun if (coex_sta->wl_iot_peer != BTC_IOT_PEER_CISCO)
2781*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
2782*4882a593Smuzhiyun
2783*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2784*4882a593Smuzhiyun if (coex_sta->bt_ble_exist) {
2785*4882a593Smuzhiyun table_case = 26; /* for RCU */
2786*4882a593Smuzhiyun } else if (coex_sta->bt_418_hid_exist) { /*for 4/18 HID*/
2787*4882a593Smuzhiyun table_case = 9;
2788*4882a593Smuzhiyun tableB = 0x5a5a5aaa;
2789*4882a593Smuzhiyun interval = 1;
2790*4882a593Smuzhiyun } else {
2791*4882a593Smuzhiyun table_case = 9; /*for 2/18 HID, BLE HID*/
2792*4882a593Smuzhiyun }
2793*4882a593Smuzhiyun
2794*4882a593Smuzhiyun if (coex_sta->wl_connecting || !coex_sta->wl_gl_busy) {
2795*4882a593Smuzhiyun tdma_case = 14;
2796*4882a593Smuzhiyun } else if (coex_sta->bt_418_hid_exist) {
2797*4882a593Smuzhiyun is_toggle_table = TRUE;
2798*4882a593Smuzhiyun tdma_case = 23;
2799*4882a593Smuzhiyun } else {
2800*4882a593Smuzhiyun tdma_case = 13;
2801*4882a593Smuzhiyun }
2802*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2803*4882a593Smuzhiyun if (coex_sta->bt_ble_exist)
2804*4882a593Smuzhiyun table_case = 110;
2805*4882a593Smuzhiyun else
2806*4882a593Smuzhiyun table_case = 121;
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun tdma_case = 113;
2809*4882a593Smuzhiyun }
2810*4882a593Smuzhiyun
2811*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2812*4882a593Smuzhiyun if (is_toggle_table) {
2813*4882a593Smuzhiyun rtw_btc_wltoggle_tableA(btc, FC_EXCU, table_case);
2814*4882a593Smuzhiyun rtw_btc_wltoggle_tableB(btc, NM_EXCU, interval, tableB);
2815*4882a593Smuzhiyun }
2816*4882a593Smuzhiyun
2817*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
2818*4882a593Smuzhiyun }
2819*4882a593Smuzhiyun
rtw_btc_action_bt_a2dp_pan(struct btc_coexist * btc)2820*4882a593Smuzhiyun static void rtw_btc_action_bt_a2dp_pan(struct btc_coexist *btc)
2821*4882a593Smuzhiyun {
2822*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2823*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
2824*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
2825*4882a593Smuzhiyun u8 table_case, tdma_case;
2826*4882a593Smuzhiyun boolean wl_cpt_test = FALSE, bt_cpt_test = FALSE;
2827*4882a593Smuzhiyun
2828*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2829*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2830*4882a593Smuzhiyun
2831*4882a593Smuzhiyun if (btc->board_info.customer_id == RT_CID_LENOVO_CHINA &&
2832*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_SCANAP] <= 10 &&
2833*4882a593Smuzhiyun coex_sta->wl_iot_peer == BTC_IOT_PEER_ATHEROS) {
2834*4882a593Smuzhiyun if (BTC_RSSI_LOW(coex_dm->wl_rssi_state[2]))
2835*4882a593Smuzhiyun wl_cpt_test = TRUE;
2836*4882a593Smuzhiyun else
2837*4882a593Smuzhiyun bt_cpt_test = TRUE;
2838*4882a593Smuzhiyun }
2839*4882a593Smuzhiyun
2840*4882a593Smuzhiyun if (wl_cpt_test)
2841*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, chip_para->wl_rf_para_rx[1]);
2842*4882a593Smuzhiyun else
2843*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, chip_para->wl_rf_para_rx[0]);
2844*4882a593Smuzhiyun
2845*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2846*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2847*4882a593Smuzhiyun if (wl_cpt_test) {
2848*4882a593Smuzhiyun if (coex_sta->wl_gl_busy) {
2849*4882a593Smuzhiyun table_case = 20;
2850*4882a593Smuzhiyun tdma_case = 17;
2851*4882a593Smuzhiyun } else {
2852*4882a593Smuzhiyun table_case = 10;
2853*4882a593Smuzhiyun tdma_case = 15;
2854*4882a593Smuzhiyun }
2855*4882a593Smuzhiyun } else if (bt_cpt_test) {
2856*4882a593Smuzhiyun table_case = 26;
2857*4882a593Smuzhiyun tdma_case = 26;
2858*4882a593Smuzhiyun } else {
2859*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
2860*4882a593Smuzhiyun coex_sta->wl_noisy_level == 0)
2861*4882a593Smuzhiyun table_case = 14;
2862*4882a593Smuzhiyun else
2863*4882a593Smuzhiyun table_case = 10;
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2866*4882a593Smuzhiyun tdma_case = 15;
2867*4882a593Smuzhiyun else
2868*4882a593Smuzhiyun tdma_case = 20;
2869*4882a593Smuzhiyun }
2870*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2871*4882a593Smuzhiyun table_case = 112;
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2874*4882a593Smuzhiyun tdma_case = 115;
2875*4882a593Smuzhiyun else
2876*4882a593Smuzhiyun tdma_case = 120;
2877*4882a593Smuzhiyun }
2878*4882a593Smuzhiyun
2879*4882a593Smuzhiyun if (coex_sta->bt_slave)
2880*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x3c);
2881*4882a593Smuzhiyun else
2882*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x32);
2883*4882a593Smuzhiyun
2884*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2885*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2886*4882a593Smuzhiyun }
2887*4882a593Smuzhiyun
rtw_btc_action_bt_pan_hid(struct btc_coexist * btc)2888*4882a593Smuzhiyun static void rtw_btc_action_bt_pan_hid(struct btc_coexist *btc)
2889*4882a593Smuzhiyun {
2890*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2891*4882a593Smuzhiyun u8 table_case, tdma_case;
2892*4882a593Smuzhiyun
2893*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2894*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2895*4882a593Smuzhiyun
2896*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2897*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2898*4882a593Smuzhiyun
2899*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2900*4882a593Smuzhiyun table_case = 9;
2901*4882a593Smuzhiyun
2902*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2903*4882a593Smuzhiyun tdma_case = 18;
2904*4882a593Smuzhiyun else
2905*4882a593Smuzhiyun tdma_case = 19;
2906*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2907*4882a593Smuzhiyun table_case = 113;
2908*4882a593Smuzhiyun
2909*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2910*4882a593Smuzhiyun tdma_case = 117;
2911*4882a593Smuzhiyun else
2912*4882a593Smuzhiyun tdma_case = 119;
2913*4882a593Smuzhiyun }
2914*4882a593Smuzhiyun
2915*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2916*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2917*4882a593Smuzhiyun }
2918*4882a593Smuzhiyun
rtw_btc_action_bt_a2dp_pan_hid(struct btc_coexist * btc)2919*4882a593Smuzhiyun static void rtw_btc_action_bt_a2dp_pan_hid(struct btc_coexist *btc)
2920*4882a593Smuzhiyun {
2921*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
2922*4882a593Smuzhiyun u8 table_case, tdma_case;
2923*4882a593Smuzhiyun
2924*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2925*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2926*4882a593Smuzhiyun
2927*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
2928*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2929*4882a593Smuzhiyun
2930*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2931*4882a593Smuzhiyun table_case = 10;
2932*4882a593Smuzhiyun
2933*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2934*4882a593Smuzhiyun tdma_case = 15;
2935*4882a593Smuzhiyun else
2936*4882a593Smuzhiyun tdma_case = 20;
2937*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2938*4882a593Smuzhiyun table_case = 113;
2939*4882a593Smuzhiyun
2940*4882a593Smuzhiyun if (coex_sta->wl_gl_busy)
2941*4882a593Smuzhiyun tdma_case = 115;
2942*4882a593Smuzhiyun else
2943*4882a593Smuzhiyun tdma_case = 120;
2944*4882a593Smuzhiyun }
2945*4882a593Smuzhiyun
2946*4882a593Smuzhiyun if (coex_sta->bt_slave)
2947*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x3c);
2948*4882a593Smuzhiyun else
2949*4882a593Smuzhiyun rtw_btc_set_extend_btautoslot(btc, 0x32);
2950*4882a593Smuzhiyun
2951*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
2952*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
2953*4882a593Smuzhiyun }
2954*4882a593Smuzhiyun
rtw_btc_action_wl_off(struct btc_coexist * btc)2955*4882a593Smuzhiyun static void rtw_btc_action_wl_off(struct btc_coexist *btc)
2956*4882a593Smuzhiyun {
2957*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
2958*4882a593Smuzhiyun
2959*4882a593Smuzhiyun rtw_btc_tdma(btc, FC_EXCU, 0);
2960*4882a593Smuzhiyun rtw_btc_ignore_wlan_act(btc, FC_EXCU, TRUE);
2961*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_WOFF);
2962*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2963*4882a593Smuzhiyun
2964*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
2965*4882a593Smuzhiyun btc->wl_rf_state_off = TRUE;
2966*4882a593Smuzhiyun
2967*4882a593Smuzhiyun /* must place in the last step */
2968*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, BTC_MEDIA_DISCONNECT);
2969*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
2970*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ALL, FALSE);
2971*4882a593Smuzhiyun else
2972*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ALL_32BIT, FALSE);
2973*4882a593Smuzhiyun }
2974*4882a593Smuzhiyun
rtw_btc_action_wl_under5g(struct btc_coexist * btc)2975*4882a593Smuzhiyun static void rtw_btc_action_wl_under5g(struct btc_coexist *btc)
2976*4882a593Smuzhiyun {
2977*4882a593Smuzhiyun u8 table_case, tdma_case;
2978*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
2979*4882a593Smuzhiyun
2980*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
2981*4882a593Smuzhiyun BTC_TRACE(trace_buf);
2982*4882a593Smuzhiyun
2983*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_5G);
2984*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
2985*4882a593Smuzhiyun
2986*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
2987*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_FIX2M, FALSE);
2988*4882a593Smuzhiyun else
2989*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_FIX2M, FALSE);
2990*4882a593Smuzhiyun
2991*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
2992*4882a593Smuzhiyun table_case = 0;
2993*4882a593Smuzhiyun tdma_case = 0;
2994*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
2995*4882a593Smuzhiyun table_case = 100;
2996*4882a593Smuzhiyun tdma_case = 100;
2997*4882a593Smuzhiyun }
2998*4882a593Smuzhiyun
2999*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3000*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3001*4882a593Smuzhiyun }
3002*4882a593Smuzhiyun
rtw_btc_action_wl_only(struct btc_coexist * btc)3003*4882a593Smuzhiyun static void rtw_btc_action_wl_only(struct btc_coexist *btc)
3004*4882a593Smuzhiyun {
3005*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3006*4882a593Smuzhiyun u8 table_case, tdma_case;
3007*4882a593Smuzhiyun
3008*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3009*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3010*4882a593Smuzhiyun
3011*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3012*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3013*4882a593Smuzhiyun
3014*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
3015*4882a593Smuzhiyun table_case = 2;
3016*4882a593Smuzhiyun tdma_case = 0;
3017*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
3018*4882a593Smuzhiyun table_case = 100;
3019*4882a593Smuzhiyun tdma_case = 100;
3020*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
3021*4882a593Smuzhiyun btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE)
3022*4882a593Smuzhiyun tdma_case = rtw_btc_ext_chip_new_tdma(btc, 3);
3023*4882a593Smuzhiyun }
3024*4882a593Smuzhiyun
3025*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3026*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3027*4882a593Smuzhiyun }
3028*4882a593Smuzhiyun
rtw_btc_action_wl_native_lps(struct btc_coexist * btc)3029*4882a593Smuzhiyun static void rtw_btc_action_wl_native_lps(struct btc_coexist *btc)
3030*4882a593Smuzhiyun {
3031*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3032*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
3033*4882a593Smuzhiyun u8 table_case, tdma_case;
3034*4882a593Smuzhiyun
3035*4882a593Smuzhiyun if (link_info_ext->is_all_under_5g)
3036*4882a593Smuzhiyun return;
3037*4882a593Smuzhiyun
3038*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3039*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3040*4882a593Smuzhiyun
3041*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3042*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3043*4882a593Smuzhiyun
3044*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
3045*4882a593Smuzhiyun table_case = 28; /*0x6c0 for A2DP, 0x6c4 for non-A2DP*/
3046*4882a593Smuzhiyun tdma_case = 0;
3047*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
3048*4882a593Smuzhiyun table_case = 100;
3049*4882a593Smuzhiyun tdma_case = 100;
3050*4882a593Smuzhiyun }
3051*4882a593Smuzhiyun
3052*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3053*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3054*4882a593Smuzhiyun }
3055*4882a593Smuzhiyun
rtw_btc_action_wl_linkscan(struct btc_coexist * btc)3056*4882a593Smuzhiyun static void rtw_btc_action_wl_linkscan(struct btc_coexist *btc)
3057*4882a593Smuzhiyun {
3058*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3059*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
3060*4882a593Smuzhiyun u8 table_case, tdma_case;
3061*4882a593Smuzhiyun u32 slot_type = 0;
3062*4882a593Smuzhiyun
3063*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3064*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3065*4882a593Smuzhiyun
3066*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3067*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3068*4882a593Smuzhiyun
3069*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
3070*4882a593Smuzhiyun if (coex_sta->bt_pan_exist) {
3071*4882a593Smuzhiyun table_case = 34;
3072*4882a593Smuzhiyun tdma_case = 8;
3073*4882a593Smuzhiyun } else if (coex_sta->bt_a2dp_exist) {
3074*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3075*4882a593Smuzhiyun table_case = 9;
3076*4882a593Smuzhiyun tdma_case = 11;
3077*4882a593Smuzhiyun } else if (coex_sta->bt_hid_exist) {
3078*4882a593Smuzhiyun if (link_info_ext->is_connected) {
3079*4882a593Smuzhiyun table_case = 36;
3080*4882a593Smuzhiyun } else {
3081*4882a593Smuzhiyun table_case = 35;
3082*4882a593Smuzhiyun }
3083*4882a593Smuzhiyun tdma_case = 5;
3084*4882a593Smuzhiyun } else {
3085*4882a593Smuzhiyun table_case = 9;
3086*4882a593Smuzhiyun tdma_case = 7;
3087*4882a593Smuzhiyun }
3088*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
3089*4882a593Smuzhiyun if (coex_sta->bt_pan_exist) {
3090*4882a593Smuzhiyun table_case = 124;
3091*4882a593Smuzhiyun tdma_case = 108;
3092*4882a593Smuzhiyun } else if (coex_sta->bt_a2dp_exist) {
3093*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3094*4882a593Smuzhiyun table_case = 124;
3095*4882a593Smuzhiyun tdma_case = 126;
3096*4882a593Smuzhiyun } else {
3097*4882a593Smuzhiyun table_case = 112;
3098*4882a593Smuzhiyun tdma_case = 107;
3099*4882a593Smuzhiyun }
3100*4882a593Smuzhiyun if (coex_sta->wl_gl_busy &&
3101*4882a593Smuzhiyun btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE)
3102*4882a593Smuzhiyun tdma_case = rtw_btc_ext_chip_new_tdma(btc, 2);
3103*4882a593Smuzhiyun }
3104*4882a593Smuzhiyun
3105*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3106*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
3107*4882a593Smuzhiyun }
3108*4882a593Smuzhiyun
rtw_btc_action_wl_not_connected(struct btc_coexist * btc)3109*4882a593Smuzhiyun static void rtw_btc_action_wl_not_connected(struct btc_coexist *btc)
3110*4882a593Smuzhiyun {
3111*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
3112*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3113*4882a593Smuzhiyun u8 table_case, tdma_case;
3114*4882a593Smuzhiyun
3115*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3116*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3117*4882a593Smuzhiyun
3118*4882a593Smuzhiyun /* CCK Rx, Tx response, Tx beacon = low pri */
3119*4882a593Smuzhiyun if (link_info_ext->num_of_active_port == 0)
3120*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_RX_CCK, 0);
3121*4882a593Smuzhiyun
3122*4882a593Smuzhiyun coex_sta->wl_cck_lock_ever = FALSE;
3123*4882a593Smuzhiyun coex_sta->wl_cck_lock = FALSE;
3124*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_2G_TDDTRY] = FALSE;
3125*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_2G_FDDSTAY] = FALSE;
3126*4882a593Smuzhiyun
3127*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3128*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3129*4882a593Smuzhiyun
3130*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
3131*4882a593Smuzhiyun table_case = 1;
3132*4882a593Smuzhiyun tdma_case = 0;
3133*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
3134*4882a593Smuzhiyun table_case = 100;
3135*4882a593Smuzhiyun tdma_case = 100;
3136*4882a593Smuzhiyun }
3137*4882a593Smuzhiyun
3138*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3139*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3140*4882a593Smuzhiyun }
3141*4882a593Smuzhiyun
rtw_btc_action_wl_connected(struct btc_coexist * btc)3142*4882a593Smuzhiyun static void rtw_btc_action_wl_connected(struct btc_coexist *btc)
3143*4882a593Smuzhiyun {
3144*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3145*4882a593Smuzhiyun u8 algorithm;
3146*4882a593Smuzhiyun
3147*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3148*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3149*4882a593Smuzhiyun
3150*4882a593Smuzhiyun /*Leap-AP protection will reopen when connecting AP*/
3151*4882a593Smuzhiyun rtw_btc_wl_leakap(btc, TRUE);
3152*4882a593Smuzhiyun
3153*4882a593Smuzhiyun if ((btc->board_info.btdm_ant_num == 2) &&
3154*4882a593Smuzhiyun (btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE)) {
3155*4882a593Smuzhiyun rtw_btc_action_ext_chip(btc);
3156*4882a593Smuzhiyun return;
3157*4882a593Smuzhiyun }
3158*4882a593Smuzhiyun
3159*4882a593Smuzhiyun algorithm = rtw_btc_algorithm(btc);
3160*4882a593Smuzhiyun
3161*4882a593Smuzhiyun switch (algorithm) {
3162*4882a593Smuzhiyun case BTC_COEX_HFP:
3163*4882a593Smuzhiyun if (rtw_btc_freerun_check(btc))
3164*4882a593Smuzhiyun rtw_btc_action_freerun(btc);
3165*4882a593Smuzhiyun else
3166*4882a593Smuzhiyun rtw_btc_action_bt_hfp(btc);
3167*4882a593Smuzhiyun break;
3168*4882a593Smuzhiyun case BTC_COEX_HID:
3169*4882a593Smuzhiyun if (rtw_btc_freerun_check(btc))
3170*4882a593Smuzhiyun rtw_btc_action_freerun(btc);
3171*4882a593Smuzhiyun else
3172*4882a593Smuzhiyun rtw_btc_action_bt_hid(btc);
3173*4882a593Smuzhiyun break;
3174*4882a593Smuzhiyun case BTC_COEX_A2DP:
3175*4882a593Smuzhiyun if (rtw_btc_freerun_check(btc))
3176*4882a593Smuzhiyun rtw_btc_action_freerun(btc);
3177*4882a593Smuzhiyun else if (coex_sta->bt_a2dp_sink)
3178*4882a593Smuzhiyun rtw_btc_action_bt_a2dpsink(btc);
3179*4882a593Smuzhiyun else
3180*4882a593Smuzhiyun rtw_btc_action_bt_a2dp(btc);
3181*4882a593Smuzhiyun break;
3182*4882a593Smuzhiyun case BTC_COEX_PAN:
3183*4882a593Smuzhiyun rtw_btc_action_bt_pan(btc);
3184*4882a593Smuzhiyun break;
3185*4882a593Smuzhiyun case BTC_COEX_A2DP_HID:
3186*4882a593Smuzhiyun if (rtw_btc_freerun_check(btc))
3187*4882a593Smuzhiyun rtw_btc_action_freerun(btc);
3188*4882a593Smuzhiyun else
3189*4882a593Smuzhiyun rtw_btc_action_bt_a2dp_hid(btc);
3190*4882a593Smuzhiyun break;
3191*4882a593Smuzhiyun case BTC_COEX_A2DP_PAN:
3192*4882a593Smuzhiyun rtw_btc_action_bt_a2dp_pan(btc);
3193*4882a593Smuzhiyun break;
3194*4882a593Smuzhiyun case BTC_COEX_PAN_HID:
3195*4882a593Smuzhiyun rtw_btc_action_bt_pan_hid(btc);
3196*4882a593Smuzhiyun break;
3197*4882a593Smuzhiyun case BTC_COEX_A2DP_PAN_HID:
3198*4882a593Smuzhiyun rtw_btc_action_bt_a2dp_pan_hid(btc);
3199*4882a593Smuzhiyun break;
3200*4882a593Smuzhiyun default:
3201*4882a593Smuzhiyun case BTC_COEX_NOPROFILE:
3202*4882a593Smuzhiyun rtw_btc_action_bt_idle(btc);
3203*4882a593Smuzhiyun break;
3204*4882a593Smuzhiyun }
3205*4882a593Smuzhiyun }
3206*4882a593Smuzhiyun
rtw_btc_action_wl_mcc25g(struct btc_coexist * btc)3207*4882a593Smuzhiyun static void rtw_btc_action_wl_mcc25g(struct btc_coexist *btc)
3208*4882a593Smuzhiyun {
3209*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3210*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3211*4882a593Smuzhiyun u8 table_case, tdma_case;
3212*4882a593Smuzhiyun
3213*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_MCC);
3214*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3215*4882a593Smuzhiyun
3216*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
3217*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_FIX2M, FALSE);
3218*4882a593Smuzhiyun else
3219*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_FIX2M, FALSE);
3220*4882a593Smuzhiyun
3221*4882a593Smuzhiyun if (btc->board_info.btdm_ant_num == 1) { /* Shared-Ant */
3222*4882a593Smuzhiyun if (coex_sta->bt_setup_link) {
3223*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3224*4882a593Smuzhiyun "[BTCoex], %s(): BT Relink\n", __func__);
3225*4882a593Smuzhiyun
3226*4882a593Smuzhiyun table_case = 24;
3227*4882a593Smuzhiyun tdma_case = 0;
3228*4882a593Smuzhiyun } else if (coex_sta->bt_inq_page) {
3229*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3230*4882a593Smuzhiyun "[BTCoex], %s(): BT Inq-Pag\n", __func__);
3231*4882a593Smuzhiyun
3232*4882a593Smuzhiyun table_case = 23;
3233*4882a593Smuzhiyun tdma_case = 0;
3234*4882a593Smuzhiyun } else {
3235*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3236*4882a593Smuzhiyun "[BTCoex], %s(): BT on\n", __func__);
3237*4882a593Smuzhiyun
3238*4882a593Smuzhiyun if (coex_sta->wl_gl_busy) {
3239*4882a593Smuzhiyun if (coex_sta->wl_rx_rate <= 3 ||
3240*4882a593Smuzhiyun coex_sta->wl_rts_rx_rate <= 3)
3241*4882a593Smuzhiyun table_case = 31;
3242*4882a593Smuzhiyun else if (coex_sta->bt_hid_exist ||
3243*4882a593Smuzhiyun coex_sta->bt_hfp_exist)
3244*4882a593Smuzhiyun table_case = 26;
3245*4882a593Smuzhiyun else
3246*4882a593Smuzhiyun table_case = 27;
3247*4882a593Smuzhiyun } else {
3248*4882a593Smuzhiyun table_case = 27;
3249*4882a593Smuzhiyun }
3250*4882a593Smuzhiyun
3251*4882a593Smuzhiyun tdma_case = 0;
3252*4882a593Smuzhiyun }
3253*4882a593Smuzhiyun } else { /* Non-Shared-Ant */
3254*4882a593Smuzhiyun if (coex_sta->bt_setup_link) {
3255*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3256*4882a593Smuzhiyun "[BTCoex], %s(): BT Relink\n", __func__);
3257*4882a593Smuzhiyun
3258*4882a593Smuzhiyun table_case = 100;
3259*4882a593Smuzhiyun tdma_case = 100;
3260*4882a593Smuzhiyun } else if (coex_sta->bt_inq_page) {
3261*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3262*4882a593Smuzhiyun "[BTCoex], %s(): BT Inq-Pag\n", __func__);
3263*4882a593Smuzhiyun
3264*4882a593Smuzhiyun table_case = 118;
3265*4882a593Smuzhiyun tdma_case = 100;
3266*4882a593Smuzhiyun } else {
3267*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3268*4882a593Smuzhiyun "[BTCoex], %s(): BT on!!\n", __func__);
3269*4882a593Smuzhiyun
3270*4882a593Smuzhiyun table_case = 118;
3271*4882a593Smuzhiyun tdma_case = 100;
3272*4882a593Smuzhiyun }
3273*4882a593Smuzhiyun }
3274*4882a593Smuzhiyun
3275*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3276*4882a593Smuzhiyun
3277*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3278*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3279*4882a593Smuzhiyun }
3280*4882a593Smuzhiyun
rtw_btc_action_wl_scc2g(struct btc_coexist * btc)3281*4882a593Smuzhiyun static void rtw_btc_action_wl_scc2g(struct btc_coexist *btc)
3282*4882a593Smuzhiyun {
3283*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3284*4882a593Smuzhiyun u8 table_case = 0xff, tdma_case = 0xff;
3285*4882a593Smuzhiyun boolean is_toggle_table = FALSE;
3286*4882a593Smuzhiyun u32 slot_type = 0;
3287*4882a593Smuzhiyun
3288*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3289*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3290*4882a593Smuzhiyun
3291*4882a593Smuzhiyun if (coex_sta->bt_profile_num == 1) {
3292*4882a593Smuzhiyun if (coex_sta->bt_hid_exist || coex_sta->bt_hfp_exist) {
3293*4882a593Smuzhiyun if (coex_sta->bt_a2dp_active) {
3294*4882a593Smuzhiyun table_case = 9;
3295*4882a593Smuzhiyun tdma_case = 21;
3296*4882a593Smuzhiyun } else if (coex_sta->bt_418_hid_exist) {
3297*4882a593Smuzhiyun table_case = 10;
3298*4882a593Smuzhiyun tdma_case = 24;
3299*4882a593Smuzhiyun is_toggle_table = TRUE;
3300*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3301*4882a593Smuzhiyun } else {
3302*4882a593Smuzhiyun table_case = 2;
3303*4882a593Smuzhiyun tdma_case = 0;
3304*4882a593Smuzhiyun }
3305*4882a593Smuzhiyun } else if (coex_sta->bt_a2dp_exist) {
3306*4882a593Smuzhiyun table_case = 10;
3307*4882a593Smuzhiyun tdma_case = 22;
3308*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3309*4882a593Smuzhiyun } else { /* PAN or OPP */
3310*4882a593Smuzhiyun table_case = 10;
3311*4882a593Smuzhiyun tdma_case = 21;
3312*4882a593Smuzhiyun }
3313*4882a593Smuzhiyun } else {
3314*4882a593Smuzhiyun if ((coex_sta->bt_hid_exist || coex_sta->bt_hfp_exist) &&
3315*4882a593Smuzhiyun coex_sta->bt_a2dp_exist) {
3316*4882a593Smuzhiyun table_case = 9;
3317*4882a593Smuzhiyun tdma_case = 22;
3318*4882a593Smuzhiyun
3319*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3320*4882a593Smuzhiyun if (coex_sta->bt_418_hid_exist)
3321*4882a593Smuzhiyun is_toggle_table = TRUE;
3322*4882a593Smuzhiyun } else if (coex_sta->bt_pan_exist && coex_sta->bt_a2dp_exist) {
3323*4882a593Smuzhiyun table_case = 10;
3324*4882a593Smuzhiyun tdma_case = 22;
3325*4882a593Smuzhiyun slot_type = TDMA_4SLOT;
3326*4882a593Smuzhiyun } else { /* hid + pan */
3327*4882a593Smuzhiyun table_case = 9;
3328*4882a593Smuzhiyun tdma_case = 21;
3329*4882a593Smuzhiyun }
3330*4882a593Smuzhiyun }
3331*4882a593Smuzhiyun
3332*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3333*4882a593Smuzhiyun if (is_toggle_table) {
3334*4882a593Smuzhiyun rtw_btc_wltoggle_tableA(btc, FC_EXCU, table_case);
3335*4882a593Smuzhiyun rtw_btc_wltoggle_tableB(btc, NM_EXCU, 1, 0x5a5a5aaa);
3336*4882a593Smuzhiyun }
3337*4882a593Smuzhiyun
3338*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case | slot_type);
3339*4882a593Smuzhiyun }
3340*4882a593Smuzhiyun
rtw_btc_action_wl_p2p2g(struct btc_coexist * btc)3341*4882a593Smuzhiyun static void rtw_btc_action_wl_p2p2g(struct btc_coexist *btc)
3342*4882a593Smuzhiyun {
3343*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3344*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
3345*4882a593Smuzhiyun struct btc_wifi_link_info *link_info = &btc->wifi_link_info;
3346*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3347*4882a593Smuzhiyun u8 table_case = 0xff, tdma_case = 0xff, ant_phase;
3348*4882a593Smuzhiyun
3349*4882a593Smuzhiyun if (rfe_type->ant_switch_with_bt)
3350*4882a593Smuzhiyun ant_phase = BTC_ANT_2G_FREERUN;
3351*4882a593Smuzhiyun else
3352*4882a593Smuzhiyun ant_phase = BTC_ANT_2G;
3353*4882a593Smuzhiyun
3354*4882a593Smuzhiyun rtw_btc_set_rf_para(btc, NM_EXCU, btc->chip_para->wl_rf_para_rx[0]);
3355*4882a593Smuzhiyun
3356*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
3357*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_FIX2M, FALSE);
3358*4882a593Smuzhiyun else
3359*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_FIX2M, FALSE);
3360*4882a593Smuzhiyun
3361*4882a593Smuzhiyun if (coex_sta->bt_disabled) {
3362*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3363*4882a593Smuzhiyun "[BTCoex], %s(): BT Disable!!\n", __func__);
3364*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3365*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3366*4882a593Smuzhiyun
3367*4882a593Smuzhiyun table_case = 0;
3368*4882a593Smuzhiyun tdma_case = 0;
3369*4882a593Smuzhiyun } else if (btc->board_info.btdm_ant_num == 2) { /* Non-Shared-Ant */
3370*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3371*4882a593Smuzhiyun "[BTCoex], %s(): Non_Shared_Ant!!\n", __func__);
3372*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3373*4882a593Smuzhiyun
3374*4882a593Smuzhiyun rtw_btc_action_freerun(btc);
3375*4882a593Smuzhiyun return;
3376*4882a593Smuzhiyun } else if (coex_sta->bt_setup_link) {
3377*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3378*4882a593Smuzhiyun "[BTCoex], %s(): BT Relink!!\n", __func__);
3379*4882a593Smuzhiyun
3380*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, ant_phase);
3381*4882a593Smuzhiyun
3382*4882a593Smuzhiyun table_case = 1;
3383*4882a593Smuzhiyun tdma_case = 0;
3384*4882a593Smuzhiyun } else if (coex_sta->bt_inq_page) {
3385*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3386*4882a593Smuzhiyun "[BTCoex], %s(): BT Inq-Page!!\n", __func__);
3387*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3388*4882a593Smuzhiyun
3389*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, ant_phase);
3390*4882a593Smuzhiyun
3391*4882a593Smuzhiyun table_case = 15;
3392*4882a593Smuzhiyun tdma_case = 2;
3393*4882a593Smuzhiyun } else if (coex_sta->bt_profile_num == 0) {
3394*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3395*4882a593Smuzhiyun "[BTCoex], %s(): BT idle!!\n", __func__);
3396*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3397*4882a593Smuzhiyun
3398*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, ant_phase);
3399*4882a593Smuzhiyun
3400*4882a593Smuzhiyun if (btc->chip_interface == BTC_INTF_PCI &&
3401*4882a593Smuzhiyun (link_info->link_mode == BTC_LINK_ONLY_GO ||
3402*4882a593Smuzhiyun link_info->link_mode == BTC_LINK_ONLY_GC) &&
3403*4882a593Smuzhiyun coex_sta->wl_gl_busy)
3404*4882a593Smuzhiyun table_case = 3;
3405*4882a593Smuzhiyun else
3406*4882a593Smuzhiyun table_case = 1;
3407*4882a593Smuzhiyun
3408*4882a593Smuzhiyun tdma_case = 0;
3409*4882a593Smuzhiyun } else if (coex_sta->wl_linkscan_proc) {
3410*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3411*4882a593Smuzhiyun "[BTCoex], %s(): WL scan!!\n", __func__);
3412*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3413*4882a593Smuzhiyun
3414*4882a593Smuzhiyun rtw_btc_action_wl_linkscan(btc);
3415*4882a593Smuzhiyun } else {
3416*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3417*4882a593Smuzhiyun "[BTCoex], %s(): BT busy!!\n", __func__);
3418*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3419*4882a593Smuzhiyun
3420*4882a593Smuzhiyun switch (link_info->link_mode) {
3421*4882a593Smuzhiyun case BTC_LINK_2G_SCC_GC_STA:
3422*4882a593Smuzhiyun case BTC_LINK_2G_SCC_GO_STA:
3423*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3424*4882a593Smuzhiyun rtw_btc_action_wl_scc2g(btc);
3425*4882a593Smuzhiyun break;
3426*4882a593Smuzhiyun case BTC_LINK_ONLY_GO:
3427*4882a593Smuzhiyun case BTC_LINK_ONLY_GC:
3428*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, BTC_ANT_2G);
3429*4882a593Smuzhiyun #ifdef PLATFORM_WINDOWS
3430*4882a593Smuzhiyun if (btc->chip_interface == BTC_INTF_PCI &&
3431*4882a593Smuzhiyun coex_sta->bt_a2dp_exist && !coex_sta->bt_multi_link)
3432*4882a593Smuzhiyun table_case = 3;
3433*4882a593Smuzhiyun else
3434*4882a593Smuzhiyun #endif
3435*4882a593Smuzhiyun table_case = 2;
3436*4882a593Smuzhiyun
3437*4882a593Smuzhiyun tdma_case = 0;
3438*4882a593Smuzhiyun break;
3439*4882a593Smuzhiyun default:
3440*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, NM_EXCU, ant_phase);
3441*4882a593Smuzhiyun table_case = 2;
3442*4882a593Smuzhiyun tdma_case = 0;
3443*4882a593Smuzhiyun break;
3444*4882a593Smuzhiyun }
3445*4882a593Smuzhiyun }
3446*4882a593Smuzhiyun
3447*4882a593Smuzhiyun if (table_case != 0xff && tdma_case != 0xff) {
3448*4882a593Smuzhiyun rtw_btc_table(btc, NM_EXCU, table_case);
3449*4882a593Smuzhiyun rtw_btc_tdma(btc, NM_EXCU, tdma_case);
3450*4882a593Smuzhiyun }
3451*4882a593Smuzhiyun }
3452*4882a593Smuzhiyun
rtw_btc_run_coex(struct btc_coexist * btc,u8 reason)3453*4882a593Smuzhiyun static void rtw_btc_run_coex(struct btc_coexist *btc, u8 reason)
3454*4882a593Smuzhiyun {
3455*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
3456*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3457*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
3458*4882a593Smuzhiyun struct btc_wifi_link_info *link_info = &btc->wifi_link_info;
3459*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3460*4882a593Smuzhiyun
3461*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3462*4882a593Smuzhiyun "[BTCoex], %s(): reason = %d\n", __func__, reason);
3463*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3464*4882a593Smuzhiyun
3465*4882a593Smuzhiyun coex_sta->coex_run_reason = reason;
3466*4882a593Smuzhiyun
3467*4882a593Smuzhiyun /* update wifi_link_info_ext variable */
3468*4882a593Smuzhiyun rtw_btc_update_wl_link_info(btc, reason);
3469*4882a593Smuzhiyun
3470*4882a593Smuzhiyun rtw_btc_monitor_bt_enable(btc);
3471*4882a593Smuzhiyun
3472*4882a593Smuzhiyun if (btc->manual_control) {
3473*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3474*4882a593Smuzhiyun "[BTCoex], return for Manual CTRL!!\n");
3475*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3476*4882a593Smuzhiyun return;
3477*4882a593Smuzhiyun }
3478*4882a593Smuzhiyun
3479*4882a593Smuzhiyun if (btc->stop_coex_dm) {
3480*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3481*4882a593Smuzhiyun "[BTCoex], return for Stop Coex DM!!\n");
3482*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3483*4882a593Smuzhiyun return;
3484*4882a593Smuzhiyun }
3485*4882a593Smuzhiyun
3486*4882a593Smuzhiyun if (coex_sta->wl_under_ips) {
3487*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3488*4882a593Smuzhiyun "[BTCoex], return for wifi is under IPS!!\n");
3489*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3490*4882a593Smuzhiyun return;
3491*4882a593Smuzhiyun }
3492*4882a593Smuzhiyun
3493*4882a593Smuzhiyun if (coex_sta->wl_under_lps && link_info_ext->is_32k) {
3494*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3495*4882a593Smuzhiyun "[BTCoex], return for wifi is under LPS-32K!!\n");
3496*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3497*4882a593Smuzhiyun return;
3498*4882a593Smuzhiyun }
3499*4882a593Smuzhiyun
3500*4882a593Smuzhiyun if (coex_sta->coex_freeze && reason == BTC_RSN_BTINFO &&
3501*4882a593Smuzhiyun !coex_sta->bt_setup_link) {
3502*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3503*4882a593Smuzhiyun "[BTCoex], return for coex_freeze!!\n");
3504*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3505*4882a593Smuzhiyun return;
3506*4882a593Smuzhiyun }
3507*4882a593Smuzhiyun
3508*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXRUN]++;
3509*4882a593Smuzhiyun coex_sta->coex_freerun = FALSE;
3510*4882a593Smuzhiyun
3511*4882a593Smuzhiyun /* Pure-5G Coex Process */
3512*4882a593Smuzhiyun if (link_info_ext->is_all_under_5g) {
3513*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_5G;
3514*4882a593Smuzhiyun rtw_btc_action_wl_under5g(btc);
3515*4882a593Smuzhiyun goto exit;
3516*4882a593Smuzhiyun }
3517*4882a593Smuzhiyun
3518*4882a593Smuzhiyun if (link_info_ext->is_mcc_25g) {
3519*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_25GMPORT;
3520*4882a593Smuzhiyun rtw_btc_action_wl_mcc25g(btc);
3521*4882a593Smuzhiyun goto exit;
3522*4882a593Smuzhiyun }
3523*4882a593Smuzhiyun
3524*4882a593Smuzhiyun /* if multi-port, P2P-GO, P2P-GC */
3525*4882a593Smuzhiyun if (link_info_ext->num_of_active_port > 1 ||
3526*4882a593Smuzhiyun (link_info->link_mode == BTC_LINK_ONLY_GO &&
3527*4882a593Smuzhiyun !link_info_ext->is_ap_mode) ||
3528*4882a593Smuzhiyun link_info->link_mode == BTC_LINK_ONLY_GC) {
3529*4882a593Smuzhiyun if (link_info->link_mode == BTC_LINK_ONLY_GO)
3530*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2GGO;
3531*4882a593Smuzhiyun else if (link_info->link_mode == BTC_LINK_ONLY_GC)
3532*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2GGC;
3533*4882a593Smuzhiyun else
3534*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2GMPORT;
3535*4882a593Smuzhiyun rtw_btc_action_wl_p2p2g(btc);
3536*4882a593Smuzhiyun goto exit;
3537*4882a593Smuzhiyun }
3538*4882a593Smuzhiyun
3539*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3540*4882a593Smuzhiyun "[BTCoex], WiFi is single-port 2G!!\n");
3541*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3542*4882a593Smuzhiyun
3543*4882a593Smuzhiyun coex_sta->wl_coex_mode = BTC_WLINK_2G1PORT;
3544*4882a593Smuzhiyun
3545*4882a593Smuzhiyun if (coex_sta->bt_disabled) {
3546*4882a593Smuzhiyun if (!link_info_ext->is_connected)
3547*4882a593Smuzhiyun rtw_btc_action_wl_not_connected(btc);
3548*4882a593Smuzhiyun else
3549*4882a593Smuzhiyun rtw_btc_action_wl_only(btc);
3550*4882a593Smuzhiyun goto exit;
3551*4882a593Smuzhiyun }
3552*4882a593Smuzhiyun
3553*4882a593Smuzhiyun if (coex_sta->wl_under_lps && !coex_sta->wl_force_lps_ctrl) {
3554*4882a593Smuzhiyun rtw_btc_action_wl_native_lps(btc);
3555*4882a593Smuzhiyun goto exit;
3556*4882a593Smuzhiyun }
3557*4882a593Smuzhiyun
3558*4882a593Smuzhiyun if (coex_sta->bt_whck_test) {
3559*4882a593Smuzhiyun rtw_btc_action_bt_whql_test(btc);
3560*4882a593Smuzhiyun goto exit;
3561*4882a593Smuzhiyun }
3562*4882a593Smuzhiyun
3563*4882a593Smuzhiyun if (coex_sta->bt_setup_link) {
3564*4882a593Smuzhiyun rtw_btc_action_bt_relink(btc);
3565*4882a593Smuzhiyun goto exit;
3566*4882a593Smuzhiyun }
3567*4882a593Smuzhiyun
3568*4882a593Smuzhiyun if (coex_sta->bt_inq_page) {
3569*4882a593Smuzhiyun rtw_btc_action_bt_inquiry(btc);
3570*4882a593Smuzhiyun goto exit;
3571*4882a593Smuzhiyun }
3572*4882a593Smuzhiyun
3573*4882a593Smuzhiyun if ((coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE ||
3574*4882a593Smuzhiyun coex_dm->bt_status == BTC_BTSTATUS_CON_IDLE) &&
3575*4882a593Smuzhiyun link_info_ext->is_connected) {
3576*4882a593Smuzhiyun rtw_btc_action_bt_idle(btc);
3577*4882a593Smuzhiyun goto exit;
3578*4882a593Smuzhiyun }
3579*4882a593Smuzhiyun
3580*4882a593Smuzhiyun if (coex_sta->wl_linkscan_proc && !coex_sta->coex_freerun) {
3581*4882a593Smuzhiyun rtw_btc_action_wl_linkscan(btc);
3582*4882a593Smuzhiyun goto exit;
3583*4882a593Smuzhiyun }
3584*4882a593Smuzhiyun
3585*4882a593Smuzhiyun if (link_info_ext->is_connected) {
3586*4882a593Smuzhiyun rtw_btc_action_wl_connected(btc);
3587*4882a593Smuzhiyun goto exit;
3588*4882a593Smuzhiyun } else {
3589*4882a593Smuzhiyun rtw_btc_action_wl_not_connected(btc);
3590*4882a593Smuzhiyun goto exit;
3591*4882a593Smuzhiyun }
3592*4882a593Smuzhiyun
3593*4882a593Smuzhiyun exit:
3594*4882a593Smuzhiyun #ifdef PLATFORM_WINDOWS
3595*4882a593Smuzhiyun /* 0:original, 1:1R */
3596*4882a593Smuzhiyun if (coex_sta->wl_coex_mode == BTC_WLINK_2GFREE &&
3597*4882a593Smuzhiyun chip_para->rx_path_num >= 2)
3598*4882a593Smuzhiyun rtw_btc_mimo_ps(btc, FC_EXCU, 1);
3599*4882a593Smuzhiyun else
3600*4882a593Smuzhiyun rtw_btc_mimo_ps(btc, FC_EXCU, 0);
3601*4882a593Smuzhiyun #endif
3602*4882a593Smuzhiyun
3603*4882a593Smuzhiyun rtw_btc_gnt_workaround(btc, NM_EXCU, coex_sta->wl_coex_mode);
3604*4882a593Smuzhiyun rtw_btc_limited_wl(btc);
3605*4882a593Smuzhiyun }
3606*4882a593Smuzhiyun
rtw_btc_init_coex_var(struct btc_coexist * btc)3607*4882a593Smuzhiyun static void rtw_btc_init_coex_var(struct btc_coexist *btc)
3608*4882a593Smuzhiyun {
3609*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3610*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
3611*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3612*4882a593Smuzhiyun u8 i;
3613*4882a593Smuzhiyun
3614*4882a593Smuzhiyun /* Reset Coex variable */
3615*4882a593Smuzhiyun btc->btc_set(btc, BTC_SET_RESET_COEX_VAR, NULL);
3616*4882a593Smuzhiyun
3617*4882a593Smuzhiyun /* Init Coex variables that are not zero */
3618*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(coex_dm->bt_rssi_state); i++)
3619*4882a593Smuzhiyun coex_dm->bt_rssi_state[i] = BTC_RSSI_STATE_LOW;
3620*4882a593Smuzhiyun
3621*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(coex_dm->wl_rssi_state); i++)
3622*4882a593Smuzhiyun coex_dm->wl_rssi_state[i] = BTC_RSSI_STATE_LOW;
3623*4882a593Smuzhiyun
3624*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(coex_sta->bt_sut_pwr_lvl); i++)
3625*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[i] = 0xff;
3626*4882a593Smuzhiyun
3627*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac = 0xffff;
3628*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ae = 0xffff;
3629*4882a593Smuzhiyun
3630*4882a593Smuzhiyun coex_sta->gnt_workaround_state = BTC_WLINK_MAX;
3631*4882a593Smuzhiyun btc->bt_info.bt_get_fw_ver = 0;
3632*4882a593Smuzhiyun }
3633*4882a593Smuzhiyun
3634*4882a593Smuzhiyun static void
rtw_btc_init_hw_config(struct btc_coexist * btc,boolean wifi_only)3635*4882a593Smuzhiyun rtw_btc_init_hw_config(struct btc_coexist *btc, boolean wifi_only)
3636*4882a593Smuzhiyun {
3637*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3638*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3639*4882a593Smuzhiyun u8 table_case = 1, tdma_case = 0;
3640*4882a593Smuzhiyun
3641*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3642*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3643*4882a593Smuzhiyun
3644*4882a593Smuzhiyun /* init coex_dm, coex_sta variable to sync with chip status */
3645*4882a593Smuzhiyun rtw_btc_init_coex_var(btc);
3646*4882a593Smuzhiyun
3647*4882a593Smuzhiyun /* 0xf0[15:12] --> chip kt info */
3648*4882a593Smuzhiyun coex_sta->kt_ver = (btc->btc_read_1byte(btc, 0xf1) & 0xf0) >> 4;
3649*4882a593Smuzhiyun
3650*4882a593Smuzhiyun rtw_btc_monitor_bt_enable(btc);
3651*4882a593Smuzhiyun
3652*4882a593Smuzhiyun /* TBTT enable */
3653*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION,
3654*4882a593Smuzhiyun 0x1);
3655*4882a593Smuzhiyun
3656*4882a593Smuzhiyun /* Setup RF front end type */
3657*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_RFE_TYPE);
3658*4882a593Smuzhiyun
3659*4882a593Smuzhiyun /* Init coex relared register */
3660*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_INIT_HW);
3661*4882a593Smuzhiyun
3662*4882a593Smuzhiyun /* set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) */
3663*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_TX_RSP, 1);
3664*4882a593Smuzhiyun
3665*4882a593Smuzhiyun /* set Tx beacon = Hi-Pri */
3666*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_TX_BEACON, 1);
3667*4882a593Smuzhiyun
3668*4882a593Smuzhiyun /* set Tx beacon queue = Hi-Pri */
3669*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_TX_BEACONQ, 1);
3670*4882a593Smuzhiyun
3671*4882a593Smuzhiyun /* Antenna config */
3672*4882a593Smuzhiyun if (btc->wl_rf_state_off) {
3673*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_WOFF);
3674*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
3675*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ALL, FALSE);
3676*4882a593Smuzhiyun else
3677*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ALL_32BIT, FALSE);
3678*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
3679*4882a593Smuzhiyun
3680*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3681*4882a593Smuzhiyun "[BTCoex], %s(): RF Off\n", __func__);
3682*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3683*4882a593Smuzhiyun } else if (wifi_only) {
3684*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_WONLY);
3685*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
3686*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
3687*4882a593Smuzhiyun else
3688*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
3689*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
3690*4882a593Smuzhiyun } else {
3691*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_INIT);
3692*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
3693*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
3694*4882a593Smuzhiyun else
3695*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
3696*4882a593Smuzhiyun btc->stop_coex_dm = FALSE;
3697*4882a593Smuzhiyun coex_sta->coex_freeze = TRUE;
3698*4882a593Smuzhiyun }
3699*4882a593Smuzhiyun
3700*4882a593Smuzhiyun /* PTA parameter */
3701*4882a593Smuzhiyun rtw_btc_table(btc, FC_EXCU, table_case);
3702*4882a593Smuzhiyun rtw_btc_tdma(btc, FC_EXCU, tdma_case);
3703*4882a593Smuzhiyun
3704*4882a593Smuzhiyun rtw_btc_query_bt_info(btc);
3705*4882a593Smuzhiyun }
3706*4882a593Smuzhiyun
rtw_btc_ex_power_on_setting(struct btc_coexist * btc)3707*4882a593Smuzhiyun void rtw_btc_ex_power_on_setting(struct btc_coexist *btc)
3708*4882a593Smuzhiyun {
3709*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3710*4882a593Smuzhiyun struct btc_board_info *board_info = &btc->board_info;
3711*4882a593Smuzhiyun u8 table_case = 1;
3712*4882a593Smuzhiyun
3713*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3714*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3715*4882a593Smuzhiyun
3716*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
3717*4882a593Smuzhiyun btc->wl_rf_state_off = FALSE;
3718*4882a593Smuzhiyun
3719*4882a593Smuzhiyun /* enable BB, REG_SYS_FUNC_EN to write reg correctly. */
3720*4882a593Smuzhiyun btc->btc_write_1byte_bitmask(btc, REG_SYS_FUNC_EN,
3721*4882a593Smuzhiyun BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB, 0x3);
3722*4882a593Smuzhiyun
3723*4882a593Smuzhiyun rtw_btc_monitor_bt_enable(btc);
3724*4882a593Smuzhiyun
3725*4882a593Smuzhiyun /* Setup RF front end type */
3726*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_RFE_TYPE);
3727*4882a593Smuzhiyun
3728*4882a593Smuzhiyun /* Set Antenna Path to BT side */
3729*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_POWERON);
3730*4882a593Smuzhiyun
3731*4882a593Smuzhiyun rtw_btc_table(btc, FC_EXCU, table_case);
3732*4882a593Smuzhiyun
3733*4882a593Smuzhiyun /* SD1 Chunchu red x issue */
3734*4882a593Smuzhiyun btc->btc_write_1byte(btc, 0xff1a, 0x0);
3735*4882a593Smuzhiyun
3736*4882a593Smuzhiyun rtw_btc_gnt_debug(btc, TRUE);
3737*4882a593Smuzhiyun
3738*4882a593Smuzhiyun board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
3739*4882a593Smuzhiyun }
3740*4882a593Smuzhiyun
rtw_btc_ex_pre_load_firmware(struct btc_coexist * btc)3741*4882a593Smuzhiyun void rtw_btc_ex_pre_load_firmware(struct btc_coexist *btc) {}
3742*4882a593Smuzhiyun
rtw_btc_ex_init_hw_config(struct btc_coexist * btc,boolean wifi_only)3743*4882a593Smuzhiyun void rtw_btc_ex_init_hw_config(struct btc_coexist *btc, boolean wifi_only)
3744*4882a593Smuzhiyun {
3745*4882a593Smuzhiyun rtw_btc_init_hw_config(btc, wifi_only);
3746*4882a593Smuzhiyun }
3747*4882a593Smuzhiyun
rtw_btc_ex_init_coex_dm(struct btc_coexist * btc)3748*4882a593Smuzhiyun void rtw_btc_ex_init_coex_dm(struct btc_coexist *btc)
3749*4882a593Smuzhiyun {
3750*4882a593Smuzhiyun }
3751*4882a593Smuzhiyun
rtw_btc_ex_display_simple_coex_info(struct btc_coexist * btc)3752*4882a593Smuzhiyun void rtw_btc_ex_display_simple_coex_info(struct btc_coexist *btc)
3753*4882a593Smuzhiyun {
3754*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3755*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
3756*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3757*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
3758*4882a593Smuzhiyun struct btc_board_info *board_info = &btc->board_info;
3759*4882a593Smuzhiyun
3760*4882a593Smuzhiyun u8 *cli_buf = btc->cli_buf;
3761*4882a593Smuzhiyun u32 bt_patch_ver = 0, bt_coex_ver = 0, val = 0;
3762*4882a593Smuzhiyun
3763*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3764*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3765*4882a593Smuzhiyun
3766*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n _____[BT Coexist info]____");
3767*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3768*4882a593Smuzhiyun
3769*4882a593Smuzhiyun if (btc->manual_control) {
3770*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3771*4882a593Smuzhiyun "\r\n __[Under Manual Control]_");
3772*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3773*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3774*4882a593Smuzhiyun "\r\n _________________________");
3775*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3776*4882a593Smuzhiyun }
3777*4882a593Smuzhiyun
3778*4882a593Smuzhiyun if (btc->stop_coex_dm) {
3779*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3780*4882a593Smuzhiyun "\r\n ____[Coex is STOPPED]____");
3781*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3782*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3783*4882a593Smuzhiyun "\r\n _________________________");
3784*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3785*4882a593Smuzhiyun }
3786*4882a593Smuzhiyun
3787*4882a593Smuzhiyun if (!coex_sta->bt_disabled &&
3788*4882a593Smuzhiyun (coex_sta->bt_supported_version == 0 ||
3789*4882a593Smuzhiyun coex_sta->bt_supported_version == 0xffff) &&
3790*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXINFO2] % 3 == 0) {
3791*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_SUPPORTED_FEATURE,
3792*4882a593Smuzhiyun &coex_sta->bt_supported_feature);
3793*4882a593Smuzhiyun
3794*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_SUPPORTED_VERSION,
3795*4882a593Smuzhiyun &coex_sta->bt_supported_version);
3796*4882a593Smuzhiyun
3797*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 3, 0xac);
3798*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac = (u16)(val & 0xffff);
3799*4882a593Smuzhiyun
3800*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 3, 0xae);
3801*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ae = (u16)(val & 0xffff);
3802*4882a593Smuzhiyun
3803*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3804*4882a593Smuzhiyun btc->bt_info.bt_get_fw_ver = bt_patch_ver;
3805*4882a593Smuzhiyun }
3806*4882a593Smuzhiyun
3807*4882a593Smuzhiyun /* BT coex. info. */
3808*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3809*4882a593Smuzhiyun "\r\n %-35s = %d/ %d/ %s / %d",
3810*4882a593Smuzhiyun "Ant PG Num/ Mech/ Pos/ RFE", board_info->pg_ant_num,
3811*4882a593Smuzhiyun board_info->btdm_ant_num,
3812*4882a593Smuzhiyun (board_info->btdm_ant_pos ==
3813*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT ? "Main" : "Aux"),
3814*4882a593Smuzhiyun rfe_type->rfe_module_type);
3815*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3816*4882a593Smuzhiyun
3817*4882a593Smuzhiyun bt_coex_ver = ((coex_sta->bt_supported_version & 0xff00) >> 8);
3818*4882a593Smuzhiyun
3819*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3820*4882a593Smuzhiyun "\r\n %-35s = %d_%02x/ %d_%02x/ 0x%02x/ 0x%02x (%s)",
3821*4882a593Smuzhiyun "Ver Coex/ Para/ BT_Dez/ BT_Rpt",
3822*4882a593Smuzhiyun coex_ver_date, coex_ver, chip_para->para_ver_date,
3823*4882a593Smuzhiyun chip_para->para_ver, chip_para->bt_desired_ver, bt_coex_ver,
3824*4882a593Smuzhiyun (bt_coex_ver == 0xff ? "Unknown" :
3825*4882a593Smuzhiyun (coex_sta->bt_disabled ? "BT-disable" :
3826*4882a593Smuzhiyun (bt_coex_ver >= chip_para->bt_desired_ver ?
3827*4882a593Smuzhiyun "Match" : "Mis-Match"))));
3828*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3829*4882a593Smuzhiyun
3830*4882a593Smuzhiyun /* BT Status */
3831*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT status",
3832*4882a593Smuzhiyun ((coex_sta->bt_disabled) ? ("disabled") :
3833*4882a593Smuzhiyun ((coex_sta->bt_inq_page) ? ("inquiry/page") :
3834*4882a593Smuzhiyun ((coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) ?
3835*4882a593Smuzhiyun "non-connected idle" :
3836*4882a593Smuzhiyun ((coex_dm->bt_status == BTC_BTSTATUS_CON_IDLE) ?
3837*4882a593Smuzhiyun "connected-idle" : "busy")))));
3838*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3839*4882a593Smuzhiyun
3840*4882a593Smuzhiyun /* HW Settings */
3841*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3842*4882a593Smuzhiyun "0x770(Hi-pri rx/tx)", coex_sta->hi_pri_rx,
3843*4882a593Smuzhiyun coex_sta->hi_pri_tx);
3844*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3845*4882a593Smuzhiyun
3846*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d %s",
3847*4882a593Smuzhiyun "0x774(Lo-pri rx/tx)", coex_sta->lo_pri_rx,
3848*4882a593Smuzhiyun coex_sta->lo_pri_tx, (coex_sta->bt_slave ?
3849*4882a593Smuzhiyun "(Slave!!)" : ""));
3850*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3851*4882a593Smuzhiyun
3852*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXINFO2]++;
3853*4882a593Smuzhiyun }
3854*4882a593Smuzhiyun
rtw_btc_ex_display_coex_info(struct btc_coexist * btc)3855*4882a593Smuzhiyun void rtw_btc_ex_display_coex_info(struct btc_coexist *btc)
3856*4882a593Smuzhiyun {
3857*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
3858*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
3859*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
3860*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
3861*4882a593Smuzhiyun struct btc_board_info *board_info = &btc->board_info;
3862*4882a593Smuzhiyun
3863*4882a593Smuzhiyun u8 *cli_buf = btc->cli_buf, i, ps_tdma_case = 0;
3864*4882a593Smuzhiyun u16 scbd;
3865*4882a593Smuzhiyun u32 phy_ver = 0, fw_ver = 0,
3866*4882a593Smuzhiyun bt_coex_ver = 0, val = 0,
3867*4882a593Smuzhiyun fa_ofdm, fa_cck, cca_ofdm, cca_cck,
3868*4882a593Smuzhiyun ok_11b, ok_11g, ok_11n, ok_11vht,
3869*4882a593Smuzhiyun err_11b, err_11g, err_11n, err_11vht,
3870*4882a593Smuzhiyun scbd_32, bt_slot_max , bt_slot_min, bt_slot_sum = 0;
3871*4882a593Smuzhiyun boolean is_bt_reply = FALSE;
3872*4882a593Smuzhiyun u8 * const p = &coex_sta->bt_afh_map[0];
3873*4882a593Smuzhiyun
3874*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
3875*4882a593Smuzhiyun BTC_TRACE(trace_buf);
3876*4882a593Smuzhiyun
3877*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3878*4882a593Smuzhiyun "\r\n ============[BT Coexist info %s]============",
3879*4882a593Smuzhiyun chip_para->chip_name);
3880*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3881*4882a593Smuzhiyun
3882*4882a593Smuzhiyun if (btc->manual_control) {
3883*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3884*4882a593Smuzhiyun "\r\n ============[Under Manual Control]============");
3885*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3886*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3887*4882a593Smuzhiyun "\r\n ==========================================");
3888*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3889*4882a593Smuzhiyun } else if (btc->stop_coex_dm) {
3890*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3891*4882a593Smuzhiyun "\r\n ============[Coex is STOPPED]============");
3892*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3893*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3894*4882a593Smuzhiyun "\r\n ==========================================");
3895*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3896*4882a593Smuzhiyun } else if (coex_sta->coex_freeze) {
3897*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3898*4882a593Smuzhiyun "\r\n ============[coex_freeze]============");
3899*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3900*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3901*4882a593Smuzhiyun "\r\n ==========================================");
3902*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3903*4882a593Smuzhiyun }
3904*4882a593Smuzhiyun
3905*4882a593Smuzhiyun if (!coex_sta->bt_disabled &&
3906*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXINFO1] % 3 == 0) {
3907*4882a593Smuzhiyun if (coex_sta->bt_supported_version == 0 ||
3908*4882a593Smuzhiyun coex_sta->bt_supported_version == 0xffff) {
3909*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_SUPPORTED_VERSION,
3910*4882a593Smuzhiyun &coex_sta->bt_supported_version);
3911*4882a593Smuzhiyun
3912*4882a593Smuzhiyun if (coex_sta->bt_supported_version > 0 &&
3913*4882a593Smuzhiyun coex_sta->bt_supported_version < 0xffff)
3914*4882a593Smuzhiyun is_bt_reply = TRUE;
3915*4882a593Smuzhiyun } else {
3916*4882a593Smuzhiyun is_bt_reply = TRUE;
3917*4882a593Smuzhiyun }
3918*4882a593Smuzhiyun
3919*4882a593Smuzhiyun if (coex_dm->bt_status != BTC_BTSTATUS_NCON_IDLE) {
3920*4882a593Smuzhiyun btc->btc_get_bt_afh_map_from_bt(btc, 0, p);
3921*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 1, 0xa);
3922*4882a593Smuzhiyun coex_sta->bt_reg_modem_a = (u16)((val & 0x1c0) >> 6);
3923*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 0, 0x2);
3924*4882a593Smuzhiyun coex_sta->bt_reg_rf_2 = (u16)val;
3925*4882a593Smuzhiyun }
3926*4882a593Smuzhiyun }
3927*4882a593Smuzhiyun
3928*4882a593Smuzhiyun if (is_bt_reply) {
3929*4882a593Smuzhiyun if (coex_sta->bt_supported_feature == 0) {
3930*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_SUPPORTED_FEATURE,
3931*4882a593Smuzhiyun &coex_sta->bt_supported_feature);
3932*4882a593Smuzhiyun
3933*4882a593Smuzhiyun if (coex_sta->bt_supported_feature & BIT(11))
3934*4882a593Smuzhiyun coex_sta->bt_slave_latency = TRUE;
3935*4882a593Smuzhiyun else
3936*4882a593Smuzhiyun coex_sta->bt_slave_latency = FALSE;
3937*4882a593Smuzhiyun }
3938*4882a593Smuzhiyun
3939*4882a593Smuzhiyun if (strcmp(btc->chip_para->chip_name, "8723f") == 0) {
3940*4882a593Smuzhiyun /*8723f cannot read ae because ALIGNMENT_UNIT = 4byte
3941*4882a593Smuzhiyun 8723f should read bt vendor reg 0xdac*/
3942*4882a593Smuzhiyun if (coex_sta->bt_reg_vendor_dac == 0xffffffff) {
3943*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 3, 0xdac);
3944*4882a593Smuzhiyun coex_sta->bt_reg_vendor_dac = val;
3945*4882a593Smuzhiyun }
3946*4882a593Smuzhiyun } else {
3947*4882a593Smuzhiyun if (coex_sta->bt_reg_vendor_ac == 0xffff) {
3948*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 3, 0xac);
3949*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac = (u16)(val & 0xffff);
3950*4882a593Smuzhiyun }
3951*4882a593Smuzhiyun
3952*4882a593Smuzhiyun if (coex_sta->bt_reg_vendor_ae == 0xffff) {
3953*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 3, 0xae);
3954*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ae = (u16)(val & 0xffff);
3955*4882a593Smuzhiyun }
3956*4882a593Smuzhiyun }
3957*4882a593Smuzhiyun
3958*4882a593Smuzhiyun val = btc->btc_get_bt_reg(btc, 4, 0x200);
3959*4882a593Smuzhiyun coex_sta->bt_reg_le_200 = (u16)(val & 0xffff);
3960*4882a593Smuzhiyun
3961*4882a593Smuzhiyun if (btc->bt_info.bt_get_fw_ver == 0)
3962*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_BT_PATCH_VER,
3963*4882a593Smuzhiyun &btc->bt_info.bt_get_fw_ver);
3964*4882a593Smuzhiyun
3965*4882a593Smuzhiyun if (coex_sta->bt_a2dp_exist &&
3966*4882a593Smuzhiyun coex_sta->bt_a2dp_vendor_id == 0 &&
3967*4882a593Smuzhiyun coex_sta->bt_a2dp_device_name == 0) {
3968*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_BT_DEVICE_INFO, &val);
3969*4882a593Smuzhiyun coex_sta->bt_a2dp_vendor_id = (u8)(val & 0xff);
3970*4882a593Smuzhiyun coex_sta->bt_a2dp_device_name = (val & 0xffffff00) >> 8;
3971*4882a593Smuzhiyun }
3972*4882a593Smuzhiyun
3973*4882a593Smuzhiyun if (coex_sta->bt_a2dp_exist &&
3974*4882a593Smuzhiyun coex_sta->bt_a2dp_flush_time == 0) {
3975*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_BT_A2DP_FLUSH_VAL, &val);
3976*4882a593Smuzhiyun coex_sta->bt_a2dp_flush_time = val;
3977*4882a593Smuzhiyun }
3978*4882a593Smuzhiyun }
3979*4882a593Smuzhiyun
3980*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %s/ %s / %d/ %d",
3981*4882a593Smuzhiyun "Ant PG Num/ Mech/ Pos/ RFE/ Dist", board_info->pg_ant_num,
3982*4882a593Smuzhiyun (board_info->btdm_ant_num == 1 ? "Shared" : "Non-Shared"),
3983*4882a593Smuzhiyun (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT ?
3984*4882a593Smuzhiyun "Main" : "Aux"), rfe_type->rfe_module_type,
3985*4882a593Smuzhiyun board_info->ant_distance);
3986*4882a593Smuzhiyun CL_PRINTF(cli_buf);
3987*4882a593Smuzhiyun
3988*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3989*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U4_WIFI_PHY_VER, &phy_ver);
3990*4882a593Smuzhiyun bt_coex_ver = ((coex_sta->bt_supported_version & 0xff00) >> 8);
3991*4882a593Smuzhiyun
3992*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3993*4882a593Smuzhiyun "\r\n %-35s = %d_%02x/ %d_%02x/ 0x%02x/ 0x%02x (%s)",
3994*4882a593Smuzhiyun "Ver Coex/ Para/ BT_Dez/ BT_Rpt",
3995*4882a593Smuzhiyun coex_ver_date, coex_ver, chip_para->para_ver_date,
3996*4882a593Smuzhiyun chip_para->para_ver, chip_para->bt_desired_ver, bt_coex_ver,
3997*4882a593Smuzhiyun (bt_coex_ver == 0xff ? "Unknown" :
3998*4882a593Smuzhiyun (coex_sta->bt_disabled ? "BT-disable" :
3999*4882a593Smuzhiyun (bt_coex_ver >= chip_para->bt_desired_ver ?
4000*4882a593Smuzhiyun "Match" : "Mis-Match"))));
4001*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4002*4882a593Smuzhiyun
4003*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4004*4882a593Smuzhiyun "\r\n %-35s = 0x%x(%s)/ 0x%08x/ v%d/ %c",
4005*4882a593Smuzhiyun "W_FW/ B_FW/ Phy/ Kt", fw_ver,
4006*4882a593Smuzhiyun (fw_ver >= chip_para->wl_desired_ver ? "Match" : "Mis-Match"),
4007*4882a593Smuzhiyun btc->bt_info.bt_get_fw_ver, phy_ver, coex_sta->kt_ver + 65);
4008*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4009*4882a593Smuzhiyun
4010*4882a593Smuzhiyun /* wifi status */
4011*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4012*4882a593Smuzhiyun "============[Wifi Status]============");
4013*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4014*4882a593Smuzhiyun btc->btc_disp_dbg_msg(btc, BTC_DBG_DISP_WIFI_STATUS);
4015*4882a593Smuzhiyun
4016*4882a593Smuzhiyun /*EXT CHIP status*/
4017*4882a593Smuzhiyun if (btc->board_info.ext_chip_id != BTC_EXT_CHIP_NONE) {
4018*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4019*4882a593Smuzhiyun "============[EXT CHIP Status]============");
4020*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4021*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s",
4022*4882a593Smuzhiyun "EXT CHIP ID/EXT CHIP mode",
4023*4882a593Smuzhiyun ((btc->board_info.ext_chip_id ==
4024*4882a593Smuzhiyun BTC_EXT_CHIP_RF4CE) ? "RF4CE" : "unknown"),
4025*4882a593Smuzhiyun ((coex_sta->ext_chip_mode ==
4026*4882a593Smuzhiyun BTC_EXTMODE_VOICE) ? "VOICE" : "NORMAL"));
4027*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4028*4882a593Smuzhiyun }
4029*4882a593Smuzhiyun
4030*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4031*4882a593Smuzhiyun "============[BT Status]============");
4032*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4033*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %ddBm/ %d/ %d",
4034*4882a593Smuzhiyun "BT status/ rssi/ retryCnt/ popCnt",
4035*4882a593Smuzhiyun ((coex_sta->bt_disabled) ? ("disabled") :
4036*4882a593Smuzhiyun ((coex_sta->bt_inq_page) ? ("inquiry-page") :
4037*4882a593Smuzhiyun ((coex_dm->bt_status == BTC_BTSTATUS_NCON_IDLE) ?
4038*4882a593Smuzhiyun "non-connecte-idle" : ((coex_dm->bt_status ==
4039*4882a593Smuzhiyun BTC_BTSTATUS_CON_IDLE) ? "connected-idle" : "busy")))),
4040*4882a593Smuzhiyun coex_sta->bt_rssi - 100, coex_sta->cnt_bt[BTC_CNT_BT_RETRY],
4041*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_POPEVENT]);
4042*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4043*4882a593Smuzhiyun
4044*4882a593Smuzhiyun if (coex_sta->bt_profile_num != 0) {
4045*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4046*4882a593Smuzhiyun "\r\n %-35s = %s%s%s%s%s%s (multilink = %d)",
4047*4882a593Smuzhiyun "Profiles", ((coex_sta->bt_a2dp_exist) ?
4048*4882a593Smuzhiyun ((coex_sta->bt_a2dp_sink) ? "A2DP sink," :
4049*4882a593Smuzhiyun "A2DP,") : ""),
4050*4882a593Smuzhiyun ((coex_sta->bt_hfp_exist) ? "HFP," : ""),
4051*4882a593Smuzhiyun ((coex_sta->bt_hid_exist) ?
4052*4882a593Smuzhiyun ((coex_sta->bt_ble_exist) ? "HID(RCU)" :
4053*4882a593Smuzhiyun ((coex_sta->bt_hid_slot >= 2) ? "HID(4/18)," :
4054*4882a593Smuzhiyun (coex_sta->bt_ble_hid_exist ? "HID(BLE)" :
4055*4882a593Smuzhiyun "HID(2/18),"))) : ""), ((coex_sta->bt_pan_exist) ?
4056*4882a593Smuzhiyun ((coex_sta->bt_opp_exist) ? "OPP," : "PAN,") :
4057*4882a593Smuzhiyun ""), ((coex_sta->bt_ble_voice) ? "Voice," : ""),
4058*4882a593Smuzhiyun ((coex_sta->bt_msft_mr_exist) ? "MR" : ""),
4059*4882a593Smuzhiyun coex_sta->bt_multi_link);
4060*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4061*4882a593Smuzhiyun
4062*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4063*4882a593Smuzhiyun "\r\n %-35s = %d/ %d/ %d/ %d",
4064*4882a593Smuzhiyun "SUT Power[3:0]",
4065*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[3],
4066*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[2],
4067*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[1],
4068*4882a593Smuzhiyun coex_sta->bt_sut_pwr_lvl[0]);
4069*4882a593Smuzhiyun
4070*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4071*4882a593Smuzhiyun } else {
4072*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
4073*4882a593Smuzhiyun "Profiles",
4074*4882a593Smuzhiyun (coex_sta->bt_msft_mr_exist) ? "MR" : "None");
4075*4882a593Smuzhiyun
4076*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4077*4882a593Smuzhiyun }
4078*4882a593Smuzhiyun
4079*4882a593Smuzhiyun /* for 8822b, Scoreboard[10]: 0: CQDDR off, 1: CQDDR on
4080*4882a593Smuzhiyun * for 8822c, Scoreboard[10]: 0: CQDDR on, 1:CQDDR fix 2M
4081*4882a593Smuzhiyun */
4082*4882a593Smuzhiyun
4083*4882a593Smuzhiyun if (coex_sta->bt_a2dp_exist) {
4084*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4085*4882a593Smuzhiyun "\r\n %-35s = %s/ %d/ 0x%x/ 0x%x/ %d",
4086*4882a593Smuzhiyun "CQDDR/Bitpool/V_ID/D_name/Flush",
4087*4882a593Smuzhiyun (chip_para->new_scbd10_def ?
4088*4882a593Smuzhiyun ((coex_sta->bt_fix_2M) ? "fix_2M" : "CQDDR_On") :
4089*4882a593Smuzhiyun ((coex_sta->bt_fix_2M) ? "CQDDR_On" : "CQDDR_Off")),
4090*4882a593Smuzhiyun coex_sta->bt_a2dp_bitpool,
4091*4882a593Smuzhiyun coex_sta->bt_a2dp_vendor_id,
4092*4882a593Smuzhiyun coex_sta->bt_a2dp_device_name,
4093*4882a593Smuzhiyun coex_sta->bt_a2dp_flush_time);
4094*4882a593Smuzhiyun
4095*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4096*4882a593Smuzhiyun }
4097*4882a593Smuzhiyun
4098*4882a593Smuzhiyun if (coex_sta->bt_hid_exist) {
4099*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
4100*4882a593Smuzhiyun "HID PairNum", coex_sta->bt_hid_pair_num);
4101*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4102*4882a593Smuzhiyun }
4103*4882a593Smuzhiyun
4104*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d/ %s/ 0x%x",
4105*4882a593Smuzhiyun "Role/RoleSwCnt/IgnWla/Feature",
4106*4882a593Smuzhiyun ((coex_sta->bt_slave) ? "Slave" : "Master"),
4107*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_ROLESWITCH],
4108*4882a593Smuzhiyun ((coex_dm->cur_ignore_wlan_act) ? "Yes" : "No"),
4109*4882a593Smuzhiyun coex_sta->bt_supported_feature);
4110*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4111*4882a593Smuzhiyun
4112*4882a593Smuzhiyun if (coex_sta->bt_ble_scan_en) {
4113*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4114*4882a593Smuzhiyun "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4115*4882a593Smuzhiyun "BLEScan Type/TV/Init/Ble",
4116*4882a593Smuzhiyun coex_sta->bt_ble_scan_type,
4117*4882a593Smuzhiyun (coex_sta->bt_ble_scan_type & 0x1 ?
4118*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[0] : 0x0),
4119*4882a593Smuzhiyun (coex_sta->bt_ble_scan_type & 0x2 ?
4120*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[1] : 0x0),
4121*4882a593Smuzhiyun (coex_sta->bt_ble_scan_type & 0x4 ?
4122*4882a593Smuzhiyun coex_sta->bt_ble_scan_para[2] : 0x0));
4123*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4124*4882a593Smuzhiyun }
4125*4882a593Smuzhiyun
4126*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4127*4882a593Smuzhiyun "\r\n %-35s = %d/ %d/ %d/ %d/ %d/ %d/ %d %s",
4128*4882a593Smuzhiyun "Init/ReLink/IgnWl/Pag/Inq/iqkO/iqkX",
4129*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_REINIT],
4130*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_SETUPLINK],
4131*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IGNWLANACT],
4132*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_PAGE],
4133*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_INQ],
4134*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IQK],
4135*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IQKFAIL],
4136*4882a593Smuzhiyun (coex_sta->bt_setup_link ? "(Relink!!)" : ""));
4137*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4138*4882a593Smuzhiyun
4139*4882a593Smuzhiyun if (coex_sta->bt_reg_vendor_ae != 0xffff ||
4140*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac != 0xffff ||
4141*4882a593Smuzhiyun coex_sta->bt_reg_vendor_dac != 0xffffffff) {
4142*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4143*4882a593Smuzhiyun "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x/ 0x%x/ %s",
4144*4882a593Smuzhiyun "ae/ac/dac/m_a[8:6]/ScBd(B->W)/path",
4145*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ae,
4146*4882a593Smuzhiyun coex_sta->bt_reg_vendor_ac,
4147*4882a593Smuzhiyun coex_sta->bt_reg_vendor_dac,
4148*4882a593Smuzhiyun coex_sta->bt_reg_modem_a,
4149*4882a593Smuzhiyun ((chip_para->scbd_bit_num == BTC_SCBD_16_BIT) ?
4150*4882a593Smuzhiyun btc->btc_read_scbd(btc, &scbd) :
4151*4882a593Smuzhiyun btc->btc_read_scbd_32bit(btc, &scbd_32)),
4152*4882a593Smuzhiyun ((coex_sta->bt_reg_vendor_ae & BIT(4)) ? "S1" : "S0"
4153*4882a593Smuzhiyun ));
4154*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4155*4882a593Smuzhiyun
4156*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4157*4882a593Smuzhiyun "\r\n %-35s = 0x%x/ 0x%x",
4158*4882a593Smuzhiyun "rf_2/rf_9",
4159*4882a593Smuzhiyun coex_sta->bt_reg_rf_2,
4160*4882a593Smuzhiyun coex_sta->bt_reg_rf_9);
4161*4882a593Smuzhiyun } else {
4162*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4163*4882a593Smuzhiyun "\r\n %-35s = x/ x/ x/ 0x%x",
4164*4882a593Smuzhiyun "0xae[4]/0xac[1:0]/0xdac/ScBd(B->W)",
4165*4882a593Smuzhiyun ((chip_para->scbd_bit_num == BTC_SCBD_16_BIT) ?
4166*4882a593Smuzhiyun btc->btc_read_scbd(btc, &scbd) :
4167*4882a593Smuzhiyun btc->btc_read_scbd_32bit(btc, &scbd_32)));
4168*4882a593Smuzhiyun }
4169*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4170*4882a593Smuzhiyun
4171*4882a593Smuzhiyun /* COEX-662: LE reg 0x200[3:0] -> forbidden slot num */
4172*4882a593Smuzhiyun if (coex_sta->bt_reg_le_200 == 0xffff)
4173*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4174*4882a593Smuzhiyun "\r\n %-35s = x",
4175*4882a593Smuzhiyun "LE_FBDSLT_num");
4176*4882a593Smuzhiyun else
4177*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4178*4882a593Smuzhiyun "\r\n %-35s = 0x%x",
4179*4882a593Smuzhiyun "LE_FBDSLT_num",
4180*4882a593Smuzhiyun coex_sta->bt_reg_le_200 & 0xf);
4181*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4182*4882a593Smuzhiyun
4183*4882a593Smuzhiyun if (coex_dm->bt_status != BTC_BTSTATUS_NCON_IDLE) {
4184*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4185*4882a593Smuzhiyun "\r\n %-35s = %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x",
4186*4882a593Smuzhiyun "AFH MAP", coex_sta->bt_afh_map[0],
4187*4882a593Smuzhiyun coex_sta->bt_afh_map[1], coex_sta->bt_afh_map[2],
4188*4882a593Smuzhiyun coex_sta->bt_afh_map[3], coex_sta->bt_afh_map[4],
4189*4882a593Smuzhiyun coex_sta->bt_afh_map[5], coex_sta->bt_afh_map[6],
4190*4882a593Smuzhiyun coex_sta->bt_afh_map[7], coex_sta->bt_afh_map[8],
4191*4882a593Smuzhiyun coex_sta->bt_afh_map[9]);
4192*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4193*4882a593Smuzhiyun }
4194*4882a593Smuzhiyun
4195*4882a593Smuzhiyun for (i = 0; i < BTC_BTINFO_SRC_BT_IQK; i++) {
4196*4882a593Smuzhiyun if (coex_sta->cnt_bt_info_c2h[i]) {
4197*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4198*4882a593Smuzhiyun "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x (%d)",
4199*4882a593Smuzhiyun glbt_info_src[i],
4200*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][0],
4201*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][1],
4202*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][2],
4203*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][3],
4204*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][4],
4205*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][5],
4206*4882a593Smuzhiyun coex_sta->bt_info_c2h[i][6],
4207*4882a593Smuzhiyun coex_sta->cnt_bt_info_c2h[i]);
4208*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4209*4882a593Smuzhiyun }
4210*4882a593Smuzhiyun }
4211*4882a593Smuzhiyun
4212*4882a593Smuzhiyun if (btc->manual_control) {
4213*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4214*4882a593Smuzhiyun "============[mechanisms] (under Manual)============");
4215*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4216*4882a593Smuzhiyun
4217*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4218*4882a593Smuzhiyun "\r\n %-35s = %02x %02x %02x %02x %02x",
4219*4882a593Smuzhiyun "TDMA_Now",
4220*4882a593Smuzhiyun coex_dm->fw_tdma_para[0], coex_dm->fw_tdma_para[1],
4221*4882a593Smuzhiyun coex_dm->fw_tdma_para[2], coex_dm->fw_tdma_para[3],
4222*4882a593Smuzhiyun coex_dm->fw_tdma_para[4]);
4223*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4224*4882a593Smuzhiyun } else {
4225*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4226*4882a593Smuzhiyun "============[Mechanisms]============");
4227*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4228*4882a593Smuzhiyun
4229*4882a593Smuzhiyun ps_tdma_case = coex_dm->cur_ps_tdma;
4230*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4231*4882a593Smuzhiyun "\r\n %-35s = %02x %02x %02x %02x %02x (case-%d, TDMA-%s, Ext-%d, Tog-%d)",
4232*4882a593Smuzhiyun "TDMA",
4233*4882a593Smuzhiyun coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
4234*4882a593Smuzhiyun coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
4235*4882a593Smuzhiyun coex_dm->ps_tdma_para[4], ps_tdma_case,
4236*4882a593Smuzhiyun (coex_dm->cur_ps_tdma_on ? "On" : "Off"),
4237*4882a593Smuzhiyun coex_sta->bt_ext_autoslot_thres,
4238*4882a593Smuzhiyun coex_sta->wl_toggle_interval);
4239*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4240*4882a593Smuzhiyun }
4241*4882a593Smuzhiyun
4242*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %d",
4243*4882a593Smuzhiyun "Coex_Mode/Free_Run/Timer_base",
4244*4882a593Smuzhiyun coex_mode_string[coex_sta->wl_coex_mode],
4245*4882a593Smuzhiyun ((coex_sta->coex_freerun) ? "Yes" : "No"),
4246*4882a593Smuzhiyun coex_sta->tdma_timer_base);
4247*4882a593Smuzhiyun
4248*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4249*4882a593Smuzhiyun
4250*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4251*4882a593Smuzhiyun "\r\n %-35s = %d/ 0x%x/ 0x%x/ 0x%x",
4252*4882a593Smuzhiyun "Table/0x6c0/0x6c4/0x6c8", coex_sta->coex_table_type,
4253*4882a593Smuzhiyun btc->btc_read_4byte(btc, REG_BT_COEX_TABLE0),
4254*4882a593Smuzhiyun btc->btc_read_4byte(btc, REG_BT_COEX_TABLE1),
4255*4882a593Smuzhiyun btc->btc_read_4byte(btc, REG_BT_COEX_BRK_TABLE));
4256*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4257*4882a593Smuzhiyun
4258*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4259*4882a593Smuzhiyun "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ %d/ %s",
4260*4882a593Smuzhiyun "0x778/0x6cc/ScBd(W->B)/RunCnt/Rsn",
4261*4882a593Smuzhiyun btc->btc_read_1byte(btc, REG_BT_STAT_CTRL),
4262*4882a593Smuzhiyun btc->btc_read_4byte(btc, REG_BT_COEX_TABLE_H),
4263*4882a593Smuzhiyun ((chip_para->scbd_bit_num == BTC_SCBD_16_BIT) ?
4264*4882a593Smuzhiyun coex_sta->score_board_WB : coex_sta->score_board_WB_32bit),
4265*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXRUN],
4266*4882a593Smuzhiyun run_reason_string[coex_sta->coex_run_reason]);
4267*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4268*4882a593Smuzhiyun
4269*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4270*4882a593Smuzhiyun "\r\n %-35s = %02x %02x %02x (RF-Ch = %d)", "AFH Map to BT",
4271*4882a593Smuzhiyun coex_dm->wl_chnl_info[0], coex_dm->wl_chnl_info[1],
4272*4882a593Smuzhiyun coex_dm->wl_chnl_info[2], coex_sta->wl_center_ch);
4273*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4274*4882a593Smuzhiyun
4275*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s/ %d",
4276*4882a593Smuzhiyun "AntDiv/BtCtrlLPS/LPRA/g_busy",
4277*4882a593Smuzhiyun ((board_info->ant_div_cfg) ? "On" : "Off"),
4278*4882a593Smuzhiyun ((coex_sta->wl_force_lps_ctrl) ? "On" : "Off"),
4279*4882a593Smuzhiyun ((coex_dm->cur_low_penalty_ra) ? "On" : "Off"),
4280*4882a593Smuzhiyun coex_sta->wl_gl_busy);
4281*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4282*4882a593Smuzhiyun
4283*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d",
4284*4882a593Smuzhiyun "Null All/Retry/Ack/BT_Empty/BT_Late",
4285*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[1], coex_sta->wl_fw_dbg_info[2],
4286*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[3], coex_sta->wl_fw_dbg_info[4],
4287*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[5]);
4288*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4289*4882a593Smuzhiyun
4290*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s/ %d",
4291*4882a593Smuzhiyun "Cnt TDMA_Togg/LkRx/LKAP_On/fw",
4292*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[6],
4293*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[7],
4294*4882a593Smuzhiyun ((coex_sta->wl_leak_ap) ? "Yes" : "No"),
4295*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_FW_NOTIFY]);
4296*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4297*4882a593Smuzhiyun
4298*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s/ %d",
4299*4882a593Smuzhiyun "WL_TxPw/BT_TxPw/WL_Rx/BT_LNA_Lvl",
4300*4882a593Smuzhiyun coex_dm->cur_wl_pwr_lvl, coex_dm->cur_bt_pwr_lvl,
4301*4882a593Smuzhiyun ((coex_dm->cur_wl_rx_low_gain_en) ? "On" : "Off"),
4302*4882a593Smuzhiyun coex_dm->cur_bt_lna_lvl);
4303*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4304*4882a593Smuzhiyun
4305*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s",
4306*4882a593Smuzhiyun "MIMO_PS On/Recover/BlackAP",
4307*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_2G_FDDSTAY],
4308*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_2G_TDDTRY],
4309*4882a593Smuzhiyun ((coex_sta->wl_blacklist_ap) ? "Yes": "No"));
4310*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4311*4882a593Smuzhiyun
4312*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4313*4882a593Smuzhiyun "\r\n %-35s = %02d %02d %02d %02d %02d %02d %02d %02d %02d %02d",
4314*4882a593Smuzhiyun "BT slot length1 (ms)",
4315*4882a593Smuzhiyun coex_dm->bt_slot_length1[0], coex_dm->bt_slot_length1[1],
4316*4882a593Smuzhiyun coex_dm->bt_slot_length1[2], coex_dm->bt_slot_length1[3],
4317*4882a593Smuzhiyun coex_dm->bt_slot_length1[4], coex_dm->bt_slot_length1[5],
4318*4882a593Smuzhiyun coex_dm->bt_slot_length1[6], coex_dm->bt_slot_length1[7],
4319*4882a593Smuzhiyun coex_dm->bt_slot_length1[8], coex_dm->bt_slot_length1[9]);
4320*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4321*4882a593Smuzhiyun
4322*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4323*4882a593Smuzhiyun "\r\n %-35s = %02d %02d %02d %02d %02d %02d %02d %02d %02d %02d",
4324*4882a593Smuzhiyun "BT slot length2 (ms)",
4325*4882a593Smuzhiyun coex_dm->bt_slot_length2[0], coex_dm->bt_slot_length2[1],
4326*4882a593Smuzhiyun coex_dm->bt_slot_length2[2], coex_dm->bt_slot_length2[3],
4327*4882a593Smuzhiyun coex_dm->bt_slot_length2[4], coex_dm->bt_slot_length2[5],
4328*4882a593Smuzhiyun coex_dm->bt_slot_length2[6], coex_dm->bt_slot_length2[7],
4329*4882a593Smuzhiyun coex_dm->bt_slot_length2[8], coex_dm->bt_slot_length2[9]);
4330*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4331*4882a593Smuzhiyun
4332*4882a593Smuzhiyun for(i = 0; i < 10; i++){
4333*4882a593Smuzhiyun bt_slot_sum += coex_dm->bt_slot_length1[i];
4334*4882a593Smuzhiyun bt_slot_sum += coex_dm->bt_slot_length2[i];
4335*4882a593Smuzhiyun }
4336*4882a593Smuzhiyun
4337*4882a593Smuzhiyun bt_slot_min = coex_dm->bt_slot_length1[0];
4338*4882a593Smuzhiyun for(i = 0; i < 10; i++){
4339*4882a593Smuzhiyun if (bt_slot_min > coex_dm->bt_slot_length1[i])
4340*4882a593Smuzhiyun bt_slot_min = coex_dm->bt_slot_length1[i];
4341*4882a593Smuzhiyun if (bt_slot_min > coex_dm->bt_slot_length2[i])
4342*4882a593Smuzhiyun bt_slot_min = coex_dm->bt_slot_length2[i];
4343*4882a593Smuzhiyun }
4344*4882a593Smuzhiyun
4345*4882a593Smuzhiyun bt_slot_max = coex_dm->bt_slot_length1[0];
4346*4882a593Smuzhiyun for(i = 0; i < 10; i++){
4347*4882a593Smuzhiyun if (bt_slot_max < coex_dm->bt_slot_length1[i])
4348*4882a593Smuzhiyun bt_slot_max = coex_dm->bt_slot_length1[i];
4349*4882a593Smuzhiyun if (bt_slot_max < coex_dm->bt_slot_length2[i])
4350*4882a593Smuzhiyun bt_slot_max = coex_dm->bt_slot_length2[i];
4351*4882a593Smuzhiyun }
4352*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4353*4882a593Smuzhiyun "\r\n %-35s = %02d %02d %02d",
4354*4882a593Smuzhiyun "BT slot avg/BT slot max/BT slot min",
4355*4882a593Smuzhiyun bt_slot_sum/20, bt_slot_max, bt_slot_min);
4356*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4357*4882a593Smuzhiyun
4358*4882a593Smuzhiyun /* Hw setting */
4359*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4360*4882a593Smuzhiyun "============[Hw setting]============");
4361*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4362*4882a593Smuzhiyun
4363*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_COEXINFO_HW);
4364*4882a593Smuzhiyun
4365*4882a593Smuzhiyun fa_ofdm = btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_FA_OFDM);
4366*4882a593Smuzhiyun fa_cck = btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_FA_CCK);
4367*4882a593Smuzhiyun cca_ofdm = btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CCA_OFDM);
4368*4882a593Smuzhiyun cca_cck = btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CCA_CCK);
4369*4882a593Smuzhiyun
4370*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4371*4882a593Smuzhiyun "\r\n %-35s = %d/ %d/ %d/ %d",
4372*4882a593Smuzhiyun "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA", cca_cck, fa_cck, cca_ofdm,
4373*4882a593Smuzhiyun fa_ofdm);
4374*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4375*4882a593Smuzhiyun
4376*4882a593Smuzhiyun ok_11b =
4377*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_OK_CCK);
4378*4882a593Smuzhiyun ok_11g =
4379*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_OK_LEGACY);
4380*4882a593Smuzhiyun ok_11n =
4381*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_OK_HT);
4382*4882a593Smuzhiyun ok_11vht =
4383*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_OK_VHT);
4384*4882a593Smuzhiyun
4385*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4386*4882a593Smuzhiyun "CRC_OK CCK/11g/11n/11ac", ok_11b, ok_11g, ok_11n, ok_11vht);
4387*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4388*4882a593Smuzhiyun
4389*4882a593Smuzhiyun err_11b =
4390*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_ERROR_CCK);
4391*4882a593Smuzhiyun err_11g =
4392*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_ERROR_LEGACY);
4393*4882a593Smuzhiyun err_11n =
4394*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_ERROR_HT);
4395*4882a593Smuzhiyun err_11vht =
4396*4882a593Smuzhiyun btc->btc_phydm_query_PHY_counter(btc, PHYDM_INFO_CRC32_ERROR_VHT);
4397*4882a593Smuzhiyun
4398*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4399*4882a593Smuzhiyun "CRC_Err CCK/11g/11n/11ac",
4400*4882a593Smuzhiyun err_11b, err_11g, err_11n, err_11vht);
4401*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4402*4882a593Smuzhiyun
4403*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4404*4882a593Smuzhiyun "\r\n %-35s = %d/ %d/ %s-%d/ %d (Tx macid: %d)",
4405*4882a593Smuzhiyun "Rate RxD/RxRTS/TxD/TxRetry_ratio",
4406*4882a593Smuzhiyun coex_sta->wl_rx_rate, coex_sta->wl_rts_rx_rate,
4407*4882a593Smuzhiyun (coex_sta->wl_tx_rate & 0x80 ? "SGI" : "LGI"),
4408*4882a593Smuzhiyun coex_sta->wl_tx_rate & 0x7f,
4409*4882a593Smuzhiyun coex_sta->wl_tx_retry_ratio,
4410*4882a593Smuzhiyun coex_sta->wl_tx_macid);
4411*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4412*4882a593Smuzhiyun
4413*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s/ %d",
4414*4882a593Smuzhiyun "HiPr/ Locking/ Locked/ Noisy",
4415*4882a593Smuzhiyun (coex_sta->wl_hi_pri_task1 ? "Yes" : "No"),
4416*4882a593Smuzhiyun (coex_sta->wl_cck_lock ? "Yes" : "No"),
4417*4882a593Smuzhiyun (coex_sta->wl_cck_lock_ever ? "Yes" : "No"),
4418*4882a593Smuzhiyun coex_sta->wl_noisy_level);
4419*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4420*4882a593Smuzhiyun
4421*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4422*4882a593Smuzhiyun "0x770(Hi-pri rx/tx)", coex_sta->hi_pri_rx,
4423*4882a593Smuzhiyun coex_sta->hi_pri_tx);
4424*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4425*4882a593Smuzhiyun
4426*4882a593Smuzhiyun CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d %s",
4427*4882a593Smuzhiyun "0x774(Lo-pri rx/tx)", coex_sta->lo_pri_rx,
4428*4882a593Smuzhiyun coex_sta->lo_pri_tx, (coex_sta->bt_slave ?
4429*4882a593Smuzhiyun "(Slave!!)" : ""));
4430*4882a593Smuzhiyun CL_PRINTF(cli_buf);
4431*4882a593Smuzhiyun
4432*4882a593Smuzhiyun btc->btc_disp_dbg_msg(btc, BTC_DBG_DISP_COEX_STATISTICS);
4433*4882a593Smuzhiyun
4434*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_COEXINFO1]++;
4435*4882a593Smuzhiyun
4436*4882a593Smuzhiyun if (coex_sta->cnt_wl[BTC_CNT_WL_COEXINFO1] % 5 == 0)
4437*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_POPEVENT] = 0;
4438*4882a593Smuzhiyun }
4439*4882a593Smuzhiyun
rtw_btc_ex_ips_notify(struct btc_coexist * btc,u8 type)4440*4882a593Smuzhiyun void rtw_btc_ex_ips_notify(struct btc_coexist *btc, u8 type)
4441*4882a593Smuzhiyun {
4442*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4443*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
4444*4882a593Smuzhiyun
4445*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4446*4882a593Smuzhiyun return;
4447*4882a593Smuzhiyun
4448*4882a593Smuzhiyun if (type == BTC_IPS_ENTER) {
4449*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4450*4882a593Smuzhiyun "[BTCoex], IPS ENTER notify\n");
4451*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4452*4882a593Smuzhiyun coex_sta->wl_under_ips = TRUE;
4453*4882a593Smuzhiyun
4454*4882a593Smuzhiyun /* Write WL "Active" in Score-board for LPS off */
4455*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4456*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ALL, FALSE);
4457*4882a593Smuzhiyun else
4458*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ALL_32BIT, FALSE);
4459*4882a593Smuzhiyun btc->chip_para->chip_setup(btc, BTC_CSETUP_WLAN_ACT_IPS);
4460*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_WOFF);
4461*4882a593Smuzhiyun rtw_btc_action_coex_all_off(btc);
4462*4882a593Smuzhiyun } else if (type == BTC_IPS_LEAVE) {
4463*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4464*4882a593Smuzhiyun "[BTCoex], IPS LEAVE notify\n");
4465*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4466*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4467*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4468*4882a593Smuzhiyun else
4469*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4470*4882a593Smuzhiyun /*leave IPS : run ini hw config (exclude wifi only)*/
4471*4882a593Smuzhiyun rtw_btc_init_hw_config(btc, FALSE);
4472*4882a593Smuzhiyun
4473*4882a593Smuzhiyun coex_sta->wl_under_ips = FALSE;
4474*4882a593Smuzhiyun }
4475*4882a593Smuzhiyun }
4476*4882a593Smuzhiyun
rtw_btc_ex_lps_notify(struct btc_coexist * btc,u8 type)4477*4882a593Smuzhiyun void rtw_btc_ex_lps_notify(struct btc_coexist *btc, u8 type)
4478*4882a593Smuzhiyun {
4479*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4480*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
4481*4882a593Smuzhiyun
4482*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4483*4882a593Smuzhiyun return;
4484*4882a593Smuzhiyun
4485*4882a593Smuzhiyun if (type == BTC_LPS_ENABLE) {
4486*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4487*4882a593Smuzhiyun "[BTCoex], LPS ENABLE notify\n");
4488*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4489*4882a593Smuzhiyun coex_sta->wl_under_lps = TRUE;
4490*4882a593Smuzhiyun
4491*4882a593Smuzhiyun if (coex_sta->wl_force_lps_ctrl) { /* LPS No-32K */
4492*4882a593Smuzhiyun /* Write WL "Active" in Score-board for PS-TDMA */
4493*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4494*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE, TRUE);
4495*4882a593Smuzhiyun else
4496*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE, TRUE);
4497*4882a593Smuzhiyun } else {
4498*4882a593Smuzhiyun /* Write WL "Non-Active" in Score-board for Native-PS */
4499*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT) {
4500*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE, FALSE);
4501*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_WLBUSY, FALSE);
4502*4882a593Smuzhiyun } else {
4503*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE, FALSE);
4504*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_WLBUSY, FALSE);
4505*4882a593Smuzhiyun }
4506*4882a593Smuzhiyun
4507*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_LPS);
4508*4882a593Smuzhiyun }
4509*4882a593Smuzhiyun } else if (type == BTC_LPS_DISABLE) {
4510*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4511*4882a593Smuzhiyun "[BTCoex], LPS DISABLE notify\n");
4512*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4513*4882a593Smuzhiyun coex_sta->wl_under_lps = FALSE;
4514*4882a593Smuzhiyun
4515*4882a593Smuzhiyun /* Write WL "Active" in Score-board for LPS off */
4516*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4517*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE, TRUE);
4518*4882a593Smuzhiyun else
4519*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE, TRUE);
4520*4882a593Smuzhiyun
4521*4882a593Smuzhiyun if (!coex_sta->wl_force_lps_ctrl)
4522*4882a593Smuzhiyun rtw_btc_query_bt_info(btc);
4523*4882a593Smuzhiyun
4524*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_LPS);
4525*4882a593Smuzhiyun } else if (type == BTC_LPS_PRE) {
4526*4882a593Smuzhiyun /* COEX-649, prevent LeisurePSLeave() is called in LeisurePSEnter()*/
4527*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4528*4882a593Smuzhiyun "[BTCoex], LPS PRE notify(before enter LPS)\n");
4529*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4530*4882a593Smuzhiyun
4531*4882a593Smuzhiyun coex_sta->wl_in_lps_enter = TRUE;
4532*4882a593Smuzhiyun } else if (type == BTC_LPS_RET) {
4533*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4534*4882a593Smuzhiyun "[BTCoex], LPS RET notify(LPS enter end)\n");
4535*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4536*4882a593Smuzhiyun
4537*4882a593Smuzhiyun coex_sta->wl_in_lps_enter = FALSE;
4538*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_LPS);
4539*4882a593Smuzhiyun } else {
4540*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4541*4882a593Smuzhiyun "[BTCoex], LPS unknown notify!!\n");
4542*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4543*4882a593Smuzhiyun }
4544*4882a593Smuzhiyun }
4545*4882a593Smuzhiyun
rtw_btc_ex_scan_notify(struct btc_coexist * btc,u8 type)4546*4882a593Smuzhiyun void rtw_btc_ex_scan_notify(struct btc_coexist *btc, u8 type)
4547*4882a593Smuzhiyun {
4548*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4549*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
4550*4882a593Smuzhiyun
4551*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4552*4882a593Smuzhiyun return;
4553*4882a593Smuzhiyun
4554*4882a593Smuzhiyun coex_sta->coex_freeze = FALSE;
4555*4882a593Smuzhiyun
4556*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4557*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4558*4882a593Smuzhiyun else
4559*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4560*4882a593Smuzhiyun
4561*4882a593Smuzhiyun if (type == BTC_SCAN_START_5G) {
4562*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4563*4882a593Smuzhiyun "[BTCoex], SCAN START notify (5G)\n");
4564*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4565*4882a593Smuzhiyun
4566*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_5G);
4567*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GSCANSTART);
4568*4882a593Smuzhiyun } else if (type == BTC_SCAN_START_2G || type == BTC_SCAN_START) {
4569*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4570*4882a593Smuzhiyun "[BTCoex], SCAN START notify (2G)\n");
4571*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4572*4882a593Smuzhiyun
4573*4882a593Smuzhiyun coex_sta->wl_hi_pri_task2 = TRUE;
4574*4882a593Smuzhiyun
4575*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
4576*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_2G);
4577*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GSCANSTART);
4578*4882a593Smuzhiyun } else {
4579*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U1_AP_NUM,
4580*4882a593Smuzhiyun &coex_sta->cnt_wl[BTC_CNT_WL_SCANAP]);
4581*4882a593Smuzhiyun
4582*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4583*4882a593Smuzhiyun "[BTCoex], SCAN FINISH notify (Scan-AP = %d)\n",
4584*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_SCANAP]);
4585*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4586*4882a593Smuzhiyun
4587*4882a593Smuzhiyun coex_sta->wl_hi_pri_task2 = FALSE;
4588*4882a593Smuzhiyun
4589*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_SCANFINISH);
4590*4882a593Smuzhiyun }
4591*4882a593Smuzhiyun }
4592*4882a593Smuzhiyun
rtw_btc_ex_scan_notify_without_bt(struct btc_coexist * btc,u8 type)4593*4882a593Smuzhiyun void rtw_btc_ex_scan_notify_without_bt(struct btc_coexist *btc, u8 type)
4594*4882a593Smuzhiyun {
4595*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
4596*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
4597*4882a593Smuzhiyun u8 ctrl_type = BTC_SWITCH_CTRL_BY_BBSW, pos_type = BTC_SWITCH_TO_WLG;
4598*4882a593Smuzhiyun
4599*4882a593Smuzhiyun if (!rfe_type->ant_switch_exist)
4600*4882a593Smuzhiyun return;
4601*4882a593Smuzhiyun
4602*4882a593Smuzhiyun if (type == BTC_SCAN_START && link_info_ext->is_all_under_5g)
4603*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLA;
4604*4882a593Smuzhiyun
4605*4882a593Smuzhiyun rtw_btc_set_ant_switch(btc, FC_EXCU, ctrl_type, pos_type);
4606*4882a593Smuzhiyun }
4607*4882a593Smuzhiyun
rtw_btc_ex_switchband_notify(struct btc_coexist * btc,u8 type)4608*4882a593Smuzhiyun void rtw_btc_ex_switchband_notify(struct btc_coexist *btc, u8 type)
4609*4882a593Smuzhiyun {
4610*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4611*4882a593Smuzhiyun
4612*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4613*4882a593Smuzhiyun return;
4614*4882a593Smuzhiyun
4615*4882a593Smuzhiyun if (type == BTC_SWITCH_TO_5G) {
4616*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4617*4882a593Smuzhiyun "[BTCoex], %s(): TO_5G\n", __func__);
4618*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4619*4882a593Smuzhiyun
4620*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GSWITCHBAND);
4621*4882a593Smuzhiyun } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
4622*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4623*4882a593Smuzhiyun "[BTCoex], %s(): TO_24G_NOFORSCAN\n", __func__);
4624*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4625*4882a593Smuzhiyun
4626*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GSWITCHBAND);
4627*4882a593Smuzhiyun } else {
4628*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4629*4882a593Smuzhiyun "[BTCoex], %s(): TO_2G\n", __func__);
4630*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4631*4882a593Smuzhiyun
4632*4882a593Smuzhiyun rtw_btc_ex_scan_notify(btc, BTC_SCAN_START_2G);
4633*4882a593Smuzhiyun }
4634*4882a593Smuzhiyun }
4635*4882a593Smuzhiyun
rtw_btc_ex_switchband_notify_without_bt(struct btc_coexist * btc,u8 type)4636*4882a593Smuzhiyun void rtw_btc_ex_switchband_notify_without_bt(struct btc_coexist *btc, u8 type)
4637*4882a593Smuzhiyun {
4638*4882a593Smuzhiyun struct btc_rfe_type *rfe_type = &btc->rfe_type;
4639*4882a593Smuzhiyun u8 ctrl_type = BTC_SWITCH_CTRL_BY_BBSW, pos_type = BTC_SWITCH_TO_WLG;
4640*4882a593Smuzhiyun
4641*4882a593Smuzhiyun if (!rfe_type->ant_switch_exist)
4642*4882a593Smuzhiyun return;
4643*4882a593Smuzhiyun
4644*4882a593Smuzhiyun if (type == BTC_SWITCH_TO_5G) {
4645*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLA;
4646*4882a593Smuzhiyun } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
4647*4882a593Smuzhiyun pos_type = BTC_SWITCH_TO_WLG;
4648*4882a593Smuzhiyun } else {
4649*4882a593Smuzhiyun rtw_btc_ex_scan_notify_without_bt(btc, BTC_SCAN_START_2G);
4650*4882a593Smuzhiyun return;
4651*4882a593Smuzhiyun }
4652*4882a593Smuzhiyun
4653*4882a593Smuzhiyun rtw_btc_set_ant_switch(btc, FC_EXCU, ctrl_type, pos_type);
4654*4882a593Smuzhiyun }
4655*4882a593Smuzhiyun
rtw_btc_ex_connect_notify(struct btc_coexist * btc,u8 type)4656*4882a593Smuzhiyun void rtw_btc_ex_connect_notify(struct btc_coexist *btc, u8 type)
4657*4882a593Smuzhiyun {
4658*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4659*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
4660*4882a593Smuzhiyun
4661*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4662*4882a593Smuzhiyun return;
4663*4882a593Smuzhiyun
4664*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4665*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4666*4882a593Smuzhiyun else
4667*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE | BTC_SCBD_ON, TRUE);
4668*4882a593Smuzhiyun
4669*4882a593Smuzhiyun if (type == BTC_ASSOCIATE_5G_START) {
4670*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4671*4882a593Smuzhiyun "[BTCoex], %s(): 5G start\n", __func__);
4672*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4673*4882a593Smuzhiyun
4674*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_5G);
4675*4882a593Smuzhiyun
4676*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GCONSTART);
4677*4882a593Smuzhiyun } else if (type == BTC_ASSOCIATE_5G_FINISH) {
4678*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4679*4882a593Smuzhiyun "[BTCoex], %s(): 5G finish\n", __func__);
4680*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4681*4882a593Smuzhiyun
4682*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_5G);
4683*4882a593Smuzhiyun
4684*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GCONFINISH);
4685*4882a593Smuzhiyun } else if (type == BTC_ASSOCIATE_START) {
4686*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = TRUE;
4687*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_ARP] = 0;
4688*4882a593Smuzhiyun coex_sta->wl_connecting = TRUE;
4689*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_CONNPKT, 2);
4690*4882a593Smuzhiyun
4691*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4692*4882a593Smuzhiyun "[BTCoex], %s(): 2G start\n", __func__);
4693*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4694*4882a593Smuzhiyun
4695*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
4696*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_2G);
4697*4882a593Smuzhiyun
4698*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GCONSTART);
4699*4882a593Smuzhiyun
4700*4882a593Smuzhiyun /* To keep TDMA case during connect process,
4701*4882a593Smuzhiyun * to avoid changed by Btinfo and run_coex
4702*4882a593Smuzhiyun */
4703*4882a593Smuzhiyun coex_sta->coex_freeze = TRUE;
4704*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_COEXFREEZE, 5);
4705*4882a593Smuzhiyun } else {
4706*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = FALSE;
4707*4882a593Smuzhiyun coex_sta->coex_freeze = FALSE;
4708*4882a593Smuzhiyun
4709*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4710*4882a593Smuzhiyun "[BTCoex], %s(): 2G finish\n", __func__);
4711*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4712*4882a593Smuzhiyun
4713*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GCONFINISH);
4714*4882a593Smuzhiyun }
4715*4882a593Smuzhiyun }
4716*4882a593Smuzhiyun
rtw_btc_ex_media_status_notify(struct btc_coexist * btc,u8 type)4717*4882a593Smuzhiyun void rtw_btc_ex_media_status_notify(struct btc_coexist *btc, u8 type)
4718*4882a593Smuzhiyun {
4719*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4720*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
4721*4882a593Smuzhiyun boolean wl_b_mode = FALSE;
4722*4882a593Smuzhiyun u8 i;
4723*4882a593Smuzhiyun
4724*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4725*4882a593Smuzhiyun return;
4726*4882a593Smuzhiyun
4727*4882a593Smuzhiyun coex_sta->coex_freeze = FALSE;
4728*4882a593Smuzhiyun
4729*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_BSSID, btc->wifi_bssid);
4730*4882a593Smuzhiyun
4731*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4732*4882a593Smuzhiyun "[BTCoex], %s(): BSSID = %02x %02X %02X %02x %02X %02X\n",
4733*4882a593Smuzhiyun __func__, btc->wifi_bssid[0],
4734*4882a593Smuzhiyun btc->wifi_bssid[1], btc->wifi_bssid[2],
4735*4882a593Smuzhiyun btc->wifi_bssid[3], btc->wifi_bssid[4],
4736*4882a593Smuzhiyun btc->wifi_bssid[5]);
4737*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4738*4882a593Smuzhiyun
4739*4882a593Smuzhiyun /* check if black-list ap */
4740*4882a593Smuzhiyun for (i = 0; i <= 5; i++) {
4741*4882a593Smuzhiyun if (btc->wifi_bssid[i] != btc->wifi_black_bssid[i])
4742*4882a593Smuzhiyun break;
4743*4882a593Smuzhiyun }
4744*4882a593Smuzhiyun
4745*4882a593Smuzhiyun if (i <= 5)
4746*4882a593Smuzhiyun coex_sta->wl_blacklist_ap = FALSE;
4747*4882a593Smuzhiyun else
4748*4882a593Smuzhiyun coex_sta->wl_blacklist_ap = TRUE;
4749*4882a593Smuzhiyun
4750*4882a593Smuzhiyun if (type == BTC_MEDIA_CONNECT_5G) {
4751*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4752*4882a593Smuzhiyun "[BTCoex], %s(): 5G\n", __func__);
4753*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4754*4882a593Smuzhiyun
4755*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4756*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE, TRUE);
4757*4882a593Smuzhiyun else
4758*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE, TRUE);
4759*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_5G);
4760*4882a593Smuzhiyun
4761*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GMEDIA);
4762*4882a593Smuzhiyun } else if (type == BTC_MEDIA_CONNECT) {
4763*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4764*4882a593Smuzhiyun "[BTCoex], %s(): 2G\n", __func__);
4765*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4766*4882a593Smuzhiyun
4767*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
4768*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ACTIVE, TRUE);
4769*4882a593Smuzhiyun else
4770*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ACTIVE, TRUE);
4771*4882a593Smuzhiyun
4772*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
4773*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, BTC_ANT_2G);
4774*4882a593Smuzhiyun
4775*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_UNDER_B_MODE, &wl_b_mode);
4776*4882a593Smuzhiyun
4777*4882a593Smuzhiyun /* Set CCK Tx/Rx high Pri except 11b mode */
4778*4882a593Smuzhiyun if (wl_b_mode)/* CCK Rx */
4779*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_RX_CCK, 0);
4780*4882a593Smuzhiyun else /* CCK Rx */
4781*4882a593Smuzhiyun rtw_btc_set_wl_pri_mask(btc, BTC_WLPRI_RX_CCK, 1);
4782*4882a593Smuzhiyun
4783*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GMEDIA);
4784*4882a593Smuzhiyun } else {
4785*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4786*4882a593Smuzhiyun "[BTCoex], %s(): disconnect!!\n", __func__);
4787*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4788*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_ARP] = 0;
4789*4882a593Smuzhiyun
4790*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_MEDIADISCON);
4791*4882a593Smuzhiyun }
4792*4882a593Smuzhiyun
4793*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_U1_IOT_PEER, &coex_sta->wl_iot_peer);
4794*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, type);
4795*4882a593Smuzhiyun }
4796*4882a593Smuzhiyun
rtw_btc_ex_specific_packet_notify(struct btc_coexist * btc,u8 type)4797*4882a593Smuzhiyun void rtw_btc_ex_specific_packet_notify(struct btc_coexist *btc, u8 type)
4798*4882a593Smuzhiyun {
4799*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4800*4882a593Smuzhiyun boolean under_4way = FALSE;
4801*4882a593Smuzhiyun
4802*4882a593Smuzhiyun if (btc->manual_control || btc->stop_coex_dm)
4803*4882a593Smuzhiyun return;
4804*4882a593Smuzhiyun
4805*4882a593Smuzhiyun if (type & BTC_5G_BAND) {
4806*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4807*4882a593Smuzhiyun "[BTCoex], %s(): 5G\n", __func__);
4808*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4809*4882a593Smuzhiyun
4810*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_5GSPECIALPKT);
4811*4882a593Smuzhiyun return;
4812*4882a593Smuzhiyun }
4813*4882a593Smuzhiyun
4814*4882a593Smuzhiyun btc->btc_get(btc, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &under_4way);
4815*4882a593Smuzhiyun
4816*4882a593Smuzhiyun if (under_4way) {
4817*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4818*4882a593Smuzhiyun "[BTCoex], %s(): under_4way!!\n", __func__);
4819*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4820*4882a593Smuzhiyun
4821*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = TRUE;
4822*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_SPECPKT, 2);
4823*4882a593Smuzhiyun } else if (type == BTC_PACKET_ARP) {
4824*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_ARP]++;
4825*4882a593Smuzhiyun
4826*4882a593Smuzhiyun if (coex_sta->wl_hi_pri_task1) {
4827*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4828*4882a593Smuzhiyun "[BTCoex], %s(): ARP cnt = %d\n",
4829*4882a593Smuzhiyun __func__, coex_sta->cnt_wl[BTC_CNT_WL_ARP]);
4830*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4831*4882a593Smuzhiyun }
4832*4882a593Smuzhiyun } else {
4833*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4834*4882a593Smuzhiyun "[BTCoex], %s(): DHCP or EAPOL Type = %d\n",
4835*4882a593Smuzhiyun __func__, type);
4836*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4837*4882a593Smuzhiyun
4838*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = TRUE;
4839*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_SPECPKT, 2);
4840*4882a593Smuzhiyun }
4841*4882a593Smuzhiyun
4842*4882a593Smuzhiyun if (coex_sta->wl_hi_pri_task1)
4843*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_2GSPECIALPKT);
4844*4882a593Smuzhiyun }
4845*4882a593Smuzhiyun
rtw_btc_ex_bt_info_notify(struct btc_coexist * btc,u8 * tmp_buf,u8 length)4846*4882a593Smuzhiyun void rtw_btc_ex_bt_info_notify(struct btc_coexist *btc, u8 *tmp_buf, u8 length)
4847*4882a593Smuzhiyun {
4848*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
4849*4882a593Smuzhiyun struct btc_coex_dm *coex_dm = &btc->coex_dm;
4850*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
4851*4882a593Smuzhiyun u8 i, rsp_source = 0, type;
4852*4882a593Smuzhiyun
4853*4882a593Smuzhiyun rsp_source = tmp_buf[0] & 0xf;
4854*4882a593Smuzhiyun if (rsp_source >= BTC_BTINFO_SRC_MAX)
4855*4882a593Smuzhiyun return;
4856*4882a593Smuzhiyun
4857*4882a593Smuzhiyun /* COEX-649, prevent TDMA parametet change in LeisurePSEnter()*/
4858*4882a593Smuzhiyun if (coex_sta->wl_in_lps_enter) {
4859*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4860*4882a593Smuzhiyun "[BTCoex], %s(): wl_in_LPSenter = %d\n",
4861*4882a593Smuzhiyun __func__, coex_sta->wl_in_lps_enter);
4862*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4863*4882a593Smuzhiyun }
4864*4882a593Smuzhiyun
4865*4882a593Smuzhiyun coex_sta->cnt_bt_info_c2h[rsp_source]++;
4866*4882a593Smuzhiyun
4867*4882a593Smuzhiyun /* bt_iqk_state-> 1: start, 0: ok, 2:fail */
4868*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_BT_IQK) {
4869*4882a593Smuzhiyun coex_sta->bt_iqk_state = tmp_buf[1];
4870*4882a593Smuzhiyun if (coex_sta->bt_iqk_state == 0x0)
4871*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IQK]++;
4872*4882a593Smuzhiyun else if (coex_sta->bt_iqk_state == 0x2)
4873*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IQKFAIL]++;
4874*4882a593Smuzhiyun
4875*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4876*4882a593Smuzhiyun "[BTCoex], BT IQK by bt_info, data0 = 0x%02x\n",
4877*4882a593Smuzhiyun tmp_buf[1]);
4878*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4879*4882a593Smuzhiyun return;
4880*4882a593Smuzhiyun }
4881*4882a593Smuzhiyun
4882*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_BT_SCBD) {
4883*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4884*4882a593Smuzhiyun "[BTCoex], BT Scoreboard change notify by WL FW c2h, 0xaa = 0x%02x, 0xab = 0x%02x\n",
4885*4882a593Smuzhiyun tmp_buf[1], tmp_buf[2]);
4886*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4887*4882a593Smuzhiyun rtw_btc_monitor_bt_enable(btc);
4888*4882a593Smuzhiyun
4889*4882a593Smuzhiyun if (coex_sta->bt_disabled != coex_sta->bt_disabled_pre) {
4890*4882a593Smuzhiyun coex_sta->bt_disabled_pre = coex_sta->bt_disabled;
4891*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_BTINFO);
4892*4882a593Smuzhiyun }
4893*4882a593Smuzhiyun return;
4894*4882a593Smuzhiyun }
4895*4882a593Smuzhiyun
4896*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_H2C60) {
4897*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4898*4882a593Smuzhiyun "[BTCoex], H2C 0x60 content replied by WL FW: H2C_0x60 = [%02x %02x %02x %02x %02x]\n",
4899*4882a593Smuzhiyun tmp_buf[1], tmp_buf[2], tmp_buf[3], tmp_buf[4],
4900*4882a593Smuzhiyun tmp_buf[5]);
4901*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4902*4882a593Smuzhiyun
4903*4882a593Smuzhiyun for (i = 1; i <= 5; i++)
4904*4882a593Smuzhiyun coex_dm->fw_tdma_para[i - 1] = tmp_buf[i];
4905*4882a593Smuzhiyun return;
4906*4882a593Smuzhiyun }
4907*4882a593Smuzhiyun
4908*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_WL_FW) {
4909*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4910*4882a593Smuzhiyun "[BTCoex], bt_info reply by WL FW\n");
4911*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4912*4882a593Smuzhiyun rtw_btc_update_bt_link_info(btc);
4913*4882a593Smuzhiyun /* rtw_btc_run_coex(btc, BTC_RSN_BTINFO); */
4914*4882a593Smuzhiyun return;
4915*4882a593Smuzhiyun }
4916*4882a593Smuzhiyun
4917*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_BT_RSP ||
4918*4882a593Smuzhiyun rsp_source == BTC_BTINFO_SRC_BT_ACT) {
4919*4882a593Smuzhiyun if (coex_sta->bt_disabled) {
4920*4882a593Smuzhiyun coex_sta->bt_disabled = FALSE;
4921*4882a593Smuzhiyun coex_sta->bt_reenable = TRUE;
4922*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_REENABLE, 15);
4923*4882a593Smuzhiyun
4924*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4925*4882a593Smuzhiyun "[BTCoex], BT enable detected by bt_info\n");
4926*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4927*4882a593Smuzhiyun }
4928*4882a593Smuzhiyun }
4929*4882a593Smuzhiyun
4930*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_BT_SLOT1) {
4931*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4932*4882a593Smuzhiyun "[BTCoex], BT slot length = [%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x]\n",
4933*4882a593Smuzhiyun tmp_buf[1], tmp_buf[2], tmp_buf[3], tmp_buf[4],
4934*4882a593Smuzhiyun tmp_buf[5], tmp_buf[6], tmp_buf[7], tmp_buf[8],
4935*4882a593Smuzhiyun tmp_buf[9], tmp_buf[10]);
4936*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4937*4882a593Smuzhiyun
4938*4882a593Smuzhiyun for (i = 1; i <= 10; i++)
4939*4882a593Smuzhiyun coex_dm->bt_slot_length1[i - 1] = tmp_buf[i];
4940*4882a593Smuzhiyun return;
4941*4882a593Smuzhiyun }
4942*4882a593Smuzhiyun
4943*4882a593Smuzhiyun if (rsp_source == BTC_BTINFO_SRC_BT_SLOT2) {
4944*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4945*4882a593Smuzhiyun "[BTCoex], BT slot length = [%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x]\n",
4946*4882a593Smuzhiyun tmp_buf[1], tmp_buf[2], tmp_buf[3], tmp_buf[4],
4947*4882a593Smuzhiyun tmp_buf[5], tmp_buf[6], tmp_buf[7], tmp_buf[8],
4948*4882a593Smuzhiyun tmp_buf[9], tmp_buf[10]);
4949*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4950*4882a593Smuzhiyun
4951*4882a593Smuzhiyun for (i = 1; i <= 10; i++)
4952*4882a593Smuzhiyun coex_dm->bt_slot_length2[i - 1] = tmp_buf[i];
4953*4882a593Smuzhiyun return;
4954*4882a593Smuzhiyun }
4955*4882a593Smuzhiyun
4956*4882a593Smuzhiyun if (length != 7) {
4957*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4958*4882a593Smuzhiyun "[BTCoex], Bt_info length = %d invalid!!\n",
4959*4882a593Smuzhiyun length);
4960*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4961*4882a593Smuzhiyun return;
4962*4882a593Smuzhiyun }
4963*4882a593Smuzhiyun
4964*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4965*4882a593Smuzhiyun "[BTCoex], Bt_info[%d], len=%d, data=[%02x %02x %02x %02x %02x %02x]\n",
4966*4882a593Smuzhiyun tmp_buf[0], length, tmp_buf[1], tmp_buf[2], tmp_buf[3],
4967*4882a593Smuzhiyun tmp_buf[4], tmp_buf[5], tmp_buf[6]);
4968*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4969*4882a593Smuzhiyun
4970*4882a593Smuzhiyun for (i = 0; i < 7; i++)
4971*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
4972*4882a593Smuzhiyun
4973*4882a593Smuzhiyun if (coex_sta->bt_info_c2h[rsp_source][1] == coex_sta->bt_info_lb2 &&
4974*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][2] == coex_sta->bt_info_lb3 &&
4975*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][3] == coex_sta->bt_info_hb0 &&
4976*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][4] == coex_sta->bt_info_hb1 &&
4977*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][5] == coex_sta->bt_info_hb2 &&
4978*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][6] == coex_sta->bt_info_hb3) {
4979*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4980*4882a593Smuzhiyun "[BTCoex], Return because Btinfo duplicate!!\n");
4981*4882a593Smuzhiyun BTC_TRACE(trace_buf);
4982*4882a593Smuzhiyun return;
4983*4882a593Smuzhiyun }
4984*4882a593Smuzhiyun
4985*4882a593Smuzhiyun coex_sta->bt_info_lb2 = coex_sta->bt_info_c2h[rsp_source][1];
4986*4882a593Smuzhiyun coex_sta->bt_info_lb3 = coex_sta->bt_info_c2h[rsp_source][2];
4987*4882a593Smuzhiyun coex_sta->bt_info_hb0 = coex_sta->bt_info_c2h[rsp_source][3];
4988*4882a593Smuzhiyun coex_sta->bt_info_hb1 = coex_sta->bt_info_c2h[rsp_source][4];
4989*4882a593Smuzhiyun coex_sta->bt_info_hb2 = coex_sta->bt_info_c2h[rsp_source][5];
4990*4882a593Smuzhiyun coex_sta->bt_info_hb3 = coex_sta->bt_info_c2h[rsp_source][6];
4991*4882a593Smuzhiyun
4992*4882a593Smuzhiyun /* ========== BT info Low-Byte2 ========== */
4993*4882a593Smuzhiyun /* if 0xff, it means BT is under WHCK test */
4994*4882a593Smuzhiyun coex_sta->bt_whck_test = (coex_sta->bt_info_lb2 == 0xff);
4995*4882a593Smuzhiyun coex_sta->bt_inq_page = ((coex_sta->bt_info_lb2 & BIT(2)) == BIT(2));
4996*4882a593Smuzhiyun
4997*4882a593Smuzhiyun if (coex_sta->bt_inq_page_pre != coex_sta->bt_inq_page) {
4998*4882a593Smuzhiyun coex_sta->bt_inq_page_pre = coex_sta->bt_inq_page;
4999*4882a593Smuzhiyun coex_sta->bt_inq_page_remain = TRUE;
5000*4882a593Smuzhiyun
5001*4882a593Smuzhiyun if (!coex_sta->bt_inq_page)
5002*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_INQPAGE, 2);
5003*4882a593Smuzhiyun }
5004*4882a593Smuzhiyun coex_sta->bt_acl_busy = ((coex_sta->bt_info_lb2 & BIT(3)) == BIT(3));
5005*4882a593Smuzhiyun
5006*4882a593Smuzhiyun if (coex_sta->bt_info_lb2 & BIT(5)) {
5007*4882a593Smuzhiyun if ((coex_sta->bt_info_hb1 & BIT(0)) == BIT(0)) {
5008*4882a593Smuzhiyun /*BLE HID*/
5009*4882a593Smuzhiyun coex_sta->bt_ble_hid_exist = TRUE;
5010*4882a593Smuzhiyun coex_sta->bt_ble_exist = FALSE;
5011*4882a593Smuzhiyun }
5012*4882a593Smuzhiyun } else if ((coex_sta->bt_info_hb1 & BIT(0)) == BIT(0)) {
5013*4882a593Smuzhiyun /*RCU*/
5014*4882a593Smuzhiyun coex_sta->bt_ble_exist = TRUE;
5015*4882a593Smuzhiyun } else {
5016*4882a593Smuzhiyun coex_sta->bt_ble_hid_exist = FALSE;
5017*4882a593Smuzhiyun coex_sta->bt_ble_exist = FALSE;
5018*4882a593Smuzhiyun }
5019*4882a593Smuzhiyun
5020*4882a593Smuzhiyun /* ========== BT info Low-Byte3 ========== */
5021*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_RETRY] = coex_sta->bt_info_lb3 & 0xf;
5022*4882a593Smuzhiyun
5023*4882a593Smuzhiyun if (coex_sta->cnt_bt[BTC_CNT_BT_RETRY] >= 1)
5024*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_POPEVENT]++;
5025*4882a593Smuzhiyun
5026*4882a593Smuzhiyun coex_sta->bt_fix_2M = ((coex_sta->bt_info_lb3 & BIT(4)) == BIT(4));
5027*4882a593Smuzhiyun
5028*4882a593Smuzhiyun coex_sta->bt_inq = ((coex_sta->bt_info_lb3 & BIT(5)) == BIT(5));
5029*4882a593Smuzhiyun
5030*4882a593Smuzhiyun coex_sta->bt_mesh = ((coex_sta->bt_info_lb3 & BIT(6)) == BIT(6));
5031*4882a593Smuzhiyun
5032*4882a593Smuzhiyun if (coex_sta->bt_inq)
5033*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_INQ]++;
5034*4882a593Smuzhiyun
5035*4882a593Smuzhiyun coex_sta->bt_page = ((coex_sta->bt_info_lb3 & BIT(7)) == BIT(7));
5036*4882a593Smuzhiyun
5037*4882a593Smuzhiyun if (coex_sta->bt_page)
5038*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_PAGE]++;
5039*4882a593Smuzhiyun
5040*4882a593Smuzhiyun /* ========== BT info High-Byte0 ========== */
5041*4882a593Smuzhiyun /* unit: %, value-100 to translate to unit: dBm */
5042*4882a593Smuzhiyun if (btc->chip_para->bt_rssi_type == BTC_BTRSSI_RATIO) {
5043*4882a593Smuzhiyun coex_sta->bt_rssi = coex_sta->bt_info_hb0 * 2 + 10;
5044*4882a593Smuzhiyun } else { /* coex_sta->bt_info_hb0 is just dbm */
5045*4882a593Smuzhiyun if (coex_sta->bt_info_hb0 <= 127)
5046*4882a593Smuzhiyun coex_sta->bt_rssi = 100;
5047*4882a593Smuzhiyun else if (256 - coex_sta->bt_info_hb0 <= 100)
5048*4882a593Smuzhiyun coex_sta->bt_rssi = 100 - (256 - coex_sta->bt_info_hb0);
5049*4882a593Smuzhiyun else
5050*4882a593Smuzhiyun coex_sta->bt_rssi = 0;
5051*4882a593Smuzhiyun }
5052*4882a593Smuzhiyun
5053*4882a593Smuzhiyun /* ========== BT info High-Byte1 ========== */
5054*4882a593Smuzhiyun if (coex_sta->bt_info_hb1 & BIT(1))
5055*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_REINIT]++;
5056*4882a593Smuzhiyun
5057*4882a593Smuzhiyun if ((coex_sta->bt_info_hb1 & BIT(2)) ||
5058*4882a593Smuzhiyun (coex_sta->bt_page && coex_sta->wl_pnp_wakeup)) {
5059*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_SETUPLINK]++;
5060*4882a593Smuzhiyun coex_sta->bt_setup_link = TRUE;
5061*4882a593Smuzhiyun
5062*4882a593Smuzhiyun if (coex_sta->bt_reenable)
5063*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_RELINK, 6);
5064*4882a593Smuzhiyun else
5065*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_RELINK, 1);
5066*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5067*4882a593Smuzhiyun "[BTCoex], Re-Link start in BT info!!\n");
5068*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5069*4882a593Smuzhiyun }
5070*4882a593Smuzhiyun
5071*4882a593Smuzhiyun if (coex_sta->bt_info_hb1 & BIT(3))
5072*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_IGNWLANACT]++;
5073*4882a593Smuzhiyun
5074*4882a593Smuzhiyun coex_sta->bt_ble_voice = ((coex_sta->bt_info_hb1 & BIT(4)) == BIT(4));
5075*4882a593Smuzhiyun coex_sta->bt_ble_scan_en = ((coex_sta->bt_info_hb1 & BIT(5)) == BIT(5));
5076*4882a593Smuzhiyun
5077*4882a593Smuzhiyun if (coex_sta->bt_info_hb1 & BIT(6))
5078*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_ROLESWITCH]++;
5079*4882a593Smuzhiyun
5080*4882a593Smuzhiyun coex_sta->bt_multi_link = ((coex_sta->bt_info_hb1 & BIT(7)) == BIT(7));
5081*4882a593Smuzhiyun
5082*4882a593Smuzhiyun /* for multi_link = 0 but bt pkt remain exist ->
5083*4882a593Smuzhiyun * Use PS-TDMA to protect WL RX
5084*4882a593Smuzhiyun */
5085*4882a593Smuzhiyun if (!coex_sta->bt_multi_link && coex_sta->bt_multi_link_pre) {
5086*4882a593Smuzhiyun coex_sta->bt_multi_link_remain = TRUE;
5087*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_MULTILINK, 3);
5088*4882a593Smuzhiyun }
5089*4882a593Smuzhiyun
5090*4882a593Smuzhiyun coex_sta->bt_multi_link_pre = coex_sta->bt_multi_link;
5091*4882a593Smuzhiyun
5092*4882a593Smuzhiyun /* Here we need to resend some wifi info to BT */
5093*4882a593Smuzhiyun /* because bt is reset and loss of the info. */
5094*4882a593Smuzhiyun /* Re-Init */
5095*4882a593Smuzhiyun if ((coex_sta->bt_info_hb1 & BIT(1))) {
5096*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5097*4882a593Smuzhiyun "[BTCoex], BT Re-init, send wifi BW & Chnl to BT!!\n");
5098*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5099*4882a593Smuzhiyun if (link_info_ext->is_connected)
5100*4882a593Smuzhiyun type = BTC_MEDIA_CONNECT;
5101*4882a593Smuzhiyun else
5102*4882a593Smuzhiyun type = BTC_MEDIA_DISCONNECT;
5103*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, type);
5104*4882a593Smuzhiyun }
5105*4882a593Smuzhiyun
5106*4882a593Smuzhiyun /* If Ignore_WLanAct && not SetUp_Link */
5107*4882a593Smuzhiyun if ((coex_sta->bt_info_hb1 & BIT(3)) &&
5108*4882a593Smuzhiyun (!(coex_sta->bt_info_hb1 & BIT(2)))) {
5109*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5110*4882a593Smuzhiyun "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
5111*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5112*4882a593Smuzhiyun rtw_btc_ignore_wlan_act(btc, FC_EXCU, FALSE);
5113*4882a593Smuzhiyun }
5114*4882a593Smuzhiyun
5115*4882a593Smuzhiyun /* ========== BT info High-Byte2 ========== */
5116*4882a593Smuzhiyun coex_sta->bt_opp_exist = ((coex_sta->bt_info_hb2 & BIT(0)) == BIT(0));
5117*4882a593Smuzhiyun
5118*4882a593Smuzhiyun if (coex_sta->bt_info_hb2 & BIT(1))
5119*4882a593Smuzhiyun coex_sta->cnt_bt[BTC_CNT_BT_AFHUPDATE]++;
5120*4882a593Smuzhiyun
5121*4882a593Smuzhiyun coex_sta->bt_a2dp_active = ((coex_sta->bt_info_hb2 & BIT(2)) == BIT(2));
5122*4882a593Smuzhiyun
5123*4882a593Smuzhiyun /*for a2dp_active = 0 but bt pkt remain exist ->
5124*4882a593Smuzhiyun * Use PS-TDMA to protect WL RX*/
5125*4882a593Smuzhiyun if (!coex_sta->bt_a2dp_active && coex_sta->bt_a2dp_active_pre) {
5126*4882a593Smuzhiyun coex_sta->bt_a2dp_active_remain = TRUE;
5127*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_BT_A2DP_ACT, 5);
5128*4882a593Smuzhiyun }
5129*4882a593Smuzhiyun
5130*4882a593Smuzhiyun coex_sta->bt_a2dp_active_pre = coex_sta->bt_a2dp_active;
5131*4882a593Smuzhiyun
5132*4882a593Smuzhiyun coex_sta->bt_slave = ((coex_sta->bt_info_hb2 & BIT(3)) == BIT(3));
5133*4882a593Smuzhiyun coex_sta->bt_hid_slot = (coex_sta->bt_info_hb2 & 0x30) >> 4;
5134*4882a593Smuzhiyun coex_sta->bt_hid_pair_num = (coex_sta->bt_info_hb2 & 0xc0) >> 6;
5135*4882a593Smuzhiyun
5136*4882a593Smuzhiyun if (coex_sta->bt_hid_pair_num > 0 && coex_sta->bt_hid_slot >= 2) {
5137*4882a593Smuzhiyun coex_sta->bt_418_hid_exist = TRUE;
5138*4882a593Smuzhiyun } else if (coex_sta->bt_hid_pair_num == 0 ||
5139*4882a593Smuzhiyun coex_sta->bt_hid_slot == 1) {
5140*4882a593Smuzhiyun coex_sta->bt_418_hid_exist = FALSE;
5141*4882a593Smuzhiyun }
5142*4882a593Smuzhiyun
5143*4882a593Smuzhiyun /* ========== BT info High-Byte3 ========== */
5144*4882a593Smuzhiyun if ((coex_sta->bt_info_lb2 & 0x49) == 0x49)
5145*4882a593Smuzhiyun coex_sta->bt_a2dp_bitpool = (coex_sta->bt_info_hb3 & 0x7f);
5146*4882a593Smuzhiyun else
5147*4882a593Smuzhiyun coex_sta->bt_a2dp_bitpool = 0;
5148*4882a593Smuzhiyun
5149*4882a593Smuzhiyun coex_sta->bt_a2dp_sink = ((coex_sta->bt_info_hb3 & BIT(7)) == BIT(7));
5150*4882a593Smuzhiyun
5151*4882a593Smuzhiyun rtw_btc_update_bt_link_info(btc);
5152*4882a593Smuzhiyun
5153*4882a593Smuzhiyun if (!coex_sta->wl_in_lps_enter)
5154*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_BTINFO);
5155*4882a593Smuzhiyun }
5156*4882a593Smuzhiyun
rtw_btc_ex_wl_fwdbginfo_notify(struct btc_coexist * btc,u8 * tmp_buf,u8 length)5157*4882a593Smuzhiyun void rtw_btc_ex_wl_fwdbginfo_notify(struct btc_coexist *btc, u8 *tmp_buf,
5158*4882a593Smuzhiyun u8 length)
5159*4882a593Smuzhiyun {
5160*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5161*4882a593Smuzhiyun u8 i = 0, val = 0;
5162*4882a593Smuzhiyun
5163*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5164*4882a593Smuzhiyun "[BTCoex], WiFi Fw Dbg info = %d %d %d %d %d %d %d %d (len = %d)\n",
5165*4882a593Smuzhiyun tmp_buf[0], tmp_buf[1], tmp_buf[2], tmp_buf[3], tmp_buf[4],
5166*4882a593Smuzhiyun tmp_buf[5], tmp_buf[6], tmp_buf[7], length);
5167*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5168*4882a593Smuzhiyun
5169*4882a593Smuzhiyun if (tmp_buf[0] != 0x8)
5170*4882a593Smuzhiyun return;
5171*4882a593Smuzhiyun
5172*4882a593Smuzhiyun for (i = 1; i <= 7; i++) {
5173*4882a593Smuzhiyun val = coex_sta->wl_fw_dbg_info_pre[i];
5174*4882a593Smuzhiyun if (tmp_buf[i] >= val)
5175*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[i] = tmp_buf[i] - val;
5176*4882a593Smuzhiyun else
5177*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info[i] = 255 - val + tmp_buf[i];
5178*4882a593Smuzhiyun
5179*4882a593Smuzhiyun coex_sta->wl_fw_dbg_info_pre[i] = tmp_buf[i];
5180*4882a593Smuzhiyun }
5181*4882a593Smuzhiyun
5182*4882a593Smuzhiyun /* wl_fwdbginfo_notify is auto send by WL FW if TDMA slot toggle = 20
5183*4882a593Smuzhiyun * coex_sta->wl_fw_dbg_info[6] = TDMA slot toggle
5184*4882a593Smuzhiyun * For debug, TDMA slot toggle should be calculated by 2-second
5185*4882a593Smuzhiyun */
5186*4882a593Smuzhiyun coex_sta->cnt_wl[BTC_CNT_WL_FW_NOTIFY]++;
5187*4882a593Smuzhiyun rtw_btc_wl_ccklock_action(btc);
5188*4882a593Smuzhiyun }
5189*4882a593Smuzhiyun
rtw_btc_ex_rx_rate_change_notify(struct btc_coexist * btc,BOOLEAN is_data_frame,u8 btc_rate_id)5190*4882a593Smuzhiyun void rtw_btc_ex_rx_rate_change_notify(struct btc_coexist *btc,
5191*4882a593Smuzhiyun BOOLEAN is_data_frame, u8 btc_rate_id)
5192*4882a593Smuzhiyun {
5193*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5194*4882a593Smuzhiyun
5195*4882a593Smuzhiyun if (is_data_frame)
5196*4882a593Smuzhiyun coex_sta->wl_rx_rate = btc_rate_id;
5197*4882a593Smuzhiyun
5198*4882a593Smuzhiyun else
5199*4882a593Smuzhiyun coex_sta->wl_rts_rx_rate = btc_rate_id;
5200*4882a593Smuzhiyun
5201*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5202*4882a593Smuzhiyun "[BTCoex], %s(): rate id = %d, RTS_Rate = %d\n", __func__,
5203*4882a593Smuzhiyun coex_sta->wl_rx_rate, coex_sta->wl_rts_rx_rate);
5204*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5205*4882a593Smuzhiyun
5206*4882a593Smuzhiyun rtw_btc_wl_ccklock_detect(btc);
5207*4882a593Smuzhiyun }
5208*4882a593Smuzhiyun
rtw_btc_ex_tx_rate_change_notify(struct btc_coexist * btc,u8 tx_rate,u8 tx_retry_ratio,u8 macid)5209*4882a593Smuzhiyun void rtw_btc_ex_tx_rate_change_notify(struct btc_coexist *btc, u8 tx_rate,
5210*4882a593Smuzhiyun u8 tx_retry_ratio, u8 macid)
5211*4882a593Smuzhiyun {
5212*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5213*4882a593Smuzhiyun
5214*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5215*4882a593Smuzhiyun "[BTCoex], %s(): Tx_Rate = %d, Tx_Retry_Ratio = %d, macid =%d\n",
5216*4882a593Smuzhiyun __func__, tx_rate, tx_retry_ratio, macid);
5217*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5218*4882a593Smuzhiyun
5219*4882a593Smuzhiyun coex_sta->wl_tx_rate = tx_rate;
5220*4882a593Smuzhiyun coex_sta->wl_tx_retry_ratio = tx_retry_ratio;
5221*4882a593Smuzhiyun coex_sta->wl_tx_macid = macid;
5222*4882a593Smuzhiyun }
5223*4882a593Smuzhiyun
rtw_btc_ex_rf_status_notify(struct btc_coexist * btc,u8 type)5224*4882a593Smuzhiyun void rtw_btc_ex_rf_status_notify(struct btc_coexist *btc, u8 type)
5225*4882a593Smuzhiyun {
5226*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5227*4882a593Smuzhiyun
5228*4882a593Smuzhiyun if (type == BTC_RF_ON) {
5229*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5230*4882a593Smuzhiyun "[BTCoex], %s(): RF is turned ON!!\n", __func__);
5231*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5232*4882a593Smuzhiyun btc->stop_coex_dm = FALSE;
5233*4882a593Smuzhiyun btc->wl_rf_state_off = FALSE;
5234*4882a593Smuzhiyun
5235*4882a593Smuzhiyun } else if (type == BTC_RF_OFF) {
5236*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5237*4882a593Smuzhiyun "[BTCoex], %s(): RF is turned Off!!\n", __func__);
5238*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5239*4882a593Smuzhiyun
5240*4882a593Smuzhiyun rtw_btc_action_wl_off(btc);
5241*4882a593Smuzhiyun }
5242*4882a593Smuzhiyun }
5243*4882a593Smuzhiyun
rtw_btc_ex_halt_notify(struct btc_coexist * btc)5244*4882a593Smuzhiyun void rtw_btc_ex_halt_notify(struct btc_coexist *btc)
5245*4882a593Smuzhiyun {
5246*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
5247*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5248*4882a593Smuzhiyun
5249*4882a593Smuzhiyun rtw_btc_action_wl_off(btc);
5250*4882a593Smuzhiyun }
5251*4882a593Smuzhiyun
rtw_btc_ex_pnp_notify(struct btc_coexist * btc,u8 pnp_state)5252*4882a593Smuzhiyun void rtw_btc_ex_pnp_notify(struct btc_coexist *btc, u8 pnp_state)
5253*4882a593Smuzhiyun {
5254*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5255*4882a593Smuzhiyun struct btc_wifi_link_info_ext *link_info_ext = &btc->wifi_link_info_ext;
5256*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
5257*4882a593Smuzhiyun u8 phase;
5258*4882a593Smuzhiyun
5259*4882a593Smuzhiyun if (pnp_state == BTC_WIFI_PNP_SLEEP ||
5260*4882a593Smuzhiyun pnp_state == BTC_WIFI_PNP_SLEEP_KEEP_ANT) {
5261*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5262*4882a593Smuzhiyun "[BTCoex], %s(): Sleep\n", __func__);
5263*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5264*4882a593Smuzhiyun
5265*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
5266*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_ALL, FALSE);
5267*4882a593Smuzhiyun else
5268*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_ALL_32BIT, FALSE);
5269*4882a593Smuzhiyun
5270*4882a593Smuzhiyun if (pnp_state == BTC_WIFI_PNP_SLEEP_KEEP_ANT) {
5271*4882a593Smuzhiyun if (link_info_ext->is_all_under_5g)
5272*4882a593Smuzhiyun phase = BTC_ANT_5G;
5273*4882a593Smuzhiyun else
5274*4882a593Smuzhiyun phase = BTC_ANT_2G;
5275*4882a593Smuzhiyun } else {
5276*4882a593Smuzhiyun phase = BTC_ANT_WOFF;
5277*4882a593Smuzhiyun }
5278*4882a593Smuzhiyun rtw_btc_set_ant_path(btc, FC_EXCU, phase);
5279*4882a593Smuzhiyun
5280*4882a593Smuzhiyun btc->stop_coex_dm = TRUE;
5281*4882a593Smuzhiyun } else {
5282*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5283*4882a593Smuzhiyun "[BTCoex], %s(): Wake up\n", __func__);
5284*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5285*4882a593Smuzhiyun coex_sta->wl_pnp_wakeup = TRUE;
5286*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_PNPWAKEUP, 3);
5287*4882a593Smuzhiyun
5288*4882a593Smuzhiyun /*WoWLAN*/
5289*4882a593Smuzhiyun if (coex_sta->wl_pnp_state_pre == BTC_WIFI_PNP_SLEEP_KEEP_ANT ||
5290*4882a593Smuzhiyun pnp_state == BTC_WIFI_PNP_WOWLAN) {
5291*4882a593Smuzhiyun btc->stop_coex_dm = FALSE;
5292*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_PNP);
5293*4882a593Smuzhiyun }
5294*4882a593Smuzhiyun }
5295*4882a593Smuzhiyun
5296*4882a593Smuzhiyun coex_sta->wl_pnp_state_pre = pnp_state;
5297*4882a593Smuzhiyun }
5298*4882a593Smuzhiyun
rtw_btc_ex_coex_dm_reset(struct btc_coexist * btc)5299*4882a593Smuzhiyun void rtw_btc_ex_coex_dm_reset(struct btc_coexist *btc)
5300*4882a593Smuzhiyun {
5301*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], %s()\n", __func__);
5302*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5303*4882a593Smuzhiyun
5304*4882a593Smuzhiyun rtw_btc_init_hw_config(btc, FALSE);
5305*4882a593Smuzhiyun }
5306*4882a593Smuzhiyun
rtw_btc_ex_periodical(struct btc_coexist * btc)5307*4882a593Smuzhiyun void rtw_btc_ex_periodical(struct btc_coexist *btc)
5308*4882a593Smuzhiyun {
5309*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5310*4882a593Smuzhiyun "[BTCoex], ============== Periodical ==============\n");
5311*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5312*4882a593Smuzhiyun }
5313*4882a593Smuzhiyun
rtw_btc_ex_timerup_notify(struct btc_coexist * btc,u32 type)5314*4882a593Smuzhiyun void rtw_btc_ex_timerup_notify(struct btc_coexist *btc, u32 type)
5315*4882a593Smuzhiyun {
5316*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5317*4882a593Smuzhiyun const struct btc_chip_para *chip_para = btc->chip_para;
5318*4882a593Smuzhiyun boolean is_change = FALSE;
5319*4882a593Smuzhiyun
5320*4882a593Smuzhiyun /* COEX-649, prevent TDMA parametet change in LeisurePSEnter()*/
5321*4882a593Smuzhiyun if (coex_sta->wl_in_lps_enter) {
5322*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5323*4882a593Smuzhiyun "[BTCoex], %s(): wl_in_LPSenter = %d\n",
5324*4882a593Smuzhiyun __func__, coex_sta->wl_in_lps_enter);
5325*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5326*4882a593Smuzhiyun }
5327*4882a593Smuzhiyun
5328*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_STAYBUSY)) {
5329*4882a593Smuzhiyun if (!coex_sta->wl_busy_pre) {
5330*4882a593Smuzhiyun coex_sta->wl_gl_busy = FALSE;
5331*4882a593Smuzhiyun is_change = TRUE;
5332*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, BTC_MEDIA_DISCONNECT);
5333*4882a593Smuzhiyun if (chip_para->scbd_bit_num == BTC_SCBD_16_BIT)
5334*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_WLBUSY, FALSE);
5335*4882a593Smuzhiyun else
5336*4882a593Smuzhiyun btc->btc_write_scbd_32bit(btc, BTC_SCBD_WLBUSY, FALSE);
5337*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5338*4882a593Smuzhiyun "[BTCoex], %s(): WL busy -> idle!!\n", __func__);
5339*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5340*4882a593Smuzhiyun }
5341*4882a593Smuzhiyun }
5342*4882a593Smuzhiyun
5343*4882a593Smuzhiyun /*avoid no connect finish notify */
5344*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_COEXFREEZE)) {
5345*4882a593Smuzhiyun coex_sta->coex_freeze = FALSE;
5346*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = FALSE;
5347*4882a593Smuzhiyun is_change = TRUE;
5348*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5349*4882a593Smuzhiyun "[BTCoex], %s(): Coex is de-freeze!!\n", __func__);
5350*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5351*4882a593Smuzhiyun }
5352*4882a593Smuzhiyun
5353*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_SPECPKT)) {
5354*4882a593Smuzhiyun if (!coex_sta->coex_freeze) {
5355*4882a593Smuzhiyun coex_sta->wl_hi_pri_task1 = FALSE;
5356*4882a593Smuzhiyun is_change = TRUE;
5357*4882a593Smuzhiyun }
5358*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5359*4882a593Smuzhiyun "[BTCoex], %s(): WL SPECPKT finish!\n", __func__);
5360*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5361*4882a593Smuzhiyun }
5362*4882a593Smuzhiyun
5363*4882a593Smuzhiyun /*for A2DP glitch during connecting AP*/
5364*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_CONNPKT)) {
5365*4882a593Smuzhiyun coex_sta->wl_connecting = FALSE;
5366*4882a593Smuzhiyun is_change = TRUE;
5367*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5368*4882a593Smuzhiyun "[BTCoex], %s(): WL connecting stop!!\n", __func__);
5369*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5370*4882a593Smuzhiyun }
5371*4882a593Smuzhiyun
5372*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_PNPWAKEUP)) {
5373*4882a593Smuzhiyun coex_sta->wl_pnp_wakeup = FALSE;
5374*4882a593Smuzhiyun is_change = TRUE;
5375*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5376*4882a593Smuzhiyun "[BTCoex], %s(): WL pnp wakeup stop!!\n", __func__);
5377*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5378*4882a593Smuzhiyun }
5379*4882a593Smuzhiyun
5380*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_WL_CCKLOCK)) {
5381*4882a593Smuzhiyun if (coex_sta->wl_cck_lock_pre) {
5382*4882a593Smuzhiyun coex_sta->wl_cck_lock_ever = TRUE;
5383*4882a593Smuzhiyun is_change = TRUE;
5384*4882a593Smuzhiyun }
5385*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5386*4882a593Smuzhiyun "[BTCoex], %s(): WL CCK Lock Detect!!\n", __func__);
5387*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5388*4882a593Smuzhiyun }
5389*4882a593Smuzhiyun
5390*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_BT_RELINK)) {
5391*4882a593Smuzhiyun coex_sta->bt_setup_link = FALSE;
5392*4882a593Smuzhiyun is_change = TRUE;
5393*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5394*4882a593Smuzhiyun "[BTCoex], %s(): Re-Link stop!!\n", __func__);
5395*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5396*4882a593Smuzhiyun }
5397*4882a593Smuzhiyun
5398*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_BT_REENABLE)) {
5399*4882a593Smuzhiyun coex_sta->bt_reenable = FALSE;
5400*4882a593Smuzhiyun is_change = TRUE;
5401*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5402*4882a593Smuzhiyun "[BTCoex], %s(): BT renable finish!!\n", __func__);
5403*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5404*4882a593Smuzhiyun }
5405*4882a593Smuzhiyun
5406*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_BT_MULTILINK)) {
5407*4882a593Smuzhiyun coex_sta->bt_multi_link_remain = FALSE;
5408*4882a593Smuzhiyun is_change = TRUE;
5409*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5410*4882a593Smuzhiyun "[BTCoex], %s(): BT multilink disappear !!\n",
5411*4882a593Smuzhiyun __func__);
5412*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5413*4882a593Smuzhiyun }
5414*4882a593Smuzhiyun
5415*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_BT_INQPAGE)) {
5416*4882a593Smuzhiyun coex_sta->bt_inq_page_remain = FALSE;
5417*4882a593Smuzhiyun is_change = TRUE;
5418*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5419*4882a593Smuzhiyun "[BTCoex], %s(): BT inq_page disappear !!\n",
5420*4882a593Smuzhiyun __func__);
5421*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5422*4882a593Smuzhiyun }
5423*4882a593Smuzhiyun
5424*4882a593Smuzhiyun if (type & BIT(BTC_TIMER_BT_A2DP_ACT)) {
5425*4882a593Smuzhiyun coex_sta->bt_a2dp_active_remain = FALSE;
5426*4882a593Smuzhiyun is_change = TRUE;
5427*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5428*4882a593Smuzhiyun "[BTCoex], %s(): BT A2DP active disappear !!\n",
5429*4882a593Smuzhiyun __func__);
5430*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5431*4882a593Smuzhiyun }
5432*4882a593Smuzhiyun
5433*4882a593Smuzhiyun if (is_change && !coex_sta->wl_in_lps_enter)
5434*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_TIMERUP);
5435*4882a593Smuzhiyun }
5436*4882a593Smuzhiyun
rtw_btc_ex_wl_status_change_notify(struct btc_coexist * btc,u32 type)5437*4882a593Smuzhiyun void rtw_btc_ex_wl_status_change_notify(struct btc_coexist *btc, u32 type)
5438*4882a593Smuzhiyun {
5439*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5440*4882a593Smuzhiyun boolean is_change = FALSE;
5441*4882a593Smuzhiyun
5442*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_TOIDLE)) { /* if busy->idle */
5443*4882a593Smuzhiyun coex_sta->wl_busy_pre = FALSE;
5444*4882a593Smuzhiyun btc->btc_set_timer(btc, BTC_TIMER_WL_STAYBUSY, 6);
5445*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5446*4882a593Smuzhiyun "[BTCoex], %s(): WL busy -> idle!!\n", __func__);
5447*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5448*4882a593Smuzhiyun }
5449*4882a593Smuzhiyun
5450*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_TOBUSY)) { /* if idle->busy */
5451*4882a593Smuzhiyun coex_sta->wl_gl_busy = TRUE;
5452*4882a593Smuzhiyun coex_sta->wl_busy_pre = TRUE;
5453*4882a593Smuzhiyun is_change = TRUE;
5454*4882a593Smuzhiyun rtw_btc_update_wl_ch_info(btc, BTC_MEDIA_CONNECT);
5455*4882a593Smuzhiyun #if 0
5456*4882a593Smuzhiyun btc->btc_write_scbd(btc, BTC_SCBD_WLBUSY, TRUE);
5457*4882a593Smuzhiyun #endif
5458*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5459*4882a593Smuzhiyun "[BTCoex], %s(): WL idle -> busy!!\n", __func__);
5460*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5461*4882a593Smuzhiyun }
5462*4882a593Smuzhiyun
5463*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_RSSI)) { /* if RSSI change */
5464*4882a593Smuzhiyun is_change = TRUE;
5465*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5466*4882a593Smuzhiyun "[BTCoex], %s(): WL RSSI change!!\n", __func__);
5467*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5468*4882a593Smuzhiyun }
5469*4882a593Smuzhiyun
5470*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_LINKINFO)) { /* if linkinfo change */
5471*4882a593Smuzhiyun is_change = TRUE;
5472*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5473*4882a593Smuzhiyun "[BTCoex], %s(): WL LinkInfo change!!\n", __func__);
5474*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5475*4882a593Smuzhiyun }
5476*4882a593Smuzhiyun
5477*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_DIR)) { /*if WL UL-DL change*/
5478*4882a593Smuzhiyun is_change = TRUE;
5479*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5480*4882a593Smuzhiyun "[BTCoex], %s(): WL UL-DL change!!\n", __func__);
5481*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5482*4882a593Smuzhiyun }
5483*4882a593Smuzhiyun
5484*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_NOISY)) { /*if noisy level change*/
5485*4882a593Smuzhiyun is_change = TRUE;
5486*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5487*4882a593Smuzhiyun "[BTCoex], %s():Noisy Level change!!\n", __func__);
5488*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5489*4882a593Smuzhiyun }
5490*4882a593Smuzhiyun
5491*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_BTCNT)) { /*if BT counter change*/
5492*4882a593Smuzhiyun is_change = TRUE;
5493*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5494*4882a593Smuzhiyun "[BTCoex], %s():BT counter change!!\n", __func__);
5495*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5496*4882a593Smuzhiyun }
5497*4882a593Smuzhiyun
5498*4882a593Smuzhiyun if (type & BIT(BTC_WLSTATUS_CHANGE_LOCKTRY)) { /*if WL CCK lock try*/
5499*4882a593Smuzhiyun is_change = TRUE;
5500*4882a593Smuzhiyun coex_sta->wl_cck_lock_ever = FALSE;
5501*4882a593Smuzhiyun coex_sta->wl_cck_lock = FALSE;
5502*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5503*4882a593Smuzhiyun "[BTCoex], %s():WL CCK lock try!!\n", __func__);
5504*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5505*4882a593Smuzhiyun }
5506*4882a593Smuzhiyun
5507*4882a593Smuzhiyun if (is_change)
5508*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_WLSTATUS);
5509*4882a593Smuzhiyun }
5510*4882a593Smuzhiyun
rtw_btc_ex_wl_rfk_notify(struct btc_coexist * btc,u8 path,u8 type,u8 state)5511*4882a593Smuzhiyun void rtw_btc_ex_wl_rfk_notify(struct btc_coexist *btc, u8 path, u8 type, u8 state)
5512*4882a593Smuzhiyun {
5513*4882a593Smuzhiyun struct btc_coex_sta *coex_sta = &btc->coex_sta;
5514*4882a593Smuzhiyun
5515*4882a593Smuzhiyun BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5516*4882a593Smuzhiyun "[BTCoex], %s(), RFK path = %d, type = %d, state = %d\n",
5517*4882a593Smuzhiyun __func__, path, type, state);
5518*4882a593Smuzhiyun BTC_TRACE(trace_buf);
5519*4882a593Smuzhiyun
5520*4882a593Smuzhiyun if (state == BTC_RFK_START) {
5521*4882a593Smuzhiyun coex_sta->wl_rfk = TRUE;
5522*4882a593Smuzhiyun } else {
5523*4882a593Smuzhiyun coex_sta->wl_rfk = FALSE;
5524*4882a593Smuzhiyun
5525*4882a593Smuzhiyun /*Run coex due to RFK end*/
5526*4882a593Smuzhiyun rtw_btc_run_coex(btc, BTC_RSN_RFK);
5527*4882a593Smuzhiyun }
5528*4882a593Smuzhiyun }
5529*4882a593Smuzhiyun #endif
5530*4882a593Smuzhiyun /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */
5531