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