linux/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c
<<
>>
Prefs
   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/08/22 Cosa first check in.
  11 * 2012/11/14 Cosa Revise for 8821A 2Ant out sourcing.
  12 *
  13 ************************************************************/
  14
  15/************************************************************
  16 * include files
  17 ************************************************************/
  18#include "halbt_precomp.h"
  19/************************************************************
  20 * Global variables, these are static variables
  21 ************************************************************/
  22static struct coex_dm_8821a_2ant glcoex_dm_8821a_2ant;
  23static struct coex_dm_8821a_2ant *coex_dm = &glcoex_dm_8821a_2ant;
  24static struct coex_sta_8821a_2ant glcoex_sta_8821a_2ant;
  25static struct coex_sta_8821a_2ant *coex_sta = &glcoex_sta_8821a_2ant;
  26
  27static const char *const glbt_info_src_8821a_2ant[] = {
  28        "BT Info[wifi fw]",
  29        "BT Info[bt rsp]",
  30        "BT Info[bt auto report]",
  31};
  32
  33static u32 glcoex_ver_date_8821a_2ant = 20130618;
  34static u32 glcoex_ver_8821a_2ant = 0x5050;
  35
  36/************************************************************
  37 * local function proto type if needed
  38 *
  39 * local function start with btc8821a2ant_
  40 ************************************************************/
  41static u8 btc8821a2ant_bt_rssi_state(struct btc_coexist *btcoexist,
  42                                     u8 level_num, u8 rssi_thresh,
  43                                     u8 rssi_thresh1)
  44{
  45        struct rtl_priv *rtlpriv = btcoexist->adapter;
  46        long bt_rssi = 0;
  47        u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
  48
  49        bt_rssi = coex_sta->bt_rssi;
  50
  51        if (level_num == 2) {
  52                if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  53                    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  54                        if (bt_rssi >=
  55                            rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT) {
  56                                bt_rssi_state = BTC_RSSI_STATE_HIGH;
  57                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  58                                        "[BTCoex], BT Rssi state switch to High\n");
  59                        } else {
  60                                bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  61                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  62                                        "[BTCoex], BT Rssi state stay at Low\n");
  63                        }
  64                } else {
  65                        if (bt_rssi < rssi_thresh) {
  66                                bt_rssi_state = BTC_RSSI_STATE_LOW;
  67                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  68                                        "[BTCoex], BT Rssi state switch to Low\n");
  69                        } else {
  70                                bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  71                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  72                                        "[BTCoex], BT Rssi state stay at High\n");
  73                        }
  74                }
  75        } else if (level_num == 3) {
  76                if (rssi_thresh > rssi_thresh1) {
  77                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  78                                "[BTCoex], BT Rssi thresh error!!\n");
  79                        return coex_sta->pre_bt_rssi_state;
  80                }
  81
  82                if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  83                    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  84                        if (bt_rssi >=
  85                            (rssi_thresh +
  86                             BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
  87                                bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  88                                rtl_dbg(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                                rtl_dbg(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 >=
 100                            (rssi_thresh1 +
 101                             BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
 102                                bt_rssi_state = BTC_RSSI_STATE_HIGH;
 103                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 104                                        "[BTCoex], BT Rssi state switch to High\n");
 105                        } else if (bt_rssi < rssi_thresh) {
 106                                bt_rssi_state = BTC_RSSI_STATE_LOW;
 107                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 108                                        "[BTCoex], BT Rssi state switch to Low\n");
 109                        } else {
 110                                bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 111                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 112                                        "[BTCoex], BT Rssi state stay at Medium\n");
 113                        }
 114                } else {
 115                        if (bt_rssi < rssi_thresh1) {
 116                                bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
 117                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 118                                        "[BTCoex], BT Rssi state switch to Medium\n");
 119                        } else {
 120                                bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 121                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 122                                        "[BTCoex], BT Rssi state stay at High\n");
 123                        }
 124                }
 125        }
 126
 127        coex_sta->pre_bt_rssi_state = bt_rssi_state;
 128
 129        return bt_rssi_state;
 130}
 131
 132static u8 btc8821a2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
 133                                       u8 index, u8 level_num,
 134                                       u8 rssi_thresh, u8 rssi_thresh1)
 135{
 136        struct rtl_priv *rtlpriv = btcoexist->adapter;
 137        long wifi_rssi = 0;
 138        u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
 139
 140        btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
 141
 142        if (level_num == 2) {
 143                if ((coex_sta->pre_wifi_rssi_state[index] ==
 144                     BTC_RSSI_STATE_LOW) ||
 145                    (coex_sta->pre_wifi_rssi_state[index] ==
 146                     BTC_RSSI_STATE_STAY_LOW)) {
 147                        if (wifi_rssi >=
 148                            (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
 149                                wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 150                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 151                                        "[BTCoex], wifi RSSI state switch to High\n");
 152                        } else {
 153                                wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 154                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 155                                        "[BTCoex], wifi RSSI state stay at Low\n");
 156                        }
 157                } else {
 158                        if (wifi_rssi < rssi_thresh) {
 159                                wifi_rssi_state = BTC_RSSI_STATE_LOW;
 160                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 161                                        "[BTCoex], wifi RSSI state switch to Low\n");
 162                        } else {
 163                                wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 164                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 165                                        "[BTCoex], wifi RSSI state stay at High\n");
 166                        }
 167                }
 168        } else if (level_num == 3) {
 169                if (rssi_thresh > rssi_thresh1) {
 170                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 171                                "[BTCoex], wifi RSSI thresh error!!\n");
 172                        return coex_sta->pre_wifi_rssi_state[index];
 173                }
 174
 175                if ((coex_sta->pre_wifi_rssi_state[index] ==
 176                    BTC_RSSI_STATE_LOW) ||
 177                    (coex_sta->pre_wifi_rssi_state[index] ==
 178                     BTC_RSSI_STATE_STAY_LOW)) {
 179                        if (wifi_rssi >=
 180                            (rssi_thresh +
 181                             BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
 182                                wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 183                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 184                                        "[BTCoex], wifi RSSI state switch to Medium\n");
 185                        } else {
 186                                wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 187                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 188                                        "[BTCoex], wifi RSSI state stay at Low\n");
 189                        }
 190                } else if ((coex_sta->pre_wifi_rssi_state[index] ==
 191                           BTC_RSSI_STATE_MEDIUM) ||
 192                           (coex_sta->pre_wifi_rssi_state[index] ==
 193                            BTC_RSSI_STATE_STAY_MEDIUM)) {
 194                        if (wifi_rssi >= (rssi_thresh1 +
 195                            BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
 196                                wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 197                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 198                                        "[BTCoex], wifi RSSI state switch to High\n");
 199                        } else if (wifi_rssi < rssi_thresh) {
 200                                wifi_rssi_state = BTC_RSSI_STATE_LOW;
 201                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 202                                        "[BTCoex], wifi RSSI state switch to Low\n");
 203                        } else {
 204                                wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 205                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 206                                        "[BTCoex], wifi RSSI state stay at Medium\n");
 207                        }
 208                } else {
 209                        if (wifi_rssi < rssi_thresh1) {
 210                                wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 211                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 212                                        "[BTCoex], wifi RSSI state switch to Medium\n");
 213                        } else {
 214                                wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 215                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 216                                        "[BTCoex], wifi RSSI state stay at High\n");
 217                        }
 218                }
 219        }
 220        coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
 221
 222        return wifi_rssi_state;
 223}
 224
 225static
 226void btc8821a2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,
 227                             bool rej_ap_agg_pkt, bool bt_ctrl_agg_buf_size,
 228                             u8 agg_buf_size)
 229{
 230        bool reject_rx_agg = rej_ap_agg_pkt;
 231        bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
 232        u8 rx_agg_size = agg_buf_size;
 233
 234        /* Rx Aggregation related setting */
 235        btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
 236                           &reject_rx_agg);
 237        /* decide BT control aggregation buf size or not */
 238        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
 239                           &bt_ctrl_rx_agg_size);
 240        /* aggregation buf size, works when BT control Rx aggregation size */
 241        btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
 242        /* real update aggregation setting */
 243        btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
 244}
 245
 246static void btc8821a2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
 247{
 248        struct rtl_priv *rtlpriv = btcoexist->adapter;
 249        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 250        u32 reg_hp_txrx, reg_lp_txrx, u4tmp;
 251        u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
 252
 253        reg_hp_txrx = 0x770;
 254        reg_lp_txrx = 0x774;
 255
 256        u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
 257        reg_hp_tx = u4tmp & MASKLWORD;
 258        reg_hp_rx = (u4tmp & MASKHWORD) >> 16;
 259
 260        u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
 261        reg_lp_tx = u4tmp & MASKLWORD;
 262        reg_lp_rx = (u4tmp & MASKHWORD) >> 16;
 263
 264        coex_sta->high_priority_tx = reg_hp_tx;
 265        coex_sta->high_priority_rx = reg_hp_rx;
 266        coex_sta->low_priority_tx = reg_lp_tx;
 267        coex_sta->low_priority_rx = reg_lp_rx;
 268
 269        if ((coex_sta->low_priority_rx >= 950) &&
 270            (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
 271            (!coex_sta->under_ips))
 272                bt_link_info->slave_role = true;
 273        else
 274                bt_link_info->slave_role = false;
 275
 276        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 277                "[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 278                reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
 279        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 280                "[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 281                reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
 282
 283        /* reset counter */
 284        btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
 285}
 286
 287static void btc8821a2ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
 288{
 289        if (coex_sta->under_ips) {
 290                coex_sta->crc_ok_cck = 0;
 291                coex_sta->crc_ok_11g = 0;
 292                coex_sta->crc_ok_11n = 0;
 293                coex_sta->crc_ok_11n_agg = 0;
 294
 295                coex_sta->crc_err_cck = 0;
 296                coex_sta->crc_err_11g = 0;
 297                coex_sta->crc_err_11n = 0;
 298                coex_sta->crc_err_11n_agg = 0;
 299        } else {
 300                coex_sta->crc_ok_cck =
 301                        btcoexist->btc_read_4byte(btcoexist, 0xf88);
 302                coex_sta->crc_ok_11g =
 303                        btcoexist->btc_read_2byte(btcoexist, 0xf94);
 304                coex_sta->crc_ok_11n =
 305                        btcoexist->btc_read_2byte(btcoexist, 0xf90);
 306                coex_sta->crc_ok_11n_agg =
 307                        btcoexist->btc_read_2byte(btcoexist, 0xfb8);
 308
 309                coex_sta->crc_err_cck =
 310                        btcoexist->btc_read_4byte(btcoexist, 0xf84);
 311                coex_sta->crc_err_11g =
 312                        btcoexist->btc_read_2byte(btcoexist, 0xf96);
 313                coex_sta->crc_err_11n =
 314                        btcoexist->btc_read_2byte(btcoexist, 0xf92);
 315                coex_sta->crc_err_11n_agg =
 316                        btcoexist->btc_read_2byte(btcoexist, 0xfba);
 317        }
 318
 319        /* reset counter */
 320        btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
 321        btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
 322}
 323
 324static void btc8821a2ant_query_bt_info(struct btc_coexist *btcoexist)
 325{
 326        struct rtl_priv *rtlpriv = btcoexist->adapter;
 327        u8 h2c_parameter[1] = {0};
 328
 329        coex_sta->c2h_bt_info_req_sent = true;
 330
 331        h2c_parameter[0] |= BIT0; /* trigger */
 332
 333        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 334                "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
 335                h2c_parameter[0]);
 336
 337        btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
 338}
 339
 340static bool btc8821a2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
 341{
 342        static bool pre_wifi_busy = true;
 343        static bool pre_under_4way = true;
 344        static bool pre_bt_hs_on = true;
 345        bool wifi_busy = false, under_4way = false, bt_hs_on = false;
 346        bool wifi_connected = false;
 347        u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 348
 349        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
 350                           &wifi_connected);
 351        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
 352        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 353        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
 354                           &under_4way);
 355
 356        if (wifi_connected) {
 357                if (wifi_busy != pre_wifi_busy) {
 358                        pre_wifi_busy = wifi_busy;
 359                        return true;
 360                }
 361                if (under_4way != pre_under_4way) {
 362                        pre_under_4way = under_4way;
 363                        return true;
 364                }
 365                if (bt_hs_on != pre_bt_hs_on) {
 366                        pre_bt_hs_on = bt_hs_on;
 367                        return true;
 368                }
 369
 370                wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 3, 2,
 371                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
 372
 373                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
 374                    (wifi_rssi_state == BTC_RSSI_STATE_LOW))
 375                        return true;
 376        }
 377
 378        return false;
 379}
 380
 381static void btc8821a2ant_update_bt_link_info(struct btc_coexist *btcoexist)
 382{
 383        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 384        bool bt_hs_on = false;
 385
 386        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 387
 388        bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
 389        bt_link_info->sco_exist = coex_sta->sco_exist;
 390        bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
 391        bt_link_info->pan_exist = coex_sta->pan_exist;
 392        bt_link_info->hid_exist = coex_sta->hid_exist;
 393
 394        /* work around for HS mode. */
 395        if (bt_hs_on) {
 396                bt_link_info->pan_exist = true;
 397                bt_link_info->bt_link_exist = true;
 398        }
 399
 400        /* check if Sco only */
 401        if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
 402            !bt_link_info->pan_exist && !bt_link_info->hid_exist)
 403                bt_link_info->sco_only = true;
 404        else
 405                bt_link_info->sco_only = false;
 406
 407        /* check if A2dp only */
 408        if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
 409            !bt_link_info->pan_exist && !bt_link_info->hid_exist)
 410                bt_link_info->a2dp_only = true;
 411        else
 412                bt_link_info->a2dp_only = false;
 413
 414        /* check if Pan only */
 415        if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
 416            bt_link_info->pan_exist && !bt_link_info->hid_exist)
 417                bt_link_info->pan_only = true;
 418        else
 419                bt_link_info->pan_only = false;
 420
 421        /* check if Hid only */
 422        if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
 423            !bt_link_info->pan_exist && bt_link_info->hid_exist)
 424                bt_link_info->hid_only = true;
 425        else
 426                bt_link_info->hid_only = false;
 427}
 428
 429static u8 btc8821a2ant_action_algorithm(struct btc_coexist *btcoexist)
 430{
 431        struct rtl_priv *rtlpriv = btcoexist->adapter;
 432        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 433        bool bt_hs_on = false;
 434        u8 algorithm = BT_8821A_2ANT_COEX_ALGO_UNDEFINED;
 435        u8 num_of_diff_profile = 0;
 436
 437        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 438
 439        if (!bt_link_info->bt_link_exist) {
 440                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 441                        "[BTCoex], No BT link exists!!!\n");
 442                return algorithm;
 443        }
 444
 445        if (bt_link_info->sco_exist)
 446                num_of_diff_profile++;
 447        if (bt_link_info->hid_exist)
 448                num_of_diff_profile++;
 449        if (bt_link_info->pan_exist)
 450                num_of_diff_profile++;
 451        if (bt_link_info->a2dp_exist)
 452                num_of_diff_profile++;
 453
 454        if (num_of_diff_profile == 1) {
 455                if (bt_link_info->sco_exist) {
 456                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 457                                "[BTCoex], SCO only\n");
 458                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 459                } else {
 460                        if (bt_link_info->hid_exist) {
 461                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 462                                        "[BTCoex], HID only\n");
 463                                algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
 464                        } else if (bt_link_info->a2dp_exist) {
 465                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 466                                        "[BTCoex], A2DP only\n");
 467                                algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP;
 468                        } else if (bt_link_info->pan_exist) {
 469                                if (bt_hs_on) {
 470                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 471                                                DBG_LOUD,
 472                                                "[BTCoex], PAN(HS) only\n");
 473                                        algorithm = BT_8821A_2ANT_COEX_ALGO_PANHS;
 474                                } else {
 475                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 476                                                DBG_LOUD,
 477                                                "[BTCoex], PAN(EDR) only\n");
 478                                        algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR;
 479                                }
 480                        }
 481                }
 482        } else if (num_of_diff_profile == 2) {
 483                if (bt_link_info->sco_exist) {
 484                        if (bt_link_info->hid_exist) {
 485                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 486                                        "[BTCoex], SCO + HID\n");
 487                                algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 488                        } else if (bt_link_info->a2dp_exist) {
 489                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 490                                        "[BTCoex], SCO + A2DP ==> SCO\n");
 491                                algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 492                        } else if (bt_link_info->pan_exist) {
 493                                if (bt_hs_on) {
 494                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 495                                                DBG_LOUD,
 496                                                "[BTCoex], SCO + PAN(HS)\n");
 497                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 498                                } else {
 499                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 500                                                DBG_LOUD,
 501                                                "[BTCoex], SCO + PAN(EDR)\n");
 502                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 503                                }
 504                        }
 505                } else {
 506                        if (bt_link_info->hid_exist &&
 507                            bt_link_info->a2dp_exist) {
 508                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 509                                        "[BTCoex], HID + A2DP\n");
 510                                algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
 511                        } else if (bt_link_info->hid_exist &&
 512                                bt_link_info->pan_exist) {
 513                                if (bt_hs_on) {
 514                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 515                                                DBG_LOUD,
 516                                                "[BTCoex], HID + PAN(HS)\n");
 517                                        algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
 518                                } else {
 519                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 520                                                DBG_LOUD,
 521                                                "[BTCoex], HID + PAN(EDR)\n");
 522                                        algorithm =
 523                                            BT_8821A_2ANT_COEX_ALGO_PANEDR_HID;
 524                                }
 525                        } else if (bt_link_info->pan_exist &&
 526                                bt_link_info->a2dp_exist) {
 527                                if (bt_hs_on) {
 528                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 529                                                DBG_LOUD,
 530                                                "[BTCoex], A2DP + PAN(HS)\n");
 531                                        algorithm =
 532                                            BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS;
 533                                } else {
 534                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 535                                                DBG_LOUD,
 536                                                "[BTCoex], A2DP + PAN(EDR)\n");
 537                                        algorithm =
 538                                            BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP;
 539                                }
 540                        }
 541                }
 542        } else if (num_of_diff_profile == 3) {
 543                if (bt_link_info->sco_exist) {
 544                        if (bt_link_info->hid_exist &&
 545                            bt_link_info->a2dp_exist) {
 546                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 547                                        "[BTCoex], SCO + HID + A2DP ==> HID\n");
 548                                algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 549                        } else if (bt_link_info->hid_exist &&
 550                                bt_link_info->pan_exist) {
 551                                if (bt_hs_on) {
 552                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 553                                                DBG_LOUD,
 554                                                "[BTCoex], SCO + HID + PAN(HS)\n");
 555                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 556                                } else {
 557                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 558                                                DBG_LOUD,
 559                                                "[BTCoex], SCO + HID + PAN(EDR)\n");
 560                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 561                                }
 562                        } else if (bt_link_info->pan_exist &&
 563                                   bt_link_info->a2dp_exist) {
 564                                if (bt_hs_on) {
 565                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 566                                                DBG_LOUD,
 567                                                "[BTCoex], SCO + A2DP + PAN(HS)\n");
 568                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 569                                } else {
 570                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 571                                                DBG_LOUD,
 572                                                "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
 573                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 574                                }
 575                        }
 576                } else {
 577                        if (bt_link_info->hid_exist &&
 578                            bt_link_info->pan_exist &&
 579                            bt_link_info->a2dp_exist) {
 580                                if (bt_hs_on) {
 581                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 582                                                DBG_LOUD,
 583                                                "[BTCoex], HID + A2DP + PAN(HS)\n");
 584                                        algorithm =
 585                                            BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
 586                                } else {
 587                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 588                                                DBG_LOUD,
 589                                                "[BTCoex], HID + A2DP + PAN(EDR)\n");
 590                                        algorithm =
 591                                        BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
 592                                }
 593                        }
 594                }
 595        } else if (num_of_diff_profile >= 3) {
 596                if (bt_link_info->sco_exist) {
 597                        if (bt_link_info->hid_exist &&
 598                            bt_link_info->pan_exist &&
 599                            bt_link_info->a2dp_exist) {
 600                                if (bt_hs_on) {
 601                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 602                                                DBG_LOUD,
 603                                                "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
 604
 605                                } else {
 606                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 607                                                DBG_LOUD,
 608                                                "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
 609                                        algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
 610                                }
 611                        }
 612                }
 613        }
 614        return algorithm;
 615}
 616
 617static void btc8821a2ant_set_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
 618                                              u8 dac_swing_lvl)
 619{
 620        struct rtl_priv *rtlpriv = btcoexist->adapter;
 621        u8 h2c_parameter[1] = {0};
 622
 623        /* There are several type of dacswing
 624         * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
 625         */
 626        h2c_parameter[0] = dac_swing_lvl;
 627
 628        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 629                "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl);
 630        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 631                "[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]);
 632
 633        btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
 634}
 635
 636static void btc8821a2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
 637                                           u8 dec_bt_pwr_lvl)
 638{
 639        struct rtl_priv *rtlpriv = btcoexist->adapter;
 640        u8 h2c_parameter[1] = {0};
 641
 642        h2c_parameter[0] = dec_bt_pwr_lvl;
 643
 644        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 645                "[BTCoex], decrease Bt Power Level : %u, FW write 0x62 = 0x%x\n",
 646                dec_bt_pwr_lvl, h2c_parameter[0]);
 647
 648        btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
 649}
 650
 651static void btc8821a2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
 652                                    bool force_exec, u8 dec_bt_pwr_lvl)
 653{
 654        struct rtl_priv *rtlpriv = btcoexist->adapter;
 655
 656        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 657                "[BTCoex], %s Dec BT power level = %u\n",
 658                (force_exec ? "force to" : ""), dec_bt_pwr_lvl);
 659        coex_dm->cur_dec_bt_pwr_lvl = dec_bt_pwr_lvl;
 660
 661        if (!force_exec) {
 662                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 663                        "[BTCoex], pre_dec_bt_pwr_lvl = %d, cur_dec_bt_pwr_lvl = %d\n",
 664                        coex_dm->pre_dec_bt_pwr_lvl,
 665                            coex_dm->cur_dec_bt_pwr_lvl);
 666
 667                if (coex_dm->pre_dec_bt_pwr_lvl == coex_dm->cur_dec_bt_pwr_lvl)
 668                        return;
 669        }
 670        btc8821a2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr_lvl);
 671
 672        coex_dm->pre_dec_bt_pwr_lvl = coex_dm->cur_dec_bt_pwr_lvl;
 673}
 674
 675static void btc8821a2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
 676                                          bool force_exec, u8 fw_dac_swing_lvl)
 677{
 678        struct rtl_priv *rtlpriv = btcoexist->adapter;
 679
 680        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 681                "[BTCoex], %s set FW Dac Swing level = %d\n",
 682                (force_exec ? "force to" : ""), fw_dac_swing_lvl);
 683        coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
 684
 685        if (!force_exec) {
 686                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 687                        "[BTCoex], pre_fw_dac_swing_lvl = %d, cur_fw_dac_swing_lvl = %d\n",
 688                        coex_dm->pre_fw_dac_swing_lvl,
 689                        coex_dm->cur_fw_dac_swing_lvl);
 690
 691                if (coex_dm->pre_fw_dac_swing_lvl ==
 692                    coex_dm->cur_fw_dac_swing_lvl)
 693                        return;
 694        }
 695
 696        btc8821a2ant_set_fw_dac_swing_lvl(btcoexist,
 697                                          coex_dm->cur_fw_dac_swing_lvl);
 698
 699        coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
 700}
 701
 702static void btc8821a2ant_set_sw_penalty_tx_rate_adaptive(
 703                struct btc_coexist *btcoexist, bool low_penalty_ra)
 704{
 705        struct rtl_priv *rtlpriv = btcoexist->adapter;
 706        u8 h2c_parameter[6] = {0};
 707
 708        h2c_parameter[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */
 709
 710        if (low_penalty_ra) {
 711                h2c_parameter[1] |= BIT0;
 712                /* normal rate except MCS7/6/5, OFDM54/48/36 */
 713                h2c_parameter[2] = 0x00;
 714                /* MCS7 or OFDM54 */
 715                h2c_parameter[3] = 0xf5;
 716                /* MCS6 or OFDM48 */
 717                h2c_parameter[4] = 0xa0;
 718                /* MCS5 or OFDM36 */
 719                h2c_parameter[5] = 0xa0;
 720        }
 721
 722        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 723                "[BTCoex], set WiFi Low-Penalty Retry: %s",
 724                (low_penalty_ra ? "ON!!" : "OFF!!"));
 725
 726        btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
 727}
 728
 729static void btc8821a2ant_low_penalty_ra(struct btc_coexist *btcoexist,
 730                                        bool force_exec, bool low_penalty_ra)
 731{
 732        struct rtl_priv *rtlpriv = btcoexist->adapter;
 733
 734        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 735                "[BTCoex], %s turn LowPenaltyRA = %s\n",
 736                (force_exec ? "force to" : ""),
 737                ((low_penalty_ra) ? "ON" : "OFF"));
 738        coex_dm->cur_low_penalty_ra = low_penalty_ra;
 739
 740        if (!force_exec) {
 741                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 742                        "[BTCoex], pre_low_penalty_ra = %d, cur_low_penalty_ra = %d\n",
 743                        coex_dm->pre_low_penalty_ra,
 744                        coex_dm->cur_low_penalty_ra);
 745
 746                if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
 747                        return;
 748        }
 749        btc8821a2ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
 750                                         coex_dm->cur_low_penalty_ra);
 751
 752        coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
 753}
 754
 755static void btc8821a2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
 756                                           u32 level)
 757{
 758        struct rtl_priv *rtlpriv = btcoexist->adapter;
 759        u8 val = (u8)level;
 760
 761        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 762                "[BTCoex], Write SwDacSwing = 0x%x\n", level);
 763        btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc5b, 0x3e, val);
 764}
 765
 766static void btc8821a2ant_set_sw_full_dac_swing(struct btc_coexist *btcoexist,
 767                                               bool sw_dac_swing_on,
 768                                               u32 sw_dac_swing_lvl)
 769{
 770        if (sw_dac_swing_on)
 771                btc8821a2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
 772        else
 773                btc8821a2ant_set_dac_swing_reg(btcoexist, 0x18);
 774}
 775
 776static void btc8821a2ant_dac_swing(struct btc_coexist *btcoexist,
 777                                   bool force_exec, bool dac_swing_on,
 778                                   u32 dac_swing_lvl)
 779{
 780        struct rtl_priv *rtlpriv = btcoexist->adapter;
 781
 782        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 783                "[BTCoex], %s turn DacSwing = %s, dac_swing_lvl = 0x%x\n",
 784                (force_exec ? "force to" : ""),
 785                ((dac_swing_on) ? "ON" : "OFF"),
 786                dac_swing_lvl);
 787        coex_dm->cur_dac_swing_on = dac_swing_on;
 788        coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
 789
 790        if (!force_exec) {
 791                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 792                        "[BTCoex], pre_dac_swing_on = %d, pre_dac_swing_lvl = 0x%x, cur_dac_swing_on = %d, cur_dac_swing_lvl = 0x%x\n",
 793                        coex_dm->pre_dac_swing_on,
 794                        coex_dm->pre_dac_swing_lvl,
 795                        coex_dm->cur_dac_swing_on,
 796                        coex_dm->cur_dac_swing_lvl);
 797
 798                if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
 799                    (coex_dm->pre_dac_swing_lvl ==
 800                     coex_dm->cur_dac_swing_lvl))
 801                        return;
 802        }
 803        mdelay(30);
 804        btc8821a2ant_set_sw_full_dac_swing(btcoexist, dac_swing_on,
 805                                           dac_swing_lvl);
 806
 807        coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
 808        coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
 809}
 810
 811static void btc8821a2ant_set_coex_table(struct btc_coexist *btcoexist,
 812                                        u32 val0x6c0, u32 val0x6c4,
 813                                        u32 val0x6c8, u8 val0x6cc)
 814{
 815        struct rtl_priv *rtlpriv = btcoexist->adapter;
 816
 817        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 818                "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
 819        btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
 820
 821        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 822                "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
 823        btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
 824
 825        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 826                "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
 827        btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
 828
 829        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 830                "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
 831        btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
 832}
 833
 834static void btc8821a2ant_coex_table(struct btc_coexist *btcoexist,
 835                                    bool force_exec, u32 val0x6c0,
 836                                    u32 val0x6c4, u32 val0x6c8, u8 val0x6cc)
 837{
 838        struct rtl_priv *rtlpriv = btcoexist->adapter;
 839
 840        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 841                "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
 842                (force_exec ? "force to" : ""),
 843                val0x6c0, val0x6c4, val0x6c8, val0x6cc);
 844        coex_dm->cur_val0x6c0 = val0x6c0;
 845        coex_dm->cur_val0x6c4 = val0x6c4;
 846        coex_dm->cur_val0x6c8 = val0x6c8;
 847        coex_dm->cur_val0x6cc = val0x6cc;
 848
 849        if (!force_exec) {
 850                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 851                        "[BTCoex], pre_val0x6c0 = 0x%x, pre_val0x6c4 = 0x%x, pre_val0x6c8 = 0x%x, pre_val0x6cc = 0x%x !!\n",
 852                        coex_dm->pre_val0x6c0,
 853                        coex_dm->pre_val0x6c4,
 854                        coex_dm->pre_val0x6c8,
 855                        coex_dm->pre_val0x6cc);
 856                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 857                        "[BTCoex], cur_val0x6c0 = 0x%x, cur_val0x6c4 = 0x%x, cur_val0x6c8 = 0x%x, cur_val0x6cc = 0x%x !!\n",
 858                        coex_dm->cur_val0x6c0,
 859                        coex_dm->cur_val0x6c4,
 860                        coex_dm->cur_val0x6c8,
 861                        coex_dm->cur_val0x6cc);
 862
 863                if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
 864                    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
 865                    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
 866                    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
 867                        return;
 868        }
 869        btc8821a2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
 870                                    val0x6cc);
 871
 872        coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
 873        coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
 874        coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
 875        coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
 876}
 877
 878static void btc8821a2ant_coex_table_with_type(struct btc_coexist *btcoexist,
 879                                              bool force_exec, u8 type)
 880{
 881        coex_sta->coex_table_type = type;
 882
 883        switch (type) {
 884        case 0:
 885                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,
 886                                        0x55555555, 0xffffff, 0x3);
 887                break;
 888        case 1:
 889                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,
 890                                        0x5afa5afa, 0xffffff, 0x3);
 891                break;
 892        case 2:
 893                btc8821a2ant_coex_table(btcoexist, force_exec, 0x5ada5ada,
 894                                        0x5ada5ada, 0xffffff, 0x3);
 895                break;
 896        case 3:
 897                btc8821a2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
 898                                        0xaaaaaaaa, 0xffffff, 0x3);
 899                break;
 900        case 4:
 901                btc8821a2ant_coex_table(btcoexist, force_exec, 0xffffffff,
 902                                        0xffffffff, 0xffffff, 0x3);
 903                break;
 904        case 5:
 905                btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
 906                                        0x5fff5fff, 0xffffff, 0x3);
 907                break;
 908        case 6:
 909                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
 910                                        0x5a5a5a5a, 0xffffff, 0x3);
 911                break;
 912        case 7:
 913                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 914                                        0x5ada5ada, 0xffffff, 0x3);
 915                break;
 916        case 8:
 917                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 918                                        0x5ada5ada, 0xffffff, 0x3);
 919                break;
 920        case 9:
 921                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 922                                        0x5ada5ada, 0xffffff, 0x3);
 923                break;
 924        case 10:
 925                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 926                                        0x5ada5ada, 0xffffff, 0x3);
 927                break;
 928        case 11:
 929                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 930                                        0x5ada5ada, 0xffffff, 0x3);
 931                break;
 932        case 12:
 933                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 934                                        0x5ada5ada, 0xffffff, 0x3);
 935                break;
 936        case 13:
 937                btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
 938                                        0xaaaaaaaa, 0xffffff, 0x3);
 939                break;
 940        case 14:
 941                btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
 942                                        0x5ada5ada, 0xffffff, 0x3);
 943                break;
 944        case 15:
 945                btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
 946                                        0xaaaaaaaa, 0xffffff, 0x3);
 947                break;
 948        case 16:
 949                btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fdf5fdf,
 950                                        0x5fdb5fdb, 0xffffff, 0x3);
 951                break;
 952        case 17:
 953                btc8821a2ant_coex_table(btcoexist, force_exec, 0xfafafafa,
 954                                        0xfafafafa, 0xffffff, 0x3);
 955                break;
 956        default:
 957                break;
 958        }
 959}
 960
 961static void btc8821a2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoex,
 962                                                bool enable)
 963{
 964        struct rtl_priv *rtlpriv = btcoex->adapter;
 965        u8 h2c_parameter[1] = {0};
 966
 967        if (enable)
 968                h2c_parameter[0] |= BIT0; /* function enable */
 969
 970        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 971                "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
 972                h2c_parameter[0]);
 973
 974        btcoex->btc_fill_h2c(btcoex, 0x63, 1, h2c_parameter);
 975}
 976
 977static void btc8821a2ant_set_lps_rpwm(struct btc_coexist *btcoexist, u8 lps_val,
 978                                      u8 rpwm_val)
 979{
 980        u8 lps = lps_val;
 981        u8 rpwm = rpwm_val;
 982
 983        btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
 984        btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
 985}
 986
 987static void btc8821a2ant_lps_rpwm(struct btc_coexist *btcoexist,
 988                                  bool force_exec, u8 lps_val, u8 rpwm_val)
 989{
 990        coex_dm->cur_lps = lps_val;
 991        coex_dm->cur_rpwm = rpwm_val;
 992
 993        if (!force_exec) {
 994                if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
 995                    (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
 996                        return;
 997        }
 998        btc8821a2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
 999
1000        coex_dm->pre_lps = coex_dm->cur_lps;
1001        coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1002}
1003
1004static void btc8821a2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1005                                         bool force_exec, bool enable)
1006{
1007        struct rtl_priv *rtlpriv = btcoexist->adapter;
1008
1009        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1010                "[BTCoex], %s turn Ignore WlanAct %s\n",
1011                (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1012        coex_dm->cur_ignore_wlan_act = enable;
1013
1014        if (!force_exec) {
1015                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1016                        "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
1017                        coex_dm->pre_ignore_wlan_act,
1018                         coex_dm->cur_ignore_wlan_act);
1019
1020                if (coex_dm->pre_ignore_wlan_act ==
1021                    coex_dm->cur_ignore_wlan_act)
1022                        return;
1023        }
1024        btc8821a2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1025
1026        coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1027}
1028
1029static void btc8821a2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
1030                                        u8 byte1, u8 byte2, u8 byte3,
1031                                        u8 byte4, u8 byte5)
1032{
1033        struct rtl_priv *rtlpriv = btcoexist->adapter;
1034        u8 h2c_parameter[5];
1035
1036        h2c_parameter[0] = byte1;
1037        h2c_parameter[1] = byte2;
1038        h2c_parameter[2] = byte3;
1039        h2c_parameter[3] = byte4;
1040        h2c_parameter[4] = byte5;
1041
1042        coex_dm->ps_tdma_para[0] = byte1;
1043        coex_dm->ps_tdma_para[1] = byte2;
1044        coex_dm->ps_tdma_para[2] = byte3;
1045        coex_dm->ps_tdma_para[3] = byte4;
1046        coex_dm->ps_tdma_para[4] = byte5;
1047
1048        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1049                "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1050                h2c_parameter[0],
1051                h2c_parameter[1] << 24 |
1052                h2c_parameter[2] << 16 |
1053                h2c_parameter[3] << 8 |
1054                h2c_parameter[4]);
1055
1056        btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1057}
1058
1059static void btc8821a2ant_sw_mechanism1(struct btc_coexist *btcoexist,
1060                                       bool shrink_rx_lpf, bool low_penalty_ra,
1061                                       bool limited_dig, bool bt_lna_constrain)
1062{
1063        btc8821a2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1064}
1065
1066static void btc8821a2ant_sw_mechanism2(struct btc_coexist *btcoexist,
1067                                       bool agc_table_shift, bool adc_back_off,
1068                                       bool sw_dac_swing, u32 dac_swing_lvl)
1069{
1070        btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1071                               dac_swing_lvl);
1072}
1073
1074static void btc8821a2ant_set_ant_path(struct btc_coexist *btcoexist,
1075                                      u8 ant_pos_type, bool init_hw_cfg,
1076                                      bool wifi_off)
1077{
1078        struct btc_board_info *board_info = &btcoexist->board_info;
1079        u32 u4tmp = 0;
1080        u8 h2c_parameter[2] = {0};
1081
1082        if (init_hw_cfg) {
1083                /*  0x4c[23] = 0, 0x4c[24] = 1  Antenna control by WL/BT */
1084                u4tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1085                u4tmp &= ~BIT23;
1086                u4tmp |= BIT24;
1087                btcoexist->btc_write_4byte(btcoexist, 0x4c, u4tmp);
1088
1089                btcoexist->btc_write_4byte(btcoexist, 0x974, 0x3ff);
1090
1091                if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
1092                        /* tell firmware "antenna inverse"  ==> WRONG firmware
1093                         * antenna control code ==>need fw to fix
1094                         */
1095                        h2c_parameter[0] = 1;
1096                        h2c_parameter[1] = 1;
1097                        btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1098                                                h2c_parameter);
1099                } else {
1100                        /* tell firmware "no antenna inverse" ==> WRONG firmware
1101                         * antenna control code ==>need fw to fix
1102                         */
1103                        h2c_parameter[0] = 0;
1104                        h2c_parameter[1] = 1;
1105                        btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1106                                                h2c_parameter);
1107                }
1108        }
1109
1110        /* ext switch setting */
1111        switch (ant_pos_type) {
1112        case BTC_ANT_WIFI_AT_MAIN:
1113                btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);
1114                break;
1115        case BTC_ANT_WIFI_AT_AUX:
1116                btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);
1117                break;
1118        }
1119}
1120
1121static void btc8821a2ant_ps_tdma(struct btc_coexist *btcoexist,
1122                                 bool force_exec, bool turn_on, u8 type)
1123{
1124        struct rtl_priv *rtlpriv = btcoexist->adapter;
1125
1126        u8 wifi_rssi_state, bt_rssi_state;
1127
1128        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1129                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1130        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2,
1131                                BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1132
1133        if (!(BTC_RSSI_HIGH(wifi_rssi_state) &&
1134              BTC_RSSI_HIGH(bt_rssi_state)) &&
1135            turn_on) {
1136                /* for WiFi RSSI low or BT RSSI low */
1137                type = type + 100;
1138        }
1139
1140        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1141                "[BTCoex], %s turn %s PS TDMA, type = %d\n",
1142                (force_exec ? "force to" : ""), (turn_on ? "ON" : "OFF"),
1143                type);
1144        coex_dm->cur_ps_tdma_on = turn_on;
1145        coex_dm->cur_ps_tdma = type;
1146
1147        if (!force_exec) {
1148                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1149                        "[BTCoex], pre_ps_tdma_on = %d, cur_ps_tdma_on = %d!!\n",
1150                        coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1151                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1152                        "[BTCoex], pre_ps_tdma = %d, cur_ps_tdma = %d!!\n",
1153                        coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1154
1155                if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1156                    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1157                        return;
1158        }
1159        if (turn_on) {
1160                switch (type) {
1161                case 1:
1162                default:
1163                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1164                                                    0x03, 0xf1, 0x90);
1165                        break;
1166                case 2:
1167                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1168                                                    0x03, 0xf1, 0x90);
1169                        break;
1170                case 3:
1171                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1172                                                    0x3, 0xf1, 0x90);
1173                        break;
1174                case 4:
1175                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1176                                                    0x03, 0xf1, 0x90);
1177                        break;
1178                case 5:
1179                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1180                                                    0x3, 0x70, 0x90);
1181                        break;
1182                case 6:
1183                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1184                                                    0x3, 0x70, 0x90);
1185                        break;
1186                case 7:
1187                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1188                                                    0x3, 0x70, 0x90);
1189                        break;
1190                case 8:
1191                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
1192                                                    0x3, 0x70, 0x90);
1193                        break;
1194                case 9:
1195                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1196                                                    0x03, 0xf1, 0x90);
1197                        break;
1198                case 10:
1199                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1200                                                    0x03, 0xf1, 0x90);
1201                        break;
1202                case 11:
1203                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1204                                                    0x3, 0xf1, 0x90);
1205                        break;
1206                case 12:
1207                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1208                                                    0x3, 0xf1, 0x90);
1209                        break;
1210                case 13:
1211                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1212                                                    0x3, 0x70, 0x90);
1213                        break;
1214                case 14:
1215                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1216                                                    0x3, 0x70, 0x90);
1217                        break;
1218                case 15:
1219                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1220                                                    0x3, 0x70, 0x90);
1221                        break;
1222                case 16:
1223                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1224                                                    0x3, 0x70, 0x90);
1225                        break;
1226                case 17:
1227                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
1228                                                    0x2f, 0x60, 0x90);
1229                        break;
1230                case 18:
1231                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 0x5,
1232                                                    0xe1, 0x90);
1233                        break;
1234                case 19:
1235                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1236                                                    0x25, 0xe1, 0x90);
1237                        break;
1238                case 20:
1239                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1240                                                    0x25, 0x60, 0x90);
1241                        break;
1242                case 21:
1243                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1244                                                    0x03, 0x70, 0x90);
1245                        break;
1246                case 23:
1247                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1e,
1248                                                    0x03, 0xf0, 0x14);
1249                        break;
1250                case 24:
1251                case 124:
1252                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3c,
1253                                                    0x03, 0x70, 0x50);
1254                        break;
1255                case 25:
1256                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x14,
1257                                                    0x03, 0xf1, 0x90);
1258                        break;
1259                case 26:
1260                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x30,
1261                                                    0x03, 0xf1, 0x90);
1262                        break;
1263                case 71:
1264                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1265                                                    0x03, 0xf1, 0x90);
1266                        break;
1267                case 101:
1268                case 105:
1269                case 171:
1270                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3a,
1271                                                    0x03, 0x70, 0x50);
1272                        break;
1273                case 102:
1274                case 106:
1275                case 110:
1276                case 114:
1277                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x2d,
1278                                                    0x03, 0x70, 0x50);
1279                        break;
1280                case 103:
1281                case 107:
1282                case 111:
1283                case 115:
1284                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1285                                                    0x03, 0x70, 0x50);
1286                        break;
1287                case 104:
1288                case 108:
1289                case 112:
1290                case 116:
1291                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x10,
1292                                                    0x03, 0x70, 0x50);
1293                        break;
1294                case 109:
1295                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1296                                                    0x03, 0xf1, 0x90);
1297                        break;
1298                case 113:
1299                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1300                                                    0x03, 0x70, 0x90);
1301                        break;
1302                case 121:
1303                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1304                                                    0x03, 0x70, 0x90);
1305                        break;
1306                case 22:
1307                case 122:
1308                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1309                                                    0x03, 0x71, 0x11);
1310                        break;
1311                case 123:
1312                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1313                                                    0x03, 0x70, 0x54);
1314                        break;
1315                case 125:
1316                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x14,
1317                                                    0x03, 0x70, 0x50);
1318                        break;
1319                case 126:
1320                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x30,
1321                                                    0x03, 0x70, 0x50);
1322                        break;
1323                }
1324        } else {
1325                /* disable PS tdma */
1326                switch (type) {
1327                case 0:
1328                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1329                                                    0x40, 0x0);
1330                        break;
1331                case 1:
1332                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1333                                                    0x48, 0x0);
1334                        break;
1335                default:
1336                        btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1337                                                    0x40, 0x0);
1338                        break;
1339                }
1340        }
1341
1342        /* update pre state */
1343        coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1344        coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1345}
1346
1347static void
1348btc8821a2ant_ps_tdma_check_for_power_save_state(struct btc_coexist *btcoexist,
1349                                                bool new_ps_state)
1350{
1351        u8 lps_mode = 0x0;
1352
1353        btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1354
1355        if (lps_mode) {
1356                /* already under LPS state */
1357                if (new_ps_state) {
1358                        /* keep state under LPS, do nothing */
1359                } else {
1360                        /* will leave LPS state, turn off psTdma first */
1361                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1362                }
1363        } else {
1364                /* NO PS state */
1365                if (new_ps_state) {
1366                        /* will enter LPS state, turn off psTdma first */
1367                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1368                } else {
1369                        /* keep state under NO PS state, do nothing */
1370                }
1371        }
1372}
1373
1374static void btc8821a2ant_power_save_state(struct btc_coexist *btcoexist,
1375                                          u8 ps_type, u8 lps_val, u8 rpwm_val)
1376{
1377        bool low_pwr_disable = false;
1378
1379        switch (ps_type) {
1380        case BTC_PS_WIFI_NATIVE:
1381                /* recover to original 32k low power setting */
1382                low_pwr_disable = false;
1383                btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1384                                   &low_pwr_disable);
1385                btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1386                coex_sta->force_lps_on = false;
1387                break;
1388        case BTC_PS_LPS_ON:
1389                btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,
1390                                                                true);
1391                btc8821a2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1392                                      rpwm_val);
1393                /* when coex force to enter LPS, do not enter 32k low power */
1394                low_pwr_disable = true;
1395                btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1396                                   &low_pwr_disable);
1397                /* power save must executed before psTdma */
1398                btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1399                coex_sta->force_lps_on = true;
1400                break;
1401        case BTC_PS_LPS_OFF:
1402                btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,
1403                                                                false);
1404                btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1405                coex_sta->force_lps_on = false;
1406                break;
1407        default:
1408                break;
1409        }
1410}
1411
1412static void btc8821a2ant_coex_all_off(struct btc_coexist *btcoexist)
1413{
1414        /* fw all off */
1415        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1416        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1417        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1418        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1419
1420        /* sw all off */
1421        btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1422        btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1423
1424        /* hw all off */
1425        btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1426}
1427
1428static void btc8821a2ant_coex_under_5g(struct btc_coexist *btcoexist)
1429{
1430        btc8821a2ant_coex_all_off(btcoexist);
1431        btc8821a2ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1432}
1433
1434static void btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)
1435{
1436        /* force to reset coex mechanism */
1437        btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1438
1439        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1440        btc8821a2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1441        btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1442        btc8821a2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1443
1444        btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1445        btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1446}
1447
1448static void btc8821a2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1449{
1450        struct rtl_priv *rtlpriv = btcoexist->adapter;
1451        bool wifi_connected = false;
1452        bool low_pwr_disable = true;
1453        bool scan = false, link = false, roam = false;
1454
1455        btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1456        btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1457                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1458        btc8821a2ant_bt_rssi_state(btcoexist,
1459                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1460
1461        btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1462                           &low_pwr_disable);
1463        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1464                           &wifi_connected);
1465
1466        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1467        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1468        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1469
1470        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1471
1472        if (scan || link || roam) {
1473                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1474                        "[BTCoex], Wifi link process + BT Inq/Page!!\n");
1475                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1476                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1477        } else if (wifi_connected) {
1478                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1479                        "[BTCoex], Wifi connected + BT Inq/Page!!\n");
1480                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1481                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1482        } else {
1483                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1484                        "[BTCoex], Wifi no-link + BT Inq/Page!!\n");
1485                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1486                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1487        }
1488
1489        btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1490        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1491
1492        btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1493        btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1494}
1495
1496static void btc8821a2ant_action_wifi_link_process(struct btc_coexist *btcoexist)
1497{
1498        struct rtl_priv *rtlpriv = btcoexist->adapter;
1499        u8 u8tmpa, u8tmpb;
1500
1501        btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1502        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1503
1504        btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1505        btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1506
1507        u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
1508        u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
1509
1510        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1511                "[BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa, u8tmpb);
1512}
1513
1514static bool btc8821a2ant_action_wifi_idle_process(struct btc_coexist *btcoexist)
1515{
1516        struct rtl_priv *rtlpriv = btcoexist->adapter;
1517        u8 wifi_rssi_state1;
1518        u8 ap_num = 0;
1519
1520        btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1521        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1522                        BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES - 20, 0);
1523        btc8821a2ant_bt_rssi_state(btcoexist,
1524                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1525
1526        btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
1527
1528        /* define the office environment */
1529        if (BTC_RSSI_HIGH(wifi_rssi_state1) && (coex_sta->hid_exist) &&
1530            (coex_sta->a2dp_exist)) {
1531                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1532                        "[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\n");
1533
1534                btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1535                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1536
1537                /* sw all off */
1538                btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1539                                           false);
1540                btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1541                                           0x18);
1542
1543                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1544                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1545                                              0x0, 0x0);
1546                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1547
1548                return true;
1549        } else if (coex_sta->pan_exist) {
1550                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1551                        "[BTCoex], Wifi  idle process for BT PAN exist!!\n");
1552
1553                btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1554                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1555
1556                /* sw all off */
1557                btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1558                                           false);
1559                btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1560                                           0x18);
1561
1562                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1563                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1564                                              0x0, 0x0);
1565                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1566
1567                return true;
1568        }
1569        btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);
1570        return false;
1571}
1572
1573static bool btc8821a2ant_is_common_action(struct btc_coexist *btcoexist)
1574{
1575        struct rtl_priv *rtlpriv = btcoexist->adapter;
1576        bool common = false, wifi_connected = false, wifi_busy = false;
1577        bool low_pwr_disable = false;
1578        bool bt_hs_on = false;
1579
1580        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1581        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1582                           &wifi_connected);
1583        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1584
1585        if (!wifi_connected) {
1586                low_pwr_disable = false;
1587                btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1588                                   &low_pwr_disable);
1589                btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
1590                                        0x8);
1591
1592                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1593                        "[BTCoex], Wifi non-connected idle!!\n");
1594
1595                btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
1596                                          0x0);
1597                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1598                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1599                                              0x0, 0x0);
1600                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1601                btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1602                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1603
1604                btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1605                                           false);
1606                btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1607                                           0x18);
1608
1609                common = true;
1610        } else {
1611                if (BT_8821A_2ANT_BT_STATUS_IDLE ==
1612                    coex_dm->bt_status) {
1613                        low_pwr_disable = false;
1614                        btcoexist->btc_set(btcoexist,
1615                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1616                                           &low_pwr_disable);
1617                        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1618                                                false, false, 0x8);
1619
1620                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1621                                "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1622
1623                        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1624                                                  0xfffff, 0x0);
1625                        btc8821a2ant_coex_table_with_type(btcoexist,
1626                                                          NORMAL_EXEC, 0);
1627
1628                        btc8821a2ant_power_save_state(
1629                                btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1630                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1631                        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1632                                                      0xb);
1633                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1634
1635                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
1636                                                   false, false);
1637                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
1638                                                   false, 0x18);
1639
1640                        common = true;
1641                } else if (BT_8821A_2ANT_BT_STATUS_CON_IDLE ==
1642                           coex_dm->bt_status) {
1643                        low_pwr_disable = true;
1644                        btcoexist->btc_set(btcoexist,
1645                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1646                                           &low_pwr_disable);
1647
1648                        if (bt_hs_on)
1649                                return false;
1650                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1651                                "[BTCoex], Wifi connected + BT connected-idle!!\n");
1652                        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1653                                                false, false, 0x8);
1654
1655                        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1656                                                  0xfffff, 0x0);
1657                        btc8821a2ant_coex_table_with_type(btcoexist,
1658                                                          NORMAL_EXEC, 0);
1659
1660                        btc8821a2ant_power_save_state(
1661                                btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1662                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1663                        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1664                                                      0xb);
1665                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1666
1667                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
1668                                                   false, false);
1669                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
1670                                                   false, 0x18);
1671                        common = true;
1672                } else {
1673                        low_pwr_disable = true;
1674                        btcoexist->btc_set(btcoexist,
1675                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1676                                           &low_pwr_disable);
1677
1678                        if (wifi_busy) {
1679                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1680                                        "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1681                                common = false;
1682                        } else {
1683                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1684                                        "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1685                                common =
1686                                    btc8821a2ant_action_wifi_idle_process(
1687                                             btcoexist);
1688                        }
1689                }
1690        }
1691        return common;
1692}
1693
1694static void btc8821a2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
1695                                              bool sco_hid, bool tx_pause,
1696                                              u8 max_interval)
1697{
1698        struct rtl_priv *rtlpriv = btcoexist->adapter;
1699        static long up, dn, m, n, wait_count;
1700         /* 0 : no change
1701          * +1: increase WiFi duration
1702          * -1: decrease WiFi duration
1703          */
1704        int result;
1705        u8 retry_count = 0;
1706
1707        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1708                "[BTCoex], TdmaDurationAdjust()\n");
1709
1710        if (coex_dm->auto_tdma_adjust) {
1711                coex_dm->auto_tdma_adjust = false;
1712                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1713                        "[BTCoex], first run TdmaDurationAdjust()!!\n");
1714                if (sco_hid) {
1715                        if (tx_pause) {
1716                                if (max_interval == 1) {
1717                                        btc8821a2ant_ps_tdma(btcoexist,
1718                                                        NORMAL_EXEC, true, 13);
1719                                        coex_dm->ps_tdma_du_adj_type = 13;
1720                                } else if (max_interval == 2) {
1721                                        btc8821a2ant_ps_tdma(btcoexist,
1722                                                        NORMAL_EXEC, true, 14);
1723                                        coex_dm->ps_tdma_du_adj_type = 14;
1724                                } else {
1725                                        btc8821a2ant_ps_tdma(btcoexist,
1726                                                        NORMAL_EXEC, true, 15);
1727                                        coex_dm->ps_tdma_du_adj_type = 15;
1728                                }
1729                        } else {
1730                                if (max_interval == 1) {
1731                                        btc8821a2ant_ps_tdma(btcoexist,
1732                                                        NORMAL_EXEC, true, 9);
1733                                        coex_dm->ps_tdma_du_adj_type = 9;
1734                                } else if (max_interval == 2) {
1735                                        btc8821a2ant_ps_tdma(btcoexist,
1736                                                        NORMAL_EXEC, true, 10);
1737                                        coex_dm->ps_tdma_du_adj_type = 10;
1738                                } else {
1739                                        btc8821a2ant_ps_tdma(btcoexist,
1740                                                        NORMAL_EXEC, true, 11);
1741                                        coex_dm->ps_tdma_du_adj_type = 11;
1742                                }
1743                        }
1744                } else {
1745                        if (tx_pause) {
1746                                if (max_interval == 1) {
1747                                        btc8821a2ant_ps_tdma(btcoexist,
1748                                                        NORMAL_EXEC, true, 5);
1749                                        coex_dm->ps_tdma_du_adj_type = 5;
1750                                } else if (max_interval == 2) {
1751                                        btc8821a2ant_ps_tdma(btcoexist,
1752                                                        NORMAL_EXEC, true, 6);
1753                                        coex_dm->ps_tdma_du_adj_type = 6;
1754                                } else {
1755                                        btc8821a2ant_ps_tdma(btcoexist,
1756                                                        NORMAL_EXEC, true, 7);
1757                                        coex_dm->ps_tdma_du_adj_type = 7;
1758                                }
1759                        } else {
1760                                if (max_interval == 1) {
1761                                        btc8821a2ant_ps_tdma(btcoexist,
1762                                                        NORMAL_EXEC, true, 1);
1763                                        coex_dm->ps_tdma_du_adj_type = 1;
1764                                } else if (max_interval == 2) {
1765                                        btc8821a2ant_ps_tdma(btcoexist,
1766                                                        NORMAL_EXEC, true, 2);
1767                                        coex_dm->ps_tdma_du_adj_type = 2;
1768                                } else {
1769                                        btc8821a2ant_ps_tdma(btcoexist,
1770                                                        NORMAL_EXEC, true, 3);
1771                                        coex_dm->ps_tdma_du_adj_type = 3;
1772                                }
1773                        }
1774                }
1775
1776                up = 0;
1777                dn = 0;
1778                m = 1;
1779                n = 3;
1780                result = 0;
1781                wait_count = 0;
1782        } else {
1783                /* accquire the BT TRx retry count from BT_Info byte2 */
1784                retry_count = coex_sta->bt_retry_cnt;
1785                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1786                        "[BTCoex], retry_count = %d\n", retry_count);
1787                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1788                        "[BTCoex], up = %d, dn = %d, m = %d, n = %d, wait_count = %d\n",
1789                        (int)up, (int)dn, (int)m, (int)n, (int)wait_count);
1790                result = 0;
1791                wait_count++;
1792
1793                if (retry_count == 0) {
1794                        /* no retry in the last 2-second duration */
1795                        up++;
1796                        dn--;
1797
1798                        if (dn <= 0)
1799                                dn = 0;
1800
1801                        if (up >= n) {
1802                                /* if (retry count == 0) for 2*n seconds,
1803                                 * make WiFi duration wider
1804                                 */
1805                                wait_count = 0;
1806                                n = 3;
1807                                up = 0;
1808                                dn = 0;
1809                                result = 1;
1810                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1811                                        "[BTCoex], Increase wifi duration!!\n");
1812                        }
1813                } else if (retry_count <= 3) {
1814                        /* <=3 retry in the last 2-second duration */
1815                        up--;
1816                        dn++;
1817
1818                        if (up <= 0)
1819                                up = 0;
1820
1821                        if (dn == 2) {
1822                                /* if retry count < 3 for 2*2 seconds,
1823                                 * shrink wifi duration
1824                                 */
1825                                if (wait_count <= 2)
1826                                        m++; /* avoid bounce in two levels */
1827                                else
1828                                        m = 1;
1829                                /* m max value is 20, max time is 120 second,
1830                                 * recheck if adjust WiFi duration.
1831                                 */
1832                                if (m >= 20)
1833                                        m = 20;
1834
1835                                n = 3 * m;
1836                                up = 0;
1837                                dn = 0;
1838                                wait_count = 0;
1839                                result = -1;
1840                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1841                                        "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1842                        }
1843                } else {
1844                        /* retry count > 3, if retry count > 3 happens once,
1845                         * shrink WiFi duration
1846                         */
1847                        if (wait_count == 1)
1848                                m++; /* avoid bounce in two levels */
1849                        else
1850                                m = 1;
1851                        /* m max value is 20, max time is 120 second,
1852                         * recheck if adjust WiFi duration.
1853                         */
1854                        if (m >= 20)
1855                                m = 20;
1856
1857                        n = 3 * m;
1858                        up = 0;
1859                        dn = 0;
1860                        wait_count = 0;
1861                        result = -1;
1862                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1863                                "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1864                }
1865
1866                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1867                        "[BTCoex], max Interval = %d\n", max_interval);
1868
1869                if (max_interval == 1) {
1870                        if (tx_pause) {
1871                                if (coex_dm->cur_ps_tdma == 71) {
1872                                        btc8821a2ant_ps_tdma(btcoexist,
1873                                                        NORMAL_EXEC, true, 5);
1874                                        coex_dm->ps_tdma_du_adj_type = 5;
1875                                } else if (coex_dm->cur_ps_tdma == 1) {
1876                                        btc8821a2ant_ps_tdma(btcoexist,
1877                                                        NORMAL_EXEC, true, 5);
1878                                        coex_dm->ps_tdma_du_adj_type = 5;
1879                                } else if (coex_dm->cur_ps_tdma == 2) {
1880                                        btc8821a2ant_ps_tdma(btcoexist,
1881                                                        NORMAL_EXEC, true, 6);
1882                                        coex_dm->ps_tdma_du_adj_type = 6;
1883                                } else if (coex_dm->cur_ps_tdma == 3) {
1884                                        btc8821a2ant_ps_tdma(btcoexist,
1885                                                        NORMAL_EXEC, true, 7);
1886                                        coex_dm->ps_tdma_du_adj_type = 7;
1887                                } else if (coex_dm->cur_ps_tdma == 4) {
1888                                        btc8821a2ant_ps_tdma(btcoexist,
1889                                                        NORMAL_EXEC, true, 8);
1890                                        coex_dm->ps_tdma_du_adj_type = 8;
1891                                }
1892                                if (coex_dm->cur_ps_tdma == 9) {
1893                                        btc8821a2ant_ps_tdma(btcoexist,
1894                                                        NORMAL_EXEC, true, 13);
1895                                        coex_dm->ps_tdma_du_adj_type = 13;
1896                                } else if (coex_dm->cur_ps_tdma == 10) {
1897                                        btc8821a2ant_ps_tdma(btcoexist,
1898                                                        NORMAL_EXEC, true, 14);
1899                                        coex_dm->ps_tdma_du_adj_type = 14;
1900                                } else if (coex_dm->cur_ps_tdma == 11) {
1901                                        btc8821a2ant_ps_tdma(btcoexist,
1902                                                        NORMAL_EXEC, true, 15);
1903                                        coex_dm->ps_tdma_du_adj_type = 15;
1904                                } else if (coex_dm->cur_ps_tdma == 12) {
1905                                        btc8821a2ant_ps_tdma(btcoexist,
1906                                                        NORMAL_EXEC, true, 16);
1907                                        coex_dm->ps_tdma_du_adj_type = 16;
1908                                }
1909
1910                                if (result == -1) {
1911                                        if (coex_dm->cur_ps_tdma == 5) {
1912                                                btc8821a2ant_ps_tdma(
1913                                                        btcoexist, NORMAL_EXEC,
1914                                                        true, 6);
1915                                                coex_dm->ps_tdma_du_adj_type =
1916                                                        6;
1917                                        } else if (coex_dm->cur_ps_tdma == 6) {
1918                                                btc8821a2ant_ps_tdma(
1919                                                        btcoexist, NORMAL_EXEC,
1920                                                        true, 7);
1921                                                coex_dm->ps_tdma_du_adj_type =
1922                                                        7;
1923                                        } else if (coex_dm->cur_ps_tdma == 7) {
1924                                                btc8821a2ant_ps_tdma(
1925                                                        btcoexist, NORMAL_EXEC,
1926                                                        true, 8);
1927                                                coex_dm->ps_tdma_du_adj_type =
1928                                                        8;
1929                                        } else if (coex_dm->cur_ps_tdma == 13) {
1930                                                btc8821a2ant_ps_tdma(
1931                                                        btcoexist, NORMAL_EXEC,
1932                                                        true, 14);
1933                                                coex_dm->ps_tdma_du_adj_type =
1934                                                        14;
1935                                        } else if (coex_dm->cur_ps_tdma == 14) {
1936                                                btc8821a2ant_ps_tdma(
1937                                                        btcoexist, NORMAL_EXEC,
1938                                                        true, 15);
1939                                                coex_dm->ps_tdma_du_adj_type =
1940                                                        15;
1941                                        } else if (coex_dm->cur_ps_tdma == 15) {
1942                                                btc8821a2ant_ps_tdma(
1943                                                        btcoexist, NORMAL_EXEC,
1944                                                        true, 16);
1945                                                coex_dm->ps_tdma_du_adj_type =
1946                                                        16;
1947                                        }
1948                                } else if (result == 1) {
1949                                        if (coex_dm->cur_ps_tdma == 8) {
1950                                                btc8821a2ant_ps_tdma(
1951                                                        btcoexist, NORMAL_EXEC,
1952                                                        true, 7);
1953                                                coex_dm->ps_tdma_du_adj_type =
1954                                                        7;
1955                                        } else if (coex_dm->cur_ps_tdma == 7) {
1956                                                btc8821a2ant_ps_tdma(
1957                                                        btcoexist, NORMAL_EXEC,
1958                                                        true, 6);
1959                                                coex_dm->ps_tdma_du_adj_type =
1960                                                        6;
1961                                        } else if (coex_dm->cur_ps_tdma == 6) {
1962                                                btc8821a2ant_ps_tdma(
1963                                                        btcoexist, NORMAL_EXEC,
1964                                                        true, 5);
1965                                                coex_dm->ps_tdma_du_adj_type =
1966                                                        5;
1967                                        } else if (coex_dm->cur_ps_tdma == 16) {
1968                                                btc8821a2ant_ps_tdma(
1969                                                        btcoexist, NORMAL_EXEC,
1970                                                        true, 15);
1971                                                coex_dm->ps_tdma_du_adj_type =
1972                                                        15;
1973                                        } else if (coex_dm->cur_ps_tdma == 15) {
1974                                                btc8821a2ant_ps_tdma(
1975                                                        btcoexist, NORMAL_EXEC,
1976                                                        true, 14);
1977                                                coex_dm->ps_tdma_du_adj_type =
1978                                                        14;
1979                                        } else if (coex_dm->cur_ps_tdma == 14) {
1980                                                btc8821a2ant_ps_tdma(
1981                                                        btcoexist, NORMAL_EXEC,
1982                                                        true, 13);
1983                                                coex_dm->ps_tdma_du_adj_type =
1984                                                        13;
1985                                        }
1986                                }
1987                        } else {
1988                                if (coex_dm->cur_ps_tdma == 5) {
1989                                        btc8821a2ant_ps_tdma(btcoexist,
1990                                                        NORMAL_EXEC, true, 71);
1991                                        coex_dm->ps_tdma_du_adj_type = 71;
1992                                } else if (coex_dm->cur_ps_tdma == 6) {
1993                                        btc8821a2ant_ps_tdma(btcoexist,
1994                                                        NORMAL_EXEC, true, 2);
1995                                        coex_dm->ps_tdma_du_adj_type = 2;
1996                                } else if (coex_dm->cur_ps_tdma == 7) {
1997                                        btc8821a2ant_ps_tdma(btcoexist,
1998                                                        NORMAL_EXEC, true, 3);
1999                                        coex_dm->ps_tdma_du_adj_type = 3;
2000                                } else if (coex_dm->cur_ps_tdma == 8) {
2001                                        btc8821a2ant_ps_tdma(btcoexist,
2002                                                        NORMAL_EXEC, true, 4);
2003                                        coex_dm->ps_tdma_du_adj_type = 4;
2004                                }
2005                                if (coex_dm->cur_ps_tdma == 13) {
2006                                        btc8821a2ant_ps_tdma(btcoexist,
2007                                                        NORMAL_EXEC, true, 9);
2008                                        coex_dm->ps_tdma_du_adj_type = 9;
2009                                } else if (coex_dm->cur_ps_tdma == 14) {
2010                                        btc8821a2ant_ps_tdma(btcoexist,
2011                                                        NORMAL_EXEC, true, 10);
2012                                        coex_dm->ps_tdma_du_adj_type = 10;
2013                                } else if (coex_dm->cur_ps_tdma == 15) {
2014                                        btc8821a2ant_ps_tdma(btcoexist,
2015                                                        NORMAL_EXEC, true, 11);
2016                                        coex_dm->ps_tdma_du_adj_type = 11;
2017                                } else if (coex_dm->cur_ps_tdma == 16) {
2018                                        btc8821a2ant_ps_tdma(btcoexist,
2019                                                        NORMAL_EXEC, true, 12);
2020                                        coex_dm->ps_tdma_du_adj_type = 12;
2021                                }
2022
2023                                if (result == -1) {
2024                                        if (coex_dm->cur_ps_tdma == 71) {
2025                                                btc8821a2ant_ps_tdma(
2026                                                        btcoexist, NORMAL_EXEC,
2027                                                        true, 1);
2028                                                coex_dm->ps_tdma_du_adj_type =
2029                                                        1;
2030                                        } else if (coex_dm->cur_ps_tdma == 1) {
2031                                                btc8821a2ant_ps_tdma(
2032                                                        btcoexist, NORMAL_EXEC,
2033                                                        true, 2);
2034                                                coex_dm->ps_tdma_du_adj_type =
2035                                                        2;
2036                                        } else if (coex_dm->cur_ps_tdma == 2) {
2037                                                btc8821a2ant_ps_tdma(
2038                                                        btcoexist, NORMAL_EXEC,
2039                                                        true, 3);
2040                                                coex_dm->ps_tdma_du_adj_type =
2041                                                        3;
2042                                        } else if (coex_dm->cur_ps_tdma == 3) {
2043                                                btc8821a2ant_ps_tdma(
2044                                                        btcoexist, NORMAL_EXEC,
2045                                                        true, 4);
2046                                                coex_dm->ps_tdma_du_adj_type =
2047                                                        4;
2048                                        } else if (coex_dm->cur_ps_tdma == 9) {
2049                                                btc8821a2ant_ps_tdma(
2050                                                        btcoexist, NORMAL_EXEC,
2051                                                        true, 10);
2052                                                coex_dm->ps_tdma_du_adj_type =
2053                                                        10;
2054                                        } else if (coex_dm->cur_ps_tdma == 10) {
2055                                                btc8821a2ant_ps_tdma(
2056                                                        btcoexist, NORMAL_EXEC,
2057                                                        true, 11);
2058                                                coex_dm->ps_tdma_du_adj_type =
2059                                                        11;
2060                                        } else if (coex_dm->cur_ps_tdma == 11) {
2061                                                btc8821a2ant_ps_tdma(
2062                                                        btcoexist, NORMAL_EXEC,
2063                                                        true, 12);
2064                                                coex_dm->ps_tdma_du_adj_type =
2065                                                        12;
2066                                        }
2067                                } else if (result == 1) {
2068                                        if (coex_dm->cur_ps_tdma == 4) {
2069                                                btc8821a2ant_ps_tdma(
2070                                                        btcoexist, NORMAL_EXEC,
2071                                                        true, 3);
2072                                                coex_dm->ps_tdma_du_adj_type =
2073                                                        3;
2074                                        } else if (coex_dm->cur_ps_tdma == 3) {
2075                                                btc8821a2ant_ps_tdma(
2076                                                        btcoexist, NORMAL_EXEC,
2077                                                        true, 2);
2078                                                coex_dm->ps_tdma_du_adj_type =
2079                                                        2;
2080                                        } else if (coex_dm->cur_ps_tdma == 2) {
2081                                                btc8821a2ant_ps_tdma(
2082                                                        btcoexist, NORMAL_EXEC,
2083                                                        true, 1);
2084                                                coex_dm->ps_tdma_du_adj_type =
2085                                                        1;
2086                                        } else if (coex_dm->cur_ps_tdma == 1) {
2087                                                btc8821a2ant_ps_tdma(
2088                                                        btcoexist, NORMAL_EXEC,
2089                                                        true, 71);
2090                                                coex_dm->ps_tdma_du_adj_type =
2091                                                        71;
2092                                        } else if (coex_dm->cur_ps_tdma == 12) {
2093                                                btc8821a2ant_ps_tdma(
2094                                                        btcoexist, NORMAL_EXEC,
2095                                                        true, 11);
2096                                                coex_dm->ps_tdma_du_adj_type =
2097                                                        11;
2098                                        } else if (coex_dm->cur_ps_tdma == 11) {
2099                                                btc8821a2ant_ps_tdma(
2100                                                        btcoexist, NORMAL_EXEC,
2101                                                        true, 10);
2102                                                coex_dm->ps_tdma_du_adj_type =
2103                                                        10;
2104                                        } else if (coex_dm->cur_ps_tdma == 10) {
2105                                                btc8821a2ant_ps_tdma(
2106                                                        btcoexist, NORMAL_EXEC,
2107                                                        true, 9);
2108                                                coex_dm->ps_tdma_du_adj_type =
2109                                                        9;
2110                                        }
2111                                }
2112                        }
2113                } else if (max_interval == 2) {
2114                        if (tx_pause) {
2115                                if (coex_dm->cur_ps_tdma == 1) {
2116                                        btc8821a2ant_ps_tdma(btcoexist,
2117                                                        NORMAL_EXEC, true, 6);
2118                                        coex_dm->ps_tdma_du_adj_type = 6;
2119                                } else if (coex_dm->cur_ps_tdma == 2) {
2120                                        btc8821a2ant_ps_tdma(btcoexist,
2121                                                        NORMAL_EXEC, true, 6);
2122                                        coex_dm->ps_tdma_du_adj_type = 6;
2123                                } else if (coex_dm->cur_ps_tdma == 3) {
2124                                        btc8821a2ant_ps_tdma(btcoexist,
2125                                                        NORMAL_EXEC, true, 7);
2126                                        coex_dm->ps_tdma_du_adj_type = 7;
2127                                } else if (coex_dm->cur_ps_tdma == 4) {
2128                                        btc8821a2ant_ps_tdma(btcoexist,
2129                                                        NORMAL_EXEC, true, 8);
2130                                        coex_dm->ps_tdma_du_adj_type = 8;
2131                                }
2132                                if (coex_dm->cur_ps_tdma == 9) {
2133                                        btc8821a2ant_ps_tdma(btcoexist,
2134                                                        NORMAL_EXEC, true, 14);
2135                                        coex_dm->ps_tdma_du_adj_type = 14;
2136                                } else if (coex_dm->cur_ps_tdma == 10) {
2137                                        btc8821a2ant_ps_tdma(btcoexist,
2138                                                        NORMAL_EXEC, true, 14);
2139                                        coex_dm->ps_tdma_du_adj_type = 14;
2140                                } else if (coex_dm->cur_ps_tdma == 11) {
2141                                        btc8821a2ant_ps_tdma(btcoexist,
2142                                                        NORMAL_EXEC, true, 15);
2143                                        coex_dm->ps_tdma_du_adj_type = 15;
2144                                } else if (coex_dm->cur_ps_tdma == 12) {
2145                                        btc8821a2ant_ps_tdma(btcoexist,
2146                                                        NORMAL_EXEC, true, 16);
2147                                        coex_dm->ps_tdma_du_adj_type = 16;
2148                                }
2149                                if (result == -1) {
2150                                        if (coex_dm->cur_ps_tdma == 5) {
2151                                                btc8821a2ant_ps_tdma(
2152                                                        btcoexist, NORMAL_EXEC,
2153                                                        true, 6);
2154                                                coex_dm->ps_tdma_du_adj_type =
2155                                                        6;
2156                                        } else if (coex_dm->cur_ps_tdma == 6) {
2157                                                btc8821a2ant_ps_tdma(
2158                                                        btcoexist, NORMAL_EXEC,
2159                                                        true, 7);
2160                                                coex_dm->ps_tdma_du_adj_type =
2161                                                        7;
2162                                        } else if (coex_dm->cur_ps_tdma == 7) {
2163                                                btc8821a2ant_ps_tdma(
2164                                                        btcoexist, NORMAL_EXEC,
2165                                                        true, 8);
2166                                                coex_dm->ps_tdma_du_adj_type =
2167                                                        8;
2168                                        } else if (coex_dm->cur_ps_tdma == 13) {
2169                                                btc8821a2ant_ps_tdma(
2170                                                        btcoexist, NORMAL_EXEC,
2171                                                        true, 14);
2172                                                coex_dm->ps_tdma_du_adj_type =
2173                                                        14;
2174                                        } else if (coex_dm->cur_ps_tdma == 14) {
2175                                                btc8821a2ant_ps_tdma(
2176                                                        btcoexist, NORMAL_EXEC,
2177                                                        true, 15);
2178                                                coex_dm->ps_tdma_du_adj_type =
2179                                                        15;
2180                                        } else if (coex_dm->cur_ps_tdma == 15) {
2181                                                btc8821a2ant_ps_tdma(
2182                                                        btcoexist, NORMAL_EXEC,
2183                                                        true, 16);
2184                                                coex_dm->ps_tdma_du_adj_type =
2185                                                        16;
2186                                        }
2187                                } else if (result == 1) {
2188                                        if (coex_dm->cur_ps_tdma == 8) {
2189                                                btc8821a2ant_ps_tdma(
2190                                                        btcoexist, NORMAL_EXEC,
2191                                                        true, 7);
2192                                                coex_dm->ps_tdma_du_adj_type =
2193                                                        7;
2194                                        } else if (coex_dm->cur_ps_tdma == 7) {
2195                                                btc8821a2ant_ps_tdma(
2196                                                        btcoexist, NORMAL_EXEC,
2197                                                        true, 6);
2198                                                coex_dm->ps_tdma_du_adj_type =
2199                                                        6;
2200                                        } else if (coex_dm->cur_ps_tdma == 6) {
2201                                                btc8821a2ant_ps_tdma(
2202                                                        btcoexist, NORMAL_EXEC,
2203                                                        true, 6);
2204                                                coex_dm->ps_tdma_du_adj_type =
2205                                                        6;
2206                                        } else if (coex_dm->cur_ps_tdma == 16) {
2207                                                btc8821a2ant_ps_tdma(
2208                                                        btcoexist, NORMAL_EXEC,
2209                                                        true, 15);
2210                                                coex_dm->ps_tdma_du_adj_type =
2211                                                        15;
2212                                        } else if (coex_dm->cur_ps_tdma == 15) {
2213                                                btc8821a2ant_ps_tdma(
2214                                                        btcoexist, NORMAL_EXEC,
2215                                                        true, 14);
2216                                                coex_dm->ps_tdma_du_adj_type =
2217                                                        14;
2218                                        } else if (coex_dm->cur_ps_tdma == 14) {
2219                                                btc8821a2ant_ps_tdma(
2220                                                        btcoexist, NORMAL_EXEC,
2221                                                        true, 14);
2222                                                coex_dm->ps_tdma_du_adj_type =
2223                                                        14;
2224                                        }
2225                                }
2226                        } else {
2227                                if (coex_dm->cur_ps_tdma == 5) {
2228                                        btc8821a2ant_ps_tdma(btcoexist,
2229                                                        NORMAL_EXEC, true, 2);
2230                                        coex_dm->ps_tdma_du_adj_type = 2;
2231                                } else if (coex_dm->cur_ps_tdma == 6) {
2232                                        btc8821a2ant_ps_tdma(btcoexist,
2233                                                        NORMAL_EXEC, true, 2);
2234                                        coex_dm->ps_tdma_du_adj_type = 2;
2235                                } else if (coex_dm->cur_ps_tdma == 7) {
2236                                        btc8821a2ant_ps_tdma(btcoexist,
2237                                                        NORMAL_EXEC, true, 3);
2238                                        coex_dm->ps_tdma_du_adj_type = 3;
2239                                } else if (coex_dm->cur_ps_tdma == 8) {
2240                                        btc8821a2ant_ps_tdma(btcoexist,
2241                                                        NORMAL_EXEC, true, 4);
2242                                        coex_dm->ps_tdma_du_adj_type = 4;
2243                                }
2244                                if (coex_dm->cur_ps_tdma == 13) {
2245                                        btc8821a2ant_ps_tdma(btcoexist,
2246                                                        NORMAL_EXEC, true, 10);
2247                                        coex_dm->ps_tdma_du_adj_type = 10;
2248                                } else if (coex_dm->cur_ps_tdma == 14) {
2249                                        btc8821a2ant_ps_tdma(btcoexist,
2250                                                        NORMAL_EXEC, true, 10);
2251                                        coex_dm->ps_tdma_du_adj_type = 10;
2252                                } else if (coex_dm->cur_ps_tdma == 15) {
2253                                        btc8821a2ant_ps_tdma(btcoexist,
2254                                                        NORMAL_EXEC, true, 11);
2255                                        coex_dm->ps_tdma_du_adj_type = 11;
2256                                } else if (coex_dm->cur_ps_tdma == 16) {
2257                                        btc8821a2ant_ps_tdma(btcoexist,
2258                                                        NORMAL_EXEC, true, 12);
2259                                        coex_dm->ps_tdma_du_adj_type = 12;
2260                                }
2261                                if (result == -1) {
2262                                        if (coex_dm->cur_ps_tdma == 1) {
2263                                                btc8821a2ant_ps_tdma(
2264                                                        btcoexist, NORMAL_EXEC,
2265                                                        true, 2);
2266                                                coex_dm->ps_tdma_du_adj_type =
2267                                                        2;
2268                                        } else if (coex_dm->cur_ps_tdma == 2) {
2269                                                btc8821a2ant_ps_tdma(
2270                                                        btcoexist, NORMAL_EXEC,
2271                                                        true, 3);
2272                                                coex_dm->ps_tdma_du_adj_type =
2273                                                        3;
2274                                        } else if (coex_dm->cur_ps_tdma == 3) {
2275                                                btc8821a2ant_ps_tdma(
2276                                                        btcoexist, NORMAL_EXEC,
2277                                                        true, 4);
2278                                                coex_dm->ps_tdma_du_adj_type =
2279                                                        4;
2280                                        } else if (coex_dm->cur_ps_tdma == 9) {
2281                                                btc8821a2ant_ps_tdma(
2282                                                        btcoexist, NORMAL_EXEC,
2283                                                        true, 10);
2284                                                coex_dm->ps_tdma_du_adj_type =
2285                                                        10;
2286                                        } else if (coex_dm->cur_ps_tdma == 10) {
2287                                                btc8821a2ant_ps_tdma(
2288                                                        btcoexist, NORMAL_EXEC,
2289                                                        true, 11);
2290                                                coex_dm->ps_tdma_du_adj_type =
2291                                                        11;
2292                                        } else if (coex_dm->cur_ps_tdma == 11) {
2293                                                btc8821a2ant_ps_tdma(
2294                                                        btcoexist, NORMAL_EXEC,
2295                                                        true, 12);
2296                                                coex_dm->ps_tdma_du_adj_type =
2297                                                        12;
2298                                        }
2299                                } else if (result == 1) {
2300                                        if (coex_dm->cur_ps_tdma == 4) {
2301                                                btc8821a2ant_ps_tdma(
2302                                                        btcoexist, NORMAL_EXEC,
2303                                                        true, 3);
2304                                                coex_dm->ps_tdma_du_adj_type =
2305                                                        3;
2306                                        } else if (coex_dm->cur_ps_tdma == 3) {
2307                                                btc8821a2ant_ps_tdma(
2308                                                        btcoexist, NORMAL_EXEC,
2309                                                        true, 2);
2310                                                coex_dm->ps_tdma_du_adj_type =
2311                                                        2;
2312                                        } else if (coex_dm->cur_ps_tdma == 2) {
2313                                                btc8821a2ant_ps_tdma(
2314                                                        btcoexist, NORMAL_EXEC,
2315                                                        true, 2);
2316                                                coex_dm->ps_tdma_du_adj_type =
2317                                                        2;
2318                                        } else if (coex_dm->cur_ps_tdma == 12) {
2319                                                btc8821a2ant_ps_tdma(
2320                                                        btcoexist, NORMAL_EXEC,
2321                                                        true, 11);
2322                                                coex_dm->ps_tdma_du_adj_type =
2323                                                        11;
2324                                        } else if (coex_dm->cur_ps_tdma == 11) {
2325                                                btc8821a2ant_ps_tdma(
2326                                                        btcoexist, NORMAL_EXEC,
2327                                                        true, 10);
2328                                                coex_dm->ps_tdma_du_adj_type =
2329                                                        10;
2330                                        } else if (coex_dm->cur_ps_tdma == 10) {
2331                                                btc8821a2ant_ps_tdma(
2332                                                        btcoexist, NORMAL_EXEC,
2333                                                        true, 10);
2334                                                coex_dm->ps_tdma_du_adj_type =
2335                                                        10;
2336                                        }
2337                                }
2338                        }
2339                } else if (max_interval == 3) {
2340                        if (tx_pause) {
2341                                if (coex_dm->cur_ps_tdma == 1) {
2342                                        btc8821a2ant_ps_tdma(btcoexist,
2343                                                        NORMAL_EXEC, true, 7);
2344                                        coex_dm->ps_tdma_du_adj_type = 7;
2345                                } else if (coex_dm->cur_ps_tdma == 2) {
2346                                        btc8821a2ant_ps_tdma(btcoexist,
2347                                                        NORMAL_EXEC, true, 7);
2348                                        coex_dm->ps_tdma_du_adj_type = 7;
2349                                } else if (coex_dm->cur_ps_tdma == 3) {
2350                                        btc8821a2ant_ps_tdma(btcoexist,
2351                                                        NORMAL_EXEC, true, 7);
2352                                        coex_dm->ps_tdma_du_adj_type = 7;
2353                                } else if (coex_dm->cur_ps_tdma == 4) {
2354                                        btc8821a2ant_ps_tdma(btcoexist,
2355                                                        NORMAL_EXEC, true, 8);
2356                                        coex_dm->ps_tdma_du_adj_type = 8;
2357                                }
2358                                if (coex_dm->cur_ps_tdma == 9) {
2359                                        btc8821a2ant_ps_tdma(btcoexist,
2360                                                        NORMAL_EXEC, true, 15);
2361                                        coex_dm->ps_tdma_du_adj_type = 15;
2362                                } else if (coex_dm->cur_ps_tdma == 10) {
2363                                        btc8821a2ant_ps_tdma(btcoexist,
2364                                                        NORMAL_EXEC, true, 15);
2365                                        coex_dm->ps_tdma_du_adj_type = 15;
2366                                } else if (coex_dm->cur_ps_tdma == 11) {
2367                                        btc8821a2ant_ps_tdma(btcoexist,
2368                                                        NORMAL_EXEC, true, 15);
2369                                        coex_dm->ps_tdma_du_adj_type = 15;
2370                                } else if (coex_dm->cur_ps_tdma == 12) {
2371                                        btc8821a2ant_ps_tdma(btcoexist,
2372                                                        NORMAL_EXEC, true, 16);
2373                                        coex_dm->ps_tdma_du_adj_type = 16;
2374                                }
2375                                if (result == -1) {
2376                                        if (coex_dm->cur_ps_tdma == 5) {
2377                                                btc8821a2ant_ps_tdma(
2378                                                        btcoexist, NORMAL_EXEC,
2379                                                        true, 7);
2380                                                coex_dm->ps_tdma_du_adj_type =
2381                                                        7;
2382                                        } else if (coex_dm->cur_ps_tdma == 6) {
2383                                                btc8821a2ant_ps_tdma(
2384                                                        btcoexist, NORMAL_EXEC,
2385                                                        true, 7);
2386                                                coex_dm->ps_tdma_du_adj_type =
2387                                                        7;
2388                                        } else if (coex_dm->cur_ps_tdma == 7) {
2389                                                btc8821a2ant_ps_tdma(
2390                                                        btcoexist, NORMAL_EXEC,
2391                                                        true, 8);
2392                                                coex_dm->ps_tdma_du_adj_type =
2393                                                        8;
2394                                        } else if (coex_dm->cur_ps_tdma == 13) {
2395                                                btc8821a2ant_ps_tdma(
2396                                                        btcoexist, NORMAL_EXEC,
2397                                                        true, 15);
2398                                                coex_dm->ps_tdma_du_adj_type =
2399                                                        15;
2400                                        } else if (coex_dm->cur_ps_tdma == 14) {
2401                                                btc8821a2ant_ps_tdma(
2402                                                        btcoexist, NORMAL_EXEC,
2403                                                        true, 15);
2404                                                coex_dm->ps_tdma_du_adj_type =
2405                                                        15;
2406                                        } else if (coex_dm->cur_ps_tdma == 15) {
2407                                                btc8821a2ant_ps_tdma(
2408                                                        btcoexist, NORMAL_EXEC,
2409                                                        true, 16);
2410                                                coex_dm->ps_tdma_du_adj_type =
2411                                                        16;
2412                                        }
2413                                } else if (result == 1) {
2414                                        if (coex_dm->cur_ps_tdma == 8) {
2415                                                btc8821a2ant_ps_tdma(
2416                                                        btcoexist, NORMAL_EXEC,
2417                                                        true, 7);
2418                                                coex_dm->ps_tdma_du_adj_type =
2419                                                        7;
2420                                        } else if (coex_dm->cur_ps_tdma == 7) {
2421                                                btc8821a2ant_ps_tdma(
2422                                                        btcoexist, NORMAL_EXEC,
2423                                                        true, 7);
2424                                                coex_dm->ps_tdma_du_adj_type =
2425                                                        7;
2426                                        } else if (coex_dm->cur_ps_tdma == 6) {
2427                                                btc8821a2ant_ps_tdma(
2428                                                        btcoexist, NORMAL_EXEC,
2429                                                        true, 7);
2430                                                coex_dm->ps_tdma_du_adj_type =
2431                                                        7;
2432                                        } else if (coex_dm->cur_ps_tdma == 16) {
2433                                                btc8821a2ant_ps_tdma(
2434                                                        btcoexist, NORMAL_EXEC,
2435                                                        true, 15);
2436                                                coex_dm->ps_tdma_du_adj_type =
2437                                                        15;
2438                                        } else if (coex_dm->cur_ps_tdma == 15) {
2439                                                btc8821a2ant_ps_tdma(
2440                                                        btcoexist, NORMAL_EXEC,
2441                                                        true, 15);
2442                                                coex_dm->ps_tdma_du_adj_type =
2443                                                        15;
2444                                        } else if (coex_dm->cur_ps_tdma == 14) {
2445                                                btc8821a2ant_ps_tdma(
2446                                                        btcoexist, NORMAL_EXEC,
2447                                                        true, 15);
2448                                                coex_dm->ps_tdma_du_adj_type =
2449                                                        15;
2450                                        }
2451                                }
2452                        } else {
2453                                if (coex_dm->cur_ps_tdma == 5) {
2454                                        btc8821a2ant_ps_tdma(btcoexist,
2455                                                        NORMAL_EXEC, true, 3);
2456                                        coex_dm->ps_tdma_du_adj_type = 3;
2457                                } else if (coex_dm->cur_ps_tdma == 6) {
2458                                        btc8821a2ant_ps_tdma(btcoexist,
2459                                                        NORMAL_EXEC, true, 3);
2460                                        coex_dm->ps_tdma_du_adj_type = 3;
2461                                } else if (coex_dm->cur_ps_tdma == 7) {
2462                                        btc8821a2ant_ps_tdma(btcoexist,
2463                                                        NORMAL_EXEC, true, 3);
2464                                        coex_dm->ps_tdma_du_adj_type = 3;
2465                                } else if (coex_dm->cur_ps_tdma == 8) {
2466                                        btc8821a2ant_ps_tdma(btcoexist,
2467                                                        NORMAL_EXEC, true, 4);
2468                                        coex_dm->ps_tdma_du_adj_type = 4;
2469                                }
2470                                if (coex_dm->cur_ps_tdma == 13) {
2471                                        btc8821a2ant_ps_tdma(btcoexist,
2472                                                        NORMAL_EXEC, true, 11);
2473                                        coex_dm->ps_tdma_du_adj_type = 11;
2474                                } else if (coex_dm->cur_ps_tdma == 14) {
2475                                        btc8821a2ant_ps_tdma(btcoexist,
2476                                                        NORMAL_EXEC, true, 11);
2477                                        coex_dm->ps_tdma_du_adj_type = 11;
2478                                } else if (coex_dm->cur_ps_tdma == 15) {
2479                                        btc8821a2ant_ps_tdma(btcoexist,
2480                                                        NORMAL_EXEC, true, 11);
2481                                        coex_dm->ps_tdma_du_adj_type = 11;
2482                                } else if (coex_dm->cur_ps_tdma == 16) {
2483                                        btc8821a2ant_ps_tdma(btcoexist,
2484                                                        NORMAL_EXEC, true, 12);
2485                                        coex_dm->ps_tdma_du_adj_type = 12;
2486                                }
2487                                if (result == -1) {
2488                                        if (coex_dm->cur_ps_tdma == 1) {
2489                                                btc8821a2ant_ps_tdma(
2490                                                        btcoexist, NORMAL_EXEC,
2491                                                        true, 3);
2492                                                coex_dm->ps_tdma_du_adj_type =
2493                                                        3;
2494                                        } else if (coex_dm->cur_ps_tdma == 2) {
2495                                                btc8821a2ant_ps_tdma(
2496                                                        btcoexist, NORMAL_EXEC,
2497                                                        true, 3);
2498                                                coex_dm->ps_tdma_du_adj_type =
2499                                                        3;
2500                                        } else if (coex_dm->cur_ps_tdma == 3) {
2501                                                btc8821a2ant_ps_tdma(
2502                                                        btcoexist, NORMAL_EXEC,
2503                                                        true, 4);
2504                                                coex_dm->ps_tdma_du_adj_type =
2505                                                        4;
2506                                        } else if (coex_dm->cur_ps_tdma == 9) {
2507                                                btc8821a2ant_ps_tdma(
2508                                                        btcoexist, NORMAL_EXEC,
2509                                                        true, 11);
2510                                                coex_dm->ps_tdma_du_adj_type =
2511                                                        11;
2512                                        } else if (coex_dm->cur_ps_tdma == 10) {
2513                                                btc8821a2ant_ps_tdma(
2514                                                        btcoexist, NORMAL_EXEC,
2515                                                        true, 11);
2516                                                coex_dm->ps_tdma_du_adj_type =
2517                                                        11;
2518                                        } else if (coex_dm->cur_ps_tdma == 11) {
2519                                                btc8821a2ant_ps_tdma(
2520                                                        btcoexist, NORMAL_EXEC,
2521                                                        true, 12);
2522                                                coex_dm->ps_tdma_du_adj_type =
2523                                                        12;
2524                                        }
2525                                } else if (result == 1) {
2526                                        if (coex_dm->cur_ps_tdma == 4) {
2527                                                btc8821a2ant_ps_tdma(
2528                                                        btcoexist, NORMAL_EXEC,
2529                                                        true, 3);
2530                                                coex_dm->ps_tdma_du_adj_type =
2531                                                        3;
2532                                        } else if (coex_dm->cur_ps_tdma == 3) {
2533                                                btc8821a2ant_ps_tdma(
2534                                                        btcoexist, NORMAL_EXEC,
2535                                                        true, 3);
2536                                                coex_dm->ps_tdma_du_adj_type =
2537                                                        3;
2538                                        } else if (coex_dm->cur_ps_tdma == 2) {
2539                                                btc8821a2ant_ps_tdma(
2540                                                        btcoexist, NORMAL_EXEC,
2541                                                        true, 3);
2542                                                coex_dm->ps_tdma_du_adj_type =
2543                                                        3;
2544                                        } else if (coex_dm->cur_ps_tdma == 12) {
2545                                                btc8821a2ant_ps_tdma(
2546                                                        btcoexist, NORMAL_EXEC,
2547                                                        true, 11);
2548                                                coex_dm->ps_tdma_du_adj_type =
2549                                                        11;
2550                                        } else if (coex_dm->cur_ps_tdma == 11) {
2551                                                btc8821a2ant_ps_tdma(
2552                                                        btcoexist, NORMAL_EXEC,
2553                                                        true, 11);
2554                                                coex_dm->ps_tdma_du_adj_type =
2555                                                        11;
2556                                        } else if (coex_dm->cur_ps_tdma == 10) {
2557                                                btc8821a2ant_ps_tdma(
2558                                                        btcoexist, NORMAL_EXEC,
2559                                                        true, 11);
2560                                                coex_dm->ps_tdma_du_adj_type =
2561                                                        11;
2562                                        }
2563                                }
2564                        }
2565                }
2566        }
2567
2568        /* if current PsTdma not match with the recorded one
2569         * (when scan, dhcp...), then we have to adjust it back to
2570         * the previous recorded one.
2571         */
2572        if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2573                bool scan = false, link = false, roam = false;
2574
2575                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2576                        "[BTCoex], PsTdma type mismatch!!!, cur_ps_tdma = %d, recordPsTdma = %d\n",
2577                        coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2578
2579                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2580                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2581                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2582
2583                if (!scan && !link && !roam) {
2584                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2585                                             coex_dm->ps_tdma_du_adj_type);
2586                } else {
2587                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2588                                "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2589                }
2590        }
2591}
2592
2593/* SCO only or SCO+PAN(HS)*/
2594static void btc8821a2ant_action_sco(struct btc_coexist *btcoexist)
2595{
2596        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2597        u8 wifi_rssi_state, bt_rssi_state;
2598        u32 wifi_bw;
2599
2600        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2601        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
2602
2603        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2604
2605        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2606        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2607
2608        if (BTC_RSSI_HIGH(bt_rssi_state))
2609                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2610        else
2611                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2612
2613        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2614
2615        if (wifi_bw == BTC_WIFI_BW_LEGACY) {
2616                /* for SCO quality at 11b/g mode */
2617                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2618        } else {
2619                /* for SCO quality & wifi performance balance at 11n mode */
2620                if (wifi_bw == BTC_WIFI_BW_HT40) {
2621                        btc8821a2ant_coex_table_with_type(btcoexist,
2622                                                          NORMAL_EXEC, 8);
2623                } else {
2624                        if (bt_link_info->sco_only)
2625                                btc8821a2ant_coex_table_with_type(
2626                                        btcoexist, NORMAL_EXEC, 17);
2627                        else
2628                                btc8821a2ant_coex_table_with_type(
2629                                        btcoexist, NORMAL_EXEC, 12);
2630                }
2631        }
2632
2633        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2634        /* for voice quality */
2635        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2636
2637        /* sw mechanism */
2638        if (wifi_bw == BTC_WIFI_BW_HT40) {
2639                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2640                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2641                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2642                                                   false, false);
2643                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2644                                                   true, 0x18);
2645                } else {
2646                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2647                                                   false, false);
2648                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2649                                                   true, 0x18);
2650                }
2651        } else {
2652                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2653                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2654                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2655                                                   false, false);
2656                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2657                                                   true, 0x18);
2658                } else {
2659                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2660                                                   false, false);
2661                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2662                                                   true, 0x18);
2663                }
2664        }
2665}
2666
2667static void btc8821a2ant_action_hid(struct btc_coexist *btcoexist)
2668{
2669        u8 wifi_rssi_state, bt_rssi_state;
2670        u32 wifi_bw;
2671
2672        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2673        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2674                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2675
2676        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2677
2678        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2679        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2680
2681        if (BTC_RSSI_HIGH(bt_rssi_state))
2682                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2683        else
2684                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2685
2686        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2687
2688        if (wifi_bw == BTC_WIFI_BW_LEGACY) {
2689                /* for HID at 11b/g mode */
2690                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2691        } else {
2692                /* for HID quality & wifi performance balance at 11n mode */
2693                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2694        }
2695
2696        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2697        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 24);
2698
2699        if (wifi_bw == BTC_WIFI_BW_HT40) {
2700                /* sw mechanism */
2701                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2702                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2703                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2704                                                   false, false);
2705                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2706                                                   false, 0x18);
2707                } else {
2708                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2709                                                   false, false);
2710                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2711                                                   false, 0x18);
2712                }
2713        } else {
2714                /* sw mechanism */
2715                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2716                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2717                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2718                                                   false, false);
2719                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2720                                                   false, 0x18);
2721                } else {
2722                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2723                                                   false, false);
2724                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2725                                                   false, 0x18);
2726                }
2727        }
2728}
2729
2730/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2731static void btc8821a2ant_action_a2dp(struct btc_coexist *btcoexist)
2732{
2733        u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2734        u8 ap_num = 0;
2735        u32 wifi_bw;
2736
2737        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2738        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2739                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2740        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2741                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2742
2743        if ((ap_num >= 10) && BTC_RSSI_HIGH(wifi_rssi_state1) &&
2744            BTC_RSSI_HIGH(bt_rssi_state)) {
2745                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2746                                              0x0, 0x0);
2747
2748                btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2749                                          0x0);
2750                btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2751                                        0x8);
2752                btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2753                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2754
2755                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2756
2757                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2758                                              0x0, 0x0);
2759                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2760
2761                /* sw mechanism */
2762                btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2763                if (wifi_bw == BTC_WIFI_BW_HT40) {
2764                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2765                                                   false, false);
2766                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2767                                                   true, 0x6);
2768                } else {
2769                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2770                                                   false, false);
2771                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2772                                                   true, 0x6);
2773                }
2774                return;
2775        }
2776
2777        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2778        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2779
2780        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2781
2782        if (BTC_RSSI_HIGH(bt_rssi_state))
2783                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2784        else
2785                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2786
2787        if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2788                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2789                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2790                                              0x0, 0x0);
2791        } else {
2792                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2793                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2794                                              0x4);
2795        }
2796
2797        /* preserve identical branches for further fine-tuning */
2798        if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2799            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2800                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2801        } else {
2802                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2803        }
2804
2805        /* sw mechanism */
2806        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2807        if (wifi_bw == BTC_WIFI_BW_HT40) {
2808                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2809                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2810                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2811                                                   false, false);
2812                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2813                                                   false, 0x18);
2814                } else {
2815                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2816                                                   false, false);
2817                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2818                                                   false, 0x18);
2819                }
2820        } else {
2821                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2822                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2823                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2824                                                   false, false);
2825                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2826                                                   false, 0x18);
2827                } else {
2828                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2829                                                   false, false);
2830                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2831                                                   false, 0x18);
2832                }
2833        }
2834}
2835
2836static void btc8821a2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2837{
2838        u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2839        u32 wifi_bw;
2840
2841        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2842        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2843                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2844        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2845                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2846
2847        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2848
2849        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2850        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2851
2852        if (BTC_RSSI_HIGH(bt_rssi_state))
2853                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2854        else
2855                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2856
2857        if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2858                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2859                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2860                                              0x0, 0x0);
2861        } else {
2862                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2863                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2864                                              0x4);
2865        }
2866
2867        btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2868
2869        /* sw mechanism */
2870        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2871        if (wifi_bw == BTC_WIFI_BW_HT40) {
2872                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2873                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2874                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2875                                                   false, false);
2876                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2877                                                   false, 0x18);
2878                } else {
2879                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2880                                                   false, false);
2881                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2882                                                   false, 0x18);
2883                }
2884        } else {
2885                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2886                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2887                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2888                                                   false, false);
2889                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2890                                                   false, 0x18);
2891                } else {
2892                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2893                                                   false, false);
2894                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2895                                                   false, 0x18);
2896                }
2897        }
2898}
2899
2900static void btc8821a2ant_action_pan_edr(struct btc_coexist *btcoexist)
2901{
2902        u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2903        u32 wifi_bw;
2904
2905        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2906        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2907                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2908        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2909                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2910
2911        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2912
2913        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2914
2915        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2916
2917        if (BTC_RSSI_HIGH(bt_rssi_state))
2918                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2919        else
2920                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2921
2922        if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2923                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
2924                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2925                                              0x0, 0x0);
2926        } else {
2927                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2928                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2929                                              0x4);
2930        }
2931
2932        /* preserve identical branches for further fine-tuning */
2933        if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2934            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2935                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
2936        else
2937                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
2938
2939        /* sw mechanism */
2940        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2941        if (wifi_bw == BTC_WIFI_BW_HT40) {
2942                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2943                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2944                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2945                                                   false, false);
2946                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2947                                                   false, 0x18);
2948                } else {
2949                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2950                                                   false, false);
2951                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2952                                                   false, 0x18);
2953                }
2954        } else {
2955                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2956                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2957                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2958                                                   false, false);
2959                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2960                                                   false, 0x18);
2961                } else {
2962                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2963                                                   false, false);
2964                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2965                                                   false, 0x18);
2966                }
2967        }
2968}
2969
2970/* PAN(HS) only */
2971static void btc8821a2ant_action_pan_hs(struct btc_coexist *btcoexist)
2972{
2973        u8 wifi_rssi_state, bt_rssi_state;
2974        u32 wifi_bw;
2975
2976        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2977        btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2978                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2979        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2980                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2981
2982        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2983
2984        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2985        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2986
2987        if (BTC_RSSI_HIGH(bt_rssi_state))
2988                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2989        else
2990                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2991
2992        btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2993        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2994        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2995
2996        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2997        if (wifi_bw == BTC_WIFI_BW_HT40) {
2998                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2999                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3000                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3001                                                   false, false);
3002                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3003                                                   false, 0x18);
3004                } else {
3005                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3006                                                   false, false);
3007                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3008                                                   false, 0x18);
3009                }
3010        } else {
3011                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3012                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3013                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3014                                                   false, false);
3015                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3016                                                   false, 0x18);
3017                } else {
3018                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3019                                                   false, false);
3020                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3021                                                   false, 0x18);
3022                }
3023        }
3024}
3025
3026/* PAN(EDR)+A2DP */
3027static void btc8821a2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
3028{
3029        u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3030        u32 wifi_bw;
3031
3032        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3033        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3034                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3035        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3036                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3037
3038        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3039
3040        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3041
3042        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3043
3044        if (BTC_RSSI_HIGH(bt_rssi_state))
3045                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3046        else
3047                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3048
3049        if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))
3050                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3051                                              0x0, 0x0);
3052        else
3053                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3054                                              0x4);
3055
3056        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3057
3058        if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3059            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3060                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 12);
3061
3062                if (wifi_bw == BTC_WIFI_BW_HT40)
3063                        btc8821a2ant_tdma_duration_adjust(btcoexist, false,
3064                                                          true, 3);
3065                else
3066                        btc8821a2ant_tdma_duration_adjust(btcoexist, false,
3067                                                          false, 3);
3068        } else {
3069                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
3070                btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 3);
3071        }
3072
3073        /* sw mechanism  */
3074        if (wifi_bw == BTC_WIFI_BW_HT40) {
3075                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3076                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3077                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3078                                                   false, false);
3079                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3080                                                   false, 0x18);
3081                } else {
3082                        btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3083                                                   false, false);
3084                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3085                                                   false, 0x18);
3086                }
3087        } else {
3088                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3089                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3090                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3091                                                   false, false);
3092                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3093                                                   false, 0x18);
3094                } else {
3095                        btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3096                                                   false, false);
3097                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3098                                                   false, 0x18);
3099                }
3100        }
3101}
3102
3103static void btc8821a2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
3104{
3105        u8 wifi_rssi_state, bt_rssi_state;
3106        u32 wifi_bw;
3107
3108        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3109        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3110                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3111
3112        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3113
3114        if (BTC_RSSI_HIGH(bt_rssi_state))
3115                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
3116        else
3117                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
3118
3119        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3120
3121        /* preserve identical branches for further fine-tuning */
3122        if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3123                /* for HID at 11b/g mode */
3124                btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,
3125                                        0x5a5f5a5f, 0xffff, 0x3);
3126        } else {
3127                /* for HID quality & wifi performance balance at 11n mode */
3128                btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,
3129                                        0x5a5f5a5f, 0xffff, 0x3);
3130        }
3131
3132        if (wifi_bw == BTC_WIFI_BW_HT40) {
3133                btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 3);
3134                /* fw mechanism */
3135                if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3136                    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3137                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3138                                             true, 10);
3139                } else {
3140                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
3141                }
3142
3143                /* sw mechanism */
3144                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3145                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3146                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3147                                                   false, false);
3148                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3149                                                   false, 0x18);
3150                } else {
3151                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3152                                                   false, false);
3153                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3154                                                   false, 0x18);
3155                }
3156        } else {
3157                btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3158                /* fw mechanism */
3159                if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3160                    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3161                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
3162                } else {
3163                        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
3164                }
3165
3166                /* sw mechanism */
3167                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3168                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3169                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3170                                                   false, false);
3171                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3172                                                   false, 0x18);
3173                } else {
3174                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3175                                                   false, false);
3176                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3177                                                   false, 0x18);
3178                }
3179        }
3180}
3181
3182/* HID+A2DP+PAN(EDR) */
3183static void btc8821a2ant_act_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
3184{
3185        u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3186        u32 wifi_bw;
3187
3188        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3189        wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3190                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3191        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3192                                2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3193
3194        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3195
3196        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3197        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3198
3199        if (BTC_RSSI_HIGH(bt_rssi_state))
3200                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3201        else
3202                btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3203
3204        if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3205                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3206                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3207                                              0x0, 0x0);
3208        } else {
3209                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3210                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3211                                              0x4);
3212        }
3213
3214        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3215
3216        if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3217            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3218                if (wifi_bw == BTC_WIFI_BW_HT40)
3219                        btc8821a2ant_tdma_duration_adjust(btcoexist, true,
3220                                                          true, 3);
3221                else
3222                        btc8821a2ant_tdma_duration_adjust(btcoexist, true,
3223                                                          false, 3);
3224        } else {
3225                btc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 3);
3226        }
3227
3228        /* sw mechanism */
3229        if (wifi_bw == BTC_WIFI_BW_HT40) {
3230                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3231                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3232                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3233                                                   false, false);
3234                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3235                                                   false, 0x18);
3236                } else {
3237                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3238                                                   false, false);
3239                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3240                                                   false, 0x18);
3241                }
3242        } else {
3243                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3244                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3245                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3246                                                   false, false);
3247                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3248                                                   false, 0x18);
3249                } else {
3250                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3251                                                   false, false);
3252                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3253                                                   false, 0x18);
3254                }
3255        }
3256}
3257
3258static void btc8821a2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
3259{
3260        u32 wifi_bw;
3261        u8 wifi_rssi_state, bt_rssi_state;
3262        u8 ap_num = 0;
3263
3264        wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3265        btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3266                                BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3267        bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3268                                3, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);
3269
3270        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3271
3272        btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x5);
3273        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3274
3275        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3276        if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3277                if (BTC_RSSI_HIGH(bt_rssi_state))
3278                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3279                else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3280                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3281                else
3282                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3283        } else {
3284                /* only 802.11N mode we have to dec bt power to 4 degree */
3285                if (BTC_RSSI_HIGH(bt_rssi_state)) {
3286                        btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3287                                           &ap_num);
3288                        if (ap_num < 10)
3289                                btc8821a2ant_dec_bt_pwr(btcoexist,
3290                                                        NORMAL_EXEC, 4);
3291                        else
3292                                btc8821a2ant_dec_bt_pwr(btcoexist,
3293                                                        NORMAL_EXEC, 2);
3294                } else if (BTC_RSSI_MEDIUM(bt_rssi_state)) {
3295                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3296                } else {
3297                        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3298                }
3299        }
3300
3301        if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3302                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3303                btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3304                                              0x0, 0x0);
3305        } else {
3306                btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3307                btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3308                                              0x4);
3309        }
3310
3311        /* preserve identical branches for further fine-tuning */
3312        if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3313            (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3314                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3315        } else {
3316                btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3317        }
3318
3319        /* sw mechanism */
3320        if (wifi_bw == BTC_WIFI_BW_HT40) {
3321                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3322                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3323                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3324                                                   false, false);
3325                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3326                                                   false, 0x18);
3327                } else {
3328                        btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3329                                                   false, false);
3330                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3331                                                   false, 0x18);
3332                }
3333        } else {
3334                if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3335                    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3336                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3337                                                   false, false);
3338                        btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3339                                                   false, 0x18);
3340                } else {
3341                        btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3342                                                   false, false);
3343                        btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3344                                                   false, 0x18);
3345                }
3346        }
3347}
3348
3349static void btc8821a2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
3350{
3351        btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3352        btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3353
3354        /* sw all off */
3355        btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
3356        btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3357
3358        /* hw all off */
3359        btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3360
3361        btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3362        btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3363}
3364
3365static void btc8821a2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3366{
3367        struct rtl_priv *rtlpriv = btcoexist->adapter;
3368        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3369        bool wifi_under_5g = false;
3370        u8 algorithm = 0;
3371        u32 num_of_wifi_link = 0;
3372        u32 wifi_link_status = 0;
3373        bool miracast_plus_bt = false;
3374        bool scan = false, link = false, roam = false;
3375
3376        if (btcoexist->manual_control) {
3377                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3378                        "[BTCoex], Manual control!!!\n");
3379                return;
3380        }
3381
3382        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3383
3384        if (wifi_under_5g) {
3385                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3386                        "[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n");
3387                btc8821a2ant_coex_under_5g(btcoexist);
3388                return;
3389        }
3390
3391        if (coex_sta->under_ips) {
3392                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3393                        "[BTCoex], wifi is under IPS !!!\n");
3394                return;
3395        }
3396
3397        algorithm = btc8821a2ant_action_algorithm(btcoexist);
3398        if (coex_sta->c2h_bt_inquiry_page &&
3399            (BT_8821A_2ANT_COEX_ALGO_PANHS != algorithm)) {
3400                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3401                        "[BTCoex], BT is under inquiry/page scan !!\n");
3402                btc8821a2ant_action_bt_inquiry(btcoexist);
3403                return;
3404        }
3405
3406        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3407        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3408        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3409
3410        if (scan || link || roam) {
3411                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3412                        "[BTCoex], WiFi is under Link Process !!\n");
3413                btc8821a2ant_action_wifi_link_process(btcoexist);
3414                return;
3415        }
3416
3417        /* for P2P */
3418        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3419                           &wifi_link_status);
3420        num_of_wifi_link = wifi_link_status >> 16;
3421
3422        if ((num_of_wifi_link >= 2) ||
3423            (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3424                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3425                        "############# [BTCoex],  Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3426                        num_of_wifi_link, wifi_link_status);
3427
3428                if (bt_link_info->bt_link_exist)
3429                        miracast_plus_bt = true;
3430                else
3431                        miracast_plus_bt = false;
3432
3433                btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3434                                   &miracast_plus_bt);
3435                btc8821a2ant_action_wifi_multi_port(btcoexist);
3436
3437                return;
3438        }
3439
3440        miracast_plus_bt = false;
3441        btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3442                           &miracast_plus_bt);
3443
3444        coex_dm->cur_algorithm = algorithm;
3445        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3446                "[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);
3447
3448        if (btc8821a2ant_is_common_action(btcoexist)) {
3449                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3450                        "[BTCoex], Action 2-Ant common\n");
3451                coex_dm->auto_tdma_adjust = true;
3452        } else {
3453                if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3454                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3455                                "[BTCoex], pre_algorithm = %d, cur_algorithm = %d\n",
3456                                coex_dm->pre_algorithm,
3457                                coex_dm->cur_algorithm);
3458                        coex_dm->auto_tdma_adjust = false;
3459                }
3460                switch (coex_dm->cur_algorithm) {
3461                case BT_8821A_2ANT_COEX_ALGO_SCO:
3462                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3463                                "[BTCoex], Action 2-Ant, algorithm = SCO\n");
3464                        btc8821a2ant_action_sco(btcoexist);
3465                        break;
3466                case BT_8821A_2ANT_COEX_ALGO_HID:
3467                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3468                                "[BTCoex], Action 2-Ant, algorithm = HID\n");
3469                        btc8821a2ant_action_hid(btcoexist);
3470                        break;
3471                case BT_8821A_2ANT_COEX_ALGO_A2DP:
3472                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3473                                "[BTCoex], Action 2-Ant, algorithm = A2DP\n");
3474                        btc8821a2ant_action_a2dp(btcoexist);
3475                        break;
3476                case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS:
3477                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3478                                "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
3479                        btc8821a2ant_action_a2dp_pan_hs(btcoexist);
3480                        break;
3481                case BT_8821A_2ANT_COEX_ALGO_PANEDR:
3482                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3483                                "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");
3484                        btc8821a2ant_action_pan_edr(btcoexist);
3485                        break;
3486                case BT_8821A_2ANT_COEX_ALGO_PANHS:
3487                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3488                                "[BTCoex], Action 2-Ant, algorithm = HS mode\n");
3489                        btc8821a2ant_action_pan_hs(btcoexist);
3490                        break;
3491                case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP:
3492                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3493                                "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");
3494                        btc8821a2ant_action_pan_edr_a2dp(btcoexist);
3495                        break;
3496                case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID:
3497                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3498                                "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");
3499                        btc8821a2ant_action_pan_edr_hid(btcoexist);
3500                        break;
3501                case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3502                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3503                                "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");
3504                        btc8821a2ant_act_hid_a2dp_pan_edr(btcoexist);
3505                        break;
3506                case BT_8821A_2ANT_COEX_ALGO_HID_A2DP:
3507                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3508                                "[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");
3509                        btc8821a2ant_action_hid_a2dp(btcoexist);
3510                        break;
3511                default:
3512                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3513                                "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3514                        btc8821a2ant_coex_all_off(btcoexist);
3515                        break;
3516                }
3517                coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3518        }
3519}
3520
3521static void btc8821a2ant_wifi_off_hw_cfg(struct btc_coexist *btcoexist)
3522{
3523        u8 h2c_parameter[2] = {0};
3524        u32 fw_ver = 0;
3525
3526        /* set wlan_act to low */
3527        btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3528
3529        /* WiFi goto standby while GNT_BT 0-->1 */
3530        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
3531        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3532        if (fw_ver >= 0x180000) {
3533                /* Use H2C to set GNT_BT to HIGH */
3534                h2c_parameter[0] = 1;
3535                btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);
3536        } else {
3537                btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3538        }
3539}
3540
3541/**************************************************************
3542 * extern function start with ex_btc8821a2ant_
3543 **************************************************************/
3544void ex_btc8821a2ant_init_hwconfig(struct btc_coexist *btcoexist)
3545{
3546        struct rtl_priv *rtlpriv = btcoexist->adapter;
3547        u8 u1tmp = 0;
3548
3549        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3550                "[BTCoex], 2Ant Init HW Config!!\n");
3551
3552        /* backup rf 0x1e value */
3553        coex_dm->bt_rf0x1e_backup =
3554                btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3555
3556        /* 0x790[5:0] = 0x5 */
3557        u1tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3558        u1tmp &= 0xc0;
3559        u1tmp |= 0x5;
3560        btcoexist->btc_write_1byte(btcoexist, 0x790, u1tmp);
3561
3562        /* Antenna config */
3563        btc8821a2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN, true, false);
3564        coex_sta->dis_ver_info_cnt = 0;
3565
3566        /* PTA parameter */
3567        btc8821a2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3568
3569        /* Enable counter statistics */
3570        /* 0x76e[3] = 1, WLAN_Act control by PTA */
3571        btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3572        btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3573        btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3574}
3575
3576void ex_btc8821a2ant_pre_load_firmware(struct btc_coexist *btcoexist)
3577{
3578        struct btc_board_info *board_info = &btcoexist->board_info;
3579        u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
3580
3581        /**
3582         * S0 or S1 setting and Local register setting(By the setting fw can get
3583         * ant number, S0/S1, ... info)
3584         *
3585         * Local setting bit define
3586         *      BIT0: "0" for no antenna inverse; "1" for antenna inverse
3587         *      BIT1: "0" for internal switch; "1" for external switch
3588         *      BIT2: "0" for one antenna; "1" for two antenna
3589         * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
3590         * BIT2=0
3591         */
3592        if (btcoexist->chip_interface == BTC_INTF_USB) {
3593                /* fixed at S0 for USB interface */
3594                u8tmp |= 0x1; /* antenna inverse */
3595                btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3596        } else {
3597                /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3598                if (board_info->single_ant_path == 0) {
3599                } else if (board_info->single_ant_path == 1) {
3600                        /* set to S0 */
3601                        u8tmp |= 0x1; /* antenna inverse */
3602                }
3603
3604                if (btcoexist->chip_interface == BTC_INTF_PCI)
3605                        btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
3606                                                             u8tmp);
3607                else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3608                        btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
3609                                                             u8tmp);
3610        }
3611}
3612
3613void ex_btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)
3614{
3615        struct rtl_priv *rtlpriv = btcoexist->adapter;
3616
3617        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3618                "[BTCoex], Coex Mechanism Init!!\n");
3619
3620        btc8821a2ant_init_coex_dm(btcoexist);
3621}
3622
3623void ex_btc8821a2ant_display_coex_info(struct btc_coexist *btcoexist,
3624                                       struct seq_file *m)
3625{
3626        struct btc_board_info *board_info = &btcoexist->board_info;
3627        struct btc_stack_info *stack_info = &btcoexist->stack_info;
3628        u8 u1tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3629        u32 u4tmp[4];
3630        bool roam = false, scan = false, link = false, wifi_under_5g = false;
3631        bool bt_hs_on = false, wifi_busy = false;
3632        long wifi_rssi = 0, bt_hs_rssi = 0;
3633        u32 wifi_bw, wifi_traffic_dir;
3634        u8 wifi_dot_11_chnl, wifi_hs_chnl;
3635        u32 fw_ver = 0, bt_patch_ver = 0;
3636
3637        seq_puts(m, "\n ============[BT Coexist info]============");
3638
3639        seq_printf(m, "\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",
3640                   board_info->pg_ant_num, board_info->btdm_ant_num);
3641
3642        if (btcoexist->manual_control) {
3643                seq_printf(m, "\n %-35s", "[Action Manual control]!!");
3644        }
3645
3646        seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
3647                   ((stack_info->profile_notified) ? "Yes" : "No"),
3648                   stack_info->hci_version);
3649
3650        btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3651        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3652        seq_printf(m, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
3653                   "CoexVer/ FwVer/ PatchVer",
3654                   glcoex_ver_date_8821a_2ant, glcoex_ver_8821a_2ant,
3655                   fw_ver, bt_patch_ver, bt_patch_ver);
3656
3657        btcoexist->btc_get(btcoexist,
3658                BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3659        btcoexist->btc_get(btcoexist,
3660                BTC_GET_U1_WIFI_DOT11_CHNL, &wifi_dot_11_chnl);
3661        btcoexist->btc_get(btcoexist,
3662                BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3663        seq_printf(m, "\n %-35s = %d / %d(%d)",
3664                   "Dot11 channel / HsMode(HsChnl)",
3665                   wifi_dot_11_chnl, bt_hs_on, wifi_hs_chnl);
3666
3667        seq_printf(m, "\n %-35s = %3ph ",
3668                   "H2C Wifi inform bt chnl Info",
3669                   coex_dm->wifi_chnl_info);
3670
3671        btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3672        btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3673        seq_printf(m, "\n %-35s = %ld/ %ld", "Wifi rssi/ HS rssi",
3674                   wifi_rssi, bt_hs_rssi);
3675
3676        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3677        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3678        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3679        seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
3680                   link, roam, scan);
3681
3682        btcoexist->btc_get(btcoexist,
3683                BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3684        btcoexist->btc_get(btcoexist,
3685                BTC_GET_U4_WIFI_BW, &wifi_bw);
3686        btcoexist->btc_get(btcoexist,
3687                BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3688        btcoexist->btc_get(btcoexist,
3689                BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifi_traffic_dir);
3690        seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",
3691                   (wifi_under_5g ? "5G" : "2.4G"),
3692                   ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
3693                    (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
3694                   ((!wifi_busy) ? "idle" :
3695                    ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
3696                     "uplink" : "downlink")));
3697
3698        if (stack_info->profile_notified) {
3699                seq_printf(m, "\n %-35s = %d / %d / %d / %d",
3700                           "SCO/HID/PAN/A2DP",
3701                           stack_info->sco_exist, stack_info->hid_exist,
3702                           stack_info->pan_exist, stack_info->a2dp_exist);
3703
3704                btcoexist->btc_disp_dbg_msg(btcoexist,
3705                                            BTC_DBG_DISP_BT_LINK_INFO,
3706                                            m);
3707        }
3708
3709        bt_info_ext = coex_sta->bt_info_ext;
3710        seq_printf(m, "\n %-35s = %s", "BT Info A2DP rate",
3711                   (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");
3712
3713        for (i = 0; i < BT_INFO_SRC_8821A_2ANT_MAX; i++) {
3714                if (coex_sta->bt_info_c2h_cnt[i]) {
3715                        seq_printf(m, "\n %-35s = %7ph(%d)",
3716                                   glbt_info_src_8821a_2ant[i],
3717                                   coex_sta->bt_info_c2h[i],
3718                                   coex_sta->bt_info_c2h_cnt[i]);
3719                }
3720        }
3721
3722        seq_printf(m, "\n %-35s = %s/%s",
3723                   "PS state, IPS/LPS",
3724                   ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
3725                   ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
3726        btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
3727
3728        /* Sw mechanism*/
3729        seq_printf(m, "\n %-35s",
3730                   "============[Sw mechanism]============");
3731        seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",
3732                   "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3733                   coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3734                   coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3735
3736        /* Fw mechanism*/
3737        seq_printf(m, "\n %-35s",
3738                   "============[Fw mechanism]============");
3739
3740        if (!btcoexist->manual_control) {
3741                ps_tdma_case = coex_dm->cur_ps_tdma;
3742                seq_printf(m, "\n %-35s = %5ph case-%d",
3743                           "PS TDMA",
3744                           coex_dm->ps_tdma_para, ps_tdma_case);
3745
3746                seq_printf(m, "\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct",
3747                           coex_dm->cur_dec_bt_pwr_lvl,
3748                           coex_dm->cur_ignore_wlan_act);
3749        }
3750
3751        /* Hw setting*/
3752        seq_printf(m, "\n %-35s", "============[Hw setting]============");
3753
3754        seq_printf(m, "\n %-35s = 0x%x", "RF-A, 0x1e initVal",
3755                   coex_dm->bt_rf0x1e_backup);
3756
3757        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3758        u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3759        seq_printf(m, "\n %-35s = 0x%x/ 0x%x ",
3760                   "0x778 (W_Act)/ 0x6cc (CoTab Sel)",
3761                   u1tmp[0], u1tmp[1]);
3762
3763        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
3764        u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xc5b);
3765        seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3766                   "0x8db(ADC)/0xc5b[29:25](DAC)",
3767                   ((u1tmp[0] & 0x60) >> 5), ((u1tmp[1] & 0x3e) >> 1));
3768
3769        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
3770        seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3771                   "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)",
3772                   u4tmp[0] & 0xff, ((u4tmp[0] & 0x30000000) >> 28));
3773
3774        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3775        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3776        u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x974);
3777        seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3778                   "0x40/ 0x4c[24:23]/ 0x974",
3779                   u1tmp[0], ((u4tmp[0] & 0x01800000) >> 23), u4tmp[1]);
3780
3781        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3782        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3783        seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3784                   "0x550(bcn ctrl)/0x522",
3785                   u4tmp[0], u1tmp[0]);
3786
3787        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3788        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa0a);
3789        seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3790                   "0xc50(DIG)/0xa0a(CCK-TH)",
3791                   u4tmp[0], u1tmp[0]);
3792
3793        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
3794        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
3795        u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
3796        seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3797                   "OFDM-FA/ CCK-FA",
3798                   u4tmp[0], (u1tmp[0] << 8) + u1tmp[1]);
3799
3800        u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3801        u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3802        u4tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3803        seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3804                   "0x6c0/0x6c4/0x6c8",
3805                   u4tmp[0], u4tmp[1], u4tmp[2]);
3806
3807        seq_printf(m, "\n %-35s = %d/ %d",
3808                   "0x770 (hi-pri Rx/Tx)",
3809                   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3810        seq_printf(m, "\n %-35s = %d/ %d",
3811                   "0x774(low-pri Rx/Tx)",
3812                   coex_sta->low_priority_rx, coex_sta->low_priority_tx);
3813
3814        /* Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang*/
3815        u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x41b);
3816        seq_printf(m, "\n %-35s = 0x%x",
3817                   "0x41b (mgntQ hang chk == 0xf)",
3818                   u1tmp[0]);
3819
3820        btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
3821}
3822
3823void ex_btc8821a2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3824{
3825        struct rtl_priv *rtlpriv = btcoexist->adapter;
3826
3827        if (BTC_IPS_ENTER == type) {
3828                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3829                        "[BTCoex], IPS ENTER notify\n");
3830                coex_sta->under_ips = true;
3831                btc8821a2ant_wifi_off_hw_cfg(btcoexist);
3832                btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3833                btc8821a2ant_coex_all_off(btcoexist);
3834        } else if (BTC_IPS_LEAVE == type) {
3835                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3836                        "[BTCoex], IPS LEAVE notify\n");
3837                coex_sta->under_ips = false;
3838                ex_btc8821a2ant_init_hwconfig(btcoexist);
3839                btc8821a2ant_init_coex_dm(btcoexist);
3840                btc8821a2ant_query_bt_info(btcoexist);
3841        }
3842}
3843
3844void ex_btc8821a2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3845{
3846        struct rtl_priv *rtlpriv = btcoexist->adapter;
3847
3848        if (BTC_LPS_ENABLE == type) {
3849                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3850                        "[BTCoex], LPS ENABLE notify\n");
3851                coex_sta->under_lps = true;
3852        } else if (BTC_LPS_DISABLE == type) {
3853                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3854                        "[BTCoex], LPS DISABLE notify\n");
3855                coex_sta->under_lps = false;
3856        }
3857}
3858
3859void ex_btc8821a2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3860{
3861        struct rtl_priv *rtlpriv = btcoexist->adapter;
3862
3863        if (BTC_SCAN_START == type) {
3864                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3865                        "[BTCoex], SCAN START notify\n");
3866        } else if (BTC_SCAN_FINISH == type) {
3867                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3868                        "[BTCoex], SCAN FINISH notify\n");
3869        }
3870}
3871
3872void ex_btc8821a2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3873{
3874        struct rtl_priv *rtlpriv = btcoexist->adapter;
3875
3876        if (BTC_ASSOCIATE_START == type) {
3877                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3878                        "[BTCoex], CONNECT START notify\n");
3879        } else if (BTC_ASSOCIATE_FINISH == type) {
3880                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3881                        "[BTCoex], CONNECT FINISH notify\n");
3882        }
3883}
3884
3885void ex_btc8821a2ant_media_status_notify(struct btc_coexist *btcoexist,
3886                                         u8 type)
3887{
3888        struct rtl_priv *rtlpriv = btcoexist->adapter;
3889        u8 h2c_parameter[3] = {0};
3890        u32 wifi_bw;
3891        u8 wifi_central_chnl;
3892        u8 ap_num = 0;
3893
3894        if (BTC_MEDIA_CONNECT == type) {
3895                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3896                        "[BTCoex], MEDIA connect notify\n");
3897        } else {
3898                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3899                        "[BTCoex], MEDIA disconnect notify\n");
3900        }
3901
3902        /* only 2.4G we need to inform bt the chnl mask */
3903        btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
3904                           &wifi_central_chnl);
3905        if ((BTC_MEDIA_CONNECT == type) &&
3906            (wifi_central_chnl <= 14)) {
3907                h2c_parameter[0] = 0x1;
3908                h2c_parameter[1] = wifi_central_chnl;
3909                btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3910                if (wifi_bw == BTC_WIFI_BW_HT40) {
3911                        h2c_parameter[2] = 0x30;
3912                } else {
3913                        h2c_parameter[2] = 0x20;
3914                        if (ap_num < 10)
3915                                h2c_parameter[2] = 0x30;
3916                        else
3917                                h2c_parameter[2] = 0x20;
3918                }
3919        }
3920
3921        coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3922        coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3923        coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3924
3925        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3926                "[BTCoex], FW write 0x66 = 0x%x\n",
3927                h2c_parameter[0] << 16 |
3928                h2c_parameter[1] << 8 |
3929                h2c_parameter[2]);
3930
3931        btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3932}
3933
3934void ex_btc8821a2ant_special_packet_notify(struct btc_coexist *btcoexist,
3935                                           u8 type)
3936{
3937        struct rtl_priv *rtlpriv = btcoexist->adapter;
3938
3939        if (type == BTC_PACKET_DHCP) {
3940                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3941                        "[BTCoex], DHCP Packet notify\n");
3942        }
3943}
3944
3945void ex_btc8821a2ant_bt_info_notify(struct btc_coexist *btcoexist,
3946                                    u8 *tmp_buf, u8 length)
3947{
3948        struct rtl_priv *rtlpriv = btcoexist->adapter;
3949        u8 bt_info = 0;
3950        u8 i, rsp_source = 0;
3951        bool bt_busy = false, limited_dig = false;
3952        bool wifi_connected = false, wifi_under_5g = false;
3953
3954        coex_sta->c2h_bt_info_req_sent = false;
3955        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3956        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3957                           &wifi_connected);
3958
3959        rsp_source = tmp_buf[0] & 0xf;
3960        if (rsp_source >= BT_INFO_SRC_8821A_2ANT_MAX)
3961                rsp_source = BT_INFO_SRC_8821A_2ANT_WIFI_FW;
3962        coex_sta->bt_info_c2h_cnt[rsp_source]++;
3963
3964        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3965                "[BTCoex], Bt info[%d], length = %d, hex data = [",
3966                rsp_source, length);
3967        for (i = 0; i < length; i++) {
3968                coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3969                if (i == 1)
3970                        bt_info = tmp_buf[i];
3971                if (i == length - 1) {
3972                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3973                                "0x%02x]\n", tmp_buf[i]);
3974                } else {
3975                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3976                                "0x%02x, ", tmp_buf[i]);
3977                }
3978        }
3979
3980        if (btcoexist->manual_control) {
3981                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3982                        "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
3983                return;
3984        }
3985
3986        if (BT_INFO_SRC_8821A_2ANT_WIFI_FW != rsp_source) {
3987                /* [3:0] */
3988                coex_sta->bt_retry_cnt =
3989                        coex_sta->bt_info_c2h[rsp_source][2]&0xf;
3990
3991                coex_sta->bt_rssi =
3992                        coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
3993
3994                coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
3995
3996                coex_sta->bt_tx_rx_mask =
3997                        (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
3998                btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
3999                                   &coex_sta->bt_tx_rx_mask);
4000                if (coex_sta->bt_tx_rx_mask) {
4001                        /* BT into is responded by BT FW and BT RF REG 0x3C !=
4002                         * 0x01 => Need to switch BT TRx Mask
4003                         */
4004                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4005                                "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n");
4006                        btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
4007                                                  0x3c, 0x01);
4008                }
4009
4010                /* Here we need to resend some wifi info to BT
4011                 * because bt is reset and loss of the info
4012                 */
4013                if ((coex_sta->bt_info_ext & BIT1)) {
4014                        btcoexist->btc_get(btcoexist,
4015                                BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
4016                        if (wifi_connected) {
4017                                ex_btc8821a2ant_media_status_notify(btcoexist,
4018                                        BTC_MEDIA_CONNECT);
4019                        } else {
4020                                ex_btc8821a2ant_media_status_notify(btcoexist,
4021                                        BTC_MEDIA_DISCONNECT);
4022                        }
4023
4024                }
4025
4026                if (!btcoexist->manual_control && !wifi_under_5g) {
4027                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4028                                "[BTCoex], BT ext info = 0x%x!!\n",
4029                                coex_sta->bt_info_ext);
4030                        if ((coex_sta->bt_info_ext & BIT(3))) {
4031                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4032                                        "[BTCoex], BT ext info bit3=1, wifi_connected=%d\n",
4033                                        wifi_connected);
4034                                if (wifi_connected) {
4035                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4036                                                DBG_LOUD,
4037                                                "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4038                                        btc8821a2ant_ignore_wlan_act(btcoexist,
4039                                                                     FORCE_EXEC,
4040                                                                     false);
4041                                }
4042                        } else {
4043                                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4044                                        "[BTCoex], BT ext info bit3=0, wifi_connected=%d\n",
4045                                        wifi_connected);
4046                                /* BT already NOT ignore Wlan active, do nothing
4047                                 * here.
4048                                 */
4049                                if (!wifi_connected) {
4050                                        rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4051                                                DBG_LOUD,
4052                                                "[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n");
4053                                        btc8821a2ant_ignore_wlan_act(
4054                                                btcoexist, FORCE_EXEC, true);
4055                                }
4056                        }
4057                }
4058        }
4059
4060        /* check BIT2 first ==> check if bt is under inquiry or page scan*/
4061        if (bt_info & BT_INFO_8821A_2ANT_B_INQ_PAGE) {
4062                coex_sta->c2h_bt_inquiry_page = true;
4063        } else {
4064                coex_sta->c2h_bt_inquiry_page = false;
4065        }
4066        /* set link exist status */
4067        if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4068                coex_sta->bt_link_exist = false;
4069                coex_sta->pan_exist = false;
4070                coex_sta->a2dp_exist = false;
4071                coex_sta->hid_exist = false;
4072                coex_sta->sco_exist = false;
4073        } else { /* connection exists */
4074                coex_sta->bt_link_exist = true;
4075                if (bt_info & BT_INFO_8821A_2ANT_B_FTP)
4076                        coex_sta->pan_exist = true;
4077                else
4078                        coex_sta->pan_exist = false;
4079                if (bt_info & BT_INFO_8821A_2ANT_B_A2DP)
4080                        coex_sta->a2dp_exist = true;
4081                else
4082                        coex_sta->a2dp_exist = false;
4083                if (bt_info & BT_INFO_8821A_2ANT_B_HID)
4084                        coex_sta->hid_exist = true;
4085                else
4086                        coex_sta->hid_exist = false;
4087                if (bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO)
4088                        coex_sta->sco_exist = true;
4089                else
4090                        coex_sta->sco_exist = false;
4091
4092                if ((!coex_sta->hid_exist) &&
4093                    (!coex_sta->c2h_bt_inquiry_page) &&
4094                    (!coex_sta->sco_exist)) {
4095                        if (coex_sta->high_priority_tx +
4096                                    coex_sta->high_priority_rx >= 160)
4097                                coex_sta->hid_exist = true;
4098                }
4099        }
4100
4101        btc8821a2ant_update_bt_link_info(btcoexist);
4102
4103        if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4104                coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_IDLE;
4105                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4106                        "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4107        } else if (bt_info == BT_INFO_8821A_2ANT_B_CONNECTION) {
4108                /* connection exists but no busy */
4109                coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_CON_IDLE;
4110                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4111                        "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4112        } else if ((bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO) ||
4113                   (bt_info & BT_INFO_8821A_2ANT_B_SCO_BUSY)) {
4114                coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_SCO_BUSY;
4115                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4116                        "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4117        } else if (bt_info & BT_INFO_8821A_2ANT_B_ACL_BUSY) {
4118                coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_ACL_BUSY;
4119                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4120                        "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4121        } else {
4122                coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_MAX;
4123                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4124                        "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4125        }
4126
4127        if ((coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_BUSY) ||
4128            (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_SCO_BUSY) ||
4129            (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY)) {
4130                bt_busy = true;
4131                limited_dig = true;
4132        } else {
4133                bt_busy = false;
4134                limited_dig = false;
4135        }
4136
4137        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4138
4139        coex_dm->limited_dig = limited_dig;
4140        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4141
4142        btc8821a2ant_run_coexist_mechanism(btcoexist);
4143}
4144
4145void ex_btc8821a2ant_halt_notify(struct btc_coexist *btcoexist)
4146{
4147        struct rtl_priv *rtlpriv = btcoexist->adapter;
4148
4149        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4150                "[BTCoex], Halt notify\n");
4151
4152        btc8821a2ant_wifi_off_hw_cfg(btcoexist);
4153        btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4154        ex_btc8821a2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4155}
4156
4157void ex_btc8821a2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
4158{
4159        struct rtl_priv *rtlpriv = btcoexist->adapter;
4160
4161        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
4162
4163        if (pnp_state == BTC_WIFI_PNP_SLEEP) {
4164                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4165                        "[BTCoex], Pnp notify to SLEEP\n");
4166        } else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
4167                rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4168                        "[BTCoex], Pnp notify to WAKE UP\n");
4169                ex_btc8821a2ant_init_hwconfig(btcoexist);
4170                btc8821a2ant_init_coex_dm(btcoexist);
4171                btc8821a2ant_query_bt_info(btcoexist);
4172        }
4173}
4174
4175void ex_btc8821a2ant_periodical(struct btc_coexist *btcoexist)
4176{
4177        struct rtl_priv *rtlpriv = btcoexist->adapter;
4178
4179        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4180                "[BTCoex], ==========================Periodical===========================\n");
4181
4182        if (coex_sta->dis_ver_info_cnt <= 5) {
4183                coex_sta->dis_ver_info_cnt += 1;
4184                if (coex_sta->dis_ver_info_cnt == 3) {
4185                        /* Antenna config to set 0x765 = 0x0 (GNT_BT control by
4186                         * PTA) after initial
4187                         */
4188                        rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4189                                "[BTCoex], Set GNT_BT control by PTA\n");
4190                        btc8821a2ant_set_ant_path(btcoexist,
4191                                        BTC_ANT_WIFI_AT_MAIN, false, false);
4192                }
4193        }
4194
4195        if (btcoexist->auto_report_2ant) {
4196                btc8821a2ant_query_bt_info(btcoexist);
4197        } else {
4198                btc8821a2ant_monitor_bt_ctr(btcoexist);
4199                btc8821a2ant_monitor_wifi_ctr(btcoexist);
4200
4201                if (btc8821a2ant_is_wifi_status_changed(btcoexist) ||
4202                    coex_dm->auto_tdma_adjust)
4203                        btc8821a2ant_run_coexist_mechanism(btcoexist);
4204        }
4205}
4206