root/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. halbtc8723b1ant_updatera_mask
  2. btc8723b1ant_auto_rate_fb_retry
  3. halbtc8723b1ant_retry_limit
  4. halbtc8723b1ant_ampdu_maxtime
  5. halbtc8723b1ant_limited_tx
  6. halbtc8723b1ant_limited_rx
  7. halbtc8723b1ant_query_bt_info
  8. halbtc8723b1ant_monitor_bt_ctr
  9. halbtc8723b1ant_monitor_wifi_ctr
  10. btc8723b1ant_is_wifi_status_changed
  11. halbtc8723b1ant_update_bt_link_info
  12. halbtc8723b1ant_set_bt_auto_report
  13. halbtc8723b1ant_bt_auto_report
  14. btc8723b1ant_set_sw_pen_tx_rate_adapt
  15. halbtc8723b1ant_low_penalty_ra
  16. halbtc8723b1ant_set_coex_table
  17. halbtc8723b1ant_coex_table
  18. halbtc8723b1ant_coex_table_with_type
  19. halbtc8723b1ant_set_fw_ignore_wlan_act
  20. halbtc8723b1ant_ignore_wlan_act
  21. halbtc8723b1ant_set_fw_ps_tdma
  22. halbtc8723b1ant_set_lps_rpwm
  23. halbtc8723b1ant_lps_rpwm
  24. halbtc8723b1ant_sw_mechanism
  25. halbtc8723b1ant_set_ant_path
  26. halbtc8723b1ant_ps_tdma
  27. btc8723b1ant_tdma_dur_adj_for_acl
  28. halbtc8723b1ant_ps_tdma_chk_pwr_save
  29. halbtc8723b1ant_power_save_state
  30. halbtc8723b1ant_action_wifi_only
  31. halbtc8723b1ant_monitor_bt_enable_disable
  32. halbtc8723b1ant_action_bt_whck_test
  33. halbtc8723b1ant_action_wifi_multiport
  34. halbtc8723b1ant_action_hs
  35. halbtc8723b1ant_action_bt_inquiry
  36. btc8723b1ant_act_bt_sco_hid_only_busy
  37. halbtc8723b1ant_action_wifi_connected_bt_acl_busy
  38. btc8723b1ant_action_wifi_not_conn
  39. btc8723b1ant_action_wifi_not_conn_scan
  40. btc8723b1ant_act_wifi_not_conn_asso_auth
  41. btc8723b1ant_action_wifi_conn_scan
  42. halbtc8723b1ant_action_wifi_connected_special_packet
  43. halbtc8723b1ant_action_wifi_connected
  44. halbtc8723b1ant_run_coexist_mechanism
  45. halbtc8723b1ant_init_coex_dm
  46. halbtc8723b1ant_init_hw_config
  47. ex_btc8723b1ant_power_on_setting
  48. ex_btc8723b1ant_init_hwconfig
  49. ex_btc8723b1ant_init_coex_dm
  50. ex_btc8723b1ant_display_coex_info
  51. ex_btc8723b1ant_ips_notify
  52. ex_btc8723b1ant_lps_notify
  53. ex_btc8723b1ant_scan_notify
  54. ex_btc8723b1ant_connect_notify
  55. ex_btc8723b1ant_media_status_notify
  56. ex_btc8723b1ant_special_packet_notify
  57. ex_btc8723b1ant_bt_info_notify
  58. ex_btc8723b1ant_rf_status_notify
  59. ex_btc8723b1ant_halt_notify
  60. ex_btc8723b1ant_pnp_notify
  61. ex_btc8723b1ant_coex_dm_reset
  62. ex_btc8723b1ant_periodical

   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 }

/* [<][>][^][v][top][bottom][index][help] */