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

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

DEFINITIONS

This source file includes following definitions.
  1. btc8821a1ant_bt_rssi_state
  2. btc8821a1ant_wifi_rssi_state
  3. btc8821a1ant_update_ra_mask
  4. btc8821a1ant_auto_rate_fb_retry
  5. btc8821a1ant_retry_limit
  6. btc8821a1ant_ampdu_max_time
  7. btc8821a1ant_limited_tx
  8. btc8821a1ant_limited_rx
  9. btc8821a1ant_monitor_bt_ctr
  10. btc8821a1ant_query_bt_info
  11. btc8821a1ant_update_bt_link_info
  12. btc8821a1ant_action_algorithm
  13. btc8821a1ant_set_sw_penalty_tx_rate
  14. btc8821a1ant_low_penalty_ra
  15. btc8821a1ant_set_coex_table
  16. btc8821a1ant_coex_table
  17. btc8821a1ant_coex_table_with_type
  18. btc8821a1ant_set_fw_ignore_wlan_act
  19. btc8821a1ant_ignore_wlan_act
  20. btc8821a1ant_set_fw_ps_tdma
  21. btc8821a1ant_set_lps_rpwm
  22. btc8821a1ant_lps_rpwm
  23. btc8821a1ant_sw_mechanism
  24. btc8821a1ant_set_ant_path
  25. btc8821a1ant_ps_tdma
  26. btc8821a1ant_is_common_action
  27. btc8821a1ant_ps_tdma_check_for_pwr_save
  28. btc8821a1ant_power_save_state
  29. btc8821a1ant_coex_under_5g
  30. btc8821a1ant_action_sco
  31. btc8821a1ant_action_hid
  32. btc8821a1ant_action_a2dp
  33. btc8821a1ant_action_a2dp_pan_hs
  34. btc8821a1ant_action_pan_edr
  35. btc8821a1ant_action_pan_hs
  36. btc8821a1ant_action_pan_edr_a2dp
  37. btc8821a1ant_action_pan_edr_hid
  38. btc8821a1ant_action_hid_a2dp_pan_edr
  39. btc8821a1ant_action_hid_a2dp
  40. btc8821a1ant_action_wifi_multi_port
  41. btc8821a1ant_action_wifi_not_connected_asso_auth
  42. btc8821a1ant_action_hs
  43. btc8821a1ant_action_bt_inquiry
  44. btc8821a1ant_act_bt_sco_hid_only_busy
  45. btc8821a1ant_act_wifi_con_bt_acl_busy
  46. btc8821a1ant_action_wifi_not_connected
  47. btc8821a1ant_act_wifi_not_conn_scan
  48. btc8821a1ant_action_wifi_connected_scan
  49. btc8821a1ant_act_wifi_conn_sp_pkt
  50. btc8821a1ant_action_wifi_connected
  51. btc8821a1ant_run_sw_coex_mech
  52. btc8821a1ant_run_coexist_mechanism
  53. btc8821a1ant_init_coex_dm
  54. btc8821a1ant_init_hw_config
  55. ex_btc8821a1ant_init_hwconfig
  56. ex_btc8821a1ant_init_coex_dm
  57. ex_btc8821a1ant_display_coex_info
  58. ex_btc8821a1ant_ips_notify
  59. ex_btc8821a1ant_lps_notify
  60. ex_btc8821a1ant_scan_notify
  61. ex_btc8821a1ant_connect_notify
  62. ex_btc8821a1ant_media_status_notify
  63. ex_btc8821a1ant_special_packet_notify
  64. ex_btc8821a1ant_bt_info_notify
  65. ex_btc8821a1ant_halt_notify
  66. ex_btc8821a1ant_pnp_notify
  67. ex_btc8821a1ant_periodical

   1 // SPDX-License-Identifier: GPL-2.0
   2 /* Copyright(c) 2012  Realtek Corporation.*/
   3 
   4 /**************************************************************
   5  * Description:
   6  *
   7  * This file is for RTL8821A 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_8821a_1ant glcoex_dm_8821a_1ant;
  22 static struct coex_dm_8821a_1ant *coex_dm = &glcoex_dm_8821a_1ant;
  23 static struct coex_sta_8821a_1ant glcoex_sta_8821a_1ant;
  24 static struct coex_sta_8821a_1ant *coex_sta = &glcoex_sta_8821a_1ant;
  25 static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
  26                                                   u8 wifi_status);
  27 
  28 static const char *const glbt_info_src_8821a_1ant[] = {
  29           "BT Info[wifi fw]",
  30           "BT Info[bt rsp]",
  31           "BT Info[bt auto report]",
  32 };
  33 
  34 static u32 glcoex_ver_date_8821a_1ant = 20130816;
  35 static u32 glcoex_ver_8821a_1ant = 0x41;
  36 
  37 /**************************************************************
  38  * local function proto type if needed
  39  *
  40  * local function start with btc8821a1ant_
  41  **************************************************************/
  42 static u8 btc8821a1ant_bt_rssi_state(struct btc_coexist *btcoexist,
  43                                      u8 level_num, u8 rssi_thresh,
  44                                      u8 rssi_thresh1)
  45 {
  46         struct rtl_priv *rtlpriv = btcoexist->adapter;
  47         long bt_rssi = 0;
  48         u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
  49 
  50         bt_rssi = coex_sta->bt_rssi;
  51 
  52         if (level_num == 2) {
  53                 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  54                     (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  55                         if (bt_rssi >= (rssi_thresh +
  56                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
  57                                 bt_rssi_state = BTC_RSSI_STATE_HIGH;
  58                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  59                                          "[BTCoex], BT Rssi state switch to High\n");
  60                         } else {
  61                                 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  62                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  63                                          "[BTCoex], BT Rssi state stay at Low\n");
  64                         }
  65                 } else {
  66                         if (bt_rssi < rssi_thresh) {
  67                                 bt_rssi_state = BTC_RSSI_STATE_LOW;
  68                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  69                                          "[BTCoex], BT Rssi state switch to Low\n");
  70                         } else {
  71                                 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  72                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  73                                          "[BTCoex], BT Rssi state stay at High\n");
  74                         }
  75                 }
  76         } else if (level_num == 3) {
  77                 if (rssi_thresh > rssi_thresh1) {
  78                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  79                                  "[BTCoex], BT Rssi thresh error!!\n");
  80                         return coex_sta->pre_bt_rssi_state;
  81                 }
  82 
  83                 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  84                     (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  85                         if (bt_rssi >= (rssi_thresh +
  86                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
  87                                 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  88                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  89                                          "[BTCoex], BT Rssi state switch to Medium\n");
  90                         } else {
  91                                 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  92                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  93                                          "[BTCoex], BT Rssi state stay at Low\n");
  94                         }
  95                 } else if ((coex_sta->pre_bt_rssi_state ==
  96                            BTC_RSSI_STATE_MEDIUM) ||
  97                            (coex_sta->pre_bt_rssi_state ==
  98                             BTC_RSSI_STATE_STAY_MEDIUM)) {
  99                         if (bt_rssi >= (rssi_thresh1 +
 100                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
 101                                 bt_rssi_state = BTC_RSSI_STATE_HIGH;
 102                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 103                                          "[BTCoex], BT Rssi state switch to High\n");
 104                         } else if (bt_rssi < rssi_thresh) {
 105                                 bt_rssi_state = BTC_RSSI_STATE_LOW;
 106                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 107                                          "[BTCoex], BT Rssi state switch to Low\n");
 108                         } else {
 109                                 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 110                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 111                                          "[BTCoex], BT Rssi state stay at Medium\n");
 112                         }
 113                 } else {
 114                         if (bt_rssi < rssi_thresh1) {
 115                                 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
 116                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 117                                          "[BTCoex], BT Rssi state switch to Medium\n");
 118                         } else {
 119                                 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 120                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 121                                          "[BTCoex], BT Rssi state stay at High\n");
 122                         }
 123                 }
 124         }
 125         coex_sta->pre_bt_rssi_state = bt_rssi_state;
 126 
 127         return bt_rssi_state;
 128 }
 129 
 130 static u8 btc8821a1ant_wifi_rssi_state(struct btc_coexist *btcoexist,
 131                                        u8 index, u8 level_num, u8 rssi_thresh,
 132                                        u8 rssi_thresh1)
 133 {
 134         struct rtl_priv *rtlpriv = btcoexist->adapter;
 135         long    wifi_rssi = 0;
 136         u8      wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
 137 
 138         btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
 139 
 140         if (level_num == 2) {
 141                 if ((coex_sta->pre_wifi_rssi_state[index] ==
 142                      BTC_RSSI_STATE_LOW) ||
 143                     (coex_sta->pre_wifi_rssi_state[index] ==
 144                      BTC_RSSI_STATE_STAY_LOW)) {
 145                         if (wifi_rssi >= (rssi_thresh +
 146                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
 147                                 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 148                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 149                                          "[BTCoex], wifi RSSI state switch to High\n");
 150                         } else {
 151                                 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 152                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 153                                          "[BTCoex], wifi RSSI state stay at Low\n");
 154                         }
 155                 } else {
 156                         if (wifi_rssi < rssi_thresh) {
 157                                 wifi_rssi_state = BTC_RSSI_STATE_LOW;
 158                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 159                                          "[BTCoex], wifi RSSI state switch to Low\n");
 160                         } else {
 161                                 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 162                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 163                                          "[BTCoex], wifi RSSI state stay at High\n");
 164                         }
 165                 }
 166         } else if (level_num == 3) {
 167                 if (rssi_thresh > rssi_thresh1) {
 168                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 169                                  "[BTCoex], wifi RSSI thresh error!!\n");
 170                         return coex_sta->pre_wifi_rssi_state[index];
 171                 }
 172 
 173                 if ((coex_sta->pre_wifi_rssi_state[index] ==
 174                      BTC_RSSI_STATE_LOW) ||
 175                     (coex_sta->pre_wifi_rssi_state[index] ==
 176                      BTC_RSSI_STATE_STAY_LOW)) {
 177                         if (wifi_rssi >= (rssi_thresh +
 178                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
 179                                 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 180                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 181                                          "[BTCoex], wifi RSSI state switch to Medium\n");
 182                         } else {
 183                                 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 184                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 185                                          "[BTCoex], wifi RSSI state stay at Low\n");
 186                         }
 187                 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
 188                         BTC_RSSI_STATE_MEDIUM) ||
 189                         (coex_sta->pre_wifi_rssi_state[index] ==
 190                         BTC_RSSI_STATE_STAY_MEDIUM)) {
 191                         if (wifi_rssi >= (rssi_thresh1 +
 192                                         BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
 193                                 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 194                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 195                                          "[BTCoex], wifi RSSI state switch to High\n");
 196                         } else if (wifi_rssi < rssi_thresh) {
 197                                 wifi_rssi_state = BTC_RSSI_STATE_LOW;
 198                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 199                                          "[BTCoex], wifi RSSI state switch to Low\n");
 200                         } else {
 201                                 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 202                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 203                                          "[BTCoex], wifi RSSI state stay at Medium\n");
 204                         }
 205                 } else {
 206                         if (wifi_rssi < rssi_thresh1) {
 207                                 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 208                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 209                                          "[BTCoex], wifi RSSI state switch to Medium\n");
 210                         } else {
 211                                 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 212                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 213                                          "[BTCoex], wifi RSSI state stay at High\n");
 214                         }
 215                 }
 216         }
 217         coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
 218 
 219         return wifi_rssi_state;
 220 }
 221 
 222 static void btc8821a1ant_update_ra_mask(struct btc_coexist *btcoexist,
 223                                         bool force_exec, u32 dis_rate_mask)
 224 {
 225         coex_dm->cur_ra_mask = dis_rate_mask;
 226 
 227         if (force_exec ||
 228             (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) {
 229                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
 230                                    &coex_dm->cur_ra_mask);
 231         }
 232         coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
 233 }
 234 
 235 static void btc8821a1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
 236                                             bool force_exec, u8 type)
 237 {
 238         bool wifi_under_b_mode = false;
 239 
 240         coex_dm->cur_arfr_type = type;
 241 
 242         if (force_exec ||
 243             (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
 244                 switch (coex_dm->cur_arfr_type) {
 245                 case 0: /* normal mode */
 246                         btcoexist->btc_write_4byte(btcoexist, 0x430,
 247                                                    coex_dm->backup_arfr_cnt1);
 248                         btcoexist->btc_write_4byte(btcoexist, 0x434,
 249                                                    coex_dm->backup_arfr_cnt2);
 250                         break;
 251                 case 1:
 252                         btcoexist->btc_get(btcoexist,
 253                                            BTC_GET_BL_WIFI_UNDER_B_MODE,
 254                                            &wifi_under_b_mode);
 255                         if (wifi_under_b_mode) {
 256                                 btcoexist->btc_write_4byte(btcoexist, 0x430,
 257                                                            0x0);
 258                                 btcoexist->btc_write_4byte(btcoexist, 0x434,
 259                                                            0x01010101);
 260                         } else {
 261                                 btcoexist->btc_write_4byte(btcoexist, 0x430,
 262                                                            0x0);
 263                                 btcoexist->btc_write_4byte(btcoexist, 0x434,
 264                                                            0x04030201);
 265                         }
 266                         break;
 267                 default:
 268                         break;
 269                 }
 270         }
 271 
 272         coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
 273 }
 274 
 275 static void btc8821a1ant_retry_limit(struct btc_coexist *btcoexist,
 276                                      bool force_exec, u8 type)
 277 {
 278         coex_dm->cur_retry_limit_type = type;
 279 
 280         if (force_exec ||
 281             (coex_dm->pre_retry_limit_type != coex_dm->cur_retry_limit_type)) {
 282                 switch (coex_dm->cur_retry_limit_type) {
 283                 case 0: /* normal mode */
 284                         btcoexist->btc_write_2byte(btcoexist, 0x42a,
 285                                                    coex_dm->backup_retry_limit);
 286                         break;
 287                 case 1: /* retry limit = 8 */
 288                         btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
 289                         break;
 290                 default:
 291                         break;
 292                 }
 293         }
 294         coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
 295 }
 296 
 297 static void btc8821a1ant_ampdu_max_time(struct btc_coexist *btcoexist,
 298                                         bool force_exec, u8 type)
 299 {
 300         coex_dm->cur_ampdu_time_type = type;
 301 
 302         if (force_exec ||
 303             (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
 304                 switch (coex_dm->cur_ampdu_time_type) {
 305                 case 0: /* normal mode */
 306                         btcoexist->btc_write_1byte(btcoexist, 0x456,
 307                                                    coex_dm->backup_ampdu_max_time);
 308                         break;
 309                 case 1: /* AMPDU time = 0x38 * 32us */
 310                         btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
 311                         break;
 312                 default:
 313                         break;
 314                 }
 315         }
 316 
 317         coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
 318 }
 319 
 320 static void btc8821a1ant_limited_tx(struct btc_coexist *btcoexist,
 321                                     bool force_exec, u8 ra_mask_type,
 322                                     u8 arfr_type, u8 retry_limit_type,
 323                                     u8 ampdu_time_type)
 324 {
 325         switch (ra_mask_type) {
 326         case 0: /* normal mode */
 327                 btc8821a1ant_update_ra_mask(btcoexist, force_exec, 0x0);
 328                 break;
 329         case 1: /* disable cck 1/2 */
 330                 btc8821a1ant_update_ra_mask(btcoexist, force_exec,
 331                                             0x00000003);
 332                 break;
 333         case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
 334                 btc8821a1ant_update_ra_mask(btcoexist, force_exec,
 335                                             0x0001f1f7);
 336                 break;
 337         default:
 338                 break;
 339         }
 340 
 341         btc8821a1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
 342         btc8821a1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
 343         btc8821a1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
 344 }
 345 
 346 static void btc8821a1ant_limited_rx(struct btc_coexist *btcoexist,
 347                                     bool force_exec, bool rej_ap_agg_pkt,
 348                                     bool bt_ctrl_agg_buf_size, u8 agg_buf_size)
 349 {
 350         bool reject_rx_agg = rej_ap_agg_pkt;
 351         bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
 352         u8 rx_agg_size = agg_buf_size;
 353 
 354         /* Rx Aggregation related setting */
 355         btcoexist->btc_set(btcoexist,
 356                  BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);
 357         /* decide BT control aggregation buf size or not */
 358         btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
 359                            &bt_ctrl_rx_agg_size);
 360         /* aggregation buf size, only work when BT control Rx agg size */
 361         btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
 362         /* real update aggregation setting */
 363         btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
 364 }
 365 
 366 static void btc8821a1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
 367 {
 368         u32 reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;
 369         u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
 370 
 371         reg_hp_tx_rx = 0x770;
 372         reg_lp_tx_rx = 0x774;
 373 
 374         u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);
 375         reg_hp_tx = u4_tmp & MASKLWORD;
 376         reg_hp_rx = (u4_tmp & MASKHWORD) >> 16;
 377 
 378         u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);
 379         reg_lp_tx = u4_tmp & MASKLWORD;
 380         reg_lp_rx = (u4_tmp & MASKHWORD) >> 16;
 381 
 382         coex_sta->high_priority_tx = reg_hp_tx;
 383         coex_sta->high_priority_rx = reg_hp_rx;
 384         coex_sta->low_priority_tx = reg_lp_tx;
 385         coex_sta->low_priority_rx = reg_lp_rx;
 386 
 387         /* reset counter */
 388         btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
 389 }
 390 
 391 static void btc8821a1ant_query_bt_info(struct btc_coexist *btcoexist)
 392 {
 393         struct rtl_priv *rtlpriv = btcoexist->adapter;
 394         u8 h2c_parameter[1] = {0};
 395 
 396         coex_sta->c2h_bt_info_req_sent = true;
 397 
 398         h2c_parameter[0] |= BIT0; /* trigger */
 399 
 400         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 401                  "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
 402                  h2c_parameter[0]);
 403 
 404         btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
 405 }
 406 
 407 static void btc8821a1ant_update_bt_link_info(struct btc_coexist *btcoexist)
 408 {
 409         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 410         bool bt_hs_on = false;
 411 
 412         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 413 
 414         bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
 415         bt_link_info->sco_exist = coex_sta->sco_exist;
 416         bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
 417         bt_link_info->pan_exist = coex_sta->pan_exist;
 418         bt_link_info->hid_exist = coex_sta->hid_exist;
 419 
 420         /* work around for HS mode */
 421         if (bt_hs_on) {
 422                 bt_link_info->pan_exist = true;
 423                 bt_link_info->bt_link_exist = true;
 424         }
 425 
 426         /* check if Sco only */
 427         if (bt_link_info->sco_exist &&
 428             !bt_link_info->a2dp_exist &&
 429             !bt_link_info->pan_exist &&
 430             !bt_link_info->hid_exist)
 431                 bt_link_info->sco_only = true;
 432         else
 433                 bt_link_info->sco_only = false;
 434 
 435         /* check if A2dp only */
 436         if (!bt_link_info->sco_exist &&
 437             bt_link_info->a2dp_exist &&
 438             !bt_link_info->pan_exist &&
 439             !bt_link_info->hid_exist)
 440                 bt_link_info->a2dp_only = true;
 441         else
 442                 bt_link_info->a2dp_only = false;
 443 
 444         /* check if Pan only */
 445         if (!bt_link_info->sco_exist &&
 446             !bt_link_info->a2dp_exist &&
 447             bt_link_info->pan_exist &&
 448             !bt_link_info->hid_exist)
 449                 bt_link_info->pan_only = true;
 450         else
 451                 bt_link_info->pan_only = false;
 452 
 453         /* check if Hid only */
 454         if (!bt_link_info->sco_exist &&
 455             !bt_link_info->a2dp_exist &&
 456             !bt_link_info->pan_exist &&
 457             bt_link_info->hid_exist)
 458                 bt_link_info->hid_only = true;
 459         else
 460                 bt_link_info->hid_only = false;
 461 }
 462 
 463 static u8 btc8821a1ant_action_algorithm(struct btc_coexist *btcoexist)
 464 {
 465         struct rtl_priv *rtlpriv = btcoexist->adapter;
 466         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 467         bool bt_hs_on = false;
 468         u8 algorithm = BT_8821A_1ANT_COEX_ALGO_UNDEFINED;
 469         u8 num_of_diff_profile = 0;
 470 
 471         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 472 
 473         if (!bt_link_info->bt_link_exist) {
 474                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 475                          "[BTCoex], No BT link exists!!!\n");
 476                 return algorithm;
 477         }
 478 
 479         if (bt_link_info->sco_exist)
 480                 num_of_diff_profile++;
 481         if (bt_link_info->hid_exist)
 482                 num_of_diff_profile++;
 483         if (bt_link_info->pan_exist)
 484                 num_of_diff_profile++;
 485         if (bt_link_info->a2dp_exist)
 486                 num_of_diff_profile++;
 487 
 488         if (num_of_diff_profile == 1) {
 489                 if (bt_link_info->sco_exist) {
 490                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 491                                  "[BTCoex], BT Profile = SCO only\n");
 492                         algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
 493                 } else {
 494                         if (bt_link_info->hid_exist) {
 495                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 496                                          "[BTCoex], BT Profile = HID only\n");
 497                                 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
 498                         } else if (bt_link_info->a2dp_exist) {
 499                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 500                                          "[BTCoex], BT Profile = A2DP only\n");
 501                                 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;
 502                         } else if (bt_link_info->pan_exist) {
 503                                 if (bt_hs_on) {
 504                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 505                                                  DBG_LOUD,
 506                                                  "[BTCoex], BT Profile = PAN(HS) only\n");
 507                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;
 508                                 } else {
 509                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 510                                                  DBG_LOUD,
 511                                                  "[BTCoex], BT Profile = PAN(EDR) only\n");
 512                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;
 513                                 }
 514                         }
 515                 }
 516         } else if (num_of_diff_profile == 2) {
 517                 if (bt_link_info->sco_exist) {
 518                         if (bt_link_info->hid_exist) {
 519                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 520                                          "[BTCoex], BT Profile = SCO + HID\n");
 521                                 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
 522                         } else if (bt_link_info->a2dp_exist) {
 523                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 524                                          "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
 525                                 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
 526                         } else if (bt_link_info->pan_exist) {
 527                                 if (bt_hs_on) {
 528                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 529                                                  DBG_LOUD,
 530                                                  "[BTCoex], BT Profile = SCO + PAN(HS)\n");
 531                                         algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
 532                                 } else {
 533                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 534                                                  DBG_LOUD,
 535                                                  "[BTCoex], BT Profile = SCO + PAN(EDR)\n");
 536                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
 537                                 }
 538                         }
 539                 } else {
 540                         if (bt_link_info->hid_exist &&
 541                             bt_link_info->a2dp_exist) {
 542                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 543                                          "[BTCoex], BT Profile = HID + A2DP\n");
 544                                 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
 545                         } else if (bt_link_info->hid_exist &&
 546                                    bt_link_info->pan_exist) {
 547                                 if (bt_hs_on) {
 548                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 549                                                  DBG_LOUD,
 550                                                  "[BTCoex], BT Profile = HID + PAN(HS)\n");
 551                                         algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
 552                                 } else {
 553                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 554                                                  DBG_LOUD,
 555                                                  "[BTCoex], BT Profile = HID + PAN(EDR)\n");
 556                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
 557                                 }
 558                         } else if (bt_link_info->pan_exist &&
 559                                    bt_link_info->a2dp_exist) {
 560                                 if (bt_hs_on) {
 561                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 562                                                  DBG_LOUD,
 563                                                  "[BTCoex], BT Profile = A2DP + PAN(HS)\n");
 564                                         algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;
 565                                 } else {
 566                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 567                                                  DBG_LOUD,
 568                                                  "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
 569                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;
 570                                 }
 571                         }
 572                 }
 573         } else if (num_of_diff_profile == 3) {
 574                 if (bt_link_info->sco_exist) {
 575                         if (bt_link_info->hid_exist &&
 576                             bt_link_info->a2dp_exist) {
 577                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 578                                          "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
 579                                 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
 580                         } else if (bt_link_info->hid_exist &&
 581                                    bt_link_info->pan_exist) {
 582                                 if (bt_hs_on) {
 583                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 584                                                  DBG_LOUD,
 585                                                  "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
 586                                         algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
 587                                 } else {
 588                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 589                                                  DBG_LOUD,
 590                                                  "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
 591                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
 592                                 }
 593                         } else if (bt_link_info->pan_exist &&
 594                                    bt_link_info->a2dp_exist) {
 595                                 if (bt_hs_on) {
 596                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 597                                                  DBG_LOUD,
 598                                                  "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
 599                                         algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
 600                                 } else {
 601                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 602                                                  DBG_LOUD,
 603                                                  "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
 604                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
 605                                 }
 606                         }
 607                 } else {
 608                         if (bt_link_info->hid_exist &&
 609                             bt_link_info->pan_exist &&
 610                             bt_link_info->a2dp_exist) {
 611                                 if (bt_hs_on) {
 612                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 613                                                  DBG_LOUD,
 614                                                  "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
 615                                         algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
 616                                 } else {
 617                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 618                                                  DBG_LOUD,
 619                                                  "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
 620                                         algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
 621                                 }
 622                         }
 623                 }
 624         } else if (num_of_diff_profile >= 3) {
 625                 if (bt_link_info->sco_exist) {
 626                         if (bt_link_info->hid_exist &&
 627                             bt_link_info->pan_exist &&
 628                             bt_link_info->a2dp_exist) {
 629                                 if (bt_hs_on) {
 630                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 631                                                  DBG_LOUD,
 632                                                  "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
 633 
 634                                 } else {
 635                                         RT_TRACE(rtlpriv, COMP_BT_COEXIST,
 636                                                  DBG_LOUD,
 637                                                  "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
 638                                         algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
 639                                 }
 640                         }
 641                 }
 642         }
 643         return algorithm;
 644 }
 645 
 646 static void btc8821a1ant_set_sw_penalty_tx_rate(struct btc_coexist *btcoexist,
 647                                                 bool low_penalty_ra)
 648 {
 649         struct rtl_priv *rtlpriv = btcoexist->adapter;
 650         u8 h2c_parameter[6] = {0};
 651 
 652         h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty*/
 653 
 654         if (low_penalty_ra) {
 655                 h2c_parameter[1] |= BIT0;
 656                 /* normal rate except MCS7/6/5, OFDM54/48/36 */
 657                 h2c_parameter[2] = 0x00;
 658                 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
 659                 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
 660                 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
 661         }
 662 
 663         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 664                  "[BTCoex], set WiFi Low-Penalty Retry: %s",
 665                  (low_penalty_ra ? "ON!!" : "OFF!!"));
 666 
 667         btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
 668 }
 669 
 670 static void btc8821a1ant_low_penalty_ra(struct btc_coexist *btcoexist,
 671                                         bool force_exec, bool low_penalty_ra)
 672 {
 673         coex_dm->cur_low_penalty_ra = low_penalty_ra;
 674 
 675         if (!force_exec) {
 676                 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
 677                         return;
 678         }
 679         btc8821a1ant_set_sw_penalty_tx_rate(btcoexist,
 680                                             coex_dm->cur_low_penalty_ra);
 681 
 682         coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
 683 }
 684 
 685 static void btc8821a1ant_set_coex_table(struct btc_coexist *btcoexist,
 686                                         u32 val0x6c0, u32 val0x6c4,
 687                                         u32 val0x6c8, u8 val0x6cc)
 688 {
 689         struct rtl_priv *rtlpriv = btcoexist->adapter;
 690 
 691         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 692                  "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
 693         btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
 694 
 695         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 696                  "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
 697         btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
 698 
 699         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 700                  "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
 701         btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
 702 
 703         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 704                  "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
 705         btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
 706 }
 707 
 708 static void btc8821a1ant_coex_table(struct btc_coexist *btcoexist,
 709                                     bool force_exec, u32 val0x6c0, u32 val0x6c4,
 710                                     u32 val0x6c8, u8 val0x6cc)
 711 {
 712         struct rtl_priv *rtlpriv = btcoexist->adapter;
 713 
 714         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 715                  "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
 716                     (force_exec ? "force to" : ""), val0x6c0, val0x6c4,
 717                     val0x6c8, val0x6cc);
 718         coex_dm->cur_val_0x6c0 = val0x6c0;
 719         coex_dm->cur_val_0x6c4 = val0x6c4;
 720         coex_dm->cur_val_0x6c8 = val0x6c8;
 721         coex_dm->cur_val_0x6cc = val0x6cc;
 722 
 723         if (!force_exec) {
 724                 if ((coex_dm->pre_val_0x6c0 == coex_dm->cur_val_0x6c0) &&
 725                     (coex_dm->pre_val_0x6c4 == coex_dm->cur_val_0x6c4) &&
 726                     (coex_dm->pre_val_0x6c8 == coex_dm->cur_val_0x6c8) &&
 727                     (coex_dm->pre_val_0x6cc == coex_dm->cur_val_0x6cc))
 728                         return;
 729         }
 730         btc8821a1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
 731                                     val0x6c8, val0x6cc);
 732 
 733         coex_dm->pre_val_0x6c0 = coex_dm->cur_val_0x6c0;
 734         coex_dm->pre_val_0x6c4 = coex_dm->cur_val_0x6c4;
 735         coex_dm->pre_val_0x6c8 = coex_dm->cur_val_0x6c8;
 736         coex_dm->pre_val_0x6cc = coex_dm->cur_val_0x6cc;
 737 }
 738 
 739 static void btc8821a1ant_coex_table_with_type(struct btc_coexist *btcoexist,
 740                                               bool force_exec, u8 type)
 741 {
 742         switch (type) {
 743         case 0:
 744                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
 745                                         0x55555555, 0xffffff, 0x3);
 746                 break;
 747         case 1:
 748                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
 749                                         0x5a5a5a5a, 0xffffff, 0x3);
 750                 break;
 751         case 2:
 752                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
 753                                         0x5a5a5a5a, 0xffffff, 0x3);
 754                 break;
 755         case 3:
 756                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
 757                                         0xaaaaaaaa, 0xffffff, 0x3);
 758                 break;
 759         case 4:
 760                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
 761                                         0x5a5a5a5a, 0xffffff, 0x3);
 762                 break;
 763         case 5:
 764                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
 765                                         0xaaaa5a5a, 0xffffff, 0x3);
 766                 break;
 767         case 6:
 768                 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
 769                                         0xaaaa5a5a, 0xffffff, 0x3);
 770                 break;
 771         case 7:
 772                 btc8821a1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
 773                                         0xaaaaaaaa, 0xffffff, 0x3);
 774                 break;
 775         default:
 776                 break;
 777         }
 778 }
 779 
 780 static void btc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
 781                                                 bool enable)
 782 {
 783         struct rtl_priv *rtlpriv = btcoexist->adapter;
 784         u8 h2c_parameter[1] = {0};
 785 
 786         if (enable)
 787                 h2c_parameter[0] |= BIT0; /* function enable */
 788 
 789         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 790                  "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
 791                  h2c_parameter[0]);
 792 
 793         btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
 794 }
 795 
 796 static void btc8821a1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
 797                                          bool force_exec, bool enable)
 798 {
 799         struct rtl_priv *rtlpriv = btcoexist->adapter;
 800 
 801         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 802                  "[BTCoex], %s turn Ignore WlanAct %s\n",
 803                  (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
 804         coex_dm->cur_ignore_wlan_act = enable;
 805 
 806         if (!force_exec) {
 807                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 808                          "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
 809                          coex_dm->pre_ignore_wlan_act,
 810                          coex_dm->cur_ignore_wlan_act);
 811 
 812                 if (coex_dm->pre_ignore_wlan_act ==
 813                     coex_dm->cur_ignore_wlan_act)
 814                         return;
 815         }
 816         btc8821a1ant_set_fw_ignore_wlan_act(btcoexist, enable);
 817 
 818         coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
 819 }
 820 
 821 static void btc8821a1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
 822                                         u8 byte2, u8 byte3, u8 byte4, u8 byte5)
 823 {
 824         struct rtl_priv *rtlpriv = btcoexist->adapter;
 825         u8 h2c_parameter[5] = {0};
 826         u8 real_byte1 = byte1, real_byte5 = byte5;
 827         bool ap_enable = false;
 828 
 829         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
 830                            &ap_enable);
 831 
 832         if (ap_enable) {
 833                 if (byte1 & BIT4 && !(byte1 & BIT5)) {
 834                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 835                                  "[BTCoex], FW for 1Ant AP mode\n");
 836                         real_byte1 &= ~BIT4;
 837                         real_byte1 |= BIT5;
 838 
 839                         real_byte5 |= BIT5;
 840                         real_byte5 &= ~BIT6;
 841                 }
 842         }
 843 
 844         h2c_parameter[0] = real_byte1;
 845         h2c_parameter[1] = byte2;
 846         h2c_parameter[2] = byte3;
 847         h2c_parameter[3] = byte4;
 848         h2c_parameter[4] = real_byte5;
 849 
 850         coex_dm->ps_tdma_para[0] = real_byte1;
 851         coex_dm->ps_tdma_para[1] = byte2;
 852         coex_dm->ps_tdma_para[2] = byte3;
 853         coex_dm->ps_tdma_para[3] = byte4;
 854         coex_dm->ps_tdma_para[4] = real_byte5;
 855 
 856         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 857                  "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
 858                  h2c_parameter[0],
 859                  h2c_parameter[1] << 24 |
 860                  h2c_parameter[2] << 16 |
 861                  h2c_parameter[3] << 8 |
 862                  h2c_parameter[4]);
 863         btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
 864 }
 865 
 866 static void btc8821a1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
 867                                       u8 lps_val, u8 rpwm_val)
 868 {
 869         u8 lps = lps_val;
 870         u8 rpwm = rpwm_val;
 871 
 872         btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
 873         btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
 874 }
 875 
 876 static void btc8821a1ant_lps_rpwm(struct btc_coexist *btcoexist,
 877                                   bool force_exec, u8 lps_val, u8 rpwm_val)
 878 {
 879         struct rtl_priv *rtlpriv = btcoexist->adapter;
 880 
 881         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 882                  "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
 883                  (force_exec ? "force to" : ""), lps_val, rpwm_val);
 884         coex_dm->cur_lps = lps_val;
 885         coex_dm->cur_rpwm = rpwm_val;
 886 
 887         if (!force_exec) {
 888                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 889                          "[BTCoex], LPS-RxBeaconMode = 0x%x, LPS-RPWM = 0x%x!!\n",
 890                          coex_dm->cur_lps, coex_dm->cur_rpwm);
 891 
 892                 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
 893                     (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
 894                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 895                                  "[BTCoex], LPS-RPWM_Last = 0x%x, LPS-RPWM_Now = 0x%x!!\n",
 896                                  coex_dm->pre_rpwm, coex_dm->cur_rpwm);
 897 
 898                         return;
 899                 }
 900         }
 901         btc8821a1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
 902 
 903         coex_dm->pre_lps = coex_dm->cur_lps;
 904         coex_dm->pre_rpwm = coex_dm->cur_rpwm;
 905 }
 906 
 907 static void btc8821a1ant_sw_mechanism(struct btc_coexist *btcoexist,
 908                                       bool low_penalty_ra)
 909 {
 910         struct rtl_priv *rtlpriv = btcoexist->adapter;
 911 
 912         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 913                  "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
 914 
 915         btc8821a1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
 916 }
 917 
 918 static void btc8821a1ant_set_ant_path(struct btc_coexist *btcoexist,
 919                                       u8 ant_pos_type, bool init_hw_cfg,
 920                                       bool wifi_off)
 921 {
 922         struct btc_board_info *board_info = &btcoexist->board_info;
 923         u32 u4_tmp = 0;
 924         u8 h2c_parameter[2] = {0};
 925 
 926         if (init_hw_cfg) {
 927                 /* 0x4c[23] = 0, 0x4c[24] = 1  Antenna control by WL/BT */
 928                 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
 929                 u4_tmp &= ~BIT23;
 930                 u4_tmp |= BIT24;
 931                 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
 932 
 933                 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x975, 0x3, 0x3);
 934                 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
 935 
 936                 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
 937                         /* tell firmware "antenna inverse"
 938                          * WRONG firmware antenna control code, need fw to fix
 939                          */
 940                         h2c_parameter[0] = 1;
 941                         h2c_parameter[1] = 1;
 942                         btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
 943                                                 h2c_parameter);
 944                 } else {
 945                         /* tell firmware "no antenna inverse"
 946                          * WRONG firmware antenna control code, need fw to fix
 947                          */
 948                         h2c_parameter[0] = 0;
 949                         h2c_parameter[1] = 1;
 950                         btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
 951                                                 h2c_parameter);
 952                 }
 953         } else if (wifi_off) {
 954                 /* 0x4c[24:23] = 00, Set Antenna control
 955                  * by BT_RFE_CTRL BT Vendor 0xac = 0xf002
 956                  */
 957                 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
 958                 u4_tmp &= ~BIT23;
 959                 u4_tmp &= ~BIT24;
 960                 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
 961 
 962                 /* 0x765 = 0x18 */
 963                 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
 964         } else {
 965                 /* 0x765 = 0x0 */
 966                 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
 967         }
 968 
 969         /* ext switch setting */
 970         switch (ant_pos_type) {
 971         case BTC_ANT_PATH_WIFI:
 972                 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
 973                 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
 974                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 975                                                            0x30, 0x1);
 976                 else
 977                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 978                                                            0x30, 0x2);
 979                 break;
 980         case BTC_ANT_PATH_BT:
 981                 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
 982                 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
 983                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 984                                                            0x30, 0x2);
 985                 else
 986                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 987                                                            0x30, 0x1);
 988                 break;
 989         default:
 990         case BTC_ANT_PATH_PTA:
 991                 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x66);
 992                 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
 993                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 994                                                            0x30, 0x1);
 995                 else
 996                         btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
 997                                                            0x30, 0x2);
 998                 break;
 999         }
1000 }
1001 
1002 static void btc8821a1ant_ps_tdma(struct btc_coexist *btcoexist,
1003                                  bool force_exec, bool turn_on, u8 type)
1004 {
1005         struct rtl_priv *rtlpriv = btcoexist->adapter;
1006         u8 rssi_adjust_val = 0;
1007 
1008         coex_dm->cur_ps_tdma_on = turn_on;
1009         coex_dm->cur_ps_tdma = type;
1010 
1011         if (!force_exec) {
1012                 if (coex_dm->cur_ps_tdma_on) {
1013                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1014                                  "[BTCoex], ********** TDMA(on, %d) **********\n",
1015                                  coex_dm->cur_ps_tdma);
1016                 } else {
1017                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1018                                  "[BTCoex], ********** TDMA(off, %d) **********\n",
1019                                  coex_dm->cur_ps_tdma);
1020                 }
1021                 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1022                     (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1023                         return;
1024         }
1025         if (turn_on) {
1026                 switch (type) {
1027                 default:
1028                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1029                                                     0x1a, 0x0, 0x50);
1030                         break;
1031                 case 1:
1032                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x3a,
1033                                                     0x03, 0x10, 0x50);
1034                         rssi_adjust_val = 11;
1035                         break;
1036                 case 2:
1037                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x2b,
1038                                                     0x03, 0x10, 0x50);
1039                         rssi_adjust_val = 14;
1040                         break;
1041                 case 3:
1042                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,
1043                                                     0x1d, 0x0, 0x10);
1044                         break;
1045                 case 4:
1046                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1047                                                     0x3, 0x14, 0x0);
1048                         rssi_adjust_val = 17;
1049                         break;
1050                 case 5:
1051                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
1052                                                     0x3, 0x11, 0x10);
1053                         break;
1054                 case 6:
1055                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
1056                                                     0x3, 0x11, 0x13);
1057                         break;
1058                 case 7:
1059                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1060                                                     0x5, 0x0, 0x0);
1061                         break;
1062                 case 8:
1063                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1064                                                     0x3, 0x10, 0x0);
1065                         break;
1066                 case 9:
1067                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
1068                                                     0x3, 0x10, 0x50);
1069                         rssi_adjust_val = 18;
1070                         break;
1071                 case 10:
1072                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1073                                                     0xa, 0x0, 0x40);
1074                         break;
1075                 case 11:
1076                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1077                                                     0x03, 0x10, 0x50);
1078                         rssi_adjust_val = 20;
1079                         break;
1080                 case 12:
1081                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1082                                                     0x0a, 0x0, 0x50);
1083                         break;
1084                 case 13:
1085                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x12,
1086                                                     0x12, 0x0, 0x50);
1087                         break;
1088                 case 14:
1089                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1e,
1090                                                     0x3, 0x10, 0x14);
1091                         break;
1092                 case 15:
1093                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1094                                                     0x3, 0x8, 0x0);
1095                         break;
1096                 case 16:
1097                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1098                                                     0x3, 0x10, 0x0);
1099                         rssi_adjust_val = 18;
1100                         break;
1101                 case 18:
1102                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1103                                                     0x3, 0x10, 0x0);
1104                         rssi_adjust_val = 14;
1105                         break;
1106                 case 20:
1107                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1108                                                     0x03, 0x11, 0x10);
1109                         break;
1110                 case 21:
1111                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1112                                                     0x03, 0x11, 0x11);
1113                         break;
1114                 case 22:
1115                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1116                                                     0x03, 0x11, 0x10);
1117                         break;
1118                 case 23:
1119                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1120                                                     0x3, 0x31, 0x18);
1121                         rssi_adjust_val = 22;
1122                         break;
1123                 case 24:
1124                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1125                                                     0x3, 0x31, 0x18);
1126                         rssi_adjust_val = 22;
1127                         break;
1128                 case 25:
1129                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1130                                                     0x3, 0x31, 0x18);
1131                         rssi_adjust_val = 22;
1132                         break;
1133                 case 26:
1134                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1135                                                     0x3, 0x31, 0x18);
1136                         rssi_adjust_val = 22;
1137                         break;
1138                 case 27:
1139                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1140                                                     0x3, 0x31, 0x98);
1141                         rssi_adjust_val = 22;
1142                         break;
1143                 case 28:
1144                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1145                                                     0x3, 0x31, 0x0);
1146                         break;
1147                 case 29:
1148                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1149                                                     0x1a, 0x1, 0x10);
1150                         break;
1151                 case 30:
1152                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1153                                                     0x3, 0x10, 0x10);
1154                         break;
1155                 case 31:
1156                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1157                                                     0x1a, 0, 0x58);
1158                         break;
1159                 case 32:
1160                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1161                                                     0x3, 0x11, 0x11);
1162                         break;
1163                 case 33:
1164                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,
1165                                                     0x3, 0x30, 0x90);
1166                         break;
1167                 case 34:
1168                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1169                                                     0x1a, 0x0, 0x10);
1170                         break;
1171                 case 35:
1172                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1173                                                     0x1a, 0x0, 0x10);
1174                         break;
1175                 case 36:
1176                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1177                                                     0x3, 0x14, 0x50);
1178                         break;
1179                 case 40:
1180                         /* SoftAP only with no sta associated, BT disable, TDMA
1181                          * mode for power saving
1182                          *
1183                          * here softap mode screen off will cost 70-80mA for
1184                          * phone
1185                          */
1186                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1187                                                     0x00, 0x10, 0x24);
1188                         break;
1189                 case 41:
1190                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1191                                                     0x3, 0x11, 0x11);
1192                         break;
1193                 case 42:
1194                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x20,
1195                                                     0x3, 0x11, 0x11);
1196                         break;
1197                 case 43:
1198                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1199                                                     0x3, 0x10, 0x11);
1200                         break;
1201                 }
1202         } else {
1203                 /* disable PS tdma */
1204                 switch (type) {
1205                 case 8:
1206                         /* PTA Control */
1207                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0,
1208                                                     0x0, 0x0);
1209                         btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1210                                                   false, false);
1211                         break;
1212                 case 0:
1213                 default:
1214                         /* Software control, Antenna at BT side */
1215                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1216                                                     0x0, 0x0);
1217                         btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1218                                                   false, false);
1219                         break;
1220                 case 9:
1221                         /* Software control, Antenna at WiFi side */
1222                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1223                                                     0x0, 0x0);
1224                         btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
1225                                                   false, false);
1226                         break;
1227                 case 10:
1228                         /* under 5G */
1229                         btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1230                                                     0x8, 0x0);
1231                         btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1232                                                   false, false);
1233                         break;
1234                 }
1235         }
1236         rssi_adjust_val = 0;
1237         btcoexist->btc_set(btcoexist,
1238                  BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1239 
1240         /* update pre state */
1241         coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1242         coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1243 }
1244 
1245 static bool btc8821a1ant_is_common_action(struct btc_coexist *btcoexist)
1246 {
1247         struct rtl_priv *rtlpriv = btcoexist->adapter;
1248         bool common = false, wifi_connected = false, wifi_busy = false;
1249 
1250         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1251                            &wifi_connected);
1252         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1253 
1254         if (!wifi_connected &&
1255             BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1256             coex_dm->bt_status) {
1257                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1258                          "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
1259                 btc8821a1ant_sw_mechanism(btcoexist, false);
1260 
1261                 common = true;
1262         } else if (wifi_connected &&
1263                    (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1264                     coex_dm->bt_status)) {
1265                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1266                          "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1267                 btc8821a1ant_sw_mechanism(btcoexist, false);
1268 
1269                 common = true;
1270         } else if (!wifi_connected &&
1271                    (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1272                     coex_dm->bt_status)) {
1273                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1274                          "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
1275                 btc8821a1ant_sw_mechanism(btcoexist, false);
1276 
1277                 common = true;
1278         } else if (wifi_connected &&
1279                    (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1280                     coex_dm->bt_status)) {
1281                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1282                          "[BTCoex], Wifi connected + BT connected-idle!!\n");
1283                 btc8821a1ant_sw_mechanism(btcoexist, false);
1284 
1285                 common = true;
1286         } else if (!wifi_connected &&
1287                    (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE !=
1288                     coex_dm->bt_status)) {
1289                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1290                          "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
1291                 btc8821a1ant_sw_mechanism(btcoexist, false);
1292 
1293                 common = true;
1294         } else {
1295                 if (wifi_busy) {
1296                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1297                                  "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1298                 } else {
1299                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1300                                  "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1301                 }
1302 
1303                 common = false;
1304         }
1305 
1306         return common;
1307 }
1308 
1309 static void btc8821a1ant_ps_tdma_check_for_pwr_save(struct btc_coexist *btcoex,
1310                                                     bool new_ps_state)
1311 {
1312         u8 lps_mode = 0x0;
1313 
1314         btcoex->btc_get(btcoex, BTC_GET_U1_LPS_MODE, &lps_mode);
1315 
1316         if (lps_mode) {
1317                 /* already under LPS state */
1318                 if (new_ps_state) {
1319                         /* keep state under LPS, do nothing */
1320                 } else {
1321                         /* will leave LPS state, turn off psTdma first */
1322                         btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1323                 }
1324         } else {
1325                 /* NO PS state*/
1326                 if (new_ps_state) {
1327                         /* will enter LPS state, turn off psTdma first */
1328                         btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1329                 } else {
1330                         /* keep state under NO PS state, do nothing */
1331                 }
1332         }
1333 }
1334 
1335 static void btc8821a1ant_power_save_state(struct btc_coexist *btcoexist,
1336                                           u8 ps_type, u8 lps_val, u8 rpwm_val)
1337 {
1338         bool low_pwr_disable = false;
1339 
1340         switch (ps_type) {
1341         case BTC_PS_WIFI_NATIVE:
1342                 /* recover to original 32k low power setting */
1343                 low_pwr_disable = false;
1344                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1345                                    &low_pwr_disable);
1346                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1347                 break;
1348         case BTC_PS_LPS_ON:
1349                 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist,
1350                                                         true);
1351                 btc8821a1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1352                                       rpwm_val);
1353                 /* when coex force to enter LPS, do not enter 32k low power */
1354                 low_pwr_disable = true;
1355                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1356                                    &low_pwr_disable);
1357                 /* power save must executed before psTdma */
1358                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1359                 break;
1360         case BTC_PS_LPS_OFF:
1361                 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist, false);
1362                 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1363                 break;
1364         default:
1365                 break;
1366         }
1367 }
1368 
1369 static void btc8821a1ant_coex_under_5g(struct btc_coexist *btcoexist)
1370 {
1371         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1372                                       0x0, 0x0);
1373         btc8821a1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1374 
1375         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 10);
1376 
1377         btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1378 
1379         btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1380 
1381         btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);
1382 }
1383 
1384 /***********************************************
1385  *
1386  *      Software Coex Mechanism start
1387  *
1388  ***********************************************/
1389 
1390 /* SCO only or SCO+PAN(HS) */
1391 static void btc8821a1ant_action_sco(struct btc_coexist *btcoexist)
1392 {
1393         btc8821a1ant_sw_mechanism(btcoexist, true);
1394 }
1395 
1396 static void btc8821a1ant_action_hid(struct btc_coexist *btcoexist)
1397 {
1398         btc8821a1ant_sw_mechanism(btcoexist, true);
1399 }
1400 
1401 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
1402 static void btc8821a1ant_action_a2dp(struct btc_coexist *btcoexist)
1403 {
1404         btc8821a1ant_sw_mechanism(btcoexist, false);
1405 }
1406 
1407 static void btc8821a1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
1408 {
1409         btc8821a1ant_sw_mechanism(btcoexist, false);
1410 }
1411 
1412 static void btc8821a1ant_action_pan_edr(struct btc_coexist *btcoexist)
1413 {
1414         btc8821a1ant_sw_mechanism(btcoexist, false);
1415 }
1416 
1417 /* PAN(HS) only */
1418 static void btc8821a1ant_action_pan_hs(struct btc_coexist *btcoexist)
1419 {
1420         btc8821a1ant_sw_mechanism(btcoexist, false);
1421 }
1422 
1423 /* PAN(EDR)+A2DP */
1424 static void btc8821a1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
1425 {
1426         btc8821a1ant_sw_mechanism(btcoexist, false);
1427 }
1428 
1429 static void btc8821a1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
1430 {
1431         btc8821a1ant_sw_mechanism(btcoexist, true);
1432 }
1433 
1434 /* HID+A2DP+PAN(EDR) */
1435 static void btc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
1436 {
1437         btc8821a1ant_sw_mechanism(btcoexist, true);
1438 }
1439 
1440 static void btc8821a1ant_action_hid_a2dp(struct btc_coexist *btcoexist)
1441 {
1442         btc8821a1ant_sw_mechanism(btcoexist, true);
1443 }
1444 
1445 /***********************************************
1446  *
1447  *      Non-Software Coex Mechanism start
1448  *
1449  ***********************************************/
1450 static
1451 void btc8821a1ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
1452 {
1453         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1454 
1455         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1456         /* tdma and coex table */
1457         if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1458                 if (bt_link_info->a2dp_exist) {
1459                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1460                         btc8821a1ant_coex_table_with_type(btcoexist,
1461                                                           NORMAL_EXEC, 1);
1462                 } else if (bt_link_info->a2dp_exist &&
1463                            bt_link_info->pan_exist) {
1464                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1465                         btc8821a1ant_coex_table_with_type(btcoexist,
1466                                                           NORMAL_EXEC, 4);
1467                 } else {
1468                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1469                         btc8821a1ant_coex_table_with_type(btcoexist,
1470                                                           NORMAL_EXEC, 4);
1471                 }
1472         } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1473                    (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1474                     coex_dm->bt_status)) {
1475                 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1476                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1477         } else {
1478                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1479                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1480         }
1481 }
1482 
1483 static
1484 void btc8821a1ant_action_wifi_not_connected_asso_auth(
1485                                         struct btc_coexist *btcoexist)
1486 {
1487         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1488 
1489         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1490                                       0x0);
1491 
1492         /* tdma and coex table */
1493         if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
1494                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1495                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1496         } else if ((bt_link_info->a2dp_exist) || (bt_link_info->pan_exist)) {
1497                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1498                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1499         } else {
1500                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1501                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1502         }
1503 }
1504 
1505 
1506 static void btc8821a1ant_action_hs(struct btc_coexist *btcoexist)
1507 {
1508         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1509         btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1510 }
1511 
1512 static void btc8821a1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1513 {
1514         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1515         bool wifi_connected = false;
1516         bool ap_enable = false;
1517         bool wifi_busy = false, bt_busy = false;
1518 
1519         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1520                            &wifi_connected);
1521         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1522                            &ap_enable);
1523         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1524         btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1525 
1526         if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1527                 btc8821a1ant_power_save_state(btcoexist,
1528                                               BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1529                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1530                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1531         } else if ((bt_link_info->sco_exist) || (bt_link_info->a2dp_exist) ||
1532                    (bt_link_info->hid_only)) {
1533                 /* SCO/HID-only busy */
1534                 btc8821a1ant_power_save_state(btcoexist,
1535                                               BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1536                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1537                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1538         } else if ((bt_link_info->a2dp_exist) && (bt_link_info->hid_exist)) {
1539                 /* A2DP+HID busy */
1540                 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1541                                               0x0, 0x0);
1542                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1543 
1544                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1545         } else if ((bt_link_info->pan_exist) || (wifi_busy)) {
1546                 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1547                                               0x0, 0x0);
1548                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1549 
1550                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1551         } else {
1552                 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1553                                               0x0, 0x0);
1554                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1555                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1556         }
1557 }
1558 
1559 static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1560                                                   u8 wifi_status)
1561 {
1562         /* tdma and coex table */
1563         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1564 
1565         btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1566 }
1567 
1568 static void btc8821a1ant_act_wifi_con_bt_acl_busy(struct btc_coexist *btcoexist,
1569                                                   u8 wifi_status)
1570 {
1571         u8 bt_rssi_state;
1572 
1573         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1574 
1575         bt_rssi_state = btc8821a1ant_bt_rssi_state(btcoexist, 2, 28, 0);
1576 
1577         if (bt_link_info->hid_only) {
1578                 /* HID */
1579                 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1580                                                       wifi_status);
1581                 coex_dm->auto_tdma_adjust = false;
1582                 return;
1583         } else if (bt_link_info->a2dp_only) {
1584                 /* A2DP */
1585                 if (wifi_status == BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1586                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1587                         btc8821a1ant_coex_table_with_type(btcoexist,
1588                                                           NORMAL_EXEC, 1);
1589                         coex_dm->auto_tdma_adjust = false;
1590                 } else if ((bt_rssi_state != BTC_RSSI_STATE_HIGH) &&
1591                            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1592                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1593                         btc8821a1ant_coex_table_with_type(btcoexist,
1594                                                           NORMAL_EXEC, 1);
1595                 } else {
1596                         /* for low BT RSSI */
1597                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1598                         btc8821a1ant_coex_table_with_type(btcoexist,
1599                                                           NORMAL_EXEC, 1);
1600                         coex_dm->auto_tdma_adjust = false;
1601                 }
1602         } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1603                 /* HID+A2DP */
1604                 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1605                     (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1606                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1607                                              true, 14);
1608                         coex_dm->auto_tdma_adjust = false;
1609                 } else {
1610                         /*for low BT RSSI*/
1611                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1612                                              true, 14);
1613                         coex_dm->auto_tdma_adjust = false;
1614                 }
1615 
1616                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1617         } else if ((bt_link_info->pan_only) ||
1618                 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1619                 /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */
1620                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1621                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
1622                 coex_dm->auto_tdma_adjust = false;
1623         } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1624                    (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1625                     bt_link_info->pan_exist)) {
1626                 /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */
1627                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 43);
1628                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1629                 coex_dm->auto_tdma_adjust = false;
1630         } else {
1631                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1632                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1633                 coex_dm->auto_tdma_adjust = false;
1634         }
1635 }
1636 
1637 static
1638 void btc8821a1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)
1639 {
1640         /* power save state */
1641         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1642 
1643         /* tdma and coex table */
1644         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1645         btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1646 }
1647 
1648 static void btc8821a1ant_act_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1649 {
1650         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1651 
1652         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1653 
1654         /* tdma and coex table */
1655         if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1656                 if (bt_link_info->a2dp_exist) {
1657                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1658                         btc8821a1ant_coex_table_with_type(btcoexist,
1659                                                           NORMAL_EXEC, 1);
1660                 } else if (bt_link_info->a2dp_exist &&
1661                            bt_link_info->pan_exist) {
1662                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1663                         btc8821a1ant_coex_table_with_type(btcoexist,
1664                                                           NORMAL_EXEC, 4);
1665                 } else {
1666                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1667                         btc8821a1ant_coex_table_with_type(btcoexist,
1668                                                           NORMAL_EXEC, 4);
1669                 }
1670         } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1671                    (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1672                     coex_dm->bt_status)) {
1673                 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1674                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1675         } else {
1676                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1677                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1678         }
1679 }
1680 
1681 static
1682 void btc8821a1ant_action_wifi_connected_scan(struct btc_coexist *btcoexist)
1683 {
1684         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1685 
1686         /* power save state */
1687         btc8821a1ant_power_save_state(btcoexist,
1688                                       BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1689 
1690         /* tdma and coex table */
1691         if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1692                 if (bt_link_info->a2dp_exist) {
1693                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1694                         btc8821a1ant_coex_table_with_type(btcoexist,
1695                                                           NORMAL_EXEC, 1);
1696                 } else {
1697                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1698                         btc8821a1ant_coex_table_with_type(btcoexist,
1699                                                           NORMAL_EXEC, 4);
1700                 }
1701         } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1702                    (coex_dm->bt_status ==
1703                     BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY)) {
1704                 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1705                         BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1706         } else {
1707                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1708                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1709         }
1710 }
1711 
1712 static void btc8821a1ant_act_wifi_conn_sp_pkt(struct btc_coexist *btcoexist)
1713 {
1714         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1715 
1716         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1717                                       0x0, 0x0);
1718 
1719         /* tdma and coex table */
1720         if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1721             (bt_link_info->a2dp_exist)) {
1722                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1723                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1724         }
1725 
1726         if ((bt_link_info->hid_exist) && (bt_link_info->a2dp_exist)) {
1727                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1728                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1729         } else if (bt_link_info->pan_exist) {
1730                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1731                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1732         } else {
1733                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1734                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1735         }
1736 }
1737 
1738 static void btc8821a1ant_action_wifi_connected(struct btc_coexist *btcoexist)
1739 {
1740         struct rtl_priv *rtlpriv = btcoexist->adapter;
1741         bool wifi_busy = false;
1742         bool scan = false, link = false, roam = false;
1743         bool under_4way = false;
1744         bool ap_enable = false;
1745 
1746         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1747                  "[BTCoex], CoexForWifiConnect()===>\n");
1748 
1749         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
1750                            &under_4way);
1751         if (under_4way) {
1752                 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1753                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1754                          "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
1755                 return;
1756         }
1757 
1758         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1759         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1760         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1761         if (scan || link || roam) {
1762                 if (scan)
1763                         btc8821a1ant_action_wifi_connected_scan(btcoexist);
1764                 else
1765                         btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1766 
1767                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1768                          "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
1769                 return;
1770         }
1771 
1772         /* power save state*/
1773         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1774                            &ap_enable);
1775         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1776         if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY ==
1777             coex_dm->bt_status && !ap_enable &&
1778             !btcoexist->bt_link_info.hid_only) {
1779                 if (!wifi_busy && btcoexist->bt_link_info.a2dp_only)
1780                         /* A2DP */
1781                         btc8821a1ant_power_save_state(btcoexist,
1782                                                 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1783                 else
1784                         btc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON,
1785                                                       0x50, 0x4);
1786         } else {
1787                 btc8821a1ant_power_save_state(btcoexist,
1788                                               BTC_PS_WIFI_NATIVE,
1789                                               0x0, 0x0);
1790         }
1791 
1792         /* tdma and coex table */
1793         if (!wifi_busy) {
1794                 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1795                         btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1796                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1797                 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1798                             coex_dm->bt_status) ||
1799                            (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1800                             coex_dm->bt_status)) {
1801                         btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1802                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1803                 } else {
1804                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1805                         btc8821a1ant_coex_table_with_type(btcoexist,
1806                                                           NORMAL_EXEC, 2);
1807                 }
1808         } else {
1809                 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1810                         btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1811                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1812                 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1813                             coex_dm->bt_status) ||
1814                            (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1815                             coex_dm->bt_status)) {
1816                         btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1817                                 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1818                 } else {
1819                         btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1820                         btc8821a1ant_coex_table_with_type(btcoexist,
1821                                                           NORMAL_EXEC, 2);
1822                 }
1823         }
1824 }
1825 
1826 static void btc8821a1ant_run_sw_coex_mech(struct btc_coexist *btcoexist)
1827 {
1828         struct rtl_priv *rtlpriv = btcoexist->adapter;
1829         u8 algorithm = 0;
1830 
1831         algorithm = btc8821a1ant_action_algorithm(btcoexist);
1832         coex_dm->cur_algorithm = algorithm;
1833 
1834         if (!btc8821a1ant_is_common_action(btcoexist)) {
1835                 switch (coex_dm->cur_algorithm) {
1836                 case BT_8821A_1ANT_COEX_ALGO_SCO:
1837                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1838                                  "[BTCoex], Action algorithm = SCO\n");
1839                         btc8821a1ant_action_sco(btcoexist);
1840                         break;
1841                 case BT_8821A_1ANT_COEX_ALGO_HID:
1842                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1843                                  "[BTCoex], Action algorithm = HID\n");
1844                         btc8821a1ant_action_hid(btcoexist);
1845                         break;
1846                 case BT_8821A_1ANT_COEX_ALGO_A2DP:
1847                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1848                                  "[BTCoex], Action algorithm = A2DP\n");
1849                         btc8821a1ant_action_a2dp(btcoexist);
1850                         break;
1851                 case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:
1852                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1853                                  "[BTCoex], Action algorithm = A2DP+PAN(HS)\n");
1854                         btc8821a1ant_action_a2dp_pan_hs(btcoexist);
1855                         break;
1856                 case BT_8821A_1ANT_COEX_ALGO_PANEDR:
1857                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1858                                  "[BTCoex], Action algorithm = PAN(EDR)\n");
1859                         btc8821a1ant_action_pan_edr(btcoexist);
1860                         break;
1861                 case BT_8821A_1ANT_COEX_ALGO_PANHS:
1862                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1863                                  "[BTCoex], Action algorithm = HS mode\n");
1864                         btc8821a1ant_action_pan_hs(btcoexist);
1865                         break;
1866                 case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:
1867                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1868                                  "[BTCoex], Action algorithm = PAN+A2DP\n");
1869                         btc8821a1ant_action_pan_edr_a2dp(btcoexist);
1870                         break;
1871                 case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:
1872                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1873                                  "[BTCoex], Action algorithm = PAN(EDR)+HID\n");
1874                         btc8821a1ant_action_pan_edr_hid(btcoexist);
1875                         break;
1876                 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
1877                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1878                                  "[BTCoex], Action algorithm = HID+A2DP+PAN\n");
1879                         btc8821a1ant_action_hid_a2dp_pan_edr(btcoexist);
1880                         break;
1881                 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP:
1882                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1883                                  "[BTCoex], Action algorithm = HID+A2DP\n");
1884                         btc8821a1ant_action_hid_a2dp(btcoexist);
1885                         break;
1886                 default:
1887                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1888                                  "[BTCoex], Action algorithm = coexist All Off!!\n");
1889                         /*btc8821a1ant_coex_all_off(btcoexist);*/
1890                         break;
1891                 }
1892                 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
1893         }
1894 }
1895 
1896 static void btc8821a1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
1897 {
1898         struct rtl_priv *rtlpriv = btcoexist->adapter;
1899         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1900         bool wifi_connected = false, bt_hs_on = false;
1901         bool increase_scan_dev_num = false;
1902         bool bt_ctrl_agg_buf_size = false;
1903         u8 agg_buf_size = 5;
1904         u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
1905         u32 wifi_link_status = 0;
1906         u32 num_of_wifi_link = 0;
1907         bool wifi_under_5g = false;
1908 
1909         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1910                  "[BTCoex], RunCoexistMechanism()===>\n");
1911 
1912         if (btcoexist->manual_control) {
1913                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1914                          "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
1915                 return;
1916         }
1917 
1918         if (btcoexist->stop_coex_dm) {
1919                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1920                          "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
1921                 return;
1922         }
1923 
1924         if (coex_sta->under_ips) {
1925                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1926                          "[BTCoex], wifi is under IPS !!!\n");
1927                 return;
1928         }
1929 
1930         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
1931         if (wifi_under_5g) {
1932                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1933                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
1934                 btc8821a1ant_coex_under_5g(btcoexist);
1935                 return;
1936         }
1937 
1938         if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
1939             (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1940             (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
1941                 increase_scan_dev_num = true;
1942 
1943         btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
1944                            &increase_scan_dev_num);
1945 
1946         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1947                            &wifi_connected);
1948 
1949         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
1950                            &wifi_link_status);
1951         num_of_wifi_link = wifi_link_status >> 16;
1952         if ((num_of_wifi_link >= 2) ||
1953             (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
1954                 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1955                 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1956                                         bt_ctrl_agg_buf_size, agg_buf_size);
1957                 btc8821a1ant_action_wifi_multi_port(btcoexist);
1958                 return;
1959         }
1960 
1961         if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {
1962                 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1963         } else {
1964                 if (wifi_connected) {
1965                         wifi_rssi_state =
1966                                 btc8821a1ant_wifi_rssi_state(btcoexist, 1, 2,
1967                                                              30, 0);
1968                         btc8821a1ant_limited_tx(btcoexist,
1969                                                 NORMAL_EXEC, 1, 1,
1970                                                 0, 1);
1971                 } else {
1972                         btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC,
1973                                                 0, 0, 0, 0);
1974                 }
1975         }
1976 
1977         if (bt_link_info->sco_exist) {
1978                 bt_ctrl_agg_buf_size = true;
1979                 agg_buf_size = 0x3;
1980         } else if (bt_link_info->hid_exist) {
1981                 bt_ctrl_agg_buf_size = true;
1982                 agg_buf_size = 0x5;
1983         } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {
1984                 bt_ctrl_agg_buf_size = true;
1985                 agg_buf_size = 0x8;
1986         }
1987         btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1988                                 bt_ctrl_agg_buf_size, agg_buf_size);
1989 
1990         btc8821a1ant_run_sw_coex_mech(btcoexist);
1991 
1992         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1993         if (coex_sta->c2h_bt_inquiry_page) {
1994                 btc8821a1ant_action_bt_inquiry(btcoexist);
1995                 return;
1996         } else if (bt_hs_on) {
1997                 btc8821a1ant_action_hs(btcoexist);
1998                 return;
1999         }
2000 
2001         if (!wifi_connected) {
2002                 bool scan = false, link = false, roam = false;
2003 
2004                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2005                          "[BTCoex], wifi is non connected-idle !!!\n");
2006 
2007                 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2008                 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2009                 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2010 
2011                 if (scan || link || roam) {
2012                         if (scan)
2013                                 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2014                         else
2015                                 btc8821a1ant_action_wifi_not_connected_asso_auth(
2016                                         btcoexist);
2017                 } else {
2018                         btc8821a1ant_action_wifi_not_connected(btcoexist);
2019                 }
2020         } else {
2021                 /* wifi LPS/Busy */
2022                 btc8821a1ant_action_wifi_connected(btcoexist);
2023         }
2024 }
2025 
2026 static void btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2027 {
2028         /* force to reset coex mechanism
2029          * sw all off
2030          */
2031         btc8821a1ant_sw_mechanism(btcoexist, false);
2032 
2033         btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2034 }
2035 
2036 static void btc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,
2037                                         bool back_up, bool wifi_only)
2038 {
2039         struct rtl_priv *rtlpriv = btcoexist->adapter;
2040         u8 u1_tmp = 0;
2041         bool wifi_under_5g = false;
2042 
2043         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2044                  "[BTCoex], 1Ant Init HW Config!!\n");
2045 
2046         if (wifi_only)
2047                 return;
2048 
2049         if (back_up) {
2050                 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
2051                                                                       0x430);
2052                 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
2053                                                                       0x434);
2054                 coex_dm->backup_retry_limit =
2055                         btcoexist->btc_read_2byte(btcoexist, 0x42a);
2056                 coex_dm->backup_ampdu_max_time =
2057                         btcoexist->btc_read_1byte(btcoexist, 0x456);
2058         }
2059 
2060         /* 0x790[5:0] = 0x5 */
2061         u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
2062         u1_tmp &= 0xc0;
2063         u1_tmp |= 0x5;
2064         btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);
2065 
2066         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2067 
2068         /* Antenna config */
2069         if (wifi_under_5g)
2070                 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2071                                           true, false);
2072         else
2073                 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2074                                           true, false);
2075         /* PTA parameter */
2076         btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2077 
2078         /* Enable counter statistics
2079          * 0x76e[3] =1, WLAN_Act control by PTA
2080          */
2081         btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
2082         btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
2083         btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2084 }
2085 
2086 /**************************************************************
2087  * extern function start with ex_btc8821a1ant_
2088  **************************************************************/
2089 void ex_btc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist, bool wifionly)
2090 {
2091         btc8821a1ant_init_hw_config(btcoexist, true, wifionly);
2092         btcoexist->auto_report_1ant = true;
2093 }
2094 
2095 void ex_btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2096 {
2097         struct rtl_priv *rtlpriv = btcoexist->adapter;
2098 
2099         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2100                  "[BTCoex], Coex Mechanism Init!!\n");
2101 
2102         btcoexist->stop_coex_dm = false;
2103 
2104         btc8821a1ant_init_coex_dm(btcoexist);
2105 
2106         btc8821a1ant_query_bt_info(btcoexist);
2107 }
2108 
2109 void ex_btc8821a1ant_display_coex_info(struct btc_coexist *btcoexist,
2110                                        struct seq_file *m)
2111 {
2112         struct btc_board_info *board_info = &btcoexist->board_info;
2113         struct btc_stack_info *stack_info = &btcoexist->stack_info;
2114         struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2115         u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;
2116         u16 u2_tmp[4];
2117         u32 u4_tmp[4];
2118         bool roam = false, scan = false, link = false, wifi_under_5g = false;
2119         bool bt_hs_on = false, wifi_busy = false;
2120         long wifi_rssi = 0, bt_hs_rssi = 0;
2121         u32 wifi_bw, wifi_traffic_dir;
2122         u8 wifi_dot11_chnl, wifi_hs_chnl;
2123         u32 fw_ver = 0, bt_patch_ver = 0;
2124 
2125         seq_puts(m, "\n ============[BT Coexist info]============");
2126 
2127         if (btcoexist->manual_control) {
2128                 seq_puts(m, "\n ============[Under Manual Control]============");
2129                 seq_puts(m, "\n ==========================================");
2130         }
2131         if (btcoexist->stop_coex_dm) {
2132                 seq_puts(m, "\n ============[Coex is STOPPED]============");
2133                 seq_puts(m, "\n ==========================================");
2134         }
2135 
2136         seq_printf(m, "\n %-35s = %d/ %d/ %d",
2137                    "Ant PG Num/ Ant Mech/ Ant Pos:",
2138                    board_info->pg_ant_num,
2139                    board_info->btdm_ant_num,
2140                    board_info->btdm_ant_pos);
2141 
2142         seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
2143                    ((stack_info->profile_notified) ? "Yes" : "No"),
2144                    stack_info->hci_version);
2145 
2146         btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2147                            &bt_patch_ver);
2148         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2149         seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2150                    "CoexVer/ FwVer/ PatchVer",
2151                    glcoex_ver_date_8821a_1ant,
2152                    glcoex_ver_8821a_1ant,
2153                    fw_ver, bt_patch_ver,
2154                    bt_patch_ver);
2155 
2156         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION,
2157                            &bt_hs_on);
2158         btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2159                            &wifi_dot11_chnl);
2160         btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL,
2161                            &wifi_hs_chnl);
2162         seq_printf(m, "\n %-35s = %d / %d(%d)",
2163                    "Dot11 channel / HsChnl(HsMode)",
2164                    wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2165 
2166         seq_printf(m, "\n %-35s = %3ph ",
2167                    "H2C Wifi inform bt chnl Info",
2168                    coex_dm->wifi_chnl_info);
2169 
2170         btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2171         btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2172         seq_printf(m, "\n %-35s = %d/ %d", "Wifi rssi/ HS rssi",
2173                    (int)wifi_rssi, (int)bt_hs_rssi);
2174 
2175         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2176         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2177         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2178         seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
2179                    link, roam, scan);
2180 
2181         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
2182                            &wifi_under_5g);
2183         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
2184                            &wifi_bw);
2185         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
2186                            &wifi_busy);
2187         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2188                            &wifi_traffic_dir);
2189         seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",
2190                    (wifi_under_5g ? "5G" : "2.4G"),
2191                    ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2192                    (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),
2193                    ((!wifi_busy) ? "idle" :
2194                    ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2195                    "uplink" : "downlink")));
2196         seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2197                    "BT [status/ rssi/ retryCnt]",
2198                    ((coex_sta->bt_disabled) ? ("disabled") :
2199                    ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2200                    ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2201                      coex_dm->bt_status) ?
2202                    "non-connected idle" :
2203                    ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
2204                      coex_dm->bt_status) ?
2205                    "connected-idle" : "busy")))),
2206                    coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2207 
2208         seq_printf(m, "\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",
2209                    bt_link_info->sco_exist,
2210                    bt_link_info->hid_exist,
2211                    bt_link_info->pan_exist,
2212                    bt_link_info->a2dp_exist);
2213         btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2214 
2215         bt_info_ext = coex_sta->bt_info_ext;
2216         seq_printf(m, "\n %-35s = %s",
2217                    "BT Info A2DP rate",
2218                    (bt_info_ext & BIT0) ?
2219                    "Basic rate" : "EDR rate");
2220 
2221         for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {
2222                 if (coex_sta->bt_info_c2h_cnt[i]) {
2223                         seq_printf(m, "\n %-35s = %7ph(%d)",
2224                                    glbt_info_src_8821a_1ant[i],
2225                                    coex_sta->bt_info_c2h[i],
2226                                    coex_sta->bt_info_c2h_cnt[i]);
2227                 }
2228         }
2229         seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2230                    "PS state, IPS/LPS, (lps/rpwm)",
2231                    ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2232                    ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2233                    btcoexist->bt_info.lps_val,
2234                    btcoexist->bt_info.rpwm_val);
2235         btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2236 
2237         if (!btcoexist->manual_control) {
2238                 /* Sw mechanism*/
2239                 seq_printf(m, "\n %-35s",
2240                            "============[Sw mechanism]============");
2241 
2242                 seq_printf(m, "\n %-35s = %d", "SM[LowPenaltyRA]",
2243                            coex_dm->cur_low_penalty_ra);
2244 
2245                 seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2246                            "DelBA/ BtCtrlAgg/ AggSize",
2247                            (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2248                            (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2249                            btcoexist->bt_info.agg_buf_size);
2250                 seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask",
2251                            btcoexist->bt_info.ra_mask);
2252 
2253                 /* Fw mechanism */
2254                 seq_printf(m, "\n %-35s",
2255                            "============[Fw mechanism]============");
2256 
2257                 ps_tdma_case = coex_dm->cur_ps_tdma;
2258                 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
2259                            "PS TDMA",
2260                            coex_dm->ps_tdma_para,
2261                            ps_tdma_case,
2262                            coex_dm->auto_tdma_adjust);
2263 
2264                 seq_printf(m, "\n %-35s = 0x%x ",
2265                            "Latest error condition(should be 0)",
2266                            coex_dm->error_condition);
2267 
2268                 seq_printf(m, "\n %-35s = %d ", "IgnWlanAct",
2269                            coex_dm->cur_ignore_wlan_act);
2270         }
2271 
2272         /* Hw setting */
2273         seq_printf(m, "\n %-35s", "============[Hw setting]============");
2274 
2275         seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2276                    "backup ARFR1/ARFR2/RL/AMaxTime",
2277                    coex_dm->backup_arfr_cnt1,
2278                    coex_dm->backup_arfr_cnt2,
2279                    coex_dm->backup_retry_limit,
2280                    coex_dm->backup_ampdu_max_time);
2281 
2282         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2283         u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2284         u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2285         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2286         seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2287                    "0x430/0x434/0x42a/0x456",
2288                    u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);
2289 
2290         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2291         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);
2292         seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",
2293                    u1_tmp[0], (u4_tmp[0] & 0x3e000000) >> 25);
2294 
2295         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
2296         seq_printf(m, "\n %-35s = 0x%x", "0x8db[6:5]",
2297                    ((u1_tmp[0] & 0x60) >> 5));
2298 
2299         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);
2300         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2301         seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2302                    "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",
2303                    (u4_tmp[0] & 0x30000000) >> 28,
2304                     u4_tmp[0] & 0xff,
2305                     u1_tmp[0] & 0x3);
2306 
2307         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2308         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2309         u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2310         seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2311                    "0x40/0x4c[24:23]/0x64[0]",
2312                    u1_tmp[0], ((u4_tmp[0] & 0x01800000) >> 23),
2313                    u1_tmp[1] & 0x1);
2314 
2315         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2316         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2317         seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522",
2318                    u4_tmp[0], u1_tmp[0]);
2319 
2320         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2321         seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)",
2322                    u4_tmp[0] & 0xff);
2323 
2324         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
2325         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);
2326         u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2327         seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",
2328                    u4_tmp[0], (u1_tmp[0] << 8) + u1_tmp[1]);
2329 
2330         u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2331         u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2332         u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2333         u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
2334         seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2335                    "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
2336                    u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
2337 
2338         seq_printf(m, "\n %-35s = %d/ %d", "0x770(high-pri rx/tx)",
2339                    coex_sta->high_priority_rx, coex_sta->high_priority_tx);
2340         seq_printf(m, "\n %-35s = %d/ %d", "0x774(low-pri rx/tx)",
2341                    coex_sta->low_priority_rx, coex_sta->low_priority_tx);
2342         if (btcoexist->auto_report_1ant)
2343                 btc8821a1ant_monitor_bt_ctr(btcoexist);
2344         btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2345 }
2346 
2347 void ex_btc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2348 {
2349         struct rtl_priv *rtlpriv = btcoexist->adapter;
2350         bool wifi_under_5g = false;
2351 
2352         if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2353                 return;
2354         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2355         if (wifi_under_5g) {
2356                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2357                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2358                 btc8821a1ant_coex_under_5g(btcoexist);
2359                 return;
2360         }
2361 
2362         if (BTC_IPS_ENTER == type) {
2363                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2364                          "[BTCoex], IPS ENTER notify\n");
2365                 coex_sta->under_ips = true;
2366                 btc8821a1ant_set_ant_path(btcoexist,
2367                                           BTC_ANT_PATH_BT, false, true);
2368                 /* set PTA control */
2369                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2370                 btc8821a1ant_coex_table_with_type(btcoexist,
2371                                                   NORMAL_EXEC, 0);
2372         } else if (BTC_IPS_LEAVE == type) {
2373                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2374                          "[BTCoex], IPS LEAVE notify\n");
2375                 coex_sta->under_ips = false;
2376 
2377                 btc8821a1ant_init_hw_config(btcoexist, false, false);
2378                 btc8821a1ant_init_coex_dm(btcoexist);
2379                 btc8821a1ant_query_bt_info(btcoexist);
2380         }
2381 }
2382 
2383 void ex_btc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2384 {
2385         struct rtl_priv *rtlpriv = btcoexist->adapter;
2386 
2387         if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2388                 return;
2389 
2390         if (BTC_LPS_ENABLE == type) {
2391                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2392                          "[BTCoex], LPS ENABLE notify\n");
2393                 coex_sta->under_lps = true;
2394         } else if (BTC_LPS_DISABLE == type) {
2395                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2396                          "[BTCoex], LPS DISABLE notify\n");
2397                 coex_sta->under_lps = false;
2398         }
2399 }
2400 
2401 void ex_btc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2402 {
2403         struct rtl_priv *rtlpriv = btcoexist->adapter;
2404         bool wifi_connected = false, bt_hs_on = false;
2405         bool bt_ctrl_agg_buf_size = false;
2406         bool wifi_under_5g = false;
2407         u32 wifi_link_status = 0;
2408         u32 num_of_wifi_link = 0;
2409         u8 agg_buf_size = 5;
2410 
2411         if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2412                 return;
2413         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2414         if (wifi_under_5g) {
2415                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2416                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2417                 btc8821a1ant_coex_under_5g(btcoexist);
2418                 return;
2419         }
2420 
2421         if (type == BTC_SCAN_START) {
2422                 coex_sta->wifi_is_high_pri_task = true;
2423                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2424                          "[BTCoex], SCAN START notify\n");
2425 
2426                 /* Force antenna setup for no scan result issue */
2427                 btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2428         } else {
2429                 coex_sta->wifi_is_high_pri_task = false;
2430                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2431                          "[BTCoex], SCAN FINISH notify\n");
2432         }
2433 
2434         if (coex_sta->bt_disabled)
2435                 return;
2436 
2437         btcoexist->btc_get(btcoexist,
2438                  BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2439         btcoexist->btc_get(btcoexist,
2440                  BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2441 
2442         btc8821a1ant_query_bt_info(btcoexist);
2443 
2444         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2445                            &wifi_link_status);
2446         num_of_wifi_link = wifi_link_status >> 16;
2447         if (num_of_wifi_link >= 2) {
2448                 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2449                 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2450                                         bt_ctrl_agg_buf_size, agg_buf_size);
2451                 btc8821a1ant_action_wifi_multi_port(btcoexist);
2452                 return;
2453         }
2454 
2455         if (coex_sta->c2h_bt_inquiry_page) {
2456                 btc8821a1ant_action_bt_inquiry(btcoexist);
2457                 return;
2458         } else if (bt_hs_on) {
2459                 btc8821a1ant_action_hs(btcoexist);
2460                 return;
2461         }
2462 
2463         if (BTC_SCAN_START == type) {
2464                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2465                          "[BTCoex], SCAN START notify\n");
2466                 if (!wifi_connected) {
2467                         /* non-connected scan */
2468                         btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2469                 } else {
2470                         /* wifi is connected */
2471                         btc8821a1ant_action_wifi_connected_scan(btcoexist);
2472                 }
2473         } else if (BTC_SCAN_FINISH == type) {
2474                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2475                          "[BTCoex], SCAN FINISH notify\n");
2476                 if (!wifi_connected) {
2477                         /* non-connected scan */
2478                         btc8821a1ant_action_wifi_not_connected(btcoexist);
2479                 } else {
2480                         btc8821a1ant_action_wifi_connected(btcoexist);
2481                 }
2482         }
2483 }
2484 
2485 void ex_btc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2486 {
2487         struct rtl_priv *rtlpriv = btcoexist->adapter;
2488         bool wifi_connected = false, bt_hs_on = false;
2489         u32 wifi_link_status = 0;
2490         u32 num_of_wifi_link = 0;
2491         bool bt_ctrl_agg_buf_size = false;
2492         bool wifi_under_5g = false;
2493         u8 agg_buf_size = 5;
2494 
2495         if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2496             coex_sta->bt_disabled)
2497                 return;
2498         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2499         if (wifi_under_5g) {
2500                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2501                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2502                 btc8821a1ant_coex_under_5g(btcoexist);
2503                 return;
2504         }
2505 
2506         if (type == BTC_ASSOCIATE_START) {
2507                 coex_sta->wifi_is_high_pri_task = true;
2508                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2509                          "[BTCoex], CONNECT START notify\n");
2510                 coex_dm->arp_cnt = 0;
2511         } else {
2512                 coex_sta->wifi_is_high_pri_task = false;
2513                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2514                          "[BTCoex], CONNECT FINISH notify\n");
2515                 coex_dm->arp_cnt = 0;
2516         }
2517 
2518         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2519                            &wifi_link_status);
2520         num_of_wifi_link = wifi_link_status >> 16;
2521         if (num_of_wifi_link >= 2) {
2522                 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2523                 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2524                                         bt_ctrl_agg_buf_size, agg_buf_size);
2525                 btc8821a1ant_action_wifi_multi_port(btcoexist);
2526                 return;
2527         }
2528 
2529         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2530         if (coex_sta->c2h_bt_inquiry_page) {
2531                 btc8821a1ant_action_bt_inquiry(btcoexist);
2532                 return;
2533         } else if (bt_hs_on) {
2534                 btc8821a1ant_action_hs(btcoexist);
2535                 return;
2536         }
2537 
2538         if (BTC_ASSOCIATE_START == type) {
2539                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2540                          "[BTCoex], CONNECT START notify\n");
2541                 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2542         } else if (BTC_ASSOCIATE_FINISH == type) {
2543                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2544                          "[BTCoex], CONNECT FINISH notify\n");
2545 
2546                 btcoexist->btc_get(btcoexist,
2547                          BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2548                 if (!wifi_connected) {
2549                         /* non-connected scan */
2550                         btc8821a1ant_action_wifi_not_connected(btcoexist);
2551                 } else {
2552                         btc8821a1ant_action_wifi_connected(btcoexist);
2553                 }
2554         }
2555 }
2556 
2557 void ex_btc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
2558                                          u8 type)
2559 {
2560         struct rtl_priv *rtlpriv = btcoexist->adapter;
2561         u8 h2c_parameter[3] = {0};
2562         u32 wifi_bw;
2563         u8 wifi_central_chnl;
2564         bool wifi_under_5g = false;
2565 
2566         if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2567             coex_sta->bt_disabled)
2568                 return;
2569         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2570         if (wifi_under_5g) {
2571                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2572                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2573                 btc8821a1ant_coex_under_5g(btcoexist);
2574                 return;
2575         }
2576 
2577         if (BTC_MEDIA_CONNECT == type) {
2578                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2579                          "[BTCoex], MEDIA connect notify\n");
2580         } else {
2581                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2582                          "[BTCoex], MEDIA disconnect notify\n");
2583                 coex_dm->arp_cnt = 0;
2584         }
2585 
2586         /* only 2.4G we need to inform bt the chnl mask */
2587         btcoexist->btc_get(btcoexist,
2588                            BTC_GET_U1_WIFI_CENTRAL_CHNL,
2589                            &wifi_central_chnl);
2590         if ((type == BTC_MEDIA_CONNECT) &&
2591             (wifi_central_chnl <= 14)) {
2592                 h2c_parameter[0] = 0x0;
2593                 h2c_parameter[1] = wifi_central_chnl;
2594                 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2595                 if (wifi_bw == BTC_WIFI_BW_HT40)
2596                         h2c_parameter[2] = 0x30;
2597                 else
2598                         h2c_parameter[2] = 0x20;
2599         }
2600 
2601         coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2602         coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2603         coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2604 
2605         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2606                  "[BTCoex], FW write 0x66 = 0x%x\n",
2607                  h2c_parameter[0] << 16 |
2608                  h2c_parameter[1] << 8 |
2609                  h2c_parameter[2]);
2610 
2611         btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2612 }
2613 
2614 void ex_btc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
2615                                            u8 type)
2616 {
2617         struct rtl_priv *rtlpriv = btcoexist->adapter;
2618         bool bt_hs_on = false;
2619         bool bt_ctrl_agg_buf_size = false;
2620         bool wifi_under_5g = false;
2621         u32 wifi_link_status = 0;
2622         u32 num_of_wifi_link = 0;
2623         u8 agg_buf_size = 5;
2624 
2625         if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2626             coex_sta->bt_disabled)
2627                 return;
2628 
2629         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2630         if (wifi_under_5g) {
2631                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2632                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2633                 btc8821a1ant_coex_under_5g(btcoexist);
2634                 return;
2635         }
2636 
2637         if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2638             type == BTC_PACKET_ARP) {
2639                 coex_sta->wifi_is_high_pri_task = true;
2640 
2641                 if (type == BTC_PACKET_ARP) {
2642                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2643                                  "[BTCoex], specific Packet ARP notify\n");
2644                 } else {
2645                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2646                                  "[BTCoex], specific Packet DHCP or EAPOL notify\n");
2647                 }
2648         } else {
2649                 coex_sta->wifi_is_high_pri_task = false;
2650                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2651                          "[BTCoex], specific Packet [Type = %d] notify\n",
2652                          type);
2653         }
2654 
2655         coex_sta->special_pkt_period_cnt = 0;
2656 
2657         btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2658                            &wifi_link_status);
2659         num_of_wifi_link = wifi_link_status >> 16;
2660         if (num_of_wifi_link >= 2) {
2661                 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2662                 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2663                                         bt_ctrl_agg_buf_size, agg_buf_size);
2664                 btc8821a1ant_action_wifi_multi_port(btcoexist);
2665                 return;
2666         }
2667 
2668         btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2669         if (coex_sta->c2h_bt_inquiry_page) {
2670                 btc8821a1ant_action_bt_inquiry(btcoexist);
2671                 return;
2672         } else if (bt_hs_on) {
2673                 btc8821a1ant_action_hs(btcoexist);
2674                 return;
2675         }
2676 
2677         if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2678             type == BTC_PACKET_ARP) {
2679                 if (type == BTC_PACKET_ARP) {
2680                         coex_dm->arp_cnt++;
2681                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2682                                  "[BTCoex], ARP Packet Count = %d\n",
2683                                  coex_dm->arp_cnt);
2684                         if (coex_dm->arp_cnt >= 10)
2685                                 /* if APR PKT > 10 after connect, do not go to
2686                                  * btc8821a1ant_act_wifi_conn_sp_pkt
2687                                  */
2688                                 return;
2689                 }
2690 
2691                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2692                          "[BTCoex], special Packet(%d) notify\n", type);
2693                 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
2694         }
2695 }
2696 
2697 void ex_btc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
2698                                     u8 *tmp_buf, u8 length)
2699 {
2700         struct rtl_priv *rtlpriv = btcoexist->adapter;
2701         u8 i;
2702         u8 bt_info = 0;
2703         u8 rsp_source = 0;
2704         bool wifi_connected = false;
2705         bool bt_busy = false;
2706         bool wifi_under_5g = false;
2707 
2708         coex_sta->c2h_bt_info_req_sent = false;
2709 
2710         btcoexist->btc_get(btcoexist,
2711                  BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2712 
2713         rsp_source = tmp_buf[0] & 0xf;
2714         if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)
2715                 rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;
2716         coex_sta->bt_info_c2h_cnt[rsp_source]++;
2717 
2718         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2719                  "[BTCoex], Bt info[%d], length = %d, hex data = [",
2720                  rsp_source, length);
2721         for (i = 0; i < length; i++) {
2722                 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
2723                 if (i == 1)
2724                         bt_info = tmp_buf[i];
2725                 if (i == length - 1) {
2726                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2727                                  "0x%02x]\n", tmp_buf[i]);
2728                 } else {
2729                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2730                                  "0x%02x, ", tmp_buf[i]);
2731                 }
2732         }
2733 
2734         if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {
2735                 /* [3:0] */
2736                 coex_sta->bt_retry_cnt =
2737                         coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
2738 
2739                 coex_sta->bt_rssi =
2740                         coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
2741 
2742                 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
2743 
2744                 coex_sta->bt_tx_rx_mask =
2745                         (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
2746                 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
2747                                    &coex_sta->bt_tx_rx_mask);
2748                 if (!coex_sta->bt_tx_rx_mask) {
2749                         /* BT into is responded by BT FW and BT RF REG 0x3C !=
2750                          * 0x15 => Need to switch BT TRx Mask
2751                          */
2752                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2753                                  "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
2754                         btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
2755                                                   0x3c, 0x15);
2756                 }
2757 
2758                 /* Here we need to resend some wifi info to BT
2759                  * because bt is reset and lost the info
2760                  */
2761                 if (coex_sta->bt_info_ext & BIT1) {
2762                         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2763                                  "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
2764                         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2765                                            &wifi_connected);
2766                         if (wifi_connected) {
2767                                 ex_btc8821a1ant_media_status_notify(btcoexist,
2768                                                                BTC_MEDIA_CONNECT);
2769                         } else {
2770                                 ex_btc8821a1ant_media_status_notify(btcoexist,
2771                                                                BTC_MEDIA_DISCONNECT);
2772                         }
2773                 }
2774 
2775                 if ((coex_sta->bt_info_ext & BIT3) && !wifi_under_5g) {
2776                         if (!btcoexist->manual_control &&
2777                             !btcoexist->stop_coex_dm) {
2778                                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2779                                          "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
2780                                 btc8821a1ant_ignore_wlan_act(btcoexist,
2781                                                              FORCE_EXEC,
2782                                                              false);
2783                         }
2784                 }
2785         }
2786 
2787         /* check BIT2 first ==> check if bt is under inquiry or page scan */
2788         if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)
2789                 coex_sta->c2h_bt_inquiry_page = true;
2790         else
2791                 coex_sta->c2h_bt_inquiry_page = false;
2792 
2793         /* set link exist status */
2794         if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2795                 coex_sta->bt_link_exist = false;
2796                 coex_sta->pan_exist = false;
2797                 coex_sta->a2dp_exist = false;
2798                 coex_sta->hid_exist = false;
2799                 coex_sta->sco_exist = false;
2800         } else {
2801                 /* connection exists */
2802                 coex_sta->bt_link_exist = true;
2803                 if (bt_info & BT_INFO_8821A_1ANT_B_FTP)
2804                         coex_sta->pan_exist = true;
2805                 else
2806                         coex_sta->pan_exist = false;
2807                 if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)
2808                         coex_sta->a2dp_exist = true;
2809                 else
2810                         coex_sta->a2dp_exist = false;
2811                 if (bt_info & BT_INFO_8821A_1ANT_B_HID)
2812                         coex_sta->hid_exist = true;
2813                 else
2814                         coex_sta->hid_exist = false;
2815                 if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)
2816                         coex_sta->sco_exist = true;
2817                 else
2818                         coex_sta->sco_exist = false;
2819         }
2820 
2821         btc8821a1ant_update_bt_link_info(btcoexist);
2822 
2823         /* mask profile bit for connect-ilde identification
2824          * (for CSR case: A2DP idle --> 0x41)
2825          */
2826         bt_info = bt_info & 0x1f;
2827 
2828         if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2829                 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
2830                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2831                          "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
2832         } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {
2833                 /* connection exists but no busy */
2834                 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;
2835                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2836                          "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
2837         } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||
2838                 (bt_info & BT_INFO_8821A_1ANT_B_SCO_BUSY)) {
2839                 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;
2840                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2841                          "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
2842         } else if (bt_info & BT_INFO_8821A_1ANT_B_ACL_BUSY) {
2843                 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
2844                         coex_dm->auto_tdma_adjust = false;
2845                 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;
2846                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2847                          "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
2848         } else {
2849                 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;
2850                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2851                          "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
2852         }
2853 
2854         if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
2855             (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2856             (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
2857                 bt_busy = true;
2858         else
2859                 bt_busy = false;
2860         btcoexist->btc_set(btcoexist,
2861                            BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2862 
2863         btc8821a1ant_run_coexist_mechanism(btcoexist);
2864 }
2865 
2866 void ex_btc8821a1ant_halt_notify(struct btc_coexist *btcoexist)
2867 {
2868         struct rtl_priv *rtlpriv = btcoexist->adapter;
2869         bool wifi_under_5g = false;
2870 
2871         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2872                  "[BTCoex], Halt notify\n");
2873         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2874         if (wifi_under_5g) {
2875                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2876                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2877                 btc8821a1ant_coex_under_5g(btcoexist);
2878                 return;
2879         }
2880 
2881 
2882         btcoexist->stop_coex_dm = true;
2883 
2884         btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
2885         btc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
2886 
2887         btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2888         btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
2889 
2890         ex_btc8821a1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
2891 }
2892 
2893 void ex_btc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
2894 {
2895         struct rtl_priv *rtlpriv = btcoexist->adapter;
2896         bool wifi_under_5g = false;
2897 
2898         btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2899         if (wifi_under_5g) {
2900                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2901                          "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2902                 btc8821a1ant_coex_under_5g(btcoexist);
2903                 return;
2904         }
2905 
2906         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2907                  "[BTCoex], Pnp notify\n");
2908 
2909         if (BTC_WIFI_PNP_SLEEP == pnp_state) {
2910                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2911                          "[BTCoex], Pnp notify to SLEEP\n");
2912                 /* BT should clear UnderIPS/UnderLPS state to avoid mismatch
2913                  * state after wakeup.
2914                  */
2915                 coex_sta->under_ips = false;
2916                 coex_sta->under_lps = false;
2917                 btcoexist->stop_coex_dm = true;
2918                 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2919                                               0x0, 0x0);
2920                 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2921                 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2922                 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false,
2923                                           true);
2924         } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
2925                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2926                          "[BTCoex], Pnp notify to WAKE UP\n");
2927                 btcoexist->stop_coex_dm = false;
2928                 btc8821a1ant_init_hw_config(btcoexist, false, false);
2929                 btc8821a1ant_init_coex_dm(btcoexist);
2930                 btc8821a1ant_query_bt_info(btcoexist);
2931         }
2932 }
2933 
2934 void ex_btc8821a1ant_periodical(struct btc_coexist *btcoexist)
2935 {
2936         struct rtl_priv *rtlpriv = btcoexist->adapter;
2937         static u8 dis_ver_info_cnt;
2938         u32 fw_ver = 0, bt_patch_ver = 0;
2939         struct btc_board_info *board_info = &btcoexist->board_info;
2940         struct btc_stack_info *stack_info = &btcoexist->stack_info;
2941 
2942         RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2943                  "[BTCoex], ==========================Periodical===========================\n");
2944 
2945         if (dis_ver_info_cnt <= 5) {
2946                 dis_ver_info_cnt += 1;
2947                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2948                          "[BTCoex], ****************************************************************\n");
2949                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2950                          "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
2951                               board_info->pg_ant_num,
2952                               board_info->btdm_ant_num,
2953                               board_info->btdm_ant_pos);
2954                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2955                          "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
2956                               stack_info->profile_notified ? "Yes" : "No",
2957                               stack_info->hci_version);
2958                 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2959                                    &bt_patch_ver);
2960                 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2961                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2962                          "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
2963                               glcoex_ver_date_8821a_1ant,
2964                               glcoex_ver_8821a_1ant,
2965                               fw_ver, bt_patch_ver,
2966                               bt_patch_ver);
2967                 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2968                          "[BTCoex], ****************************************************************\n");
2969         }
2970 
2971         if (!btcoexist->auto_report_1ant) {
2972                 btc8821a1ant_query_bt_info(btcoexist);
2973                 btc8821a1ant_monitor_bt_ctr(btcoexist);
2974         } else {
2975                 coex_sta->special_pkt_period_cnt++;
2976         }
2977 }

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