linux/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8192e2ant.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 * Description:
  27 *
  28 * This file is for RTL8192E Co-exist mechanism
  29 *
  30 * History
  31 * 2012/11/15 Cosa first check in.
  32 *
  33 **************************************************************/
  34
  35/**************************************************************
  36 *   include files
  37 **************************************************************/
  38#include "halbt_precomp.h"
  39/**************************************************************
  40 *   Global variables, these are static variables
  41 **************************************************************/
  42static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant;
  43static struct coex_dm_8192e_2ant *coex_dm = &glcoex_dm_8192e_2ant;
  44static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant;
  45static struct coex_sta_8192e_2ant *coex_sta = &glcoex_sta_8192e_2ant;
  46
  47static const char *const GLBtInfoSrc8192e2Ant[] = {
  48        "BT Info[wifi fw]",
  49        "BT Info[bt rsp]",
  50        "BT Info[bt auto report]",
  51};
  52
  53static u32 glcoex_ver_date_8192e_2ant = 20130902;
  54static u32 glcoex_ver_8192e_2ant = 0x34;
  55
  56/**************************************************************
  57 *   local function proto type if needed
  58 **************************************************************/
  59/**************************************************************
  60 *   local function start with halbtc8192e2ant_
  61 **************************************************************/
  62static u8 halbtc8192e2ant_btrssi_state(u8 level_num, u8 rssi_thresh,
  63                                       u8 rssi_thresh1)
  64{
  65        int btrssi = 0;
  66        u8 btrssi_state = coex_sta->pre_bt_rssi_state;
  67
  68        btrssi = coex_sta->bt_rssi;
  69
  70        if (level_num == 2) {
  71                if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  72                    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  73                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
  74                                    "BT Rssi pre state = LOW\n");
  75                        if (btrssi >= (rssi_thresh +
  76                                       BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
  77                                btrssi_state = BTC_RSSI_STATE_HIGH;
  78                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
  79                                            "BT Rssi state switch to High\n");
  80                        } else {
  81                                btrssi_state = BTC_RSSI_STATE_STAY_LOW;
  82                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
  83                                            "BT Rssi state stay at Low\n");
  84                        }
  85                } else {
  86                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
  87                                    "BT Rssi pre state = HIGH\n");
  88                        if (btrssi < rssi_thresh) {
  89                                btrssi_state = BTC_RSSI_STATE_LOW;
  90                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
  91                                            "BT Rssi state switch to Low\n");
  92                        } else {
  93                                btrssi_state = BTC_RSSI_STATE_STAY_HIGH;
  94                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
  95                                            "BT Rssi state stay at High\n");
  96                        }
  97                }
  98        } else if (level_num == 3) {
  99                if (rssi_thresh > rssi_thresh1) {
 100                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
 101                                    "BT Rssi thresh error!!\n");
 102                        return coex_sta->pre_bt_rssi_state;
 103                }
 104
 105                if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
 106                    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
 107                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
 108                                    "BT Rssi pre state = LOW\n");
 109                        if (btrssi >= (rssi_thresh +
 110                                      BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
 111                                btrssi_state = BTC_RSSI_STATE_MEDIUM;
 112                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 113                                            "BT Rssi state switch to Medium\n");
 114                        } else {
 115                                btrssi_state = BTC_RSSI_STATE_STAY_LOW;
 116                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 117                                            "BT Rssi state stay at Low\n");
 118                        }
 119                } else if ((coex_sta->pre_bt_rssi_state ==
 120                            BTC_RSSI_STATE_MEDIUM) ||
 121                           (coex_sta->pre_bt_rssi_state ==
 122                            BTC_RSSI_STATE_STAY_MEDIUM)) {
 123                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
 124                                    "[BTCoex], BT Rssi pre state = MEDIUM\n");
 125                        if (btrssi >= (rssi_thresh1 +
 126                                       BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
 127                                btrssi_state = BTC_RSSI_STATE_HIGH;
 128                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 129                                            "BT Rssi state switch to High\n");
 130                        } else if (btrssi < rssi_thresh) {
 131                                btrssi_state = BTC_RSSI_STATE_LOW;
 132                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 133                                            "BT Rssi state switch to Low\n");
 134                        } else {
 135                                btrssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 136                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 137                                            "BT Rssi state stay at Medium\n");
 138                        }
 139                } else {
 140                        btc_alg_dbg(ALGO_BT_RSSI_STATE,
 141                                    "BT Rssi pre state = HIGH\n");
 142                        if (btrssi < rssi_thresh1) {
 143                                btrssi_state = BTC_RSSI_STATE_MEDIUM;
 144                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 145                                            "BT Rssi state switch to Medium\n");
 146                        } else {
 147                                btrssi_state = BTC_RSSI_STATE_STAY_HIGH;
 148                                btc_alg_dbg(ALGO_BT_RSSI_STATE,
 149                                            "BT Rssi state stay at High\n");
 150                        }
 151                }
 152        }
 153
 154        coex_sta->pre_bt_rssi_state = btrssi_state;
 155
 156        return btrssi_state;
 157}
 158
 159static u8 halbtc8192e2ant_wifirssi_state(struct btc_coexist *btcoexist,
 160                                         u8 index, u8 level_num, u8 rssi_thresh,
 161                                         u8 rssi_thresh1)
 162{
 163        int wifirssi = 0;
 164        u8 wifirssi_state = coex_sta->pre_wifi_rssi_state[index];
 165
 166        btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifirssi);
 167
 168        if (level_num == 2) {
 169                if ((coex_sta->pre_wifi_rssi_state[index] ==
 170                     BTC_RSSI_STATE_LOW) ||
 171                    (coex_sta->pre_wifi_rssi_state[index] ==
 172                     BTC_RSSI_STATE_STAY_LOW)) {
 173                        if (wifirssi >= (rssi_thresh +
 174                                         BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
 175                                wifirssi_state = BTC_RSSI_STATE_HIGH;
 176                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 177                                            "wifi RSSI state switch to High\n");
 178                        } else {
 179                                wifirssi_state = BTC_RSSI_STATE_STAY_LOW;
 180                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 181                                            "wifi RSSI state stay at Low\n");
 182                        }
 183                } else {
 184                        if (wifirssi < rssi_thresh) {
 185                                wifirssi_state = BTC_RSSI_STATE_LOW;
 186                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 187                                            "wifi RSSI state switch to Low\n");
 188                        } else {
 189                                wifirssi_state = BTC_RSSI_STATE_STAY_HIGH;
 190                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 191                                            "wifi RSSI state stay at High\n");
 192                        }
 193                }
 194        } else if (level_num == 3) {
 195                if (rssi_thresh > rssi_thresh1) {
 196                        btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 197                                    "wifi RSSI thresh error!!\n");
 198                        return coex_sta->pre_wifi_rssi_state[index];
 199                }
 200
 201                if ((coex_sta->pre_wifi_rssi_state[index] ==
 202                     BTC_RSSI_STATE_LOW) ||
 203                    (coex_sta->pre_wifi_rssi_state[index] ==
 204                     BTC_RSSI_STATE_STAY_LOW)) {
 205                        if (wifirssi >= (rssi_thresh +
 206                                         BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
 207                                wifirssi_state = BTC_RSSI_STATE_MEDIUM;
 208                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 209                                            "wifi RSSI state switch to Medium\n");
 210                        } else {
 211                                wifirssi_state = BTC_RSSI_STATE_STAY_LOW;
 212                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 213                                            "wifi RSSI state stay at Low\n");
 214                        }
 215                } else if ((coex_sta->pre_wifi_rssi_state[index] ==
 216                            BTC_RSSI_STATE_MEDIUM) ||
 217                           (coex_sta->pre_wifi_rssi_state[index] ==
 218                            BTC_RSSI_STATE_STAY_MEDIUM)) {
 219                        if (wifirssi >= (rssi_thresh1 +
 220                                         BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) {
 221                                wifirssi_state = BTC_RSSI_STATE_HIGH;
 222                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 223                                            "wifi RSSI state switch to High\n");
 224                        } else if (wifirssi < rssi_thresh) {
 225                                wifirssi_state = BTC_RSSI_STATE_LOW;
 226                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 227                                            "wifi RSSI state switch to Low\n");
 228                        } else {
 229                                wifirssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 230                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 231                                            "wifi RSSI state stay at Medium\n");
 232                        }
 233                } else {
 234                        if (wifirssi < rssi_thresh1) {
 235                                wifirssi_state = BTC_RSSI_STATE_MEDIUM;
 236                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 237                                            "wifi RSSI state switch to Medium\n");
 238                        } else {
 239                                wifirssi_state = BTC_RSSI_STATE_STAY_HIGH;
 240                                btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
 241                                            "wifi RSSI state stay at High\n");
 242                        }
 243                }
 244        }
 245
 246        coex_sta->pre_wifi_rssi_state[index] = wifirssi_state;
 247
 248        return wifirssi_state;
 249}
 250
 251static void btc8192e2ant_monitor_bt_enable_dis(struct btc_coexist *btcoexist)
 252{
 253        static bool pre_bt_disabled;
 254        static u32 bt_disable_cnt;
 255        bool bt_active = true, bt_disabled = false;
 256
 257        /* This function check if bt is disabled */
 258
 259        if (coex_sta->high_priority_tx == 0 &&
 260            coex_sta->high_priority_rx == 0 &&
 261            coex_sta->low_priority_tx == 0 &&
 262            coex_sta->low_priority_rx == 0)
 263                bt_active = false;
 264
 265        if (coex_sta->high_priority_tx == 0xffff &&
 266            coex_sta->high_priority_rx == 0xffff &&
 267            coex_sta->low_priority_tx == 0xffff &&
 268            coex_sta->low_priority_rx == 0xffff)
 269                bt_active = false;
 270
 271        if (bt_active) {
 272                bt_disable_cnt = 0;
 273                bt_disabled = false;
 274                btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
 275                                   &bt_disabled);
 276                btc_alg_dbg(ALGO_BT_MONITOR,
 277                            "[BTCoex], BT is enabled !!\n");
 278        } else {
 279                bt_disable_cnt++;
 280                btc_alg_dbg(ALGO_BT_MONITOR,
 281                            "[BTCoex], bt all counters = 0, %d times!!\n",
 282                            bt_disable_cnt);
 283                if (bt_disable_cnt >= 2) {
 284                        bt_disabled = true;
 285                        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
 286                                           &bt_disabled);
 287                        btc_alg_dbg(ALGO_BT_MONITOR,
 288                                    "[BTCoex], BT is disabled !!\n");
 289                }
 290        }
 291        if (pre_bt_disabled != bt_disabled) {
 292                btc_alg_dbg(ALGO_BT_MONITOR,
 293                            "[BTCoex], BT is from %s to %s!!\n",
 294                            (pre_bt_disabled ? "disabled" : "enabled"),
 295                            (bt_disabled ? "disabled" : "enabled"));
 296                pre_bt_disabled = bt_disabled;
 297        }
 298}
 299
 300static u32 halbtc8192e2ant_decidera_mask(struct btc_coexist *btcoexist,
 301                                         u8 sstype, u32 ra_masktype)
 302{
 303        u32 disra_mask = 0x0;
 304
 305        switch (ra_masktype) {
 306        case 0: /* normal mode */
 307                if (sstype == 2)
 308                        disra_mask = 0x0;       /* enable 2ss */
 309                else
 310                        disra_mask = 0xfff00000;/* disable 2ss */
 311                break;
 312        case 1: /* disable cck 1/2 */
 313                if (sstype == 2)
 314                        disra_mask = 0x00000003;/* enable 2ss */
 315                else
 316                        disra_mask = 0xfff00003;/* disable 2ss */
 317                break;
 318        case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
 319                if (sstype == 2)
 320                        disra_mask = 0x0001f1f7;/* enable 2ss */
 321                else
 322                        disra_mask = 0xfff1f1f7;/* disable 2ss */
 323                break;
 324        default:
 325                break;
 326        }
 327
 328        return disra_mask;
 329}
 330
 331static void halbtc8192e2ant_Updatera_mask(struct btc_coexist *btcoexist,
 332                                          bool force_exec, u32 dis_ratemask)
 333{
 334        coex_dm->curra_mask = dis_ratemask;
 335
 336        if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
 337                btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_ra_mask,
 338                                   &coex_dm->curra_mask);
 339        coex_dm->prera_mask = coex_dm->curra_mask;
 340}
 341
 342static void btc8192e2ant_autorate_fallback_retry(struct btc_coexist *btcoexist,
 343                                                 bool force_exec, u8 type)
 344{
 345        bool wifi_under_bmode = false;
 346
 347        coex_dm->cur_arfrtype = type;
 348
 349        if (force_exec || (coex_dm->pre_arfrtype != coex_dm->cur_arfrtype)) {
 350                switch (coex_dm->cur_arfrtype) {
 351                case 0: /* normal mode */
 352                        btcoexist->btc_write_4byte(btcoexist, 0x430,
 353                                                   coex_dm->backup_arfr_cnt1);
 354                        btcoexist->btc_write_4byte(btcoexist, 0x434,
 355                                                   coex_dm->backup_arfr_cnt2);
 356                        break;
 357                case 1:
 358                        btcoexist->btc_get(btcoexist,
 359                                           BTC_GET_BL_WIFI_UNDER_B_MODE,
 360                                           &wifi_under_bmode);
 361                        if (wifi_under_bmode) {
 362                                btcoexist->btc_write_4byte(btcoexist, 0x430,
 363                                                           0x0);
 364                                btcoexist->btc_write_4byte(btcoexist, 0x434,
 365                                                           0x01010101);
 366                        } else {
 367                                btcoexist->btc_write_4byte(btcoexist, 0x430,
 368                                                           0x0);
 369                                btcoexist->btc_write_4byte(btcoexist, 0x434,
 370                                                           0x04030201);
 371                        }
 372                        break;
 373                default:
 374                        break;
 375                }
 376        }
 377
 378        coex_dm->pre_arfrtype = coex_dm->cur_arfrtype;
 379}
 380
 381static void halbtc8192e2ant_retrylimit(struct btc_coexist *btcoexist,
 382                                       bool force_exec, u8 type)
 383{
 384        coex_dm->cur_retrylimit_type = type;
 385
 386        if (force_exec || (coex_dm->pre_retrylimit_type !=
 387                           coex_dm->cur_retrylimit_type)) {
 388                switch (coex_dm->cur_retrylimit_type) {
 389                case 0: /* normal mode */
 390                                btcoexist->btc_write_2byte(btcoexist, 0x42a,
 391                                                    coex_dm->backup_retrylimit);
 392                                break;
 393                case 1: /* retry limit = 8 */
 394                                btcoexist->btc_write_2byte(btcoexist, 0x42a,
 395                                                           0x0808);
 396                                break;
 397                default:
 398                                break;
 399                }
 400        }
 401
 402        coex_dm->pre_retrylimit_type = coex_dm->cur_retrylimit_type;
 403}
 404
 405static void halbtc8192e2ant_ampdu_maxtime(struct btc_coexist *btcoexist,
 406                                          bool force_exec, u8 type)
 407{
 408        coex_dm->cur_ampdutime_type = type;
 409
 410        if (force_exec || (coex_dm->pre_ampdutime_type !=
 411                           coex_dm->cur_ampdutime_type)) {
 412                switch (coex_dm->cur_ampdutime_type) {
 413                case 0: /* normal mode */
 414                        btcoexist->btc_write_1byte(btcoexist, 0x456,
 415                                                coex_dm->backup_ampdu_maxtime);
 416                        break;
 417                case 1: /* AMPDU timw = 0x38 * 32us */
 418                        btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
 419                        break;
 420                default:
 421                        break;
 422                }
 423        }
 424
 425        coex_dm->pre_ampdutime_type = coex_dm->cur_ampdutime_type;
 426}
 427
 428static void halbtc8192e2ant_limited_tx(struct btc_coexist *btcoexist,
 429                                       bool force_exec, u8 ra_masktype,
 430                                       u8 arfr_type, u8 retrylimit_type,
 431                                       u8 ampdutime_type)
 432{
 433        u32 disra_mask = 0x0;
 434
 435        coex_dm->curra_masktype = ra_masktype;
 436        disra_mask = halbtc8192e2ant_decidera_mask(btcoexist,
 437                                                   coex_dm->cur_sstype,
 438                                                   ra_masktype);
 439        halbtc8192e2ant_Updatera_mask(btcoexist, force_exec, disra_mask);
 440btc8192e2ant_autorate_fallback_retry(btcoexist, force_exec, arfr_type);
 441        halbtc8192e2ant_retrylimit(btcoexist, force_exec, retrylimit_type);
 442        halbtc8192e2ant_ampdu_maxtime(btcoexist, force_exec, ampdutime_type);
 443}
 444
 445static void halbtc8192e2ant_limited_rx(struct btc_coexist *btcoexist,
 446                                       bool force_exec, bool rej_ap_agg_pkt,
 447                                       bool bt_ctrl_agg_buf_size,
 448                                       u8 agg_buf_size)
 449{
 450        bool reject_rx_agg = rej_ap_agg_pkt;
 451        bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
 452        u8 rx_agg_size = agg_buf_size;
 453
 454        /*********************************************
 455         *      Rx Aggregation related setting
 456         *********************************************/
 457        btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
 458                           &reject_rx_agg);
 459        /* decide BT control aggregation buf size or not */
 460        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
 461                           &bt_ctrl_rx_agg_size);
 462        /* aggregation buf size, only work
 463         * when BT control Rx aggregation size.
 464         */
 465        btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
 466        /* real update aggregation setting */
 467        btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
 468}
 469
 470static void halbtc8192e2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
 471{
 472        u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
 473        u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
 474
 475        reg_hp_txrx = 0x770;
 476        reg_lp_txrx = 0x774;
 477
 478        u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
 479        reg_hp_tx = u32tmp & MASKLWORD;
 480        reg_hp_rx = (u32tmp & MASKHWORD)>>16;
 481
 482        u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
 483        reg_lp_tx = u32tmp & MASKLWORD;
 484        reg_lp_rx = (u32tmp & MASKHWORD)>>16;
 485
 486        coex_sta->high_priority_tx = reg_hp_tx;
 487        coex_sta->high_priority_rx = reg_hp_rx;
 488        coex_sta->low_priority_tx = reg_lp_tx;
 489        coex_sta->low_priority_rx = reg_lp_rx;
 490
 491        btc_alg_dbg(ALGO_BT_MONITOR,
 492                    "[BTCoex] High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 493                    reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
 494        btc_alg_dbg(ALGO_BT_MONITOR,
 495                    "[BTCoex] Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 496                    reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
 497
 498        /* reset counter */
 499        btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
 500}
 501
 502static void halbtc8192e2ant_querybt_info(struct btc_coexist *btcoexist)
 503{
 504        u8 h2c_parameter[1] = {0};
 505
 506        coex_sta->c2h_bt_info_req_sent = true;
 507
 508        h2c_parameter[0] |= BIT0;       /* trigger */
 509
 510        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
 511                    "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
 512                    h2c_parameter[0]);
 513
 514        btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
 515}
 516
 517static void halbtc8192e2ant_update_btlink_info(struct btc_coexist *btcoexist)
 518{
 519        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 520        bool bt_hson = false;
 521
 522        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hson);
 523
 524        bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
 525        bt_link_info->sco_exist = coex_sta->sco_exist;
 526        bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
 527        bt_link_info->pan_exist = coex_sta->pan_exist;
 528        bt_link_info->hid_exist = coex_sta->hid_exist;
 529
 530        /* work around for HS mode. */
 531        if (bt_hson) {
 532                bt_link_info->pan_exist = true;
 533                bt_link_info->bt_link_exist = true;
 534        }
 535
 536        /* check if Sco only */
 537        if (bt_link_info->sco_exist &&
 538            !bt_link_info->a2dp_exist &&
 539            !bt_link_info->pan_exist &&
 540            !bt_link_info->hid_exist)
 541                bt_link_info->sco_only = true;
 542        else
 543                bt_link_info->sco_only = false;
 544
 545        /* check if A2dp only */
 546        if (!bt_link_info->sco_exist &&
 547            bt_link_info->a2dp_exist &&
 548            !bt_link_info->pan_exist &&
 549            !bt_link_info->hid_exist)
 550                bt_link_info->a2dp_only = true;
 551        else
 552                bt_link_info->a2dp_only = false;
 553
 554        /* check if Pan only */
 555        if (!bt_link_info->sco_exist &&
 556            !bt_link_info->a2dp_exist &&
 557            bt_link_info->pan_exist &&
 558            !bt_link_info->hid_exist)
 559                bt_link_info->pan_only = true;
 560        else
 561                bt_link_info->pan_only = false;
 562
 563        /* check if Hid only */
 564        if (!bt_link_info->sco_exist &&
 565            !bt_link_info->a2dp_exist &&
 566            !bt_link_info->pan_exist &&
 567            bt_link_info->hid_exist)
 568                bt_link_info->hid_only = true;
 569        else
 570                bt_link_info->hid_only = false;
 571}
 572
 573static u8 halbtc8192e2ant_action_algorithm(struct btc_coexist *btcoexist)
 574{
 575        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 576        struct btc_stack_info *stack_info = &btcoexist->stack_info;
 577        bool bt_hson = false;
 578        u8 algorithm = BT_8192E_2ANT_COEX_ALGO_UNDEFINED;
 579        u8 numdiffprofile = 0;
 580
 581        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hson);
 582
 583        if (!bt_link_info->bt_link_exist) {
 584                btc_alg_dbg(ALGO_TRACE,
 585                            "No BT link exists!!!\n");
 586                return algorithm;
 587        }
 588
 589        if (bt_link_info->sco_exist)
 590                numdiffprofile++;
 591        if (bt_link_info->hid_exist)
 592                numdiffprofile++;
 593        if (bt_link_info->pan_exist)
 594                numdiffprofile++;
 595        if (bt_link_info->a2dp_exist)
 596                numdiffprofile++;
 597
 598        if (numdiffprofile == 1) {
 599                if (bt_link_info->sco_exist) {
 600                        btc_alg_dbg(ALGO_TRACE,
 601                                    "SCO only\n");
 602                        algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 603                } else {
 604                        if (bt_link_info->hid_exist) {
 605                                btc_alg_dbg(ALGO_TRACE,
 606                                            "HID only\n");
 607                                algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
 608                        } else if (bt_link_info->a2dp_exist) {
 609                                btc_alg_dbg(ALGO_TRACE,
 610                                            "A2DP only\n");
 611                                algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP;
 612                        } else if (bt_link_info->pan_exist) {
 613                                if (bt_hson) {
 614                                        btc_alg_dbg(ALGO_TRACE,
 615                                                    "PAN(HS) only\n");
 616                                        algorithm =
 617                                                BT_8192E_2ANT_COEX_ALGO_PANHS;
 618                                } else {
 619                                        btc_alg_dbg(ALGO_TRACE,
 620                                                    "PAN(EDR) only\n");
 621                                        algorithm =
 622                                                BT_8192E_2ANT_COEX_ALGO_PANEDR;
 623                                }
 624                        }
 625                }
 626        } else if (numdiffprofile == 2) {
 627                if (bt_link_info->sco_exist) {
 628                        if (bt_link_info->hid_exist) {
 629                                btc_alg_dbg(ALGO_TRACE,
 630                                            "SCO + HID\n");
 631                                algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 632                        } else if (bt_link_info->a2dp_exist) {
 633                                btc_alg_dbg(ALGO_TRACE,
 634                                            "SCO + A2DP ==> SCO\n");
 635                                algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 636                        } else if (bt_link_info->pan_exist) {
 637                                if (bt_hson) {
 638                                        btc_alg_dbg(ALGO_TRACE,
 639                                                    "SCO + PAN(HS)\n");
 640                                        algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 641                                } else {
 642                                        btc_alg_dbg(ALGO_TRACE,
 643                                                    "SCO + PAN(EDR)\n");
 644                                        algorithm =
 645                                                BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
 646                                }
 647                        }
 648                } else {
 649                        if (bt_link_info->hid_exist &&
 650                            bt_link_info->a2dp_exist) {
 651                                if (stack_info->num_of_hid >= 2) {
 652                                        btc_alg_dbg(ALGO_TRACE,
 653                                                    "HID*2 + A2DP\n");
 654                                        algorithm =
 655                                        BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
 656                                } else {
 657                                        btc_alg_dbg(ALGO_TRACE,
 658                                                    "HID + A2DP\n");
 659                                        algorithm =
 660                                            BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
 661                                }
 662                        } else if (bt_link_info->hid_exist &&
 663                                   bt_link_info->pan_exist) {
 664                                if (bt_hson) {
 665                                        btc_alg_dbg(ALGO_TRACE,
 666                                                    "HID + PAN(HS)\n");
 667                                        algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
 668                                } else {
 669                                        btc_alg_dbg(ALGO_TRACE,
 670                                                    "HID + PAN(EDR)\n");
 671                                        algorithm =
 672                                            BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 673                                }
 674                        } else if (bt_link_info->pan_exist &&
 675                                   bt_link_info->a2dp_exist) {
 676                                if (bt_hson) {
 677                                        btc_alg_dbg(ALGO_TRACE,
 678                                                    "A2DP + PAN(HS)\n");
 679                                        algorithm =
 680                                            BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS;
 681                                } else {
 682                                        btc_alg_dbg(ALGO_TRACE,
 683                                                    "A2DP + PAN(EDR)\n");
 684                                        algorithm =
 685                                            BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP;
 686                                }
 687                        }
 688                }
 689        } else if (numdiffprofile == 3) {
 690                if (bt_link_info->sco_exist) {
 691                        if (bt_link_info->hid_exist &&
 692                            bt_link_info->a2dp_exist) {
 693                                btc_alg_dbg(ALGO_TRACE,
 694                                            "SCO + HID + A2DP ==> HID\n");
 695                                algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 696                        } else if (bt_link_info->hid_exist &&
 697                                   bt_link_info->pan_exist) {
 698                                if (bt_hson) {
 699                                        btc_alg_dbg(ALGO_TRACE,
 700                                                    "SCO + HID + PAN(HS)\n");
 701                                        algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 702                                } else {
 703                                        btc_alg_dbg(ALGO_TRACE,
 704                                                    "SCO + HID + PAN(EDR)\n");
 705                                        algorithm =
 706                                                BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
 707                                }
 708                        } else if (bt_link_info->pan_exist &&
 709                                   bt_link_info->a2dp_exist) {
 710                                if (bt_hson) {
 711                                        btc_alg_dbg(ALGO_TRACE,
 712                                                    "SCO + A2DP + PAN(HS)\n");
 713                                        algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 714                                } else {
 715                                        btc_alg_dbg(ALGO_TRACE,
 716                                                    "SCO + A2DP + PAN(EDR)\n");
 717                                        algorithm =
 718                                            BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 719                                }
 720                        }
 721                } else {
 722                        if (bt_link_info->hid_exist &&
 723                            bt_link_info->pan_exist &&
 724                            bt_link_info->a2dp_exist) {
 725                                if (bt_hson) {
 726                                        btc_alg_dbg(ALGO_TRACE,
 727                                                    "HID + A2DP + PAN(HS)\n");
 728                                        algorithm =
 729                                            BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
 730                                } else {
 731                                        btc_alg_dbg(ALGO_TRACE,
 732                                                    "HID + A2DP + PAN(EDR)\n");
 733                                        algorithm =
 734                                        BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
 735                                }
 736                        }
 737                }
 738        } else if (numdiffprofile >= 3) {
 739                if (bt_link_info->sco_exist) {
 740                        if (bt_link_info->hid_exist &&
 741                            bt_link_info->pan_exist &&
 742                            bt_link_info->a2dp_exist) {
 743                                if (bt_hson) {
 744                                        btc_alg_dbg(ALGO_TRACE,
 745                                                    "ErrorSCO+HID+A2DP+PAN(HS)\n");
 746
 747                                } else {
 748                                        btc_alg_dbg(ALGO_TRACE,
 749                                                    "SCO+HID+A2DP+PAN(EDR)\n");
 750                                        algorithm =
 751                                            BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 752                                }
 753                        }
 754                }
 755        }
 756
 757        return algorithm;
 758}
 759
 760static void halbtc8192e2ant_setfw_dac_swinglevel(struct btc_coexist *btcoexist,
 761                                                 u8 dac_swinglvl)
 762{
 763        u8 h2c_parameter[1] = {0};
 764
 765        /* There are several type of dacswing
 766         * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
 767         */
 768        h2c_parameter[0] = dac_swinglvl;
 769
 770        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
 771                    "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swinglvl);
 772        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
 773                    "[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]);
 774
 775        btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
 776}
 777
 778static void halbtc8192e2ant_set_fwdec_btpwr(struct btc_coexist *btcoexist,
 779                                            u8 dec_btpwr_lvl)
 780{
 781        u8 h2c_parameter[1] = {0};
 782
 783        h2c_parameter[0] = dec_btpwr_lvl;
 784
 785        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
 786                    "[BTCoex] decrease Bt Power level = %d, FW write 0x62 = 0x%x\n",
 787                    dec_btpwr_lvl, h2c_parameter[0]);
 788
 789        btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
 790}
 791
 792static void halbtc8192e2ant_dec_btpwr(struct btc_coexist *btcoexist,
 793                                      bool force_exec, u8 dec_btpwr_lvl)
 794{
 795        btc_alg_dbg(ALGO_TRACE_FW,
 796                    "[BTCoex], %s Dec BT power level = %d\n",
 797                    (force_exec ? "force to" : ""), dec_btpwr_lvl);
 798        coex_dm->cur_dec_bt_pwr = dec_btpwr_lvl;
 799
 800        if (!force_exec) {
 801                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
 802                            "[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n",
 803                            coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr);
 804        }
 805        halbtc8192e2ant_set_fwdec_btpwr(btcoexist, coex_dm->cur_dec_bt_pwr);
 806
 807        coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
 808}
 809
 810static void halbtc8192e2ant_set_bt_autoreport(struct btc_coexist *btcoexist,
 811                                              bool enable_autoreport)
 812{
 813        u8 h2c_parameter[1] = {0};
 814
 815        h2c_parameter[0] = 0;
 816
 817        if (enable_autoreport)
 818                h2c_parameter[0] |= BIT0;
 819
 820        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
 821                    "[BTCoex], BT FW auto report : %s, FW write 0x68 = 0x%x\n",
 822                    (enable_autoreport ? "Enabled!!" : "Disabled!!"),
 823                    h2c_parameter[0]);
 824
 825        btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
 826}
 827
 828static void halbtc8192e2ant_bt_autoreport(struct btc_coexist *btcoexist,
 829                                          bool force_exec,
 830                                          bool enable_autoreport)
 831{
 832        btc_alg_dbg(ALGO_TRACE_FW,
 833                    "[BTCoex], %s BT Auto report = %s\n",
 834                    (force_exec ? "force to" : ""),
 835                    ((enable_autoreport) ? "Enabled" : "Disabled"));
 836        coex_dm->cur_bt_auto_report = enable_autoreport;
 837
 838        if (!force_exec) {
 839                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
 840                            "[BTCoex] bPreBtAutoReport=%d, bCurBtAutoReport=%d\n",
 841                            coex_dm->pre_bt_auto_report,
 842                            coex_dm->cur_bt_auto_report);
 843
 844                if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
 845                        return;
 846        }
 847        halbtc8192e2ant_set_bt_autoreport(btcoexist,
 848                                          coex_dm->cur_bt_auto_report);
 849
 850        coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
 851}
 852
 853static void halbtc8192e2ant_fw_dac_swinglvl(struct btc_coexist *btcoexist,
 854                                            bool force_exec, u8 fw_dac_swinglvl)
 855{
 856        btc_alg_dbg(ALGO_TRACE_FW,
 857                    "[BTCoex], %s set FW Dac Swing level = %d\n",
 858                    (force_exec ? "force to" : ""), fw_dac_swinglvl);
 859        coex_dm->cur_fw_dac_swing_lvl = fw_dac_swinglvl;
 860
 861        if (!force_exec) {
 862                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
 863                            "[BTCoex] preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
 864                            coex_dm->pre_fw_dac_swing_lvl,
 865                            coex_dm->cur_fw_dac_swing_lvl);
 866
 867                if (coex_dm->pre_fw_dac_swing_lvl ==
 868                    coex_dm->cur_fw_dac_swing_lvl)
 869                        return;
 870        }
 871
 872        halbtc8192e2ant_setfw_dac_swinglevel(btcoexist,
 873                                             coex_dm->cur_fw_dac_swing_lvl);
 874
 875        coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
 876}
 877
 878static void btc8192e2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
 879                                                 bool rx_rf_shrink_on)
 880{
 881        if (rx_rf_shrink_on) {
 882                /* Shrink RF Rx LPF corner */
 883                btc_alg_dbg(ALGO_TRACE_SW_EXEC,
 884                            "[BTCoex], Shrink RF Rx LPF corner!!\n");
 885                btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
 886                                          0xfffff, 0xffffc);
 887        } else {
 888                /* Resume RF Rx LPF corner
 889                 * After initialized, we can use coex_dm->btRf0x1eBackup
 890                 */
 891                if (btcoexist->initilized) {
 892                        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
 893                                    "[BTCoex], Resume RF Rx LPF corner!!\n");
 894                        btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
 895                                                  0xfffff,
 896                                                  coex_dm->bt_rf0x1e_backup);
 897                }
 898        }
 899}
 900
 901static void halbtc8192e2ant_rf_shrink(struct btc_coexist *btcoexist,
 902                                      bool force_exec, bool rx_rf_shrink_on)
 903{
 904        btc_alg_dbg(ALGO_TRACE_SW,
 905                    "[BTCoex], %s turn Rx RF Shrink = %s\n",
 906                    (force_exec ? "force to" : ""),
 907                    ((rx_rf_shrink_on) ? "ON" : "OFF"));
 908        coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
 909
 910        if (!force_exec) {
 911                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
 912                            "[BTCoex]bPreRfRxLpfShrink=%d,bCurRfRxLpfShrink=%d\n",
 913                            coex_dm->pre_rf_rx_lpf_shrink,
 914                            coex_dm->cur_rf_rx_lpf_shrink);
 915
 916                if (coex_dm->pre_rf_rx_lpf_shrink ==
 917                    coex_dm->cur_rf_rx_lpf_shrink)
 918                        return;
 919        }
 920        btc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist,
 921                                             coex_dm->cur_rf_rx_lpf_shrink);
 922
 923        coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
 924}
 925
 926static void halbtc8192e2ant_set_dac_swingreg(struct btc_coexist *btcoexist,
 927                                             u32 level)
 928{
 929        u8 val = (u8)level;
 930
 931        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
 932                    "[BTCoex], Write SwDacSwing = 0x%x\n", level);
 933        btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
 934}
 935
 936static void btc8192e2ant_setsw_full_swing(struct btc_coexist *btcoexist,
 937                                          bool sw_dac_swingon,
 938                                          u32 sw_dac_swinglvl)
 939{
 940        if (sw_dac_swingon)
 941                halbtc8192e2ant_set_dac_swingreg(btcoexist, sw_dac_swinglvl);
 942        else
 943                halbtc8192e2ant_set_dac_swingreg(btcoexist, 0x18);
 944}
 945
 946static void halbtc8192e2ant_DacSwing(struct btc_coexist *btcoexist,
 947                                     bool force_exec, bool dac_swingon,
 948                                     u32 dac_swinglvl)
 949{
 950        btc_alg_dbg(ALGO_TRACE_SW,
 951                    "[BTCoex], %s turn DacSwing=%s, dac_swinglvl = 0x%x\n",
 952                    (force_exec ? "force to" : ""),
 953                    ((dac_swingon) ? "ON" : "OFF"), dac_swinglvl);
 954        coex_dm->cur_dac_swing_on = dac_swingon;
 955        coex_dm->cur_dac_swing_lvl = dac_swinglvl;
 956
 957        if (!force_exec) {
 958                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
 959                            "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl = 0x%x, ",
 960                            coex_dm->pre_dac_swing_on,
 961                            coex_dm->pre_dac_swing_lvl);
 962                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
 963                            "bCurDacSwingOn=%d, curDacSwingLvl = 0x%x\n",
 964                            coex_dm->cur_dac_swing_on,
 965                            coex_dm->cur_dac_swing_lvl);
 966
 967                if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
 968                    (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
 969                        return;
 970        }
 971        mdelay(30);
 972        btc8192e2ant_setsw_full_swing(btcoexist, dac_swingon, dac_swinglvl);
 973
 974        coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
 975        coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
 976}
 977
 978static void halbtc8192e2ant_set_agc_table(struct btc_coexist *btcoexist,
 979                                          bool agc_table_en)
 980{
 981        /* BB AGC Gain Table */
 982        if (agc_table_en) {
 983                btc_alg_dbg(ALGO_TRACE_SW_EXEC,
 984                            "[BTCoex], BB Agc Table On!\n");
 985                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x0a1A0001);
 986                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x091B0001);
 987                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x081C0001);
 988                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x071D0001);
 989                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x061E0001);
 990                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x051F0001);
 991        } else {
 992                btc_alg_dbg(ALGO_TRACE_SW_EXEC,
 993                            "[BTCoex], BB Agc Table Off!\n");
 994                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
 995                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
 996                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
 997                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
 998                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
 999                btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
1000        }
1001}
1002
1003static void halbtc8192e2ant_AgcTable(struct btc_coexist *btcoexist,
1004                                     bool force_exec, bool agc_table_en)
1005{
1006        btc_alg_dbg(ALGO_TRACE_SW,
1007                    "[BTCoex], %s %s Agc Table\n",
1008                    (force_exec ? "force to" : ""),
1009                    ((agc_table_en) ? "Enable" : "Disable"));
1010        coex_dm->cur_agc_table_en = agc_table_en;
1011
1012        if (!force_exec) {
1013                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
1014                            "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
1015                            coex_dm->pre_agc_table_en,
1016                            coex_dm->cur_agc_table_en);
1017
1018                if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
1019                        return;
1020        }
1021        halbtc8192e2ant_set_agc_table(btcoexist, agc_table_en);
1022
1023        coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
1024}
1025
1026static void halbtc8192e2ant_set_coex_table(struct btc_coexist *btcoexist,
1027                                           u32 val0x6c0, u32 val0x6c4,
1028                                           u32 val0x6c8, u8 val0x6cc)
1029{
1030        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
1031                    "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
1032        btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1033
1034        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
1035                    "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
1036        btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1037
1038        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
1039                    "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
1040        btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1041
1042        btc_alg_dbg(ALGO_TRACE_SW_EXEC,
1043                    "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
1044        btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1045}
1046
1047static void halbtc8192e2ant_coex_table(struct btc_coexist *btcoexist,
1048                                       bool force_exec,
1049                                       u32 val0x6c0, u32 val0x6c4,
1050                                       u32 val0x6c8, u8 val0x6cc)
1051{
1052        btc_alg_dbg(ALGO_TRACE_SW,
1053                    "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, ",
1054                    (force_exec ? "force to" : ""), val0x6c0);
1055        btc_alg_dbg(ALGO_TRACE_SW,
1056                    "0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
1057                    val0x6c4, val0x6c8, val0x6cc);
1058        coex_dm->cur_val0x6c0 = val0x6c0;
1059        coex_dm->cur_val0x6c4 = val0x6c4;
1060        coex_dm->cur_val0x6c8 = val0x6c8;
1061        coex_dm->cur_val0x6cc = val0x6cc;
1062
1063        if (!force_exec) {
1064                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
1065                            "[BTCoex], preVal0x6c0 = 0x%x, preVal0x6c4 = 0x%x, ",
1066                            coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4);
1067                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
1068                            "preVal0x6c8 = 0x%x, preVal0x6cc = 0x%x !!\n",
1069                            coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
1070                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
1071                            "[BTCoex], curVal0x6c0 = 0x%x, curVal0x6c4 = 0x%x\n",
1072                            coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4);
1073                btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
1074                            "curVal0x6c8 = 0x%x, curVal0x6cc = 0x%x !!\n",
1075                            coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);
1076
1077                if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1078                    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1079                    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1080                    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1081                        return;
1082        }
1083        halbtc8192e2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
1084                                       val0x6c8, val0x6cc);
1085
1086        coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1087        coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1088        coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1089        coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1090}
1091
1092static void btc8192e2ant_coex_tbl_w_type(struct btc_coexist *btcoexist,
1093                                         bool force_exec, u8 type)
1094{
1095        switch (type) {
1096        case 0:
1097                halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555,
1098                                           0x5a5a5a5a, 0xffffff, 0x3);
1099                break;
1100        case 1:
1101                halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1102                                           0x5a5a5a5a, 0xffffff, 0x3);
1103                break;
1104        case 2:
1105                halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555,
1106                                           0x5ffb5ffb, 0xffffff, 0x3);
1107                break;
1108        case 3:
1109                halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff,
1110                                           0x5fdb5fdb, 0xffffff, 0x3);
1111                break;
1112        case 4:
1113                halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff,
1114                                           0x5ffb5ffb, 0xffffff, 0x3);
1115                break;
1116        default:
1117                break;
1118        }
1119}
1120
1121static void halbtc8192e2ant_set_fw_ignore_wlanact(struct btc_coexist *btcoexist,
1122                                                  bool enable)
1123{
1124        u8 h2c_parameter[1] = {0};
1125
1126        if (enable)
1127                h2c_parameter[0] |= BIT0; /* function enable */
1128
1129        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
1130                    "[BTCoex]set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
1131                    h2c_parameter[0]);
1132
1133        btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1134}
1135
1136static void halbtc8192e2ant_IgnoreWlanAct(struct btc_coexist *btcoexist,
1137                                          bool force_exec, bool enable)
1138{
1139        btc_alg_dbg(ALGO_TRACE_FW,
1140                    "[BTCoex], %s turn Ignore WlanAct %s\n",
1141                    (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1142        coex_dm->cur_ignore_wlan_act = enable;
1143
1144        if (!force_exec) {
1145                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1146                            "[BTCoex], bPreIgnoreWlanAct = %d ",
1147                            coex_dm->pre_ignore_wlan_act);
1148                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1149                            "bCurIgnoreWlanAct = %d!!\n",
1150                            coex_dm->cur_ignore_wlan_act);
1151
1152                if (coex_dm->pre_ignore_wlan_act ==
1153                    coex_dm->cur_ignore_wlan_act)
1154                        return;
1155        }
1156        halbtc8192e2ant_set_fw_ignore_wlanact(btcoexist, enable);
1157
1158        coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1159}
1160
1161static void halbtc8192e2ant_SetFwPstdma(struct btc_coexist *btcoexist, u8 byte1,
1162                                        u8 byte2, u8 byte3, u8 byte4, u8 byte5)
1163{
1164        u8 h2c_parameter[5] = {0};
1165
1166        h2c_parameter[0] = byte1;
1167        h2c_parameter[1] = byte2;
1168        h2c_parameter[2] = byte3;
1169        h2c_parameter[3] = byte4;
1170        h2c_parameter[4] = byte5;
1171
1172        coex_dm->ps_tdma_para[0] = byte1;
1173        coex_dm->ps_tdma_para[1] = byte2;
1174        coex_dm->ps_tdma_para[2] = byte3;
1175        coex_dm->ps_tdma_para[3] = byte4;
1176        coex_dm->ps_tdma_para[4] = byte5;
1177
1178        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
1179                    "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1180                    h2c_parameter[0],
1181                    h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
1182                    h2c_parameter[3] << 8 | h2c_parameter[4]);
1183
1184        btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1185}
1186
1187static void btc8192e2ant_sw_mec1(struct btc_coexist *btcoexist,
1188                                 bool shrink_rx_lpf, bool low_penalty_ra,
1189                                 bool limited_dig, bool btlan_constrain)
1190{
1191        halbtc8192e2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
1192}
1193
1194static void btc8192e2ant_sw_mec2(struct btc_coexist *btcoexist,
1195                                 bool agc_table_shift, bool adc_backoff,
1196                                 bool sw_dac_swing, u32 dac_swinglvl)
1197{
1198        halbtc8192e2ant_AgcTable(btcoexist, NORMAL_EXEC, agc_table_shift);
1199        halbtc8192e2ant_DacSwing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1200                                 dac_swinglvl);
1201}
1202
1203static void halbtc8192e2ant_ps_tdma(struct btc_coexist *btcoexist,
1204                                    bool force_exec, bool turn_on, u8 type)
1205{
1206        btc_alg_dbg(ALGO_TRACE_FW,
1207                    "[BTCoex], %s turn %s PS TDMA, type=%d\n",
1208                    (force_exec ? "force to" : ""),
1209                    (turn_on ? "ON" : "OFF"), type);
1210        coex_dm->cur_ps_tdma_on = turn_on;
1211        coex_dm->cur_ps_tdma = type;
1212
1213        if (!force_exec) {
1214                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1215                            "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1216                            coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1217                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1218                            "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1219                            coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1220
1221                if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1222                    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1223                        return;
1224        }
1225        if (turn_on) {
1226                switch (type) {
1227                case 1:
1228                default:
1229                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1a,
1230                                                    0x1a, 0xe1, 0x90);
1231                        break;
1232                case 2:
1233                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x12,
1234                                                    0x12, 0xe1, 0x90);
1235                        break;
1236                case 3:
1237                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1c,
1238                                                    0x3, 0xf1, 0x90);
1239                        break;
1240                case 4:
1241                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x10,
1242                                                    0x3, 0xf1, 0x90);
1243                        break;
1244                case 5:
1245                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1a,
1246                                                    0x1a, 0x60, 0x90);
1247                        break;
1248                case 6:
1249                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x12,
1250                                                    0x12, 0x60, 0x90);
1251                        break;
1252                case 7:
1253                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1c,
1254                                                    0x3, 0x70, 0x90);
1255                        break;
1256                case 8:
1257                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xa3, 0x10,
1258                                                    0x3, 0x70, 0x90);
1259                        break;
1260                case 9:
1261                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1a,
1262                                                    0x1a, 0xe1, 0x10);
1263                        break;
1264                case 10:
1265                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x12,
1266                                                    0x12, 0xe1, 0x10);
1267                        break;
1268                case 11:
1269                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1c,
1270                                                    0x3, 0xf1, 0x10);
1271                        break;
1272                case 12:
1273                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x10,
1274                                                    0x3, 0xf1, 0x10);
1275                        break;
1276                case 13:
1277                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1a,
1278                                                    0x1a, 0xe0, 0x10);
1279                        break;
1280                case 14:
1281                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x12,
1282                                                    0x12, 0xe0, 0x10);
1283                        break;
1284                case 15:
1285                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1c,
1286                                                    0x3, 0xf0, 0x10);
1287                        break;
1288                case 16:
1289                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x12,
1290                                                    0x3, 0xf0, 0x10);
1291                        break;
1292                case 17:
1293                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0x61, 0x20,
1294                                                    0x03, 0x10, 0x10);
1295                        break;
1296                case 18:
1297                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x5,
1298                                                    0x5, 0xe1, 0x90);
1299                        break;
1300                case 19:
1301                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x25,
1302                                                    0x25, 0xe1, 0x90);
1303                        break;
1304                case 20:
1305                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x25,
1306                                                    0x25, 0x60, 0x90);
1307                        break;
1308                case 21:
1309                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x15,
1310                                                    0x03, 0x70, 0x90);
1311                        break;
1312                case 71:
1313                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0xe3, 0x1a,
1314                                                    0x1a, 0xe1, 0x90);
1315                        break;
1316                }
1317        } else {
1318                /* disable PS tdma */
1319                switch (type) {
1320                default:
1321                case 0:
1322                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0x8, 0x0, 0x0,
1323                                                    0x0, 0x0);
1324                        btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1325                        break;
1326                case 1:
1327                        halbtc8192e2ant_SetFwPstdma(btcoexist, 0x0, 0x0, 0x0,
1328                                                    0x8, 0x0);
1329                        mdelay(5);
1330                        btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
1331                        break;
1332                }
1333        }
1334
1335        /* update pre state */
1336        coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1337        coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1338}
1339
1340static void halbtc8192e2ant_set_switch_sstype(struct btc_coexist *btcoexist,
1341                                              u8 sstype)
1342{
1343        u8 mimops = BTC_MIMO_PS_DYNAMIC;
1344        u32 disra_mask = 0x0;
1345
1346        btc_alg_dbg(ALGO_TRACE,
1347                    "[BTCoex], REAL set SS Type = %d\n", sstype);
1348
1349        disra_mask = halbtc8192e2ant_decidera_mask(btcoexist, sstype,
1350                                                   coex_dm->curra_masktype);
1351        halbtc8192e2ant_Updatera_mask(btcoexist, FORCE_EXEC, disra_mask);
1352
1353        if (sstype == 1) {
1354                halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1355                /* switch ofdm path */
1356                btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x11);
1357                btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x1);
1358                btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81111111);
1359                /* switch cck patch */
1360                btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x1);
1361                btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x81);
1362                mimops = BTC_MIMO_PS_STATIC;
1363        } else if (sstype == 2) {
1364                halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
1365                btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x33);
1366                btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x3);
1367                btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81121313);
1368                btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x0);
1369                btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x41);
1370                mimops = BTC_MIMO_PS_DYNAMIC;
1371        }
1372        /* set rx 1ss or 2ss */
1373        btcoexist->btc_set(btcoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimops);
1374}
1375
1376static void halbtc8192e2ant_switch_sstype(struct btc_coexist *btcoexist,
1377                                          bool force_exec, u8 new_sstype)
1378{
1379        btc_alg_dbg(ALGO_TRACE,
1380                    "[BTCoex], %s Switch SS Type = %d\n",
1381                    (force_exec ? "force to" : ""), new_sstype);
1382        coex_dm->cur_sstype = new_sstype;
1383
1384        if (!force_exec) {
1385                if (coex_dm->pre_sstype == coex_dm->cur_sstype)
1386                        return;
1387        }
1388        halbtc8192e2ant_set_switch_sstype(btcoexist, coex_dm->cur_sstype);
1389
1390        coex_dm->pre_sstype = coex_dm->cur_sstype;
1391}
1392
1393static void halbtc8192e2ant_coex_alloff(struct btc_coexist *btcoexist)
1394{
1395        /* fw all off */
1396        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1397        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
1398        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
1399
1400        /* sw all off */
1401        btc8192e2ant_sw_mec1(btcoexist, false, false, false, false);
1402        btc8192e2ant_sw_mec2(btcoexist, false, false, false, 0x18);
1403
1404        /* hw all off */
1405        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 0);
1406}
1407
1408static void halbtc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist)
1409{
1410        /* force to reset coex mechanism */
1411
1412        halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1413        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, FORCE_EXEC, 6);
1414        halbtc8192e2ant_dec_btpwr(btcoexist, FORCE_EXEC, 0);
1415
1416        btc8192e2ant_coex_tbl_w_type(btcoexist, FORCE_EXEC, 0);
1417        halbtc8192e2ant_switch_sstype(btcoexist, FORCE_EXEC, 2);
1418
1419        btc8192e2ant_sw_mec1(btcoexist, false, false, false, false);
1420        btc8192e2ant_sw_mec2(btcoexist, false, false, false, 0x18);
1421}
1422
1423static void halbtc8192e2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1424{
1425        bool low_pwr_disable = true;
1426
1427        btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1428                           &low_pwr_disable);
1429
1430        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
1431
1432        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
1433        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1434        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
1435        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
1436
1437        btc8192e2ant_sw_mec1(btcoexist, false, false, false, false);
1438        btc8192e2ant_sw_mec2(btcoexist, false, false, false, 0x18);
1439}
1440
1441static bool halbtc8192e2ant_is_common_action(struct btc_coexist *btcoexist)
1442{
1443        struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1444        bool common = false, wifi_connected = false, wifi_busy = false;
1445        bool bt_hson = false, low_pwr_disable = false;
1446
1447        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hson);
1448        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1449                           &wifi_connected);
1450        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1451
1452        if (bt_link_info->sco_exist || bt_link_info->hid_exist)
1453                halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 0, 0, 0);
1454        else
1455                halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1456
1457        if (!wifi_connected) {
1458                low_pwr_disable = false;
1459                btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1460                                   &low_pwr_disable);
1461
1462                btc_alg_dbg(ALGO_TRACE,
1463                            "[BTCoex], Wifi non-connected idle!!\n");
1464
1465                if ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1466                     coex_dm->bt_status) ||
1467                    (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
1468                     coex_dm->bt_status)) {
1469                        halbtc8192e2ant_switch_sstype(btcoexist,
1470                                                      NORMAL_EXEC, 2);
1471                        btc8192e2ant_coex_tbl_w_type(btcoexist,
1472                                                     NORMAL_EXEC, 1);
1473                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1474                                                false, 0);
1475                } else {
1476                        halbtc8192e2ant_switch_sstype(btcoexist,
1477                                                      NORMAL_EXEC, 1);
1478                        btc8192e2ant_coex_tbl_w_type(btcoexist,
1479                                                     NORMAL_EXEC, 0);
1480                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1481                                                false, 1);
1482                }
1483
1484                halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
1485                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
1486
1487                btc8192e2ant_sw_mec1(btcoexist, false, false, false, false);
1488                btc8192e2ant_sw_mec2(btcoexist, false, false, false, 0x18);
1489
1490                common = true;
1491        } else {
1492                if (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1493                    coex_dm->bt_status) {
1494                        low_pwr_disable = false;
1495                        btcoexist->btc_set(btcoexist,
1496                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1497                                           &low_pwr_disable);
1498
1499                        btc_alg_dbg(ALGO_TRACE,
1500                                    "Wifi connected + BT non connected-idle!!\n");
1501
1502                        halbtc8192e2ant_switch_sstype(btcoexist,
1503                                                      NORMAL_EXEC, 2);
1504                        btc8192e2ant_coex_tbl_w_type(btcoexist,
1505                                                     NORMAL_EXEC, 1);
1506                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1507                                                false, 0);
1508                        halbtc8192e2ant_fw_dac_swinglvl(btcoexist,
1509                                                        NORMAL_EXEC, 6);
1510                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
1511
1512                        btc8192e2ant_sw_mec1(btcoexist, false, false,
1513                                             false, false);
1514                        btc8192e2ant_sw_mec2(btcoexist, false, false,
1515                                             false, 0x18);
1516
1517                        common = true;
1518                } else if (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
1519                           coex_dm->bt_status) {
1520                        low_pwr_disable = true;
1521                        btcoexist->btc_set(btcoexist,
1522                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1523                                           &low_pwr_disable);
1524
1525                        if (bt_hson)
1526                                return false;
1527                        btc_alg_dbg(ALGO_TRACE,
1528                                    "Wifi connected + BT connected-idle!!\n");
1529
1530                        halbtc8192e2ant_switch_sstype(btcoexist,
1531                                                      NORMAL_EXEC, 2);
1532                        btc8192e2ant_coex_tbl_w_type(btcoexist,
1533                                                     NORMAL_EXEC, 1);
1534                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1535                                                false, 0);
1536                        halbtc8192e2ant_fw_dac_swinglvl(btcoexist,
1537                                                        NORMAL_EXEC, 6);
1538                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
1539
1540                        btc8192e2ant_sw_mec1(btcoexist, true, false,
1541                                             false, false);
1542                        btc8192e2ant_sw_mec2(btcoexist, false, false,
1543                                             false, 0x18);
1544
1545                        common = true;
1546                } else {
1547                        low_pwr_disable = true;
1548                        btcoexist->btc_set(btcoexist,
1549                                           BTC_SET_ACT_DISABLE_LOW_POWER,
1550                                           &low_pwr_disable);
1551
1552                        if (wifi_busy) {
1553                                btc_alg_dbg(ALGO_TRACE,
1554                                            "Wifi Connected-Busy + BT Busy!!\n");
1555                                common = false;
1556                        } else {
1557                                btc_alg_dbg(ALGO_TRACE,
1558                                            "Wifi Connected-Idle + BT Busy!!\n");
1559
1560                                halbtc8192e2ant_switch_sstype(btcoexist,
1561                                                              NORMAL_EXEC, 1);
1562                                btc8192e2ant_coex_tbl_w_type(btcoexist,
1563                                                             NORMAL_EXEC, 2);
1564                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1565                                                        true, 21);
1566                                halbtc8192e2ant_fw_dac_swinglvl(btcoexist,
1567                                                                NORMAL_EXEC, 6);
1568                                halbtc8192e2ant_dec_btpwr(btcoexist,
1569                                                          NORMAL_EXEC, 0);
1570                                btc8192e2ant_sw_mec1(btcoexist, false,
1571                                                     false, false, false);
1572                                btc8192e2ant_sw_mec2(btcoexist, false,
1573                                                     false, false, 0x18);
1574                                common = true;
1575                        }
1576                }
1577        }
1578        return common;
1579}
1580
1581static void btc8192e_int1(struct btc_coexist *btcoexist, bool tx_pause,
1582                          int result)
1583{
1584        if (tx_pause) {
1585                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1586                            "[BTCoex], TxPause = 1\n");
1587
1588                if (coex_dm->cur_ps_tdma == 71) {
1589                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1590                                                true, 5);
1591                        coex_dm->tdma_adj_type = 5;
1592                } else if (coex_dm->cur_ps_tdma == 1) {
1593                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1594                                                true, 5);
1595                        coex_dm->tdma_adj_type = 5;
1596                } else if (coex_dm->cur_ps_tdma == 2) {
1597                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1598                                                true, 6);
1599                        coex_dm->tdma_adj_type = 6;
1600                } else if (coex_dm->cur_ps_tdma == 3) {
1601                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1602                                                true, 7);
1603                        coex_dm->tdma_adj_type = 7;
1604                } else if (coex_dm->cur_ps_tdma == 4) {
1605                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1606                                                true, 8);
1607                        coex_dm->tdma_adj_type = 8;
1608                }
1609                if (coex_dm->cur_ps_tdma == 9) {
1610                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1611                                                true, 13);
1612                        coex_dm->tdma_adj_type = 13;
1613                } else if (coex_dm->cur_ps_tdma == 10) {
1614                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1615                                                true, 14);
1616                        coex_dm->tdma_adj_type = 14;
1617                } else if (coex_dm->cur_ps_tdma == 11) {
1618                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1619                                                true, 15);
1620                        coex_dm->tdma_adj_type = 15;
1621                } else if (coex_dm->cur_ps_tdma == 12) {
1622                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1623                                                true, 16);
1624                        coex_dm->tdma_adj_type = 16;
1625                }
1626
1627                if (result == -1) {
1628                        if (coex_dm->cur_ps_tdma == 5) {
1629                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1630                                                        true, 6);
1631                                coex_dm->tdma_adj_type = 6;
1632                        } else if (coex_dm->cur_ps_tdma == 6) {
1633                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1634                                                        true, 7);
1635                                coex_dm->tdma_adj_type = 7;
1636                        } else if (coex_dm->cur_ps_tdma == 7) {
1637                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1638                                                        true, 8);
1639                                coex_dm->tdma_adj_type = 8;
1640                        } else if (coex_dm->cur_ps_tdma == 13) {
1641                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1642                                                        true, 14);
1643                                coex_dm->tdma_adj_type = 14;
1644                        } else if (coex_dm->cur_ps_tdma == 14) {
1645                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1646                                                        true, 15);
1647                                coex_dm->tdma_adj_type = 15;
1648                        } else if (coex_dm->cur_ps_tdma == 15) {
1649                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1650                                                        true, 16);
1651                                coex_dm->tdma_adj_type = 16;
1652                        }
1653                } else if (result == 1) {
1654                        if (coex_dm->cur_ps_tdma == 8) {
1655                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1656                                                        true, 7);
1657                                coex_dm->tdma_adj_type = 7;
1658                        } else if (coex_dm->cur_ps_tdma == 7) {
1659                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1660                                                        true, 6);
1661                                coex_dm->tdma_adj_type = 6;
1662                        } else if (coex_dm->cur_ps_tdma == 6) {
1663                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1664                                                        true, 5);
1665                                coex_dm->tdma_adj_type = 5;
1666                        } else if (coex_dm->cur_ps_tdma == 16) {
1667                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1668                                                        true, 15);
1669                                coex_dm->tdma_adj_type = 15;
1670                        } else if (coex_dm->cur_ps_tdma == 15) {
1671                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1672                                                        true, 14);
1673                                coex_dm->tdma_adj_type = 14;
1674                        } else if (coex_dm->cur_ps_tdma == 14) {
1675                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1676                                                        true, 13);
1677                                coex_dm->tdma_adj_type = 13;
1678                        }
1679                }
1680        } else {
1681                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1682                            "[BTCoex], TxPause = 0\n");
1683                if (coex_dm->cur_ps_tdma == 5) {
1684                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1685                                                true, 71);
1686                        coex_dm->tdma_adj_type = 71;
1687                } else if (coex_dm->cur_ps_tdma == 6) {
1688                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1689                                                true, 2);
1690                        coex_dm->tdma_adj_type = 2;
1691                } else if (coex_dm->cur_ps_tdma == 7) {
1692                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1693                                                true, 3);
1694                        coex_dm->tdma_adj_type = 3;
1695                } else if (coex_dm->cur_ps_tdma == 8) {
1696                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1697                                                true, 4);
1698                        coex_dm->tdma_adj_type = 4;
1699                }
1700                if (coex_dm->cur_ps_tdma == 13) {
1701                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1702                                                true, 9);
1703                        coex_dm->tdma_adj_type = 9;
1704                } else if (coex_dm->cur_ps_tdma == 14) {
1705                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1706                                                true, 10);
1707                        coex_dm->tdma_adj_type = 10;
1708                } else if (coex_dm->cur_ps_tdma == 15) {
1709                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1710                                                true, 11);
1711                        coex_dm->tdma_adj_type = 11;
1712                } else if (coex_dm->cur_ps_tdma == 16) {
1713                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1714                                                true, 12);
1715                        coex_dm->tdma_adj_type = 12;
1716                }
1717
1718                if (result == -1) {
1719                        if (coex_dm->cur_ps_tdma == 71) {
1720                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1721                                                        true, 1);
1722                                coex_dm->tdma_adj_type = 1;
1723                        } else if (coex_dm->cur_ps_tdma == 1) {
1724                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1725                                                        true, 2);
1726                                coex_dm->tdma_adj_type = 2;
1727                        } else if (coex_dm->cur_ps_tdma == 2) {
1728                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1729                                                        true, 3);
1730                                coex_dm->tdma_adj_type = 3;
1731                        } else if (coex_dm->cur_ps_tdma == 3) {
1732                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1733                                                        true, 4);
1734                                coex_dm->tdma_adj_type = 4;
1735                        } else if (coex_dm->cur_ps_tdma == 9) {
1736                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1737                                                        true, 10);
1738                                coex_dm->tdma_adj_type = 10;
1739                        } else if (coex_dm->cur_ps_tdma == 10) {
1740                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1741                                                        true, 11);
1742                                coex_dm->tdma_adj_type = 11;
1743                        } else if (coex_dm->cur_ps_tdma == 11) {
1744                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1745                                                        true, 12);
1746                                coex_dm->tdma_adj_type = 12;
1747                        }
1748                } else if (result == 1) {
1749                        if (coex_dm->cur_ps_tdma == 4) {
1750                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1751                                                        true, 3);
1752                                coex_dm->tdma_adj_type = 3;
1753                        } else if (coex_dm->cur_ps_tdma == 3) {
1754                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1755                                                        true, 2);
1756                                coex_dm->tdma_adj_type = 2;
1757                        } else if (coex_dm->cur_ps_tdma == 2) {
1758                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1759                                                        true, 1);
1760                                coex_dm->tdma_adj_type = 1;
1761                        } else if (coex_dm->cur_ps_tdma == 1) {
1762                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1763                                                        true, 71);
1764                                coex_dm->tdma_adj_type = 71;
1765                        } else if (coex_dm->cur_ps_tdma == 12) {
1766                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1767                                                        true, 11);
1768                                coex_dm->tdma_adj_type = 11;
1769                        } else if (coex_dm->cur_ps_tdma == 11) {
1770                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1771                                                        true, 10);
1772                                coex_dm->tdma_adj_type = 10;
1773                        } else if (coex_dm->cur_ps_tdma == 10) {
1774                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1775                                                        true, 9);
1776                                coex_dm->tdma_adj_type = 9;
1777                        }
1778                }
1779        }
1780}
1781
1782static void btc8192e_int2(struct btc_coexist *btcoexist, bool tx_pause,
1783                          int result)
1784{
1785        if (tx_pause) {
1786                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1787                            "[BTCoex], TxPause = 1\n");
1788                if (coex_dm->cur_ps_tdma == 1) {
1789                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1790                                                true, 6);
1791                        coex_dm->tdma_adj_type = 6;
1792                } else if (coex_dm->cur_ps_tdma == 2) {
1793                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1794                                                true, 6);
1795                        coex_dm->tdma_adj_type = 6;
1796                } else if (coex_dm->cur_ps_tdma == 3) {
1797                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1798                                                true, 7);
1799                        coex_dm->tdma_adj_type = 7;
1800                } else if (coex_dm->cur_ps_tdma == 4) {
1801                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1802                                                true, 8);
1803                        coex_dm->tdma_adj_type = 8;
1804                }
1805                if (coex_dm->cur_ps_tdma == 9) {
1806                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1807                                                true, 14);
1808                        coex_dm->tdma_adj_type = 14;
1809                } else if (coex_dm->cur_ps_tdma == 10) {
1810                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1811                                                true, 14);
1812                        coex_dm->tdma_adj_type = 14;
1813                } else if (coex_dm->cur_ps_tdma == 11) {
1814                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1815                                                true, 15);
1816                        coex_dm->tdma_adj_type = 15;
1817                } else if (coex_dm->cur_ps_tdma == 12) {
1818                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1819                                                true, 16);
1820                        coex_dm->tdma_adj_type = 16;
1821                }
1822                if (result == -1) {
1823                        if (coex_dm->cur_ps_tdma == 5) {
1824                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1825                                                        true, 6);
1826                                coex_dm->tdma_adj_type = 6;
1827                        } else if (coex_dm->cur_ps_tdma == 6) {
1828                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1829                                                        true, 7);
1830                                coex_dm->tdma_adj_type = 7;
1831                        } else if (coex_dm->cur_ps_tdma == 7) {
1832                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1833                                                        true, 8);
1834                                coex_dm->tdma_adj_type = 8;
1835                        } else if (coex_dm->cur_ps_tdma == 13) {
1836                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1837                                                        true, 14);
1838                                coex_dm->tdma_adj_type = 14;
1839                        } else if (coex_dm->cur_ps_tdma == 14) {
1840                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1841                                                        true, 15);
1842                                coex_dm->tdma_adj_type = 15;
1843                        } else if (coex_dm->cur_ps_tdma == 15) {
1844                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1845                                                        true, 16);
1846                                coex_dm->tdma_adj_type = 16;
1847                        }
1848                } else if (result == 1) {
1849                        if (coex_dm->cur_ps_tdma == 8) {
1850                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1851                                                        true, 7);
1852                                coex_dm->tdma_adj_type = 7;
1853                        } else if (coex_dm->cur_ps_tdma == 7) {
1854                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1855                                                        true, 6);
1856                                coex_dm->tdma_adj_type = 6;
1857                        } else if (coex_dm->cur_ps_tdma == 6) {
1858                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1859                                                        true, 6);
1860                                coex_dm->tdma_adj_type = 6;
1861                        } else if (coex_dm->cur_ps_tdma == 16) {
1862                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1863                                                        true, 15);
1864                                coex_dm->tdma_adj_type = 15;
1865                        } else if (coex_dm->cur_ps_tdma == 15) {
1866                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1867                                                        true, 14);
1868                                coex_dm->tdma_adj_type = 14;
1869                        } else if (coex_dm->cur_ps_tdma == 14) {
1870                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1871                                                        true, 14);
1872                                coex_dm->tdma_adj_type = 14;
1873                        }
1874                }
1875        } else {
1876                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1877                            "[BTCoex], TxPause = 0\n");
1878                if (coex_dm->cur_ps_tdma == 5) {
1879                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1880                                                true, 2);
1881                        coex_dm->tdma_adj_type = 2;
1882                } else if (coex_dm->cur_ps_tdma == 6) {
1883                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1884                                                true, 2);
1885                        coex_dm->tdma_adj_type = 2;
1886                } else if (coex_dm->cur_ps_tdma == 7) {
1887                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1888                                                true, 3);
1889                        coex_dm->tdma_adj_type = 3;
1890                } else if (coex_dm->cur_ps_tdma == 8) {
1891                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1892                                                true, 4);
1893                        coex_dm->tdma_adj_type = 4;
1894                }
1895                if (coex_dm->cur_ps_tdma == 13) {
1896                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1897                                                true, 10);
1898                        coex_dm->tdma_adj_type = 10;
1899                } else if (coex_dm->cur_ps_tdma == 14) {
1900                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1901                                                true, 10);
1902                        coex_dm->tdma_adj_type = 10;
1903                } else if (coex_dm->cur_ps_tdma == 15) {
1904                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1905                                                true, 11);
1906                        coex_dm->tdma_adj_type = 11;
1907                } else if (coex_dm->cur_ps_tdma == 16) {
1908                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1909                                                true, 12);
1910                        coex_dm->tdma_adj_type = 12;
1911                }
1912                if (result == -1) {
1913                        if (coex_dm->cur_ps_tdma == 1) {
1914                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1915                                                        true, 2);
1916                                coex_dm->tdma_adj_type = 2;
1917                        } else if (coex_dm->cur_ps_tdma == 2) {
1918                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1919                                                        true, 3);
1920                                coex_dm->tdma_adj_type = 3;
1921                        } else if (coex_dm->cur_ps_tdma == 3) {
1922                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1923                                                        true, 4);
1924                                coex_dm->tdma_adj_type = 4;
1925                        } else if (coex_dm->cur_ps_tdma == 9) {
1926                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1927                                                        true, 10);
1928                                coex_dm->tdma_adj_type = 10;
1929                        } else if (coex_dm->cur_ps_tdma == 10) {
1930                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1931                                                        true, 11);
1932                                coex_dm->tdma_adj_type = 11;
1933                        } else if (coex_dm->cur_ps_tdma == 11) {
1934                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1935                                                        true, 12);
1936                                coex_dm->tdma_adj_type = 12;
1937                        }
1938                } else if (result == 1) {
1939                        if (coex_dm->cur_ps_tdma == 4) {
1940                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1941                                                        true, 3);
1942                                coex_dm->tdma_adj_type = 3;
1943                        } else if (coex_dm->cur_ps_tdma == 3) {
1944                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1945                                                        true, 2);
1946                                coex_dm->tdma_adj_type = 2;
1947                        } else if (coex_dm->cur_ps_tdma == 2) {
1948                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1949                                                        true, 2);
1950                                coex_dm->tdma_adj_type = 2;
1951                        } else if (coex_dm->cur_ps_tdma == 12) {
1952                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1953                                                        true, 11);
1954                                coex_dm->tdma_adj_type = 11;
1955                        } else if (coex_dm->cur_ps_tdma == 11) {
1956                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1957                                                        true, 10);
1958                                coex_dm->tdma_adj_type = 10;
1959                        } else if (coex_dm->cur_ps_tdma == 10) {
1960                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1961                                                        true, 10);
1962                                coex_dm->tdma_adj_type = 10;
1963                        }
1964                }
1965        }
1966}
1967
1968static void btc8192e_int3(struct btc_coexist *btcoexist, bool tx_pause,
1969                          int result)
1970{
1971        if (tx_pause) {
1972                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
1973                            "[BTCoex], TxPause = 1\n");
1974                if (coex_dm->cur_ps_tdma == 1) {
1975                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1976                                                true, 7);
1977                        coex_dm->tdma_adj_type = 7;
1978                } else if (coex_dm->cur_ps_tdma == 2) {
1979                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1980                                                true, 7);
1981                        coex_dm->tdma_adj_type = 7;
1982                } else if (coex_dm->cur_ps_tdma == 3) {
1983                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1984                                                true, 7);
1985                        coex_dm->tdma_adj_type = 7;
1986                } else if (coex_dm->cur_ps_tdma == 4) {
1987                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1988                                                true, 8);
1989                        coex_dm->tdma_adj_type = 8;
1990                }
1991                if (coex_dm->cur_ps_tdma == 9) {
1992                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1993                                                true, 15);
1994                        coex_dm->tdma_adj_type = 15;
1995                } else if (coex_dm->cur_ps_tdma == 10) {
1996                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1997                                                true, 15);
1998                        coex_dm->tdma_adj_type = 15;
1999                } else if (coex_dm->cur_ps_tdma == 11) {
2000                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2001                                                true, 15);
2002                        coex_dm->tdma_adj_type = 15;
2003                } else if (coex_dm->cur_ps_tdma == 12) {
2004                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2005                                                true, 16);
2006                        coex_dm->tdma_adj_type = 16;
2007                }
2008                if (result == -1) {
2009                        if (coex_dm->cur_ps_tdma == 5) {
2010                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2011                                                        true, 7);
2012                                coex_dm->tdma_adj_type = 7;
2013                        } else if (coex_dm->cur_ps_tdma == 6) {
2014                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2015                                                        true, 7);
2016                                coex_dm->tdma_adj_type = 7;
2017                        } else if (coex_dm->cur_ps_tdma == 7) {
2018                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2019                                                        true, 8);
2020                                coex_dm->tdma_adj_type = 8;
2021                        } else if (coex_dm->cur_ps_tdma == 13) {
2022                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2023                                                        true, 15);
2024                                coex_dm->tdma_adj_type = 15;
2025                        } else if (coex_dm->cur_ps_tdma == 14) {
2026                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2027                                                        true, 15);
2028                                coex_dm->tdma_adj_type = 15;
2029                        } else if (coex_dm->cur_ps_tdma == 15) {
2030                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2031                                                        true, 16);
2032                                coex_dm->tdma_adj_type = 16;
2033                        }
2034                } else if (result == 1) {
2035                        if (coex_dm->cur_ps_tdma == 8) {
2036                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2037                                                        true, 7);
2038                                coex_dm->tdma_adj_type = 7;
2039                        } else if (coex_dm->cur_ps_tdma == 7) {
2040                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2041                                                        true, 7);
2042                                coex_dm->tdma_adj_type = 7;
2043                        } else if (coex_dm->cur_ps_tdma == 6) {
2044                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2045                                                        true, 7);
2046                                coex_dm->tdma_adj_type = 7;
2047                        } else if (coex_dm->cur_ps_tdma == 16) {
2048                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2049                                                        true, 15);
2050                                coex_dm->tdma_adj_type = 15;
2051                        } else if (coex_dm->cur_ps_tdma == 15) {
2052                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2053                                                        true, 15);
2054                                coex_dm->tdma_adj_type = 15;
2055                        } else if (coex_dm->cur_ps_tdma == 14) {
2056                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2057                                                        true, 15);
2058                                coex_dm->tdma_adj_type = 15;
2059                        }
2060                }
2061        } else {
2062                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2063                            "[BTCoex], TxPause = 0\n");
2064                if (coex_dm->cur_ps_tdma == 5) {
2065                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2066                                                true, 3);
2067                        coex_dm->tdma_adj_type = 3;
2068                } else if (coex_dm->cur_ps_tdma == 6) {
2069                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2070                                                true, 3);
2071                        coex_dm->tdma_adj_type = 3;
2072                } else if (coex_dm->cur_ps_tdma == 7) {
2073                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2074                                                true, 3);
2075                        coex_dm->tdma_adj_type = 3;
2076                } else if (coex_dm->cur_ps_tdma == 8) {
2077                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2078                                                true, 4);
2079                        coex_dm->tdma_adj_type = 4;
2080                }
2081                if (coex_dm->cur_ps_tdma == 13) {
2082                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2083                                                true, 11);
2084                        coex_dm->tdma_adj_type = 11;
2085                } else if (coex_dm->cur_ps_tdma == 14) {
2086                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2087                                                true, 11);
2088                        coex_dm->tdma_adj_type = 11;
2089                } else if (coex_dm->cur_ps_tdma == 15) {
2090                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2091                                                true, 11);
2092                        coex_dm->tdma_adj_type = 11;
2093                } else if (coex_dm->cur_ps_tdma == 16) {
2094                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2095                                                true, 12);
2096                        coex_dm->tdma_adj_type = 12;
2097                }
2098                if (result == -1) {
2099                        if (coex_dm->cur_ps_tdma == 1) {
2100                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2101                                                        true, 3);
2102                                coex_dm->tdma_adj_type = 3;
2103                        } else if (coex_dm->cur_ps_tdma == 2) {
2104                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2105                                                        true, 3);
2106                                coex_dm->tdma_adj_type = 3;
2107                        } else if (coex_dm->cur_ps_tdma == 3) {
2108                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2109                                                        true, 4);
2110                                coex_dm->tdma_adj_type = 4;
2111                        } else if (coex_dm->cur_ps_tdma == 9) {
2112                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2113                                                        true, 11);
2114                                coex_dm->tdma_adj_type = 11;
2115                        } else if (coex_dm->cur_ps_tdma == 10) {
2116                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2117                                                        true, 11);
2118                                coex_dm->tdma_adj_type = 11;
2119                        } else if (coex_dm->cur_ps_tdma == 11) {
2120                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2121                                                        true, 12);
2122                                coex_dm->tdma_adj_type = 12;
2123                        }
2124                } else if (result == 1) {
2125                        if (coex_dm->cur_ps_tdma == 4) {
2126                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2127                                                        true, 3);
2128                                coex_dm->tdma_adj_type = 3;
2129                        } else if (coex_dm->cur_ps_tdma == 3) {
2130                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2131                                                        true, 3);
2132                                coex_dm->tdma_adj_type = 3;
2133                        } else if (coex_dm->cur_ps_tdma == 2) {
2134                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2135                                                        true, 3);
2136                                coex_dm->tdma_adj_type = 3;
2137                        } else if (coex_dm->cur_ps_tdma == 12) {
2138                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2139                                                        true, 11);
2140                                coex_dm->tdma_adj_type = 11;
2141                        } else if (coex_dm->cur_ps_tdma == 11) {
2142                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2143                                                        true, 11);
2144                                coex_dm->tdma_adj_type = 11;
2145                        } else if (coex_dm->cur_ps_tdma == 10) {
2146                                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2147                                                        true, 11);
2148                                coex_dm->tdma_adj_type = 11;
2149                        }
2150                }
2151        }
2152}
2153
2154static void halbtc8192e2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
2155                                                 bool sco_hid, bool tx_pause,
2156                                                 u8 max_interval)
2157{
2158        static int up, dn, m, n, wait_cnt;
2159        /* 0: no change, +1: increase WiFi duration,
2160         * -1: decrease WiFi duration
2161         */
2162        int result;
2163        u8 retry_cnt = 0;
2164
2165        btc_alg_dbg(ALGO_TRACE_FW,
2166                    "[BTCoex], TdmaDurationAdjust()\n");
2167
2168        if (!coex_dm->auto_tdma_adjust) {
2169                coex_dm->auto_tdma_adjust = true;
2170                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2171                            "[BTCoex], first run TdmaDurationAdjust()!!\n");
2172                if (sco_hid) {
2173                        if (tx_pause) {
2174                                if (max_interval == 1) {
2175                                        halbtc8192e2ant_ps_tdma(btcoexist,
2176                                                                NORMAL_EXEC,
2177                                                                true, 13);
2178                                        coex_dm->tdma_adj_type = 13;
2179                                } else if (max_interval == 2) {
2180                                        halbtc8192e2ant_ps_tdma(btcoexist,
2181                                                                NORMAL_EXEC,
2182                                                                true, 14);
2183                                        coex_dm->tdma_adj_type = 14;
2184                                } else if (max_interval == 3) {
2185                                        halbtc8192e2ant_ps_tdma(btcoexist,
2186                                                                NORMAL_EXEC,
2187                                                                true, 15);
2188                                        coex_dm->tdma_adj_type = 15;
2189                                } else {
2190                                        halbtc8192e2ant_ps_tdma(btcoexist,
2191                                                                NORMAL_EXEC,
2192                                                                true, 15);
2193                                        coex_dm->tdma_adj_type = 15;
2194                                }
2195                        } else {
2196                                if (max_interval == 1) {
2197                                        halbtc8192e2ant_ps_tdma(btcoexist,
2198                                                                NORMAL_EXEC,
2199                                                                true, 9);
2200                                        coex_dm->tdma_adj_type = 9;
2201                                } else if (max_interval == 2) {
2202                                        halbtc8192e2ant_ps_tdma(btcoexist,
2203                                                                NORMAL_EXEC,
2204                                                                true, 10);
2205                                        coex_dm->tdma_adj_type = 10;
2206                                } else if (max_interval == 3) {
2207                                        halbtc8192e2ant_ps_tdma(btcoexist,
2208                                                                NORMAL_EXEC,
2209                                                                true, 11);
2210                                        coex_dm->tdma_adj_type = 11;
2211                                } else {
2212                                        halbtc8192e2ant_ps_tdma(btcoexist,
2213                                                                NORMAL_EXEC,
2214                                                                true, 11);
2215                                        coex_dm->tdma_adj_type = 11;
2216                                }
2217                        }
2218                } else {
2219                        if (tx_pause) {
2220                                if (max_interval == 1) {
2221                                        halbtc8192e2ant_ps_tdma(btcoexist,
2222                                                                NORMAL_EXEC,
2223                                                                true, 5);
2224                                        coex_dm->tdma_adj_type = 5;
2225                                } else if (max_interval == 2) {
2226                                        halbtc8192e2ant_ps_tdma(btcoexist,
2227                                                                NORMAL_EXEC,
2228                                                                true, 6);
2229                                        coex_dm->tdma_adj_type = 6;
2230                                } else if (max_interval == 3) {
2231                                        halbtc8192e2ant_ps_tdma(btcoexist,
2232                                                                NORMAL_EXEC,
2233                                                                true, 7);
2234                                        coex_dm->tdma_adj_type = 7;
2235                                } else {
2236                                        halbtc8192e2ant_ps_tdma(btcoexist,
2237                                                                NORMAL_EXEC,
2238                                                                true, 7);
2239                                        coex_dm->tdma_adj_type = 7;
2240                                }
2241                        } else {
2242                                if (max_interval == 1) {
2243                                        halbtc8192e2ant_ps_tdma(btcoexist,
2244                                                                NORMAL_EXEC,
2245                                                                true, 1);
2246                                        coex_dm->tdma_adj_type = 1;
2247                                } else if (max_interval == 2) {
2248                                        halbtc8192e2ant_ps_tdma(btcoexist,
2249                                                                NORMAL_EXEC,
2250                                                                true, 2);
2251                                        coex_dm->tdma_adj_type = 2;
2252                                } else if (max_interval == 3) {
2253                                        halbtc8192e2ant_ps_tdma(btcoexist,
2254                                                                NORMAL_EXEC,
2255                                                                true, 3);
2256                                        coex_dm->tdma_adj_type = 3;
2257                                } else {
2258                                        halbtc8192e2ant_ps_tdma(btcoexist,
2259                                                                NORMAL_EXEC,
2260                                                                true, 3);
2261                                        coex_dm->tdma_adj_type = 3;
2262                                }
2263                        }
2264                }
2265
2266                up = 0;
2267                dn = 0;
2268                m = 1;
2269                n = 3;
2270                result = 0;
2271                wait_cnt = 0;
2272        } else {
2273                /* accquire the BT TRx retry count from BT_Info byte2 */
2274                retry_cnt = coex_sta->bt_retry_cnt;
2275                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2276                            "[BTCoex], retry_cnt = %d\n", retry_cnt);
2277                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2278                            "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_cnt=%d\n",
2279                            up, dn, m, n, wait_cnt);
2280                result = 0;
2281                wait_cnt++;
2282                /* no retry in the last 2-second duration */
2283                if (retry_cnt == 0) {
2284                        up++;
2285                        dn--;
2286
2287                        if (dn <= 0)
2288                                dn = 0;
2289
2290                        if (up >= n) {
2291                                wait_cnt = 0;
2292                                n = 3;
2293                                up = 0;
2294                                dn = 0;
2295                                result = 1;
2296                                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2297                                            "[BTCoex]Increase wifi duration!!\n");
2298                        }
2299                } else if (retry_cnt <= 3) {
2300                        up--;
2301                        dn++;
2302
2303                        if (up <= 0)
2304                                up = 0;
2305
2306                        if (dn == 2) {
2307                                if (wait_cnt <= 2)
2308                                        m++;
2309                                else
2310                                        m = 1;
2311
2312                                if (m >= 20)
2313                                        m = 20;
2314
2315                                n = 3 * m;
2316                                up = 0;
2317                                dn = 0;
2318                                wait_cnt = 0;
2319                                result = -1;
2320                                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2321                                            "Reduce wifi duration for retry<3\n");
2322                        }
2323                } else {
2324                        if (wait_cnt == 1)
2325                                m++;
2326                        else
2327                                m = 1;
2328
2329                        if (m >= 20)
2330                                m = 20;
2331
2332                        n = 3*m;
2333                        up = 0;
2334                        dn = 0;
2335                        wait_cnt = 0;
2336                        result = -1;
2337                        btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2338                                    "Decrease wifi duration for retryCounter>3!!\n");
2339                }
2340
2341                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2342                            "[BTCoex], max Interval = %d\n", max_interval);
2343                if (max_interval == 1)
2344                        btc8192e_int1(btcoexist, tx_pause, result);
2345                else if (max_interval == 2)
2346                        btc8192e_int2(btcoexist, tx_pause, result);
2347                else if (max_interval == 3)
2348                        btc8192e_int3(btcoexist, tx_pause, result);
2349        }
2350
2351        /* if current PsTdma not match with
2352         * the recorded one (when scan, dhcp...),
2353         * then we have to adjust it back to the previous record one.
2354         */
2355        if (coex_dm->cur_ps_tdma != coex_dm->tdma_adj_type) {
2356                bool scan = false, link = false, roam = false;
2357
2358                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2359                            "[BTCoex], PsTdma type dismatch!!!, ");
2360                btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2361                            "curPsTdma=%d, recordPsTdma=%d\n",
2362                            coex_dm->cur_ps_tdma, coex_dm->tdma_adj_type);
2363
2364                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2365                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2366                btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2367
2368                if (!scan && !link && !roam)
2369                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2370                                                true,
2371                                                coex_dm->tdma_adj_type);
2372                else
2373                        btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
2374                                    "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2375        }
2376}
2377
2378/* SCO only or SCO+PAN(HS) */
2379static void halbtc8192e2ant_action_sco(struct btc_coexist *btcoexist)
2380{
2381        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_STAY_LOW;
2382        u32 wifi_bw;
2383
2384        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2385
2386        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2387        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2388
2389        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2390
2391        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 4);
2392
2393        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2394
2395        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2396            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2397                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2398                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
2399        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2400                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2401                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2402                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2403        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2404                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2405                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2406                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2407        }
2408
2409        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2410
2411        /* sw mechanism */
2412        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2413                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2414                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2415                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2416                                             false, false);
2417                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2418                                             false, 0x6);
2419                } else {
2420                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2421                                             false, false);
2422                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2423                                             false, 0x6);
2424                }
2425        } else {
2426                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2427                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2428                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2429                                             false, false);
2430                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2431                                             false, 0x6);
2432                } else {
2433                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2434                                             false, false);
2435                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2436                                             false, 0x6);
2437                }
2438        }
2439}
2440
2441static void halbtc8192e2ant_action_sco_pan(struct btc_coexist *btcoexist)
2442{
2443        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_STAY_LOW;
2444        u32 wifi_bw;
2445
2446        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2447
2448        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2449        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2450
2451        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2452
2453        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 4);
2454
2455        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2456
2457        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2458            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2459                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2460                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
2461        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2462                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2463                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2464                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
2465        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2466                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2467                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2468                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
2469        }
2470
2471        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2472
2473        /* sw mechanism */
2474        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2475                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2476                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2477                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2478                                             false, false);
2479                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2480                                             false, 0x6);
2481                } else {
2482                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2483                                             false, false);
2484                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2485                                             false, 0x6);
2486                }
2487        } else {
2488                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2489                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2490                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2491                                             false, false);
2492                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2493                                             false, 0x6);
2494                } else {
2495                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2496                                             false, false);
2497                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2498                                             false, 0x6);
2499                }
2500        }
2501}
2502
2503static void halbtc8192e2ant_action_hid(struct btc_coexist *btcoexist)
2504{
2505        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2506        u32 wifi_bw;
2507
2508        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2509        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2510
2511        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2512        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2513
2514        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2515
2516        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2517
2518        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 3);
2519
2520        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2521            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2522                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2523                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
2524        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2525                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2526                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2527                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2528        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2529                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2530                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2531                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2532        }
2533
2534        /* sw mechanism */
2535        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2536                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2537                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2538                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2539                                             false, false);
2540                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2541                                             false, 0x18);
2542                } else {
2543                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2544                                             false, false);
2545                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2546                                             false, 0x18);
2547                }
2548        } else {
2549                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2550                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2551                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2552                                             false, false);
2553                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2554                                             false, 0x18);
2555                } else {
2556                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2557                                             false, false);
2558                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2559                                             false, 0x18);
2560                }
2561        }
2562}
2563
2564/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2565static void halbtc8192e2ant_action_a2dp(struct btc_coexist *btcoexist)
2566{
2567        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2568        u32 wifi_bw;
2569        bool long_dist = false;
2570
2571        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2572        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2573
2574        if ((btrssi_state == BTC_RSSI_STATE_LOW ||
2575             btrssi_state == BTC_RSSI_STATE_STAY_LOW) &&
2576            (wifirssi_state == BTC_RSSI_STATE_LOW ||
2577             wifirssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2578                btc_alg_dbg(ALGO_TRACE,
2579                            "[BTCoex], A2dp, wifi/bt rssi both LOW!!\n");
2580                long_dist = true;
2581        }
2582        if (long_dist) {
2583                halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 2);
2584                halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true,
2585                                           0x4);
2586        } else {
2587                halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2588                halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2589                                           0x8);
2590        }
2591
2592        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2593
2594        if (long_dist)
2595                btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 0);
2596        else
2597                btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
2598
2599        if (long_dist) {
2600                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 17);
2601                coex_dm->auto_tdma_adjust = false;
2602                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2603        } else {
2604                if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2605                    (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2606                        halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2607                                                             true, 1);
2608                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2609                } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2610                           (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2611                        halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2612                                                             false, 1);
2613                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2614                } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2615                           (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2616                        halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2617                                                             false, 1);
2618                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2619                }
2620        }
2621
2622        /* sw mechanism */
2623        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2624        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2625                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2626                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2627                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2628                                             false, false);
2629                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2630                                             false, 0x18);
2631                } else {
2632                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2633                                             false, false);
2634                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2635                                             false, 0x18);
2636                }
2637        } else {
2638                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2639                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2640                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2641                                             false, false);
2642                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2643                                             false, 0x18);
2644                } else {
2645                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2646                                             false, false);
2647                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2648                                             false, 0x18);
2649                }
2650        }
2651}
2652
2653static void halbtc8192e2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2654{
2655        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2656        u32 wifi_bw;
2657
2658        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2659        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2660
2661        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2662        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2663
2664        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2665        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
2666
2667        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2668            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2669                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2670                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2671        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2672                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2673                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2674                                                     false, 2);
2675                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2676        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2677                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2678                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2679                                                     false, 2);
2680                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2681        }
2682
2683        /* sw mechanism */
2684        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2685        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2686                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2687                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2688                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2689                                             false, false);
2690                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2691                                             true, 0x6);
2692                } else {
2693                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2694                                             false, false);
2695                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2696                                             true, 0x6);
2697                }
2698        } else {
2699                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2700                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2701                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2702                                             false, false);
2703                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2704                                             true, 0x6);
2705                } else {
2706                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2707                                             false, false);
2708                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2709                                             true, 0x6);
2710                }
2711        }
2712}
2713
2714static void halbtc8192e2ant_action_pan_edr(struct btc_coexist *btcoexist)
2715{
2716        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2717        u32 wifi_bw;
2718
2719        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2720        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2721
2722        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2723        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2724
2725        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2726
2727        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
2728
2729        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2730            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2731                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2732                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2733        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2734                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2735                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2736                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2737        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2738                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2739                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2740                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2741        }
2742
2743        /* sw mechanism */
2744        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2745        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2746                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2747                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2748                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2749                                             false, false);
2750                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2751                                             false, 0x18);
2752                } else {
2753                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2754                                             false, false);
2755                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2756                                             false, 0x18);
2757                }
2758        } else {
2759                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2760                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2761                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2762                                             false, false);
2763                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2764                                             false, 0x18);
2765                } else {
2766                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2767                                             false, false);
2768                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2769                                             false, 0x18);
2770                }
2771        }
2772}
2773
2774/* PAN(HS) only */
2775static void halbtc8192e2ant_action_pan_hs(struct btc_coexist *btcoexist)
2776{
2777        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2778        u32 wifi_bw;
2779
2780        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2781        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2782
2783        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2784        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2785
2786        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2787
2788        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
2789
2790        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2791            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2792                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2793        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2794                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2795                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2796        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2797                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2798                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2799        }
2800        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2801
2802        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2803        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2804                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2805                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2806                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2807                                             false, false);
2808                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2809                                             false, 0x18);
2810                } else {
2811                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2812                                             false, false);
2813                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2814                                             false, 0x18);
2815                }
2816        } else {
2817                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2818                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2819                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2820                                             false, false);
2821                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2822                                             false, 0x18);
2823                } else {
2824                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2825                                             false, false);
2826                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2827                                             false, 0x18);
2828                }
2829        }
2830}
2831
2832/* PAN(EDR)+A2DP */
2833static void halbtc8192e2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
2834{
2835        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2836        u32 wifi_bw;
2837
2838        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2839        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2840
2841        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2842        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2843
2844        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2845
2846        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 2);
2847
2848        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2849
2850        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2851            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2852                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2853                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 3);
2854        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2855                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2856                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2857                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2858                                                     false, 3);
2859        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2860                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2861                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2862                halbtc8192e2ant_tdma_duration_adjust(btcoexist, false,
2863                                                     false, 3);
2864        }
2865
2866        /* sw mechanism */
2867        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2868                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2869                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2870                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2871                                             false, false);
2872                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2873                                             false, 0x18);
2874                } else {
2875                        btc8192e2ant_sw_mec1(btcoexist, true, false,
2876                                             false, false);
2877                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2878                                             false, 0x18);
2879                }
2880        } else {
2881                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2882                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2883                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2884                                             false, false);
2885                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2886                                             false, 0x18);
2887                } else {
2888                        btc8192e2ant_sw_mec1(btcoexist, false, false,
2889                                             false, false);
2890                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2891                                             false, 0x18);
2892                }
2893        }
2894}
2895
2896static void halbtc8192e2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
2897{
2898        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2899        u32 wifi_bw;
2900
2901        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2902        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2903
2904        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2905
2906        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2907        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2908
2909        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2910
2911        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 3);
2912
2913        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2914            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2915                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2916                halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
2917        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2918                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2919                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2920                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2921                                                true, 10);
2922        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2923                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2924                        halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2925                        halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2926                                                true, 10);
2927        }
2928
2929        /* sw mechanism */
2930        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2931                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2932                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2933                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2934                                             false, false);
2935                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2936                                             false, 0x18);
2937                } else {
2938                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2939                                             false, false);
2940                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2941                                             false, 0x18);
2942                }
2943        } else {
2944                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2945                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2946                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2947                                             false, false);
2948                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2949                                             false, 0x18);
2950                } else {
2951                        btc8192e2ant_sw_mec1(btcoexist, false, true,
2952                                             false, false);
2953                        btc8192e2ant_sw_mec2(btcoexist, false, false,
2954                                             false, 0x18);
2955                }
2956        }
2957}
2958
2959/* HID+A2DP+PAN(EDR) */
2960static void btc8192e2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
2961{
2962        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
2963        u32 wifi_bw;
2964
2965        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
2966        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
2967
2968        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
2969        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2970
2971        halbtc8192e2ant_fw_dac_swinglvl(btcoexist, NORMAL_EXEC, 6);
2972
2973        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2974
2975        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 3);
2976
2977        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
2978            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2979                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
2980                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 3);
2981        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
2982                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2983                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
2984                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3);
2985        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
2986                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2987                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
2988                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3);
2989        }
2990
2991        /* sw mechanism */
2992        if (BTC_WIFI_BW_HT40 == wifi_bw) {
2993                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
2994                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2995                        btc8192e2ant_sw_mec1(btcoexist, true, true,
2996                                             false, false);
2997                        btc8192e2ant_sw_mec2(btcoexist, true, false,
2998                                             false, 0x18);
2999                } else {
3000                        btc8192e2ant_sw_mec1(btcoexist, true, true,
3001                                             false, false);
3002                        btc8192e2ant_sw_mec2(btcoexist, false, false,
3003                                             false, 0x18);
3004                }
3005        } else {
3006                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
3007                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3008                        btc8192e2ant_sw_mec1(btcoexist, false, true,
3009                                             false, false);
3010                        btc8192e2ant_sw_mec2(btcoexist, true, false,
3011                                             false, 0x18);
3012                } else {
3013                        btc8192e2ant_sw_mec1(btcoexist, false, true,
3014                                             false, false);
3015                        btc8192e2ant_sw_mec2(btcoexist, false, false,
3016                                             false, 0x18);
3017                }
3018        }
3019}
3020
3021static void halbtc8192e2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
3022{
3023        u8 wifirssi_state, btrssi_state = BTC_RSSI_STATE_HIGH;
3024        u32 wifi_bw;
3025
3026        wifirssi_state = halbtc8192e2ant_wifirssi_state(btcoexist, 0, 2, 15, 0);
3027        btrssi_state = halbtc8192e2ant_btrssi_state(3, 34, 42);
3028
3029        halbtc8192e2ant_switch_sstype(btcoexist, NORMAL_EXEC, 1);
3030        halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3031
3032        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3033
3034        btc8192e2ant_coex_tbl_w_type(btcoexist, NORMAL_EXEC, 3);
3035
3036        if ((btrssi_state == BTC_RSSI_STATE_LOW) ||
3037            (btrssi_state == BTC_RSSI_STATE_STAY_LOW)) {
3038                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 0);
3039                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 2);
3040        } else if ((btrssi_state == BTC_RSSI_STATE_MEDIUM) ||
3041                   (btrssi_state == BTC_RSSI_STATE_STAY_MEDIUM))        {
3042                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 2);
3043                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2);
3044        } else if ((btrssi_state == BTC_RSSI_STATE_HIGH) ||
3045                   (btrssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3046                halbtc8192e2ant_dec_btpwr(btcoexist, NORMAL_EXEC, 4);
3047                halbtc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2);
3048        }
3049
3050        /* sw mechanism */
3051        if (BTC_WIFI_BW_HT40 == wifi_bw) {
3052                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
3053                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3054                        btc8192e2ant_sw_mec1(btcoexist, true, true,
3055                                             false, false);
3056                        btc8192e2ant_sw_mec2(btcoexist, true, false,
3057                                             false, 0x18);
3058                } else {
3059                        btc8192e2ant_sw_mec1(btcoexist, true, true,
3060                                             false, false);
3061                        btc8192e2ant_sw_mec2(btcoexist, false, false,
3062                                             false, 0x18);
3063                }
3064        } else {
3065                if ((wifirssi_state == BTC_RSSI_STATE_HIGH) ||
3066                    (wifirssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3067                        btc8192e2ant_sw_mec1(btcoexist, false, true,
3068                                             false, false);
3069                        btc8192e2ant_sw_mec2(btcoexist, true, false,
3070                                             false, 0x18);
3071                } else {
3072                        btc8192e2ant_sw_mec1(btcoexist, false, true,
3073                                             false, false);
3074                        btc8192e2ant_sw_mec2(btcoexist, false, false,
3075                                             false, 0x18);
3076                }
3077        }
3078}
3079
3080static void halbtc8192e2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3081{
3082        u8 algorithm = 0;
3083
3084        btc_alg_dbg(ALGO_TRACE,
3085                    "[BTCoex], RunCoexistMechanism()===>\n");
3086
3087        if (btcoexist->manual_control) {
3088                btc_alg_dbg(ALGO_TRACE,
3089                            "[BTCoex], return for Manual CTRL <===\n");
3090                return;
3091        }
3092
3093        if (coex_sta->under_ips) {
3094                btc_alg_dbg(ALGO_TRACE,
3095                            "[BTCoex], wifi is under IPS !!!\n");
3096                return;
3097        }
3098
3099        algorithm = halbtc8192e2ant_action_algorithm(btcoexist);
3100        if (coex_sta->c2h_bt_inquiry_page &&
3101            (BT_8192E_2ANT_COEX_ALGO_PANHS != algorithm)) {
3102                btc_alg_dbg(ALGO_TRACE,
3103                            "[BTCoex], BT is under inquiry/page scan !!\n");
3104                halbtc8192e2ant_action_bt_inquiry(btcoexist);
3105                return;
3106        }
3107
3108        coex_dm->cur_algorithm = algorithm;
3109        btc_alg_dbg(ALGO_TRACE,
3110                    "[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);
3111
3112        if (halbtc8192e2ant_is_common_action(btcoexist)) {
3113                btc_alg_dbg(ALGO_TRACE,
3114                            "[BTCoex], Action 2-Ant common\n");
3115                coex_dm->auto_tdma_adjust = false;
3116        } else {
3117                if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3118                        btc_alg_dbg(ALGO_TRACE,
3119                                    "[BTCoex] preAlgorithm=%d, curAlgorithm=%d\n",
3120                                    coex_dm->pre_algorithm,
3121                                    coex_dm->cur_algorithm);
3122                        coex_dm->auto_tdma_adjust = false;
3123                }
3124                switch (coex_dm->cur_algorithm) {
3125                case BT_8192E_2ANT_COEX_ALGO_SCO:
3126                        btc_alg_dbg(ALGO_TRACE,
3127                                    "Action 2-Ant, algorithm = SCO\n");
3128                        halbtc8192e2ant_action_sco(btcoexist);
3129                        break;
3130                case BT_8192E_2ANT_COEX_ALGO_SCO_PAN:
3131                        btc_alg_dbg(ALGO_TRACE,
3132                                    "Action 2-Ant, algorithm = SCO+PAN(EDR)\n");
3133                        halbtc8192e2ant_action_sco_pan(btcoexist);
3134                        break;
3135                case BT_8192E_2ANT_COEX_ALGO_HID:
3136                        btc_alg_dbg(ALGO_TRACE,
3137                                    "Action 2-Ant, algorithm = HID\n");
3138                        halbtc8192e2ant_action_hid(btcoexist);
3139                        break;
3140                case BT_8192E_2ANT_COEX_ALGO_A2DP:
3141                        btc_alg_dbg(ALGO_TRACE,
3142                                    "Action 2-Ant, algorithm = A2DP\n");
3143                        halbtc8192e2ant_action_a2dp(btcoexist);
3144                        break;
3145                case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS:
3146                        btc_alg_dbg(ALGO_TRACE,
3147                                    "Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
3148                        halbtc8192e2ant_action_a2dp_pan_hs(btcoexist);
3149                        break;
3150                case BT_8192E_2ANT_COEX_ALGO_PANEDR:
3151                        btc_alg_dbg(ALGO_TRACE,
3152                                    "Action 2-Ant, algorithm = PAN(EDR)\n");
3153                        halbtc8192e2ant_action_pan_edr(btcoexist);
3154                        break;
3155                case BT_8192E_2ANT_COEX_ALGO_PANHS:
3156                        btc_alg_dbg(ALGO_TRACE,
3157                                    "Action 2-Ant, algorithm = HS mode\n");
3158                        halbtc8192e2ant_action_pan_hs(btcoexist);
3159                        break;
3160                case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP:
3161                        btc_alg_dbg(ALGO_TRACE,
3162                                    "Action 2-Ant, algorithm = PAN+A2DP\n");
3163                        halbtc8192e2ant_action_pan_edr_a2dp(btcoexist);
3164                        break;
3165                case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID:
3166                        btc_alg_dbg(ALGO_TRACE,
3167                                    "Action 2-Ant, algorithm = PAN(EDR)+HID\n");
3168                        halbtc8192e2ant_action_pan_edr_hid(btcoexist);
3169                        break;
3170                case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3171                        btc_alg_dbg(ALGO_TRACE,
3172                                    "Action 2-Ant, algorithm = HID+A2DP+PAN\n");
3173                        btc8192e2ant_action_hid_a2dp_pan_edr(btcoexist);
3174                        break;
3175                case BT_8192E_2ANT_COEX_ALGO_HID_A2DP:
3176                        btc_alg_dbg(ALGO_TRACE,
3177                                    "Action 2-Ant, algorithm = HID+A2DP\n");
3178                        halbtc8192e2ant_action_hid_a2dp(btcoexist);
3179                        break;
3180                default:
3181                        btc_alg_dbg(ALGO_TRACE,
3182                                    "Action 2-Ant, algorithm = unknown!!\n");
3183                        /* halbtc8192e2ant_coex_alloff(btcoexist); */
3184                        break;
3185                }
3186                coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3187        }
3188}
3189
3190static void halbtc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist,
3191                                          bool backup)
3192{
3193        u16 u16tmp = 0;
3194        u8 u8tmp = 0;
3195
3196        btc_iface_dbg(INTF_INIT,
3197                      "[BTCoex], 2Ant Init HW Config!!\n");
3198
3199        if (backup) {
3200                /* backup rf 0x1e value */
3201                coex_dm->bt_rf0x1e_backup =
3202                        btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A,
3203                                                  0x1e, 0xfffff);
3204
3205                coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
3206                                                                      0x430);
3207                coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
3208                                                                     0x434);
3209                coex_dm->backup_retrylimit = btcoexist->btc_read_2byte(
3210                                                                    btcoexist,
3211                                                                    0x42a);
3212                coex_dm->backup_ampdu_maxtime = btcoexist->btc_read_1byte(
3213                                                                    btcoexist,
3214                                                                    0x456);
3215        }
3216
3217        /* antenna sw ctrl to bt */
3218        btcoexist->btc_write_1byte(btcoexist, 0x4f, 0x6);
3219        btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24);
3220        btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700);
3221        btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
3222        if (btcoexist->chip_interface == BTC_INTF_USB)
3223                btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004);
3224        else
3225                btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004);
3226
3227        btc8192e2ant_coex_tbl_w_type(btcoexist, FORCE_EXEC, 0);
3228
3229        /* antenna switch control parameter */
3230        btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555);
3231
3232        /* coex parameters */
3233        btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3234        /* 0x790[5:0] = 0x5 */
3235        u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3236        u8tmp &= 0xc0;
3237        u8tmp |= 0x5;
3238        btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3239
3240        /* enable counter statistics */
3241        btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3242
3243        /* enable PTA */
3244        btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20);
3245        /* enable mailbox interface */
3246        u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40);
3247        u16tmp |= BIT9;
3248        btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp);
3249
3250        /* enable PTA I2C mailbox  */
3251        u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101);
3252        u8tmp |= BIT4;
3253        btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp);
3254
3255        /* enable bt clock when wifi is disabled. */
3256        u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93);
3257        u8tmp |= BIT0;
3258        btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp);
3259        /* enable bt clock when suspend. */
3260        u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7);
3261        u8tmp |= BIT0;
3262        btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp);
3263}
3264
3265/*************************************************************
3266 *   work around function start with wa_halbtc8192e2ant_
3267 *************************************************************/
3268
3269/************************************************************
3270 *   extern function start with EXhalbtc8192e2ant_
3271 ************************************************************/
3272
3273void ex_halbtc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist)
3274{
3275        halbtc8192e2ant_init_hwconfig(btcoexist, true);
3276}
3277
3278void ex_halbtc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist)
3279{
3280        btc_iface_dbg(INTF_INIT,
3281                      "[BTCoex], Coex Mechanism Init!!\n");
3282        halbtc8192e2ant_init_coex_dm(btcoexist);
3283}
3284
3285void ex_halbtc8192e2ant_display_coex_info(struct btc_coexist *btcoexist)
3286{
3287        struct btc_board_info *board_info = &btcoexist->board_info;
3288        struct btc_stack_info *stack_info = &btcoexist->stack_info;
3289        struct rtl_priv *rtlpriv = btcoexist->adapter;
3290        u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3291        u16 u16tmp[4];
3292        u32 u32tmp[4];
3293        bool roam = false, scan = false, link = false, wifi_under_5g = false;
3294        bool bt_hson = false, wifi_busy = false;
3295        int wifirssi = 0, bt_hs_rssi = 0;
3296        u32 wifi_bw, wifi_traffic_dir;
3297        u8 wifi_dot11_chnl, wifi_hs_chnl;
3298        u32 fw_ver = 0, bt_patch_ver = 0;
3299
3300        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3301                   "\r\n ============[BT Coexist info]============");
3302
3303        if (btcoexist->manual_control) {
3304                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3305                           "\r\n ===========[Under Manual Control]===========");
3306                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3307                           "\r\n ==========================================");
3308        }
3309
3310        if (!board_info->bt_exist) {
3311                RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n BT not exists !!!");
3312                return;
3313        }
3314
3315        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3316                   "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",
3317                   board_info->pg_ant_num, board_info->btdm_ant_num);
3318
3319        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s / %d",
3320                   "BT stack/ hci ext ver",
3321                   ((stack_info->profile_notified) ? "Yes" : "No"),
3322                   stack_info->hci_version);
3323
3324        btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3325        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3326        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3327                   "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
3328                   "CoexVer/ FwVer/ PatchVer",
3329                   glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant,
3330                   fw_ver, bt_patch_ver, bt_patch_ver);
3331
3332        btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hson);
3333        btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
3334                           &wifi_dot11_chnl);
3335        btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3336        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d / %d(%d)",
3337                   "Dot11 channel / HsMode(HsChnl)",
3338                   wifi_dot11_chnl, bt_hson, wifi_hs_chnl);
3339
3340        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %3ph ",
3341                   "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info);
3342
3343        btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifirssi);
3344        btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3345        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d",
3346                   "Wifi rssi/ HS rssi", wifirssi, bt_hs_rssi);
3347
3348        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3349        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3350        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3351        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d ",
3352                   "Wifi link/ roam/ scan", link, roam, scan);
3353
3354        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3355        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3356        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3357        btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
3358                           &wifi_traffic_dir);
3359        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s / %s/ %s ",
3360                   "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
3361                   ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
3362                        (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
3363                   ((!wifi_busy) ? "idle" :
3364                        ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
3365                                "uplink" : "downlink")));
3366
3367        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = [%s/ %d/ %d] ",
3368                   "BT [status/ rssi/ retryCnt]",
3369                   ((btcoexist->bt_info.bt_disabled) ? ("disabled") :
3370                    ((coex_sta->c2h_bt_inquiry_page) ?
3371                     ("inquiry/page scan") :
3372                      ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3373                        coex_dm->bt_status) ? "non-connected idle" :
3374                         ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
3375                           coex_dm->bt_status) ? "connected-idle" : "busy")))),
3376                   coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
3377
3378        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d / %d / %d / %d",
3379                   "SCO/HID/PAN/A2DP", stack_info->sco_exist,
3380                   stack_info->hid_exist, stack_info->pan_exist,
3381                   stack_info->a2dp_exist);
3382        btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
3383
3384        bt_info_ext = coex_sta->bt_info_ext;
3385        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s",
3386                   "BT Info A2DP rate",
3387                   (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");
3388
3389        for (i = 0; i < BT_INFO_SRC_8192E_2ANT_MAX; i++) {
3390                if (coex_sta->bt_info_c2h_cnt[i]) {
3391                        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3392                                   "\r\n %-35s = %7ph(%d)",
3393                                   GLBtInfoSrc8192e2Ant[i],
3394                                   coex_sta->bt_info_c2h[i],
3395                                   coex_sta->bt_info_c2h_cnt[i]);
3396                }
3397        }
3398
3399        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s/%s",
3400                   "PS state, IPS/LPS",
3401                   ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
3402                   ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
3403        btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
3404
3405        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x ", "SS Type",
3406                   coex_dm->cur_sstype);
3407
3408        /* Sw mechanism */
3409        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
3410                   "============[Sw mechanism]============");
3411        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d ",
3412                   "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
3413                   coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
3414        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3415                   "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3416                   coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3417                   coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3418
3419        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x ", "Rate Mask",
3420                   btcoexist->bt_info.ra_mask);
3421
3422        /* Fw mechanism */
3423        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
3424                   "============[Fw mechanism]============");
3425
3426        ps_tdma_case = coex_dm->cur_ps_tdma;
3427        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3428                   "\r\n %-35s = %5ph case-%d (auto:%d)",
3429                   "PS TDMA", coex_dm->ps_tdma_para,
3430                   ps_tdma_case, coex_dm->auto_tdma_adjust);
3431
3432        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d ",
3433                   "DecBtPwr/ IgnWlanAct",
3434                   coex_dm->cur_dec_bt_pwr, coex_dm->cur_ignore_wlan_act);
3435
3436        /* Hw setting */
3437        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
3438                   "============[Hw setting]============");
3439
3440        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x",
3441                   "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
3442
3443        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3444                   "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
3445                   coex_dm->backup_arfr_cnt2, coex_dm->backup_retrylimit,
3446                   coex_dm->backup_ampdu_maxtime);
3447
3448        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
3449        u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
3450        u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
3451        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
3452        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3453                   "0x430/0x434/0x42a/0x456",
3454                   u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
3455
3456        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04);
3457        u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04);
3458        u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c);
3459        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3460                   "0xc04/ 0xd04/ 0x90c", u32tmp[0], u32tmp[1], u32tmp[2]);
3461
3462        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3463        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x", "0x778",
3464                   u8tmp[0]);
3465
3466        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c);
3467        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3468        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
3469                   "0x92c/ 0x930", (u8tmp[0]), u32tmp[0]);
3470
3471        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3472        u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f);
3473        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
3474                   "0x40/ 0x4f", u8tmp[0], u8tmp[1]);
3475
3476        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3477        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3478        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
3479                   "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
3480
3481        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3482        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x", "0xc50(dig)",
3483                   u32tmp[0]);
3484
3485        u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3486        u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3487        u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3488        u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3489        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3490                   "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3491                   "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
3492                   u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
3493
3494        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d",
3495                   "0x770(hp rx[31:16]/tx[15:0])",
3496                   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3497        RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d",
3498                   "0x774(lp rx[31:16]/tx[15:0])",
3499                   coex_sta->low_priority_rx, coex_sta->low_priority_tx);
3500#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 1)
3501        halbtc8192e2ant_monitor_bt_ctr(btcoexist);
3502#endif
3503        btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
3504}
3505
3506void ex_halbtc8192e2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3507{
3508        if (BTC_IPS_ENTER == type) {
3509                btc_iface_dbg(INTF_NOTIFY,
3510                              "[BTCoex], IPS ENTER notify\n");
3511                coex_sta->under_ips = true;
3512                halbtc8192e2ant_coex_alloff(btcoexist);
3513        } else if (BTC_IPS_LEAVE == type) {
3514                btc_iface_dbg(INTF_NOTIFY,
3515                              "[BTCoex], IPS LEAVE notify\n");
3516                coex_sta->under_ips = false;
3517        }
3518}
3519
3520void ex_halbtc8192e2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3521{
3522        if (BTC_LPS_ENABLE == type) {
3523                btc_iface_dbg(INTF_NOTIFY,
3524                              "[BTCoex], LPS ENABLE notify\n");
3525                coex_sta->under_lps = true;
3526        } else if (BTC_LPS_DISABLE == type) {
3527                btc_iface_dbg(INTF_NOTIFY,
3528                              "[BTCoex], LPS DISABLE notify\n");
3529                coex_sta->under_lps = false;
3530        }
3531}
3532
3533void ex_halbtc8192e2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3534{
3535        if (BTC_SCAN_START == type)
3536                btc_iface_dbg(INTF_NOTIFY,
3537                              "[BTCoex], SCAN START notify\n");
3538        else if (BTC_SCAN_FINISH == type)
3539                btc_iface_dbg(INTF_NOTIFY,
3540                              "[BTCoex], SCAN FINISH notify\n");
3541}
3542
3543void ex_halbtc8192e2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3544{
3545        if (BTC_ASSOCIATE_START == type)
3546                btc_iface_dbg(INTF_NOTIFY,
3547                              "[BTCoex], CONNECT START notify\n");
3548        else if (BTC_ASSOCIATE_FINISH == type)
3549                btc_iface_dbg(INTF_NOTIFY,
3550                              "[BTCoex], CONNECT FINISH notify\n");
3551}
3552
3553void ex_halbtc8192e2ant_media_status_notify(struct btc_coexist *btcoexist,
3554                                            u8 type)
3555{
3556        u8 h2c_parameter[3] = {0};
3557        u32 wifi_bw;
3558        u8 wifi_center_chnl;
3559
3560        if (btcoexist->manual_control ||
3561            btcoexist->stop_coex_dm ||
3562            btcoexist->bt_info.bt_disabled)
3563                return;
3564
3565        if (BTC_MEDIA_CONNECT == type)
3566                btc_iface_dbg(INTF_NOTIFY,
3567                              "[BTCoex], MEDIA connect notify\n");
3568        else
3569                btc_iface_dbg(INTF_NOTIFY,
3570                              "[BTCoex], MEDIA disconnect notify\n");
3571
3572        /* only 2.4G we need to inform bt the chnl mask */
3573        btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
3574                           &wifi_center_chnl);
3575        if ((BTC_MEDIA_CONNECT == type) &&
3576            (wifi_center_chnl <= 14)) {
3577                h2c_parameter[0] = 0x1;
3578                h2c_parameter[1] = wifi_center_chnl;
3579                btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3580                if (BTC_WIFI_BW_HT40 == wifi_bw)
3581                        h2c_parameter[2] = 0x30;
3582                else
3583                        h2c_parameter[2] = 0x20;
3584        }
3585
3586        coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3587        coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3588        coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3589
3590        btc_alg_dbg(ALGO_TRACE_FW_EXEC,
3591                    "[BTCoex], FW write 0x66 = 0x%x\n",
3592                    h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
3593                    h2c_parameter[2]);
3594
3595        btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3596}
3597
3598void ex_halbtc8192e2ant_special_packet_notify(struct btc_coexist *btcoexist,
3599                                              u8 type)
3600{
3601        if (type == BTC_PACKET_DHCP)
3602                btc_iface_dbg(INTF_NOTIFY,
3603                              "[BTCoex], DHCP Packet notify\n");
3604}
3605
3606void ex_halbtc8192e2ant_bt_info_notify(struct btc_coexist *btcoexist,
3607                                       u8 *tmp_buf, u8 length)
3608{
3609        u8 bt_info = 0;
3610        u8 i, rsp_source = 0;
3611        bool bt_busy = false, limited_dig = false;
3612        bool wifi_connected = false;
3613
3614        coex_sta->c2h_bt_info_req_sent = false;
3615
3616        rsp_source = tmp_buf[0] & 0xf;
3617        if (rsp_source >= BT_INFO_SRC_8192E_2ANT_MAX)
3618                rsp_source = BT_INFO_SRC_8192E_2ANT_WIFI_FW;
3619        coex_sta->bt_info_c2h_cnt[rsp_source]++;
3620
3621        btc_iface_dbg(INTF_NOTIFY,
3622                      "[BTCoex], Bt info[%d], length=%d, hex data = [",
3623                      rsp_source, length);
3624        for (i = 0; i < length; i++) {
3625                coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3626                if (i == 1)
3627                        bt_info = tmp_buf[i];
3628                if (i == length-1)
3629                        btc_iface_dbg(INTF_NOTIFY,
3630                                      "0x%02x]\n", tmp_buf[i]);
3631                else
3632                        btc_iface_dbg(INTF_NOTIFY,
3633                                      "0x%02x, ", tmp_buf[i]);
3634        }
3635
3636        if (BT_INFO_SRC_8192E_2ANT_WIFI_FW != rsp_source) {
3637                coex_sta->bt_retry_cnt =        /* [3:0] */
3638                        coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3639
3640                coex_sta->bt_rssi =
3641                        coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
3642
3643                coex_sta->bt_info_ext =
3644                        coex_sta->bt_info_c2h[rsp_source][4];
3645
3646                /* Here we need to resend some wifi info to BT
3647                 * because bt is reset and loss of the info.
3648                 */
3649                if ((coex_sta->bt_info_ext & BIT1)) {
3650                        btc_alg_dbg(ALGO_TRACE,
3651                                    "bit1, send wifi BW&Chnl to BT!!\n");
3652                        btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3653                                           &wifi_connected);
3654                        if (wifi_connected)
3655                                ex_halbtc8192e2ant_media_status_notify(
3656                                                        btcoexist,
3657                                                        BTC_MEDIA_CONNECT);
3658                        else
3659                                ex_halbtc8192e2ant_media_status_notify(
3660                                                        btcoexist,
3661                                                        BTC_MEDIA_DISCONNECT);
3662                }
3663
3664                if ((coex_sta->bt_info_ext & BIT3)) {
3665                        if (!btcoexist->manual_control &&
3666                            !btcoexist->stop_coex_dm) {
3667                                btc_alg_dbg(ALGO_TRACE,
3668                                            "bit3, BT NOT ignore Wlan active!\n");
3669                                halbtc8192e2ant_IgnoreWlanAct(btcoexist,
3670                                                              FORCE_EXEC,
3671                                                              false);
3672                        }
3673                } else {
3674                        /* BT already NOT ignore Wlan active,
3675                         * do nothing here.
3676                         */
3677                }
3678
3679#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
3680                if ((coex_sta->bt_info_ext & BIT4)) {
3681                        /* BT auto report already enabled, do nothing */
3682                } else {
3683                        halbtc8192e2ant_bt_autoreport(btcoexist, FORCE_EXEC,
3684                                                      true);
3685                }
3686#endif
3687        }
3688
3689        /* check BIT2 first ==> check if bt is under inquiry or page scan */
3690        if (bt_info & BT_INFO_8192E_2ANT_B_INQ_PAGE)
3691                coex_sta->c2h_bt_inquiry_page = true;
3692        else
3693                coex_sta->c2h_bt_inquiry_page = false;
3694
3695        /* set link exist status */
3696        if (!(bt_info&BT_INFO_8192E_2ANT_B_CONNECTION)) {
3697                coex_sta->bt_link_exist = false;
3698                coex_sta->pan_exist = false;
3699                coex_sta->a2dp_exist = false;
3700                coex_sta->hid_exist = false;
3701                coex_sta->sco_exist = false;
3702        } else {/* connection exists */
3703                coex_sta->bt_link_exist = true;
3704                if (bt_info & BT_INFO_8192E_2ANT_B_FTP)
3705                        coex_sta->pan_exist = true;
3706                else
3707                        coex_sta->pan_exist = false;
3708                if (bt_info & BT_INFO_8192E_2ANT_B_A2DP)
3709                        coex_sta->a2dp_exist = true;
3710                else
3711                        coex_sta->a2dp_exist = false;
3712                if (bt_info & BT_INFO_8192E_2ANT_B_HID)
3713                        coex_sta->hid_exist = true;
3714                else
3715                        coex_sta->hid_exist = false;
3716                if (bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO)
3717                        coex_sta->sco_exist = true;
3718                else
3719                        coex_sta->sco_exist = false;
3720        }
3721
3722        halbtc8192e2ant_update_btlink_info(btcoexist);
3723
3724        if (!(bt_info&BT_INFO_8192E_2ANT_B_CONNECTION)) {
3725                coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
3726                btc_alg_dbg(ALGO_TRACE,
3727                            "[BTCoex], BT Non-Connected idle!!!\n");
3728        } else if (bt_info == BT_INFO_8192E_2ANT_B_CONNECTION) {
3729                coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE;
3730                btc_alg_dbg(ALGO_TRACE,
3731                            "[BTCoex], bt_infoNotify(), BT Connected-idle!!!\n");
3732        } else if ((bt_info&BT_INFO_8192E_2ANT_B_SCO_ESCO) ||
3733                   (bt_info&BT_INFO_8192E_2ANT_B_SCO_BUSY)) {
3734                coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_SCO_BUSY;
3735                btc_alg_dbg(ALGO_TRACE,
3736                            "[BTCoex], bt_infoNotify(), BT SCO busy!!!\n");
3737        } else if (bt_info&BT_INFO_8192E_2ANT_B_ACL_BUSY) {
3738                coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_ACL_BUSY;
3739                btc_alg_dbg(ALGO_TRACE,
3740                            "[BTCoex], bt_infoNotify(), BT ACL busy!!!\n");
3741        } else {
3742                coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_MAX;
3743                btc_alg_dbg(ALGO_TRACE,
3744                            "[BTCoex]bt_infoNotify(), BT Non-Defined state!!!\n");
3745        }
3746
3747        if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3748            (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3749            (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
3750                bt_busy = true;
3751                limited_dig = true;
3752        } else {
3753                bt_busy = false;
3754                limited_dig = false;
3755        }
3756
3757        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3758
3759        coex_dm->limited_dig = limited_dig;
3760        btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
3761
3762        halbtc8192e2ant_run_coexist_mechanism(btcoexist);
3763}
3764
3765void ex_halbtc8192e2ant_stack_operation_notify(struct btc_coexist *btcoexist,
3766                                               u8 type)
3767{
3768}
3769
3770void ex_halbtc8192e2ant_halt_notify(struct btc_coexist *btcoexist)
3771{
3772        btc_iface_dbg(INTF_NOTIFY, "[BTCoex], Halt notify\n");
3773
3774        halbtc8192e2ant_IgnoreWlanAct(btcoexist, FORCE_EXEC, true);
3775        ex_halbtc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
3776}
3777
3778void ex_halbtc8192e2ant_periodical(struct btc_coexist *btcoexist)
3779{
3780        static u8 dis_ver_info_cnt;
3781        u32 fw_ver = 0, bt_patch_ver = 0;
3782        struct btc_board_info *board_info = &btcoexist->board_info;
3783        struct btc_stack_info *stack_info = &btcoexist->stack_info;
3784
3785        btc_alg_dbg(ALGO_TRACE,
3786                    "=======================Periodical=======================\n");
3787        if (dis_ver_info_cnt <= 5) {
3788                dis_ver_info_cnt += 1;
3789                btc_iface_dbg(INTF_INIT,
3790                              "************************************************\n");
3791                btc_iface_dbg(INTF_INIT,
3792                              "Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
3793                              board_info->pg_ant_num, board_info->btdm_ant_num,
3794                              board_info->btdm_ant_pos);
3795                btc_iface_dbg(INTF_INIT,
3796                              "BT stack/ hci ext ver = %s / %d\n",
3797                              ((stack_info->profile_notified) ? "Yes" : "No"),
3798                              stack_info->hci_version);
3799                btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
3800                                   &bt_patch_ver);
3801                btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3802                btc_iface_dbg(INTF_INIT,
3803                              "CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
3804                              glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant,
3805                              fw_ver, bt_patch_ver, bt_patch_ver);
3806                btc_iface_dbg(INTF_INIT,
3807                              "************************************************\n");
3808        }
3809
3810#if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
3811        halbtc8192e2ant_querybt_info(btcoexist);
3812        halbtc8192e2ant_monitor_bt_ctr(btcoexist);
3813        btc8192e2ant_monitor_bt_enable_dis(btcoexist);
3814#else
3815        if (halbtc8192e2ant_iswifi_status_changed(btcoexist) ||
3816            coex_dm->auto_tdma_adjust)
3817                halbtc8192e2ant_run_coexist_mechanism(btcoexist);
3818#endif
3819}
3820