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