1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright(c) 2012 Realtek Corporation.*/
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun /***************************************************************
5*4882a593Smuzhiyun * Description:
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * This file is for RTL8723B Co-exist mechanism
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * History
10*4882a593Smuzhiyun * 2012/11/15 Cosa first check in.
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun ***************************************************************/
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /***************************************************************
15*4882a593Smuzhiyun * include files
16*4882a593Smuzhiyun ***************************************************************/
17*4882a593Smuzhiyun #include "halbt_precomp.h"
18*4882a593Smuzhiyun /***************************************************************
19*4882a593Smuzhiyun * Global variables, these are static variables
20*4882a593Smuzhiyun ***************************************************************/
21*4882a593Smuzhiyun static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;
22*4882a593Smuzhiyun static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
23*4882a593Smuzhiyun static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
24*4882a593Smuzhiyun static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun static const char *const glbt_info_src_8723b_1ant[] = {
27*4882a593Smuzhiyun "BT Info[wifi fw]",
28*4882a593Smuzhiyun "BT Info[bt rsp]",
29*4882a593Smuzhiyun "BT Info[bt auto report]",
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun static u32 glcoex_ver_date_8723b_1ant = 20130918;
33*4882a593Smuzhiyun static u32 glcoex_ver_8723b_1ant = 0x47;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /***************************************************************
36*4882a593Smuzhiyun * local function proto type if needed
37*4882a593Smuzhiyun ***************************************************************/
38*4882a593Smuzhiyun /***************************************************************
39*4882a593Smuzhiyun * local function start with halbtc8723b1ant_
40*4882a593Smuzhiyun ***************************************************************/
41*4882a593Smuzhiyun
halbtc8723b1ant_updatera_mask(struct btc_coexist * btcoexist,bool force_exec,u32 dis_rate_mask)42*4882a593Smuzhiyun static void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,
43*4882a593Smuzhiyun bool force_exec, u32 dis_rate_mask)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun coex_dm->curra_mask = dis_rate_mask;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
48*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
49*4882a593Smuzhiyun &coex_dm->curra_mask);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun coex_dm->prera_mask = coex_dm->curra_mask;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
btc8723b1ant_auto_rate_fb_retry(struct btc_coexist * btcoexist,bool force_exec,u8 type)54*4882a593Smuzhiyun static void btc8723b1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
55*4882a593Smuzhiyun bool force_exec, u8 type)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun bool wifi_under_bmode = false;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun coex_dm->cur_arfr_type = type;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
62*4882a593Smuzhiyun switch (coex_dm->cur_arfr_type) {
63*4882a593Smuzhiyun case 0: /* normal mode */
64*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x430,
65*4882a593Smuzhiyun coex_dm->backup_arfr_cnt1);
66*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x434,
67*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2);
68*4882a593Smuzhiyun break;
69*4882a593Smuzhiyun case 1:
70*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
71*4882a593Smuzhiyun BTC_GET_BL_WIFI_UNDER_B_MODE,
72*4882a593Smuzhiyun &wifi_under_bmode);
73*4882a593Smuzhiyun if (wifi_under_bmode) {
74*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
75*4882a593Smuzhiyun 0x430, 0x0);
76*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
77*4882a593Smuzhiyun 0x434, 0x01010101);
78*4882a593Smuzhiyun } else {
79*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
80*4882a593Smuzhiyun 0x430, 0x0);
81*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
82*4882a593Smuzhiyun 0x434, 0x04030201);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun break;
85*4882a593Smuzhiyun default:
86*4882a593Smuzhiyun break;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
halbtc8723b1ant_retry_limit(struct btc_coexist * btcoexist,bool force_exec,u8 type)93*4882a593Smuzhiyun static void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,
94*4882a593Smuzhiyun bool force_exec, u8 type)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun coex_dm->cur_retry_limit_type = type;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun if (force_exec || (coex_dm->pre_retry_limit_type !=
99*4882a593Smuzhiyun coex_dm->cur_retry_limit_type)) {
100*4882a593Smuzhiyun switch (coex_dm->cur_retry_limit_type) {
101*4882a593Smuzhiyun case 0: /* normal mode */
102*4882a593Smuzhiyun btcoexist->btc_write_2byte(btcoexist, 0x42a,
103*4882a593Smuzhiyun coex_dm->backup_retry_limit);
104*4882a593Smuzhiyun break;
105*4882a593Smuzhiyun case 1: /* retry limit = 8 */
106*4882a593Smuzhiyun btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
107*4882a593Smuzhiyun break;
108*4882a593Smuzhiyun default:
109*4882a593Smuzhiyun break;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
halbtc8723b1ant_ampdu_maxtime(struct btc_coexist * btcoexist,bool force_exec,u8 type)116*4882a593Smuzhiyun static void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,
117*4882a593Smuzhiyun bool force_exec, u8 type)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun coex_dm->cur_ampdu_time_type = type;
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun if (force_exec || (coex_dm->pre_ampdu_time_type !=
122*4882a593Smuzhiyun coex_dm->cur_ampdu_time_type)) {
123*4882a593Smuzhiyun switch (coex_dm->cur_ampdu_time_type) {
124*4882a593Smuzhiyun case 0: /* normal mode */
125*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x456,
126*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time);
127*4882a593Smuzhiyun break;
128*4882a593Smuzhiyun case 1: /* AMPDU timw = 0x38 * 32us */
129*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
130*4882a593Smuzhiyun break;
131*4882a593Smuzhiyun default:
132*4882a593Smuzhiyun break;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
halbtc8723b1ant_limited_tx(struct btc_coexist * btcoexist,bool force_exec,u8 ra_masktype,u8 arfr_type,u8 retry_limit_type,u8 ampdu_time_type)139*4882a593Smuzhiyun static void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,
140*4882a593Smuzhiyun bool force_exec, u8 ra_masktype,
141*4882a593Smuzhiyun u8 arfr_type, u8 retry_limit_type,
142*4882a593Smuzhiyun u8 ampdu_time_type)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun switch (ra_masktype) {
145*4882a593Smuzhiyun case 0: /* normal mode */
146*4882a593Smuzhiyun halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);
147*4882a593Smuzhiyun break;
148*4882a593Smuzhiyun case 1: /* disable cck 1/2 */
149*4882a593Smuzhiyun halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
150*4882a593Smuzhiyun 0x00000003);
151*4882a593Smuzhiyun break;
152*4882a593Smuzhiyun /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
153*4882a593Smuzhiyun case 2:
154*4882a593Smuzhiyun halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
155*4882a593Smuzhiyun 0x0001f1f7);
156*4882a593Smuzhiyun break;
157*4882a593Smuzhiyun default:
158*4882a593Smuzhiyun break;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun btc8723b1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
162*4882a593Smuzhiyun halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
163*4882a593Smuzhiyun halbtc8723b1ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
halbtc8723b1ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)166*4882a593Smuzhiyun static void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,
167*4882a593Smuzhiyun bool force_exec, bool rej_ap_agg_pkt,
168*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size,
169*4882a593Smuzhiyun u8 agg_buf_size)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun bool reject_rx_agg = rej_ap_agg_pkt;
172*4882a593Smuzhiyun bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
173*4882a593Smuzhiyun u8 rxaggsize = agg_buf_size;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /**********************************************
176*4882a593Smuzhiyun * Rx Aggregation related setting
177*4882a593Smuzhiyun **********************************************/
178*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
179*4882a593Smuzhiyun &reject_rx_agg);
180*4882a593Smuzhiyun /* decide BT control aggregation buf size or not */
181*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
182*4882a593Smuzhiyun &bt_ctrl_rx_agg_size);
183*4882a593Smuzhiyun /* aggregation buf size, only work
184*4882a593Smuzhiyun * when BT control Rx aggregation size.
185*4882a593Smuzhiyun */
186*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxaggsize);
187*4882a593Smuzhiyun /* real update aggregation setting */
188*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun
halbtc8723b1ant_query_bt_info(struct btc_coexist * btcoexist)191*4882a593Smuzhiyun static void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun u8 h2c_parameter[1] = {0};
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun coex_sta->c2h_bt_info_req_sent = true;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun /* trigger */
198*4882a593Smuzhiyun h2c_parameter[0] |= BIT(0);
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun
halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist * btcoexist)203*4882a593Smuzhiyun static void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
206*4882a593Smuzhiyun u32 reg_hp_tx = 0, reg_hp_rx = 0;
207*4882a593Smuzhiyun u32 reg_lp_tx = 0, reg_lp_rx = 0;
208*4882a593Smuzhiyun static u32 num_of_bt_counter_chk;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun reg_hp_txrx = 0x770;
211*4882a593Smuzhiyun reg_lp_txrx = 0x774;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
214*4882a593Smuzhiyun reg_hp_tx = u32tmp & MASKLWORD;
215*4882a593Smuzhiyun reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
218*4882a593Smuzhiyun reg_lp_tx = u32tmp & MASKLWORD;
219*4882a593Smuzhiyun reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun coex_sta->high_priority_tx = reg_hp_tx;
222*4882a593Smuzhiyun coex_sta->high_priority_rx = reg_hp_rx;
223*4882a593Smuzhiyun coex_sta->low_priority_tx = reg_lp_tx;
224*4882a593Smuzhiyun coex_sta->low_priority_rx = reg_lp_rx;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun if ((coex_sta->low_priority_tx > 1050) &&
227*4882a593Smuzhiyun (!coex_sta->c2h_bt_inquiry_page))
228*4882a593Smuzhiyun coex_sta->pop_event_cnt++;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* reset counter */
231*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun /* This part is for wifi FW and driver to update BT's status as
234*4882a593Smuzhiyun * disabled.
235*4882a593Smuzhiyun *
236*4882a593Smuzhiyun * The flow is as the following
237*4882a593Smuzhiyun * 1. disable BT
238*4882a593Smuzhiyun * 2. if all BT Tx/Rx counter = 0, after 6 sec we query bt info
239*4882a593Smuzhiyun * 3. Because BT will not rsp from mailbox, so wifi fw will know BT is
240*4882a593Smuzhiyun * disabled
241*4882a593Smuzhiyun *
242*4882a593Smuzhiyun * 4. FW will rsp c2h for BT that driver will know BT is disabled.
243*4882a593Smuzhiyun */
244*4882a593Smuzhiyun if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&
245*4882a593Smuzhiyun (reg_lp_rx == 0)) {
246*4882a593Smuzhiyun num_of_bt_counter_chk++;
247*4882a593Smuzhiyun if (num_of_bt_counter_chk == 3)
248*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
249*4882a593Smuzhiyun } else {
250*4882a593Smuzhiyun num_of_bt_counter_chk = 0;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)254*4882a593Smuzhiyun static void halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun s32 wifi_rssi = 0;
257*4882a593Smuzhiyun bool wifi_busy = false, wifi_under_b_mode = false;
258*4882a593Smuzhiyun static u8 cck_lock_counter;
259*4882a593Smuzhiyun u32 total_cnt;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
262*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
263*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
264*4882a593Smuzhiyun &wifi_under_b_mode);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun if (coex_sta->under_ips) {
267*4882a593Smuzhiyun coex_sta->crc_ok_cck = 0;
268*4882a593Smuzhiyun coex_sta->crc_ok_11g = 0;
269*4882a593Smuzhiyun coex_sta->crc_ok_11n = 0;
270*4882a593Smuzhiyun coex_sta->crc_ok_11n_agg = 0;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun coex_sta->crc_err_cck = 0;
273*4882a593Smuzhiyun coex_sta->crc_err_11g = 0;
274*4882a593Smuzhiyun coex_sta->crc_err_11n = 0;
275*4882a593Smuzhiyun coex_sta->crc_err_11n_agg = 0;
276*4882a593Smuzhiyun } else {
277*4882a593Smuzhiyun coex_sta->crc_ok_cck =
278*4882a593Smuzhiyun btcoexist->btc_read_4byte(btcoexist, 0xf88);
279*4882a593Smuzhiyun coex_sta->crc_ok_11g =
280*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xf94);
281*4882a593Smuzhiyun coex_sta->crc_ok_11n =
282*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xf90);
283*4882a593Smuzhiyun coex_sta->crc_ok_11n_agg =
284*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xfb8);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun coex_sta->crc_err_cck =
287*4882a593Smuzhiyun btcoexist->btc_read_4byte(btcoexist, 0xf84);
288*4882a593Smuzhiyun coex_sta->crc_err_11g =
289*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xf96);
290*4882a593Smuzhiyun coex_sta->crc_err_11n =
291*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xf92);
292*4882a593Smuzhiyun coex_sta->crc_err_11n_agg =
293*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0xfba);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* reset counter */
297*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
298*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
301*4882a593Smuzhiyun total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
302*4882a593Smuzhiyun coex_sta->crc_ok_11n + coex_sta->crc_ok_11n_agg;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun if ((coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
305*4882a593Smuzhiyun (coex_dm->bt_status ==
306*4882a593Smuzhiyun BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
307*4882a593Smuzhiyun (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) {
308*4882a593Smuzhiyun if (coex_sta->crc_ok_cck >
309*4882a593Smuzhiyun (total_cnt - coex_sta->crc_ok_cck)) {
310*4882a593Smuzhiyun if (cck_lock_counter < 3)
311*4882a593Smuzhiyun cck_lock_counter++;
312*4882a593Smuzhiyun } else {
313*4882a593Smuzhiyun if (cck_lock_counter > 0)
314*4882a593Smuzhiyun cck_lock_counter--;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun } else {
318*4882a593Smuzhiyun if (cck_lock_counter > 0)
319*4882a593Smuzhiyun cck_lock_counter--;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun } else {
322*4882a593Smuzhiyun if (cck_lock_counter > 0)
323*4882a593Smuzhiyun cck_lock_counter--;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun if (!coex_sta->pre_ccklock) {
327*4882a593Smuzhiyun if (cck_lock_counter >= 3)
328*4882a593Smuzhiyun coex_sta->cck_lock = true;
329*4882a593Smuzhiyun else
330*4882a593Smuzhiyun coex_sta->cck_lock = false;
331*4882a593Smuzhiyun } else {
332*4882a593Smuzhiyun if (cck_lock_counter == 0)
333*4882a593Smuzhiyun coex_sta->cck_lock = false;
334*4882a593Smuzhiyun else
335*4882a593Smuzhiyun coex_sta->cck_lock = true;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun if (coex_sta->cck_lock)
339*4882a593Smuzhiyun coex_sta->cck_ever_lock = true;
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun coex_sta->pre_ccklock = coex_sta->cck_lock;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun
btc8723b1ant_is_wifi_status_changed(struct btc_coexist * btcoexist)344*4882a593Smuzhiyun static bool btc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun static bool pre_wifi_busy;
347*4882a593Smuzhiyun static bool pre_under_4way, pre_bt_hs_on;
348*4882a593Smuzhiyun bool wifi_busy = false, under_4way = false, bt_hs_on = false;
349*4882a593Smuzhiyun bool wifi_connected = false;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
352*4882a593Smuzhiyun &wifi_connected);
353*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
354*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
355*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
356*4882a593Smuzhiyun &under_4way);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun if (wifi_connected) {
359*4882a593Smuzhiyun if (wifi_busy != pre_wifi_busy) {
360*4882a593Smuzhiyun pre_wifi_busy = wifi_busy;
361*4882a593Smuzhiyun return true;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun if (under_4way != pre_under_4way) {
364*4882a593Smuzhiyun pre_under_4way = under_4way;
365*4882a593Smuzhiyun return true;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun if (bt_hs_on != pre_bt_hs_on) {
368*4882a593Smuzhiyun pre_bt_hs_on = bt_hs_on;
369*4882a593Smuzhiyun return true;
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun return false;
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun
halbtc8723b1ant_update_bt_link_info(struct btc_coexist * btcoexist)376*4882a593Smuzhiyun static void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
379*4882a593Smuzhiyun bool bt_hs_on = false;
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
384*4882a593Smuzhiyun bt_link_info->sco_exist = coex_sta->sco_exist;
385*4882a593Smuzhiyun bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
386*4882a593Smuzhiyun bt_link_info->pan_exist = coex_sta->pan_exist;
387*4882a593Smuzhiyun bt_link_info->hid_exist = coex_sta->hid_exist;
388*4882a593Smuzhiyun bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun /* work around for HS mode. */
391*4882a593Smuzhiyun if (bt_hs_on) {
392*4882a593Smuzhiyun bt_link_info->pan_exist = true;
393*4882a593Smuzhiyun bt_link_info->bt_link_exist = true;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /* check if Sco only */
397*4882a593Smuzhiyun if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
398*4882a593Smuzhiyun !bt_link_info->pan_exist && !bt_link_info->hid_exist)
399*4882a593Smuzhiyun bt_link_info->sco_only = true;
400*4882a593Smuzhiyun else
401*4882a593Smuzhiyun bt_link_info->sco_only = false;
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /* check if A2dp only */
404*4882a593Smuzhiyun if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
405*4882a593Smuzhiyun !bt_link_info->pan_exist && !bt_link_info->hid_exist)
406*4882a593Smuzhiyun bt_link_info->a2dp_only = true;
407*4882a593Smuzhiyun else
408*4882a593Smuzhiyun bt_link_info->a2dp_only = false;
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun /* check if Pan only */
411*4882a593Smuzhiyun if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
412*4882a593Smuzhiyun bt_link_info->pan_exist && !bt_link_info->hid_exist)
413*4882a593Smuzhiyun bt_link_info->pan_only = true;
414*4882a593Smuzhiyun else
415*4882a593Smuzhiyun bt_link_info->pan_only = false;
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun /* check if Hid only */
418*4882a593Smuzhiyun if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
419*4882a593Smuzhiyun !bt_link_info->pan_exist && bt_link_info->hid_exist)
420*4882a593Smuzhiyun bt_link_info->hid_only = true;
421*4882a593Smuzhiyun else
422*4882a593Smuzhiyun bt_link_info->hid_only = false;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
halbtc8723b1ant_set_bt_auto_report(struct btc_coexist * btcoexist,bool enable_auto_report)425*4882a593Smuzhiyun static void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
426*4882a593Smuzhiyun bool enable_auto_report)
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun u8 h2c_parameter[1] = {0};
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun h2c_parameter[0] = 0;
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun if (enable_auto_report)
433*4882a593Smuzhiyun h2c_parameter[0] |= BIT(0);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
halbtc8723b1ant_bt_auto_report(struct btc_coexist * btcoexist,bool force_exec,bool enable_auto_report)438*4882a593Smuzhiyun static void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,
439*4882a593Smuzhiyun bool force_exec,
440*4882a593Smuzhiyun bool enable_auto_report)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun coex_dm->cur_bt_auto_report = enable_auto_report;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun if (!force_exec) {
445*4882a593Smuzhiyun if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
446*4882a593Smuzhiyun return;
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun halbtc8723b1ant_set_bt_auto_report(btcoexist,
449*4882a593Smuzhiyun coex_dm->cur_bt_auto_report);
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist * btcoexist,bool low_penalty_ra)454*4882a593Smuzhiyun static void btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist *btcoexist,
455*4882a593Smuzhiyun bool low_penalty_ra)
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
458*4882a593Smuzhiyun u8 h2c_parameter[6] = {0};
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty */
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun if (low_penalty_ra) {
463*4882a593Smuzhiyun h2c_parameter[1] |= BIT0;
464*4882a593Smuzhiyun /* normal rate except MCS7/6/5, OFDM54/48/36 */
465*4882a593Smuzhiyun h2c_parameter[2] = 0x00;
466*4882a593Smuzhiyun h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
467*4882a593Smuzhiyun h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
468*4882a593Smuzhiyun h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
472*4882a593Smuzhiyun "[BTCoex], set WiFi Low-Penalty Retry: %s",
473*4882a593Smuzhiyun (low_penalty_ra ? "ON!!" : "OFF!!"));
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun
halbtc8723b1ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)478*4882a593Smuzhiyun static void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
479*4882a593Smuzhiyun bool force_exec, bool low_penalty_ra)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra = low_penalty_ra;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun if (!force_exec) {
484*4882a593Smuzhiyun if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
485*4882a593Smuzhiyun return;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun btc8723b1ant_set_sw_pen_tx_rate_adapt(btcoexist,
488*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra);
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
halbtc8723b1ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)493*4882a593Smuzhiyun static void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,
494*4882a593Smuzhiyun u32 val0x6c0, u32 val0x6c4,
495*4882a593Smuzhiyun u32 val0x6c8, u8 val0x6cc)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
500*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
501*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
504*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
505*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
508*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
509*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
512*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
513*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
halbtc8723b1ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)516*4882a593Smuzhiyun static void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,
517*4882a593Smuzhiyun bool force_exec, u32 val0x6c0,
518*4882a593Smuzhiyun u32 val0x6c4, u32 val0x6c8,
519*4882a593Smuzhiyun u8 val0x6cc)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
524*4882a593Smuzhiyun "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6cc = 0x%x\n",
525*4882a593Smuzhiyun (force_exec ? "force to" : ""),
526*4882a593Smuzhiyun val0x6c0, val0x6c4, val0x6cc);
527*4882a593Smuzhiyun coex_dm->cur_val0x6c0 = val0x6c0;
528*4882a593Smuzhiyun coex_dm->cur_val0x6c4 = val0x6c4;
529*4882a593Smuzhiyun coex_dm->cur_val0x6c8 = val0x6c8;
530*4882a593Smuzhiyun coex_dm->cur_val0x6cc = val0x6cc;
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun if (!force_exec) {
533*4882a593Smuzhiyun if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
534*4882a593Smuzhiyun (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
535*4882a593Smuzhiyun (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
536*4882a593Smuzhiyun (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
537*4882a593Smuzhiyun return;
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
540*4882a593Smuzhiyun val0x6c8, val0x6cc);
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
543*4882a593Smuzhiyun coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
544*4882a593Smuzhiyun coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
545*4882a593Smuzhiyun coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun
halbtc8723b1ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)548*4882a593Smuzhiyun static void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
549*4882a593Smuzhiyun bool force_exec, u8 type)
550*4882a593Smuzhiyun {
551*4882a593Smuzhiyun coex_sta->coex_table_type = type;
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun switch (type) {
554*4882a593Smuzhiyun case 0:
555*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
556*4882a593Smuzhiyun 0x55555555, 0xffffff, 0x3);
557*4882a593Smuzhiyun break;
558*4882a593Smuzhiyun case 1:
559*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
560*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
561*4882a593Smuzhiyun break;
562*4882a593Smuzhiyun case 2:
563*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
564*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
565*4882a593Smuzhiyun break;
566*4882a593Smuzhiyun case 3:
567*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
568*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
569*4882a593Smuzhiyun break;
570*4882a593Smuzhiyun case 4:
571*4882a593Smuzhiyun if ((coex_sta->cck_ever_lock) && (coex_sta->scan_ap_num <= 5))
572*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec,
573*4882a593Smuzhiyun 0x55555555, 0xaaaa5a5a,
574*4882a593Smuzhiyun 0xffffff, 0x3);
575*4882a593Smuzhiyun else
576*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec,
577*4882a593Smuzhiyun 0x55555555, 0x5a5a5a5a,
578*4882a593Smuzhiyun 0xffffff, 0x3);
579*4882a593Smuzhiyun break;
580*4882a593Smuzhiyun case 5:
581*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
582*4882a593Smuzhiyun 0x5aaa5a5a, 0xffffff, 0x3);
583*4882a593Smuzhiyun break;
584*4882a593Smuzhiyun case 6:
585*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
586*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
587*4882a593Smuzhiyun break;
588*4882a593Smuzhiyun case 7:
589*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
590*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
591*4882a593Smuzhiyun break;
592*4882a593Smuzhiyun case 8:
593*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
594*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
595*4882a593Smuzhiyun break;
596*4882a593Smuzhiyun case 9:
597*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
598*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
599*4882a593Smuzhiyun break;
600*4882a593Smuzhiyun case 10:
601*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
602*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
603*4882a593Smuzhiyun break;
604*4882a593Smuzhiyun case 11:
605*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
606*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
607*4882a593Smuzhiyun break;
608*4882a593Smuzhiyun case 12:
609*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
610*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
611*4882a593Smuzhiyun break;
612*4882a593Smuzhiyun case 13:
613*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
614*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
615*4882a593Smuzhiyun break;
616*4882a593Smuzhiyun case 14:
617*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
618*4882a593Smuzhiyun 0x5ada5ada, 0xffffff, 0x3);
619*4882a593Smuzhiyun break;
620*4882a593Smuzhiyun case 15:
621*4882a593Smuzhiyun halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
622*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
623*4882a593Smuzhiyun break;
624*4882a593Smuzhiyun default:
625*4882a593Smuzhiyun break;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun static void
halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)630*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
631*4882a593Smuzhiyun bool enable)
632*4882a593Smuzhiyun {
633*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
634*4882a593Smuzhiyun u8 h2c_parameter[1] = {0};
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun if (enable)
637*4882a593Smuzhiyun h2c_parameter[0] |= BIT0; /* function enable */
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
640*4882a593Smuzhiyun "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
641*4882a593Smuzhiyun h2c_parameter[0]);
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun
halbtc8723b1ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)646*4882a593Smuzhiyun static void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
647*4882a593Smuzhiyun bool force_exec, bool enable)
648*4882a593Smuzhiyun {
649*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
652*4882a593Smuzhiyun "[BTCoex], %s turn Ignore WlanAct %s\n",
653*4882a593Smuzhiyun (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
654*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act = enable;
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun if (!force_exec) {
657*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
658*4882a593Smuzhiyun "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
659*4882a593Smuzhiyun coex_dm->pre_ignore_wlan_act,
660*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act);
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun if (coex_dm->pre_ignore_wlan_act ==
663*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act)
664*4882a593Smuzhiyun return;
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
669*4882a593Smuzhiyun }
670*4882a593Smuzhiyun
halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)671*4882a593Smuzhiyun static void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
672*4882a593Smuzhiyun u8 byte1, u8 byte2, u8 byte3,
673*4882a593Smuzhiyun u8 byte4, u8 byte5)
674*4882a593Smuzhiyun {
675*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
676*4882a593Smuzhiyun u8 h2c_parameter[5] = {0};
677*4882a593Smuzhiyun u8 real_byte1 = byte1, real_byte5 = byte5;
678*4882a593Smuzhiyun bool ap_enable = false;
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
681*4882a593Smuzhiyun &ap_enable);
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun if (ap_enable) {
684*4882a593Smuzhiyun if ((byte1 & BIT4) && !(byte1 & BIT5)) {
685*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
686*4882a593Smuzhiyun "[BTCoex], FW for 1Ant AP mode\n");
687*4882a593Smuzhiyun real_byte1 &= ~BIT4;
688*4882a593Smuzhiyun real_byte1 |= BIT5;
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun real_byte5 |= BIT5;
691*4882a593Smuzhiyun real_byte5 &= ~BIT6;
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun h2c_parameter[0] = real_byte1;
696*4882a593Smuzhiyun h2c_parameter[1] = byte2;
697*4882a593Smuzhiyun h2c_parameter[2] = byte3;
698*4882a593Smuzhiyun h2c_parameter[3] = byte4;
699*4882a593Smuzhiyun h2c_parameter[4] = real_byte5;
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun coex_dm->ps_tdma_para[0] = real_byte1;
702*4882a593Smuzhiyun coex_dm->ps_tdma_para[1] = byte2;
703*4882a593Smuzhiyun coex_dm->ps_tdma_para[2] = byte3;
704*4882a593Smuzhiyun coex_dm->ps_tdma_para[3] = byte4;
705*4882a593Smuzhiyun coex_dm->ps_tdma_para[4] = real_byte5;
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
708*4882a593Smuzhiyun "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
709*4882a593Smuzhiyun h2c_parameter[0],
710*4882a593Smuzhiyun h2c_parameter[1] << 24 |
711*4882a593Smuzhiyun h2c_parameter[2] << 16 |
712*4882a593Smuzhiyun h2c_parameter[3] << 8 |
713*4882a593Smuzhiyun h2c_parameter[4]);
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun
halbtc8723b1ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)718*4882a593Smuzhiyun static void halbtc8723b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
719*4882a593Smuzhiyun u8 lps_val, u8 rpwm_val)
720*4882a593Smuzhiyun {
721*4882a593Smuzhiyun u8 lps = lps_val;
722*4882a593Smuzhiyun u8 rpwm = rpwm_val;
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
725*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun
halbtc8723b1ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)728*4882a593Smuzhiyun static void halbtc8723b1ant_lps_rpwm(struct btc_coexist *btcoexist,
729*4882a593Smuzhiyun bool force_exec,
730*4882a593Smuzhiyun u8 lps_val, u8 rpwm_val)
731*4882a593Smuzhiyun {
732*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
735*4882a593Smuzhiyun "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
736*4882a593Smuzhiyun (force_exec ? "force to" : ""), lps_val, rpwm_val);
737*4882a593Smuzhiyun coex_dm->cur_lps = lps_val;
738*4882a593Smuzhiyun coex_dm->cur_rpwm = rpwm_val;
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun if (!force_exec) {
741*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
742*4882a593Smuzhiyun "[BTCoex], LPS-RxBeaconMode = 0x%x , LPS-RPWM = 0x%x!!\n",
743*4882a593Smuzhiyun coex_dm->cur_lps, coex_dm->cur_rpwm);
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
746*4882a593Smuzhiyun (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
747*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
748*4882a593Smuzhiyun "[BTCoex], LPS-RPWM_Last = 0x%x , LPS-RPWM_Now = 0x%x!!\n",
749*4882a593Smuzhiyun coex_dm->pre_rpwm, coex_dm->cur_rpwm);
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun return;
752*4882a593Smuzhiyun }
753*4882a593Smuzhiyun }
754*4882a593Smuzhiyun halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun coex_dm->pre_lps = coex_dm->cur_lps;
757*4882a593Smuzhiyun coex_dm->pre_rpwm = coex_dm->cur_rpwm;
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun
halbtc8723b1ant_sw_mechanism(struct btc_coexist * btcoexist,bool low_penalty_ra)760*4882a593Smuzhiyun static void halbtc8723b1ant_sw_mechanism(struct btc_coexist *btcoexist,
761*4882a593Smuzhiyun bool low_penalty_ra)
762*4882a593Smuzhiyun {
763*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
766*4882a593Smuzhiyun "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
halbtc8723b1ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool force_exec,bool init_hw_cfg,bool wifi_off)771*4882a593Smuzhiyun static void halbtc8723b1ant_set_ant_path(struct btc_coexist *btcoexist,
772*4882a593Smuzhiyun u8 ant_pos_type, bool force_exec,
773*4882a593Smuzhiyun bool init_hw_cfg, bool wifi_off)
774*4882a593Smuzhiyun {
775*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
776*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
777*4882a593Smuzhiyun u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0;
778*4882a593Smuzhiyun bool pg_ext_switch = false;
779*4882a593Smuzhiyun bool use_ext_switch = false;
780*4882a593Smuzhiyun bool is_in_mp_mode = false;
781*4882a593Smuzhiyun u8 h2c_parameter[2] = {0}, u8tmp = 0;
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun coex_dm->cur_ant_pos_type = ant_pos_type;
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
786*4882a593Smuzhiyun /* [31:16] = fw ver, [15:0] = fw sub ver */
787*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun if ((fw_ver < 0xc0000) || pg_ext_switch)
790*4882a593Smuzhiyun use_ext_switch = true;
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun if (init_hw_cfg) {
793*4882a593Smuzhiyun /* WiFi TRx Mask on */
794*4882a593Smuzhiyun btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
795*4882a593Smuzhiyun 0x780);
796*4882a593Smuzhiyun /* remove due to interrupt is disabled that polling c2h will
797*4882a593Smuzhiyun * fail and delay 100ms.
798*4882a593Smuzhiyun */
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun if (fw_ver >= 0x180000) {
801*4882a593Smuzhiyun /* Use H2C to set GNT_BT to HIGH */
802*4882a593Smuzhiyun h2c_parameter[0] = 1;
803*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
804*4882a593Smuzhiyun h2c_parameter);
805*4882a593Smuzhiyun } else {
806*4882a593Smuzhiyun /* set grant_bt to high */
807*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
808*4882a593Smuzhiyun }
809*4882a593Smuzhiyun /* set wlan_act control by PTA */
810*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun /* BT select s0/s1 is controlled by BT */
813*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
814*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
815*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
816*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
817*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
818*4882a593Smuzhiyun } else if (wifi_off) {
819*4882a593Smuzhiyun if (fw_ver >= 0x180000) {
820*4882a593Smuzhiyun /* Use H2C to set GNT_BT to HIGH */
821*4882a593Smuzhiyun h2c_parameter[0] = 1;
822*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
823*4882a593Smuzhiyun h2c_parameter);
824*4882a593Smuzhiyun } else {
825*4882a593Smuzhiyun /* set grant_bt to high */
826*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun /* set wlan_act to always low */
829*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
832*4882a593Smuzhiyun &is_in_mp_mode);
833*4882a593Smuzhiyun if (!is_in_mp_mode)
834*4882a593Smuzhiyun /* BT select s0/s1 is controlled by BT */
835*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
836*4882a593Smuzhiyun 0x20, 0x0);
837*4882a593Smuzhiyun else
838*4882a593Smuzhiyun /* BT select s0/s1 is controlled by WiFi */
839*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
840*4882a593Smuzhiyun 0x20, 0x1);
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL
843*4882a593Smuzhiyun * BT Vendor 0xac=0xf002
844*4882a593Smuzhiyun */
845*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
846*4882a593Smuzhiyun u32tmp &= ~BIT23;
847*4882a593Smuzhiyun u32tmp &= ~BIT24;
848*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
849*4882a593Smuzhiyun } else {
850*4882a593Smuzhiyun /* Use H2C to set GNT_BT to LOW */
851*4882a593Smuzhiyun if (fw_ver >= 0x180000) {
852*4882a593Smuzhiyun if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) {
853*4882a593Smuzhiyun h2c_parameter[0] = 0;
854*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
855*4882a593Smuzhiyun h2c_parameter);
856*4882a593Smuzhiyun }
857*4882a593Smuzhiyun } else {
858*4882a593Smuzhiyun /* BT calibration check */
859*4882a593Smuzhiyun while (cnt_bt_cal_chk <= 20) {
860*4882a593Smuzhiyun u8tmp = btcoexist->btc_read_1byte(btcoexist,
861*4882a593Smuzhiyun 0x49d);
862*4882a593Smuzhiyun cnt_bt_cal_chk++;
863*4882a593Smuzhiyun if (u8tmp & BIT(0)) {
864*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
865*4882a593Smuzhiyun DBG_LOUD,
866*4882a593Smuzhiyun "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
867*4882a593Smuzhiyun cnt_bt_cal_chk);
868*4882a593Smuzhiyun mdelay(50);
869*4882a593Smuzhiyun } else {
870*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
871*4882a593Smuzhiyun DBG_LOUD,
872*4882a593Smuzhiyun "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
873*4882a593Smuzhiyun cnt_bt_cal_chk);
874*4882a593Smuzhiyun break;
875*4882a593Smuzhiyun }
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun /* set grant_bt to PTA */
879*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
880*4882a593Smuzhiyun }
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {
883*4882a593Smuzhiyun /* set wlan_act control by PTA */
884*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
885*4882a593Smuzhiyun }
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
888*4882a593Smuzhiyun btcoexist, 0x67, 0x20,
889*4882a593Smuzhiyun 0x1); /* BT select s0/s1 is controlled by WiFi */
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun if (use_ext_switch) {
893*4882a593Smuzhiyun if (init_hw_cfg) {
894*4882a593Smuzhiyun /* 0x4c[23] = 0, 0x4c[24] = 1
895*4882a593Smuzhiyun * Antenna control by WL/BT
896*4882a593Smuzhiyun */
897*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
898*4882a593Smuzhiyun u32tmp &= ~BIT23;
899*4882a593Smuzhiyun u32tmp |= BIT24;
900*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun /* fixed internal switch S1->WiFi, S0->BT */
903*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
906*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT) {
907*4882a593Smuzhiyun /* tell firmware "no antenna inverse" */
908*4882a593Smuzhiyun h2c_parameter[0] = 0;
909*4882a593Smuzhiyun /* ext switch type */
910*4882a593Smuzhiyun h2c_parameter[1] = 1;
911*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
912*4882a593Smuzhiyun h2c_parameter);
913*4882a593Smuzhiyun } else {
914*4882a593Smuzhiyun /* tell firmware "antenna inverse" */
915*4882a593Smuzhiyun h2c_parameter[0] = 1;
916*4882a593Smuzhiyun /* ext switch type */
917*4882a593Smuzhiyun h2c_parameter[1] = 1;
918*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
919*4882a593Smuzhiyun h2c_parameter);
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun if (force_exec ||
924*4882a593Smuzhiyun (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
925*4882a593Smuzhiyun /* ext switch setting */
926*4882a593Smuzhiyun switch (ant_pos_type) {
927*4882a593Smuzhiyun case BTC_ANT_PATH_WIFI:
928*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
929*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
930*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
931*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x1);
932*4882a593Smuzhiyun else
933*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
934*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x2);
935*4882a593Smuzhiyun break;
936*4882a593Smuzhiyun case BTC_ANT_PATH_BT:
937*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
938*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
939*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
940*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x2);
941*4882a593Smuzhiyun else
942*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
943*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x1);
944*4882a593Smuzhiyun break;
945*4882a593Smuzhiyun default:
946*4882a593Smuzhiyun case BTC_ANT_PATH_PTA:
947*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
948*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
949*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
950*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x1);
951*4882a593Smuzhiyun else
952*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(
953*4882a593Smuzhiyun btcoexist, 0x92c, 0x3, 0x2);
954*4882a593Smuzhiyun break;
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun }
957*4882a593Smuzhiyun } else {
958*4882a593Smuzhiyun if (init_hw_cfg) {
959*4882a593Smuzhiyun /* 0x4c[23] = 1, 0x4c[24] = 0,
960*4882a593Smuzhiyun * Antenna control by 0x64
961*4882a593Smuzhiyun */
962*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
963*4882a593Smuzhiyun u32tmp |= BIT23;
964*4882a593Smuzhiyun u32tmp &= ~BIT24;
965*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun /* Fix Ext switch Main->S1, Aux->S0 */
968*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
969*4882a593Smuzhiyun 0x0);
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
972*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT) {
973*4882a593Smuzhiyun /* tell firmware "no antenna inverse" */
974*4882a593Smuzhiyun h2c_parameter[0] = 0;
975*4882a593Smuzhiyun /* internal switch type */
976*4882a593Smuzhiyun h2c_parameter[1] = 0;
977*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
978*4882a593Smuzhiyun h2c_parameter);
979*4882a593Smuzhiyun } else {
980*4882a593Smuzhiyun /* tell firmware "antenna inverse" */
981*4882a593Smuzhiyun h2c_parameter[0] = 1;
982*4882a593Smuzhiyun /* internal switch type */
983*4882a593Smuzhiyun h2c_parameter[1] = 0;
984*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
985*4882a593Smuzhiyun h2c_parameter);
986*4882a593Smuzhiyun }
987*4882a593Smuzhiyun }
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun if (force_exec ||
990*4882a593Smuzhiyun (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
991*4882a593Smuzhiyun /* internal switch setting */
992*4882a593Smuzhiyun switch (ant_pos_type) {
993*4882a593Smuzhiyun case BTC_ANT_PATH_WIFI:
994*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
995*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
996*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
997*4882a593Smuzhiyun 0x948, 0x0);
998*4882a593Smuzhiyun else
999*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
1000*4882a593Smuzhiyun 0x948, 0x280);
1001*4882a593Smuzhiyun break;
1002*4882a593Smuzhiyun case BTC_ANT_PATH_BT:
1003*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
1004*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
1005*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
1006*4882a593Smuzhiyun 0x948, 0x280);
1007*4882a593Smuzhiyun else
1008*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
1009*4882a593Smuzhiyun 0x948, 0x0);
1010*4882a593Smuzhiyun break;
1011*4882a593Smuzhiyun default:
1012*4882a593Smuzhiyun case BTC_ANT_PATH_PTA:
1013*4882a593Smuzhiyun if (board_info->btdm_ant_pos ==
1014*4882a593Smuzhiyun BTC_ANTENNA_AT_MAIN_PORT)
1015*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
1016*4882a593Smuzhiyun 0x948, 0x200);
1017*4882a593Smuzhiyun else
1018*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist,
1019*4882a593Smuzhiyun 0x948, 0x80);
1020*4882a593Smuzhiyun break;
1021*4882a593Smuzhiyun }
1022*4882a593Smuzhiyun }
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
1026*4882a593Smuzhiyun }
1027*4882a593Smuzhiyun
halbtc8723b1ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1028*4882a593Smuzhiyun static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
1029*4882a593Smuzhiyun bool force_exec, bool turn_on, u8 type)
1030*4882a593Smuzhiyun {
1031*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1032*4882a593Smuzhiyun bool wifi_busy = false;
1033*4882a593Smuzhiyun u8 rssi_adjust_val = 0;
1034*4882a593Smuzhiyun u8 ps_tdma_byte0_val = 0x51;
1035*4882a593Smuzhiyun u8 ps_tdma_byte3_val = 0x10;
1036*4882a593Smuzhiyun u8 ps_tdma_byte4_val = 0x50;
1037*4882a593Smuzhiyun s8 wifi_duration_adjust = 0x0;
1038*4882a593Smuzhiyun static bool pre_wifi_busy;
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun coex_dm->cur_ps_tdma_on = turn_on;
1041*4882a593Smuzhiyun coex_dm->cur_ps_tdma = type;
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun if (wifi_busy != pre_wifi_busy) {
1046*4882a593Smuzhiyun force_exec = true;
1047*4882a593Smuzhiyun pre_wifi_busy = wifi_busy;
1048*4882a593Smuzhiyun }
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun if (!force_exec) {
1051*4882a593Smuzhiyun if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1052*4882a593Smuzhiyun (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1053*4882a593Smuzhiyun return;
1054*4882a593Smuzhiyun }
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun if (coex_sta->scan_ap_num <= 5) {
1057*4882a593Smuzhiyun wifi_duration_adjust = 5;
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun if (coex_sta->a2dp_bit_pool >= 35)
1060*4882a593Smuzhiyun wifi_duration_adjust = -10;
1061*4882a593Smuzhiyun else if (coex_sta->a2dp_bit_pool >= 45)
1062*4882a593Smuzhiyun wifi_duration_adjust = -15;
1063*4882a593Smuzhiyun } else if (coex_sta->scan_ap_num >= 40) {
1064*4882a593Smuzhiyun wifi_duration_adjust = -15;
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun if (coex_sta->a2dp_bit_pool < 35)
1067*4882a593Smuzhiyun wifi_duration_adjust = -5;
1068*4882a593Smuzhiyun else if (coex_sta->a2dp_bit_pool < 45)
1069*4882a593Smuzhiyun wifi_duration_adjust = -10;
1070*4882a593Smuzhiyun } else if (coex_sta->scan_ap_num >= 20) {
1071*4882a593Smuzhiyun wifi_duration_adjust = -10;
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun if (coex_sta->a2dp_bit_pool >= 45)
1074*4882a593Smuzhiyun wifi_duration_adjust = -15;
1075*4882a593Smuzhiyun } else {
1076*4882a593Smuzhiyun wifi_duration_adjust = 0;
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun if (coex_sta->a2dp_bit_pool >= 35)
1079*4882a593Smuzhiyun wifi_duration_adjust = -10;
1080*4882a593Smuzhiyun else if (coex_sta->a2dp_bit_pool >= 45)
1081*4882a593Smuzhiyun wifi_duration_adjust = -15;
1082*4882a593Smuzhiyun }
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
1085*4882a593Smuzhiyun (type == 101) || (type == 102) || (type == 109) || (type == 111)) {
1086*4882a593Smuzhiyun if (!coex_sta->force_lps_on) {
1087*4882a593Smuzhiyun /* Native power save TDMA, only for A2DP-only case
1088*4882a593Smuzhiyun * 1/2/9/11 while wifi noisy threshold > 30
1089*4882a593Smuzhiyun */
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun /* no null-pkt */
1092*4882a593Smuzhiyun ps_tdma_byte0_val = 0x61;
1093*4882a593Smuzhiyun /* no tx-pause at BT-slot */
1094*4882a593Smuzhiyun ps_tdma_byte3_val = 0x11;
1095*4882a593Smuzhiyun /* 0x778 = d/1 toggle, no dynamic slot */
1096*4882a593Smuzhiyun ps_tdma_byte4_val = 0x10;
1097*4882a593Smuzhiyun } else {
1098*4882a593Smuzhiyun /* null-pkt */
1099*4882a593Smuzhiyun ps_tdma_byte0_val = 0x51;
1100*4882a593Smuzhiyun /* tx-pause at BT-slot */
1101*4882a593Smuzhiyun ps_tdma_byte3_val = 0x10;
1102*4882a593Smuzhiyun /* 0x778 = d/1 toggle, dynamic slot */
1103*4882a593Smuzhiyun ps_tdma_byte4_val = 0x50;
1104*4882a593Smuzhiyun }
1105*4882a593Smuzhiyun } else if ((type == 3) || (type == 13) || (type == 14) ||
1106*4882a593Smuzhiyun (type == 103) || (type == 113) || (type == 114)) {
1107*4882a593Smuzhiyun /* null-pkt */
1108*4882a593Smuzhiyun ps_tdma_byte0_val = 0x51;
1109*4882a593Smuzhiyun /* tx-pause at BT-slot */
1110*4882a593Smuzhiyun ps_tdma_byte3_val = 0x10;
1111*4882a593Smuzhiyun /* 0x778 = d/1 toggle, no dynamic slot */
1112*4882a593Smuzhiyun ps_tdma_byte4_val = 0x10;
1113*4882a593Smuzhiyun } else { /* native power save case */
1114*4882a593Smuzhiyun /* no null-pkt */
1115*4882a593Smuzhiyun ps_tdma_byte0_val = 0x61;
1116*4882a593Smuzhiyun /* no tx-pause at BT-slot */
1117*4882a593Smuzhiyun ps_tdma_byte3_val = 0x11;
1118*4882a593Smuzhiyun /* 0x778 = d/1 toggle, no dynamic slot */
1119*4882a593Smuzhiyun ps_tdma_byte4_val = 0x11;
1120*4882a593Smuzhiyun /* psTdmaByte4Va is not define for 0x778 = d/1, 1/1 case */
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun /* if (bt_link_info->slave_role) */
1124*4882a593Smuzhiyun if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
1125*4882a593Smuzhiyun /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1126*4882a593Smuzhiyun ps_tdma_byte4_val = ps_tdma_byte4_val | 0x1;
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun if (type > 100) {
1129*4882a593Smuzhiyun /* set antenna control by SW */
1130*4882a593Smuzhiyun ps_tdma_byte0_val = ps_tdma_byte0_val | 0x82;
1131*4882a593Smuzhiyun /* set antenna no toggle, control by antenna diversity */
1132*4882a593Smuzhiyun ps_tdma_byte3_val = ps_tdma_byte3_val | 0x60;
1133*4882a593Smuzhiyun }
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun if (turn_on) {
1136*4882a593Smuzhiyun switch (type) {
1137*4882a593Smuzhiyun default:
1138*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1139*4882a593Smuzhiyun 0x1a, 0x0,
1140*4882a593Smuzhiyun ps_tdma_byte4_val);
1141*4882a593Smuzhiyun break;
1142*4882a593Smuzhiyun case 1:
1143*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1144*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val,
1145*4882a593Smuzhiyun 0x3a + wifi_duration_adjust, 0x03,
1146*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1147*4882a593Smuzhiyun
1148*4882a593Smuzhiyun rssi_adjust_val = 11;
1149*4882a593Smuzhiyun break;
1150*4882a593Smuzhiyun case 2:
1151*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1152*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val,
1153*4882a593Smuzhiyun 0x2d + wifi_duration_adjust, 0x03,
1154*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1155*4882a593Smuzhiyun break;
1156*4882a593Smuzhiyun case 3:
1157*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1158*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x30, 0x03,
1159*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1160*4882a593Smuzhiyun break;
1161*4882a593Smuzhiyun case 4:
1162*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1163*4882a593Smuzhiyun 0x3, 0x14, 0x0);
1164*4882a593Smuzhiyun break;
1165*4882a593Smuzhiyun case 5:
1166*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1167*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,
1168*4882a593Smuzhiyun ps_tdma_byte3_val, 0x11);
1169*4882a593Smuzhiyun break;
1170*4882a593Smuzhiyun case 6:
1171*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1172*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
1173*4882a593Smuzhiyun ps_tdma_byte3_val, 0x11);
1174*4882a593Smuzhiyun break;
1175*4882a593Smuzhiyun case 7:
1176*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1177*4882a593Smuzhiyun 0x5, 0x0, 0x0);
1178*4882a593Smuzhiyun break;
1179*4882a593Smuzhiyun case 8:
1180*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1181*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1182*4882a593Smuzhiyun break;
1183*4882a593Smuzhiyun case 9:
1184*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1185*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1186*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1187*4882a593Smuzhiyun break;
1188*4882a593Smuzhiyun case 10:
1189*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1190*4882a593Smuzhiyun 0xa, 0x0, 0x40);
1191*4882a593Smuzhiyun break;
1192*4882a593Smuzhiyun case 11:
1193*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1194*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
1195*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1196*4882a593Smuzhiyun break;
1197*4882a593Smuzhiyun case 12:
1198*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1199*4882a593Smuzhiyun 0x0a, 0x0, 0x50);
1200*4882a593Smuzhiyun break;
1201*4882a593Smuzhiyun case 13:
1202*4882a593Smuzhiyun if (coex_sta->scan_ap_num <= 3)
1203*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1204*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x40, 0x3,
1205*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1206*4882a593Smuzhiyun else
1207*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1208*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1209*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1210*4882a593Smuzhiyun break;
1211*4882a593Smuzhiyun case 14:
1212*4882a593Smuzhiyun if (coex_sta->scan_ap_num <= 3)
1213*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1214*4882a593Smuzhiyun btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);
1215*4882a593Smuzhiyun else
1216*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1217*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1218*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1219*4882a593Smuzhiyun break;
1220*4882a593Smuzhiyun case 15:
1221*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1222*4882a593Smuzhiyun 0x3, 0x8, 0x0);
1223*4882a593Smuzhiyun break;
1224*4882a593Smuzhiyun case 16:
1225*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1226*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1227*4882a593Smuzhiyun break;
1228*4882a593Smuzhiyun case 18:
1229*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1230*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1231*4882a593Smuzhiyun break;
1232*4882a593Smuzhiyun case 20:
1233*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1234*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
1235*4882a593Smuzhiyun ps_tdma_byte3_val, 0x10);
1236*4882a593Smuzhiyun break;
1237*4882a593Smuzhiyun case 21:
1238*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1239*4882a593Smuzhiyun 0x03, 0x11, 0x11);
1240*4882a593Smuzhiyun break;
1241*4882a593Smuzhiyun case 22:
1242*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1243*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1244*4882a593Smuzhiyun ps_tdma_byte3_val, 0x10);
1245*4882a593Smuzhiyun break;
1246*4882a593Smuzhiyun case 23:
1247*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1248*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1249*4882a593Smuzhiyun break;
1250*4882a593Smuzhiyun case 24:
1251*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1252*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1253*4882a593Smuzhiyun break;
1254*4882a593Smuzhiyun case 25:
1255*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1256*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1257*4882a593Smuzhiyun break;
1258*4882a593Smuzhiyun case 26:
1259*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1260*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1261*4882a593Smuzhiyun break;
1262*4882a593Smuzhiyun case 27:
1263*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1264*4882a593Smuzhiyun 0x3, 0x31, 0x98);
1265*4882a593Smuzhiyun break;
1266*4882a593Smuzhiyun case 28:
1267*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1268*4882a593Smuzhiyun 0x3, 0x31, 0x0);
1269*4882a593Smuzhiyun break;
1270*4882a593Smuzhiyun case 29:
1271*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1272*4882a593Smuzhiyun 0x1a, 0x1, 0x10);
1273*4882a593Smuzhiyun break;
1274*4882a593Smuzhiyun case 30:
1275*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1276*4882a593Smuzhiyun 0x3, 0x10, 0x10);
1277*4882a593Smuzhiyun break;
1278*4882a593Smuzhiyun case 31:
1279*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1280*4882a593Smuzhiyun 0x1a, 0, 0x58);
1281*4882a593Smuzhiyun break;
1282*4882a593Smuzhiyun case 32:
1283*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1284*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
1285*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1286*4882a593Smuzhiyun break;
1287*4882a593Smuzhiyun case 33:
1288*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1289*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
1290*4882a593Smuzhiyun ps_tdma_byte3_val, 0x10);
1291*4882a593Smuzhiyun break;
1292*4882a593Smuzhiyun case 34:
1293*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1294*4882a593Smuzhiyun 0x1a, 0x0, 0x10);
1295*4882a593Smuzhiyun break;
1296*4882a593Smuzhiyun case 35:
1297*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1298*4882a593Smuzhiyun 0x1a, 0x0, 0x10);
1299*4882a593Smuzhiyun break;
1300*4882a593Smuzhiyun case 36:
1301*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1302*4882a593Smuzhiyun 0x3, 0x14, 0x50);
1303*4882a593Smuzhiyun break;
1304*4882a593Smuzhiyun case 40:
1305*4882a593Smuzhiyun /* SoftAP only with no sta associated,BT disable ,TDMA
1306*4882a593Smuzhiyun * mode for power saving
1307*4882a593Smuzhiyun *
1308*4882a593Smuzhiyun * here softap mode screen off will cost 70-80mA for
1309*4882a593Smuzhiyun * phone
1310*4882a593Smuzhiyun */
1311*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1312*4882a593Smuzhiyun 0x00, 0x10, 0x24);
1313*4882a593Smuzhiyun break;
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun case 101:
1316*4882a593Smuzhiyun /* for 1-Ant translate to 2-Ant */
1317*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1318*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val,
1319*4882a593Smuzhiyun 0x3a + wifi_duration_adjust, 0x03,
1320*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1321*4882a593Smuzhiyun break;
1322*4882a593Smuzhiyun case 102:
1323*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1324*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val,
1325*4882a593Smuzhiyun 0x2d + wifi_duration_adjust, 0x03,
1326*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1327*4882a593Smuzhiyun break;
1328*4882a593Smuzhiyun case 103:
1329*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1330*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,
1331*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1332*4882a593Smuzhiyun break;
1333*4882a593Smuzhiyun case 105:
1334*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1335*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x15, 0x3,
1336*4882a593Smuzhiyun ps_tdma_byte3_val, 0x11);
1337*4882a593Smuzhiyun break;
1338*4882a593Smuzhiyun case 106:
1339*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1340*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
1341*4882a593Smuzhiyun ps_tdma_byte3_val, 0x11);
1342*4882a593Smuzhiyun break;
1343*4882a593Smuzhiyun case 109:
1344*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1345*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1346*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1347*4882a593Smuzhiyun break;
1348*4882a593Smuzhiyun case 111:
1349*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1350*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
1351*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1352*4882a593Smuzhiyun break;
1353*4882a593Smuzhiyun case 113:
1354*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1355*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1356*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1357*4882a593Smuzhiyun break;
1358*4882a593Smuzhiyun case 114:
1359*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1360*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1361*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1362*4882a593Smuzhiyun break;
1363*4882a593Smuzhiyun case 120:
1364*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1365*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
1366*4882a593Smuzhiyun ps_tdma_byte3_val, 0x10);
1367*4882a593Smuzhiyun break;
1368*4882a593Smuzhiyun case 122:
1369*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1370*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1371*4882a593Smuzhiyun ps_tdma_byte3_val, 0x10);
1372*4882a593Smuzhiyun break;
1373*4882a593Smuzhiyun case 132:
1374*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1375*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1376*4882a593Smuzhiyun ps_tdma_byte3_val, ps_tdma_byte4_val);
1377*4882a593Smuzhiyun break;
1378*4882a593Smuzhiyun case 133:
1379*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(
1380*4882a593Smuzhiyun btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1381*4882a593Smuzhiyun ps_tdma_byte3_val, 0x11);
1382*4882a593Smuzhiyun break;
1383*4882a593Smuzhiyun }
1384*4882a593Smuzhiyun } else {
1385*4882a593Smuzhiyun /* disable PS tdma */
1386*4882a593Smuzhiyun switch (type) {
1387*4882a593Smuzhiyun case 8: /* PTA Control */
1388*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
1389*4882a593Smuzhiyun 0x0, 0x0, 0x0);
1390*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist,
1391*4882a593Smuzhiyun BTC_ANT_PATH_PTA,
1392*4882a593Smuzhiyun FORCE_EXEC,
1393*4882a593Smuzhiyun false, false);
1394*4882a593Smuzhiyun break;
1395*4882a593Smuzhiyun case 0:
1396*4882a593Smuzhiyun default:
1397*4882a593Smuzhiyun /* Software control, Antenna at BT side */
1398*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1399*4882a593Smuzhiyun 0x0, 0x0, 0x0);
1400*4882a593Smuzhiyun break;
1401*4882a593Smuzhiyun case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */
1402*4882a593Smuzhiyun halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1403*4882a593Smuzhiyun 0x48, 0x0);
1404*4882a593Smuzhiyun break;
1405*4882a593Smuzhiyun }
1406*4882a593Smuzhiyun }
1407*4882a593Smuzhiyun rssi_adjust_val = 0;
1408*4882a593Smuzhiyun btcoexist->btc_set(btcoexist,
1409*4882a593Smuzhiyun BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,
1410*4882a593Smuzhiyun &rssi_adjust_val);
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun /* update pre state */
1413*4882a593Smuzhiyun coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1414*4882a593Smuzhiyun coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1415*4882a593Smuzhiyun }
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun static
btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist * btcoexist,u8 wifi_status)1418*4882a593Smuzhiyun void btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist *btcoexist,
1419*4882a593Smuzhiyun u8 wifi_status)
1420*4882a593Smuzhiyun {
1421*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1422*4882a593Smuzhiyun static s32 up, dn, m, n, wait_count;
1423*4882a593Smuzhiyun /* 0: no change, +1: increase WiFi duration,
1424*4882a593Smuzhiyun * -1: decrease WiFi duration
1425*4882a593Smuzhiyun */
1426*4882a593Smuzhiyun s32 result;
1427*4882a593Smuzhiyun u8 retry_count = 0;
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1430*4882a593Smuzhiyun "[BTCoex], TdmaDurationAdjustForAcl()\n");
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun if ((wifi_status ==
1433*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||
1434*4882a593Smuzhiyun (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||
1435*4882a593Smuzhiyun (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)) {
1436*4882a593Smuzhiyun if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1437*4882a593Smuzhiyun coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {
1438*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1439*4882a593Smuzhiyun true, 9);
1440*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 9;
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun up = 0;
1443*4882a593Smuzhiyun dn = 0;
1444*4882a593Smuzhiyun m = 1;
1445*4882a593Smuzhiyun n = 3;
1446*4882a593Smuzhiyun result = 0;
1447*4882a593Smuzhiyun wait_count = 0;
1448*4882a593Smuzhiyun }
1449*4882a593Smuzhiyun return;
1450*4882a593Smuzhiyun }
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun if (!coex_dm->auto_tdma_adjust) {
1453*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = true;
1454*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1455*4882a593Smuzhiyun "[BTCoex], first run TdmaDurationAdjust()!!\n");
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1458*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 2;
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun up = 0;
1461*4882a593Smuzhiyun dn = 0;
1462*4882a593Smuzhiyun m = 1;
1463*4882a593Smuzhiyun n = 3;
1464*4882a593Smuzhiyun result = 0;
1465*4882a593Smuzhiyun wait_count = 0;
1466*4882a593Smuzhiyun } else {
1467*4882a593Smuzhiyun /* acquire the BT TRx retry count from BT_Info byte2 */
1468*4882a593Smuzhiyun retry_count = coex_sta->bt_retry_cnt;
1469*4882a593Smuzhiyun
1470*4882a593Smuzhiyun if ((coex_sta->low_priority_tx) > 1050 ||
1471*4882a593Smuzhiyun (coex_sta->low_priority_rx) > 1250)
1472*4882a593Smuzhiyun retry_count++;
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun result = 0;
1475*4882a593Smuzhiyun wait_count++;
1476*4882a593Smuzhiyun /* no retry in the last 2-second duration */
1477*4882a593Smuzhiyun if (retry_count == 0) {
1478*4882a593Smuzhiyun up++;
1479*4882a593Smuzhiyun dn--;
1480*4882a593Smuzhiyun
1481*4882a593Smuzhiyun if (dn <= 0)
1482*4882a593Smuzhiyun dn = 0;
1483*4882a593Smuzhiyun
1484*4882a593Smuzhiyun if (up >= n) {
1485*4882a593Smuzhiyun /* if retry count during continuous n*2 seconds
1486*4882a593Smuzhiyun * is 0, enlarge WiFi duration
1487*4882a593Smuzhiyun */
1488*4882a593Smuzhiyun wait_count = 0;
1489*4882a593Smuzhiyun n = 3;
1490*4882a593Smuzhiyun up = 0;
1491*4882a593Smuzhiyun dn = 0;
1492*4882a593Smuzhiyun result = 1;
1493*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1494*4882a593Smuzhiyun "[BTCoex], Increase wifi duration!!\n");
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun } else if (retry_count <= 3) {
1497*4882a593Smuzhiyun /* <=3 retry in the last 2-second duration */
1498*4882a593Smuzhiyun up--;
1499*4882a593Smuzhiyun dn++;
1500*4882a593Smuzhiyun
1501*4882a593Smuzhiyun if (up <= 0)
1502*4882a593Smuzhiyun up = 0;
1503*4882a593Smuzhiyun
1504*4882a593Smuzhiyun if (dn == 2) {
1505*4882a593Smuzhiyun /* if continuous 2 retry count(every 2 seconds)
1506*4882a593Smuzhiyun * >0 and < 3, reduce WiFi duration
1507*4882a593Smuzhiyun */
1508*4882a593Smuzhiyun if (wait_count <= 2)
1509*4882a593Smuzhiyun /* avoid loop between the two levels */
1510*4882a593Smuzhiyun m++;
1511*4882a593Smuzhiyun else
1512*4882a593Smuzhiyun m = 1;
1513*4882a593Smuzhiyun
1514*4882a593Smuzhiyun if (m >= 20)
1515*4882a593Smuzhiyun /* maximum of m = 20 ' will recheck if
1516*4882a593Smuzhiyun * need to adjust wifi duration in
1517*4882a593Smuzhiyun * maximum time interval 120 seconds
1518*4882a593Smuzhiyun */
1519*4882a593Smuzhiyun m = 20;
1520*4882a593Smuzhiyun
1521*4882a593Smuzhiyun n = 3 * m;
1522*4882a593Smuzhiyun up = 0;
1523*4882a593Smuzhiyun dn = 0;
1524*4882a593Smuzhiyun wait_count = 0;
1525*4882a593Smuzhiyun result = -1;
1526*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1527*4882a593Smuzhiyun "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1528*4882a593Smuzhiyun }
1529*4882a593Smuzhiyun } else {
1530*4882a593Smuzhiyun /* retry count > 3, once retry count > 3, to reduce
1531*4882a593Smuzhiyun * WiFi duration
1532*4882a593Smuzhiyun */
1533*4882a593Smuzhiyun if (wait_count == 1)
1534*4882a593Smuzhiyun /* to avoid loop between the two levels */
1535*4882a593Smuzhiyun m++;
1536*4882a593Smuzhiyun else
1537*4882a593Smuzhiyun m = 1;
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun if (m >= 20)
1540*4882a593Smuzhiyun /* maximum of m = 20 ' will recheck if need to
1541*4882a593Smuzhiyun * adjust wifi duration in maximum time interval
1542*4882a593Smuzhiyun * 120 seconds
1543*4882a593Smuzhiyun */
1544*4882a593Smuzhiyun m = 20;
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun n = 3 * m;
1547*4882a593Smuzhiyun up = 0;
1548*4882a593Smuzhiyun dn = 0;
1549*4882a593Smuzhiyun wait_count = 0;
1550*4882a593Smuzhiyun result = -1;
1551*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1552*4882a593Smuzhiyun "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1553*4882a593Smuzhiyun }
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun if (result == -1) {
1556*4882a593Smuzhiyun if (coex_dm->cur_ps_tdma == 1) {
1557*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1558*4882a593Smuzhiyun true, 2);
1559*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 2;
1560*4882a593Smuzhiyun } else if (coex_dm->cur_ps_tdma == 2) {
1561*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1562*4882a593Smuzhiyun true, 9);
1563*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 9;
1564*4882a593Smuzhiyun } else if (coex_dm->cur_ps_tdma == 9) {
1565*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1566*4882a593Smuzhiyun true, 11);
1567*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 11;
1568*4882a593Smuzhiyun }
1569*4882a593Smuzhiyun } else if (result == 1) {
1570*4882a593Smuzhiyun if (coex_dm->cur_ps_tdma == 11) {
1571*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1572*4882a593Smuzhiyun true, 9);
1573*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 9;
1574*4882a593Smuzhiyun } else if (coex_dm->cur_ps_tdma == 9) {
1575*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1576*4882a593Smuzhiyun true, 2);
1577*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 2;
1578*4882a593Smuzhiyun } else if (coex_dm->cur_ps_tdma == 2) {
1579*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1580*4882a593Smuzhiyun true, 1);
1581*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type = 1;
1582*4882a593Smuzhiyun }
1583*4882a593Smuzhiyun }
1584*4882a593Smuzhiyun
1585*4882a593Smuzhiyun if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1586*4882a593Smuzhiyun coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {
1587*4882a593Smuzhiyun /* recover to previous adjust type */
1588*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1589*4882a593Smuzhiyun coex_dm->ps_tdma_du_adj_type);
1590*4882a593Smuzhiyun }
1591*4882a593Smuzhiyun }
1592*4882a593Smuzhiyun }
1593*4882a593Smuzhiyun
halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist * btcoexist,bool new_ps_state)1594*4882a593Smuzhiyun static void halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist *btcoexist,
1595*4882a593Smuzhiyun bool new_ps_state)
1596*4882a593Smuzhiyun {
1597*4882a593Smuzhiyun u8 lps_mode = 0x0;
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1600*4882a593Smuzhiyun
1601*4882a593Smuzhiyun if (lps_mode) {
1602*4882a593Smuzhiyun /* already under LPS state */
1603*4882a593Smuzhiyun if (new_ps_state) {
1604*4882a593Smuzhiyun /* keep state under LPS, do nothing. */
1605*4882a593Smuzhiyun } else {
1606*4882a593Smuzhiyun /* will leave LPS state, turn off psTdma first */
1607*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1608*4882a593Smuzhiyun false, 0);
1609*4882a593Smuzhiyun }
1610*4882a593Smuzhiyun } else {
1611*4882a593Smuzhiyun /* NO PS state */
1612*4882a593Smuzhiyun if (new_ps_state) {
1613*4882a593Smuzhiyun /* will enter LPS state, turn off psTdma first */
1614*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1615*4882a593Smuzhiyun false, 0);
1616*4882a593Smuzhiyun } else {
1617*4882a593Smuzhiyun /* keep state under NO PS state, do nothing. */
1618*4882a593Smuzhiyun }
1619*4882a593Smuzhiyun }
1620*4882a593Smuzhiyun }
1621*4882a593Smuzhiyun
halbtc8723b1ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1622*4882a593Smuzhiyun static void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,
1623*4882a593Smuzhiyun u8 ps_type, u8 lps_val,
1624*4882a593Smuzhiyun u8 rpwm_val)
1625*4882a593Smuzhiyun {
1626*4882a593Smuzhiyun bool low_pwr_disable = false;
1627*4882a593Smuzhiyun
1628*4882a593Smuzhiyun switch (ps_type) {
1629*4882a593Smuzhiyun case BTC_PS_WIFI_NATIVE:
1630*4882a593Smuzhiyun /* recover to original 32k low power setting */
1631*4882a593Smuzhiyun low_pwr_disable = false;
1632*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1633*4882a593Smuzhiyun &low_pwr_disable);
1634*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1635*4882a593Smuzhiyun coex_sta->force_lps_on = false;
1636*4882a593Smuzhiyun break;
1637*4882a593Smuzhiyun case BTC_PS_LPS_ON:
1638*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, true);
1639*4882a593Smuzhiyun halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1640*4882a593Smuzhiyun rpwm_val);
1641*4882a593Smuzhiyun /* when coex force to enter LPS, do not enter 32k low power */
1642*4882a593Smuzhiyun low_pwr_disable = true;
1643*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1644*4882a593Smuzhiyun &low_pwr_disable);
1645*4882a593Smuzhiyun /* power save must executed before psTdma */
1646*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1647*4882a593Smuzhiyun coex_sta->force_lps_on = true;
1648*4882a593Smuzhiyun break;
1649*4882a593Smuzhiyun case BTC_PS_LPS_OFF:
1650*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, false);
1651*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1652*4882a593Smuzhiyun coex_sta->force_lps_on = false;
1653*4882a593Smuzhiyun break;
1654*4882a593Smuzhiyun default:
1655*4882a593Smuzhiyun break;
1656*4882a593Smuzhiyun }
1657*4882a593Smuzhiyun }
1658*4882a593Smuzhiyun
halbtc8723b1ant_action_wifi_only(struct btc_coexist * btcoexist)1659*4882a593Smuzhiyun static void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)
1660*4882a593Smuzhiyun {
1661*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1662*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1663*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1664*4882a593Smuzhiyun FORCE_EXEC, false, false);
1665*4882a593Smuzhiyun }
1666*4882a593Smuzhiyun
1667*4882a593Smuzhiyun /* check if BT is disabled */
halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist * btcoexist)1668*4882a593Smuzhiyun static void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist
1669*4882a593Smuzhiyun *btcoexist)
1670*4882a593Smuzhiyun {
1671*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1672*4882a593Smuzhiyun static u32 bt_disable_cnt;
1673*4882a593Smuzhiyun bool bt_active = true, bt_disabled = false;
1674*4882a593Smuzhiyun
1675*4882a593Smuzhiyun if (coex_sta->high_priority_tx == 0 &&
1676*4882a593Smuzhiyun coex_sta->high_priority_rx == 0 && coex_sta->low_priority_tx == 0 &&
1677*4882a593Smuzhiyun coex_sta->low_priority_rx == 0)
1678*4882a593Smuzhiyun bt_active = false;
1679*4882a593Smuzhiyun if (coex_sta->high_priority_tx == 0xffff &&
1680*4882a593Smuzhiyun coex_sta->high_priority_rx == 0xffff &&
1681*4882a593Smuzhiyun coex_sta->low_priority_tx == 0xffff &&
1682*4882a593Smuzhiyun coex_sta->low_priority_rx == 0xffff)
1683*4882a593Smuzhiyun bt_active = false;
1684*4882a593Smuzhiyun if (bt_active) {
1685*4882a593Smuzhiyun bt_disable_cnt = 0;
1686*4882a593Smuzhiyun bt_disabled = false;
1687*4882a593Smuzhiyun } else {
1688*4882a593Smuzhiyun bt_disable_cnt++;
1689*4882a593Smuzhiyun if (bt_disable_cnt >= 2)
1690*4882a593Smuzhiyun bt_disabled = true;
1691*4882a593Smuzhiyun }
1692*4882a593Smuzhiyun if (coex_sta->bt_disabled != bt_disabled) {
1693*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1694*4882a593Smuzhiyun "[BTCoex], BT is from %s to %s!!\n",
1695*4882a593Smuzhiyun (coex_sta->bt_disabled ? "disabled" : "enabled"),
1696*4882a593Smuzhiyun (bt_disabled ? "disabled" : "enabled"));
1697*4882a593Smuzhiyun
1698*4882a593Smuzhiyun coex_sta->bt_disabled = bt_disabled;
1699*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1700*4882a593Smuzhiyun &bt_disabled);
1701*4882a593Smuzhiyun if (bt_disabled) {
1702*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_only(btcoexist);
1703*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1704*4882a593Smuzhiyun NULL);
1705*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1706*4882a593Smuzhiyun NULL);
1707*4882a593Smuzhiyun }
1708*4882a593Smuzhiyun }
1709*4882a593Smuzhiyun }
1710*4882a593Smuzhiyun
1711*4882a593Smuzhiyun /*****************************************************
1712*4882a593Smuzhiyun *
1713*4882a593Smuzhiyun * Non-Software Coex Mechanism start
1714*4882a593Smuzhiyun *
1715*4882a593Smuzhiyun *****************************************************/
1716*4882a593Smuzhiyun
halbtc8723b1ant_action_bt_whck_test(struct btc_coexist * btcoexist)1717*4882a593Smuzhiyun static void halbtc8723b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)
1718*4882a593Smuzhiyun {
1719*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1720*4882a593Smuzhiyun 0x0);
1721*4882a593Smuzhiyun
1722*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1723*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1724*4882a593Smuzhiyun false, false);
1725*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1726*4882a593Smuzhiyun }
1727*4882a593Smuzhiyun
halbtc8723b1ant_action_wifi_multiport(struct btc_coexist * btcoexist)1728*4882a593Smuzhiyun static void halbtc8723b1ant_action_wifi_multiport(struct btc_coexist *btcoexist)
1729*4882a593Smuzhiyun {
1730*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1731*4882a593Smuzhiyun 0x0, 0x0);
1732*4882a593Smuzhiyun
1733*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1734*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1735*4882a593Smuzhiyun false, false);
1736*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1737*4882a593Smuzhiyun }
1738*4882a593Smuzhiyun
halbtc8723b1ant_action_hs(struct btc_coexist * btcoexist)1739*4882a593Smuzhiyun static void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)
1740*4882a593Smuzhiyun {
1741*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1742*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1743*4882a593Smuzhiyun }
1744*4882a593Smuzhiyun
halbtc8723b1ant_action_bt_inquiry(struct btc_coexist * btcoexist)1745*4882a593Smuzhiyun static void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1746*4882a593Smuzhiyun {
1747*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1748*4882a593Smuzhiyun bool wifi_connected = false, ap_enable = false;
1749*4882a593Smuzhiyun bool wifi_busy = false, bt_busy = false;
1750*4882a593Smuzhiyun
1751*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1752*4882a593Smuzhiyun &ap_enable);
1753*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1754*4882a593Smuzhiyun &wifi_connected);
1755*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1756*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1757*4882a593Smuzhiyun
1758*4882a593Smuzhiyun if (coex_sta->bt_abnormal_scan) {
1759*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
1760*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1761*4882a593Smuzhiyun } else if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1762*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1763*4882a593Smuzhiyun 0x0, 0x0);
1764*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1765*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1766*4882a593Smuzhiyun NORMAL_EXEC, false, false);
1767*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1768*4882a593Smuzhiyun } else if (bt_link_info->sco_exist || bt_link_info->hid_exist ||
1769*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
1770*4882a593Smuzhiyun /* SCO/HID/A2DP busy */
1771*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1772*4882a593Smuzhiyun 0x0, 0x0);
1773*4882a593Smuzhiyun if (coex_sta->c2h_bt_remote_name_req)
1774*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1775*4882a593Smuzhiyun 33);
1776*4882a593Smuzhiyun else
1777*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1778*4882a593Smuzhiyun 32);
1779*4882a593Smuzhiyun
1780*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1781*4882a593Smuzhiyun } else if (bt_link_info->pan_exist || wifi_busy) {
1782*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1783*4882a593Smuzhiyun 0x0, 0x0);
1784*4882a593Smuzhiyun if (coex_sta->c2h_bt_remote_name_req)
1785*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1786*4882a593Smuzhiyun 33);
1787*4882a593Smuzhiyun else
1788*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1789*4882a593Smuzhiyun 32);
1790*4882a593Smuzhiyun
1791*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1792*4882a593Smuzhiyun } else {
1793*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1794*4882a593Smuzhiyun 0x0, 0x0);
1795*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1796*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1797*4882a593Smuzhiyun NORMAL_EXEC, false, false);
1798*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1799*4882a593Smuzhiyun }
1800*4882a593Smuzhiyun }
1801*4882a593Smuzhiyun
btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist * btcoexist,u8 wifi_status)1802*4882a593Smuzhiyun static void btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1803*4882a593Smuzhiyun u8 wifi_status)
1804*4882a593Smuzhiyun {
1805*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1806*4882a593Smuzhiyun bool wifi_connected = false;
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1809*4882a593Smuzhiyun &wifi_connected);
1810*4882a593Smuzhiyun
1811*4882a593Smuzhiyun /* tdma and coex table */
1812*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
1813*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1814*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1815*4882a593Smuzhiyun } else {
1816*4882a593Smuzhiyun /* HID */
1817*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
1818*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1819*4882a593Smuzhiyun }
1820*4882a593Smuzhiyun }
1821*4882a593Smuzhiyun
halbtc8723b1ant_action_wifi_connected_bt_acl_busy(struct btc_coexist * btcoexist,u8 wifi_status)1822*4882a593Smuzhiyun static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
1823*4882a593Smuzhiyun struct btc_coexist *btcoexist,
1824*4882a593Smuzhiyun u8 wifi_status)
1825*4882a593Smuzhiyun {
1826*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1827*4882a593Smuzhiyun
1828*4882a593Smuzhiyun if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
1829*4882a593Smuzhiyun bt_link_info->slave_role = true;
1830*4882a593Smuzhiyun else
1831*4882a593Smuzhiyun bt_link_info->slave_role = false;
1832*4882a593Smuzhiyun
1833*4882a593Smuzhiyun if (bt_link_info->hid_only) { /* HID */
1834*4882a593Smuzhiyun btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);
1835*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1836*4882a593Smuzhiyun return;
1837*4882a593Smuzhiyun } else if (bt_link_info->a2dp_only) { /* A2DP */
1838*4882a593Smuzhiyun if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1839*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1840*4882a593Smuzhiyun true, 32);
1841*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1842*4882a593Smuzhiyun NORMAL_EXEC, 4);
1843*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1844*4882a593Smuzhiyun } else {
1845*4882a593Smuzhiyun btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,
1846*4882a593Smuzhiyun wifi_status);
1847*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1848*4882a593Smuzhiyun NORMAL_EXEC, 1);
1849*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = true;
1850*4882a593Smuzhiyun }
1851*4882a593Smuzhiyun } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1852*4882a593Smuzhiyun (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1853*4882a593Smuzhiyun bt_link_info->pan_exist)) {
1854*4882a593Smuzhiyun /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
1855*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1856*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1857*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1858*4882a593Smuzhiyun } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1859*4882a593Smuzhiyun /* HID + A2DP */
1860*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1861*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1862*4882a593Smuzhiyun
1863*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1864*4882a593Smuzhiyun } else if (bt_link_info->pan_only ||
1865*4882a593Smuzhiyun (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1866*4882a593Smuzhiyun /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
1867*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1868*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1869*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1870*4882a593Smuzhiyun } else {
1871*4882a593Smuzhiyun /* BT no-profile busy (0x9) */
1872*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
1873*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1874*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1875*4882a593Smuzhiyun }
1876*4882a593Smuzhiyun }
1877*4882a593Smuzhiyun
btc8723b1ant_action_wifi_not_conn(struct btc_coexist * btcoexist)1878*4882a593Smuzhiyun static void btc8723b1ant_action_wifi_not_conn(struct btc_coexist *btcoexist)
1879*4882a593Smuzhiyun {
1880*4882a593Smuzhiyun /* power save state */
1881*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1882*4882a593Smuzhiyun 0x0, 0x0);
1883*4882a593Smuzhiyun
1884*4882a593Smuzhiyun /* tdma and coex table */
1885*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1886*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1887*4882a593Smuzhiyun false, false);
1888*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1889*4882a593Smuzhiyun }
1890*4882a593Smuzhiyun
1891*4882a593Smuzhiyun static void
btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist * btcoexist)1892*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1893*4882a593Smuzhiyun {
1894*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1895*4882a593Smuzhiyun
1896*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1897*4882a593Smuzhiyun 0x0, 0x0);
1898*4882a593Smuzhiyun
1899*4882a593Smuzhiyun /* tdma and coex table */
1900*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1901*4882a593Smuzhiyun if (bt_link_info->a2dp_exist) {
1902*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1903*4882a593Smuzhiyun true, 32);
1904*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1905*4882a593Smuzhiyun NORMAL_EXEC, 4);
1906*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist) {
1907*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1908*4882a593Smuzhiyun true, 22);
1909*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1910*4882a593Smuzhiyun NORMAL_EXEC, 4);
1911*4882a593Smuzhiyun } else {
1912*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1913*4882a593Smuzhiyun true, 20);
1914*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1915*4882a593Smuzhiyun NORMAL_EXEC, 1);
1916*4882a593Smuzhiyun }
1917*4882a593Smuzhiyun } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
1918*4882a593Smuzhiyun coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY){
1919*4882a593Smuzhiyun btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1920*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1921*4882a593Smuzhiyun } else {
1922*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1923*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1924*4882a593Smuzhiyun NORMAL_EXEC, false, false);
1925*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1926*4882a593Smuzhiyun }
1927*4882a593Smuzhiyun }
1928*4882a593Smuzhiyun
1929*4882a593Smuzhiyun static void
btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist * btcoexist)1930*4882a593Smuzhiyun btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist *btcoexist)
1931*4882a593Smuzhiyun {
1932*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1933*4882a593Smuzhiyun
1934*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1935*4882a593Smuzhiyun 0x0, 0x0);
1936*4882a593Smuzhiyun
1937*4882a593Smuzhiyun /* tdma and coex table */
1938*4882a593Smuzhiyun if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1939*4882a593Smuzhiyun (bt_link_info->a2dp_exist)) {
1940*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1941*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
1942*4882a593Smuzhiyun } else if (bt_link_info->pan_exist) {
1943*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1944*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
1945*4882a593Smuzhiyun } else {
1946*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1947*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1948*4882a593Smuzhiyun NORMAL_EXEC, false, false);
1949*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1950*4882a593Smuzhiyun }
1951*4882a593Smuzhiyun }
1952*4882a593Smuzhiyun
btc8723b1ant_action_wifi_conn_scan(struct btc_coexist * btcoexist)1953*4882a593Smuzhiyun static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
1954*4882a593Smuzhiyun {
1955*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1956*4882a593Smuzhiyun
1957*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1958*4882a593Smuzhiyun 0x0, 0x0);
1959*4882a593Smuzhiyun
1960*4882a593Smuzhiyun /* tdma and coex table */
1961*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1962*4882a593Smuzhiyun if (bt_link_info->a2dp_exist) {
1963*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1964*4882a593Smuzhiyun true, 32);
1965*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1966*4882a593Smuzhiyun NORMAL_EXEC, 4);
1967*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist &&
1968*4882a593Smuzhiyun bt_link_info->pan_exist) {
1969*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1970*4882a593Smuzhiyun true, 22);
1971*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1972*4882a593Smuzhiyun NORMAL_EXEC, 4);
1973*4882a593Smuzhiyun } else {
1974*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1975*4882a593Smuzhiyun true, 20);
1976*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
1977*4882a593Smuzhiyun NORMAL_EXEC, 4);
1978*4882a593Smuzhiyun }
1979*4882a593Smuzhiyun } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
1980*4882a593Smuzhiyun coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
1981*4882a593Smuzhiyun btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1982*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1983*4882a593Smuzhiyun } else {
1984*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1985*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1986*4882a593Smuzhiyun NORMAL_EXEC, false, false);
1987*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1988*4882a593Smuzhiyun }
1989*4882a593Smuzhiyun }
1990*4882a593Smuzhiyun
halbtc8723b1ant_action_wifi_connected_special_packet(struct btc_coexist * btcoexist)1991*4882a593Smuzhiyun static void halbtc8723b1ant_action_wifi_connected_special_packet(
1992*4882a593Smuzhiyun struct btc_coexist *btcoexist)
1993*4882a593Smuzhiyun {
1994*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1995*4882a593Smuzhiyun bool wifi_busy = false;
1996*4882a593Smuzhiyun
1997*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1998*4882a593Smuzhiyun
1999*4882a593Smuzhiyun /* no special packet process for both WiFi and BT very busy */
2000*4882a593Smuzhiyun if ((wifi_busy) &&
2001*4882a593Smuzhiyun ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
2002*4882a593Smuzhiyun return;
2003*4882a593Smuzhiyun
2004*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2005*4882a593Smuzhiyun 0x0, 0x0);
2006*4882a593Smuzhiyun
2007*4882a593Smuzhiyun /* tdma and coex table */
2008*4882a593Smuzhiyun if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
2009*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2010*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2011*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist) {
2012*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2013*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2014*4882a593Smuzhiyun } else if (bt_link_info->pan_exist) {
2015*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2016*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2017*4882a593Smuzhiyun } else {
2018*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2019*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2020*4882a593Smuzhiyun NORMAL_EXEC, false, false);
2021*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2022*4882a593Smuzhiyun }
2023*4882a593Smuzhiyun }
2024*4882a593Smuzhiyun
halbtc8723b1ant_action_wifi_connected(struct btc_coexist * btcoexist)2025*4882a593Smuzhiyun static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
2026*4882a593Smuzhiyun {
2027*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2028*4882a593Smuzhiyun bool wifi_busy = false;
2029*4882a593Smuzhiyun bool scan = false, link = false, roam = false;
2030*4882a593Smuzhiyun bool under_4way = false, ap_enable = false;
2031*4882a593Smuzhiyun
2032*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2033*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect()===>\n");
2034*4882a593Smuzhiyun
2035*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2036*4882a593Smuzhiyun &under_4way);
2037*4882a593Smuzhiyun if (under_4way) {
2038*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
2039*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2040*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
2041*4882a593Smuzhiyun return;
2042*4882a593Smuzhiyun }
2043*4882a593Smuzhiyun
2044*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2045*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2046*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2047*4882a593Smuzhiyun
2048*4882a593Smuzhiyun if (scan || link || roam) {
2049*4882a593Smuzhiyun if (scan)
2050*4882a593Smuzhiyun btc8723b1ant_action_wifi_conn_scan(btcoexist);
2051*4882a593Smuzhiyun else
2052*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected_special_packet(
2053*4882a593Smuzhiyun btcoexist);
2054*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2055*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
2056*4882a593Smuzhiyun return;
2057*4882a593Smuzhiyun }
2058*4882a593Smuzhiyun
2059*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2060*4882a593Smuzhiyun &ap_enable);
2061*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2062*4882a593Smuzhiyun /* power save state */
2063*4882a593Smuzhiyun if (!ap_enable &&
2064*4882a593Smuzhiyun coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
2065*4882a593Smuzhiyun !btcoexist->bt_link_info.hid_only) {
2066*4882a593Smuzhiyun if (btcoexist->bt_link_info.a2dp_only) {
2067*4882a593Smuzhiyun if (!wifi_busy) {
2068*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist,
2069*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE,
2070*4882a593Smuzhiyun 0x0, 0x0);
2071*4882a593Smuzhiyun } else { /* busy */
2072*4882a593Smuzhiyun if (coex_sta->scan_ap_num >=
2073*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_NOISY_THRESH)
2074*4882a593Smuzhiyun /* no force LPS, no PS-TDMA,
2075*4882a593Smuzhiyun * use pure TDMA
2076*4882a593Smuzhiyun */
2077*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(
2078*4882a593Smuzhiyun btcoexist, BTC_PS_WIFI_NATIVE,
2079*4882a593Smuzhiyun 0x0, 0x0);
2080*4882a593Smuzhiyun else
2081*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(
2082*4882a593Smuzhiyun btcoexist, BTC_PS_LPS_ON, 0x50,
2083*4882a593Smuzhiyun 0x4);
2084*4882a593Smuzhiyun }
2085*4882a593Smuzhiyun } else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&
2086*4882a593Smuzhiyun (!coex_sta->hid_exist))
2087*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(
2088*4882a593Smuzhiyun btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2089*4882a593Smuzhiyun else
2090*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist,
2091*4882a593Smuzhiyun BTC_PS_LPS_ON,
2092*4882a593Smuzhiyun 0x50, 0x4);
2093*4882a593Smuzhiyun } else {
2094*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2095*4882a593Smuzhiyun 0x0, 0x0);
2096*4882a593Smuzhiyun }
2097*4882a593Smuzhiyun /* tdma and coex table */
2098*4882a593Smuzhiyun if (!wifi_busy) {
2099*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
2100*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2101*4882a593Smuzhiyun btcoexist,
2102*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2103*4882a593Smuzhiyun } else if (coex_dm->bt_status ==
2104*4882a593Smuzhiyun BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2105*4882a593Smuzhiyun coex_dm->bt_status ==
2106*4882a593Smuzhiyun BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2107*4882a593Smuzhiyun btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2108*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2109*4882a593Smuzhiyun } else {
2110*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2111*4882a593Smuzhiyun false, 8);
2112*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist,
2113*4882a593Smuzhiyun BTC_ANT_PATH_PTA,
2114*4882a593Smuzhiyun NORMAL_EXEC, false, false);
2115*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
2116*4882a593Smuzhiyun NORMAL_EXEC, 2);
2117*4882a593Smuzhiyun }
2118*4882a593Smuzhiyun } else {
2119*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
2120*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2121*4882a593Smuzhiyun btcoexist,
2122*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2123*4882a593Smuzhiyun } else if (coex_dm->bt_status ==
2124*4882a593Smuzhiyun BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2125*4882a593Smuzhiyun coex_dm->bt_status ==
2126*4882a593Smuzhiyun BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2127*4882a593Smuzhiyun btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2128*4882a593Smuzhiyun BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2129*4882a593Smuzhiyun } else {
2130*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2131*4882a593Smuzhiyun true, 32);
2132*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist,
2133*4882a593Smuzhiyun BTC_ANT_PATH_PTA,
2134*4882a593Smuzhiyun NORMAL_EXEC, false, false);
2135*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
2136*4882a593Smuzhiyun NORMAL_EXEC, 4);
2137*4882a593Smuzhiyun }
2138*4882a593Smuzhiyun }
2139*4882a593Smuzhiyun }
2140*4882a593Smuzhiyun
halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist * btcoexist)2141*4882a593Smuzhiyun static void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
2142*4882a593Smuzhiyun {
2143*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2144*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2145*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false, wifi_busy = false;
2146*4882a593Smuzhiyun bool increase_scan_dev_num = false;
2147*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
2148*4882a593Smuzhiyun bool miracast_plus_bt = false;
2149*4882a593Smuzhiyun u8 agg_buf_size = 5;
2150*4882a593Smuzhiyun u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
2151*4882a593Smuzhiyun u32 wifi_link_status = 0;
2152*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2153*4882a593Smuzhiyun u32 wifi_bw;
2154*4882a593Smuzhiyun
2155*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2156*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism()===>\n");
2157*4882a593Smuzhiyun
2158*4882a593Smuzhiyun if (btcoexist->manual_control) {
2159*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2160*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
2161*4882a593Smuzhiyun return;
2162*4882a593Smuzhiyun }
2163*4882a593Smuzhiyun
2164*4882a593Smuzhiyun if (btcoexist->stop_coex_dm) {
2165*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2166*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
2167*4882a593Smuzhiyun return;
2168*4882a593Smuzhiyun }
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun if (coex_sta->under_ips) {
2171*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2172*4882a593Smuzhiyun "[BTCoex], wifi is under IPS !!!\n");
2173*4882a593Smuzhiyun return;
2174*4882a593Smuzhiyun }
2175*4882a593Smuzhiyun
2176*4882a593Smuzhiyun if (coex_sta->bt_whck_test) {
2177*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2178*4882a593Smuzhiyun "[BTCoex], wifi is under IPS !!!\n");
2179*4882a593Smuzhiyun halbtc8723b1ant_action_bt_whck_test(btcoexist);
2180*4882a593Smuzhiyun return;
2181*4882a593Smuzhiyun }
2182*4882a593Smuzhiyun
2183*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY ||
2184*4882a593Smuzhiyun coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2185*4882a593Smuzhiyun coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2186*4882a593Smuzhiyun increase_scan_dev_num = true;
2187*4882a593Smuzhiyun
2188*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
2189*4882a593Smuzhiyun &increase_scan_dev_num);
2190*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2191*4882a593Smuzhiyun &wifi_connected);
2192*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2195*4882a593Smuzhiyun &wifi_link_status);
2196*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
2197*4882a593Smuzhiyun
2198*4882a593Smuzhiyun if (num_of_wifi_link >= 2 ||
2199*4882a593Smuzhiyun wifi_link_status & WIFI_P2P_GO_CONNECTED) {
2200*4882a593Smuzhiyun if (bt_link_info->bt_link_exist) {
2201*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
2202*4882a593Smuzhiyun 0, 1);
2203*4882a593Smuzhiyun miracast_plus_bt = true;
2204*4882a593Smuzhiyun } else {
2205*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
2206*4882a593Smuzhiyun 0, 0);
2207*4882a593Smuzhiyun miracast_plus_bt = false;
2208*4882a593Smuzhiyun }
2209*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2210*4882a593Smuzhiyun &miracast_plus_bt);
2211*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2212*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2213*4882a593Smuzhiyun
2214*4882a593Smuzhiyun if ((bt_link_info->a2dp_exist || wifi_busy) &&
2215*4882a593Smuzhiyun (coex_sta->c2h_bt_inquiry_page))
2216*4882a593Smuzhiyun halbtc8723b1ant_action_bt_inquiry(btcoexist);
2217*4882a593Smuzhiyun else
2218*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_multiport(btcoexist);
2219*4882a593Smuzhiyun
2220*4882a593Smuzhiyun return;
2221*4882a593Smuzhiyun }
2222*4882a593Smuzhiyun
2223*4882a593Smuzhiyun miracast_plus_bt = false;
2224*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2225*4882a593Smuzhiyun &miracast_plus_bt);
2226*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2227*4882a593Smuzhiyun
2228*4882a593Smuzhiyun if (bt_link_info->bt_link_exist && wifi_connected) {
2229*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
2230*4882a593Smuzhiyun
2231*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
2232*4882a593Smuzhiyun
2233*4882a593Smuzhiyun if (iot_peer != BTC_IOT_PEER_CISCO &&
2234*4882a593Smuzhiyun iot_peer != BTC_IOT_PEER_BROADCOM) {
2235*4882a593Smuzhiyun bool sco_exist = bt_link_info->sco_exist;
2236*4882a593Smuzhiyun
2237*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist,
2238*4882a593Smuzhiyun NORMAL_EXEC, sco_exist,
2239*4882a593Smuzhiyun false, 0x5);
2240*4882a593Smuzhiyun } else {
2241*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
2242*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist,
2243*4882a593Smuzhiyun NORMAL_EXEC, true,
2244*4882a593Smuzhiyun false, 0x5);
2245*4882a593Smuzhiyun } else {
2246*4882a593Smuzhiyun if (wifi_bw == BTC_WIFI_BW_HT40)
2247*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(
2248*4882a593Smuzhiyun btcoexist, NORMAL_EXEC, false,
2249*4882a593Smuzhiyun true, 0x10);
2250*4882a593Smuzhiyun else
2251*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(
2252*4882a593Smuzhiyun btcoexist, NORMAL_EXEC, false,
2253*4882a593Smuzhiyun true, 0x8);
2254*4882a593Smuzhiyun }
2255*4882a593Smuzhiyun }
2256*4882a593Smuzhiyun
2257*4882a593Smuzhiyun halbtc8723b1ant_sw_mechanism(btcoexist, true);
2258*4882a593Smuzhiyun } else {
2259*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2260*4882a593Smuzhiyun
2261*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2262*4882a593Smuzhiyun 0x5);
2263*4882a593Smuzhiyun
2264*4882a593Smuzhiyun halbtc8723b1ant_sw_mechanism(btcoexist, false);
2265*4882a593Smuzhiyun }
2266*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2269*4882a593Smuzhiyun halbtc8723b1ant_action_bt_inquiry(btcoexist);
2270*4882a593Smuzhiyun return;
2271*4882a593Smuzhiyun } else if (bt_hs_on) {
2272*4882a593Smuzhiyun halbtc8723b1ant_action_hs(btcoexist);
2273*4882a593Smuzhiyun return;
2274*4882a593Smuzhiyun }
2275*4882a593Smuzhiyun
2276*4882a593Smuzhiyun if (!wifi_connected) {
2277*4882a593Smuzhiyun bool scan = false, link = false, roam = false;
2278*4882a593Smuzhiyun
2279*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2280*4882a593Smuzhiyun "[BTCoex], wifi is non connected-idle !!!\n");
2281*4882a593Smuzhiyun
2282*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2283*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2284*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2285*4882a593Smuzhiyun
2286*4882a593Smuzhiyun if (scan || link || roam) {
2287*4882a593Smuzhiyun if (scan)
2288*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn_scan(
2289*4882a593Smuzhiyun btcoexist);
2290*4882a593Smuzhiyun else
2291*4882a593Smuzhiyun btc8723b1ant_act_wifi_not_conn_asso_auth(
2292*4882a593Smuzhiyun btcoexist);
2293*4882a593Smuzhiyun } else {
2294*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn(btcoexist);
2295*4882a593Smuzhiyun }
2296*4882a593Smuzhiyun } else { /* wifi LPS/Busy */
2297*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected(btcoexist);
2298*4882a593Smuzhiyun }
2299*4882a593Smuzhiyun }
2300*4882a593Smuzhiyun
2301*4882a593Smuzhiyun /* force coex mechanism to reset */
halbtc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2302*4882a593Smuzhiyun static void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2303*4882a593Smuzhiyun {
2304*4882a593Smuzhiyun /* sw all off */
2305*4882a593Smuzhiyun halbtc8723b1ant_sw_mechanism(btcoexist, false);
2306*4882a593Smuzhiyun
2307*4882a593Smuzhiyun coex_sta->pop_event_cnt = 0;
2308*4882a593Smuzhiyun }
2309*4882a593Smuzhiyun
halbtc8723b1ant_init_hw_config(struct btc_coexist * btcoexist,bool backup,bool wifi_only)2310*4882a593Smuzhiyun static void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist,
2311*4882a593Smuzhiyun bool backup, bool wifi_only)
2312*4882a593Smuzhiyun {
2313*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2314*4882a593Smuzhiyun u32 u32tmp = 0;
2315*4882a593Smuzhiyun u8 u8tmpa = 0, u8tmpb = 0;
2316*4882a593Smuzhiyun
2317*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2318*4882a593Smuzhiyun "[BTCoex], 1Ant Init HW Config!!\n");
2319*4882a593Smuzhiyun
2320*4882a593Smuzhiyun /* 0xf0[15:12] --> Chip Cut information */
2321*4882a593Smuzhiyun coex_sta->cut_version =
2322*4882a593Smuzhiyun (btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;
2323*4882a593Smuzhiyun /* enable TBTT interrupt */
2324*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);
2325*4882a593Smuzhiyun
2326*4882a593Smuzhiyun /* 0x790[5:0] = 0x5 */
2327*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
2328*4882a593Smuzhiyun
2329*4882a593Smuzhiyun /* Enable counter statistics */
2330*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
2331*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2332*4882a593Smuzhiyun
2333*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2334*4882a593Smuzhiyun
2335*4882a593Smuzhiyun /* Antenna config */
2336*4882a593Smuzhiyun if (wifi_only)
2337*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
2338*4882a593Smuzhiyun FORCE_EXEC, true, false);
2339*4882a593Smuzhiyun else
2340*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2341*4882a593Smuzhiyun FORCE_EXEC, true, false);
2342*4882a593Smuzhiyun
2343*4882a593Smuzhiyun /* PTA parameter */
2344*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2345*4882a593Smuzhiyun
2346*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2347*4882a593Smuzhiyun u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2348*4882a593Smuzhiyun u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2349*4882a593Smuzhiyun
2350*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2351*4882a593Smuzhiyun "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2352*4882a593Smuzhiyun u32tmp, u8tmpa, u8tmpb);
2353*4882a593Smuzhiyun }
2354*4882a593Smuzhiyun
2355*4882a593Smuzhiyun /**************************************************************
2356*4882a593Smuzhiyun * extern function start with ex_btc8723b1ant_
2357*4882a593Smuzhiyun **************************************************************/
ex_btc8723b1ant_power_on_setting(struct btc_coexist * btcoexist)2358*4882a593Smuzhiyun void ex_btc8723b1ant_power_on_setting(struct btc_coexist *btcoexist)
2359*4882a593Smuzhiyun {
2360*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2361*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
2362*4882a593Smuzhiyun u8 u8tmp = 0x0;
2363*4882a593Smuzhiyun u16 u16tmp = 0x0;
2364*4882a593Smuzhiyun u32 value;
2365*4882a593Smuzhiyun
2366*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2367*4882a593Smuzhiyun "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
2368*4882a593Smuzhiyun
2369*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
2370*4882a593Smuzhiyun
2371*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
2372*4882a593Smuzhiyun
2373*4882a593Smuzhiyun /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2374*4882a593Smuzhiyun u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
2375*4882a593Smuzhiyun btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun /* set GRAN_BT = 1 */
2378*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
2379*4882a593Smuzhiyun /* set WLAN_ACT = 0 */
2380*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
2381*4882a593Smuzhiyun
2382*4882a593Smuzhiyun /* S0 or S1 setting and Local register setting(By the setting fw can get
2383*4882a593Smuzhiyun * ant number, S0/S1, ... info)
2384*4882a593Smuzhiyun *
2385*4882a593Smuzhiyun * Local setting bit define
2386*4882a593Smuzhiyun * BIT0: "0" for no antenna inverse; "1" for antenna inverse
2387*4882a593Smuzhiyun * BIT1: "0" for internal switch; "1" for external switch
2388*4882a593Smuzhiyun * BIT2: "0" for one antenna; "1" for two antenna
2389*4882a593Smuzhiyun * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
2390*4882a593Smuzhiyun * BIT2 = 0
2391*4882a593Smuzhiyun */
2392*4882a593Smuzhiyun if (btcoexist->chip_interface == BTC_INTF_USB) {
2393*4882a593Smuzhiyun /* fixed at S0 for USB interface */
2394*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2395*4882a593Smuzhiyun
2396*4882a593Smuzhiyun u8tmp |= 0x1; /* antenna inverse */
2397*4882a593Smuzhiyun btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
2398*4882a593Smuzhiyun
2399*4882a593Smuzhiyun board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2400*4882a593Smuzhiyun } else {
2401*4882a593Smuzhiyun /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2402*4882a593Smuzhiyun if (board_info->single_ant_path == 0) {
2403*4882a593Smuzhiyun /* set to S1 */
2404*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);
2405*4882a593Smuzhiyun board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
2406*4882a593Smuzhiyun value = 1;
2407*4882a593Smuzhiyun } else if (board_info->single_ant_path == 1) {
2408*4882a593Smuzhiyun /* set to S0 */
2409*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2410*4882a593Smuzhiyun u8tmp |= 0x1; /* antenna inverse */
2411*4882a593Smuzhiyun board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2412*4882a593Smuzhiyun value = 0;
2413*4882a593Smuzhiyun }
2414*4882a593Smuzhiyun
2415*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
2416*4882a593Smuzhiyun &value);
2417*4882a593Smuzhiyun
2418*4882a593Smuzhiyun if (btcoexist->chip_interface == BTC_INTF_PCI)
2419*4882a593Smuzhiyun btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
2420*4882a593Smuzhiyun u8tmp);
2421*4882a593Smuzhiyun else if (btcoexist->chip_interface == BTC_INTF_SDIO)
2422*4882a593Smuzhiyun btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
2423*4882a593Smuzhiyun u8tmp);
2424*4882a593Smuzhiyun }
2425*4882a593Smuzhiyun }
2426*4882a593Smuzhiyun
2427*4882a593Smuzhiyun
ex_btc8723b1ant_init_hwconfig(struct btc_coexist * btcoexist,bool wifi_only)2428*4882a593Smuzhiyun void ex_btc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist,
2429*4882a593Smuzhiyun bool wifi_only)
2430*4882a593Smuzhiyun {
2431*4882a593Smuzhiyun halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);
2432*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
2433*4882a593Smuzhiyun }
2434*4882a593Smuzhiyun
ex_btc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2435*4882a593Smuzhiyun void ex_btc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2436*4882a593Smuzhiyun {
2437*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2438*4882a593Smuzhiyun
2439*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2440*4882a593Smuzhiyun "[BTCoex], Coex Mechanism Init!!\n");
2441*4882a593Smuzhiyun
2442*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
2443*4882a593Smuzhiyun
2444*4882a593Smuzhiyun halbtc8723b1ant_init_coex_dm(btcoexist);
2445*4882a593Smuzhiyun
2446*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
2447*4882a593Smuzhiyun }
2448*4882a593Smuzhiyun
ex_btc8723b1ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)2449*4882a593Smuzhiyun void ex_btc8723b1ant_display_coex_info(struct btc_coexist *btcoexist,
2450*4882a593Smuzhiyun struct seq_file *m)
2451*4882a593Smuzhiyun {
2452*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
2453*4882a593Smuzhiyun struct btc_stack_info *stack_info = &btcoexist->stack_info;
2454*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2455*4882a593Smuzhiyun u8 u8tmp[4], i, bt_info_ext, pstdmacase = 0;
2456*4882a593Smuzhiyun u16 u16tmp[4];
2457*4882a593Smuzhiyun u32 u32tmp[4];
2458*4882a593Smuzhiyun bool roam = false, scan = false;
2459*4882a593Smuzhiyun bool link = false, wifi_under_5g = false;
2460*4882a593Smuzhiyun bool bt_hs_on = false, wifi_busy = false;
2461*4882a593Smuzhiyun s32 wifi_rssi = 0, bt_hs_rssi = 0;
2462*4882a593Smuzhiyun u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck, wifi_link_status;
2463*4882a593Smuzhiyun u8 wifi_dot11_chnl, wifi_hs_chnl;
2464*4882a593Smuzhiyun u32 fw_ver = 0, bt_patch_ver = 0;
2465*4882a593Smuzhiyun
2466*4882a593Smuzhiyun seq_puts(m, "\n ============[BT Coexist info]============");
2467*4882a593Smuzhiyun
2468*4882a593Smuzhiyun if (btcoexist->manual_control) {
2469*4882a593Smuzhiyun seq_puts(m, "\n ============[Under Manual Control]==========");
2470*4882a593Smuzhiyun seq_puts(m, "\n ==========================================");
2471*4882a593Smuzhiyun }
2472*4882a593Smuzhiyun if (btcoexist->stop_coex_dm) {
2473*4882a593Smuzhiyun seq_puts(m, "\n ============[Coex is STOPPED]============");
2474*4882a593Smuzhiyun seq_puts(m, "\n ==========================================");
2475*4882a593Smuzhiyun }
2476*4882a593Smuzhiyun
2477*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d/ %d",
2478*4882a593Smuzhiyun "Ant PG Num/ Ant Mech/ Ant Pos:",
2479*4882a593Smuzhiyun board_info->pg_ant_num, board_info->btdm_ant_num,
2480*4882a593Smuzhiyun board_info->btdm_ant_pos);
2481*4882a593Smuzhiyun
2482*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s / %d",
2483*4882a593Smuzhiyun "BT stack/ hci ext ver",
2484*4882a593Smuzhiyun ((stack_info->profile_notified) ? "Yes" : "No"),
2485*4882a593Smuzhiyun stack_info->hci_version);
2486*4882a593Smuzhiyun
2487*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2488*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2489*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2490*4882a593Smuzhiyun "CoexVer/ FwVer/ PatchVer",
2491*4882a593Smuzhiyun glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,
2492*4882a593Smuzhiyun fw_ver, bt_patch_ver, bt_patch_ver);
2493*4882a593Smuzhiyun
2494*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2495*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2496*4882a593Smuzhiyun &wifi_dot11_chnl);
2497*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
2498*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d / %d(%d)",
2499*4882a593Smuzhiyun "Dot11 channel / HsChnl(HsMode)",
2500*4882a593Smuzhiyun wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2501*4882a593Smuzhiyun
2502*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %3ph ",
2503*4882a593Smuzhiyun "H2C Wifi inform bt chnl Info",
2504*4882a593Smuzhiyun coex_dm->wifi_chnl_info);
2505*4882a593Smuzhiyun
2506*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2507*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2508*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d",
2509*4882a593Smuzhiyun "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
2510*4882a593Smuzhiyun
2511*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2512*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2513*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2514*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2515*4882a593Smuzhiyun "Wifi link/ roam/ scan", link, roam, scan);
2516*4882a593Smuzhiyun
2517*4882a593Smuzhiyun btcoexist->btc_get(btcoexist , BTC_GET_BL_WIFI_UNDER_5G,
2518*4882a593Smuzhiyun &wifi_under_5g);
2519*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2520*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2521*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2522*4882a593Smuzhiyun &wifi_traffic_dir);
2523*4882a593Smuzhiyun
2524*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s / %s/ %s ",
2525*4882a593Smuzhiyun "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
2526*4882a593Smuzhiyun ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2527*4882a593Smuzhiyun ((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20")),
2528*4882a593Smuzhiyun ((!wifi_busy) ? "idle" :
2529*4882a593Smuzhiyun ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2530*4882a593Smuzhiyun "uplink" : "downlink")));
2531*4882a593Smuzhiyun
2532*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2533*4882a593Smuzhiyun &wifi_link_status);
2534*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",
2535*4882a593Smuzhiyun "sta/vwifi/hs/p2pGo/p2pGc",
2536*4882a593Smuzhiyun ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),
2537*4882a593Smuzhiyun ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),
2538*4882a593Smuzhiyun ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),
2539*4882a593Smuzhiyun ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),
2540*4882a593Smuzhiyun ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));
2541*4882a593Smuzhiyun
2542*4882a593Smuzhiyun seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2543*4882a593Smuzhiyun "BT [status/ rssi/ retryCnt]",
2544*4882a593Smuzhiyun ((coex_sta->bt_disabled) ? ("disabled") :
2545*4882a593Smuzhiyun ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2546*4882a593Smuzhiyun ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2547*4882a593Smuzhiyun coex_dm->bt_status) ?
2548*4882a593Smuzhiyun "non-connected idle" :
2549*4882a593Smuzhiyun ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2550*4882a593Smuzhiyun coex_dm->bt_status) ?
2551*4882a593Smuzhiyun "connected-idle" : "busy")))),
2552*4882a593Smuzhiyun coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2553*4882a593Smuzhiyun
2554*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d / %d / %d / %d",
2555*4882a593Smuzhiyun "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,
2556*4882a593Smuzhiyun bt_link_info->hid_exist, bt_link_info->pan_exist,
2557*4882a593Smuzhiyun bt_link_info->a2dp_exist);
2558*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2559*4882a593Smuzhiyun
2560*4882a593Smuzhiyun bt_info_ext = coex_sta->bt_info_ext;
2561*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s",
2562*4882a593Smuzhiyun "BT Info A2DP rate",
2563*4882a593Smuzhiyun (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
2564*4882a593Smuzhiyun
2565*4882a593Smuzhiyun for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
2566*4882a593Smuzhiyun if (coex_sta->bt_info_c2h_cnt[i]) {
2567*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %7ph(%d)",
2568*4882a593Smuzhiyun glbt_info_src_8723b_1ant[i],
2569*4882a593Smuzhiyun coex_sta->bt_info_c2h[i],
2570*4882a593Smuzhiyun coex_sta->bt_info_c2h_cnt[i]);
2571*4882a593Smuzhiyun }
2572*4882a593Smuzhiyun }
2573*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2574*4882a593Smuzhiyun "PS state, IPS/LPS, (lps/rpwm)",
2575*4882a593Smuzhiyun ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2576*4882a593Smuzhiyun ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2577*4882a593Smuzhiyun btcoexist->bt_info.lps_val,
2578*4882a593Smuzhiyun btcoexist->bt_info.rpwm_val);
2579*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2580*4882a593Smuzhiyun
2581*4882a593Smuzhiyun if (!btcoexist->manual_control) {
2582*4882a593Smuzhiyun /* Sw mechanism */
2583*4882a593Smuzhiyun seq_printf(m, "\n %-35s",
2584*4882a593Smuzhiyun "============[Sw mechanism]============");
2585*4882a593Smuzhiyun
2586*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/",
2587*4882a593Smuzhiyun "SM[LowPenaltyRA]", coex_dm->cur_low_penalty_ra);
2588*4882a593Smuzhiyun
2589*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2590*4882a593Smuzhiyun "DelBA/ BtCtrlAgg/ AggSize",
2591*4882a593Smuzhiyun (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2592*4882a593Smuzhiyun (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2593*4882a593Smuzhiyun btcoexist->bt_info.agg_buf_size);
2594*4882a593Smuzhiyun
2595*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x ",
2596*4882a593Smuzhiyun "Rate Mask", btcoexist->bt_info.ra_mask);
2597*4882a593Smuzhiyun
2598*4882a593Smuzhiyun /* Fw mechanism */
2599*4882a593Smuzhiyun seq_printf(m, "\n %-35s",
2600*4882a593Smuzhiyun "============[Fw mechanism]============");
2601*4882a593Smuzhiyun
2602*4882a593Smuzhiyun pstdmacase = coex_dm->cur_ps_tdma;
2603*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
2604*4882a593Smuzhiyun "PS TDMA", coex_dm->ps_tdma_para,
2605*4882a593Smuzhiyun pstdmacase, coex_dm->auto_tdma_adjust);
2606*4882a593Smuzhiyun
2607*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d ",
2608*4882a593Smuzhiyun "IgnWlanAct", coex_dm->cur_ignore_wlan_act);
2609*4882a593Smuzhiyun
2610*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x ",
2611*4882a593Smuzhiyun "Latest error condition(should be 0)",
2612*4882a593Smuzhiyun coex_dm->error_condition);
2613*4882a593Smuzhiyun }
2614*4882a593Smuzhiyun
2615*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d",
2616*4882a593Smuzhiyun "Coex Table Type", coex_sta->coex_table_type);
2617*4882a593Smuzhiyun
2618*4882a593Smuzhiyun /* Hw setting */
2619*4882a593Smuzhiyun seq_printf(m, "\n %-35s",
2620*4882a593Smuzhiyun "============[Hw setting]============");
2621*4882a593Smuzhiyun
2622*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2623*4882a593Smuzhiyun "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
2624*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
2625*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time);
2626*4882a593Smuzhiyun
2627*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2628*4882a593Smuzhiyun u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2629*4882a593Smuzhiyun u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2630*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2631*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2632*4882a593Smuzhiyun "0x430/0x434/0x42a/0x456",
2633*4882a593Smuzhiyun u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
2634*4882a593Smuzhiyun
2635*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2636*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
2637*4882a593Smuzhiyun u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
2638*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2639*4882a593Smuzhiyun "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],
2640*4882a593Smuzhiyun (u32tmp[1] & 0x3e000000) >> 25);
2641*4882a593Smuzhiyun
2642*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
2643*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
2644*4882a593Smuzhiyun u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
2645*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2646*4882a593Smuzhiyun "0x948/ 0x67[5] / 0x765",
2647*4882a593Smuzhiyun u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
2648*4882a593Smuzhiyun
2649*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
2650*4882a593Smuzhiyun u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
2651*4882a593Smuzhiyun u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
2652*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2653*4882a593Smuzhiyun "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
2654*4882a593Smuzhiyun u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
2655*4882a593Smuzhiyun
2656*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
2657*4882a593Smuzhiyun u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2658*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2659*4882a593Smuzhiyun u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2660*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2661*4882a593Smuzhiyun "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
2662*4882a593Smuzhiyun ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
2663*4882a593Smuzhiyun ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
2664*4882a593Smuzhiyun
2665*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2666*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2667*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2668*4882a593Smuzhiyun "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
2669*4882a593Smuzhiyun
2670*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2671*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
2672*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2673*4882a593Smuzhiyun "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
2674*4882a593Smuzhiyun
2675*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
2676*4882a593Smuzhiyun u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
2677*4882a593Smuzhiyun u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
2678*4882a593Smuzhiyun u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
2679*4882a593Smuzhiyun
2680*4882a593Smuzhiyun u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
2681*4882a593Smuzhiyun u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2682*4882a593Smuzhiyun
2683*4882a593Smuzhiyun fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +
2684*4882a593Smuzhiyun ((u32tmp[1] & 0xffff0000) >> 16) +
2685*4882a593Smuzhiyun (u32tmp[1] & 0xffff) +
2686*4882a593Smuzhiyun (u32tmp[2] & 0xffff) +
2687*4882a593Smuzhiyun ((u32tmp[3] & 0xffff0000) >> 16) +
2688*4882a593Smuzhiyun (u32tmp[3] & 0xffff);
2689*4882a593Smuzhiyun fa_cck = (u8tmp[0] << 8) + u8tmp[1];
2690*4882a593Smuzhiyun
2691*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2692*4882a593Smuzhiyun "OFDM-CCA/OFDM-FA/CCK-FA",
2693*4882a593Smuzhiyun u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
2694*4882a593Smuzhiyun
2695*4882a593Smuzhiyun u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2696*4882a593Smuzhiyun u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2697*4882a593Smuzhiyun u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2698*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2699*4882a593Smuzhiyun "0x6c0/0x6c4/0x6c8(coexTable)",
2700*4882a593Smuzhiyun u32tmp[0], u32tmp[1], u32tmp[2]);
2701*4882a593Smuzhiyun
2702*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d",
2703*4882a593Smuzhiyun "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,
2704*4882a593Smuzhiyun coex_sta->high_priority_tx);
2705*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d",
2706*4882a593Smuzhiyun "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
2707*4882a593Smuzhiyun coex_sta->low_priority_tx);
2708*4882a593Smuzhiyun if (btcoexist->auto_report_1ant)
2709*4882a593Smuzhiyun halbtc8723b1ant_monitor_bt_ctr(btcoexist);
2710*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2711*4882a593Smuzhiyun }
2712*4882a593Smuzhiyun
ex_btc8723b1ant_ips_notify(struct btc_coexist * btcoexist,u8 type)2713*4882a593Smuzhiyun void ex_btc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2714*4882a593Smuzhiyun {
2715*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2716*4882a593Smuzhiyun
2717*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2718*4882a593Smuzhiyun return;
2719*4882a593Smuzhiyun
2720*4882a593Smuzhiyun if (BTC_IPS_ENTER == type) {
2721*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2722*4882a593Smuzhiyun "[BTCoex], IPS ENTER notify\n");
2723*4882a593Smuzhiyun coex_sta->under_ips = true;
2724*4882a593Smuzhiyun
2725*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2726*4882a593Smuzhiyun FORCE_EXEC, false, true);
2727*4882a593Smuzhiyun /* set PTA control */
2728*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2729*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist,
2730*4882a593Smuzhiyun NORMAL_EXEC, 0);
2731*4882a593Smuzhiyun } else if (BTC_IPS_LEAVE == type) {
2732*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2733*4882a593Smuzhiyun "[BTCoex], IPS LEAVE notify\n");
2734*4882a593Smuzhiyun coex_sta->under_ips = false;
2735*4882a593Smuzhiyun
2736*4882a593Smuzhiyun halbtc8723b1ant_init_hw_config(btcoexist, false, false);
2737*4882a593Smuzhiyun halbtc8723b1ant_init_coex_dm(btcoexist);
2738*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
2739*4882a593Smuzhiyun }
2740*4882a593Smuzhiyun }
2741*4882a593Smuzhiyun
ex_btc8723b1ant_lps_notify(struct btc_coexist * btcoexist,u8 type)2742*4882a593Smuzhiyun void ex_btc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2743*4882a593Smuzhiyun {
2744*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2745*4882a593Smuzhiyun
2746*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2747*4882a593Smuzhiyun return;
2748*4882a593Smuzhiyun
2749*4882a593Smuzhiyun if (BTC_LPS_ENABLE == type) {
2750*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2751*4882a593Smuzhiyun "[BTCoex], LPS ENABLE notify\n");
2752*4882a593Smuzhiyun coex_sta->under_lps = true;
2753*4882a593Smuzhiyun } else if (BTC_LPS_DISABLE == type) {
2754*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2755*4882a593Smuzhiyun "[BTCoex], LPS DISABLE notify\n");
2756*4882a593Smuzhiyun coex_sta->under_lps = false;
2757*4882a593Smuzhiyun }
2758*4882a593Smuzhiyun }
2759*4882a593Smuzhiyun
ex_btc8723b1ant_scan_notify(struct btc_coexist * btcoexist,u8 type)2760*4882a593Smuzhiyun void ex_btc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2761*4882a593Smuzhiyun {
2762*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2763*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false;
2764*4882a593Smuzhiyun u8 u8tmpa, u8tmpb;
2765*4882a593Smuzhiyun u32 u32tmp;
2766*4882a593Smuzhiyun u32 wifi_link_status = 0;
2767*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2768*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
2769*4882a593Smuzhiyun u8 agg_buf_size = 5;
2770*4882a593Smuzhiyun
2771*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2772*4882a593Smuzhiyun return;
2773*4882a593Smuzhiyun
2774*4882a593Smuzhiyun if (type == BTC_SCAN_START) {
2775*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
2776*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2777*4882a593Smuzhiyun "[BTCoex], SCAN START notify\n");
2778*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
2779*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2780*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2781*4882a593Smuzhiyun FORCE_EXEC, false, false);
2782*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2783*4882a593Smuzhiyun u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2784*4882a593Smuzhiyun u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2785*4882a593Smuzhiyun
2786*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2787*4882a593Smuzhiyun "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2788*4882a593Smuzhiyun u32tmp, u8tmpa, u8tmpb);
2789*4882a593Smuzhiyun } else {
2790*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
2791*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2792*4882a593Smuzhiyun "[BTCoex], SCAN FINISH notify\n");
2793*4882a593Smuzhiyun
2794*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2795*4882a593Smuzhiyun &coex_sta->scan_ap_num);
2796*4882a593Smuzhiyun }
2797*4882a593Smuzhiyun
2798*4882a593Smuzhiyun if (coex_sta->bt_disabled)
2799*4882a593Smuzhiyun return;
2800*4882a593Smuzhiyun
2801*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2802*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2803*4882a593Smuzhiyun &wifi_connected);
2804*4882a593Smuzhiyun
2805*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
2806*4882a593Smuzhiyun
2807*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2808*4882a593Smuzhiyun &wifi_link_status);
2809*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
2810*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
2811*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2812*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2813*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2814*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_multiport(btcoexist);
2815*4882a593Smuzhiyun return;
2816*4882a593Smuzhiyun }
2817*4882a593Smuzhiyun
2818*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2819*4882a593Smuzhiyun halbtc8723b1ant_action_bt_inquiry(btcoexist);
2820*4882a593Smuzhiyun return;
2821*4882a593Smuzhiyun } else if (bt_hs_on) {
2822*4882a593Smuzhiyun halbtc8723b1ant_action_hs(btcoexist);
2823*4882a593Smuzhiyun return;
2824*4882a593Smuzhiyun }
2825*4882a593Smuzhiyun
2826*4882a593Smuzhiyun if (BTC_SCAN_START == type) {
2827*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2828*4882a593Smuzhiyun "[BTCoex], SCAN START notify\n");
2829*4882a593Smuzhiyun if (!wifi_connected)
2830*4882a593Smuzhiyun /* non-connected scan */
2831*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn_scan(btcoexist);
2832*4882a593Smuzhiyun else
2833*4882a593Smuzhiyun /* wifi is connected */
2834*4882a593Smuzhiyun btc8723b1ant_action_wifi_conn_scan(btcoexist);
2835*4882a593Smuzhiyun } else if (BTC_SCAN_FINISH == type) {
2836*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2837*4882a593Smuzhiyun "[BTCoex], SCAN FINISH notify\n");
2838*4882a593Smuzhiyun if (!wifi_connected)
2839*4882a593Smuzhiyun /* non-connected scan */
2840*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn(btcoexist);
2841*4882a593Smuzhiyun else
2842*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected(btcoexist);
2843*4882a593Smuzhiyun }
2844*4882a593Smuzhiyun }
2845*4882a593Smuzhiyun
ex_btc8723b1ant_connect_notify(struct btc_coexist * btcoexist,u8 type)2846*4882a593Smuzhiyun void ex_btc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2847*4882a593Smuzhiyun {
2848*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2849*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false;
2850*4882a593Smuzhiyun u32 wifi_link_status = 0;
2851*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2852*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false, under_4way = false;
2853*4882a593Smuzhiyun u8 agg_buf_size = 5;
2854*4882a593Smuzhiyun
2855*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2856*4882a593Smuzhiyun &under_4way);
2857*4882a593Smuzhiyun
2858*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2859*4882a593Smuzhiyun coex_sta->bt_disabled)
2860*4882a593Smuzhiyun return;
2861*4882a593Smuzhiyun
2862*4882a593Smuzhiyun if (type == BTC_ASSOCIATE_START) {
2863*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
2866*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2867*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2868*4882a593Smuzhiyun FORCE_EXEC, false, false);
2869*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2870*4882a593Smuzhiyun "[BTCoex], CONNECT START notify\n");
2871*4882a593Smuzhiyun coex_dm->arp_cnt = 0;
2872*4882a593Smuzhiyun } else {
2873*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
2874*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2875*4882a593Smuzhiyun "[BTCoex], CONNECT FINISH notify\n");
2876*4882a593Smuzhiyun }
2877*4882a593Smuzhiyun
2878*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2879*4882a593Smuzhiyun &wifi_link_status);
2880*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status>>16;
2881*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
2882*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2883*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2884*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2885*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_multiport(btcoexist);
2886*4882a593Smuzhiyun return;
2887*4882a593Smuzhiyun }
2888*4882a593Smuzhiyun
2889*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2890*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2891*4882a593Smuzhiyun halbtc8723b1ant_action_bt_inquiry(btcoexist);
2892*4882a593Smuzhiyun return;
2893*4882a593Smuzhiyun } else if (bt_hs_on) {
2894*4882a593Smuzhiyun halbtc8723b1ant_action_hs(btcoexist);
2895*4882a593Smuzhiyun return;
2896*4882a593Smuzhiyun }
2897*4882a593Smuzhiyun
2898*4882a593Smuzhiyun if (BTC_ASSOCIATE_START == type) {
2899*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2900*4882a593Smuzhiyun "[BTCoex], CONNECT START notify\n");
2901*4882a593Smuzhiyun btc8723b1ant_act_wifi_not_conn_asso_auth(btcoexist);
2902*4882a593Smuzhiyun } else if (BTC_ASSOCIATE_FINISH == type) {
2903*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2904*4882a593Smuzhiyun "[BTCoex], CONNECT FINISH notify\n");
2905*4882a593Smuzhiyun
2906*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2907*4882a593Smuzhiyun &wifi_connected);
2908*4882a593Smuzhiyun if (!wifi_connected)
2909*4882a593Smuzhiyun /* non-connected scan */
2910*4882a593Smuzhiyun btc8723b1ant_action_wifi_not_conn(btcoexist);
2911*4882a593Smuzhiyun else
2912*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected(btcoexist);
2913*4882a593Smuzhiyun }
2914*4882a593Smuzhiyun }
2915*4882a593Smuzhiyun
ex_btc8723b1ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)2916*4882a593Smuzhiyun void ex_btc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,
2917*4882a593Smuzhiyun u8 type)
2918*4882a593Smuzhiyun {
2919*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2920*4882a593Smuzhiyun u8 h2c_parameter[3] = {0};
2921*4882a593Smuzhiyun u32 wifi_bw;
2922*4882a593Smuzhiyun u8 wifi_central_chnl;
2923*4882a593Smuzhiyun bool wifi_under_b_mode = false;
2924*4882a593Smuzhiyun
2925*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2926*4882a593Smuzhiyun coex_sta->bt_disabled)
2927*4882a593Smuzhiyun return;
2928*4882a593Smuzhiyun
2929*4882a593Smuzhiyun if (type == BTC_MEDIA_CONNECT) {
2930*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2931*4882a593Smuzhiyun "[BTCoex], MEDIA connect notify\n");
2932*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
2933*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2934*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2935*4882a593Smuzhiyun FORCE_EXEC, false, false);
2936*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
2937*4882a593Smuzhiyun &wifi_under_b_mode);
2938*4882a593Smuzhiyun
2939*4882a593Smuzhiyun /* Set CCK Tx/Rx high Pri except 11b mode */
2940*4882a593Smuzhiyun if (wifi_under_b_mode) {
2941*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cd,
2942*4882a593Smuzhiyun 0x00); /* CCK Tx */
2943*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cf,
2944*4882a593Smuzhiyun 0x00); /* CCK Rx */
2945*4882a593Smuzhiyun } else {
2946*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cd,
2947*4882a593Smuzhiyun 0x00); /* CCK Tx */
2948*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cf,
2949*4882a593Smuzhiyun 0x10); /* CCK Rx */
2950*4882a593Smuzhiyun }
2951*4882a593Smuzhiyun
2952*4882a593Smuzhiyun coex_dm->backup_arfr_cnt1 =
2953*4882a593Smuzhiyun btcoexist->btc_read_4byte(btcoexist, 0x430);
2954*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2 =
2955*4882a593Smuzhiyun btcoexist->btc_read_4byte(btcoexist, 0x434);
2956*4882a593Smuzhiyun coex_dm->backup_retry_limit =
2957*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0x42a);
2958*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time =
2959*4882a593Smuzhiyun btcoexist->btc_read_1byte(btcoexist, 0x456);
2960*4882a593Smuzhiyun } else {
2961*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2962*4882a593Smuzhiyun "[BTCoex], MEDIA disconnect notify\n");
2963*4882a593Smuzhiyun coex_dm->arp_cnt = 0;
2964*4882a593Smuzhiyun
2965*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
2966*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
2967*4882a593Smuzhiyun
2968*4882a593Smuzhiyun coex_sta->cck_ever_lock = false;
2969*4882a593Smuzhiyun }
2970*4882a593Smuzhiyun
2971*4882a593Smuzhiyun /* only 2.4G we need to inform bt the chnl mask */
2972*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
2973*4882a593Smuzhiyun &wifi_central_chnl);
2974*4882a593Smuzhiyun
2975*4882a593Smuzhiyun if (type == BTC_MEDIA_CONNECT && wifi_central_chnl <= 14) {
2976*4882a593Smuzhiyun h2c_parameter[0] = 0x0;
2977*4882a593Smuzhiyun h2c_parameter[1] = wifi_central_chnl;
2978*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2979*4882a593Smuzhiyun if (BTC_WIFI_BW_HT40 == wifi_bw)
2980*4882a593Smuzhiyun h2c_parameter[2] = 0x30;
2981*4882a593Smuzhiyun else
2982*4882a593Smuzhiyun h2c_parameter[2] = 0x20;
2983*4882a593Smuzhiyun }
2984*4882a593Smuzhiyun
2985*4882a593Smuzhiyun coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2986*4882a593Smuzhiyun coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2987*4882a593Smuzhiyun coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2988*4882a593Smuzhiyun
2989*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2990*4882a593Smuzhiyun "[BTCoex], FW write 0x66 = 0x%x\n",
2991*4882a593Smuzhiyun h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
2992*4882a593Smuzhiyun h2c_parameter[2]);
2993*4882a593Smuzhiyun
2994*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2995*4882a593Smuzhiyun }
2996*4882a593Smuzhiyun
ex_btc8723b1ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)2997*4882a593Smuzhiyun void ex_btc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,
2998*4882a593Smuzhiyun u8 type)
2999*4882a593Smuzhiyun {
3000*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3001*4882a593Smuzhiyun bool bt_hs_on = false;
3002*4882a593Smuzhiyun u32 wifi_link_status = 0;
3003*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
3004*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false, under_4way = false;
3005*4882a593Smuzhiyun u8 agg_buf_size = 5;
3006*4882a593Smuzhiyun
3007*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3008*4882a593Smuzhiyun &under_4way);
3009*4882a593Smuzhiyun
3010*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3011*4882a593Smuzhiyun coex_sta->bt_disabled)
3012*4882a593Smuzhiyun return;
3013*4882a593Smuzhiyun
3014*4882a593Smuzhiyun if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
3015*4882a593Smuzhiyun type == BTC_PACKET_ARP) {
3016*4882a593Smuzhiyun if (type == BTC_PACKET_ARP) {
3017*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3018*4882a593Smuzhiyun "[BTCoex], special Packet ARP notify\n");
3019*4882a593Smuzhiyun
3020*4882a593Smuzhiyun coex_dm->arp_cnt++;
3021*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3022*4882a593Smuzhiyun "[BTCoex], ARP Packet Count = %d\n",
3023*4882a593Smuzhiyun coex_dm->arp_cnt);
3024*4882a593Smuzhiyun
3025*4882a593Smuzhiyun if ((coex_dm->arp_cnt >= 10) && (!under_4way))
3026*4882a593Smuzhiyun /* if APR PKT > 10 after connect, do not go to
3027*4882a593Smuzhiyun * ActionWifiConnectedSpecificPacket(btcoexist)
3028*4882a593Smuzhiyun */
3029*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
3030*4882a593Smuzhiyun else
3031*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
3032*4882a593Smuzhiyun } else {
3033*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
3034*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3035*4882a593Smuzhiyun "[BTCoex], special Packet DHCP or EAPOL notify\n");
3036*4882a593Smuzhiyun }
3037*4882a593Smuzhiyun } else {
3038*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
3039*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3040*4882a593Smuzhiyun "[BTCoex], special Packet [Type = %d] notify\n",
3041*4882a593Smuzhiyun type);
3042*4882a593Smuzhiyun }
3043*4882a593Smuzhiyun
3044*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3045*4882a593Smuzhiyun &wifi_link_status);
3046*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
3047*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
3048*4882a593Smuzhiyun halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3049*4882a593Smuzhiyun halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3050*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
3051*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_multiport(btcoexist);
3052*4882a593Smuzhiyun return;
3053*4882a593Smuzhiyun }
3054*4882a593Smuzhiyun
3055*4882a593Smuzhiyun coex_sta->special_pkt_period_cnt = 0;
3056*4882a593Smuzhiyun
3057*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3058*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
3059*4882a593Smuzhiyun halbtc8723b1ant_action_bt_inquiry(btcoexist);
3060*4882a593Smuzhiyun return;
3061*4882a593Smuzhiyun } else if (bt_hs_on) {
3062*4882a593Smuzhiyun halbtc8723b1ant_action_hs(btcoexist);
3063*4882a593Smuzhiyun return;
3064*4882a593Smuzhiyun }
3065*4882a593Smuzhiyun
3066*4882a593Smuzhiyun if (BTC_PACKET_DHCP == type ||
3067*4882a593Smuzhiyun BTC_PACKET_EAPOL == type) {
3068*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3069*4882a593Smuzhiyun "[BTCoex], special Packet(%d) notify\n", type);
3070*4882a593Smuzhiyun halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
3071*4882a593Smuzhiyun }
3072*4882a593Smuzhiyun }
3073*4882a593Smuzhiyun
ex_btc8723b1ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)3074*4882a593Smuzhiyun void ex_btc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,
3075*4882a593Smuzhiyun u8 *tmp_buf, u8 length)
3076*4882a593Smuzhiyun {
3077*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3078*4882a593Smuzhiyun u8 bt_info = 0;
3079*4882a593Smuzhiyun u8 i, rsp_source = 0;
3080*4882a593Smuzhiyun bool wifi_connected = false;
3081*4882a593Smuzhiyun bool bt_busy = false;
3082*4882a593Smuzhiyun
3083*4882a593Smuzhiyun coex_sta->c2h_bt_info_req_sent = false;
3084*4882a593Smuzhiyun
3085*4882a593Smuzhiyun rsp_source = tmp_buf[0] & 0xf;
3086*4882a593Smuzhiyun if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
3087*4882a593Smuzhiyun rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
3088*4882a593Smuzhiyun coex_sta->bt_info_c2h_cnt[rsp_source]++;
3089*4882a593Smuzhiyun
3090*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3091*4882a593Smuzhiyun "[BTCoex], Bt info[%d], length=%d, hex data = [",
3092*4882a593Smuzhiyun rsp_source, length);
3093*4882a593Smuzhiyun for (i = 0; i < length; i++) {
3094*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3095*4882a593Smuzhiyun if (i == 1)
3096*4882a593Smuzhiyun bt_info = tmp_buf[i];
3097*4882a593Smuzhiyun if (i == length - 1)
3098*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3099*4882a593Smuzhiyun "0x%02x]\n", tmp_buf[i]);
3100*4882a593Smuzhiyun else
3101*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3102*4882a593Smuzhiyun "0x%02x, ", tmp_buf[i]);
3103*4882a593Smuzhiyun }
3104*4882a593Smuzhiyun
3105*4882a593Smuzhiyun /* if 0xff, it means BT is under WHCK test */
3106*4882a593Smuzhiyun if (bt_info == 0xff)
3107*4882a593Smuzhiyun coex_sta->bt_whck_test = true;
3108*4882a593Smuzhiyun else
3109*4882a593Smuzhiyun coex_sta->bt_whck_test = false;
3110*4882a593Smuzhiyun
3111*4882a593Smuzhiyun if (rsp_source != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {
3112*4882a593Smuzhiyun coex_sta->bt_retry_cnt = /* [3:0] */
3113*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3114*4882a593Smuzhiyun
3115*4882a593Smuzhiyun if (coex_sta->bt_retry_cnt >= 1)
3116*4882a593Smuzhiyun coex_sta->pop_event_cnt++;
3117*4882a593Smuzhiyun
3118*4882a593Smuzhiyun if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
3119*4882a593Smuzhiyun coex_sta->c2h_bt_remote_name_req = true;
3120*4882a593Smuzhiyun else
3121*4882a593Smuzhiyun coex_sta->c2h_bt_remote_name_req = false;
3122*4882a593Smuzhiyun
3123*4882a593Smuzhiyun coex_sta->bt_rssi =
3124*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;
3125*4882a593Smuzhiyun
3126*4882a593Smuzhiyun coex_sta->bt_info_ext =
3127*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][4];
3128*4882a593Smuzhiyun
3129*4882a593Smuzhiyun if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {
3130*4882a593Smuzhiyun coex_sta->a2dp_bit_pool =
3131*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][6];
3132*4882a593Smuzhiyun } else {
3133*4882a593Smuzhiyun coex_sta->a2dp_bit_pool = 0;
3134*4882a593Smuzhiyun }
3135*4882a593Smuzhiyun
3136*4882a593Smuzhiyun coex_sta->bt_tx_rx_mask =
3137*4882a593Smuzhiyun (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
3138*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
3139*4882a593Smuzhiyun &coex_sta->bt_tx_rx_mask);
3140*4882a593Smuzhiyun
3141*4882a593Smuzhiyun if (!coex_sta->bt_tx_rx_mask) {
3142*4882a593Smuzhiyun /* BT into is responded by BT FW and BT RF REG
3143*4882a593Smuzhiyun * 0x3C != 0x15 => Need to switch BT TRx Mask
3144*4882a593Smuzhiyun */
3145*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3146*4882a593Smuzhiyun "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
3147*4882a593Smuzhiyun btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3148*4882a593Smuzhiyun 0x3c, 0x15);
3149*4882a593Smuzhiyun
3150*4882a593Smuzhiyun /* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */
3151*4882a593Smuzhiyun btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3152*4882a593Smuzhiyun 0x2c, 0x7c44);
3153*4882a593Smuzhiyun btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3154*4882a593Smuzhiyun 0x30, 0x7c44);
3155*4882a593Smuzhiyun }
3156*4882a593Smuzhiyun
3157*4882a593Smuzhiyun /* Here we need to resend some wifi info to BT
3158*4882a593Smuzhiyun * because bt is reset and loss of the info.
3159*4882a593Smuzhiyun */
3160*4882a593Smuzhiyun if (coex_sta->bt_info_ext & BIT1) {
3161*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3162*4882a593Smuzhiyun "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
3163*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3164*4882a593Smuzhiyun &wifi_connected);
3165*4882a593Smuzhiyun if (wifi_connected)
3166*4882a593Smuzhiyun ex_btc8723b1ant_media_status_notify(btcoexist,
3167*4882a593Smuzhiyun BTC_MEDIA_CONNECT);
3168*4882a593Smuzhiyun else
3169*4882a593Smuzhiyun ex_btc8723b1ant_media_status_notify(btcoexist,
3170*4882a593Smuzhiyun BTC_MEDIA_DISCONNECT);
3171*4882a593Smuzhiyun }
3172*4882a593Smuzhiyun
3173*4882a593Smuzhiyun if (coex_sta->bt_info_ext & BIT3) {
3174*4882a593Smuzhiyun if (!btcoexist->manual_control &&
3175*4882a593Smuzhiyun !btcoexist->stop_coex_dm) {
3176*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3177*4882a593Smuzhiyun "[BTCoex], BT ext info bit3 check, set BT NOT ignore Wlan active!!\n");
3178*4882a593Smuzhiyun halbtc8723b1ant_ignore_wlan_act(btcoexist,
3179*4882a593Smuzhiyun FORCE_EXEC,
3180*4882a593Smuzhiyun false);
3181*4882a593Smuzhiyun }
3182*4882a593Smuzhiyun } else {
3183*4882a593Smuzhiyun /* BT already NOT ignore Wlan active, do nothing here.*/
3184*4882a593Smuzhiyun }
3185*4882a593Smuzhiyun if (!btcoexist->auto_report_1ant) {
3186*4882a593Smuzhiyun if (coex_sta->bt_info_ext & BIT4) {
3187*4882a593Smuzhiyun /* BT auto report already enabled, do nothing */
3188*4882a593Smuzhiyun } else {
3189*4882a593Smuzhiyun halbtc8723b1ant_bt_auto_report(btcoexist,
3190*4882a593Smuzhiyun FORCE_EXEC,
3191*4882a593Smuzhiyun true);
3192*4882a593Smuzhiyun }
3193*4882a593Smuzhiyun }
3194*4882a593Smuzhiyun }
3195*4882a593Smuzhiyun
3196*4882a593Smuzhiyun /* check BIT2 first ==> check if bt is under inquiry or page scan */
3197*4882a593Smuzhiyun if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
3198*4882a593Smuzhiyun coex_sta->c2h_bt_inquiry_page = true;
3199*4882a593Smuzhiyun else
3200*4882a593Smuzhiyun coex_sta->c2h_bt_inquiry_page = false;
3201*4882a593Smuzhiyun
3202*4882a593Smuzhiyun coex_sta->num_of_profile = 0;
3203*4882a593Smuzhiyun
3204*4882a593Smuzhiyun /* set link exist status */
3205*4882a593Smuzhiyun if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3206*4882a593Smuzhiyun coex_sta->bt_link_exist = false;
3207*4882a593Smuzhiyun coex_sta->pan_exist = false;
3208*4882a593Smuzhiyun coex_sta->a2dp_exist = false;
3209*4882a593Smuzhiyun coex_sta->hid_exist = false;
3210*4882a593Smuzhiyun coex_sta->sco_exist = false;
3211*4882a593Smuzhiyun
3212*4882a593Smuzhiyun coex_sta->bt_hi_pri_link_exist = false;
3213*4882a593Smuzhiyun } else {
3214*4882a593Smuzhiyun /* connection exists */
3215*4882a593Smuzhiyun coex_sta->bt_link_exist = true;
3216*4882a593Smuzhiyun if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {
3217*4882a593Smuzhiyun coex_sta->pan_exist = true;
3218*4882a593Smuzhiyun coex_sta->num_of_profile++;
3219*4882a593Smuzhiyun } else {
3220*4882a593Smuzhiyun coex_sta->pan_exist = false;
3221*4882a593Smuzhiyun }
3222*4882a593Smuzhiyun if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {
3223*4882a593Smuzhiyun coex_sta->a2dp_exist = true;
3224*4882a593Smuzhiyun coex_sta->num_of_profile++;
3225*4882a593Smuzhiyun } else {
3226*4882a593Smuzhiyun coex_sta->a2dp_exist = false;
3227*4882a593Smuzhiyun }
3228*4882a593Smuzhiyun if (bt_info & BT_INFO_8723B_1ANT_B_HID) {
3229*4882a593Smuzhiyun coex_sta->hid_exist = true;
3230*4882a593Smuzhiyun coex_sta->num_of_profile++;
3231*4882a593Smuzhiyun } else {
3232*4882a593Smuzhiyun coex_sta->hid_exist = false;
3233*4882a593Smuzhiyun }
3234*4882a593Smuzhiyun if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {
3235*4882a593Smuzhiyun coex_sta->sco_exist = true;
3236*4882a593Smuzhiyun coex_sta->num_of_profile++;
3237*4882a593Smuzhiyun } else {
3238*4882a593Smuzhiyun coex_sta->sco_exist = false;
3239*4882a593Smuzhiyun }
3240*4882a593Smuzhiyun
3241*4882a593Smuzhiyun if ((!coex_sta->hid_exist) &&
3242*4882a593Smuzhiyun (!coex_sta->c2h_bt_inquiry_page) &&
3243*4882a593Smuzhiyun (!coex_sta->sco_exist)) {
3244*4882a593Smuzhiyun if (coex_sta->high_priority_tx +
3245*4882a593Smuzhiyun coex_sta->high_priority_rx >=
3246*4882a593Smuzhiyun 160) {
3247*4882a593Smuzhiyun coex_sta->hid_exist = true;
3248*4882a593Smuzhiyun coex_sta->wrong_profile_notification++;
3249*4882a593Smuzhiyun coex_sta->num_of_profile++;
3250*4882a593Smuzhiyun bt_info = bt_info | 0x28;
3251*4882a593Smuzhiyun }
3252*4882a593Smuzhiyun }
3253*4882a593Smuzhiyun
3254*4882a593Smuzhiyun /* Add Hi-Pri Tx/Rx counter to avoid false detection */
3255*4882a593Smuzhiyun if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
3256*4882a593Smuzhiyun (coex_sta->high_priority_tx + coex_sta->high_priority_rx >=
3257*4882a593Smuzhiyun 160) &&
3258*4882a593Smuzhiyun (!coex_sta->c2h_bt_inquiry_page))
3259*4882a593Smuzhiyun coex_sta->bt_hi_pri_link_exist = true;
3260*4882a593Smuzhiyun
3261*4882a593Smuzhiyun if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&
3262*4882a593Smuzhiyun (coex_sta->num_of_profile == 0)) {
3263*4882a593Smuzhiyun if (coex_sta->low_priority_tx +
3264*4882a593Smuzhiyun coex_sta->low_priority_rx >=
3265*4882a593Smuzhiyun 160) {
3266*4882a593Smuzhiyun coex_sta->pan_exist = true;
3267*4882a593Smuzhiyun coex_sta->num_of_profile++;
3268*4882a593Smuzhiyun coex_sta->wrong_profile_notification++;
3269*4882a593Smuzhiyun bt_info = bt_info | 0x88;
3270*4882a593Smuzhiyun }
3271*4882a593Smuzhiyun }
3272*4882a593Smuzhiyun }
3273*4882a593Smuzhiyun
3274*4882a593Smuzhiyun halbtc8723b1ant_update_bt_link_info(btcoexist);
3275*4882a593Smuzhiyun
3276*4882a593Smuzhiyun /* mask profile bit for connect-ilde identification
3277*4882a593Smuzhiyun * ( for CSR case: A2DP idle --> 0x41)
3278*4882a593Smuzhiyun */
3279*4882a593Smuzhiyun bt_info = bt_info & 0x1f;
3280*4882a593Smuzhiyun
3281*4882a593Smuzhiyun if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3282*4882a593Smuzhiyun coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3283*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3284*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Non-Connected idle!\n");
3285*4882a593Smuzhiyun /* connection exists but no busy */
3286*4882a593Smuzhiyun } else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {
3287*4882a593Smuzhiyun coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
3288*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3289*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
3290*4882a593Smuzhiyun } else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
3291*4882a593Smuzhiyun (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {
3292*4882a593Smuzhiyun coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
3293*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3294*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
3295*4882a593Smuzhiyun } else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
3296*4882a593Smuzhiyun if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3297*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
3298*4882a593Smuzhiyun
3299*4882a593Smuzhiyun coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
3300*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3301*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
3302*4882a593Smuzhiyun } else {
3303*4882a593Smuzhiyun coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;
3304*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3305*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");
3306*4882a593Smuzhiyun }
3307*4882a593Smuzhiyun
3308*4882a593Smuzhiyun if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3309*4882a593Smuzhiyun (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3310*4882a593Smuzhiyun (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
3311*4882a593Smuzhiyun bt_busy = true;
3312*4882a593Smuzhiyun else
3313*4882a593Smuzhiyun bt_busy = false;
3314*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3315*4882a593Smuzhiyun
3316*4882a593Smuzhiyun halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3317*4882a593Smuzhiyun }
3318*4882a593Smuzhiyun
ex_btc8723b1ant_rf_status_notify(struct btc_coexist * btcoexist,u8 type)3319*4882a593Smuzhiyun void ex_btc8723b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
3320*4882a593Smuzhiyun {
3321*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3322*4882a593Smuzhiyun u32 u32tmp;
3323*4882a593Smuzhiyun u8 u8tmpa, u8tmpb, u8tmpc;
3324*4882a593Smuzhiyun
3325*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3326*4882a593Smuzhiyun "[BTCoex], RF Status notify\n");
3327*4882a593Smuzhiyun
3328*4882a593Smuzhiyun if (type == BTC_RF_ON) {
3329*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3330*4882a593Smuzhiyun "[BTCoex], RF is turned ON!!\n");
3331*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
3332*4882a593Smuzhiyun } else if (type == BTC_RF_OFF) {
3333*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3334*4882a593Smuzhiyun "[BTCoex], RF is turned OFF!!\n");
3335*4882a593Smuzhiyun
3336*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3337*4882a593Smuzhiyun 0x0, 0x0);
3338*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3339*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
3340*4882a593Smuzhiyun FORCE_EXEC, false, true);
3341*4882a593Smuzhiyun
3342*4882a593Smuzhiyun halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3343*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
3344*4882a593Smuzhiyun
3345*4882a593Smuzhiyun u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
3346*4882a593Smuzhiyun u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
3347*4882a593Smuzhiyun u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
3348*4882a593Smuzhiyun u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);
3349*4882a593Smuzhiyun
3350*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3351*4882a593Smuzhiyun "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",
3352*4882a593Smuzhiyun u32tmp, u8tmpa, u8tmpb, u8tmpc);
3353*4882a593Smuzhiyun }
3354*4882a593Smuzhiyun }
3355*4882a593Smuzhiyun
ex_btc8723b1ant_halt_notify(struct btc_coexist * btcoexist)3356*4882a593Smuzhiyun void ex_btc8723b1ant_halt_notify(struct btc_coexist *btcoexist)
3357*4882a593Smuzhiyun {
3358*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3359*4882a593Smuzhiyun
3360*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
3361*4882a593Smuzhiyun
3362*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
3363*4882a593Smuzhiyun
3364*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,
3365*4882a593Smuzhiyun false, true);
3366*4882a593Smuzhiyun
3367*4882a593Smuzhiyun halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3368*4882a593Smuzhiyun
3369*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3370*4882a593Smuzhiyun 0x0, 0x0);
3371*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3372*4882a593Smuzhiyun
3373*4882a593Smuzhiyun ex_btc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
3374*4882a593Smuzhiyun
3375*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
3376*4882a593Smuzhiyun }
3377*4882a593Smuzhiyun
ex_btc8723b1ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)3378*4882a593Smuzhiyun void ex_btc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
3379*4882a593Smuzhiyun {
3380*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3381*4882a593Smuzhiyun
3382*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
3383*4882a593Smuzhiyun
3384*4882a593Smuzhiyun if (BTC_WIFI_PNP_SLEEP == pnp_state) {
3385*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3386*4882a593Smuzhiyun "[BTCoex], Pnp notify to SLEEP\n");
3387*4882a593Smuzhiyun halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
3388*4882a593Smuzhiyun FORCE_EXEC, false, true);
3389*4882a593Smuzhiyun halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3390*4882a593Smuzhiyun 0x0, 0x0);
3391*4882a593Smuzhiyun halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3392*4882a593Smuzhiyun halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3393*4882a593Smuzhiyun
3394*4882a593Smuzhiyun /* Driver do not leave IPS/LPS when driver is going to sleep, so
3395*4882a593Smuzhiyun * BTCoexistence think wifi is still under IPS/LPS
3396*4882a593Smuzhiyun *
3397*4882a593Smuzhiyun * BT should clear UnderIPS/UnderLPS state to avoid mismatch
3398*4882a593Smuzhiyun * state after wakeup.
3399*4882a593Smuzhiyun */
3400*4882a593Smuzhiyun coex_sta->under_ips = false;
3401*4882a593Smuzhiyun coex_sta->under_lps = false;
3402*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
3403*4882a593Smuzhiyun } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
3404*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3405*4882a593Smuzhiyun "[BTCoex], Pnp notify to WAKE UP\n");
3406*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
3407*4882a593Smuzhiyun halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3408*4882a593Smuzhiyun halbtc8723b1ant_init_coex_dm(btcoexist);
3409*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
3410*4882a593Smuzhiyun }
3411*4882a593Smuzhiyun }
3412*4882a593Smuzhiyun
ex_btc8723b1ant_coex_dm_reset(struct btc_coexist * btcoexist)3413*4882a593Smuzhiyun void ex_btc8723b1ant_coex_dm_reset(struct btc_coexist *btcoexist)
3414*4882a593Smuzhiyun {
3415*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3416*4882a593Smuzhiyun
3417*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3418*4882a593Smuzhiyun "[BTCoex], *****************Coex DM Reset****************\n");
3419*4882a593Smuzhiyun
3420*4882a593Smuzhiyun halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3421*4882a593Smuzhiyun halbtc8723b1ant_init_coex_dm(btcoexist);
3422*4882a593Smuzhiyun }
3423*4882a593Smuzhiyun
ex_btc8723b1ant_periodical(struct btc_coexist * btcoexist)3424*4882a593Smuzhiyun void ex_btc8723b1ant_periodical(struct btc_coexist *btcoexist)
3425*4882a593Smuzhiyun {
3426*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
3427*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3428*4882a593Smuzhiyun
3429*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3430*4882a593Smuzhiyun "[BTCoex], ==========================Periodical===========================\n");
3431*4882a593Smuzhiyun
3432*4882a593Smuzhiyun if (!btcoexist->auto_report_1ant) {
3433*4882a593Smuzhiyun halbtc8723b1ant_query_bt_info(btcoexist);
3434*4882a593Smuzhiyun halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
3435*4882a593Smuzhiyun } else {
3436*4882a593Smuzhiyun halbtc8723b1ant_monitor_bt_ctr(btcoexist);
3437*4882a593Smuzhiyun halbtc8723b1ant_monitor_wifi_ctr(btcoexist);
3438*4882a593Smuzhiyun
3439*4882a593Smuzhiyun if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&
3440*4882a593Smuzhiyun bt_link_info->hid_exist)
3441*4882a593Smuzhiyun bt_link_info->hid_exist = false;
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun if (btc8723b1ant_is_wifi_status_changed(btcoexist) ||
3444*4882a593Smuzhiyun coex_dm->auto_tdma_adjust) {
3445*4882a593Smuzhiyun halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3446*4882a593Smuzhiyun }
3447*4882a593Smuzhiyun coex_sta->special_pkt_period_cnt++;
3448*4882a593Smuzhiyun }
3449*4882a593Smuzhiyun }
3450