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