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