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