18c086312SLarry Finger // SPDX-License-Identifier: GPL-2.0
28c086312SLarry Finger /* Copyright(c) 2012 Realtek Corporation.*/
3f1d2b4d3SLarry Finger
4f1d2b4d3SLarry Finger /***************************************************************
5f1d2b4d3SLarry Finger * Description:
6f1d2b4d3SLarry Finger *
7f1d2b4d3SLarry Finger * This file is for RTL8723B Co-exist mechanism
8f1d2b4d3SLarry Finger *
9f1d2b4d3SLarry Finger * History
10f1d2b4d3SLarry Finger * 2012/11/15 Cosa first check in.
11f1d2b4d3SLarry Finger *
12f1d2b4d3SLarry Finger ***************************************************************/
13f1d2b4d3SLarry Finger
14f1d2b4d3SLarry Finger /***************************************************************
15f1d2b4d3SLarry Finger * include files
16f1d2b4d3SLarry Finger ***************************************************************/
17f1d2b4d3SLarry Finger #include "halbt_precomp.h"
18f1d2b4d3SLarry Finger /***************************************************************
19f1d2b4d3SLarry Finger * Global variables, these are static variables
20f1d2b4d3SLarry Finger ***************************************************************/
21f1d2b4d3SLarry Finger static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;
22f1d2b4d3SLarry Finger static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
23f1d2b4d3SLarry Finger static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
24f1d2b4d3SLarry Finger static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
25f1d2b4d3SLarry Finger
26c6821613SYan-Hsuan Chuang static const char *const glbt_info_src_8723b_1ant[] = {
27f1d2b4d3SLarry Finger "BT Info[wifi fw]",
28f1d2b4d3SLarry Finger "BT Info[bt rsp]",
29f1d2b4d3SLarry Finger "BT Info[bt auto report]",
30f1d2b4d3SLarry Finger };
31f1d2b4d3SLarry Finger
32f1d2b4d3SLarry Finger static u32 glcoex_ver_date_8723b_1ant = 20130918;
33f1d2b4d3SLarry Finger static u32 glcoex_ver_8723b_1ant = 0x47;
34f1d2b4d3SLarry Finger
35f1d2b4d3SLarry Finger /***************************************************************
36f1d2b4d3SLarry Finger * local function proto type if needed
37f1d2b4d3SLarry Finger ***************************************************************/
38f1d2b4d3SLarry Finger /***************************************************************
39f1d2b4d3SLarry Finger * local function start with halbtc8723b1ant_
40f1d2b4d3SLarry Finger ***************************************************************/
41f1d2b4d3SLarry Finger
halbtc8723b1ant_updatera_mask(struct btc_coexist * btcoexist,bool force_exec,u32 dis_rate_mask)42f1d2b4d3SLarry Finger static void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,
43f1d2b4d3SLarry Finger bool force_exec, u32 dis_rate_mask)
44f1d2b4d3SLarry Finger {
45f1d2b4d3SLarry Finger coex_dm->curra_mask = dis_rate_mask;
46f1d2b4d3SLarry Finger
47f1d2b4d3SLarry Finger if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
48c6821613SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
49f1d2b4d3SLarry Finger &coex_dm->curra_mask);
50f1d2b4d3SLarry Finger
51f1d2b4d3SLarry Finger coex_dm->prera_mask = coex_dm->curra_mask;
52f1d2b4d3SLarry Finger }
53f1d2b4d3SLarry Finger
btc8723b1ant_auto_rate_fb_retry(struct btc_coexist * btcoexist,bool force_exec,u8 type)54f1d2b4d3SLarry Finger static void btc8723b1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
55f1d2b4d3SLarry Finger bool force_exec, u8 type)
56f1d2b4d3SLarry Finger {
57f1d2b4d3SLarry Finger bool wifi_under_bmode = false;
58f1d2b4d3SLarry Finger
59f1d2b4d3SLarry Finger coex_dm->cur_arfr_type = type;
60f1d2b4d3SLarry Finger
61f1d2b4d3SLarry Finger if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
62f1d2b4d3SLarry Finger switch (coex_dm->cur_arfr_type) {
63f1d2b4d3SLarry Finger case 0: /* normal mode */
64f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x430,
65f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt1);
66f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x434,
67f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt2);
68f1d2b4d3SLarry Finger break;
69f1d2b4d3SLarry Finger case 1:
70f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist,
71f1d2b4d3SLarry Finger BTC_GET_BL_WIFI_UNDER_B_MODE,
72f1d2b4d3SLarry Finger &wifi_under_bmode);
73f1d2b4d3SLarry Finger if (wifi_under_bmode) {
74f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist,
75f1d2b4d3SLarry Finger 0x430, 0x0);
76f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist,
77f1d2b4d3SLarry Finger 0x434, 0x01010101);
78f1d2b4d3SLarry Finger } else {
79f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist,
80f1d2b4d3SLarry Finger 0x430, 0x0);
81f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist,
82f1d2b4d3SLarry Finger 0x434, 0x04030201);
83f1d2b4d3SLarry Finger }
84f1d2b4d3SLarry Finger break;
85f1d2b4d3SLarry Finger default:
86f1d2b4d3SLarry Finger break;
87f1d2b4d3SLarry Finger }
88f1d2b4d3SLarry Finger }
89f1d2b4d3SLarry Finger
90f1d2b4d3SLarry Finger coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
91f1d2b4d3SLarry Finger }
92f1d2b4d3SLarry Finger
halbtc8723b1ant_retry_limit(struct btc_coexist * btcoexist,bool force_exec,u8 type)93f1d2b4d3SLarry Finger static void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,
94f1d2b4d3SLarry Finger bool force_exec, u8 type)
95f1d2b4d3SLarry Finger {
96f1d2b4d3SLarry Finger coex_dm->cur_retry_limit_type = type;
97f1d2b4d3SLarry Finger
98f1d2b4d3SLarry Finger if (force_exec || (coex_dm->pre_retry_limit_type !=
99f1d2b4d3SLarry Finger coex_dm->cur_retry_limit_type)) {
100f1d2b4d3SLarry Finger switch (coex_dm->cur_retry_limit_type) {
101f1d2b4d3SLarry Finger case 0: /* normal mode */
102f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x42a,
103f1d2b4d3SLarry Finger coex_dm->backup_retry_limit);
104f1d2b4d3SLarry Finger break;
105f1d2b4d3SLarry Finger case 1: /* retry limit = 8 */
106f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
107f1d2b4d3SLarry Finger break;
108f1d2b4d3SLarry Finger default:
109f1d2b4d3SLarry Finger break;
110f1d2b4d3SLarry Finger }
111f1d2b4d3SLarry Finger }
112f1d2b4d3SLarry Finger
113f1d2b4d3SLarry Finger coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
114f1d2b4d3SLarry Finger }
115f1d2b4d3SLarry Finger
halbtc8723b1ant_ampdu_maxtime(struct btc_coexist * btcoexist,bool force_exec,u8 type)116f1d2b4d3SLarry Finger static void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,
117f1d2b4d3SLarry Finger bool force_exec, u8 type)
118f1d2b4d3SLarry Finger {
119f1d2b4d3SLarry Finger coex_dm->cur_ampdu_time_type = type;
120f1d2b4d3SLarry Finger
121f1d2b4d3SLarry Finger if (force_exec || (coex_dm->pre_ampdu_time_type !=
122f1d2b4d3SLarry Finger coex_dm->cur_ampdu_time_type)) {
123f1d2b4d3SLarry Finger switch (coex_dm->cur_ampdu_time_type) {
124f1d2b4d3SLarry Finger case 0: /* normal mode */
125f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x456,
126f1d2b4d3SLarry Finger coex_dm->backup_ampdu_max_time);
127f1d2b4d3SLarry Finger break;
128f1d2b4d3SLarry Finger case 1: /* AMPDU timw = 0x38 * 32us */
129c6821613SYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
130f1d2b4d3SLarry Finger break;
131f1d2b4d3SLarry Finger default:
132f1d2b4d3SLarry Finger break;
133f1d2b4d3SLarry Finger }
134f1d2b4d3SLarry Finger }
135f1d2b4d3SLarry Finger
136f1d2b4d3SLarry Finger coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
137f1d2b4d3SLarry Finger }
138f1d2b4d3SLarry Finger
halbtc8723b1ant_limited_tx(struct btc_coexist * btcoexist,bool force_exec,u8 ra_masktype,u8 arfr_type,u8 retry_limit_type,u8 ampdu_time_type)139f1d2b4d3SLarry Finger static void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,
140f1d2b4d3SLarry Finger bool force_exec, u8 ra_masktype,
141f1d2b4d3SLarry Finger u8 arfr_type, u8 retry_limit_type,
142f1d2b4d3SLarry Finger u8 ampdu_time_type)
143f1d2b4d3SLarry Finger {
144f1d2b4d3SLarry Finger switch (ra_masktype) {
145f1d2b4d3SLarry Finger case 0: /* normal mode */
146f1d2b4d3SLarry Finger halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);
147f1d2b4d3SLarry Finger break;
148f1d2b4d3SLarry Finger case 1: /* disable cck 1/2 */
149f1d2b4d3SLarry Finger halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
150f1d2b4d3SLarry Finger 0x00000003);
151f1d2b4d3SLarry Finger break;
152f1d2b4d3SLarry Finger /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
153f1d2b4d3SLarry Finger case 2:
154f1d2b4d3SLarry Finger halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
155f1d2b4d3SLarry Finger 0x0001f1f7);
156f1d2b4d3SLarry Finger break;
157f1d2b4d3SLarry Finger default:
158f1d2b4d3SLarry Finger break;
159f1d2b4d3SLarry Finger }
160f1d2b4d3SLarry Finger
161f1d2b4d3SLarry Finger btc8723b1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
162f1d2b4d3SLarry Finger halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
163f1d2b4d3SLarry Finger halbtc8723b1ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
164f1d2b4d3SLarry Finger }
165f1d2b4d3SLarry Finger
halbtc8723b1ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)166f1d2b4d3SLarry Finger static void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,
167f1d2b4d3SLarry Finger bool force_exec, bool rej_ap_agg_pkt,
168f1d2b4d3SLarry Finger bool bt_ctrl_agg_buf_size,
169f1d2b4d3SLarry Finger u8 agg_buf_size)
170f1d2b4d3SLarry Finger {
171f1d2b4d3SLarry Finger bool reject_rx_agg = rej_ap_agg_pkt;
172f1d2b4d3SLarry Finger bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
173f1d2b4d3SLarry Finger u8 rxaggsize = agg_buf_size;
174f1d2b4d3SLarry Finger
175f1d2b4d3SLarry Finger /**********************************************
176f1d2b4d3SLarry Finger * Rx Aggregation related setting
177f1d2b4d3SLarry Finger **********************************************/
178f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
179f1d2b4d3SLarry Finger &reject_rx_agg);
180f1d2b4d3SLarry Finger /* decide BT control aggregation buf size or not */
181f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
182f1d2b4d3SLarry Finger &bt_ctrl_rx_agg_size);
183f1d2b4d3SLarry Finger /* aggregation buf size, only work
184f1d2b4d3SLarry Finger * when BT control Rx aggregation size.
185f1d2b4d3SLarry Finger */
186f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxaggsize);
187f1d2b4d3SLarry Finger /* real update aggregation setting */
188f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
189f1d2b4d3SLarry Finger }
190f1d2b4d3SLarry Finger
halbtc8723b1ant_query_bt_info(struct btc_coexist * btcoexist)19137a5be0cSPing-Ke Shih static void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)
19237a5be0cSPing-Ke Shih {
19337a5be0cSPing-Ke Shih u8 h2c_parameter[1] = {0};
19437a5be0cSPing-Ke Shih
19537a5be0cSPing-Ke Shih coex_sta->c2h_bt_info_req_sent = true;
19637a5be0cSPing-Ke Shih
19737a5be0cSPing-Ke Shih /* trigger */
19837a5be0cSPing-Ke Shih h2c_parameter[0] |= BIT(0);
19937a5be0cSPing-Ke Shih
20037a5be0cSPing-Ke Shih btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
20137a5be0cSPing-Ke Shih }
20237a5be0cSPing-Ke Shih
halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist * btcoexist)203f1d2b4d3SLarry Finger static void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
204f1d2b4d3SLarry Finger {
205f1d2b4d3SLarry Finger u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
206f1d2b4d3SLarry Finger u32 reg_hp_tx = 0, reg_hp_rx = 0;
207f1d2b4d3SLarry Finger u32 reg_lp_tx = 0, reg_lp_rx = 0;
20837a5be0cSPing-Ke Shih static u32 num_of_bt_counter_chk;
209f1d2b4d3SLarry Finger
210f1d2b4d3SLarry Finger reg_hp_txrx = 0x770;
211f1d2b4d3SLarry Finger reg_lp_txrx = 0x774;
212f1d2b4d3SLarry Finger
213f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
214f1d2b4d3SLarry Finger reg_hp_tx = u32tmp & MASKLWORD;
215f1d2b4d3SLarry Finger reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
216f1d2b4d3SLarry Finger
217f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
218f1d2b4d3SLarry Finger reg_lp_tx = u32tmp & MASKLWORD;
219f1d2b4d3SLarry Finger reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
220f1d2b4d3SLarry Finger
221f1d2b4d3SLarry Finger coex_sta->high_priority_tx = reg_hp_tx;
222f1d2b4d3SLarry Finger coex_sta->high_priority_rx = reg_hp_rx;
223f1d2b4d3SLarry Finger coex_sta->low_priority_tx = reg_lp_tx;
224f1d2b4d3SLarry Finger coex_sta->low_priority_rx = reg_lp_rx;
225f1d2b4d3SLarry Finger
22637a5be0cSPing-Ke Shih if ((coex_sta->low_priority_tx > 1050) &&
22737a5be0cSPing-Ke Shih (!coex_sta->c2h_bt_inquiry_page))
22837a5be0cSPing-Ke Shih coex_sta->pop_event_cnt++;
22937a5be0cSPing-Ke Shih
230f1d2b4d3SLarry Finger /* reset counter */
231f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
23237a5be0cSPing-Ke Shih
23337a5be0cSPing-Ke Shih /* This part is for wifi FW and driver to update BT's status as
23437a5be0cSPing-Ke Shih * disabled.
23537a5be0cSPing-Ke Shih *
23637a5be0cSPing-Ke Shih * The flow is as the following
23737a5be0cSPing-Ke Shih * 1. disable BT
23837a5be0cSPing-Ke Shih * 2. if all BT Tx/Rx counter = 0, after 6 sec we query bt info
23937a5be0cSPing-Ke Shih * 3. Because BT will not rsp from mailbox, so wifi fw will know BT is
24037a5be0cSPing-Ke Shih * disabled
24137a5be0cSPing-Ke Shih *
24237a5be0cSPing-Ke Shih * 4. FW will rsp c2h for BT that driver will know BT is disabled.
24337a5be0cSPing-Ke Shih */
24437a5be0cSPing-Ke Shih if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&
24537a5be0cSPing-Ke Shih (reg_lp_rx == 0)) {
24637a5be0cSPing-Ke Shih num_of_bt_counter_chk++;
24737a5be0cSPing-Ke Shih if (num_of_bt_counter_chk == 3)
24837a5be0cSPing-Ke Shih halbtc8723b1ant_query_bt_info(btcoexist);
24937a5be0cSPing-Ke Shih } else {
25037a5be0cSPing-Ke Shih num_of_bt_counter_chk = 0;
25137a5be0cSPing-Ke Shih }
252f1d2b4d3SLarry Finger }
253f1d2b4d3SLarry Finger
halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)25437a5be0cSPing-Ke Shih static void halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
255f1d2b4d3SLarry Finger {
25637a5be0cSPing-Ke Shih s32 wifi_rssi = 0;
25737a5be0cSPing-Ke Shih bool wifi_busy = false, wifi_under_b_mode = false;
25837a5be0cSPing-Ke Shih static u8 cck_lock_counter;
25937a5be0cSPing-Ke Shih u32 total_cnt;
260f1d2b4d3SLarry Finger
26137a5be0cSPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
26237a5be0cSPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
26337a5be0cSPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
26437a5be0cSPing-Ke Shih &wifi_under_b_mode);
265f1d2b4d3SLarry Finger
26637a5be0cSPing-Ke Shih if (coex_sta->under_ips) {
26737a5be0cSPing-Ke Shih coex_sta->crc_ok_cck = 0;
26837a5be0cSPing-Ke Shih coex_sta->crc_ok_11g = 0;
26937a5be0cSPing-Ke Shih coex_sta->crc_ok_11n = 0;
27037a5be0cSPing-Ke Shih coex_sta->crc_ok_11n_agg = 0;
271f1d2b4d3SLarry Finger
27237a5be0cSPing-Ke Shih coex_sta->crc_err_cck = 0;
27337a5be0cSPing-Ke Shih coex_sta->crc_err_11g = 0;
27437a5be0cSPing-Ke Shih coex_sta->crc_err_11n = 0;
27537a5be0cSPing-Ke Shih coex_sta->crc_err_11n_agg = 0;
27637a5be0cSPing-Ke Shih } else {
27737a5be0cSPing-Ke Shih coex_sta->crc_ok_cck =
27837a5be0cSPing-Ke Shih btcoexist->btc_read_4byte(btcoexist, 0xf88);
27937a5be0cSPing-Ke Shih coex_sta->crc_ok_11g =
28037a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xf94);
28137a5be0cSPing-Ke Shih coex_sta->crc_ok_11n =
28237a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xf90);
28337a5be0cSPing-Ke Shih coex_sta->crc_ok_11n_agg =
28437a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xfb8);
285f1d2b4d3SLarry Finger
28637a5be0cSPing-Ke Shih coex_sta->crc_err_cck =
28737a5be0cSPing-Ke Shih btcoexist->btc_read_4byte(btcoexist, 0xf84);
28837a5be0cSPing-Ke Shih coex_sta->crc_err_11g =
28937a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xf96);
29037a5be0cSPing-Ke Shih coex_sta->crc_err_11n =
29137a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xf92);
29237a5be0cSPing-Ke Shih coex_sta->crc_err_11n_agg =
29337a5be0cSPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0xfba);
29437a5be0cSPing-Ke Shih }
29537a5be0cSPing-Ke Shih
29637a5be0cSPing-Ke Shih /* reset counter */
29737a5be0cSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
29837a5be0cSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
29937a5be0cSPing-Ke Shih
30037a5be0cSPing-Ke Shih if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
30137a5be0cSPing-Ke Shih total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
30237a5be0cSPing-Ke Shih coex_sta->crc_ok_11n + coex_sta->crc_ok_11n_agg;
30337a5be0cSPing-Ke Shih
30437a5be0cSPing-Ke Shih if ((coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
30537a5be0cSPing-Ke Shih (coex_dm->bt_status ==
30637a5be0cSPing-Ke Shih BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
30737a5be0cSPing-Ke Shih (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) {
30837a5be0cSPing-Ke Shih if (coex_sta->crc_ok_cck >
30937a5be0cSPing-Ke Shih (total_cnt - coex_sta->crc_ok_cck)) {
31037a5be0cSPing-Ke Shih if (cck_lock_counter < 3)
31137a5be0cSPing-Ke Shih cck_lock_counter++;
31237a5be0cSPing-Ke Shih } else {
31337a5be0cSPing-Ke Shih if (cck_lock_counter > 0)
31437a5be0cSPing-Ke Shih cck_lock_counter--;
31537a5be0cSPing-Ke Shih }
31637a5be0cSPing-Ke Shih
31737a5be0cSPing-Ke Shih } else {
31837a5be0cSPing-Ke Shih if (cck_lock_counter > 0)
31937a5be0cSPing-Ke Shih cck_lock_counter--;
32037a5be0cSPing-Ke Shih }
32137a5be0cSPing-Ke Shih } else {
32237a5be0cSPing-Ke Shih if (cck_lock_counter > 0)
32337a5be0cSPing-Ke Shih cck_lock_counter--;
32437a5be0cSPing-Ke Shih }
32537a5be0cSPing-Ke Shih
32637a5be0cSPing-Ke Shih if (!coex_sta->pre_ccklock) {
32737a5be0cSPing-Ke Shih if (cck_lock_counter >= 3)
32837a5be0cSPing-Ke Shih coex_sta->cck_lock = true;
32937a5be0cSPing-Ke Shih else
33037a5be0cSPing-Ke Shih coex_sta->cck_lock = false;
33137a5be0cSPing-Ke Shih } else {
33237a5be0cSPing-Ke Shih if (cck_lock_counter == 0)
33337a5be0cSPing-Ke Shih coex_sta->cck_lock = false;
33437a5be0cSPing-Ke Shih else
33537a5be0cSPing-Ke Shih coex_sta->cck_lock = true;
33637a5be0cSPing-Ke Shih }
33737a5be0cSPing-Ke Shih
33837a5be0cSPing-Ke Shih if (coex_sta->cck_lock)
33937a5be0cSPing-Ke Shih coex_sta->cck_ever_lock = true;
34037a5be0cSPing-Ke Shih
34137a5be0cSPing-Ke Shih coex_sta->pre_ccklock = coex_sta->cck_lock;
342f1d2b4d3SLarry Finger }
343f1d2b4d3SLarry Finger
btc8723b1ant_is_wifi_status_changed(struct btc_coexist * btcoexist)344f1d2b4d3SLarry Finger static bool btc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
345f1d2b4d3SLarry Finger {
346f1d2b4d3SLarry Finger static bool pre_wifi_busy;
347f1d2b4d3SLarry Finger static bool pre_under_4way, pre_bt_hs_on;
348f1d2b4d3SLarry Finger bool wifi_busy = false, under_4way = false, bt_hs_on = false;
349f1d2b4d3SLarry Finger bool wifi_connected = false;
350f1d2b4d3SLarry Finger
351f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
352f1d2b4d3SLarry Finger &wifi_connected);
353f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
354f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
355f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
356f1d2b4d3SLarry Finger &under_4way);
357f1d2b4d3SLarry Finger
358f1d2b4d3SLarry Finger if (wifi_connected) {
359f1d2b4d3SLarry Finger if (wifi_busy != pre_wifi_busy) {
360f1d2b4d3SLarry Finger pre_wifi_busy = wifi_busy;
361f1d2b4d3SLarry Finger return true;
362f1d2b4d3SLarry Finger }
363f1d2b4d3SLarry Finger if (under_4way != pre_under_4way) {
364f1d2b4d3SLarry Finger pre_under_4way = under_4way;
365f1d2b4d3SLarry Finger return true;
366f1d2b4d3SLarry Finger }
367f1d2b4d3SLarry Finger if (bt_hs_on != pre_bt_hs_on) {
368f1d2b4d3SLarry Finger pre_bt_hs_on = bt_hs_on;
369f1d2b4d3SLarry Finger return true;
370f1d2b4d3SLarry Finger }
371f1d2b4d3SLarry Finger }
372f1d2b4d3SLarry Finger
373f1d2b4d3SLarry Finger return false;
374f1d2b4d3SLarry Finger }
375f1d2b4d3SLarry Finger
halbtc8723b1ant_update_bt_link_info(struct btc_coexist * btcoexist)376f1d2b4d3SLarry Finger static void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
377f1d2b4d3SLarry Finger {
378f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
379f1d2b4d3SLarry Finger bool bt_hs_on = false;
380f1d2b4d3SLarry Finger
381f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
382f1d2b4d3SLarry Finger
383f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
384f1d2b4d3SLarry Finger bt_link_info->sco_exist = coex_sta->sco_exist;
385f1d2b4d3SLarry Finger bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
386f1d2b4d3SLarry Finger bt_link_info->pan_exist = coex_sta->pan_exist;
387f1d2b4d3SLarry Finger bt_link_info->hid_exist = coex_sta->hid_exist;
38875717802SPing-Ke Shih bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
389f1d2b4d3SLarry Finger
390f1d2b4d3SLarry Finger /* work around for HS mode. */
391f1d2b4d3SLarry Finger if (bt_hs_on) {
392f1d2b4d3SLarry Finger bt_link_info->pan_exist = true;
393f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = true;
394f1d2b4d3SLarry Finger }
395f1d2b4d3SLarry Finger
396f1d2b4d3SLarry Finger /* check if Sco only */
397f1d2b4d3SLarry Finger if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
398f1d2b4d3SLarry Finger !bt_link_info->pan_exist && !bt_link_info->hid_exist)
399f1d2b4d3SLarry Finger bt_link_info->sco_only = true;
400f1d2b4d3SLarry Finger else
401f1d2b4d3SLarry Finger bt_link_info->sco_only = false;
402f1d2b4d3SLarry Finger
403f1d2b4d3SLarry Finger /* check if A2dp only */
404f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
405f1d2b4d3SLarry Finger !bt_link_info->pan_exist && !bt_link_info->hid_exist)
406f1d2b4d3SLarry Finger bt_link_info->a2dp_only = true;
407f1d2b4d3SLarry Finger else
408f1d2b4d3SLarry Finger bt_link_info->a2dp_only = false;
409f1d2b4d3SLarry Finger
410f1d2b4d3SLarry Finger /* check if Pan only */
411f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
412f1d2b4d3SLarry Finger bt_link_info->pan_exist && !bt_link_info->hid_exist)
413f1d2b4d3SLarry Finger bt_link_info->pan_only = true;
414f1d2b4d3SLarry Finger else
415f1d2b4d3SLarry Finger bt_link_info->pan_only = false;
416f1d2b4d3SLarry Finger
417f1d2b4d3SLarry Finger /* check if Hid only */
418f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
419f1d2b4d3SLarry Finger !bt_link_info->pan_exist && bt_link_info->hid_exist)
420f1d2b4d3SLarry Finger bt_link_info->hid_only = true;
421f1d2b4d3SLarry Finger else
422f1d2b4d3SLarry Finger bt_link_info->hid_only = false;
423f1d2b4d3SLarry Finger }
424f1d2b4d3SLarry Finger
halbtc8723b1ant_set_bt_auto_report(struct btc_coexist * btcoexist,bool enable_auto_report)425f66509e3SLarry Finger static void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
426f66509e3SLarry Finger bool enable_auto_report)
427f66509e3SLarry Finger {
428f66509e3SLarry Finger u8 h2c_parameter[1] = {0};
429f66509e3SLarry Finger
430f66509e3SLarry Finger h2c_parameter[0] = 0;
431f66509e3SLarry Finger
432f66509e3SLarry Finger if (enable_auto_report)
433f66509e3SLarry Finger h2c_parameter[0] |= BIT(0);
434f66509e3SLarry Finger
435f66509e3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
436f66509e3SLarry Finger }
437f66509e3SLarry Finger
halbtc8723b1ant_bt_auto_report(struct btc_coexist * btcoexist,bool force_exec,bool enable_auto_report)438f66509e3SLarry Finger static void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,
439f66509e3SLarry Finger bool force_exec,
440f66509e3SLarry Finger bool enable_auto_report)
441f66509e3SLarry Finger {
442f66509e3SLarry Finger coex_dm->cur_bt_auto_report = enable_auto_report;
443f66509e3SLarry Finger
444f66509e3SLarry Finger if (!force_exec) {
445f66509e3SLarry Finger if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
446f66509e3SLarry Finger return;
447f66509e3SLarry Finger }
448f66509e3SLarry Finger halbtc8723b1ant_set_bt_auto_report(btcoexist,
449f66509e3SLarry Finger coex_dm->cur_bt_auto_report);
450f66509e3SLarry Finger
451f66509e3SLarry Finger coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
452f66509e3SLarry Finger }
453f66509e3SLarry Finger
btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist * btcoexist,bool low_penalty_ra)454f1d2b4d3SLarry Finger static void btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist *btcoexist,
455f1d2b4d3SLarry Finger bool low_penalty_ra)
456f1d2b4d3SLarry Finger {
457dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
458f1d2b4d3SLarry Finger u8 h2c_parameter[6] = {0};
459f1d2b4d3SLarry Finger
460f1d2b4d3SLarry Finger h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty */
461f1d2b4d3SLarry Finger
462f1d2b4d3SLarry Finger if (low_penalty_ra) {
463f1d2b4d3SLarry Finger h2c_parameter[1] |= BIT0;
464f1d2b4d3SLarry Finger /* normal rate except MCS7/6/5, OFDM54/48/36 */
465f1d2b4d3SLarry Finger h2c_parameter[2] = 0x00;
466f1d2b4d3SLarry Finger h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
467f1d2b4d3SLarry Finger h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
468f1d2b4d3SLarry Finger h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
469f1d2b4d3SLarry Finger }
470f1d2b4d3SLarry Finger
471c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
472f1d2b4d3SLarry Finger "[BTCoex], set WiFi Low-Penalty Retry: %s",
473f1d2b4d3SLarry Finger (low_penalty_ra ? "ON!!" : "OFF!!"));
474f1d2b4d3SLarry Finger
475f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
476f1d2b4d3SLarry Finger }
477f1d2b4d3SLarry Finger
halbtc8723b1ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)478f1d2b4d3SLarry Finger static void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
479f1d2b4d3SLarry Finger bool force_exec, bool low_penalty_ra)
480f1d2b4d3SLarry Finger {
481f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra = low_penalty_ra;
482f1d2b4d3SLarry Finger
483f1d2b4d3SLarry Finger if (!force_exec) {
484f1d2b4d3SLarry Finger if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
485f1d2b4d3SLarry Finger return;
486f1d2b4d3SLarry Finger }
487f1d2b4d3SLarry Finger btc8723b1ant_set_sw_pen_tx_rate_adapt(btcoexist,
488f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra);
489f1d2b4d3SLarry Finger
490f1d2b4d3SLarry Finger coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
491f1d2b4d3SLarry Finger }
492f1d2b4d3SLarry Finger
halbtc8723b1ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)493f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,
494f1d2b4d3SLarry Finger u32 val0x6c0, u32 val0x6c4,
495f1d2b4d3SLarry Finger u32 val0x6c8, u8 val0x6cc)
496f1d2b4d3SLarry Finger {
497dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
498dd192494SLarry Finger
499c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
500f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
501f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
502f1d2b4d3SLarry Finger
503c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
504f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
505f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
506f1d2b4d3SLarry Finger
507c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
508f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
509f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
510f1d2b4d3SLarry Finger
511c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
512f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
513f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
514f1d2b4d3SLarry Finger }
515f1d2b4d3SLarry Finger
halbtc8723b1ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)516f1d2b4d3SLarry Finger static void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,
517f1d2b4d3SLarry Finger bool force_exec, u32 val0x6c0,
518f1d2b4d3SLarry Finger u32 val0x6c4, u32 val0x6c8,
519f1d2b4d3SLarry Finger u8 val0x6cc)
520f1d2b4d3SLarry Finger {
521dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
522dd192494SLarry Finger
523c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
524f1d2b4d3SLarry Finger "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6cc = 0x%x\n",
525f1d2b4d3SLarry Finger (force_exec ? "force to" : ""),
526f1d2b4d3SLarry Finger val0x6c0, val0x6c4, val0x6cc);
527f1d2b4d3SLarry Finger coex_dm->cur_val0x6c0 = val0x6c0;
528f1d2b4d3SLarry Finger coex_dm->cur_val0x6c4 = val0x6c4;
529f1d2b4d3SLarry Finger coex_dm->cur_val0x6c8 = val0x6c8;
530f1d2b4d3SLarry Finger coex_dm->cur_val0x6cc = val0x6cc;
531f1d2b4d3SLarry Finger
532f1d2b4d3SLarry Finger if (!force_exec) {
533f1d2b4d3SLarry Finger if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
534f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
535f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
536f1d2b4d3SLarry Finger (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
537f1d2b4d3SLarry Finger return;
538f1d2b4d3SLarry Finger }
539f1d2b4d3SLarry Finger halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
540f1d2b4d3SLarry Finger val0x6c8, val0x6cc);
541f1d2b4d3SLarry Finger
542f1d2b4d3SLarry Finger coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
543f1d2b4d3SLarry Finger coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
544f1d2b4d3SLarry Finger coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
545f1d2b4d3SLarry Finger coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
546f1d2b4d3SLarry Finger }
547f1d2b4d3SLarry Finger
halbtc8723b1ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)548f1d2b4d3SLarry Finger static void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
549f1d2b4d3SLarry Finger bool force_exec, u8 type)
550f1d2b4d3SLarry Finger {
55146b5689cSPing-Ke Shih coex_sta->coex_table_type = type;
55246b5689cSPing-Ke Shih
553f1d2b4d3SLarry Finger switch (type) {
554f1d2b4d3SLarry Finger case 0:
555f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
556f1d2b4d3SLarry Finger 0x55555555, 0xffffff, 0x3);
557f1d2b4d3SLarry Finger break;
558f1d2b4d3SLarry Finger case 1:
559f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
560f1d2b4d3SLarry Finger 0x5a5a5a5a, 0xffffff, 0x3);
561f1d2b4d3SLarry Finger break;
562f1d2b4d3SLarry Finger case 2:
563f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
564f1d2b4d3SLarry Finger 0x5a5a5a5a, 0xffffff, 0x3);
565f1d2b4d3SLarry Finger break;
566f1d2b4d3SLarry Finger case 3:
567f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
568056faad2SPing-Ke Shih 0x5a5a5a5a, 0xffffff, 0x3);
569f1d2b4d3SLarry Finger break;
570f1d2b4d3SLarry Finger case 4:
571056faad2SPing-Ke Shih if ((coex_sta->cck_ever_lock) && (coex_sta->scan_ap_num <= 5))
572056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec,
573056faad2SPing-Ke Shih 0x55555555, 0xaaaa5a5a,
574056faad2SPing-Ke Shih 0xffffff, 0x3);
575056faad2SPing-Ke Shih else
576056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec,
577056faad2SPing-Ke Shih 0x55555555, 0x5a5a5a5a,
578056faad2SPing-Ke Shih 0xffffff, 0x3);
579f1d2b4d3SLarry Finger break;
580f1d2b4d3SLarry Finger case 5:
58114cc696cSGustavo A. R. Silva halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
58214cc696cSGustavo A. R. Silva 0x5aaa5a5a, 0xffffff, 0x3);
583f1d2b4d3SLarry Finger break;
584f1d2b4d3SLarry Finger case 6:
585f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
586056faad2SPing-Ke Shih 0xaaaaaaaa, 0xffffff, 0x3);
587f1d2b4d3SLarry Finger break;
588f1d2b4d3SLarry Finger case 7:
589f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
590f1d2b4d3SLarry Finger 0xaaaaaaaa, 0xffffff, 0x3);
591f1d2b4d3SLarry Finger break;
592056faad2SPing-Ke Shih case 8:
593056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
594056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
595056faad2SPing-Ke Shih break;
596056faad2SPing-Ke Shih case 9:
597056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
598056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
599056faad2SPing-Ke Shih break;
600056faad2SPing-Ke Shih case 10:
601056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
602056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
603056faad2SPing-Ke Shih break;
604056faad2SPing-Ke Shih case 11:
605056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
606056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
607056faad2SPing-Ke Shih break;
608056faad2SPing-Ke Shih case 12:
609056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
610056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
611056faad2SPing-Ke Shih break;
612056faad2SPing-Ke Shih case 13:
613056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
614056faad2SPing-Ke Shih 0xaaaaaaaa, 0xffffff, 0x3);
615056faad2SPing-Ke Shih break;
616056faad2SPing-Ke Shih case 14:
617056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
618056faad2SPing-Ke Shih 0x5ada5ada, 0xffffff, 0x3);
619056faad2SPing-Ke Shih break;
620056faad2SPing-Ke Shih case 15:
621056faad2SPing-Ke Shih halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
622056faad2SPing-Ke Shih 0xaaaaaaaa, 0xffffff, 0x3);
623056faad2SPing-Ke Shih break;
624f1d2b4d3SLarry Finger default:
625f1d2b4d3SLarry Finger break;
626f1d2b4d3SLarry Finger }
627f1d2b4d3SLarry Finger }
628f1d2b4d3SLarry Finger
629c6821613SYan-Hsuan Chuang static void
halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)630c6821613SYan-Hsuan Chuang halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
631f1d2b4d3SLarry Finger bool enable)
632f1d2b4d3SLarry Finger {
633dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
634f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0};
635f1d2b4d3SLarry Finger
636f1d2b4d3SLarry Finger if (enable)
637f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; /* function enable */
638f1d2b4d3SLarry Finger
639c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
640f1d2b4d3SLarry Finger "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
641f1d2b4d3SLarry Finger h2c_parameter[0]);
642f1d2b4d3SLarry Finger
643f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
644f1d2b4d3SLarry Finger }
645f1d2b4d3SLarry Finger
halbtc8723b1ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)646f1d2b4d3SLarry Finger static void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
647f1d2b4d3SLarry Finger bool force_exec, bool enable)
648f1d2b4d3SLarry Finger {
649dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
650dd192494SLarry Finger
651c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
652f1d2b4d3SLarry Finger "[BTCoex], %s turn Ignore WlanAct %s\n",
653f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
654f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act = enable;
655f1d2b4d3SLarry Finger
656f1d2b4d3SLarry Finger if (!force_exec) {
657c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
658f1d2b4d3SLarry Finger "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
659f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act,
660f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act);
661f1d2b4d3SLarry Finger
662f1d2b4d3SLarry Finger if (coex_dm->pre_ignore_wlan_act ==
663f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act)
664f1d2b4d3SLarry Finger return;
665f1d2b4d3SLarry Finger }
666c6821613SYan-Hsuan Chuang halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
667f1d2b4d3SLarry Finger
668f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
669f1d2b4d3SLarry Finger }
670f1d2b4d3SLarry Finger
halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)671f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
672f1d2b4d3SLarry Finger u8 byte1, u8 byte2, u8 byte3,
673f1d2b4d3SLarry Finger u8 byte4, u8 byte5)
674f1d2b4d3SLarry Finger {
675dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
676f1d2b4d3SLarry Finger u8 h2c_parameter[5] = {0};
677f1d2b4d3SLarry Finger u8 real_byte1 = byte1, real_byte5 = byte5;
678f1d2b4d3SLarry Finger bool ap_enable = false;
679f1d2b4d3SLarry Finger
680f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
681f1d2b4d3SLarry Finger &ap_enable);
682f1d2b4d3SLarry Finger
683f1d2b4d3SLarry Finger if (ap_enable) {
684f1d2b4d3SLarry Finger if ((byte1 & BIT4) && !(byte1 & BIT5)) {
685c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
686f1d2b4d3SLarry Finger "[BTCoex], FW for 1Ant AP mode\n");
687f1d2b4d3SLarry Finger real_byte1 &= ~BIT4;
688f1d2b4d3SLarry Finger real_byte1 |= BIT5;
689f1d2b4d3SLarry Finger
690f1d2b4d3SLarry Finger real_byte5 |= BIT5;
691f1d2b4d3SLarry Finger real_byte5 &= ~BIT6;
692f1d2b4d3SLarry Finger }
693f1d2b4d3SLarry Finger }
694f1d2b4d3SLarry Finger
695f1d2b4d3SLarry Finger h2c_parameter[0] = real_byte1;
696f1d2b4d3SLarry Finger h2c_parameter[1] = byte2;
697f1d2b4d3SLarry Finger h2c_parameter[2] = byte3;
698f1d2b4d3SLarry Finger h2c_parameter[3] = byte4;
699f1d2b4d3SLarry Finger h2c_parameter[4] = real_byte5;
700f1d2b4d3SLarry Finger
701f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[0] = real_byte1;
702f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[1] = byte2;
703f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[2] = byte3;
704f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[3] = byte4;
705f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[4] = real_byte5;
706f1d2b4d3SLarry Finger
707c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
708f1d2b4d3SLarry Finger "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
709f1d2b4d3SLarry Finger h2c_parameter[0],
710f1d2b4d3SLarry Finger h2c_parameter[1] << 24 |
711f1d2b4d3SLarry Finger h2c_parameter[2] << 16 |
712f1d2b4d3SLarry Finger h2c_parameter[3] << 8 |
713f1d2b4d3SLarry Finger h2c_parameter[4]);
714f1d2b4d3SLarry Finger
715f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
716f1d2b4d3SLarry Finger }
717f1d2b4d3SLarry Finger
halbtc8723b1ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)718f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
719f1d2b4d3SLarry Finger u8 lps_val, u8 rpwm_val)
720f1d2b4d3SLarry Finger {
721f1d2b4d3SLarry Finger u8 lps = lps_val;
722f1d2b4d3SLarry Finger u8 rpwm = rpwm_val;
723f1d2b4d3SLarry Finger
724f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
725f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
726f1d2b4d3SLarry Finger }
727f1d2b4d3SLarry Finger
halbtc8723b1ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)728c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_lps_rpwm(struct btc_coexist *btcoexist,
729f1d2b4d3SLarry Finger bool force_exec,
730f1d2b4d3SLarry Finger u8 lps_val, u8 rpwm_val)
731f1d2b4d3SLarry Finger {
732dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
733dd192494SLarry Finger
734c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
735f1d2b4d3SLarry Finger "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
736f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), lps_val, rpwm_val);
737f1d2b4d3SLarry Finger coex_dm->cur_lps = lps_val;
738f1d2b4d3SLarry Finger coex_dm->cur_rpwm = rpwm_val;
739f1d2b4d3SLarry Finger
740f1d2b4d3SLarry Finger if (!force_exec) {
741c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
742f1d2b4d3SLarry Finger "[BTCoex], LPS-RxBeaconMode = 0x%x , LPS-RPWM = 0x%x!!\n",
743f1d2b4d3SLarry Finger coex_dm->cur_lps, coex_dm->cur_rpwm);
744f1d2b4d3SLarry Finger
745f1d2b4d3SLarry Finger if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
746f1d2b4d3SLarry Finger (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
747c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
748f1d2b4d3SLarry Finger "[BTCoex], LPS-RPWM_Last = 0x%x , LPS-RPWM_Now = 0x%x!!\n",
749f1d2b4d3SLarry Finger coex_dm->pre_rpwm, coex_dm->cur_rpwm);
750f1d2b4d3SLarry Finger
751f1d2b4d3SLarry Finger return;
752f1d2b4d3SLarry Finger }
753f1d2b4d3SLarry Finger }
754f1d2b4d3SLarry Finger halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
755f1d2b4d3SLarry Finger
756f1d2b4d3SLarry Finger coex_dm->pre_lps = coex_dm->cur_lps;
757f1d2b4d3SLarry Finger coex_dm->pre_rpwm = coex_dm->cur_rpwm;
758f1d2b4d3SLarry Finger }
759f1d2b4d3SLarry Finger
halbtc8723b1ant_sw_mechanism(struct btc_coexist * btcoexist,bool low_penalty_ra)760f1d2b4d3SLarry Finger static void halbtc8723b1ant_sw_mechanism(struct btc_coexist *btcoexist,
761f1d2b4d3SLarry Finger bool low_penalty_ra)
762f1d2b4d3SLarry Finger {
763dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
764dd192494SLarry Finger
765c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
766f1d2b4d3SLarry Finger "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
767f1d2b4d3SLarry Finger
768f1d2b4d3SLarry Finger halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
769f1d2b4d3SLarry Finger }
770f1d2b4d3SLarry Finger
halbtc8723b1ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool force_exec,bool init_hw_cfg,bool wifi_off)771c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_set_ant_path(struct btc_coexist *btcoexist,
77296e3baadSPing-Ke Shih u8 ant_pos_type, bool force_exec,
77396e3baadSPing-Ke Shih bool init_hw_cfg, bool wifi_off)
774f1d2b4d3SLarry Finger {
77596e3baadSPing-Ke Shih struct rtl_priv *rtlpriv = btcoexist->adapter;
776f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info;
77796e3baadSPing-Ke Shih u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0;
778f1d2b4d3SLarry Finger bool pg_ext_switch = false;
779f1d2b4d3SLarry Finger bool use_ext_switch = false;
78096e3baadSPing-Ke Shih bool is_in_mp_mode = false;
78196e3baadSPing-Ke Shih u8 h2c_parameter[2] = {0}, u8tmp = 0;
78296e3baadSPing-Ke Shih
78396e3baadSPing-Ke Shih coex_dm->cur_ant_pos_type = ant_pos_type;
784f1d2b4d3SLarry Finger
785f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
786f1d2b4d3SLarry Finger /* [31:16] = fw ver, [15:0] = fw sub ver */
787f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
788f1d2b4d3SLarry Finger
789f1d2b4d3SLarry Finger if ((fw_ver < 0xc0000) || pg_ext_switch)
790f1d2b4d3SLarry Finger use_ext_switch = true;
791f1d2b4d3SLarry Finger
792f1d2b4d3SLarry Finger if (init_hw_cfg) {
79396e3baadSPing-Ke Shih /* WiFi TRx Mask on */
79496e3baadSPing-Ke Shih btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
79596e3baadSPing-Ke Shih 0x780);
79696e3baadSPing-Ke Shih /* remove due to interrupt is disabled that polling c2h will
79796e3baadSPing-Ke Shih * fail and delay 100ms.
79896e3baadSPing-Ke Shih */
799f1d2b4d3SLarry Finger
80096e3baadSPing-Ke Shih if (fw_ver >= 0x180000) {
80196e3baadSPing-Ke Shih /* Use H2C to set GNT_BT to HIGH */
80296e3baadSPing-Ke Shih h2c_parameter[0] = 1;
80396e3baadSPing-Ke Shih btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
80496e3baadSPing-Ke Shih h2c_parameter);
80596e3baadSPing-Ke Shih } else {
80696e3baadSPing-Ke Shih /* set grant_bt to high */
80796e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
80896e3baadSPing-Ke Shih }
80996e3baadSPing-Ke Shih /* set wlan_act control by PTA */
81096e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
81196e3baadSPing-Ke Shih
812f1d2b4d3SLarry Finger /* BT select s0/s1 is controlled by BT */
813f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
81496e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
81596e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
81696e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
81796e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
81896e3baadSPing-Ke Shih } else if (wifi_off) {
81996e3baadSPing-Ke Shih if (fw_ver >= 0x180000) {
82096e3baadSPing-Ke Shih /* Use H2C to set GNT_BT to HIGH */
82196e3baadSPing-Ke Shih h2c_parameter[0] = 1;
82296e3baadSPing-Ke Shih btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
82396e3baadSPing-Ke Shih h2c_parameter);
82496e3baadSPing-Ke Shih } else {
82596e3baadSPing-Ke Shih /* set grant_bt to high */
82696e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
82796e3baadSPing-Ke Shih }
82896e3baadSPing-Ke Shih /* set wlan_act to always low */
82996e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
83096e3baadSPing-Ke Shih
83196e3baadSPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
83296e3baadSPing-Ke Shih &is_in_mp_mode);
83396e3baadSPing-Ke Shih if (!is_in_mp_mode)
83496e3baadSPing-Ke Shih /* BT select s0/s1 is controlled by BT */
83596e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
83696e3baadSPing-Ke Shih 0x20, 0x0);
83796e3baadSPing-Ke Shih else
83896e3baadSPing-Ke Shih /* BT select s0/s1 is controlled by WiFi */
83996e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
84096e3baadSPing-Ke Shih 0x20, 0x1);
841f1d2b4d3SLarry Finger
842f1d2b4d3SLarry Finger /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL
843f1d2b4d3SLarry Finger * BT Vendor 0xac=0xf002
844f1d2b4d3SLarry Finger */
845f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
846f1d2b4d3SLarry Finger u32tmp &= ~BIT23;
847f1d2b4d3SLarry Finger u32tmp &= ~BIT24;
848f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
84996e3baadSPing-Ke Shih } else {
85096e3baadSPing-Ke Shih /* Use H2C to set GNT_BT to LOW */
85196e3baadSPing-Ke Shih if (fw_ver >= 0x180000) {
85296e3baadSPing-Ke Shih if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) {
85396e3baadSPing-Ke Shih h2c_parameter[0] = 0;
85496e3baadSPing-Ke Shih btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
85596e3baadSPing-Ke Shih h2c_parameter);
85696e3baadSPing-Ke Shih }
85796e3baadSPing-Ke Shih } else {
85896e3baadSPing-Ke Shih /* BT calibration check */
85996e3baadSPing-Ke Shih while (cnt_bt_cal_chk <= 20) {
86096e3baadSPing-Ke Shih u8tmp = btcoexist->btc_read_1byte(btcoexist,
86196e3baadSPing-Ke Shih 0x49d);
86296e3baadSPing-Ke Shih cnt_bt_cal_chk++;
86396e3baadSPing-Ke Shih if (u8tmp & BIT(0)) {
864c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
86596e3baadSPing-Ke Shih DBG_LOUD,
86696e3baadSPing-Ke Shih "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
86796e3baadSPing-Ke Shih cnt_bt_cal_chk);
86896e3baadSPing-Ke Shih mdelay(50);
86996e3baadSPing-Ke Shih } else {
870c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
87196e3baadSPing-Ke Shih DBG_LOUD,
87296e3baadSPing-Ke Shih "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
87396e3baadSPing-Ke Shih cnt_bt_cal_chk);
87496e3baadSPing-Ke Shih break;
87596e3baadSPing-Ke Shih }
87696e3baadSPing-Ke Shih }
87796e3baadSPing-Ke Shih
87896e3baadSPing-Ke Shih /* set grant_bt to PTA */
87996e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
88096e3baadSPing-Ke Shih }
88196e3baadSPing-Ke Shih
88296e3baadSPing-Ke Shih if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {
88396e3baadSPing-Ke Shih /* set wlan_act control by PTA */
88496e3baadSPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
88596e3baadSPing-Ke Shih }
88696e3baadSPing-Ke Shih
88796e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
88896e3baadSPing-Ke Shih btcoexist, 0x67, 0x20,
88996e3baadSPing-Ke Shih 0x1); /* BT select s0/s1 is controlled by WiFi */
890f1d2b4d3SLarry Finger }
891f1d2b4d3SLarry Finger
892f1d2b4d3SLarry Finger if (use_ext_switch) {
893f1d2b4d3SLarry Finger if (init_hw_cfg) {
894f1d2b4d3SLarry Finger /* 0x4c[23] = 0, 0x4c[24] = 1
895f1d2b4d3SLarry Finger * Antenna control by WL/BT
896f1d2b4d3SLarry Finger */
897f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
898f1d2b4d3SLarry Finger u32tmp &= ~BIT23;
899f1d2b4d3SLarry Finger u32tmp |= BIT24;
900f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
901f1d2b4d3SLarry Finger
90296e3baadSPing-Ke Shih /* fixed internal switch S1->WiFi, S0->BT */
90396e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
90496e3baadSPing-Ke Shih
905f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
906f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT) {
907f1d2b4d3SLarry Finger /* tell firmware "no antenna inverse" */
908f1d2b4d3SLarry Finger h2c_parameter[0] = 0;
90996e3baadSPing-Ke Shih /* ext switch type */
91096e3baadSPing-Ke Shih h2c_parameter[1] = 1;
911f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
912f1d2b4d3SLarry Finger h2c_parameter);
913f1d2b4d3SLarry Finger } else {
914f1d2b4d3SLarry Finger /* tell firmware "antenna inverse" */
915f1d2b4d3SLarry Finger h2c_parameter[0] = 1;
91696e3baadSPing-Ke Shih /* ext switch type */
91796e3baadSPing-Ke Shih h2c_parameter[1] = 1;
918f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
919f1d2b4d3SLarry Finger h2c_parameter);
920f1d2b4d3SLarry Finger }
921f1d2b4d3SLarry Finger }
922f1d2b4d3SLarry Finger
92396e3baadSPing-Ke Shih if (force_exec ||
92496e3baadSPing-Ke Shih (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
925f1d2b4d3SLarry Finger /* ext switch setting */
926f1d2b4d3SLarry Finger switch (ant_pos_type) {
927f1d2b4d3SLarry Finger case BTC_ANT_PATH_WIFI:
928f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
929f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
93096e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
93196e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x1);
932f1d2b4d3SLarry Finger else
93396e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
93496e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x2);
935f1d2b4d3SLarry Finger break;
936f1d2b4d3SLarry Finger case BTC_ANT_PATH_BT:
937f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
938f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
93996e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
94096e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x2);
941f1d2b4d3SLarry Finger else
94296e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
94396e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x1);
944f1d2b4d3SLarry Finger break;
945f1d2b4d3SLarry Finger default:
946f1d2b4d3SLarry Finger case BTC_ANT_PATH_PTA:
947f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
948f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
94996e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
95096e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x1);
951f1d2b4d3SLarry Finger else
95296e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(
95396e3baadSPing-Ke Shih btcoexist, 0x92c, 0x3, 0x2);
954f1d2b4d3SLarry Finger break;
955f1d2b4d3SLarry Finger }
95696e3baadSPing-Ke Shih }
957f1d2b4d3SLarry Finger } else {
958f1d2b4d3SLarry Finger if (init_hw_cfg) {
95996e3baadSPing-Ke Shih /* 0x4c[23] = 1, 0x4c[24] = 0,
96096e3baadSPing-Ke Shih * Antenna control by 0x64
96196e3baadSPing-Ke Shih */
962f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
963f1d2b4d3SLarry Finger u32tmp |= BIT23;
964f1d2b4d3SLarry Finger u32tmp &= ~BIT24;
965f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
966f1d2b4d3SLarry Finger
96796e3baadSPing-Ke Shih /* Fix Ext switch Main->S1, Aux->S0 */
96896e3baadSPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
969f1d2b4d3SLarry Finger 0x0);
970f1d2b4d3SLarry Finger
97196e3baadSPing-Ke Shih if (board_info->btdm_ant_pos ==
97296e3baadSPing-Ke Shih BTC_ANTENNA_AT_MAIN_PORT) {
973f1d2b4d3SLarry Finger /* tell firmware "no antenna inverse" */
974f1d2b4d3SLarry Finger h2c_parameter[0] = 0;
97596e3baadSPing-Ke Shih /* internal switch type */
97696e3baadSPing-Ke Shih h2c_parameter[1] = 0;
977f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
978f1d2b4d3SLarry Finger h2c_parameter);
979f1d2b4d3SLarry Finger } else {
980f1d2b4d3SLarry Finger /* tell firmware "antenna inverse" */
981f1d2b4d3SLarry Finger h2c_parameter[0] = 1;
98296e3baadSPing-Ke Shih /* internal switch type */
98396e3baadSPing-Ke Shih h2c_parameter[1] = 0;
984f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
985f1d2b4d3SLarry Finger h2c_parameter);
986f1d2b4d3SLarry Finger }
987f1d2b4d3SLarry Finger }
988f1d2b4d3SLarry Finger
98996e3baadSPing-Ke Shih if (force_exec ||
99096e3baadSPing-Ke Shih (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
991f1d2b4d3SLarry Finger /* internal switch setting */
992f1d2b4d3SLarry Finger switch (ant_pos_type) {
993f1d2b4d3SLarry Finger case BTC_ANT_PATH_WIFI:
994f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
995f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
99696e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
99796e3baadSPing-Ke Shih 0x948, 0x0);
998f1d2b4d3SLarry Finger else
99996e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
100096e3baadSPing-Ke Shih 0x948, 0x280);
1001f1d2b4d3SLarry Finger break;
1002f1d2b4d3SLarry Finger case BTC_ANT_PATH_BT:
1003f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
1004f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
100596e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
100696e3baadSPing-Ke Shih 0x948, 0x280);
1007f1d2b4d3SLarry Finger else
100896e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
100996e3baadSPing-Ke Shih 0x948, 0x0);
1010f1d2b4d3SLarry Finger break;
1011f1d2b4d3SLarry Finger default:
1012f1d2b4d3SLarry Finger case BTC_ANT_PATH_PTA:
1013f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos ==
1014f1d2b4d3SLarry Finger BTC_ANTENNA_AT_MAIN_PORT)
101596e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
101696e3baadSPing-Ke Shih 0x948, 0x200);
1017f1d2b4d3SLarry Finger else
101896e3baadSPing-Ke Shih btcoexist->btc_write_4byte(btcoexist,
101996e3baadSPing-Ke Shih 0x948, 0x80);
1020f1d2b4d3SLarry Finger break;
1021f1d2b4d3SLarry Finger }
1022f1d2b4d3SLarry Finger }
1023f1d2b4d3SLarry Finger }
1024f1d2b4d3SLarry Finger
102596e3baadSPing-Ke Shih coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
102696e3baadSPing-Ke Shih }
102796e3baadSPing-Ke Shih
halbtc8723b1ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1028f1d2b4d3SLarry Finger static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
1029f1d2b4d3SLarry Finger bool force_exec, bool turn_on, u8 type)
1030f1d2b4d3SLarry Finger {
10310d4ae142SPing-Ke Shih struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1032f1d2b4d3SLarry Finger bool wifi_busy = false;
1033f1d2b4d3SLarry Finger u8 rssi_adjust_val = 0;
10340d4ae142SPing-Ke Shih u8 ps_tdma_byte0_val = 0x51;
10350d4ae142SPing-Ke Shih u8 ps_tdma_byte3_val = 0x10;
10360d4ae142SPing-Ke Shih u8 ps_tdma_byte4_val = 0x50;
10370d4ae142SPing-Ke Shih s8 wifi_duration_adjust = 0x0;
10380d4ae142SPing-Ke Shih static bool pre_wifi_busy;
1039f1d2b4d3SLarry Finger
1040f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma_on = turn_on;
1041f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma = type;
1042f1d2b4d3SLarry Finger
1043f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1044f1d2b4d3SLarry Finger
10450d4ae142SPing-Ke Shih if (wifi_busy != pre_wifi_busy) {
10460d4ae142SPing-Ke Shih force_exec = true;
10470d4ae142SPing-Ke Shih pre_wifi_busy = wifi_busy;
10480d4ae142SPing-Ke Shih }
1049f1d2b4d3SLarry Finger
10500d4ae142SPing-Ke Shih if (!force_exec) {
1051f1d2b4d3SLarry Finger if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1052f1d2b4d3SLarry Finger (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1053f1d2b4d3SLarry Finger return;
1054f1d2b4d3SLarry Finger }
10550d4ae142SPing-Ke Shih
10560d4ae142SPing-Ke Shih if (coex_sta->scan_ap_num <= 5) {
10570d4ae142SPing-Ke Shih wifi_duration_adjust = 5;
10580d4ae142SPing-Ke Shih
10590d4ae142SPing-Ke Shih if (coex_sta->a2dp_bit_pool >= 35)
10600d4ae142SPing-Ke Shih wifi_duration_adjust = -10;
10610d4ae142SPing-Ke Shih else if (coex_sta->a2dp_bit_pool >= 45)
10620d4ae142SPing-Ke Shih wifi_duration_adjust = -15;
10630d4ae142SPing-Ke Shih } else if (coex_sta->scan_ap_num >= 40) {
10640d4ae142SPing-Ke Shih wifi_duration_adjust = -15;
10650d4ae142SPing-Ke Shih
10660d4ae142SPing-Ke Shih if (coex_sta->a2dp_bit_pool < 35)
10670d4ae142SPing-Ke Shih wifi_duration_adjust = -5;
10680d4ae142SPing-Ke Shih else if (coex_sta->a2dp_bit_pool < 45)
10690d4ae142SPing-Ke Shih wifi_duration_adjust = -10;
10700d4ae142SPing-Ke Shih } else if (coex_sta->scan_ap_num >= 20) {
10710d4ae142SPing-Ke Shih wifi_duration_adjust = -10;
10720d4ae142SPing-Ke Shih
10730d4ae142SPing-Ke Shih if (coex_sta->a2dp_bit_pool >= 45)
10740d4ae142SPing-Ke Shih wifi_duration_adjust = -15;
10750d4ae142SPing-Ke Shih } else {
10760d4ae142SPing-Ke Shih wifi_duration_adjust = 0;
10770d4ae142SPing-Ke Shih
10780d4ae142SPing-Ke Shih if (coex_sta->a2dp_bit_pool >= 35)
10790d4ae142SPing-Ke Shih wifi_duration_adjust = -10;
10800d4ae142SPing-Ke Shih else if (coex_sta->a2dp_bit_pool >= 45)
10810d4ae142SPing-Ke Shih wifi_duration_adjust = -15;
10820d4ae142SPing-Ke Shih }
10830d4ae142SPing-Ke Shih
10840d4ae142SPing-Ke Shih if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
1085e28adf9aSPing-Ke Shih (type == 101) || (type == 102) || (type == 109) || (type == 111)) {
10860d4ae142SPing-Ke Shih if (!coex_sta->force_lps_on) {
10870d4ae142SPing-Ke Shih /* Native power save TDMA, only for A2DP-only case
10880d4ae142SPing-Ke Shih * 1/2/9/11 while wifi noisy threshold > 30
10890d4ae142SPing-Ke Shih */
10900d4ae142SPing-Ke Shih
10910d4ae142SPing-Ke Shih /* no null-pkt */
10920d4ae142SPing-Ke Shih ps_tdma_byte0_val = 0x61;
10930d4ae142SPing-Ke Shih /* no tx-pause at BT-slot */
10940d4ae142SPing-Ke Shih ps_tdma_byte3_val = 0x11;
10950d4ae142SPing-Ke Shih /* 0x778 = d/1 toggle, no dynamic slot */
10960d4ae142SPing-Ke Shih ps_tdma_byte4_val = 0x10;
10970d4ae142SPing-Ke Shih } else {
10980d4ae142SPing-Ke Shih /* null-pkt */
10990d4ae142SPing-Ke Shih ps_tdma_byte0_val = 0x51;
11000d4ae142SPing-Ke Shih /* tx-pause at BT-slot */
11010d4ae142SPing-Ke Shih ps_tdma_byte3_val = 0x10;
11020d4ae142SPing-Ke Shih /* 0x778 = d/1 toggle, dynamic slot */
11030d4ae142SPing-Ke Shih ps_tdma_byte4_val = 0x50;
11040d4ae142SPing-Ke Shih }
11050d4ae142SPing-Ke Shih } else if ((type == 3) || (type == 13) || (type == 14) ||
11060d4ae142SPing-Ke Shih (type == 103) || (type == 113) || (type == 114)) {
11070d4ae142SPing-Ke Shih /* null-pkt */
11080d4ae142SPing-Ke Shih ps_tdma_byte0_val = 0x51;
11090d4ae142SPing-Ke Shih /* tx-pause at BT-slot */
11100d4ae142SPing-Ke Shih ps_tdma_byte3_val = 0x10;
11110d4ae142SPing-Ke Shih /* 0x778 = d/1 toggle, no dynamic slot */
11120d4ae142SPing-Ke Shih ps_tdma_byte4_val = 0x10;
11130d4ae142SPing-Ke Shih } else { /* native power save case */
11140d4ae142SPing-Ke Shih /* no null-pkt */
11150d4ae142SPing-Ke Shih ps_tdma_byte0_val = 0x61;
11160d4ae142SPing-Ke Shih /* no tx-pause at BT-slot */
11170d4ae142SPing-Ke Shih ps_tdma_byte3_val = 0x11;
11180d4ae142SPing-Ke Shih /* 0x778 = d/1 toggle, no dynamic slot */
11190d4ae142SPing-Ke Shih ps_tdma_byte4_val = 0x11;
11200d4ae142SPing-Ke Shih /* psTdmaByte4Va is not define for 0x778 = d/1, 1/1 case */
11210d4ae142SPing-Ke Shih }
11220d4ae142SPing-Ke Shih
11230d4ae142SPing-Ke Shih /* if (bt_link_info->slave_role) */
11240d4ae142SPing-Ke Shih if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
11250d4ae142SPing-Ke Shih /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
11260d4ae142SPing-Ke Shih ps_tdma_byte4_val = ps_tdma_byte4_val | 0x1;
11270d4ae142SPing-Ke Shih
11280d4ae142SPing-Ke Shih if (type > 100) {
11290d4ae142SPing-Ke Shih /* set antenna control by SW */
11300d4ae142SPing-Ke Shih ps_tdma_byte0_val = ps_tdma_byte0_val | 0x82;
11310d4ae142SPing-Ke Shih /* set antenna no toggle, control by antenna diversity */
11320d4ae142SPing-Ke Shih ps_tdma_byte3_val = ps_tdma_byte3_val | 0x60;
11330d4ae142SPing-Ke Shih }
11340d4ae142SPing-Ke Shih
1135f1d2b4d3SLarry Finger if (turn_on) {
1136f1d2b4d3SLarry Finger switch (type) {
1137f1d2b4d3SLarry Finger default:
1138f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
11390d4ae142SPing-Ke Shih 0x1a, 0x0,
11400d4ae142SPing-Ke Shih ps_tdma_byte4_val);
1141f1d2b4d3SLarry Finger break;
1142f1d2b4d3SLarry Finger case 1:
11430d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11440d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val,
11450d4ae142SPing-Ke Shih 0x3a + wifi_duration_adjust, 0x03,
11460d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1147f1d2b4d3SLarry Finger
1148f1d2b4d3SLarry Finger rssi_adjust_val = 11;
1149f1d2b4d3SLarry Finger break;
1150f1d2b4d3SLarry Finger case 2:
11510d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11520d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val,
11530d4ae142SPing-Ke Shih 0x2d + wifi_duration_adjust, 0x03,
11540d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1155f1d2b4d3SLarry Finger break;
1156f1d2b4d3SLarry Finger case 3:
11570d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11580d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x30, 0x03,
11590d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1160f1d2b4d3SLarry Finger break;
1161f1d2b4d3SLarry Finger case 4:
1162f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1163f1d2b4d3SLarry Finger 0x3, 0x14, 0x0);
1164f1d2b4d3SLarry Finger break;
1165f1d2b4d3SLarry Finger case 5:
11660d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11670d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,
11680d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x11);
1169f1d2b4d3SLarry Finger break;
1170f1d2b4d3SLarry Finger case 6:
11710d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11720d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
11730d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x11);
1174f1d2b4d3SLarry Finger break;
1175f1d2b4d3SLarry Finger case 7:
1176f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1177f1d2b4d3SLarry Finger 0x5, 0x0, 0x0);
1178f1d2b4d3SLarry Finger break;
1179f1d2b4d3SLarry Finger case 8:
1180f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1181f1d2b4d3SLarry Finger 0x3, 0x10, 0x0);
1182f1d2b4d3SLarry Finger break;
1183f1d2b4d3SLarry Finger case 9:
11840d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11850d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
11860d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1187f1d2b4d3SLarry Finger break;
1188f1d2b4d3SLarry Finger case 10:
1189f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1190f1d2b4d3SLarry Finger 0xa, 0x0, 0x40);
1191f1d2b4d3SLarry Finger break;
1192f1d2b4d3SLarry Finger case 11:
11930d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
11940d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
11950d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1196f1d2b4d3SLarry Finger break;
1197f1d2b4d3SLarry Finger case 12:
1198f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1199f1d2b4d3SLarry Finger 0x0a, 0x0, 0x50);
1200f1d2b4d3SLarry Finger break;
1201f1d2b4d3SLarry Finger case 13:
12020d4ae142SPing-Ke Shih if (coex_sta->scan_ap_num <= 3)
12030d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12040d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x40, 0x3,
12050d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
12060d4ae142SPing-Ke Shih else
12070d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12080d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
12090d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1210f1d2b4d3SLarry Finger break;
1211f1d2b4d3SLarry Finger case 14:
12120d4ae142SPing-Ke Shih if (coex_sta->scan_ap_num <= 3)
12130d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12140d4ae142SPing-Ke Shih btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);
12150d4ae142SPing-Ke Shih else
12160d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12170d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
12180d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1219f1d2b4d3SLarry Finger break;
1220f1d2b4d3SLarry Finger case 15:
1221f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1222f1d2b4d3SLarry Finger 0x3, 0x8, 0x0);
1223f1d2b4d3SLarry Finger break;
1224f1d2b4d3SLarry Finger case 16:
1225f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1226f1d2b4d3SLarry Finger 0x3, 0x10, 0x0);
1227f1d2b4d3SLarry Finger break;
1228f1d2b4d3SLarry Finger case 18:
1229f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1230f1d2b4d3SLarry Finger 0x3, 0x10, 0x0);
1231f1d2b4d3SLarry Finger break;
1232f1d2b4d3SLarry Finger case 20:
12330d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12340d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
12350d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x10);
1236f1d2b4d3SLarry Finger break;
1237f1d2b4d3SLarry Finger case 21:
1238f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1239f1d2b4d3SLarry Finger 0x03, 0x11, 0x11);
1240f1d2b4d3SLarry Finger break;
1241f1d2b4d3SLarry Finger case 22:
12420d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12430d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
12440d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x10);
1245f1d2b4d3SLarry Finger break;
1246f1d2b4d3SLarry Finger case 23:
1247f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1248f1d2b4d3SLarry Finger 0x3, 0x31, 0x18);
1249f1d2b4d3SLarry Finger break;
1250f1d2b4d3SLarry Finger case 24:
1251f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1252f1d2b4d3SLarry Finger 0x3, 0x31, 0x18);
1253f1d2b4d3SLarry Finger break;
1254f1d2b4d3SLarry Finger case 25:
1255f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1256f1d2b4d3SLarry Finger 0x3, 0x31, 0x18);
1257f1d2b4d3SLarry Finger break;
1258f1d2b4d3SLarry Finger case 26:
1259f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1260f1d2b4d3SLarry Finger 0x3, 0x31, 0x18);
1261f1d2b4d3SLarry Finger break;
1262f1d2b4d3SLarry Finger case 27:
1263f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1264f1d2b4d3SLarry Finger 0x3, 0x31, 0x98);
1265f1d2b4d3SLarry Finger break;
1266f1d2b4d3SLarry Finger case 28:
1267f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1268f1d2b4d3SLarry Finger 0x3, 0x31, 0x0);
1269f1d2b4d3SLarry Finger break;
1270f1d2b4d3SLarry Finger case 29:
1271f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1272f1d2b4d3SLarry Finger 0x1a, 0x1, 0x10);
1273f1d2b4d3SLarry Finger break;
1274f1d2b4d3SLarry Finger case 30:
12750d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
12760d4ae142SPing-Ke Shih 0x3, 0x10, 0x10);
1277f1d2b4d3SLarry Finger break;
1278f1d2b4d3SLarry Finger case 31:
1279f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1280f1d2b4d3SLarry Finger 0x1a, 0, 0x58);
1281f1d2b4d3SLarry Finger break;
1282f1d2b4d3SLarry Finger case 32:
12830d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12840d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
12850d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
1286f1d2b4d3SLarry Finger break;
1287f1d2b4d3SLarry Finger case 33:
12880d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
12890d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
12900d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x10);
1291f1d2b4d3SLarry Finger break;
1292f1d2b4d3SLarry Finger case 34:
1293f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1294f1d2b4d3SLarry Finger 0x1a, 0x0, 0x10);
1295f1d2b4d3SLarry Finger break;
1296f1d2b4d3SLarry Finger case 35:
1297f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1298f1d2b4d3SLarry Finger 0x1a, 0x0, 0x10);
1299f1d2b4d3SLarry Finger break;
1300f1d2b4d3SLarry Finger case 36:
1301f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1302f1d2b4d3SLarry Finger 0x3, 0x14, 0x50);
1303f1d2b4d3SLarry Finger break;
1304f1d2b4d3SLarry Finger case 40:
13050d4ae142SPing-Ke Shih /* SoftAP only with no sta associated,BT disable ,TDMA
13060d4ae142SPing-Ke Shih * mode for power saving
13070d4ae142SPing-Ke Shih *
13080d4ae142SPing-Ke Shih * here softap mode screen off will cost 70-80mA for
13090d4ae142SPing-Ke Shih * phone
13100d4ae142SPing-Ke Shih */
1311f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1312f1d2b4d3SLarry Finger 0x00, 0x10, 0x24);
1313f1d2b4d3SLarry Finger break;
13140d4ae142SPing-Ke Shih
13150d4ae142SPing-Ke Shih case 101:
13160d4ae142SPing-Ke Shih /* for 1-Ant translate to 2-Ant */
13170d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13180d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val,
13190d4ae142SPing-Ke Shih 0x3a + wifi_duration_adjust, 0x03,
13200d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13210d4ae142SPing-Ke Shih break;
13220d4ae142SPing-Ke Shih case 102:
13230d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13240d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val,
13250d4ae142SPing-Ke Shih 0x2d + wifi_duration_adjust, 0x03,
13260d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13270d4ae142SPing-Ke Shih break;
13280d4ae142SPing-Ke Shih case 103:
13290d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13300d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,
13310d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13320d4ae142SPing-Ke Shih break;
13330d4ae142SPing-Ke Shih case 105:
13340d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13350d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x15, 0x3,
13360d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x11);
13370d4ae142SPing-Ke Shih break;
13380d4ae142SPing-Ke Shih case 106:
13390d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13400d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
13410d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x11);
13420d4ae142SPing-Ke Shih break;
13430d4ae142SPing-Ke Shih case 109:
13440d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13450d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13460d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13470d4ae142SPing-Ke Shih break;
13480d4ae142SPing-Ke Shih case 111:
13490d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13500d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
13510d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13520d4ae142SPing-Ke Shih break;
13530d4ae142SPing-Ke Shih case 113:
13540d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13550d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13560d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13570d4ae142SPing-Ke Shih break;
13580d4ae142SPing-Ke Shih case 114:
13590d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13600d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13610d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13620d4ae142SPing-Ke Shih break;
13630d4ae142SPing-Ke Shih case 120:
13640d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13650d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
13660d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x10);
13670d4ae142SPing-Ke Shih break;
13680d4ae142SPing-Ke Shih case 122:
13690d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13700d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13710d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x10);
13720d4ae142SPing-Ke Shih break;
13730d4ae142SPing-Ke Shih case 132:
13740d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13750d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13760d4ae142SPing-Ke Shih ps_tdma_byte3_val, ps_tdma_byte4_val);
13770d4ae142SPing-Ke Shih break;
13780d4ae142SPing-Ke Shih case 133:
13790d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(
13800d4ae142SPing-Ke Shih btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13810d4ae142SPing-Ke Shih ps_tdma_byte3_val, 0x11);
13820d4ae142SPing-Ke Shih break;
1383f1d2b4d3SLarry Finger }
1384f1d2b4d3SLarry Finger } else {
13850d4ae142SPing-Ke Shih /* disable PS tdma */
1386f1d2b4d3SLarry Finger switch (type) {
1387f1d2b4d3SLarry Finger case 8: /* PTA Control */
1388f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
1389f1d2b4d3SLarry Finger 0x0, 0x0, 0x0);
1390c6821613SYan-Hsuan Chuang halbtc8723b1ant_set_ant_path(btcoexist,
1391c6821613SYan-Hsuan Chuang BTC_ANT_PATH_PTA,
139296e3baadSPing-Ke Shih FORCE_EXEC,
1393f1d2b4d3SLarry Finger false, false);
1394f1d2b4d3SLarry Finger break;
1395f1d2b4d3SLarry Finger case 0:
1396c6821613SYan-Hsuan Chuang default:
1397c6821613SYan-Hsuan Chuang /* Software control, Antenna at BT side */
1398f1d2b4d3SLarry Finger halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1399f1d2b4d3SLarry Finger 0x0, 0x0, 0x0);
1400f1d2b4d3SLarry Finger break;
14010d4ae142SPing-Ke Shih case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */
14020d4ae142SPing-Ke Shih halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
14030d4ae142SPing-Ke Shih 0x48, 0x0);
1404f1d2b4d3SLarry Finger break;
1405f1d2b4d3SLarry Finger }
1406f1d2b4d3SLarry Finger }
1407f1d2b4d3SLarry Finger rssi_adjust_val = 0;
1408f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist,
1409f1d2b4d3SLarry Finger BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,
1410f1d2b4d3SLarry Finger &rssi_adjust_val);
1411f1d2b4d3SLarry Finger
1412f1d2b4d3SLarry Finger /* update pre state */
1413f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1414f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1415f1d2b4d3SLarry Finger }
1416f1d2b4d3SLarry Finger
141791b9e684SPing-Ke Shih static
btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist * btcoexist,u8 wifi_status)1418158707f9SLarry Finger void btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist *btcoexist,
1419158707f9SLarry Finger u8 wifi_status)
1420158707f9SLarry Finger {
1421158707f9SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
1422158707f9SLarry Finger static s32 up, dn, m, n, wait_count;
1423158707f9SLarry Finger /* 0: no change, +1: increase WiFi duration,
1424158707f9SLarry Finger * -1: decrease WiFi duration
1425158707f9SLarry Finger */
1426158707f9SLarry Finger s32 result;
1427aab7541aSzhengbin u8 retry_count = 0;
1428158707f9SLarry Finger
1429c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1430158707f9SLarry Finger "[BTCoex], TdmaDurationAdjustForAcl()\n");
1431158707f9SLarry Finger
1432158707f9SLarry Finger if ((wifi_status ==
1433158707f9SLarry Finger BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||
1434158707f9SLarry Finger (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||
1435158707f9SLarry Finger (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)) {
1436158707f9SLarry Finger if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1437158707f9SLarry Finger coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {
1438158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1439158707f9SLarry Finger true, 9);
14402d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 9;
1441158707f9SLarry Finger
1442158707f9SLarry Finger up = 0;
1443158707f9SLarry Finger dn = 0;
1444158707f9SLarry Finger m = 1;
1445158707f9SLarry Finger n = 3;
1446158707f9SLarry Finger result = 0;
1447158707f9SLarry Finger wait_count = 0;
1448158707f9SLarry Finger }
1449158707f9SLarry Finger return;
1450158707f9SLarry Finger }
1451158707f9SLarry Finger
1452158707f9SLarry Finger if (!coex_dm->auto_tdma_adjust) {
1453158707f9SLarry Finger coex_dm->auto_tdma_adjust = true;
1454c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1455158707f9SLarry Finger "[BTCoex], first run TdmaDurationAdjust()!!\n");
1456158707f9SLarry Finger
1457158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
14582d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 2;
1459158707f9SLarry Finger
1460158707f9SLarry Finger up = 0;
1461158707f9SLarry Finger dn = 0;
1462158707f9SLarry Finger m = 1;
1463158707f9SLarry Finger n = 3;
1464158707f9SLarry Finger result = 0;
1465158707f9SLarry Finger wait_count = 0;
1466158707f9SLarry Finger } else {
1467158707f9SLarry Finger /* acquire the BT TRx retry count from BT_Info byte2 */
1468158707f9SLarry Finger retry_count = coex_sta->bt_retry_cnt;
14692622d7d8SPing-Ke Shih
14702622d7d8SPing-Ke Shih if ((coex_sta->low_priority_tx) > 1050 ||
14712622d7d8SPing-Ke Shih (coex_sta->low_priority_rx) > 1250)
14722622d7d8SPing-Ke Shih retry_count++;
14732622d7d8SPing-Ke Shih
1474158707f9SLarry Finger result = 0;
1475158707f9SLarry Finger wait_count++;
1476158707f9SLarry Finger /* no retry in the last 2-second duration */
1477158707f9SLarry Finger if (retry_count == 0) {
1478158707f9SLarry Finger up++;
1479158707f9SLarry Finger dn--;
1480158707f9SLarry Finger
1481158707f9SLarry Finger if (dn <= 0)
1482158707f9SLarry Finger dn = 0;
1483158707f9SLarry Finger
1484158707f9SLarry Finger if (up >= n) {
14852622d7d8SPing-Ke Shih /* if retry count during continuous n*2 seconds
14862622d7d8SPing-Ke Shih * is 0, enlarge WiFi duration
14872622d7d8SPing-Ke Shih */
1488158707f9SLarry Finger wait_count = 0;
1489158707f9SLarry Finger n = 3;
1490158707f9SLarry Finger up = 0;
1491158707f9SLarry Finger dn = 0;
1492158707f9SLarry Finger result = 1;
1493c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1494158707f9SLarry Finger "[BTCoex], Increase wifi duration!!\n");
1495158707f9SLarry Finger }
1496158707f9SLarry Finger } else if (retry_count <= 3) {
14972622d7d8SPing-Ke Shih /* <=3 retry in the last 2-second duration */
1498158707f9SLarry Finger up--;
1499158707f9SLarry Finger dn++;
1500158707f9SLarry Finger
1501158707f9SLarry Finger if (up <= 0)
1502158707f9SLarry Finger up = 0;
1503158707f9SLarry Finger
1504158707f9SLarry Finger if (dn == 2) {
15052622d7d8SPing-Ke Shih /* if continuous 2 retry count(every 2 seconds)
15062622d7d8SPing-Ke Shih * >0 and < 3, reduce WiFi duration
15072622d7d8SPing-Ke Shih */
1508158707f9SLarry Finger if (wait_count <= 2)
15092622d7d8SPing-Ke Shih /* avoid loop between the two levels */
1510158707f9SLarry Finger m++;
1511158707f9SLarry Finger else
1512158707f9SLarry Finger m = 1;
1513158707f9SLarry Finger
1514158707f9SLarry Finger if (m >= 20)
15152622d7d8SPing-Ke Shih /* maximum of m = 20 ' will recheck if
15162622d7d8SPing-Ke Shih * need to adjust wifi duration in
15172622d7d8SPing-Ke Shih * maximum time interval 120 seconds
15182622d7d8SPing-Ke Shih */
1519158707f9SLarry Finger m = 20;
1520158707f9SLarry Finger
1521158707f9SLarry Finger n = 3 * m;
1522158707f9SLarry Finger up = 0;
1523158707f9SLarry Finger dn = 0;
1524158707f9SLarry Finger wait_count = 0;
1525158707f9SLarry Finger result = -1;
1526c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1527158707f9SLarry Finger "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1528158707f9SLarry Finger }
1529158707f9SLarry Finger } else {
15302622d7d8SPing-Ke Shih /* retry count > 3, once retry count > 3, to reduce
15312622d7d8SPing-Ke Shih * WiFi duration
15322622d7d8SPing-Ke Shih */
1533158707f9SLarry Finger if (wait_count == 1)
15342622d7d8SPing-Ke Shih /* to avoid loop between the two levels */
1535158707f9SLarry Finger m++;
1536158707f9SLarry Finger else
1537158707f9SLarry Finger m = 1;
1538158707f9SLarry Finger
1539158707f9SLarry Finger if (m >= 20)
15402622d7d8SPing-Ke Shih /* maximum of m = 20 ' will recheck if need to
15412622d7d8SPing-Ke Shih * adjust wifi duration in maximum time interval
15422622d7d8SPing-Ke Shih * 120 seconds
15432622d7d8SPing-Ke Shih */
1544158707f9SLarry Finger m = 20;
1545158707f9SLarry Finger
1546158707f9SLarry Finger n = 3 * m;
1547158707f9SLarry Finger up = 0;
1548158707f9SLarry Finger dn = 0;
1549158707f9SLarry Finger wait_count = 0;
1550158707f9SLarry Finger result = -1;
1551c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1552158707f9SLarry Finger "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1553158707f9SLarry Finger }
1554158707f9SLarry Finger
1555158707f9SLarry Finger if (result == -1) {
15562622d7d8SPing-Ke Shih if (coex_dm->cur_ps_tdma == 1) {
1557158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1558158707f9SLarry Finger true, 2);
15592d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 2;
1560158707f9SLarry Finger } else if (coex_dm->cur_ps_tdma == 2) {
1561158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1562158707f9SLarry Finger true, 9);
15632d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 9;
1564158707f9SLarry Finger } else if (coex_dm->cur_ps_tdma == 9) {
1565158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1566158707f9SLarry Finger true, 11);
15672d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 11;
1568158707f9SLarry Finger }
1569158707f9SLarry Finger } else if (result == 1) {
15702622d7d8SPing-Ke Shih if (coex_dm->cur_ps_tdma == 11) {
1571158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1572158707f9SLarry Finger true, 9);
15732d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 9;
1574158707f9SLarry Finger } else if (coex_dm->cur_ps_tdma == 9) {
1575158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1576158707f9SLarry Finger true, 2);
15772d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 2;
1578158707f9SLarry Finger } else if (coex_dm->cur_ps_tdma == 2) {
1579158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1580158707f9SLarry Finger true, 1);
15812d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type = 1;
1582158707f9SLarry Finger }
1583158707f9SLarry Finger }
1584158707f9SLarry Finger
1585158707f9SLarry Finger if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1586158707f9SLarry Finger coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {
1587158707f9SLarry Finger /* recover to previous adjust type */
1588158707f9SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
15892d446a56SPing-Ke Shih coex_dm->ps_tdma_du_adj_type);
1590158707f9SLarry Finger }
1591158707f9SLarry Finger }
1592158707f9SLarry Finger }
1593158707f9SLarry Finger
halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist * btcoexist,bool new_ps_state)1594c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist *btcoexist,
1595f1d2b4d3SLarry Finger bool new_ps_state)
1596f1d2b4d3SLarry Finger {
1597f1d2b4d3SLarry Finger u8 lps_mode = 0x0;
1598f1d2b4d3SLarry Finger
1599f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1600f1d2b4d3SLarry Finger
1601c6821613SYan-Hsuan Chuang if (lps_mode) {
1602c6821613SYan-Hsuan Chuang /* already under LPS state */
1603f1d2b4d3SLarry Finger if (new_ps_state) {
1604f1d2b4d3SLarry Finger /* keep state under LPS, do nothing. */
1605f1d2b4d3SLarry Finger } else {
1606f1d2b4d3SLarry Finger /* will leave LPS state, turn off psTdma first */
1607f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1608f1d2b4d3SLarry Finger false, 0);
1609f1d2b4d3SLarry Finger }
1610c6821613SYan-Hsuan Chuang } else {
1611c6821613SYan-Hsuan Chuang /* NO PS state */
1612f1d2b4d3SLarry Finger if (new_ps_state) {
1613f1d2b4d3SLarry Finger /* will enter LPS state, turn off psTdma first */
1614f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1615f1d2b4d3SLarry Finger false, 0);
1616f1d2b4d3SLarry Finger } else {
1617f1d2b4d3SLarry Finger /* keep state under NO PS state, do nothing. */
1618f1d2b4d3SLarry Finger }
1619f1d2b4d3SLarry Finger }
1620f1d2b4d3SLarry Finger }
1621f1d2b4d3SLarry Finger
halbtc8723b1ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1622f1d2b4d3SLarry Finger static void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,
1623f1d2b4d3SLarry Finger u8 ps_type, u8 lps_val,
1624f1d2b4d3SLarry Finger u8 rpwm_val)
1625f1d2b4d3SLarry Finger {
1626f1d2b4d3SLarry Finger bool low_pwr_disable = false;
1627f1d2b4d3SLarry Finger
1628f1d2b4d3SLarry Finger switch (ps_type) {
1629f1d2b4d3SLarry Finger case BTC_PS_WIFI_NATIVE:
1630f1d2b4d3SLarry Finger /* recover to original 32k low power setting */
1631f1d2b4d3SLarry Finger low_pwr_disable = false;
1632f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1633f1d2b4d3SLarry Finger &low_pwr_disable);
1634f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
163512515a08SPing-Ke Shih coex_sta->force_lps_on = false;
1636f1d2b4d3SLarry Finger break;
1637f1d2b4d3SLarry Finger case BTC_PS_LPS_ON:
1638c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, true);
1639c6821613SYan-Hsuan Chuang halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1640f1d2b4d3SLarry Finger rpwm_val);
1641c6821613SYan-Hsuan Chuang /* when coex force to enter LPS, do not enter 32k low power */
1642f1d2b4d3SLarry Finger low_pwr_disable = true;
1643f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1644f1d2b4d3SLarry Finger &low_pwr_disable);
1645c6821613SYan-Hsuan Chuang /* power save must executed before psTdma */
1646f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
164712515a08SPing-Ke Shih coex_sta->force_lps_on = true;
1648f1d2b4d3SLarry Finger break;
1649f1d2b4d3SLarry Finger case BTC_PS_LPS_OFF:
1650c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, false);
1651f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
165212515a08SPing-Ke Shih coex_sta->force_lps_on = false;
1653f1d2b4d3SLarry Finger break;
1654f1d2b4d3SLarry Finger default:
1655f1d2b4d3SLarry Finger break;
1656f1d2b4d3SLarry Finger }
1657f1d2b4d3SLarry Finger }
1658f1d2b4d3SLarry Finger
halbtc8723b1ant_action_wifi_only(struct btc_coexist * btcoexist)1659f66509e3SLarry Finger static void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)
1660f66509e3SLarry Finger {
1661f66509e3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1662f66509e3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
166396e3baadSPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
166496e3baadSPing-Ke Shih FORCE_EXEC, false, false);
1665f66509e3SLarry Finger }
1666f66509e3SLarry Finger
1667f66509e3SLarry Finger /* check if BT is disabled */
halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist * btcoexist)1668f66509e3SLarry Finger static void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist
1669f66509e3SLarry Finger *btcoexist)
1670f66509e3SLarry Finger {
1671f66509e3SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
1672f66509e3SLarry Finger static u32 bt_disable_cnt;
1673e5786189SDan Carpenter bool bt_active = true, bt_disabled = false;
1674f66509e3SLarry Finger
1675f66509e3SLarry Finger if (coex_sta->high_priority_tx == 0 &&
1676f66509e3SLarry Finger coex_sta->high_priority_rx == 0 && coex_sta->low_priority_tx == 0 &&
1677f66509e3SLarry Finger coex_sta->low_priority_rx == 0)
1678f66509e3SLarry Finger bt_active = false;
1679f66509e3SLarry Finger if (coex_sta->high_priority_tx == 0xffff &&
1680f66509e3SLarry Finger coex_sta->high_priority_rx == 0xffff &&
1681f66509e3SLarry Finger coex_sta->low_priority_tx == 0xffff &&
1682f66509e3SLarry Finger coex_sta->low_priority_rx == 0xffff)
1683f66509e3SLarry Finger bt_active = false;
1684f66509e3SLarry Finger if (bt_active) {
1685f66509e3SLarry Finger bt_disable_cnt = 0;
1686f66509e3SLarry Finger bt_disabled = false;
1687f66509e3SLarry Finger } else {
1688f66509e3SLarry Finger bt_disable_cnt++;
1689f66509e3SLarry Finger if (bt_disable_cnt >= 2)
1690f66509e3SLarry Finger bt_disabled = true;
1691f66509e3SLarry Finger }
1692f66509e3SLarry Finger if (coex_sta->bt_disabled != bt_disabled) {
1693c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1694f66509e3SLarry Finger "[BTCoex], BT is from %s to %s!!\n",
1695f66509e3SLarry Finger (coex_sta->bt_disabled ? "disabled" : "enabled"),
1696f66509e3SLarry Finger (bt_disabled ? "disabled" : "enabled"));
1697f66509e3SLarry Finger
1698f66509e3SLarry Finger coex_sta->bt_disabled = bt_disabled;
1699f66509e3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1700f66509e3SLarry Finger &bt_disabled);
1701f66509e3SLarry Finger if (bt_disabled) {
1702f66509e3SLarry Finger halbtc8723b1ant_action_wifi_only(btcoexist);
1703f66509e3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1704f66509e3SLarry Finger NULL);
1705f66509e3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1706f66509e3SLarry Finger NULL);
1707f66509e3SLarry Finger }
1708f66509e3SLarry Finger }
1709f66509e3SLarry Finger }
1710f66509e3SLarry Finger
1711f1d2b4d3SLarry Finger /*****************************************************
1712f1d2b4d3SLarry Finger *
1713f1d2b4d3SLarry Finger * Non-Software Coex Mechanism start
1714f1d2b4d3SLarry Finger *
1715f1d2b4d3SLarry Finger *****************************************************/
171653e18bcfSPing-Ke Shih
halbtc8723b1ant_action_bt_whck_test(struct btc_coexist * btcoexist)171753e18bcfSPing-Ke Shih static void halbtc8723b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)
171853e18bcfSPing-Ke Shih {
171953e18bcfSPing-Ke Shih halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
172053e18bcfSPing-Ke Shih 0x0);
172153e18bcfSPing-Ke Shih
172253e18bcfSPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
172353e18bcfSPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
172453e18bcfSPing-Ke Shih false, false);
172553e18bcfSPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
172653e18bcfSPing-Ke Shih }
172753e18bcfSPing-Ke Shih
halbtc8723b1ant_action_wifi_multiport(struct btc_coexist * btcoexist)1728f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_multiport(struct btc_coexist *btcoexist)
1729f1d2b4d3SLarry Finger {
1730f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1731f1d2b4d3SLarry Finger 0x0, 0x0);
1732f1d2b4d3SLarry Finger
1733f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
173486aeb825SYan-Hsuan Chuang halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
173586aeb825SYan-Hsuan Chuang false, false);
1736f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1737f1d2b4d3SLarry Finger }
1738f1d2b4d3SLarry Finger
halbtc8723b1ant_action_hs(struct btc_coexist * btcoexist)1739f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)
1740f1d2b4d3SLarry Finger {
1741f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1742f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1743f1d2b4d3SLarry Finger }
1744f1d2b4d3SLarry Finger
halbtc8723b1ant_action_bt_inquiry(struct btc_coexist * btcoexist)1745f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1746f1d2b4d3SLarry Finger {
1747f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1748f1d2b4d3SLarry Finger bool wifi_connected = false, ap_enable = false;
17495ae40d99SPing-Ke Shih bool wifi_busy = false, bt_busy = false;
1750f1d2b4d3SLarry Finger
1751f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1752f1d2b4d3SLarry Finger &ap_enable);
1753f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1754f1d2b4d3SLarry Finger &wifi_connected);
17555ae40d99SPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
17565ae40d99SPing-Ke Shih btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1757f1d2b4d3SLarry Finger
17585ae40d99SPing-Ke Shih if (coex_sta->bt_abnormal_scan) {
17595ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
17605ae40d99SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
17615ae40d99SPing-Ke Shih } else if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1762f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1763f1d2b4d3SLarry Finger 0x0, 0x0);
17645ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
17655ae40d99SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
17665ae40d99SPing-Ke Shih NORMAL_EXEC, false, false);
17675ae40d99SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
17685ae40d99SPing-Ke Shih } else if (bt_link_info->sco_exist || bt_link_info->hid_exist ||
17695ae40d99SPing-Ke Shih bt_link_info->a2dp_exist) {
17705ae40d99SPing-Ke Shih /* SCO/HID/A2DP busy */
17715ae40d99SPing-Ke Shih halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1772f1d2b4d3SLarry Finger 0x0, 0x0);
17735ae40d99SPing-Ke Shih if (coex_sta->c2h_bt_remote_name_req)
17745ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17755ae40d99SPing-Ke Shih 33);
1776f1d2b4d3SLarry Finger else
17775ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17785ae40d99SPing-Ke Shih 32);
1779f1d2b4d3SLarry Finger
17805ae40d99SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
17815ae40d99SPing-Ke Shih } else if (bt_link_info->pan_exist || wifi_busy) {
17825ae40d99SPing-Ke Shih halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
17835ae40d99SPing-Ke Shih 0x0, 0x0);
17845ae40d99SPing-Ke Shih if (coex_sta->c2h_bt_remote_name_req)
17855ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17865ae40d99SPing-Ke Shih 33);
17875ae40d99SPing-Ke Shih else
17885ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17895ae40d99SPing-Ke Shih 32);
17905ae40d99SPing-Ke Shih
17915ae40d99SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
17925ae40d99SPing-Ke Shih } else {
17935ae40d99SPing-Ke Shih halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
17945ae40d99SPing-Ke Shih 0x0, 0x0);
17955ae40d99SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
17965ae40d99SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
17975ae40d99SPing-Ke Shih NORMAL_EXEC, false, false);
17985ae40d99SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1799f1d2b4d3SLarry Finger }
1800f1d2b4d3SLarry Finger }
1801f1d2b4d3SLarry Finger
btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist * btcoexist,u8 wifi_status)1802f1d2b4d3SLarry Finger static void btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1803f1d2b4d3SLarry Finger u8 wifi_status)
1804f1d2b4d3SLarry Finger {
1805f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1806f1d2b4d3SLarry Finger bool wifi_connected = false;
1807f1d2b4d3SLarry Finger
1808f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1809f1d2b4d3SLarry Finger &wifi_connected);
1810f1d2b4d3SLarry Finger
1811f1d2b4d3SLarry Finger /* tdma and coex table */
1812f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) {
1813f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1814f9cbb5b4SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1815c6821613SYan-Hsuan Chuang } else {
1816c6821613SYan-Hsuan Chuang /* HID */
1817f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
1818f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1819f1d2b4d3SLarry Finger }
1820f1d2b4d3SLarry Finger }
1821f1d2b4d3SLarry Finger
halbtc8723b1ant_action_wifi_connected_bt_acl_busy(struct btc_coexist * btcoexist,u8 wifi_status)1822f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
1823f1d2b4d3SLarry Finger struct btc_coexist *btcoexist,
1824f1d2b4d3SLarry Finger u8 wifi_status)
1825f1d2b4d3SLarry Finger {
1826f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1827f1d2b4d3SLarry Finger
18280d4ae142SPing-Ke Shih if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
18290d4ae142SPing-Ke Shih bt_link_info->slave_role = true;
18300d4ae142SPing-Ke Shih else
18310d4ae142SPing-Ke Shih bt_link_info->slave_role = false;
1832f1d2b4d3SLarry Finger
1833f1d2b4d3SLarry Finger if (bt_link_info->hid_only) { /* HID */
1834f1d2b4d3SLarry Finger btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);
1835f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
1836f1d2b4d3SLarry Finger return;
1837f1d2b4d3SLarry Finger } else if (bt_link_info->a2dp_only) { /* A2DP */
1838c6821613SYan-Hsuan Chuang if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1839f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
18401ecdc436SPing-Ke Shih true, 32);
1841f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
18421ecdc436SPing-Ke Shih NORMAL_EXEC, 4);
1843f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
18442622d7d8SPing-Ke Shih } else {
18452622d7d8SPing-Ke Shih btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,
18462622d7d8SPing-Ke Shih wifi_status);
1847f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
1848f1d2b4d3SLarry Finger NORMAL_EXEC, 1);
18492622d7d8SPing-Ke Shih coex_dm->auto_tdma_adjust = true;
1850f1d2b4d3SLarry Finger }
18511ecdc436SPing-Ke Shih } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
18521ecdc436SPing-Ke Shih (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
18531ecdc436SPing-Ke Shih bt_link_info->pan_exist)) {
18541ecdc436SPing-Ke Shih /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
18551ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
18561ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
18571ecdc436SPing-Ke Shih coex_dm->auto_tdma_adjust = false;
18581ecdc436SPing-Ke Shih } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
18591ecdc436SPing-Ke Shih /* HID + A2DP */
1860b686784dSLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1861f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
1862f1d2b4d3SLarry Finger
18631ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1864f1d2b4d3SLarry Finger } else if (bt_link_info->pan_only ||
1865f1d2b4d3SLarry Finger (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
18661ecdc436SPing-Ke Shih /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
1867f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
18681ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1869f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
1870f1d2b4d3SLarry Finger } else {
18711ecdc436SPing-Ke Shih /* BT no-profile busy (0x9) */
18721ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
18731ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1874f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
1875f1d2b4d3SLarry Finger }
1876f1d2b4d3SLarry Finger }
1877f1d2b4d3SLarry Finger
btc8723b1ant_action_wifi_not_conn(struct btc_coexist * btcoexist)1878f1d2b4d3SLarry Finger static void btc8723b1ant_action_wifi_not_conn(struct btc_coexist *btcoexist)
1879f1d2b4d3SLarry Finger {
1880f1d2b4d3SLarry Finger /* power save state */
1881f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1882f1d2b4d3SLarry Finger 0x0, 0x0);
1883f1d2b4d3SLarry Finger
1884f1d2b4d3SLarry Finger /* tdma and coex table */
188540ca1882SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
188640ca1882SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
188740ca1882SPing-Ke Shih false, false);
1888f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1889f1d2b4d3SLarry Finger }
1890f1d2b4d3SLarry Finger
1891c6821613SYan-Hsuan Chuang static void
btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist * btcoexist)1892c6821613SYan-Hsuan Chuang btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1893f1d2b4d3SLarry Finger {
1894c6821613SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1895f1d2b4d3SLarry Finger
1896c6821613SYan-Hsuan Chuang halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1897f1d2b4d3SLarry Finger 0x0, 0x0);
1898f1d2b4d3SLarry Finger
1899f1d2b4d3SLarry Finger /* tdma and coex table */
19002d446a56SPing-Ke Shih if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
190140ca1882SPing-Ke Shih if (bt_link_info->a2dp_exist) {
190240ca1882SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
190340ca1882SPing-Ke Shih true, 32);
190440ca1882SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist,
190540ca1882SPing-Ke Shih NORMAL_EXEC, 4);
1906*e48c4531SPeter Kosyh } else if (bt_link_info->pan_exist) {
1907c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1908f1d2b4d3SLarry Finger true, 22);
1909c6821613SYan-Hsuan Chuang halbtc8723b1ant_coex_table_with_type(btcoexist,
191040ca1882SPing-Ke Shih NORMAL_EXEC, 4);
1911f1d2b4d3SLarry Finger } else {
1912c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1913f1d2b4d3SLarry Finger true, 20);
1914c6821613SYan-Hsuan Chuang halbtc8723b1ant_coex_table_with_type(btcoexist,
1915f1d2b4d3SLarry Finger NORMAL_EXEC, 1);
1916f1d2b4d3SLarry Finger }
19172d446a56SPing-Ke Shih } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
19182d446a56SPing-Ke Shih coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY){
1919c6821613SYan-Hsuan Chuang btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1920f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1921f1d2b4d3SLarry Finger } else {
1922c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
192340ca1882SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
192440ca1882SPing-Ke Shih NORMAL_EXEC, false, false);
1925c6821613SYan-Hsuan Chuang halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1926f1d2b4d3SLarry Finger }
1927f1d2b4d3SLarry Finger }
1928f1d2b4d3SLarry Finger
1929c6821613SYan-Hsuan Chuang static void
btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist * btcoexist)1930c6821613SYan-Hsuan Chuang btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist *btcoexist)
1931f1d2b4d3SLarry Finger {
1932c6821613SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1933f1d2b4d3SLarry Finger
1934c6821613SYan-Hsuan Chuang halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1935f1d2b4d3SLarry Finger 0x0, 0x0);
1936f1d2b4d3SLarry Finger
193740ca1882SPing-Ke Shih /* tdma and coex table */
193840ca1882SPing-Ke Shih if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
193940ca1882SPing-Ke Shih (bt_link_info->a2dp_exist)) {
194040ca1882SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
194140ca1882SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
194240ca1882SPing-Ke Shih } else if (bt_link_info->pan_exist) {
1943c6821613SYan-Hsuan Chuang halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
194440ca1882SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
194540ca1882SPing-Ke Shih } else {
194640ca1882SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
194740ca1882SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
194840ca1882SPing-Ke Shih NORMAL_EXEC, false, false);
194940ca1882SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1950f1d2b4d3SLarry Finger }
1951f1d2b4d3SLarry Finger }
1952f1d2b4d3SLarry Finger
btc8723b1ant_action_wifi_conn_scan(struct btc_coexist * btcoexist)1953f1d2b4d3SLarry Finger static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
1954f1d2b4d3SLarry Finger {
1955f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1956f1d2b4d3SLarry Finger
1957f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1958f1d2b4d3SLarry Finger 0x0, 0x0);
1959f1d2b4d3SLarry Finger
1960f1d2b4d3SLarry Finger /* tdma and coex table */
19612d446a56SPing-Ke Shih if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
19621ecdc436SPing-Ke Shih if (bt_link_info->a2dp_exist) {
19631ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
19641ecdc436SPing-Ke Shih true, 32);
19651ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist,
19661ecdc436SPing-Ke Shih NORMAL_EXEC, 4);
1967*e48c4531SPeter Kosyh } else if (bt_link_info->pan_exist) {
1968f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1969f1d2b4d3SLarry Finger true, 22);
1970f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
19711ecdc436SPing-Ke Shih NORMAL_EXEC, 4);
1972f1d2b4d3SLarry Finger } else {
1973f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1974f1d2b4d3SLarry Finger true, 20);
1975f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
19761ecdc436SPing-Ke Shih NORMAL_EXEC, 4);
1977f1d2b4d3SLarry Finger }
19782d446a56SPing-Ke Shih } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
19792d446a56SPing-Ke Shih coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
1980f1d2b4d3SLarry Finger btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1981f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1982f1d2b4d3SLarry Finger } else {
1983f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
19841ecdc436SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
19851ecdc436SPing-Ke Shih NORMAL_EXEC, false, false);
1986f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1987f1d2b4d3SLarry Finger }
1988f1d2b4d3SLarry Finger }
1989f1d2b4d3SLarry Finger
halbtc8723b1ant_action_wifi_connected_special_packet(struct btc_coexist * btcoexist)1990f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected_special_packet(
1991f1d2b4d3SLarry Finger struct btc_coexist *btcoexist)
1992f1d2b4d3SLarry Finger {
1993f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
19941ecdc436SPing-Ke Shih bool wifi_busy = false;
1995f1d2b4d3SLarry Finger
19961ecdc436SPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
19971ecdc436SPing-Ke Shih
19981ecdc436SPing-Ke Shih /* no special packet process for both WiFi and BT very busy */
19991ecdc436SPing-Ke Shih if ((wifi_busy) &&
20001ecdc436SPing-Ke Shih ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
20011ecdc436SPing-Ke Shih return;
2002f1d2b4d3SLarry Finger
2003f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2004f1d2b4d3SLarry Finger 0x0, 0x0);
2005f1d2b4d3SLarry Finger
2006f1d2b4d3SLarry Finger /* tdma and coex table */
20071ecdc436SPing-Ke Shih if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
20081ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
20091ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
20101ecdc436SPing-Ke Shih } else if (bt_link_info->a2dp_exist) {
20111ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
20121ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
20131ecdc436SPing-Ke Shih } else if (bt_link_info->pan_exist) {
2014f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
20151ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
20161ecdc436SPing-Ke Shih } else {
20171ecdc436SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
20181ecdc436SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
20191ecdc436SPing-Ke Shih NORMAL_EXEC, false, false);
20201ecdc436SPing-Ke Shih halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2021f1d2b4d3SLarry Finger }
2022f1d2b4d3SLarry Finger }
2023f1d2b4d3SLarry Finger
halbtc8723b1ant_action_wifi_connected(struct btc_coexist * btcoexist)2024f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
2025f1d2b4d3SLarry Finger {
2026dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2027f1d2b4d3SLarry Finger bool wifi_busy = false;
2028f1d2b4d3SLarry Finger bool scan = false, link = false, roam = false;
2029f1d2b4d3SLarry Finger bool under_4way = false, ap_enable = false;
2030f1d2b4d3SLarry Finger
2031c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2032f1d2b4d3SLarry Finger "[BTCoex], CoexForWifiConnect()===>\n");
2033f1d2b4d3SLarry Finger
2034f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2035f1d2b4d3SLarry Finger &under_4way);
2036f1d2b4d3SLarry Finger if (under_4way) {
2037f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
2038c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2039f1d2b4d3SLarry Finger "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
2040f1d2b4d3SLarry Finger return;
2041f1d2b4d3SLarry Finger }
2042f1d2b4d3SLarry Finger
2043f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2044f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2045f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2046f1d2b4d3SLarry Finger
2047f1d2b4d3SLarry Finger if (scan || link || roam) {
2048f1d2b4d3SLarry Finger if (scan)
2049f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_conn_scan(btcoexist);
2050f1d2b4d3SLarry Finger else
2051f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected_special_packet(
2052f1d2b4d3SLarry Finger btcoexist);
2053c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2054f1d2b4d3SLarry Finger "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
2055f1d2b4d3SLarry Finger return;
2056f1d2b4d3SLarry Finger }
2057f1d2b4d3SLarry Finger
2058f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2059f1d2b4d3SLarry Finger &ap_enable);
2060f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2061f1d2b4d3SLarry Finger /* power save state */
2062f1d2b4d3SLarry Finger if (!ap_enable &&
20632d446a56SPing-Ke Shih coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
2064f1d2b4d3SLarry Finger !btcoexist->bt_link_info.hid_only) {
20651ecdc436SPing-Ke Shih if (btcoexist->bt_link_info.a2dp_only) {
20661ecdc436SPing-Ke Shih if (!wifi_busy) {
2067f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist,
2068f1d2b4d3SLarry Finger BTC_PS_WIFI_NATIVE,
2069f1d2b4d3SLarry Finger 0x0, 0x0);
20701ecdc436SPing-Ke Shih } else { /* busy */
20711ecdc436SPing-Ke Shih if (coex_sta->scan_ap_num >=
20721ecdc436SPing-Ke Shih BT_8723B_1ANT_WIFI_NOISY_THRESH)
20731ecdc436SPing-Ke Shih /* no force LPS, no PS-TDMA,
20741ecdc436SPing-Ke Shih * use pure TDMA
20751ecdc436SPing-Ke Shih */
20761ecdc436SPing-Ke Shih halbtc8723b1ant_power_save_state(
20771ecdc436SPing-Ke Shih btcoexist, BTC_PS_WIFI_NATIVE,
20781ecdc436SPing-Ke Shih 0x0, 0x0);
20791ecdc436SPing-Ke Shih else
20801ecdc436SPing-Ke Shih halbtc8723b1ant_power_save_state(
20811ecdc436SPing-Ke Shih btcoexist, BTC_PS_LPS_ON, 0x50,
20821ecdc436SPing-Ke Shih 0x4);
20831ecdc436SPing-Ke Shih }
20841ecdc436SPing-Ke Shih } else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&
20851ecdc436SPing-Ke Shih (!coex_sta->hid_exist))
20861ecdc436SPing-Ke Shih halbtc8723b1ant_power_save_state(
20871ecdc436SPing-Ke Shih btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2088f1d2b4d3SLarry Finger else
2089f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist,
2090f1d2b4d3SLarry Finger BTC_PS_LPS_ON,
2091f1d2b4d3SLarry Finger 0x50, 0x4);
2092f1d2b4d3SLarry Finger } else {
2093f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2094f1d2b4d3SLarry Finger 0x0, 0x0);
2095f1d2b4d3SLarry Finger }
2096f1d2b4d3SLarry Finger /* tdma and coex table */
2097f1d2b4d3SLarry Finger if (!wifi_busy) {
20982d446a56SPing-Ke Shih if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
20992d446a56SPing-Ke Shih halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
21002d446a56SPing-Ke Shih btcoexist,
2101f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
21022d446a56SPing-Ke Shih } else if (coex_dm->bt_status ==
21032d446a56SPing-Ke Shih BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21042d446a56SPing-Ke Shih coex_dm->bt_status ==
21052d446a56SPing-Ke Shih BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2106f1d2b4d3SLarry Finger btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2107f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2108f1d2b4d3SLarry Finger } else {
2109f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2110f1d2b4d3SLarry Finger false, 8);
21111ecdc436SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist,
21121ecdc436SPing-Ke Shih BTC_ANT_PATH_PTA,
21131ecdc436SPing-Ke Shih NORMAL_EXEC, false, false);
2114f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
2115f1d2b4d3SLarry Finger NORMAL_EXEC, 2);
2116f1d2b4d3SLarry Finger }
2117f1d2b4d3SLarry Finger } else {
21182d446a56SPing-Ke Shih if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
21192d446a56SPing-Ke Shih halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
21202d446a56SPing-Ke Shih btcoexist,
2121f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
21222d446a56SPing-Ke Shih } else if (coex_dm->bt_status ==
21232d446a56SPing-Ke Shih BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21242d446a56SPing-Ke Shih coex_dm->bt_status ==
21252d446a56SPing-Ke Shih BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2126f1d2b4d3SLarry Finger btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2127f1d2b4d3SLarry Finger BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2128f1d2b4d3SLarry Finger } else {
2129f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
21301ecdc436SPing-Ke Shih true, 32);
21311ecdc436SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist,
21321ecdc436SPing-Ke Shih BTC_ANT_PATH_PTA,
21331ecdc436SPing-Ke Shih NORMAL_EXEC, false, false);
2134f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
21351ecdc436SPing-Ke Shih NORMAL_EXEC, 4);
2136f1d2b4d3SLarry Finger }
2137f1d2b4d3SLarry Finger }
2138f1d2b4d3SLarry Finger }
2139f1d2b4d3SLarry Finger
halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist * btcoexist)2140f1d2b4d3SLarry Finger static void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
2141f1d2b4d3SLarry Finger {
2142dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2143f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
214486aeb825SYan-Hsuan Chuang bool wifi_connected = false, bt_hs_on = false, wifi_busy = false;
2145f1d2b4d3SLarry Finger bool increase_scan_dev_num = false;
2146f1d2b4d3SLarry Finger bool bt_ctrl_agg_buf_size = false;
214786aeb825SYan-Hsuan Chuang bool miracast_plus_bt = false;
2148f1d2b4d3SLarry Finger u8 agg_buf_size = 5;
214986aeb825SYan-Hsuan Chuang u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
2150f1d2b4d3SLarry Finger u32 wifi_link_status = 0;
2151f1d2b4d3SLarry Finger u32 num_of_wifi_link = 0;
215286aeb825SYan-Hsuan Chuang u32 wifi_bw;
2153f1d2b4d3SLarry Finger
2154c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2155f1d2b4d3SLarry Finger "[BTCoex], RunCoexistMechanism()===>\n");
2156f1d2b4d3SLarry Finger
2157f1d2b4d3SLarry Finger if (btcoexist->manual_control) {
2158c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2159f1d2b4d3SLarry Finger "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
2160f1d2b4d3SLarry Finger return;
2161f1d2b4d3SLarry Finger }
2162f1d2b4d3SLarry Finger
2163f1d2b4d3SLarry Finger if (btcoexist->stop_coex_dm) {
2164c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2165f1d2b4d3SLarry Finger "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
2166f1d2b4d3SLarry Finger return;
2167f1d2b4d3SLarry Finger }
2168f1d2b4d3SLarry Finger
2169f1d2b4d3SLarry Finger if (coex_sta->under_ips) {
2170c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2171f1d2b4d3SLarry Finger "[BTCoex], wifi is under IPS !!!\n");
2172f1d2b4d3SLarry Finger return;
2173f1d2b4d3SLarry Finger }
2174f1d2b4d3SLarry Finger
217553e18bcfSPing-Ke Shih if (coex_sta->bt_whck_test) {
2176c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
217753e18bcfSPing-Ke Shih "[BTCoex], wifi is under IPS !!!\n");
217853e18bcfSPing-Ke Shih halbtc8723b1ant_action_bt_whck_test(btcoexist);
217953e18bcfSPing-Ke Shih return;
218053e18bcfSPing-Ke Shih }
218153e18bcfSPing-Ke Shih
21822d446a56SPing-Ke Shih if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY ||
21832d446a56SPing-Ke Shih coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21842d446a56SPing-Ke Shih coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2185f1d2b4d3SLarry Finger increase_scan_dev_num = true;
2186f1d2b4d3SLarry Finger
2187f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
2188f1d2b4d3SLarry Finger &increase_scan_dev_num);
2189f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2190f1d2b4d3SLarry Finger &wifi_connected);
219186aeb825SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2192f1d2b4d3SLarry Finger
2193f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2194f1d2b4d3SLarry Finger &wifi_link_status);
2195f1d2b4d3SLarry Finger num_of_wifi_link = wifi_link_status >> 16;
2196f1d2b4d3SLarry Finger
219786aeb825SYan-Hsuan Chuang if (num_of_wifi_link >= 2 ||
219886aeb825SYan-Hsuan Chuang wifi_link_status & WIFI_P2P_GO_CONNECTED) {
219986aeb825SYan-Hsuan Chuang if (bt_link_info->bt_link_exist) {
220086aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
220186aeb825SYan-Hsuan Chuang 0, 1);
220286aeb825SYan-Hsuan Chuang miracast_plus_bt = true;
2203f1d2b4d3SLarry Finger } else {
220486aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
220586aeb825SYan-Hsuan Chuang 0, 0);
220686aeb825SYan-Hsuan Chuang miracast_plus_bt = false;
2207f1d2b4d3SLarry Finger }
220886aeb825SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
220986aeb825SYan-Hsuan Chuang &miracast_plus_bt);
2210f1d2b4d3SLarry Finger halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2211f1d2b4d3SLarry Finger bt_ctrl_agg_buf_size, agg_buf_size);
2212f1d2b4d3SLarry Finger
221386aeb825SYan-Hsuan Chuang if ((bt_link_info->a2dp_exist || wifi_busy) &&
221486aeb825SYan-Hsuan Chuang (coex_sta->c2h_bt_inquiry_page))
221586aeb825SYan-Hsuan Chuang halbtc8723b1ant_action_bt_inquiry(btcoexist);
221686aeb825SYan-Hsuan Chuang else
221786aeb825SYan-Hsuan Chuang halbtc8723b1ant_action_wifi_multiport(btcoexist);
221886aeb825SYan-Hsuan Chuang
221986aeb825SYan-Hsuan Chuang return;
222086aeb825SYan-Hsuan Chuang }
222186aeb825SYan-Hsuan Chuang
222286aeb825SYan-Hsuan Chuang miracast_plus_bt = false;
222386aeb825SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
222486aeb825SYan-Hsuan Chuang &miracast_plus_bt);
222586aeb825SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
222686aeb825SYan-Hsuan Chuang
222786aeb825SYan-Hsuan Chuang if (bt_link_info->bt_link_exist && wifi_connected) {
222886aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
222986aeb825SYan-Hsuan Chuang
223086aeb825SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
223186aeb825SYan-Hsuan Chuang
223286aeb825SYan-Hsuan Chuang if (iot_peer != BTC_IOT_PEER_CISCO &&
223386aeb825SYan-Hsuan Chuang iot_peer != BTC_IOT_PEER_BROADCOM) {
22340f61953dSLarry Finger bool sco_exist = bt_link_info->sco_exist;
22350f61953dSLarry Finger
223686aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_rx(btcoexist,
22370f61953dSLarry Finger NORMAL_EXEC, sco_exist,
223886aeb825SYan-Hsuan Chuang false, 0x5);
223986aeb825SYan-Hsuan Chuang } else {
224086aeb825SYan-Hsuan Chuang if (bt_link_info->sco_exist) {
224186aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_rx(btcoexist,
224286aeb825SYan-Hsuan Chuang NORMAL_EXEC, true,
224386aeb825SYan-Hsuan Chuang false, 0x5);
224486aeb825SYan-Hsuan Chuang } else {
224586aeb825SYan-Hsuan Chuang if (wifi_bw == BTC_WIFI_BW_HT40)
224686aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_rx(
224786aeb825SYan-Hsuan Chuang btcoexist, NORMAL_EXEC, false,
224886aeb825SYan-Hsuan Chuang true, 0x10);
224986aeb825SYan-Hsuan Chuang else
225086aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_rx(
225186aeb825SYan-Hsuan Chuang btcoexist, NORMAL_EXEC, false,
225286aeb825SYan-Hsuan Chuang true, 0x8);
225386aeb825SYan-Hsuan Chuang }
225486aeb825SYan-Hsuan Chuang }
225586aeb825SYan-Hsuan Chuang
225686aeb825SYan-Hsuan Chuang halbtc8723b1ant_sw_mechanism(btcoexist, true);
225786aeb825SYan-Hsuan Chuang } else {
225886aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
225986aeb825SYan-Hsuan Chuang
226086aeb825SYan-Hsuan Chuang halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
226186aeb825SYan-Hsuan Chuang 0x5);
226286aeb825SYan-Hsuan Chuang
226386aeb825SYan-Hsuan Chuang halbtc8723b1ant_sw_mechanism(btcoexist, false);
226486aeb825SYan-Hsuan Chuang }
2265f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2266f1d2b4d3SLarry Finger
2267f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page) {
2268f1d2b4d3SLarry Finger halbtc8723b1ant_action_bt_inquiry(btcoexist);
2269f1d2b4d3SLarry Finger return;
2270f1d2b4d3SLarry Finger } else if (bt_hs_on) {
2271f1d2b4d3SLarry Finger halbtc8723b1ant_action_hs(btcoexist);
2272f1d2b4d3SLarry Finger return;
2273f1d2b4d3SLarry Finger }
2274f1d2b4d3SLarry Finger
2275f1d2b4d3SLarry Finger if (!wifi_connected) {
2276f1d2b4d3SLarry Finger bool scan = false, link = false, roam = false;
2277f1d2b4d3SLarry Finger
2278c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2279f1d2b4d3SLarry Finger "[BTCoex], wifi is non connected-idle !!!\n");
2280f1d2b4d3SLarry Finger
2281f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2282f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2283f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2284f1d2b4d3SLarry Finger
2285f1d2b4d3SLarry Finger if (scan || link || roam) {
2286f1d2b4d3SLarry Finger if (scan)
2287f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_not_conn_scan(
2288f1d2b4d3SLarry Finger btcoexist);
2289f1d2b4d3SLarry Finger else
2290f1d2b4d3SLarry Finger btc8723b1ant_act_wifi_not_conn_asso_auth(
2291f1d2b4d3SLarry Finger btcoexist);
2292f1d2b4d3SLarry Finger } else {
2293f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_not_conn(btcoexist);
2294f1d2b4d3SLarry Finger }
2295f1d2b4d3SLarry Finger } else { /* wifi LPS/Busy */
2296f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected(btcoexist);
2297f1d2b4d3SLarry Finger }
2298f1d2b4d3SLarry Finger }
2299f1d2b4d3SLarry Finger
230037a5be0cSPing-Ke Shih /* force coex mechanism to reset */
halbtc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2301f1d2b4d3SLarry Finger static void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2302f1d2b4d3SLarry Finger {
2303f1d2b4d3SLarry Finger /* sw all off */
2304f1d2b4d3SLarry Finger halbtc8723b1ant_sw_mechanism(btcoexist, false);
2305f1d2b4d3SLarry Finger
230637a5be0cSPing-Ke Shih coex_sta->pop_event_cnt = 0;
2307f1d2b4d3SLarry Finger }
2308f1d2b4d3SLarry Finger
halbtc8723b1ant_init_hw_config(struct btc_coexist * btcoexist,bool backup,bool wifi_only)2309f1d2b4d3SLarry Finger static void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist,
23108ffb5b69SPing-Ke Shih bool backup, bool wifi_only)
2311f1d2b4d3SLarry Finger {
2312dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2313f1d2b4d3SLarry Finger u32 u32tmp = 0;
23148ffb5b69SPing-Ke Shih u8 u8tmpa = 0, u8tmpb = 0;
2315f1d2b4d3SLarry Finger
2316c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2317f1d2b4d3SLarry Finger "[BTCoex], 1Ant Init HW Config!!\n");
2318f1d2b4d3SLarry Finger
23198ffb5b69SPing-Ke Shih /* 0xf0[15:12] --> Chip Cut information */
23208ffb5b69SPing-Ke Shih coex_sta->cut_version =
23218ffb5b69SPing-Ke Shih (btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;
23228ffb5b69SPing-Ke Shih /* enable TBTT interrupt */
23238ffb5b69SPing-Ke Shih btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);
2324f1d2b4d3SLarry Finger
2325f1d2b4d3SLarry Finger /* 0x790[5:0] = 0x5 */
23268ffb5b69SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
2327f1d2b4d3SLarry Finger
2328f1d2b4d3SLarry Finger /* Enable counter statistics */
2329f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
2330f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2331f1d2b4d3SLarry Finger
23328ffb5b69SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
23338ffb5b69SPing-Ke Shih
2334f1d2b4d3SLarry Finger /* Antenna config */
23358ffb5b69SPing-Ke Shih if (wifi_only)
23368ffb5b69SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
23378ffb5b69SPing-Ke Shih FORCE_EXEC, true, false);
23388ffb5b69SPing-Ke Shih else
23398ffb5b69SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
23408ffb5b69SPing-Ke Shih FORCE_EXEC, true, false);
23418ffb5b69SPing-Ke Shih
2342f1d2b4d3SLarry Finger /* PTA parameter */
2343f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
23448ffb5b69SPing-Ke Shih
23458ffb5b69SPing-Ke Shih u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
23468ffb5b69SPing-Ke Shih u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
23478ffb5b69SPing-Ke Shih u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
23488ffb5b69SPing-Ke Shih
2349c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
23508ffb5b69SPing-Ke Shih "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
23518ffb5b69SPing-Ke Shih u32tmp, u8tmpa, u8tmpb);
2352f1d2b4d3SLarry Finger }
2353f1d2b4d3SLarry Finger
2354f1d2b4d3SLarry Finger /**************************************************************
2355753c953bSYan-Hsuan Chuang * extern function start with ex_btc8723b1ant_
2356f1d2b4d3SLarry Finger **************************************************************/
ex_btc8723b1ant_power_on_setting(struct btc_coexist * btcoexist)2357753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_power_on_setting(struct btc_coexist *btcoexist)
2358f9c6ede7SPing-Ke Shih {
2359f9c6ede7SPing-Ke Shih struct rtl_priv *rtlpriv = btcoexist->adapter;
2360f9c6ede7SPing-Ke Shih struct btc_board_info *board_info = &btcoexist->board_info;
2361f9c6ede7SPing-Ke Shih u8 u8tmp = 0x0;
2362f9c6ede7SPing-Ke Shih u16 u16tmp = 0x0;
2363f9c6ede7SPing-Ke Shih u32 value;
2364f9c6ede7SPing-Ke Shih
2365c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2366f9c6ede7SPing-Ke Shih "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
2367f9c6ede7SPing-Ke Shih
2368f9c6ede7SPing-Ke Shih btcoexist->stop_coex_dm = true;
2369f9c6ede7SPing-Ke Shih
2370f9c6ede7SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
2371f9c6ede7SPing-Ke Shih
2372f9c6ede7SPing-Ke Shih /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2373f9c6ede7SPing-Ke Shih u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
2374f9c6ede7SPing-Ke Shih btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
2375f9c6ede7SPing-Ke Shih
2376f9c6ede7SPing-Ke Shih /* set GRAN_BT = 1 */
2377f9c6ede7SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
2378f9c6ede7SPing-Ke Shih /* set WLAN_ACT = 0 */
2379f9c6ede7SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
2380f9c6ede7SPing-Ke Shih
2381f9c6ede7SPing-Ke Shih /* S0 or S1 setting and Local register setting(By the setting fw can get
2382f9c6ede7SPing-Ke Shih * ant number, S0/S1, ... info)
2383f9c6ede7SPing-Ke Shih *
2384f9c6ede7SPing-Ke Shih * Local setting bit define
2385f9c6ede7SPing-Ke Shih * BIT0: "0" for no antenna inverse; "1" for antenna inverse
2386f9c6ede7SPing-Ke Shih * BIT1: "0" for internal switch; "1" for external switch
2387f9c6ede7SPing-Ke Shih * BIT2: "0" for one antenna; "1" for two antenna
2388f9c6ede7SPing-Ke Shih * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
2389f9c6ede7SPing-Ke Shih * BIT2 = 0
2390f9c6ede7SPing-Ke Shih */
2391f9c6ede7SPing-Ke Shih if (btcoexist->chip_interface == BTC_INTF_USB) {
2392f9c6ede7SPing-Ke Shih /* fixed at S0 for USB interface */
2393f9c6ede7SPing-Ke Shih btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2394f9c6ede7SPing-Ke Shih
2395f9c6ede7SPing-Ke Shih u8tmp |= 0x1; /* antenna inverse */
2396f9c6ede7SPing-Ke Shih btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
2397f9c6ede7SPing-Ke Shih
2398f9c6ede7SPing-Ke Shih board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2399f9c6ede7SPing-Ke Shih } else {
2400f9c6ede7SPing-Ke Shih /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2401f9c6ede7SPing-Ke Shih if (board_info->single_ant_path == 0) {
2402f9c6ede7SPing-Ke Shih /* set to S1 */
2403f9c6ede7SPing-Ke Shih btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);
2404f9c6ede7SPing-Ke Shih board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
2405f9c6ede7SPing-Ke Shih value = 1;
2406f9c6ede7SPing-Ke Shih } else if (board_info->single_ant_path == 1) {
2407f9c6ede7SPing-Ke Shih /* set to S0 */
2408f9c6ede7SPing-Ke Shih btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2409f9c6ede7SPing-Ke Shih u8tmp |= 0x1; /* antenna inverse */
2410f9c6ede7SPing-Ke Shih board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2411f9c6ede7SPing-Ke Shih value = 0;
2412f9c6ede7SPing-Ke Shih }
2413f9c6ede7SPing-Ke Shih
2414f9c6ede7SPing-Ke Shih btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
2415f9c6ede7SPing-Ke Shih &value);
2416f9c6ede7SPing-Ke Shih
2417f9c6ede7SPing-Ke Shih if (btcoexist->chip_interface == BTC_INTF_PCI)
2418f9c6ede7SPing-Ke Shih btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
2419f9c6ede7SPing-Ke Shih u8tmp);
2420f9c6ede7SPing-Ke Shih else if (btcoexist->chip_interface == BTC_INTF_SDIO)
2421f9c6ede7SPing-Ke Shih btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
2422f9c6ede7SPing-Ke Shih u8tmp);
2423f9c6ede7SPing-Ke Shih }
2424f9c6ede7SPing-Ke Shih }
2425f9c6ede7SPing-Ke Shih
2426f1d2b4d3SLarry Finger
ex_btc8723b1ant_init_hwconfig(struct btc_coexist * btcoexist,bool wifi_only)2427753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist,
24288ffb5b69SPing-Ke Shih bool wifi_only)
2429f1d2b4d3SLarry Finger {
24308ffb5b69SPing-Ke Shih halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);
24318ffb5b69SPing-Ke Shih btcoexist->stop_coex_dm = false;
2432f1d2b4d3SLarry Finger }
2433f1d2b4d3SLarry Finger
ex_btc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2434753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2435f1d2b4d3SLarry Finger {
2436dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2437dd192494SLarry Finger
2438c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2439f1d2b4d3SLarry Finger "[BTCoex], Coex Mechanism Init!!\n");
2440f1d2b4d3SLarry Finger
2441f1d2b4d3SLarry Finger btcoexist->stop_coex_dm = false;
2442f1d2b4d3SLarry Finger
2443f1d2b4d3SLarry Finger halbtc8723b1ant_init_coex_dm(btcoexist);
2444f1d2b4d3SLarry Finger
2445f1d2b4d3SLarry Finger halbtc8723b1ant_query_bt_info(btcoexist);
2446f1d2b4d3SLarry Finger }
2447f1d2b4d3SLarry Finger
ex_btc8723b1ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)244808431b62SPing-Ke Shih void ex_btc8723b1ant_display_coex_info(struct btc_coexist *btcoexist,
244908431b62SPing-Ke Shih struct seq_file *m)
2450f1d2b4d3SLarry Finger {
2451f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info;
2452f1d2b4d3SLarry Finger struct btc_stack_info *stack_info = &btcoexist->stack_info;
2453f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2454f1d2b4d3SLarry Finger u8 u8tmp[4], i, bt_info_ext, pstdmacase = 0;
2455f1d2b4d3SLarry Finger u16 u16tmp[4];
2456f1d2b4d3SLarry Finger u32 u32tmp[4];
2457f1d2b4d3SLarry Finger bool roam = false, scan = false;
2458f1d2b4d3SLarry Finger bool link = false, wifi_under_5g = false;
2459f1d2b4d3SLarry Finger bool bt_hs_on = false, wifi_busy = false;
2460f1d2b4d3SLarry Finger s32 wifi_rssi = 0, bt_hs_rssi = 0;
2461f1d2b4d3SLarry Finger u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck, wifi_link_status;
2462f1d2b4d3SLarry Finger u8 wifi_dot11_chnl, wifi_hs_chnl;
2463f1d2b4d3SLarry Finger u32 fw_ver = 0, bt_patch_ver = 0;
2464f1d2b4d3SLarry Finger
246508431b62SPing-Ke Shih seq_puts(m, "\n ============[BT Coexist info]============");
2466f1d2b4d3SLarry Finger
2467f1d2b4d3SLarry Finger if (btcoexist->manual_control) {
246808431b62SPing-Ke Shih seq_puts(m, "\n ============[Under Manual Control]==========");
246908431b62SPing-Ke Shih seq_puts(m, "\n ==========================================");
2470f1d2b4d3SLarry Finger }
2471f1d2b4d3SLarry Finger if (btcoexist->stop_coex_dm) {
247208431b62SPing-Ke Shih seq_puts(m, "\n ============[Coex is STOPPED]============");
247308431b62SPing-Ke Shih seq_puts(m, "\n ==========================================");
2474f1d2b4d3SLarry Finger }
2475f1d2b4d3SLarry Finger
247608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d",
2477f1d2b4d3SLarry Finger "Ant PG Num/ Ant Mech/ Ant Pos:",
2478f1d2b4d3SLarry Finger board_info->pg_ant_num, board_info->btdm_ant_num,
2479f1d2b4d3SLarry Finger board_info->btdm_ant_pos);
2480f1d2b4d3SLarry Finger
248108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %d",
2482f1d2b4d3SLarry Finger "BT stack/ hci ext ver",
2483f1d2b4d3SLarry Finger ((stack_info->profile_notified) ? "Yes" : "No"),
2484f1d2b4d3SLarry Finger stack_info->hci_version);
2485f1d2b4d3SLarry Finger
2486f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2487f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
248808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2489f1d2b4d3SLarry Finger "CoexVer/ FwVer/ PatchVer",
2490f1d2b4d3SLarry Finger glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,
2491f1d2b4d3SLarry Finger fw_ver, bt_patch_ver, bt_patch_ver);
2492f1d2b4d3SLarry Finger
2493f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2494f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2495f1d2b4d3SLarry Finger &wifi_dot11_chnl);
2496f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
249708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d(%d)",
2498f1d2b4d3SLarry Finger "Dot11 channel / HsChnl(HsMode)",
2499f1d2b4d3SLarry Finger wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2500f1d2b4d3SLarry Finger
250108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %3ph ",
2502f1d2b4d3SLarry Finger "H2C Wifi inform bt chnl Info",
250368ec5810SAndy Shevchenko coex_dm->wifi_chnl_info);
2504f1d2b4d3SLarry Finger
2505f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2506f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
250708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d",
2508f1d2b4d3SLarry Finger "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
2509f1d2b4d3SLarry Finger
2510f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2511f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2512f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
251308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2514f1d2b4d3SLarry Finger "Wifi link/ roam/ scan", link, roam, scan);
2515f1d2b4d3SLarry Finger
2516f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist , BTC_GET_BL_WIFI_UNDER_5G,
2517f1d2b4d3SLarry Finger &wifi_under_5g);
2518f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2519f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2520f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2521f1d2b4d3SLarry Finger &wifi_traffic_dir);
2522f1d2b4d3SLarry Finger
252308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %s/ %s ",
2524f1d2b4d3SLarry Finger "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
2525dd192494SLarry Finger ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2526dd192494SLarry Finger ((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20")),
2527f1d2b4d3SLarry Finger ((!wifi_busy) ? "idle" :
2528dd192494SLarry Finger ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2529f1d2b4d3SLarry Finger "uplink" : "downlink")));
2530f1d2b4d3SLarry Finger
2531f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2532f1d2b4d3SLarry Finger &wifi_link_status);
253308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",
2534f1d2b4d3SLarry Finger "sta/vwifi/hs/p2pGo/p2pGc",
2535f1d2b4d3SLarry Finger ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),
2536f1d2b4d3SLarry Finger ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),
2537f1d2b4d3SLarry Finger ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),
2538f1d2b4d3SLarry Finger ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),
2539f1d2b4d3SLarry Finger ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));
2540f1d2b4d3SLarry Finger
254108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2542f1d2b4d3SLarry Finger "BT [status/ rssi/ retryCnt]",
254312e87c09SPing-Ke Shih ((coex_sta->bt_disabled) ? ("disabled") :
2544f1d2b4d3SLarry Finger ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2545f1d2b4d3SLarry Finger ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2546f1d2b4d3SLarry Finger coex_dm->bt_status) ?
2547f1d2b4d3SLarry Finger "non-connected idle" :
2548f1d2b4d3SLarry Finger ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2549f1d2b4d3SLarry Finger coex_dm->bt_status) ?
2550f1d2b4d3SLarry Finger "connected-idle" : "busy")))),
2551f1d2b4d3SLarry Finger coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2552f1d2b4d3SLarry Finger
255308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d / %d / %d",
2554f1d2b4d3SLarry Finger "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,
2555f1d2b4d3SLarry Finger bt_link_info->hid_exist, bt_link_info->pan_exist,
2556f1d2b4d3SLarry Finger bt_link_info->a2dp_exist);
255708431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2558f1d2b4d3SLarry Finger
2559f1d2b4d3SLarry Finger bt_info_ext = coex_sta->bt_info_ext;
256008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s",
2561f1d2b4d3SLarry Finger "BT Info A2DP rate",
2562f1d2b4d3SLarry Finger (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
2563f1d2b4d3SLarry Finger
2564f1d2b4d3SLarry Finger for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
2565f1d2b4d3SLarry Finger if (coex_sta->bt_info_c2h_cnt[i]) {
256608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %7ph(%d)",
2567c6821613SYan-Hsuan Chuang glbt_info_src_8723b_1ant[i],
256868ec5810SAndy Shevchenko coex_sta->bt_info_c2h[i],
2569f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[i]);
2570f1d2b4d3SLarry Finger }
2571f1d2b4d3SLarry Finger }
257208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2573f1d2b4d3SLarry Finger "PS state, IPS/LPS, (lps/rpwm)",
2574f1d2b4d3SLarry Finger ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2575f1d2b4d3SLarry Finger ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2576f1d2b4d3SLarry Finger btcoexist->bt_info.lps_val,
2577f1d2b4d3SLarry Finger btcoexist->bt_info.rpwm_val);
257808431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2579f1d2b4d3SLarry Finger
2580f1d2b4d3SLarry Finger if (!btcoexist->manual_control) {
2581f1d2b4d3SLarry Finger /* Sw mechanism */
258208431b62SPing-Ke Shih seq_printf(m, "\n %-35s",
2583f1d2b4d3SLarry Finger "============[Sw mechanism]============");
2584f1d2b4d3SLarry Finger
258508431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/",
2586f1d2b4d3SLarry Finger "SM[LowPenaltyRA]", coex_dm->cur_low_penalty_ra);
2587f1d2b4d3SLarry Finger
258808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2589f1d2b4d3SLarry Finger "DelBA/ BtCtrlAgg/ AggSize",
2590f1d2b4d3SLarry Finger (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2591f1d2b4d3SLarry Finger (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2592f1d2b4d3SLarry Finger btcoexist->bt_info.agg_buf_size);
2593f1d2b4d3SLarry Finger
259408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x ",
2595f1d2b4d3SLarry Finger "Rate Mask", btcoexist->bt_info.ra_mask);
2596f1d2b4d3SLarry Finger
2597f1d2b4d3SLarry Finger /* Fw mechanism */
259808431b62SPing-Ke Shih seq_printf(m, "\n %-35s",
2599f1d2b4d3SLarry Finger "============[Fw mechanism]============");
2600f1d2b4d3SLarry Finger
2601f1d2b4d3SLarry Finger pstdmacase = coex_dm->cur_ps_tdma;
260208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
260368ec5810SAndy Shevchenko "PS TDMA", coex_dm->ps_tdma_para,
2604f1d2b4d3SLarry Finger pstdmacase, coex_dm->auto_tdma_adjust);
2605f1d2b4d3SLarry Finger
260608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d ",
2607f1d2b4d3SLarry Finger "IgnWlanAct", coex_dm->cur_ignore_wlan_act);
2608f1d2b4d3SLarry Finger
260908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x ",
2610f1d2b4d3SLarry Finger "Latest error condition(should be 0)",
2611f1d2b4d3SLarry Finger coex_dm->error_condition);
2612f1d2b4d3SLarry Finger }
2613f1d2b4d3SLarry Finger
261408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d",
261546b5689cSPing-Ke Shih "Coex Table Type", coex_sta->coex_table_type);
261646b5689cSPing-Ke Shih
2617f1d2b4d3SLarry Finger /* Hw setting */
261808431b62SPing-Ke Shih seq_printf(m, "\n %-35s",
2619f1d2b4d3SLarry Finger "============[Hw setting]============");
2620f1d2b4d3SLarry Finger
262108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2622f1d2b4d3SLarry Finger "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
2623f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
2624f1d2b4d3SLarry Finger coex_dm->backup_ampdu_max_time);
2625f1d2b4d3SLarry Finger
2626f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2627f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2628f1d2b4d3SLarry Finger u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2629f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
263008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2631f1d2b4d3SLarry Finger "0x430/0x434/0x42a/0x456",
2632f1d2b4d3SLarry Finger u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
2633f1d2b4d3SLarry Finger
2634f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2635f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
2636f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
263708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2638f1d2b4d3SLarry Finger "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],
2639f1d2b4d3SLarry Finger (u32tmp[1] & 0x3e000000) >> 25);
2640f1d2b4d3SLarry Finger
2641f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
2642f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
2643f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
264408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2645f1d2b4d3SLarry Finger "0x948/ 0x67[5] / 0x765",
2646f1d2b4d3SLarry Finger u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
2647f1d2b4d3SLarry Finger
2648f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
2649f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
2650f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
265108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2652f1d2b4d3SLarry Finger "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
2653f1d2b4d3SLarry Finger u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
2654f1d2b4d3SLarry Finger
2655f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
2656f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2657f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2658f1d2b4d3SLarry Finger u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
265908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2660f1d2b4d3SLarry Finger "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
2661f1d2b4d3SLarry Finger ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
2662f1d2b4d3SLarry Finger ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
2663f1d2b4d3SLarry Finger
2664f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2665f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
266608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2667f1d2b4d3SLarry Finger "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
2668f1d2b4d3SLarry Finger
2669f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2670f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
267108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2672f1d2b4d3SLarry Finger "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
2673f1d2b4d3SLarry Finger
2674f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
2675f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
2676f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
2677f1d2b4d3SLarry Finger u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
2678f1d2b4d3SLarry Finger
2679f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
2680f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2681f1d2b4d3SLarry Finger
2682f1d2b4d3SLarry Finger fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +
2683f1d2b4d3SLarry Finger ((u32tmp[1] & 0xffff0000) >> 16) +
2684f1d2b4d3SLarry Finger (u32tmp[1] & 0xffff) +
2685f1d2b4d3SLarry Finger (u32tmp[2] & 0xffff) +
2686f1d2b4d3SLarry Finger ((u32tmp[3] & 0xffff0000) >> 16) +
2687f1d2b4d3SLarry Finger (u32tmp[3] & 0xffff);
2688f1d2b4d3SLarry Finger fa_cck = (u8tmp[0] << 8) + u8tmp[1];
2689f1d2b4d3SLarry Finger
269008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2691f1d2b4d3SLarry Finger "OFDM-CCA/OFDM-FA/CCK-FA",
2692f1d2b4d3SLarry Finger u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
2693f1d2b4d3SLarry Finger
2694f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2695f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2696f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
269708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2698f1d2b4d3SLarry Finger "0x6c0/0x6c4/0x6c8(coexTable)",
2699f1d2b4d3SLarry Finger u32tmp[0], u32tmp[1], u32tmp[2]);
2700f1d2b4d3SLarry Finger
270108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d",
2702f1d2b4d3SLarry Finger "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,
2703f1d2b4d3SLarry Finger coex_sta->high_priority_tx);
270408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d",
2705f1d2b4d3SLarry Finger "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
2706f1d2b4d3SLarry Finger coex_sta->low_priority_tx);
2707f66509e3SLarry Finger if (btcoexist->auto_report_1ant)
2708f1d2b4d3SLarry Finger halbtc8723b1ant_monitor_bt_ctr(btcoexist);
270908431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2710f1d2b4d3SLarry Finger }
2711f1d2b4d3SLarry Finger
ex_btc8723b1ant_ips_notify(struct btc_coexist * btcoexist,u8 type)2712753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2713f1d2b4d3SLarry Finger {
2714dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2715dd192494SLarry Finger
2716f1d2b4d3SLarry Finger if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2717f1d2b4d3SLarry Finger return;
2718f1d2b4d3SLarry Finger
2719f1d2b4d3SLarry Finger if (BTC_IPS_ENTER == type) {
2720c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2721f1d2b4d3SLarry Finger "[BTCoex], IPS ENTER notify\n");
2722f1d2b4d3SLarry Finger coex_sta->under_ips = true;
2723f1d2b4d3SLarry Finger
2724c6821613SYan-Hsuan Chuang halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
272596e3baadSPing-Ke Shih FORCE_EXEC, false, true);
2726f1d2b4d3SLarry Finger /* set PTA control */
2727f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2728f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist,
2729f1d2b4d3SLarry Finger NORMAL_EXEC, 0);
2730f1d2b4d3SLarry Finger } else if (BTC_IPS_LEAVE == type) {
2731c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2732f1d2b4d3SLarry Finger "[BTCoex], IPS LEAVE notify\n");
2733f1d2b4d3SLarry Finger coex_sta->under_ips = false;
2734f1d2b4d3SLarry Finger
27358ffb5b69SPing-Ke Shih halbtc8723b1ant_init_hw_config(btcoexist, false, false);
2736f1d2b4d3SLarry Finger halbtc8723b1ant_init_coex_dm(btcoexist);
2737f1d2b4d3SLarry Finger halbtc8723b1ant_query_bt_info(btcoexist);
2738f1d2b4d3SLarry Finger }
2739f1d2b4d3SLarry Finger }
2740f1d2b4d3SLarry Finger
ex_btc8723b1ant_lps_notify(struct btc_coexist * btcoexist,u8 type)2741753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2742f1d2b4d3SLarry Finger {
2743dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2744dd192494SLarry Finger
2745f1d2b4d3SLarry Finger if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2746f1d2b4d3SLarry Finger return;
2747f1d2b4d3SLarry Finger
2748f1d2b4d3SLarry Finger if (BTC_LPS_ENABLE == type) {
2749c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2750f1d2b4d3SLarry Finger "[BTCoex], LPS ENABLE notify\n");
2751f1d2b4d3SLarry Finger coex_sta->under_lps = true;
2752f1d2b4d3SLarry Finger } else if (BTC_LPS_DISABLE == type) {
2753c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2754f1d2b4d3SLarry Finger "[BTCoex], LPS DISABLE notify\n");
2755f1d2b4d3SLarry Finger coex_sta->under_lps = false;
2756f1d2b4d3SLarry Finger }
2757f1d2b4d3SLarry Finger }
2758f1d2b4d3SLarry Finger
ex_btc8723b1ant_scan_notify(struct btc_coexist * btcoexist,u8 type)2759753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2760f1d2b4d3SLarry Finger {
2761dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2762f1d2b4d3SLarry Finger bool wifi_connected = false, bt_hs_on = false;
2763c01fd117SPing-Ke Shih u8 u8tmpa, u8tmpb;
2764c01fd117SPing-Ke Shih u32 u32tmp;
2765f1d2b4d3SLarry Finger u32 wifi_link_status = 0;
2766f1d2b4d3SLarry Finger u32 num_of_wifi_link = 0;
2767f1d2b4d3SLarry Finger bool bt_ctrl_agg_buf_size = false;
2768f1d2b4d3SLarry Finger u8 agg_buf_size = 5;
2769f1d2b4d3SLarry Finger
2770c01fd117SPing-Ke Shih if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2771c01fd117SPing-Ke Shih return;
2772c01fd117SPing-Ke Shih
2773c01fd117SPing-Ke Shih if (type == BTC_SCAN_START) {
2774c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = true;
2775c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2776c01fd117SPing-Ke Shih "[BTCoex], SCAN START notify\n");
2777c01fd117SPing-Ke Shih /* Force antenna setup for no scan result issue */
2778c01fd117SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2779c01fd117SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2780c01fd117SPing-Ke Shih FORCE_EXEC, false, false);
2781c01fd117SPing-Ke Shih u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2782c01fd117SPing-Ke Shih u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2783c01fd117SPing-Ke Shih u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2784c01fd117SPing-Ke Shih
2785c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2786c01fd117SPing-Ke Shih "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2787c01fd117SPing-Ke Shih u32tmp, u8tmpa, u8tmpb);
2788c01fd117SPing-Ke Shih } else {
2789c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = false;
2790c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2791c01fd117SPing-Ke Shih "[BTCoex], SCAN FINISH notify\n");
2792c01fd117SPing-Ke Shih
2793c01fd117SPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2794c01fd117SPing-Ke Shih &coex_sta->scan_ap_num);
2795c01fd117SPing-Ke Shih }
2796c01fd117SPing-Ke Shih
2797c01fd117SPing-Ke Shih if (coex_sta->bt_disabled)
2798f1d2b4d3SLarry Finger return;
2799f1d2b4d3SLarry Finger
2800f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2801f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2802f1d2b4d3SLarry Finger &wifi_connected);
2803f1d2b4d3SLarry Finger
2804f1d2b4d3SLarry Finger halbtc8723b1ant_query_bt_info(btcoexist);
2805f1d2b4d3SLarry Finger
2806f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2807f1d2b4d3SLarry Finger &wifi_link_status);
2808f1d2b4d3SLarry Finger num_of_wifi_link = wifi_link_status >> 16;
2809f1d2b4d3SLarry Finger if (num_of_wifi_link >= 2) {
2810f1d2b4d3SLarry Finger halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2811f1d2b4d3SLarry Finger halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2812f1d2b4d3SLarry Finger bt_ctrl_agg_buf_size, agg_buf_size);
2813f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_multiport(btcoexist);
2814f1d2b4d3SLarry Finger return;
2815f1d2b4d3SLarry Finger }
2816f1d2b4d3SLarry Finger
2817f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page) {
2818f1d2b4d3SLarry Finger halbtc8723b1ant_action_bt_inquiry(btcoexist);
2819f1d2b4d3SLarry Finger return;
2820f1d2b4d3SLarry Finger } else if (bt_hs_on) {
2821f1d2b4d3SLarry Finger halbtc8723b1ant_action_hs(btcoexist);
2822f1d2b4d3SLarry Finger return;
2823f1d2b4d3SLarry Finger }
2824f1d2b4d3SLarry Finger
2825f1d2b4d3SLarry Finger if (BTC_SCAN_START == type) {
2826c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2827f1d2b4d3SLarry Finger "[BTCoex], SCAN START notify\n");
2828c6821613SYan-Hsuan Chuang if (!wifi_connected)
2829c6821613SYan-Hsuan Chuang /* non-connected scan */
2830f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_not_conn_scan(btcoexist);
2831c6821613SYan-Hsuan Chuang else
2832c6821613SYan-Hsuan Chuang /* wifi is connected */
2833f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_conn_scan(btcoexist);
2834f1d2b4d3SLarry Finger } else if (BTC_SCAN_FINISH == type) {
2835c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2836f1d2b4d3SLarry Finger "[BTCoex], SCAN FINISH notify\n");
2837c6821613SYan-Hsuan Chuang if (!wifi_connected)
2838c6821613SYan-Hsuan Chuang /* non-connected scan */
2839f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_not_conn(btcoexist);
2840f1d2b4d3SLarry Finger else
2841f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected(btcoexist);
2842f1d2b4d3SLarry Finger }
2843f1d2b4d3SLarry Finger }
2844f1d2b4d3SLarry Finger
ex_btc8723b1ant_connect_notify(struct btc_coexist * btcoexist,u8 type)2845753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2846f1d2b4d3SLarry Finger {
2847dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2848f1d2b4d3SLarry Finger bool wifi_connected = false, bt_hs_on = false;
2849f1d2b4d3SLarry Finger u32 wifi_link_status = 0;
2850f1d2b4d3SLarry Finger u32 num_of_wifi_link = 0;
2851f9af7af4SPing-Ke Shih bool bt_ctrl_agg_buf_size = false, under_4way = false;
2852f1d2b4d3SLarry Finger u8 agg_buf_size = 5;
2853f1d2b4d3SLarry Finger
2854f9af7af4SPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2855f9af7af4SPing-Ke Shih &under_4way);
2856f9af7af4SPing-Ke Shih
2857f1d2b4d3SLarry Finger if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
285812e87c09SPing-Ke Shih coex_sta->bt_disabled)
2859f1d2b4d3SLarry Finger return;
2860f1d2b4d3SLarry Finger
2861f9af7af4SPing-Ke Shih if (type == BTC_ASSOCIATE_START) {
2862c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = true;
2863c34e42aaSPing-Ke Shih
2864f9af7af4SPing-Ke Shih /* Force antenna setup for no scan result issue */
2865f9af7af4SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2866f9af7af4SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2867f9af7af4SPing-Ke Shih FORCE_EXEC, false, false);
2868c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2869f9af7af4SPing-Ke Shih "[BTCoex], CONNECT START notify\n");
2870fa73a1ebSPing-Ke Shih coex_dm->arp_cnt = 0;
2871f9af7af4SPing-Ke Shih } else {
2872c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = false;
2873c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2874f9af7af4SPing-Ke Shih "[BTCoex], CONNECT FINISH notify\n");
2875f9af7af4SPing-Ke Shih }
2876f9af7af4SPing-Ke Shih
2877f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2878f1d2b4d3SLarry Finger &wifi_link_status);
2879f1d2b4d3SLarry Finger num_of_wifi_link = wifi_link_status>>16;
2880f1d2b4d3SLarry Finger if (num_of_wifi_link >= 2) {
2881f1d2b4d3SLarry Finger halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2882f1d2b4d3SLarry Finger halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2883f1d2b4d3SLarry Finger bt_ctrl_agg_buf_size, agg_buf_size);
2884f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_multiport(btcoexist);
2885f1d2b4d3SLarry Finger return;
2886f1d2b4d3SLarry Finger }
2887f1d2b4d3SLarry Finger
2888f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2889f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page) {
2890f1d2b4d3SLarry Finger halbtc8723b1ant_action_bt_inquiry(btcoexist);
2891f1d2b4d3SLarry Finger return;
2892f1d2b4d3SLarry Finger } else if (bt_hs_on) {
2893f1d2b4d3SLarry Finger halbtc8723b1ant_action_hs(btcoexist);
2894f1d2b4d3SLarry Finger return;
2895f1d2b4d3SLarry Finger }
2896f1d2b4d3SLarry Finger
2897f1d2b4d3SLarry Finger if (BTC_ASSOCIATE_START == type) {
2898c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2899f1d2b4d3SLarry Finger "[BTCoex], CONNECT START notify\n");
2900f1d2b4d3SLarry Finger btc8723b1ant_act_wifi_not_conn_asso_auth(btcoexist);
2901f1d2b4d3SLarry Finger } else if (BTC_ASSOCIATE_FINISH == type) {
2902c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2903f1d2b4d3SLarry Finger "[BTCoex], CONNECT FINISH notify\n");
2904f1d2b4d3SLarry Finger
2905f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2906f1d2b4d3SLarry Finger &wifi_connected);
2907c6821613SYan-Hsuan Chuang if (!wifi_connected)
2908c6821613SYan-Hsuan Chuang /* non-connected scan */
2909f1d2b4d3SLarry Finger btc8723b1ant_action_wifi_not_conn(btcoexist);
2910f1d2b4d3SLarry Finger else
2911f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected(btcoexist);
2912f1d2b4d3SLarry Finger }
2913f1d2b4d3SLarry Finger }
2914f1d2b4d3SLarry Finger
ex_btc8723b1ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)2915753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,
2916f1d2b4d3SLarry Finger u8 type)
2917f1d2b4d3SLarry Finger {
2918dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
2919f1d2b4d3SLarry Finger u8 h2c_parameter[3] = {0};
2920f1d2b4d3SLarry Finger u32 wifi_bw;
29212d446a56SPing-Ke Shih u8 wifi_central_chnl;
292229c1de91SPing-Ke Shih bool wifi_under_b_mode = false;
2923f1d2b4d3SLarry Finger
2924f1d2b4d3SLarry Finger if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
292512e87c09SPing-Ke Shih coex_sta->bt_disabled)
2926f1d2b4d3SLarry Finger return;
2927f1d2b4d3SLarry Finger
292829c1de91SPing-Ke Shih if (type == BTC_MEDIA_CONNECT) {
2929c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2930f1d2b4d3SLarry Finger "[BTCoex], MEDIA connect notify\n");
293129c1de91SPing-Ke Shih /* Force antenna setup for no scan result issue */
293229c1de91SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
293329c1de91SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
293429c1de91SPing-Ke Shih FORCE_EXEC, false, false);
293529c1de91SPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
293629c1de91SPing-Ke Shih &wifi_under_b_mode);
293729c1de91SPing-Ke Shih
293829c1de91SPing-Ke Shih /* Set CCK Tx/Rx high Pri except 11b mode */
293929c1de91SPing-Ke Shih if (wifi_under_b_mode) {
294029c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cd,
294129c1de91SPing-Ke Shih 0x00); /* CCK Tx */
294229c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cf,
294329c1de91SPing-Ke Shih 0x00); /* CCK Rx */
294429c1de91SPing-Ke Shih } else {
294529c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cd,
294629c1de91SPing-Ke Shih 0x00); /* CCK Tx */
294729c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cf,
294829c1de91SPing-Ke Shih 0x10); /* CCK Rx */
294929c1de91SPing-Ke Shih }
295029c1de91SPing-Ke Shih
295129c1de91SPing-Ke Shih coex_dm->backup_arfr_cnt1 =
295229c1de91SPing-Ke Shih btcoexist->btc_read_4byte(btcoexist, 0x430);
295329c1de91SPing-Ke Shih coex_dm->backup_arfr_cnt2 =
295429c1de91SPing-Ke Shih btcoexist->btc_read_4byte(btcoexist, 0x434);
295529c1de91SPing-Ke Shih coex_dm->backup_retry_limit =
295629c1de91SPing-Ke Shih btcoexist->btc_read_2byte(btcoexist, 0x42a);
295729c1de91SPing-Ke Shih coex_dm->backup_ampdu_max_time =
295829c1de91SPing-Ke Shih btcoexist->btc_read_1byte(btcoexist, 0x456);
295929c1de91SPing-Ke Shih } else {
2960c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2961f1d2b4d3SLarry Finger "[BTCoex], MEDIA disconnect notify\n");
2962fa73a1ebSPing-Ke Shih coex_dm->arp_cnt = 0;
2963f1d2b4d3SLarry Finger
296429c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
296529c1de91SPing-Ke Shih btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
296629c1de91SPing-Ke Shih
296729c1de91SPing-Ke Shih coex_sta->cck_ever_lock = false;
296829c1de91SPing-Ke Shih }
296929c1de91SPing-Ke Shih
2970f1d2b4d3SLarry Finger /* only 2.4G we need to inform bt the chnl mask */
2971f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
29722d446a56SPing-Ke Shih &wifi_central_chnl);
2973f1d2b4d3SLarry Finger
29742d446a56SPing-Ke Shih if (type == BTC_MEDIA_CONNECT && wifi_central_chnl <= 14) {
2975f1d2b4d3SLarry Finger h2c_parameter[0] = 0x0;
29762d446a56SPing-Ke Shih h2c_parameter[1] = wifi_central_chnl;
2977f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2978f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw)
2979f1d2b4d3SLarry Finger h2c_parameter[2] = 0x30;
2980f1d2b4d3SLarry Finger else
2981f1d2b4d3SLarry Finger h2c_parameter[2] = 0x20;
2982f1d2b4d3SLarry Finger }
2983f1d2b4d3SLarry Finger
2984f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2985f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2986f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2987f1d2b4d3SLarry Finger
2988c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2989f1d2b4d3SLarry Finger "[BTCoex], FW write 0x66 = 0x%x\n",
2990f1d2b4d3SLarry Finger h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
2991f1d2b4d3SLarry Finger h2c_parameter[2]);
2992f1d2b4d3SLarry Finger
2993f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2994f1d2b4d3SLarry Finger }
2995f1d2b4d3SLarry Finger
ex_btc8723b1ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)2996753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,
2997f1d2b4d3SLarry Finger u8 type)
2998f1d2b4d3SLarry Finger {
2999dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3000f1d2b4d3SLarry Finger bool bt_hs_on = false;
3001f1d2b4d3SLarry Finger u32 wifi_link_status = 0;
3002f1d2b4d3SLarry Finger u32 num_of_wifi_link = 0;
3003fa73a1ebSPing-Ke Shih bool bt_ctrl_agg_buf_size = false, under_4way = false;
3004f1d2b4d3SLarry Finger u8 agg_buf_size = 5;
3005f1d2b4d3SLarry Finger
3006fa73a1ebSPing-Ke Shih btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3007fa73a1ebSPing-Ke Shih &under_4way);
3008fa73a1ebSPing-Ke Shih
3009f1d2b4d3SLarry Finger if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
301012e87c09SPing-Ke Shih coex_sta->bt_disabled)
3011f1d2b4d3SLarry Finger return;
3012f1d2b4d3SLarry Finger
3013fa73a1ebSPing-Ke Shih if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
3014fa73a1ebSPing-Ke Shih type == BTC_PACKET_ARP) {
3015fa73a1ebSPing-Ke Shih if (type == BTC_PACKET_ARP) {
3016c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3017fa73a1ebSPing-Ke Shih "[BTCoex], special Packet ARP notify\n");
3018fa73a1ebSPing-Ke Shih
3019fa73a1ebSPing-Ke Shih coex_dm->arp_cnt++;
3020c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3021fa73a1ebSPing-Ke Shih "[BTCoex], ARP Packet Count = %d\n",
3022fa73a1ebSPing-Ke Shih coex_dm->arp_cnt);
3023c34e42aaSPing-Ke Shih
3024c34e42aaSPing-Ke Shih if ((coex_dm->arp_cnt >= 10) && (!under_4way))
3025c34e42aaSPing-Ke Shih /* if APR PKT > 10 after connect, do not go to
3026c34e42aaSPing-Ke Shih * ActionWifiConnectedSpecificPacket(btcoexist)
3027c34e42aaSPing-Ke Shih */
3028c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = false;
3029c34e42aaSPing-Ke Shih else
3030c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = true;
3031fa73a1ebSPing-Ke Shih } else {
3032c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = true;
3033c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3034fa73a1ebSPing-Ke Shih "[BTCoex], special Packet DHCP or EAPOL notify\n");
3035fa73a1ebSPing-Ke Shih }
3036fa73a1ebSPing-Ke Shih } else {
3037c34e42aaSPing-Ke Shih coex_sta->wifi_is_high_pri_task = false;
3038c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3039fa73a1ebSPing-Ke Shih "[BTCoex], special Packet [Type = %d] notify\n",
3040fa73a1ebSPing-Ke Shih type);
3041fa73a1ebSPing-Ke Shih }
3042fa73a1ebSPing-Ke Shih
3043f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3044f1d2b4d3SLarry Finger &wifi_link_status);
3045f1d2b4d3SLarry Finger num_of_wifi_link = wifi_link_status >> 16;
3046f1d2b4d3SLarry Finger if (num_of_wifi_link >= 2) {
3047f1d2b4d3SLarry Finger halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3048f1d2b4d3SLarry Finger halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3049f1d2b4d3SLarry Finger bt_ctrl_agg_buf_size, agg_buf_size);
3050f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_multiport(btcoexist);
3051f1d2b4d3SLarry Finger return;
3052f1d2b4d3SLarry Finger }
3053f1d2b4d3SLarry Finger
3054f1d2b4d3SLarry Finger coex_sta->special_pkt_period_cnt = 0;
3055f1d2b4d3SLarry Finger
3056f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3057f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page) {
3058f1d2b4d3SLarry Finger halbtc8723b1ant_action_bt_inquiry(btcoexist);
3059f1d2b4d3SLarry Finger return;
3060f1d2b4d3SLarry Finger } else if (bt_hs_on) {
3061f1d2b4d3SLarry Finger halbtc8723b1ant_action_hs(btcoexist);
3062f1d2b4d3SLarry Finger return;
3063f1d2b4d3SLarry Finger }
3064f1d2b4d3SLarry Finger
3065f1d2b4d3SLarry Finger if (BTC_PACKET_DHCP == type ||
3066f1d2b4d3SLarry Finger BTC_PACKET_EAPOL == type) {
3067c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3068f1d2b4d3SLarry Finger "[BTCoex], special Packet(%d) notify\n", type);
3069f1d2b4d3SLarry Finger halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
3070f1d2b4d3SLarry Finger }
3071f1d2b4d3SLarry Finger }
3072f1d2b4d3SLarry Finger
ex_btc8723b1ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)3073753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,
3074f1d2b4d3SLarry Finger u8 *tmp_buf, u8 length)
3075f1d2b4d3SLarry Finger {
3076dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3077f1d2b4d3SLarry Finger u8 bt_info = 0;
3078f1d2b4d3SLarry Finger u8 i, rsp_source = 0;
3079f1d2b4d3SLarry Finger bool wifi_connected = false;
3080f1d2b4d3SLarry Finger bool bt_busy = false;
3081f1d2b4d3SLarry Finger
3082f1d2b4d3SLarry Finger coex_sta->c2h_bt_info_req_sent = false;
3083f1d2b4d3SLarry Finger
3084f1d2b4d3SLarry Finger rsp_source = tmp_buf[0] & 0xf;
3085f1d2b4d3SLarry Finger if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
3086f1d2b4d3SLarry Finger rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
3087f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[rsp_source]++;
3088f1d2b4d3SLarry Finger
3089c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3090f1d2b4d3SLarry Finger "[BTCoex], Bt info[%d], length=%d, hex data = [",
3091f1d2b4d3SLarry Finger rsp_source, length);
3092f1d2b4d3SLarry Finger for (i = 0; i < length; i++) {
3093f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3094f1d2b4d3SLarry Finger if (i == 1)
3095f1d2b4d3SLarry Finger bt_info = tmp_buf[i];
3096f1d2b4d3SLarry Finger if (i == length - 1)
3097c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3098f1d2b4d3SLarry Finger "0x%02x]\n", tmp_buf[i]);
3099f1d2b4d3SLarry Finger else
3100c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3101f1d2b4d3SLarry Finger "0x%02x, ", tmp_buf[i]);
3102f1d2b4d3SLarry Finger }
3103f1d2b4d3SLarry Finger
310453e18bcfSPing-Ke Shih /* if 0xff, it means BT is under WHCK test */
310553e18bcfSPing-Ke Shih if (bt_info == 0xff)
310653e18bcfSPing-Ke Shih coex_sta->bt_whck_test = true;
310753e18bcfSPing-Ke Shih else
310853e18bcfSPing-Ke Shih coex_sta->bt_whck_test = false;
310953e18bcfSPing-Ke Shih
31102d446a56SPing-Ke Shih if (rsp_source != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {
3111f1d2b4d3SLarry Finger coex_sta->bt_retry_cnt = /* [3:0] */
3112f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3113f1d2b4d3SLarry Finger
31147d0d2c14SPing-Ke Shih if (coex_sta->bt_retry_cnt >= 1)
31157d0d2c14SPing-Ke Shih coex_sta->pop_event_cnt++;
31167d0d2c14SPing-Ke Shih
31177d0d2c14SPing-Ke Shih if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
31187d0d2c14SPing-Ke Shih coex_sta->c2h_bt_remote_name_req = true;
31197d0d2c14SPing-Ke Shih else
31207d0d2c14SPing-Ke Shih coex_sta->c2h_bt_remote_name_req = false;
31217d0d2c14SPing-Ke Shih
3122f1d2b4d3SLarry Finger coex_sta->bt_rssi =
31237d0d2c14SPing-Ke Shih coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;
3124f1d2b4d3SLarry Finger
3125f1d2b4d3SLarry Finger coex_sta->bt_info_ext =
3126f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][4];
3127f1d2b4d3SLarry Finger
31287d0d2c14SPing-Ke Shih if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {
31297d0d2c14SPing-Ke Shih coex_sta->a2dp_bit_pool =
31307d0d2c14SPing-Ke Shih coex_sta->bt_info_c2h[rsp_source][6];
31317d0d2c14SPing-Ke Shih } else {
31327d0d2c14SPing-Ke Shih coex_sta->a2dp_bit_pool = 0;
31337d0d2c14SPing-Ke Shih }
31347d0d2c14SPing-Ke Shih
31357d0d2c14SPing-Ke Shih coex_sta->bt_tx_rx_mask =
31367d0d2c14SPing-Ke Shih (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
31377d0d2c14SPing-Ke Shih btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
31387d0d2c14SPing-Ke Shih &coex_sta->bt_tx_rx_mask);
31397d0d2c14SPing-Ke Shih
31407d0d2c14SPing-Ke Shih if (!coex_sta->bt_tx_rx_mask) {
31417d0d2c14SPing-Ke Shih /* BT into is responded by BT FW and BT RF REG
31427d0d2c14SPing-Ke Shih * 0x3C != 0x15 => Need to switch BT TRx Mask
31437d0d2c14SPing-Ke Shih */
3144c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
31457d0d2c14SPing-Ke Shih "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
31467d0d2c14SPing-Ke Shih btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31477d0d2c14SPing-Ke Shih 0x3c, 0x15);
31487d0d2c14SPing-Ke Shih
31497d0d2c14SPing-Ke Shih /* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */
31507d0d2c14SPing-Ke Shih btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31517d0d2c14SPing-Ke Shih 0x2c, 0x7c44);
31527d0d2c14SPing-Ke Shih btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31537d0d2c14SPing-Ke Shih 0x30, 0x7c44);
31547d0d2c14SPing-Ke Shih }
31557d0d2c14SPing-Ke Shih
3156f1d2b4d3SLarry Finger /* Here we need to resend some wifi info to BT
3157f1d2b4d3SLarry Finger * because bt is reset and loss of the info.
3158f1d2b4d3SLarry Finger */
3159f1d2b4d3SLarry Finger if (coex_sta->bt_info_ext & BIT1) {
3160c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3161f1d2b4d3SLarry Finger "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
3162f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3163f1d2b4d3SLarry Finger &wifi_connected);
3164f1d2b4d3SLarry Finger if (wifi_connected)
3165753c953bSYan-Hsuan Chuang ex_btc8723b1ant_media_status_notify(btcoexist,
3166f1d2b4d3SLarry Finger BTC_MEDIA_CONNECT);
3167f1d2b4d3SLarry Finger else
3168753c953bSYan-Hsuan Chuang ex_btc8723b1ant_media_status_notify(btcoexist,
3169f1d2b4d3SLarry Finger BTC_MEDIA_DISCONNECT);
3170f1d2b4d3SLarry Finger }
3171f1d2b4d3SLarry Finger
3172f1d2b4d3SLarry Finger if (coex_sta->bt_info_ext & BIT3) {
3173f1d2b4d3SLarry Finger if (!btcoexist->manual_control &&
3174f1d2b4d3SLarry Finger !btcoexist->stop_coex_dm) {
3175c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3176f1d2b4d3SLarry Finger "[BTCoex], BT ext info bit3 check, set BT NOT ignore Wlan active!!\n");
3177f1d2b4d3SLarry Finger halbtc8723b1ant_ignore_wlan_act(btcoexist,
3178f1d2b4d3SLarry Finger FORCE_EXEC,
3179f1d2b4d3SLarry Finger false);
3180f1d2b4d3SLarry Finger }
3181f1d2b4d3SLarry Finger } else {
3182f1d2b4d3SLarry Finger /* BT already NOT ignore Wlan active, do nothing here.*/
3183f1d2b4d3SLarry Finger }
3184f66509e3SLarry Finger if (!btcoexist->auto_report_1ant) {
3185f1d2b4d3SLarry Finger if (coex_sta->bt_info_ext & BIT4) {
3186f1d2b4d3SLarry Finger /* BT auto report already enabled, do nothing */
3187f1d2b4d3SLarry Finger } else {
3188f66509e3SLarry Finger halbtc8723b1ant_bt_auto_report(btcoexist,
3189f66509e3SLarry Finger FORCE_EXEC,
3190f1d2b4d3SLarry Finger true);
3191f1d2b4d3SLarry Finger }
3192f66509e3SLarry Finger }
3193f1d2b4d3SLarry Finger }
3194f1d2b4d3SLarry Finger
3195f1d2b4d3SLarry Finger /* check BIT2 first ==> check if bt is under inquiry or page scan */
3196f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
3197f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = true;
3198f1d2b4d3SLarry Finger else
3199f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = false;
3200f1d2b4d3SLarry Finger
32017d0d2c14SPing-Ke Shih coex_sta->num_of_profile = 0;
32027d0d2c14SPing-Ke Shih
3203f1d2b4d3SLarry Finger /* set link exist status */
3204f1d2b4d3SLarry Finger if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3205f1d2b4d3SLarry Finger coex_sta->bt_link_exist = false;
3206f1d2b4d3SLarry Finger coex_sta->pan_exist = false;
3207f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false;
3208f1d2b4d3SLarry Finger coex_sta->hid_exist = false;
3209f1d2b4d3SLarry Finger coex_sta->sco_exist = false;
321075717802SPing-Ke Shih
321175717802SPing-Ke Shih coex_sta->bt_hi_pri_link_exist = false;
3212c6821613SYan-Hsuan Chuang } else {
3213c6821613SYan-Hsuan Chuang /* connection exists */
3214f1d2b4d3SLarry Finger coex_sta->bt_link_exist = true;
32157d0d2c14SPing-Ke Shih if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {
3216f1d2b4d3SLarry Finger coex_sta->pan_exist = true;
32177d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32187d0d2c14SPing-Ke Shih } else {
3219f1d2b4d3SLarry Finger coex_sta->pan_exist = false;
32207d0d2c14SPing-Ke Shih }
32217d0d2c14SPing-Ke Shih if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {
3222f1d2b4d3SLarry Finger coex_sta->a2dp_exist = true;
32237d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32247d0d2c14SPing-Ke Shih } else {
3225f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false;
32267d0d2c14SPing-Ke Shih }
32277d0d2c14SPing-Ke Shih if (bt_info & BT_INFO_8723B_1ANT_B_HID) {
3228f1d2b4d3SLarry Finger coex_sta->hid_exist = true;
32297d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32307d0d2c14SPing-Ke Shih } else {
3231f1d2b4d3SLarry Finger coex_sta->hid_exist = false;
32327d0d2c14SPing-Ke Shih }
32337d0d2c14SPing-Ke Shih if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {
3234f1d2b4d3SLarry Finger coex_sta->sco_exist = true;
32357d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32367d0d2c14SPing-Ke Shih } else {
3237f1d2b4d3SLarry Finger coex_sta->sco_exist = false;
32387d0d2c14SPing-Ke Shih }
32397d0d2c14SPing-Ke Shih
32407d0d2c14SPing-Ke Shih if ((!coex_sta->hid_exist) &&
32417d0d2c14SPing-Ke Shih (!coex_sta->c2h_bt_inquiry_page) &&
32427d0d2c14SPing-Ke Shih (!coex_sta->sco_exist)) {
32437d0d2c14SPing-Ke Shih if (coex_sta->high_priority_tx +
32447d0d2c14SPing-Ke Shih coex_sta->high_priority_rx >=
32457d0d2c14SPing-Ke Shih 160) {
32467d0d2c14SPing-Ke Shih coex_sta->hid_exist = true;
32477d0d2c14SPing-Ke Shih coex_sta->wrong_profile_notification++;
32487d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32497d0d2c14SPing-Ke Shih bt_info = bt_info | 0x28;
32507d0d2c14SPing-Ke Shih }
32517d0d2c14SPing-Ke Shih }
325275717802SPing-Ke Shih
325375717802SPing-Ke Shih /* Add Hi-Pri Tx/Rx counter to avoid false detection */
325475717802SPing-Ke Shih if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
325575717802SPing-Ke Shih (coex_sta->high_priority_tx + coex_sta->high_priority_rx >=
325675717802SPing-Ke Shih 160) &&
325775717802SPing-Ke Shih (!coex_sta->c2h_bt_inquiry_page))
325875717802SPing-Ke Shih coex_sta->bt_hi_pri_link_exist = true;
325975717802SPing-Ke Shih
32607d0d2c14SPing-Ke Shih if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&
32617d0d2c14SPing-Ke Shih (coex_sta->num_of_profile == 0)) {
32627d0d2c14SPing-Ke Shih if (coex_sta->low_priority_tx +
32637d0d2c14SPing-Ke Shih coex_sta->low_priority_rx >=
32647d0d2c14SPing-Ke Shih 160) {
32657d0d2c14SPing-Ke Shih coex_sta->pan_exist = true;
32667d0d2c14SPing-Ke Shih coex_sta->num_of_profile++;
32677d0d2c14SPing-Ke Shih coex_sta->wrong_profile_notification++;
32687d0d2c14SPing-Ke Shih bt_info = bt_info | 0x88;
32697d0d2c14SPing-Ke Shih }
32707d0d2c14SPing-Ke Shih }
3271f1d2b4d3SLarry Finger }
3272f1d2b4d3SLarry Finger
3273f1d2b4d3SLarry Finger halbtc8723b1ant_update_bt_link_info(btcoexist);
3274f1d2b4d3SLarry Finger
32757d0d2c14SPing-Ke Shih /* mask profile bit for connect-ilde identification
32767d0d2c14SPing-Ke Shih * ( for CSR case: A2DP idle --> 0x41)
32777d0d2c14SPing-Ke Shih */
32787d0d2c14SPing-Ke Shih bt_info = bt_info & 0x1f;
32797d0d2c14SPing-Ke Shih
3280f1d2b4d3SLarry Finger if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3281f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3282c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3283f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT Non-Connected idle!\n");
3284f1d2b4d3SLarry Finger /* connection exists but no busy */
3285f1d2b4d3SLarry Finger } else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {
3286f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
3287c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3288f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
3289f1d2b4d3SLarry Finger } else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
3290f1d2b4d3SLarry Finger (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {
3291f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
3292c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3293f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
3294f1d2b4d3SLarry Finger } else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
3295f1d2b4d3SLarry Finger if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3296f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
3297f1d2b4d3SLarry Finger
3298f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
3299c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3300f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
3301f1d2b4d3SLarry Finger } else {
33027d0d2c14SPing-Ke Shih coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;
3303c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3304f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");
3305f1d2b4d3SLarry Finger }
3306f1d2b4d3SLarry Finger
3307f1d2b4d3SLarry Finger if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3308f1d2b4d3SLarry Finger (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3309f1d2b4d3SLarry Finger (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
3310f1d2b4d3SLarry Finger bt_busy = true;
3311f1d2b4d3SLarry Finger else
3312f1d2b4d3SLarry Finger bt_busy = false;
3313f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3314f1d2b4d3SLarry Finger
3315f1d2b4d3SLarry Finger halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3316f1d2b4d3SLarry Finger }
3317f1d2b4d3SLarry Finger
ex_btc8723b1ant_rf_status_notify(struct btc_coexist * btcoexist,u8 type)3318753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
33193ceac0a7SPing-Ke Shih {
33203ceac0a7SPing-Ke Shih struct rtl_priv *rtlpriv = btcoexist->adapter;
33213ceac0a7SPing-Ke Shih u32 u32tmp;
33223ceac0a7SPing-Ke Shih u8 u8tmpa, u8tmpb, u8tmpc;
33233ceac0a7SPing-Ke Shih
3324c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33253ceac0a7SPing-Ke Shih "[BTCoex], RF Status notify\n");
33263ceac0a7SPing-Ke Shih
33273ceac0a7SPing-Ke Shih if (type == BTC_RF_ON) {
3328c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33293ceac0a7SPing-Ke Shih "[BTCoex], RF is turned ON!!\n");
33303ceac0a7SPing-Ke Shih btcoexist->stop_coex_dm = false;
33313ceac0a7SPing-Ke Shih } else if (type == BTC_RF_OFF) {
3332c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33333ceac0a7SPing-Ke Shih "[BTCoex], RF is turned OFF!!\n");
33343ceac0a7SPing-Ke Shih
33353ceac0a7SPing-Ke Shih halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
33363ceac0a7SPing-Ke Shih 0x0, 0x0);
33373ceac0a7SPing-Ke Shih halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
33383ceac0a7SPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
33393ceac0a7SPing-Ke Shih FORCE_EXEC, false, true);
33403ceac0a7SPing-Ke Shih
33413ceac0a7SPing-Ke Shih halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
33423ceac0a7SPing-Ke Shih btcoexist->stop_coex_dm = true;
33433ceac0a7SPing-Ke Shih
33443ceac0a7SPing-Ke Shih u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
33453ceac0a7SPing-Ke Shih u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
33463ceac0a7SPing-Ke Shih u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
33473ceac0a7SPing-Ke Shih u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);
33483ceac0a7SPing-Ke Shih
3349c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33503ceac0a7SPing-Ke Shih "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",
33513ceac0a7SPing-Ke Shih u32tmp, u8tmpa, u8tmpb, u8tmpc);
33523ceac0a7SPing-Ke Shih }
33533ceac0a7SPing-Ke Shih }
33543ceac0a7SPing-Ke Shih
ex_btc8723b1ant_halt_notify(struct btc_coexist * btcoexist)3355753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_halt_notify(struct btc_coexist *btcoexist)
3356f1d2b4d3SLarry Finger {
3357dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3358dd192494SLarry Finger
3359c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
3360f1d2b4d3SLarry Finger
3361f1d2b4d3SLarry Finger btcoexist->stop_coex_dm = true;
3362f1d2b4d3SLarry Finger
336396e3baadSPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,
336496e3baadSPing-Ke Shih false, true);
3365f1d2b4d3SLarry Finger
3366f1d2b4d3SLarry Finger halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3367f1d2b4d3SLarry Finger
3368f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3369f1d2b4d3SLarry Finger 0x0, 0x0);
3370f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3371f1d2b4d3SLarry Finger
3372753c953bSYan-Hsuan Chuang ex_btc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
33738ffb5b69SPing-Ke Shih
33748ffb5b69SPing-Ke Shih btcoexist->stop_coex_dm = true;
3375f1d2b4d3SLarry Finger }
3376f1d2b4d3SLarry Finger
ex_btc8723b1ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)3377753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
3378f1d2b4d3SLarry Finger {
3379dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3380dd192494SLarry Finger
3381c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
3382f1d2b4d3SLarry Finger
3383f1d2b4d3SLarry Finger if (BTC_WIFI_PNP_SLEEP == pnp_state) {
3384c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3385f1d2b4d3SLarry Finger "[BTCoex], Pnp notify to SLEEP\n");
338696e3baadSPing-Ke Shih halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
338796e3baadSPing-Ke Shih FORCE_EXEC, false, true);
3388f1d2b4d3SLarry Finger halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3389f1d2b4d3SLarry Finger 0x0, 0x0);
3390f1d2b4d3SLarry Finger halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3391f1d2b4d3SLarry Finger halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
33928ffb5b69SPing-Ke Shih
33938ffb5b69SPing-Ke Shih /* Driver do not leave IPS/LPS when driver is going to sleep, so
33948ffb5b69SPing-Ke Shih * BTCoexistence think wifi is still under IPS/LPS
33958ffb5b69SPing-Ke Shih *
33968ffb5b69SPing-Ke Shih * BT should clear UnderIPS/UnderLPS state to avoid mismatch
33978ffb5b69SPing-Ke Shih * state after wakeup.
33988ffb5b69SPing-Ke Shih */
33998ffb5b69SPing-Ke Shih coex_sta->under_ips = false;
34008ffb5b69SPing-Ke Shih coex_sta->under_lps = false;
34018ffb5b69SPing-Ke Shih btcoexist->stop_coex_dm = true;
3402f1d2b4d3SLarry Finger } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
3403c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3404f1d2b4d3SLarry Finger "[BTCoex], Pnp notify to WAKE UP\n");
3405f1d2b4d3SLarry Finger btcoexist->stop_coex_dm = false;
34068ffb5b69SPing-Ke Shih halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3407f1d2b4d3SLarry Finger halbtc8723b1ant_init_coex_dm(btcoexist);
3408f1d2b4d3SLarry Finger halbtc8723b1ant_query_bt_info(btcoexist);
3409f1d2b4d3SLarry Finger }
3410f1d2b4d3SLarry Finger }
3411f1d2b4d3SLarry Finger
ex_btc8723b1ant_coex_dm_reset(struct btc_coexist * btcoexist)3412753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_coex_dm_reset(struct btc_coexist *btcoexist)
3413f1d2b4d3SLarry Finger {
3414dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3415dd192494SLarry Finger
3416c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3417f1d2b4d3SLarry Finger "[BTCoex], *****************Coex DM Reset****************\n");
3418f1d2b4d3SLarry Finger
34198ffb5b69SPing-Ke Shih halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3420f1d2b4d3SLarry Finger halbtc8723b1ant_init_coex_dm(btcoexist);
3421f1d2b4d3SLarry Finger }
3422f1d2b4d3SLarry Finger
ex_btc8723b1ant_periodical(struct btc_coexist * btcoexist)3423753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_periodical(struct btc_coexist *btcoexist)
3424f1d2b4d3SLarry Finger {
3425dd192494SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
342637a5be0cSPing-Ke Shih struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3427f1d2b4d3SLarry Finger
3428c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3429f1d2b4d3SLarry Finger "[BTCoex], ==========================Periodical===========================\n");
3430f1d2b4d3SLarry Finger
3431f66509e3SLarry Finger if (!btcoexist->auto_report_1ant) {
3432f1d2b4d3SLarry Finger halbtc8723b1ant_query_bt_info(btcoexist);
3433f1d2b4d3SLarry Finger halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
3434f66509e3SLarry Finger } else {
343537a5be0cSPing-Ke Shih halbtc8723b1ant_monitor_bt_ctr(btcoexist);
343637a5be0cSPing-Ke Shih halbtc8723b1ant_monitor_wifi_ctr(btcoexist);
343737a5be0cSPing-Ke Shih
343837a5be0cSPing-Ke Shih if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&
343937a5be0cSPing-Ke Shih bt_link_info->hid_exist)
344037a5be0cSPing-Ke Shih bt_link_info->hid_exist = false;
344137a5be0cSPing-Ke Shih
3442f1d2b4d3SLarry Finger if (btc8723b1ant_is_wifi_status_changed(btcoexist) ||
3443f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust) {
3444f1d2b4d3SLarry Finger halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3445f1d2b4d3SLarry Finger }
3446f1d2b4d3SLarry Finger coex_sta->special_pkt_period_cnt++;
3447f66509e3SLarry Finger }
3448f1d2b4d3SLarry Finger }
3449