1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright(c) 2012 Realtek Corporation.*/
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun /**************************************************************
5*4882a593Smuzhiyun * Description:
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * This file is for RTL8821A Co-exist mechanism
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * History
10*4882a593Smuzhiyun * 2012/11/15 Cosa first check in.
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun **************************************************************/
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /**************************************************************
15*4882a593Smuzhiyun * include files
16*4882a593Smuzhiyun **************************************************************/
17*4882a593Smuzhiyun #include "halbt_precomp.h"
18*4882a593Smuzhiyun /**************************************************************
19*4882a593Smuzhiyun * Global variables, these are static variables
20*4882a593Smuzhiyun **************************************************************/
21*4882a593Smuzhiyun static struct coex_dm_8821a_1ant glcoex_dm_8821a_1ant;
22*4882a593Smuzhiyun static struct coex_dm_8821a_1ant *coex_dm = &glcoex_dm_8821a_1ant;
23*4882a593Smuzhiyun static struct coex_sta_8821a_1ant glcoex_sta_8821a_1ant;
24*4882a593Smuzhiyun static struct coex_sta_8821a_1ant *coex_sta = &glcoex_sta_8821a_1ant;
25*4882a593Smuzhiyun static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
26*4882a593Smuzhiyun u8 wifi_status);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun static const char *const glbt_info_src_8821a_1ant[] = {
29*4882a593Smuzhiyun "BT Info[wifi fw]",
30*4882a593Smuzhiyun "BT Info[bt rsp]",
31*4882a593Smuzhiyun "BT Info[bt auto report]",
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun static u32 glcoex_ver_date_8821a_1ant = 20130816;
35*4882a593Smuzhiyun static u32 glcoex_ver_8821a_1ant = 0x41;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /**************************************************************
38*4882a593Smuzhiyun * local function proto type if needed
39*4882a593Smuzhiyun *
40*4882a593Smuzhiyun * local function start with btc8821a1ant_
41*4882a593Smuzhiyun **************************************************************/
btc8821a1ant_bt_rssi_state(struct btc_coexist * btcoexist,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)42*4882a593Smuzhiyun static u8 btc8821a1ant_bt_rssi_state(struct btc_coexist *btcoexist,
43*4882a593Smuzhiyun u8 level_num, u8 rssi_thresh,
44*4882a593Smuzhiyun u8 rssi_thresh1)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
47*4882a593Smuzhiyun long bt_rssi = 0;
48*4882a593Smuzhiyun u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun bt_rssi = coex_sta->bt_rssi;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun if (level_num == 2) {
53*4882a593Smuzhiyun if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
54*4882a593Smuzhiyun (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
55*4882a593Smuzhiyun if (bt_rssi >= (rssi_thresh +
56*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
57*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_HIGH;
58*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
59*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to High\n");
60*4882a593Smuzhiyun } else {
61*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
62*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
63*4882a593Smuzhiyun "[BTCoex], BT Rssi state stay at Low\n");
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun } else {
66*4882a593Smuzhiyun if (bt_rssi < rssi_thresh) {
67*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_LOW;
68*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
69*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to Low\n");
70*4882a593Smuzhiyun } else {
71*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
72*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
73*4882a593Smuzhiyun "[BTCoex], BT Rssi state stay at High\n");
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun } else if (level_num == 3) {
77*4882a593Smuzhiyun if (rssi_thresh > rssi_thresh1) {
78*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
79*4882a593Smuzhiyun "[BTCoex], BT Rssi thresh error!!\n");
80*4882a593Smuzhiyun return coex_sta->pre_bt_rssi_state;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
84*4882a593Smuzhiyun (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
85*4882a593Smuzhiyun if (bt_rssi >= (rssi_thresh +
86*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
87*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
88*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
89*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to Medium\n");
90*4882a593Smuzhiyun } else {
91*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
92*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
93*4882a593Smuzhiyun "[BTCoex], BT Rssi state stay at Low\n");
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun } else if ((coex_sta->pre_bt_rssi_state ==
96*4882a593Smuzhiyun BTC_RSSI_STATE_MEDIUM) ||
97*4882a593Smuzhiyun (coex_sta->pre_bt_rssi_state ==
98*4882a593Smuzhiyun BTC_RSSI_STATE_STAY_MEDIUM)) {
99*4882a593Smuzhiyun if (bt_rssi >= (rssi_thresh1 +
100*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
101*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_HIGH;
102*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
103*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to High\n");
104*4882a593Smuzhiyun } else if (bt_rssi < rssi_thresh) {
105*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_LOW;
106*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
107*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to Low\n");
108*4882a593Smuzhiyun } else {
109*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
110*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
111*4882a593Smuzhiyun "[BTCoex], BT Rssi state stay at Medium\n");
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun } else {
114*4882a593Smuzhiyun if (bt_rssi < rssi_thresh1) {
115*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
116*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
117*4882a593Smuzhiyun "[BTCoex], BT Rssi state switch to Medium\n");
118*4882a593Smuzhiyun } else {
119*4882a593Smuzhiyun bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
120*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
121*4882a593Smuzhiyun "[BTCoex], BT Rssi state stay at High\n");
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun coex_sta->pre_bt_rssi_state = bt_rssi_state;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun return bt_rssi_state;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
btc8821a1ant_wifi_rssi_state(struct btc_coexist * btcoexist,u8 index,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)130*4882a593Smuzhiyun static u8 btc8821a1ant_wifi_rssi_state(struct btc_coexist *btcoexist,
131*4882a593Smuzhiyun u8 index, u8 level_num, u8 rssi_thresh,
132*4882a593Smuzhiyun u8 rssi_thresh1)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
135*4882a593Smuzhiyun long wifi_rssi = 0;
136*4882a593Smuzhiyun u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun if (level_num == 2) {
141*4882a593Smuzhiyun if ((coex_sta->pre_wifi_rssi_state[index] ==
142*4882a593Smuzhiyun BTC_RSSI_STATE_LOW) ||
143*4882a593Smuzhiyun (coex_sta->pre_wifi_rssi_state[index] ==
144*4882a593Smuzhiyun BTC_RSSI_STATE_STAY_LOW)) {
145*4882a593Smuzhiyun if (wifi_rssi >= (rssi_thresh +
146*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
147*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_HIGH;
148*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
149*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to High\n");
150*4882a593Smuzhiyun } else {
151*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
152*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
153*4882a593Smuzhiyun "[BTCoex], wifi RSSI state stay at Low\n");
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun } else {
156*4882a593Smuzhiyun if (wifi_rssi < rssi_thresh) {
157*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_LOW;
158*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
159*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to Low\n");
160*4882a593Smuzhiyun } else {
161*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
162*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
163*4882a593Smuzhiyun "[BTCoex], wifi RSSI state stay at High\n");
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun } else if (level_num == 3) {
167*4882a593Smuzhiyun if (rssi_thresh > rssi_thresh1) {
168*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
169*4882a593Smuzhiyun "[BTCoex], wifi RSSI thresh error!!\n");
170*4882a593Smuzhiyun return coex_sta->pre_wifi_rssi_state[index];
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun if ((coex_sta->pre_wifi_rssi_state[index] ==
174*4882a593Smuzhiyun BTC_RSSI_STATE_LOW) ||
175*4882a593Smuzhiyun (coex_sta->pre_wifi_rssi_state[index] ==
176*4882a593Smuzhiyun BTC_RSSI_STATE_STAY_LOW)) {
177*4882a593Smuzhiyun if (wifi_rssi >= (rssi_thresh +
178*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
179*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
180*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
181*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to Medium\n");
182*4882a593Smuzhiyun } else {
183*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
184*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
185*4882a593Smuzhiyun "[BTCoex], wifi RSSI state stay at Low\n");
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun } else if ((coex_sta->pre_wifi_rssi_state[index] ==
188*4882a593Smuzhiyun BTC_RSSI_STATE_MEDIUM) ||
189*4882a593Smuzhiyun (coex_sta->pre_wifi_rssi_state[index] ==
190*4882a593Smuzhiyun BTC_RSSI_STATE_STAY_MEDIUM)) {
191*4882a593Smuzhiyun if (wifi_rssi >= (rssi_thresh1 +
192*4882a593Smuzhiyun BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
193*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_HIGH;
194*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
195*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to High\n");
196*4882a593Smuzhiyun } else if (wifi_rssi < rssi_thresh) {
197*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_LOW;
198*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
199*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to Low\n");
200*4882a593Smuzhiyun } else {
201*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
202*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
203*4882a593Smuzhiyun "[BTCoex], wifi RSSI state stay at Medium\n");
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun } else {
206*4882a593Smuzhiyun if (wifi_rssi < rssi_thresh1) {
207*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
208*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
209*4882a593Smuzhiyun "[BTCoex], wifi RSSI state switch to Medium\n");
210*4882a593Smuzhiyun } else {
211*4882a593Smuzhiyun wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
212*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
213*4882a593Smuzhiyun "[BTCoex], wifi RSSI state stay at High\n");
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun return wifi_rssi_state;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
btc8821a1ant_update_ra_mask(struct btc_coexist * btcoexist,bool force_exec,u32 dis_rate_mask)222*4882a593Smuzhiyun static void btc8821a1ant_update_ra_mask(struct btc_coexist *btcoexist,
223*4882a593Smuzhiyun bool force_exec, u32 dis_rate_mask)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun coex_dm->cur_ra_mask = dis_rate_mask;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun if (force_exec ||
228*4882a593Smuzhiyun (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) {
229*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
230*4882a593Smuzhiyun &coex_dm->cur_ra_mask);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
btc8821a1ant_auto_rate_fb_retry(struct btc_coexist * btcoexist,bool force_exec,u8 type)235*4882a593Smuzhiyun static void btc8821a1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
236*4882a593Smuzhiyun bool force_exec, u8 type)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun bool wifi_under_b_mode = false;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun coex_dm->cur_arfr_type = type;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun if (force_exec ||
243*4882a593Smuzhiyun (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
244*4882a593Smuzhiyun switch (coex_dm->cur_arfr_type) {
245*4882a593Smuzhiyun case 0: /* normal mode */
246*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x430,
247*4882a593Smuzhiyun coex_dm->backup_arfr_cnt1);
248*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x434,
249*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2);
250*4882a593Smuzhiyun break;
251*4882a593Smuzhiyun case 1:
252*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
253*4882a593Smuzhiyun BTC_GET_BL_WIFI_UNDER_B_MODE,
254*4882a593Smuzhiyun &wifi_under_b_mode);
255*4882a593Smuzhiyun if (wifi_under_b_mode) {
256*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x430,
257*4882a593Smuzhiyun 0x0);
258*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x434,
259*4882a593Smuzhiyun 0x01010101);
260*4882a593Smuzhiyun } else {
261*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x430,
262*4882a593Smuzhiyun 0x0);
263*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x434,
264*4882a593Smuzhiyun 0x04030201);
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun break;
267*4882a593Smuzhiyun default:
268*4882a593Smuzhiyun break;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
btc8821a1ant_retry_limit(struct btc_coexist * btcoexist,bool force_exec,u8 type)275*4882a593Smuzhiyun static void btc8821a1ant_retry_limit(struct btc_coexist *btcoexist,
276*4882a593Smuzhiyun bool force_exec, u8 type)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun coex_dm->cur_retry_limit_type = type;
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun if (force_exec ||
281*4882a593Smuzhiyun (coex_dm->pre_retry_limit_type != coex_dm->cur_retry_limit_type)) {
282*4882a593Smuzhiyun switch (coex_dm->cur_retry_limit_type) {
283*4882a593Smuzhiyun case 0: /* normal mode */
284*4882a593Smuzhiyun btcoexist->btc_write_2byte(btcoexist, 0x42a,
285*4882a593Smuzhiyun coex_dm->backup_retry_limit);
286*4882a593Smuzhiyun break;
287*4882a593Smuzhiyun case 1: /* retry limit = 8 */
288*4882a593Smuzhiyun btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
289*4882a593Smuzhiyun break;
290*4882a593Smuzhiyun default:
291*4882a593Smuzhiyun break;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
btc8821a1ant_ampdu_max_time(struct btc_coexist * btcoexist,bool force_exec,u8 type)297*4882a593Smuzhiyun static void btc8821a1ant_ampdu_max_time(struct btc_coexist *btcoexist,
298*4882a593Smuzhiyun bool force_exec, u8 type)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun coex_dm->cur_ampdu_time_type = type;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (force_exec ||
303*4882a593Smuzhiyun (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
304*4882a593Smuzhiyun switch (coex_dm->cur_ampdu_time_type) {
305*4882a593Smuzhiyun case 0: /* normal mode */
306*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x456,
307*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time);
308*4882a593Smuzhiyun break;
309*4882a593Smuzhiyun case 1: /* AMPDU time = 0x38 * 32us */
310*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
311*4882a593Smuzhiyun break;
312*4882a593Smuzhiyun default:
313*4882a593Smuzhiyun break;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
btc8821a1ant_limited_tx(struct btc_coexist * btcoexist,bool force_exec,u8 ra_mask_type,u8 arfr_type,u8 retry_limit_type,u8 ampdu_time_type)320*4882a593Smuzhiyun static void btc8821a1ant_limited_tx(struct btc_coexist *btcoexist,
321*4882a593Smuzhiyun bool force_exec, u8 ra_mask_type,
322*4882a593Smuzhiyun u8 arfr_type, u8 retry_limit_type,
323*4882a593Smuzhiyun u8 ampdu_time_type)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun switch (ra_mask_type) {
326*4882a593Smuzhiyun case 0: /* normal mode */
327*4882a593Smuzhiyun btc8821a1ant_update_ra_mask(btcoexist, force_exec, 0x0);
328*4882a593Smuzhiyun break;
329*4882a593Smuzhiyun case 1: /* disable cck 1/2 */
330*4882a593Smuzhiyun btc8821a1ant_update_ra_mask(btcoexist, force_exec,
331*4882a593Smuzhiyun 0x00000003);
332*4882a593Smuzhiyun break;
333*4882a593Smuzhiyun case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
334*4882a593Smuzhiyun btc8821a1ant_update_ra_mask(btcoexist, force_exec,
335*4882a593Smuzhiyun 0x0001f1f7);
336*4882a593Smuzhiyun break;
337*4882a593Smuzhiyun default:
338*4882a593Smuzhiyun break;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun btc8821a1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
342*4882a593Smuzhiyun btc8821a1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
343*4882a593Smuzhiyun btc8821a1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
btc8821a1ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)346*4882a593Smuzhiyun static void btc8821a1ant_limited_rx(struct btc_coexist *btcoexist,
347*4882a593Smuzhiyun bool force_exec, bool rej_ap_agg_pkt,
348*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size, u8 agg_buf_size)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun bool reject_rx_agg = rej_ap_agg_pkt;
351*4882a593Smuzhiyun bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
352*4882a593Smuzhiyun u8 rx_agg_size = agg_buf_size;
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun /* Rx Aggregation related setting */
355*4882a593Smuzhiyun btcoexist->btc_set(btcoexist,
356*4882a593Smuzhiyun BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);
357*4882a593Smuzhiyun /* decide BT control aggregation buf size or not */
358*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
359*4882a593Smuzhiyun &bt_ctrl_rx_agg_size);
360*4882a593Smuzhiyun /* aggregation buf size, only work when BT control Rx agg size */
361*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
362*4882a593Smuzhiyun /* real update aggregation setting */
363*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
btc8821a1ant_monitor_bt_ctr(struct btc_coexist * btcoexist)366*4882a593Smuzhiyun static void btc8821a1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun u32 reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;
369*4882a593Smuzhiyun u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun reg_hp_tx_rx = 0x770;
372*4882a593Smuzhiyun reg_lp_tx_rx = 0x774;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);
375*4882a593Smuzhiyun reg_hp_tx = u4_tmp & MASKLWORD;
376*4882a593Smuzhiyun reg_hp_rx = (u4_tmp & MASKHWORD) >> 16;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);
379*4882a593Smuzhiyun reg_lp_tx = u4_tmp & MASKLWORD;
380*4882a593Smuzhiyun reg_lp_rx = (u4_tmp & MASKHWORD) >> 16;
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun coex_sta->high_priority_tx = reg_hp_tx;
383*4882a593Smuzhiyun coex_sta->high_priority_rx = reg_hp_rx;
384*4882a593Smuzhiyun coex_sta->low_priority_tx = reg_lp_tx;
385*4882a593Smuzhiyun coex_sta->low_priority_rx = reg_lp_rx;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun /* reset counter */
388*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun
btc8821a1ant_query_bt_info(struct btc_coexist * btcoexist)391*4882a593Smuzhiyun static void btc8821a1ant_query_bt_info(struct btc_coexist *btcoexist)
392*4882a593Smuzhiyun {
393*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
394*4882a593Smuzhiyun u8 h2c_parameter[1] = {0};
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun coex_sta->c2h_bt_info_req_sent = true;
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun h2c_parameter[0] |= BIT0; /* trigger */
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
401*4882a593Smuzhiyun "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
402*4882a593Smuzhiyun h2c_parameter[0]);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun
btc8821a1ant_update_bt_link_info(struct btc_coexist * btcoexist)407*4882a593Smuzhiyun static void btc8821a1ant_update_bt_link_info(struct btc_coexist *btcoexist)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
410*4882a593Smuzhiyun bool bt_hs_on = false;
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
415*4882a593Smuzhiyun bt_link_info->sco_exist = coex_sta->sco_exist;
416*4882a593Smuzhiyun bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
417*4882a593Smuzhiyun bt_link_info->pan_exist = coex_sta->pan_exist;
418*4882a593Smuzhiyun bt_link_info->hid_exist = coex_sta->hid_exist;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun /* work around for HS mode */
421*4882a593Smuzhiyun if (bt_hs_on) {
422*4882a593Smuzhiyun bt_link_info->pan_exist = true;
423*4882a593Smuzhiyun bt_link_info->bt_link_exist = true;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun /* check if Sco only */
427*4882a593Smuzhiyun if (bt_link_info->sco_exist &&
428*4882a593Smuzhiyun !bt_link_info->a2dp_exist &&
429*4882a593Smuzhiyun !bt_link_info->pan_exist &&
430*4882a593Smuzhiyun !bt_link_info->hid_exist)
431*4882a593Smuzhiyun bt_link_info->sco_only = true;
432*4882a593Smuzhiyun else
433*4882a593Smuzhiyun bt_link_info->sco_only = false;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun /* check if A2dp only */
436*4882a593Smuzhiyun if (!bt_link_info->sco_exist &&
437*4882a593Smuzhiyun bt_link_info->a2dp_exist &&
438*4882a593Smuzhiyun !bt_link_info->pan_exist &&
439*4882a593Smuzhiyun !bt_link_info->hid_exist)
440*4882a593Smuzhiyun bt_link_info->a2dp_only = true;
441*4882a593Smuzhiyun else
442*4882a593Smuzhiyun bt_link_info->a2dp_only = false;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun /* check if Pan only */
445*4882a593Smuzhiyun if (!bt_link_info->sco_exist &&
446*4882a593Smuzhiyun !bt_link_info->a2dp_exist &&
447*4882a593Smuzhiyun bt_link_info->pan_exist &&
448*4882a593Smuzhiyun !bt_link_info->hid_exist)
449*4882a593Smuzhiyun bt_link_info->pan_only = true;
450*4882a593Smuzhiyun else
451*4882a593Smuzhiyun bt_link_info->pan_only = false;
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun /* check if Hid only */
454*4882a593Smuzhiyun if (!bt_link_info->sco_exist &&
455*4882a593Smuzhiyun !bt_link_info->a2dp_exist &&
456*4882a593Smuzhiyun !bt_link_info->pan_exist &&
457*4882a593Smuzhiyun bt_link_info->hid_exist)
458*4882a593Smuzhiyun bt_link_info->hid_only = true;
459*4882a593Smuzhiyun else
460*4882a593Smuzhiyun bt_link_info->hid_only = false;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
btc8821a1ant_action_algorithm(struct btc_coexist * btcoexist)463*4882a593Smuzhiyun static u8 btc8821a1ant_action_algorithm(struct btc_coexist *btcoexist)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
466*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
467*4882a593Smuzhiyun bool bt_hs_on = false;
468*4882a593Smuzhiyun u8 algorithm = BT_8821A_1ANT_COEX_ALGO_UNDEFINED;
469*4882a593Smuzhiyun u8 num_of_diff_profile = 0;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun if (!bt_link_info->bt_link_exist) {
474*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
475*4882a593Smuzhiyun "[BTCoex], No BT link exists!!!\n");
476*4882a593Smuzhiyun return algorithm;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun if (bt_link_info->sco_exist)
480*4882a593Smuzhiyun num_of_diff_profile++;
481*4882a593Smuzhiyun if (bt_link_info->hid_exist)
482*4882a593Smuzhiyun num_of_diff_profile++;
483*4882a593Smuzhiyun if (bt_link_info->pan_exist)
484*4882a593Smuzhiyun num_of_diff_profile++;
485*4882a593Smuzhiyun if (bt_link_info->a2dp_exist)
486*4882a593Smuzhiyun num_of_diff_profile++;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun if (num_of_diff_profile == 1) {
489*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
490*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
491*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO only\n");
492*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
493*4882a593Smuzhiyun } else {
494*4882a593Smuzhiyun if (bt_link_info->hid_exist) {
495*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
496*4882a593Smuzhiyun "[BTCoex], BT Profile = HID only\n");
497*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
498*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist) {
499*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
500*4882a593Smuzhiyun "[BTCoex], BT Profile = A2DP only\n");
501*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;
502*4882a593Smuzhiyun } else if (bt_link_info->pan_exist) {
503*4882a593Smuzhiyun if (bt_hs_on) {
504*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
505*4882a593Smuzhiyun DBG_LOUD,
506*4882a593Smuzhiyun "[BTCoex], BT Profile = PAN(HS) only\n");
507*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;
508*4882a593Smuzhiyun } else {
509*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
510*4882a593Smuzhiyun DBG_LOUD,
511*4882a593Smuzhiyun "[BTCoex], BT Profile = PAN(EDR) only\n");
512*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun } else if (num_of_diff_profile == 2) {
517*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
518*4882a593Smuzhiyun if (bt_link_info->hid_exist) {
519*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
520*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + HID\n");
521*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
522*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist) {
523*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
524*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
525*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
526*4882a593Smuzhiyun } else if (bt_link_info->pan_exist) {
527*4882a593Smuzhiyun if (bt_hs_on) {
528*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
529*4882a593Smuzhiyun DBG_LOUD,
530*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + PAN(HS)\n");
531*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
532*4882a593Smuzhiyun } else {
533*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
534*4882a593Smuzhiyun DBG_LOUD,
535*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + PAN(EDR)\n");
536*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun } else {
540*4882a593Smuzhiyun if (bt_link_info->hid_exist &&
541*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
542*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
543*4882a593Smuzhiyun "[BTCoex], BT Profile = HID + A2DP\n");
544*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
545*4882a593Smuzhiyun } else if (bt_link_info->hid_exist &&
546*4882a593Smuzhiyun bt_link_info->pan_exist) {
547*4882a593Smuzhiyun if (bt_hs_on) {
548*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
549*4882a593Smuzhiyun DBG_LOUD,
550*4882a593Smuzhiyun "[BTCoex], BT Profile = HID + PAN(HS)\n");
551*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
552*4882a593Smuzhiyun } else {
553*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
554*4882a593Smuzhiyun DBG_LOUD,
555*4882a593Smuzhiyun "[BTCoex], BT Profile = HID + PAN(EDR)\n");
556*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun } else if (bt_link_info->pan_exist &&
559*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
560*4882a593Smuzhiyun if (bt_hs_on) {
561*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
562*4882a593Smuzhiyun DBG_LOUD,
563*4882a593Smuzhiyun "[BTCoex], BT Profile = A2DP + PAN(HS)\n");
564*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;
565*4882a593Smuzhiyun } else {
566*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
567*4882a593Smuzhiyun DBG_LOUD,
568*4882a593Smuzhiyun "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
569*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun } else if (num_of_diff_profile == 3) {
574*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
575*4882a593Smuzhiyun if (bt_link_info->hid_exist &&
576*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
577*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
578*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
579*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
580*4882a593Smuzhiyun } else if (bt_link_info->hid_exist &&
581*4882a593Smuzhiyun bt_link_info->pan_exist) {
582*4882a593Smuzhiyun if (bt_hs_on) {
583*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
584*4882a593Smuzhiyun DBG_LOUD,
585*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
586*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
587*4882a593Smuzhiyun } else {
588*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
589*4882a593Smuzhiyun DBG_LOUD,
590*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
591*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun } else if (bt_link_info->pan_exist &&
594*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
595*4882a593Smuzhiyun if (bt_hs_on) {
596*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
597*4882a593Smuzhiyun DBG_LOUD,
598*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
599*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
600*4882a593Smuzhiyun } else {
601*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
602*4882a593Smuzhiyun DBG_LOUD,
603*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
604*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun } else {
608*4882a593Smuzhiyun if (bt_link_info->hid_exist &&
609*4882a593Smuzhiyun bt_link_info->pan_exist &&
610*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
611*4882a593Smuzhiyun if (bt_hs_on) {
612*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
613*4882a593Smuzhiyun DBG_LOUD,
614*4882a593Smuzhiyun "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
615*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
616*4882a593Smuzhiyun } else {
617*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
618*4882a593Smuzhiyun DBG_LOUD,
619*4882a593Smuzhiyun "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
620*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun } else if (num_of_diff_profile >= 3) {
625*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
626*4882a593Smuzhiyun if (bt_link_info->hid_exist &&
627*4882a593Smuzhiyun bt_link_info->pan_exist &&
628*4882a593Smuzhiyun bt_link_info->a2dp_exist) {
629*4882a593Smuzhiyun if (bt_hs_on) {
630*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
631*4882a593Smuzhiyun DBG_LOUD,
632*4882a593Smuzhiyun "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun } else {
635*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST,
636*4882a593Smuzhiyun DBG_LOUD,
637*4882a593Smuzhiyun "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
638*4882a593Smuzhiyun algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun return algorithm;
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun
btc8821a1ant_set_sw_penalty_tx_rate(struct btc_coexist * btcoexist,bool low_penalty_ra)646*4882a593Smuzhiyun static void btc8821a1ant_set_sw_penalty_tx_rate(struct btc_coexist *btcoexist,
647*4882a593Smuzhiyun bool low_penalty_ra)
648*4882a593Smuzhiyun {
649*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
650*4882a593Smuzhiyun u8 h2c_parameter[6] = {0};
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty*/
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun if (low_penalty_ra) {
655*4882a593Smuzhiyun h2c_parameter[1] |= BIT0;
656*4882a593Smuzhiyun /* normal rate except MCS7/6/5, OFDM54/48/36 */
657*4882a593Smuzhiyun h2c_parameter[2] = 0x00;
658*4882a593Smuzhiyun h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
659*4882a593Smuzhiyun h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
660*4882a593Smuzhiyun h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
661*4882a593Smuzhiyun }
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
664*4882a593Smuzhiyun "[BTCoex], set WiFi Low-Penalty Retry: %s",
665*4882a593Smuzhiyun (low_penalty_ra ? "ON!!" : "OFF!!"));
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun
btc8821a1ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)670*4882a593Smuzhiyun static void btc8821a1ant_low_penalty_ra(struct btc_coexist *btcoexist,
671*4882a593Smuzhiyun bool force_exec, bool low_penalty_ra)
672*4882a593Smuzhiyun {
673*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra = low_penalty_ra;
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun if (!force_exec) {
676*4882a593Smuzhiyun if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
677*4882a593Smuzhiyun return;
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun btc8821a1ant_set_sw_penalty_tx_rate(btcoexist,
680*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra);
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun
btc8821a1ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)685*4882a593Smuzhiyun static void btc8821a1ant_set_coex_table(struct btc_coexist *btcoexist,
686*4882a593Smuzhiyun u32 val0x6c0, u32 val0x6c4,
687*4882a593Smuzhiyun u32 val0x6c8, u8 val0x6cc)
688*4882a593Smuzhiyun {
689*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
692*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
693*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
696*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
697*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
700*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
701*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
704*4882a593Smuzhiyun "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
705*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun
btc8821a1ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)708*4882a593Smuzhiyun static void btc8821a1ant_coex_table(struct btc_coexist *btcoexist,
709*4882a593Smuzhiyun bool force_exec, u32 val0x6c0, u32 val0x6c4,
710*4882a593Smuzhiyun u32 val0x6c8, u8 val0x6cc)
711*4882a593Smuzhiyun {
712*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
715*4882a593Smuzhiyun "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
716*4882a593Smuzhiyun (force_exec ? "force to" : ""), val0x6c0, val0x6c4,
717*4882a593Smuzhiyun val0x6c8, val0x6cc);
718*4882a593Smuzhiyun coex_dm->cur_val_0x6c0 = val0x6c0;
719*4882a593Smuzhiyun coex_dm->cur_val_0x6c4 = val0x6c4;
720*4882a593Smuzhiyun coex_dm->cur_val_0x6c8 = val0x6c8;
721*4882a593Smuzhiyun coex_dm->cur_val_0x6cc = val0x6cc;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun if (!force_exec) {
724*4882a593Smuzhiyun if ((coex_dm->pre_val_0x6c0 == coex_dm->cur_val_0x6c0) &&
725*4882a593Smuzhiyun (coex_dm->pre_val_0x6c4 == coex_dm->cur_val_0x6c4) &&
726*4882a593Smuzhiyun (coex_dm->pre_val_0x6c8 == coex_dm->cur_val_0x6c8) &&
727*4882a593Smuzhiyun (coex_dm->pre_val_0x6cc == coex_dm->cur_val_0x6cc))
728*4882a593Smuzhiyun return;
729*4882a593Smuzhiyun }
730*4882a593Smuzhiyun btc8821a1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
731*4882a593Smuzhiyun val0x6c8, val0x6cc);
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun coex_dm->pre_val_0x6c0 = coex_dm->cur_val_0x6c0;
734*4882a593Smuzhiyun coex_dm->pre_val_0x6c4 = coex_dm->cur_val_0x6c4;
735*4882a593Smuzhiyun coex_dm->pre_val_0x6c8 = coex_dm->cur_val_0x6c8;
736*4882a593Smuzhiyun coex_dm->pre_val_0x6cc = coex_dm->cur_val_0x6cc;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
btc8821a1ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)739*4882a593Smuzhiyun static void btc8821a1ant_coex_table_with_type(struct btc_coexist *btcoexist,
740*4882a593Smuzhiyun bool force_exec, u8 type)
741*4882a593Smuzhiyun {
742*4882a593Smuzhiyun switch (type) {
743*4882a593Smuzhiyun case 0:
744*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
745*4882a593Smuzhiyun 0x55555555, 0xffffff, 0x3);
746*4882a593Smuzhiyun break;
747*4882a593Smuzhiyun case 1:
748*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
749*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
750*4882a593Smuzhiyun break;
751*4882a593Smuzhiyun case 2:
752*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
753*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
754*4882a593Smuzhiyun break;
755*4882a593Smuzhiyun case 3:
756*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
757*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
758*4882a593Smuzhiyun break;
759*4882a593Smuzhiyun case 4:
760*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
761*4882a593Smuzhiyun 0x5a5a5a5a, 0xffffff, 0x3);
762*4882a593Smuzhiyun break;
763*4882a593Smuzhiyun case 5:
764*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
765*4882a593Smuzhiyun 0xaaaa5a5a, 0xffffff, 0x3);
766*4882a593Smuzhiyun break;
767*4882a593Smuzhiyun case 6:
768*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,
769*4882a593Smuzhiyun 0xaaaa5a5a, 0xffffff, 0x3);
770*4882a593Smuzhiyun break;
771*4882a593Smuzhiyun case 7:
772*4882a593Smuzhiyun btc8821a1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
773*4882a593Smuzhiyun 0xaaaaaaaa, 0xffffff, 0x3);
774*4882a593Smuzhiyun break;
775*4882a593Smuzhiyun default:
776*4882a593Smuzhiyun break;
777*4882a593Smuzhiyun }
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun
btc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)780*4882a593Smuzhiyun static void btc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
781*4882a593Smuzhiyun bool enable)
782*4882a593Smuzhiyun {
783*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
784*4882a593Smuzhiyun u8 h2c_parameter[1] = {0};
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun if (enable)
787*4882a593Smuzhiyun h2c_parameter[0] |= BIT0; /* function enable */
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
790*4882a593Smuzhiyun "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
791*4882a593Smuzhiyun h2c_parameter[0]);
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun
btc8821a1ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)796*4882a593Smuzhiyun static void btc8821a1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
797*4882a593Smuzhiyun bool force_exec, bool enable)
798*4882a593Smuzhiyun {
799*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
802*4882a593Smuzhiyun "[BTCoex], %s turn Ignore WlanAct %s\n",
803*4882a593Smuzhiyun (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
804*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act = enable;
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun if (!force_exec) {
807*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
808*4882a593Smuzhiyun "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
809*4882a593Smuzhiyun coex_dm->pre_ignore_wlan_act,
810*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act);
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun if (coex_dm->pre_ignore_wlan_act ==
813*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act)
814*4882a593Smuzhiyun return;
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun btc8821a1ant_set_fw_ignore_wlan_act(btcoexist, enable);
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
819*4882a593Smuzhiyun }
820*4882a593Smuzhiyun
btc8821a1ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)821*4882a593Smuzhiyun static void btc8821a1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
822*4882a593Smuzhiyun u8 byte2, u8 byte3, u8 byte4, u8 byte5)
823*4882a593Smuzhiyun {
824*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
825*4882a593Smuzhiyun u8 h2c_parameter[5] = {0};
826*4882a593Smuzhiyun u8 real_byte1 = byte1, real_byte5 = byte5;
827*4882a593Smuzhiyun bool ap_enable = false;
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
830*4882a593Smuzhiyun &ap_enable);
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun if (ap_enable) {
833*4882a593Smuzhiyun if (byte1 & BIT4 && !(byte1 & BIT5)) {
834*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
835*4882a593Smuzhiyun "[BTCoex], FW for 1Ant AP mode\n");
836*4882a593Smuzhiyun real_byte1 &= ~BIT4;
837*4882a593Smuzhiyun real_byte1 |= BIT5;
838*4882a593Smuzhiyun
839*4882a593Smuzhiyun real_byte5 |= BIT5;
840*4882a593Smuzhiyun real_byte5 &= ~BIT6;
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun h2c_parameter[0] = real_byte1;
845*4882a593Smuzhiyun h2c_parameter[1] = byte2;
846*4882a593Smuzhiyun h2c_parameter[2] = byte3;
847*4882a593Smuzhiyun h2c_parameter[3] = byte4;
848*4882a593Smuzhiyun h2c_parameter[4] = real_byte5;
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun coex_dm->ps_tdma_para[0] = real_byte1;
851*4882a593Smuzhiyun coex_dm->ps_tdma_para[1] = byte2;
852*4882a593Smuzhiyun coex_dm->ps_tdma_para[2] = byte3;
853*4882a593Smuzhiyun coex_dm->ps_tdma_para[3] = byte4;
854*4882a593Smuzhiyun coex_dm->ps_tdma_para[4] = real_byte5;
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
857*4882a593Smuzhiyun "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
858*4882a593Smuzhiyun h2c_parameter[0],
859*4882a593Smuzhiyun h2c_parameter[1] << 24 |
860*4882a593Smuzhiyun h2c_parameter[2] << 16 |
861*4882a593Smuzhiyun h2c_parameter[3] << 8 |
862*4882a593Smuzhiyun h2c_parameter[4]);
863*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun
btc8821a1ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)866*4882a593Smuzhiyun static void btc8821a1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
867*4882a593Smuzhiyun u8 lps_val, u8 rpwm_val)
868*4882a593Smuzhiyun {
869*4882a593Smuzhiyun u8 lps = lps_val;
870*4882a593Smuzhiyun u8 rpwm = rpwm_val;
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
873*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun
btc8821a1ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)876*4882a593Smuzhiyun static void btc8821a1ant_lps_rpwm(struct btc_coexist *btcoexist,
877*4882a593Smuzhiyun bool force_exec, u8 lps_val, u8 rpwm_val)
878*4882a593Smuzhiyun {
879*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
882*4882a593Smuzhiyun "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
883*4882a593Smuzhiyun (force_exec ? "force to" : ""), lps_val, rpwm_val);
884*4882a593Smuzhiyun coex_dm->cur_lps = lps_val;
885*4882a593Smuzhiyun coex_dm->cur_rpwm = rpwm_val;
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun if (!force_exec) {
888*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
889*4882a593Smuzhiyun "[BTCoex], LPS-RxBeaconMode = 0x%x, LPS-RPWM = 0x%x!!\n",
890*4882a593Smuzhiyun coex_dm->cur_lps, coex_dm->cur_rpwm);
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
893*4882a593Smuzhiyun (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
894*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
895*4882a593Smuzhiyun "[BTCoex], LPS-RPWM_Last = 0x%x, LPS-RPWM_Now = 0x%x!!\n",
896*4882a593Smuzhiyun coex_dm->pre_rpwm, coex_dm->cur_rpwm);
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun return;
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun btc8821a1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun coex_dm->pre_lps = coex_dm->cur_lps;
904*4882a593Smuzhiyun coex_dm->pre_rpwm = coex_dm->cur_rpwm;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun
btc8821a1ant_sw_mechanism(struct btc_coexist * btcoexist,bool low_penalty_ra)907*4882a593Smuzhiyun static void btc8821a1ant_sw_mechanism(struct btc_coexist *btcoexist,
908*4882a593Smuzhiyun bool low_penalty_ra)
909*4882a593Smuzhiyun {
910*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
913*4882a593Smuzhiyun "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun btc8821a1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
916*4882a593Smuzhiyun }
917*4882a593Smuzhiyun
btc8821a1ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool init_hw_cfg,bool wifi_off)918*4882a593Smuzhiyun static void btc8821a1ant_set_ant_path(struct btc_coexist *btcoexist,
919*4882a593Smuzhiyun u8 ant_pos_type, bool init_hw_cfg,
920*4882a593Smuzhiyun bool wifi_off)
921*4882a593Smuzhiyun {
922*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
923*4882a593Smuzhiyun u32 u4_tmp = 0;
924*4882a593Smuzhiyun u8 h2c_parameter[2] = {0};
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun if (init_hw_cfg) {
927*4882a593Smuzhiyun /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */
928*4882a593Smuzhiyun u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
929*4882a593Smuzhiyun u4_tmp &= ~BIT23;
930*4882a593Smuzhiyun u4_tmp |= BIT24;
931*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x975, 0x3, 0x3);
934*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
937*4882a593Smuzhiyun /* tell firmware "antenna inverse"
938*4882a593Smuzhiyun * WRONG firmware antenna control code, need fw to fix
939*4882a593Smuzhiyun */
940*4882a593Smuzhiyun h2c_parameter[0] = 1;
941*4882a593Smuzhiyun h2c_parameter[1] = 1;
942*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
943*4882a593Smuzhiyun h2c_parameter);
944*4882a593Smuzhiyun } else {
945*4882a593Smuzhiyun /* tell firmware "no antenna inverse"
946*4882a593Smuzhiyun * WRONG firmware antenna control code, need fw to fix
947*4882a593Smuzhiyun */
948*4882a593Smuzhiyun h2c_parameter[0] = 0;
949*4882a593Smuzhiyun h2c_parameter[1] = 1;
950*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
951*4882a593Smuzhiyun h2c_parameter);
952*4882a593Smuzhiyun }
953*4882a593Smuzhiyun } else if (wifi_off) {
954*4882a593Smuzhiyun /* 0x4c[24:23] = 00, Set Antenna control
955*4882a593Smuzhiyun * by BT_RFE_CTRL BT Vendor 0xac = 0xf002
956*4882a593Smuzhiyun */
957*4882a593Smuzhiyun u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
958*4882a593Smuzhiyun u4_tmp &= ~BIT23;
959*4882a593Smuzhiyun u4_tmp &= ~BIT24;
960*4882a593Smuzhiyun btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun /* 0x765 = 0x18 */
963*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
964*4882a593Smuzhiyun } else {
965*4882a593Smuzhiyun /* 0x765 = 0x0 */
966*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun /* ext switch setting */
970*4882a593Smuzhiyun switch (ant_pos_type) {
971*4882a593Smuzhiyun case BTC_ANT_PATH_WIFI:
972*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
973*4882a593Smuzhiyun if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
974*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
975*4882a593Smuzhiyun 0x30, 0x1);
976*4882a593Smuzhiyun else
977*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
978*4882a593Smuzhiyun 0x30, 0x2);
979*4882a593Smuzhiyun break;
980*4882a593Smuzhiyun case BTC_ANT_PATH_BT:
981*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
982*4882a593Smuzhiyun if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
983*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
984*4882a593Smuzhiyun 0x30, 0x2);
985*4882a593Smuzhiyun else
986*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
987*4882a593Smuzhiyun 0x30, 0x1);
988*4882a593Smuzhiyun break;
989*4882a593Smuzhiyun default:
990*4882a593Smuzhiyun case BTC_ANT_PATH_PTA:
991*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x66);
992*4882a593Smuzhiyun if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
993*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
994*4882a593Smuzhiyun 0x30, 0x1);
995*4882a593Smuzhiyun else
996*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
997*4882a593Smuzhiyun 0x30, 0x2);
998*4882a593Smuzhiyun break;
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun
btc8821a1ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1002*4882a593Smuzhiyun static void btc8821a1ant_ps_tdma(struct btc_coexist *btcoexist,
1003*4882a593Smuzhiyun bool force_exec, bool turn_on, u8 type)
1004*4882a593Smuzhiyun {
1005*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1006*4882a593Smuzhiyun u8 rssi_adjust_val = 0;
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun coex_dm->cur_ps_tdma_on = turn_on;
1009*4882a593Smuzhiyun coex_dm->cur_ps_tdma = type;
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun if (!force_exec) {
1012*4882a593Smuzhiyun if (coex_dm->cur_ps_tdma_on) {
1013*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1014*4882a593Smuzhiyun "[BTCoex], ********** TDMA(on, %d) **********\n",
1015*4882a593Smuzhiyun coex_dm->cur_ps_tdma);
1016*4882a593Smuzhiyun } else {
1017*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1018*4882a593Smuzhiyun "[BTCoex], ********** TDMA(off, %d) **********\n",
1019*4882a593Smuzhiyun coex_dm->cur_ps_tdma);
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1022*4882a593Smuzhiyun (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1023*4882a593Smuzhiyun return;
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun if (turn_on) {
1026*4882a593Smuzhiyun switch (type) {
1027*4882a593Smuzhiyun default:
1028*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1029*4882a593Smuzhiyun 0x1a, 0x0, 0x50);
1030*4882a593Smuzhiyun break;
1031*4882a593Smuzhiyun case 1:
1032*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x3a,
1033*4882a593Smuzhiyun 0x03, 0x10, 0x50);
1034*4882a593Smuzhiyun rssi_adjust_val = 11;
1035*4882a593Smuzhiyun break;
1036*4882a593Smuzhiyun case 2:
1037*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x2b,
1038*4882a593Smuzhiyun 0x03, 0x10, 0x50);
1039*4882a593Smuzhiyun rssi_adjust_val = 14;
1040*4882a593Smuzhiyun break;
1041*4882a593Smuzhiyun case 3:
1042*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,
1043*4882a593Smuzhiyun 0x1d, 0x0, 0x10);
1044*4882a593Smuzhiyun break;
1045*4882a593Smuzhiyun case 4:
1046*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1047*4882a593Smuzhiyun 0x3, 0x14, 0x0);
1048*4882a593Smuzhiyun rssi_adjust_val = 17;
1049*4882a593Smuzhiyun break;
1050*4882a593Smuzhiyun case 5:
1051*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
1052*4882a593Smuzhiyun 0x3, 0x11, 0x10);
1053*4882a593Smuzhiyun break;
1054*4882a593Smuzhiyun case 6:
1055*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
1056*4882a593Smuzhiyun 0x3, 0x11, 0x13);
1057*4882a593Smuzhiyun break;
1058*4882a593Smuzhiyun case 7:
1059*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1060*4882a593Smuzhiyun 0x5, 0x0, 0x0);
1061*4882a593Smuzhiyun break;
1062*4882a593Smuzhiyun case 8:
1063*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1064*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1065*4882a593Smuzhiyun break;
1066*4882a593Smuzhiyun case 9:
1067*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
1068*4882a593Smuzhiyun 0x3, 0x10, 0x50);
1069*4882a593Smuzhiyun rssi_adjust_val = 18;
1070*4882a593Smuzhiyun break;
1071*4882a593Smuzhiyun case 10:
1072*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1073*4882a593Smuzhiyun 0xa, 0x0, 0x40);
1074*4882a593Smuzhiyun break;
1075*4882a593Smuzhiyun case 11:
1076*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1077*4882a593Smuzhiyun 0x03, 0x10, 0x50);
1078*4882a593Smuzhiyun rssi_adjust_val = 20;
1079*4882a593Smuzhiyun break;
1080*4882a593Smuzhiyun case 12:
1081*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1082*4882a593Smuzhiyun 0x0a, 0x0, 0x50);
1083*4882a593Smuzhiyun break;
1084*4882a593Smuzhiyun case 13:
1085*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x12,
1086*4882a593Smuzhiyun 0x12, 0x0, 0x50);
1087*4882a593Smuzhiyun break;
1088*4882a593Smuzhiyun case 14:
1089*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1e,
1090*4882a593Smuzhiyun 0x3, 0x10, 0x14);
1091*4882a593Smuzhiyun break;
1092*4882a593Smuzhiyun case 15:
1093*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1094*4882a593Smuzhiyun 0x3, 0x8, 0x0);
1095*4882a593Smuzhiyun break;
1096*4882a593Smuzhiyun case 16:
1097*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1098*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1099*4882a593Smuzhiyun rssi_adjust_val = 18;
1100*4882a593Smuzhiyun break;
1101*4882a593Smuzhiyun case 18:
1102*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1103*4882a593Smuzhiyun 0x3, 0x10, 0x0);
1104*4882a593Smuzhiyun rssi_adjust_val = 14;
1105*4882a593Smuzhiyun break;
1106*4882a593Smuzhiyun case 20:
1107*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1108*4882a593Smuzhiyun 0x03, 0x11, 0x10);
1109*4882a593Smuzhiyun break;
1110*4882a593Smuzhiyun case 21:
1111*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1112*4882a593Smuzhiyun 0x03, 0x11, 0x11);
1113*4882a593Smuzhiyun break;
1114*4882a593Smuzhiyun case 22:
1115*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1116*4882a593Smuzhiyun 0x03, 0x11, 0x10);
1117*4882a593Smuzhiyun break;
1118*4882a593Smuzhiyun case 23:
1119*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1120*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1121*4882a593Smuzhiyun rssi_adjust_val = 22;
1122*4882a593Smuzhiyun break;
1123*4882a593Smuzhiyun case 24:
1124*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1125*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1126*4882a593Smuzhiyun rssi_adjust_val = 22;
1127*4882a593Smuzhiyun break;
1128*4882a593Smuzhiyun case 25:
1129*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1130*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1131*4882a593Smuzhiyun rssi_adjust_val = 22;
1132*4882a593Smuzhiyun break;
1133*4882a593Smuzhiyun case 26:
1134*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1135*4882a593Smuzhiyun 0x3, 0x31, 0x18);
1136*4882a593Smuzhiyun rssi_adjust_val = 22;
1137*4882a593Smuzhiyun break;
1138*4882a593Smuzhiyun case 27:
1139*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1140*4882a593Smuzhiyun 0x3, 0x31, 0x98);
1141*4882a593Smuzhiyun rssi_adjust_val = 22;
1142*4882a593Smuzhiyun break;
1143*4882a593Smuzhiyun case 28:
1144*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1145*4882a593Smuzhiyun 0x3, 0x31, 0x0);
1146*4882a593Smuzhiyun break;
1147*4882a593Smuzhiyun case 29:
1148*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1149*4882a593Smuzhiyun 0x1a, 0x1, 0x10);
1150*4882a593Smuzhiyun break;
1151*4882a593Smuzhiyun case 30:
1152*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1153*4882a593Smuzhiyun 0x3, 0x10, 0x10);
1154*4882a593Smuzhiyun break;
1155*4882a593Smuzhiyun case 31:
1156*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1157*4882a593Smuzhiyun 0x1a, 0, 0x58);
1158*4882a593Smuzhiyun break;
1159*4882a593Smuzhiyun case 32:
1160*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1161*4882a593Smuzhiyun 0x3, 0x11, 0x11);
1162*4882a593Smuzhiyun break;
1163*4882a593Smuzhiyun case 33:
1164*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,
1165*4882a593Smuzhiyun 0x3, 0x30, 0x90);
1166*4882a593Smuzhiyun break;
1167*4882a593Smuzhiyun case 34:
1168*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1169*4882a593Smuzhiyun 0x1a, 0x0, 0x10);
1170*4882a593Smuzhiyun break;
1171*4882a593Smuzhiyun case 35:
1172*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1173*4882a593Smuzhiyun 0x1a, 0x0, 0x10);
1174*4882a593Smuzhiyun break;
1175*4882a593Smuzhiyun case 36:
1176*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1177*4882a593Smuzhiyun 0x3, 0x14, 0x50);
1178*4882a593Smuzhiyun break;
1179*4882a593Smuzhiyun case 40:
1180*4882a593Smuzhiyun /* SoftAP only with no sta associated, BT disable, TDMA
1181*4882a593Smuzhiyun * mode for power saving
1182*4882a593Smuzhiyun *
1183*4882a593Smuzhiyun * here softap mode screen off will cost 70-80mA for
1184*4882a593Smuzhiyun * phone
1185*4882a593Smuzhiyun */
1186*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1187*4882a593Smuzhiyun 0x00, 0x10, 0x24);
1188*4882a593Smuzhiyun break;
1189*4882a593Smuzhiyun case 41:
1190*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1191*4882a593Smuzhiyun 0x3, 0x11, 0x11);
1192*4882a593Smuzhiyun break;
1193*4882a593Smuzhiyun case 42:
1194*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x20,
1195*4882a593Smuzhiyun 0x3, 0x11, 0x11);
1196*4882a593Smuzhiyun break;
1197*4882a593Smuzhiyun case 43:
1198*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1199*4882a593Smuzhiyun 0x3, 0x10, 0x11);
1200*4882a593Smuzhiyun break;
1201*4882a593Smuzhiyun }
1202*4882a593Smuzhiyun } else {
1203*4882a593Smuzhiyun /* disable PS tdma */
1204*4882a593Smuzhiyun switch (type) {
1205*4882a593Smuzhiyun case 8:
1206*4882a593Smuzhiyun /* PTA Control */
1207*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0,
1208*4882a593Smuzhiyun 0x0, 0x0);
1209*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1210*4882a593Smuzhiyun false, false);
1211*4882a593Smuzhiyun break;
1212*4882a593Smuzhiyun case 0:
1213*4882a593Smuzhiyun default:
1214*4882a593Smuzhiyun /* Software control, Antenna at BT side */
1215*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1216*4882a593Smuzhiyun 0x0, 0x0);
1217*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1218*4882a593Smuzhiyun false, false);
1219*4882a593Smuzhiyun break;
1220*4882a593Smuzhiyun case 9:
1221*4882a593Smuzhiyun /* Software control, Antenna at WiFi side */
1222*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1223*4882a593Smuzhiyun 0x0, 0x0);
1224*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
1225*4882a593Smuzhiyun false, false);
1226*4882a593Smuzhiyun break;
1227*4882a593Smuzhiyun case 10:
1228*4882a593Smuzhiyun /* under 5G */
1229*4882a593Smuzhiyun btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1230*4882a593Smuzhiyun 0x8, 0x0);
1231*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
1232*4882a593Smuzhiyun false, false);
1233*4882a593Smuzhiyun break;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun rssi_adjust_val = 0;
1237*4882a593Smuzhiyun btcoexist->btc_set(btcoexist,
1238*4882a593Smuzhiyun BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun /* update pre state */
1241*4882a593Smuzhiyun coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1242*4882a593Smuzhiyun coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
btc8821a1ant_is_common_action(struct btc_coexist * btcoexist)1245*4882a593Smuzhiyun static bool btc8821a1ant_is_common_action(struct btc_coexist *btcoexist)
1246*4882a593Smuzhiyun {
1247*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1248*4882a593Smuzhiyun bool common = false, wifi_connected = false, wifi_busy = false;
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1251*4882a593Smuzhiyun &wifi_connected);
1252*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1253*4882a593Smuzhiyun
1254*4882a593Smuzhiyun if (!wifi_connected &&
1255*4882a593Smuzhiyun BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1256*4882a593Smuzhiyun coex_dm->bt_status) {
1257*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1258*4882a593Smuzhiyun "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
1259*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun common = true;
1262*4882a593Smuzhiyun } else if (wifi_connected &&
1263*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1264*4882a593Smuzhiyun coex_dm->bt_status)) {
1265*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1266*4882a593Smuzhiyun "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1267*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1268*4882a593Smuzhiyun
1269*4882a593Smuzhiyun common = true;
1270*4882a593Smuzhiyun } else if (!wifi_connected &&
1271*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1272*4882a593Smuzhiyun coex_dm->bt_status)) {
1273*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1274*4882a593Smuzhiyun "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
1275*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun common = true;
1278*4882a593Smuzhiyun } else if (wifi_connected &&
1279*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
1280*4882a593Smuzhiyun coex_dm->bt_status)) {
1281*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1282*4882a593Smuzhiyun "[BTCoex], Wifi connected + BT connected-idle!!\n");
1283*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1284*4882a593Smuzhiyun
1285*4882a593Smuzhiyun common = true;
1286*4882a593Smuzhiyun } else if (!wifi_connected &&
1287*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE !=
1288*4882a593Smuzhiyun coex_dm->bt_status)) {
1289*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1290*4882a593Smuzhiyun "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
1291*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun common = true;
1294*4882a593Smuzhiyun } else {
1295*4882a593Smuzhiyun if (wifi_busy) {
1296*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1297*4882a593Smuzhiyun "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1298*4882a593Smuzhiyun } else {
1299*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1300*4882a593Smuzhiyun "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1301*4882a593Smuzhiyun }
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun common = false;
1304*4882a593Smuzhiyun }
1305*4882a593Smuzhiyun
1306*4882a593Smuzhiyun return common;
1307*4882a593Smuzhiyun }
1308*4882a593Smuzhiyun
btc8821a1ant_ps_tdma_check_for_pwr_save(struct btc_coexist * btcoex,bool new_ps_state)1309*4882a593Smuzhiyun static void btc8821a1ant_ps_tdma_check_for_pwr_save(struct btc_coexist *btcoex,
1310*4882a593Smuzhiyun bool new_ps_state)
1311*4882a593Smuzhiyun {
1312*4882a593Smuzhiyun u8 lps_mode = 0x0;
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun btcoex->btc_get(btcoex, BTC_GET_U1_LPS_MODE, &lps_mode);
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun if (lps_mode) {
1317*4882a593Smuzhiyun /* already under LPS state */
1318*4882a593Smuzhiyun if (new_ps_state) {
1319*4882a593Smuzhiyun /* keep state under LPS, do nothing */
1320*4882a593Smuzhiyun } else {
1321*4882a593Smuzhiyun /* will leave LPS state, turn off psTdma first */
1322*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun } else {
1325*4882a593Smuzhiyun /* NO PS state*/
1326*4882a593Smuzhiyun if (new_ps_state) {
1327*4882a593Smuzhiyun /* will enter LPS state, turn off psTdma first */
1328*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);
1329*4882a593Smuzhiyun } else {
1330*4882a593Smuzhiyun /* keep state under NO PS state, do nothing */
1331*4882a593Smuzhiyun }
1332*4882a593Smuzhiyun }
1333*4882a593Smuzhiyun }
1334*4882a593Smuzhiyun
btc8821a1ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1335*4882a593Smuzhiyun static void btc8821a1ant_power_save_state(struct btc_coexist *btcoexist,
1336*4882a593Smuzhiyun u8 ps_type, u8 lps_val, u8 rpwm_val)
1337*4882a593Smuzhiyun {
1338*4882a593Smuzhiyun bool low_pwr_disable = false;
1339*4882a593Smuzhiyun
1340*4882a593Smuzhiyun switch (ps_type) {
1341*4882a593Smuzhiyun case BTC_PS_WIFI_NATIVE:
1342*4882a593Smuzhiyun /* recover to original 32k low power setting */
1343*4882a593Smuzhiyun low_pwr_disable = false;
1344*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1345*4882a593Smuzhiyun &low_pwr_disable);
1346*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1347*4882a593Smuzhiyun break;
1348*4882a593Smuzhiyun case BTC_PS_LPS_ON:
1349*4882a593Smuzhiyun btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist,
1350*4882a593Smuzhiyun true);
1351*4882a593Smuzhiyun btc8821a1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1352*4882a593Smuzhiyun rpwm_val);
1353*4882a593Smuzhiyun /* when coex force to enter LPS, do not enter 32k low power */
1354*4882a593Smuzhiyun low_pwr_disable = true;
1355*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1356*4882a593Smuzhiyun &low_pwr_disable);
1357*4882a593Smuzhiyun /* power save must executed before psTdma */
1358*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1359*4882a593Smuzhiyun break;
1360*4882a593Smuzhiyun case BTC_PS_LPS_OFF:
1361*4882a593Smuzhiyun btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist, false);
1362*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1363*4882a593Smuzhiyun break;
1364*4882a593Smuzhiyun default:
1365*4882a593Smuzhiyun break;
1366*4882a593Smuzhiyun }
1367*4882a593Smuzhiyun }
1368*4882a593Smuzhiyun
btc8821a1ant_coex_under_5g(struct btc_coexist * btcoexist)1369*4882a593Smuzhiyun static void btc8821a1ant_coex_under_5g(struct btc_coexist *btcoexist)
1370*4882a593Smuzhiyun {
1371*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1372*4882a593Smuzhiyun 0x0, 0x0);
1373*4882a593Smuzhiyun btc8821a1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1374*4882a593Smuzhiyun
1375*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 10);
1376*4882a593Smuzhiyun
1377*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1380*4882a593Smuzhiyun
1381*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);
1382*4882a593Smuzhiyun }
1383*4882a593Smuzhiyun
1384*4882a593Smuzhiyun /***********************************************
1385*4882a593Smuzhiyun *
1386*4882a593Smuzhiyun * Software Coex Mechanism start
1387*4882a593Smuzhiyun *
1388*4882a593Smuzhiyun ***********************************************/
1389*4882a593Smuzhiyun
1390*4882a593Smuzhiyun /* SCO only or SCO+PAN(HS) */
btc8821a1ant_action_sco(struct btc_coexist * btcoexist)1391*4882a593Smuzhiyun static void btc8821a1ant_action_sco(struct btc_coexist *btcoexist)
1392*4882a593Smuzhiyun {
1393*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, true);
1394*4882a593Smuzhiyun }
1395*4882a593Smuzhiyun
btc8821a1ant_action_hid(struct btc_coexist * btcoexist)1396*4882a593Smuzhiyun static void btc8821a1ant_action_hid(struct btc_coexist *btcoexist)
1397*4882a593Smuzhiyun {
1398*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, true);
1399*4882a593Smuzhiyun }
1400*4882a593Smuzhiyun
1401*4882a593Smuzhiyun /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
btc8821a1ant_action_a2dp(struct btc_coexist * btcoexist)1402*4882a593Smuzhiyun static void btc8821a1ant_action_a2dp(struct btc_coexist *btcoexist)
1403*4882a593Smuzhiyun {
1404*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1405*4882a593Smuzhiyun }
1406*4882a593Smuzhiyun
btc8821a1ant_action_a2dp_pan_hs(struct btc_coexist * btcoexist)1407*4882a593Smuzhiyun static void btc8821a1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
1408*4882a593Smuzhiyun {
1409*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1410*4882a593Smuzhiyun }
1411*4882a593Smuzhiyun
btc8821a1ant_action_pan_edr(struct btc_coexist * btcoexist)1412*4882a593Smuzhiyun static void btc8821a1ant_action_pan_edr(struct btc_coexist *btcoexist)
1413*4882a593Smuzhiyun {
1414*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1415*4882a593Smuzhiyun }
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun /* PAN(HS) only */
btc8821a1ant_action_pan_hs(struct btc_coexist * btcoexist)1418*4882a593Smuzhiyun static void btc8821a1ant_action_pan_hs(struct btc_coexist *btcoexist)
1419*4882a593Smuzhiyun {
1420*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1421*4882a593Smuzhiyun }
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun /* PAN(EDR)+A2DP */
btc8821a1ant_action_pan_edr_a2dp(struct btc_coexist * btcoexist)1424*4882a593Smuzhiyun static void btc8821a1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
1425*4882a593Smuzhiyun {
1426*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
1427*4882a593Smuzhiyun }
1428*4882a593Smuzhiyun
btc8821a1ant_action_pan_edr_hid(struct btc_coexist * btcoexist)1429*4882a593Smuzhiyun static void btc8821a1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
1430*4882a593Smuzhiyun {
1431*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, true);
1432*4882a593Smuzhiyun }
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun /* HID+A2DP+PAN(EDR) */
btc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist * btcoexist)1435*4882a593Smuzhiyun static void btc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
1436*4882a593Smuzhiyun {
1437*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, true);
1438*4882a593Smuzhiyun }
1439*4882a593Smuzhiyun
btc8821a1ant_action_hid_a2dp(struct btc_coexist * btcoexist)1440*4882a593Smuzhiyun static void btc8821a1ant_action_hid_a2dp(struct btc_coexist *btcoexist)
1441*4882a593Smuzhiyun {
1442*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, true);
1443*4882a593Smuzhiyun }
1444*4882a593Smuzhiyun
1445*4882a593Smuzhiyun /***********************************************
1446*4882a593Smuzhiyun *
1447*4882a593Smuzhiyun * Non-Software Coex Mechanism start
1448*4882a593Smuzhiyun *
1449*4882a593Smuzhiyun ***********************************************/
1450*4882a593Smuzhiyun static
btc8821a1ant_action_wifi_multi_port(struct btc_coexist * btcoexist)1451*4882a593Smuzhiyun void btc8821a1ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
1452*4882a593Smuzhiyun {
1453*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1456*4882a593Smuzhiyun /* tdma and coex table */
1457*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1458*4882a593Smuzhiyun if (bt_link_info->a2dp_exist) {
1459*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1460*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1461*4882a593Smuzhiyun NORMAL_EXEC, 1);
1462*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist &&
1463*4882a593Smuzhiyun bt_link_info->pan_exist) {
1464*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1465*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1466*4882a593Smuzhiyun NORMAL_EXEC, 4);
1467*4882a593Smuzhiyun } else {
1468*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1469*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1470*4882a593Smuzhiyun NORMAL_EXEC, 4);
1471*4882a593Smuzhiyun }
1472*4882a593Smuzhiyun } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1473*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1474*4882a593Smuzhiyun coex_dm->bt_status)) {
1475*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1476*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1477*4882a593Smuzhiyun } else {
1478*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1479*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1480*4882a593Smuzhiyun }
1481*4882a593Smuzhiyun }
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun static
btc8821a1ant_action_wifi_not_connected_asso_auth(struct btc_coexist * btcoexist)1484*4882a593Smuzhiyun void btc8821a1ant_action_wifi_not_connected_asso_auth(
1485*4882a593Smuzhiyun struct btc_coexist *btcoexist)
1486*4882a593Smuzhiyun {
1487*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1488*4882a593Smuzhiyun
1489*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1490*4882a593Smuzhiyun 0x0);
1491*4882a593Smuzhiyun
1492*4882a593Smuzhiyun /* tdma and coex table */
1493*4882a593Smuzhiyun if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
1494*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1495*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1496*4882a593Smuzhiyun } else if ((bt_link_info->a2dp_exist) || (bt_link_info->pan_exist)) {
1497*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1498*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1499*4882a593Smuzhiyun } else {
1500*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1501*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1502*4882a593Smuzhiyun }
1503*4882a593Smuzhiyun }
1504*4882a593Smuzhiyun
1505*4882a593Smuzhiyun
btc8821a1ant_action_hs(struct btc_coexist * btcoexist)1506*4882a593Smuzhiyun static void btc8821a1ant_action_hs(struct btc_coexist *btcoexist)
1507*4882a593Smuzhiyun {
1508*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1509*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1510*4882a593Smuzhiyun }
1511*4882a593Smuzhiyun
btc8821a1ant_action_bt_inquiry(struct btc_coexist * btcoexist)1512*4882a593Smuzhiyun static void btc8821a1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1513*4882a593Smuzhiyun {
1514*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1515*4882a593Smuzhiyun bool wifi_connected = false;
1516*4882a593Smuzhiyun bool ap_enable = false;
1517*4882a593Smuzhiyun bool wifi_busy = false, bt_busy = false;
1518*4882a593Smuzhiyun
1519*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1520*4882a593Smuzhiyun &wifi_connected);
1521*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1522*4882a593Smuzhiyun &ap_enable);
1523*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1524*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1525*4882a593Smuzhiyun
1526*4882a593Smuzhiyun if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1527*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist,
1528*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1529*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1530*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1531*4882a593Smuzhiyun } else if ((bt_link_info->sco_exist) || (bt_link_info->a2dp_exist) ||
1532*4882a593Smuzhiyun (bt_link_info->hid_only)) {
1533*4882a593Smuzhiyun /* SCO/HID-only busy */
1534*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist,
1535*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1536*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1537*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1538*4882a593Smuzhiyun } else if ((bt_link_info->a2dp_exist) && (bt_link_info->hid_exist)) {
1539*4882a593Smuzhiyun /* A2DP+HID busy */
1540*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1541*4882a593Smuzhiyun 0x0, 0x0);
1542*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1543*4882a593Smuzhiyun
1544*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1545*4882a593Smuzhiyun } else if ((bt_link_info->pan_exist) || (wifi_busy)) {
1546*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1547*4882a593Smuzhiyun 0x0, 0x0);
1548*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1549*4882a593Smuzhiyun
1550*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1551*4882a593Smuzhiyun } else {
1552*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1553*4882a593Smuzhiyun 0x0, 0x0);
1554*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1555*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1556*4882a593Smuzhiyun }
1557*4882a593Smuzhiyun }
1558*4882a593Smuzhiyun
btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist * btcoexist,u8 wifi_status)1559*4882a593Smuzhiyun static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1560*4882a593Smuzhiyun u8 wifi_status)
1561*4882a593Smuzhiyun {
1562*4882a593Smuzhiyun /* tdma and coex table */
1563*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1566*4882a593Smuzhiyun }
1567*4882a593Smuzhiyun
btc8821a1ant_act_wifi_con_bt_acl_busy(struct btc_coexist * btcoexist,u8 wifi_status)1568*4882a593Smuzhiyun static void btc8821a1ant_act_wifi_con_bt_acl_busy(struct btc_coexist *btcoexist,
1569*4882a593Smuzhiyun u8 wifi_status)
1570*4882a593Smuzhiyun {
1571*4882a593Smuzhiyun u8 bt_rssi_state;
1572*4882a593Smuzhiyun
1573*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1574*4882a593Smuzhiyun
1575*4882a593Smuzhiyun bt_rssi_state = btc8821a1ant_bt_rssi_state(btcoexist, 2, 28, 0);
1576*4882a593Smuzhiyun
1577*4882a593Smuzhiyun if (bt_link_info->hid_only) {
1578*4882a593Smuzhiyun /* HID */
1579*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1580*4882a593Smuzhiyun wifi_status);
1581*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1582*4882a593Smuzhiyun return;
1583*4882a593Smuzhiyun } else if (bt_link_info->a2dp_only) {
1584*4882a593Smuzhiyun /* A2DP */
1585*4882a593Smuzhiyun if (wifi_status == BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1586*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1587*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1588*4882a593Smuzhiyun NORMAL_EXEC, 1);
1589*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1590*4882a593Smuzhiyun } else if ((bt_rssi_state != BTC_RSSI_STATE_HIGH) &&
1591*4882a593Smuzhiyun (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1592*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1593*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1594*4882a593Smuzhiyun NORMAL_EXEC, 1);
1595*4882a593Smuzhiyun } else {
1596*4882a593Smuzhiyun /* for low BT RSSI */
1597*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1598*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1599*4882a593Smuzhiyun NORMAL_EXEC, 1);
1600*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1601*4882a593Smuzhiyun }
1602*4882a593Smuzhiyun } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1603*4882a593Smuzhiyun /* HID+A2DP */
1604*4882a593Smuzhiyun if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1605*4882a593Smuzhiyun (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1606*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1607*4882a593Smuzhiyun true, 14);
1608*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1609*4882a593Smuzhiyun } else {
1610*4882a593Smuzhiyun /*for low BT RSSI*/
1611*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1612*4882a593Smuzhiyun true, 14);
1613*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1614*4882a593Smuzhiyun }
1615*4882a593Smuzhiyun
1616*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1617*4882a593Smuzhiyun } else if ((bt_link_info->pan_only) ||
1618*4882a593Smuzhiyun (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1619*4882a593Smuzhiyun /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */
1620*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1621*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
1622*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1623*4882a593Smuzhiyun } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1624*4882a593Smuzhiyun (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1625*4882a593Smuzhiyun bt_link_info->pan_exist)) {
1626*4882a593Smuzhiyun /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */
1627*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 43);
1628*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1629*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1630*4882a593Smuzhiyun } else {
1631*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1632*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1633*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
1634*4882a593Smuzhiyun }
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun static
btc8821a1ant_action_wifi_not_connected(struct btc_coexist * btcoexist)1638*4882a593Smuzhiyun void btc8821a1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)
1639*4882a593Smuzhiyun {
1640*4882a593Smuzhiyun /* power save state */
1641*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1642*4882a593Smuzhiyun
1643*4882a593Smuzhiyun /* tdma and coex table */
1644*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1645*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1646*4882a593Smuzhiyun }
1647*4882a593Smuzhiyun
btc8821a1ant_act_wifi_not_conn_scan(struct btc_coexist * btcoexist)1648*4882a593Smuzhiyun static void btc8821a1ant_act_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1649*4882a593Smuzhiyun {
1650*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1651*4882a593Smuzhiyun
1652*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1653*4882a593Smuzhiyun
1654*4882a593Smuzhiyun /* tdma and coex table */
1655*4882a593Smuzhiyun if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {
1656*4882a593Smuzhiyun if (bt_link_info->a2dp_exist) {
1657*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1658*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1659*4882a593Smuzhiyun NORMAL_EXEC, 1);
1660*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist &&
1661*4882a593Smuzhiyun bt_link_info->pan_exist) {
1662*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1663*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1664*4882a593Smuzhiyun NORMAL_EXEC, 4);
1665*4882a593Smuzhiyun } else {
1666*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1667*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1668*4882a593Smuzhiyun NORMAL_EXEC, 4);
1669*4882a593Smuzhiyun }
1670*4882a593Smuzhiyun } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1671*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1672*4882a593Smuzhiyun coex_dm->bt_status)) {
1673*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1674*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1675*4882a593Smuzhiyun } else {
1676*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1677*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1678*4882a593Smuzhiyun }
1679*4882a593Smuzhiyun }
1680*4882a593Smuzhiyun
1681*4882a593Smuzhiyun static
btc8821a1ant_action_wifi_connected_scan(struct btc_coexist * btcoexist)1682*4882a593Smuzhiyun void btc8821a1ant_action_wifi_connected_scan(struct btc_coexist *btcoexist)
1683*4882a593Smuzhiyun {
1684*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1685*4882a593Smuzhiyun
1686*4882a593Smuzhiyun /* power save state */
1687*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist,
1688*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1689*4882a593Smuzhiyun
1690*4882a593Smuzhiyun /* tdma and coex table */
1691*4882a593Smuzhiyun if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1692*4882a593Smuzhiyun if (bt_link_info->a2dp_exist) {
1693*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1694*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1695*4882a593Smuzhiyun NORMAL_EXEC, 1);
1696*4882a593Smuzhiyun } else {
1697*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1698*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1699*4882a593Smuzhiyun NORMAL_EXEC, 4);
1700*4882a593Smuzhiyun }
1701*4882a593Smuzhiyun } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||
1702*4882a593Smuzhiyun (coex_dm->bt_status ==
1703*4882a593Smuzhiyun BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY)) {
1704*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1705*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1706*4882a593Smuzhiyun } else {
1707*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1708*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1709*4882a593Smuzhiyun }
1710*4882a593Smuzhiyun }
1711*4882a593Smuzhiyun
btc8821a1ant_act_wifi_conn_sp_pkt(struct btc_coexist * btcoexist)1712*4882a593Smuzhiyun static void btc8821a1ant_act_wifi_conn_sp_pkt(struct btc_coexist *btcoexist)
1713*4882a593Smuzhiyun {
1714*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1715*4882a593Smuzhiyun
1716*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1717*4882a593Smuzhiyun 0x0, 0x0);
1718*4882a593Smuzhiyun
1719*4882a593Smuzhiyun /* tdma and coex table */
1720*4882a593Smuzhiyun if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1721*4882a593Smuzhiyun (bt_link_info->a2dp_exist)) {
1722*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1723*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1724*4882a593Smuzhiyun }
1725*4882a593Smuzhiyun
1726*4882a593Smuzhiyun if ((bt_link_info->hid_exist) && (bt_link_info->a2dp_exist)) {
1727*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1728*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1729*4882a593Smuzhiyun } else if (bt_link_info->pan_exist) {
1730*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1731*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1732*4882a593Smuzhiyun } else {
1733*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1734*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1735*4882a593Smuzhiyun }
1736*4882a593Smuzhiyun }
1737*4882a593Smuzhiyun
btc8821a1ant_action_wifi_connected(struct btc_coexist * btcoexist)1738*4882a593Smuzhiyun static void btc8821a1ant_action_wifi_connected(struct btc_coexist *btcoexist)
1739*4882a593Smuzhiyun {
1740*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1741*4882a593Smuzhiyun bool wifi_busy = false;
1742*4882a593Smuzhiyun bool scan = false, link = false, roam = false;
1743*4882a593Smuzhiyun bool under_4way = false;
1744*4882a593Smuzhiyun bool ap_enable = false;
1745*4882a593Smuzhiyun
1746*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1747*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect()===>\n");
1748*4882a593Smuzhiyun
1749*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
1750*4882a593Smuzhiyun &under_4way);
1751*4882a593Smuzhiyun if (under_4way) {
1752*4882a593Smuzhiyun btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1753*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1754*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
1755*4882a593Smuzhiyun return;
1756*4882a593Smuzhiyun }
1757*4882a593Smuzhiyun
1758*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1759*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1760*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1761*4882a593Smuzhiyun if (scan || link || roam) {
1762*4882a593Smuzhiyun if (scan)
1763*4882a593Smuzhiyun btc8821a1ant_action_wifi_connected_scan(btcoexist);
1764*4882a593Smuzhiyun else
1765*4882a593Smuzhiyun btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
1766*4882a593Smuzhiyun
1767*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1768*4882a593Smuzhiyun "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
1769*4882a593Smuzhiyun return;
1770*4882a593Smuzhiyun }
1771*4882a593Smuzhiyun
1772*4882a593Smuzhiyun /* power save state*/
1773*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1774*4882a593Smuzhiyun &ap_enable);
1775*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1776*4882a593Smuzhiyun if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY ==
1777*4882a593Smuzhiyun coex_dm->bt_status && !ap_enable &&
1778*4882a593Smuzhiyun !btcoexist->bt_link_info.hid_only) {
1779*4882a593Smuzhiyun if (!wifi_busy && btcoexist->bt_link_info.a2dp_only)
1780*4882a593Smuzhiyun /* A2DP */
1781*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist,
1782*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1783*4882a593Smuzhiyun else
1784*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON,
1785*4882a593Smuzhiyun 0x50, 0x4);
1786*4882a593Smuzhiyun } else {
1787*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist,
1788*4882a593Smuzhiyun BTC_PS_WIFI_NATIVE,
1789*4882a593Smuzhiyun 0x0, 0x0);
1790*4882a593Smuzhiyun }
1791*4882a593Smuzhiyun
1792*4882a593Smuzhiyun /* tdma and coex table */
1793*4882a593Smuzhiyun if (!wifi_busy) {
1794*4882a593Smuzhiyun if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1795*4882a593Smuzhiyun btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1796*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1797*4882a593Smuzhiyun } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1798*4882a593Smuzhiyun coex_dm->bt_status) ||
1799*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1800*4882a593Smuzhiyun coex_dm->bt_status)) {
1801*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1802*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1803*4882a593Smuzhiyun } else {
1804*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1805*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1806*4882a593Smuzhiyun NORMAL_EXEC, 2);
1807*4882a593Smuzhiyun }
1808*4882a593Smuzhiyun } else {
1809*4882a593Smuzhiyun if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1810*4882a593Smuzhiyun btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,
1811*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1812*4882a593Smuzhiyun } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1813*4882a593Smuzhiyun coex_dm->bt_status) ||
1814*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1815*4882a593Smuzhiyun coex_dm->bt_status)) {
1816*4882a593Smuzhiyun btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,
1817*4882a593Smuzhiyun BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1818*4882a593Smuzhiyun } else {
1819*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1820*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
1821*4882a593Smuzhiyun NORMAL_EXEC, 2);
1822*4882a593Smuzhiyun }
1823*4882a593Smuzhiyun }
1824*4882a593Smuzhiyun }
1825*4882a593Smuzhiyun
btc8821a1ant_run_sw_coex_mech(struct btc_coexist * btcoexist)1826*4882a593Smuzhiyun static void btc8821a1ant_run_sw_coex_mech(struct btc_coexist *btcoexist)
1827*4882a593Smuzhiyun {
1828*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1829*4882a593Smuzhiyun u8 algorithm = 0;
1830*4882a593Smuzhiyun
1831*4882a593Smuzhiyun algorithm = btc8821a1ant_action_algorithm(btcoexist);
1832*4882a593Smuzhiyun coex_dm->cur_algorithm = algorithm;
1833*4882a593Smuzhiyun
1834*4882a593Smuzhiyun if (!btc8821a1ant_is_common_action(btcoexist)) {
1835*4882a593Smuzhiyun switch (coex_dm->cur_algorithm) {
1836*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_SCO:
1837*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1838*4882a593Smuzhiyun "[BTCoex], Action algorithm = SCO\n");
1839*4882a593Smuzhiyun btc8821a1ant_action_sco(btcoexist);
1840*4882a593Smuzhiyun break;
1841*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_HID:
1842*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1843*4882a593Smuzhiyun "[BTCoex], Action algorithm = HID\n");
1844*4882a593Smuzhiyun btc8821a1ant_action_hid(btcoexist);
1845*4882a593Smuzhiyun break;
1846*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_A2DP:
1847*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1848*4882a593Smuzhiyun "[BTCoex], Action algorithm = A2DP\n");
1849*4882a593Smuzhiyun btc8821a1ant_action_a2dp(btcoexist);
1850*4882a593Smuzhiyun break;
1851*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:
1852*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1853*4882a593Smuzhiyun "[BTCoex], Action algorithm = A2DP+PAN(HS)\n");
1854*4882a593Smuzhiyun btc8821a1ant_action_a2dp_pan_hs(btcoexist);
1855*4882a593Smuzhiyun break;
1856*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_PANEDR:
1857*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1858*4882a593Smuzhiyun "[BTCoex], Action algorithm = PAN(EDR)\n");
1859*4882a593Smuzhiyun btc8821a1ant_action_pan_edr(btcoexist);
1860*4882a593Smuzhiyun break;
1861*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_PANHS:
1862*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1863*4882a593Smuzhiyun "[BTCoex], Action algorithm = HS mode\n");
1864*4882a593Smuzhiyun btc8821a1ant_action_pan_hs(btcoexist);
1865*4882a593Smuzhiyun break;
1866*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:
1867*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1868*4882a593Smuzhiyun "[BTCoex], Action algorithm = PAN+A2DP\n");
1869*4882a593Smuzhiyun btc8821a1ant_action_pan_edr_a2dp(btcoexist);
1870*4882a593Smuzhiyun break;
1871*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:
1872*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1873*4882a593Smuzhiyun "[BTCoex], Action algorithm = PAN(EDR)+HID\n");
1874*4882a593Smuzhiyun btc8821a1ant_action_pan_edr_hid(btcoexist);
1875*4882a593Smuzhiyun break;
1876*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
1877*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1878*4882a593Smuzhiyun "[BTCoex], Action algorithm = HID+A2DP+PAN\n");
1879*4882a593Smuzhiyun btc8821a1ant_action_hid_a2dp_pan_edr(btcoexist);
1880*4882a593Smuzhiyun break;
1881*4882a593Smuzhiyun case BT_8821A_1ANT_COEX_ALGO_HID_A2DP:
1882*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1883*4882a593Smuzhiyun "[BTCoex], Action algorithm = HID+A2DP\n");
1884*4882a593Smuzhiyun btc8821a1ant_action_hid_a2dp(btcoexist);
1885*4882a593Smuzhiyun break;
1886*4882a593Smuzhiyun default:
1887*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1888*4882a593Smuzhiyun "[BTCoex], Action algorithm = coexist All Off!!\n");
1889*4882a593Smuzhiyun /*btc8821a1ant_coex_all_off(btcoexist);*/
1890*4882a593Smuzhiyun break;
1891*4882a593Smuzhiyun }
1892*4882a593Smuzhiyun coex_dm->pre_algorithm = coex_dm->cur_algorithm;
1893*4882a593Smuzhiyun }
1894*4882a593Smuzhiyun }
1895*4882a593Smuzhiyun
btc8821a1ant_run_coexist_mechanism(struct btc_coexist * btcoexist)1896*4882a593Smuzhiyun static void btc8821a1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
1897*4882a593Smuzhiyun {
1898*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
1899*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1900*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false;
1901*4882a593Smuzhiyun bool increase_scan_dev_num = false;
1902*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
1903*4882a593Smuzhiyun u8 agg_buf_size = 5;
1904*4882a593Smuzhiyun u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
1905*4882a593Smuzhiyun u32 wifi_link_status = 0;
1906*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
1907*4882a593Smuzhiyun bool wifi_under_5g = false;
1908*4882a593Smuzhiyun
1909*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1910*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism()===>\n");
1911*4882a593Smuzhiyun
1912*4882a593Smuzhiyun if (btcoexist->manual_control) {
1913*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1914*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
1915*4882a593Smuzhiyun return;
1916*4882a593Smuzhiyun }
1917*4882a593Smuzhiyun
1918*4882a593Smuzhiyun if (btcoexist->stop_coex_dm) {
1919*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1920*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
1921*4882a593Smuzhiyun return;
1922*4882a593Smuzhiyun }
1923*4882a593Smuzhiyun
1924*4882a593Smuzhiyun if (coex_sta->under_ips) {
1925*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1926*4882a593Smuzhiyun "[BTCoex], wifi is under IPS !!!\n");
1927*4882a593Smuzhiyun return;
1928*4882a593Smuzhiyun }
1929*4882a593Smuzhiyun
1930*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
1931*4882a593Smuzhiyun if (wifi_under_5g) {
1932*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1933*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
1934*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
1935*4882a593Smuzhiyun return;
1936*4882a593Smuzhiyun }
1937*4882a593Smuzhiyun
1938*4882a593Smuzhiyun if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
1939*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1940*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
1941*4882a593Smuzhiyun increase_scan_dev_num = true;
1942*4882a593Smuzhiyun
1943*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
1944*4882a593Smuzhiyun &increase_scan_dev_num);
1945*4882a593Smuzhiyun
1946*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1947*4882a593Smuzhiyun &wifi_connected);
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
1950*4882a593Smuzhiyun &wifi_link_status);
1951*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
1952*4882a593Smuzhiyun if ((num_of_wifi_link >= 2) ||
1953*4882a593Smuzhiyun (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
1954*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1955*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1956*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
1957*4882a593Smuzhiyun btc8821a1ant_action_wifi_multi_port(btcoexist);
1958*4882a593Smuzhiyun return;
1959*4882a593Smuzhiyun }
1960*4882a593Smuzhiyun
1961*4882a593Smuzhiyun if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {
1962*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1963*4882a593Smuzhiyun } else {
1964*4882a593Smuzhiyun if (wifi_connected) {
1965*4882a593Smuzhiyun wifi_rssi_state =
1966*4882a593Smuzhiyun btc8821a1ant_wifi_rssi_state(btcoexist, 1, 2,
1967*4882a593Smuzhiyun 30, 0);
1968*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist,
1969*4882a593Smuzhiyun NORMAL_EXEC, 1, 1,
1970*4882a593Smuzhiyun 0, 1);
1971*4882a593Smuzhiyun } else {
1972*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC,
1973*4882a593Smuzhiyun 0, 0, 0, 0);
1974*4882a593Smuzhiyun }
1975*4882a593Smuzhiyun }
1976*4882a593Smuzhiyun
1977*4882a593Smuzhiyun if (bt_link_info->sco_exist) {
1978*4882a593Smuzhiyun bt_ctrl_agg_buf_size = true;
1979*4882a593Smuzhiyun agg_buf_size = 0x3;
1980*4882a593Smuzhiyun } else if (bt_link_info->hid_exist) {
1981*4882a593Smuzhiyun bt_ctrl_agg_buf_size = true;
1982*4882a593Smuzhiyun agg_buf_size = 0x5;
1983*4882a593Smuzhiyun } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {
1984*4882a593Smuzhiyun bt_ctrl_agg_buf_size = true;
1985*4882a593Smuzhiyun agg_buf_size = 0x8;
1986*4882a593Smuzhiyun }
1987*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1988*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
1989*4882a593Smuzhiyun
1990*4882a593Smuzhiyun btc8821a1ant_run_sw_coex_mech(btcoexist);
1991*4882a593Smuzhiyun
1992*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1993*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
1994*4882a593Smuzhiyun btc8821a1ant_action_bt_inquiry(btcoexist);
1995*4882a593Smuzhiyun return;
1996*4882a593Smuzhiyun } else if (bt_hs_on) {
1997*4882a593Smuzhiyun btc8821a1ant_action_hs(btcoexist);
1998*4882a593Smuzhiyun return;
1999*4882a593Smuzhiyun }
2000*4882a593Smuzhiyun
2001*4882a593Smuzhiyun if (!wifi_connected) {
2002*4882a593Smuzhiyun bool scan = false, link = false, roam = false;
2003*4882a593Smuzhiyun
2004*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2005*4882a593Smuzhiyun "[BTCoex], wifi is non connected-idle !!!\n");
2006*4882a593Smuzhiyun
2007*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2008*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2009*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2010*4882a593Smuzhiyun
2011*4882a593Smuzhiyun if (scan || link || roam) {
2012*4882a593Smuzhiyun if (scan)
2013*4882a593Smuzhiyun btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2014*4882a593Smuzhiyun else
2015*4882a593Smuzhiyun btc8821a1ant_action_wifi_not_connected_asso_auth(
2016*4882a593Smuzhiyun btcoexist);
2017*4882a593Smuzhiyun } else {
2018*4882a593Smuzhiyun btc8821a1ant_action_wifi_not_connected(btcoexist);
2019*4882a593Smuzhiyun }
2020*4882a593Smuzhiyun } else {
2021*4882a593Smuzhiyun /* wifi LPS/Busy */
2022*4882a593Smuzhiyun btc8821a1ant_action_wifi_connected(btcoexist);
2023*4882a593Smuzhiyun }
2024*4882a593Smuzhiyun }
2025*4882a593Smuzhiyun
btc8821a1ant_init_coex_dm(struct btc_coexist * btcoexist)2026*4882a593Smuzhiyun static void btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2027*4882a593Smuzhiyun {
2028*4882a593Smuzhiyun /* force to reset coex mechanism
2029*4882a593Smuzhiyun * sw all off
2030*4882a593Smuzhiyun */
2031*4882a593Smuzhiyun btc8821a1ant_sw_mechanism(btcoexist, false);
2032*4882a593Smuzhiyun
2033*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2034*4882a593Smuzhiyun }
2035*4882a593Smuzhiyun
btc8821a1ant_init_hw_config(struct btc_coexist * btcoexist,bool back_up,bool wifi_only)2036*4882a593Smuzhiyun static void btc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,
2037*4882a593Smuzhiyun bool back_up, bool wifi_only)
2038*4882a593Smuzhiyun {
2039*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2040*4882a593Smuzhiyun u8 u1_tmp = 0;
2041*4882a593Smuzhiyun bool wifi_under_5g = false;
2042*4882a593Smuzhiyun
2043*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2044*4882a593Smuzhiyun "[BTCoex], 1Ant Init HW Config!!\n");
2045*4882a593Smuzhiyun
2046*4882a593Smuzhiyun if (wifi_only)
2047*4882a593Smuzhiyun return;
2048*4882a593Smuzhiyun
2049*4882a593Smuzhiyun if (back_up) {
2050*4882a593Smuzhiyun coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
2051*4882a593Smuzhiyun 0x430);
2052*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
2053*4882a593Smuzhiyun 0x434);
2054*4882a593Smuzhiyun coex_dm->backup_retry_limit =
2055*4882a593Smuzhiyun btcoexist->btc_read_2byte(btcoexist, 0x42a);
2056*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time =
2057*4882a593Smuzhiyun btcoexist->btc_read_1byte(btcoexist, 0x456);
2058*4882a593Smuzhiyun }
2059*4882a593Smuzhiyun
2060*4882a593Smuzhiyun /* 0x790[5:0] = 0x5 */
2061*4882a593Smuzhiyun u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
2062*4882a593Smuzhiyun u1_tmp &= 0xc0;
2063*4882a593Smuzhiyun u1_tmp |= 0x5;
2064*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);
2065*4882a593Smuzhiyun
2066*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2067*4882a593Smuzhiyun
2068*4882a593Smuzhiyun /* Antenna config */
2069*4882a593Smuzhiyun if (wifi_under_5g)
2070*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2071*4882a593Smuzhiyun true, false);
2072*4882a593Smuzhiyun else
2073*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2074*4882a593Smuzhiyun true, false);
2075*4882a593Smuzhiyun /* PTA parameter */
2076*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2077*4882a593Smuzhiyun
2078*4882a593Smuzhiyun /* Enable counter statistics
2079*4882a593Smuzhiyun * 0x76e[3] =1, WLAN_Act control by PTA
2080*4882a593Smuzhiyun */
2081*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
2082*4882a593Smuzhiyun btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
2083*4882a593Smuzhiyun btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2084*4882a593Smuzhiyun }
2085*4882a593Smuzhiyun
2086*4882a593Smuzhiyun /**************************************************************
2087*4882a593Smuzhiyun * extern function start with ex_btc8821a1ant_
2088*4882a593Smuzhiyun **************************************************************/
ex_btc8821a1ant_init_hwconfig(struct btc_coexist * btcoexist,bool wifionly)2089*4882a593Smuzhiyun void ex_btc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist, bool wifionly)
2090*4882a593Smuzhiyun {
2091*4882a593Smuzhiyun btc8821a1ant_init_hw_config(btcoexist, true, wifionly);
2092*4882a593Smuzhiyun btcoexist->auto_report_1ant = true;
2093*4882a593Smuzhiyun }
2094*4882a593Smuzhiyun
ex_btc8821a1ant_init_coex_dm(struct btc_coexist * btcoexist)2095*4882a593Smuzhiyun void ex_btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
2096*4882a593Smuzhiyun {
2097*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2098*4882a593Smuzhiyun
2099*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2100*4882a593Smuzhiyun "[BTCoex], Coex Mechanism Init!!\n");
2101*4882a593Smuzhiyun
2102*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
2103*4882a593Smuzhiyun
2104*4882a593Smuzhiyun btc8821a1ant_init_coex_dm(btcoexist);
2105*4882a593Smuzhiyun
2106*4882a593Smuzhiyun btc8821a1ant_query_bt_info(btcoexist);
2107*4882a593Smuzhiyun }
2108*4882a593Smuzhiyun
ex_btc8821a1ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)2109*4882a593Smuzhiyun void ex_btc8821a1ant_display_coex_info(struct btc_coexist *btcoexist,
2110*4882a593Smuzhiyun struct seq_file *m)
2111*4882a593Smuzhiyun {
2112*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
2113*4882a593Smuzhiyun struct btc_stack_info *stack_info = &btcoexist->stack_info;
2114*4882a593Smuzhiyun struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2115*4882a593Smuzhiyun u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;
2116*4882a593Smuzhiyun u16 u2_tmp[4];
2117*4882a593Smuzhiyun u32 u4_tmp[4];
2118*4882a593Smuzhiyun bool roam = false, scan = false, link = false, wifi_under_5g = false;
2119*4882a593Smuzhiyun bool bt_hs_on = false, wifi_busy = false;
2120*4882a593Smuzhiyun long wifi_rssi = 0, bt_hs_rssi = 0;
2121*4882a593Smuzhiyun u32 wifi_bw, wifi_traffic_dir;
2122*4882a593Smuzhiyun u8 wifi_dot11_chnl, wifi_hs_chnl;
2123*4882a593Smuzhiyun u32 fw_ver = 0, bt_patch_ver = 0;
2124*4882a593Smuzhiyun
2125*4882a593Smuzhiyun seq_puts(m, "\n ============[BT Coexist info]============");
2126*4882a593Smuzhiyun
2127*4882a593Smuzhiyun if (btcoexist->manual_control) {
2128*4882a593Smuzhiyun seq_puts(m, "\n ============[Under Manual Control]============");
2129*4882a593Smuzhiyun seq_puts(m, "\n ==========================================");
2130*4882a593Smuzhiyun }
2131*4882a593Smuzhiyun if (btcoexist->stop_coex_dm) {
2132*4882a593Smuzhiyun seq_puts(m, "\n ============[Coex is STOPPED]============");
2133*4882a593Smuzhiyun seq_puts(m, "\n ==========================================");
2134*4882a593Smuzhiyun }
2135*4882a593Smuzhiyun
2136*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d/ %d",
2137*4882a593Smuzhiyun "Ant PG Num/ Ant Mech/ Ant Pos:",
2138*4882a593Smuzhiyun board_info->pg_ant_num,
2139*4882a593Smuzhiyun board_info->btdm_ant_num,
2140*4882a593Smuzhiyun board_info->btdm_ant_pos);
2141*4882a593Smuzhiyun
2142*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
2143*4882a593Smuzhiyun ((stack_info->profile_notified) ? "Yes" : "No"),
2144*4882a593Smuzhiyun stack_info->hci_version);
2145*4882a593Smuzhiyun
2146*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2147*4882a593Smuzhiyun &bt_patch_ver);
2148*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2149*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2150*4882a593Smuzhiyun "CoexVer/ FwVer/ PatchVer",
2151*4882a593Smuzhiyun glcoex_ver_date_8821a_1ant,
2152*4882a593Smuzhiyun glcoex_ver_8821a_1ant,
2153*4882a593Smuzhiyun fw_ver, bt_patch_ver,
2154*4882a593Smuzhiyun bt_patch_ver);
2155*4882a593Smuzhiyun
2156*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION,
2157*4882a593Smuzhiyun &bt_hs_on);
2158*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2159*4882a593Smuzhiyun &wifi_dot11_chnl);
2160*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL,
2161*4882a593Smuzhiyun &wifi_hs_chnl);
2162*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d / %d(%d)",
2163*4882a593Smuzhiyun "Dot11 channel / HsChnl(HsMode)",
2164*4882a593Smuzhiyun wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2165*4882a593Smuzhiyun
2166*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %3ph ",
2167*4882a593Smuzhiyun "H2C Wifi inform bt chnl Info",
2168*4882a593Smuzhiyun coex_dm->wifi_chnl_info);
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2171*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2172*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d", "Wifi rssi/ HS rssi",
2173*4882a593Smuzhiyun (int)wifi_rssi, (int)bt_hs_rssi);
2174*4882a593Smuzhiyun
2175*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2176*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2177*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2178*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
2179*4882a593Smuzhiyun link, roam, scan);
2180*4882a593Smuzhiyun
2181*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
2182*4882a593Smuzhiyun &wifi_under_5g);
2183*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
2184*4882a593Smuzhiyun &wifi_bw);
2185*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
2186*4882a593Smuzhiyun &wifi_busy);
2187*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2188*4882a593Smuzhiyun &wifi_traffic_dir);
2189*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",
2190*4882a593Smuzhiyun (wifi_under_5g ? "5G" : "2.4G"),
2191*4882a593Smuzhiyun ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2192*4882a593Smuzhiyun (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),
2193*4882a593Smuzhiyun ((!wifi_busy) ? "idle" :
2194*4882a593Smuzhiyun ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2195*4882a593Smuzhiyun "uplink" : "downlink")));
2196*4882a593Smuzhiyun seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2197*4882a593Smuzhiyun "BT [status/ rssi/ retryCnt]",
2198*4882a593Smuzhiyun ((coex_sta->bt_disabled) ? ("disabled") :
2199*4882a593Smuzhiyun ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2200*4882a593Smuzhiyun ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2201*4882a593Smuzhiyun coex_dm->bt_status) ?
2202*4882a593Smuzhiyun "non-connected idle" :
2203*4882a593Smuzhiyun ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
2204*4882a593Smuzhiyun coex_dm->bt_status) ?
2205*4882a593Smuzhiyun "connected-idle" : "busy")))),
2206*4882a593Smuzhiyun coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2207*4882a593Smuzhiyun
2208*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",
2209*4882a593Smuzhiyun bt_link_info->sco_exist,
2210*4882a593Smuzhiyun bt_link_info->hid_exist,
2211*4882a593Smuzhiyun bt_link_info->pan_exist,
2212*4882a593Smuzhiyun bt_link_info->a2dp_exist);
2213*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun bt_info_ext = coex_sta->bt_info_ext;
2216*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s",
2217*4882a593Smuzhiyun "BT Info A2DP rate",
2218*4882a593Smuzhiyun (bt_info_ext & BIT0) ?
2219*4882a593Smuzhiyun "Basic rate" : "EDR rate");
2220*4882a593Smuzhiyun
2221*4882a593Smuzhiyun for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {
2222*4882a593Smuzhiyun if (coex_sta->bt_info_c2h_cnt[i]) {
2223*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %7ph(%d)",
2224*4882a593Smuzhiyun glbt_info_src_8821a_1ant[i],
2225*4882a593Smuzhiyun coex_sta->bt_info_c2h[i],
2226*4882a593Smuzhiyun coex_sta->bt_info_c2h_cnt[i]);
2227*4882a593Smuzhiyun }
2228*4882a593Smuzhiyun }
2229*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2230*4882a593Smuzhiyun "PS state, IPS/LPS, (lps/rpwm)",
2231*4882a593Smuzhiyun ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2232*4882a593Smuzhiyun ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2233*4882a593Smuzhiyun btcoexist->bt_info.lps_val,
2234*4882a593Smuzhiyun btcoexist->bt_info.rpwm_val);
2235*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2236*4882a593Smuzhiyun
2237*4882a593Smuzhiyun if (!btcoexist->manual_control) {
2238*4882a593Smuzhiyun /* Sw mechanism*/
2239*4882a593Smuzhiyun seq_printf(m, "\n %-35s",
2240*4882a593Smuzhiyun "============[Sw mechanism]============");
2241*4882a593Smuzhiyun
2242*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d", "SM[LowPenaltyRA]",
2243*4882a593Smuzhiyun coex_dm->cur_low_penalty_ra);
2244*4882a593Smuzhiyun
2245*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2246*4882a593Smuzhiyun "DelBA/ BtCtrlAgg/ AggSize",
2247*4882a593Smuzhiyun (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2248*4882a593Smuzhiyun (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2249*4882a593Smuzhiyun btcoexist->bt_info.agg_buf_size);
2250*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask",
2251*4882a593Smuzhiyun btcoexist->bt_info.ra_mask);
2252*4882a593Smuzhiyun
2253*4882a593Smuzhiyun /* Fw mechanism */
2254*4882a593Smuzhiyun seq_printf(m, "\n %-35s",
2255*4882a593Smuzhiyun "============[Fw mechanism]============");
2256*4882a593Smuzhiyun
2257*4882a593Smuzhiyun ps_tdma_case = coex_dm->cur_ps_tdma;
2258*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
2259*4882a593Smuzhiyun "PS TDMA",
2260*4882a593Smuzhiyun coex_dm->ps_tdma_para,
2261*4882a593Smuzhiyun ps_tdma_case,
2262*4882a593Smuzhiyun coex_dm->auto_tdma_adjust);
2263*4882a593Smuzhiyun
2264*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x ",
2265*4882a593Smuzhiyun "Latest error condition(should be 0)",
2266*4882a593Smuzhiyun coex_dm->error_condition);
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d ", "IgnWlanAct",
2269*4882a593Smuzhiyun coex_dm->cur_ignore_wlan_act);
2270*4882a593Smuzhiyun }
2271*4882a593Smuzhiyun
2272*4882a593Smuzhiyun /* Hw setting */
2273*4882a593Smuzhiyun seq_printf(m, "\n %-35s", "============[Hw setting]============");
2274*4882a593Smuzhiyun
2275*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2276*4882a593Smuzhiyun "backup ARFR1/ARFR2/RL/AMaxTime",
2277*4882a593Smuzhiyun coex_dm->backup_arfr_cnt1,
2278*4882a593Smuzhiyun coex_dm->backup_arfr_cnt2,
2279*4882a593Smuzhiyun coex_dm->backup_retry_limit,
2280*4882a593Smuzhiyun coex_dm->backup_ampdu_max_time);
2281*4882a593Smuzhiyun
2282*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2283*4882a593Smuzhiyun u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2284*4882a593Smuzhiyun u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2285*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2286*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2287*4882a593Smuzhiyun "0x430/0x434/0x42a/0x456",
2288*4882a593Smuzhiyun u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);
2289*4882a593Smuzhiyun
2290*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2291*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);
2292*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",
2293*4882a593Smuzhiyun u1_tmp[0], (u4_tmp[0] & 0x3e000000) >> 25);
2294*4882a593Smuzhiyun
2295*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
2296*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x", "0x8db[6:5]",
2297*4882a593Smuzhiyun ((u1_tmp[0] & 0x60) >> 5));
2298*4882a593Smuzhiyun
2299*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);
2300*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2301*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2302*4882a593Smuzhiyun "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",
2303*4882a593Smuzhiyun (u4_tmp[0] & 0x30000000) >> 28,
2304*4882a593Smuzhiyun u4_tmp[0] & 0xff,
2305*4882a593Smuzhiyun u1_tmp[0] & 0x3);
2306*4882a593Smuzhiyun
2307*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2308*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2309*4882a593Smuzhiyun u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2310*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2311*4882a593Smuzhiyun "0x40/0x4c[24:23]/0x64[0]",
2312*4882a593Smuzhiyun u1_tmp[0], ((u4_tmp[0] & 0x01800000) >> 23),
2313*4882a593Smuzhiyun u1_tmp[1] & 0x1);
2314*4882a593Smuzhiyun
2315*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2316*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2317*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522",
2318*4882a593Smuzhiyun u4_tmp[0], u1_tmp[0]);
2319*4882a593Smuzhiyun
2320*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2321*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)",
2322*4882a593Smuzhiyun u4_tmp[0] & 0xff);
2323*4882a593Smuzhiyun
2324*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
2325*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);
2326*4882a593Smuzhiyun u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2327*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",
2328*4882a593Smuzhiyun u4_tmp[0], (u1_tmp[0] << 8) + u1_tmp[1]);
2329*4882a593Smuzhiyun
2330*4882a593Smuzhiyun u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2331*4882a593Smuzhiyun u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2332*4882a593Smuzhiyun u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2333*4882a593Smuzhiyun u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
2334*4882a593Smuzhiyun seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2335*4882a593Smuzhiyun "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
2336*4882a593Smuzhiyun u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
2337*4882a593Smuzhiyun
2338*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d", "0x770(high-pri rx/tx)",
2339*4882a593Smuzhiyun coex_sta->high_priority_rx, coex_sta->high_priority_tx);
2340*4882a593Smuzhiyun seq_printf(m, "\n %-35s = %d/ %d", "0x774(low-pri rx/tx)",
2341*4882a593Smuzhiyun coex_sta->low_priority_rx, coex_sta->low_priority_tx);
2342*4882a593Smuzhiyun if (btcoexist->auto_report_1ant)
2343*4882a593Smuzhiyun btc8821a1ant_monitor_bt_ctr(btcoexist);
2344*4882a593Smuzhiyun btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2345*4882a593Smuzhiyun }
2346*4882a593Smuzhiyun
ex_btc8821a1ant_ips_notify(struct btc_coexist * btcoexist,u8 type)2347*4882a593Smuzhiyun void ex_btc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2348*4882a593Smuzhiyun {
2349*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2350*4882a593Smuzhiyun bool wifi_under_5g = false;
2351*4882a593Smuzhiyun
2352*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2353*4882a593Smuzhiyun return;
2354*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2355*4882a593Smuzhiyun if (wifi_under_5g) {
2356*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2357*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2358*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2359*4882a593Smuzhiyun return;
2360*4882a593Smuzhiyun }
2361*4882a593Smuzhiyun
2362*4882a593Smuzhiyun if (BTC_IPS_ENTER == type) {
2363*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2364*4882a593Smuzhiyun "[BTCoex], IPS ENTER notify\n");
2365*4882a593Smuzhiyun coex_sta->under_ips = true;
2366*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist,
2367*4882a593Smuzhiyun BTC_ANT_PATH_BT, false, true);
2368*4882a593Smuzhiyun /* set PTA control */
2369*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2370*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist,
2371*4882a593Smuzhiyun NORMAL_EXEC, 0);
2372*4882a593Smuzhiyun } else if (BTC_IPS_LEAVE == type) {
2373*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2374*4882a593Smuzhiyun "[BTCoex], IPS LEAVE notify\n");
2375*4882a593Smuzhiyun coex_sta->under_ips = false;
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun btc8821a1ant_init_hw_config(btcoexist, false, false);
2378*4882a593Smuzhiyun btc8821a1ant_init_coex_dm(btcoexist);
2379*4882a593Smuzhiyun btc8821a1ant_query_bt_info(btcoexist);
2380*4882a593Smuzhiyun }
2381*4882a593Smuzhiyun }
2382*4882a593Smuzhiyun
ex_btc8821a1ant_lps_notify(struct btc_coexist * btcoexist,u8 type)2383*4882a593Smuzhiyun void ex_btc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2384*4882a593Smuzhiyun {
2385*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2386*4882a593Smuzhiyun
2387*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2388*4882a593Smuzhiyun return;
2389*4882a593Smuzhiyun
2390*4882a593Smuzhiyun if (BTC_LPS_ENABLE == type) {
2391*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2392*4882a593Smuzhiyun "[BTCoex], LPS ENABLE notify\n");
2393*4882a593Smuzhiyun coex_sta->under_lps = true;
2394*4882a593Smuzhiyun } else if (BTC_LPS_DISABLE == type) {
2395*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2396*4882a593Smuzhiyun "[BTCoex], LPS DISABLE notify\n");
2397*4882a593Smuzhiyun coex_sta->under_lps = false;
2398*4882a593Smuzhiyun }
2399*4882a593Smuzhiyun }
2400*4882a593Smuzhiyun
ex_btc8821a1ant_scan_notify(struct btc_coexist * btcoexist,u8 type)2401*4882a593Smuzhiyun void ex_btc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2402*4882a593Smuzhiyun {
2403*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2404*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false;
2405*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
2406*4882a593Smuzhiyun bool wifi_under_5g = false;
2407*4882a593Smuzhiyun u32 wifi_link_status = 0;
2408*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2409*4882a593Smuzhiyun u8 agg_buf_size = 5;
2410*4882a593Smuzhiyun
2411*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2412*4882a593Smuzhiyun return;
2413*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2414*4882a593Smuzhiyun if (wifi_under_5g) {
2415*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2416*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2417*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2418*4882a593Smuzhiyun return;
2419*4882a593Smuzhiyun }
2420*4882a593Smuzhiyun
2421*4882a593Smuzhiyun if (type == BTC_SCAN_START) {
2422*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
2423*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2424*4882a593Smuzhiyun "[BTCoex], SCAN START notify\n");
2425*4882a593Smuzhiyun
2426*4882a593Smuzhiyun /* Force antenna setup for no scan result issue */
2427*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2428*4882a593Smuzhiyun } else {
2429*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
2430*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2431*4882a593Smuzhiyun "[BTCoex], SCAN FINISH notify\n");
2432*4882a593Smuzhiyun }
2433*4882a593Smuzhiyun
2434*4882a593Smuzhiyun if (coex_sta->bt_disabled)
2435*4882a593Smuzhiyun return;
2436*4882a593Smuzhiyun
2437*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
2438*4882a593Smuzhiyun BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2439*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
2440*4882a593Smuzhiyun BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2441*4882a593Smuzhiyun
2442*4882a593Smuzhiyun btc8821a1ant_query_bt_info(btcoexist);
2443*4882a593Smuzhiyun
2444*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2445*4882a593Smuzhiyun &wifi_link_status);
2446*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
2447*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
2448*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2449*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2450*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2451*4882a593Smuzhiyun btc8821a1ant_action_wifi_multi_port(btcoexist);
2452*4882a593Smuzhiyun return;
2453*4882a593Smuzhiyun }
2454*4882a593Smuzhiyun
2455*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2456*4882a593Smuzhiyun btc8821a1ant_action_bt_inquiry(btcoexist);
2457*4882a593Smuzhiyun return;
2458*4882a593Smuzhiyun } else if (bt_hs_on) {
2459*4882a593Smuzhiyun btc8821a1ant_action_hs(btcoexist);
2460*4882a593Smuzhiyun return;
2461*4882a593Smuzhiyun }
2462*4882a593Smuzhiyun
2463*4882a593Smuzhiyun if (BTC_SCAN_START == type) {
2464*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2465*4882a593Smuzhiyun "[BTCoex], SCAN START notify\n");
2466*4882a593Smuzhiyun if (!wifi_connected) {
2467*4882a593Smuzhiyun /* non-connected scan */
2468*4882a593Smuzhiyun btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2469*4882a593Smuzhiyun } else {
2470*4882a593Smuzhiyun /* wifi is connected */
2471*4882a593Smuzhiyun btc8821a1ant_action_wifi_connected_scan(btcoexist);
2472*4882a593Smuzhiyun }
2473*4882a593Smuzhiyun } else if (BTC_SCAN_FINISH == type) {
2474*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2475*4882a593Smuzhiyun "[BTCoex], SCAN FINISH notify\n");
2476*4882a593Smuzhiyun if (!wifi_connected) {
2477*4882a593Smuzhiyun /* non-connected scan */
2478*4882a593Smuzhiyun btc8821a1ant_action_wifi_not_connected(btcoexist);
2479*4882a593Smuzhiyun } else {
2480*4882a593Smuzhiyun btc8821a1ant_action_wifi_connected(btcoexist);
2481*4882a593Smuzhiyun }
2482*4882a593Smuzhiyun }
2483*4882a593Smuzhiyun }
2484*4882a593Smuzhiyun
ex_btc8821a1ant_connect_notify(struct btc_coexist * btcoexist,u8 type)2485*4882a593Smuzhiyun void ex_btc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2486*4882a593Smuzhiyun {
2487*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2488*4882a593Smuzhiyun bool wifi_connected = false, bt_hs_on = false;
2489*4882a593Smuzhiyun u32 wifi_link_status = 0;
2490*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2491*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
2492*4882a593Smuzhiyun bool wifi_under_5g = false;
2493*4882a593Smuzhiyun u8 agg_buf_size = 5;
2494*4882a593Smuzhiyun
2495*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2496*4882a593Smuzhiyun coex_sta->bt_disabled)
2497*4882a593Smuzhiyun return;
2498*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2499*4882a593Smuzhiyun if (wifi_under_5g) {
2500*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2501*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2502*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2503*4882a593Smuzhiyun return;
2504*4882a593Smuzhiyun }
2505*4882a593Smuzhiyun
2506*4882a593Smuzhiyun if (type == BTC_ASSOCIATE_START) {
2507*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
2508*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2509*4882a593Smuzhiyun "[BTCoex], CONNECT START notify\n");
2510*4882a593Smuzhiyun coex_dm->arp_cnt = 0;
2511*4882a593Smuzhiyun } else {
2512*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
2513*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2514*4882a593Smuzhiyun "[BTCoex], CONNECT FINISH notify\n");
2515*4882a593Smuzhiyun coex_dm->arp_cnt = 0;
2516*4882a593Smuzhiyun }
2517*4882a593Smuzhiyun
2518*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2519*4882a593Smuzhiyun &wifi_link_status);
2520*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
2521*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
2522*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2523*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2524*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2525*4882a593Smuzhiyun btc8821a1ant_action_wifi_multi_port(btcoexist);
2526*4882a593Smuzhiyun return;
2527*4882a593Smuzhiyun }
2528*4882a593Smuzhiyun
2529*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2530*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2531*4882a593Smuzhiyun btc8821a1ant_action_bt_inquiry(btcoexist);
2532*4882a593Smuzhiyun return;
2533*4882a593Smuzhiyun } else if (bt_hs_on) {
2534*4882a593Smuzhiyun btc8821a1ant_action_hs(btcoexist);
2535*4882a593Smuzhiyun return;
2536*4882a593Smuzhiyun }
2537*4882a593Smuzhiyun
2538*4882a593Smuzhiyun if (BTC_ASSOCIATE_START == type) {
2539*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2540*4882a593Smuzhiyun "[BTCoex], CONNECT START notify\n");
2541*4882a593Smuzhiyun btc8821a1ant_act_wifi_not_conn_scan(btcoexist);
2542*4882a593Smuzhiyun } else if (BTC_ASSOCIATE_FINISH == type) {
2543*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2544*4882a593Smuzhiyun "[BTCoex], CONNECT FINISH notify\n");
2545*4882a593Smuzhiyun
2546*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
2547*4882a593Smuzhiyun BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2548*4882a593Smuzhiyun if (!wifi_connected) {
2549*4882a593Smuzhiyun /* non-connected scan */
2550*4882a593Smuzhiyun btc8821a1ant_action_wifi_not_connected(btcoexist);
2551*4882a593Smuzhiyun } else {
2552*4882a593Smuzhiyun btc8821a1ant_action_wifi_connected(btcoexist);
2553*4882a593Smuzhiyun }
2554*4882a593Smuzhiyun }
2555*4882a593Smuzhiyun }
2556*4882a593Smuzhiyun
ex_btc8821a1ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)2557*4882a593Smuzhiyun void ex_btc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
2558*4882a593Smuzhiyun u8 type)
2559*4882a593Smuzhiyun {
2560*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2561*4882a593Smuzhiyun u8 h2c_parameter[3] = {0};
2562*4882a593Smuzhiyun u32 wifi_bw;
2563*4882a593Smuzhiyun u8 wifi_central_chnl;
2564*4882a593Smuzhiyun bool wifi_under_5g = false;
2565*4882a593Smuzhiyun
2566*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2567*4882a593Smuzhiyun coex_sta->bt_disabled)
2568*4882a593Smuzhiyun return;
2569*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2570*4882a593Smuzhiyun if (wifi_under_5g) {
2571*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2572*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2573*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2574*4882a593Smuzhiyun return;
2575*4882a593Smuzhiyun }
2576*4882a593Smuzhiyun
2577*4882a593Smuzhiyun if (BTC_MEDIA_CONNECT == type) {
2578*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2579*4882a593Smuzhiyun "[BTCoex], MEDIA connect notify\n");
2580*4882a593Smuzhiyun } else {
2581*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2582*4882a593Smuzhiyun "[BTCoex], MEDIA disconnect notify\n");
2583*4882a593Smuzhiyun coex_dm->arp_cnt = 0;
2584*4882a593Smuzhiyun }
2585*4882a593Smuzhiyun
2586*4882a593Smuzhiyun /* only 2.4G we need to inform bt the chnl mask */
2587*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
2588*4882a593Smuzhiyun BTC_GET_U1_WIFI_CENTRAL_CHNL,
2589*4882a593Smuzhiyun &wifi_central_chnl);
2590*4882a593Smuzhiyun if ((type == BTC_MEDIA_CONNECT) &&
2591*4882a593Smuzhiyun (wifi_central_chnl <= 14)) {
2592*4882a593Smuzhiyun h2c_parameter[0] = 0x0;
2593*4882a593Smuzhiyun h2c_parameter[1] = wifi_central_chnl;
2594*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2595*4882a593Smuzhiyun if (wifi_bw == BTC_WIFI_BW_HT40)
2596*4882a593Smuzhiyun h2c_parameter[2] = 0x30;
2597*4882a593Smuzhiyun else
2598*4882a593Smuzhiyun h2c_parameter[2] = 0x20;
2599*4882a593Smuzhiyun }
2600*4882a593Smuzhiyun
2601*4882a593Smuzhiyun coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2602*4882a593Smuzhiyun coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2603*4882a593Smuzhiyun coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2604*4882a593Smuzhiyun
2605*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2606*4882a593Smuzhiyun "[BTCoex], FW write 0x66 = 0x%x\n",
2607*4882a593Smuzhiyun h2c_parameter[0] << 16 |
2608*4882a593Smuzhiyun h2c_parameter[1] << 8 |
2609*4882a593Smuzhiyun h2c_parameter[2]);
2610*4882a593Smuzhiyun
2611*4882a593Smuzhiyun btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2612*4882a593Smuzhiyun }
2613*4882a593Smuzhiyun
ex_btc8821a1ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)2614*4882a593Smuzhiyun void ex_btc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
2615*4882a593Smuzhiyun u8 type)
2616*4882a593Smuzhiyun {
2617*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2618*4882a593Smuzhiyun bool bt_hs_on = false;
2619*4882a593Smuzhiyun bool bt_ctrl_agg_buf_size = false;
2620*4882a593Smuzhiyun bool wifi_under_5g = false;
2621*4882a593Smuzhiyun u32 wifi_link_status = 0;
2622*4882a593Smuzhiyun u32 num_of_wifi_link = 0;
2623*4882a593Smuzhiyun u8 agg_buf_size = 5;
2624*4882a593Smuzhiyun
2625*4882a593Smuzhiyun if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2626*4882a593Smuzhiyun coex_sta->bt_disabled)
2627*4882a593Smuzhiyun return;
2628*4882a593Smuzhiyun
2629*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2630*4882a593Smuzhiyun if (wifi_under_5g) {
2631*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2632*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2633*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2634*4882a593Smuzhiyun return;
2635*4882a593Smuzhiyun }
2636*4882a593Smuzhiyun
2637*4882a593Smuzhiyun if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2638*4882a593Smuzhiyun type == BTC_PACKET_ARP) {
2639*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = true;
2640*4882a593Smuzhiyun
2641*4882a593Smuzhiyun if (type == BTC_PACKET_ARP) {
2642*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2643*4882a593Smuzhiyun "[BTCoex], specific Packet ARP notify\n");
2644*4882a593Smuzhiyun } else {
2645*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2646*4882a593Smuzhiyun "[BTCoex], specific Packet DHCP or EAPOL notify\n");
2647*4882a593Smuzhiyun }
2648*4882a593Smuzhiyun } else {
2649*4882a593Smuzhiyun coex_sta->wifi_is_high_pri_task = false;
2650*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2651*4882a593Smuzhiyun "[BTCoex], specific Packet [Type = %d] notify\n",
2652*4882a593Smuzhiyun type);
2653*4882a593Smuzhiyun }
2654*4882a593Smuzhiyun
2655*4882a593Smuzhiyun coex_sta->special_pkt_period_cnt = 0;
2656*4882a593Smuzhiyun
2657*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2658*4882a593Smuzhiyun &wifi_link_status);
2659*4882a593Smuzhiyun num_of_wifi_link = wifi_link_status >> 16;
2660*4882a593Smuzhiyun if (num_of_wifi_link >= 2) {
2661*4882a593Smuzhiyun btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2662*4882a593Smuzhiyun btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2663*4882a593Smuzhiyun bt_ctrl_agg_buf_size, agg_buf_size);
2664*4882a593Smuzhiyun btc8821a1ant_action_wifi_multi_port(btcoexist);
2665*4882a593Smuzhiyun return;
2666*4882a593Smuzhiyun }
2667*4882a593Smuzhiyun
2668*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2669*4882a593Smuzhiyun if (coex_sta->c2h_bt_inquiry_page) {
2670*4882a593Smuzhiyun btc8821a1ant_action_bt_inquiry(btcoexist);
2671*4882a593Smuzhiyun return;
2672*4882a593Smuzhiyun } else if (bt_hs_on) {
2673*4882a593Smuzhiyun btc8821a1ant_action_hs(btcoexist);
2674*4882a593Smuzhiyun return;
2675*4882a593Smuzhiyun }
2676*4882a593Smuzhiyun
2677*4882a593Smuzhiyun if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
2678*4882a593Smuzhiyun type == BTC_PACKET_ARP) {
2679*4882a593Smuzhiyun if (type == BTC_PACKET_ARP) {
2680*4882a593Smuzhiyun coex_dm->arp_cnt++;
2681*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2682*4882a593Smuzhiyun "[BTCoex], ARP Packet Count = %d\n",
2683*4882a593Smuzhiyun coex_dm->arp_cnt);
2684*4882a593Smuzhiyun if (coex_dm->arp_cnt >= 10)
2685*4882a593Smuzhiyun /* if APR PKT > 10 after connect, do not go to
2686*4882a593Smuzhiyun * btc8821a1ant_act_wifi_conn_sp_pkt
2687*4882a593Smuzhiyun */
2688*4882a593Smuzhiyun return;
2689*4882a593Smuzhiyun }
2690*4882a593Smuzhiyun
2691*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2692*4882a593Smuzhiyun "[BTCoex], special Packet(%d) notify\n", type);
2693*4882a593Smuzhiyun btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);
2694*4882a593Smuzhiyun }
2695*4882a593Smuzhiyun }
2696*4882a593Smuzhiyun
ex_btc8821a1ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)2697*4882a593Smuzhiyun void ex_btc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
2698*4882a593Smuzhiyun u8 *tmp_buf, u8 length)
2699*4882a593Smuzhiyun {
2700*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2701*4882a593Smuzhiyun u8 i;
2702*4882a593Smuzhiyun u8 bt_info = 0;
2703*4882a593Smuzhiyun u8 rsp_source = 0;
2704*4882a593Smuzhiyun bool wifi_connected = false;
2705*4882a593Smuzhiyun bool bt_busy = false;
2706*4882a593Smuzhiyun bool wifi_under_5g = false;
2707*4882a593Smuzhiyun
2708*4882a593Smuzhiyun coex_sta->c2h_bt_info_req_sent = false;
2709*4882a593Smuzhiyun
2710*4882a593Smuzhiyun btcoexist->btc_get(btcoexist,
2711*4882a593Smuzhiyun BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2712*4882a593Smuzhiyun
2713*4882a593Smuzhiyun rsp_source = tmp_buf[0] & 0xf;
2714*4882a593Smuzhiyun if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)
2715*4882a593Smuzhiyun rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;
2716*4882a593Smuzhiyun coex_sta->bt_info_c2h_cnt[rsp_source]++;
2717*4882a593Smuzhiyun
2718*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2719*4882a593Smuzhiyun "[BTCoex], Bt info[%d], length = %d, hex data = [",
2720*4882a593Smuzhiyun rsp_source, length);
2721*4882a593Smuzhiyun for (i = 0; i < length; i++) {
2722*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
2723*4882a593Smuzhiyun if (i == 1)
2724*4882a593Smuzhiyun bt_info = tmp_buf[i];
2725*4882a593Smuzhiyun if (i == length - 1) {
2726*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2727*4882a593Smuzhiyun "0x%02x]\n", tmp_buf[i]);
2728*4882a593Smuzhiyun } else {
2729*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2730*4882a593Smuzhiyun "0x%02x, ", tmp_buf[i]);
2731*4882a593Smuzhiyun }
2732*4882a593Smuzhiyun }
2733*4882a593Smuzhiyun
2734*4882a593Smuzhiyun if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {
2735*4882a593Smuzhiyun /* [3:0] */
2736*4882a593Smuzhiyun coex_sta->bt_retry_cnt =
2737*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
2738*4882a593Smuzhiyun
2739*4882a593Smuzhiyun coex_sta->bt_rssi =
2740*4882a593Smuzhiyun coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
2741*4882a593Smuzhiyun
2742*4882a593Smuzhiyun coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
2743*4882a593Smuzhiyun
2744*4882a593Smuzhiyun coex_sta->bt_tx_rx_mask =
2745*4882a593Smuzhiyun (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
2746*4882a593Smuzhiyun btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
2747*4882a593Smuzhiyun &coex_sta->bt_tx_rx_mask);
2748*4882a593Smuzhiyun if (!coex_sta->bt_tx_rx_mask) {
2749*4882a593Smuzhiyun /* BT into is responded by BT FW and BT RF REG 0x3C !=
2750*4882a593Smuzhiyun * 0x15 => Need to switch BT TRx Mask
2751*4882a593Smuzhiyun */
2752*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2753*4882a593Smuzhiyun "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
2754*4882a593Smuzhiyun btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
2755*4882a593Smuzhiyun 0x3c, 0x15);
2756*4882a593Smuzhiyun }
2757*4882a593Smuzhiyun
2758*4882a593Smuzhiyun /* Here we need to resend some wifi info to BT
2759*4882a593Smuzhiyun * because bt is reset and lost the info
2760*4882a593Smuzhiyun */
2761*4882a593Smuzhiyun if (coex_sta->bt_info_ext & BIT1) {
2762*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2763*4882a593Smuzhiyun "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
2764*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2765*4882a593Smuzhiyun &wifi_connected);
2766*4882a593Smuzhiyun if (wifi_connected) {
2767*4882a593Smuzhiyun ex_btc8821a1ant_media_status_notify(btcoexist,
2768*4882a593Smuzhiyun BTC_MEDIA_CONNECT);
2769*4882a593Smuzhiyun } else {
2770*4882a593Smuzhiyun ex_btc8821a1ant_media_status_notify(btcoexist,
2771*4882a593Smuzhiyun BTC_MEDIA_DISCONNECT);
2772*4882a593Smuzhiyun }
2773*4882a593Smuzhiyun }
2774*4882a593Smuzhiyun
2775*4882a593Smuzhiyun if ((coex_sta->bt_info_ext & BIT3) && !wifi_under_5g) {
2776*4882a593Smuzhiyun if (!btcoexist->manual_control &&
2777*4882a593Smuzhiyun !btcoexist->stop_coex_dm) {
2778*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2779*4882a593Smuzhiyun "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
2780*4882a593Smuzhiyun btc8821a1ant_ignore_wlan_act(btcoexist,
2781*4882a593Smuzhiyun FORCE_EXEC,
2782*4882a593Smuzhiyun false);
2783*4882a593Smuzhiyun }
2784*4882a593Smuzhiyun }
2785*4882a593Smuzhiyun }
2786*4882a593Smuzhiyun
2787*4882a593Smuzhiyun /* check BIT2 first ==> check if bt is under inquiry or page scan */
2788*4882a593Smuzhiyun if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)
2789*4882a593Smuzhiyun coex_sta->c2h_bt_inquiry_page = true;
2790*4882a593Smuzhiyun else
2791*4882a593Smuzhiyun coex_sta->c2h_bt_inquiry_page = false;
2792*4882a593Smuzhiyun
2793*4882a593Smuzhiyun /* set link exist status */
2794*4882a593Smuzhiyun if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2795*4882a593Smuzhiyun coex_sta->bt_link_exist = false;
2796*4882a593Smuzhiyun coex_sta->pan_exist = false;
2797*4882a593Smuzhiyun coex_sta->a2dp_exist = false;
2798*4882a593Smuzhiyun coex_sta->hid_exist = false;
2799*4882a593Smuzhiyun coex_sta->sco_exist = false;
2800*4882a593Smuzhiyun } else {
2801*4882a593Smuzhiyun /* connection exists */
2802*4882a593Smuzhiyun coex_sta->bt_link_exist = true;
2803*4882a593Smuzhiyun if (bt_info & BT_INFO_8821A_1ANT_B_FTP)
2804*4882a593Smuzhiyun coex_sta->pan_exist = true;
2805*4882a593Smuzhiyun else
2806*4882a593Smuzhiyun coex_sta->pan_exist = false;
2807*4882a593Smuzhiyun if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)
2808*4882a593Smuzhiyun coex_sta->a2dp_exist = true;
2809*4882a593Smuzhiyun else
2810*4882a593Smuzhiyun coex_sta->a2dp_exist = false;
2811*4882a593Smuzhiyun if (bt_info & BT_INFO_8821A_1ANT_B_HID)
2812*4882a593Smuzhiyun coex_sta->hid_exist = true;
2813*4882a593Smuzhiyun else
2814*4882a593Smuzhiyun coex_sta->hid_exist = false;
2815*4882a593Smuzhiyun if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)
2816*4882a593Smuzhiyun coex_sta->sco_exist = true;
2817*4882a593Smuzhiyun else
2818*4882a593Smuzhiyun coex_sta->sco_exist = false;
2819*4882a593Smuzhiyun }
2820*4882a593Smuzhiyun
2821*4882a593Smuzhiyun btc8821a1ant_update_bt_link_info(btcoexist);
2822*4882a593Smuzhiyun
2823*4882a593Smuzhiyun /* mask profile bit for connect-ilde identification
2824*4882a593Smuzhiyun * (for CSR case: A2DP idle --> 0x41)
2825*4882a593Smuzhiyun */
2826*4882a593Smuzhiyun bt_info = bt_info & 0x1f;
2827*4882a593Smuzhiyun
2828*4882a593Smuzhiyun if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {
2829*4882a593Smuzhiyun coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
2830*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2831*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
2832*4882a593Smuzhiyun } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {
2833*4882a593Smuzhiyun /* connection exists but no busy */
2834*4882a593Smuzhiyun coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;
2835*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2836*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
2837*4882a593Smuzhiyun } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||
2838*4882a593Smuzhiyun (bt_info & BT_INFO_8821A_1ANT_B_SCO_BUSY)) {
2839*4882a593Smuzhiyun coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;
2840*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2841*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
2842*4882a593Smuzhiyun } else if (bt_info & BT_INFO_8821A_1ANT_B_ACL_BUSY) {
2843*4882a593Smuzhiyun if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
2844*4882a593Smuzhiyun coex_dm->auto_tdma_adjust = false;
2845*4882a593Smuzhiyun coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;
2846*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2847*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
2848*4882a593Smuzhiyun } else {
2849*4882a593Smuzhiyun coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;
2850*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2851*4882a593Smuzhiyun "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
2852*4882a593Smuzhiyun }
2853*4882a593Smuzhiyun
2854*4882a593Smuzhiyun if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
2855*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2856*4882a593Smuzhiyun (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
2857*4882a593Smuzhiyun bt_busy = true;
2858*4882a593Smuzhiyun else
2859*4882a593Smuzhiyun bt_busy = false;
2860*4882a593Smuzhiyun btcoexist->btc_set(btcoexist,
2861*4882a593Smuzhiyun BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2862*4882a593Smuzhiyun
2863*4882a593Smuzhiyun btc8821a1ant_run_coexist_mechanism(btcoexist);
2864*4882a593Smuzhiyun }
2865*4882a593Smuzhiyun
ex_btc8821a1ant_halt_notify(struct btc_coexist * btcoexist)2866*4882a593Smuzhiyun void ex_btc8821a1ant_halt_notify(struct btc_coexist *btcoexist)
2867*4882a593Smuzhiyun {
2868*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2869*4882a593Smuzhiyun bool wifi_under_5g = false;
2870*4882a593Smuzhiyun
2871*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2872*4882a593Smuzhiyun "[BTCoex], Halt notify\n");
2873*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2874*4882a593Smuzhiyun if (wifi_under_5g) {
2875*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2876*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2877*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2878*4882a593Smuzhiyun return;
2879*4882a593Smuzhiyun }
2880*4882a593Smuzhiyun
2881*4882a593Smuzhiyun
2882*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
2883*4882a593Smuzhiyun
2884*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
2885*4882a593Smuzhiyun btc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
2886*4882a593Smuzhiyun
2887*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2888*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
2889*4882a593Smuzhiyun
2890*4882a593Smuzhiyun ex_btc8821a1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
2891*4882a593Smuzhiyun }
2892*4882a593Smuzhiyun
ex_btc8821a1ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)2893*4882a593Smuzhiyun void ex_btc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
2894*4882a593Smuzhiyun {
2895*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2896*4882a593Smuzhiyun bool wifi_under_5g = false;
2897*4882a593Smuzhiyun
2898*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2899*4882a593Smuzhiyun if (wifi_under_5g) {
2900*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2901*4882a593Smuzhiyun "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
2902*4882a593Smuzhiyun btc8821a1ant_coex_under_5g(btcoexist);
2903*4882a593Smuzhiyun return;
2904*4882a593Smuzhiyun }
2905*4882a593Smuzhiyun
2906*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2907*4882a593Smuzhiyun "[BTCoex], Pnp notify\n");
2908*4882a593Smuzhiyun
2909*4882a593Smuzhiyun if (BTC_WIFI_PNP_SLEEP == pnp_state) {
2910*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2911*4882a593Smuzhiyun "[BTCoex], Pnp notify to SLEEP\n");
2912*4882a593Smuzhiyun /* BT should clear UnderIPS/UnderLPS state to avoid mismatch
2913*4882a593Smuzhiyun * state after wakeup.
2914*4882a593Smuzhiyun */
2915*4882a593Smuzhiyun coex_sta->under_ips = false;
2916*4882a593Smuzhiyun coex_sta->under_lps = false;
2917*4882a593Smuzhiyun btcoexist->stop_coex_dm = true;
2918*4882a593Smuzhiyun btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2919*4882a593Smuzhiyun 0x0, 0x0);
2920*4882a593Smuzhiyun btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2921*4882a593Smuzhiyun btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2922*4882a593Smuzhiyun btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false,
2923*4882a593Smuzhiyun true);
2924*4882a593Smuzhiyun } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
2925*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2926*4882a593Smuzhiyun "[BTCoex], Pnp notify to WAKE UP\n");
2927*4882a593Smuzhiyun btcoexist->stop_coex_dm = false;
2928*4882a593Smuzhiyun btc8821a1ant_init_hw_config(btcoexist, false, false);
2929*4882a593Smuzhiyun btc8821a1ant_init_coex_dm(btcoexist);
2930*4882a593Smuzhiyun btc8821a1ant_query_bt_info(btcoexist);
2931*4882a593Smuzhiyun }
2932*4882a593Smuzhiyun }
2933*4882a593Smuzhiyun
ex_btc8821a1ant_periodical(struct btc_coexist * btcoexist)2934*4882a593Smuzhiyun void ex_btc8821a1ant_periodical(struct btc_coexist *btcoexist)
2935*4882a593Smuzhiyun {
2936*4882a593Smuzhiyun struct rtl_priv *rtlpriv = btcoexist->adapter;
2937*4882a593Smuzhiyun static u8 dis_ver_info_cnt;
2938*4882a593Smuzhiyun u32 fw_ver = 0, bt_patch_ver = 0;
2939*4882a593Smuzhiyun struct btc_board_info *board_info = &btcoexist->board_info;
2940*4882a593Smuzhiyun struct btc_stack_info *stack_info = &btcoexist->stack_info;
2941*4882a593Smuzhiyun
2942*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2943*4882a593Smuzhiyun "[BTCoex], ==========================Periodical===========================\n");
2944*4882a593Smuzhiyun
2945*4882a593Smuzhiyun if (dis_ver_info_cnt <= 5) {
2946*4882a593Smuzhiyun dis_ver_info_cnt += 1;
2947*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2948*4882a593Smuzhiyun "[BTCoex], ****************************************************************\n");
2949*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2950*4882a593Smuzhiyun "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
2951*4882a593Smuzhiyun board_info->pg_ant_num,
2952*4882a593Smuzhiyun board_info->btdm_ant_num,
2953*4882a593Smuzhiyun board_info->btdm_ant_pos);
2954*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2955*4882a593Smuzhiyun "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
2956*4882a593Smuzhiyun stack_info->profile_notified ? "Yes" : "No",
2957*4882a593Smuzhiyun stack_info->hci_version);
2958*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2959*4882a593Smuzhiyun &bt_patch_ver);
2960*4882a593Smuzhiyun btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2961*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2962*4882a593Smuzhiyun "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
2963*4882a593Smuzhiyun glcoex_ver_date_8821a_1ant,
2964*4882a593Smuzhiyun glcoex_ver_8821a_1ant,
2965*4882a593Smuzhiyun fw_ver, bt_patch_ver,
2966*4882a593Smuzhiyun bt_patch_ver);
2967*4882a593Smuzhiyun rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2968*4882a593Smuzhiyun "[BTCoex], ****************************************************************\n");
2969*4882a593Smuzhiyun }
2970*4882a593Smuzhiyun
2971*4882a593Smuzhiyun if (!btcoexist->auto_report_1ant) {
2972*4882a593Smuzhiyun btc8821a1ant_query_bt_info(btcoexist);
2973*4882a593Smuzhiyun btc8821a1ant_monitor_bt_ctr(btcoexist);
2974*4882a593Smuzhiyun } else {
2975*4882a593Smuzhiyun coex_sta->special_pkt_period_cnt++;
2976*4882a593Smuzhiyun }
2977*4882a593Smuzhiyun }
2978