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