OSDN Git Service

rtl8723au: Upgrade to driver version v4.1.6_7336.20130426
[android-x86/external-modules-rtl8723au.git] / hal / rtl8723a_bt-coexist.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #include <drv_types.h>
21 #include <rtl8723a_hal.h>
22
23
24 #ifdef bEnable
25 #undef bEnable
26 #endif
27
28 //#define BT_DEBUG
29
30 #define CHECK_BT_EXIST_FROM_REG
31 #define DIS_PS_RX_BCN
32 //#define BTCOEX_DECREASE_WIFI_POWER
33 //#define BTCOEX_CMCC_TEST
34
35 #ifdef CONFIG_BT_COEXIST
36 #ifdef PLATFORM_LINUX
37
38 u32 BTCoexDbgLevel = _bt_dbg_off_;
39
40 #define RTPRINT(_Comp, _Level, Fmt)\
41 do {\
42         if((BTCoexDbgLevel ==_bt_dbg_on_)) {\
43 /*              printk("%s", DRIVER_PREFIX);*/\
44                 printk Fmt;\
45         }\
46 }while(0)
47
48 #define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\
49 if((BTCoexDbgLevel ==_bt_dbg_on_) ){\
50         u32 __i;                                                \
51         u8 *ptr = (u8*)_Ptr;    \
52         printk printstr;                                \
53         printk(" ");                                    \
54         for( __i=0; __i<6; __i++ )              \
55                 printk("%02X%s", ptr[__i], (__i==5)?"":"-");            \
56         printk("\n");                                                   \
57 }
58 #define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\
59 if((BTCoexDbgLevel ==_bt_dbg_on_) ){\
60         u32 __i;                                                                        \
61         u8 *ptr = (u8*)_HexData;                        \
62         printk(_TitleString);                                   \
63         for( __i=0; __i<(u32)_HexDataLen; __i++ )       \
64         {                                                                               \
65                 printk("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");\
66                 if (((__i + 1) % 16) == 0)      printk("\n");\
67         }                                                                               \
68         printk("\n");                                                   \
69 }
70 // Added by Annie, 2005-11-22.
71 #define MAX_STR_LEN     64
72 #define PRINTABLE(_ch)  (_ch>=' ' &&_ch<='~')   // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.
73 #define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len)                                   \
74 {\
75 /*      if (((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))  */\
76         {                                                                       \
77                 u32 __i;                                                \
78                 u8 buffer[MAX_STR_LEN];                                 \
79                 u32     length = (_Len<MAX_STR_LEN)? _Len : (MAX_STR_LEN-1) ;   \
80                 _rtw_memset(buffer, 0, MAX_STR_LEN);                    \
81                 _rtw_memcpy(buffer, (u8*)_Ptr, length);         \
82                 for (__i=0; __i<length; __i++)                                  \
83                 {                                                               \
84                         if (!PRINTABLE(buffer[__i]))    buffer[__i] = '?';      \
85                 }                                                               \
86                 buffer[length] = '\0';                                          \
87 /*              printk("Rtl819x: ");*/                                          \
88                 printk(_TitleString);                                           \
89                 printk(": %d, <%s>\n", _Len, buffer);                           \
90         }\
91 }
92 #endif // PLATFORM_LINUX
93
94 #else // !BT_DEBUG
95
96 #define RTPRINT(...)
97 #define RTPRINT_ADDR(...)
98 #define RTPRINT_DATA(...)
99 #define RT_PRINT_STR(...)
100
101 #endif // !BT_DEBUG
102
103 #define DCMD_Printf(...)
104 #define RT_ASSERT(...)
105
106 #ifdef PLATFORM_LINUX
107 #define rsprintf snprintf
108 #elif defined(PLATFORM_WINDOWS)
109 #define rsprintf sprintf_s
110 #endif
111
112
113
114 #define GetDefaultAdapter(padapter)     padapter
115
116 #define PlatformZeroMemory(ptr, sz)     _rtw_memset(ptr, 0, sz)
117
118 #ifdef PLATFORM_LINUX
119 #define PlatformProcessHCICommands(...)
120 #define PlatformTxBTQueuedPackets(...)
121 #define PlatformIndicateBTACLData(...)  (RT_STATUS_SUCCESS)
122 #endif
123 #define PlatformAcquireSpinLock(padapter, type)
124 #define PlatformReleaseSpinLock(padapter, type)
125
126 // timer
127 #define PlatformInitializeTimer(padapter, ptimer, pfunc, cntx, szID) \
128         _init_timer(ptimer, padapter->pnetdev, pfunc, padapter)
129 #define PlatformSetTimer(a, ptimer, delay)      _set_timer(ptimer, delay)
130 static u8 PlatformCancelTimer(PADAPTER a, _timer *ptimer)
131 {
132         u8 bcancelled;
133         _cancel_timer(ptimer, &bcancelled);
134         return bcancelled;
135 }
136 #define PlatformReleaseTimer(...)
137
138 // workitem
139 // already define in hal/OUTSRC/odm_interface.h
140 //typedef void (*RT_WORKITEM_CALL_BACK)(void *pContext);
141 #define PlatformInitializeWorkItem(padapter, pwi, pfunc, cntx, szID) \
142         _init_workitem(pwi, pfunc, padapter)
143 #define PlatformFreeWorkItem(...)
144 #define PlatformScheduleWorkItem(pwork) _set_workitem(pwork)
145 #if 0
146 #define GET_UNDECORATED_AVERAGE_RSSI(padapter)  \
147                 (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) ?         \
148                         (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB):       \
149                         (GET_HAL_DATA(padapter)->dmpriv.UndecoratedSmoothedPWDB)
150 #else
151 #define GET_UNDECORATED_AVERAGE_RSSI(padapter)  \
152                         (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB)
153 #endif
154 #define RT_RF_CHANGE_SOURCE u32
155
156 typedef enum _RT_JOIN_ACTION{
157         RT_JOIN_INFRA   = 1,
158         RT_JOIN_IBSS  = 2,
159         RT_START_IBSS = 3,
160         RT_NO_ACTION  = 4,
161 } RT_JOIN_ACTION;
162
163 // power saving
164 #ifdef CONFIG_IPS
165 #define IPSReturn(padapter, b)          ips_enter(padapter)
166 #define IPSDisable(padapter, b, c)      ips_leave(padapter)
167 #else
168 #define IPSReturn(...)
169 #define IPSDisable(...)
170 #endif
171 #ifdef CONFIG_LPS
172 #define LeisurePSLeave(padapter, b)     LPS_Leave(padapter)
173 #else
174 #define LeisurePSLeave(...)
175 #endif
176
177 #ifdef __BT_C__ // COMMOM/BT.c
178 // ===== Below this line is sync from SD7 driver COMMOM/BT.c =====
179
180 u8 BT_Operation(PADAPTER padapter)
181 {
182         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
183         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
184
185         if (pBtMgnt->BtOperationOn)
186                 return _TRUE;
187         else
188                 return _FALSE;
189 }
190
191 u8 BT_IsLegalChannel(PADAPTER padapter, u8 channel)
192 {
193         PRT_CHANNEL_INFO pChanneList = NULL;
194         u8 channelLen, i;
195
196
197         pChanneList = padapter->mlmeextpriv.channel_set;
198         channelLen = padapter->mlmeextpriv.max_chan_nums;
199
200         for (i = 0; i < channelLen; i++)
201         {
202                 RTPRINT(FIOCTL, IOCTL_STATE, ("Check if chnl(%d) in channel plan contains bt target chnl(%d) for BT connection\n", pChanneList[i].ChannelNum, channel));
203                 if ((channel == pChanneList[i].ChannelNum) ||
204                         (channel == pChanneList[i].ChannelNum + 2))
205                 {
206                         return channel;
207                 }
208         }
209         return 0;
210 }
211
212 void BT_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
213 {
214         BTDM_SignalCompensation(padapter, rssi_wifi, rssi_bt);
215 }
216
217 void BT_WifiScanNotify(PADAPTER padapter, u8 scanType)
218 {
219         BTHCI_WifiScanNotify(padapter, scanType);
220         BTDM_CheckAntSelMode(padapter);
221         BTDM_WifiScanNotify(padapter, scanType);
222 }
223
224 void BT_WifiAssociateNotify(PADAPTER padapter, u8 action)
225 {
226         // action :
227         // TRUE = associate start
228         // FALSE = associate finished
229         if (action)
230                 BTDM_CheckAntSelMode(padapter);
231
232         BTDM_WifiAssociateNotify(padapter, action);
233 }
234
235 void BT_WifiMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
236 {
237         BTDM_MediaStatusNotify(padapter, mstatus);
238 }
239
240 void BT_SpecialPacketNotify(PADAPTER padapter)
241 {
242         BTDM_ForDhcp(padapter);
243 }
244
245 void BT_HaltProcess(PADAPTER padapter)
246 {
247         BTDM_ForHalt(padapter);
248 }
249
250 void BT_LpsLeave(PADAPTER padapter)
251 {
252         BTDM_LpsLeave(padapter);
253 }
254
255 // ===== End of sync from SD7 driver COMMOM/BT.c =====
256 #endif
257
258 #ifdef __BT_HANDLEPACKET_C__ // COMMOM/bt_handlepacket.c
259 // ===== Below this line is sync from SD7 driver COMMOM/bt_handlepacket.c =====
260
261 void btpkt_SendBeacon(PADAPTER padapter)
262 {
263 #if 0 // not implement yet
264         PRT_TCB                                 pTcb;
265         PRT_TX_LOCAL_BUFFER     pBuf;
266
267         PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
268
269         if (MgntGetBuffer(padapter, &pTcb, &pBuf))
270         {
271                 btpkt_ConstructBeaconFrame(
272                         padapter,
273                         pBuf->Buffer.VirtualAddress,
274                         &pTcb->PacketLength);
275
276                 MgntSendPacket(padapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, MGN_1M);
277
278         }
279
280         PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
281 #endif
282 }
283
284 void BTPKT_WPAAuthINITIALIZE(PADAPTER padapter, u8 EntryNum)
285 {
286 #if 0
287 //      PMGNT_INFO      pMgntInfo = &padapter->MgntInfo;
288         PBT30Info                       pBTinfo = GET_BT_INFO(padapter);
289         PBT_SECURITY            pBtSec = &pBTinfo->BtSec;
290         PBT_DBG                         pBtDbg = &pBTinfo->BtDbg;
291         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(padapter);
292
293         RTPRINT(FIOCTL, IOCTL_STATE, ("BTPKT_WPAAuthINITIALIZE() EntryNum = %d\n",EntryNum));
294
295         if (pHalData->bBTMode)
296         {
297 //              if (padapter->MgntInfo.OpMode == RT_OP_MODE_IBSS)
298                 if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
299                 {
300                         pBtSec->bUsedHwEncrypt = _FALSE;
301                 }
302                 else
303                 {
304                         pBtSec->bUsedHwEncrypt = _TRUE;
305                 }
306         }
307         else
308                 pBtSec->bUsedHwEncrypt = _FALSE;
309
310         pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount = 0;
311
312         if (pBTinfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR)
313         {
314                 u8                      RdmBuf[20], NonceBuf[KEY_NONCE_LEN];
315                 u8                      index;
316                 u64                     KeyReplayCounter = 0;
317                 u8                      temp[8] = {0};
318
319                 // Gene Creator Nonce
320                 GetRandomBuffer(RdmBuf);
321                 for (index = 0; index < 16; index++)
322                 {
323                         NonceBuf[index] = RdmBuf[index];
324                         NonceBuf[16+index] = RdmBuf[19-index];
325                 }
326                 _rtw_memcpy(pBTinfo->BtAsocEntry[EntryNum].ANonce, NonceBuf, KEY_NONCE_LEN);
327
328                 // Set ReplayCounter
329                 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
330
331                 for( index = 0 ; index < 8 ; index++)
332                         temp[index] =  (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >>( (7-index) *8)) &0xff);
333
334                 _rtw_memcpy(&KeyReplayCounter, temp, 8);
335                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT pkt], 4-way packet, send 1st and wait for 2nd pkt\n"));
336
337                 pBtDbg->dbgBtPkt.btPktTx4way1st++;
338
339                 // Send 1st packet of 4-way
340                 btpkt_SendEapolKeyPacket(
341                                                 padapter,
342                                                 pBTinfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, //Sta MAC address
343                                                 NULL, // Pointer to KCK (EAPOL-Key Confirmation Key).
344                                                 NULL, //
345                                                 type_Pairwise, // EAPOL-Key Information field: Key Type bit: type_Group or type_Pairwise.
346                                                 _FALSE, // EAPOL-Key Information field: Install Flag.
347                                                 _TRUE, // EAPOL-Key Information field: Key Ack bit.
348                                                 _FALSE, // EAPOL-Key Information field: Key MIC bit. If true, we will calculate EAPOL MIC and fill it into Key MIC field.
349                                                 _FALSE, // EAPOL-Key Information field: Secure bit.
350                                                 _FALSE, // EAPOL-Key Information field: Error bit. True for MIC failure report.
351                                                 _FALSE, // EAPOL-Key Information field: Requst bit.
352                                                 KeyReplayCounter, // EAPOL-KEY Replay Counter field.  //pSTA->perSTAKeyInfo.KeyReplayCounter
353                                                 pBTinfo->BtAsocEntry[EntryNum].ANonce, // EAPOL-Key Key Nonce field (32-byte).
354                                                 0, // EAPOL-Key Key RSC field (8-byte).
355                                                 NULL, // Key Data field: Pointer to RSN IE, NULL if
356                                                 NULL, // Key Data field: Pointer to GTK, NULL if Key Data Length = 0.
357                                                 EntryNum
358                                                 );
359                 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_WAIT_PACKET_2;
360
361                 PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer , BT_WPA_AUTH_TIMEOUT_PERIOD);
362                 // Set WPA Auth State
363
364                 RTPRINT(FIOCTL, IOCTL_STATE, ("Initial BT WPA Creat mode  successful !!\n"));
365         }
366         else if (pBTinfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
367         {
368                 RTPRINT(FIOCTL, IOCTL_STATE, ("BT Joiner BTPKT_WPAAuthINITIALIZE\n"));
369                 // Set WPA Auth State
370                 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_WAIT_PACKET_1;
371                 RTPRINT(FIOCTL, IOCTL_STATE, ("Initial BT WPA Joiner mode  successful !!\n"));
372         }
373         else
374         {
375                 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_UNINITIALIZED;
376                 RTPRINT(FIOCTL, IOCTL_STATE, ("=====> BT unknown mode\n"));
377         }
378 #endif
379 }
380
381 void BTPKT_TimerCallbackWPAAuth(PRT_TIMER pTimer)
382 {
383 #if 0
384 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
385         PADAPTER                padapter = (PADAPTER)pTimer;
386         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
387         PBT_MGNT                pBtMgnt = &pBTinfo->BtMgnt;
388         PBT_SECURITY            pBtSec = &pBTinfo->BtSec;
389         u8                      EntryNum = pBtMgnt->CurrentConnectEntryNum;
390         u32                     index;
391
392
393         //
394         //      Now we check all BT entry !!
395         //
396         for (index = 0; index < MAX_BT_ASOC_ENTRY_NUM; index++)
397         {
398                 // Check bUsed
399                 if (!pBTinfo->BtAsocEntry[index].bUsed)
400                         continue;
401
402                 // Check state
403                 if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_SUCCESSED)
404                         continue;
405
406                 if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_UNINITIALIZED)
407                 {
408                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> BTPKT_TimerCallbackWPAAuth(), BTPKT_WPAAuthINITIALIZE!!\n"));
409                         BTPKT_WPAAuthINITIALIZE(padapter,EntryNum);
410                         continue;
411                 }
412
413                 // Add Re-play counter !!
414                 pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount++;
415
416                 if (pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount > BTMaxWPAAuthReTransmitCoun)
417                 {
418                         BTHCI_SM_WITH_INFO(padapter,HCI_STATE_AUTHENTICATING,STATE_CMD_4WAY_FAILED,EntryNum);
419                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> BTPKT_TimerCallbackWPAAuth(), Retry too much times !!\n"));
420                                 continue;
421                 }
422                 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_1)
423                 {
424                         // We may be remove PlatformSetTimer , after check all station !!
425                         PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer, BT_WPA_AUTH_TIMEOUT_PERIOD);
426                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> Retry STATE_WPA_AUTH_WAIT_PACKET_1 !!\n"));
427                                 continue;
428                 }
429                 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_2)
430                 {
431                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> Re-Send 1st of 4-way, STATE_WPA_AUTH_WAIT_PACKET_2 !!\n"));
432                         // Re-Send 1st of 4-way !!
433                         {
434                                 u64                     KeyReplayCounter = 0;
435                                 u8                      temp[8] = {0};
436                                 u8                      indexi = 0;
437                                 // Set ReplayCounter
438                                 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
439
440                                 for (indexi = 0; indexi < 8; indexi++)
441                                         temp[indexi] = (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >>((7-indexi)*8))&0xff);
442
443                                 // Send 1st packet of 4-way
444                                 btpkt_SendEapolKeyPacket(
445                                                                 padapter,
446                                                                 pBTinfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, //Sta MAC address
447                                                                 NULL, // Pointer to KCK (EAPOL-Key Confirmation Key).
448                                                                 NULL, //
449                                                                 type_Pairwise, // EAPOL-Key Information field: Key Type bit: type_Group or type_Pairwise.
450                                                                 _FALSE, // EAPOL-Key Information field: Install Flag.
451                                                                 _TRUE, // EAPOL-Key Information field: Key Ack bit.
452                                                                 _FALSE, // EAPOL-Key Information field: Key MIC bit. If true, we will calculate EAPOL MIC and fill it into Key MIC field.
453                                                                 _FALSE, // EAPOL-Key Information field: Secure bit.
454                                                                 _FALSE, // EAPOL-Key Information field: Error bit. True for MIC failure report.
455                                                                 _FALSE, // EAPOL-Key Information field: Requst bit.
456                                                                 KeyReplayCounter, // EAPOL-KEY Replay Counter field.  //pSTA->perSTAKeyInfo.KeyReplayCounter
457                                                                 pBTinfo->BtAsocEntry[EntryNum].ANonce, // EAPOL-Key Key Nonce field (32-byte).
458                                                                 0, // EAPOL-Key Key RSC field (8-byte).
459                                                                 NULL, // Key Data field: Pointer to RSN IE, NULL if
460                                                                 NULL, // Key Data field: Pointer to GTK, NULL if Key Data Length = 0.
461                                                                 EntryNum
462                                                                 );
463                         }
464                         // We may be remove PlatformSetTimer BTWPAAuthTimer , after check all station !!
465                         PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer , BT_WPA_AUTH_TIMEOUT_PERIOD);
466                         //RTPRINT(FIOCTL, IOCTL_STATE, ("====> Re-Send 1st of 4-way, STATE_WPA_AUTH_WAIT_PACKET_2 !!\n"));
467                         continue;
468                 }
469                 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_3)
470                 {
471                         // We may be remove PlatformSetTimer , after check all station !!
472                         PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer , BT_WPA_AUTH_TIMEOUT_PERIOD);
473                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> Re-Send 2nd of 4-way, STATE_WPA_AUTH_WAIT_PACKET_3 !!\n"));
474                         continue;
475                 }
476                 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_4)
477                 {
478                         // Re-Send 3th of 4-way !!
479                         {
480                                 u64                     KeyReplayCounter = 0;
481                                 u8                      temp[8] = {0};
482                                 u8                      indexi = 0;
483                                 // Set ReplayCounter
484                                 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
485
486                                 for (indexi = 0; indexi < 8; indexi++)
487                                         temp[indexi] = (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >> ((7-indexi)*8))&0xff);
488
489                                 btpkt_SendEapolKeyPacket(
490                                                 padapter,
491                                                 pBTinfo->BtAsocEntry[EntryNum].BTRemoteMACAddr,
492                                                 pBTinfo->BtAsocEntry[EntryNum].PTK, // Pointer to KCK (EAPOL-Key Confirmation Key).
493                                                 NULL,//pBTinfo->BtAsocEntry[EntryNum].PTK + 16,
494                                                 type_Pairwise, // EAPOL-Key Information field: Key Type bit: type_Group or type_Pairwise.
495                                                 _TRUE, // EAPOL-Key Information field: Install Flag.
496                                                 _TRUE, // EAPOL-Key Information field: Key Ack bit.
497                                                 _TRUE, // EAPOL-Key Information field: Key MIC bit. If true, we will calculate EAPOL MIC and fill it into Key MIC field.
498                                                 _TRUE, // EAPOL-Key Information field: Secure bit.
499                                                 _FALSE, // EAPOL-Key Information field: Error bit. True for MIC failure report.
500                                                 _FALSE, // EAPOL-Key Information field: Requst bit.
501                                                 KeyReplayCounter,//pSTA->perSTAKeyInfo.KeyReplayCounter, // EAPOL-KEY Replay Counter field.
502                                                 pBTinfo->BtAsocEntry[EntryNum].ANonce, // EAPOL-Key Key Nonce field (32-byte).
503                                                 0, // perSTA EAPOL-Key Key RSC field (8-byte).
504                                                 &(pBtSec->RSNIE), // Key Data field: Pointer to RSN IE, NULL if
505                                                 NULL,//pBTinfo->BtAsocEntry[EntryNum].GTK,  // Key Data field: Pointer to GTK, NULL if Key Data Length = 0.
506                                                 EntryNum
507                                                 );
508                         }
509                         // We may be remove PlatformSetTimer , after check all station !!
510                         PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer, BT_WPA_AUTH_TIMEOUT_PERIOD);
511                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> Re-Send 3th of 4-way, STATE_WPA_AUTH_WAIT_PACKET_4 !!\n"));
512                         continue;
513                 }
514                 else
515                 {
516                         RTPRINT(FIOCTL, IOCTL_STATE, ("====> BTPKT_TimerCallbackWPAAuth(), Error State !!%d\n",pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState ));
517                         continue;
518                 }
519         }
520 #endif
521 }
522
523 void BTPKT_TimerCallbackBeacon(PRT_TIMER pTimer)
524 {
525 //      PADAPTER        padapter = (PADAPTER)pTimer->padapter;
526         PADAPTER        padapter = (PADAPTER)pTimer;
527 //      PMGNT_INFO      pMgntInfo = &(padapter->MgntInfo);
528         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
529         PBT_MGNT                pBtMgnt = &pBTinfo->BtMgnt;
530
531         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("=====> BTPKT_TimerCallbackBeacon\n"));
532 //      if (RT_CANNOT_IO(padapter))
533 //              return;
534         //pMgntInfo->BtInfo.BTBeaconTmrOn = _TRUE;
535
536         if (!pBTinfo->BTBeaconTmrOn)
537                 return;
538
539         if (pBtMgnt->BtOperationOn)
540         {
541                 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("btpkt_SendBeacon\n"));
542                 btpkt_SendBeacon(GetDefaultAdapter(padapter));
543                 PlatformSetTimer(padapter, &pBTinfo->BTBeaconTimer, 100);
544         }
545         else
546         {
547                 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("<===== BTPKT_TimerCallbackBeacon\n"));
548         }
549 }
550
551
552 // ===== End of sync from SD7 driver COMMOM/bt_handlepacket.c =====
553 #endif
554
555 #ifdef __BT_HCI_C__ // COMMOM/bt_hci.c
556
557 #define i64fmt          "ll"
558 #define UINT64_C(v)  (v)
559
560 #define FillOctetString(_os,_octet,_len)                \
561         (_os).Octet=(u8*)(_octet);                      \
562         (_os).Length=(_len);
563
564 static RT_STATUS PlatformIndicateBTEvent(
565         PADAPTER                                        padapter,
566         void                                            *pEvntData,
567         u32                                             dataLen
568         )
569 {
570         RT_STATUS       rt_status = RT_STATUS_FAILURE;
571 #ifdef PLATFORM_WINDOWS
572         NTSTATUS        nt_status = STATUS_SUCCESS;
573         PIRP            pIrp = NULL;
574         u32                     BytesTransferred = 0;
575 #endif
576
577         RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event start, %d bytes data to Transferred!!\n", dataLen));
578         RTPRINT_DATA(FIOCTL, IOCTL_BT_EVENT_DETAIL, "To transfer Hex Data :\n",
579                 pEvntData, dataLen);
580
581 //      if (pGBTDeviceExtension==NULL || pGBTDeviceExtension->padapter!=padapter)
582 //              return rt_status;
583
584         BT_EventParse(padapter, pEvntData, dataLen);
585
586 #ifdef PLATFORM_LINUX
587
588         printk(KERN_WARNING "%s: Linux has no way to report BT event!!\n", __FUNCTION__);
589
590 #elif defined(PLATFORM_WINDOWS)
591
592         pIrp = IOCTL_BtIrpDequeue(pGBTDeviceExtension, IRP_HCI_EVENT_Q);
593
594         if(pIrp)
595         {
596                 PVOID   outbuf;
597                 ULONG   outlen;
598                 ULONG   offset;
599
600                 outbuf = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, HighPagePriority);
601                 if(outbuf == NULL)
602                 {
603                         RTPRINT(FIOCTL, IOCTL_IRP, ("PlatformIndicateBTEvent(), error!! MdlAddress = NULL!!\n"));
604                         BytesTransferred = 0;
605                         nt_status = STATUS_UNSUCCESSFUL;
606                 }
607                 else
608                 {
609                         outlen = MmGetMdlByteCount(pIrp->MdlAddress);
610                         offset = MmGetMdlByteOffset(pIrp->MdlAddress);
611
612                         if(dataLen <= outlen)
613                                 BytesTransferred = dataLen;
614                         else
615                                 BytesTransferred = outlen;
616                         _rtw_memcpy(outbuf, pEvntData, BytesTransferred);
617                         nt_status = STATUS_SUCCESS;
618                 }
619                 RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event, %d bytes data Transferred!!\n", BytesTransferred));
620                 RTPRINT_DATA(FIOCTL, (IOCTL_BT_EVENT_DETAIL|IOCTL_BT_LOGO), "BT EVENT Hex Data :\n",
621                         outbuf, BytesTransferred);
622
623                 IOCTL_CompleteSingleIRP(pIrp, nt_status, BytesTransferred);
624                 if (nt_status == STATUS_SUCCESS)
625                         rt_status = RT_STATUS_SUCCESS;
626         }
627
628 #endif // PLATFORM_WINDOWS
629
630         RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event end, %s\n",
631                 (rt_status == RT_STATUS_SUCCESS)? "SUCCESS":"FAIL"));
632
633         return rt_status;
634 }
635
636 // ===== Below this line is sync from SD7 driver COMMOM/bt_hci.c =====
637
638 u8      testPMK[PMK_LEN] = {2,2,3,3,4,4,5,5,6,6,
639                                                         7,7,8,8,9,9,2,2,3,3,
640                                                         4,4,2,2,8,8,9,9,2,2,
641                                                         5,5};
642
643 u8 bthci_GetLocalChannel(PADAPTER padapter)
644 {
645         return padapter->mlmeextpriv.cur_channel;
646 }
647
648 u8 bthci_GetCurrentEntryNum(PADAPTER padapter, u8 PhyHandle)
649 {
650         PBT30Info pBTInfo = GET_BT_INFO(padapter);
651         u8 i;
652
653         for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
654         {
655                 if ((pBTInfo->BtAsocEntry[i].bUsed == _TRUE) && (pBTInfo->BtAsocEntry[i].PhyLinkCmdData.BtPhyLinkhandle == PhyHandle))
656                 {
657                         return i;
658                 }
659         }
660
661         return 0xFF;
662 }
663
664 void bthci_DecideBTChannel(PADAPTER padapter, u8 EntryNum)
665 {
666 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
667         struct mlme_priv *pmlmepriv;
668         PBT30Info pBTInfo;
669         PBT_MGNT pBtMgnt;
670         PBT_HCI_INFO pBtHciInfo;
671         PCHNL_TXPOWER_TRIPLE pTriple_subband = NULL;
672         PCOMMON_TRIPLE pTriple;
673         u8 i, j, localchnl, firstRemoteLegalChnlInTriplet=0, regulatory_skipLen=0;
674         u8 subbandTripletCnt = 0;
675
676
677         pmlmepriv = &padapter->mlmepriv;
678         pBTInfo = GET_BT_INFO(padapter);
679         pBtMgnt = &pBTInfo->BtMgnt;
680         pBtHciInfo = &pBTInfo->BtHciInfo;
681
682         pBtMgnt->CheckChnlIsSuit = _TRUE;
683         localchnl = bthci_GetLocalChannel(padapter);
684
685         {
686 #if 0   // for debug only
687                 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
688
689                 // contains country string len is 3
690                 for (i=0; i<(pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
691                 {
692                         DbgPrint("pTriple->byte_1st = %d, pTriple->byte_2nd = %d, pTriple->byte_3rd = %d\n",
693                                 pTriple->byte_1st, pTriple->byte_2nd, pTriple->byte_3rd);
694                 }
695 #endif
696                 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
697
698                 // contains country string, len is 3
699                 for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
700                 {
701                         //
702                         // check every triplet, an triplet may be
703                         // regulatory extension identifier or sub-band triplet
704                         //
705                         if (pTriple->byte_1st == 0xc9)  // Regulatory Extension Identifier, skip it
706                         {
707                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find Regulatory ID, regulatory class = %d\n", pTriple->byte_2nd));
708                                 regulatory_skipLen += 3;
709                                 pTriple_subband = NULL;
710                                 continue;
711                         }
712                         else                                                    // Sub-band triplet
713                         {
714                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find Sub-band triplet \n"));
715                                 subbandTripletCnt++;
716                                 pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
717                                 //
718                                 // if remote first legal channel not found, then find first remote channel
719                                 // and it's legal for our channel plan.
720                                 //
721
722                                 // search the sub-band triplet and find if remote channel is legal to our channel plan.
723                                 for (j = pTriple_subband->FirstChnl; j < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls); j++)
724                                 {
725                                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), (" Check if chnl(%d) is legal\n", j));
726                                         if (BT_IsLegalChannel(padapter, j))     // remote channel is legal for our channel plan.
727                                         {
728                                                 firstRemoteLegalChnlInTriplet = j;
729                                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find first remote legal channel : %d\n", firstRemoteLegalChnlInTriplet));
730
731                                                 //
732                                                 // If we find a remote legal channel in the sub-band triplet
733                                                 // and only BT connection is established(local not connect to any AP or IBSS),
734                                                 // then we just switch channel to remote channel.
735                                                 //
736                                         #if 0
737                                                 if (!MgntRoamingInProgress(pMgntInfo) &&
738                                                         !MgntIsLinkInProgress(pMgntInfo) &&
739                                                         !MgntScanInProgress(pMgntInfo))
740                                         #endif
741                                                 {
742 #if 0
743                                                         if (!(pMgntInfo->mAssoc ||
744                                                                 pMgntInfo->mIbss ||
745                                                                 IsAPModeExist(padapter)||
746                                                                 BTHCI_HsConnectionEstablished(padapter)))
747 #else
748                                                         if (!(check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE ||
749                                                                 BTHCI_HsConnectionEstablished(padapter)))
750 #endif
751                                                         {
752                                                                 pBtMgnt->BTChannel = firstRemoteLegalChnlInTriplet;
753                                                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Remote legal channel (%d) is selected, Local not connect to any!!\n", pBtMgnt->BTChannel));
754                                                                 return;
755                                                         }
756                                                         else
757                                                         {
758                                                                 if ((localchnl >= firstRemoteLegalChnlInTriplet) &&
759                                                                         (localchnl < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls)))
760                                                                 {
761                                                                         pBtMgnt->BTChannel = localchnl;
762                                                                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Local channel (%d) is selected, wifi or BT connection exists\n", pBtMgnt->BTChannel));
763                                                                         return;
764                                                                 }
765                                                         }
766                                                 }
767                                                 break;
768                                         }
769                                 }
770                         }
771                 }
772
773                 if (subbandTripletCnt)
774                 {
775                         //if any preferred channel triplet exists
776                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("There are %d sub band triplet exists, ", subbandTripletCnt));
777                         if (firstRemoteLegalChnlInTriplet == 0)
778                         {
779                                 //no legal channel is found, reject the connection.
780                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("no legal channel is found!!\n"));
781                         }
782                         else
783                         {
784                                 // Remote Legal channel is found but not match to local
785                                 //(wifi connection exists), so reject the connection.
786                                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Remote Legal channel is found but not match to local(wifi connection exists)!!\n"));
787                         }
788                         pBtMgnt->CheckChnlIsSuit = _FALSE;
789                 }
790                 else
791                 {
792                         // There are not any preferred channel triplet exists
793                         // Use current legal channel as the bt channel.
794                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("No sub band triplet exists!!\n"));
795                 }
796                 pBtMgnt->BTChannel = localchnl;
797                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Local channel (%d) is selected!!\n", pBtMgnt->BTChannel));
798         }
799 }
800
801
802 //Success:return _TRUE
803 //Fail:return _FALSE
804 u8 bthci_GetAssocInfo(PADAPTER padapter, u8 EntryNum)
805 {
806 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
807         PBT30Info               pBTInfo;
808         PBT_HCI_INFO    pBtHciInfo;
809         u8      tempBuf[256];
810         u8      i = 0;
811         u8      BaseMemoryShift = 0;
812         u16     TotalLen = 0;
813
814         PAMP_ASSOC_STRUCTURE    pAmpAsoc;
815
816
817         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo start\n"));
818
819         pBTInfo = GET_BT_INFO(padapter);
820         pBtHciInfo = &pBTInfo->BtHciInfo;
821
822         if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar == 0)
823         {
824
825                 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen < (MAX_AMP_ASSOC_FRAG_LEN))
826                         TotalLen = pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen;
827                 else if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen == (MAX_AMP_ASSOC_FRAG_LEN))
828                         TotalLen = MAX_AMP_ASSOC_FRAG_LEN;
829         }
830         else if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar > 0)
831                 TotalLen = pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar;
832
833         while ((pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar >= BaseMemoryShift) || TotalLen > BaseMemoryShift)
834         {
835                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("GetAssocInfo, TotalLen=%d, BaseMemoryShift=%d\n",TotalLen,BaseMemoryShift));
836                 _rtw_memcpy(tempBuf,
837                         (u8*)pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment+BaseMemoryShift,
838                         TotalLen-BaseMemoryShift);
839                 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, "GetAssocInfo :\n",
840                         tempBuf, TotalLen-BaseMemoryShift);
841
842 #if 0
843                 AmpAsoc[i].TypeID=*((u8 *)(tempBuf));
844                 AmpAsoc[i].Length=*((u16 *)(((u8 *)(tempBuf))+1));
845                 _rtw_memcpy(AmpAsoc[i].Data, ((u8 *)(tempBuf))+3, AmpAsoc[i].Length);
846                 BaseMemoryShift=BaseMemoryShift+3+AmpAsoc[i].Length;
847 #else
848                 pAmpAsoc = (PAMP_ASSOC_STRUCTURE)tempBuf;
849                 pAmpAsoc->Length = EF2Byte(pAmpAsoc->Length);
850                 BaseMemoryShift += 3 + pAmpAsoc->Length;
851 #endif
852
853                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("TypeID = 0x%x, ", pAmpAsoc->TypeID));
854                 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, "Hex Data: \n", pAmpAsoc->Data, pAmpAsoc->Length);
855                 switch (pAmpAsoc->TypeID)
856                 {
857                         case AMP_MAC_ADDR:
858                                 {
859                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_MAC_ADDR\n"));
860                                         if (pAmpAsoc->Length > 6)
861                                         {
862                                                 return _FALSE;
863                                         }
864
865                                         _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, pAmpAsoc->Data,6);
866                                         RTPRINT_ADDR(FIOCTL, IOCTL_BT_HCICMD, ("Remote Mac address \n"), pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr);
867                                         break;
868                                 }
869
870                         case AMP_PREFERRED_CHANNEL_LIST:
871                                 {
872                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_PREFERRED_CHANNEL_LIST\n"));
873                                         pBtHciInfo->BtPreChnlListLen=pAmpAsoc->Length;
874                                         _rtw_memcpy(pBtHciInfo->BTPreChnllist,
875                                                 pAmpAsoc->Data,
876                                                 pBtHciInfo->BtPreChnlListLen);
877                                         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, "Preferred channel list : \n", pBtHciInfo->BTPreChnllist, pBtHciInfo->BtPreChnlListLen);
878                                         bthci_DecideBTChannel(padapter,EntryNum);
879                                         break;
880                                 }
881
882                         case AMP_CONNECTED_CHANNEL:
883                                 {
884                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_CONNECTED_CHANNEL\n"));
885                                         pBtHciInfo->BTConnectChnlListLen=pAmpAsoc->Length;
886                                         _rtw_memcpy(pBtHciInfo->BTConnectChnllist,
887                                                 pAmpAsoc->Data,
888                                                 pBtHciInfo->BTConnectChnlListLen);
889                                         break;
890
891                                 }
892
893                         case AMP_80211_PAL_CAP_LIST:
894                                 {
895
896                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_80211_PAL_CAP_LIST\n"));
897                                         pBTInfo->BtAsocEntry[EntryNum].BTCapability=*(u32 *)(pAmpAsoc->Data);
898                                         if (pBTInfo->BtAsocEntry[EntryNum].BTCapability && 0x00000001)
899                                         {
900                                                 // TODO:
901
902                                                 //Signifies PAL capable of utilizing received activity reports.
903                                         }
904                                         if (pBTInfo->BtAsocEntry[EntryNum].BTCapability && 0x00000002)
905                                         {
906                                                 // TODO:
907                                                 //Signifies PAL is capable of utilizing scheduling information received in an activity reports.
908                                         }
909                                         break;
910                                 }
911
912                         case AMP_80211_PAL_VISION:
913                                 {
914                                         pBtHciInfo->BTPalVersion=*(u8 *)(pAmpAsoc->Data);
915                                         pBtHciInfo->BTPalCompanyID=*(u16 *)(((u8 *)(pAmpAsoc->Data))+1);
916                                         pBtHciInfo->BTPalsubversion=*(u16 *)(((u8 *)(pAmpAsoc->Data))+3);
917                                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("==> AMP_80211_PAL_VISION PalVersion  0x%x, PalCompanyID  0x%x, Palsubversion 0x%x\n",
918                                         pBtHciInfo->BTPalVersion,
919                                         pBtHciInfo->BTPalCompanyID,
920                                         pBtHciInfo->BTPalsubversion));
921                                         break;
922                                 }
923
924                         default:
925                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> Unsupport TypeID !!\n"));
926                                 break;
927                 }
928                 i++;
929         }
930         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo end\n"));
931
932         return _TRUE;
933 }
934
935 u8 bthci_AddEntry(PADAPTER padapter)
936 {
937         PBT30Info               pBTInfo;
938         PBT_MGNT                pBtMgnt;
939         u8                      i;
940
941
942         pBTInfo = GET_BT_INFO(padapter);
943         pBtMgnt = &pBTInfo->BtMgnt;
944
945         for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
946         {
947                 if (pBTInfo->BtAsocEntry[i].bUsed == _FALSE)
948                 {
949                         pBTInfo->BtAsocEntry[i].bUsed = _TRUE;
950                         pBtMgnt->CurrentConnectEntryNum = i;
951                         break;
952                 }
953         }
954
955         if (i == MAX_BT_ASOC_ENTRY_NUM)
956         {
957                 RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_AddEntry(), Add entry fail!!\n"));
958                 return _FALSE;
959         }
960         return _TRUE;
961 }
962
963 u8 bthci_DiscardTxPackets(PADAPTER padapter, u16 LLH)
964 {
965 #if 0
966         u8 flushOccured = _FALSE;
967 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
968 //      PADAPTER                padapter = GetDefaultAdapter(padapter);
969         PRT_TX_LOCAL_BUFFER      pLocalBuffer;
970         PPACKET_IRP_ACL_DATA pACLData;
971
972         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_DiscardTxPackets() ==>\n"));
973
974         PlatformAcquireSpinLock(padapter, RT_BTData_SPINLOCK);
975         while(!RTIsListEmpty(&padapter->BTDataTxQueue))
976         {
977                 pLocalBuffer = (PRT_TX_LOCAL_BUFFER)RTRemoveHeadListWithCnt(&padapter->BTDataTxQueue, &padapter->NumTxBTDataBlock);
978                 if (pLocalBuffer)
979                 {
980                         pACLData = (PPACKET_IRP_ACL_DATA)pLocalBuffer->Buffer.VirtualAddress;
981                         if (pACLData->Handle == LLH)
982                                 flushOccured = _TRUE;
983                         RTInsertTailListWithCnt(&padapter->BTDataIdleQueue, &pLocalBuffer->List, &padapter->NumIdleBTDataBlock);
984                 }
985         }
986         PlatformReleaseSpinLock(padapter, RT_BTData_SPINLOCK);
987 #endif
988         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_DiscardTxPackets() <==\n"));
989         return flushOccured;
990 #else
991         return _FALSE;
992 #endif
993 }
994
995 u8
996 bthci_CheckLogLinkBehavior(
997         PADAPTER                                        padapter,
998         HCI_FLOW_SPEC                   TxFlowSpec
999         )
1000 {
1001         u8      ID = TxFlowSpec.Identifier;
1002         u8      ServiceType = TxFlowSpec.ServiceType;
1003         u16     MaxSDUSize = TxFlowSpec.MaximumSDUSize;
1004         u32     SDUInterArrivatime = TxFlowSpec.SDUInterArrivalTime;
1005         u8      match = _FALSE;
1006
1007         switch (ID)
1008         {
1009                 case 1:
1010                 {
1011                         if (ServiceType == BT_LL_BE)
1012                         {
1013                                 match = _TRUE;
1014                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  TX best effort flowspec\n"));
1015                         }
1016                         else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 0xffff))
1017                         {
1018                                 match = _TRUE;
1019                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  RX guaranteed latency flowspec\n"));
1020                         }
1021                         else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 2500))
1022                         {
1023                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  RX guaranteed Large latency flowspec\n"));
1024                         }
1025                         break;
1026                 }
1027                 case 2:
1028                 {
1029                         if (ServiceType == BT_LL_BE)
1030                         {
1031                                 match = _TRUE;
1032                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  RX best effort flowspec\n"));
1033
1034                         }
1035                         break;
1036                 }
1037                 case 3:
1038                 {
1039                          if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 1492))
1040                         {
1041                                 match=_TRUE;
1042                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  TX guaranteed latency flowspec\n"));
1043                         }
1044                         else if ((ServiceType==BT_LL_GU) && (MaxSDUSize==2500))
1045                         {
1046                                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  TX guaranteed Large latency flowspec\n"));
1047                         }
1048                         break;
1049                 }
1050                 case 4:
1051                 {
1052                         if (ServiceType == BT_LL_BE)
1053                         {
1054                                 if ((SDUInterArrivatime == 0xffffffff) && (ServiceType == BT_LL_BE) && (MaxSDUSize == 1492))
1055                                 {
1056                                         match = _TRUE;
1057                                         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  TX/RX aggregated best effort flowspec\n"));
1058                                 }
1059                         }
1060                         else if (ServiceType == BT_LL_GU)
1061                         {
1062                                 if ((SDUInterArrivatime == 100) && 10000)
1063                                 {
1064                                         match = _TRUE;
1065                                         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  TX/RX guaranteed bandwidth flowspec\n"));
1066                                 }
1067                         }
1068                         break;
1069                 }
1070                 default:
1071                 {
1072                         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type =  Unknow Type !!!!!!!!\n"));
1073                         break;
1074                 }
1075         }
1076
1077 #if 0
1078         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("ID = 0x%x,   ServiceType = 0x%x, MaximumSDUSize = 0x%x, SDUInterArrivalTime  = 0x%lx, AccessLatency = 0x%lx, FlushTimeout = 0x%lx\n",
1079         TxFlowSpec.Identifier, TxFlowSpec.ServiceType, MaxSDUSize,SDUInterArrivatime, TxFlowSpec.AccessLatency, TxFlowSpec.FlushTimeout));
1080 #else
1081         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("ID=0x%x, ServiceType=0x%x, MaximumSDUSize=0x%x, SDUInterArrivalTime=0x%x, AccessLatency=0x%x, FlushTimeout=0x%x\n",
1082         TxFlowSpec.Identifier, TxFlowSpec.ServiceType, MaxSDUSize, SDUInterArrivatime, TxFlowSpec.AccessLatency, TxFlowSpec.FlushTimeout));
1083 #endif
1084         return match;
1085 }
1086
1087 void
1088 bthci_SelectFlowType(
1089         PADAPTER                                        padapter,
1090         BT_LL_FLOWSPEC                  TxLLFlowSpec,
1091         BT_LL_FLOWSPEC                  RxLLFlowSpec,
1092         PHCI_FLOW_SPEC          TxFlowSpec,
1093         PHCI_FLOW_SPEC          RxFlowSpec
1094         )
1095 {
1096         switch (TxLLFlowSpec)
1097         {
1098                 case BT_TX_BE_FS:
1099                 {
1100                         TxFlowSpec->Identifier = 0x1;
1101                         TxFlowSpec->ServiceType = BT_LL_BE;
1102                         TxFlowSpec->MaximumSDUSize = 0xffff;
1103                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1104                         TxFlowSpec->AccessLatency = 0xffffffff;
1105                         TxFlowSpec->FlushTimeout = 0xffffffff;
1106                         break;
1107                 }
1108                 case BT_RX_BE_FS:
1109                 {
1110                         RxFlowSpec->Identifier = 0x2;
1111                         RxFlowSpec->ServiceType = BT_LL_BE;
1112                         RxFlowSpec->MaximumSDUSize = 0xffff;
1113                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1114                         RxFlowSpec->AccessLatency = 0xffffffff;
1115                         RxFlowSpec->FlushTimeout = 0xffffffff;
1116                         break;
1117                 }
1118                 case BT_TX_GU_FS:
1119                 {
1120                         TxFlowSpec->Identifier = 0x3;
1121                         TxFlowSpec->ServiceType = BT_LL_GU;
1122                         TxFlowSpec->MaximumSDUSize = 1492;
1123                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1124                         TxFlowSpec->AccessLatency = 10000;
1125                         TxFlowSpec->FlushTimeout = 10000;
1126                         break;
1127                 }
1128                 case BT_RX_GU_FS:
1129                 {
1130                         RxFlowSpec->Identifier = 0x1;
1131                         RxFlowSpec->ServiceType = BT_LL_GU;
1132                         RxFlowSpec->MaximumSDUSize = 0xffff;
1133                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1134                         RxFlowSpec->AccessLatency = 10000;
1135                         RxFlowSpec->FlushTimeout = 10000;
1136                         break;
1137                 }
1138                 case BT_TX_BE_AGG_FS:
1139                 {
1140                         TxFlowSpec->Identifier = 0x4;
1141                         TxFlowSpec->ServiceType = BT_LL_BE;
1142                         TxFlowSpec->MaximumSDUSize = 1492;
1143                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1144                         TxFlowSpec->AccessLatency = 0xffffffff;
1145                         TxFlowSpec->FlushTimeout = 0xffffffff;
1146                         break;
1147                 }
1148                 case BT_RX_BE_AGG_FS:
1149                 {
1150                         RxFlowSpec->Identifier = 0x4;
1151                         RxFlowSpec->ServiceType = BT_LL_BE;
1152                         RxFlowSpec->MaximumSDUSize = 1492;
1153                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1154                         RxFlowSpec->AccessLatency = 0xffffffff;
1155                         RxFlowSpec->FlushTimeout = 0xffffffff;
1156                         break;
1157                 }
1158                 case BT_TX_GU_BW_FS:
1159                 {
1160                         TxFlowSpec->Identifier = 0x4;
1161                         TxFlowSpec->ServiceType = BT_LL_GU;
1162                         TxFlowSpec->MaximumSDUSize = 1492;
1163                         TxFlowSpec->SDUInterArrivalTime = 100;
1164                         TxFlowSpec->AccessLatency = 0xffffffff;
1165                         TxFlowSpec->FlushTimeout = 0xffffffff;
1166                         break;
1167                 }
1168                 case BT_RX_GU_BW_FS:
1169                 {
1170                         RxFlowSpec->Identifier = 0x4;
1171                         RxFlowSpec->ServiceType = BT_LL_GU;
1172                         RxFlowSpec->MaximumSDUSize = 1492;
1173                         RxFlowSpec->SDUInterArrivalTime = 100;
1174                         RxFlowSpec->AccessLatency = 0xffffffff;
1175                         RxFlowSpec->FlushTimeout = 0xffffffff;
1176                         break;
1177                 }
1178                 case BT_TX_GU_LARGE_FS:
1179                 {
1180                         TxFlowSpec->Identifier = 0x3;
1181                         TxFlowSpec->ServiceType = BT_LL_GU;
1182                         TxFlowSpec->MaximumSDUSize = 2500;
1183                         TxFlowSpec->SDUInterArrivalTime = 0x1;
1184                         TxFlowSpec->AccessLatency = 10000;
1185                         TxFlowSpec->FlushTimeout = 10000;
1186                         break;
1187                 }
1188                 case BT_RX_GU_LARGE_FS:
1189                 {
1190                         RxFlowSpec->Identifier = 0x1;
1191                         RxFlowSpec->ServiceType = BT_LL_GU;
1192                         RxFlowSpec->MaximumSDUSize = 2500;
1193                         RxFlowSpec->SDUInterArrivalTime = 0x1;
1194                         RxFlowSpec->AccessLatency = 10000;
1195                         RxFlowSpec->FlushTimeout = 10000;
1196                         break;
1197                 }
1198                 default:
1199                         break;
1200         }
1201
1202         switch (RxLLFlowSpec)
1203         {
1204                 case BT_TX_BE_FS:
1205                 {
1206                         TxFlowSpec->Identifier = 0x1;
1207                         TxFlowSpec->ServiceType = BT_LL_BE;
1208                         TxFlowSpec->MaximumSDUSize = 0xffff;
1209                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1210                         TxFlowSpec->AccessLatency = 0xffffffff;
1211                         TxFlowSpec->FlushTimeout = 0xffffffff;
1212                         break;
1213                 }
1214                 case BT_RX_BE_FS:
1215                 {
1216                         RxFlowSpec->Identifier = 0x2;
1217                         RxFlowSpec->ServiceType = BT_LL_BE;
1218                         RxFlowSpec->MaximumSDUSize = 0xffff;
1219                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1220                         RxFlowSpec->AccessLatency = 0xffffffff;
1221                         RxFlowSpec->FlushTimeout = 0xffffffff;
1222                         break;
1223                 }
1224                 case BT_TX_GU_FS:
1225                 {
1226                         TxFlowSpec->Identifier = 0x3;
1227                         TxFlowSpec->ServiceType = BT_LL_GU;
1228                         TxFlowSpec->MaximumSDUSize = 1492;
1229                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1230                         TxFlowSpec->AccessLatency = 10000;
1231                         TxFlowSpec->FlushTimeout = 10000;
1232                         break;
1233                 }
1234                 case BT_RX_GU_FS:
1235                 {
1236                         RxFlowSpec->Identifier = 0x1;
1237                         RxFlowSpec->ServiceType = BT_LL_GU;
1238                         RxFlowSpec->MaximumSDUSize = 0xffff;
1239                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1240                         RxFlowSpec->AccessLatency = 10000;
1241                         RxFlowSpec->FlushTimeout = 10000;
1242                         break;
1243                 }
1244                 case BT_TX_BE_AGG_FS:
1245                 {
1246                         TxFlowSpec->Identifier = 0x4;
1247                         TxFlowSpec->ServiceType = BT_LL_BE;
1248                         TxFlowSpec->MaximumSDUSize = 1492;
1249                         TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1250                         TxFlowSpec->AccessLatency = 0xffffffff;
1251                         TxFlowSpec->FlushTimeout = 0xffffffff;
1252                         break;
1253                 }
1254                 case BT_RX_BE_AGG_FS:
1255                 {
1256                         RxFlowSpec->Identifier = 0x4;
1257                         RxFlowSpec->ServiceType = BT_LL_BE;
1258                         RxFlowSpec->MaximumSDUSize = 1492;
1259                         RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
1260                         RxFlowSpec->AccessLatency = 0xffffffff;
1261                         RxFlowSpec->FlushTimeout = 0xffffffff;
1262                         break;
1263                 }
1264                 case BT_TX_GU_BW_FS:
1265                 {
1266                         TxFlowSpec->Identifier = 0x4;
1267                         TxFlowSpec->ServiceType = BT_LL_GU;
1268                         TxFlowSpec->MaximumSDUSize = 1492;
1269                         TxFlowSpec->SDUInterArrivalTime = 100;
1270                         TxFlowSpec->AccessLatency = 0xffffffff;
1271                         TxFlowSpec->FlushTimeout = 0xffffffff;
1272                         break;
1273                 }
1274                 case BT_RX_GU_BW_FS:
1275                 {
1276                         RxFlowSpec->Identifier = 0x4;
1277                         RxFlowSpec->ServiceType = BT_LL_GU;
1278                         RxFlowSpec->MaximumSDUSize = 1492;
1279                         RxFlowSpec->SDUInterArrivalTime = 100;
1280                         RxFlowSpec->AccessLatency = 0xffffffff;
1281                         RxFlowSpec->FlushTimeout = 0xffffffff;
1282                         break;
1283                 }
1284                 case BT_TX_GU_LARGE_FS:
1285                 {
1286                         TxFlowSpec->Identifier = 0x3;
1287                         TxFlowSpec->ServiceType = BT_LL_GU;
1288                         TxFlowSpec->MaximumSDUSize = 2500;
1289                         TxFlowSpec->SDUInterArrivalTime = 0x1;
1290                         TxFlowSpec->AccessLatency = 10000;
1291                         TxFlowSpec->FlushTimeout = 10000;
1292                         break;
1293                 }
1294                 case BT_RX_GU_LARGE_FS:
1295                 {
1296                         RxFlowSpec->Identifier = 0x1;
1297                         RxFlowSpec->ServiceType = BT_LL_GU;
1298                         RxFlowSpec->MaximumSDUSize = 2500;
1299                         RxFlowSpec->SDUInterArrivalTime = 0x1;
1300                         RxFlowSpec->AccessLatency = 10000;
1301                         RxFlowSpec->FlushTimeout = 10000;
1302                         break;
1303                 }
1304                 default:
1305                         break;
1306         }
1307 }
1308
1309 u16
1310 bthci_AssocMACAddr(
1311         PADAPTER        padapter,
1312         void    *pbuf
1313         )
1314 {
1315         PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1316 /*
1317         u8      FakeAddress[6],i;
1318
1319         for (i=0;i<6;i++)
1320         {
1321                 FakeAddress[i]=i;
1322         }
1323 */
1324         pAssoStrc->TypeID = AMP_MAC_ADDR;
1325         pAssoStrc->Length = 0x06;
1326         //      _rtw_memcpy(&pAssoStrc->Data[0], Adapter->CurrentAddress, 6);
1327         _rtw_memcpy(&pAssoStrc->Data[0], padapter->eeprompriv.mac_addr, 6);
1328         //_rtw_memcpy(&pAssoStrc->Data[0], FakeAddress, 6);
1329         RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("AssocMACAddr : \n"), pAssoStrc, pAssoStrc->Length+3);
1330
1331         return (pAssoStrc->Length+3);
1332 }
1333
1334 u16
1335 bthci_PALCapabilities(
1336         PADAPTER        padapter,
1337         void    *pbuf
1338         )
1339 {
1340         PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1341
1342         pAssoStrc->TypeID = AMP_80211_PAL_CAP_LIST;
1343         pAssoStrc->Length = 0x04;
1344
1345         pAssoStrc->Data[0] = 0x00;
1346         pAssoStrc->Data[1] = 0x00;
1347
1348         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("PALCapabilities : \n"), pAssoStrc, pAssoStrc->Length+3);
1349         RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("PALCapabilities \n"));
1350
1351         RTPRINT(FIOCTL, IOCTL_BT_LOGO, (" TypeID = 0x%x,\n Length = 0x%x,\n Content =0x0000\n",
1352                 pAssoStrc->TypeID,
1353                 pAssoStrc->Length));
1354
1355         return (pAssoStrc->Length+3);
1356 }
1357
1358 u16
1359 bthci_AssocPreferredChannelList(
1360         PADAPTER                padapter,
1361         void    *pbuf,
1362         u8              EntryNum
1363         )
1364 {
1365 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
1366         PBT30Info                               pBTInfo;
1367 //      PRT_DOT11D_INFO pDot11dInfo;
1368         PAMP_ASSOC_STRUCTURE    pAssoStrc;
1369         PAMP_PREF_CHNL_REGULATORY pReg;
1370         PCHNL_TXPOWER_TRIPLE pTripleIE, pTriple;
1371         char    ctrString[3] = {'X', 'X', 'X'};
1372         u32     len = 0;
1373         u8      i=0, NumTriples=0, preferredChnl;
1374
1375
1376         pBTInfo = GET_BT_INFO(padapter);
1377 //      pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
1378         pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1379         pReg = (PAMP_PREF_CHNL_REGULATORY)&pAssoStrc->Data[3];
1380
1381         preferredChnl = bthci_GetLocalChannel(padapter);
1382         pAssoStrc->TypeID = AMP_PREFERRED_CHANNEL_LIST;
1383 #if 0//cosa temp remove
1384         // When 802.11d is enabled and learned from beacon
1385         if (    (pDot11dInfo->bEnabled) &&
1386                 (pDot11dInfo->State == DOT11D_STATE_LEARNED)    )
1387         {
1388                 //Country String
1389                 _rtw_memcpy(&pAssoStrc->Data[0], &pDot11dInfo->CountryIeBuf[0], 3);
1390                 pReg->reXId = 201;
1391                 pReg->regulatoryClass = 254;    // should parse beacon frame
1392                 pReg->coverageClass = 0;
1393                 len += 6;
1394                 pTriple=(PCHNL_TXPOWER_TRIPLE)&pAssoStrc->Data[len];
1395                 pTripleIE = (PCHNL_TXPOWER_TRIPLE)(&pDot11dInfo->CountryIeBuf[3]);
1396
1397                 NumTriples = (pDot11dInfo->CountryIeLen-3)/3;// skip 3-byte country string.
1398                 for (i=0; i<NumTriples; i++)
1399                 {
1400                         if (    (preferredChnl > pTripleIE->FirstChnl) &&
1401                                 (preferredChnl <= (pTripleIE->FirstChnl+pTripleIE->NumChnls-1)))
1402                         {
1403                                 // ex: preferred=10, first=3, num=9, from ch3~ch11
1404                                 // that should be divided to 2~3 groups
1405                                 // (1) first=10, num=1, ch10
1406                                 // (2) first=3, num=7, from ch3~ch9
1407                                 // (3) first=11, num=1, ch11
1408
1409                                 // (1) group 1, preferred channel
1410                                 pTriple->FirstChnl = preferredChnl;
1411                                 pTriple->NumChnls = 1;
1412                                 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1413                                 len += 3;
1414                                 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1415
1416                                 // (2) group 2, first chnl~preferred-1
1417                                 pTriple->FirstChnl = pTripleIE->FirstChnl;
1418                                 pTriple->NumChnls = preferredChnl-pTriple->FirstChnl;
1419                                 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1420                                 len += 3;
1421                                 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1422
1423                                 if (preferredChnl < (pTripleIE->FirstChnl+pTripleIE->NumChnls-1))
1424                                 {
1425                                         // (3) group 3, preferred+1~last
1426                                         pTriple->FirstChnl = preferredChnl+1;
1427                                         pTriple->NumChnls = pTripleIE->FirstChnl+pTripleIE->NumChnls-1-preferredChnl;
1428                                         pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1429                                         len += 3;
1430                                         pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1431                                 }
1432                         }
1433                         else
1434                         {
1435                                 pTriple->FirstChnl = pTripleIE->FirstChnl;
1436                                 pTriple->NumChnls = pTripleIE->NumChnls;
1437                                 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1438                                 len += 3;
1439                                 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1440                         }
1441                         pTripleIE = (PCHNL_TXPOWER_TRIPLE)((u8*)pTripleIE + 3);
1442                 }
1443         }
1444         else
1445 #endif
1446         {
1447                 // locale unknown
1448                 _rtw_memcpy(&pAssoStrc->Data[0], &ctrString[0], 3);
1449                 pReg->reXId = 201;
1450                 pReg->regulatoryClass = 254;
1451                 pReg->coverageClass = 0;
1452                 len += 6;
1453                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("PREFERRED_CHNL_LIST\n"));
1454                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("XXX, 201,254,0\n"));
1455                 // at the following, chnl 1~11 should be contained
1456                 pTriple = (PCHNL_TXPOWER_TRIPLE)&pAssoStrc->Data[len];
1457
1458                 // (1) if any wifi or bt HS connection exists
1459                 if ((pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR) ||
1460 #if 0
1461                         pMgntInfo->mAssoc ||
1462                         pMgntInfo->mIbss ||
1463                         IsExtAPModeExist(padapter)) ||
1464 #else
1465                         (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) ||
1466 #endif
1467                         BTHCI_HsConnectionEstablished(padapter))
1468                 {
1469                         pTriple->FirstChnl = preferredChnl;
1470                         pTriple->NumChnls = 1;
1471                         pTriple->MaxTxPowerInDbm = 20;
1472                         len += 3;
1473                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1474                                 pTriple->FirstChnl,
1475                                 pTriple->NumChnls,
1476                                 pTriple->MaxTxPowerInDbm));
1477
1478                         //pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1479                 }
1480 #if 0
1481                 // If we are responder, we can fill all the channel list.
1482                 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole!=AMP_BTAP_CREATOR)
1483                 {
1484                         //
1485                         // When Wifi connection exists, channel should be choosed to the current one.
1486                         // 1. Infra, connect to an AP
1487                         // 2. IBSS, fixed channel
1488                         //
1489                         if (!pMgntInfo->mAssoc &&
1490                                 (padapter->MgntInfo.Regdot11networktype != RT_JOIN_NETWORKTYPE_ADHOC ))
1491                         {
1492                                 // (2) group 2, chnl 1~preferred-1
1493                                 if (preferredChnl > 1 && preferredChnl<15)
1494                                 {
1495                                         pTriple->FirstChnl = 1;
1496                                         pTriple->NumChnls = preferredChnl-1;
1497                                         pTriple->MaxTxPowerInDbm = 20;
1498                                         len += 3;
1499                                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1500                                                 pTriple->FirstChnl,
1501                                                 pTriple->NumChnls,
1502                                                 pTriple->MaxTxPowerInDbm));
1503                                         pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1504
1505                                 }
1506                                 // (3) group 3, preferred+1~chnl 11
1507                                 if (preferredChnl < 11)
1508                                 {
1509                                         pTriple->FirstChnl = preferredChnl+1;
1510                                         pTriple->NumChnls = 11-preferredChnl;
1511                                         pTriple->MaxTxPowerInDbm = 20;
1512                                         len += 3;
1513                                         //pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1514
1515                                         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1516                                                 pTriple->FirstChnl,
1517                                                 pTriple->NumChnls,
1518                                                 pTriple->MaxTxPowerInDbm));
1519                                 }
1520                         }
1521                 }
1522 #endif
1523         }
1524         pAssoStrc->Length = (u16)len;
1525         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, ("AssocPreferredChannelList : \n"), pAssoStrc, pAssoStrc->Length+3);
1526
1527         return (pAssoStrc->Length+3);
1528 }
1529
1530 u16 bthci_AssocPALVer(PADAPTER padapter, void *pbuf)
1531 {
1532         PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1533         u8 *pu1Tmp;
1534         u16     *pu2Tmp;
1535
1536         pAssoStrc->TypeID = AMP_80211_PAL_VISION;
1537         pAssoStrc->Length = 0x5;
1538         pu1Tmp = &pAssoStrc->Data[0];
1539         *pu1Tmp = 0x1;  // PAL Version
1540         pu2Tmp = (u16*)&pAssoStrc->Data[1];
1541         *pu2Tmp = 0x5D; // SIG Company identifier of 802.11 PAL vendor
1542         pu2Tmp = (u16*)&pAssoStrc->Data[3];
1543         *pu2Tmp = 0x1;  // PAL Sub-version specifier
1544
1545         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("AssocPALVer : \n"), pAssoStrc, pAssoStrc->Length+3);
1546         RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("AssocPALVer \n"));
1547
1548         RTPRINT(FIOCTL, IOCTL_BT_LOGO, (" TypeID = 0x%x,\n Length = 0x%x,\n PAL Version = 0x01,\n PAL vendor = 0x01,\n PAL Sub-version specifier = 0x01\n",
1549                 pAssoStrc->TypeID,
1550                 pAssoStrc->Length));
1551         return (pAssoStrc->Length+3);
1552 }
1553
1554 u16
1555 bthci_ReservedForTestingPLV(
1556         PADAPTER        padapter,
1557         void    *pbuf
1558         )
1559 {
1560         PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1561
1562         pAssoStrc->TypeID = AMP_RESERVED_FOR_TESTING;
1563         pAssoStrc->Length = 0x10;
1564
1565         pAssoStrc->Data[0] = 0x00;
1566         pAssoStrc->Data[1] = 0x01;
1567         pAssoStrc->Data[2] = 0x02;
1568         pAssoStrc->Data[3] = 0x03;
1569         pAssoStrc->Data[4] = 0x04;
1570         pAssoStrc->Data[5] = 0x05;
1571         pAssoStrc->Data[6] = 0x06;
1572         pAssoStrc->Data[7] = 0x07;
1573         pAssoStrc->Data[8] = 0x08;
1574         pAssoStrc->Data[9] = 0x09;
1575         pAssoStrc->Data[10] = 0x0a;
1576         pAssoStrc->Data[11] = 0x0b;
1577         pAssoStrc->Data[12] = 0x0c;
1578         pAssoStrc->Data[13] = 0x0d;
1579         pAssoStrc->Data[14] = 0x0e;
1580         pAssoStrc->Data[15] = 0x0f;
1581
1582         return (pAssoStrc->Length+3);
1583 }
1584
1585 u8 bthci_CheckRfStateBeforeConnect(PADAPTER padapter)
1586 {
1587         PBT30Info                               pBTInfo;
1588         rt_rf_power_state               RfState;
1589
1590
1591         pBTInfo = GET_BT_INFO(padapter);
1592
1593 //      rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState));
1594         RfState = padapter->pwrctrlpriv.rf_pwrstate;
1595
1596         if (RfState != rf_on)
1597         {
1598                 PlatformSetTimer(padapter, &pBTInfo->BTPsDisableTimer, 50);
1599                 return _FALSE;
1600         }
1601
1602         return _TRUE;
1603 }
1604
1605 u8
1606 bthci_ConstructScanList(
1607         PBT30Info               pBTInfo,
1608         u8                      *pChannels,
1609         u8                      *pNChannels,
1610         PRT_SCAN_TYPE   pScanType,
1611         u16                     *pDuration
1612         )
1613 {
1614         PADAPTER                                padapter;
1615         PBT_HCI_INFO                            pBtHciInfo;
1616         PCHNL_TXPOWER_TRIPLE    pTriple_subband;
1617         PCOMMON_TRIPLE                  pTriple;
1618         u8                                      chnl, i, j, tripleLetsCnt=0;
1619
1620
1621         padapter = pBTInfo->padapter;
1622         pBtHciInfo = &pBTInfo->BtHciInfo;
1623         *pNChannels = 0;
1624         *pScanType = SCAN_ACTIVE;
1625         *pDuration = 200;
1626
1627         pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
1628
1629         // contains country string, len is 3
1630         for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
1631         {
1632                 if (pTriple->byte_1st == 0xc9)  // Regulatory Extension Identifier, skip it
1633                         continue;
1634                 else                                                    // Sub-band triplet
1635                 {
1636                         tripleLetsCnt++;
1637                         pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
1638
1639                         // search the sub-band triplet and find if remote channel is legal to our channel plan.
1640                         for (chnl = pTriple_subband->FirstChnl; chnl < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls); chnl++)
1641                         {
1642                                 if (BT_IsLegalChannel(padapter, chnl))  // remote channel is legal for our channel plan.
1643                                 {
1644                                         //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1645                                         pChannels[*pNChannels] = chnl;
1646                                         (*pNChannels)++;
1647                                 }
1648                         }
1649                 }
1650         }
1651
1652         if (tripleLetsCnt == 0)
1653         {
1654                 // Fill chnl 1~ chnl 11
1655                 for (chnl=1; chnl<12; chnl++)
1656                 {
1657                         //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1658                         pChannels[*pNChannels] = chnl;
1659                         (*pNChannels)++;
1660                 }
1661         }
1662
1663         if (*pNChannels == 0)
1664                 return _FALSE;
1665         else
1666                 return _TRUE;
1667 }
1668
1669 void bthci_ResponderStartToScan(PADAPTER padapter)
1670 {
1671 #if 0
1672         static u8               Buf[512];
1673         PMGNT_INFO              pMgntInfo = &(padapter->MgntInfo);
1674         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
1675         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
1676         u8                      *pProbeReq = Buf + FIELD_OFFSET(CUSTOMIZED_SCAN_REQUEST, ProbeReqBuf);
1677         u16                     *pProbeReqLen = (u16*)(Buf + FIELD_OFFSET(CUSTOMIZED_SCAN_REQUEST, ProbeReqLen));
1678         PCUSTOMIZED_SCAN_REQUEST pScanReq = (PCUSTOMIZED_SCAN_REQUEST)Buf;
1679         u8                      i;
1680
1681         pBtMgnt->JoinerNeedSendAuth=_TRUE;
1682         pMgntInfo->SettingBeforeScan.WirelessMode = pMgntInfo->dot11CurrentWirelessMode;
1683         pMgntInfo->SettingBeforeScan.ChannelNumber = pMgntInfo->dot11CurrentChannelNumber;
1684         pMgntInfo->SettingBeforeScan.ChannelBandwidth = (HT_CHANNEL_WIDTH)pMgntInfo->pHTInfo->bCurBW40MHz;
1685         pMgntInfo->SettingBeforeScan.ExtChnlOffset = pMgntInfo->pHTInfo->CurSTAExtChnlOffset;
1686         RTPRINT(FIOCTL, IOCTL_STATE, ("[Bt scan], responder start the scan process!!\n"));
1687
1688         pScanReq->bEnabled = _TRUE;
1689         pScanReq->DataRate = MGN_6M;
1690
1691         BTPKT_ConstructProbeRequest(
1692                         padapter,
1693                         pProbeReq,
1694                         pProbeReqLen);
1695
1696         bthci_ConstructScanList(pBTInfo,
1697                 pScanReq->Channels,
1698                 &pScanReq->nChannels,
1699                 &pScanReq->ScanType,
1700                 &pScanReq->Duration);
1701
1702         RTPRINT(FIOCTL, IOCTL_STATE, ("[Bt scan], scan channel list =["));
1703         for (i=0; i<pScanReq->nChannels; i++)
1704         {
1705                 if (i == pScanReq->nChannels-1)
1706                 {
1707                         RTPRINT(FIOCTL, IOCTL_STATE, ("%d", pScanReq->Channels[i]));
1708                 }
1709                 else
1710                 {
1711                         RTPRINT(FIOCTL, IOCTL_STATE, ("%d, \n", pScanReq->Channels[i]));
1712                 }
1713         }
1714         RTPRINT(FIOCTL, IOCTL_STATE, ("]\n"));
1715
1716         RTPRINT(FIOCTL, IOCTL_STATE, ("[Bt scan], customized scan started!!\n"));
1717         pBtMgnt->bBtScan = _TRUE;
1718         MgntActSet_802_11_CustomizedScanRequest((GetDefaultAdapter(padapter)), pScanReq);
1719 #endif
1720 }
1721
1722 u8
1723 bthci_PhyLinkConnectionInProgress(
1724         PADAPTER        padapter,
1725         u8              PhyLinkHandle
1726         )
1727 {
1728         PBT30Info       pBTInfo;
1729         PBT_MGNT        pBtMgnt;
1730
1731
1732         pBTInfo = GET_BT_INFO(padapter);
1733         pBtMgnt = &pBTInfo->BtMgnt;
1734
1735         if (pBtMgnt->bPhyLinkInProgress &&
1736                 (pBtMgnt->BtCurrentPhyLinkhandle == PhyLinkHandle))
1737         {
1738                 return _TRUE;
1739         }
1740         return _FALSE;
1741 }
1742
1743 void
1744 bthci_ResetFlowSpec(
1745         PADAPTER        padapter,
1746         u8      EntryNum,
1747         u8      index
1748         )
1749 {
1750         PBT30Info       pBTinfo;
1751
1752
1753         pBTinfo = GET_BT_INFO(padapter);
1754
1755         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtLogLinkhandle = 0;
1756         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtPhyLinkhandle = 0;
1757         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].bLLCompleteEventIsSet = _FALSE;
1758         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].bLLCancelCMDIsSetandComplete = _FALSE;
1759         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtTxFlowSpecID = 0;
1760         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].TxPacketCount = 0;
1761
1762         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.Identifier = 0x01;
1763         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.ServiceType = SERVICE_BEST_EFFORT;
1764         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.MaximumSDUSize = 0xffff;
1765         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.SDUInterArrivalTime = 0xffffffff;
1766         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.AccessLatency = 0xffffffff;
1767         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.FlushTimeout = 0xffffffff;
1768
1769         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.Identifier = 0x01;
1770         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.ServiceType = SERVICE_BEST_EFFORT;
1771         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.MaximumSDUSize = 0xffff;
1772         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.SDUInterArrivalTime = 0xffffffff;
1773         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.AccessLatency = 0xffffffff;
1774         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.FlushTimeout = 0xffffffff;
1775 }
1776
1777 void bthci_ResetEntry(PADAPTER padapter, u8 EntryNum)
1778 {
1779         PBT30Info               pBTinfo;
1780         PBT_MGNT                pBtMgnt;
1781         u8      j;
1782
1783
1784         pBTinfo = GET_BT_INFO(padapter);
1785         pBtMgnt = &pBTinfo->BtMgnt;
1786
1787         pBTinfo->BtAsocEntry[EntryNum].bUsed=_FALSE;
1788         pBTinfo->BtAsocEntry[EntryNum].BtCurrentState=HCI_STATE_DISCONNECTED;
1789         pBTinfo->BtAsocEntry[EntryNum].BtNextState=HCI_STATE_DISCONNECTED;
1790
1791         pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen=0;
1792         pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle = 0;
1793         if (pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment != NULL)
1794         {
1795                 _rtw_memset(pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment, 0, TOTAL_ALLOCIATE_ASSOC_LEN);
1796         }
1797         pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar=0;
1798
1799         pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType = 0;
1800         pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle = 0;
1801         _rtw_memset(pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey, 0, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
1802         pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen=0;
1803
1804         pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout=0x3e80;//0x640; //0.625ms*1600=1000ms, 0.625ms*16000=10000ms
1805
1806         pBTinfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_NONE;
1807
1808         pBTinfo->BtAsocEntry[EntryNum].mAssoc=_FALSE;
1809         pBTinfo->BtAsocEntry[EntryNum].b4waySuccess = _FALSE;
1810
1811         // Reset BT WPA
1812         pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter = 0;
1813         pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_UNINITIALIZED;
1814
1815         pBTinfo->BtAsocEntry[EntryNum].bSendSupervisionPacket=_FALSE;
1816         pBTinfo->BtAsocEntry[EntryNum].NoRxPktCnt=0;
1817         pBTinfo->BtAsocEntry[EntryNum].ShortRangeMode = 0;
1818         pBTinfo->BtAsocEntry[EntryNum].rxSuvpPktCnt = 0;
1819
1820         for (j=0; j<MAX_LOGICAL_LINK_NUM; j++)
1821         {
1822                 bthci_ResetFlowSpec(padapter, EntryNum, j);
1823         }
1824
1825         pBtMgnt->BTAuthCount = 0;
1826         pBtMgnt->BTAsocCount = 0;
1827         pBtMgnt->BTCurrentConnectType = BT_DISCONNECT;
1828         pBtMgnt->BTReceiveConnectPkt = BT_DISCONNECT;
1829
1830         HALBT_RemoveKey(padapter, EntryNum);
1831 }
1832
1833 void
1834 bthci_RemoveEntryByEntryNum(
1835         PADAPTER        padapter,
1836         u8              EntryNum
1837         )
1838 {
1839         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
1840         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
1841
1842         bthci_ResetEntry(padapter, EntryNum);
1843
1844         if (pBtMgnt->CurrentBTConnectionCnt>0)
1845                 pBtMgnt->CurrentBTConnectionCnt--;
1846
1847         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], CurrentBTConnectionCnt = %d!!\n",
1848                 pBtMgnt->CurrentBTConnectionCnt));
1849
1850         if (pBtMgnt->CurrentBTConnectionCnt > 0)
1851                 pBtMgnt->BtOperationOn = _TRUE;
1852         else
1853         {
1854                 pBtMgnt->BtOperationOn = _FALSE;
1855                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], Bt Operation OFF!!\n"));
1856         }
1857
1858         if (pBtMgnt->BtOperationOn == _FALSE)
1859         {
1860                 PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
1861 #if (SENDTXMEHTOD == 0)
1862                 PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
1863 #endif
1864                 PlatformCancelTimer(padapter, &pBTInfo->BTHCIDiscardAclDataTimer);
1865                 PlatformCancelTimer(padapter, &pBTInfo->BTBeaconTimer);
1866                 pBtMgnt->bStartSendSupervisionPkt = _FALSE;
1867 #if (RTS_CTS_NO_LEN_LIMIT == 1)
1868                 rtw_write32(padapter, 0x4c8, 0xc140402);
1869 #endif
1870         }
1871 }
1872
1873 u8
1874 bthci_CommandCompleteHeader(
1875         u8              *pbuf,
1876         u16             OGF,
1877         u16             OCF,
1878         HCI_STATUS      status
1879         )
1880 {
1881         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1882         u8      NumHCI_Comm = 0x1;
1883
1884
1885         PPacketIrpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
1886         PPacketIrpEvent->Data[0] = NumHCI_Comm; //packet #
1887         PPacketIrpEvent->Data[1] = HCIOPCODELOW(OCF, OGF);
1888         PPacketIrpEvent->Data[2] = HCIOPCODEHIGHT(OCF, OGF);
1889
1890         if (OGF == OGF_EXTENSION)
1891         {
1892                 if (OCF == HCI_SET_RSSI_VALUE)
1893                 {
1894                         RTPRINT(FIOCTL,(IOCTL_BT_EVENT_PERIODICAL), ("[BT event], CommandComplete, Num_HCI_Comm = 0x%x, Opcode = 0x%02x%02x, status = 0x%x, OGF = 0x%x, OCF = 0x%x\n",
1895                                 NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1896                 }
1897                 else
1898                 {
1899                         RTPRINT(FIOCTL,(IOCTL_BT_HCICMD_EXT), ("[BT event], CommandComplete, Num_HCI_Comm = 0x%x, Opcode = 0x%02x%02x, status = 0x%x, OGF = 0x%x, OCF = 0x%x\n",
1900                                 NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1901                 }
1902         }
1903         else
1904         {
1905                 RTPRINT(FIOCTL,(IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("[BT event], CommandComplete, Num_HCI_Comm = 0x%x, Opcode = 0x%02x%02x, status = 0x%x, OGF = 0x%x, OCF = 0x%x\n",
1906                         NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1907         }
1908         return 3;
1909 }
1910
1911 u8 bthci_ExtensionEventHeader(u8 *pbuf, u8 extensionEvent)
1912 {
1913         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1914         PPacketIrpEvent->EventCode = HCI_EVENT_EXTENSION_MOTO;
1915         PPacketIrpEvent->Data[0] = extensionEvent;      //extension event code
1916
1917         return 1;
1918 }
1919
1920 u8 bthci_ExtensionEventHeaderRtk(u8 *pbuf, u8 extensionEvent)
1921 {
1922         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1923         PPacketIrpEvent->EventCode = HCI_EVENT_EXTENSION_RTK;
1924         PPacketIrpEvent->Data[0] = extensionEvent;      //extension event code
1925
1926         return 1;
1927 }
1928
1929 RT_STATUS
1930 bthci_IndicateEvent(
1931         PADAPTER        padapter,
1932         void            *pEvntData,
1933         u32             dataLen
1934         )
1935 {
1936         RT_STATUS       rt_status;
1937
1938         rt_status = PlatformIndicateBTEvent(padapter, pEvntData, dataLen);
1939
1940         return rt_status;
1941 }
1942
1943 void
1944 bthci_EventWriteRemoteAmpAssoc(
1945         PADAPTER        padapter,
1946         HCI_STATUS      status,
1947         u8              PLHandle
1948         )
1949 {
1950         u8 localBuf[TmpLocalBufSize] = "";
1951         u8 *pRetPar;
1952         u8 len = 0;
1953         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1954
1955         PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
1956         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1957
1958         len += bthci_CommandCompleteHeader(&localBuf[0],
1959                 OGF_STATUS_PARAMETERS,
1960                 HCI_WRITE_REMOTE_AMP_ASSOC,
1961                 status);
1962         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("PhyLinkHandle = 0x%x, status = %d\n", PLHandle, status));
1963         // Return parameters starts from here
1964         pRetPar = &PPacketIrpEvent->Data[len];
1965         pRetPar[0] = status;            //status
1966         pRetPar[1] = PLHandle;
1967         len += 2;
1968         PPacketIrpEvent->Length = len;
1969
1970         bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
1971 }
1972
1973 void
1974 bthci_EventEnhancedFlushComplete(
1975         PADAPTER                                        padapter,
1976         u16                                     LLH
1977         )
1978 {
1979         u8      localBuf[4] = "";
1980         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1981         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("EventEnhancedFlushComplete, LLH = 0x%x\n", LLH));
1982
1983         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1984         PPacketIrpEvent->EventCode=HCI_EVENT_ENHANCED_FLUSH_COMPLETE;
1985         PPacketIrpEvent->Length=2;
1986         //Logical link handle
1987         PPacketIrpEvent->Data[0] = TWOBYTE_LOWBYTE(LLH);
1988         PPacketIrpEvent->Data[1] = TWOBYTE_HIGHTBYTE(LLH);
1989
1990         bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
1991 }
1992
1993 void
1994 bthci_EventShortRangeModeChangeComplete(
1995         PADAPTER                                        padapter,
1996         HCI_STATUS                              HciStatus,
1997         u8                                      ShortRangeState,
1998         u8                                      EntryNum
1999         )
2000 {
2001         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2002         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2003         u8      localBuf[5] = "";
2004         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2005
2006         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_SHORT_RANGE_MODE_CHANGE_COMPLETE))
2007         {
2008                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Short Range Mode Change Complete, Ignore to send this event due to event mask page 2\n"));
2009                 return;
2010         }
2011         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Short Range Mode Change Complete, Status = %d\n , PLH = 0x%x\n, Short_Range_Mode_State = 0x%x\n",
2012                 HciStatus, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle, ShortRangeState));
2013
2014         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2015         PPacketIrpEvent->EventCode=HCI_EVENT_SHORT_RANGE_MODE_CHANGE_COMPLETE;
2016         PPacketIrpEvent->Length=3;
2017         PPacketIrpEvent->Data[0] = HciStatus;
2018         PPacketIrpEvent->Data[1] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2019         PPacketIrpEvent->Data[2] = ShortRangeState;
2020         bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
2021 }
2022
2023 void
2024 bthci_EventSendFlowSpecModifyComplete(
2025         PADAPTER                                        padapter,
2026         HCI_STATUS                              HciStatus,
2027         u16                                     logicHandle
2028         )
2029 {
2030         u8      localBuf[5] = "";
2031         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2032         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2033         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2034
2035         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_FLOW_SPEC_MODIFY_COMPLETE))
2036         {
2037                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("[BT event], Flow Spec Modify Complete, Ignore to send this event due to event mask page 2\n"));
2038                 return;
2039         }
2040         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("[BT event], Flow Spec Modify Complete, status = 0x%x, LLH = 0x%x\n",HciStatus,logicHandle));
2041         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2042         PPacketIrpEvent->EventCode=HCI_EVENT_FLOW_SPEC_MODIFY_COMPLETE;
2043         PPacketIrpEvent->Length=3;
2044
2045         PPacketIrpEvent->Data[0] = HciStatus;
2046         //Logical link handle
2047         PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(logicHandle);
2048         PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(logicHandle);
2049
2050         bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
2051 }
2052
2053 void
2054 bthci_EventExtGetBTRSSI(
2055         PADAPTER                                        padapter,
2056         u16                                             ConnectionHandle
2057         )
2058 {
2059         u8 len = 0;
2060         u8      localBuf[7] = "";
2061         u8 *pRetPar;
2062         u16     *pu2Temp;
2063         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2064
2065         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2066
2067         len += bthci_ExtensionEventHeader(&localBuf[0],
2068                         HCI_EVENT_GET_BT_RSSI);
2069
2070         // Return parameters starts from here
2071         pRetPar = &PPacketIrpEvent->Data[len];
2072         pu2Temp = (u16*)&pRetPar[0];
2073         *pu2Temp = ConnectionHandle;
2074         len += 2;
2075
2076         PPacketIrpEvent->Length = len;
2077         if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
2078         {
2079                 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("[BT event], Get BT RSSI, Connection Handle = 0x%x, Extension event code = 0x%x\n",
2080                         ConnectionHandle, HCI_EVENT_GET_BT_RSSI));
2081         }
2082 }
2083
2084 void
2085 bthci_EventExtWifiScanNotify(
2086         PADAPTER                                        padapter,
2087         u8                                              scanType
2088         )
2089 {
2090         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2091         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
2092         u8 len = 0;
2093         u8 localBuf[7] = "";
2094         u8 *pRetPar;
2095         u8 *pu1Temp;
2096         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2097
2098         if (!pBtMgnt->BtOperationOn)
2099                 return;
2100
2101         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2102
2103         len += bthci_ExtensionEventHeaderRtk(&localBuf[0], HCI_EVENT_EXT_WIFI_SCAN_NOTIFY);
2104
2105         // Return parameters starts from here
2106         pRetPar = &PPacketIrpEvent->Data[len];
2107         pu1Temp = (u8*)&pRetPar[0];
2108         *pu1Temp = scanType;
2109         len += 1;
2110
2111         PPacketIrpEvent->Length = len;
2112
2113         if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
2114         {
2115                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Wifi scan notify, scan type = %d\n",
2116                         scanType));
2117         }
2118 }
2119
2120
2121 void
2122 bthci_EventAMPReceiverReport(
2123         PADAPTER        padapter,
2124         u8              Reason
2125         )
2126 {
2127         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
2128         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
2129
2130         if (pBtHciInfo->bTestNeedReport)
2131         {
2132                 u8 localBuf[20] = "";
2133                 u32     *pu4Temp;
2134                 u16     *pu2Temp;
2135                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2136
2137
2138                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), (" HCI_EVENT_AMP_RECEIVER_REPORT \n"));
2139                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2140                 PPacketIrpEvent->EventCode = HCI_EVENT_AMP_RECEIVER_REPORT;
2141                 PPacketIrpEvent->Length = 2;
2142
2143                 PPacketIrpEvent->Data[0] = pBtHciInfo->TestCtrType;
2144
2145                 PPacketIrpEvent->Data[1] =Reason;
2146
2147                 pu4Temp = (u32*)&PPacketIrpEvent->Data[2];
2148                 *pu4Temp = pBtHciInfo->TestEventType;
2149
2150                 pu2Temp = (u16*)&PPacketIrpEvent->Data[6];
2151                 *pu2Temp = pBtHciInfo->TestNumOfFrame;
2152
2153                 pu2Temp = (u16*)&PPacketIrpEvent->Data[8];
2154                 *pu2Temp = pBtHciInfo->TestNumOfErrFrame;
2155
2156                 pu4Temp = (u32*)&PPacketIrpEvent->Data[10];
2157                 *pu4Temp = pBtHciInfo->TestNumOfBits;
2158
2159                 pu4Temp = (u32*)&PPacketIrpEvent->Data[14];
2160                 *pu4Temp = pBtHciInfo->TestNumOfErrBits;
2161
2162                 bthci_IndicateEvent(padapter, PPacketIrpEvent, 20);
2163
2164                 //Return to Idel state with RX and TX off.
2165
2166         }
2167
2168         pBtHciInfo->TestNumOfFrame = 0x00;
2169 }
2170
2171 void
2172 bthci_EventChannelSelected(
2173         PADAPTER                                padapter,
2174         u8                              EntryNum
2175         )
2176 {
2177         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2178         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2179         u8      localBuf[3] = "";
2180         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2181
2182         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_CHANNEL_SELECT))
2183         {
2184                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Channel Selected, Ignore to send this event due to event mask page 2\n"));
2185                 return;
2186         }
2187
2188         RTPRINT(FIOCTL, IOCTL_BT_EVENT|IOCTL_STATE, ("[BT event], Channel Selected, PhyLinkHandle %d\n",
2189                 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle));
2190
2191         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2192         PPacketIrpEvent->EventCode=HCI_EVENT_CHANNEL_SELECT;
2193         PPacketIrpEvent->Length=1;
2194         PPacketIrpEvent->Data[0] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2195         bthci_IndicateEvent(padapter, PPacketIrpEvent, 3);
2196 }
2197
2198 void
2199 bthci_EventDisconnectPhyLinkComplete(
2200         PADAPTER                                        padapter,
2201         HCI_STATUS                              HciStatus,
2202         HCI_STATUS                              Reason,
2203         u8                                      EntryNum
2204         )
2205 {
2206         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2207         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2208         u8      localBuf[5] = "";
2209         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2210
2211         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_PHY_LINK_COMPLETE))
2212         {
2213                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
2214                 return;
2215         }
2216         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Physical Link Complete, Status = 0x%x, PLH = 0x%x Reason =0x%x\n",
2217                 HciStatus,pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,Reason));
2218         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2219         PPacketIrpEvent->EventCode=HCI_EVENT_DISCONNECT_PHY_LINK_COMPLETE;
2220         PPacketIrpEvent->Length=3;
2221         PPacketIrpEvent->Data[0] = HciStatus;
2222         PPacketIrpEvent->Data[1] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2223         PPacketIrpEvent->Data[2] = Reason;
2224         bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
2225 }
2226
2227 void
2228 bthci_EventPhysicalLinkComplete(
2229         PADAPTER                                        padapter,
2230         HCI_STATUS                              HciStatus,
2231         u8                                      EntryNum,
2232         u8                                      PLHandle
2233         )
2234 {
2235         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2236         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
2237         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2238         PBT_DBG                 pBtDbg=&pBTInfo->BtDbg;
2239         u8                      localBuf[4] = "";
2240         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2241         u8                      PL_handle;
2242
2243         pBtMgnt->bPhyLinkInProgress = _FALSE;
2244         pBtDbg->dbgHciInfo.hciCmdPhyLinkStatus = HciStatus;
2245         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_PHY_LINK_COMPLETE))
2246         {
2247                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
2248                 return;
2249         }
2250
2251         if (EntryNum == 0xff)
2252         {
2253                 // connection not started yet, just use the input physical link handle to response.
2254                 PL_handle = PLHandle;
2255         }
2256         else
2257         {
2258                 // connection is under progress, use the phy link handle we recorded.
2259                 PL_handle  = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2260                 pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent=_FALSE;
2261         }
2262
2263         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Status = 0x%x PhyLinkHandle = 0x%x\n",HciStatus,
2264                 PL_handle));
2265
2266         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2267         PPacketIrpEvent->EventCode=HCI_EVENT_PHY_LINK_COMPLETE;
2268         PPacketIrpEvent->Length=2;
2269
2270         PPacketIrpEvent->Data[0] = HciStatus;
2271         PPacketIrpEvent->Data[1] = PL_handle;
2272         bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
2273
2274 }
2275
2276 void
2277 bthci_EventCommandStatus(
2278         PADAPTER                                        padapter,
2279         u8                                      OGF,
2280         u16                                     OCF,
2281         HCI_STATUS                              HciStatus
2282         )
2283 {
2284
2285         u8 localBuf[6] = "";
2286         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2287         u8      Num_Hci_Comm = 0x1;
2288         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], CommandStatus, Opcode = 0x%02x%02x, OGF=0x%x,  OCF=0x%x, Status = 0x%x, Num_HCI_COMM = 0x%x\n",
2289                 (HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), OGF, OCF, HciStatus,Num_Hci_Comm));
2290
2291         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2292         PPacketIrpEvent->EventCode=HCI_EVENT_COMMAND_STATUS;
2293         PPacketIrpEvent->Length=4;
2294         PPacketIrpEvent->Data[0] = HciStatus;   //current pending
2295         PPacketIrpEvent->Data[1] = Num_Hci_Comm;        //packet #
2296         PPacketIrpEvent->Data[2] = HCIOPCODELOW(OCF, OGF);
2297         PPacketIrpEvent->Data[3] = HCIOPCODEHIGHT(OCF, OGF);
2298
2299         bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
2300
2301 }
2302
2303 void
2304 bthci_EventLogicalLinkComplete(
2305         PADAPTER                                        padapter,
2306         HCI_STATUS                              HciStatus,
2307         u8                                      PhyLinkHandle,
2308         u16                                     LogLinkHandle,
2309         u8                                      LogLinkIndex,
2310         u8                                      EntryNum
2311         )
2312 {
2313 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2314         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
2315         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2316         u8      localBuf[7] = "";
2317         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2318
2319         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_LOGICAL_LINK_COMPLETE))
2320         {
2321                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
2322                 return;
2323         }
2324         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Logical Link Complete, PhyLinkHandle = 0x%x,  LogLinkHandle = 0x%x, Status= 0x%x\n",
2325                 PhyLinkHandle, LogLinkHandle, HciStatus));
2326
2327
2328         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2329         PPacketIrpEvent->EventCode = HCI_EVENT_LOGICAL_LINK_COMPLETE;
2330         PPacketIrpEvent->Length = 5;
2331
2332         PPacketIrpEvent->Data[0] = HciStatus;//status code
2333         //Logical link handle
2334         PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(LogLinkHandle);
2335         PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
2336         //Physical link handle
2337         PPacketIrpEvent->Data[3] = TWOBYTE_LOWBYTE(PhyLinkHandle);
2338         //corresponding Tx flow spec ID
2339         if (HciStatus == HCI_STATUS_SUCCESS)
2340         {
2341                 PPacketIrpEvent->Data[4] =
2342                         pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData[LogLinkIndex].Tx_Flow_Spec.Identifier;
2343         }
2344         else
2345                 PPacketIrpEvent->Data[4] = 0x0;
2346
2347         bthci_IndicateEvent(padapter, PPacketIrpEvent, 7);
2348 }
2349
2350 void
2351 bthci_EventDisconnectLogicalLinkComplete(
2352         PADAPTER                                        padapter,
2353         HCI_STATUS                              HciStatus,
2354         u16                                     LogLinkHandle,
2355         HCI_STATUS                              Reason
2356         )
2357 {
2358         u8 localBuf[6] = "";
2359         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2360         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
2361         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2362
2363         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE))
2364         {
2365                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
2366                 return;
2367         }
2368         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Logical Link Complete, Status = 0x%x,LLH = 0x%x Reason =0x%x\n",HciStatus,LogLinkHandle,Reason));
2369
2370         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2371         PPacketIrpEvent->EventCode=HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE;
2372         PPacketIrpEvent->Length=4;
2373
2374         PPacketIrpEvent->Data[0] = HciStatus;
2375         //Logical link handle
2376         PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(LogLinkHandle);
2377         PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
2378         //Disconnect reason
2379         PPacketIrpEvent->Data[3] = Reason;
2380
2381         bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
2382 }
2383
2384 void
2385 bthci_EventFlushOccurred(
2386         PADAPTER                                        padapter,
2387         u16                                     LogLinkHandle
2388         )
2389 {
2390         u8      localBuf[4] = "";
2391         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2392         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("bthci_EventFlushOccurred(), LLH = 0x%x\n", LogLinkHandle));
2393
2394         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2395         PPacketIrpEvent->EventCode = HCI_EVENT_FLUSH_OCCRUED;
2396         PPacketIrpEvent->Length = 2;
2397         //Logical link handle
2398         PPacketIrpEvent->Data[0] = TWOBYTE_LOWBYTE(LogLinkHandle);
2399         PPacketIrpEvent->Data[1] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
2400
2401         bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
2402 }
2403
2404 HCI_STATUS
2405 bthci_BuildPhysicalLink(
2406         PADAPTER                                                padapter,
2407         PPACKET_IRP_HCICMD_DATA         pHciCmd,
2408         u16                                                     OCF
2409 )
2410 {
2411         HCI_STATUS              status = HCI_STATUS_SUCCESS;
2412         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2413         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
2414         u8                      EntryNum, PLH;
2415
2416         //Send HCI Command status event to AMP.
2417         bthci_EventCommandStatus(padapter,
2418                         OGF_LINK_CONTROL_COMMANDS,
2419                         OCF,
2420                         HCI_STATUS_SUCCESS);
2421
2422         PLH = *((u8*)pHciCmd->Data);
2423
2424         // Check if resource or bt connection is under progress, if yes, reject the link creation.
2425         if (bthci_AddEntry(padapter) == _FALSE)
2426         {
2427                 status = HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE;
2428                 bthci_EventPhysicalLinkComplete(padapter, status, INVALID_ENTRY_NUM, PLH);
2429                 return status;
2430         }
2431
2432         EntryNum=pBtMgnt->CurrentConnectEntryNum;
2433         pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle = PLH;
2434         pBtMgnt->BtCurrentPhyLinkhandle = PLH;
2435
2436         if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment == NULL)
2437         {
2438                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Create/Accept PhysicalLink, AMP controller is busy\n"));
2439                 status = HCI_STATUS_CONTROLLER_BUSY;
2440                 bthci_EventPhysicalLinkComplete(padapter, status, INVALID_ENTRY_NUM, PLH);
2441                 return status;
2442         }
2443
2444         // Record Key and the info
2445         pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen=(*((u8*)pHciCmd->Data+1));
2446         pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType=(*((u8*)pHciCmd->Data+2));
2447         _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey,
2448                 (((u8*)pHciCmd->Data+3)), pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
2449 #if (LOCAL_PMK == 1)
2450         _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PMK, testPMK, PMK_LEN);
2451 #else
2452         _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PMK, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey, PMK_LEN);
2453 #endif
2454         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildPhysicalLink, EntryNum = %d, PLH = 0x%x  KeyLen = 0x%x, KeyType =0x%x\n",
2455                 EntryNum, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,
2456                 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen,
2457                 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType));
2458         RTPRINT_DATA(FIOCTL, (IOCTL_BT_LOGO|IOCTL_BT_HCICMD), ("BtAMPKey\n"), pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey,
2459                 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
2460         RTPRINT_DATA(FIOCTL, (IOCTL_BT_LOGO|IOCTL_BT_HCICMD), ("PMK\n"), pBTInfo->BtAsocEntry[EntryNum].PMK,
2461                 PMK_LEN);
2462
2463         if (OCF == HCI_CREATE_PHYSICAL_LINK)
2464         {
2465                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_CREATE_PHY_LINK, EntryNum);
2466         }
2467         else if (OCF == HCI_ACCEPT_PHYSICAL_LINK)
2468         {
2469                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ACCEPT_PHY_LINK, EntryNum);
2470         }
2471
2472         return status;
2473 }
2474
2475 void
2476 bthci_BuildLogicalLink(
2477         PADAPTER                                                padapter,
2478         PPACKET_IRP_HCICMD_DATA         pHciCmd,
2479         u16                                             OCF
2480         )
2481 {
2482         HCI_STATUS status = HCI_STATUS_SUCCESS;
2483 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2484         PBT30Info       pBTinfo = GET_BT_INFO(padapter);
2485         PBT_MGNT        pBtMgnt = &pBTinfo->BtMgnt;
2486         u8      PhyLinkHandle, EntryNum;
2487         static u16 AssignLogHandle = 1;
2488
2489         HCI_FLOW_SPEC   TxFlowSpec;
2490         HCI_FLOW_SPEC   RxFlowSpec;
2491         u32     MaxSDUSize, ArriveTime, Bandwidth;
2492
2493         PhyLinkHandle = *((u8*)pHciCmd->Data);
2494
2495         EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2496
2497         _rtw_memcpy(&TxFlowSpec,
2498                 &pHciCmd->Data[1], sizeof(HCI_FLOW_SPEC));
2499         _rtw_memcpy(&RxFlowSpec,
2500                 &pHciCmd->Data[17], sizeof(HCI_FLOW_SPEC));
2501
2502 #if 0   //for logo special test case only
2503                 if (i==0)
2504                 {
2505                         bthci_SelectFlowType(padapter,BT_TX_BE_FS,BT_RX_BE_FS,&TxFlowSpec,&RxFlowSpec);
2506                         i=1;
2507                 }
2508                 else if (i==1)
2509                 {
2510                         bthci_SelectFlowType(padapter,BT_TX_GU_FS,BT_RX_GU_FS,&TxFlowSpec,&RxFlowSpec);
2511                         i=0;
2512                 }
2513 #endif
2514
2515         MaxSDUSize = TxFlowSpec.MaximumSDUSize;
2516         ArriveTime = TxFlowSpec.SDUInterArrivalTime;
2517
2518         if (bthci_CheckLogLinkBehavior(padapter, TxFlowSpec)&& bthci_CheckLogLinkBehavior(padapter, RxFlowSpec))
2519         {
2520                 Bandwidth = BTTOTALBANDWIDTH;
2521         }
2522         else if (MaxSDUSize==0xffff && ArriveTime==0xffffffff)
2523         {
2524                 Bandwidth = BTTOTALBANDWIDTH;
2525         }
2526         else
2527         {
2528                 Bandwidth = MaxSDUSize*8*1000/(ArriveTime+244);
2529         }
2530
2531 #if 0
2532         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, PhyLinkHandle = 0x%x, MaximumSDUSize = 0x%lx, SDUInterArrivalTime = 0x%lx, Bandwidth=0x%lx\n",
2533                 PhyLinkHandle, MaxSDUSize,ArriveTime, Bandwidth));
2534 #else
2535         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, PhyLinkHandle=0x%x, MaximumSDUSize=0x%x, SDUInterArrivalTime=0x%x, Bandwidth=0x%x\n",
2536                 PhyLinkHandle, MaxSDUSize, ArriveTime, Bandwidth));
2537 #endif
2538
2539         if (EntryNum == 0xff)
2540         {
2541                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Invalid Physical Link handle = 0x%x, status=HCI_STATUS_UNKNOW_CONNECT_ID, return\n", PhyLinkHandle));
2542                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2543
2544                 //When we receive Create/Accept logical link command, we should send command status event first.
2545                 bthci_EventCommandStatus(padapter,
2546                         OGF_LINK_CONTROL_COMMANDS,
2547                         OCF,
2548                         status);
2549                 return;
2550         }
2551
2552         if (pBtMgnt->bLogLinkInProgress == _FALSE)
2553         {
2554                 if (bthci_PhyLinkConnectionInProgress(padapter, PhyLinkHandle))
2555                 {
2556                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Physical link connection in progress, status=HCI_STATUS_CMD_DISALLOW, return\n"));
2557                         status = HCI_STATUS_CMD_DISALLOW;
2558
2559                         pBtMgnt->bPhyLinkInProgressStartLL = _TRUE;
2560                         //When we receive Create/Accept logical link command, we should send command status event first.
2561                         bthci_EventCommandStatus(padapter,
2562                                 OGF_LINK_CONTROL_COMMANDS,
2563                                 OCF,
2564                                 status);
2565
2566                         return;
2567                 }
2568
2569                 if (Bandwidth > BTTOTALBANDWIDTH)//BTTOTALBANDWIDTH
2570                 {
2571                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_QOS_REJECT, Bandwidth=0x%x, return\n", Bandwidth));
2572                         status = HCI_STATUS_QOS_REJECT;
2573
2574                         //When we receive Create/Accept logical link command, we should send command status event first.
2575                         bthci_EventCommandStatus(padapter,
2576                                 OGF_LINK_CONTROL_COMMANDS,
2577                                 OCF,
2578                                 status);
2579                 }
2580                 else
2581                 {
2582                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_SUCCESS\n"));
2583                         status = HCI_STATUS_SUCCESS;
2584
2585                         //When we receive Create/Accept logical link command, we should send command status event first.
2586                         bthci_EventCommandStatus(padapter,
2587                                 OGF_LINK_CONTROL_COMMANDS,
2588                                 OCF,
2589                                 status);
2590
2591 #if 0// special logo test case only
2592                         bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2593 #endif
2594                 }
2595
2596                 if (pBTinfo->BtAsocEntry[EntryNum].BtCurrentState != HCI_STATE_CONNECTED)
2597                 {
2598                         bthci_EventLogicalLinkComplete(padapter,
2599                                 HCI_STATUS_CMD_DISALLOW, 0, 0, 0,EntryNum);
2600                 }
2601                 else
2602                 {
2603                         u8 i, find=0;
2604
2605                         pBtMgnt->bLogLinkInProgress = _TRUE;
2606
2607                         // find an unused logical link index and copy the data
2608                         for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
2609                         {
2610                                 if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle == 0)
2611                                 {
2612                                         HCI_STATUS LogCompEventstatus = HCI_STATUS_SUCCESS;
2613
2614                                         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtPhyLinkhandle = *((u8*)pHciCmd->Data);
2615                                         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle = AssignLogHandle;
2616                                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, EntryNum = %d, physical link handle = 0x%x, logical link handle = 0x%x\n",
2617                                                 EntryNum, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,
2618                                                                   pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle));
2619                                         _rtw_memcpy(&pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].Tx_Flow_Spec,
2620                                                 &TxFlowSpec, sizeof(HCI_FLOW_SPEC));
2621                                         _rtw_memcpy(&pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].Rx_Flow_Spec,
2622                                                 &RxFlowSpec, sizeof(HCI_FLOW_SPEC));
2623
2624                                         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet=_FALSE;
2625
2626                                         if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCancelCMDIsSetandComplete)
2627                                         {
2628                                                 LogCompEventstatus = HCI_STATUS_UNKNOW_CONNECT_ID;
2629                                         }
2630                                         bthci_EventLogicalLinkComplete(padapter,
2631                                                 LogCompEventstatus,
2632                                                 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtPhyLinkhandle,
2633                                                 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle, i,EntryNum);
2634
2635                                         pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet = _TRUE;
2636
2637                                         find = 1;
2638                                         pBtMgnt->BtCurrentLogLinkhandle = AssignLogHandle;
2639                                         AssignLogHandle++;
2640                                         break;
2641                                 }
2642                         }
2643
2644                         if (!find)
2645                         {
2646                                 bthci_EventLogicalLinkComplete(padapter,
2647                                         HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE, 0, 0, 0,EntryNum);
2648                         }
2649                         pBtMgnt->bLogLinkInProgress = _FALSE;
2650                 }
2651         }
2652         else
2653         {
2654                 bthci_EventLogicalLinkComplete(padapter,
2655                         HCI_STATUS_CONTROLLER_BUSY, 0, 0, 0,EntryNum);
2656         }
2657
2658 #if 0// special logo test case only
2659         bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2660 #endif
2661 }
2662
2663 void
2664 bthci_StartBeaconAndConnect(
2665         PADAPTER        padapter,
2666         PPACKET_IRP_HCICMD_DATA         pHciCmd,
2667         u8              CurrentAssocNum
2668         )
2669 {
2670 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2671         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2672         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
2673
2674         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("StartBeaconAndConnect, CurrentAssocNum=%d, AMPRole=%d\n",
2675                 CurrentAssocNum,
2676                 pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole));
2677
2678         if (pBtMgnt->CheckChnlIsSuit == _FALSE)
2679         {
2680                 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND, CurrentAssocNum, INVALID_PL_HANDLE);
2681                 bthci_RemoveEntryByEntryNum(padapter, CurrentAssocNum);
2682                 return;
2683         }
2684
2685         {
2686                 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2687                 {
2688                         rsprintf((char*)pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf,32,"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
2689 #if 0
2690                         padapter->PermanentAddress[0],
2691                         padapter->PermanentAddress[1],
2692                         padapter->PermanentAddress[2],
2693                         padapter->PermanentAddress[3],
2694                         padapter->PermanentAddress[4],
2695                         padapter->PermanentAddress[5]);
2696 #else
2697                         padapter->eeprompriv.mac_addr[0],
2698                         padapter->eeprompriv.mac_addr[1],
2699                         padapter->eeprompriv.mac_addr[2],
2700                         padapter->eeprompriv.mac_addr[3],
2701                         padapter->eeprompriv.mac_addr[4],
2702                         padapter->eeprompriv.mac_addr[5]);
2703 #endif
2704                 }
2705                 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
2706                 {
2707                         rsprintf((char*)pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf,32,"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
2708                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[0],
2709                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[1],
2710                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[2],
2711                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[3],
2712                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[4],
2713                         pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[5]);
2714                 }
2715
2716                 FillOctetString(pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid, pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf, 21);
2717                 pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid.Length = 21;
2718
2719                 //To avoid set the start ap or connect twice, or the original connection will be disconnected.
2720                 if (!pBtMgnt->bBTConnectInProgress)
2721                 {
2722                         pBtMgnt->bBTConnectInProgress=_TRUE;
2723                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress ON!!\n"));
2724                         BTHCI_SM_WITH_INFO(padapter,HCI_STATE_STARTING,STATE_CMD_MAC_START_COMPLETE,CurrentAssocNum);
2725
2726 #if 0   //for logo special test case only
2727                         bthci_BuildLogicalLink(padapter, pHciCmd, HCI_CREATE_LOGICAL_LINK);
2728 #endif
2729
2730                         // 20100325 Joseph: Check RF ON/OFF.
2731                         // If RF OFF, it reschedule connecting operation after 50ms.
2732                         if (!bthci_CheckRfStateBeforeConnect(padapter))
2733                                 return;
2734
2735                         if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2736                         {
2737 //                              BTPKT_StartBeacon(padapter, CurrentAssocNum); // not implement yet
2738                                 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTING,STATE_CMD_MAC_CONNECT_COMPLETE,CurrentAssocNum);
2739                         }
2740                         else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
2741                         {
2742                                 bthci_ResponderStartToScan(padapter);
2743                         }
2744                 }
2745                 RT_PRINT_STR(_module_rtl871x_mlme_c_, _drv_notice_, "StartBeaconAndConnect, SSID:\n", pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTSsid.Octet, pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTSsid.Length);
2746         }
2747 }
2748
2749 void bthci_ResetBtMgnt(PBT_MGNT pBtMgnt)
2750 {
2751         pBtMgnt->BtOperationOn = _FALSE;
2752         pBtMgnt->bBTConnectInProgress = _FALSE;
2753         pBtMgnt->bLogLinkInProgress = _FALSE;
2754         pBtMgnt->bPhyLinkInProgress = _FALSE;
2755         pBtMgnt->bPhyLinkInProgressStartLL = _FALSE;
2756         pBtMgnt->DisconnectEntryNum = 0xff;
2757         pBtMgnt->bStartSendSupervisionPkt = _FALSE;
2758         pBtMgnt->JoinerNeedSendAuth = _FALSE;
2759         pBtMgnt->CurrentBTConnectionCnt = 0;
2760         pBtMgnt->BTCurrentConnectType = BT_DISCONNECT;
2761         pBtMgnt->BTReceiveConnectPkt = BT_DISCONNECT;
2762         pBtMgnt->BTAuthCount = 0;
2763         pBtMgnt->btLogoTest = 0;
2764 }
2765
2766 void bthci_ResetBtHciInfo(PBT_HCI_INFO pBtHciInfo)
2767 {
2768         pBtHciInfo->BTEventMask = 0;
2769         pBtHciInfo->BTEventMaskPage2 = 0;
2770         pBtHciInfo->ConnAcceptTimeout =  10000;
2771         pBtHciInfo->PageTimeout  =  0x30;
2772         pBtHciInfo->LocationDomainAware = 0x0;
2773         pBtHciInfo->LocationDomain = 0x5858;
2774         pBtHciInfo->LocationDomainOptions = 0x58;
2775         pBtHciInfo->LocationOptions = 0x0;
2776         pBtHciInfo->FlowControlMode = 0x1;      // 0:Packet based data flow control mode(BR/EDR), 1: Data block based data flow control mode(AMP).
2777
2778         pBtHciInfo->enFlush_LLH = 0;
2779         pBtHciInfo->FLTO_LLH = 0;
2780
2781         //Test command only
2782         pBtHciInfo->bTestIsEnd = _TRUE;
2783         pBtHciInfo->bInTestMode = _FALSE;
2784         pBtHciInfo->bTestNeedReport = _FALSE;
2785         pBtHciInfo->TestScenario = 0xff;
2786         pBtHciInfo->TestReportInterval = 0x01;
2787         pBtHciInfo->TestCtrType = 0x5d;
2788         pBtHciInfo->TestEventType = 0x00;
2789         pBtHciInfo->TestNumOfFrame = 0;
2790         pBtHciInfo->TestNumOfErrFrame = 0;
2791         pBtHciInfo->TestNumOfBits = 0;
2792         pBtHciInfo->TestNumOfErrBits = 0;
2793 }
2794
2795 void bthci_ResetBtSec(PADAPTER padapter, PBT_SECURITY pBtSec)
2796 {
2797 //      PMGNT_INFO      pMgntInfo = &padapter->MgntInfo;
2798
2799         // Set BT used HW or SW encrypt !!
2800         if (GET_HAL_DATA(padapter)->bBTMode)
2801                 pBtSec->bUsedHwEncrypt = _TRUE;
2802         else
2803                 pBtSec->bUsedHwEncrypt = _FALSE;
2804         RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("%s: bUsedHwEncrypt=%d\n", __FUNCTION__, pBtSec->bUsedHwEncrypt));
2805
2806         pBtSec->RSNIE.Octet = pBtSec->RSNIEBuf;
2807 }
2808
2809 void bthci_ResetBtExtInfo(PBT_MGNT pBtMgnt)
2810 {
2811         u8      i;
2812
2813         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
2814         {
2815                 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = 0;
2816                 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = 0;
2817                 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = 0;
2818                 pBtMgnt->ExtConfig.linkInfo[i].BTProfile = BT_PROFILE_NONE;
2819                 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = BT_SPEC_2_1_EDR;
2820                 pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI = 0;
2821                 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
2822                 pBtMgnt->ExtConfig.linkInfo[i].linkRole = BT_LINK_MASTER;
2823         }
2824
2825         pBtMgnt->ExtConfig.CurrentConnectHandle = 0;
2826         pBtMgnt->ExtConfig.CurrentIncomingTrafficMode = 0;
2827         pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode = 0;
2828         pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
2829         pBtMgnt->ExtConfig.NumberOfHandle = 0;
2830         pBtMgnt->ExtConfig.NumberOfSCO = 0;
2831         pBtMgnt->ExtConfig.CurrentBTStatus = 0;
2832         pBtMgnt->ExtConfig.HCIExtensionVer = 0;
2833
2834         pBtMgnt->ExtConfig.bManualControl = _FALSE;
2835         pBtMgnt->ExtConfig.bBTBusy = _FALSE;
2836         pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
2837 }
2838
2839 HCI_STATUS bthci_CmdReset(PADAPTER _padapter, u8 bNeedSendEvent)
2840 {
2841         HCI_STATUS status = HCI_STATUS_SUCCESS;
2842         PADAPTER        padapter;
2843 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2844         PBT30Info               pBTInfo;
2845         PBT_MGNT                pBtMgnt;
2846         PBT_HCI_INFO            pBtHciInfo;
2847         PBT_SECURITY            pBtSec;
2848         PBT_DBG                 pBtDbg;
2849         u8      i;
2850
2851
2852         RTPRINT(FIOCTL,IOCTL_BT_HCICMD, ("bthci_CmdReset()\n"));
2853
2854         padapter = GetDefaultAdapter(_padapter);
2855         pBTInfo = GET_BT_INFO(padapter);
2856         pBtMgnt = &pBTInfo->BtMgnt;
2857         pBtHciInfo = &pBTInfo->BtHciInfo;
2858         pBtSec = &pBTInfo->BtSec;
2859         pBtDbg = &pBTInfo->BtDbg;
2860
2861         pBTInfo->padapter = padapter;
2862
2863         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
2864         {
2865                 bthci_ResetEntry(padapter, i);
2866         }
2867
2868         bthci_ResetBtMgnt(pBtMgnt);
2869         bthci_ResetBtHciInfo(pBtHciInfo);
2870         bthci_ResetBtSec(padapter, pBtSec);
2871
2872         pBtMgnt->BTChannel = BT_Default_Chnl;
2873         pBtMgnt->CheckChnlIsSuit = _TRUE;
2874
2875         pBTInfo->BTBeaconTmrOn = _FALSE;
2876 //      QosInitializeBssDesc(&pBtMgnt->bssDesc.BssQos); // not implement yet
2877
2878         pBtMgnt->bCreateSpportQos=_TRUE;
2879
2880         PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
2881 #if (SENDTXMEHTOD == 0)
2882         PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
2883 #endif
2884         PlatformCancelTimer(padapter, &pBTInfo->BTHCIDiscardAclDataTimer);
2885         PlatformCancelTimer(padapter, &pBTInfo->BTBeaconTimer);
2886
2887         HALBT_SetRtsCtsNoLenLimit(padapter);
2888         //
2889         // Maybe we need to take care Group != AES case !!
2890         // now we Pairwise and Group all used AES !!
2891 //      BTPKT_ConstructRSNIE(padapter); // not implement yet
2892
2893         bthci_ResetBtExtInfo(pBtMgnt);
2894
2895         //send command complete event here when all data are received.
2896         if (bNeedSendEvent)
2897         {
2898                 u8 localBuf[6] = "";
2899                 u8 *pRetPar;
2900                 u8 len = 0;
2901                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2902
2903                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2904
2905                 len += bthci_CommandCompleteHeader(&localBuf[0],
2906                         OGF_SET_EVENT_MASK_COMMAND,
2907                         HCI_RESET,
2908                         status);
2909
2910                 // Return parameters starts from here
2911                 pRetPar = &PPacketIrpEvent->Data[len];
2912                 pRetPar[0] = status;            //status
2913                 len += 1;
2914                 PPacketIrpEvent->Length = len;
2915
2916                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2917         }
2918
2919         return status;
2920 }
2921
2922 HCI_STATUS
2923 bthci_CmdWriteRemoteAMPAssoc(
2924         PADAPTER        padapter,
2925         PPACKET_IRP_HCICMD_DATA         pHciCmd
2926         )
2927 {
2928         HCI_STATUS status = HCI_STATUS_SUCCESS;
2929         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2930         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
2931         u8                      CurrentAssocNum;
2932         u8                      PhyLinkHandle;
2933
2934         pBtDbg->dbgHciInfo.hciCmdCntWriteRemoteAmpAssoc++;
2935         PhyLinkHandle = *((u8*)pHciCmd->Data);
2936         CurrentAssocNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2937
2938         if (CurrentAssocNum == 0xff)
2939         {
2940                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, No such Handle in the Entry\n"));
2941                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2942                 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2943                 return status;
2944         }
2945
2946         if (pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment == NULL)
2947         {
2948                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, AMP controller is busy\n"));
2949                 status = HCI_STATUS_CONTROLLER_BUSY;
2950                 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2951                 return status;
2952         }
2953
2954         pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.BtPhyLinkhandle = PhyLinkHandle;//*((u8*)pHciCmd->Data);
2955         pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar = *((u16*)((u8*)pHciCmd->Data+1));
2956         pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen = *((u16*)((u8*)pHciCmd->Data+3));
2957
2958         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, LenSoFar= 0x%x, AssocRemLen= 0x%x\n",
2959                 pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar,pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen));
2960
2961         RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc fragment \n"), pHciCmd->Data,pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen+5);
2962         if ((pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen) > MAX_AMP_ASSOC_FRAG_LEN)
2963         {
2964                 _rtw_memcpy(((u8*)pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment+(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar*(sizeof(u8)))),
2965                         (u8*)pHciCmd->Data+5,
2966                         MAX_AMP_ASSOC_FRAG_LEN);
2967         }
2968         else
2969         {
2970                 _rtw_memcpy((u8*)(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment)+(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar*(sizeof(u8))),
2971                         ((u8*)pHciCmd->Data+5),
2972                         (pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen));
2973
2974                 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "WriteRemoteAMPAssoc :\n",
2975                         pHciCmd->Data+5, pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen);
2976
2977                 if (!bthci_GetAssocInfo(padapter, CurrentAssocNum))
2978                         status=HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
2979
2980                 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2981
2982                 bthci_StartBeaconAndConnect(padapter,pHciCmd,CurrentAssocNum);
2983         }
2984
2985         return status;
2986 }
2987
2988 //7.3.13
2989 HCI_STATUS bthci_CmdReadConnectionAcceptTimeout(PADAPTER padapter)
2990 {
2991         HCI_STATUS              status = HCI_STATUS_SUCCESS;
2992 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
2993         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
2994         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
2995
2996         {
2997                 u8 localBuf[8] = "";
2998                 u8 *pRetPar;
2999                 u8 len = 0;
3000                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3001                 u16 *pu2Temp;
3002
3003                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3004
3005                 len += bthci_CommandCompleteHeader(&localBuf[0],
3006                         OGF_SET_EVENT_MASK_COMMAND,
3007                         HCI_READ_CONNECTION_ACCEPT_TIMEOUT,
3008                         status);
3009
3010                 // Return parameters starts from here
3011                 pRetPar = &PPacketIrpEvent->Data[len];
3012                 pRetPar[0] = status;            //status
3013                 pu2Temp = (u16*)&pRetPar[1];            // Conn_Accept_Timeout
3014                 *pu2Temp = pBtHciInfo->ConnAcceptTimeout;
3015                 len += 3;
3016                 PPacketIrpEvent->Length = len;
3017
3018                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3019         }
3020
3021         return status;
3022 }
3023
3024 //7.3.3
3025 HCI_STATUS
3026 bthci_CmdSetEventFilter(
3027         PADAPTER        padapter,
3028         PPACKET_IRP_HCICMD_DATA         pHciCmd
3029         )
3030 {
3031         HCI_STATUS status = HCI_STATUS_SUCCESS;
3032
3033         return status;
3034 }
3035
3036 //7.3.14
3037 HCI_STATUS
3038 bthci_CmdWriteConnectionAcceptTimeout(
3039         PADAPTER        padapter,
3040         PPACKET_IRP_HCICMD_DATA         pHciCmd
3041         )
3042 {
3043         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3044 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3045         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3046         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3047         u16     *pu2Temp;
3048
3049         pu2Temp = (u16*)&pHciCmd->Data[0];
3050         pBtHciInfo->ConnAcceptTimeout = *pu2Temp;
3051         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("ConnAcceptTimeout = 0x%x",
3052                 pBtHciInfo->ConnAcceptTimeout));
3053
3054         //send command complete event here when all data are received.
3055         {
3056                 u8 localBuf[6] = "";
3057                 u8 *pRetPar;
3058                 u8 len = 0;
3059                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3060
3061                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3062
3063                 len += bthci_CommandCompleteHeader(&localBuf[0],
3064                         OGF_SET_EVENT_MASK_COMMAND,
3065                         HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT,
3066                         status);
3067
3068                 // Return parameters starts from here
3069                 pRetPar = &PPacketIrpEvent->Data[len];
3070                 pRetPar[0] = status;            //status
3071                 len += 1;
3072                 PPacketIrpEvent->Length = len;
3073
3074                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3075         }
3076
3077         return status;
3078 }
3079
3080 HCI_STATUS
3081 bthci_CmdReadPageTimeout(
3082         PADAPTER        padapter,
3083         PPACKET_IRP_HCICMD_DATA         pHciCmd
3084         )
3085 {
3086         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3087 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3088         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3089         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3090
3091         {
3092                 u8 localBuf[8] = "";
3093                 u8 *pRetPar;
3094                 u8 len = 0;
3095                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3096                 u16 *pu2Temp;
3097
3098                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3099
3100                 len += bthci_CommandCompleteHeader(&localBuf[0],
3101                         OGF_SET_EVENT_MASK_COMMAND,
3102                         HCI_READ_PAGE_TIMEOUT,
3103                         status);
3104
3105                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Read PageTimeout = 0x%x\n", pBtHciInfo->PageTimeout));
3106                 // Return parameters starts from here
3107                 pRetPar = &PPacketIrpEvent->Data[len];
3108                 pRetPar[0] = status;            //status
3109                 pu2Temp = (u16*)&pRetPar[1];            // Page_Timeout
3110                 *pu2Temp = pBtHciInfo->PageTimeout;
3111                 len+=3;
3112                 PPacketIrpEvent->Length = len;
3113
3114                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3115         }
3116
3117         return status;
3118 }
3119
3120 HCI_STATUS
3121 bthci_CmdWritePageTimeout(
3122         PADAPTER        padapter,
3123         PPACKET_IRP_HCICMD_DATA         pHciCmd
3124         )
3125 {
3126         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3127 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3128         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3129         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3130         u16     *pu2Temp;
3131
3132         pu2Temp = (u16*)&pHciCmd->Data[0];
3133         pBtHciInfo->PageTimeout = *pu2Temp;
3134         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Write PageTimeout = 0x%x\n",
3135                 pBtHciInfo->PageTimeout));
3136
3137         //send command complete event here when all data are received.
3138         {
3139                 u8 localBuf[6] = "";
3140                 u8 *pRetPar;
3141                 u8 len = 0;
3142                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3143
3144                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3145
3146                 len += bthci_CommandCompleteHeader(&localBuf[0],
3147                         OGF_SET_EVENT_MASK_COMMAND,
3148                         HCI_WRITE_PAGE_TIMEOUT,
3149                         status);
3150
3151                 // Return parameters starts from here
3152                 pRetPar = &PPacketIrpEvent->Data[len];
3153                 pRetPar[0] = status;            //status
3154                 len += 1;
3155                 PPacketIrpEvent->Length = len;
3156
3157                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3158         }
3159
3160         return status;
3161 }
3162
3163 HCI_STATUS
3164 bthci_CmdReadLinkSupervisionTimeout(
3165         PADAPTER        padapter,
3166         PPACKET_IRP_HCICMD_DATA         pHciCmd
3167         )
3168 {
3169         HCI_STATUS      status = HCI_STATUS_SUCCESS;
3170         PBT30Info       pBTinfo = GET_BT_INFO(padapter);
3171         u8                      physicalLinkHandle, EntryNum;
3172
3173         physicalLinkHandle = *((u8*)pHciCmd->Data);
3174
3175         EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
3176
3177         if (EntryNum == 0xff)
3178         {
3179                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLinkSupervisionTimeout, No such Handle in the Entry\n"));
3180                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3181                 return status;
3182         }
3183
3184         if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
3185                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3186
3187         {
3188                 u8 localBuf[10] = "";
3189                 u8 *pRetPar;
3190                 u8 len = 0;
3191                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3192                 u16 *pu2Temp;
3193
3194                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3195
3196                 len += bthci_CommandCompleteHeader(&localBuf[0],
3197                         OGF_SET_EVENT_MASK_COMMAND,
3198                         HCI_READ_LINK_SUPERVISION_TIMEOUT,
3199                         status);
3200
3201                 // Return parameters starts from here
3202                 pRetPar = &PPacketIrpEvent->Data[len];
3203                 pRetPar[0] = status;
3204                 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
3205                 pRetPar[2] = 0;
3206                 pu2Temp = (u16*)&pRetPar[3];            // Conn_Accept_Timeout
3207                 *pu2Temp = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout;
3208                 len += 5;
3209                 PPacketIrpEvent->Length = len;
3210
3211                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3212         }
3213
3214         return status;
3215 }
3216
3217 HCI_STATUS
3218 bthci_CmdWriteLinkSupervisionTimeout(
3219         PADAPTER        padapter,
3220         PPACKET_IRP_HCICMD_DATA         pHciCmd
3221         )
3222 {
3223         HCI_STATUS      status = HCI_STATUS_SUCCESS;
3224         PBT30Info       pBTinfo = GET_BT_INFO(padapter);
3225         u8                      physicalLinkHandle, EntryNum;
3226
3227         physicalLinkHandle = *((u8*)pHciCmd->Data);
3228
3229         EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
3230
3231         if (EntryNum == 0xff)
3232         {
3233                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("WriteLinkSupervisionTimeout, No such Handle in the Entry\n"));
3234                 status=HCI_STATUS_UNKNOW_CONNECT_ID;
3235         }
3236         else
3237         {
3238                 if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
3239                         status = HCI_STATUS_UNKNOW_CONNECT_ID;
3240                 else
3241                 {
3242                         pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout=*((u16 *)(((u8*)pHciCmd->Data)+2));
3243                         RTPRINT(FIOCTL, IOCTL_STATE, ("BT Write LinkSuperversionTimeout[%d] = 0x%x\n",
3244                                 EntryNum, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout));
3245                 }
3246         }
3247
3248         {
3249                 u8 localBuf[8] = "";
3250                 u8 *pRetPar;
3251                 u8 len = 0;
3252                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3253
3254                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3255
3256                 len += bthci_CommandCompleteHeader(&localBuf[0],
3257                         OGF_SET_EVENT_MASK_COMMAND,
3258                         HCI_WRITE_LINK_SUPERVISION_TIMEOUT,
3259                         status);
3260
3261                 // Return parameters starts from here
3262                 pRetPar = &PPacketIrpEvent->Data[len];
3263                 pRetPar[0] = status;
3264                 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
3265                 pRetPar[2] = 0;
3266                 len += 3;
3267                 PPacketIrpEvent->Length = len;
3268
3269                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3270         }
3271
3272         return status;
3273 }
3274
3275 HCI_STATUS
3276 bthci_CmdEnhancedFlush(
3277         PADAPTER        padapter,
3278         PPACKET_IRP_HCICMD_DATA         pHciCmd
3279         )
3280 {
3281         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3282         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
3283         PBT_HCI_INFO    pBtHciInfo = &pBTinfo->BtHciInfo;
3284         u16             logicHandle;
3285         u8              Packet_Type;
3286
3287         logicHandle = *((u16*)&pHciCmd->Data[0]);
3288         Packet_Type = pHciCmd->Data[2];
3289
3290         if (Packet_Type != 0)
3291         {
3292                 status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
3293         }
3294         else
3295                 pBtHciInfo->enFlush_LLH = logicHandle;
3296
3297         if (bthci_DiscardTxPackets(padapter, pBtHciInfo->enFlush_LLH))
3298         {
3299                 bthci_EventFlushOccurred(padapter, pBtHciInfo->enFlush_LLH);
3300         }
3301
3302         // should send command status event
3303         bthci_EventCommandStatus(padapter,
3304                         OGF_SET_EVENT_MASK_COMMAND,
3305                         HCI_ENHANCED_FLUSH,
3306                         status);
3307
3308         if (pBtHciInfo->enFlush_LLH)
3309         {
3310                 bthci_EventEnhancedFlushComplete(padapter, pBtHciInfo->enFlush_LLH);
3311                 pBtHciInfo->enFlush_LLH = 0;
3312         }
3313
3314         return status;
3315 }
3316
3317 HCI_STATUS
3318 bthci_CmdReadLogicalLinkAcceptTimeout(
3319         PADAPTER        padapter,
3320         PPACKET_IRP_HCICMD_DATA         pHciCmd
3321         )
3322 {
3323         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3324 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3325         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3326         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3327
3328         {
3329                 u8 localBuf[8] = "";
3330                 u8 *pRetPar;
3331                 u8 len = 0;
3332                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3333                 u16 *pu2Temp;
3334
3335                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3336
3337                 len += bthci_CommandCompleteHeader(&localBuf[0],
3338                         OGF_SET_EVENT_MASK_COMMAND,
3339                         HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT,
3340                         status);
3341
3342                 // Return parameters starts from here
3343                 pRetPar = &PPacketIrpEvent->Data[len];
3344                 pRetPar[0] = status;
3345
3346                 pu2Temp = (u16*)&pRetPar[1];            // Conn_Accept_Timeout
3347                 *pu2Temp = pBtHciInfo->LogicalAcceptTimeout;
3348                 len += 3;
3349                 PPacketIrpEvent->Length = len;
3350
3351                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3352         }
3353
3354         return status;
3355 }
3356
3357 HCI_STATUS
3358 bthci_CmdWriteLogicalLinkAcceptTimeout(
3359         PADAPTER        padapter,
3360         PPACKET_IRP_HCICMD_DATA         pHciCmd
3361         )
3362 {
3363         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3364 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3365         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3366         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3367
3368         pBtHciInfo->LogicalAcceptTimeout = *((u16*)pHciCmd->Data);
3369
3370         {
3371                 u8 localBuf[6] = "";
3372                 u8 *pRetPar;
3373                 u8 len = 0;
3374                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3375
3376                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3377
3378                 len += bthci_CommandCompleteHeader(&localBuf[0],
3379                         OGF_SET_EVENT_MASK_COMMAND,
3380                         HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT,
3381                         status);
3382
3383                 // Return parameters starts from here
3384                 pRetPar = &PPacketIrpEvent->Data[len];
3385                 pRetPar[0] = status;
3386
3387                 len += 1;
3388                 PPacketIrpEvent->Length = len;
3389
3390                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3391         }
3392         return status;
3393 }
3394
3395 HCI_STATUS
3396 bthci_CmdSetEventMask(
3397         PADAPTER        padapter,
3398         PPACKET_IRP_HCICMD_DATA         pHciCmd
3399         )
3400 {
3401         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3402 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3403         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3404         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3405         u8 *pu8Temp;
3406
3407         pu8Temp = (u8*)&pHciCmd->Data[0];
3408         pBtHciInfo->BTEventMask = *pu8Temp;
3409 #if 0
3410         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("BTEventMask = 0x%"i64fmt"x\n",
3411                 ((pBtHciInfo->BTEventMask & UINT64_C(0xffffffff00000000))>>32)));
3412         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("%"i64fmt"x\n",
3413                 (pBtHciInfo->BTEventMask & 0xffffffff)));
3414 #else
3415         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("BTEventMask = 0x%"i64fmt"x\n",
3416                 pBtHciInfo->BTEventMask));
3417 #endif
3418
3419         //send command complete event here when all data are received.
3420         {
3421                 u8 localBuf[6] = "";
3422                 u8 *pRetPar;
3423                 u8 len = 0;
3424                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3425
3426                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3427
3428                 len += bthci_CommandCompleteHeader(&localBuf[0],
3429                         OGF_SET_EVENT_MASK_COMMAND,
3430                         HCI_SET_EVENT_MASK,
3431                         status);
3432
3433                 // Return parameters starts from here
3434                 pRetPar = &PPacketIrpEvent->Data[len];
3435                 pRetPar[0] = status;            //status
3436                 len += 1;
3437                 PPacketIrpEvent->Length = len;
3438
3439                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3440         }
3441
3442         return status;
3443 }
3444
3445 // 7.3.69
3446 HCI_STATUS
3447 bthci_CmdSetEventMaskPage2(
3448         PADAPTER        padapter,
3449         PPACKET_IRP_HCICMD_DATA         pHciCmd
3450         )
3451 {
3452         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3453 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3454         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3455         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3456         u8      *pu8Temp;
3457
3458         pu8Temp = (u8*)&pHciCmd->Data[0];
3459         pBtHciInfo->BTEventMaskPage2 = *pu8Temp;
3460 #if 0
3461         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("BTEventMaskPage2 = 0x%"i64fmt"x\n",
3462                 ((pBtHciInfo->BTEventMaskPage2& UINT64_C(0xffffffff00000000))>>32)));
3463         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("%"i64fmt"x\n",
3464                 (pBtHciInfo->BTEventMaskPage2&0xffffffff)));
3465 #else
3466         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("BTEventMaskPage2 = 0x%"i64fmt"x\n",
3467                 pBtHciInfo->BTEventMaskPage2));
3468 #endif
3469
3470         //send command complete event here when all data are received.
3471         {
3472                 u8 localBuf[6] = "";
3473                 u8 *pRetPar;
3474                 u8 len = 0;
3475                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3476
3477                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3478
3479                 len += bthci_CommandCompleteHeader(&localBuf[0],
3480                         OGF_SET_EVENT_MASK_COMMAND,
3481                         HCI_SET_EVENT_MASK_PAGE_2,
3482                         status);
3483
3484                 // Return parameters starts from here
3485                 pRetPar = &PPacketIrpEvent->Data[len];
3486                 pRetPar[0] = status;            //status
3487                 len += 1;
3488                 PPacketIrpEvent->Length = len;
3489
3490                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3491         }
3492
3493         return status;
3494 }
3495
3496 HCI_STATUS
3497 bthci_CmdReadLocationData(
3498         PADAPTER        padapter,
3499         PPACKET_IRP_HCICMD_DATA         pHciCmd
3500         )
3501 {
3502         HCI_STATUS              status = HCI_STATUS_SUCCESS;
3503 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
3504         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3505         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3506
3507         {
3508                 u8 localBuf[12] = "";
3509                 u8 *pRetPar;
3510                 u8 len = 0;
3511                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3512                 u16 *pu2Temp;
3513
3514                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3515
3516                 len += bthci_CommandCompleteHeader(&localBuf[0],
3517                         OGF_SET_EVENT_MASK_COMMAND,
3518                         HCI_READ_LOCATION_DATA,
3519                         status);
3520                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainAware = 0x%x\n", pBtHciInfo->LocationDomainAware));
3521                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Domain = 0x%x\n", pBtHciInfo->LocationDomain));
3522                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainOptions = 0x%x\n", pBtHciInfo->LocationDomainOptions));
3523                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Options = 0x%x\n", pBtHciInfo->LocationOptions));
3524
3525                 // Return parameters starts from here
3526                 pRetPar = &PPacketIrpEvent->Data[len];
3527                 pRetPar[0] = status;
3528
3529                 pRetPar[1] = pBtHciInfo->LocationDomainAware;   //0x0;  // Location_Domain_Aware
3530                 pu2Temp = (u16*)&pRetPar[2];                                    // Location_Domain
3531                 *pu2Temp = pBtHciInfo->LocationDomain;          //0x5858;
3532                 pRetPar[4] = pBtHciInfo->LocationDomainOptions; //0x58; //Location_Domain_Options
3533                 pRetPar[5] = pBtHciInfo->LocationOptions;               //0x0;  //Location_Options
3534                 len+=6;
3535                 PPacketIrpEvent->Length = len;
3536
3537                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3538         }
3539         return status;
3540 }
3541
3542 HCI_STATUS
3543 bthci_CmdWriteLocationData(
3544         PADAPTER        padapter,
3545         PPACKET_IRP_HCICMD_DATA         pHciCmd
3546         )
3547 {
3548         HCI_STATUS status = HCI_STATUS_SUCCESS;
3549 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3550         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3551         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3552         u16     *pu2Temp;
3553
3554         pBtHciInfo->LocationDomainAware = pHciCmd->Data[0];
3555         pu2Temp = (u16*)&pHciCmd->Data[1];
3556         pBtHciInfo->LocationDomain = *pu2Temp;
3557         pBtHciInfo->LocationDomainOptions = pHciCmd->Data[3];
3558         pBtHciInfo->LocationOptions = pHciCmd->Data[4];
3559         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainAware = 0x%x\n", pBtHciInfo->LocationDomainAware));
3560         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Domain = 0x%x\n", pBtHciInfo->LocationDomain));
3561         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainOptions = 0x%x\n", pBtHciInfo->LocationDomainOptions));
3562         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Options = 0x%x\n", pBtHciInfo->LocationOptions));
3563
3564         //send command complete event here when all data are received.
3565         {
3566                 u8 localBuf[6] = "";
3567                 u8 *pRetPar;
3568                 u8 len = 0;
3569                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3570
3571                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3572
3573                 len += bthci_CommandCompleteHeader(&localBuf[0],
3574                         OGF_SET_EVENT_MASK_COMMAND,
3575                         HCI_WRITE_LOCATION_DATA,
3576                         status);
3577
3578                 // Return parameters starts from here
3579                 pRetPar = &PPacketIrpEvent->Data[len];
3580                 pRetPar[0] = status;            //status
3581                 len += 1;
3582                 PPacketIrpEvent->Length = len;
3583
3584                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3585         }
3586
3587         return status;
3588 }
3589
3590 HCI_STATUS
3591 bthci_CmdReadFlowControlMode(
3592         PADAPTER        padapter,
3593         PPACKET_IRP_HCICMD_DATA         pHciCmd
3594         )
3595 {
3596         HCI_STATUS status = HCI_STATUS_SUCCESS;
3597 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3598         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3599         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3600
3601         {
3602                 u8 localBuf[7] = "";
3603                 u8 *pRetPar;
3604                 u8 len = 0;
3605                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3606
3607                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3608
3609                 len += bthci_CommandCompleteHeader(&localBuf[0],
3610                         OGF_SET_EVENT_MASK_COMMAND,
3611                         HCI_READ_FLOW_CONTROL_MODE,
3612                         status);
3613
3614                 // Return parameters starts from here
3615                 pRetPar = &PPacketIrpEvent->Data[len];
3616                 pRetPar[0] = status;
3617                 pRetPar[1] = pBtHciInfo->FlowControlMode;       // Flow Control Mode
3618                 len += 2;
3619                 PPacketIrpEvent->Length = len;
3620
3621                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3622         }
3623         return status;
3624 }
3625
3626 HCI_STATUS
3627 bthci_CmdWriteFlowControlMode(
3628         PADAPTER        padapter,
3629         PPACKET_IRP_HCICMD_DATA         pHciCmd
3630         )
3631 {
3632         HCI_STATUS status = HCI_STATUS_SUCCESS;
3633 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3634         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
3635         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
3636
3637         pBtHciInfo->FlowControlMode = pHciCmd->Data[0];
3638
3639         //send command complete event here when all data are received.
3640         {
3641                 u8 localBuf[6] = "";
3642                 u8 *pRetPar;
3643                 u8 len = 0;
3644                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3645
3646                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3647
3648                 len += bthci_CommandCompleteHeader(&localBuf[0],
3649                         OGF_SET_EVENT_MASK_COMMAND,
3650                         HCI_WRITE_FLOW_CONTROL_MODE,
3651                         status);
3652
3653                 // Return parameters starts from here
3654                 pRetPar = &PPacketIrpEvent->Data[len];
3655                 pRetPar[0] = status;            //status
3656                 len += 1;
3657                 PPacketIrpEvent->Length = len;
3658
3659                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3660         }
3661
3662         return status;
3663 }
3664
3665 HCI_STATUS
3666 bthci_CmdReadBestEffortFlushTimeout(
3667         PADAPTER        padapter,
3668         PPACKET_IRP_HCICMD_DATA         pHciCmd
3669         )
3670 {
3671         HCI_STATUS status = HCI_STATUS_SUCCESS;
3672 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3673         PBT30Info pBTinfo = GET_BT_INFO(padapter);
3674         u16             i, j, logicHandle;
3675         u32             BestEffortFlushTimeout = 0xffffffff;
3676         u8              find = 0;
3677
3678         logicHandle = *((u16*)pHciCmd->Data);
3679         // find an matched logical link index and copy the data
3680         for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
3681         {
3682                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3683                 {
3684                         if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3685                         {
3686                                 BestEffortFlushTimeout = pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout;
3687                                 find = 1;
3688                                 break;
3689                         }
3690                 }
3691         }
3692
3693         if (!find)
3694                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3695
3696         {
3697                 u8 localBuf[10] = "";
3698                 u8 *pRetPar;
3699                 u8 len = 0;
3700                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3701                 u32 *pu4Temp;
3702
3703                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3704
3705                 len += bthci_CommandCompleteHeader(&localBuf[0],
3706                         OGF_SET_EVENT_MASK_COMMAND,
3707                         HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT,
3708                         status);
3709
3710                 // Return parameters starts from here
3711                 pRetPar = &PPacketIrpEvent->Data[len];
3712                 pRetPar[0] = status;
3713                 pu4Temp = (u32*)&pRetPar[1];                            // Best_Effort_Flush_Timeout
3714                 *pu4Temp = BestEffortFlushTimeout;
3715                 len += 5;
3716                 PPacketIrpEvent->Length = len;
3717
3718                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3719         }
3720         return status;
3721 }
3722
3723 HCI_STATUS
3724 bthci_CmdWriteBestEffortFlushTimeout(
3725         PADAPTER        padapter,
3726         PPACKET_IRP_HCICMD_DATA         pHciCmd
3727         )
3728 {
3729         HCI_STATUS status = HCI_STATUS_SUCCESS;
3730 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3731         PBT30Info pBTinfo = GET_BT_INFO(padapter);
3732         u16             i, j, logicHandle;
3733         u32             BestEffortFlushTimeout = 0xffffffff;
3734         u8              find = 0;
3735
3736         logicHandle = *((u16*)pHciCmd->Data);
3737         BestEffortFlushTimeout = *((u32 *)(pHciCmd->Data+1));
3738
3739         // find an matched logical link index and copy the data
3740         for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
3741         {
3742                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3743                 {
3744                         if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3745                         {
3746                                 pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout = BestEffortFlushTimeout;
3747                                 find = 1;
3748                                 break;
3749                         }
3750                 }
3751         }
3752
3753         if (!find)
3754                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3755
3756         {
3757                 u8 localBuf[6] = "";
3758                 u8 *pRetPar;
3759                 u8 len = 0;
3760                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3761
3762                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3763
3764                 len += bthci_CommandCompleteHeader(&localBuf[0],
3765                         OGF_SET_EVENT_MASK_COMMAND,
3766                         HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT,
3767                         status);
3768
3769                 // Return parameters starts from here
3770                 pRetPar = &PPacketIrpEvent->Data[len];
3771                 pRetPar[0] = status;
3772                 len += 1;
3773                 PPacketIrpEvent->Length = len;
3774
3775                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3776         }
3777         return status;
3778 }
3779
3780 HCI_STATUS
3781 bthci_CmdShortRangeMode(
3782         PADAPTER        padapter,
3783         PPACKET_IRP_HCICMD_DATA         pHciCmd
3784         )
3785 {
3786         HCI_STATUS status = HCI_STATUS_SUCCESS;
3787         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
3788         u8                      PhyLinkHandle, EntryNum, ShortRangeMode;
3789
3790         PhyLinkHandle = pHciCmd->Data[0];
3791         ShortRangeMode = pHciCmd->Data[1];
3792         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PLH = 0x%x, Short_Range_Mode = 0x%x\n", PhyLinkHandle, ShortRangeMode));
3793
3794         EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3795         if (EntryNum != 0xff)
3796         {
3797                 pBTInfo->BtAsocEntry[EntryNum].ShortRangeMode = ShortRangeMode;
3798         }
3799         else
3800         {
3801                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PhyLinkHandle));
3802                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3803         }
3804
3805         bthci_EventCommandStatus(padapter,
3806                         OGF_SET_EVENT_MASK_COMMAND,
3807                         HCI_SHORT_RANGE_MODE,
3808                         status);
3809
3810         bthci_EventShortRangeModeChangeComplete(padapter, status, ShortRangeMode, EntryNum);
3811
3812         return status;
3813 }
3814
3815 HCI_STATUS bthci_CmdReadLocalSupportedCommands(PADAPTER padapter)
3816 {
3817         HCI_STATUS status = HCI_STATUS_SUCCESS;
3818
3819         // send command complete event here when all data are received.
3820         {
3821                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3822                 u8 localBuf[TmpLocalBufSize] = "";
3823                 u8 *pRetPar, *pSupportedCmds;
3824                 u8 len = 0;
3825                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3826
3827                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3828                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3829                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3830
3831                 len += bthci_CommandCompleteHeader(&localBuf[0],
3832                         OGF_INFORMATIONAL_PARAMETERS,
3833                         HCI_READ_LOCAL_SUPPORTED_COMMANDS,
3834                         status);
3835
3836                 // Return parameters starts from here
3837                 pRetPar = &PPacketIrpEvent->Data[len];
3838                 pRetPar[0] = status;            //status
3839                 len += 1;
3840                 pSupportedCmds = &pRetPar[1];
3841                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[5]=0xc0\nBit [6]=Set Event Mask, [7]=Reset\n"));
3842                 pSupportedCmds[5] = 0xc0;
3843                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[6]=0x01\nBit [0]=Set Event Filter\n"));
3844                 pSupportedCmds[6] = 0x01;
3845                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[7]=0x0c\nBit [2]=Read Connection Accept Timeout, [3]=Write Connection Accept Timeout\n"));
3846                 pSupportedCmds[7] = 0x0c;
3847                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[10]=0x80\nBit [7]=Host Number Of Completed Packets\n"));
3848                 pSupportedCmds[10] = 0x80;
3849                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[11]=0x03\nBit [0]=Read Link Supervision Timeout, [1]=Write Link Supervision Timeout\n"));
3850                 pSupportedCmds[11] = 0x03;
3851                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[14]=0xa8\nBit [3]=Read Local Version Information, [5]=Read Local Supported Features, [7]=Read Buffer Size\n"));
3852                 pSupportedCmds[14] = 0xa8;
3853                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[15]=0x1c\nBit [2]=Read Failed Contact Count, [3]=Reset Failed Contact Count, [4]=Get Link Quality\n"));
3854                 pSupportedCmds[15] = 0x1c;
3855                 //pSupportedCmds[16] = 0x04;
3856                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[19]=0x40\nBit [6]=Enhanced Flush\n"));
3857                 pSupportedCmds[19] = 0x40;
3858                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[21]=0xff\nBit [0]=Create Physical Link, [1]=Accept Physical Link, [2]=Disconnect Physical Link, [3]=Create Logical Link\n"));
3859                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("     [4]=Accept Logical Link, [5]=Disconnect Logical Link, [6]=Logical Link Cancel, [7]=Flow Spec Modify\n"));
3860                 pSupportedCmds[21] = 0xff;
3861                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[22]=0xff\nBit [0]=Read Logical Link Accept Timeout, [1]=Write Logical Link Accept Timeout, [2]=Set Event Mask Page 2, [3]=Read Location Data\n"));
3862                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("     [4]=Write Location Data, [5]=Read Local AMP Info, [6]=Read Local AMP_ASSOC, [7]=Write Remote AMP_ASSOC\n"));
3863                 pSupportedCmds[22] = 0xff;
3864                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[23]=0x07\nBit [0]=Read Flow Control Mode, [1]=Write Flow Control Mode, [2]=Read Data Block Size\n"));
3865                 pSupportedCmds[23] = 0x07;
3866                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[24]=0x1c\nBit [2]=Read Best Effort Flush Timeout, [3]=Write Best Effort Flush Timeout, [4]=Short Range Mode\n"));
3867                 pSupportedCmds[24] = 0x1c;
3868                 len += 64;
3869                 PPacketIrpEvent->Length = len;
3870
3871                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3872         }
3873
3874         return status;
3875 }
3876
3877 HCI_STATUS bthci_CmdReadLocalSupportedFeatures(PADAPTER padapter)
3878 {
3879         HCI_STATUS status = HCI_STATUS_SUCCESS;
3880
3881         //send command complete event here when all data are received.
3882         {
3883                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3884                 u8 localBuf[TmpLocalBufSize] = "";
3885                 u8 *pRetPar;
3886                 u8 len = 0;
3887                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3888
3889                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3890                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3891                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3892
3893                 len += bthci_CommandCompleteHeader(&localBuf[0],
3894                         OGF_INFORMATIONAL_PARAMETERS,
3895                         HCI_READ_LOCAL_SUPPORTED_FEATURES,
3896                         status);
3897
3898                 // Return parameters starts from here
3899                 pRetPar = &PPacketIrpEvent->Data[len];
3900                 pRetPar[0] = status;            //status
3901                 len += 9;
3902                 PPacketIrpEvent->Length = len;
3903
3904                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3905         }
3906         return status;
3907 }
3908
3909 HCI_STATUS
3910 bthci_CmdReadLocalAMPAssoc(
3911         PADAPTER        padapter,
3912         PPACKET_IRP_HCICMD_DATA         pHciCmd
3913         )
3914 {
3915         HCI_STATUS status = HCI_STATUS_SUCCESS;
3916         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
3917         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
3918         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
3919         u8                      PhyLinkHandle, EntryNum;
3920
3921         pBtDbg->dbgHciInfo.hciCmdCntReadLocalAmpAssoc++;
3922         PhyLinkHandle = *((u8*)pHciCmd->Data);
3923         EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3924
3925         if ((EntryNum==0xff) && PhyLinkHandle != 0)
3926         {
3927                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, EntryNum = %d  !!!!!, physical link handle = 0x%x\n",
3928                 EntryNum, PhyLinkHandle));
3929                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3930         }
3931         else if (pBtMgnt->bPhyLinkInProgressStartLL)
3932         {
3933                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3934                 pBtMgnt->bPhyLinkInProgressStartLL = _FALSE;
3935         }
3936         else
3937         {
3938                 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle = *((u8*)pHciCmd->Data);
3939                 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar = *((u16*)((u8*)pHciCmd->Data+1));
3940                 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.MaxRemoteASSOCLen = *((u16*)((u8*)pHciCmd->Data+3));
3941                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("ReadLocalAMPAssoc, LenSoFar=%d, MaxRemoteASSOCLen=%d\n",
3942                         pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar,
3943                         pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.MaxRemoteASSOCLen));
3944         }
3945
3946         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, EntryNum = %d  !!!!!, physical link handle = 0x%x, LengthSoFar = %x  \n",
3947                 EntryNum, PhyLinkHandle, pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar));
3948
3949         //send command complete event here when all data are received.
3950         {
3951                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3952
3953                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3954                 u8 localBuf[TmpLocalBufSize] = "";
3955                 u16     *pRemainLen;
3956                 u32     totalLen = 0;
3957                 u16     typeLen=0, remainLen=0, ret_index=0;
3958                 u8 *pRetPar;
3959
3960                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3961                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3962                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3963
3964                 totalLen += bthci_CommandCompleteHeader(&localBuf[0],
3965                         OGF_STATUS_PARAMETERS,
3966                         HCI_READ_LOCAL_AMP_ASSOC,
3967                         status);
3968                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, Remaining_Len=%d  \n", remainLen));
3969                 // Return parameters starts from here
3970                 pRetPar = &PPacketIrpEvent->Data[totalLen];
3971                 pRetPar[0] = status;            //status
3972                 pRetPar[1] = *((u8*)pHciCmd->Data);
3973                 pRemainLen = (u16*)&pRetPar[2];         // AMP_ASSOC_Remaining_Length
3974                 totalLen += 4;  //[0]~[3]
3975                 ret_index = 4;
3976
3977                 typeLen = bthci_AssocMACAddr(padapter, &pRetPar[ret_index]);
3978                 totalLen += typeLen;
3979                 remainLen += typeLen;
3980                 ret_index += typeLen;
3981                 typeLen = bthci_AssocPreferredChannelList(padapter, &pRetPar[ret_index], EntryNum);
3982                 totalLen += typeLen;
3983                 remainLen += typeLen;
3984                 ret_index += typeLen;
3985                 typeLen = bthci_PALCapabilities(padapter, &pRetPar[ret_index]);
3986                 totalLen += typeLen;
3987                 remainLen += typeLen;
3988                 ret_index += typeLen;
3989                 typeLen = bthci_AssocPALVer(padapter, &pRetPar[ret_index]);
3990                 totalLen += typeLen;
3991                 remainLen += typeLen;
3992 #if 0//for logo special test case only
3993                 ret_index += typeLen;
3994                 typeLen = bthci_ReservedForTestingPLV(padapter, &pRetPar[ret_index]);
3995                 totalLen += typeLen;
3996                 remainLen += typeLen;
3997 #endif
3998                 PPacketIrpEvent->Length = (UCHAR)totalLen;
3999                 *pRemainLen = remainLen;        // AMP_ASSOC_Remaining_Length
4000                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, Remaining_Len=%d  \n", remainLen));
4001                 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("AMP_ASSOC_fragment : \n"), PPacketIrpEvent->Data, totalLen);
4002
4003                 bthci_IndicateEvent(padapter, PPacketIrpEvent, totalLen+2);
4004         }
4005
4006         return status;
4007 }
4008
4009 HCI_STATUS
4010 bthci_CmdReadFailedContactCounter(
4011         PADAPTER        padapter,
4012         PPACKET_IRP_HCICMD_DATA         pHciCmd
4013         )
4014 {
4015
4016         HCI_STATUS              status = HCI_STATUS_SUCCESS;
4017 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
4018         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
4019         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
4020         u16             handle;
4021
4022         handle=*((u16*)pHciCmd->Data);
4023         //send command complete event here when all data are received.
4024         {
4025                 u8 localBuf[TmpLocalBufSize] = "";
4026                 u8 *pRetPar;
4027                 u8 len = 0;
4028                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4029
4030                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4031                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4032
4033                 len += bthci_CommandCompleteHeader(&localBuf[0],
4034                         OGF_STATUS_PARAMETERS,
4035                         HCI_READ_FAILED_CONTACT_COUNTER,
4036                         status);
4037
4038                 // Return parameters starts from here
4039                 pRetPar = &PPacketIrpEvent->Data[len];
4040                 pRetPar[0] = status;            //status
4041                 pRetPar[1] = TWOBYTE_LOWBYTE(handle);
4042                 pRetPar[2] = TWOBYTE_HIGHTBYTE(handle);
4043                 pRetPar[3] = TWOBYTE_LOWBYTE(pBtHciInfo->FailContactCount);
4044                 pRetPar[4] = TWOBYTE_HIGHTBYTE(pBtHciInfo->FailContactCount);
4045                 len += 5;
4046                 PPacketIrpEvent->Length = len;
4047
4048                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4049         }
4050
4051         return status;
4052 }
4053
4054 HCI_STATUS
4055 bthci_CmdResetFailedContactCounter(
4056         PADAPTER        padapter,
4057         PPACKET_IRP_HCICMD_DATA         pHciCmd
4058         )
4059 {
4060         HCI_STATUS              status = HCI_STATUS_SUCCESS;
4061 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
4062         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
4063         PBT_HCI_INFO    pBtHciInfo = &pBTInfo->BtHciInfo;
4064         u16             handle;
4065
4066         handle=*((u16*)pHciCmd->Data);
4067         pBtHciInfo->FailContactCount=0;
4068
4069         //send command complete event here when all data are received.
4070         {
4071                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4072                 u8 localBuf[TmpLocalBufSize] = "";
4073                 u8 *pRetPar;
4074                 u8 len = 0;
4075                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4076
4077                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4078                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4079                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4080
4081                 len += bthci_CommandCompleteHeader(&localBuf[0],
4082                         OGF_STATUS_PARAMETERS,
4083                         HCI_RESET_FAILED_CONTACT_COUNTER,
4084                         status);
4085
4086                 // Return parameters starts from here
4087                 pRetPar = &PPacketIrpEvent->Data[len];
4088                 pRetPar[0] = status;            //status
4089                 pRetPar[1] = TWOBYTE_LOWBYTE(handle);
4090                 pRetPar[2] = TWOBYTE_HIGHTBYTE(handle);
4091                 len+=3;
4092                 PPacketIrpEvent->Length = len;
4093
4094                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4095         }
4096         return status;
4097 }
4098
4099 //
4100 // BT 3.0+HS [Vol 2] 7.4.1
4101 //
4102 HCI_STATUS
4103 bthci_CmdReadLocalVersionInformation(
4104         PADAPTER        padapter
4105         )
4106 {
4107         HCI_STATUS status = HCI_STATUS_SUCCESS;
4108
4109         //send command complete event here when all data are received.
4110         {
4111                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4112                 u8 localBuf[TmpLocalBufSize] = "";
4113                 u8 *pRetPar;
4114                 u8 len = 0;
4115                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4116                 u16 *pu2Temp;
4117
4118                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4119                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4120                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4121
4122                 len += bthci_CommandCompleteHeader(&localBuf[0],
4123                         OGF_INFORMATIONAL_PARAMETERS,
4124                         HCI_READ_LOCAL_VERSION_INFORMATION,
4125                         status);
4126
4127                 // Return parameters starts from here
4128                 pRetPar = &PPacketIrpEvent->Data[len];
4129                 pRetPar[0] = status;            //status
4130                 pRetPar[1] = 0x05;                                      // HCI_Version
4131                 pu2Temp = (u16*)&pRetPar[2];            // HCI_Revision
4132                 *pu2Temp = 0x0001;
4133                 pRetPar[4] = 0x05;                                      // LMP/PAL_Version
4134                 pu2Temp = (u16*)&pRetPar[5];            // Manufacturer_Name
4135                 *pu2Temp = 0x005d;
4136                 pu2Temp = (u16*)&pRetPar[7];            // LMP/PAL_Subversion
4137                 *pu2Temp = 0x0001;
4138                 len += 9;
4139                 PPacketIrpEvent->Length = len;
4140
4141                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LOCAL_VERSION_INFORMATION\n"));
4142                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("Status  %x\n",status));
4143                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI_Version = 0x05\n"));
4144                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI_Revision = 0x0001\n"));
4145                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LMP/PAL_Version = 0x05\n"));
4146                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("Manufacturer_Name = 0x0001\n"));
4147                 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LMP/PAL_Subversion = 0x0001\n"));
4148
4149                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4150         }
4151
4152         return status;
4153 }
4154
4155 //7.4.7
4156 HCI_STATUS bthci_CmdReadDataBlockSize(PADAPTER padapter)
4157 {
4158         HCI_STATUS                      status = HCI_STATUS_SUCCESS;
4159
4160         {
4161                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4162                 u8 localBuf[TmpLocalBufSize] = "";
4163                 u8 *pRetPar;
4164                 u8 len = 0;
4165                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4166                 u16 *pu2Temp;
4167
4168                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4169                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4170                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4171
4172                 len += bthci_CommandCompleteHeader(&localBuf[0],
4173                         OGF_INFORMATIONAL_PARAMETERS,
4174                         HCI_READ_DATA_BLOCK_SIZE,
4175                         status);
4176
4177                 // Return parameters starts from here
4178                 pRetPar = &PPacketIrpEvent->Data[len];
4179                 pRetPar[0] = HCI_STATUS_SUCCESS;                //status
4180                 pu2Temp = (u16*)&pRetPar[1];            // Max_ACL_Data_Packet_Length
4181                 *pu2Temp = Max80211PALPDUSize;
4182
4183                 pu2Temp = (u16*)&pRetPar[3];            // Data_Block_Length
4184                 *pu2Temp = Max80211PALPDUSize;
4185                 pu2Temp = (u16*)&pRetPar[5];            // Total_Num_Data_Blocks
4186                 *pu2Temp = BTTotalDataBlockNum;
4187                 len += 7;
4188                 PPacketIrpEvent->Length = len;
4189
4190                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4191         }
4192
4193         return status;
4194 }
4195
4196 // 7.4.5
4197 HCI_STATUS
4198 bthci_CmdReadBufferSize(
4199         PADAPTER                                        padapter
4200         )
4201 {
4202         HCI_STATUS                      status = HCI_STATUS_SUCCESS;
4203
4204         {
4205                 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4206                 u8 localBuf[TmpLocalBufSize] = "";
4207                 u8 *pRetPar;
4208                 u8 len = 0;
4209                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4210                 u16 *pu2Temp;
4211
4212                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4213                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4214                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4215
4216                 len += bthci_CommandCompleteHeader(&localBuf[0],
4217                         OGF_INFORMATIONAL_PARAMETERS,
4218                         HCI_READ_BUFFER_SIZE,
4219                         status);
4220                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Synchronous_Data_Packet_Length = 0x%x\n", BTSynDataPacketLength));
4221                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Total_Num_ACL_Data_Packets = 0x%x\n", BTTotalDataBlockNum));
4222                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Total_Num_Synchronous_Data_Packets = 0x%x\n", BTTotalDataBlockNum));
4223                 // Return parameters starts from here
4224                 pRetPar = &PPacketIrpEvent->Data[len];
4225                 pRetPar[0] = status;            //status
4226                 pu2Temp = (u16*)&pRetPar[1];            // HC_ACL_Data_Packet_Length
4227                 *pu2Temp = Max80211PALPDUSize;
4228
4229                 pRetPar[3] = BTSynDataPacketLength;     // HC_Synchronous_Data_Packet_Length
4230                 pu2Temp = (u16*)&pRetPar[4];            // HC_Total_Num_ACL_Data_Packets
4231                 *pu2Temp = BTTotalDataBlockNum;
4232                 pu2Temp = (u16*)&pRetPar[6];            // HC_Total_Num_Synchronous_Data_Packets
4233                 *pu2Temp = BTTotalDataBlockNum;
4234                 len += 8;
4235                 PPacketIrpEvent->Length = len;
4236
4237                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4238         }
4239
4240         return status;
4241 }
4242
4243 HCI_STATUS
4244 bthci_CmdReadLocalAMPInfo(
4245         PADAPTER                                        padapter
4246         )
4247 {
4248         HCI_STATUS                      status = HCI_STATUS_SUCCESS;
4249
4250         {
4251 //              PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4252                 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
4253                 u8 localBuf[TmpLocalBufSize] = "";
4254                 u8 *pRetPar;
4255                 u8 len = 0;
4256                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4257                 u16 *pu2Temp;
4258                 u32 *pu4Temp;
4259                 u32     TotalBandwidth=BTTOTALBANDWIDTH, MaxBandGUBandwidth=BTMAXBANDGUBANDWIDTH;
4260                 u8      ControlType=0x01, AmpStatus=0x01;
4261                 u32     MaxFlushTimeout=10000, BestEffortFlushTimeout=5000;
4262                 u16 MaxPDUSize=Max80211PALPDUSize, PalCap=0x1, AmpAssocLen=Max80211AMPASSOCLen, MinLatency=20;
4263
4264                 if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
4265                         (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
4266                 {
4267                         AmpStatus = AMP_STATUS_NO_CAPACITY_FOR_BT;
4268                 }
4269
4270                 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4271                 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4272                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4273
4274                 len += bthci_CommandCompleteHeader(&localBuf[0],
4275                         OGF_STATUS_PARAMETERS,
4276                         HCI_READ_LOCAL_AMP_INFO,
4277                         status);
4278
4279                 // Return parameters starts from here
4280                 pRetPar = &PPacketIrpEvent->Data[len];
4281                 pRetPar[0] = status;            //status
4282                 pRetPar[1] = AmpStatus;                                         // AMP_Status
4283                 pu4Temp = (u32*)&pRetPar[2];            // Total_Bandwidth
4284                 *pu4Temp = TotalBandwidth;//0x19bfcc00;//0x7530;
4285                 pu4Temp = (u32*)&pRetPar[6];            // Max_Guaranteed_Bandwidth
4286                 *pu4Temp = MaxBandGUBandwidth;//0x19bfcc00;//0x4e20;
4287                 pu4Temp = (u32*)&pRetPar[10];           // Min_Latency
4288                 *pu4Temp = MinLatency;//150;
4289                 pu4Temp = (u32*)&pRetPar[14];           // Max_PDU_Size
4290                 *pu4Temp = MaxPDUSize;
4291                 pRetPar[18] = ControlType;                                      // Controller_Type
4292                 pu2Temp = (u16*)&pRetPar[19];           // PAL_Capabilities
4293                 *pu2Temp = PalCap;
4294                 pu2Temp = (u16*)&pRetPar[21];           // AMP_ASSOC_Length
4295                 *pu2Temp = AmpAssocLen;
4296                 pu4Temp = (u32*)&pRetPar[23];           // Max_Flush_Timeout
4297                 *pu4Temp = MaxFlushTimeout;
4298                 pu4Temp = (u32*)&pRetPar[27];           // Best_Effort_Flush_Timeout
4299                 *pu4Temp = BestEffortFlushTimeout;
4300                 len += 31;
4301                 PPacketIrpEvent->Length = len;
4302                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("AmpStatus = 0x%x\n",
4303                         AmpStatus));
4304                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("TotalBandwidth = 0x%x, MaxBandGUBandwidth = 0x%x, MinLatency = 0x%x, \n MaxPDUSize = 0x%x, ControlType = 0x%x\n",
4305                         TotalBandwidth,MaxBandGUBandwidth,MinLatency,MaxPDUSize,ControlType));
4306                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PalCap = 0x%x, AmpAssocLen = 0x%x, MaxFlushTimeout = 0x%x, BestEffortFlushTimeout = 0x%x\n",
4307                         PalCap,AmpAssocLen,MaxFlushTimeout,BestEffortFlushTimeout));
4308                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4309         }
4310
4311         return status;
4312 }
4313
4314 HCI_STATUS
4315 bthci_CmdCreatePhysicalLink(
4316         PADAPTER        padapter,
4317         PPACKET_IRP_HCICMD_DATA         pHciCmd
4318         )
4319 {
4320         HCI_STATUS      status;
4321         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4322         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4323
4324         pBtDbg->dbgHciInfo.hciCmdCntCreatePhyLink++;
4325
4326         status = bthci_BuildPhysicalLink(padapter,
4327                 pHciCmd, HCI_CREATE_PHYSICAL_LINK);
4328
4329         return status;
4330 }
4331
4332 HCI_STATUS
4333 bthci_CmdReadLinkQuality(
4334         PADAPTER                                        padapter,
4335         PPACKET_IRP_HCICMD_DATA         pHciCmd
4336         )
4337 {
4338         HCI_STATUS                      status = HCI_STATUS_SUCCESS;
4339         PBT30Info                       pBTInfo = GET_BT_INFO(padapter);
4340         u16                             PLH;
4341         u8                              EntryNum, LinkQuality=0x55;
4342
4343         PLH = *((u16*)&pHciCmd->Data[0]);
4344         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PLH = 0x%x\n", PLH));
4345
4346         EntryNum = bthci_GetCurrentEntryNum(padapter, (u8)PLH);
4347         if (EntryNum == 0xff)
4348         {
4349                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PLH));
4350                 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4351         }
4352
4353         {
4354                 u8 localBuf[11] = "";
4355                 u8 *pRetPar;
4356                 u8 len = 0;
4357                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4358
4359                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4360
4361                 len += bthci_CommandCompleteHeader(&localBuf[0],
4362                         OGF_STATUS_PARAMETERS,
4363                         HCI_READ_LINK_QUALITY,
4364                         status);
4365
4366                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" PLH = 0x%x\n Link Quality = 0x%x\n", PLH, LinkQuality));
4367
4368                 // Return parameters starts from here
4369                 pRetPar = &PPacketIrpEvent->Data[len];
4370                 pRetPar[0] = status;                    //status
4371                 *((u16*)&(pRetPar[1])) = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle; // Handle
4372                 pRetPar[3] = 0x55;      //Link Quailty
4373                 len += 4;
4374                 PPacketIrpEvent->Length = len;
4375
4376                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4377         }
4378
4379         return status;
4380 }
4381
4382 HCI_STATUS bthci_CmdReadRSSI(PADAPTER padapter)
4383 {
4384         HCI_STATUS status = HCI_STATUS_SUCCESS;
4385         return status;
4386 }
4387
4388 HCI_STATUS
4389 bthci_CmdCreateLogicalLink(
4390         PADAPTER        padapter,
4391         PPACKET_IRP_HCICMD_DATA         pHciCmd
4392         )
4393 {
4394         HCI_STATUS status = HCI_STATUS_SUCCESS;
4395         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4396         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4397
4398         pBtDbg->dbgHciInfo.hciCmdCntCreateLogLink++;
4399
4400         bthci_BuildLogicalLink(padapter, pHciCmd,
4401                 HCI_CREATE_LOGICAL_LINK);
4402
4403         return status;
4404 }
4405
4406 HCI_STATUS
4407 bthci_CmdAcceptLogicalLink(
4408         PADAPTER        padapter,
4409         PPACKET_IRP_HCICMD_DATA         pHciCmd
4410         )
4411 {
4412         HCI_STATUS status = HCI_STATUS_SUCCESS;
4413         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4414         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4415
4416         pBtDbg->dbgHciInfo.hciCmdCntAcceptLogLink++;
4417
4418         bthci_BuildLogicalLink(padapter, pHciCmd,
4419                 HCI_ACCEPT_LOGICAL_LINK);
4420
4421         return status;
4422 }
4423
4424 HCI_STATUS
4425 bthci_CmdDisconnectLogicalLink(
4426         PADAPTER        padapter,
4427         PPACKET_IRP_HCICMD_DATA         pHciCmd
4428         )
4429 {
4430         HCI_STATUS status = HCI_STATUS_SUCCESS;
4431 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4432         PBT30Info       pBTinfo = GET_BT_INFO(padapter);
4433         PBT_MGNT        pBtMgnt = &pBTinfo->BtMgnt;
4434         PBT_DBG         pBtDbg = &pBTinfo->BtDbg;
4435         u16     logicHandle;
4436         u8 i, j, find=0, LogLinkCount=0;
4437
4438         pBtDbg->dbgHciInfo.hciCmdCntDisconnectLogLink++;
4439
4440         logicHandle = *((u16*)pHciCmd->Data);
4441         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle = 0x%x\n", logicHandle));
4442
4443         // find an created logical link index and clear the data
4444         for (j=0; j<MAX_BT_ASOC_ENTRY_NUM;j++)
4445         {
4446                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4447                 {
4448                         if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
4449                         {
4450                                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle is matched  0x%x\n", logicHandle));
4451                                 bthci_ResetFlowSpec(padapter, j, i);
4452                                 find = 1;
4453                                 pBtMgnt->DisconnectEntryNum = j;
4454                                 break;
4455                         }
4456                 }
4457         }
4458
4459         if (!find)
4460                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
4461
4462         // To check each
4463         for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4464         {
4465                 if (pBTinfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].LogLinkCmdData[i].BtLogLinkhandle !=0)
4466                 {
4467                         LogLinkCount++;
4468                 }
4469         }
4470
4471         //When we receive Create logical link command, we should send command status event first.
4472         bthci_EventCommandStatus(padapter,
4473                         OGF_LINK_CONTROL_COMMANDS,
4474                         HCI_DISCONNECT_LOGICAL_LINK,
4475                         status);
4476         //
4477         //When we determines the logical link is established, we should send command complete event.
4478         //
4479         if (status == HCI_STATUS_SUCCESS)
4480         {
4481                 bthci_EventDisconnectLogicalLinkComplete(padapter, status,
4482                         logicHandle, HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST);
4483         }
4484
4485         if (LogLinkCount == 0)
4486                 PlatformSetTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer, 100);
4487
4488         return status;
4489 }
4490
4491 HCI_STATUS
4492 bthci_CmdLogicalLinkCancel(
4493         PADAPTER        padapter,
4494         PPACKET_IRP_HCICMD_DATA         pHciCmd
4495         )
4496 {
4497         HCI_STATUS status = HCI_STATUS_SUCCESS;
4498         PBT30Info       pBTinfo = GET_BT_INFO(padapter);
4499         PBT_MGNT        pBtMgnt = &pBTinfo->BtMgnt;
4500         u8      CurrentEntryNum, CurrentLogEntryNum;
4501
4502         u8      physicalLinkHandle, TxFlowSpecID,i;
4503         u16     CurrentLogicalHandle;
4504
4505         physicalLinkHandle = *((u8*)pHciCmd->Data);
4506         TxFlowSpecID = *(((u8*)pHciCmd->Data)+1);
4507
4508         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, physicalLinkHandle = 0x%x, TxFlowSpecID = 0x%x\n",
4509                 physicalLinkHandle, TxFlowSpecID));
4510
4511         CurrentEntryNum=pBtMgnt->CurrentConnectEntryNum;
4512         CurrentLogicalHandle = pBtMgnt->BtCurrentLogLinkhandle;
4513
4514         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("CurrentEntryNum=0x%x, CurrentLogicalHandle = 0x%x\n",
4515                 CurrentEntryNum, CurrentLogicalHandle));
4516
4517         CurrentLogEntryNum = 0xff;
4518         for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4519         {
4520                 if ((CurrentLogicalHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtLogLinkhandle) &&
4521                         (physicalLinkHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtPhyLinkhandle))
4522                 {
4523                         CurrentLogEntryNum = i;
4524                         break;
4525                 }
4526         }
4527
4528         if (CurrentLogEntryNum == 0xff)
4529         {
4530                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, CurrentLogEntryNum==0xff !!!!\n"));
4531                 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4532         }
4533         else
4534         {
4535                 if (pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCompleteEventIsSet)
4536                 {
4537                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, LLCompleteEventIsSet!!!!\n"));
4538                         status=HCI_STATUS_ACL_CONNECT_EXISTS;
4539                 }
4540         }
4541
4542         {
4543                 u8 localBuf[8] = "";
4544                 u8 *pRetPar;
4545                 u8 len = 0;
4546                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4547
4548                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4549
4550                 len += bthci_CommandCompleteHeader(&localBuf[0],
4551                         OGF_LINK_CONTROL_COMMANDS,
4552                         HCI_LOGICAL_LINK_CANCEL,
4553                         status);
4554
4555                 // Return parameters starts from here
4556                 pRetPar = &PPacketIrpEvent->Data[len];
4557                 pRetPar[0] = status;            //status
4558                 pRetPar[1] = pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].BtPhyLinkhandle;
4559                 pRetPar[2] = pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].BtTxFlowSpecID;
4560                 len += 3;
4561                 PPacketIrpEvent->Length = len;
4562
4563                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4564         }
4565
4566         pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCancelCMDIsSetandComplete=_TRUE;
4567
4568         return status;
4569 }
4570
4571 HCI_STATUS
4572 bthci_CmdFlowSpecModify(
4573         PADAPTER        padapter,
4574         PPACKET_IRP_HCICMD_DATA         pHciCmd
4575         )
4576 {
4577         HCI_STATUS status = HCI_STATUS_SUCCESS;
4578 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4579         PBT30Info pBTinfo = GET_BT_INFO(padapter);
4580         u8 i, j, find=0;
4581         u16 logicHandle;
4582
4583         logicHandle = *((u16*)pHciCmd->Data);
4584         // find an matched logical link index and copy the data
4585         for (j=0;j<MAX_BT_ASOC_ENTRY_NUM;j++)
4586         {
4587                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4588                 {
4589                         if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
4590                         {
4591                                 _rtw_memcpy(&pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Tx_Flow_Spec,
4592                                         &pHciCmd->Data[2], sizeof(HCI_FLOW_SPEC));
4593                                 _rtw_memcpy(&pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Rx_Flow_Spec,
4594                                         &pHciCmd->Data[18], sizeof(HCI_FLOW_SPEC));
4595
4596                                 bthci_CheckLogLinkBehavior(padapter, pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Tx_Flow_Spec);
4597                                 find = 1;
4598                                 break;
4599                         }
4600                 }
4601         }
4602         RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("FlowSpecModify, LLH = 0x%x, \n",logicHandle));
4603
4604         //When we receive Flow Spec Modify command, we should send command status event first.
4605         bthci_EventCommandStatus(padapter,
4606                 OGF_LINK_CONTROL_COMMANDS,
4607                 HCI_FLOW_SPEC_MODIFY,
4608                 HCI_STATUS_SUCCESS);
4609
4610         if (!find)
4611                 status = HCI_STATUS_UNKNOW_CONNECT_ID;
4612
4613         bthci_EventSendFlowSpecModifyComplete(padapter, status, logicHandle);
4614
4615         return status;
4616 }
4617
4618 HCI_STATUS
4619 bthci_CmdAcceptPhysicalLink(
4620         PADAPTER        padapter,
4621         PPACKET_IRP_HCICMD_DATA         pHciCmd
4622         )
4623 {
4624         HCI_STATUS      status;
4625         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4626         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4627
4628         pBtDbg->dbgHciInfo.hciCmdCntAcceptPhyLink++;
4629
4630         status = bthci_BuildPhysicalLink(padapter,
4631                 pHciCmd, HCI_ACCEPT_PHYSICAL_LINK);
4632
4633         return status;
4634 }
4635
4636 HCI_STATUS
4637 bthci_CmdDisconnectPhysicalLink(
4638         PADAPTER        padapter,
4639         PPACKET_IRP_HCICMD_DATA         pHciCmd
4640         )
4641 {
4642
4643         HCI_STATUS      status = HCI_STATUS_SUCCESS;
4644         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4645         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4646         u8              PLH, CurrentEntryNum, PhysLinkDisconnectReason;
4647
4648         pBtDbg->dbgHciInfo.hciCmdCntDisconnectPhyLink++;
4649
4650         PLH = *((u8*)pHciCmd->Data);
4651         PhysLinkDisconnectReason = (*((u8*)pHciCmd->Data+1));
4652         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_PHYSICAL_LINK  PhyHandle = 0x%x, Reason=0x%x\n",
4653                 PLH, PhysLinkDisconnectReason));
4654
4655         CurrentEntryNum = bthci_GetCurrentEntryNum(padapter, PLH);
4656
4657         if (CurrentEntryNum == 0xff)
4658         {
4659                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectPhysicalLink, No such Handle in the Entry\n"));
4660                 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4661                 //return status;
4662         }
4663
4664         pBTInfo->BtAsocEntry[CurrentEntryNum].PhyLinkDisconnectReason=(HCI_STATUS)PhysLinkDisconnectReason;
4665         //Send HCI Command status event to AMP.
4666         bthci_EventCommandStatus(padapter,
4667         OGF_LINK_CONTROL_COMMANDS,
4668         HCI_DISCONNECT_PHYSICAL_LINK,
4669         status);
4670
4671         if (status != HCI_STATUS_SUCCESS)
4672                 return status;
4673
4674         if (pBTInfo->BtAsocEntry[CurrentEntryNum].BtCurrentState == HCI_STATE_DISCONNECTED)
4675         {
4676                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4677         }
4678         else
4679         {
4680                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4681         }
4682
4683         return status;
4684 }
4685
4686 HCI_STATUS
4687 bthci_CmdSetACLLinkDataFlowMode(
4688         PADAPTER        padapter,
4689         PPACKET_IRP_HCICMD_DATA         pHciCmd
4690         )
4691 {
4692         HCI_STATUS status = HCI_STATUS_SUCCESS;
4693 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4694         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4695         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4696
4697         pBtMgnt->ExtConfig.CurrentConnectHandle = *((u16*)pHciCmd->Data);
4698         pBtMgnt->ExtConfig.CurrentIncomingTrafficMode = *((u8*)pHciCmd->Data)+2;
4699         pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode = *((u8*)pHciCmd->Data)+3;
4700         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Connection Handle = 0x%x, Incoming Traffic mode = 0x%x, Outgoing Traffic mode = 0x%x",
4701                 pBtMgnt->ExtConfig.CurrentConnectHandle,
4702                 pBtMgnt->ExtConfig.CurrentIncomingTrafficMode,
4703                 pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode));
4704
4705         {
4706                 u8 localBuf[8] = "";
4707                 u8 *pRetPar;
4708                 u8 len = 0;
4709                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4710                 u16 *pu2Temp;
4711
4712                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4713
4714                 len += bthci_CommandCompleteHeader(&localBuf[0],
4715                         OGF_EXTENSION,
4716                         HCI_SET_ACL_LINK_DATA_FLOW_MODE,
4717                         status);
4718
4719                 // Return parameters starts from here
4720                 pRetPar = &PPacketIrpEvent->Data[len];
4721                 pRetPar[0] = status;            //status
4722
4723                 pu2Temp = (u16*)&pRetPar[1];
4724                 *pu2Temp = pBtMgnt->ExtConfig.CurrentConnectHandle;
4725                 len += 3;
4726                 PPacketIrpEvent->Length = len;
4727
4728                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4729         }
4730
4731         return status;
4732 }
4733
4734 HCI_STATUS
4735 bthci_CmdSetACLLinkStatus(
4736         PADAPTER        padapter,
4737         PPACKET_IRP_HCICMD_DATA         pHciCmd
4738         )
4739 {
4740         HCI_STATUS status = HCI_STATUS_SUCCESS;
4741         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4742         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4743         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4744         u8              i;
4745         u8              *pTriple;
4746
4747         pBtDbg->dbgHciInfo.hciCmdCntSetAclLinkStatus++;
4748         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "SetACLLinkStatus, Hex Data :\n",
4749                         &pHciCmd->Data[0], pHciCmd->Length);
4750
4751         // Only Core Stack v251 and later version support this command.
4752         pBtMgnt->bSupportProfile = _TRUE;
4753
4754         pBtMgnt->ExtConfig.NumberOfHandle= *((u8*)pHciCmd->Data);
4755         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfHandle = 0x%x\n", pBtMgnt->ExtConfig.NumberOfHandle));
4756
4757         pTriple = &pHciCmd->Data[1];
4758         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4759         {
4760                 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
4761                 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = pTriple[2];
4762                 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = pTriple[3];
4763                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
4764                         ("Connection_Handle = 0x%x, Incoming Traffic mode = 0x%x, Outgoing Traffic Mode = 0x%x\n",
4765                         pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4766                         pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode,
4767                         pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode));
4768                 pTriple += 4;
4769         }
4770
4771         {
4772                 u8 localBuf[6] = "";
4773                 u8 *pRetPar;
4774                 u8 len = 0;
4775                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4776
4777                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4778
4779                 len += bthci_CommandCompleteHeader(&localBuf[0],
4780                         OGF_EXTENSION,
4781                         HCI_SET_ACL_LINK_STATUS,
4782                         status);
4783
4784                 // Return parameters starts from here
4785                 pRetPar = &PPacketIrpEvent->Data[len];
4786                 pRetPar[0] = status;            //status
4787
4788                 len += 1;
4789                 PPacketIrpEvent->Length = len;
4790
4791                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4792         }
4793
4794         return status;
4795 }
4796
4797 HCI_STATUS
4798 bthci_CmdSetSCOLinkStatus(
4799         PADAPTER        padapter,
4800         PPACKET_IRP_HCICMD_DATA         pHciCmd
4801         )
4802 {
4803         HCI_STATUS status = HCI_STATUS_SUCCESS;
4804 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4805         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4806         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4807         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4808
4809         pBtDbg->dbgHciInfo.hciCmdCntSetScoLinkStatus++;
4810         pBtMgnt->ExtConfig.NumberOfSCO= *((u8*)pHciCmd->Data);
4811         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfSCO = 0x%x\n",
4812                 pBtMgnt->ExtConfig.NumberOfSCO));
4813
4814         {
4815                 u8 localBuf[6] = "";
4816                 u8 *pRetPar;
4817                 u8 len = 0;
4818                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4819
4820                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4821
4822                 len += bthci_CommandCompleteHeader(&localBuf[0],
4823                         OGF_EXTENSION,
4824                         HCI_SET_SCO_LINK_STATUS,
4825                         status);
4826
4827                 // Return parameters starts from here
4828                 pRetPar = &PPacketIrpEvent->Data[len];
4829                 pRetPar[0] = status;            //status
4830
4831                 len += 1;
4832                 PPacketIrpEvent->Length = len;
4833
4834                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4835         }
4836
4837         return status;
4838 }
4839
4840 HCI_STATUS
4841 bthci_CmdSetRSSIValue(
4842         PADAPTER        padapter,
4843         PPACKET_IRP_HCICMD_DATA         pHciCmd
4844         )
4845 {
4846         HCI_STATUS status = HCI_STATUS_SUCCESS;
4847 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4848         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4849         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4850         s8              min_bt_rssi = 0;
4851         u8              i;
4852 #if 0
4853         if (pHciCmd->Length)
4854         {
4855                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("pHciCmd->Length = 0x%x\n", pHciCmd->Length));
4856                 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "SetRSSIValue(), Hex Data :\n",
4857                         &pHciCmd->Data[0], pHciCmd->Length);
4858         }
4859 #endif
4860         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4861         {
4862                 if (pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle == *((u16*)&pHciCmd->Data[0]))
4863                 {
4864                         pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI = (s8)(pHciCmd->Data[2]);
4865                         RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL,
4866                         ("Connection_Handle = 0x%x, RSSI = %d \n",
4867                         pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4868                         pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI));
4869                 }
4870                 // get the minimum bt rssi value
4871                 if (pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI <= min_bt_rssi)
4872                 {
4873                         min_bt_rssi = pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI;
4874                 }
4875         }
4876
4877         {
4878                 pBtMgnt->ExtConfig.MIN_BT_RSSI = min_bt_rssi;
4879                 RTPRINT(FBT, BT_TRACE, ("[bt rssi], the min rssi is %d\n", min_bt_rssi));
4880         }
4881
4882         {
4883                 u8 localBuf[6] = "";
4884                 u8 *pRetPar;
4885                 u8 len = 0;
4886                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4887
4888                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4889
4890                 len += bthci_CommandCompleteHeader(&localBuf[0],
4891                         OGF_EXTENSION,
4892                         HCI_SET_RSSI_VALUE,
4893                         status);
4894
4895                 // Return parameters starts from here
4896                 pRetPar = &PPacketIrpEvent->Data[len];
4897                 pRetPar[0] = status;            //status
4898
4899                 len += 1;
4900                 PPacketIrpEvent->Length = len;
4901
4902                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4903         }
4904
4905         return status;
4906 }
4907
4908 HCI_STATUS
4909 bthci_CmdSetCurrentBluetoothStatus(
4910         PADAPTER        padapter,
4911         PPACKET_IRP_HCICMD_DATA         pHciCmd
4912         )
4913 {
4914         HCI_STATUS      status = HCI_STATUS_SUCCESS;
4915 //      PMGNT_INFO      pMgntInfo = &padapter->MgntInfo;
4916         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4917         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4918
4919         pBtMgnt->ExtConfig.CurrentBTStatus = *((u8*)&pHciCmd->Data[0]);
4920         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("SetCurrentBluetoothStatus, CurrentBTStatus = 0x%x\n",
4921                 pBtMgnt->ExtConfig.CurrentBTStatus));
4922
4923         {
4924                 u8 localBuf[6] = "";
4925                 u8 *pRetPar;
4926                 u8 len = 0;
4927                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4928
4929                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4930
4931                 len += bthci_CommandCompleteHeader(&localBuf[0],
4932                         OGF_EXTENSION,
4933                         HCI_SET_CURRENT_BLUETOOTH_STATUS,
4934                         status);
4935
4936                 // Return parameters starts from here
4937                 pRetPar = &PPacketIrpEvent->Data[len];
4938                 pRetPar[0] = status;            //status
4939                 len += 1;
4940
4941                 PPacketIrpEvent->Length = len;
4942
4943                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4944         }
4945
4946         return status;
4947 }
4948
4949 HCI_STATUS
4950 bthci_CmdExtensionVersionNotify(
4951         PADAPTER                                                padapter,
4952         PPACKET_IRP_HCICMD_DATA         pHciCmd
4953         )
4954 {
4955         HCI_STATUS      status = HCI_STATUS_SUCCESS;
4956         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
4957         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
4958         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
4959
4960         pBtDbg->dbgHciInfo.hciCmdCntExtensionVersionNotify++;
4961         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "ExtensionVersionNotify, Hex Data :\n",
4962                         &pHciCmd->Data[0], pHciCmd->Length);
4963
4964         pBtMgnt->ExtConfig.HCIExtensionVer = *((u16*)&pHciCmd->Data[0]);
4965         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = 0x%x\n", pBtMgnt->ExtConfig.HCIExtensionVer));
4966
4967         {
4968                 u8 localBuf[6] = "";
4969                 u8 *pRetPar;
4970                 u8 len = 0;
4971                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4972
4973                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4974
4975                 len += bthci_CommandCompleteHeader(&localBuf[0],
4976                         OGF_EXTENSION,
4977                         HCI_EXTENSION_VERSION_NOTIFY,
4978                         status);
4979
4980                 // Return parameters starts from here
4981                 pRetPar = &PPacketIrpEvent->Data[len];
4982                 pRetPar[0] = status;            //status
4983
4984                 len += 1;
4985                 PPacketIrpEvent->Length = len;
4986
4987                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4988         }
4989
4990         return status;
4991 }
4992
4993 HCI_STATUS
4994 bthci_CmdLinkStatusNotify(
4995         PADAPTER                                                padapter,
4996         PPACKET_IRP_HCICMD_DATA         pHciCmd
4997         )
4998 {
4999         HCI_STATUS      status = HCI_STATUS_SUCCESS;
5000         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5001         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
5002         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
5003         u8              i;
5004         u8              *pTriple;
5005
5006         pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++;
5007         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n",
5008                         &pHciCmd->Data[0], pHciCmd->Length);
5009
5010         // Current only RTL8723 support this command.
5011         pBtMgnt->bSupportProfile = _TRUE;
5012
5013         pBtMgnt->ExtConfig.NumberOfHandle= *((u8*)pHciCmd->Data);
5014         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfHandle = 0x%x\n", pBtMgnt->ExtConfig.NumberOfHandle));
5015         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer));
5016
5017         pTriple = &pHciCmd->Data[1];
5018         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
5019         {
5020                 if (pBtMgnt->ExtConfig.HCIExtensionVer < 1)
5021                 {
5022                         pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
5023                         pBtMgnt->ExtConfig.linkInfo[i].BTProfile = pTriple[2];
5024                         pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = pTriple[3];
5025                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
5026                         ("Connection_Handle = 0x%x, BTProfile=%d, BTSpec=%d\n",
5027                                 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
5028                                 pBtMgnt->ExtConfig.linkInfo[i].BTProfile,
5029                                 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec));
5030                 pTriple += 4;
5031         }
5032                 else if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
5033                 {
5034                         pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
5035                         pBtMgnt->ExtConfig.linkInfo[i].BTProfile = pTriple[2];
5036                         pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = pTriple[3];
5037                         pBtMgnt->ExtConfig.linkInfo[i].linkRole = pTriple[4];
5038                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
5039                                 ("Connection_Handle = 0x%x, BTProfile=%d, BTSpec=%d, LinkRole=%d\n",
5040                                 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
5041                                 pBtMgnt->ExtConfig.linkInfo[i].BTProfile,
5042                                 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec,
5043                                 pBtMgnt->ExtConfig.linkInfo[i].linkRole));
5044                         pTriple += 5;
5045                 }
5046
5047         }
5048         BTHCI_UpdateBTProfileRTKToMoto(padapter);
5049         {
5050                 u8 localBuf[6] = "";
5051                 u8 *pRetPar;
5052                 u8 len = 0;
5053                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5054
5055                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5056
5057                 len += bthci_CommandCompleteHeader(&localBuf[0],
5058                         OGF_EXTENSION,
5059                         HCI_LINK_STATUS_NOTIFY,
5060                         status);
5061
5062                 // Return parameters starts from here
5063                 pRetPar = &PPacketIrpEvent->Data[len];
5064                 pRetPar[0] = status;            //status
5065
5066                 len += 1;
5067                 PPacketIrpEvent->Length = len;
5068
5069                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5070         }
5071
5072         return status;
5073 }
5074
5075 HCI_STATUS
5076 bthci_CmdBtOperationNotify(
5077         PADAPTER        padapter,
5078         PPACKET_IRP_HCICMD_DATA         pHciCmd
5079         )
5080 {
5081         HCI_STATUS      status = HCI_STATUS_SUCCESS;
5082         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5083         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
5084
5085         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Bt Operation notify, Hex Data :\n",
5086                         &pHciCmd->Data[0], pHciCmd->Length);
5087
5088         pBtMgnt->ExtConfig.btOperationCode = *((u8*)pHciCmd->Data);
5089         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("btOperationCode = 0x%x\n", pBtMgnt->ExtConfig.btOperationCode));
5090         switch (pBtMgnt->ExtConfig.btOperationCode)
5091         {
5092                 case HCI_BT_OP_NONE:
5093                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Operation None!!\n"));
5094                         break;
5095                 case HCI_BT_OP_INQUIRY_START:
5096                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire start!!\n"));
5097                         break;
5098                 case HCI_BT_OP_INQUIRY_FINISH:
5099                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire finished!!\n"));
5100                         break;
5101                 case HCI_BT_OP_PAGING_START:
5102                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging is started!!\n"));
5103                         break;
5104                 case HCI_BT_OP_PAGING_SUCCESS:
5105                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete successfully!!\n"));
5106                         break;
5107                 case HCI_BT_OP_PAGING_UNSUCCESS:
5108                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete unsuccessfully!!\n"));
5109                         break;
5110                 case HCI_BT_OP_PAIRING_START:
5111                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing start!!\n"));
5112                         break;
5113                 case HCI_BT_OP_PAIRING_FINISH:
5114                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing finished!!\n"));
5115                         break;
5116                 case HCI_BT_OP_BT_DEV_ENABLE:
5117                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is enabled!!\n"));
5118                         break;
5119                 case HCI_BT_OP_BT_DEV_DISABLE:
5120                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is disabled!!\n"));
5121                         break;
5122                 default:
5123                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Unknown, error!!\n"));
5124                         break;
5125         }
5126         BTDM_AdjustForBtOperation(padapter);
5127         {
5128                 u8 localBuf[6] = "";
5129                 u8 *pRetPar;
5130                 u8 len = 0;
5131                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5132
5133                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5134
5135                 len += bthci_CommandCompleteHeader(&localBuf[0],
5136                         OGF_EXTENSION,
5137                         HCI_BT_OPERATION_NOTIFY,
5138                         status);
5139
5140                 // Return parameters starts from here
5141                 pRetPar = &PPacketIrpEvent->Data[len];
5142                 pRetPar[0] = status;            //status
5143
5144                 len += 1;
5145                 PPacketIrpEvent->Length = len;
5146
5147                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5148         }
5149
5150         return status;
5151 }
5152
5153 HCI_STATUS
5154 bthci_CmdEnableWifiScanNotify(
5155         PADAPTER        padapter,
5156         PPACKET_IRP_HCICMD_DATA         pHciCmd
5157         )
5158 {
5159         HCI_STATUS      status = HCI_STATUS_SUCCESS;
5160         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5161         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
5162
5163         RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Enable Wifi scan notify, Hex Data :\n",
5164                         &pHciCmd->Data[0], pHciCmd->Length);
5165
5166         pBtMgnt->ExtConfig.bEnableWifiScanNotify = *((u8*)pHciCmd->Data);
5167         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("bEnableWifiScanNotify = %d\n", pBtMgnt->ExtConfig.bEnableWifiScanNotify));
5168
5169         {
5170                 u8 localBuf[6] = "";
5171                 u8 *pRetPar;
5172                 u8 len = 0;
5173                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5174
5175                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5176
5177                 len += bthci_CommandCompleteHeader(&localBuf[0],
5178                         OGF_EXTENSION,
5179                         HCI_ENABLE_WIFI_SCAN_NOTIFY,
5180                         status);
5181
5182                 // Return parameters starts from here
5183                 pRetPar = &PPacketIrpEvent->Data[len];
5184                 pRetPar[0] = status;            //status
5185
5186                 len += 1;
5187                 PPacketIrpEvent->Length = len;
5188
5189                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5190         }
5191
5192         return status;
5193 }
5194
5195 HCI_STATUS
5196 bthci_CmdWIFICurrentChannel(
5197         PADAPTER        padapter,
5198         PPACKET_IRP_HCICMD_DATA         pHciCmd
5199         )
5200 {
5201         HCI_STATUS status = HCI_STATUS_SUCCESS;
5202 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
5203         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
5204 //      u8              chnl = pMgntInfo->dot11CurrentChannelNumber;
5205         u8              chnl = pmlmeext->cur_channel;
5206
5207 //      if (pMgntInfo->pHTInfo->bCurBW40MHz == HT_CHANNEL_WIDTH_20_40)
5208         if (pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
5209         {
5210 //              if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_UPPER)
5211                 if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
5212                 {
5213                         chnl += 2;
5214                 }
5215 //              else if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_LOWER)
5216                 else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
5217                 {
5218                         chnl -= 2;
5219                 }
5220         }
5221
5222         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current Channel  = 0x%x\n", chnl));
5223
5224         {
5225                 u8 localBuf[8] = "";
5226                 u8 *pRetPar;
5227                 u8 len = 0;
5228                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5229
5230                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5231
5232                 len += bthci_CommandCompleteHeader(&localBuf[0],
5233                         OGF_EXTENSION,
5234                         HCI_WIFI_CURRENT_CHANNEL,
5235                         status);
5236
5237                 // Return parameters starts from here
5238                 pRetPar = &PPacketIrpEvent->Data[len];
5239                 pRetPar[0] = status;            //status
5240                 pRetPar[1] = chnl;                      //current channel
5241                 len += 2;
5242                 PPacketIrpEvent->Length = len;
5243
5244                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5245         }
5246
5247         return status;
5248 }
5249
5250 HCI_STATUS
5251 bthci_CmdWIFICurrentBandwidth(
5252         PADAPTER        padapter,
5253         PPACKET_IRP_HCICMD_DATA         pHciCmd
5254         )
5255 {
5256         HCI_STATUS status = HCI_STATUS_SUCCESS;
5257         HT_CHANNEL_WIDTH bw;
5258         u8      CurrentBW = 0;
5259
5260
5261 //      rtw_hal_get_hwreg(padapter, HW_VAR_BW_MODE, (u8*)(&bw));
5262         bw = padapter->mlmeextpriv.cur_bwmode;
5263
5264         if (bw == HT_CHANNEL_WIDTH_20)
5265         {
5266                 CurrentBW = 0;
5267         }
5268         else if (bw == HT_CHANNEL_WIDTH_40)
5269         {
5270                 CurrentBW = 1;
5271         }
5272
5273         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current BW = 0x%x\n",
5274                 CurrentBW));
5275
5276         {
5277                 u8 localBuf[8] = "";
5278                 u8 *pRetPar;
5279                 u8 len = 0;
5280                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5281
5282                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5283
5284                 len += bthci_CommandCompleteHeader(&localBuf[0],
5285                         OGF_EXTENSION,
5286                         HCI_WIFI_CURRENT_BANDWIDTH,
5287                         status);
5288
5289                 // Return parameters starts from here
5290                 pRetPar = &PPacketIrpEvent->Data[len];
5291                 pRetPar[0] = status;            //status
5292                 pRetPar[1] = CurrentBW;         //current BW
5293                 len += 2;
5294                 PPacketIrpEvent->Length = len;
5295
5296                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5297         }
5298
5299         return status;
5300 }
5301
5302 HCI_STATUS
5303 bthci_CmdWIFIConnectionStatus(
5304         PADAPTER        padapter,
5305         PPACKET_IRP_HCICMD_DATA         pHciCmd
5306         )
5307 {
5308         HCI_STATUS status = HCI_STATUS_SUCCESS;
5309 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
5310         PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
5311 //      PADAPTER pExtAdapter = NULL;
5312 //      PMGNT_INFO pExtMgntInfo = NULL;
5313         u8              connectStatus = HCI_WIFI_NOT_CONNECTED;
5314
5315 #if 0
5316         // Default port, connect to any
5317         if (pMgntInfo->bMediaConnect)
5318                 connectStatus = HCI_WIFI_CONNECTED;
5319         if (pMgntInfo->mIbss)
5320                 connectStatus = HCI_WIFI_CONNECTED;
5321
5322         // AP mode, if any station associated
5323         if (padapter->MgntInfo.NdisVersion >= RT_NDIS_VERSION_6_20)
5324         {
5325                 if (IsAPModeExist(padapter))
5326                 {
5327                         pExtAdapter = GetFirstExtAdapter(padapter);
5328                         if (pExtAdapter == NULL) pExtAdapter = pDefaultAdapter;
5329
5330                         pExtMgntInfo = &pExtAdapter->MgntInfo;
5331                         if (AsocEntry_AnyStationAssociated(pExtMgntInfo))
5332                                 connectStatus = HCI_WIFI_CONNECTED;
5333                 }
5334                 else
5335                 {
5336                         if (AsocEntry_AnyStationAssociated(pMgntInfo))
5337                                 connectStatus = HCI_WIFI_CONNECTED;
5338                 }
5339         }
5340         else
5341         {
5342                 if (AsocEntry_AnyStationAssociated(pMgntInfo))
5343                         connectStatus = HCI_WIFI_CONNECTED;
5344         }
5345
5346         if (connectStatus == HCI_WIFI_NOT_CONNECTED)
5347         {
5348                 if (!MgntRoamingInProgress(pMgntInfo) &&
5349                         !MgntIsLinkInProgress(pMgntInfo) &&
5350                         !MgntScanInProgress(pMgntInfo))
5351                 {
5352                         connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS;
5353                 }
5354         }
5355 #else
5356         if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) {
5357                 if (padapter->stapriv.asoc_sta_count >= 3)
5358                         connectStatus = HCI_WIFI_CONNECTED;
5359                 else
5360                         connectStatus = HCI_WIFI_NOT_CONNECTED;
5361         }
5362         else if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE)
5363                 connectStatus = HCI_WIFI_CONNECTED;
5364         else if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING) == _TRUE)
5365                 connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS;
5366         else
5367                 connectStatus = HCI_WIFI_NOT_CONNECTED;
5368 #endif
5369
5370         {
5371                 u8 localBuf[8] = "";
5372                 u8 *pRetPar;
5373                 u8 len = 0;
5374                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5375
5376                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5377
5378                 len += bthci_CommandCompleteHeader(&localBuf[0],
5379                         OGF_EXTENSION,
5380                         HCI_WIFI_CONNECTION_STATUS,
5381                         status);
5382
5383                 // Return parameters starts from here
5384                 pRetPar = &PPacketIrpEvent->Data[len];
5385                 pRetPar[0] = status;                    //status
5386                 pRetPar[1] = connectStatus;     //connect status
5387                 len += 2;
5388                 PPacketIrpEvent->Length = len;
5389
5390                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5391         }
5392
5393         return status;
5394 }
5395
5396 HCI_STATUS
5397 bthci_CmdEnableDeviceUnderTestMode(
5398         PADAPTER        padapter,
5399         PPACKET_IRP_HCICMD_DATA         pHciCmd
5400         )
5401 {
5402         HCI_STATUS status = HCI_STATUS_SUCCESS;
5403         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5404         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
5405
5406         pBtHciInfo->bInTestMode = _TRUE;
5407         pBtHciInfo->bTestIsEnd = _FALSE;
5408
5409         //send command complete event here when all data are received.
5410         {
5411                 u8 localBuf[6] = "";
5412                 u8 *pRetPar;
5413                 u8 len = 0;
5414                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5415
5416                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5417
5418                 len += bthci_CommandCompleteHeader(&localBuf[0],
5419                         OGF_TESTING_COMMANDS,
5420                         HCI_ENABLE_DEVICE_UNDER_TEST_MODE,
5421                         status);
5422
5423                 // Return parameters starts from here
5424                 pRetPar = &PPacketIrpEvent->Data[len];
5425                 pRetPar[0] = status;            //status
5426                 len += 1;
5427                 PPacketIrpEvent->Length = len;
5428
5429                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5430         }
5431
5432         return status;
5433 }
5434
5435 HCI_STATUS
5436 bthci_CmdAMPTestEnd(
5437         PADAPTER        padapter,
5438         PPACKET_IRP_HCICMD_DATA         pHciCmd
5439         )
5440 {
5441         HCI_STATUS status = HCI_STATUS_SUCCESS;
5442         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5443         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
5444         u8              bFilterOutNonAssociatedBSSID = _TRUE;
5445
5446         if (!pBtHciInfo->bInTestMode)
5447         {
5448                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Not in Test mode, return status=HCI_STATUS_CMD_DISALLOW\n"));
5449                 status = HCI_STATUS_CMD_DISALLOW;
5450                 return status;
5451         }
5452
5453         pBtHciInfo->bTestIsEnd=_TRUE;
5454
5455         PlatformCancelTimer(padapter,&pBTInfo->BTTestSendPacketTimer);
5456
5457         rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
5458
5459
5460         //send command complete event here when all data are received.
5461         {
5462                 u8      localBuf[4] = "";
5463                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5464
5465                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("AMP Test End Event \n"));
5466                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5467                 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_TEST_END;
5468                 PPacketIrpEvent->Length=2;
5469
5470                 PPacketIrpEvent->Data[0] = status;
5471                 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario;
5472
5473                 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5474         }
5475
5476         bthci_EventAMPReceiverReport(padapter,0x01);
5477
5478         return status;
5479 }
5480
5481 HCI_STATUS
5482 bthci_CmdAMPTestCommand(
5483         PADAPTER        padapter,
5484         PPACKET_IRP_HCICMD_DATA         pHciCmd
5485         )
5486 {
5487         HCI_STATUS status = HCI_STATUS_SUCCESS;
5488         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5489         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
5490
5491         if (!pBtHciInfo->bInTestMode)
5492         {
5493                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Not in Test mode, return status=HCI_STATUS_CMD_DISALLOW\n"));
5494                 status = HCI_STATUS_CMD_DISALLOW;
5495                 return status;
5496         }
5497
5498
5499         pBtHciInfo->TestScenario=*((u8*)pHciCmd->Data);
5500
5501         if (pBtHciInfo->TestScenario == 0x01)
5502         {
5503                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
5504         }
5505         else if (pBtHciInfo->TestScenario == 0x02)
5506         {
5507                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
5508         }
5509         else
5510         {
5511                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("No Such Test !!!!!!!!!!!!!!!!!! \n"));
5512         }
5513
5514
5515         if (pBtHciInfo->bTestIsEnd)
5516         {
5517                 u8      localBuf[5] = "";
5518                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5519
5520
5521                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("AMP Test End Event \n"));
5522                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5523                 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_TEST_END;
5524                 PPacketIrpEvent->Length=2;
5525
5526                 PPacketIrpEvent->Data[0] = status;
5527                 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
5528
5529                 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5530
5531                 //Return to Idel state with RX and TX off.
5532
5533                 return status;
5534         }
5535
5536         // should send command status event
5537         bthci_EventCommandStatus(padapter,
5538                         OGF_TESTING_COMMANDS,
5539                         HCI_AMP_TEST_COMMAND,
5540                         status);
5541
5542         //The HCI_AMP_Start Test Event shall be generated when the
5543         //HCI_AMP_Test_Command has completed and the first data is ready to be sent
5544         //or received.
5545
5546         {
5547                 u8      localBuf[5] = "";
5548                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5549
5550                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), (" HCI_AMP_Start Test Event \n"));
5551                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5552                 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_START_TEST;
5553                 PPacketIrpEvent->Length=2;
5554
5555                 PPacketIrpEvent->Data[0] = status;
5556                 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
5557
5558                 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5559
5560                 //Return to Idel state with RX and TX off.
5561         }
5562
5563         if (pBtHciInfo->TestScenario == 0x01)
5564         {
5565                 /*
5566                         When in a transmitter test scenario and the frames/bursts count have been
5567                         transmitted the HCI_AMP_Test_End event shall be sent.
5568                 */
5569                 PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
5570                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
5571         }
5572         else if (pBtHciInfo->TestScenario == 0x02)
5573         {
5574                 u8              bFilterOutNonAssociatedBSSID=_FALSE;
5575                 rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
5576                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
5577         }
5578
5579         return status;
5580 }
5581
5582
5583 HCI_STATUS
5584 bthci_CmdEnableAMPReceiverReports(
5585         PADAPTER        padapter,
5586         PPACKET_IRP_HCICMD_DATA         pHciCmd
5587         )
5588 {
5589         HCI_STATUS status = HCI_STATUS_SUCCESS;
5590         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5591         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
5592
5593         if (!pBtHciInfo->bInTestMode)
5594         {
5595                 status = HCI_STATUS_CMD_DISALLOW;
5596                 //send command complete event here when all data are received.
5597                 {
5598                         u8 localBuf[6] = "";
5599                         u8 *pRetPar;
5600                         u8 len = 0;
5601                         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5602
5603                         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5604
5605                         len += bthci_CommandCompleteHeader(&localBuf[0],
5606                                 OGF_TESTING_COMMANDS,
5607                                 HCI_ENABLE_AMP_RECEIVER_REPORTS,
5608                                 status);
5609
5610                         // Return parameters starts from here
5611                         pRetPar = &PPacketIrpEvent->Data[len];
5612                         pRetPar[0] = status;            //status
5613                         len += 1;
5614                         PPacketIrpEvent->Length = len;
5615
5616                         bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5617                 }
5618                 return status;
5619         }
5620
5621         pBtHciInfo->bTestNeedReport= *((u8*)pHciCmd->Data);
5622         pBtHciInfo->TestReportInterval= (*((u8*)pHciCmd->Data+2));
5623
5624         bthci_EventAMPReceiverReport(padapter,0x00);
5625
5626         //send command complete event here when all data are received.
5627         {
5628                 u8 localBuf[6] = "";
5629                 u8 *pRetPar;
5630                 u8 len = 0;
5631                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5632
5633                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5634
5635                 len += bthci_CommandCompleteHeader(&localBuf[0],
5636                         OGF_TESTING_COMMANDS,
5637                         HCI_ENABLE_AMP_RECEIVER_REPORTS,
5638                         status);
5639
5640                 // Return parameters starts from here
5641                 pRetPar = &PPacketIrpEvent->Data[len];
5642                 pRetPar[0] = status;            //status
5643                 len += 1;
5644                 PPacketIrpEvent->Length = len;
5645
5646                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5647         }
5648
5649         return status;
5650 }
5651
5652 HCI_STATUS
5653 bthci_CmdHostBufferSize(
5654         PADAPTER        padapter,
5655         PPACKET_IRP_HCICMD_DATA         pHciCmd
5656         )
5657 {
5658         HCI_STATUS status = HCI_STATUS_SUCCESS;
5659         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
5660         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
5661
5662         pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].ACLPacketsData.ACLDataPacketLen= *((u16*)pHciCmd->Data);
5663         pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].SyncDataPacketLen= *((u8 *)(pHciCmd->Data+2));
5664         pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].TotalNumACLDataPackets= *((u16 *)(pHciCmd->Data+3));
5665         pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].TotalSyncNumDataPackets= *((u16 *)(pHciCmd->Data+5));
5666
5667         //send command complete event here when all data are received.
5668         {
5669                 u8 localBuf[6] = "";
5670                 u8 *pRetPar;
5671                 u8 len = 0;
5672                 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5673
5674                 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5675
5676                 len += bthci_CommandCompleteHeader(&localBuf[0],
5677                         OGF_SET_EVENT_MASK_COMMAND,
5678                         HCI_HOST_BUFFER_SIZE,
5679                         status);
5680
5681                 // Return parameters starts from here
5682                 pRetPar = &PPacketIrpEvent->Data[len];
5683                 pRetPar[0] = status;            //status
5684                 len += 1;
5685                 PPacketIrpEvent->Length = len;
5686
5687                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5688         }
5689
5690         return status;
5691 }
5692
5693 HCI_STATUS
5694 bthci_CmdHostNumberOfCompletedPackets(
5695         PADAPTER        padapter,
5696         PPACKET_IRP_HCICMD_DATA         pHciCmd
5697         )
5698 {
5699         HCI_STATUS status = HCI_STATUS_SUCCESS;
5700
5701         return status;
5702 }
5703
5704 HCI_STATUS
5705 bthci_UnknownCMD(
5706         PADAPTER        padapter,
5707         PPACKET_IRP_HCICMD_DATA         pHciCmd
5708         )
5709 {
5710         HCI_STATUS status = HCI_STATUS_UNKNOW_HCI_CMD;
5711         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
5712         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
5713
5714         pBtDbg->dbgHciInfo.hciCmdCntUnknown++;
5715         bthci_EventCommandStatus(padapter,
5716                         (u8)pHciCmd->OGF,
5717                         pHciCmd->OCF,
5718                         status);
5719
5720         return status;
5721 }
5722
5723 HCI_STATUS
5724 bthci_HandleOGFInformationalParameters(
5725         PADAPTER                                        padapter,
5726         PPACKET_IRP_HCICMD_DATA pHciCmd
5727         )
5728 {
5729         HCI_STATUS status = HCI_STATUS_SUCCESS;
5730
5731         switch (pHciCmd->OCF)
5732         {
5733         case HCI_READ_LOCAL_VERSION_INFORMATION:
5734                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_VERSION_INFORMATION\n"));
5735                 status = bthci_CmdReadLocalVersionInformation(padapter);
5736                 break;
5737         case HCI_READ_LOCAL_SUPPORTED_COMMANDS:
5738                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_COMMANDS\n"));
5739                 status = bthci_CmdReadLocalSupportedCommands(padapter);
5740                 break;
5741         case HCI_READ_LOCAL_SUPPORTED_FEATURES:
5742                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_FEATURES\n"));
5743                 status = bthci_CmdReadLocalSupportedFeatures(padapter);
5744                 break;
5745         case HCI_READ_BUFFER_SIZE:
5746                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_BUFFER_SIZE\n"));
5747                 status = bthci_CmdReadBufferSize(padapter);
5748                 break;
5749         case HCI_READ_DATA_BLOCK_SIZE:
5750                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_DATA_BLOCK_SIZE\n"));
5751                 status = bthci_CmdReadDataBlockSize(padapter);
5752                 break;
5753         default:
5754                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFInformationalParameters(), Unknown case = 0x%x\n", pHciCmd->OCF));
5755                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5756                 status = bthci_UnknownCMD(padapter, pHciCmd);
5757                 break;
5758         }
5759         return status;
5760 }
5761
5762 HCI_STATUS
5763 bthci_HandleOGFSetEventMaskCMD(
5764         PADAPTER        padapter,
5765         PPACKET_IRP_HCICMD_DATA         pHciCmd
5766         )
5767 {
5768         HCI_STATUS status = HCI_STATUS_SUCCESS;
5769
5770         switch (pHciCmd->OCF)
5771         {
5772         case HCI_SET_EVENT_MASK:
5773                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_MASK\n"));
5774                 status = bthci_CmdSetEventMask(padapter, pHciCmd);
5775                 break;
5776         case HCI_RESET:
5777                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_RESET\n"));
5778                 status = bthci_CmdReset(padapter, _TRUE);
5779                 break;
5780         case HCI_READ_CONNECTION_ACCEPT_TIMEOUT:
5781                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_CONNECTION_ACCEPT_TIMEOUT\n"));
5782                 status = bthci_CmdReadConnectionAcceptTimeout(padapter);
5783                 break;
5784         case HCI_SET_EVENT_FILTER:
5785                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_FILTER\n"));
5786                 status = bthci_CmdSetEventFilter(padapter, pHciCmd);
5787                 break;
5788         case HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT:
5789                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT\n"));
5790                 status = bthci_CmdWriteConnectionAcceptTimeout(padapter, pHciCmd);
5791                 break;
5792         case HCI_READ_PAGE_TIMEOUT:
5793                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_PAGE_TIMEOUT\n"));
5794                 status = bthci_CmdReadPageTimeout(padapter, pHciCmd);
5795                 break;
5796         case HCI_WRITE_PAGE_TIMEOUT:
5797                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_PAGE_TIMEOUT\n"));
5798                 status = bthci_CmdWritePageTimeout(padapter, pHciCmd);
5799                 break;
5800         case HCI_HOST_NUMBER_OF_COMPLETED_PACKETS:
5801                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_HOST_NUMBER_OF_COMPLETED_PACKETS\n"));
5802                 status = bthci_CmdHostNumberOfCompletedPackets(padapter, pHciCmd);
5803                 break;
5804         case HCI_READ_LINK_SUPERVISION_TIMEOUT:
5805                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LINK_SUPERVISION_TIMEOUT\n"));
5806                 status = bthci_CmdReadLinkSupervisionTimeout(padapter, pHciCmd);
5807                 break;
5808         case HCI_WRITE_LINK_SUPERVISION_TIMEOUT:
5809                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LINK_SUPERVISION_TIMEOUT\n"));
5810                 status = bthci_CmdWriteLinkSupervisionTimeout(padapter, pHciCmd);
5811                 break;
5812         case HCI_ENHANCED_FLUSH:
5813                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENHANCED_FLUSH\n"));
5814                 status = bthci_CmdEnhancedFlush(padapter, pHciCmd);
5815                 break;
5816         case HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT:
5817                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT\n"));
5818                 status = bthci_CmdReadLogicalLinkAcceptTimeout(padapter, pHciCmd);
5819                 break;
5820         case HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT:
5821                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT\n"));
5822                 status = bthci_CmdWriteLogicalLinkAcceptTimeout(padapter, pHciCmd);
5823                 break;
5824         case HCI_SET_EVENT_MASK_PAGE_2:
5825                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_MASK_PAGE_2\n"));
5826                 status = bthci_CmdSetEventMaskPage2(padapter, pHciCmd);
5827                 break;
5828         case HCI_READ_LOCATION_DATA:
5829                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCATION_DATA\n"));
5830                 status = bthci_CmdReadLocationData(padapter, pHciCmd);
5831                 break;
5832         case HCI_WRITE_LOCATION_DATA:
5833                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LOCATION_DATA\n"));
5834                 status = bthci_CmdWriteLocationData(padapter, pHciCmd);
5835                 break;
5836         case HCI_READ_FLOW_CONTROL_MODE:
5837                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_FLOW_CONTROL_MODE\n"));
5838                 status = bthci_CmdReadFlowControlMode(padapter, pHciCmd);
5839                 break;
5840         case HCI_WRITE_FLOW_CONTROL_MODE:
5841                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_FLOW_CONTROL_MODE\n"));
5842                 status = bthci_CmdWriteFlowControlMode(padapter, pHciCmd);
5843                 break;
5844         case HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT:
5845                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT\n"));
5846                 status = bthci_CmdReadBestEffortFlushTimeout(padapter, pHciCmd);
5847                 break;
5848         case HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT:
5849                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT\n"));
5850                 status = bthci_CmdWriteBestEffortFlushTimeout(padapter, pHciCmd);
5851                 break;
5852         case HCI_SHORT_RANGE_MODE:
5853                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SHORT_RANGE_MODE\n"));
5854                 status = bthci_CmdShortRangeMode(padapter, pHciCmd);
5855                 break;
5856         case HCI_HOST_BUFFER_SIZE:
5857                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_HOST_BUFFER_SIZE\n"));
5858                 status = bthci_CmdHostBufferSize(padapter,pHciCmd);
5859                 break;
5860         default:
5861                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFSetEventMaskCMD(), Unknown case = 0x%x\n", pHciCmd->OCF));
5862                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5863                 status = bthci_UnknownCMD(padapter, pHciCmd);
5864                 break;
5865         }
5866         return status;
5867 }
5868
5869 HCI_STATUS
5870 bthci_HandleOGFStatusParameters(
5871         PADAPTER                                                padapter,
5872         PPACKET_IRP_HCICMD_DATA pHciCmd
5873         )
5874 {
5875         HCI_STATUS status = HCI_STATUS_SUCCESS;
5876
5877         switch (pHciCmd->OCF)
5878         {
5879         case HCI_READ_FAILED_CONTACT_COUNTER:
5880                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_FAILED_CONTACT_COUNTER\n"));
5881                 status = bthci_CmdReadFailedContactCounter(padapter,pHciCmd);
5882                 break;
5883         case HCI_RESET_FAILED_CONTACT_COUNTER:
5884                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_RESET_FAILED_CONTACT_COUNTER\n"));
5885                 status = bthci_CmdResetFailedContactCounter(padapter,pHciCmd);
5886                 break;
5887         case HCI_READ_LINK_QUALITY:
5888                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LINK_QUALITY\n"));
5889                 status = bthci_CmdReadLinkQuality(padapter, pHciCmd);
5890                 break;
5891         case HCI_READ_RSSI:
5892                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_RSSI\n"));
5893                 status = bthci_CmdReadRSSI(padapter);
5894                 break;
5895         case HCI_READ_LOCAL_AMP_INFO:
5896                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_AMP_INFO\n"));
5897                 status = bthci_CmdReadLocalAMPInfo(padapter);
5898                 break;
5899         case HCI_READ_LOCAL_AMP_ASSOC:
5900                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_AMP_ASSOC\n"));
5901                 status = bthci_CmdReadLocalAMPAssoc(padapter,pHciCmd);
5902                 break;
5903         case HCI_WRITE_REMOTE_AMP_ASSOC:
5904                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_REMOTE_AMP_ASSOC\n"));
5905                 status = bthci_CmdWriteRemoteAMPAssoc(padapter,pHciCmd);
5906                 break;
5907         default:
5908                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFStatusParameters(), Unknown case = 0x%x\n", pHciCmd->OCF));
5909                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5910                 status = bthci_UnknownCMD(padapter, pHciCmd);
5911                 break;
5912         }
5913         return status;
5914 }
5915
5916
5917 HCI_STATUS
5918 bthci_HandleOGFLinkControlCMD(
5919         PADAPTER        padapter,
5920         PPACKET_IRP_HCICMD_DATA         pHciCmd
5921         )
5922 {
5923         HCI_STATUS status = HCI_STATUS_SUCCESS;
5924
5925         switch (pHciCmd->OCF)
5926         {
5927                 case HCI_CREATE_PHYSICAL_LINK:
5928                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_PHYSICAL_LINK\n"));
5929                         status = bthci_CmdCreatePhysicalLink(padapter,pHciCmd);
5930                         break;
5931                 case HCI_ACCEPT_PHYSICAL_LINK:
5932                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_PHYSICAL_LINK\n"));
5933                         status = bthci_CmdAcceptPhysicalLink(padapter,pHciCmd);
5934                         break;
5935                 case HCI_DISCONNECT_PHYSICAL_LINK:
5936                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_PHYSICAL_LINK\n"));
5937                         status = bthci_CmdDisconnectPhysicalLink(padapter,pHciCmd);
5938                         break;
5939                 case HCI_CREATE_LOGICAL_LINK:
5940                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_LOGICAL_LINK\n"));
5941                         status = bthci_CmdCreateLogicalLink(padapter,pHciCmd);
5942                         break;
5943                 case HCI_ACCEPT_LOGICAL_LINK:
5944                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_LOGICAL_LINK\n"));
5945                         status = bthci_CmdAcceptLogicalLink(padapter,pHciCmd);
5946                         break;
5947                 case HCI_DISCONNECT_LOGICAL_LINK:
5948                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_LOGICAL_LINK\n"));
5949                         status = bthci_CmdDisconnectLogicalLink(padapter,pHciCmd);
5950                         break;
5951                 case HCI_LOGICAL_LINK_CANCEL:
5952                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_LOGICAL_LINK_CANCEL\n"));
5953                         status = bthci_CmdLogicalLinkCancel(padapter,pHciCmd);
5954                         break;
5955                 case HCI_FLOW_SPEC_MODIFY:
5956                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_FLOW_SPEC_MODIFY\n"));
5957                         status = bthci_CmdFlowSpecModify(padapter,pHciCmd);
5958                         break;
5959
5960                 default:
5961                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFLinkControlCMD(), Unknown case = 0x%x\n", pHciCmd->OCF));
5962                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5963                         status = bthci_UnknownCMD(padapter, pHciCmd);
5964                         break;
5965         }
5966         return status;
5967 }
5968
5969 HCI_STATUS
5970 bthci_HandleOGFTestingCMD(
5971         PADAPTER        padapter,
5972         PPACKET_IRP_HCICMD_DATA         pHciCmd
5973         )
5974 {
5975         HCI_STATUS status = HCI_STATUS_SUCCESS;
5976         switch (pHciCmd->OCF)
5977         {
5978                 case HCI_ENABLE_DEVICE_UNDER_TEST_MODE:
5979                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENABLE_DEVICE_UNDER_TEST_MODE\n"));
5980                         bthci_CmdEnableDeviceUnderTestMode(padapter,pHciCmd);
5981                         break;
5982                 case HCI_AMP_TEST_END:
5983                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_END\n"));
5984                         bthci_CmdAMPTestEnd(padapter,pHciCmd);
5985                         break;
5986                 case HCI_AMP_TEST_COMMAND:
5987                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_COMMAND\n"));
5988                         bthci_CmdAMPTestCommand(padapter,pHciCmd);
5989                         break;
5990                 case HCI_ENABLE_AMP_RECEIVER_REPORTS:
5991                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENABLE_AMP_RECEIVER_REPORTS\n"));
5992                         bthci_CmdEnableAMPReceiverReports(padapter,pHciCmd);
5993                         break;
5994
5995                 default:
5996                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5997                         status = bthci_UnknownCMD(padapter, pHciCmd);
5998                         break;
5999         }
6000         return status;
6001 }
6002
6003 HCI_STATUS
6004 bthci_HandleOGFExtension(
6005         PADAPTER        padapter,
6006         PPACKET_IRP_HCICMD_DATA         pHciCmd
6007         )
6008 {
6009         HCI_STATUS status = HCI_STATUS_SUCCESS;
6010         switch (pHciCmd->OCF)
6011         {
6012                 case HCI_SET_ACL_LINK_DATA_FLOW_MODE:
6013                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_ACL_LINK_DATA_FLOW_MODE\n"));
6014                         status = bthci_CmdSetACLLinkDataFlowMode(padapter,pHciCmd);
6015                         break;
6016                 case HCI_SET_ACL_LINK_STATUS:
6017                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_ACL_LINK_STATUS\n"));
6018                         status = bthci_CmdSetACLLinkStatus(padapter,pHciCmd);
6019                         break;
6020                 case HCI_SET_SCO_LINK_STATUS:
6021                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_SCO_LINK_STATUS\n"));
6022                         status = bthci_CmdSetSCOLinkStatus(padapter,pHciCmd);
6023                         break;
6024                 case HCI_SET_RSSI_VALUE:
6025                         RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("HCI_SET_RSSI_VALUE\n"));
6026                         status = bthci_CmdSetRSSIValue(padapter,pHciCmd);
6027                         break;
6028                 case HCI_SET_CURRENT_BLUETOOTH_STATUS:
6029                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_CURRENT_BLUETOOTH_STATUS\n"));
6030                         status = bthci_CmdSetCurrentBluetoothStatus(padapter,pHciCmd);
6031                         break;
6032                 //The following is for RTK8723
6033
6034                 case HCI_EXTENSION_VERSION_NOTIFY:
6035                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_EXTENSION_VERSION_NOTIFY\n"));
6036                         status = bthci_CmdExtensionVersionNotify(padapter,pHciCmd);
6037                         break;
6038                 case HCI_LINK_STATUS_NOTIFY:
6039                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_LINK_STATUS_NOTIFY\n"));
6040                         status = bthci_CmdLinkStatusNotify(padapter,pHciCmd);
6041                         break;
6042                 case HCI_BT_OPERATION_NOTIFY:
6043                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_BT_OPERATION_NOTIFY\n"));
6044                         status = bthci_CmdBtOperationNotify(padapter,pHciCmd);
6045                         break;
6046                 case HCI_ENABLE_WIFI_SCAN_NOTIFY:
6047                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_ENABLE_WIFI_SCAN_NOTIFY\n"));
6048                         status = bthci_CmdEnableWifiScanNotify(padapter,pHciCmd);
6049                         break;
6050
6051                 //The following is for IVT
6052                 case HCI_WIFI_CURRENT_CHANNEL:
6053                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CURRENT_CHANNEL\n"));
6054                         status = bthci_CmdWIFICurrentChannel(padapter,pHciCmd);
6055                         break;
6056                 case HCI_WIFI_CURRENT_BANDWIDTH:
6057                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CURRENT_BANDWIDTH\n"));
6058                         status = bthci_CmdWIFICurrentBandwidth(padapter,pHciCmd);
6059                         break;
6060                 case HCI_WIFI_CONNECTION_STATUS:
6061                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CONNECTION_STATUS\n"));
6062                         status = bthci_CmdWIFIConnectionStatus(padapter,pHciCmd);
6063                         break;
6064
6065                 default:
6066                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_UNKNOWN_COMMAND\n"));
6067                         status = bthci_UnknownCMD(padapter, pHciCmd);
6068                         break;
6069         }
6070         return status;
6071 }
6072
6073 void
6074 bthci_FakeCommand(
6075         PADAPTER        padapter,
6076         u16     OGF,
6077         u16     OCF
6078         )
6079 {
6080 #define MAX_TMP_BUF_SIZE        200
6081         u8      buffer[MAX_TMP_BUF_SIZE];
6082         PPACKET_IRP_HCICMD_DATA pCmd=(PPACKET_IRP_HCICMD_DATA)buffer;
6083
6084         PlatformZeroMemory(buffer, MAX_TMP_BUF_SIZE);
6085
6086         pCmd->OGF = OGF;
6087         pCmd->OCF = OCF;
6088
6089         if (OGF == OGF_LINK_CONTROL_COMMANDS && OCF == HCI_LOGICAL_LINK_CANCEL)
6090         {
6091                 pCmd->Length = 2;
6092                 pCmd->Data[0] = 1;              //physical link handle
6093                 pCmd->Data[1] = 0x16;           //Tx_Flow_Spec_ID
6094                 BTHCI_HandleHCICMD(padapter, (PPACKET_IRP_HCICMD_DATA)buffer);
6095         }
6096 }
6097
6098 void
6099 bthci_StateStarting(
6100         PADAPTER                                        padapter,
6101         HCI_STATE_WITH_CMD              StateCmd,
6102         u8                                      EntryNum
6103         )
6104 {
6105         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6106         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6107
6108         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Starting], "));
6109         switch (StateCmd)
6110         {
6111                 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
6112                 {
6113                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
6114                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
6115                         pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
6116                         BTHCI_DisconnectPeer(padapter,EntryNum);
6117                         break;
6118                 }
6119
6120                 case STATE_CMD_DISCONNECT_PHY_LINK:
6121                 {
6122                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6123
6124                         bthci_EventDisconnectPhyLinkComplete(padapter,
6125                         HCI_STATUS_SUCCESS,
6126                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6127                         EntryNum);
6128
6129                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6130
6131                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6132
6133                         BTHCI_DisconnectPeer(padapter, EntryNum);
6134                         break;
6135                 }
6136
6137                 case STATE_CMD_MAC_START_COMPLETE:
6138                 {
6139                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_START_COMPLETE\n"));
6140                         if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
6141                         {
6142                         }
6143                         else if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR)
6144                         {
6145                                 bthci_EventChannelSelected(padapter,EntryNum);
6146                         }
6147
6148                         break;
6149                 }
6150
6151                 default:
6152                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6153                         break;
6154         }
6155 }
6156
6157 void
6158 bthci_StateConnecting(
6159         PADAPTER                                        padapter,
6160         HCI_STATE_WITH_CMD              StateCmd,
6161         u8                                      EntryNum
6162         )
6163 {
6164         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6165         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6166
6167         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connecting], "));
6168         switch (StateCmd)
6169         {
6170                 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
6171                 {
6172                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
6173                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
6174                         pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
6175                         BTHCI_DisconnectPeer(padapter, EntryNum);
6176                         break;
6177                 }
6178
6179                 case STATE_CMD_MAC_CONNECT_COMPLETE:
6180                 {
6181                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_COMPLETE\n"));
6182
6183                         if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
6184                         {
6185                                 RT_TRACE(_module_rtl871x_security_c_, _drv_info_ , ("StateConnecting \n"));
6186                         }
6187                         break;
6188                 }
6189
6190                 case STATE_CMD_DISCONNECT_PHY_LINK:
6191                 {
6192                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6193
6194                         bthci_EventDisconnectPhyLinkComplete(padapter,
6195                         HCI_STATUS_SUCCESS,
6196                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6197                         EntryNum);
6198
6199                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6200
6201                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6202
6203                         BTHCI_DisconnectPeer(padapter, EntryNum);
6204
6205                         break;
6206                 }
6207
6208                 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
6209                 {
6210                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_CANCEL_INDICATE\n"));
6211                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONTROLLER_BUSY;
6212                         // Because this state cmd is caused by the BTHCI_EventAMPStatusChange(),
6213                         // we don't need to send event in the following BTHCI_DisconnectPeer() again.
6214                         pBtMgnt->bNeedNotifyAMPNoCap = _FALSE;
6215                         BTHCI_DisconnectPeer(padapter, EntryNum);
6216                         break;
6217                 }
6218
6219                 default:
6220                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6221                         break;
6222         }
6223 }
6224
6225 void
6226 bthci_StateConnected(
6227         PADAPTER                                        padapter,
6228         HCI_STATE_WITH_CMD              StateCmd,
6229         u8                                      EntryNum
6230         )
6231 {
6232 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6233         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6234         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6235
6236         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connected], "));
6237         switch (StateCmd)
6238         {
6239                 case STATE_CMD_DISCONNECT_PHY_LINK:
6240                 {
6241                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6242
6243                         //
6244                         //When we are trying to disconnect the phy link, we should disconnect log link first,
6245                         //
6246                         {
6247                                 u8 i;
6248                                 u16 logicHandle = 0;
6249                                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
6250                                 {
6251                                         if (pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle != 0)
6252                                         {
6253                                                 logicHandle=pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle;
6254
6255                                                 bthci_EventDisconnectLogicalLinkComplete(padapter, HCI_STATUS_SUCCESS,
6256                                                         logicHandle, pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason);
6257
6258                                                 pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle = 0;
6259                                         }
6260                                 }
6261                         }
6262
6263                         bthci_EventDisconnectPhyLinkComplete(padapter,
6264                         HCI_STATUS_SUCCESS,
6265                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6266                         EntryNum);
6267
6268                         PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
6269
6270                         BTHCI_DisconnectPeer(padapter, EntryNum);
6271                         break;
6272                 }
6273
6274                 case STATE_CMD_MAC_DISCONNECT_INDICATE:
6275                 {
6276                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_DISCONNECT_INDICATE\n"));
6277
6278                         bthci_EventDisconnectPhyLinkComplete(padapter,
6279                         HCI_STATUS_SUCCESS,
6280                         // TODO: Remote Host not local host
6281                         HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST,
6282                         EntryNum);
6283                         BTHCI_DisconnectPeer(padapter, EntryNum);
6284
6285                         break;
6286                 }
6287
6288                 case STATE_CMD_ENTER_STATE:
6289                 {
6290                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
6291
6292                         if (pBtMgnt->bBTConnectInProgress)
6293                         {
6294                                 pBtMgnt->bBTConnectInProgress = _FALSE;
6295                                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6296                         }
6297                         pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = HCI_STATE_CONNECTED;
6298                         pBTInfo->BtAsocEntry[EntryNum].b4waySuccess = _TRUE;
6299                         pBtMgnt->bStartSendSupervisionPkt = _TRUE;
6300
6301                         PlatformSetTimer(padapter, &pBTInfo->BTSupervisionPktTimer, 10000);
6302                         // for rate adaptive
6303 #if 0
6304                         padapter->HalFunc.UpdateHalRAMaskHandler(
6305                                                                         padapter,
6306                                                                         _FALSE,
6307                                                                         MAX_FW_SUPPORT_MACID_NUM-1-EntryNum,
6308                                                                         &pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr[0],
6309                                                                         NULL,
6310                                                                         0,
6311                                                                         RAMask_BT);
6312                         rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, (u8*)(&pMgntInfo->mBrates));
6313 #else
6314                         //Update_RA_Entry(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum);
6315
6316                         if(padapter->HalFunc.UpdateRAMaskHandler)
6317                                 padapter->HalFunc.UpdateRAMaskHandler(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum, 0);
6318
6319                         rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, padapter->mlmepriv.cur_network.network.SupportedRates);
6320 #endif
6321                         BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
6322
6323                         //rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8*)(&opMode));
6324                         //rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
6325                         break;
6326                 }
6327
6328                 default:
6329                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6330                         break;
6331         }
6332 }
6333
6334 void
6335 bthci_StateAuth(
6336         PADAPTER                                        padapter,
6337         HCI_STATE_WITH_CMD              StateCmd,
6338         u8                                      EntryNum
6339         )
6340 {
6341         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6342         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6343
6344         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Authenticating], "));
6345         switch (StateCmd)
6346         {
6347                 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
6348                 {
6349                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
6350                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
6351                         pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
6352                         BTHCI_DisconnectPeer(padapter, EntryNum);
6353                         break;
6354                 }
6355
6356                 case STATE_CMD_DISCONNECT_PHY_LINK:
6357                 {
6358                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6359                         bthci_EventDisconnectPhyLinkComplete(padapter,
6360                         HCI_STATUS_SUCCESS,
6361                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6362                         EntryNum);
6363
6364                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6365
6366                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6367
6368                         BTHCI_DisconnectPeer(padapter,EntryNum);
6369                         break;
6370                 }
6371
6372                 case STATE_CMD_4WAY_FAILED:
6373                 {
6374                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_FAILED\n"));
6375
6376                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_AUTH_FAIL;
6377                         pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
6378
6379                         BTHCI_DisconnectPeer(padapter,EntryNum);
6380
6381                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6382                         break;
6383                 }
6384
6385                 case STATE_CMD_4WAY_SUCCESSED:
6386                 {
6387                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_SUCCESSED\n"));
6388
6389                         bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_SUCCESS, EntryNum, INVALID_PL_HANDLE);
6390
6391                         PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
6392
6393                         BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6394                         break;
6395                 }
6396
6397                 default:
6398                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6399                         break;
6400         }
6401 }
6402
6403 void
6404 bthci_StateDisconnecting(
6405         PADAPTER                                        padapter,
6406         HCI_STATE_WITH_CMD              StateCmd,
6407         u8                                      EntryNum
6408         )
6409 {
6410         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6411         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6412
6413         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnecting], "));
6414         switch (StateCmd)
6415         {
6416                 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
6417                 {
6418                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_CANCEL_INDICATE\n"));
6419                         if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
6420                         {
6421                                 bthci_EventPhysicalLinkComplete(padapter,
6422                                         pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus,
6423                                         EntryNum, INVALID_PL_HANDLE);
6424                         }
6425
6426                         if (pBtMgnt->bBTConnectInProgress)
6427                         {
6428                                 pBtMgnt->bBTConnectInProgress = _FALSE;
6429                                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6430                         }
6431
6432                         BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6433                         break;
6434                 }
6435
6436                 case STATE_CMD_DISCONNECT_PHY_LINK:
6437                 {
6438                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6439
6440                         bthci_EventDisconnectPhyLinkComplete(padapter,
6441                         HCI_STATUS_SUCCESS,
6442                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6443                         EntryNum);
6444
6445                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6446
6447                         BTHCI_DisconnectPeer(padapter, EntryNum);
6448                         break;
6449                 }
6450
6451                 default:
6452                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6453                         break;
6454         }
6455 }
6456
6457 void
6458 bthci_StateDisconnected(
6459         PADAPTER                                        padapter,
6460         HCI_STATE_WITH_CMD              StateCmd,
6461         u8                                      EntryNum
6462         )
6463 {
6464 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6465         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6466         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
6467         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6468
6469         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnected], "));
6470         switch (StateCmd)
6471         {
6472                 case STATE_CMD_CREATE_PHY_LINK:
6473                 case STATE_CMD_ACCEPT_PHY_LINK:
6474                 {
6475                         if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
6476                         {
6477                                 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CREATE_PHY_LINK\n"));
6478                         }
6479                         else
6480                         {
6481                                 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ACCEPT_PHY_LINK\n"));
6482                         }
6483
6484                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT PS], Disable IPS and LPS\n"));
6485                         IPSDisable(padapter, _FALSE, IPS_DISABLE_BT_ON);
6486                         LeisurePSLeave(padapter, LPS_DISABLE_BT_HS_CONNECTION);
6487
6488                         pBtMgnt->bPhyLinkInProgress =_TRUE;
6489                         pBtMgnt->BTCurrentConnectType=BT_DISCONNECT;
6490                         if (!pBtMgnt->BtOperationOn)
6491                         {
6492 #if (SENDTXMEHTOD == 0)
6493                                 PlatformSetTimer(padapter, &pBTInfo->BTHCISendAclDataTimer, 1);
6494 #endif
6495 #if (RTS_CTS_NO_LEN_LIMIT == 1)
6496                                 rtw_write32(padapter, 0x4c8, 0xc140400);
6497 #endif
6498                         }
6499                         pBtMgnt->CurrentBTConnectionCnt++;
6500                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], CurrentBTConnectionCnt = %d\n",
6501                                 pBtMgnt->CurrentBTConnectionCnt));
6502                         pBtMgnt->BtOperationOn = _TRUE;
6503                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], Bt Operation ON!! CurrentConnectEntryNum = %d\n",
6504                                 pBtMgnt->CurrentConnectEntryNum));
6505
6506                         if (pBtMgnt->bBTConnectInProgress)
6507                         {
6508                                 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONTROLLER_BUSY, INVALID_ENTRY_NUM, pBtMgnt->BtCurrentPhyLinkhandle);
6509                                 bthci_RemoveEntryByEntryNum(padapter, EntryNum);
6510                                 return;
6511                         }
6512
6513                         if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
6514                         {
6515                                 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_CREATOR;
6516                         }
6517                         else
6518                         {
6519                                 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_JOINER;
6520                         }
6521
6522                         // 1. MAC not yet in selected channel
6523 #if 0
6524                         while ((MgntRoamingInProgress(pMgntInfo)) ||
6525                                 (MgntIsLinkInProgress(pMgntInfo))||
6526                                 (MgntScanInProgress(pMgntInfo)))
6527 #else
6528                         while (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE)
6529 #endif
6530                         {
6531                                 RTPRINT(FIOCTL, IOCTL_STATE, ("Scan/Roaming/Wifi Link is in Progress, wait 200 ms\n"));
6532                                 rtw_mdelay_os(200);
6533                         }
6534                         // 2. MAC already in selected channel
6535                         {
6536                                 RTPRINT(FIOCTL, IOCTL_STATE, ("Channel is Ready\n"));
6537                                 PlatformSetTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer, pBtHciInfo->ConnAcceptTimeout);
6538
6539                                 pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent = _TRUE;
6540                         }
6541                         break;
6542                 }
6543
6544                 case STATE_CMD_DISCONNECT_PHY_LINK:
6545                 {
6546                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6547
6548                         PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6549
6550                         bthci_EventDisconnectPhyLinkComplete(padapter,
6551                         HCI_STATUS_SUCCESS,
6552                         pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6553                         EntryNum);
6554
6555                         if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
6556                         {
6557                                 bthci_EventPhysicalLinkComplete(padapter,
6558                                         HCI_STATUS_UNKNOW_CONNECT_ID,
6559                                         EntryNum, INVALID_PL_HANDLE);
6560                         }
6561
6562                         if (pBtMgnt->bBTConnectInProgress)
6563                         {
6564                                 pBtMgnt->bBTConnectInProgress = _FALSE;
6565                                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6566                         }
6567                         BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6568                         bthci_RemoveEntryByEntryNum(padapter,EntryNum);
6569                         break;
6570                 }
6571
6572                 case STATE_CMD_ENTER_STATE:
6573                 {
6574                         RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
6575                         break;
6576                 }
6577
6578                 default:
6579                         RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6580                         break;
6581         }
6582 }
6583
6584 void
6585 bthci_UseFakeData(
6586         PADAPTER        padapter,
6587         PPACKET_IRP_HCICMD_DATA         pHciCmd
6588         )
6589 {
6590         if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_CREATE_LOGICAL_LINK)
6591         {
6592                 PHCI_FLOW_SPEC  pTxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[1];
6593                 PHCI_FLOW_SPEC  pRxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[17];
6594                 bthci_SelectFlowType(padapter, BT_TX_BE_FS, BT_RX_BE_FS, pTxFlowSpec, pRxFlowSpec);
6595                 //bthci_SelectFlowType(padapter, BT_TX_be_FS, BT_RX_GU_FS, pTxFlowSpec, pRxFlowSpec);
6596         }
6597         else if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_FLOW_SPEC_MODIFY)
6598         {
6599                 PHCI_FLOW_SPEC  pTxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[2];
6600                 PHCI_FLOW_SPEC  pRxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[18];
6601                 //bthci_SelectFlowType(padapter, BT_TX_BE_FS, BT_RX_BE_FS, pTxFlowSpec, pRxFlowSpec);
6602                 bthci_SelectFlowType(padapter, BT_TX_BE_AGG_FS, BT_RX_BE_AGG_FS, pTxFlowSpec, pRxFlowSpec);
6603         }
6604 }
6605
6606 void bthci_TimerCallbackHCICmd(PRT_TIMER pTimer)
6607 {
6608 #if (BT_THREAD == 0)
6609 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6610         PADAPTER                padapter = (PADAPTER)pTimer;
6611         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
6612
6613         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() ==>\n"));
6614
6615         PlatformScheduleWorkItem(&pBTinfo->HCICmdWorkItem);
6616
6617         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() <==\n"));
6618 #endif
6619 }
6620
6621 void bthci_TimerCallbackSendAclData(PRT_TIMER pTimer)
6622 {
6623 #if (SENDTXMEHTOD == 0)
6624 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6625         PADAPTER                padapter = (PADAPTER)pTimer;
6626         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
6627
6628         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() ==>\n"));
6629         if (padapter->bDriverIsGoingToUnload)
6630         {
6631                 return;
6632         }
6633         PlatformScheduleWorkItem(&pBTinfo->HCISendACLDataWorkItem);
6634         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() <==\n"));
6635 #endif
6636 }
6637
6638 void bthci_TimerCallbackDiscardAclData(PRT_TIMER pTimer)
6639 {
6640 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6641         PADAPTER                padapter = (PADAPTER)pTimer;
6642         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6643         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
6644
6645         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() ==>\n"));
6646
6647         RTPRINT(FIOCTL, (IOCTL_CALLBACK_FUN|IOCTL_BT_LOGO), ("Flush Timeout ==>\n"));
6648         if (bthci_DiscardTxPackets(padapter, pBtHciInfo->FLTO_LLH))
6649         {
6650                 bthci_EventFlushOccurred(padapter, pBtHciInfo->FLTO_LLH);
6651         }
6652         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() <==\n"));
6653 }
6654
6655 void bthci_TimerCallbackPsDisable(PRT_TIMER pTimer)
6656 {
6657 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6658         PADAPTER                padapter = (PADAPTER)pTimer;
6659         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
6660
6661         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() ==>\n"));
6662
6663         PlatformScheduleWorkItem(&(pBTinfo->BTPsDisableWorkItem));
6664
6665         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() <==\n"));
6666 }
6667
6668 void bthci_TimerCallbackJoinTimeout(PRT_TIMER pTimer)
6669 {
6670 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6671         PADAPTER                padapter = (PADAPTER)pTimer;
6672         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6673         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6674         u8                      CurrentEntry = pBtMgnt->CurrentConnectEntryNum;
6675
6676         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() ==> Current State %x\n",pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState));
6677
6678         if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_STARTING)
6679         {
6680                 bthci_StateStarting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6681         }
6682         else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_CONNECTING)
6683         {
6684                 bthci_StateConnecting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6685         }
6686         else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_AUTHENTICATING)
6687         {
6688                 bthci_StateAuth(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6689         }
6690         else
6691         {
6692                 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <== No Such state!!!\n"));
6693         }
6694
6695         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <==\n"));
6696 }
6697
6698 void bthci_TimerCallbackSendTestPacket(PRT_TIMER pTimer)
6699 {
6700 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6701         PADAPTER                padapter = (PADAPTER)pTimer;
6702         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6703         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
6704
6705         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() \n"));
6706         if (pBtHciInfo->bTestIsEnd || !pBtHciInfo->bInTestMode)
6707         {
6708                 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==bTestIsEnd\n"));
6709                 return;
6710         }
6711
6712 //      BTPKT_SendTestPacket(padapter); // not porting yet
6713         PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
6714         RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==\n"));
6715 }
6716
6717 void bthci_TimerCallbackBTSupervisionPacket(PRT_TIMER pTimer)
6718 {
6719 #if 0 // not porting yet
6720 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6721         PADAPTER                padapter = (PADAPTER)pTimer;
6722         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6723         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6724         u8                      i;
6725         u8                      isQosdata = _TRUE;
6726         int                             EntryTimer=5000;
6727         u32                     EntryTOCnt = 0;
6728         int                             callBackTimer=1000;
6729
6730
6731         if (pBTInfo->BTBeaconTmrOn)
6732         {
6733                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT] stop beacon timer\n"));
6734                 pBTInfo->BTBeaconTmrOn = _FALSE;
6735                 PlatformCancelTimer(padapter, &(pBTInfo->BTBeaconTimer));
6736         }
6737
6738         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
6739         {
6740                 if (pBTInfo->BtAsocEntry[i].b4waySuccess)
6741                 {
6742                         if (pBTInfo->BtAsocEntry[i].NoRxPktCnt)
6743                         {
6744                                 RTPRINT(FIOCTL, IOCTL_STATE, ("BtAsocEntry[%d].NoRxPktCnt = %ld\n", i, pBTInfo->BtAsocEntry[i].NoRxPktCnt));
6745                         }
6746                         EntryTimer = ((pBTInfo->BtAsocEntry[i].PhyLinkCmdData.LinkSuperversionTimeout*625)/1000);
6747                         EntryTOCnt = (EntryTimer/callBackTimer);
6748                         {
6749                                 if (pBtMgnt->bStartSendSupervisionPkt)
6750                                 {
6751                                         if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_CONNECTED)
6752                                         {
6753
6754                                                 if (pBTInfo->BtAsocEntry[i].NoRxPktCnt >= 4)    // start to send supervision packet
6755                                                 {
6756                                                         isQosdata = _FALSE;
6757                                                         if (pBTInfo->BtAsocEntry[i].AMPRole == AMP_BTAP_JOINER)
6758                                                         {
6759                                                                 if (pBtMgnt->bssDesc.BssQos.bdQoSMode > QOS_DISABLE)
6760                                                                         isQosdata = _TRUE;
6761                                                         }
6762                                                         else if (pBTInfo->BtAsocEntry[i].AMPRole == AMP_BTAP_CREATOR)
6763                                                         {
6764                                                                 if (pBTInfo->BtAsocEntry[i].bPeerQosSta)
6765                                                                         isQosdata = _TRUE;
6766                                                         }
6767                                                         BTPKT_SendLinkSupervisionPacket(padapter, _TRUE, i, isQosdata);
6768                                                 }
6769
6770                                                 if (pBTInfo->BtAsocEntry[i].bSendSupervisionPacket)
6771                                                 {
6772                                                         if (pBTInfo->BtAsocEntry[i].NoRxPktCnt >= EntryTOCnt)
6773                                                         {
6774                                                                 pBTInfo->BtAsocEntry[i].PhyLinkDisconnectReason=HCI_STATUS_CONNECT_TIMEOUT;
6775                                                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("No Link supervision Packet received within %d Sec !!!!\n",(EntryTimer/1000)));
6776                                                                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in bthci_TimerCallbackBTSupervisionPacket()\n"));
6777                                                                         BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
6778                                                         }
6779                                                 }
6780                                                 else
6781                                                 {
6782                                                         pBTInfo->BtAsocEntry[i].bSendSupervisionPacket = _TRUE;
6783                                                 }
6784                                         }
6785                                 }
6786                         }
6787                         pBTInfo->BtAsocEntry[i].NoRxPktCnt++;
6788                 }
6789         }
6790
6791         PlatformSetTimer(padapter, &pBTInfo->BTSupervisionPktTimer, callBackTimer);
6792 #endif
6793 }
6794
6795 void bthci_TimerCallbackBTAuthTimeout(PRT_TIMER pTimer)
6796 {
6797 #if 0 // not porting yet
6798 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6799         PADAPTER                padapter = (PADAPTER)pTimer;
6800 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6801         PBT30Info       pBtInfo = GET_BT_INFO(padapter);
6802         PBT_MGNT                pBtMgnt = &pBtInfo->BtMgnt;
6803         u8      arSeq, arAlg, AuthStatusCode;
6804         OCTET_STRING    OurCText;
6805         u8      arChalng[128];
6806
6807         switch (pBtMgnt->BTCurrentConnectType)
6808         {
6809                 case BT_CONNECT_AUTH_REQ:
6810                 {
6811                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> BT_CONNECT_AUTH_REQ\n"));
6812                         if (pBtMgnt->BTReceiveConnectPkt! = BT_CONNECT_AUTH_RSP)
6813                         {
6814                                 if (pBtMgnt->BTAuthCount < BTMaxAuthCount)
6815                                 {
6816                                         FillOctetString(OurCText, pMgntInfo->arChalng, 0);
6817
6818                                         arAlg = OPEN_SYSTEM;
6819                                         AuthStatusCode = StatusCode_success;
6820                                         arSeq = 1;
6821                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Re Send Auth Req %d\n", pBtMgnt->BTAuthCount));
6822                                         BTPKT_SendAuthenticatePacket(
6823                                                 padapter,
6824                                                 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr, // auStaAddr,
6825                                                 arAlg, // AuthAlg,
6826                                                 arSeq, // AuthSeq,
6827                                                 AuthStatusCode, // AuthStatusCode
6828                                                 OurCText // AuthChallengetext
6829                                                 );
6830
6831                                         pBtMgnt->BTAuthCount++;
6832
6833                                         PlatformSetTimer(padapter, &pBtInfo->BTAuthTimeoutTimer, 200);
6834                                 }
6835                                 else
6836                                 {
6837                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Reach  BTMaxAuthCount\n"));
6838                                 }
6839                         }
6840
6841                         break;
6842                 }
6843                 case BT_CONNECT_AUTH_RSP:
6844                 {
6845                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> BT_CONNECT_AUTH_RSP\n"));
6846                         if (pBtMgnt->BTReceiveConnectPkt != BT_CONNECT_ASOC_REQ)
6847                         {
6848                                 if (pBtMgnt->BTAuthCount < BTMaxAuthCount)
6849                                 {
6850                                         OurCText.Length = 0;
6851                                         OurCText.Octet = arChalng;
6852
6853                                         arAlg = OPEN_SYSTEM;
6854
6855                                         AuthStatusCode = StatusCode_success;
6856                                         // Send auth frame.
6857                                         BTPKT_SendAuthenticatePacket(
6858                                                 padapter,
6859                                                 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr, // auStaAddr,
6860                                                 arAlg, // AuthAlg,
6861                                                 2, // AuthSeq,
6862                                                 AuthStatusCode, // AuthStatusCode
6863                                                 OurCText // AuthChallengetext
6864                                                 );
6865
6866                                         pBtMgnt->BTAuthCount++;
6867                                 }
6868                                 else
6869                                 {
6870                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Reach  BTMaxAuthCount\n"));
6871                                 }
6872                         }
6873
6874                         break;
6875                 }
6876                 default:
6877                 {
6878                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> No Such Connect Type %d  !!!!!!\n", pBtMgnt->BTCurrentConnectType));
6879                         break;
6880                 }
6881         }
6882 #endif
6883 }
6884
6885 void bthci_TimerCallbackAsocTimeout(PRT_TIMER pTimer)
6886 {
6887 #if 0 // not porting yet
6888 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6889         PADAPTER                padapter = (PADAPTER)pTimer;
6890 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6891         PBT30Info       pBtInfo = GET_BT_INFO(padapter);
6892         PBT_MGNT                pBtMgnt = &pBtInfo->BtMgnt;
6893
6894         switch (pBtMgnt->BTCurrentConnectType)
6895         {
6896                 case BT_CONNECT_ASOC_REQ:
6897                 {
6898                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> BT_CONNECT_ASOC_REQ\n"));
6899                         if (pBtMgnt->BTReceiveConnectPkt! = BT_CONNECT_ASOC_RSP)
6900                         {
6901                                 if (pBtMgnt->BTAsocCount < BTMaxAsocCount)
6902                                 {
6903                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> Re Send Asoc Req %d\n", pBtMgnt->BTAsocCount));
6904                                         BTPKT_SendAssociateReq(
6905                                                 padapter,
6906                                                 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr,
6907                                                 pMgntInfo->mCap,
6908                                                 ASSOC_REQ_TIMEOUT,
6909                                                 pBtMgnt->CurrentConnectEntryNum);
6910
6911                                         pBtMgnt->BTAsocCount++;
6912
6913                                         PlatformSetTimer(padapter, &pBtInfo->BTAsocTimeoutTimer, 200);
6914                                 }
6915                                 else
6916                                 {
6917                                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> Reach  BTMaxAuthCount\n"));
6918                                 }
6919                         }
6920                         break;
6921                 }
6922                 case BT_CONNECT_ASOC_RSP:
6923                 {
6924                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> BT_CONNECT_ASOC_RSP\n"));
6925                         break;
6926                 }
6927                 default:
6928                 {
6929                         RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> No Such Connect Type %d  !!!!!!\n", pBtMgnt->BTCurrentConnectType));
6930                         break;
6931                 }
6932         }
6933 #endif
6934 }
6935
6936 void bthci_TimerCallbackDisconnectPhysicalLink(PRT_TIMER pTimer)
6937 {
6938 //      PADAPTER                padapter = (PADAPTER)pTimer->padapter;
6939         PADAPTER                padapter = (PADAPTER)pTimer;
6940         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6941         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
6942
6943         RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("===>bthci_TimerCallbackDisconnectPhysicalLink\n"));
6944
6945         if (pBTInfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].BtCurrentState == HCI_STATE_CONNECTED)
6946         {
6947                 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTED,STATE_CMD_DISCONNECT_PHY_LINK, pBtMgnt->DisconnectEntryNum);
6948         }
6949
6950         BTHCI_EventNumOfCompletedDataBlocks(padapter);
6951         pBtMgnt->DisconnectEntryNum = 0xff;
6952         RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("<===bthci_TimerCallbackDisconnectPhysicalLink\n"));
6953
6954 }
6955
6956 u8 bthci_WaitForRfReady(PADAPTER padapter)
6957 {
6958         u8 bRet = _FALSE;
6959
6960 //      PRT_POWER_SAVE_CONTROL  pPSC = GET_POWER_SAVE_CONTROL(&(padapter->MgntInfo));
6961         struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
6962         rt_rf_power_state                       RfState;
6963         u32                                             waitcnt = 0;
6964
6965         while(1)
6966         {
6967 //              rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState));
6968                 RfState = ppwrctrl->rf_pwrstate;
6969
6970 //              if ((RfState != eRfOn) || (pPSC->bSwRfProcessing))
6971                 if ((RfState != rf_on) || (ppwrctrl->bips_processing))
6972                 {
6973                         rtw_mdelay_os(10);
6974                         if (waitcnt++ >= 200)
6975                         {
6976 //                              RT_ASSERT(_FALSE, ("bthci_WaitForRfReady(), wait for RF ON timeout\n"));
6977                                 bRet = _FALSE;
6978                                 break;
6979                         }
6980                 }
6981                 else
6982                 {
6983                         RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_WaitForRfReady(), Rf is on, wait %d times\n", waitcnt));
6984                         bRet = _TRUE;
6985                         break;
6986                 }
6987         }
6988
6989         return bRet;
6990 }
6991
6992 void bthci_WorkItemCallbackPsDisable(void *pContext)
6993 {
6994         PADAPTER                padapter = (PADAPTER)pContext;
6995         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
6996         u8                      CurrentAssocNum;
6997
6998         for (CurrentAssocNum=0; CurrentAssocNum<MAX_BT_ASOC_ENTRY_NUM; CurrentAssocNum++)
6999         {
7000                 if (pBTInfo->BtAsocEntry[CurrentAssocNum].bUsed == _TRUE)
7001                 {
7002                         RTPRINT(FIOCTL, IOCTL_STATE, ("WorkItemCallbackPsDisable(): Handle Associate Entry %d\n", CurrentAssocNum));
7003
7004                         if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
7005                         {
7006 //                              BTPKT_StartBeacon(padapter, CurrentAssocNum); // not porting yet
7007                                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_COMPLETE, CurrentAssocNum);
7008                         }
7009                         else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
7010                         {
7011                                 bthci_WaitForRfReady(padapter);
7012                                 bthci_ResponderStartToScan(padapter);
7013                         }
7014                 }
7015         }
7016 }
7017
7018 void bthci_WorkItemCallbackHCICmd(void *pContext)
7019 {
7020         PlatformProcessHCICommands(pContext);
7021 }
7022
7023 void bthci_WorkItemCallbackSendACLData(void *pContext)
7024 {
7025 #if (SENDTXMEHTOD == 0)
7026         PADAPTER                padapter = (PADAPTER)pContext;
7027 #if 0 //cosa for special logo test case
7028         if (acldata_cnt >= 2)
7029 #endif
7030         PlatformTxBTQueuedPackets(padapter);
7031 #endif
7032 }
7033
7034 void bthci_WorkItemCallbackConnect(void *pContext)
7035 {
7036         PADAPTER                padapter = (PADAPTER)pContext;
7037         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
7038         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
7039
7040 //      BTPKT_JoinerConnectProcess(padapter, pBtMgnt->CurrentConnectEntryNum); // not porting yet
7041 }
7042
7043 u8 BTHCI_GetConnectEntryNum(PADAPTER padapter)
7044 {
7045         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
7046         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
7047
7048         return bthci_GetCurrentEntryNum(padapter, pBtMgnt->BtCurrentPhyLinkhandle);
7049 }
7050
7051 u8 BTHCI_GetCurrentEntryNumByMAC(PADAPTER padapter, u8 *SA)
7052 {
7053         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
7054         u8      i;
7055
7056         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7057         {
7058                 if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
7059                 {
7060                         if (_rtw_memcmp(pBTInfo->BtAsocEntry[i].BTRemoteMACAddr, SA, 6) == _TRUE)
7061                         {
7062                                 return i;
7063                         }
7064                 }
7065         }
7066         return 0xFF;
7067 }
7068
7069 void BTHCI_StatusWatchdog(PADAPTER padapter)
7070 {
7071 //      PMGNT_INFO                      pMgntInfo = &padapter->MgntInfo;
7072         struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
7073         PBT30Info                       pBTInfo = GET_BT_INFO(padapter);
7074         PBT_MGNT                        pBtMgnt = &pBTInfo->BtMgnt;
7075         PBT_TRAFFIC                     pBtTraffic = &pBTInfo->BtTraffic;
7076         u8                              bRfOff=_FALSE, bTxBusy = _FALSE, bRxBusy = _FALSE;
7077
7078 #if 0   // test only
7079         u8                                              testbuf[100]={0};
7080         PRTK_DBG_CTRL_OIDS                      pDbgCtrl;
7081         PPACKET_IRP_HCICMD_DATA pHCICMD;
7082         u32                                             a,b;
7083         u16     *                                       pu2Tmp;
7084
7085         pDbgCtrl = (PRTK_DBG_CTRL_OIDS)testbuf;
7086         pDbgCtrl->ctrlType = 0;
7087         pHCICMD = (PPACKET_IRP_HCICMD_DATA)&pDbgCtrl->CtrlData;
7088         pHCICMD->OCF = OGF_EXTENSION;
7089         pHCICMD->OGF = HCI_LINK_STATUS_NOTIFY;
7090         pHCICMD->Length = 5;
7091         pHCICMD->Data[0] = 0x1;
7092         //pu2Tmp =
7093         *((u16*)&pHCICMD->Data[1]) = 0x0205;
7094         //*pu2Tmp = 0x0205;
7095         pHCICMD->Data[3] = 0x3;
7096         pHCICMD->Data[4] = 0x2;
7097         pDbgCtrl->ctrlDataLen = pHCICMD->Length+3;
7098         OIDS_RTKDbgControl(padapter, testbuf, pDbgCtrl->ctrlDataLen+4, &a, &b);
7099 #endif
7100
7101 #if 0
7102         if ((pMgntInfo->RfOffReason & RF_CHANGE_BY_HW) ||
7103                 (pMgntInfo->RfOffReason & RF_CHANGE_BY_SW))
7104 #else
7105         if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
7106                 (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
7107 #endif
7108                 bRfOff = _TRUE;
7109
7110 #if 0
7111         if (!MgntRoamingInProgress(pMgntInfo) &&
7112                 !MgntIsLinkInProgress(pMgntInfo) &&
7113                 !MgntScanInProgress(pMgntInfo) &&
7114 #else
7115         if ((check_fwstate(&padapter->mlmepriv, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) &&
7116 #endif
7117                 !bRfOff)
7118         {
7119                 static u8 BTwaitcnt=0;
7120                 if (pBtMgnt->BTNeedAMPStatusChg)
7121                 {
7122                         BTwaitcnt++;
7123                         if (BTwaitcnt >= 2)
7124                         {
7125                                 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_FULL_CAPACITY_FOR_BT);
7126                                 BTwaitcnt = 0;
7127                         }
7128                 }
7129         }
7130
7131         RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], TxPktCntInPeriod=%d, TxPktLenInPeriod=%"i64fmt"d\n",
7132                 pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod,
7133                 pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod));
7134         RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], RxPktCntInPeriod=%d, RxPktLenInPeriod=%"i64fmt"d\n",
7135                 pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod,
7136                 pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod));
7137         if (pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod > 100 ||
7138                 pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod > 100 )
7139         {
7140                 if (pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod)
7141                         bRxBusy = _TRUE;
7142                 else if (pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod)
7143                         bTxBusy = _TRUE;
7144         }
7145
7146         pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod = 0;
7147         pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod = 0;
7148         pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod = 0;
7149         pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod = 0;
7150         pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic = bTxBusy;
7151         pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic = bRxBusy;
7152         RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], bTxBusyTraffic=%d, bRxBusyTraffic=%d\n",
7153                 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic,
7154                 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic));
7155 }
7156
7157 void
7158 BTHCI_NotifyRFState(
7159         PADAPTER                                padapter,
7160         rt_rf_power_state               StateToSet,
7161         RT_RF_CHANGE_SOURCE     ChangeSource
7162         )
7163 {
7164 #if 0
7165         PMGNT_INFO                              pMgntInfo = &padapter->MgntInfo;
7166         RT_RF_CHANGE_SOURCE     RfOffReason = pMgntInfo->RfOffReason;
7167 #else
7168         struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
7169         RT_RF_CHANGE_SOURCE     RfOffReason = ppwrctrl->rfoff_reason;
7170 #endif
7171
7172         RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Old RfOffReason = 0x%x, ChangeSource = 0x%x\n", RfOffReason, ChangeSource));
7173         if (ChangeSource < RF_CHANGE_BY_HW)
7174         {
7175                 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), ChangeSource < RF_CHANGE_BY_HW\n"));
7176                 return;
7177         }
7178
7179         //
7180         // When RF is on/off by HW/SW(IPS/LPS not included), we have to notify
7181         // core stack the AMP_Status
7182         //
7183
7184         // We only have to check RF On/Off by HW/SW
7185         RfOffReason &= (RF_CHANGE_BY_HW|RF_CHANGE_BY_SW);
7186
7187         switch (StateToSet)
7188         {
7189                 case rf_on:
7190                         if (RfOffReason)
7191                         {
7192                                 //
7193                                 // Previously, HW or SW Rf state is OFF, check if it is turned on by HW/SW
7194                                 //
7195                                 RfOffReason &= ~ChangeSource;
7196                                 if (!RfOffReason)
7197                                 {
7198                                         // Both HW/SW Rf is turned on
7199                                         RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Rf is turned On!\n"));
7200                                         BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_FULL_CAPACITY_FOR_BT);
7201                                 }
7202                         }
7203                         break;
7204
7205                 case rf_off:
7206                         if (!RfOffReason)
7207                         {
7208                                 //
7209                                 // Previously, both HW/SW Rf state is ON, check if it is turned off by HW/SW
7210                                 //
7211                                 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Rf is turned Off!\n"));
7212                                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in BTHCI_NotifyRFState()\n"));
7213                                 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
7214                         }
7215                         break;
7216
7217                 default:
7218                         RTPRINT(FIOCTL, IOCTL_STATE, ("Unknown case!! \n"));
7219                         break;
7220         }
7221 }
7222
7223 void
7224 BTHCI_IndicateAMPStatus(
7225         PADAPTER                        padapter,
7226         u8                              JoinAction,
7227         u8                              channel
7228         )
7229 {
7230 //      PMGNT_INFO      pMgntInfo = &(padapter->MgntInfo);
7231         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7232         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7233         u8              bNeedIndicate = _FALSE;
7234
7235         RTPRINT(FIOCTL, IOCTL_STATE, ("JoinAction=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
7236                 JoinAction, channel));
7237
7238         switch (JoinAction)
7239         {
7240                 case RT_JOIN_INFRA:
7241                 case RT_JOIN_IBSS:
7242                         //
7243                         // When join infra or ibss, check if bt channel is the current channel,
7244                         // if not, we need to indicate AMPStatus=2
7245                         //
7246                         if (channel != pBtMgnt->BTChannel)
7247                                 bNeedIndicate = _TRUE;
7248                         break;
7249                 case RT_START_IBSS:
7250                         //
7251                         // when start IBSS, we need to indicate AMPStatus=2 to
7252                         // reset be hw security
7253                         //
7254                         bNeedIndicate = _TRUE;
7255                         break;
7256                 case RT_NO_ACTION:
7257                         break;
7258                 default:
7259                         break;
7260         }
7261
7262         if (bNeedIndicate)
7263         {
7264                 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_IndicateAMPStatus(), BT channel=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
7265                         pBtMgnt->BTChannel, channel));
7266
7267                 if (pBtMgnt->BtOperationOn)
7268                 {
7269                         RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in JoinRequest()\n"));
7270                         BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
7271                 }
7272         }
7273 }
7274
7275 void
7276 BTHCI_EventParse(
7277         PADAPTER                                        padapter,
7278         void                                            *pEvntData,
7279         u32                                             dataLen
7280         )
7281 {
7282         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pEvntData;
7283         return;
7284
7285         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BT Event Code = 0x%x\n", PPacketIrpEvent->EventCode));
7286         RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BT Event Length = 0x%x\n", PPacketIrpEvent->Length));
7287
7288         switch (PPacketIrpEvent->EventCode)
7289         {
7290                 case HCI_EVENT_COMMAND_COMPLETE:
7291                         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_COMPLETE\n"));
7292                         break;
7293                 case HCI_EVENT_COMMAND_STATUS:
7294                         RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_STATUS\n"));
7295                         break;
7296                 default:
7297                         break;
7298         }
7299 }
7300
7301 u16
7302 BTHCI_GetPhysicalLinkHandle(
7303         PADAPTER        padapter,
7304         u8              EntryNum
7305         )
7306 {
7307         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7308         u16 handle;
7309
7310         handle = pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle;
7311
7312         return handle;
7313 }
7314
7315 RT_STATUS
7316 BTHCI_IndicateRxData(
7317         PADAPTER                                        padapter,
7318         void                                            *pData,
7319         u32                                             dataLen,
7320         u8                                              EntryNum
7321         )
7322 {
7323         RT_STATUS       rt_status;
7324
7325         rt_status = PlatformIndicateBTACLData(padapter, pData, dataLen, EntryNum);
7326
7327         return rt_status;
7328 }
7329
7330 void BTHCI_InitializeAllTimer(PADAPTER padapter)
7331 {
7332         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7333         PBT_SECURITY            pBtSec = &pBTinfo->BtSec;
7334
7335 #if (BT_THREAD == 0)
7336         PlatformInitializeTimer(padapter, &pBTinfo->BTHCICmdTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackHCICmd, NULL, "BTHCICmdTimer");
7337 #endif
7338 #if (SENDTXMEHTOD == 0)
7339         PlatformInitializeTimer(padapter, &pBTinfo->BTHCISendAclDataTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackSendAclData, NULL, "BTHCISendAclDataTimer");
7340 #endif
7341         PlatformInitializeTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackDiscardAclData, NULL, "BTHCIDiscardAclDataTimer");
7342         PlatformInitializeTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackJoinTimeout, NULL, "BTHCIJoinTimeoutTimer");
7343         PlatformInitializeTimer(padapter, &pBTinfo->BTTestSendPacketTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackSendTestPacket, NULL, "BTTestSendPacketTimer");
7344
7345         PlatformInitializeTimer(padapter, &pBTinfo->BTBeaconTimer, (RT_TIMER_CALL_BACK)BTPKT_TimerCallbackBeacon, NULL, "BTBeaconTimer");
7346         PlatformInitializeTimer(padapter, &pBtSec->BTWPAAuthTimer, (RT_TIMER_CALL_BACK)BTPKT_TimerCallbackWPAAuth, NULL, "BTWPAAuthTimer");
7347         PlatformInitializeTimer(padapter, &pBTinfo->BTSupervisionPktTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackBTSupervisionPacket, NULL, "BTGeneralPurposeTimer");
7348         PlatformInitializeTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackDisconnectPhysicalLink, NULL, "BTDisconnectPhyLinkTimer");
7349         PlatformInitializeTimer(padapter, &pBTinfo->BTPsDisableTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackPsDisable, NULL, "BTPsDisableTimer");
7350         PlatformInitializeTimer(padapter, &pBTinfo->BTAuthTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackBTAuthTimeout, NULL, "BTAuthTimeoutTimer");
7351         PlatformInitializeTimer(padapter, &pBTinfo->BTAsocTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackAsocTimeout, NULL, "BTAsocTimeoutTimer");
7352 }
7353
7354 void BTHCI_CancelAllTimer(PADAPTER padapter)
7355 {
7356         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7357         PBT_SECURITY            pBtSec = &pBTinfo->BtSec;
7358
7359         // Note: don't cancel BTHCICmdTimer, if you cancel this timer, there will
7360         // have posibility to cause irp not completed.
7361 #if (SENDTXMEHTOD == 0)
7362         PlatformCancelTimer(padapter, &pBTinfo->BTHCISendAclDataTimer);
7363 #endif
7364         PlatformCancelTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
7365         PlatformCancelTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
7366         PlatformCancelTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
7367
7368         PlatformCancelTimer(padapter, &pBTinfo->BTBeaconTimer);
7369         PlatformCancelTimer(padapter, &pBtSec->BTWPAAuthTimer);
7370         PlatformCancelTimer(padapter, &pBTinfo->BTSupervisionPktTimer);
7371         PlatformCancelTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer);
7372         PlatformCancelTimer(padapter, &pBTinfo->BTPsDisableTimer);
7373         PlatformCancelTimer(padapter, &pBTinfo->BTAuthTimeoutTimer);
7374         PlatformCancelTimer(padapter, &pBTinfo->BTAsocTimeoutTimer);
7375 }
7376
7377 void BTHCI_ReleaseAllTimer(PADAPTER padapter)
7378 {
7379         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7380         PBT_SECURITY            pBtSec = &pBTinfo->BtSec;
7381
7382 #if (BT_THREAD == 0)
7383         PlatformReleaseTimer(padapter, &pBTinfo->BTHCICmdTimer);
7384 #endif
7385 #if (SENDTXMEHTOD == 0)
7386         PlatformReleaseTimer(padapter, &pBTinfo->BTHCISendAclDataTimer);
7387 #endif
7388         PlatformReleaseTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
7389         PlatformReleaseTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
7390         PlatformReleaseTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
7391
7392         PlatformReleaseTimer(padapter, &pBTinfo->BTBeaconTimer);
7393         PlatformReleaseTimer(padapter, &pBtSec->BTWPAAuthTimer);
7394         PlatformReleaseTimer(padapter, &pBTinfo->BTSupervisionPktTimer);
7395         PlatformReleaseTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer);
7396         PlatformReleaseTimer(padapter, &pBTinfo->BTAuthTimeoutTimer);
7397         PlatformReleaseTimer(padapter, &pBTinfo->BTAsocTimeoutTimer);
7398         PlatformReleaseTimer(padapter, &pBTinfo->BTPsDisableTimer);
7399 }
7400
7401 void BTHCI_InitializeAllWorkItem(PADAPTER padapter)
7402 {
7403         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7404 #if (BT_THREAD == 0)
7405         PlatformInitializeWorkItem(
7406                 padapter,
7407                 &(pBTinfo->HCICmdWorkItem),
7408                 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackHCICmd,
7409                 (PVOID)padapter,
7410                 "HCICmdWorkItem");
7411 #endif
7412 #if (SENDTXMEHTOD == 0)
7413         PlatformInitializeWorkItem(
7414                 padapter,
7415                 &(pBTinfo->HCISendACLDataWorkItem),
7416                 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackSendACLData,
7417                 (PVOID)padapter,
7418                 "HCISendACLDataWorkItem");
7419 #endif
7420         PlatformInitializeWorkItem(
7421                 padapter,
7422                 &(pBTinfo->BTPsDisableWorkItem),
7423                 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackPsDisable,
7424                 (PVOID)padapter,
7425                 "BTPsDisableWorkItem");
7426
7427         PlatformInitializeWorkItem(
7428                 padapter,
7429                 &(pBTinfo->BTConnectWorkItem),
7430                 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackConnect,
7431                 (PVOID)padapter,
7432                 "BTConnectWorkItem");
7433 }
7434
7435 void BTHCI_FreeAllWorkItem(PADAPTER padapter)
7436 {
7437         PBT30Info               pBTinfo = GET_BT_INFO(padapter);
7438 #if (BT_THREAD == 0)
7439         PlatformFreeWorkItem(&(pBTinfo->HCICmdWorkItem));
7440 #endif
7441 #if (SENDTXMEHTOD == 0)
7442         PlatformFreeWorkItem(&(pBTinfo->HCISendACLDataWorkItem));
7443 #endif
7444         PlatformFreeWorkItem(&(pBTinfo->BTPsDisableWorkItem));
7445         PlatformFreeWorkItem(&(pBTinfo->BTConnectWorkItem));
7446 }
7447
7448 void BTHCI_Reset(PADAPTER padapter)
7449 {
7450         bthci_CmdReset(padapter, _FALSE);
7451 }
7452
7453 u8 BTHCI_HsConnectionEstablished(PADAPTER padapter)
7454 {
7455         u8                      bBtConnectionExist = _FALSE;
7456         PBT30Info       pBtinfo = GET_BT_INFO(padapter);
7457         u8 i;
7458
7459         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7460         {
7461                 if (pBtinfo->BtAsocEntry[i].b4waySuccess == _TRUE)
7462                 {
7463                         bBtConnectionExist = _TRUE;
7464                         break;
7465                 }
7466         }
7467
7468 //      RTPRINT(FIOCTL, IOCTL_STATE, (" BTHCI_HsConnectionEstablished(), connection exist = %d\n", bBtConnectionExist));
7469
7470         return bBtConnectionExist;
7471 }
7472
7473 u8
7474 BTHCI_CheckProfileExist(
7475         PADAPTER        padapter,
7476         BT_TRAFFIC_MODE_PROFILE Profile
7477         )
7478 {
7479         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7480         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7481         u8              IsPRofile = _FALSE;
7482         u8              i=0;
7483
7484         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7485         {
7486                 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == Profile)
7487                 {
7488                         IsPRofile=_TRUE;
7489                         break;
7490                 }
7491         }
7492
7493         return IsPRofile;
7494 }
7495
7496 u8 BTHCI_GetBTCoreSpecByProf(PADAPTER padapter, u8 profile)
7497 {
7498         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7499         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7500         u8              btSpec = BT_SPEC_1_2;
7501         u8              i = 0;
7502
7503         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7504         {
7505                 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == profile)
7506                 {
7507                         btSpec = pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec;
7508                         break;
7509                 }
7510         }
7511
7512         return btSpec;
7513 }
7514
7515
7516 void BTHCI_GetProfileNameMoto(PADAPTER padapter)
7517 {
7518         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7519         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7520         u8              i = 0;
7521         u8              InCommingMode = 0,OutGoingMode = 0,ScoMode = 0;
7522
7523
7524         ScoMode = pBtMgnt->ExtConfig.NumberOfSCO;
7525
7526         RTPRINT(FBT, BT_TRACE, ("[DM][BT], NumberOfHandle = %d, NumberOfSCO = %d\n",
7527                 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
7528
7529         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7530         {
7531                 InCommingMode=pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode;
7532                 OutGoingMode=pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode;
7533
7534                 if (ScoMode)
7535                 {
7536                         pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_SCO;
7537                 }
7538                 else if ((InCommingMode == BT_MOTOR_EXT_BE) && (OutGoingMode == BT_MOTOR_EXT_BE))
7539                 {
7540                         pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_PAN;
7541                 }
7542                 else if ((InCommingMode == BT_MOTOR_EXT_GULB) && (OutGoingMode == BT_MOTOR_EXT_GULB))
7543                 {
7544                         pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_A2DP;
7545                 }
7546                 else if ((InCommingMode == BT_MOTOR_EXT_GUL) && (OutGoingMode == BT_MOTOR_EXT_BE))
7547                 {
7548                         pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_HID;
7549                 }
7550                 else
7551                 {
7552                         pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
7553                 }
7554         }
7555 }
7556
7557 void BTHCI_UpdateBTProfileRTKToMoto(PADAPTER padapter)
7558 {
7559         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7560         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7561         u8              i = 0;
7562
7563         pBtMgnt->ExtConfig.NumberOfSCO = 0;
7564
7565         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7566         {
7567                 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
7568
7569                 if (pBtMgnt->ExtConfig.linkInfo[i].BTProfile == BT_PROFILE_SCO)
7570                 {
7571                         pBtMgnt->ExtConfig.NumberOfSCO++;
7572                 }
7573
7574                 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = pBtMgnt->ExtConfig.linkInfo[i].BTProfile;
7575                 switch (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile)
7576                 {
7577                         case BT_PROFILE_SCO:
7578                                 break;
7579                         case BT_PROFILE_PAN:
7580                                 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_BE;
7581                                 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_BE;
7582                                 break;
7583                         case BT_PROFILE_A2DP:
7584                                 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_GULB;
7585                                 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_GULB;
7586                                 break;
7587                         case BT_PROFILE_HID:
7588                                 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_GUL;
7589                                 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_BE;
7590                                 break;
7591                         default:
7592                                 break;
7593                 }
7594         }
7595
7596         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RTK, NumberOfHandle = %d, NumberOfSCO = %d\n",
7597                 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
7598 }
7599
7600 void BTHCI_GetBTRSSI(PADAPTER padapter)
7601 {
7602         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7603         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7604         u8              i = 0;
7605
7606         //return;
7607
7608         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7609         {
7610                 bthci_EventExtGetBTRSSI(padapter, pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle);
7611         }
7612 }
7613
7614 void BTHCI_WifiScanNotify(PADAPTER padapter, u8 scanType)
7615 {
7616         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7617         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7618
7619         if (pBtMgnt->ExtConfig.bEnableWifiScanNotify)
7620                 bthci_EventExtWifiScanNotify(padapter, scanType);
7621 }
7622
7623 void
7624 BTHCI_StateMachine(
7625         PADAPTER                                        padapter,
7626         u8                                      StateToEnter,
7627         HCI_STATE_WITH_CMD              StateCmd,
7628         u8                                      EntryNum
7629         )
7630 {
7631         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7632         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
7633
7634         if (EntryNum == 0xff)
7635         {
7636                 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, error EntryNum=0x%x \n",EntryNum));
7637                 return;
7638         }
7639         RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, EntryNum = 0x%x, CurrentState = 0x%x, BtNextState = 0x%x,  StateCmd = 0x%x ,StateToEnter = 0x%x\n",
7640                 EntryNum,pBTInfo->BtAsocEntry[EntryNum].BtCurrentState,pBTInfo->BtAsocEntry[EntryNum].BtNextState,StateCmd,StateToEnter));
7641
7642         if (pBTInfo->BtAsocEntry[EntryNum].BtNextState & StateToEnter)
7643         {
7644                 pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = StateToEnter;
7645
7646                 switch (StateToEnter)
7647                 {
7648                         case HCI_STATE_STARTING:
7649                                 {
7650                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTING;
7651                                         bthci_StateStarting(padapter,StateCmd,EntryNum);
7652                                         break;
7653                                 }
7654                         case HCI_STATE_CONNECTING:
7655                                 {
7656                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTING | HCI_STATE_DISCONNECTING | HCI_STATE_AUTHENTICATING;
7657                                         bthci_StateConnecting(padapter,StateCmd,EntryNum);
7658                                         break;
7659                                 }
7660
7661                         case HCI_STATE_AUTHENTICATING:
7662                                 {
7663                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTED;
7664                                         bthci_StateAuth(padapter,StateCmd,EntryNum);
7665                                         break;
7666                                 }
7667
7668                         case HCI_STATE_CONNECTED:
7669                                 {
7670                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTED | HCI_STATE_DISCONNECTING;
7671                                         bthci_StateConnected(padapter,StateCmd,EntryNum);
7672                                         break;
7673                                 }
7674
7675                         case HCI_STATE_DISCONNECTING:
7676                                 {
7677                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_DISCONNECTING;
7678                                         bthci_StateDisconnecting(padapter,StateCmd,EntryNum);
7679                                         break;
7680                                 }
7681
7682                         case HCI_STATE_DISCONNECTED:
7683                                 {
7684                                         pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_STARTING | HCI_STATE_CONNECTING;
7685                                         bthci_StateDisconnected(padapter,StateCmd,EntryNum);
7686                                         break;
7687                                 }
7688
7689                         default:
7690                                 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Unknown state to enter!!!\n"));
7691                                 break;
7692                 }
7693         }
7694         else
7695         {
7696                 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Wrong state to enter\n"));
7697         }
7698
7699         // 20100325 Joseph: Disable/Enable IPS/LPS according to BT status.
7700         if (!pBtMgnt->bBTConnectInProgress && !pBtMgnt->BtOperationOn)
7701         {
7702                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT PS], IPSReturn()\n"));
7703                 IPSReturn(padapter, IPS_DISABLE_BT_ON);
7704         }
7705 }
7706
7707 void BTHCI_DisconnectPeer(PADAPTER padapter, u8 EntryNum)
7708 {
7709         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
7710         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
7711
7712         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" BTHCI_DisconnectPeer()\n"));
7713
7714         BTHCI_SM_WITH_INFO(padapter,HCI_STATE_DISCONNECTING,STATE_CMD_MAC_CONNECT_CANCEL_INDICATE,EntryNum);
7715
7716         if (pBTInfo->BtAsocEntry[EntryNum].bUsed)
7717         {
7718 //              BTPKT_SendDeauthentication(padapter, pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, unspec_reason); // not porting yet
7719         }
7720
7721         if (pBtMgnt->bBTConnectInProgress)
7722         {
7723                 pBtMgnt->bBTConnectInProgress = _FALSE;
7724                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
7725         }
7726
7727         bthci_RemoveEntryByEntryNum(padapter,EntryNum);
7728
7729         if (pBtMgnt->bNeedNotifyAMPNoCap)
7730         {
7731                 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in BTHCI_DisconnectPeer()\n"));
7732                 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
7733         }
7734 }
7735
7736 void BTHCI_EventNumOfCompletedDataBlocks(PADAPTER padapter)
7737 {
7738 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7739         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7740         PBT_HCI_INFO            pBtHciInfo = &pBTInfo->BtHciInfo;
7741         u8 localBuf[TmpLocalBufSize] = "";
7742         u8 *pRetPar, *pTriple;
7743         u8 len=0, i, j, handleNum=0;
7744         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
7745         u16 *pu2Temp, *pPackets, *pHandle, *pDblocks;
7746         u8 sent = 0;
7747
7748 #if 0
7749         PlatformZeroMemory(padapter->IrpHCILocalbuf.Ptr, padapter->IrpHCILocalbuf.Length);
7750         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
7751 #else
7752         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7753 #endif
7754
7755         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS))
7756         {
7757                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Num Of Completed DataBlocks, Ignore to send NumOfCompletedDataBlocksEvent due to event mask page 2\n"));
7758                 return;
7759         }
7760
7761         // Return parameters starts from here
7762         pRetPar = &PPacketIrpEvent->Data[0];
7763         pTriple = &pRetPar[3];
7764         for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
7765         {
7766
7767                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
7768                 {
7769                         if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
7770                         {
7771                                 handleNum++;
7772                                 pHandle = (u16*)&pTriple[0];    // Handle[i]
7773                                 pPackets = (u16*)&pTriple[2];   // Num_Of_Completed_Packets[i]
7774                                 pDblocks = (u16*)&pTriple[4];   // Num_Of_Completed_Blocks[i]
7775 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
7776                                 PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
7777 #endif
7778                                 *pHandle = pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle;
7779                                 *pPackets = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
7780                                 *pDblocks = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
7781                                 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount)
7782                                 {
7783                                         sent = 1;
7784                                         RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("[BT event], Num Of Completed DataBlocks, Handle = 0x%x, Num_Of_Completed_Packets = 0x%x, Num_Of_Completed_Blocks = 0x%x\n",
7785                                         *pHandle, *pPackets, *pDblocks));
7786                                 }
7787                                 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
7788 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
7789                                 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
7790 #endif
7791                                 len += 6;
7792                                 pTriple += len;
7793                         }
7794                 }
7795         }
7796
7797         pRetPar[2] = handleNum;                         // Number_of_Handles
7798         len += 1;
7799         pu2Temp = (u16*)&pRetPar[0];
7800         *pu2Temp = BTTotalDataBlockNum;
7801         len += 2;
7802
7803         PPacketIrpEvent->EventCode = HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS;
7804         PPacketIrpEvent->Length = len;
7805         if (handleNum && sent)
7806         {
7807                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
7808         }
7809 }
7810
7811 void BTHCI_EventNumOfCompletedPackets(PADAPTER padapter)
7812 {
7813 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7814         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7815         u8 localBuf[TmpLocalBufSize] = "";
7816         u8 *pRetPar, *pDouble;
7817         u8 len=0, i, j, handleNum=0;
7818         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
7819         u16 *pPackets, *pHandle;
7820         u8 sent = 0;
7821
7822         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7823         // Return parameters starts from here
7824         pRetPar = &PPacketIrpEvent->Data[0];
7825         pDouble = &pRetPar[1];
7826         for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
7827         {
7828                 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
7829                 {
7830                         if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
7831                         {
7832                                 handleNum++;
7833                                 pHandle = (u16*)&pDouble[0];    // Handle[i]
7834                                 pPackets = (u16*)&pDouble[2];   // Num_Of_Completed_Packets[i]
7835                                 PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
7836                                 *pHandle = pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle;
7837                                 *pPackets = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
7838                                 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount)
7839                                         sent = 1;
7840                                 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
7841                                 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
7842                                 len += 4;
7843                                 pDouble += len;
7844                         }
7845                 }
7846         }
7847
7848         pRetPar[0] = handleNum;                         // Number_of_Handles
7849         len += 1;
7850
7851         PPacketIrpEvent->EventCode = HCI_EVENT_NUMBER_OF_COMPLETE_PACKETS;
7852         PPacketIrpEvent->Length = len;
7853         if (handleNum && sent)
7854         {
7855                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BTHCI_EventNumOfCompletedPackets \n"));
7856                 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
7857         }
7858 }
7859
7860 void
7861 BTHCI_EventAMPStatusChange(
7862         PADAPTER                                        padapter,
7863         u8                                              AMP_Status
7864         )
7865 {
7866 //      PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7867         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7868         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
7869         u8 len = 0;
7870         u8 localBuf[7] = "";
7871         u8 *pRetPar;
7872         PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
7873
7874 #if 0
7875         if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_AMP_STATUS_CHANGE))
7876         {
7877                 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("Ignore to send this event due to event mask page 2\n"));
7878                 return;
7879         }
7880 #endif
7881
7882         if (AMP_Status==AMP_STATUS_NO_CAPACITY_FOR_BT)
7883         {
7884                 pBtMgnt->BTNeedAMPStatusChg = _TRUE;
7885                 pBtMgnt->bNeedNotifyAMPNoCap = _FALSE;
7886
7887                 BTHCI_DisconnectAll(padapter);
7888         }
7889         else if (AMP_Status == AMP_STATUS_FULL_CAPACITY_FOR_BT)
7890         {
7891                 pBtMgnt->BTNeedAMPStatusChg = _FALSE;
7892         }
7893
7894         PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7895         // Return parameters starts from here
7896         pRetPar = &PPacketIrpEvent->Data[0];
7897
7898         pRetPar[0] = 0; // Status
7899         len += 1;
7900         pRetPar[1] = AMP_Status;        // AMP_Status
7901         len += 1;
7902
7903         PPacketIrpEvent->EventCode = HCI_EVENT_AMP_STATUS_CHANGE;
7904         PPacketIrpEvent->Length = len;
7905         if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
7906         {
7907                 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_STATE), ("[BT event], AMP Status Change, AMP_Status = %d\n", AMP_Status));
7908         }
7909 }
7910
7911 void BTHCI_DisconnectAll(PADAPTER padapter)
7912 {
7913         PADAPTER                pDefaultAdapter = GetDefaultAdapter(padapter);
7914 //      PMGNT_INFO              pMgntInfo = &(pDefaultAdapter->MgntInfo);
7915         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
7916
7917         u8 i;
7918
7919         RTPRINT(FIOCTL, IOCTL_STATE, (" DisconnectALL()\n"));
7920
7921         for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7922         {
7923                 if (pBTInfo->BtAsocEntry[i].b4waySuccess == _TRUE)
7924                 {
7925                         BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, i);
7926                 }
7927                 else if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
7928                 {
7929                         if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_CONNECTING)
7930                         {
7931                                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7932                         }
7933                         else if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_DISCONNECTING)
7934                         {
7935                                 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7936                         }
7937                 }
7938         }
7939 }
7940
7941 HCI_STATUS
7942 BTHCI_HandleHCICMD(
7943         PADAPTER                                        padapter,
7944         PPACKET_IRP_HCICMD_DATA pHciCmd
7945         )
7946 {
7947         HCI_STATUS      status = HCI_STATUS_SUCCESS;
7948         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
7949         PBT_DBG         pBtDbg = &pBTInfo->BtDbg;
7950
7951         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("\n"));
7952         RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI Command start, OGF=0x%x, OCF=0x%x, Length=0x%x\n",
7953                 pHciCmd->OGF, pHciCmd->OCF, pHciCmd->Length));
7954 #if 0 //for logo special test case only
7955         bthci_UseFakeData(padapter, pHciCmd);
7956 #endif
7957         if (pHciCmd->Length)
7958         {
7959                 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "HCI Command, Hex Data :\n",
7960                         &pHciCmd->Data[0], pHciCmd->Length);
7961         }
7962         if (pHciCmd->OGF == OGF_EXTENSION)
7963         {
7964                 if (pHciCmd->OCF == HCI_SET_RSSI_VALUE)
7965                 {
7966                         RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("[BT cmd], "));
7967                 }
7968                 else
7969                 {
7970                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT cmd], "));
7971                 }
7972         }
7973         else
7974         {
7975                 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("[BT cmd], "));
7976         }
7977
7978         pBtDbg->dbgHciInfo.hciCmdCnt++;
7979
7980         switch (pHciCmd->OGF)
7981         {
7982                 case OGF_LINK_CONTROL_COMMANDS:
7983                         status = bthci_HandleOGFLinkControlCMD(padapter, pHciCmd);
7984                         break;
7985                 case OGF_HOLD_MODE_COMMAND:
7986                         break;
7987                 case OGF_SET_EVENT_MASK_COMMAND:
7988                         status = bthci_HandleOGFSetEventMaskCMD(padapter, pHciCmd);
7989                         break;
7990                 case OGF_INFORMATIONAL_PARAMETERS:
7991                         status = bthci_HandleOGFInformationalParameters(padapter, pHciCmd);
7992                         break;
7993                 case OGF_STATUS_PARAMETERS:
7994                         status = bthci_HandleOGFStatusParameters(padapter, pHciCmd);
7995                         break;
7996                 case OGF_TESTING_COMMANDS:
7997                         status = bthci_HandleOGFTestingCMD(padapter, pHciCmd);
7998                         break;
7999                 case OGF_EXTENSION:
8000                         status = bthci_HandleOGFExtension(padapter,pHciCmd);
8001                         break;
8002                 default:
8003                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI Command(), Unknown OGF = 0x%x\n", pHciCmd->OGF));
8004                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
8005                         status = bthci_UnknownCMD(padapter, pHciCmd);
8006                         break;
8007         }
8008         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("HCI Command execution end!!\n"));
8009
8010         return status;
8011 }
8012
8013 void
8014 BTHCI_SetLinkStatusNotify(
8015         PADAPTER                                        padapter,
8016         PPACKET_IRP_HCICMD_DATA pHciCmd
8017         )
8018 {
8019         bthci_CmdLinkStatusNotify(padapter, pHciCmd);
8020 }
8021
8022 // ===== End of sync from SD7 driver COMMOM/bt_hci.c =====
8023 #endif
8024
8025 #ifdef __HALBTC87231ANT_C__ // HAL/BTCoexist/HalBtc87231Ant.c
8026
8027 const char *const BtStateString[] =
8028 {
8029         "BT_DISABLED",
8030         "BT_NO_CONNECTION",
8031         "BT_CONNECT_IDLE",
8032         "BT_INQ_OR_PAG",
8033         "BT_ACL_ONLY_BUSY",
8034         "BT_SCO_ONLY_BUSY",
8035         "BT_ACL_SCO_BUSY",
8036         "BT_ACL_INQ_OR_PAG",
8037         "BT_STATE_NOT_DEFINED"
8038 };
8039
8040 extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
8041
8042 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
8043
8044 void
8045 btdm_SetFw50(
8046         PADAPTER        padapter,
8047         u8              byte1,
8048         u8              byte2,
8049         u8              byte3
8050         )
8051 {
8052         u8                      H2C_Parameter[3] = {0};
8053
8054         H2C_Parameter[0] = byte1;
8055         H2C_Parameter[1] = byte2;
8056         H2C_Parameter[2] = byte3;
8057
8058         RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x50=0x%06x\n",
8059                 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
8060
8061         FillH2CCmd(padapter, 0x50, 3, H2C_Parameter);
8062 }
8063
8064 void btdm_SetFwIgnoreWlanAct(PADAPTER padapter, u8 bEnable)
8065 {
8066         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
8067         u8                      H2C_Parameter[1] = {0};
8068
8069         if (bEnable)
8070         {
8071                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Ignore Wlan_Act !!\n"));
8072                 H2C_Parameter[0] |= BIT(0);             // function enable
8073                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
8074         }
8075         else
8076         {
8077                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT don't ignore Wlan_Act !!\n"));
8078         }
8079
8080         RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%02x\n",
8081                 H2C_Parameter[0]));
8082
8083         FillH2CCmd(padapter, BT_IGNORE_WLAN_ACT_EID, 1, H2C_Parameter);
8084 }
8085
8086 void btdm_NotifyFwScan(PADAPTER padapter, u8 scanType)
8087 {
8088         u8                      H2C_Parameter[1] = {0};
8089
8090         if (scanType == _TRUE)
8091                 H2C_Parameter[0] = 0x1;
8092
8093         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Notify FW for wifi scan, write 0x3b=0x%02x\n",
8094                 H2C_Parameter[0]));
8095
8096         FillH2CCmd(padapter, 0x3b, 1, H2C_Parameter);
8097 }
8098
8099 void btdm_1AntSetPSMode(PADAPTER padapter, u8 enable, u8 smartps, u8 mode)
8100 {
8101         struct pwrctrl_priv *pwrctrl;
8102
8103
8104         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current LPS(%s, %d), smartps=%d\n", enable==_TRUE?"ON":"OFF", mode, smartps));
8105
8106         pwrctrl = &padapter->pwrctrlpriv;
8107
8108         if (enable == _TRUE) {
8109                 rtw_set_ps_mode(padapter, PS_MODE_MIN, smartps, mode);
8110         } else {
8111                 rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0);
8112                 LPS_RF_ON_check(padapter, 100);
8113         }
8114 }
8115
8116 void btdm_1AntTSFSwitch(PADAPTER padapter, u8 enable)
8117 {
8118         u8 oldVal, newVal;
8119
8120
8121         oldVal = rtw_read8(padapter, 0x550);
8122
8123         if (enable)
8124                 newVal = oldVal | EN_BCN_FUNCTION;
8125         else
8126                 newVal = oldVal & ~EN_BCN_FUNCTION;
8127
8128         if (oldVal != newVal)
8129                 rtw_write8(padapter, 0x550, newVal);
8130 }
8131
8132 u8 btdm_Is1AntPsTdmaStateChange(PADAPTER padapter)
8133 {
8134         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
8135         PBTDM_8723A_1ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8136
8137
8138         if ((pBtdm8723->bPrePsTdmaOn != pBtdm8723->bCurPsTdmaOn) ||
8139                 (pBtdm8723->prePsTdma != pBtdm8723->curPsTdma))
8140         {
8141                 return _TRUE;
8142         }
8143         else
8144         {
8145                 return _FALSE;
8146         }
8147 }
8148
8149 // Before enter TDMA, make sure Power Saving is enable!
8150 void
8151 btdm_1AntPsTdma(
8152         PADAPTER        padapter,
8153         u8              bTurnOn,
8154         u8              type
8155         )
8156 {
8157         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(padapter);
8158         PBTDM_8723A_1ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8159
8160
8161 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], TDMA(%s, %d)\n", (bTurnOn? "ON":"OFF"), type));
8162         pBtdm8723->bCurPsTdmaOn = bTurnOn;
8163         pBtdm8723->curPsTdma = type;
8164         if (bTurnOn)
8165         {
8166                 switch (type)
8167                 {
8168                         case 1: // A2DP Level-1 or FTP/OPP
8169                         default:
8170                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8171                                 {
8172                                         // wide duration for WiFi
8173                                         BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x58);
8174                                 }
8175                                 break;
8176                         case 2: // A2DP Level-2
8177                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8178                                 {
8179                                         // normal duration for WiFi
8180                                         BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x58);
8181                                 }
8182                                 break;
8183                         case 3: // BT FTP/OPP
8184                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8185                                 {
8186                                         // normal duration for WiFi
8187                                         BTDM_SetFw3a(padapter, 0xd3, 0x30, 0x03, 0x10, 0x58);
8188
8189                                 }
8190                                 break;
8191                         case 4: // for wifi scan & BT is connected
8192                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8193                                 {
8194                                         // protect 3 beacons in 3-beacon period & no Tx pause at BT slot
8195                                         BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0);
8196                                 }
8197                                 break;
8198                         case 5: // for WiFi connected-busy & BT is Non-Connected-Idle
8199                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8200                                 {
8201                                         // SCO mode, Ant fixed at WiFi, WLAN_Act toggle
8202                                         BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x00);
8203                                 }
8204                                 break;
8205                         case 9: // ACL high-retry type - 2
8206                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8207                                 {
8208                                         // narrow duration for WiFi
8209                                         BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi
8210                                 }
8211                                 break;
8212                         case 10: // for WiFi connect idle & BT ACL busy or WiFi Connected-Busy & BT is Inquiry
8213                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8214                                 {
8215                                         BTDM_SetFw3a(padapter, 0x13, 0xa, 0xa, 0x0, 0x40);
8216                                 }
8217                                 break;
8218                         case 11: // ACL high-retry type - 3
8219                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8220                                 {
8221                                         // narrow duration for WiFi
8222                                         BTDM_SetFw3a(padapter, 0xd3, 0x05, 0x05, 0x00, 0x58);
8223                                 }
8224                                 break;
8225                         case 12: // for WiFi Connected-Busy & BT is Connected-Idle
8226                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8227                                 {
8228                                         // Allow High-Pri BT
8229                                         BTDM_SetFw3a(padapter, 0xeb, 0x0a, 0x03, 0x31, 0x18);
8230                                 }
8231                                 break;
8232                         case 20: // WiFi only busy ,TDMA mode for power saving
8233                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8234                                 {
8235                                         BTDM_SetFw3a(padapter, 0x13, 0x25, 0x25, 0x00, 0x00);
8236                                 }
8237                                 break;
8238                         case 27: // WiFi DHCP/Site Survey & BT SCO busy
8239                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8240                                 {
8241                                         BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x31, 0x98);
8242                                 }
8243                                 break;
8244                         case 28: // WiFi DHCP/Site Survey & BT idle
8245                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8246                                 {
8247                                         BTDM_SetFw3a(padapter, 0x69, 0x25, 0x03, 0x31, 0x00);
8248                                 }
8249                                 break;
8250                         case 29: // WiFi DHCP/Site Survey & BT ACL busy
8251                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8252                                 {
8253                                         BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18);
8254                                         rtw_write32(padapter, 0x6c0, 0x5afa5afa);
8255                                         rtw_write32(padapter, 0x6c4, 0x5afa5afa);
8256                                 }
8257                                 break;
8258                         case 30: // WiFi idle & BT Inquiry
8259                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8260                                 {
8261                                         BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x00);
8262                                 }
8263                                 break;
8264                         case 31:  // BT HID
8265                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8266                                 {
8267                                         BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x58);
8268                                 }
8269                                 break;
8270                         case 32:  // BT SCO & Inquiry
8271                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8272                                 {
8273                                         BTDM_SetFw3a(padapter, 0xab, 0x0a, 0x03, 0x11, 0x98);
8274                                 }
8275                                 break;
8276                         case 33:  // BT SCO & WiFi site survey
8277                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8278                                 {
8279                                         BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x30, 0x98);
8280                                 }
8281                                 break;
8282                         case 34:  // BT HID & WiFi site survey
8283                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8284                                 {
8285                                         BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x18);
8286                                 }
8287                                 break;
8288                         case 35:  // BT HID & WiFi Connecting
8289                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8290                                 {
8291                                         BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x18);
8292                                 }
8293                                 break;
8294                 }
8295         }
8296         else
8297         {
8298                 // disable PS-TDMA
8299                 switch (type)
8300                 {
8301                         case 8:
8302                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8303                                 {
8304                                         // Antenna control by PTA, 0x870 = 0x310
8305                                         BTDM_SetFw3a(padapter, 0x8, 0x0, 0x0, 0x0, 0x0);
8306                                 }
8307                                 break;
8308                         case 0:
8309                         default:
8310                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8311                                 {
8312                                         // Antenna control by PTA, 0x870 = 0x310
8313                                         BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
8314                                 }
8315                                 rtw_write16(padapter, 0x860, 0x210); // Switch Antenna to BT
8316                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x210, Switch Antenna to BT\n"));
8317                                 break;
8318                         case 9:
8319                                 if (btdm_Is1AntPsTdmaStateChange(padapter))
8320                                 {
8321                                         // Antenna control by PTA, 0x870 = 0x310
8322                                         BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
8323                                 }
8324                                 rtw_write16(padapter, 0x860, 0x110); // Switch Antenna to WiFi
8325                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x110, Switch Antenna to WiFi\n"));
8326                                 break;
8327                 }
8328         }
8329
8330         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current TDMA(%s, %d)\n",
8331                 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
8332
8333         // update pre state
8334         pBtdm8723->bPrePsTdmaOn = pBtdm8723->bCurPsTdmaOn;
8335         pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
8336 }
8337
8338 void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u8 bTDMAOn, u8 tdmaType)
8339 {
8340         struct pwrctrl_priv *pwrctrl;
8341         PHAL_DATA_TYPE pHalData;
8342         PBTDM_8723A_1ANT pBtdm8723;
8343         u8 psMode;
8344         u8 bSwitchPS;
8345
8346
8347         if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
8348                 (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE))
8349         {
8350                 btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
8351                 return;
8352         }
8353
8354 #ifdef DIS_PS_RX_BCN
8355         psOption &= ~BIT(0);
8356 #endif
8357
8358         RTPRINT(FBT, BT_TRACE,
8359                         ("[BTCoex], Set LPS(%s, %d) TDMA(%s, %d)\n",
8360                          bPSEn==_TRUE?"ON":"OFF", psOption,
8361                          bTDMAOn==_TRUE?"ON":"OFF", tdmaType));
8362
8363         pwrctrl = &padapter->pwrctrlpriv;
8364         pHalData = GET_HAL_DATA(padapter);
8365         pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8366
8367         if (bPSEn == _TRUE)
8368         {
8369                 if (_TRUE == pBtdm8723->bWiFiHalt) {
8370                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Halt!!\n"));
8371                         return;
8372                 }
8373
8374                 if (_TRUE == pwrctrl->bInSuspend) {
8375                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Suspend!!\n"));
8376                         return;
8377                 }
8378
8379                 if (_TRUE == padapter->bDriverStopped) {
8380                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi driver stopped!!\n"));
8381                         return;
8382                 }
8383
8384                 if (_TRUE == padapter->bSurpriseRemoved) {
8385                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi Surprise Removed!!\n"));
8386                         return;
8387                 }
8388
8389                 psMode = PS_MODE_MIN;
8390         }
8391         else
8392         {
8393                 psMode = PS_MODE_ACTIVE;
8394                 psOption = 0;
8395         }
8396
8397         if (psMode != pwrctrl->pwr_mode)
8398                 bSwitchPS = _TRUE;
8399         else if (psMode != PS_MODE_ACTIVE)
8400         {
8401                 if (psOption != pwrctrl->bcn_ant_mode)
8402                         bSwitchPS = _TRUE;
8403                 else if (smartps != pwrctrl->smart_ps)
8404                         bSwitchPS = _TRUE;
8405                 else
8406                         bSwitchPS = _FALSE;
8407         }
8408         else
8409                 bSwitchPS = _FALSE;
8410
8411         if (_TRUE == bSwitchPS)
8412         {
8413                 // disable TDMA
8414                 if (pBtdm8723->bCurPsTdmaOn == _TRUE)
8415                 {
8416                         if (bTDMAOn == _FALSE)
8417                                 btdm_1AntPsTdma(padapter, _FALSE, tdmaType);
8418                         else
8419                         {
8420                                 if ((BT_IsBtDisabled(padapter) == _TRUE) ||
8421                                         (pHalData->bt_coexist.halCoex8723.c2hBtInfo == BT_INFO_STATE_NO_CONNECTION) ||
8422                                         (pHalData->bt_coexist.halCoex8723.c2hBtInfo == BT_INFO_STATE_CONNECT_IDLE)
8423                                 || (tdmaType == 29))
8424                                         btdm_1AntPsTdma(padapter, _FALSE, 9);
8425                                 else
8426                                         btdm_1AntPsTdma(padapter, _FALSE, 0);
8427                         }
8428                 }
8429
8430                 // change Power Save State
8431                 btdm_1AntSetPSMode(padapter, bPSEn, smartps, psOption);
8432         }
8433
8434         btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
8435 }
8436
8437 void btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 psOption, u8 bTDMAOn, u8 tdmaType)
8438 {
8439         _btdm_1AntSetPSTDMA(padapter, bPSEn, 0, psOption, bTDMAOn, tdmaType);
8440 }
8441
8442 void btdm_1AntWifiParaAdjust(PADAPTER padapter, u8 bEnable)
8443 {
8444         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
8445         PBTDM_8723A_1ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8446
8447         if (bEnable)
8448         {
8449 //              RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust enable!!\n"));
8450                 pBtdm8723->curWifiPara = 1;
8451                 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
8452                 {
8453                         BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
8454                 }
8455         }
8456         else
8457         {
8458 //              RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust disable!!\n"));
8459                 pBtdm8723->curWifiPara = 2;
8460                 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
8461                 {
8462                         BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_NORMAL);
8463                 }
8464         }
8465
8466 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], preWifiPara = %d, curWifiPara = %d!!\n",
8467 //              pBtdm8723->preWifiPara, pBtdm8723->curWifiPara));
8468 //      pBtdm8723->preWifiPara = pBtdm8723->curWifiPara;
8469 }
8470
8471 void btdm_1AntPtaParaReload(PADAPTER padapter)
8472 {
8473         // PTA parameter
8474         rtw_write8(padapter, 0x6cc, 0x0);                       // 1-Ant coex
8475         rtw_write32(padapter, 0x6c8, 0xffff);           // wifi break table
8476         rtw_write32(padapter, 0x6c4, 0x55555555);       // coex table
8477
8478         // Antenna switch control parameter
8479         rtw_write32(padapter, 0x858, 0xaaaaaaaa);
8480         if (IS_8723A_A_CUT(GET_HAL_DATA(padapter)->VersionID))
8481         {
8482                 rtw_write32(padapter, 0x870, 0x0);      // SPDT(connected with TRSW) control by hardware PTA
8483                 rtw_write8(padapter, 0x40, 0x24);
8484         }
8485         else
8486         {
8487                 rtw_write8(padapter, 0x40, 0x20);
8488                 rtw_write16(padapter, 0x860, 0x210);    // set antenna at bt side if ANTSW is software control
8489                 rtw_write32(padapter, 0x870, 0x300);    // SPDT(connected with TRSW) control by hardware PTA
8490                 rtw_write32(padapter, 0x874, 0x22804000);       // ANTSW keep by GNT_BT
8491         }
8492
8493         // coexistence parameters
8494         rtw_write8(padapter, 0x778, 0x1);       // enable RTK mode PTA
8495
8496         // BT don't ignore WLAN_Act
8497         btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
8498 }
8499
8500 /*
8501  * Return
8502  *      1: upgrade (add WiFi duration time)
8503  *      0: keep
8504  *      -1: downgrade (add BT duration time)
8505  */
8506 s8 btdm_1AntTdmaJudgement(PADAPTER padapter, u8 retry)
8507 {
8508         PHAL_DATA_TYPE          pHalData;
8509         PBTDM_8723A_1ANT        pBtdm8723;
8510         static s8 up = 0, dn = 0, m = 1, n = 3, WaitCount= 0;
8511         s8 ret;
8512
8513
8514         pHalData = GET_HAL_DATA(padapter);
8515         pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8516         ret = 0;
8517
8518         if (pBtdm8723->psTdmaMonitorCnt == 0)
8519         {
8520                 up = 0;
8521                 dn = 0;
8522                 m = 1;
8523                 n = 3;
8524                 WaitCount = 0;
8525         }
8526         else
8527         {
8528                 WaitCount++;
8529         }
8530
8531         if (retry == 0)  // no retry in the last 2-second duration
8532         {
8533                 up++;
8534                 dn--;
8535                 if (dn < 0) dn = 0;
8536
8537                 if (up >= 3*m)
8538                 {
8539                         // retry=0 in consecutive 3m*(2s), add WiFi duration
8540                         ret = 1;
8541
8542                         n = 3;
8543                         up = 0;
8544                         dn = 0;
8545                         WaitCount = 0;
8546                 }
8547         }
8548         else if (retry <= 3)  // retry<=3 in the last 2-second duration
8549         {
8550                 up--;
8551                 dn++;
8552                 if (up < 0) up = 0;
8553
8554                 if (dn == 2)
8555                 {
8556                         // retry<=3 in consecutive 2*(2s), minus WiFi duration (add BT duration)
8557                         ret = -1;
8558
8559                         // record how many time downgrad WiFi duration
8560                         if (WaitCount <= 2)
8561                                 m++;
8562                         else
8563                                 m = 1;
8564                         // the max number of m is 20
8565                         // the longest time of upgrade WiFi duration is 20*3*2s = 120s
8566                         if (m >= 20) m = 20;
8567
8568                         up = 0;
8569                         dn = 0;
8570                         WaitCount = 0;
8571                 }
8572         }
8573         else  // retry count > 3
8574         {
8575                 // retry>3, minus WiFi duration (add BT duration)
8576                 ret = -1;
8577
8578                 // record how many time downgrad WiFi duration
8579                 if (WaitCount == 1)
8580                         m++;
8581                 else
8582                         m = 1;
8583                 if (m >= 20) m = 20;
8584
8585                 up = 0;
8586                 dn = 0;
8587                 WaitCount = 0;
8588         }
8589
8590         return ret;
8591 }
8592
8593 void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter)
8594 {
8595         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(padapter);
8596         PBTDM_8723A_1ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8597
8598
8599 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
8600         if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCnt)
8601         {
8602                 pBtdm8723->psTdmaMonitorCnt = 0;
8603                 pBtdm8723->psTdmaGlobalCnt = 0;
8604         }
8605         if (pBtdm8723->psTdmaMonitorCnt == 0)
8606         {
8607 //              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, first time execute!!\n"));
8608                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 2);
8609                 pBtdm8723->psTdmaDuAdjType = 2;
8610         }
8611         else
8612         {
8613                 // Now we only have 4 level Ps Tdma,
8614                 // if that's not the following 4 level(will changed by wifi scan, dhcp...),
8615                 // then we have to adjust it back to the previous record one.
8616                 if ((pBtdm8723->curPsTdma != 1) &&
8617                         (pBtdm8723->curPsTdma != 2) &&
8618                         (pBtdm8723->curPsTdma != 9) &&
8619                         (pBtdm8723->curPsTdma != 11))
8620                 {
8621 //                      RTPRINT(FBT, BT_TRACE, ("[BTCoex], tdma adjust type can only be 1/2/9/11 !!!\n"));
8622 //                      RTPRINT(FBT, BT_TRACE, ("[BTCoex], the latest adjust type = %d\n", pBtdm8723->psTdmaDuAdjType));
8623
8624                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8625                 }
8626                 else
8627                 {
8628                         s32 judge = 0;
8629
8630                         judge = btdm_1AntTdmaJudgement(padapter, pHalData->bt_coexist.halCoex8723.btRetryCnt);
8631                         if (judge == -1)
8632                         {
8633 //                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Upgrade WiFi duration\n"));
8634                                 if (pBtdm8723->curPsTdma == 1)
8635                                 {
8636                                         // Decrease WiFi duration for high BT retry
8637                                         if(pHalData->bt_coexist.halCoex8723.btInfoExt){
8638                                                 pBtdm8723->psTdmaDuAdjType = 9;
8639 //                                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL,  limit to type9 \n"));
8640                                         }
8641                                         else
8642                                                 pBtdm8723->psTdmaDuAdjType = 2;
8643                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8644
8645                                 }
8646                                 else if (pBtdm8723->curPsTdma == 2)
8647                                 {
8648                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
8649                                         pBtdm8723->psTdmaDuAdjType = 9;
8650                                 }
8651                                 else if (pBtdm8723->curPsTdma == 9)
8652                                 {
8653                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
8654                                         pBtdm8723->psTdmaDuAdjType = 11;
8655                                 }
8656                         }
8657                         else if (judge == 1)
8658                         {
8659 //                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Downgrade WiFi duration!!\n"));
8660
8661                                 if (pBtdm8723->curPsTdma == 11)
8662                                 {
8663                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
8664                                         pBtdm8723->psTdmaDuAdjType = 9;
8665                                 }
8666                                 else if (pBtdm8723->curPsTdma == 9)
8667                                 {
8668                                         if (pHalData->bt_coexist.halCoex8723.btInfoExt){
8669                                                 pBtdm8723->psTdmaDuAdjType = 9;
8670 //                                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL,  limit to type9 \n"));
8671                                         }
8672                                         else
8673                                                 pBtdm8723->psTdmaDuAdjType = 2;
8674                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8675                                 }
8676                                 else if (pBtdm8723->curPsTdma == 2)
8677                                 {
8678                                         if (pHalData->bt_coexist.halCoex8723.btInfoExt){
8679                                                 pBtdm8723->psTdmaDuAdjType = 9;
8680 //                                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL,  limit to type9 \n"));
8681                                         }
8682                                         else
8683                                                 pBtdm8723->psTdmaDuAdjType = 1;
8684                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8685                                 }
8686                         }
8687                         else
8688                         {
8689 //                              RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, no need to change\n"));
8690                         }
8691                 }
8692
8693                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], ACL current TDMA(%s, %d)\n",
8694                         (pBtdm8723->bCurPsTdmaOn? "ON":"OFF"), pBtdm8723->curPsTdma));
8695         }
8696
8697         pBtdm8723->psTdmaMonitorCnt++;
8698 }
8699
8700 u8 btdm_1AntAdjustbyWiFiRSSI(u8 RSSI_Now, u8 RSSI_Last, u8 RSSI_Th)
8701 {
8702         u8 type;
8703
8704         if (RSSI_Now>RSSI_Last)
8705         {
8706                 if (RSSI_Now > (RSSI_Th + 5))
8707                         type = 26;
8708                 else
8709                         type = 25;
8710         }
8711         else
8712         {
8713                 if (RSSI_Now > RSSI_Th)
8714                         type = 26;
8715                 else
8716                         type = 25;
8717         }
8718
8719         return type;
8720 }
8721
8722 void btdm_1AntTdmaDurationAdjustForSCO(PADAPTER padapter)
8723 {
8724         PHAL_DATA_TYPE pHalData;
8725         PBTDM_8723A_1ANT pBtdm8723;
8726         PDM_ODM_T podm;
8727         pDIG_T pDigTable;
8728         u8 RSSITh_WiFi, RSSITh12_BT, RSSITh23_BT;
8729         u8 Type, RSSIOffset;
8730         u8 RSSI_WiFi_Now, RSSI_BT_Now;
8731
8732
8733 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
8734         pHalData = GET_HAL_DATA(padapter);
8735         pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8736         podm = &pHalData->odmpriv;
8737         pDigTable = &podm->DM_DigTable;
8738         RSSITh_WiFi = 47;
8739         RSSITh12_BT = 36;
8740         RSSITh23_BT = 30;
8741         RSSIOffset = 22;
8742         RSSI_WiFi_Now = pDigTable->Rssi_val_min;
8743         RSSI_BT_Now = pHalData->bt_coexist.halCoex8723.btRssi;
8744
8745         if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCntForSCO)
8746         {
8747                 pBtdm8723->psTdmaMonitorCntForSCO = 0;
8748                 pBtdm8723->psTdmaGlobalCnt = 0;
8749         }
8750
8751         if (pBtdm8723->psTdmaMonitorCntForSCO == 0)
8752         {
8753                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, first time execute!!\n"));
8754                 pBtdm8723->RSSI_WiFi_Last = 0;
8755                 pBtdm8723->RSSI_BT_Last = 0;
8756         }
8757         else
8758         {
8759                 if ((pBtdm8723->curPsTdma != 23) &&
8760                                 (pBtdm8723->curPsTdma != 24) &&
8761                                 (pBtdm8723->curPsTdma != 25) &&
8762                                 (pBtdm8723->curPsTdma != 26))
8763                 {
8764                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, tdma adjust type can only be 23/24/25/26 !!!\n"));
8765                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, the latest adjust type=%d\n", pBtdm8723->psTdmaDuAdjTypeForSCO));
8766
8767                         Type = pBtdm8723->psTdmaDuAdjTypeForSCO;
8768
8769                         goto _exit_1AntTdmaDurationAdjustForSCO;
8770                 }
8771                 else
8772                 {
8773                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, pre curPsTdma=%d\n", pBtdm8723->curPsTdma));
8774                 }
8775         }
8776
8777         BTDM_1AntSignalCompensation(padapter, &RSSI_WiFi_Now, &RSSI_BT_Now);
8778
8779         if (!BTDM_IsWifiBusy(padapter)) // WiFi LPS
8780         {
8781                 //Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8782                 if (Type == 26)
8783                 {
8784                 if(RSSI_BT_Now >=  RSSITh12_BT + 4)
8785                         Type = 23;
8786                 else
8787                         Type = 26;
8788                 }
8789                 else
8790                 {
8791                 if (RSSI_BT_Now >=  RSSITh12_BT)
8792                         Type = 23;
8793                 else
8794                         Type = 26;
8795                 }
8796
8797         }
8798         else // WiFi busy
8799         {
8800                 //if (RSSI_BT_Now > pBtdm8723->RSSI_BT_Last)
8801                 if (Type !=23)
8802                 {
8803                         if (RSSI_BT_Now >= RSSITh12_BT + 4)
8804                                 Type = 23;
8805                         else if (RSSI_BT_Now >= RSSITh23_BT + 4)
8806                                 Type = 24;
8807                         else
8808                                 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8809                 }
8810                 else
8811                 {
8812                         if (RSSI_BT_Now >= RSSITh12_BT)
8813                                 Type = 23;
8814                         else if  (RSSI_BT_Now >= RSSITh23_BT)
8815                                 Type = 24;
8816                         else
8817                                 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8818                 }
8819         }
8820
8821 _exit_1AntTdmaDurationAdjustForSCO:
8822
8823         pBtdm8723->RSSI_WiFi_Last = RSSI_WiFi_Now;
8824         pBtdm8723->RSSI_BT_Last = RSSI_BT_Now;
8825
8826         if (Type != pBtdm8723->curPsTdma)
8827                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, Type);
8828
8829         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO current TDMA(ON, %d), RSSI_WiFi=%d, RSSI_BT=%d\n",
8830                         Type, RSSI_WiFi_Now, RSSI_BT_Now));
8831
8832         pBtdm8723->psTdmaDuAdjTypeForSCO = Type;
8833
8834         pBtdm8723->psTdmaMonitorCntForSCO++;
8835 }
8836
8837 void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter)
8838 {
8839         struct mlme_priv *pmlmepriv;
8840         PHAL_DATA_TYPE pHalData;
8841         PBT_COEXIST_8723A pBtCoex;
8842         PBTDM_8723A_1ANT pBtdm8723;
8843         u8 BtState;
8844
8845
8846 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntCoexProcessForWifiConnect!!\n"));
8847
8848         pmlmepriv = &padapter->mlmepriv;
8849         pHalData = GET_HAL_DATA(padapter);
8850         pBtCoex = &pHalData->bt_coexist.halCoex8723;
8851         pBtdm8723 = &pBtCoex->btdm1Ant;
8852         BtState = pBtCoex->c2hBtInfo;
8853
8854         RTPRINT(FBT, BT_TRACE, ("[BTCoex], WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
8855         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is %s\n", BtStateString[BtState]));
8856
8857         padapter->pwrctrlpriv.btcoex_rfon = _FALSE;
8858
8859         if ((!BTDM_IsWifiBusy(padapter)) &&(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) != _TRUE)&&
8860                 ((BtState == BT_INFO_STATE_NO_CONNECTION) || (BtState == BT_INFO_STATE_CONNECT_IDLE)))
8861         {
8862                 switch (BtState)
8863                 {
8864                         case BT_INFO_STATE_NO_CONNECTION:
8865                                 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9);
8866                                 break;
8867                         case BT_INFO_STATE_CONNECT_IDLE:
8868                                 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 0);
8869                                 break;
8870                 }
8871         }
8872         else
8873         {
8874 #ifdef BTCOEX_DECREASE_WIFI_POWER
8875                 u8 val8;
8876
8877                 val8 = rtw_read8(padapter, 0x883);
8878                 val8 &= 0x07;
8879                 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8880                         (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8881                 {
8882                         if (BTDM_IsHT40(padapter) == _TRUE)
8883                                 val8 |= 0x80; //0x880[31:27] = 10000;
8884                         else
8885                                 val8 |= 0x60; //0x880[31:27] = 01100;
8886                 }
8887                 else
8888                 {
8889                         val8 |= 0xC0; // 0x880[31:27] = 11000;
8890                 }
8891                 rtw_write8(padapter, 0x883, val8);
8892 #endif // BTCOEX_DECREASE_WIFI_POWER
8893
8894                 switch (BtState)
8895                 {
8896                         case BT_INFO_STATE_NO_CONNECTION:
8897                         case BT_INFO_STATE_CONNECT_IDLE:
8898                                 // WiFi is Busy
8899                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 5);
8900                                 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8901                                 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
8902                                 break;
8903                         case BT_INFO_STATE_ACL_INQ_OR_PAG:
8904                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is BT_INFO_STATE_ACL_INQ_OR_PAG\n"));
8905                         case BT_INFO_STATE_INQ_OR_PAG:
8906                                 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8907                                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30);
8908                                 break;
8909                         case BT_INFO_STATE_SCO_ONLY_BUSY:
8910                         case BT_INFO_STATE_ACL_SCO_BUSY:
8911                                 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
8912                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
8913                                 else
8914                                 {
8915 #ifdef BTCOEX_CMCC_TEST
8916                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 23);
8917 #else // !BTCOEX_CMCC_TEST
8918                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
8919                                         rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8920                                         rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
8921 #endif // !BTCOEX_CMCC_TEST
8922                                 }
8923                                 break;
8924                         case BT_INFO_STATE_ACL_ONLY_BUSY:
8925                                 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8926                                 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
8927                                 {
8928                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is HID\n"));
8929                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 31);
8930                                 }
8931                                 else if (pBtCoex->c2hBtProfile == BT_INFO_FTP)
8932                                 {
8933                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is FTP/OPP\n"));
8934                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 3);
8935                                 }
8936                                 else if (pBtCoex->c2hBtProfile == (BT_INFO_A2DP|BT_INFO_FTP))
8937                                 {
8938                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_FTP\n"));
8939                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
8940                                 }
8941                                 else
8942                                 {
8943                                         if (pBtCoex->c2hBtProfile == BT_INFO_A2DP)
8944                                         {
8945                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP\n"));
8946                                         }
8947                                         else
8948                                         {
8949                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is UNKNOWN(0x%02X)! Use A2DP Profile\n", pBtCoex->c2hBtProfile));
8950                                         }
8951                                         btdm_1AntTdmaDurationAdjustForACL(padapter);
8952                                 }
8953                                 break;
8954                 }
8955         }
8956
8957         pBtdm8723->psTdmaGlobalCnt++;
8958 }
8959
8960 static void btdm_1AntUpdateHalRAMask(PADAPTER padapter, u32 mac_id, u32 filter)
8961 {
8962         u8 init_rate = 0;
8963         u8 raid;
8964         u32 mask;
8965         u8 shortGIrate = _FALSE;
8966         int     supportRateNum = 0;
8967         struct sta_info *psta;
8968         PHAL_DATA_TYPE pHalData;
8969         struct dm_priv *pdmpriv;
8970         struct mlme_ext_priv *pmlmeext;
8971         struct mlme_ext_info *pmlmeinfo;
8972         WLAN_BSSID_EX *cur_network;
8973
8974
8975         RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d, filter=0x%08x!!\n", __FUNCTION__, mac_id, filter));
8976
8977         pHalData = GET_HAL_DATA(padapter);
8978         pdmpriv = &pHalData->dmpriv;
8979         pmlmeext = &padapter->mlmeextpriv;
8980         pmlmeinfo = &pmlmeext->mlmext_info;
8981         cur_network = &pmlmeinfo->network;
8982
8983         if (mac_id >= NUM_STA) //CAM_SIZE
8984         {
8985                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d illegal!!\n", __FUNCTION__, mac_id));
8986                 return;
8987         }
8988
8989         psta = pmlmeinfo->FW_sta_info[mac_id].psta;
8990         if (psta == NULL)
8991         {
8992                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, Can't find station!!\n", __FUNCTION__));
8993                 return;
8994         }
8995
8996         raid = psta->raid;
8997
8998         switch (mac_id)
8999         {
9000                 case 0:// for infra mode
9001                         supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates);
9002                         mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
9003                         mask |= (pmlmeinfo->HT_enable) ? update_MSC_rate(&(pmlmeinfo->HT_caps)):0;
9004                         if (support_short_GI(padapter, &(pmlmeinfo->HT_caps)))
9005                         {
9006                                 shortGIrate = _TRUE;
9007                         }
9008                         break;
9009
9010                 case 1://for broadcast/multicast
9011                         supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
9012                         mask = update_basic_rate(cur_network->SupportedRates, supportRateNum);
9013                         break;
9014
9015                 default: //for each sta in IBSS
9016                         supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
9017                         mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
9018                         break;
9019         }
9020         mask |= ((raid<<28)&0xf0000000);
9021         mask &= 0xffffffff;
9022         mask &= ~filter;
9023         init_rate = get_highest_rate_idx(mask)&0x3f;
9024
9025         if (pHalData->fw_ractrl == _TRUE)
9026         {
9027                 u8 arg = 0;
9028
9029                 arg = mac_id&0x1f;//MACID
9030                 arg |= BIT(7);
9031                 if (_TRUE == shortGIrate)
9032                         arg |= BIT(5);
9033
9034                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Update FW RAID entry, MASK=0x%08x, arg=0x%02x\n", mask, arg));
9035
9036                 rtl8192c_set_raid_cmd(padapter, mask, arg);
9037         }
9038         else
9039         {
9040                 if (_TRUE == shortGIrate)
9041                         init_rate |= BIT(6);
9042
9043                 rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate);
9044         }
9045
9046         psta->init_rate = init_rate;
9047         pdmpriv->INIDATA_RATE[mac_id] = init_rate;
9048 }
9049
9050 static void btdm_1AntUpdateHalRAMaskForSCO(PADAPTER padapter, u8 forceUpdate)
9051 {
9052         PBTDM_8723A_1ANT pBtdm8723;
9053         struct sta_priv *pstapriv;
9054         WLAN_BSSID_EX *cur_network;
9055         struct sta_info *psta;
9056         u32 macid;
9057         u32 filter = 0;
9058
9059
9060         pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
9061
9062         if ((pBtdm8723->bRAChanged == _TRUE) && (forceUpdate == _FALSE))
9063                 return;
9064
9065         pstapriv = &padapter->stapriv;
9066         cur_network = &padapter->mlmeextpriv.mlmext_info.network;
9067         psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
9068         macid = psta->mac_id;
9069
9070         filter |= BIT(_1M_RATE_);
9071         filter |= BIT(_2M_RATE_);
9072         filter |= BIT(_5M_RATE_);
9073         filter |= BIT(_11M_RATE_);
9074         filter |= BIT(_6M_RATE_);
9075         filter |= BIT(_9M_RATE_);
9076
9077         btdm_1AntUpdateHalRAMask(padapter, macid, filter);
9078
9079         pBtdm8723->bRAChanged = _TRUE;
9080 }
9081
9082 static void btdm_1AntRecoverHalRAMask(PADAPTER padapter)
9083 {
9084         PBTDM_8723A_1ANT pBtdm8723;
9085         struct sta_priv *pstapriv;
9086         WLAN_BSSID_EX *cur_network;
9087         struct sta_info *psta;
9088         u32 macid;
9089
9090
9091         pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
9092
9093         if (pBtdm8723->bRAChanged == _FALSE)
9094                 return;
9095
9096         pstapriv = &padapter->stapriv;
9097         cur_network = &padapter->mlmeextpriv.mlmext_info.network;
9098         psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
9099
9100         Update_RA_Entry(padapter, psta);
9101
9102         pBtdm8723->bRAChanged = _FALSE;
9103 }
9104
9105 void btdm_1AntBTStateChangeHandler(PADAPTER padapter, BT_STATE_1ANT oldState, BT_STATE_1ANT newState)
9106 {
9107         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT state change, %s => %s\n", BtStateString[oldState], BtStateString[newState]));
9108
9109         // BT default ignore wlan active,
9110         // WiFi MUST disable this when BT is enable
9111         if (newState > BT_INFO_STATE_DISABLED)
9112         {
9113                 btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
9114         }
9115
9116         if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) &&
9117                 (BTDM_IsWifiConnectionExist(padapter) == _TRUE))
9118         {
9119                 if ((newState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9120                         (newState == BT_INFO_STATE_ACL_SCO_BUSY))
9121                 {
9122                         btdm_1AntUpdateHalRAMaskForSCO(padapter, _FALSE);
9123                 }
9124                 else
9125                 {
9126                         // Recover original RA setting
9127                         btdm_1AntRecoverHalRAMask(padapter);
9128                 }
9129         }
9130         else
9131         {
9132                 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bRAChanged = _FALSE;
9133         }
9134
9135         if (oldState == newState)
9136                 return;
9137
9138         if (oldState == BT_INFO_STATE_ACL_ONLY_BUSY)
9139         {
9140                 PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
9141                 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCnt = 0;
9142                 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCntForSCO = 0;
9143         }
9144
9145         if ((oldState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9146                 (oldState == BT_INFO_STATE_ACL_SCO_BUSY))
9147         {
9148                 PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
9149                 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCntForSCO = 0;
9150         }
9151
9152         // Active 2Ant mechanism when BT Connected
9153         if ((oldState == BT_INFO_STATE_DISABLED) ||
9154                 (oldState == BT_INFO_STATE_NO_CONNECTION))
9155         {
9156                 if ((newState != BT_INFO_STATE_DISABLED) &&
9157                         (newState != BT_INFO_STATE_NO_CONNECTION))
9158                 {
9159                         BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_SHRINK);
9160                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
9161                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
9162                 }
9163         }
9164         else
9165         {
9166                 if ((newState == BT_INFO_STATE_DISABLED) ||
9167                         (newState == BT_INFO_STATE_NO_CONNECTION))
9168                 {
9169                         BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_RESUME);
9170                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
9171                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
9172                 }
9173         }
9174 }
9175
9176 void btdm_1AntBtCoexistHandler(PADAPTER padapter)
9177 {
9178         PHAL_DATA_TYPE          pHalData;
9179         PBT_COEXIST_8723A       pBtCoex8723;
9180         PBTDM_8723A_1ANT        pBtdm8723;
9181         u8                      u1tmp;
9182
9183
9184         pHalData = GET_HAL_DATA(padapter);
9185         pBtCoex8723 = &pHalData->bt_coexist.halCoex8723;
9186         pBtdm8723 = &pBtCoex8723->btdm1Ant;
9187         padapter->pwrctrlpriv.btcoex_rfon = _FALSE;
9188         if (BT_IsBtDisabled(padapter) == _TRUE)
9189         {
9190                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is disabled\n"));
9191
9192                 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
9193                 {
9194                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
9195
9196                         if (BTDM_IsWifiBusy(padapter) == _TRUE)
9197                         {
9198                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is busy\n"));
9199                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9200                         }
9201                         else
9202                         {
9203                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is idle\n"));
9204                                 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 1, _FALSE, 9);
9205                         }
9206                 }
9207                 else
9208                 {
9209                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
9210
9211                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9212                 }
9213         }
9214         else
9215         {
9216                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is enabled\n"));
9217
9218                 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
9219                 {
9220                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
9221
9222                         btdm_1AntWifiParaAdjust(padapter, _TRUE);
9223                         btdm_1AntCoexProcessForWifiConnect(padapter);
9224                 }
9225                 else
9226                 {
9227                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
9228
9229                         // Antenna switch at BT side(0x870 = 0x300, 0x860 = 0x210) after PSTDMA off
9230                         btdm_1AntWifiParaAdjust(padapter, _FALSE);
9231                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 0);
9232                 }
9233         }
9234
9235         btdm_1AntBTStateChangeHandler(padapter, pBtCoex8723->prec2hBtInfo, pBtCoex8723->c2hBtInfo);
9236         pBtCoex8723->prec2hBtInfo = pBtCoex8723->c2hBtInfo;
9237 }
9238
9239 void BTDM_1AntSignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
9240 {
9241         PHAL_DATA_TYPE pHalData;
9242         PBTDM_8723A_1ANT pBtdm8723;
9243         u8 RSSI_WiFi_Cmpnstn, RSSI_BT_Cmpnstn;
9244
9245
9246 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
9247         pHalData = GET_HAL_DATA(padapter);
9248         pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
9249         RSSI_WiFi_Cmpnstn = 0;
9250         RSSI_BT_Cmpnstn = 0;
9251
9252         switch (pBtdm8723->curPsTdma)
9253         {
9254                 case 1: // WiFi 52ms
9255                         RSSI_WiFi_Cmpnstn = 11; // 22*0.48
9256                         break;
9257                 case 2: // WiFi 36ms
9258                         RSSI_WiFi_Cmpnstn = 14; // 22*0.64
9259                         break;
9260                 case 9: // WiFi 20ms
9261                         RSSI_WiFi_Cmpnstn = 18; // 22*0.80
9262                         break;
9263                 case 11: // WiFi 10ms
9264                         RSSI_WiFi_Cmpnstn = 20; // 22*0.90
9265                         break;
9266                 case 4: // WiFi 21ms
9267                         RSSI_WiFi_Cmpnstn = 17; // 22*0.79
9268                         break;
9269                 case 16: // WiFi 24ms
9270                         RSSI_WiFi_Cmpnstn = 18; // 22*0.76
9271                         break;
9272                 case 18: // WiFi 37ms
9273                         RSSI_WiFi_Cmpnstn = 14; // 22*0.64
9274                         break;
9275                 case 23: //Level-1, Antenna switch to BT at all time
9276                 case 24: //Level-2, Antenna switch to BT at all time
9277                 case 25: //Level-3a, Antenna switch to BT at all time
9278                 case 26: //Level-3b, Antenna switch to BT at all time
9279                 case 27: //Level-3b, Antenna switch to BT at all time
9280                 case 33: //BT SCO & WiFi site survey
9281                         RSSI_WiFi_Cmpnstn = 22;
9282                         break;
9283                 default:
9284                         break;
9285         }
9286
9287         if (rssi_wifi && RSSI_WiFi_Cmpnstn)
9288         {
9289                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntSgnlCmpnstn, case %d, WiFiCmpnstn=%d(%d => %d)\n",
9290                                 pBtdm8723->curPsTdma, RSSI_WiFi_Cmpnstn, *rssi_wifi, *rssi_wifi+RSSI_WiFi_Cmpnstn));
9291                 *rssi_wifi += RSSI_WiFi_Cmpnstn;
9292         }
9293
9294         if (rssi_bt && RSSI_BT_Cmpnstn)
9295         {
9296                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntSgnlCmpnstn, case %d, BTCmpnstn=%d(%d => %d)\n",
9297                                 pBtdm8723->curPsTdma, RSSI_BT_Cmpnstn, *rssi_bt, *rssi_bt+RSSI_BT_Cmpnstn));
9298                 *rssi_bt += RSSI_BT_Cmpnstn;
9299         }
9300 }
9301
9302 void
9303 BTDM_1AntSetWifiRssiThresh(
9304         PADAPTER        padapter,
9305         u8              rssiThresh
9306         )
9307 {
9308         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
9309         PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
9310
9311         pBtdm8723->wifiRssiThresh = rssiThresh;
9312         DBG_8723A("cosa set rssi thresh = %d\n", pBtdm8723->wifiRssiThresh);
9313 }
9314
9315 void BTDM_1AntParaInit(PADAPTER padapter)
9316 {
9317         PHAL_DATA_TYPE pHalData;
9318         PBT_COEXIST_8723A pBtCoex;
9319         PBTDM_8723A_1ANT pBtdm8723;
9320
9321
9322         pHalData = GET_HAL_DATA(padapter);
9323         pBtCoex = &pHalData->bt_coexist.halCoex8723;
9324         pBtdm8723 = &pBtCoex->btdm1Ant;
9325
9326         // Enable counter statistics
9327         rtw_write8(padapter, 0x76e, 0x4);
9328         btdm_1AntPtaParaReload(padapter);
9329
9330         pBtdm8723->wifiRssiThresh = 48;
9331
9332         pBtdm8723->bWiFiHalt = _FALSE;
9333         pBtdm8723->bRAChanged = _FALSE;
9334
9335         if ((pBtCoex->c2hBtInfo != BT_INFO_STATE_DISABLED) &&
9336                 (pBtCoex->c2hBtInfo != BT_INFO_STATE_NO_CONNECTION))
9337         {
9338                 BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_SHRINK);
9339                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
9340                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
9341         }
9342 }
9343
9344 void BTDM_1AntForHalt(PADAPTER padapter)
9345 {
9346         RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for halt\n"));
9347
9348         GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt = _TRUE;
9349
9350         btdm_1AntWifiParaAdjust(padapter, _FALSE);
9351
9352         // don't use btdm_1AntSetPSTDMA() here
9353         // it will call rtw_set_ps_mode() and request pwrpriv->lock.
9354         // This will lead to deadlock, if this function is called in IPS
9355         // Lucas@20130205
9356         btdm_1AntPsTdma(padapter, _FALSE, 0);
9357
9358         btdm_SetFwIgnoreWlanAct(padapter, _TRUE);
9359 }
9360
9361 void BTDM_1AntLpsLeave(PADAPTER padapter)
9362 {
9363         RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for LPS Leave\n"));
9364
9365         // Prevent from entering LPS again
9366         GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt == _TRUE;
9367
9368         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
9369 //      btdm_1AntPsTdma(padapter, _FALSE, 8);
9370 }
9371
9372 void BTDM_1AntWifiAssociateNotify(PADAPTER padapter, u8 type)
9373 {
9374         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9375
9376
9377         RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for associate, type=%d\n", type));
9378
9379         if (type)
9380         {
9381                 rtl8723a_CheckAntenna_Selection(padapter);
9382                 if (BT_IsBtDisabled(padapter) == _TRUE)
9383                 {
9384                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9385                 }
9386                 else
9387                 {
9388                         PBT_COEXIST_8723A pBtCoex;
9389                         u8 BtState;
9390
9391                         pBtCoex = &pHalData->bt_coexist.halCoex8723;
9392                         BtState = pBtCoex->c2hBtInfo;
9393
9394                         btdm_1AntTSFSwitch(padapter, _TRUE);
9395
9396                         if ((BtState == BT_INFO_STATE_NO_CONNECTION) ||
9397                                  (BtState == BT_INFO_STATE_CONNECT_IDLE))
9398                         {
9399                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
9400                         }
9401                         else if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9402                                         (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9403                         {
9404                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
9405                                 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
9406                                 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
9407                         }
9408                         else if ((BtState == BT_INFO_STATE_ACL_ONLY_BUSY) ||
9409                                         (BtState == BT_INFO_STATE_ACL_INQ_OR_PAG))
9410                         {
9411                                 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
9412                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 35);
9413                                 else
9414                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 29);
9415                         }
9416                 }
9417         }
9418         else
9419         {
9420                 if (BT_IsBtDisabled(padapter) == _FALSE)
9421                 {
9422                         if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
9423                         {
9424                                 btdm_1AntPsTdma(padapter, _FALSE, 0);
9425                                 btdm_1AntTSFSwitch(padapter, _FALSE);
9426                         }
9427                 }
9428
9429                 btdm_1AntBtCoexistHandler(padapter);
9430         }
9431 }
9432
9433 void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
9434 {
9435         PBT_COEXIST_8723A pBtCoex;
9436
9437
9438         pBtCoex = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723;
9439
9440         RTPRINT(FBT, BT_TRACE, ("\n\n[BTCoex]******************************\n"));
9441         RTPRINT(FBT, BT_TRACE, ("[BTCoex], MediaStatus, WiFi %s !!\n",
9442                         mstatus==RT_MEDIA_CONNECT?"CONNECT":"DISCONNECT"));
9443         RTPRINT(FBT, BT_TRACE, ("[BTCoex]******************************\n"));
9444
9445         if (RT_MEDIA_CONNECT == mstatus)
9446         {
9447                 if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
9448                 {
9449                         if ((pBtCoex->c2hBtInfo == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9450                                 (pBtCoex->c2hBtInfo == BT_INFO_STATE_ACL_SCO_BUSY))
9451                         {
9452                                 btdm_1AntUpdateHalRAMaskForSCO(padapter, _TRUE);
9453                         }
9454                 }
9455
9456                 padapter->pwrctrlpriv.DelayLPSLastTimeStamp = rtw_get_current_time();
9457                 BTDM_1AntForDhcp(padapter);
9458         }
9459         else
9460         {
9461                 //DBG_8723A("%s rtl8723a_DeinitAntenna_Selection\n",__func__);
9462                 rtl8723a_DeinitAntenna_Selection(padapter);
9463                 btdm_1AntBtCoexistHandler(padapter);
9464                 pBtCoex->btdm1Ant.bRAChanged = _FALSE;
9465         }
9466 }
9467
9468 void BTDM_1AntForDhcp(PADAPTER padapter)
9469 {
9470         PHAL_DATA_TYPE pHalData;
9471         u8 u1tmp;
9472         u8 BtState;
9473         PBT_COEXIST_8723A pBtCoex;
9474         PBTDM_8723A_1ANT pBtdm8723;
9475
9476
9477         pHalData = GET_HAL_DATA(padapter);
9478         pBtCoex = &pHalData->bt_coexist.halCoex8723;
9479         BtState = pBtCoex->c2hBtInfo;
9480         pBtdm8723 = &pBtCoex->btdm1Ant;
9481
9482         RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for DHCP\n"));
9483         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
9484         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, %s\n", BtStateString[BtState]));
9485
9486 #if 1
9487
9488         BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
9489
9490 #else
9491
9492 //      rtl8723a_set_lowpwr_lps_cmd(padapter, _FALSE);
9493
9494         if (BT_IsBtDisabled(padapter) == _TRUE)
9495         {
9496                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, BT is disabled\n"));
9497                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9498         }
9499         else
9500         {
9501                 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9502                         (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9503                 {
9504                         if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9505                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
9506                         else
9507                                 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 27);
9508                 }
9509                 else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
9510                 {
9511                         padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9512                         if(padapter->securitypriv.ndisencryptstatus != Ndis802_11EncryptionDisabled)
9513                         {
9514                                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 18);
9515                                 RTPRINT(FBT, BT_TRACE,
9516                                                 ("[BTCoex], 1Ant for DHCP, Encrypted AP, set TDMA(%s, %d)\n",
9517                                                 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
9518                         }
9519                         else
9520                         {
9521                                 switch (pBtdm8723->curPsTdma)
9522                                 {
9523                                         case 1:
9524                                         case 2:
9525                                                 RTPRINT(FBT, BT_TRACE,
9526                                                                 ("[BTCoex], 1Ant for DHCP, Keep TDMA(%s, %d)\n",
9527                                                                 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
9528                                                 break;
9529                                         default:
9530                                                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 16);
9531                                                 break;
9532                                 }
9533                         }
9534                 }
9535                 else
9536                 {
9537                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
9538                 }
9539         }
9540 #endif
9541 }
9542
9543 void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType)
9544 {
9545         PHAL_DATA_TYPE  pHalData;
9546         u8 u1tmp;
9547         u8 BtState;
9548         PBT_COEXIST_8723A pBtCoex;
9549         PBTDM_8723A_1ANT pBtdm8723;
9550
9551
9552         pHalData = GET_HAL_DATA(padapter);
9553         BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
9554         pBtCoex = &pHalData->bt_coexist.halCoex8723;
9555         pBtdm8723 = &pBtCoex->btdm1Ant;
9556
9557         RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for wifi scan=%d!!\n", scanType));
9558         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for wifi scan, WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
9559         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for wifi scan, %s\n", BtStateString[BtState]));
9560
9561         if (scanType)
9562         {
9563                 rtl8723a_CheckAntenna_Selection(padapter);
9564                 if (BT_IsBtDisabled(padapter) == _TRUE)
9565                 {
9566                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9567                 }
9568                 else if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
9569                 {
9570                         BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
9571                 }
9572                 else
9573                 {
9574                         if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9575                                 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9576                         {
9577                                 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9578                                         btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
9579                                 else
9580                                 {
9581                                         padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9582                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 33);
9583                                 }
9584                         }
9585                         else if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9586                         {
9587                                 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9588                                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30);
9589                         }
9590                         else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
9591                         {
9592                                 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9593                                 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
9594                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 34);
9595                                 else
9596                                         btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 4);
9597                         }
9598                         else
9599                         {
9600                                 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9601                                 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 5);
9602                         }
9603                 }
9604
9605                 btdm_NotifyFwScan(padapter, 1);
9606         }
9607         else // WiFi_Finish_Scan
9608         {
9609                 btdm_NotifyFwScan(padapter, 0);
9610                 btdm_1AntBtCoexistHandler(padapter);
9611         }
9612 }
9613
9614 void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter)
9615 {
9616         PHAL_DATA_TYPE  pHalData;
9617         PBT30Info               pBTInfo;
9618         PBT_MGNT                pBtMgnt;
9619         PBT_COEXIST_8723A pBtCoex;
9620         u8      u1tmp, btState;
9621
9622
9623         pHalData = GET_HAL_DATA(padapter);
9624         pBTInfo = GET_BT_INFO(padapter);
9625         pBtMgnt = &pBTInfo->BtMgnt;
9626         pBtCoex = &pHalData->bt_coexist.halCoex8723;
9627
9628         u1tmp = pBtCoex->c2hBtInfoOriginal;
9629         // sco BUSY bit is not used on voice over PCM platform
9630         btState = u1tmp & 0xF;
9631         pBtCoex->c2hBtProfile = u1tmp & 0xE0;
9632
9633         // default set bt to idle state.
9634         pBtMgnt->ExtConfig.bBTBusy = _FALSE;
9635         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
9636
9637         // check BIT2 first ==> check if bt is under inquiry or page scan
9638         if (btState & BIT(2))
9639         {
9640                 pBtCoex->bC2hBtInquiryPage = _TRUE;
9641         }
9642         else
9643         {
9644                 pBtCoex->bC2hBtInquiryPage = _FALSE;
9645         }
9646         btState &= ~BIT(2);
9647
9648         if (!(btState & BIT(0)))
9649         {
9650                 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
9651         }
9652         else
9653         {
9654                 if (btState == 0x1)
9655                 {
9656                         pBtCoex->c2hBtInfo = BT_INFO_STATE_CONNECT_IDLE;
9657                 }
9658                 else if (btState == 0x9)
9659                 {
9660                         if(pBtCoex->bC2hBtInquiryPage == _TRUE)
9661                                 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_INQ_OR_PAG;
9662                         else
9663                                 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_ONLY_BUSY;
9664                         pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9665                 }
9666                 else if (btState == 0x3)
9667                 {
9668                         pBtCoex->c2hBtInfo = BT_INFO_STATE_SCO_ONLY_BUSY;
9669                         pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9670                 }
9671                 else if (btState == 0xb)
9672                 {
9673                         pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_SCO_BUSY;
9674                         pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9675                 }
9676                 else
9677                 {
9678                         pBtCoex->c2hBtInfo = BT_INFO_STATE_MAX;
9679                 }
9680                 if (_TRUE == pBtMgnt->ExtConfig.bBTBusy)
9681                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
9682         }
9683
9684         if ((BT_INFO_STATE_NO_CONNECTION == pBtCoex->c2hBtInfo) ||
9685                 (BT_INFO_STATE_CONNECT_IDLE == pBtCoex->c2hBtInfo))
9686         {
9687                 if (pBtCoex->bC2hBtInquiryPage)
9688                         pBtCoex->c2hBtInfo = BT_INFO_STATE_INQ_OR_PAG;
9689         }
9690
9691         RTPRINT(FBT, BT_TRACE, ("[BTC2H], %s(%d)\n",
9692                         BtStateString[pBtCoex->c2hBtInfo], pBtCoex->c2hBtInfo));
9693
9694         if(pBtCoex->c2hBtProfile != BT_INFO_HID)
9695                 pBtCoex->c2hBtProfile &= ~BT_INFO_HID;
9696 }
9697
9698 void BTDM_1AntBtCoexist8723A(PADAPTER padapter)
9699 {
9700         struct mlme_priv *pmlmepriv;
9701         PHAL_DATA_TYPE  pHalData;
9702         u32 curr_time, delta_time;
9703
9704
9705         pmlmepriv = &padapter->mlmepriv;
9706         pHalData = GET_HAL_DATA(padapter);
9707
9708         if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _TRUE)
9709         {
9710                 // already done in BTDM_1AntForScan()
9711                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under scan progress!!\n"));
9712                 return;
9713         }
9714
9715         if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE)
9716         {
9717                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under link progress!!\n"));
9718                 return;
9719         }
9720
9721         // under DHCP(Special packet)
9722         curr_time = rtw_get_current_time();
9723         delta_time = curr_time - padapter->pwrctrlpriv.DelayLPSLastTimeStamp;
9724         delta_time = rtw_systime_to_ms(delta_time);
9725         if (delta_time < 500) // 500ms
9726         {
9727                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under DHCP progress(%d ms)!!\n", delta_time));
9728                 return;
9729         }
9730
9731         BTDM_CheckWiFiState(padapter);
9732
9733         btdm_1AntBtCoexistHandler(padapter);
9734 }
9735
9736 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
9737 #endif
9738
9739 #ifdef __HALBTC87232ANT_C__ // HAL/BTCoexist/HalBtc87232Ant.c
9740 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
9741
9742 //============================================================
9743 // local function proto type if needed
9744 //============================================================
9745 //============================================================
9746 // local function start with btdm_
9747 //============================================================
9748 u8 btdm_ActionAlgorithm(PADAPTER        padapter)
9749 {
9750         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
9751         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
9752         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
9753         PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9754         u8                      bScoExist=_FALSE, bBtLinkExist=_FALSE, bBtHsModeExist=_FALSE;
9755         u8                      algorithm=BT_2ANT_COEX_ALGO_UNDEFINED;
9756
9757         if(pBtMgnt->ExtConfig.NumberOfHandle)
9758         {
9759                 bBtLinkExist = _TRUE;
9760         }
9761         if(pBtMgnt->ExtConfig.NumberOfSCO)
9762                 {
9763                 bScoExist = _TRUE;
9764                 }
9765         if(BT_HsConnectionEstablished(padapter))
9766         {
9767                 bBtHsModeExist = _TRUE;
9768         }
9769
9770         //======================
9771         // here we get BT status first
9772         //======================
9773         // 1) initialize
9774         pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
9775
9776         if( (bScoExist) ||(bBtHsModeExist) ||
9777                 (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID)))
9778         {
9779                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO or HID or HS exists, set BT non-idle !!!\n"));
9780                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9781         }
9782         else
9783                 {
9784                 // A2dp profile
9785                 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
9786                         (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) )
9787                 {
9788                         if(BTDM_BtTxRxCounterL(padapter) < 100)
9789                         {
9790                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP, low priority tx+rx < 100, set BT connected-idle!!!\n"));
9791                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9792                 }
9793         else
9794         {
9795                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP, low priority tx+rx >= 100, set BT non-idle!!!\n"));
9796                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9797         }
9798 }
9799                 // Pan profile
9800                 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
9801                         (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
9802 {
9803                         if(BTDM_BtTxRxCounterL(padapter) < 600)
9804         {
9805                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, low priority tx+rx < 600, set BT connected-idle!!!\n"));
9806                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9807 }
9808                         else
9809 {
9810                                 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
9811                                 {
9812                                         if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
9813                                         {
9814                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, low priority rx/tx > 9, set BT connected-idle!!!\n"));
9815                                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9816 }
9817                                 }
9818                         }
9819                         if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
9820 {
9821                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, set BT non-idle!!!\n"));
9822                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9823 }
9824                 }
9825                 // Pan+A2dp profile
9826                 if( (pBtMgnt->ExtConfig.NumberOfHandle == 2) &&
9827                         (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) &&
9828                         (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
9829 {
9830                         if(BTDM_BtTxRxCounterL(padapter) < 600)
9831         {
9832                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, low priority tx+rx < 600, set BT connected-idle!!!\n"));
9833                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9834         }
9835         else
9836         {
9837                                 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
9838                                 {
9839                                         if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
9840                                         {
9841                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, low priority rx/tx > 9, set BT connected-idle!!!\n"));
9842                                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9843         }
9844 }
9845                         }
9846                         if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
9847 {
9848                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, set BT non-idle!!!\n"));
9849                                 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9850 }
9851                 }
9852         }
9853         if(BT_2ANT_BT_STATUS_IDLE != pBtdm8723->btStatus)
9854 {
9855                 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9856         }
9857         else
9858         {
9859                 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
9860 }
9861         //======================
9862
9863         if(!bBtLinkExist)
9864 {
9865                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], No profile exists!!!\n"));
9866                 return algorithm;
9867         }
9868
9869         if(pBtMgnt->ExtConfig.NumberOfHandle == 1)
9870         {
9871                 if(bScoExist)
9872                 {
9873                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
9874                         algorithm = BT_2ANT_COEX_ALGO_SCO;
9875         }
9876                 else
9877         {
9878                         if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID))
9879                         {
9880                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID only\n"));
9881                                 algorithm = BT_2ANT_COEX_ALGO_HID;
9882         }
9883                         else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9884         {
9885                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP only\n"));
9886                                 algorithm = BT_2ANT_COEX_ALGO_A2DP;
9887         }
9888                         else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9889         {
9890                                 if(bBtHsModeExist)
9891                 {
9892                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(HS) only\n"));
9893                                         algorithm = BT_2ANT_COEX_ALGO_PANHS;
9894                 }
9895                 else
9896                 {
9897                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR) only\n"));
9898                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR;
9899                 }
9900         }
9901                         else
9902         {
9903                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d \n",
9904                                         pBtMgnt->ExtConfig.NumberOfHandle));
9905         }
9906                 }
9907         }
9908         else if(pBtMgnt->ExtConfig.NumberOfHandle == 2)
9909         {
9910                 if(bScoExist)
9911                 {
9912                         if(BTHCI_CheckProfileExist(padapter, BT_PROFILE_HID))
9913                         {
9914                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
9915                                 algorithm = BT_2ANT_COEX_ALGO_HID;
9916         }
9917                         else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9918         {
9919                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
9920         }
9921                         else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9922                         {
9923                                 if(bBtHsModeExist)
9924                                 {
9925                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
9926                                         algorithm = BT_2ANT_COEX_ALGO_SCO;
9927 }
9928                                 else
9929 {
9930                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
9931                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9932                                 }
9933                         }
9934                         else
9935         {
9936                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched ACL profile for NumberOfHandle=%d\n",
9937                                         pBtMgnt->ExtConfig.NumberOfHandle));
9938                         }
9939         }
9940         else
9941         {
9942                         if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9943                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9944                         {
9945                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
9946                                 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9947         }
9948                         else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9949                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9950                         {
9951                                 if(bBtHsModeExist)
9952                                 {
9953                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
9954                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9955 }
9956                                 else
9957 {
9958                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
9959                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9960                                 }
9961                         }
9962                         else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9963                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9964         {
9965                                 if(bBtHsModeExist)
9966                                 {
9967                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
9968                                         algorithm = BT_2ANT_COEX_ALGO_A2DP;
9969         }
9970                                 else
9971         {
9972                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
9973                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
9974         }
9975 }
9976                         else
9977 {
9978                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
9979                                         pBtMgnt->ExtConfig.NumberOfHandle));
9980                         }
9981                 }
9982         }
9983         else if(pBtMgnt->ExtConfig.NumberOfHandle == 3)
9984         {
9985                 if(bScoExist)
9986                 {
9987                         if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9988                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9989                         {
9990                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP\n"));
9991                 }
9992                         else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9993                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9994                         {
9995                                 if(bBtHsModeExist)
9996                 {
9997                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));
9998                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9999                 }
10000                 else
10001                 {
10002                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));
10003                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
10004                 }
10005                 }
10006                         else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10007                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10008                         {
10009                                 if(bBtHsModeExist)
10010                 {
10011                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(HS)\n"));
10012                                         algorithm = BT_2ANT_COEX_ALGO_SCO;
10013                 }
10014                                 else
10015                                 {
10016                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(EDR)\n"));
10017
10018                                 }
10019                         }
10020                         else
10021                 {
10022                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
10023                                         pBtMgnt->ExtConfig.NumberOfHandle));
10024                         }
10025                 }
10026                 else
10027                 {
10028                         if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
10029                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10030                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10031                         {
10032                                 if(bBtHsModeExist)
10033                                 {
10034                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
10035                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANHS;
10036                 }
10037                                 else
10038                 {
10039                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
10040                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
10041                 }
10042         }
10043         else
10044         {
10045                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
10046                                         pBtMgnt->ExtConfig.NumberOfHandle));
10047         }
10048                 }
10049         }
10050         else if(pBtMgnt->ExtConfig.NumberOfHandle >= 3)
10051         {
10052                 if(bScoExist)
10053                 {
10054                         if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
10055                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10056                                 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10057                         {
10058                                 if(bBtHsModeExist)
10059                                 {
10060                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
10061
10062                                 }
10063                                 else
10064                                 {
10065                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(EDR)\n"));
10066
10067                                 }
10068                         }
10069                         else
10070         {
10071                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
10072                                         pBtMgnt->ExtConfig.NumberOfHandle));
10073         }
10074 }
10075                 else
10076 {
10077                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
10078                                 pBtMgnt->ExtConfig.NumberOfHandle));
10079                 }
10080         }
10081
10082         return algorithm;
10083         }
10084
10085 u8 btdm_NeedToDecBtPwr(PADAPTER padapter)
10086         {
10087         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10088         PADAPTER        pDefaultAdapter = GetDefaultAdapter(padapter);
10089         u8      bRet=_FALSE;
10090
10091         if(BT_Operation(padapter))
10092                 {
10093                 if(pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB > 47)
10094                 {
10095                         RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for HS mode!!\n"));
10096                         bRet = _TRUE;
10097                 }
10098                 else
10099                 {
10100                         RTPRINT(FBT, BT_TRACE, ("NO Need to decrease bt power for HS mode!!\n"));
10101         }
10102                 }
10103                 else
10104                 {
10105                 if(BTDM_IsWifiConnectionExist(padapter))
10106                 {
10107                         RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for Wifi is connected!!\n"));
10108                         bRet = _TRUE;
10109                 }
10110         #if 0
10111                 if(MgntLinkStatusQuery(pDefaultAdapter) == RT_MEDIA_CONNECT)
10112                 {
10113                         RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for Wifi is connected!!\n"));
10114                         bRet = TRUE;
10115                 }
10116         #endif
10117                 }
10118         return bRet;
10119 }
10120
10121
10122 u8 btdm_IsBadIsolation(PADAPTER padapter)
10123                 {
10124         return _FALSE;
10125                 }
10126
10127 void
10128 btdm_SetCoexTable(
10129         PADAPTER        padapter,
10130         u32             val0x6c0,
10131         u32             val0x6c8,
10132         u8              val0x6cc
10133         )
10134                 {
10135         RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c0=0x%x\n", val0x6c0));
10136         rtw_write32(padapter, 0x6c0, val0x6c0);
10137
10138         RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c8=0x%x\n", val0x6c8));
10139         rtw_write32(padapter, 0x6c8, val0x6c8);
10140
10141         RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6cc=0x%x\n", val0x6cc));
10142         rtw_write8(padapter, 0x6cc, val0x6cc);
10143                 }
10144
10145
10146 void btdm_SetSwFullTimeDacSwing(PADAPTER                padapter,u8     bSwDacSwingOn,u32       swDacSwingLvl)
10147 {
10148         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10149
10150         if(bSwDacSwingOn)
10151         {
10152                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing = 0x%x\n", swDacSwingLvl));
10153                 PHY_SetBBReg(padapter, 0x880, 0xff000000, swDacSwingLvl);
10154                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
10155         }
10156         else
10157         {
10158                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing Off!\n"));
10159                 PHY_SetBBReg(padapter, 0x880, 0xff000000, 0xc0);
10160         }
10161 }
10162
10163
10164 void btdm_SetFwDacSwingLevel(PADAPTER padapter, u8 dacSwingLvl)
10165 {
10166         u1Byte                  H2C_Parameter[1] ={0};
10167
10168         H2C_Parameter[0] = dacSwingLvl;
10169
10170         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl));
10171         RTPRINT(FBT, BT_TRACE, ("[BTCoex], write 0x29=0x%x\n", H2C_Parameter[0]));
10172
10173         FillH2CCmd(padapter, 0x29, 1, H2C_Parameter);
10174 }
10175
10176 void btdm_2AntDecBtPwr(PADAPTER padapter,u8     bDecBtPwr)
10177 {
10178         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10179         PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10180
10181         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Dec BT power = %s\n",  ((bDecBtPwr)? "ON":"OFF")));
10182         pBtdm8723->bCurDecBtPwr = bDecBtPwr;
10183
10184         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
10185         //      pBtdm8723->bPreDecBtPwr, pBtdm8723->bCurDecBtPwr));
10186
10187         if(pBtdm8723->bPreDecBtPwr == pBtdm8723->bCurDecBtPwr)
10188                 return;
10189
10190         BTDM_SetFwDecBtPwr(padapter, pBtdm8723->bCurDecBtPwr);
10191
10192         pBtdm8723->bPreDecBtPwr = pBtdm8723->bCurDecBtPwr;
10193 }
10194
10195  void btdm_2AntFwDacSwingLvl(PADAPTER   padapter,u8     fwDacSwingLvl)
10196 {
10197         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10198         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10199
10200         RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW Dac Swing level = %d\n",  fwDacSwingLvl));
10201         pBtdm8723->curFwDacSwingLvl = fwDacSwingLvl;
10202
10203         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
10204         //      pBtdm8723->preFwDacSwingLvl, pBtdm8723->curFwDacSwingLvl));
10205
10206         if(pBtdm8723->preFwDacSwingLvl == pBtdm8723->curFwDacSwingLvl)
10207                 return;
10208
10209         btdm_SetFwDacSwingLevel(padapter, pBtdm8723->curFwDacSwingLvl);
10210
10211         pBtdm8723->preFwDacSwingLvl = pBtdm8723->curFwDacSwingLvl;
10212 }
10213
10214 void btdm_2AntRfShrink( PADAPTER        padapter, u8    bRxRfShrinkOn)
10215 {
10216         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10217         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10218
10219         RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Rx RF Shrink = %s\n",  ((bRxRfShrinkOn)? "ON":"OFF")));
10220         pBtdm8723->bCurRfRxLpfShrink = bRxRfShrinkOn;
10221
10222         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n",
10223         //      pBtdm8723->bPreRfRxLpfShrink, pBtdm8723->bCurRfRxLpfShrink));
10224
10225         if(pBtdm8723->bPreRfRxLpfShrink == pBtdm8723->bCurRfRxLpfShrink)
10226                 return;
10227
10228         BTDM_SetSwRfRxLpfCorner(padapter, (u8)pBtdm8723->bCurRfRxLpfShrink);
10229
10230         pBtdm8723->bPreRfRxLpfShrink = pBtdm8723->bCurRfRxLpfShrink;
10231 }
10232
10233 void btdm_2AntLowPenaltyRa(PADAPTER     padapter, u8    bLowPenaltyRa)
10234 {
10235         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10236         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10237
10238         RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn LowPenaltyRA = %s\n",  ((bLowPenaltyRa)? "ON":"OFF")));
10239         pBtdm8723->bCurLowPenaltyRa = bLowPenaltyRa;
10240
10241         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
10242         //      pBtdm8723->bPreLowPenaltyRa, pBtdm8723->bCurLowPenaltyRa));
10243
10244         if(pBtdm8723->bPreLowPenaltyRa == pBtdm8723->bCurLowPenaltyRa)
10245                 return;
10246
10247         BTDM_SetSwPenaltyTxRateAdaptive(padapter, (u1Byte)pBtdm8723->bCurLowPenaltyRa);
10248
10249         pBtdm8723->bPreLowPenaltyRa = pBtdm8723->bCurLowPenaltyRa;
10250         }
10251
10252
10253
10254 void btdm_2AntDacSwing(PADAPTER padapter,u8     bDacSwingOn,u32 dacSwingLvl     )
10255                 {
10256         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10257         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10258
10259         RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn DacSwing=%s, dacSwingLvl=0x%x\n",
10260                 ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl));
10261         pBtdm8723->bCurDacSwingOn = bDacSwingOn;
10262         pBtdm8723->curDacSwingLvl = dacSwingLvl;
10263
10264         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
10265         //      pBtdm8723->bPreDacSwingOn, pBtdm8723->preDacSwingLvl,
10266         //      pBtdm8723->bCurDacSwingOn, pBtdm8723->curDacSwingLvl));
10267
10268         if( (pBtdm8723->bPreDacSwingOn == pBtdm8723->bCurDacSwingOn) &&
10269                 (pBtdm8723->preDacSwingLvl == pBtdm8723->curDacSwingLvl) )
10270                 return;
10271
10272         rtw_mdelay_os(30);
10273         btdm_SetSwFullTimeDacSwing(padapter, bDacSwingOn, dacSwingLvl);
10274
10275         pBtdm8723->bPreDacSwingOn = pBtdm8723->bCurDacSwingOn;
10276         pBtdm8723->preDacSwingLvl = pBtdm8723->curDacSwingLvl;
10277         }
10278
10279
10280 void btdm_2AntAdcBackOff(PADAPTER       padapter,u8     bAdcBackOff)
10281         {
10282         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10283         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10284
10285         RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn AdcBackOff = %s\n",  ((bAdcBackOff)? "ON":"OFF")));
10286         pBtdm8723->bCurAdcBackOff = bAdcBackOff;
10287
10288         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
10289         //      pBtdm8723->bPreAdcBackOff, pBtdm8723->bCurAdcBackOff));
10290
10291         if(pBtdm8723->bPreAdcBackOff == pBtdm8723->bCurAdcBackOff)
10292                 return;
10293
10294         BTDM_BBBackOffLevel(padapter, (u8)pBtdm8723->bCurAdcBackOff);
10295
10296         pBtdm8723->bPreAdcBackOff = pBtdm8723->bCurAdcBackOff;
10297         }
10298
10299 void btdm_2AntAgcTable(PADAPTER padapter,u8     bAgcTableEn)
10300         {
10301         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10302         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10303
10304         RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s Agc Table\n",  ((bAgcTableEn)? "Enable":"Disable")));
10305         pBtdm8723->bCurAgcTableEn = bAgcTableEn;
10306
10307         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
10308         //      pBtdm8723->bPreAgcTableEn, pBtdm8723->bCurAgcTableEn));
10309
10310         if(pBtdm8723->bPreAgcTableEn == pBtdm8723->bCurAgcTableEn)
10311                 return;
10312
10313         BTDM_AGCTable(padapter, (u8)bAgcTableEn);
10314
10315         pBtdm8723->bPreAgcTableEn = pBtdm8723->bCurAgcTableEn;
10316         }
10317
10318 void btdm_2AntCoexTable( PADAPTER       padapter,u32    val0x6c0,u32    val0x6c8,u8     val0x6cc)
10319 {
10320         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10321         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10322
10323         RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
10324                 val0x6c0, val0x6c8, val0x6cc));
10325         pBtdm8723->curVal0x6c0 = val0x6c0;
10326         pBtdm8723->curVal0x6c8 = val0x6c8;
10327         pBtdm8723->curVal0x6cc = val0x6cc;
10328
10329         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
10330         //      pBtdm8723->preVal0x6c0, pBtdm8723->preVal0x6c8, pBtdm8723->preVal0x6cc));
10331         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
10332         //      pBtdm8723->curVal0x6c0, pBtdm8723->curVal0x6c8, pBtdm8723->curVal0x6cc));
10333
10334         if( (pBtdm8723->preVal0x6c0 == pBtdm8723->curVal0x6c0) &&
10335                 (pBtdm8723->preVal0x6c8 == pBtdm8723->curVal0x6c8) &&
10336                 (pBtdm8723->preVal0x6cc == pBtdm8723->curVal0x6cc) )
10337                 return;
10338
10339         btdm_SetCoexTable(padapter, val0x6c0, val0x6c8, val0x6cc);
10340
10341         pBtdm8723->preVal0x6c0 = pBtdm8723->curVal0x6c0;
10342         pBtdm8723->preVal0x6c8 = pBtdm8723->curVal0x6c8;
10343         pBtdm8723->preVal0x6cc = pBtdm8723->curVal0x6cc;
10344 }
10345
10346 void btdm_2AntIgnoreWlanAct(PADAPTER    padapter,u8     bEnable)
10347 {
10348         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10349         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10350
10351         RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Ignore WlanAct %s\n", (bEnable? "ON":"OFF")));
10352         pBtdm8723->bCurIgnoreWlanAct = bEnable;
10353
10354         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
10355         //      pBtdm8723->bPreIgnoreWlanAct, pBtdm8723->bCurIgnoreWlanAct));
10356
10357         if(pBtdm8723->bPreIgnoreWlanAct == pBtdm8723->bCurIgnoreWlanAct)
10358                 return;
10359
10360         btdm_SetFwIgnoreWlanAct(padapter,bEnable);
10361         pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct;
10362 }
10363
10364 void btdm_2AntSetFw3a(PADAPTER  padapter,u8     byte1,u8        byte2,u8                byte3,u8                byte4,u8                byte5)
10365         {
10366         u8              H2C_Parameter[5] ={0};
10367
10368         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10369
10370         // byte1[1:0] != 0 means enable pstdma
10371         // for 2Ant bt coexist, if byte1 != 0 means enable pstdma
10372         if(byte1)
10373         {
10374                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
10375         }
10376         H2C_Parameter[0] = byte1;
10377         H2C_Parameter[1] = byte2;
10378         H2C_Parameter[2] = byte3;
10379         H2C_Parameter[3] = byte4;
10380         H2C_Parameter[4] = byte5;
10381
10382         pHalData->bt_coexist.fw3aVal[0] = byte1;
10383         pHalData->bt_coexist.fw3aVal[1] = byte2;
10384         pHalData->bt_coexist.fw3aVal[2] = byte3;
10385         pHalData->bt_coexist.fw3aVal[3] = byte4;
10386         pHalData->bt_coexist.fw3aVal[4] = byte5;
10387
10388         RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n",
10389                 H2C_Parameter[0],
10390                 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
10391
10392         FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
10393         }
10394
10395 void btdm_2AntPsTdma(PADAPTER   padapter,u8     bTurnOn,u8      type)
10396         {
10397         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10398         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10399         u32                     btTxRxCnt=0;
10400         u8                      bTurnOnByCnt=_FALSE;
10401         u8                      psTdmaTypeByCnt=0;
10402
10403         btTxRxCnt = BTDM_BtTxRxCounterH(padapter)+BTDM_BtTxRxCounterL(padapter);
10404         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT TxRx Counters = %d\n", btTxRxCnt));
10405         if(btTxRxCnt > 3000)
10406         {
10407                 bTurnOnByCnt = _TRUE;
10408                 psTdmaTypeByCnt = 8;
10409
10410                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], For BTTxRxCounters, turn %s PS TDMA, type=%d\n", (bTurnOnByCnt? "ON":"OFF"), psTdmaTypeByCnt));
10411                 pBtdm8723->bCurPsTdmaOn = bTurnOnByCnt;
10412                 pBtdm8723->curPsTdma = psTdmaTypeByCnt;
10413         }
10414         else
10415         {
10416                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn %s PS TDMA, type=%d\n", (bTurnOn? "ON":"OFF"), type));
10417                 pBtdm8723->bCurPsTdmaOn = bTurnOn;
10418                 pBtdm8723->curPsTdma = type;
10419         }
10420
10421         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
10422         //      pBtdm8723->bPrePsTdmaOn, pBtdm8723->bCurPsTdmaOn));
10423         //RTPRINT(FBT, BT_TRACE, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
10424         //      pBtdm8723->prePsTdma, pBtdm8723->curPsTdma));
10425
10426         if( (pBtdm8723->bPrePsTdmaOn == pBtdm8723->bCurPsTdmaOn) &&
10427                 (pBtdm8723->prePsTdma == pBtdm8723->curPsTdma) )
10428                 return;
10429
10430         if(bTurnOn)
10431         {
10432                 switch(type)
10433                 {
10434                         case 1:
10435                         default:
10436                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
10437                                 break;
10438                         case 2:
10439                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
10440                                 break;
10441                         case 3:
10442                                 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
10443                                 break;
10444                         case 4:
10445                                 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xa1, 0x80);
10446                                 break;
10447                         case 5:
10448                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
10449                                 break;
10450                         case 6:
10451                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
10452                                 break;
10453                         case 7:
10454                                 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
10455                                 break;
10456                         case 8:
10457                                 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x20, 0x80);
10458                                 break;
10459                         case 9:
10460                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
10461                                 break;
10462                         case 10:
10463                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
10464                                 break;
10465                         case 11:
10466                                 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
10467                                 break;
10468                         case 12:
10469                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
10470                                 break;
10471                         case 13:
10472                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
10473                                 break;
10474                         case 14:
10475                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
10476                                 break;
10477                         case 15:
10478                                 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
10479                                 break;
10480                         case 16:
10481                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x20, 0x98);
10482                                 break;
10483                         case 17:
10484                                 btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x20, 0x80);
10485                                 break;
10486                         case 18:
10487                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
10488                                 break;
10489                         case 19:
10490                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xa1, 0x98);
10491                                 break;
10492                         case 20:
10493                                 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x20, 0x98);
10494                                 break;
10495                 }
10496                 }
10497                 else
10498                 {
10499                 // disable PS tdma
10500                 switch(type)
10501                 {
10502                         case 0:
10503                                 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
10504                                 break;
10505                         case 1:
10506                                 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x0, 0x0);
10507                                 break;
10508                         default:
10509                                 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
10510                                 break;
10511                 }
10512                 }
10513
10514         // update pre state
10515         pBtdm8723->bPrePsTdmaOn =  pBtdm8723->bCurPsTdmaOn;
10516         pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
10517         }
10518
10519
10520
10521 void btdm_2AntBtInquiryPage(PADAPTER    padapter)
10522 {
10523         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10524         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10525         btdm_2AntPsTdma(padapter, _TRUE, 8);
10526 }
10527
10528
10529 u8 btdm_HoldForBtInqPage( PADAPTER      padapter)
10530         {
10531         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10532         u32                     curTime=rtw_get_current_time();
10533
10534         if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage)
10535         {
10536                 // bt inquiry or page is started.
10537                 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime == 0)
10538                 {
10539                         pHalData->bt_coexist.halCoex8723.btInqPageStartTime = curTime;
10540                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page is started at time : 0x%"i64fmt"x \n",
10541                         pHalData->bt_coexist.halCoex8723.btInqPageStartTime));
10542                 }
10543         }
10544         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page started time : 0x%"i64fmt"x, curTime : 0x%x \n",
10545                 pHalData->bt_coexist.halCoex8723.btInqPageStartTime, curTime));
10546
10547         if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
10548         {
10549                 if(( (curTime - pHalData->bt_coexist.halCoex8723.btInqPageStartTime)/1000000) >= 10)
10550                 {
10551                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page >= 10sec!!!"));
10552                         pHalData->bt_coexist.halCoex8723.btInqPageStartTime = 0;
10553                 }
10554                 }
10555
10556         if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
10557                 {
10558                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10559                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10560                 btdm_2AntPsTdma(padapter, _TRUE, 8);
10561                 return _TRUE;
10562                 }
10563                 else
10564                 return _FALSE;
10565                 }
10566
10567
10568 u8 btdm_Is2Ant8723ACommonAction(PADAPTER        padapter)
10569 {
10570         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10571         PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10572         u8                      bCommon=_FALSE;
10573
10574         RTPRINT(FBT, BT_TRACE, ("%s :BTDM_IsWifiConnectionExist =%x check_fwstate=%x pmlmepriv->fw_state=0x%x\n",__func__,BTDM_IsWifiConnectionExist(padapter),check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)),padapter->mlmepriv.fw_state));
10575
10576
10577 //      if(!BTDM_IsWifiBusy(padapter) &&
10578         if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
10579                 (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) )
10580         {
10581                 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt idle!!\n"));
10582
10583                 btdm_2AntLowPenaltyRa(padapter, _FALSE);
10584                 btdm_2AntRfShrink(padapter, _FALSE);
10585                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10586
10587                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10588                 btdm_2AntPsTdma(padapter, _FALSE, 0);
10589                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10590                 btdm_2AntDecBtPwr(padapter, _FALSE);
10591
10592                 btdm_2AntAgcTable(padapter, _FALSE);
10593                 btdm_2AntAdcBackOff(padapter, _FALSE);
10594                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10595
10596                 bCommon = _TRUE;
10597         }
10598 //      else if( BTDM_IsWifiBusy(padapter) &&
10599         else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&&
10600                         (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) )
10601         {
10602                 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT idle!!\n"));
10603
10604                 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10605                 btdm_2AntRfShrink(padapter, _FALSE);
10606                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10607
10608                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10609                 btdm_2AntPsTdma(padapter, _FALSE, 0);
10610                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10611                 btdm_2AntDecBtPwr(padapter, _TRUE);
10612
10613                 btdm_2AntAgcTable(padapter, _FALSE);
10614                 btdm_2AntAdcBackOff(padapter, _FALSE);
10615                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10616
10617                 bCommon = _TRUE;
10618 }
10619 //      else if(!BTDM_IsWifiBusy(padapter) &&
10620         else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
10621                 (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) )
10622         {
10623                 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt connected idle!!\n"));
10624
10625                 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10626                 btdm_2AntRfShrink(padapter, _TRUE);
10627                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10628
10629                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10630                 btdm_2AntPsTdma(padapter, _FALSE, 0);
10631                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10632                 btdm_2AntDecBtPwr(padapter, _FALSE);
10633
10634                 btdm_2AntAgcTable(padapter, _FALSE);
10635                 btdm_2AntAdcBackOff(padapter, _FALSE);
10636                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10637
10638                 bCommon = _TRUE;
10639         }
10640 //      else if(BTDM_IsWifiBusy(padapter) &&
10641         else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&&
10642                 (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) )
10643 {
10644                 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + Bt connected idle!!\n"));
10645
10646                 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10647                 btdm_2AntRfShrink(padapter, _TRUE);
10648                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10649
10650                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10651                 btdm_2AntPsTdma(padapter, _FALSE, 0);
10652                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10653                 btdm_2AntDecBtPwr(padapter, _TRUE);
10654
10655                 btdm_2AntAgcTable(padapter, _FALSE);
10656                 btdm_2AntAdcBackOff(padapter, _FALSE);
10657                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10658
10659                 bCommon = _TRUE;
10660         }
10661 //      else if(!BTDM_IsWifiBusy(padapter) &&
10662         else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
10663                         (BT_2ANT_BT_STATUS_NON_IDLE == pBtdm8723->btStatus) )
10664         {
10665                 RTPRINT(FBT, BT_TRACE, ("Wifi idle + BT non-idle!!\n"));
10666
10667                 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10668                 btdm_2AntRfShrink(padapter, _TRUE);
10669                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10670
10671                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10672                 btdm_2AntPsTdma(padapter, _FALSE, 0);
10673                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10674                 btdm_2AntDecBtPwr(padapter, _FALSE);
10675
10676                 btdm_2AntAgcTable(padapter, _FALSE);
10677                 btdm_2AntAdcBackOff(padapter, _FALSE);
10678                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10679
10680                 bCommon = _TRUE;
10681         }
10682         else
10683         {
10684                 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT non-idle!!\n"));
10685                 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10686                 btdm_2AntRfShrink(padapter, _TRUE);
10687                 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10688                 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10689                 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10690
10691                 bCommon = _FALSE;
10692         }
10693
10694         return bCommon;
10695 }
10696
10697
10698 void btdm_2AntTdmaDurationAdjust(PADAPTER        padapter,u8            bScoHid,u8      bTxPause,u8             maxInterval)
10699 {
10700         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
10701         PBT_MGNT                pBtMgnt = &pHalData->BtInfo.BtMgnt;
10702         PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10703         static s32              up,dn,m,n,WaitCount;
10704         s32                     result;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration
10705         u8                      retryCount=0;
10706 //      u8                      BtState;
10707
10708 //      BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
10709
10710         RTPRINT(FBT, BT_TRACE, ("[BTCoex], TdmaDurationAdjust()\n"));
10711
10712         if(pBtdm8723->bResetTdmaAdjust)
10713         {
10714                 pBtdm8723->bResetTdmaAdjust = _FALSE;
10715                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
10716                 {
10717                         if(bScoHid)
10718                         {
10719                                 if(bTxPause)
10720                                 {
10721                                         if(maxInterval == 1)
10722                                         {
10723                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10724                                                 pBtdm8723->psTdmaDuAdjType = 15;
10725 }
10726                                         else if(maxInterval == 2)
10727 {
10728                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10729                                                 pBtdm8723->psTdmaDuAdjType = 15;
10730                                         }
10731                                         else if(maxInterval == 3)
10732         {
10733                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10734                                                 pBtdm8723->psTdmaDuAdjType = 15;
10735         }
10736         else
10737         {
10738                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10739                                                 pBtdm8723->psTdmaDuAdjType = 15;
10740         }
10741 }
10742                                 else
10743 {
10744                                         if(maxInterval == 1)
10745         {
10746                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
10747                                                 pBtdm8723->psTdmaDuAdjType = 11;
10748                                         }
10749                                         else if(maxInterval == 2)
10750                 {
10751                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
10752                                                 pBtdm8723->psTdmaDuAdjType = 11;
10753                 }
10754                                         else if(maxInterval == 3)
10755                 {
10756                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
10757                                                 pBtdm8723->psTdmaDuAdjType = 11;
10758                                         }
10759                                         else
10760                         {
10761                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
10762                                                 pBtdm8723->psTdmaDuAdjType = 11;
10763                         }
10764                 }
10765         }
10766         else
10767         {
10768                                 if(bTxPause)
10769                 {
10770                                         if(maxInterval == 1)
10771                                         {
10772                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10773                                                 pBtdm8723->psTdmaDuAdjType = 7;
10774                 }
10775                                         else if(maxInterval == 2)
10776                 {
10777                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10778                                                 pBtdm8723->psTdmaDuAdjType = 7;
10779                                         }
10780                                         else if(maxInterval == 3)
10781                         {
10782                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10783                                                 pBtdm8723->psTdmaDuAdjType = 7;
10784                         }
10785                                         else
10786                                         {
10787                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10788                                                 pBtdm8723->psTdmaDuAdjType = 7;
10789                 }
10790         }
10791                                 else
10792         {
10793                                         if(maxInterval == 1)
10794                                         {
10795                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
10796                                                 pBtdm8723->psTdmaDuAdjType = 3;
10797                                         }
10798                                         else if(maxInterval == 2)
10799                                         {
10800                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
10801                                                 pBtdm8723->psTdmaDuAdjType = 3;
10802                                         }
10803                                         else if(maxInterval == 3)
10804                                         {
10805                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
10806                                                 pBtdm8723->psTdmaDuAdjType = 3;
10807         }
10808         else
10809         {
10810                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
10811                                                 pBtdm8723->psTdmaDuAdjType = 3;
10812         }
10813 }
10814                         }
10815                 }
10816                 //============
10817                 up = 0;
10818                 dn = 0;
10819                 m = 1;
10820                 n= 3;
10821                 result = 0;
10822                 WaitCount = 0;
10823         }
10824         else
10825         {
10826                 //accquire the BT TRx retry count from BT_Info byte2
10827                 retryCount = pHalData->bt_coexist.halCoex8723.btRetryCnt;
10828                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], retryCount = %d\n", retryCount));
10829                 result = 0;
10830                 WaitCount++;
10831
10832                 if(retryCount == 0)  // no retry in the last 2-second duration
10833 {
10834                         up++;
10835                         dn--;
10836
10837                         if (dn <= 0)
10838                                 dn = 0;
10839
10840                         if(up >= n)     // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration
10841 {
10842                                 WaitCount = 0;
10843                                 n = 3;
10844                                 up = 0;
10845                                 dn = 0;
10846                                 result = 1;
10847                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Increase wifi duration!!\n"));
10848 }
10849                 }
10850                 else if (retryCount <= 3)       // <=3 retry in the last 2-second duration
10851 {
10852                         up--;
10853                         dn++;
10854
10855                         if (up <= 0)
10856                                 up = 0;
10857
10858                         if (dn == 2)    // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration
10859         {
10860                                 if (WaitCount <= 2)
10861                                         m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^
10862         else
10863                                         m = 1;
10864
10865                                 if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10866                                         m = 20;
10867
10868                                 n = 3*m;
10869                                 up = 0;
10870                                 dn = 0;
10871                                 WaitCount = 0;
10872                                 result = -1;
10873                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
10874         }
10875 }
10876                 else  //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration
10877 {
10878                         if (WaitCount == 1)
10879                                 m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^
10880                         else
10881                                 m = 1;
10882
10883                         if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10884                                 m = 20;
10885
10886                         n = 3*m;
10887                         up = 0;
10888                         dn = 0;
10889                         WaitCount = 0;
10890                         result = -1;
10891                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
10892                 }
10893
10894                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval));
10895                 if(maxInterval == 1)
10896                 {
10897                         if(bTxPause)
10898         {
10899                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
10900                                 if(pBtdm8723->curPsTdma == 1)
10901                                 {
10902                                         btdm_2AntPsTdma(padapter, _TRUE, 5);
10903                                         pBtdm8723->psTdmaDuAdjType = 5;
10904         }
10905                                 else if(pBtdm8723->curPsTdma == 2)
10906         {
10907                                         btdm_2AntPsTdma(padapter, _TRUE, 6);
10908                                         pBtdm8723->psTdmaDuAdjType = 6;
10909         }
10910                                 else if(pBtdm8723->curPsTdma == 3)
10911         {
10912                                         btdm_2AntPsTdma(padapter, _TRUE, 7);
10913                                         pBtdm8723->psTdmaDuAdjType = 7;
10914         }
10915                                 else if(pBtdm8723->curPsTdma == 4)
10916         {
10917                                         btdm_2AntPsTdma(padapter, _TRUE, 8);
10918                                         pBtdm8723->psTdmaDuAdjType = 8;
10919         }
10920                                 if(pBtdm8723->curPsTdma == 9)
10921                                 {
10922                                         btdm_2AntPsTdma(padapter, _TRUE, 13);
10923                                         pBtdm8723->psTdmaDuAdjType = 13;
10924 }
10925                                 else if(pBtdm8723->curPsTdma == 10)
10926 {
10927                                         btdm_2AntPsTdma(padapter, _TRUE, 14);
10928                                         pBtdm8723->psTdmaDuAdjType = 14;
10929 }
10930                                 else if(pBtdm8723->curPsTdma == 11)
10931 {
10932                                         btdm_2AntPsTdma(padapter, _TRUE, 15);
10933                                         pBtdm8723->psTdmaDuAdjType = 15;
10934                                 }
10935                                 else if(pBtdm8723->curPsTdma == 12)
10936                                 {
10937                                         btdm_2AntPsTdma(padapter, _TRUE, 16);
10938                                         pBtdm8723->psTdmaDuAdjType = 16;
10939                                 }
10940
10941                                 if(result == -1)
10942         {
10943                                         if(pBtdm8723->curPsTdma == 5)
10944                                         {
10945                                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
10946                                                 pBtdm8723->psTdmaDuAdjType = 6;
10947         }
10948                                         else if(pBtdm8723->curPsTdma == 6)
10949         {
10950                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10951                                                 pBtdm8723->psTdmaDuAdjType = 7;
10952                                         }
10953                                         else if(pBtdm8723->curPsTdma == 7)
10954                 {
10955                                                 btdm_2AntPsTdma(padapter, _TRUE, 8);
10956                                                 pBtdm8723->psTdmaDuAdjType = 8;
10957                 }
10958                                         else if(pBtdm8723->curPsTdma == 13)
10959                 {
10960                                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
10961                                                 pBtdm8723->psTdmaDuAdjType = 14;
10962                 }
10963                                         else if(pBtdm8723->curPsTdma == 14)
10964                                         {
10965                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10966                                                 pBtdm8723->psTdmaDuAdjType = 15;
10967         }
10968                                         else if(pBtdm8723->curPsTdma == 15)
10969         {
10970                                                 btdm_2AntPsTdma(padapter, _TRUE, 16);
10971                                                 pBtdm8723->psTdmaDuAdjType = 16;
10972         }
10973                                 }
10974                                 else if (result == 1)
10975         {
10976                                         if(pBtdm8723->curPsTdma == 8)
10977                                         {
10978                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
10979                                                 pBtdm8723->psTdmaDuAdjType = 7;
10980         }
10981                                         else if(pBtdm8723->curPsTdma == 7)
10982                                         {
10983                                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
10984                                                 pBtdm8723->psTdmaDuAdjType = 6;
10985 }
10986                                         else if(pBtdm8723->curPsTdma == 6)
10987 {
10988                                                 btdm_2AntPsTdma(padapter, _TRUE, 5);
10989                                                 pBtdm8723->psTdmaDuAdjType = 5;
10990                                         }
10991                                         else if(pBtdm8723->curPsTdma == 16)
10992         {
10993                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
10994                                                 pBtdm8723->psTdmaDuAdjType = 15;
10995         }
10996                                         else if(pBtdm8723->curPsTdma == 15)
10997         {
10998                                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
10999                                                 pBtdm8723->psTdmaDuAdjType = 14;
11000                                         }
11001                                         else if(pBtdm8723->curPsTdma == 14)
11002                 {
11003                                                 btdm_2AntPsTdma(padapter, _TRUE, 13);
11004                                                 pBtdm8723->psTdmaDuAdjType = 13;
11005                                         }
11006                                 }
11007                 }
11008                 else
11009                 {
11010                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11011                                 if(pBtdm8723->curPsTdma == 5)
11012                                 {
11013                                         btdm_2AntPsTdma(padapter, _TRUE, 1);
11014                                         pBtdm8723->psTdmaDuAdjType = 1;
11015                 }
11016                                 else if(pBtdm8723->curPsTdma == 6)
11017                                 {
11018                                         btdm_2AntPsTdma(padapter, _TRUE, 2);
11019                                         pBtdm8723->psTdmaDuAdjType = 2;
11020         }
11021                                 else if(pBtdm8723->curPsTdma == 7)
11022         {
11023                                         btdm_2AntPsTdma(padapter, _TRUE, 3);
11024                                         pBtdm8723->psTdmaDuAdjType = 3;
11025         }
11026                                 else if(pBtdm8723->curPsTdma == 8)
11027         {
11028                                         btdm_2AntPsTdma(padapter, _TRUE, 4);
11029                                         pBtdm8723->psTdmaDuAdjType = 4;
11030         }
11031                                 if(pBtdm8723->curPsTdma == 13)
11032                                 {
11033                                         btdm_2AntPsTdma(padapter, _TRUE, 9);
11034                                         pBtdm8723->psTdmaDuAdjType = 9;
11035 }
11036                                 else if(pBtdm8723->curPsTdma == 14)
11037 {
11038                                         btdm_2AntPsTdma(padapter, _TRUE, 10);
11039                                         pBtdm8723->psTdmaDuAdjType = 10;
11040                                 }
11041                                 else if(pBtdm8723->curPsTdma == 15)
11042                                 {
11043                                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11044                                         pBtdm8723->psTdmaDuAdjType = 11;
11045                                 }
11046                                 else if(pBtdm8723->curPsTdma == 16)
11047                                 {
11048                                         btdm_2AntPsTdma(padapter, _TRUE, 12);
11049                                         pBtdm8723->psTdmaDuAdjType = 12;
11050                                 }
11051
11052                                 if(result == -1)
11053         {
11054                                         if(pBtdm8723->curPsTdma == 1)
11055                 {
11056                                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
11057                                                 pBtdm8723->psTdmaDuAdjType = 2;
11058                                         }
11059                                         else if(pBtdm8723->curPsTdma == 2)
11060                         {
11061                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11062                                                 pBtdm8723->psTdmaDuAdjType = 3;
11063                         }
11064                                         else if(pBtdm8723->curPsTdma == 3)
11065                         {
11066                                                 btdm_2AntPsTdma(padapter, _TRUE, 4);
11067                                                 pBtdm8723->psTdmaDuAdjType = 4;
11068                         }
11069                                         else if(pBtdm8723->curPsTdma == 9)
11070                                         {
11071                                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
11072                                                 pBtdm8723->psTdmaDuAdjType = 10;
11073                 }
11074                                         else if(pBtdm8723->curPsTdma == 10)
11075                 {
11076                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11077                                                 pBtdm8723->psTdmaDuAdjType = 11;
11078                                         }
11079                                         else if(pBtdm8723->curPsTdma == 11)
11080                         {
11081                                                 btdm_2AntPsTdma(padapter, _TRUE, 12);
11082                                                 pBtdm8723->psTdmaDuAdjType = 12;
11083                         }
11084                                 }
11085                                 else if (result == 1)
11086                                 {
11087                                         if(pBtdm8723->curPsTdma == 4)
11088                         {
11089                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11090                                                 pBtdm8723->psTdmaDuAdjType = 3;
11091                         }
11092                                         else if(pBtdm8723->curPsTdma == 3)
11093                                         {
11094                                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
11095                                                 pBtdm8723->psTdmaDuAdjType = 2;
11096                 }
11097                                         else if(pBtdm8723->curPsTdma == 2)
11098                                         {
11099                                                 btdm_2AntPsTdma(padapter, _TRUE, 1);
11100                                                 pBtdm8723->psTdmaDuAdjType = 1;
11101         }
11102                                         else if(pBtdm8723->curPsTdma == 12)
11103         {
11104                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11105                                                 pBtdm8723->psTdmaDuAdjType = 11;
11106                                         }
11107                                         else if(pBtdm8723->curPsTdma == 11)
11108                 {
11109                                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
11110                                                 pBtdm8723->psTdmaDuAdjType = 10;
11111                                         }
11112                                         else if(pBtdm8723->curPsTdma == 10)
11113                         {
11114                                                 btdm_2AntPsTdma(padapter, _TRUE, 9);
11115                                                 pBtdm8723->psTdmaDuAdjType = 9;
11116                         }
11117                                 }
11118                         }
11119                 }
11120                 else if(maxInterval == 2)
11121                         {
11122                         if(bTxPause)
11123                         {
11124                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
11125                                 if(pBtdm8723->curPsTdma == 1)
11126                                 {
11127                                         btdm_2AntPsTdma(padapter, _TRUE, 6);
11128                                         pBtdm8723->psTdmaDuAdjType = 6;
11129                         }
11130                                 else if(pBtdm8723->curPsTdma == 2)
11131                         {
11132                                         btdm_2AntPsTdma(padapter, _TRUE, 6);
11133                                         pBtdm8723->psTdmaDuAdjType = 6;
11134                         }
11135                                 else if(pBtdm8723->curPsTdma == 3)
11136                         {
11137                                         btdm_2AntPsTdma(padapter, _TRUE, 7);
11138                                         pBtdm8723->psTdmaDuAdjType = 7;
11139                         }
11140                                 else if(pBtdm8723->curPsTdma == 4)
11141                                 {
11142                                         btdm_2AntPsTdma(padapter, _TRUE, 8);
11143                                         pBtdm8723->psTdmaDuAdjType = 8;
11144                 }
11145                                 if(pBtdm8723->curPsTdma == 9)
11146                 {
11147                                         btdm_2AntPsTdma(padapter, _TRUE, 14);
11148                                         pBtdm8723->psTdmaDuAdjType = 14;
11149                                 }
11150                                 else if(pBtdm8723->curPsTdma == 10)
11151                         {
11152                                         btdm_2AntPsTdma(padapter, _TRUE, 14);
11153                                         pBtdm8723->psTdmaDuAdjType = 14;
11154                                 }
11155                                 else if(pBtdm8723->curPsTdma == 11)
11156                                 {
11157                                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11158                                         pBtdm8723->psTdmaDuAdjType = 15;
11159                                 }
11160                                 else if(pBtdm8723->curPsTdma == 12)
11161                                 {
11162                                         btdm_2AntPsTdma(padapter, _TRUE, 16);
11163                                         pBtdm8723->psTdmaDuAdjType = 16;
11164                                 }
11165                                 if(result == -1)
11166                                 {
11167                                         if(pBtdm8723->curPsTdma == 5)
11168                                         {
11169                                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
11170                                                 pBtdm8723->psTdmaDuAdjType = 6;
11171                                         }
11172                                         else if(pBtdm8723->curPsTdma == 6)
11173                                         {
11174                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11175                                                 pBtdm8723->psTdmaDuAdjType = 7;
11176                                         }
11177                                         else if(pBtdm8723->curPsTdma == 7)
11178                                         {
11179                                                 btdm_2AntPsTdma(padapter, _TRUE, 8);
11180                                                 pBtdm8723->psTdmaDuAdjType = 8;
11181                                         }
11182                                         else if(pBtdm8723->curPsTdma == 13)
11183                                         {
11184                                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
11185                                                 pBtdm8723->psTdmaDuAdjType = 14;
11186                                         }
11187                                         else if(pBtdm8723->curPsTdma == 14)
11188                                         {
11189                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11190                                                 pBtdm8723->psTdmaDuAdjType = 15;
11191                                         }
11192                                         else if(pBtdm8723->curPsTdma == 15)
11193                                         {
11194                                                 btdm_2AntPsTdma(padapter, _TRUE, 16);
11195                                                 pBtdm8723->psTdmaDuAdjType = 16;
11196                                         }
11197                                 }
11198                                 else if (result == 1)
11199                                 {
11200                                         if(pBtdm8723->curPsTdma == 8)
11201                                         {
11202                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11203                                                 pBtdm8723->psTdmaDuAdjType = 7;
11204                                         }
11205                                         else if(pBtdm8723->curPsTdma == 7)
11206                                         {
11207                                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
11208                                                 pBtdm8723->psTdmaDuAdjType = 6;
11209                                         }
11210                                         else if(pBtdm8723->curPsTdma == 6)
11211                                         {
11212                                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
11213                                                 pBtdm8723->psTdmaDuAdjType = 6;
11214                                         }
11215                                         else if(pBtdm8723->curPsTdma == 16)
11216                                         {
11217                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11218                                                 pBtdm8723->psTdmaDuAdjType = 15;
11219                                         }
11220                                         else if(pBtdm8723->curPsTdma == 15)
11221                                         {
11222                                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
11223                                                 pBtdm8723->psTdmaDuAdjType = 14;
11224                                         }
11225                                         else if(pBtdm8723->curPsTdma == 14)
11226                                         {
11227                                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
11228                                                 pBtdm8723->psTdmaDuAdjType = 14;
11229                                         }
11230                                 }
11231                         }
11232                         else
11233                         {
11234                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11235                                 if(pBtdm8723->curPsTdma == 5)
11236                                 {
11237                                         btdm_2AntPsTdma(padapter, _TRUE, 2);
11238                                         pBtdm8723->psTdmaDuAdjType = 2;
11239                         }
11240                                 else if(pBtdm8723->curPsTdma == 6)
11241                                 {
11242                                         btdm_2AntPsTdma(padapter, _TRUE, 2);
11243                                         pBtdm8723->psTdmaDuAdjType = 2;
11244                                 }
11245                                 else if(pBtdm8723->curPsTdma == 7)
11246                                 {
11247                                         btdm_2AntPsTdma(padapter, _TRUE, 3);
11248                                         pBtdm8723->psTdmaDuAdjType = 3;
11249                                 }
11250                                 else if(pBtdm8723->curPsTdma == 8)
11251                                 {
11252                                         btdm_2AntPsTdma(padapter, _TRUE, 4);
11253                                         pBtdm8723->psTdmaDuAdjType = 4;
11254                                 }
11255                                 if(pBtdm8723->curPsTdma == 13)
11256                                 {
11257                                         btdm_2AntPsTdma(padapter, _TRUE, 10);
11258                                         pBtdm8723->psTdmaDuAdjType = 10;
11259                                 }
11260                                 else if(pBtdm8723->curPsTdma == 14)
11261                                 {
11262                                         btdm_2AntPsTdma(padapter, _TRUE, 10);
11263                                         pBtdm8723->psTdmaDuAdjType = 10;
11264                                 }
11265                                 else if(pBtdm8723->curPsTdma == 15)
11266                                 {
11267                                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11268                                         pBtdm8723->psTdmaDuAdjType = 11;
11269                                 }
11270                                 else if(pBtdm8723->curPsTdma == 16)
11271                                 {
11272                                         btdm_2AntPsTdma(padapter, _TRUE, 12);
11273                                         pBtdm8723->psTdmaDuAdjType = 12;
11274                                 }
11275                                 if(result == -1)
11276                                 {
11277                                         if(pBtdm8723->curPsTdma == 1)
11278                                         {
11279                                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
11280                                                 pBtdm8723->psTdmaDuAdjType = 2;
11281                                         }
11282                                         else if(pBtdm8723->curPsTdma == 2)
11283                                         {
11284                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11285                                                 pBtdm8723->psTdmaDuAdjType = 3;
11286                                         }
11287                                         else if(pBtdm8723->curPsTdma == 3)
11288                                         {
11289                                                 btdm_2AntPsTdma(padapter, _TRUE, 4);
11290                                                 pBtdm8723->psTdmaDuAdjType = 4;
11291                                         }
11292                                         else if(pBtdm8723->curPsTdma == 9)
11293                                         {
11294                                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
11295                                                 pBtdm8723->psTdmaDuAdjType = 10;
11296                                         }
11297                                         else if(pBtdm8723->curPsTdma == 10)
11298                                         {
11299                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11300                                                 pBtdm8723->psTdmaDuAdjType = 11;
11301                                         }
11302                                         else if(pBtdm8723->curPsTdma == 11)
11303                                         {
11304                                                 btdm_2AntPsTdma(padapter, _TRUE, 12);
11305                                                 pBtdm8723->psTdmaDuAdjType = 12;
11306                                         }
11307                                 }
11308                                 else if (result == 1)
11309                                 {
11310                                         if(pBtdm8723->curPsTdma == 4)
11311                                         {
11312                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11313                                                 pBtdm8723->psTdmaDuAdjType = 3;
11314                                         }
11315                                         else if(pBtdm8723->curPsTdma == 3)
11316                                         {
11317                                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
11318                                                 pBtdm8723->psTdmaDuAdjType = 2;
11319                                         }
11320                                         else if(pBtdm8723->curPsTdma == 2)
11321                                         {
11322                                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
11323                                                 pBtdm8723->psTdmaDuAdjType = 2;
11324                                         }
11325                                         else if(pBtdm8723->curPsTdma == 12)
11326                                         {
11327                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11328                                                 pBtdm8723->psTdmaDuAdjType = 11;
11329                                         }
11330                                         else if(pBtdm8723->curPsTdma == 11)
11331                                         {
11332                                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
11333                                                 pBtdm8723->psTdmaDuAdjType = 10;
11334                                         }
11335                                         else if(pBtdm8723->curPsTdma == 10)
11336                                         {
11337                                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
11338                                                 pBtdm8723->psTdmaDuAdjType = 10;
11339                                         }
11340                                 }
11341                         }
11342                 }
11343                 else if(maxInterval == 3)
11344                 {
11345                         if(bTxPause)
11346                         {
11347                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
11348                                 if(pBtdm8723->curPsTdma == 1)
11349                                 {
11350                                         btdm_2AntPsTdma(padapter, _TRUE, 7);
11351                                         pBtdm8723->psTdmaDuAdjType = 7;
11352                                 }
11353                                 else if(pBtdm8723->curPsTdma == 2)
11354                                 {
11355                                         btdm_2AntPsTdma(padapter, _TRUE, 7);
11356                                         pBtdm8723->psTdmaDuAdjType = 7;
11357                                 }
11358                                 else if(pBtdm8723->curPsTdma == 3)
11359                                 {
11360                                         btdm_2AntPsTdma(padapter, _TRUE, 7);
11361                                         pBtdm8723->psTdmaDuAdjType = 7;
11362                                 }
11363                                 else if(pBtdm8723->curPsTdma == 4)
11364                                 {
11365                                         btdm_2AntPsTdma(padapter, _TRUE, 8);
11366                                         pBtdm8723->psTdmaDuAdjType = 8;
11367                                 }
11368                                 if(pBtdm8723->curPsTdma == 9)
11369                                 {
11370                                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11371                                         pBtdm8723->psTdmaDuAdjType = 15;
11372                                 }
11373                                 else if(pBtdm8723->curPsTdma == 10)
11374                                 {
11375                                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11376                                         pBtdm8723->psTdmaDuAdjType = 15;
11377                                 }
11378                                 else if(pBtdm8723->curPsTdma == 11)
11379                                 {
11380                                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11381                                         pBtdm8723->psTdmaDuAdjType = 15;
11382                                 }
11383                                 else if(pBtdm8723->curPsTdma == 12)
11384                                 {
11385                                         btdm_2AntPsTdma(padapter, _TRUE, 16);
11386                                         pBtdm8723->psTdmaDuAdjType = 16;
11387                                 }
11388                                 if(result == -1)
11389                                 {
11390                                         if(pBtdm8723->curPsTdma == 5)
11391                                         {
11392                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11393                                                 pBtdm8723->psTdmaDuAdjType = 7;
11394                                         }
11395                                         else if(pBtdm8723->curPsTdma == 6)
11396                                         {
11397                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11398                                                 pBtdm8723->psTdmaDuAdjType = 7;
11399                                         }
11400                                         else if(pBtdm8723->curPsTdma == 7)
11401                                         {
11402                                                 btdm_2AntPsTdma(padapter, _TRUE, 8);
11403                                                 pBtdm8723->psTdmaDuAdjType = 8;
11404                                         }
11405                                         else if(pBtdm8723->curPsTdma == 13)
11406                                         {
11407                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11408                                                 pBtdm8723->psTdmaDuAdjType = 15;
11409                                         }
11410                                         else if(pBtdm8723->curPsTdma == 14)
11411                                         {
11412                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11413                                                 pBtdm8723->psTdmaDuAdjType = 15;
11414                                         }
11415                                         else if(pBtdm8723->curPsTdma == 15)
11416                                         {
11417                                                 btdm_2AntPsTdma(padapter, _TRUE, 16);
11418                                                 pBtdm8723->psTdmaDuAdjType = 16;
11419                                         }
11420                                 }
11421                                 else if (result == 1)
11422                                 {
11423                                         if(pBtdm8723->curPsTdma == 8)
11424                         {
11425                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11426                                                 pBtdm8723->psTdmaDuAdjType = 7;
11427                                         }
11428                                         else if(pBtdm8723->curPsTdma == 7)
11429                                         {
11430                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11431                                                 pBtdm8723->psTdmaDuAdjType = 7;
11432                                         }
11433                                         else if(pBtdm8723->curPsTdma == 6)
11434                                         {
11435                                                 btdm_2AntPsTdma(padapter, _TRUE, 7);
11436                                                 pBtdm8723->psTdmaDuAdjType = 7;
11437                                         }
11438                                         else if(pBtdm8723->curPsTdma == 16)
11439                                         {
11440                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11441                                                 pBtdm8723->psTdmaDuAdjType = 15;
11442                                         }
11443                                         else if(pBtdm8723->curPsTdma == 15)
11444                                         {
11445                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11446                                                 pBtdm8723->psTdmaDuAdjType = 15;
11447                                         }
11448                                         else if(pBtdm8723->curPsTdma == 14)
11449                                         {
11450                                                 btdm_2AntPsTdma(padapter, _TRUE, 15);
11451                                                 pBtdm8723->psTdmaDuAdjType = 15;
11452                                         }
11453                                 }
11454                         }
11455                         else
11456                         {
11457                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11458                                 if(pBtdm8723->curPsTdma == 5)
11459                                 {
11460                                         btdm_2AntPsTdma(padapter, _TRUE, 3);
11461                                         pBtdm8723->psTdmaDuAdjType = 3;
11462                         }
11463                                 else if(pBtdm8723->curPsTdma == 6)
11464                                 {
11465                                         btdm_2AntPsTdma(padapter, _TRUE, 3);
11466                                         pBtdm8723->psTdmaDuAdjType = 3;
11467                 }
11468                                 else if(pBtdm8723->curPsTdma == 7)
11469                                 {
11470                                         btdm_2AntPsTdma(padapter, _TRUE, 3);
11471                                         pBtdm8723->psTdmaDuAdjType = 3;
11472         }
11473                                 else if(pBtdm8723->curPsTdma == 8)
11474                                 {
11475                                         btdm_2AntPsTdma(padapter, _TRUE, 4);
11476                                         pBtdm8723->psTdmaDuAdjType = 4;
11477                                 }
11478                                 if(pBtdm8723->curPsTdma == 13)
11479                                 {
11480                                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11481                                         pBtdm8723->psTdmaDuAdjType = 11;
11482                                 }
11483                                 else if(pBtdm8723->curPsTdma == 14)
11484                                 {
11485                                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11486                                         pBtdm8723->psTdmaDuAdjType = 11;
11487                                 }
11488                                 else if(pBtdm8723->curPsTdma == 15)
11489                                 {
11490                                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11491                                         pBtdm8723->psTdmaDuAdjType = 11;
11492                                 }
11493                                 else if(pBtdm8723->curPsTdma == 16)
11494         {
11495                                         btdm_2AntPsTdma(padapter, _TRUE, 12);
11496                                         pBtdm8723->psTdmaDuAdjType = 12;
11497                                 }
11498                                 if(result == -1)
11499                                 {
11500                                         if(pBtdm8723->curPsTdma == 1)
11501                                         {
11502                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11503                                                 pBtdm8723->psTdmaDuAdjType = 3;
11504                                         }
11505                                         else if(pBtdm8723->curPsTdma == 2)
11506                                         {
11507                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11508                                                 pBtdm8723->psTdmaDuAdjType = 3;
11509                                         }
11510                                         else if(pBtdm8723->curPsTdma == 3)
11511                                         {
11512                                                 btdm_2AntPsTdma(padapter, _TRUE, 4);
11513                                                 pBtdm8723->psTdmaDuAdjType = 4;
11514                                         }
11515                                         else if(pBtdm8723->curPsTdma == 9)
11516                                         {
11517                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11518                                                 pBtdm8723->psTdmaDuAdjType = 11;
11519                                         }
11520                                         else if(pBtdm8723->curPsTdma == 10)
11521                                         {
11522                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11523                                                 pBtdm8723->psTdmaDuAdjType = 11;
11524                                         }
11525                                         else if(pBtdm8723->curPsTdma == 11)
11526                                         {
11527                                                 btdm_2AntPsTdma(padapter, _TRUE, 12);
11528                                                 pBtdm8723->psTdmaDuAdjType = 12;
11529                                         }
11530                                 }
11531                                 else if (result == 1)
11532                                 {
11533                                         if(pBtdm8723->curPsTdma == 4)
11534                                         {
11535                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11536                                                 pBtdm8723->psTdmaDuAdjType = 3;
11537                                         }
11538                                         else if(pBtdm8723->curPsTdma == 3)
11539                                         {
11540                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11541                                                 pBtdm8723->psTdmaDuAdjType = 3;
11542                                         }
11543                                         else if(pBtdm8723->curPsTdma == 2)
11544                                         {
11545                                                 btdm_2AntPsTdma(padapter, _TRUE, 3);
11546                                                 pBtdm8723->psTdmaDuAdjType = 3;
11547                                         }
11548                                         else if(pBtdm8723->curPsTdma == 12)
11549                                         {
11550                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11551                                                 pBtdm8723->psTdmaDuAdjType = 11;
11552                                         }
11553                                         else if(pBtdm8723->curPsTdma == 11)
11554                                         {
11555                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11556                                                 pBtdm8723->psTdmaDuAdjType = 11;
11557                                         }
11558                                         else if(pBtdm8723->curPsTdma == 10)
11559                                         {
11560                                                 btdm_2AntPsTdma(padapter, _TRUE, 11);
11561                                                 pBtdm8723->psTdmaDuAdjType = 11;
11562                                         }
11563                                 }
11564                         }
11565                 }
11566         }
11567         RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type : recordPsTdma=%d\n",pBtdm8723->psTdmaDuAdjType));
11568         // if current PsTdma not match with the recorded one (when scan, dhcp...),
11569         // then we have to adjust it back to the previous record one.
11570         if(pBtdm8723->curPsTdma != pBtdm8723->psTdmaDuAdjType)
11571         {
11572                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
11573                         pBtdm8723->curPsTdma, pBtdm8723->psTdmaDuAdjType));
11574
11575                 if( check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE )
11576                 {
11577                         btdm_2AntPsTdma(padapter, _TRUE, pBtdm8723->psTdmaDuAdjType);
11578                 }
11579                 else
11580         {
11581                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
11582                 }
11583         }
11584 }
11585
11586 // default Action
11587 void btdm_2Ant8723AAction0(PADAPTER     padapter)
11588 {
11589         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11590         btdm_2AntPsTdma(padapter, _FALSE, 0);
11591         btdm_2AntDecBtPwr(padapter, _FALSE);
11592
11593         btdm_2AntAgcTable(padapter, _FALSE);
11594         btdm_2AntAdcBackOff(padapter, _FALSE);
11595         btdm_2AntLowPenaltyRa(padapter, _FALSE);
11596         btdm_2AntRfShrink(padapter, _FALSE);
11597         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11598
11599         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11600 }
11601
11602 // SCO only or SCO+PAN(HS)
11603 void btdm_2Ant8723ASCOAction(PADAPTER padapter)
11604 {
11605         u8      btRssiState, btRssiState1;
11606
11607
11608         if(btdm_NeedToDecBtPwr(padapter))
11609                 btdm_2AntDecBtPwr(padapter, _TRUE);
11610         else
11611                 btdm_2AntDecBtPwr(padapter, _FALSE);
11612
11613         if (BTDM_IsHT40(padapter))
11614         {
11615                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11616                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11617                 // fw mechanism
11618                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11619                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11620                 {
11621                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11622                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11623                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11624                 }
11625                 else
11626                 {
11627                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11628                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11629                 }
11630
11631                 // sw mechanism
11632                 btdm_2AntAgcTable(padapter, _FALSE);
11633                 btdm_2AntAdcBackOff(padapter, _TRUE);
11634                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11635         }
11636         else
11637         {
11638                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11639                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11640                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11641
11642                 // fw mechanism
11643                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11644                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11645                 {
11646                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11647                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11648                         btdm_2AntPsTdma(padapter, _TRUE, 11);
11649                 }
11650                 else
11651                 {
11652                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11653                         btdm_2AntPsTdma(padapter, _TRUE, 15);
11654                 }
11655
11656
11657                 // sw mechanism
11658                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11659                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11660                 {
11661                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11662                         btdm_2AntAgcTable(padapter, _TRUE);
11663                         btdm_2AntAdcBackOff(padapter, _TRUE);
11664                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11665                 }
11666                 else
11667                 {
11668                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11669                         btdm_2AntAgcTable(padapter, _FALSE);
11670                         btdm_2AntAdcBackOff(padapter, _FALSE);
11671                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11672                 }
11673         }
11674         }
11675
11676
11677 void btdm_2Ant8723AHIDAction(PADAPTER padapter)
11678 {
11679         u8              btRssiState, btRssiState1;
11680
11681         if(btdm_NeedToDecBtPwr(padapter))
11682                 btdm_2AntDecBtPwr(padapter, _TRUE);
11683         else
11684                 btdm_2AntDecBtPwr(padapter, _FALSE);
11685
11686         if (BTDM_IsHT40(padapter))
11687         {
11688                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11689                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11690                         // fw mechanism
11691                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11692                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11693                 {
11694                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11695                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11696                         btdm_2AntPsTdma(padapter, _TRUE, 9);
11697                 }
11698                 else
11699                 {
11700                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11701                         btdm_2AntPsTdma(padapter, _TRUE, 13);
11702                 }
11703
11704                 // sw mechanism
11705                 btdm_2AntAgcTable(padapter, _FALSE);
11706                 btdm_2AntAdcBackOff(padapter, _FALSE);
11707                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11708         }
11709         else
11710         {
11711                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11712                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11713                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11714
11715                 // fw mechanism
11716                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11717                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11718                 {
11719                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11720                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11721                         btdm_2AntPsTdma(padapter, _TRUE, 9);
11722                 }
11723                 else
11724                 {
11725                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11726                         btdm_2AntPsTdma(padapter, _TRUE, 13);
11727                 }
11728
11729                         // sw mechanism
11730                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11731                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11732                         {
11733                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11734                         btdm_2AntAgcTable(padapter, _TRUE);
11735                         btdm_2AntAdcBackOff(padapter, _TRUE);
11736                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11737                         }
11738                         else
11739                         {
11740                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11741                         btdm_2AntAgcTable(padapter, _FALSE);
11742                         btdm_2AntAdcBackOff(padapter, _FALSE);
11743                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11744                 }
11745                         }
11746                 }
11747
11748 //A2DP only / PAN(EDR) only/ A2DP+PAN(HS)
11749 void btdm_2Ant8723AA2DPAction(PADAPTER padapter)
11750 {
11751         u8              btRssiState, btRssiState1;
11752         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
11753         u8              btInfoExt=pHalData->bt_coexist.halCoex8723.btInfoExt;
11754
11755         if(btdm_NeedToDecBtPwr(padapter))
11756                 btdm_2AntDecBtPwr(padapter, _TRUE);
11757                 else
11758                 btdm_2AntDecBtPwr(padapter, _FALSE);
11759
11760         if(BTDM_IsHT40(padapter))
11761                 {
11762                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11763                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11764
11765                 // fw mechanism
11766                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11767                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11768                         {
11769                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11770                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11771
11772                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
11773                         {
11774                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11775                                 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
11776                         }
11777                         else
11778                         {
11779                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11780                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11781                 }
11782                         }
11783                         else
11784                         {
11785                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11786                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
11787                         {
11788                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11789                                 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
11790                         }
11791                         else
11792                         {
11793                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11794                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11795                 }
11796         }
11797
11798                 // sw mechanism
11799                 btdm_2AntAgcTable(padapter, _FALSE);
11800                 btdm_2AntAdcBackOff(padapter, _TRUE);
11801                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11802         }
11803         else
11804         {
11805                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11806                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11807                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11808
11809                 // fw mechanism
11810                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11811                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11812         {
11813                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11814                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11815                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
11816                         {
11817                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11818                                 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
11819         }
11820                         else
11821                         {
11822                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11823                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11824 }
11825                 }
11826                 else
11827 {
11828                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11829                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
11830                         {
11831                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11832                                 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
11833                         }
11834                         else
11835                         {
11836                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11837                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11838                 }
11839                 }
11840
11841                 // sw mechanism
11842                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11843                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11844         {
11845                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11846                         btdm_2AntAgcTable(padapter, _TRUE);
11847                         btdm_2AntAdcBackOff(padapter, _TRUE);
11848                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11849         }
11850         else
11851         {
11852                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11853                         btdm_2AntAgcTable(padapter, _FALSE);
11854                         btdm_2AntAdcBackOff(padapter, _FALSE);
11855                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11856                 }
11857         }
11858 }
11859
11860
11861 void btdm_2Ant8723APANEDRAction(PADAPTER padapter)
11862 {
11863         u8              btRssiState, btRssiState1;
11864
11865         if(btdm_NeedToDecBtPwr(padapter))
11866                 btdm_2AntDecBtPwr(padapter, _TRUE);
11867         else
11868                 btdm_2AntDecBtPwr(padapter, _FALSE);
11869
11870                 if(BTDM_IsHT40(padapter))
11871                 {
11872                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11873                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11874
11875                         // fw mechanism
11876                         if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11877                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11878                         {
11879                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11880                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11881                         btdm_2AntPsTdma(padapter, _TRUE, 2);
11882                         }
11883                         else
11884                         {
11885                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11886                         btdm_2AntPsTdma(padapter, _TRUE, 6);
11887                         }
11888
11889                 // sw mechanism
11890                 btdm_2AntAgcTable(padapter, _FALSE);
11891                 btdm_2AntAdcBackOff(padapter, _TRUE);
11892                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11893                 }
11894                 else
11895                 {
11896                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11897                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11898                         btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11899
11900                 // fw mechanism
11901                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11902                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11903                         {
11904                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11905                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11906                         btdm_2AntPsTdma(padapter, _TRUE, 2);
11907                         }
11908                         else
11909 {
11910                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11911                         btdm_2AntPsTdma(padapter, _TRUE, 6);
11912                         }
11913
11914                 // sw mechanism
11915                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11916                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11917                         {
11918                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11919                         btdm_2AntAgcTable(padapter, _TRUE);
11920                         btdm_2AntAdcBackOff(padapter, _TRUE);
11921                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11922                         }
11923                         else
11924                         {
11925                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11926                         btdm_2AntAgcTable(padapter, _FALSE);
11927                         btdm_2AntAdcBackOff(padapter, _FALSE);
11928                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11929                         }
11930                 }
11931         }
11932
11933
11934
11935 //PAN(HS) only
11936 void btdm_2Ant8723APANHSAction(PADAPTER padapter)
11937 {
11938         u8              btRssiState, btRssiState1;
11939
11940         if (BTDM_IsHT40(padapter))
11941         {
11942                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11943                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11944                 // fw mechanism
11945                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11946                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11947                 {
11948                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11949                         btdm_2AntDecBtPwr(padapter, _TRUE);
11950                 }
11951                 else
11952                 {
11953                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11954                         btdm_2AntDecBtPwr(padapter, _FALSE);
11955                 }
11956                 btdm_2AntPsTdma(padapter, _FALSE, 0);
11957
11958                 // sw mechanism
11959                 btdm_2AntAgcTable(padapter, _FALSE);
11960                 btdm_2AntAdcBackOff(padapter, _TRUE);
11961                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11962         }
11963         else
11964         {
11965                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11966                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11967
11968                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11969                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11970                 {
11971                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high\n"));
11972                         // fw mechanism
11973                         btdm_2AntDecBtPwr(padapter, _TRUE);
11974                         btdm_2AntPsTdma(padapter, _FALSE, 0);
11975
11976                         // sw mechanism
11977                         btdm_2AntAgcTable(padapter, _TRUE);
11978                         btdm_2AntAdcBackOff(padapter, _TRUE);
11979                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11980                 }
11981                 else
11982                 {
11983                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low\n"));
11984                         // fw mechanism
11985                         btdm_2AntDecBtPwr(padapter, _FALSE);
11986                         btdm_2AntPsTdma(padapter, _FALSE, 0);
11987
11988                         // sw mechanism
11989                         btdm_2AntAgcTable(padapter, _FALSE);
11990                         btdm_2AntAdcBackOff(padapter, _FALSE);
11991                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11992         }
11993         }
11994 }
11995
11996
11997 //PAN(EDR)+A2DP
11998 void btdm_2Ant8723APANEDRA2DPAction(PADAPTER    padapter)
11999 {
12000         u8              btRssiState, btRssiState1, btInfoExt;
12001         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12002
12003         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12004
12005         if(btdm_NeedToDecBtPwr(padapter))
12006                 btdm_2AntDecBtPwr(padapter, _TRUE);
12007         else
12008                 btdm_2AntDecBtPwr(padapter, _FALSE);
12009
12010                 if(BTDM_IsHT40(padapter))
12011                 {
12012                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12013                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12014
12015                         if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12016                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12017                         {
12018                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12019                                 // fw mechanism
12020                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12021
12022                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12023                         {
12024                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12025                                 btdm_2AntPsTdma(padapter, _TRUE, 4);
12026                         }
12027                         else
12028                         {
12029                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12030                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
12031                         }
12032                         }
12033                         else
12034                         {
12035                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12036                                 // fw mechanism
12037                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12038                         {
12039                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12040                                 btdm_2AntPsTdma(padapter, _TRUE, 8);
12041                         }
12042                         else
12043                         {
12044                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12045                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
12046                         }
12047                 }
12048
12049                 // sw mechanism
12050                 btdm_2AntAgcTable(padapter, _FALSE);
12051                 btdm_2AntAdcBackOff(padapter, _TRUE);
12052                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12053         }
12054         else
12055         {
12056                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12057                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12058                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12059
12060                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12061                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12062                 {
12063                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12064                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12065                         // fw mechanism
12066                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12067                         {
12068                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12069                                 btdm_2AntPsTdma(padapter, _TRUE, 4);
12070                         }
12071                         else
12072                         {
12073                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12074                                 btdm_2AntPsTdma(padapter, _TRUE, 2);
12075                         }
12076                 }
12077                 else
12078                 {
12079                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12080                         // fw mechanism
12081                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12082                         {
12083                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12084                                 btdm_2AntPsTdma(padapter, _TRUE, 8);
12085                         }
12086                         else
12087                         {
12088                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12089                                 btdm_2AntPsTdma(padapter, _TRUE, 6);
12090                         }
12091                 }
12092
12093                 // sw mechanism
12094                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12095                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12096                 {
12097                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12098                         btdm_2AntAgcTable(padapter, _TRUE);
12099                         btdm_2AntAdcBackOff(padapter, _TRUE);
12100                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12101                 }
12102                 else
12103                 {
12104                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12105                         btdm_2AntAgcTable(padapter, _FALSE);
12106                         btdm_2AntAdcBackOff(padapter, _FALSE);
12107                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12108                 }
12109         }
12110 }
12111
12112
12113 void btdm_2Ant8723APANEDRHIDAction(PADAPTER     padapter)
12114 {
12115         u8              btRssiState, btRssiState1;
12116
12117         if(btdm_NeedToDecBtPwr(padapter))
12118                 btdm_2AntDecBtPwr(padapter, _TRUE);
12119         else
12120                 btdm_2AntDecBtPwr(padapter, _FALSE);
12121
12122         if(BTDM_IsHT40(padapter))
12123         {
12124                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12125                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12126                 // fw mechanism
12127                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
12128                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
12129                         {
12130                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12131                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12132                         btdm_2AntPsTdma(padapter, _TRUE, 10);
12133                         }
12134                         else
12135                         {
12136                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12137                         btdm_2AntPsTdma(padapter, _TRUE, 14);
12138                 }
12139
12140                                 // sw mechanism
12141                 btdm_2AntAgcTable(padapter, _FALSE);
12142                 btdm_2AntAdcBackOff(padapter, _TRUE);
12143                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12144                         }
12145         else
12146         {
12147                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12148                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12149                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12150
12151                 // fw mechanism
12152                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12153                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12154                 {
12155                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12156                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12157                         btdm_2AntPsTdma(padapter, _TRUE, 10);
12158                 }
12159                 else
12160                 {
12161                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12162                         btdm_2AntPsTdma(padapter, _TRUE, 14);
12163         }
12164
12165                 // sw mechanism
12166                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12167                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12168         {
12169                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12170                         btdm_2AntAgcTable(padapter, _TRUE);
12171                         btdm_2AntAdcBackOff(padapter, _TRUE);
12172                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12173         }
12174                 else
12175         {
12176                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12177                         btdm_2AntAgcTable(padapter, _FALSE);
12178                         btdm_2AntAdcBackOff(padapter, _FALSE);
12179                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12180                 }
12181         }
12182 }
12183
12184 // HID+A2DP+PAN(EDR)
12185 void btdm_2Ant8723AHIDA2DPPANEDRAction(PADAPTER padapter)
12186 {
12187         u8              btRssiState, btRssiState1, btInfoExt;
12188         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12189
12190         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12191
12192         if(btdm_NeedToDecBtPwr(padapter))
12193                 btdm_2AntDecBtPwr(padapter, _TRUE);
12194         else
12195                 btdm_2AntDecBtPwr(padapter, _FALSE);
12196
12197                 if (BTDM_IsHT40(padapter))
12198                 {
12199                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12200                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12201                         if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12202                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12203                         {
12204                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12205                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12206
12207                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12208                         {
12209                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12210                                 btdm_2AntPsTdma(padapter, _TRUE, 12);
12211                         }
12212                         else
12213                         {
12214                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12215                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
12216                         }
12217                 }
12218                 else
12219                 {
12220                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12221                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12222                         {
12223                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12224                                 btdm_2AntPsTdma(padapter, _TRUE, 16);
12225                         }
12226                         else
12227                         {
12228                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12229                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
12230                         }
12231                 }
12232
12233                 // sw mechanism
12234                 btdm_2AntAgcTable(padapter, _FALSE);
12235                 btdm_2AntAdcBackOff(padapter, _TRUE);
12236                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12237         }
12238         else
12239         {
12240                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12241                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 37, 0);
12242                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
12243                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
12244                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
12245                         {
12246                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12247                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12248
12249                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12250                         {
12251                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12252                                 btdm_2AntPsTdma(padapter, _TRUE, 12);
12253                         }
12254                         else
12255                         {
12256                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12257                                 btdm_2AntPsTdma(padapter, _TRUE, 10);
12258                         }
12259                         }
12260                         else
12261                         {
12262                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12263                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12264                         {
12265                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12266                                 btdm_2AntPsTdma(padapter, _TRUE, 16);
12267                         }
12268                         else
12269                         {
12270                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12271                                 btdm_2AntPsTdma(padapter, _TRUE, 14);
12272                         }
12273                         }
12274
12275                         // sw mechanism
12276                         if ((btRssiState1 == BT_RSSI_STATE_HIGH) ||
12277                                 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH))
12278                         {
12279                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12280                         btdm_2AntAgcTable(padapter, _TRUE);
12281                         btdm_2AntAdcBackOff(padapter, _TRUE);
12282                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12283                         }
12284                         else
12285                         {
12286                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12287                         btdm_2AntAgcTable(padapter, _FALSE);
12288                         btdm_2AntAdcBackOff(padapter, _FALSE);
12289                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12290                         }
12291                 }
12292         }
12293
12294
12295 void btdm_2Ant8723AHIDA2DPAction(PADAPTER       padapter)
12296         {
12297         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12298         u8              btRssiState, btRssiState1, btInfoExt;
12299
12300         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12301
12302         if(btdm_NeedToDecBtPwr(padapter))
12303                 btdm_2AntDecBtPwr(padapter, _TRUE);
12304         else
12305                 btdm_2AntDecBtPwr(padapter, _FALSE);
12306
12307                 if (BTDM_IsHT40(padapter))
12308                 {
12309                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12310                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12311                         if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12312                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12313                         {
12314                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12315                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12316
12317                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12318                         {
12319                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12320                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12321                         }
12322                         else
12323                         {
12324                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12325                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
12326                         }
12327                         }
12328                         else
12329                         {
12330                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12331                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12332                         {
12333                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12334                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12335                         }
12336                         else
12337                         {
12338                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12339                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
12340                         }
12341                 }
12342
12343                 // sw mechanism
12344                 btdm_2AntAgcTable(padapter, _FALSE);
12345                 btdm_2AntAdcBackOff(padapter, _TRUE);
12346                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12347                 }
12348                 else
12349                 {
12350                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12351                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12352                 btRssiState1 = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
12353
12354                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
12355                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
12356                         {
12357                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12358                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12359
12360                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12361                         {
12362                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12363                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12364                         }
12365                         else
12366                         {
12367                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12368                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
12369                         }
12370                         }
12371                         else
12372                         {
12373                                 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12374                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12375                         {
12376                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12377                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12378                         }
12379                         else
12380                         {
12381                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12382                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
12383                 }
12384         }
12385                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12386                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12387         {
12388                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12389                         // sw mechanism
12390                         btdm_2AntAgcTable(padapter, _TRUE);
12391                         btdm_2AntAdcBackOff(padapter, _TRUE);
12392                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12393         }
12394                 else
12395         {
12396                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12397                         // sw mechanism
12398                         btdm_2AntAgcTable(padapter, _FALSE);
12399                         btdm_2AntAdcBackOff(padapter, _FALSE);
12400                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12401                 }
12402         }
12403 }
12404
12405
12406 void btdm_2Ant8723AHidScoEsco(PADAPTER  padapter        )
12407 {
12408         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12409         u8              btRssiState, btRssiState1, btInfoExt;
12410
12411         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12412
12413         if(btdm_NeedToDecBtPwr(padapter))
12414                 btdm_2AntDecBtPwr(padapter, _TRUE);
12415         else
12416                 btdm_2AntDecBtPwr(padapter, _FALSE);
12417         // coex table
12418         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12419         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12420
12421         if(BTDM_IsHT40(padapter))
12422         {
12423                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12424                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12425                 // fw mechanism
12426                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12427                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12428                 {
12429                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12430                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12431                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12432                 {
12433                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12434                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12435                 }
12436                 else
12437                 {
12438                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12439                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
12440                 }
12441         }
12442         else
12443         {
12444                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12445                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12446                 {
12447                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12448                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12449                 }
12450                 else
12451                 {
12452                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12453                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
12454                         }
12455                 }
12456
12457                 // sw mechanism
12458                 btdm_2AntAgcTable(padapter, _FALSE);
12459                 btdm_2AntAdcBackOff(padapter, _FALSE);
12460                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12461         }
12462         else
12463         {
12464                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12465                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
12466                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12467
12468                 // fw mechanism
12469                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12470                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12471                 {
12472                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12473                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12474                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12475                         {
12476                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12477                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12478                         }
12479                         else
12480                         {
12481                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12482                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
12483                         }
12484                 }
12485                 else
12486                 {
12487                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12488                         if(btInfoExt&BIT(0))    //a2dp rate, 1:basic /0:edr
12489                         {
12490                                 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12491                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12492                         }
12493                         else
12494                         {
12495                                 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12496                                 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
12497                 }
12498         }
12499
12500                 // sw mechanism
12501                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12502                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12503         {
12504                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12505                         btdm_2AntAgcTable(padapter, _TRUE);
12506                         btdm_2AntAdcBackOff(padapter, _TRUE);
12507                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12508         }
12509                 else
12510         {
12511                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12512                         btdm_2AntAgcTable(padapter, _FALSE);
12513                         btdm_2AntAdcBackOff(padapter, _FALSE);
12514                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12515         }
12516         }
12517 }
12518
12519 void btdm_2Ant8723AFtpA2dp(     PADAPTER        padapter        )
12520 {
12521         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12522         u8              btRssiState, btRssiState1, btInfoExt;
12523
12524         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12525
12526         if(btdm_NeedToDecBtPwr(padapter))
12527                 btdm_2AntDecBtPwr(padapter, _TRUE);
12528         else
12529                 btdm_2AntDecBtPwr(padapter, _FALSE);
12530         // coex table
12531         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12532         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12533
12534         if(BTDM_IsHT40(padapter))
12535         {
12536                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12537                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
12538                 // fw mechanism
12539                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12540                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12541                 {
12542                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12543                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12544                         btdm_2AntPsTdma(padapter, _TRUE, 3);
12545                         }
12546                         else
12547                         {
12548                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12549                         btdm_2AntPsTdma(padapter, _TRUE, 7);
12550                         }
12551
12552                 // sw mechanism
12553                 btdm_2AntAgcTable(padapter, _FALSE);
12554                 btdm_2AntAdcBackOff(padapter, _TRUE);
12555                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12556                 }
12557                 else
12558                 {
12559                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12560                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
12561                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12562
12563                 // fw mechanism
12564                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12565                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12566                 {
12567                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12568                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12569                         btdm_2AntPsTdma(padapter, _TRUE, 3);
12570                 }
12571                 else
12572                         {
12573                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12574                         btdm_2AntPsTdma(padapter,  _TRUE, 7);
12575                         }
12576
12577                 // sw mechanism
12578                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12579                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12580                         {
12581                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12582                         btdm_2AntAgcTable(padapter, _TRUE);
12583                         btdm_2AntAdcBackOff(padapter, _TRUE);
12584                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12585                         }
12586                         else
12587                         {
12588                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12589                         btdm_2AntAgcTable(padapter, _FALSE);
12590                         btdm_2AntAdcBackOff(padapter, _FALSE);
12591                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12592                         }
12593                 }
12594         }
12595
12596
12597 void btdm_2Ant8723AA2dp(PADAPTER padapter)
12598         {
12599         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12600         u8              btRssiState, btRssiState1, btInfoExt;
12601
12602         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12603
12604         if(btdm_NeedToDecBtPwr(padapter))
12605                 btdm_2AntDecBtPwr(padapter, _TRUE);
12606         else
12607                 btdm_2AntDecBtPwr(padapter, _FALSE);
12608                 // coex table
12609         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12610         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12611
12612         if(BTDM_IsHT40(padapter))
12613         {
12614                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12615                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12616                 // fw mechanism
12617                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12618                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12619                 {
12620                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12621                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12622                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
12623                 }
12624                 else
12625                 {
12626                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12627                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
12628                 }
12629
12630                 // sw mechanism
12631                 btdm_2AntAgcTable(padapter, _FALSE);
12632                 btdm_2AntAdcBackOff(padapter, _TRUE);
12633                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12634         }
12635         else
12636         {
12637                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12638                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
12639                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12640
12641                 // fw mechanism
12642                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12643                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12644                 {
12645                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12646                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12647                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
12648                 }
12649                 else
12650                         {
12651                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12652                         btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
12653                         }
12654
12655                 // sw mechanism
12656                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12657                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12658                         {
12659                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12660                         btdm_2AntAgcTable(padapter, _TRUE);
12661                         btdm_2AntAdcBackOff(padapter, _TRUE);
12662                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12663                         }
12664                         else
12665                         {
12666                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12667                         btdm_2AntAgcTable(padapter, _FALSE);
12668                         btdm_2AntAdcBackOff(padapter, _FALSE);
12669                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12670                         }
12671                 }
12672 }
12673
12674
12675 void btdm_2Ant8723Ftp(PADAPTER  padapter)
12676                 {
12677         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12678         u8              btRssiState, btRssiState1, btInfoExt;
12679
12680         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12681
12682         if(btdm_NeedToDecBtPwr(padapter))
12683                 btdm_2AntDecBtPwr(padapter, _TRUE);
12684         else
12685                 btdm_2AntDecBtPwr(padapter, _FALSE);
12686         // coex table
12687         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12688         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12689
12690         if(BTDM_IsHT40(padapter))
12691                         {
12692                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12693                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12694                 // fw mechanism
12695                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12696                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12697                         {
12698                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12699                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12700                         btdm_2AntPsTdma(padapter, _TRUE, 1);
12701                         }
12702                         else
12703                         {
12704                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12705                         btdm_2AntPsTdma(padapter, _TRUE, 5);
12706                 }
12707
12708                 // sw mechanism
12709                 btdm_2AntAgcTable(padapter, _FALSE);
12710                 btdm_2AntAdcBackOff(padapter, _TRUE);
12711                 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12712         }
12713         else
12714         {
12715                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
12716                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
12717                 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
12718
12719                 // fw mechanism
12720                 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12721                         (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12722         {
12723                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12724                         PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12725                         btdm_2AntPsTdma(padapter, _TRUE, 1);
12726                 }
12727                 else
12728                 {
12729                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12730                         btdm_2AntPsTdma(padapter, _TRUE, 5);
12731         }
12732
12733                 // sw mechanism
12734                 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12735                         (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12736         {
12737                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12738                         btdm_2AntAgcTable(padapter, _TRUE);
12739                         btdm_2AntAdcBackOff(padapter, _TRUE);
12740                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12741         }
12742                 else
12743         {
12744                         RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12745                         btdm_2AntAgcTable(padapter, _FALSE);
12746                         btdm_2AntAdcBackOff(padapter, _FALSE);
12747                         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12748                 }
12749         }
12750 }
12751
12752 //============================================================
12753 // extern function start with BTDM_
12754 //============================================================
12755 void BTDM_2AntParaInit(PADAPTER padapter)
12756 {
12757
12758         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12759         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
12760
12761         RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2Ant Parameter Init!!\n"));
12762
12763         // Enable counter statistics
12764         rtw_write8(padapter, 0x76e, 0x4);
12765         rtw_write8(padapter, 0x778, 0x3);
12766         rtw_write8(padapter, 0x40, 0x20);
12767
12768         // force to reset coex mechanism
12769         pBtdm8723->preVal0x6c0 = 0x0;
12770         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12771
12772         pBtdm8723->bPrePsTdmaOn = _TRUE;
12773         btdm_2AntPsTdma(padapter, _FALSE, 0);
12774
12775         pBtdm8723->preFwDacSwingLvl = 0x10;
12776         btdm_2AntFwDacSwingLvl(padapter, 0x20);
12777
12778         pBtdm8723->bPreDecBtPwr = _TRUE;
12779         btdm_2AntDecBtPwr(padapter, _FALSE);
12780
12781         pBtdm8723->bPreAgcTableEn = _TRUE;
12782         btdm_2AntAgcTable(padapter, _FALSE);
12783
12784         pBtdm8723->bPreAdcBackOff = _TRUE;
12785         btdm_2AntAdcBackOff(padapter, _FALSE);
12786
12787         pBtdm8723->bPreLowPenaltyRa = _TRUE;
12788         btdm_2AntLowPenaltyRa(padapter, _FALSE);
12789
12790         pBtdm8723->bPreRfRxLpfShrink = _TRUE;
12791         btdm_2AntRfShrink(padapter, _FALSE);
12792
12793         pBtdm8723->bPreDacSwingOn = _TRUE;
12794         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12795
12796         pBtdm8723->bPreIgnoreWlanAct = _TRUE;
12797         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12798 }
12799
12800 void BTDM_2AntHwCoexAllOff8723A(PADAPTER padapter)
12801 {
12802         btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12803 }
12804
12805 void BTDM_2AntFwCoexAllOff8723A(PADAPTER padapter)
12806 {
12807         btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12808         btdm_2AntPsTdma(padapter, _FALSE, 0);
12809         btdm_2AntFwDacSwingLvl(padapter, 0x20);
12810         btdm_2AntDecBtPwr(padapter, _FALSE);
12811 }
12812
12813 void BTDM_2AntSwCoexAllOff8723A(PADAPTER padapter)
12814 {
12815         btdm_2AntAgcTable(padapter, _FALSE);
12816         btdm_2AntAdcBackOff(padapter, _FALSE);
12817         btdm_2AntLowPenaltyRa(padapter, _FALSE);
12818         btdm_2AntRfShrink(padapter, _FALSE);
12819         btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12820 }
12821
12822
12823 void BTDM_2AntIpsNotify8723A(PADAPTER   padapter,u8             type)
12824 {
12825         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
12826         PBT_MGNT                pBtMgnt=&pBTInfo->BtMgnt;
12827
12828         if(pBtMgnt->bSupportProfile && (rf_off==type))
12829         {
12830                 RTPRINT(FBT, BT_TRACE, ("[BT][DM], enter IPS, turn off all BT Coexist DM\n"));
12831                 BTDM_CoexAllOff(padapter);
12832 }
12833 }
12834
12835
12836 void BTDM_2AntNotifyBtOperation8723(PADAPTER padapter)
12837 {
12838         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
12839         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
12840         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12841
12842         switch (pBtMgnt->ExtConfig.btOperationCode)
12843         {
12844                 case HCI_BT_OP_NONE:
12845                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for operation None!!\n"));
12846                         break;
12847                 case HCI_BT_OP_INQUIRY_START:
12848                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Inquiry start!!\n"));
12849                         pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12850                         pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12851                         btdm_2AntBtInquiryPage(padapter);
12852                         break;
12853                 case HCI_BT_OP_INQUIRY_FINISH:
12854                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Inquiry finished!!\n"));
12855                         pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12856                         break;
12857                 case HCI_BT_OP_PAGING_START:
12858                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging start!!\n"));
12859                         pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12860                         pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12861                         btdm_2AntBtInquiryPage(padapter);
12862                         break;
12863                 case HCI_BT_OP_PAGING_SUCCESS:
12864                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging successfully!!\n"));
12865                         pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12866                         break;
12867                 case HCI_BT_OP_PAGING_UNSUCCESS:
12868                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging unsuccessfully!!\n"));
12869                         pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12870                         break;
12871                 case HCI_BT_OP_PAIRING_START:
12872                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Pairing start!!\n"));
12873                         pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12874                         pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12875                         btdm_2AntBtInquiryPage(padapter);
12876                         break;
12877                 case HCI_BT_OP_PAIRING_FINISH:
12878                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Pairing finished!!\n"));
12879                         pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12880                         break;
12881
12882                 case HCI_BT_OP_BT_DEV_ENABLE:
12883                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device enable!!\n"));
12884                         break;
12885                 case HCI_BT_OP_BT_DEV_DISABLE:
12886                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device disable!!\n"));
12887                         break;
12888                 default:
12889                         RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Unknown, error!!\n"));
12890                         break;
12891         }
12892 }
12893
12894
12895
12896 void btdm_BtHwCountersMonitor(PADAPTER padapter);
12897 VOID
12898 BTDM_2AntFwC2hBtInfo8723A(
12899         PADAPTER        padapter
12900         )
12901 {
12902         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
12903         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
12904         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
12905         PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
12906         u1Byte  btInfo=0;
12907         u8                      algorithm=BT_2ANT_COEX_ALGO_UNDEFINED;
12908         u8                      bScoExist=_FALSE, bBtLinkExist=_FALSE, bBtHsModeExist=_FALSE;
12909         btInfo = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
12910
12911
12912         pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
12913
12914         // check BIT2 first ==> check if bt is under inquiry or page scan
12915         if(btInfo & BIT(2))
12916         {
12917                 if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage == _FALSE){
12918                         pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12919                         pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12920                         btdm_2AntBtInquiryPage(padapter);
12921                 }
12922                 else{
12923                         pBtMgnt->ExtConfig.bHoldPeriodCnt++;
12924                         btdm_HoldForBtInqPage(padapter);
12925                 }
12926                 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _TRUE;
12927
12928         }
12929         else
12930         {
12931                 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _FALSE;
12932                 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12933                 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
12934
12935
12936         }
12937         RTPRINT(FBT, BT_TRACE, ("[BTC2H], pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage=%x pBtMgnt->ExtConfig.bHoldPeriodCnt=%x pBtMgnt->ExtConfig.bHoldForBtOperation=%x\n",pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage,pBtMgnt->ExtConfig.bHoldPeriodCnt,pBtMgnt->ExtConfig.bHoldForBtOperation));
12938
12939         RTPRINT(FBT, BT_TRACE, ("[BTC2H],   btInfo=%x   pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal=%x\n",btInfo,pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal));
12940 //      btdm_BtHwCountersMonitor(padapter);
12941 //      btdm_2AntBtEnableDisableCheck8723A(padapter);
12942         if(btInfo&BT_INFO_ACL)
12943         {
12944                 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BTInfo: bConnect=TRUE   btInfo=%x\n",btInfo));
12945                 //pBtMgnt->ExtConfig.bBTBusy = _TRUE;
12946                 bBtLinkExist = _TRUE;
12947                 if(((btInfo&(BT_INFO_FTP|BT_INFO_A2DP|BT_INFO_HID|BT_INFO_SCO_BUSY))!=0) || pHalData->bt_coexist.halCoex8723.btRetryCnt>0){
12948                         pBtdm8723->btStatus =BT_2ANT_BT_STATUS_NON_IDLE;
12949                 }
12950                 else
12951                         pBtdm8723->btStatus =BT_2ANT_BT_STATUS_CONNECTED_IDLE;
12952
12953
12954                 if(btInfo&BT_INFO_SCO|| btInfo&BT_INFO_SCO_BUSY){
12955                         if(btInfo&BT_INFO_FTP|| btInfo&BT_INFO_A2DP||btInfo&BT_INFO_HID){
12956                                 switch(btInfo&0xe0){
12957                                         case BT_INFO_HID :
12958                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
12959                                                 algorithm = BT_2ANT_COEX_ALGO_HID;
12960                                                 break;
12961                                         case BT_INFO_A2DP :
12962                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
12963                                                 break;
12964                                         case BT_INFO_FTP :
12965                                                 if(bBtHsModeExist)
12966                                                 {
12967                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
12968                                                         algorithm = BT_2ANT_COEX_ALGO_SCO;
12969                                                 }
12970                                                 else
12971                                                 {
12972                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
12973                                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12974                                                 }
12975                                                 break;
12976                                         case (BT_INFO_HID|BT_INFO_A2DP) :
12977                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
12978                                                 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12979                                                 break;
12980                                         case (BT_INFO_HID|BT_INFO_FTP) :
12981                                                 if(bBtHsModeExist)
12982                                                 {
12983                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
12984                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12985                                                 }
12986                                                 else
12987                                                 {
12988                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
12989                                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12990                                                 }
12991                                                 break;
12992                                         case (BT_INFO_A2DP|BT_INFO_FTP) :
12993                                                 if(bBtHsModeExist)
12994                                                 {
12995                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
12996                                                         algorithm = BT_2ANT_COEX_ALGO_A2DP;
12997                                                 }
12998                                                 else
12999                                                 {
13000                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
13001                                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
13002                                                 }
13003                                                 break;
13004                                         case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
13005                                                 if(bBtHsModeExist)
13006                                                 {
13007                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
13008                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13009                                                 }
13010                                                 else
13011                                                 {
13012                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
13013                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
13014                                                 }
13015                                                 break;
13016
13017                                 }
13018                         }
13019                         else{
13020                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
13021                                 algorithm = BT_2ANT_COEX_ALGO_SCO;
13022                         }
13023                 }
13024                 else{
13025                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], non SCO\n"));
13026                                 switch(btInfo&0xe0){
13027                                         case BT_INFO_HID :
13028                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID\n"));
13029                                                 algorithm = BT_2ANT_COEX_ALGO_HID;
13030                                                 break;
13031                                         case BT_INFO_A2DP :
13032                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex],  A2DP\n"));
13033                                                 algorithm = BT_2ANT_COEX_ALGO_A2DP;
13034                                                 break;
13035                                         case BT_INFO_FTP :
13036                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR)\n"));
13037                                                 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
13038                                                 break;
13039                                         case (BT_INFO_HID|BT_INFO_A2DP) :
13040                                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
13041                                                 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13042                                                 break;
13043                                         case (BT_INFO_HID|BT_INFO_FTP) :
13044                                                 if(bBtHsModeExist)
13045                                                 {
13046                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
13047                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13048                                                 }
13049                                                 else
13050                                                 {
13051                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
13052                                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
13053                                                 }
13054                                                 break;
13055                                         case (BT_INFO_A2DP|BT_INFO_FTP) :
13056                                                 if(bBtHsModeExist)
13057                                                 {
13058                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
13059                                                         algorithm = BT_2ANT_COEX_ALGO_A2DP;
13060                                                 }
13061                                                 else
13062                                                 {
13063                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
13064                                                         algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
13065                                                 }
13066                                                 break;
13067                                         case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
13068                                                 if(bBtHsModeExist)
13069                                                 {
13070                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
13071                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13072                                                 }
13073                                                 else
13074                                                 {
13075                                                         RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
13076                                                         algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
13077                                                 }
13078                                                 break;
13079
13080                                 }
13081
13082                 }
13083         }
13084         else
13085         {
13086                 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BTInfo: bConnect=FALSE\n"));
13087                 //pBtMgnt->ExtConfig.bBTBusy = _FALSE;
13088                 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_IDLE;
13089         }
13090
13091         pBtdm8723->curAlgorithm =algorithm;
13092         RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
13093
13094 //From
13095         BTDM_CheckWiFiState(padapter);
13096         if(pBtMgnt->ExtConfig.bManualControl)
13097         {
13098                 RTPRINT(FBT, BT_TRACE, ("Action Manual control, won't execute bt coexist mechanism!!\n"));
13099                 return;
13100         }
13101
13102 }
13103
13104
13105 void BTDM_2AntBtCoexist8723A(PADAPTER padapter)
13106 {
13107         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
13108         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
13109         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
13110         u8                              BtState = 0, btInfoOriginal=0, btRetryCnt=0;
13111         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13112         PBTDM_8723A_2ANT        pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
13113
13114         if (BTDM_BtProfileSupport(padapter))
13115         {
13116                 if (pBtMgnt->ExtConfig.bHoldForBtOperation)
13117                 {
13118                         RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
13119                         return;
13120                 }
13121                 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
13122                 {
13123                         RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n",
13124                                 pBtMgnt->ExtConfig.bHoldPeriodCnt));
13125                         if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
13126                         {
13127                                 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
13128                                 // next time the coexist parameters should be reset again.
13129                         }
13130                         else
13131                                 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
13132                         return;
13133                 }
13134
13135                 if(pBtDbg->dbgCtrl)
13136                 {
13137                         RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
13138                 }
13139
13140                 pBtdm8723->curAlgorithm = btdm_ActionAlgorithm(padapter);
13141                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
13142
13143                 if (btdm_Is2Ant8723ACommonAction(padapter))
13144                 {
13145                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
13146                         pBtdm8723->bResetTdmaAdjust = _TRUE;
13147                 }
13148                 else
13149                 {
13150                         if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
13151                         {
13152                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
13153                                 pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
13154                                 pBtdm8723->bResetTdmaAdjust = _TRUE;
13155                         }
13156                         switch(pBtdm8723->curAlgorithm)
13157                         {
13158                                 case BT_2ANT_COEX_ALGO_SCO:
13159                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
13160                                         btdm_2Ant8723ASCOAction(padapter);
13161                                         break;
13162                                 case BT_2ANT_COEX_ALGO_HID:
13163                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
13164                                         btdm_2Ant8723AHIDAction(padapter);
13165                                         break;
13166                                 case BT_2ANT_COEX_ALGO_A2DP:
13167                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
13168                                         btdm_2Ant8723AA2DPAction(padapter);
13169                                         break;
13170                                 case BT_2ANT_COEX_ALGO_PANEDR:
13171                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
13172                                         btdm_2Ant8723APANEDRAction(padapter);
13173                                         break;
13174                                 case BT_2ANT_COEX_ALGO_PANHS:
13175                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
13176                                         btdm_2Ant8723APANHSAction(padapter);
13177                                         break;
13178                                 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
13179                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
13180                                         btdm_2Ant8723APANEDRA2DPAction(padapter);
13181                                         break;
13182                                 case BT_2ANT_COEX_ALGO_PANEDR_HID:
13183                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
13184                                         btdm_2Ant8723APANEDRHIDAction(padapter);
13185                                         break;
13186                                 case BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
13187                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
13188                                         btdm_2Ant8723AHIDA2DPPANEDRAction(padapter);
13189                                         break;
13190                                 case BT_2ANT_COEX_ALGO_HID_A2DP:
13191                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
13192                                         btdm_2Ant8723AHIDA2DPAction(padapter);
13193                                         break;
13194 #if 0
13195                                 case BT_2ANT_COEX_ALGO_HID_A2DP_PANHS:
13196                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN(HS).\n"));
13197                                         btdm_2Ant8723AHIDA2DPPANHSAction(padapter);
13198                                         break;
13199 #endif
13200                                 default:
13201                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
13202                                         //btdm_2Ant8723AAction0(padapter);
13203                                         btdm_2Ant8723AA2DPAction(padapter);
13204                                         break;
13205                         }
13206                         pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
13207                 }
13208         }
13209         else
13210         {
13211                 RTPRINT(FBT, BT_TRACE, ("[BTCoex] Get bt info by fw!!\n"));
13212                 //msg shows c2h rsp for bt_info is received or not.
13213                 if (pHalData->bt_coexist.halCoex8723.bC2hBtInfoReqSent)
13214                 {
13215                         RTPRINT(FBT, BT_TRACE, ("[BTCoex] c2h for btInfo not rcvd yet!!\n"));
13216                 }
13217
13218                 //btRetryCnt = pHalData->bt_coexist.halCoex8723.btRetryCnt;
13219                 btInfoOriginal = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
13220
13221                 if(pBtMgnt->ExtConfig.bHoldForBtOperation)
13222                 {
13223                         RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
13224                         return;
13225                 }
13226                 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
13227                 {
13228                         RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n", pBtMgnt->ExtConfig.bHoldPeriodCnt));
13229                         if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
13230                         {
13231                                 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
13232                                 // next time the coexist parameters should be reset again.
13233                         }
13234                         else
13235                                 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
13236                         return;
13237                 }
13238
13239                 if(pBtDbg->dbgCtrl)
13240                 {
13241                         RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
13242                 }
13243                 if (btdm_Is2Ant8723ACommonAction(padapter))
13244                 {
13245                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
13246                         pBtdm8723->bResetTdmaAdjust = _TRUE;
13247                 }
13248                 else
13249                 {
13250                         if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
13251                         {
13252                                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
13253                                 pBtdm8723->bResetTdmaAdjust = _TRUE;
13254                         }
13255                         switch(pBtdm8723->curAlgorithm)
13256                         {
13257                                 case BT_2ANT_COEX_ALGO_SCO:
13258                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
13259                                         btdm_2Ant8723ASCOAction(padapter);
13260                                         break;
13261                                 case BT_2ANT_COEX_ALGO_HID:
13262                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
13263                                         btdm_2Ant8723AHIDAction(padapter);
13264                                         break;
13265                                 case BT_2ANT_COEX_ALGO_A2DP:
13266                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
13267                                         btdm_2Ant8723AA2dp(padapter);
13268                                         break;
13269                                 case BT_2ANT_COEX_ALGO_PANEDR:
13270                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
13271                                         btdm_2Ant8723APANEDRAction(padapter);
13272                                         break;
13273                                 case BT_2ANT_COEX_ALGO_PANHS:
13274                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
13275                                         btdm_2Ant8723APANHSAction(padapter);
13276                                         break;
13277                                 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
13278                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
13279                                         btdm_2Ant8723APANEDRA2DPAction(padapter);
13280                                         break;
13281                                 case BT_2ANT_COEX_ALGO_PANEDR_HID:
13282                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
13283                                         btdm_2Ant8723APANEDRHIDAction(padapter);
13284                                         break;
13285                                 case BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
13286                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
13287                                         btdm_2Ant8723AHIDA2DPPANEDRAction(padapter);
13288                                         break;
13289                                 case BT_2ANT_COEX_ALGO_HID_A2DP:
13290                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
13291                                         btdm_2Ant8723AHIDA2DPAction(padapter);
13292                                         break;
13293 #if 0
13294                                 case BT_2ANT_COEX_ALGO_HID_A2DP_PANHS:
13295                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN(HS).\n"));
13296                                         btdm_2Ant8723ActionHidA2dpPanHs(Adapter);
13297                                         break;
13298 #endif
13299                                 default:
13300                                         RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
13301                                         //btdm_2Ant8723AAction0(padapter);
13302                                         btdm_2Ant8723AA2DPAction(padapter);
13303                                         break;
13304                         }
13305                         pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
13306                 }
13307 //                      pHalData->bt_coexist.halCoex8723.prec2hBtInfo = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
13308
13309         }
13310 }
13311
13312 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
13313 #endif
13314
13315 #ifdef __HALBTC8723_C__ // HAL/BTCoexist/HalBtc8723.c
13316 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
13317
13318 static u8 btCoexDbgBuf[BT_TMP_BUF_SIZE];
13319 const char *const BtProfileString[]={
13320         "NONE",
13321         "A2DP",
13322         "PAN",
13323         "HID",
13324         "SCO",
13325 };
13326 const char *const BtSpecString[]={
13327         "1.0b",
13328         "1.1",
13329         "1.2",
13330         "2.0+EDR",
13331         "2.1+EDR",
13332         "3.0+HS",
13333         "4.0",
13334 };
13335 const char *const BtLinkRoleString[]={
13336         "Master",
13337         "Slave",
13338 };
13339
13340 u8 btdm_BtWifiAntNum(PADAPTER padapter)
13341 {
13342         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13343         PBT_COEXIST_8723A       pBtCoex = &pHalData->bt_coexist.halCoex8723;
13344
13345 //      RTPRINT(FBT, BT_TRACE, ("%s pHalData->bt_coexist.BluetoothCoexist =%x pHalData->EEPROMBluetoothCoexist=%x \n",
13346 //              __func__,pHalData->bt_coexist.BluetoothCoexist,pHalData->EEPROMBluetoothCoexist));
13347 //      RTPRINT(FBT, BT_TRACE, ("%s pHalData->bt_coexist.BT_Ant_Num =%x pHalData->EEPROMBluetoothAntNum=%x \n",
13348 //              __func__,pHalData->bt_coexist.BT_Ant_Num,pHalData->EEPROMBluetoothAntNum));
13349         if (Ant_x2 == pHalData->bt_coexist.BT_Ant_Num)
13350         {
13351                 if (Ant_x2 == pBtCoex->TotalAntNum)
13352                         return Ant_x2;
13353                 else
13354                         return Ant_x1;
13355         }
13356         else
13357         {
13358                 return Ant_x1;
13359         }
13360
13361         return Ant_x2;
13362 }
13363
13364 void btdm_BtHwCountersMonitor(PADAPTER padapter)
13365 {
13366         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13367         u32                             regHPTxRx, regLPTxRx, u4Tmp;
13368         u32                             regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
13369 //      u8                              u1Tmp;
13370
13371
13372         regHPTxRx = REG_HIGH_PRIORITY_TXRX;
13373         regLPTxRx = REG_LOW_PRIORITY_TXRX;
13374
13375         u4Tmp = rtw_read32(padapter, regHPTxRx);
13376         regHPTx = u4Tmp & bMaskLWord;
13377         regHPRx = (u4Tmp & bMaskHWord)>>16;
13378
13379         u4Tmp = rtw_read32(padapter, regLPTxRx);
13380         regLPTx = u4Tmp & bMaskLWord;
13381         regLPRx = (u4Tmp & bMaskHWord)>>16;
13382
13383         pHalData->bt_coexist.halCoex8723.highPriorityTx = regHPTx;
13384         pHalData->bt_coexist.halCoex8723.highPriorityRx = regHPRx;
13385         pHalData->bt_coexist.halCoex8723.lowPriorityTx = regLPTx;
13386         pHalData->bt_coexist.halCoex8723.lowPriorityRx = regLPRx;
13387
13388         RTPRINT(FBT, BT_TRACE, ("High Priority Tx/Rx= %d / %d\n", regHPTx, regHPRx));
13389         RTPRINT(FBT, BT_TRACE, ("Low Priority Tx/Rx= %d / %d\n", regLPTx, regLPRx));
13390
13391         // reset counter
13392         //u1Tmp = rtw_read8(padapter, 0x76e);
13393         //DbgPrint("read 2 back 0x76e= 0x%x\n", u1Tmp);
13394         //u4Tmp |= BIT3;
13395         rtw_write8(padapter, 0x76e, 0xc);
13396 }
13397
13398 // This function check if 8723 bt is disabled
13399 void btdm_BtEnableDisableCheck8723A(PADAPTER padapter)
13400 {
13401         u8              btAlife = _TRUE;
13402         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13403
13404
13405 #ifdef CHECK_BT_EXIST_FROM_REG
13406         u8              val8;
13407
13408         // ox68[28]=1 => BT enable; otherwise disable
13409         val8 = rtw_read8(padapter, 0x6B);
13410         if (!(val8 & BIT(4))) btAlife = _FALSE;
13411
13412         if (btAlife)
13413         {
13414                 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
13415 //              RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
13416         }
13417         else
13418         {
13419                 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
13420 //              RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
13421         }
13422 #else
13423         if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0 &&
13424                 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0 &&
13425                 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0 &&
13426                 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0)
13427         {
13428                 btAlife = _FALSE;
13429         }
13430         if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0xeaea &&
13431                 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0xeaea &&
13432                 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0xeaea &&
13433                 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0xeaea)
13434         {
13435                 btAlife = _FALSE;
13436         }
13437         if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0xffff &&
13438                 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0xffff &&
13439                 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0xffff &&
13440                 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0xffff)
13441         {
13442                 btAlife = _FALSE;
13443         }
13444         if (btAlife)
13445         {
13446                 pHalData->bt_coexist.btActiveZeroCnt = 0;
13447                 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
13448                 RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
13449         }
13450         else
13451         {
13452                 pHalData->bt_coexist.btActiveZeroCnt++;
13453                 RTPRINT(FBT, BT_TRACE, ("8723A bt all counters=0, %d times!!\n",
13454                                 pHalData->bt_coexist.btActiveZeroCnt));
13455                 if (pHalData->bt_coexist.btActiveZeroCnt >= 2)
13456                 {
13457                         pHalData->bt_coexist.bCurBtDisabled = _TRUE;
13458                         RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
13459                 }
13460         }
13461 #endif
13462
13463         if (pHalData->bt_coexist.bCurBtDisabled == _FALSE) {
13464                 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
13465                         BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
13466                 else
13467                         BTDM_SetFwChnlInfo(padapter, RT_MEDIA_DISCONNECT);
13468         }
13469
13470         if (pHalData->bt_coexist.bPreBtDisabled !=
13471                 pHalData->bt_coexist.bCurBtDisabled)
13472         {
13473                 RTPRINT(FBT, BT_TRACE, ("8723A BT is from %s to %s!!\n",
13474                         (pHalData->bt_coexist.bPreBtDisabled ? "disabled":"enabled"),
13475                         (pHalData->bt_coexist.bCurBtDisabled ? "disabled":"enabled")));
13476                 pHalData->bt_coexist.bPreBtDisabled = pHalData->bt_coexist.bCurBtDisabled;
13477         }
13478 }
13479
13480 void btdm_BTCoexist8723AHandler(PADAPTER padapter)
13481 {
13482         PHAL_DATA_TYPE  pHalData;
13483
13484
13485         pHalData = GET_HAL_DATA(padapter);
13486
13487         if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13488         {
13489                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2 Ant mechanism\n"));
13490                 BTDM_2AntBtCoexist8723A(padapter);
13491         }
13492         else
13493         {
13494                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
13495                 BTDM_1AntBtCoexist8723A(padapter);
13496         }
13497
13498         if (!BTDM_IsSameCoexistState(padapter))
13499         {
13500                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
13501                         pHalData->bt_coexist.PreviousState,
13502                         pHalData->bt_coexist.CurrentState));
13503                 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
13504
13505                 RTPRINT(FBT, BT_TRACE, ("["));
13506                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
13507                         RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
13508                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
13509                         RTPRINT(FBT, BT_TRACE, ("HT20, "));
13510                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
13511                         RTPRINT(FBT, BT_TRACE, ("HT40, "));
13512                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
13513                         RTPRINT(FBT, BT_TRACE, ("Legacy, "));
13514                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
13515                         RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
13516                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
13517                         RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
13518                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
13519                         RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
13520                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
13521                         RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
13522                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
13523                         RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
13524                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
13525                         RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
13526                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
13527                         RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
13528                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
13529                         RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
13530                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
13531                         RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
13532                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
13533                         RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
13534                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
13535                         RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
13536                 RTPRINT(FBT, BT_TRACE, ("]\n"));
13537         }
13538 }
13539
13540 //============================================================
13541 // extern function start with BTDM_
13542 //============================================================
13543 u32 BTDM_BtTxRxCounterH(        PADAPTER        padapter)
13544 {
13545         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13546         u32     counters=0;
13547
13548         counters = pHalData->bt_coexist.halCoex8723.highPriorityTx+
13549                 pHalData->bt_coexist.halCoex8723.highPriorityRx ;
13550         return counters;
13551 }
13552
13553 u32 BTDM_BtTxRxCounterL(        PADAPTER        padapter        )
13554 {
13555         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13556         u4Byte  counters=0;
13557
13558         counters = pHalData->bt_coexist.halCoex8723.lowPriorityTx+
13559                 pHalData->bt_coexist.halCoex8723.lowPriorityRx ;
13560         return counters;
13561 }
13562
13563 void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
13564 {
13565 //      PMGNT_INFO      pMgntInfo = &padapter->MgntInfo;
13566         struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
13567         PBT30Info       pBTInfo = GET_BT_INFO(padapter);
13568         PBT_MGNT        pBtMgnt = &pBTInfo->BtMgnt;
13569         u8              H2C_Parameter[3] ={0};
13570         u8              chnl;
13571
13572
13573         if (!IS_HARDWARE_TYPE_8723A(padapter))
13574                 return;
13575
13576         // opMode
13577         if (RT_MEDIA_CONNECT == mstatus)
13578         {
13579                 H2C_Parameter[0] = 0x1; // 0: disconnected, 1:connected
13580         }
13581
13582         if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
13583         {
13584                 // channel
13585                 chnl = pmlmeext->cur_channel;
13586                 if (BTDM_IsHT40(padapter))
13587                 {
13588                         if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
13589                         {
13590                                 chnl -= 2;
13591                         }
13592                         else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
13593                         {
13594                                 chnl += 2;
13595                         }
13596                 }
13597                 H2C_Parameter[1] = chnl;
13598 //              RTPRINT(FBT, BT_TRACE, ("[BTCoex], pmlmeext->cur_channel=0x%x  pmlmeext->cur_ch_offset=0x%x chnl=0x%x\n",pmlmeext->cur_channel,pmlmeext->cur_ch_offset,chnl ));
13599         }
13600         else    // check if HS link is exists
13601         {
13602                 // channel
13603                 if (BT_Operation(padapter))
13604                         H2C_Parameter[1] = pBtMgnt->BTChannel;
13605                 else
13606                         H2C_Parameter[1] = pmlmeext->cur_channel;
13607         }
13608
13609         if (BTDM_IsHT40(padapter))
13610         {
13611                 H2C_Parameter[2] = 0x30;
13612         }
13613         else
13614         {
13615                 H2C_Parameter[2] = 0x20;
13616         }
13617
13618 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x19=0x%x\n",
13619 //              H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
13620
13621         FillH2CCmd(padapter, 0x19, 3, H2C_Parameter);
13622 }
13623
13624 u8 BTDM_IsWifiConnectionExist(PADAPTER padapter)
13625 {
13626         u8 bRet = _FALSE;
13627
13628
13629         if (BTHCI_HsConnectionEstablished(padapter))
13630                 bRet = _TRUE;
13631
13632         if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
13633                 bRet = _TRUE;
13634
13635         return bRet;
13636 }
13637
13638 void BTDM_SetFw3a(
13639         PADAPTER        padapter,
13640         u8              byte1,
13641         u8              byte2,
13642         u8              byte3,
13643         u8              byte4,
13644         u8              byte5
13645         )
13646 {
13647         u8                      H2C_Parameter[5] = {0};
13648
13649         if (BTDM_1Ant8723A(padapter) == _TRUE)
13650         {
13651                 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
13652                         (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) // for softap mode
13653                 {
13654                         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13655                         PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
13656                         u8 BtState = pBtCoex->c2hBtInfo;
13657
13658                         if ((BtState != BT_INFO_STATE_NO_CONNECTION) &&
13659                                 (BtState != BT_INFO_STATE_CONNECT_IDLE))
13660                         {
13661                                 if (byte1 & BIT(4))
13662                                 {
13663                                         byte1 &= ~BIT(4);
13664                                         byte1 |= BIT(5);
13665                                 }
13666
13667                                 byte5 |= BIT(5);
13668                                 if (byte5 & BIT(6))
13669                                 {
13670                                         byte5 &= ~BIT(6);
13671                                 }
13672                         }
13673                 }
13674         }
13675
13676         H2C_Parameter[0] = byte1;
13677         H2C_Parameter[1] = byte2;
13678         H2C_Parameter[2] = byte3;
13679         H2C_Parameter[3] = byte4;
13680         H2C_Parameter[4] = byte5;
13681
13682         RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%02x%08x\n",
13683                 H2C_Parameter[0],
13684                 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
13685
13686         FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
13687 }
13688
13689 void BTDM_ForceBtCoexMechanism(PADAPTER padapter, u8 type)
13690 {
13691         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13692
13693
13694         pHalData->bt_coexist.halCoex8723.bForceFwBtInfo = type;
13695
13696         if (pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
13697         {
13698                 DbgPrint("cosa force bt info from wifi fw !!!\n");
13699         }
13700         else
13701         {
13702                 DbgPrint("cosa force bt coexist bt info from bt stack\n");
13703         }
13704 }
13705
13706 void BTDM_QueryBtInformation(PADAPTER padapter)
13707 {
13708         u8 H2C_Parameter[1] = {0};
13709         PHAL_DATA_TYPE pHalData;
13710         PBT_COEXIST_8723A pBtCoex;
13711
13712
13713         pHalData = GET_HAL_DATA(padapter);
13714         pBtCoex = &pHalData->bt_coexist.halCoex8723;
13715
13716         if (BT_IsBtDisabled(padapter) == _TRUE)
13717         {
13718                 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
13719                 pBtCoex->bC2hBtInfoReqSent = _FALSE;
13720                 return;
13721         }
13722
13723         if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
13724                 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
13725
13726         if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
13727         {
13728                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], didn't recv previous BtInfo report!\n"));
13729         }
13730         else
13731         {
13732                 pBtCoex->bC2hBtInfoReqSent = _TRUE;
13733         }
13734
13735         H2C_Parameter[0] |= BIT(0);     // trigger
13736
13737 //      RTPRINT(FBT, BT_TRACE, ("[BTCoex], Query Bt information, write 0x38=0x%x\n",
13738 //              H2C_Parameter[0]));
13739
13740         FillH2CCmd(padapter, 0x38, 1, H2C_Parameter);
13741 }
13742
13743 void BTDM_SetSwRfRxLpfCorner(PADAPTER padapter, u8 type)
13744 {
13745         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13746
13747         if (BT_RF_RX_LPF_CORNER_SHRINK == type)
13748         {
13749                 //Shrink RF Rx LPF corner
13750                 RTPRINT(FBT, BT_TRACE, ("Shrink RF Rx LPF corner!!\n"));
13751                 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, 0xf0ff7);
13752                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
13753         }
13754         else if (BT_RF_RX_LPF_CORNER_RESUME == type)
13755         {
13756                 //Resume RF Rx LPF corner
13757                 RTPRINT(FBT, BT_TRACE, ("Resume RF Rx LPF corner!!\n"));
13758                 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, pHalData->bt_coexist.BtRfRegOrigin1E);
13759         }
13760 }
13761
13762 void
13763 BTDM_SetSwPenaltyTxRateAdaptive(
13764         PADAPTER        padapter,
13765         u8              raType
13766         )
13767 {
13768         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13769         u8      tmpU1;
13770
13771         tmpU1 = rtw_read8(padapter, 0x4fd);
13772         tmpU1 |= BIT(0);
13773         if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == raType)
13774         {
13775 //              RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set low penalty!!\n"));
13776                 tmpU1 &= ~BIT(2);
13777                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
13778         }
13779         else if (BT_TX_RATE_ADAPTIVE_NORMAL == raType)
13780         {
13781 //              RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set normal!!\n"));
13782                 tmpU1 |= BIT(2);
13783         }
13784
13785         rtw_write8(padapter, 0x4fd, tmpU1);
13786 }
13787
13788 void BTDM_SetFwDecBtPwr(PADAPTER padapter, u8 bDecBtPwr)
13789 {
13790         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13791         u8                      H2C_Parameter[1] = {0};
13792
13793
13794         H2C_Parameter[0] = 0;
13795
13796         if (bDecBtPwr)
13797         {
13798                 H2C_Parameter[0] |= BIT(1);
13799                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
13800         }
13801
13802         RTPRINT(FBT, BT_TRACE, ("[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
13803                 (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));
13804
13805         FillH2CCmd(padapter, 0x21, 1, H2C_Parameter);
13806 }
13807
13808 u8 BTDM_BtProfileSupport(PADAPTER padapter)
13809 {
13810         u8                      bRet = _FALSE;
13811         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
13812         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
13813         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13814
13815
13816         if (pBtMgnt->bSupportProfile &&
13817                 !pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
13818         {
13819                 bRet = _TRUE;
13820         }
13821
13822         return bRet;
13823 }
13824
13825 void BTDM_AdjustForBtOperation8723A(PADAPTER padapter)
13826 {
13827         //BTDM_2AntAdjustForBtOperation8723(padapter);
13828 }
13829
13830 void BTDM_FwC2hBtRssi8723A(PADAPTER padapter, u8 *tmpBuf)
13831 {
13832         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13833         u8                      percent=0, u1tmp=0;
13834
13835         u1tmp = tmpBuf[0];
13836         percent = u1tmp*2+10;
13837
13838         pHalData->bt_coexist.halCoex8723.btRssi = percent;
13839 //      RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT RSSI=%d\n", percent));
13840 }
13841
13842 void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length)
13843 {
13844         PHAL_DATA_TYPE  pHalData;
13845         PBT30Info               pBTInfo;
13846         PBT_MGNT                pBtMgnt;
13847         PBT_COEXIST_8723A pBtCoex;
13848         u8      i;
13849
13850
13851         pHalData = GET_HAL_DATA(padapter);
13852         pBTInfo = GET_BT_INFO(padapter);
13853         pBtMgnt = &pBTInfo->BtMgnt;
13854         pBtCoex = &pHalData->bt_coexist.halCoex8723;
13855
13856         pBtCoex->bC2hBtInfoReqSent = _FALSE;
13857
13858         RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT info[%d]=[", length));
13859
13860         pBtCoex->btRetryCnt = 0;
13861         for (i=0; i<length; i++)
13862         {
13863                 switch (i)
13864                 {
13865                         case 0:
13866                                 pBtCoex->c2hBtInfoOriginal = tmpBuf[i];
13867                                 break;
13868                         case 1:
13869                                 pBtCoex->btRetryCnt = tmpBuf[i];
13870                                 break;
13871                         case 2:
13872                                 BTDM_FwC2hBtRssi8723A(padapter, &tmpBuf[i]);
13873                                 break;
13874                         case 3:
13875                                 pBtCoex->btInfoExt=tmpBuf[i]&BIT(0);
13876                                 break;
13877                 }
13878
13879                 if (i == length-1)
13880                 {
13881                         RTPRINT(FBT, BT_TRACE, ("0x%02x]\n", tmpBuf[i]));
13882                 }
13883                 else
13884                 {
13885                         RTPRINT(FBT, BT_TRACE, ("0x%02x, ", tmpBuf[i]));
13886                 }
13887         }
13888         RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT RSSI=%d\n", pBtCoex->btRssi));
13889         if (pBtCoex->btInfoExt)
13890                 RTPRINT(FBT, BT_TRACE, ("[BTC2H], pBtCoex->btInfoExt=%x\n", pBtCoex->btInfoExt));
13891
13892         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13893                 BTDM_1AntFwC2hBtInfo8723A(padapter);
13894         else
13895                 BTDM_2AntFwC2hBtInfo8723A(padapter);
13896
13897         if (pBtMgnt->ExtConfig.bManualControl)
13898         {
13899                 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
13900                 return;
13901         }
13902
13903         btdm_BTCoexist8723AHandler(padapter);
13904 }
13905
13906 void BTDM_Display8723ABtCoexInfo(PADAPTER padapter)
13907 {
13908         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
13909         PBT_COEXIST_8723A       pBtCoex = &pHalData->bt_coexist.halCoex8723;
13910         PBT30Info                       pBTInfo = GET_BT_INFO(padapter);
13911         PBT_MGNT                        pBtMgnt = &pBTInfo->BtMgnt;
13912         PBT_DBG                         pBtDbg = &pBTInfo->BtDbg;
13913         u8                      u1Tmp, u1Tmp1, u1Tmp2, i, btInfoExt, psTdmaCase=0;
13914         u32                     u4Tmp[4];
13915         u8                      antNum=Ant_x2;
13916
13917         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
13918         DCMD_Printf(btCoexDbgBuf);
13919
13920         if (!pHalData->bt_coexist.BluetoothCoexist)
13921         {
13922                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
13923                 DCMD_Printf(btCoexDbgBuf);
13924                 return;
13925         }
13926
13927         antNum = btdm_BtWifiAntNum(padapter);
13928         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/%d ", "Ant mechanism PG/Now run :", \
13929                 ((pHalData->bt_coexist.BT_Ant_Num==Ant_x2)? 2:1), ((antNum==Ant_x2)? 2:1));
13930         DCMD_Printf(btCoexDbgBuf);
13931
13932         if (pBtMgnt->ExtConfig.bManualControl)
13933         {
13934                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");
13935                 DCMD_Printf(btCoexDbgBuf);
13936         }
13937         else
13938         {
13939                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
13940                         ((pBtMgnt->bSupportProfile)? "Yes":"No"), pBtMgnt->ExtConfig.HCIExtensionVer);
13941                 DCMD_Printf(btCoexDbgBuf);
13942         }
13943
13944         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = / %d", "Dot11 channel / BT channel", \
13945                 pBtMgnt->BTChannel);
13946                 DCMD_Printf(btCoexDbgBuf);
13947
13948         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d", "Wifi/BT/HS rssi", \
13949                 BTDM_GetRxSS(padapter),
13950                 pHalData->bt_coexist.halCoex8723.btRssi,
13951                 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB);
13952                         DCMD_Printf(btCoexDbgBuf);
13953
13954         if(!pBtMgnt->ExtConfig.bManualControl)
13955                 {
13956                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s ", "WIfi status", \
13957                         ((BTDM_Legacy(padapter))? "Legacy": (((BTDM_IsHT40(padapter))? "HT40":"HT20"))),
13958                         ((!BTDM_IsWifiBusy(padapter))? "idle": ((BTDM_IsWifiUplink(padapter))? "uplink":"downlink")));
13959                 DCMD_Printf(btCoexDbgBuf);
13960
13961                 if(pBtMgnt->bSupportProfile)
13962                 {
13963                         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
13964                                 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_SCO))? 1: 0),
13965                                 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_HID))? 1: 0),
13966                                 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN))? 1: 0),
13967                                 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP))? 1: 0) );
13968                 DCMD_Printf(btCoexDbgBuf);
13969
13970                         for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
13971                         {
13972                                 if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
13973                                 {
13974                                         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", "Bt link type/spec/role", \
13975                                                 BtProfileString[pBtMgnt->ExtConfig.linkInfo[i].BTProfile],
13976                                                 BtSpecString[pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec],
13977                                                 BtLinkRoleString[pBtMgnt->ExtConfig.linkInfo[i].linkRole]);
13978                                         DCMD_Printf(btCoexDbgBuf);
13979
13980                                         btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
13981                                         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "A2DP rate", \
13982                                                 (btInfoExt&BIT0)? "Basic rate":"EDR rate");
13983                                         DCMD_Printf(btCoexDbgBuf);
13984                                 }
13985                                 else
13986                                 {
13987                                         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s", "Bt link type/spec", \
13988                                                 BtProfileString[pBtMgnt->ExtConfig.linkInfo[i].BTProfile],
13989                                                 BtSpecString[pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec]);
13990                                         DCMD_Printf(btCoexDbgBuf);
13991                                 }
13992                         }
13993                 }
13994         }
13995
13996         // Sw mechanism
13997         if (!pBtMgnt->ExtConfig.bManualControl)
13998         {
13999                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw BT Coex mechanism]============");
14000                 DCMD_Printf(btCoexDbgBuf);
14001                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "AGC Table", \
14002                         pBtCoex->btdm2Ant.bCurAgcTableEn);
14003                 DCMD_Printf(btCoexDbgBuf);
14004                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "ADC Backoff", \
14005                         pBtCoex->btdm2Ant.bCurAdcBackOff);
14006                 DCMD_Printf(btCoexDbgBuf);
14007                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "Low penalty RA", \
14008                         pBtCoex->btdm2Ant.bCurLowPenaltyRa);
14009                 DCMD_Printf(btCoexDbgBuf);
14010                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "RF Rx LPF Shrink", \
14011                         pBtCoex->btdm2Ant.bCurRfRxLpfShrink);
14012                 DCMD_Printf(btCoexDbgBuf);
14013         }
14014         u4Tmp[0] = PHY_QueryRFReg(padapter, PathA, 0x1e, 0xff0);
14015         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "RF-A, 0x1e[11:4]/original val", \
14016                 u4Tmp[0], pHalData->bt_coexist.BtRfRegOrigin1E);
14017         DCMD_Printf(btCoexDbgBuf);
14018
14019         // Fw mechanism
14020         if (!pBtMgnt->ExtConfig.bManualControl)
14021         {
14022                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw BT Coex mechanism]============");
14023                 DCMD_Printf(btCoexDbgBuf);
14024         }
14025         if (!pBtMgnt->ExtConfig.bManualControl)
14026         {
14027                 if(btdm_BtWifiAntNum(padapter) == Ant_x1)
14028                         psTdmaCase = pHalData->bt_coexist.halCoex8723.btdm1Ant.curPsTdma;
14029                 else
14030                         psTdmaCase = pHalData->bt_coexist.halCoex8723.btdm2Ant.curPsTdma;
14031                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA(0x3a)", \
14032                         pHalData->bt_coexist.fw3aVal[0], pHalData->bt_coexist.fw3aVal[1],
14033                         pHalData->bt_coexist.fw3aVal[2], pHalData->bt_coexist.fw3aVal[3],
14034                         pHalData->bt_coexist.fw3aVal[4], psTdmaCase);
14035                 DCMD_Printf(btCoexDbgBuf);
14036
14037                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "Decrease Bt Power", \
14038                         pBtCoex->btdm2Ant.bCurDecBtPwr);
14039                 DCMD_Printf(btCoexDbgBuf);
14040         }
14041         u1Tmp = rtw_read8(padapter, 0x778);
14042         u1Tmp1 = rtw_read8(padapter, 0x783);
14043         u1Tmp2 = rtw_read8(padapter, 0x796);
14044         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x778/ 0x783/ 0x796", \
14045                 u1Tmp, u1Tmp1, u1Tmp2);
14046         DCMD_Printf(btCoexDbgBuf);
14047
14048         if (!pBtMgnt->ExtConfig.bManualControl)
14049         {
14050                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "Sw DacSwing Ctrl/Val", \
14051                         pBtCoex->btdm2Ant.bCurDacSwingOn, pBtCoex->btdm2Ant.curDacSwingLvl);
14052                 DCMD_Printf(btCoexDbgBuf);
14053         }
14054         u4Tmp[0] =  rtw_read32(padapter, 0x880);
14055         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x880", \
14056                 u4Tmp[0]);
14057         DCMD_Printf(btCoexDbgBuf);
14058
14059         // Hw mechanism
14060         if (!pBtMgnt->ExtConfig.bManualControl)
14061         {
14062                 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw BT Coex mechanism]============");
14063                 DCMD_Printf(btCoexDbgBuf);
14064         }
14065
14066         u1Tmp = rtw_read8(padapter, 0x40);
14067         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x40", \
14068                 u1Tmp);
14069         DCMD_Printf(btCoexDbgBuf);
14070
14071         u4Tmp[0] = rtw_read32(padapter, 0x550);
14072         u1Tmp = rtw_read8(padapter, 0x522);
14073         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x", "0x550(bcn contrl)/0x522", \
14074                 u4Tmp[0], u1Tmp);
14075         DCMD_Printf(btCoexDbgBuf);
14076
14077         u4Tmp[0] = rtw_read32(padapter, 0x484);
14078         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x484(rate adaptive)", \
14079                 u4Tmp[0]);
14080         DCMD_Printf(btCoexDbgBuf);
14081
14082         u4Tmp[0] = rtw_read32(padapter, 0x50);
14083         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \
14084                 u4Tmp[0]);
14085         DCMD_Printf(btCoexDbgBuf);
14086
14087         u4Tmp[0] = rtw_read32(padapter, 0xda0);
14088         u4Tmp[1] = rtw_read32(padapter, 0xda4);
14089         u4Tmp[2] = rtw_read32(padapter, 0xda8);
14090         u4Tmp[3] = rtw_read32(padapter, 0xdac);
14091         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0xda0/0xda4/0xda8/0xdac(FA cnt)", \
14092                 u4Tmp[0], u4Tmp[1], u4Tmp[2], u4Tmp[3]);
14093         DCMD_Printf(btCoexDbgBuf);
14094
14095         u4Tmp[0] = rtw_read32(padapter, 0x6c0);
14096         u4Tmp[1] = rtw_read32(padapter, 0x6c4);
14097         u4Tmp[2] = rtw_read32(padapter, 0x6c8);
14098         u1Tmp = rtw_read8(padapter, 0x6cc);
14099         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
14100                 u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp);
14101         DCMD_Printf(btCoexDbgBuf);
14102
14103         //u4Tmp = rtw_read32(padapter, 0x770);
14104         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "0x770(Hi pri Rx[31:16]/Tx[15:0])", \
14105                 pHalData->bt_coexist.halCoex8723.highPriorityRx,
14106                 pHalData->bt_coexist.halCoex8723.highPriorityTx);
14107         DCMD_Printf(btCoexDbgBuf);
14108         //u4Tmp = rtw_read32(padapter, 0x774);
14109         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "0x774(Lo pri Rx[31:16]/Tx[15:0])", \
14110                 pHalData->bt_coexist.halCoex8723.lowPriorityRx,
14111                 pHalData->bt_coexist.halCoex8723.lowPriorityTx);
14112         DCMD_Printf(btCoexDbgBuf);
14113
14114         // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang
14115         u1Tmp = rtw_read8(padapter, 0x41b);
14116         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (hang chk == 0xf)", \
14117                 u1Tmp);
14118         DCMD_Printf(btCoexDbgBuf);
14119         rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
14120                 pHalData->LastHMEBoxNum);
14121         DCMD_Printf(btCoexDbgBuf);
14122 }
14123
14124 void BTDM_8723ASignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
14125 {
14126         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14127                 BTDM_1AntSignalCompensation(padapter, rssi_wifi, rssi_bt);
14128 }
14129
14130 void BTDM_8723AInit(PADAPTER padapter)
14131 {
14132         if (IS_HARDWARE_TYPE_8723A(padapter))
14133         {
14134                 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14135                         BTDM_2AntParaInit(padapter);
14136                 else
14137                         BTDM_1AntParaInit(padapter);
14138         }
14139 }
14140
14141 void BTDM_HWCoexAllOff8723A(PADAPTER padapter)
14142 {
14143         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14144         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14145
14146         if (pBtMgnt->ExtConfig.bManualControl)
14147                 return;
14148
14149         if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14150                 BTDM_2AntHwCoexAllOff8723A(padapter);
14151 }
14152
14153 void BTDM_FWCoexAllOff8723A(PADAPTER padapter)
14154 {
14155         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14156         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14157
14158         if (pBtMgnt->ExtConfig.bManualControl)
14159                 return;
14160
14161         if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14162                 BTDM_2AntFwCoexAllOff8723A(padapter);
14163 }
14164
14165 void BTDM_SWCoexAllOff8723A(PADAPTER padapter)
14166 {
14167         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14168         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14169
14170         if (pBtMgnt->ExtConfig.bManualControl)
14171                 return;
14172
14173         if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14174                 BTDM_2AntSwCoexAllOff8723A(padapter);
14175 }
14176
14177 void
14178 BTDM_Set8723ABtCoexCurrAntNum(
14179         PADAPTER        padapter,
14180         u8              antNum
14181         )
14182 {
14183         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14184         PBT_COEXIST_8723A       pBtCoex = &pHalData->bt_coexist.halCoex8723;
14185
14186         if (antNum == 1)
14187         {
14188                 pBtCoex->TotalAntNum = Ant_x1;
14189         }
14190         else if (antNum == 2)
14191         {
14192                 pBtCoex->TotalAntNum = Ant_x2;
14193         }
14194 }
14195
14196 void BTDM_LpsLeave(PADAPTER padapter)
14197 {
14198         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14199         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14200
14201         if (pBtMgnt->ExtConfig.bManualControl)
14202                 return;
14203
14204         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14205                 BTDM_1AntLpsLeave(padapter);
14206 }
14207
14208 void BTDM_ForHalt8723A(PADAPTER padapter)
14209 {
14210         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14211         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14212
14213         if (pBtMgnt->ExtConfig.bManualControl)
14214                 return;
14215
14216         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14217                 BTDM_1AntForHalt(padapter);
14218 }
14219
14220 void BTDM_WifiScanNotify8723A(PADAPTER padapter, u8 scanType)
14221 {
14222         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14223         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14224
14225         if (pBtMgnt->ExtConfig.bManualControl)
14226                 return;
14227
14228         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14229                 BTDM_1AntWifiScanNotify(padapter, scanType);
14230 }
14231
14232 void BTDM_WifiAssociateNotify8723A(PADAPTER padapter, u8 action)
14233 {
14234         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14235         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14236
14237         if (pBtMgnt->ExtConfig.bManualControl)
14238                 return;
14239
14240         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14241                 BTDM_1AntWifiAssociateNotify(padapter, action);
14242 }
14243
14244 void BTDM_MediaStatusNotify8723A(PADAPTER padapter, RT_MEDIA_STATUS      mstatus)
14245 {
14246         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14247         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14248
14249
14250         RTPRINT(FBT, BT_TRACE, ("[BTCoex], MediaStatusNotify, %s\n", mstatus?"connect":"disconnect"));
14251
14252         BTDM_SetFwChnlInfo(padapter, mstatus);
14253
14254         if (pBtMgnt->ExtConfig.bManualControl)
14255                 return;
14256
14257         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14258                 BTDM_1AntMediaStatusNotify(padapter, mstatus);
14259 }
14260
14261 void BTDM_ForDhcp8723A(PADAPTER padapter)
14262 {
14263         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14264         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14265
14266         if (pBtMgnt->ExtConfig.bManualControl)
14267                 return;
14268
14269         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14270                 BTDM_1AntForDhcp(padapter);
14271 }
14272
14273 u8 BTDM_1Ant8723A(PADAPTER padapter)
14274 {
14275         if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14276                 return _TRUE;
14277         else
14278                 return _FALSE;
14279 }
14280
14281 void BTDM_BTCoexist8723A(PADAPTER padapter)
14282 {
14283         PHAL_DATA_TYPE  pHalData;
14284         PBT30Info               pBTInfo;
14285         PBT_MGNT                pBtMgnt;
14286         PBT_COEXIST_8723A pBtCoex;
14287
14288
14289         pHalData = GET_HAL_DATA(padapter);
14290         pBTInfo = GET_BT_INFO(padapter);
14291         pBtMgnt = &pBTInfo->BtMgnt;
14292         pBtCoex = &pHalData->bt_coexist.halCoex8723;
14293
14294         RTPRINT(FBT, BT_TRACE, ("[BTCoex], beacon RSSI=0x%x(%d)\n",
14295                 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB,
14296                 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB));
14297
14298         btdm_BtHwCountersMonitor(padapter);
14299         btdm_BtEnableDisableCheck8723A(padapter);
14300
14301         if (pBtMgnt->ExtConfig.bManualControl)
14302         {
14303                 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
14304                 return;
14305         }
14306
14307         if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
14308         {
14309                 if (BT_IsBtDisabled(padapter) == _TRUE)
14310                 {
14311                         pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
14312                 }
14313                 else
14314                 {
14315                         if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
14316                                 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
14317                 }
14318
14319                 btdm_BTCoexist8723AHandler(padapter);
14320         }
14321         else if (BT_IsBtDisabled(padapter) == _TRUE)
14322         {
14323                 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
14324                 btdm_BTCoexist8723AHandler(padapter);
14325         }
14326
14327         BTDM_QueryBtInformation(padapter);
14328 }
14329
14330 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
14331 #endif
14332
14333 #ifdef __HALBTCCSR1ANT_C__ // HAL/BTCoexist/HalBtcCsr1Ant.c
14334 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
14335
14336 //============================================================
14337 // local function start with btdm_
14338 //============================================================
14339 void btdm_WriteReg860(PADAPTER padapter, u16 value)
14340 {
14341         RTPRINT(FBT, BT_TRACE, ("btdm_WriteReg860(), value = 0x%x\n", value));
14342         PHY_SetBBReg(padapter, 0x860, bMaskLWord, value);
14343 }
14344
14345 void btdm_CheckCounterOnly1Ant(PADAPTER padapter)
14346 {
14347         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14348 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
14349         u32                     BT_Polling, Ratio_Act, Ratio_STA;
14350         u32                     BT_Active, BT_State;
14351         u32                     regBTActive = 0, regBTState = 0, regBTPolling=0;
14352
14353         if (!pHalData->bt_coexist.BluetoothCoexist)
14354                 return;
14355         if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14356                 return;
14357         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14358                 return;
14359
14360         //
14361         // The following we only consider CSR BC8 and fw version should be >= 62
14362         //
14363         RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
14364                 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
14365         {
14366                 regBTActive = REG_BT_ACTIVE;
14367                 regBTState = REG_BT_STATE;
14368                 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
14369                         regBTPolling = REG_BT_POLLING1;
14370                 else
14371                         regBTPolling = REG_BT_POLLING;
14372         }
14373
14374         BT_Active = rtw_read32(padapter, regBTActive);
14375         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
14376         BT_Active = BT_Active & 0x00ffffff;
14377
14378         BT_State = rtw_read32(padapter, regBTState);
14379         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_State(0x%x)=%x\n", regBTState, BT_State));
14380         BT_State = BT_State & 0x00ffffff;
14381
14382         BT_Polling = rtw_read32(padapter, regBTPolling);
14383         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
14384
14385         Ratio_Act = BT_Active*1000/BT_Polling;
14386         Ratio_STA = BT_State*1000/BT_Polling;
14387
14388         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_Act=%d\n", Ratio_Act));
14389         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_STA=%d\n", Ratio_STA));
14390 }
14391
14392 u8
14393 btdm_IsSingleAnt(
14394         PADAPTER        padapter,
14395         u8              bSingleAntOn,
14396         u8              bInterruptOn,
14397         u8              bMultiNAVOn
14398         )
14399 {
14400         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14401         u8 bRet = _FALSE;
14402
14403         if ((pHalData->bt_coexist.bInterruptOn == bInterruptOn) &&
14404                 (pHalData->bt_coexist.bSingleAntOn == bSingleAntOn) &&
14405                 (pHalData->bt_coexist.bMultiNAVOn == bMultiNAVOn))
14406         {
14407                 bRet = _TRUE;
14408         }
14409
14410         RTPRINT(FBT, BT_TRACE, ("[DM][BT], current SingleAntenna = [%s:%s:%s]\n",
14411                 pHalData->bt_coexist.bSingleAntOn?"ON":"OFF",
14412                 pHalData->bt_coexist.bInterruptOn?"ON":"OFF",
14413                 pHalData->bt_coexist.bMultiNAVOn?"ON":"OFF"));
14414
14415         return bRet;
14416 }
14417
14418 u8 btdm_IsBalance(PADAPTER padapter, u8 bBalanceOn)
14419 {
14420         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14421
14422         RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_IsBalance(), bBalanceOn=%s\n",
14423                 bBalanceOn?"ON":"OFF"));
14424
14425         if (pHalData->bt_coexist.bBalanceOn == bBalanceOn)
14426         {
14427                 return _TRUE;
14428         }
14429         return _FALSE;
14430 }
14431
14432 u8 btdm_EarphoneSpecDetect(PADAPTER padapter)
14433 {
14434         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14435
14436         switch (pHalData->bt_coexist.A2DPState)
14437         {
14438                 case BT_A2DP_STATE_NOT_ENTERED:
14439                         {
14440                                 RTPRINT(FBT, BT_TRACE, (" set default balance = ON, for WLANActH=12, WLANActL=24!!\n"));
14441                                 pHalData->bt_coexist.PreWLANActH = 12;
14442                                 pHalData->bt_coexist.PreWLANActL = 24;
14443                                 pHalData->bt_coexist.WLANActH = 12;
14444                                 pHalData->bt_coexist.WLANActL = 24;
14445                                 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14446                                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14447                                 pHalData->bt_coexist.A2DPState = BT_A2DP_STATE_DETECTING;
14448                         }
14449                         break;
14450
14451                 case BT_A2DP_STATE_DETECTING:
14452                         {
14453                                 // 32,12; the most critical for BT
14454                                 // 12,24
14455                                 // 0,0
14456                                 if (btdm_IsSingleAnt(padapter, _TRUE, _FALSE, _FALSE))
14457                                 {
14458                                         if ((pHalData->bt_coexist.PreWLANActH == 0) &&
14459                                                 (pHalData->bt_coexist.PreWLANActL == 0))
14460                                         {
14461                                                 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [0,0]\n"));
14462                                                 pHalData->bt_coexist.WLANActH = 12;
14463                                                 pHalData->bt_coexist.WLANActL = 24;
14464                                         }
14465                                         else if ((pHalData->bt_coexist.PreWLANActH == 12) &&
14466                                                 (pHalData->bt_coexist.PreWLANActL == 24))
14467                                         {
14468                                                 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [12,24]\n"));
14469                                                 if (((pHalData->bt_coexist.Ratio_Tx>600) &&
14470                                                         (pHalData->bt_coexist.Ratio_PRI>500)) ||
14471                                                         ((pHalData->bt_coexist.Ratio_Tx*10 ) >
14472                                                         (pHalData->bt_coexist.Ratio_PRI*15)))
14473                                                 {
14474                                                         RTPRINT(FBT, BT_TRACE, ("Ratio_Act > 600 && Ratio_STA > 500 or "));
14475                                                         RTPRINT(FBT, BT_TRACE, ("Ratio_Act/Ratio_STA > 1.5\n"));
14476                                                         pHalData->bt_coexist.WLANActH = 12;
14477                                                         pHalData->bt_coexist.WLANActL = 24;
14478                                                 }
14479                                                 else
14480                                                 {
14481                                                         RTPRINT(FBT, BT_TRACE, (" cosa set to 32/12\n "));
14482                                                         pHalData->bt_coexist.WLANActH = 32;
14483                                                         pHalData->bt_coexist.WLANActL = 12;
14484                                                 }
14485                                         }
14486                                         else if ((pHalData->bt_coexist.PreWLANActH == 32) &&
14487                                                         (pHalData->bt_coexist.PreWLANActL == 12))
14488                                         {
14489                                                 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [32,12]\n"));
14490                                                 if (((pHalData->bt_coexist.Ratio_Tx>650) &&
14491                                                         (pHalData->bt_coexist.Ratio_PRI>550)) ||
14492                                                         ((pHalData->bt_coexist.Ratio_Tx*10 ) >
14493                                                         (pHalData->bt_coexist.Ratio_PRI*15)))
14494                                                 {
14495                                                         RTPRINT(FBT, BT_TRACE, ("Ratio_Act > 650 && Ratio_STA > 550 or "));
14496                                                         RTPRINT(FBT, BT_TRACE, ("Ratio_Act/Ratio_STA > 1.5\n"));
14497                                                         pHalData->bt_coexist.WLANActH = 12;
14498                                                         pHalData->bt_coexist.WLANActL = 24;
14499                                                 }
14500                                         }
14501                                         if ((pHalData->bt_coexist.PreWLANActH != pHalData->bt_coexist.WLANActH) ||
14502                                                 (pHalData->bt_coexist.PreWLANActL != pHalData->bt_coexist.WLANActL))
14503                                         {
14504                                                 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14505                                                 pHalData->bt_coexist.PreWLANActH = pHalData->bt_coexist.WLANActH;
14506                                                 pHalData->bt_coexist.PreWLANActL = pHalData->bt_coexist.WLANActL;
14507                                         }
14508                                 }
14509
14510                                 RTPRINT(FBT, BT_TRACE, ("earphone detected result: WLANActH=%d, WLANActL=%d\n",
14511                                         pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL));
14512                         }
14513                         break;
14514
14515                 case BT_A2DP_STATE_DETECTED:
14516                         break;
14517
14518                 default:
14519                         RT_ASSERT(_FALSE, ("btdm_EarphoneSpecDetect(), unknown case\n"));
14520                         break;
14521         }
14522         return _TRUE;
14523 }
14524
14525 //==============================================================
14526 //
14527 // Note:
14528 // In the following, FW should be done before SW mechanism.
14529 //
14530 //==============================================================
14531
14532 void btdm_SCOActionBC81Ant(PADAPTER padapter)
14533 {
14534 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
14535         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
14536         u8      btRssiState;
14537
14538         if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
14539                 !(pmlmepriv->LinkDetectInfo.bBusyTraffic))
14540         {
14541                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink or Wifi is idle\n"));
14542                 if (BTDM_IsSameCoexistState(padapter))
14543                                 return;
14544                 BTDM_Balance(padapter, _FALSE, 0, 0);
14545                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14546         }
14547         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
14548         {
14549                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
14550
14551                 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14552                 {
14553                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14554                         if (BTDM_IsSameCoexistState(padapter))
14555                                 return;
14556                         if ((btRssiState == BT_RSSI_STATE_LOW) ||
14557                                 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14558                         {
14559                                 BTDM_Balance(padapter, _FALSE, 0, 0);
14560                                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14561                         }
14562                 }
14563                 else
14564                 {
14565                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
14566                         if (BTDM_IsSameCoexistState(padapter))
14567                                 return;
14568                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14569                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14570                         {
14571                                 BTDM_Balance(padapter, _FALSE, 0, 0);
14572                                 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14573                         }
14574                         else
14575                         {
14576                                 BTDM_Balance(padapter, _FALSE, 0, 0);
14577                                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14578                         }
14579                 }
14580         }
14581 }
14582
14583 u8 btdm_SCOAction1Ant(PADAPTER padapter)
14584 {
14585         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14586         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14587         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14588
14589         if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
14590         {
14591                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
14592                 btdm_SCOActionBC81Ant(padapter);
14593                 return _TRUE;
14594         }
14595         else
14596         {
14597                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
14598                 return _FALSE;
14599         }
14600 }
14601
14602 void btdm_HIDActionBC81Ant(PADAPTER padapter)
14603 {
14604 #if 0
14605         if (BTDM_IsSameCoexistState(padapter))
14606                 return;
14607 #endif
14608         BTDM_Balance(padapter, _FALSE, 0, 0);
14609         BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14610 }
14611
14612 u8 btdm_HIDAction1Ant(PADAPTER padapter)
14613 {
14614         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
14615         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14616         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14617
14618         if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
14619         {
14620                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
14621                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
14622                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
14623                 btdm_HIDActionBC81Ant(padapter);
14624                 return _TRUE;
14625         }
14626         else
14627         {
14628                 return _FALSE;
14629         }
14630 }
14631
14632 void btdm_A2DPActionBC81Ant(PADAPTER padapter)
14633 {
14634         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14635         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14636         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14637         u8                      btRssiState;
14638
14639         if (pBtMgnt->ExtConfig.bBTBusy)
14640         {
14641                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14642
14643                 // We have to detect BT earphone spec first.
14644                 btdm_EarphoneSpecDetect(padapter);
14645
14646                 if (!BTDM_IsHT40(padapter))
14647                 {
14648                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14649                         if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14650                         {
14651                                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_30, 0);
14652                                 if (BTDM_IsSameCoexistState(padapter))
14653                                         return;
14654
14655                                 if ((btRssiState == BT_RSSI_STATE_LOW) ||
14656                                         (btRssiState == BT_RSSI_STATE_STAY_LOW))
14657                                 {
14658                                         BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14659                                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14660                                 }
14661                         }
14662                         else
14663                         {
14664                                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_55, 0);
14665                                 if (BTDM_IsSameCoexistState(padapter))
14666                                         return;
14667
14668                                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14669                                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14670                                 {
14671                                         BTDM_Balance(padapter, _FALSE, 0, 0);
14672                                         BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14673                                 }
14674                                 else
14675                                 {
14676                                         BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14677                                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14678                                 }
14679                         }
14680                 }
14681                 else
14682                 {
14683                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14684                         if (BTDM_IsSameCoexistState(padapter))
14685                                 return;
14686                         BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14687                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14688                 }
14689         }
14690         else
14691         {
14692                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
14693                 pHalData->bt_coexist.A2DPState = BT_A2DP_STATE_NOT_ENTERED;
14694                 if (pHalData->bt_coexist.Ratio_PRI > 3)
14695                 {
14696                         RTPRINT(FBT, BT_TRACE, ("Ratio_STA > 3\n"));
14697                 BTDM_Balance(padapter, _FALSE, 0, 0);
14698                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14699         }
14700                 else
14701                 {
14702                         RTPRINT(FBT, BT_TRACE, ("Ratio_STA <= 3\n"));
14703                         BTDM_Balance(padapter, _TRUE, 32, 5);
14704                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14705                 }
14706         }
14707 }
14708
14709 u8 btdm_A2DPAction1Ant(PADAPTER padapter)
14710 {
14711         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14712         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
14713         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14714
14715         if (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
14716         {
14717                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
14718                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
14719                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
14720                 btdm_A2DPActionBC81Ant(padapter);
14721                 return _TRUE;
14722         }
14723         else
14724         {
14725                 return _FALSE;
14726         }
14727 }
14728
14729 void btdm_PANActionBC81Ant(PADAPTER padapter)
14730 {
14731 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
14732         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
14733         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
14734         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14735         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14736         u8                      btRssiState;
14737
14738         if (pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn)
14739         {
14740                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14741
14742                 if (!BTDM_IsHT40(padapter))
14743                         {
14744                                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14745                                 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14746                                 {
14747                                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14748                                         if (BTDM_IsSameCoexistState(padapter))
14749                                                 return;
14750
14751                                         if ((btRssiState == BT_RSSI_STATE_LOW) ||
14752                                                 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14753                                         {
14754                                         BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14755                                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14756                                         }
14757                                 }
14758                                 else
14759                                 {
14760                                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_50, 0);
14761                                         if (BTDM_IsSameCoexistState(padapter))
14762                                                 return;
14763                                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14764                                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14765                                         {
14766                                                 BTDM_Balance(padapter, _FALSE, 0, 0);
14767                                                 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14768                                         }
14769                                         else
14770                                         {
14771                                         BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14772                                         BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14773                                 }
14774                         }
14775                 }
14776                 else
14777                 {
14778                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14779                         if ((pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic) &&
14780                                 (pmlmepriv->LinkDetectInfo.bTxBusyTraffic))
14781                         {
14782                                 RTPRINT(FBT, BT_TRACE, ("BT is Downlink and Wifi is Uplink\n"));
14783                                 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14784                                 {
14785                                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14786                                         if (BTDM_IsSameCoexistState(padapter))
14787                                                 return;
14788                                         if ((btRssiState == BT_RSSI_STATE_LOW) ||
14789                                                 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14790                                         {
14791                                                 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14792                                                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14793                                         }
14794                                 }
14795                                 else
14796                                 {
14797                                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
14798                                         if (BTDM_IsSameCoexistState(padapter))
14799                                                 return;
14800                                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14801                                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14802                                         {
14803                                                 BTDM_Balance(padapter, _FALSE, 0, 0);
14804                                                 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14805                                         }
14806                                         else
14807                                         {
14808                                                 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14809                                                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14810                                         }
14811                                 }
14812                         }
14813                         else
14814                         {
14815                                 RTPRINT(FBT, BT_TRACE, ("BT Uplink or BTdownlink+Wifi downlink\n"));
14816                                 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14817                                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14818                         }
14819                 }
14820         }
14821         else if (pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn)
14822         {
14823                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
14824                 BTDM_FWCoexAllOff(padapter);
14825         }
14826         else
14827         {
14828                 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
14829                 BTDM_Balance(padapter, _TRUE, 32, 5);
14830                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14831         }
14832 }
14833
14834 u8 btdm_PANAction1Ant(PADAPTER padapter)
14835 {
14836         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14837         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14838         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14839
14840         if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
14841         {
14842                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
14843                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
14844                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
14845                 btdm_PANActionBC81Ant(padapter);
14846                 return _TRUE;
14847         }
14848         else
14849         {
14850                 return _FALSE;
14851         }
14852 }
14853
14854 void btdm_HIDA2DPActionBC81Ant(PADAPTER padapter)
14855 {
14856         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14857         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14858
14859         if (pBtMgnt->ExtConfig.bBTBusy)
14860         {
14861                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14862                 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14863                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14864         }
14865         else
14866         {
14867                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
14868                 BTDM_Balance(padapter, _FALSE, 0, 0);
14869                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14870         }
14871 }
14872
14873 u8 btdm_HIDA2DPAction1Ant(PADAPTER padapter)
14874 {
14875         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14876
14877         if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14878         {
14879                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14880                 btdm_HIDA2DPActionBC81Ant(padapter);
14881                 return _TRUE;
14882         }
14883         else
14884         {
14885                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14886                 return _FALSE;
14887         }
14888 }
14889
14890 void btdm_HIDPANActionBC81Ant(PADAPTER padapter)
14891 {
14892         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14893         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14894
14895         if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
14896         {
14897                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14898                 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14899                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14900         }
14901         else
14902         {
14903                 RTPRINT(FBT, BT_TRACE, ("BT is idle or [BT 3.0]\n"));
14904                 BTDM_Balance(padapter, _FALSE, 0, 0);
14905                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14906         }
14907 }
14908
14909 u8 btdm_HIDPANAction1Ant(PADAPTER padapter)
14910 {
14911         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14912
14913         if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
14914         {
14915                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14916                 btdm_HIDPANActionBC81Ant(padapter);
14917                 return _TRUE;
14918         }
14919         else
14920         {
14921                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14922                 return _FALSE;
14923         }
14924 }
14925
14926 void btdm_PANA2DPActionBC81Ant(PADAPTER padapter)
14927 {
14928         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14929         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14930
14931         if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
14932         {
14933                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14934                 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14935                 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14936         }
14937         else if ((pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn))
14938         {
14939                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
14940                 btdm_A2DPActionBC81Ant(padapter);
14941         }
14942         else
14943         {
14944                 BTDM_Balance(padapter, _FALSE, 0, 0);
14945                 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14946         }
14947 }
14948
14949 u8 btdm_PANA2DPAction1Ant(PADAPTER padapter)
14950 {
14951         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14952
14953         if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14954         {
14955                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14956                 btdm_PANA2DPActionBC81Ant(padapter);
14957                 return _TRUE;
14958         }
14959         else
14960         {
14961                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14962                 return _FALSE;
14963         }
14964 }
14965
14966 //============================================================
14967 // extern function start with BTDM_
14968 //============================================================
14969
14970 void BTDM_SetAntenna(PADAPTER padapter, u8 who)
14971 {
14972         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
14973         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
14974         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
14975
14976         if (!IS_HARDWARE_TYPE_8192C(padapter))
14977                 return;
14978         if (!pHalData->bt_coexist.BluetoothCoexist)
14979                 return;
14980         if (pBtMgnt->ExtConfig.bManualControl)
14981                 return;
14982         if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14983                 return;
14984         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14985                 return;
14986 //      if (pHalData->bt_coexist.AntennaState == who)
14987 //              return;
14988
14989         switch (who)
14990         {
14991                 case BTDM_ANT_BT_IDLE:
14992                         RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_BT_IDLE\n"));
14993                         BTDM_Balance(padapter, _FALSE, 0, 0);
14994                         BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14995                         pHalData->bt_coexist.AntennaState = BTDM_ANT_BT_IDLE;
14996                         break;
14997
14998                 case BTDM_ANT_WIFI:
14999                         RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_WIFI\n"));
15000                         BTDM_Balance(padapter, _FALSE, 0, 0);
15001                         BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
15002                         rtw_mdelay_os(3);       // 1 will fail, 2 ok
15003                         btdm_WriteReg860(padapter, 0x130);
15004                         pHalData->bt_coexist.AntennaState = BTDM_ANT_WIFI;
15005                         break;
15006
15007                 case BTDM_ANT_BT:
15008                         RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_BT\n"));
15009                         BTDM_Balance(padapter, _FALSE, 0, 0);
15010                         BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
15011                         //btdm_WriteReg860(padapter, 0x230);
15012                         pHalData->bt_coexist.AntennaState = BTDM_ANT_BT;
15013                         break;
15014
15015                 default:
15016                         RT_ASSERT(_FALSE, ("BTDM_SetAntenna(), error case\n"));
15017                         break;
15018         }
15019 }
15020
15021 void
15022 BTDM_SingleAnt(
15023         PADAPTER        padapter,
15024         u8              bSingleAntOn,
15025         u8              bInterruptOn,
15026         u8              bMultiNAVOn
15027         )
15028 {
15029         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15030         u8                      H2C_Parameter[3] = {0};
15031
15032         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
15033                 return;
15034
15035         H2C_Parameter[2] = 0;
15036         H2C_Parameter[1] = 0;
15037         H2C_Parameter[0] = 0;
15038
15039         if (bInterruptOn)
15040         {
15041                 H2C_Parameter[2] |= 0x02;       //BIT1
15042                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15043         }
15044         pHalData->bt_coexist.bInterruptOn = bInterruptOn;
15045
15046         if (bSingleAntOn)
15047         {
15048                 H2C_Parameter[2] |= 0x10;       //BIT4
15049                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15050         }
15051         pHalData->bt_coexist.bSingleAntOn = bSingleAntOn;
15052
15053         if (bMultiNAVOn)
15054         {
15055                 H2C_Parameter[2] |= 0x20;       //BIT5
15056                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15057         }
15058         pHalData->bt_coexist.bMultiNAVOn = bMultiNAVOn;
15059
15060         RTPRINT(FBT, BT_TRACE, ("[DM][BT], SingleAntenna=[%s:%s:%s], write 0xe = 0x%x\n",
15061                 bSingleAntOn?"ON":"OFF", bInterruptOn?"ON":"OFF", bMultiNAVOn?"ON":"OFF",
15062                 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
15063
15064         if (IS_HARDWARE_TYPE_8192C(padapter))
15065         {
15066                 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
15067         }
15068         else if (IS_HARDWARE_TYPE_8192D(padapter))
15069         {
15070                 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
15071         }
15072 }
15073
15074 void BTDM_CheckBTIdleChange1Ant(PADAPTER padapter)
15075 {
15076         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
15077         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15078         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15079 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
15080         u8                              stateChange = _FALSE;
15081         u32                     BT_Polling, Ratio_Act, Ratio_STA;
15082         u32                             BT_Active, BT_State;
15083         u32                             regBTActive=0, regBTState=0, regBTPolling=0;
15084
15085         if (!pHalData->bt_coexist.BluetoothCoexist)
15086                 return;
15087         if (pBtMgnt->ExtConfig.bManualControl)
15088                 return;
15089         if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
15090                 return;
15091         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
15092                 return;
15093
15094         //
15095         // The following we only consider CSR BC8 and fw version should be >= 62
15096         //
15097         RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
15098         pHalData->FirmwareVersion, pHalData->FirmwareVersion));
15099         {
15100                 regBTActive = REG_BT_ACTIVE;
15101                 regBTState = REG_BT_STATE;
15102                 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
15103                         regBTPolling = REG_BT_POLLING1;
15104                 else
15105                         regBTPolling = REG_BT_POLLING;
15106         }
15107
15108         BT_Active = rtw_read32(padapter, regBTActive);
15109         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
15110         BT_Active = BT_Active & 0x00ffffff;
15111
15112         BT_State = rtw_read32(padapter, regBTState);
15113         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_State(0x%x)=%x\n", regBTState, BT_State));
15114         BT_State = BT_State & 0x00ffffff;
15115
15116         BT_Polling = rtw_read32(padapter, regBTPolling);
15117         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
15118
15119         if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
15120                 return;
15121         if (BT_Polling == 0)
15122                 return;
15123
15124         Ratio_Act = BT_Active*1000/BT_Polling;
15125         Ratio_STA = BT_State*1000/BT_Polling;
15126
15127         pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
15128         pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
15129
15130         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_Act=%d\n", Ratio_Act));
15131         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_STA=%d\n", Ratio_STA));
15132
15133         if (Ratio_STA<60 && Ratio_Act<500)      // BT PAN idle
15134         {
15135                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
15136                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
15137                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15138         }
15139         else
15140         {
15141                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
15142
15143                 if (Ratio_STA)
15144                 {
15145                         // Check if BT PAN (under BT 2.1) is uplink or downlink
15146                         if ((Ratio_Act/Ratio_STA) < 2)
15147                         {
15148                                 // BT PAN Uplink
15149                                 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _TRUE;
15150                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_UPLINK;
15151                                 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _FALSE;
15152                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
15153                         }
15154                         else
15155                         {
15156                                 // BT PAN downlink
15157                                 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
15158                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15159                                 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
15160                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
15161                         }
15162                 }
15163                 else
15164                 {
15165                         // BT PAN downlink
15166                         pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
15167                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15168                         pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
15169                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
15170                 }
15171         }
15172
15173         // Check BT is idle or not
15174         if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15175                 pBtMgnt->ExtConfig.NumberOfSCO==0)
15176         {
15177                 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15178                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15179         }
15180         else
15181         {
15182                 if (Ratio_STA<60)
15183                 {
15184                         pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15185                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15186                 }
15187                 else
15188                 {
15189                         pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15190                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15191                 }
15192         }
15193
15194         if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15195                 pBtMgnt->ExtConfig.NumberOfSCO==0)
15196         {
15197                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15198                 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
15199                 BTDM_SetAntenna(padapter, BTDM_ANT_BT_IDLE);
15200         }
15201         else
15202         {
15203                 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
15204                 {
15205                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_RSSI_LOW;
15206                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], core stack notify bt rssi Low\n"));
15207                 }
15208                 else
15209                 {
15210                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15211                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], core stack notify bt rssi Normal\n"));
15212                 }
15213         }
15214
15215         if (pHalData->bt_coexist.bBTBusyTraffic !=
15216                 pBtMgnt->ExtConfig.bBTBusy)
15217         {       // BT idle or BT non-idle
15218                 pHalData->bt_coexist.bBTBusyTraffic = pBtMgnt->ExtConfig.bBTBusy;
15219                 stateChange = _TRUE;
15220         }
15221
15222         if (stateChange)
15223         {
15224                 if (!pBtMgnt->ExtConfig.bBTBusy)
15225                 {
15226                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
15227                 }
15228                 else
15229                 {
15230                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is non-idle\n"));
15231                 }
15232         }
15233         if (!pBtMgnt->ExtConfig.bBTBusy)
15234         {
15235                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
15236 #if 0
15237                 if (MgntRoamingInProgress(pMgntInfo) ||
15238                         MgntIsLinkInProgress(pMgntInfo) ||
15239                         MgntScanInProgress(pMgntInfo))
15240 #else
15241                 if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE)
15242 #endif
15243                 {
15244                         BTDM_SetAntenna(padapter, BTDM_ANT_WIFI);
15245                 }
15246         }
15247 }
15248
15249 void BTDM_BTCoexistWithProfile1Ant(PADAPTER padapter)
15250 {
15251         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15252         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
15253         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15254
15255         if (pBtMgnt->ExtConfig.bManualControl)
15256         {
15257                 btdm_CheckCounterOnly1Ant(padapter);
15258                 return;
15259         }
15260
15261         RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
15262                 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
15263
15264         if ((pHalData->bt_coexist.BluetoothCoexist) &&
15265                 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8))
15266         {
15267                 BTHCI_GetProfileNameMoto(padapter);
15268                 BTHCI_GetBTRSSI(padapter);
15269                 BTDM_CheckBTIdleChange1Ant(padapter);
15270                 BTDM_CheckWiFiState(padapter);
15271
15272                 if (btdm_SCOAction1Ant(padapter))
15273                 {
15274                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action SCO\n"));
15275                 }
15276                 else if (btdm_HIDAction1Ant(padapter))
15277                 {
15278                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID\n"));
15279                 }
15280                 else if (btdm_A2DPAction1Ant(padapter))
15281                 {
15282                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action A2DP\n"));
15283                 }
15284                 else if (btdm_PANAction1Ant(padapter))
15285                 {
15286                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN\n"));
15287                 }
15288                 else if (btdm_HIDA2DPAction1Ant(padapter))
15289                 {
15290                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_A2DP\n"));
15291                 }
15292                 else if (btdm_HIDPANAction1Ant(padapter))
15293                 {
15294                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_PAN\n"));
15295                 }
15296                 else if (btdm_PANA2DPAction1Ant(padapter))
15297                 {
15298                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN_A2DP\n"));
15299                 }
15300                 else
15301                 {
15302                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], No Action case!!!\n"));
15303                 }
15304
15305                 if (!BTDM_IsSameCoexistState(padapter))
15306                 {
15307                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
15308                                 pHalData->bt_coexist.PreviousState,
15309                                 pHalData->bt_coexist.CurrentState));
15310                         pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
15311
15312                         RTPRINT(FBT, BT_TRACE, ("["));
15313                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
15314                                 RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
15315                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
15316                                 RTPRINT(FBT, BT_TRACE, ("HT20, "));
15317                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
15318                                 RTPRINT(FBT, BT_TRACE, ("HT40, "));
15319                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
15320                                 RTPRINT(FBT, BT_TRACE, ("Legacy, "));
15321                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
15322                                 RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
15323                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
15324                                 RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
15325                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
15326                                 RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
15327                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
15328                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
15329                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
15330                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
15331                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
15332                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
15333                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
15334                                 RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
15335                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_IDLE)
15336                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_idle, "));
15337                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_UPLINK)
15338                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_uplink, "));
15339                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_DOWNLINK)
15340                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_downlink, "));
15341                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
15342                                 RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
15343                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
15344                                 RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
15345                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
15346                                 RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
15347                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
15348                                 RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
15349                         RTPRINT(FBT, BT_TRACE, ("]\n"));
15350                 }
15351         }
15352 }
15353
15354 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
15355 #endif
15356
15357 #ifdef __HALBTCCSR2ANT_C__ // HAL/BTCoexist/HalBtcCsr2Ant.c
15358 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
15359
15360 //============================================================
15361 // local function start with btdm_
15362 //============================================================
15363 void
15364 btdm_BtEnableDisableCheck(
15365         PADAPTER        padapter,
15366         u32             BT_Active
15367         )
15368 {
15369         // This function check if 92D bt is disabled
15370         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15371
15372         if (IS_HARDWARE_TYPE_8192D(padapter))
15373         {
15374                 if (BT_Active)
15375                 {
15376                         pHalData->bt_coexist.btActiveZeroCnt = 0;
15377                         pHalData->bt_coexist.bCurBtDisabled = _FALSE;
15378                         RTPRINT(FBT, BT_TRACE, ("92D Bt is enabled !!\n"));
15379                 }
15380                 else
15381                 {
15382                         pHalData->bt_coexist.btActiveZeroCnt++;
15383                         RTPRINT(FBT, BT_TRACE, ("92D BT_Active = 0, cnt = %d!!\n",
15384                                         pHalData->bt_coexist.btActiveZeroCnt));
15385                         if (pHalData->bt_coexist.btActiveZeroCnt >= 2)
15386                         {
15387                                 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
15388                                 RTPRINT(FBT, BT_TRACE, ("92D Bt is disabled !!\n"));
15389                         }
15390                 }
15391                 if (pHalData->bt_coexist.bPreBtDisabled !=
15392                         pHalData->bt_coexist.bCurBtDisabled )
15393                 {
15394                         RTPRINT(FBT, BT_TRACE, ("92D Bt is from %s to %s!!\n",
15395                                 (pHalData->bt_coexist.bPreBtDisabled ? "disabled":"enabled"),
15396                                 (pHalData->bt_coexist.bCurBtDisabled ? "disabled":"enabled")));
15397                         pHalData->bt_coexist.bNeedToRoamForBtDisableEnable = _TRUE;
15398                         pHalData->bt_coexist.bPreBtDisabled = pHalData->bt_coexist.bCurBtDisabled;
15399                 }
15400         }
15401 }
15402
15403 void btdm_CheckBTState2Ant(PADAPTER padapter)
15404 {
15405         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15406 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
15407         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
15408         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15409 //      PRT_HIGH_THROUGHPUT     pHTInfo = GET_HT_INFO(pMgntInfo);
15410         u8                      stateChange = _FALSE;
15411         u32                     BT_Polling, Ratio_Act, Ratio_STA;
15412         u32                     BT_Active, BT_State;
15413         u32                     regBTActive = 0, regBTState = 0, regBTPolling=0;
15414         u32                     btBusyThresh = 0;
15415
15416         RTPRINT(FBT, BT_TRACE, ("FirmwareVersion = 0x%x(%d)\n",
15417         pHalData->FirmwareVersion, pHalData->FirmwareVersion));
15418
15419         if (IS_HARDWARE_TYPE_8192C(padapter))
15420         {
15421                 if (pHalData->FirmwareVersion < FW_VER_BT_REG)
15422                 {
15423                         regBTActive = REG_BT_ACTIVE_OLD;
15424                         regBTState = REG_BT_STATE_OLD;
15425                         regBTPolling = REG_BT_POLLING_OLD;
15426                 }
15427                 else
15428                 {
15429                         regBTActive = REG_BT_ACTIVE;
15430                         regBTState = REG_BT_STATE;
15431                         if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
15432                                 regBTPolling = REG_BT_POLLING1;
15433                         else
15434                                 regBTPolling = REG_BT_POLLING;
15435                 }
15436         }
15437         else if (IS_HARDWARE_TYPE_8192D(padapter))
15438         {
15439                 regBTActive = REG_BT_ACTIVE;
15440                 regBTState = REG_BT_STATE;
15441                 regBTPolling = REG_BT_POLLING1;
15442         }
15443
15444         if (IS_HARDWARE_TYPE_8192D(padapter))
15445         {
15446                 btBusyThresh = 40;
15447         }
15448         else
15449         {
15450                 btBusyThresh = 60;
15451         }
15452
15453         BT_Active = rtw_read32(padapter, regBTActive);
15454         RTPRINT(FBT, BT_TRACE, ("BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
15455         BT_Active = BT_Active & 0x00ffffff;
15456
15457         BT_State = rtw_read32(padapter, regBTState);
15458         RTPRINT(FBT, BT_TRACE, ("BT_State(0x%x)=%x\n", regBTState, BT_State));
15459         BT_State = BT_State & 0x00ffffff;
15460
15461         BT_Polling = rtw_read32(padapter, regBTPolling);
15462         RTPRINT(FBT, BT_TRACE, ("BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
15463
15464         if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
15465                 return;
15466
15467         // 2011/05/04 MH For Slim combo test meet a problem. Surprise remove and WLAN is running
15468         // DHCP process. At the same time, the register read value might be zero. And cause BSOD 0x7f
15469         // EXCEPTION_DIVIDED_BY_ZERO. In This case, the stack content may always be wrong due to
15470         // HW divide trap.
15471         if (BT_Polling==0)
15472                 return;
15473
15474         btdm_BtEnableDisableCheck(padapter, BT_Active);
15475
15476         Ratio_Act = BT_Active*1000/BT_Polling;
15477         Ratio_STA = BT_State*1000/BT_Polling;
15478
15479         pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
15480         pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
15481
15482         RTPRINT(FBT, BT_TRACE, ("Ratio_Act=%d\n", Ratio_Act));
15483         RTPRINT(FBT, BT_TRACE, ("Ratio_STA=%d\n", Ratio_STA));
15484
15485         if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15486         {
15487                 if (Ratio_STA < 60)     // BT PAN idle
15488                 {
15489                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
15490                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
15491                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15492                 }
15493                 else
15494                 {
15495                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
15496
15497                         // Check if BT PAN (under BT 2.1) is uplink or downlink
15498                         if ((Ratio_Act/Ratio_STA) < 2)
15499                         {       // BT PAN Uplink
15500                                 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _TRUE;
15501                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_UPLINK;
15502                                 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _FALSE;
15503                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
15504                         }
15505                         else
15506                         {       // BT PAN downlink
15507                                 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
15508                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15509                                 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
15510                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
15511                         }
15512                 }
15513         }
15514         else
15515         {
15516                 // BC4, doesn't use the following variables.
15517                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
15518                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
15519                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
15520         }
15521
15522
15523         // Check BT is idle or not
15524         if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15525                 pBtMgnt->ExtConfig.NumberOfSCO==0)
15526         {
15527                 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15528                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15529         }
15530         else
15531         {
15532                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15533                 {
15534                         if (Ratio_Act < 20)
15535                         {
15536                                 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15537                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15538                         }
15539                         else
15540                         {
15541                                 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15542                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15543                         }
15544                 }
15545                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15546                 {
15547                         if (Ratio_STA < btBusyThresh)
15548                         {
15549                                 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15550                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15551                         }
15552                         else
15553                         {
15554                                 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15555                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15556                         }
15557
15558                         if ((Ratio_STA < btBusyThresh) ||
15559                                 (Ratio_Act<180 && Ratio_STA<130))
15560                         {
15561                                 pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
15562                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_A2DP_IDLE;
15563                         }
15564                         else
15565                         {
15566                                 pBtMgnt->ExtConfig.bBTA2DPBusy =_TRUE;
15567                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_A2DP_IDLE;
15568                         }
15569                 }
15570         }
15571
15572         if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15573                 pBtMgnt->ExtConfig.NumberOfSCO==0)
15574         {
15575                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15576                 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
15577         }
15578         else
15579         {
15580                 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
15581                 {
15582                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_RSSI_LOW;
15583                         RTPRINT(FBT, BT_TRACE, ("[bt rssi], Low\n"));
15584                 }
15585                 else
15586                 {
15587                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15588                         RTPRINT(FBT, BT_TRACE, ("[bt rssi], Normal\n"));
15589                 }
15590         }
15591
15592         if (pHalData->bt_coexist.bBTBusyTraffic !=
15593                 pBtMgnt->ExtConfig.bBTBusy)
15594         {       // BT idle or BT non-idle
15595                 pHalData->bt_coexist.bBTBusyTraffic = pBtMgnt->ExtConfig.bBTBusy;
15596                 stateChange = _TRUE;
15597         }
15598
15599         if (stateChange)
15600         {
15601                 if (!pBtMgnt->ExtConfig.bBTBusy)
15602                 {
15603                         u8      tempu1Byte;
15604                         RTPRINT(FBT, BT_TRACE, ("[BT] BT is idle or disable\n"));
15605
15606                         tempu1Byte = rtw_read8(padapter, 0x4fd);
15607                         tempu1Byte |= BIT(2);
15608
15609                         rtw_write8(padapter, 0x4fd, tempu1Byte);
15610
15611                         //Resume RF Rx LPF corner
15612                         if (IS_HARDWARE_TYPE_8192D(padapter))
15613                         {
15614                                 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, pHalData->bt_coexist.BtRfRegOrigin1E);
15615                         }
15616                         else
15617                         {
15618                                 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1E);
15619                         }
15620                         BTDM_CoexAllOff(padapter);
15621
15622                         RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n"));
15623
15624                         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15625                 }
15626                 else
15627                 {
15628                         u8      tempu1Byte;
15629                         RTPRINT(FBT, BT_TRACE, ("[BT] BT is non-idle\n"));
15630
15631                         tempu1Byte = rtw_read8(padapter, 0x4fd);
15632                         tempu1Byte &=~ BIT(2);
15633                         rtw_write8(padapter, 0x4fd, tempu1Byte);
15634
15635                         //Shrink RF Rx LPF corner
15636                         if (IS_HARDWARE_TYPE_8192D(padapter))
15637                         {
15638                                 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, 0xf2ff7);
15639                         }
15640                         else
15641                         {
15642                                 //Shrink RF Rx LPF corner, 0x1e[7:4]=1111
15643                                 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, 0xf);
15644                         }
15645                 }
15646         }
15647
15648         if (stateChange)
15649         {
15650                 if (pBtMgnt->ExtConfig.bBTBusy)
15651                 {
15652                         BTDM_RejectAPAggregatedPacket(padapter, _TRUE);
15653                 }
15654                 else
15655                 {
15656                         BTDM_RejectAPAggregatedPacket(padapter, _FALSE);
15657                 }
15658         }
15659 }
15660
15661 void btdm_WLANActOff(PADAPTER padapter)
15662 {
15663         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15664
15665         //Only used in BC4 setting
15666         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15667         BTDM_Balance(padapter, _FALSE, 0, 0);
15668         BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
15669 }
15670
15671 void btdm_WLANActBTPrecedence(PADAPTER padapter)
15672 {
15673         BTDM_Balance(padapter, _FALSE, 0, 0);
15674         BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
15675
15676         rtw_write32(padapter, 0x6c4,0x55555555);
15677         rtw_write32(padapter, 0x6c8,0x000000f0);
15678         rtw_write32(padapter, 0x6cc,0x40000010);
15679         rtw_write8(padapter, REG_GPIO_MUXCFG, 0xa0);
15680 }
15681
15682 //==============================================================
15683 //
15684 // Note:
15685 // In the following, FW should be done before SW mechanism.
15686 // BTDM_Balance(), BTDM_DiminishWiFi(), BT_NAV() should be done
15687 // before BTDM_AGCTable(), BTDM_BBBackOffLevel(), btdm_DacSwing().
15688 //
15689 //==============================================================
15690
15691 void btdm_DacSwing(PADAPTER padapter, u8 type)
15692 {
15693         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15694
15695         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
15696                 return;
15697
15698         if (type == BT_DACSWING_OFF)
15699         {
15700                 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing Off!\n"));
15701                 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x30);
15702         }
15703         else if (type == BT_DACSWING_M4)
15704         {
15705                 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW)
15706                 {
15707                         RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4 original, but Low RSSI!\n"));
15708                         PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
15709                 }
15710                 else
15711                 {
15712                         RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4!\n"));
15713                         PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x20);
15714                 }
15715         }
15716         else if (type == BT_DACSWING_M7)
15717         {
15718                 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -7!\n"));
15719                 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
15720         }
15721         else if (type == BT_DACSWING_M10)
15722         {
15723                 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -10!\n"));
15724                 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x10);
15725         }
15726
15727         if (type != BT_DACSWING_OFF)
15728                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
15729 }
15730
15731 void btdm_A2DPActionBC42Ant(PADAPTER padapter)
15732 {
15733 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
15734         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15735         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
15736         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15737         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15738         u8                      btRssiState;
15739
15740         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15741
15742         if (pBtMgnt->ExtConfig.bBTBusy)
15743         {
15744                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15745
15746                 if (BTDM_IsHT40(padapter))
15747                 {
15748                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15749                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15750                                 return;
15751 #if 0
15752                         // Do the FW mechanism first
15753                         BTDM_FWCoexAllOff(padapter);
15754 #else
15755                         // Do the FW mechanism first
15756                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15757                         {
15758                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15759                                 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15760                                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
15761                         }
15762                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15763                         {
15764                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15765                                 BTDM_FWCoexAllOff(padapter);
15766                         }
15767 #endif
15768                         // Then do the SW mechanism
15769                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15770                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15771                         btdm_DacSwing(padapter, BT_DACSWING_M4);
15772                 }
15773                 else
15774                 {
15775                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15776                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15777                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15778                                 return;
15779 #if 0
15780                         // Do the FW mechanism first
15781                         BTDM_FWCoexAllOff(padapter);
15782 #else
15783                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15784                         {
15785                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15786                                 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15787                                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
15788                         }
15789                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15790                         {
15791                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15792                                 BTDM_FWCoexAllOff(padapter);
15793                         }
15794 #endif
15795                         // Then do the SW mechanism
15796                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15797                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15798                         {
15799                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15800                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15801                                 btdm_DacSwing(padapter, BT_DACSWING_M4);
15802                         }
15803                         else
15804                         {
15805                                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15806                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15807                                 btdm_DacSwing(padapter, BT_DACSWING_M4);
15808                         }
15809                 }
15810         }
15811         else
15812         {
15813                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
15814                 BTDM_CoexAllOff(padapter);
15815         }
15816 }
15817
15818 void btdm_A2DPActionBC82Ant(PADAPTER padapter)
15819 {
15820 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
15821         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15822         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
15823         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15824         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15825         u8                      btRssiState;
15826
15827         if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15828         {
15829                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15830                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15831                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15832                         return;
15833
15834                 // Do the FW mechanism first
15835                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15836                 {
15837                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15838                         BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15839                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15840                 }
15841                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15842                 {
15843                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15844                         BTDM_Balance(padapter, _TRUE, 0x10, 0x18);
15845                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15846                 }
15847
15848                 // Then do the SW mechanism
15849                 if (BTDM_IsHT40(padapter))
15850                 {
15851                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15852                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15853                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15854                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
15855                 }
15856                 else
15857                 {
15858                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15859                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15860                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15861                         {
15862                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15863                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15864                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15865                         }
15866                         else
15867                         {
15868                                 BTDM_SWCoexAllOff(padapter);
15869                         }
15870                 }
15871         }
15872         else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
15873         {
15874                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15875                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15876                         return;
15877
15878                 // Do the FW mechanism first
15879                 BTDM_Balance(padapter, _FALSE, 0, 0);
15880                 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15881
15882                 // Then do the SW mechanism
15883                 BTDM_SWCoexAllOff(padapter);
15884         }
15885         else
15886         {
15887                 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
15888                 BTDM_CoexAllOff(padapter);
15889         }
15890 }
15891
15892 void btdm_A2DPActionBC82Ant92d(PADAPTER padapter)
15893 {
15894 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
15895         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15896         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
15897         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15898         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15899         u8                      btRssiState, rssiState1;
15900
15901         if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15902         {
15903                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15904                 if (BTDM_IsHT40(padapter))
15905                 {
15906                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15907                         rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15908                 }
15909                 else
15910                 {
15911                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15912                         if (BTDM_IsWifiUplink(padapter))
15913                         {
15914                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15915                                 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
15916                         }
15917                         else if (BTDM_IsWifiDownlink(padapter))
15918                         {
15919                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15920                                 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_40, 0);
15921                         }
15922                 }
15923                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15924                 if (!BTDM_IsCoexistStateChanged(padapter))
15925                         return;
15926
15927                 // Do the FW mechanism first
15928                 if (BTDM_IsWifiUplink(padapter))
15929                 {
15930                         BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15931                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15932                 }
15933                 else if (BTDM_IsWifiDownlink(padapter))
15934                 {
15935                         BTDM_Balance(padapter, _TRUE, 0x10, 0x18);
15936                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15937                 }
15938
15939                 // Then do the SW mechanism
15940                 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15941                         (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15942                 {
15943                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15944                 }
15945                 else
15946                 {
15947                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15948                 }
15949
15950                 if (BTDM_IsHT40(padapter))
15951                 {
15952                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15953                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
15954                 }
15955                 else
15956                 {
15957                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15958                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15959                         {
15960                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15961                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15962                         }
15963                         else
15964                         {
15965                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15966                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15967                         }
15968                 }
15969         }
15970         else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
15971         {
15972                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15973                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15974                         return;
15975
15976                 // Do the FW mechanism first
15977                 BTDM_Balance(padapter, _FALSE, 0, 0);
15978                 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15979
15980                 // Then do the SW mechanism
15981                 BTDM_SWCoexAllOff(padapter);
15982         }
15983         else
15984         {
15985                 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
15986                 BTDM_CoexAllOff(padapter);
15987         }
15988 }
15989
15990 u8 btdm_A2DPAction2Ant(PADAPTER padapter)
15991 {
15992         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
15993         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
15994         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
15995         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
15996         u8                      bEnter = _FALSE;
15997
15998         if (pBtDbg->dbgCtrl == _TRUE )
15999         {
16000                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
16001                         bEnter = _TRUE;
16002         }
16003         else
16004         {
16005                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
16006                         bEnter = _TRUE;
16007         }
16008
16009         if (bEnter)
16010         {
16011                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_A2DPAction2Ant(), "));
16012                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
16013                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
16014                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
16015
16016                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16017                 {
16018                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16019                         btdm_A2DPActionBC42Ant(padapter);
16020                 }
16021                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16022                 {
16023                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16024                         if (IS_HARDWARE_TYPE_8192D(padapter))
16025                                 btdm_A2DPActionBC82Ant92d(padapter);
16026                         else
16027                                 btdm_A2DPActionBC82Ant(padapter);
16028                 }
16029                 return _TRUE;
16030         }
16031         else
16032         {
16033                 return _FALSE;
16034         }
16035 }
16036
16037 void btdm_PANActionBC42Ant(PADAPTER padapter)
16038 {
16039 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16040         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16041         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16042         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16043         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16044
16045         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16046                 return;
16047
16048         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
16049
16050         if (pBtMgnt->BtOperationOn)
16051         {
16052                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16053                 BTDM_Balance(padapter, _FALSE, 0, 0);
16054                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
16055         }
16056         else
16057         {
16058                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16059                 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16060                 {
16061                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16062                         BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
16063                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16064                 }
16065                 else
16066                 {
16067                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16068                         BTDM_Balance(padapter, _FALSE, 0, 0);
16069                         BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
16070                 }
16071         }
16072         BTDM_SWCoexAllOff(padapter);
16073 }
16074
16075 void btdm_PANActionBC82Ant(PADAPTER padapter)
16076 {
16077 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16078         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16079         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
16080         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16081         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16082         u8                      btRssiState;
16083
16084         if (pBtMgnt->BtOperationOn)
16085         {
16086                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16087                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16088                         return;
16089
16090                 BTDM_CoexAllOff(padapter);
16091         }
16092         else
16093         {
16094                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16095                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 3, BT_FW_COEX_THRESH_25, BT_FW_COEX_THRESH_50);
16096                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16097                         return;
16098
16099                 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16100                 {
16101                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16102
16103                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16104                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16105                         {
16106                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
16107                                 // Do the FW mechanism first
16108                                 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16109                                 {
16110                                         RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16111                                         BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16112                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16113                                 }
16114                                 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16115                                 {
16116                                         RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16117                                         BTDM_FWCoexAllOff(padapter);
16118                                 }
16119                                 // Then do the SW mechanism
16120                                 if (BTDM_IsHT40(padapter))
16121                                 {
16122                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16123                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16124                                 }
16125                                 else
16126                                 {
16127                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16128                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16129                                 }
16130                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16131                                 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16132                                 {
16133                                         RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16134                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
16135                                 }
16136                                 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16137                                 {
16138                                         RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16139                                         btdm_DacSwing(padapter, BT_DACSWING_M4);
16140                                 }
16141                         }
16142                         else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
16143                                 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
16144                         {
16145                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
16146                                 // Do the FW mechanism first
16147                                 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16148
16149                                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16150                                 {
16151                                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16152                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16153                                 }
16154                                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16155                                 {
16156                                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16157                                         if (BTDM_IsHT40(padapter))
16158                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16159                                         else
16160                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16161                                 }
16162                                 // Then do the SW mechanism
16163                                 if (BTDM_IsHT40(padapter))
16164                                 {
16165                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16166                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16167                                 }
16168                                 else
16169                                 {
16170                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16171                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16172                                 }
16173                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16174                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16175                         }
16176                         else
16177                         {
16178                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
16179                                 // Do the FW mechanism first
16180                                 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16181
16182                                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16183                                 {
16184                                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16185                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16186                                 }
16187                                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16188                                 {
16189                                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16190                                         if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16191                                         {
16192                                                 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16193                                                 if (BTDM_IsHT40(padapter))
16194                                                 {
16195                                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16196                                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16197                                                 }
16198                                                 else
16199                                                 {
16200                                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16201                                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16202                                                 }
16203                                         }
16204                                         else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16205                                         {
16206                                                 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16207                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16208                                         }
16209                                 }
16210                                 // Then do the SW mechanism
16211                                 BTDM_SWCoexAllOff(padapter);
16212                         }
16213                 }
16214                 else if (pBtMgnt->ExtConfig.bBTBusy &&
16215                                 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
16216                                 (BTDM_GetRxSS(padapter) < 30))
16217                 {
16218                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is idle!\n"));
16219                         RTPRINT(FBT, BT_TRACE, ("RSSI < 30\n"));
16220                         // Do the FW mechanism first
16221                         BTDM_Balance(padapter, _TRUE, 0x0a, 0x20);
16222                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16223                         // Then do the SW mechanism
16224                         BTDM_SWCoexAllOff(padapter);
16225                 }
16226                 else
16227                 {
16228                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16229                         BTDM_CoexAllOff(padapter);
16230                 }
16231         }
16232 }
16233
16234 void btdm_PANActionBC82Ant92d(PADAPTER padapter)
16235 {
16236 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16237         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16238         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
16239         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16240         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16241         u8                      btRssiState, rssiState1;
16242
16243         if (pBtMgnt->BtOperationOn)
16244         {
16245                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16246                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16247                         return;
16248
16249                 BTDM_CoexAllOff(padapter);
16250         }
16251         else
16252         {
16253                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16254                 if (BTDM_IsHT40(padapter))
16255                 {
16256                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16257                         rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16258                 }
16259                 else
16260                 {
16261                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16262                         rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
16263                 }
16264                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 3, BT_FW_COEX_THRESH_25, BT_FW_COEX_THRESH_50);
16265                 if (!BTDM_IsCoexistStateChanged(padapter))
16266                         return;
16267
16268                 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16269                 {
16270                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16271
16272                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16273                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16274                         {
16275                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
16276                                 // Do the FW mechanism first
16277                                 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16278                                 {
16279                                         RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16280                                         BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16281                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16282                                 }
16283                                 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16284                                 {
16285                                         RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16286                                         BTDM_FWCoexAllOff(padapter);
16287                                 }
16288                                 // Then do the SW mechanism
16289                                 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16290                                         (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16291                                 {
16292                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16293                                 }
16294                                 else
16295                                 {
16296                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16297                                 }
16298                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16299                                 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16300                                 {
16301                                         RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16302                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
16303                                 }
16304                                 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16305                                 {
16306                                         RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16307                                         btdm_DacSwing(padapter, BT_DACSWING_M4);
16308                                 }
16309                         }
16310                         else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
16311                                 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
16312                         {
16313                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
16314                                 // Do the FW mechanism first
16315                                 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16316
16317                                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16318                                 {
16319                                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16320                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16321                                 }
16322                                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16323                                 {
16324                                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16325                                         if (BTDM_IsHT40(padapter))
16326                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16327                                         else
16328                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16329                                 }
16330                                 // Then do the SW mechanism
16331                                 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16332                                         (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16333                                 {
16334                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16335                                 }
16336                                 else
16337                                 {
16338                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16339                                 }
16340                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16341                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16342                         }
16343                         else
16344                         {
16345                                 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
16346                                 // Do the FW mechanism first
16347                                 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16348
16349                                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16350                                 {
16351                                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16352                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16353                                 }
16354                                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16355                                 {
16356                                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16357                                         if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16358                                         {
16359                                                 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16360                                                 if (BTDM_IsHT40(padapter))
16361                                                 {
16362                                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16363                                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16364                                                 }
16365                                                 else
16366                                                 {
16367                                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16368                                                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16369                                                 }
16370                                         }
16371                                         else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16372                                         {
16373                                                 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16374                                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16375                                         }
16376                                 }
16377                                 // Then do the SW mechanism
16378                                 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16379                                         (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16380                                 {
16381                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16382                                 }
16383                                 else
16384                                 {
16385                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16386                                 }
16387                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16388                                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16389                         }
16390                 }
16391                 else if (pBtMgnt->ExtConfig.bBTBusy &&
16392                                 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
16393                                 (BTDM_GetRxSS(padapter) < 30))
16394                 {
16395                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is idle!\n"));
16396                         RTPRINT(FBT, BT_TRACE, ("RSSI < 30\n"));
16397                         // Do the FW mechanism first
16398                         BTDM_Balance(padapter, _TRUE, 0x0a, 0x20);
16399                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16400                         // Then do the SW mechanism
16401                         BTDM_SWCoexAllOff(padapter);
16402                 }
16403                 else
16404                 {
16405                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16406                         BTDM_CoexAllOff(padapter);
16407                 }
16408         }
16409 }
16410
16411 u8 btdm_PANAction2Ant(PADAPTER padapter)
16412 {
16413         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16414         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16415         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16416         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
16417         u8                      bEnter = _FALSE;
16418
16419         if (pBtDbg->dbgCtrl == _TRUE )
16420         {
16421                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
16422                         bEnter = _TRUE;
16423         }
16424         else
16425         {
16426                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
16427                         bEnter = _TRUE;
16428         }
16429
16430         if (bEnter)
16431         {
16432                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_PANAction2Ant(), "));
16433                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
16434                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
16435                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
16436
16437                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16438                 {
16439                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16440                         btdm_PANActionBC42Ant(padapter);
16441                 }
16442                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16443                 {
16444                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16445                         if (IS_HARDWARE_TYPE_8192D(padapter))
16446                                 btdm_PANActionBC82Ant92d(padapter);
16447                         else
16448                         btdm_PANActionBC82Ant(padapter);
16449                 }
16450                 return _TRUE;
16451         }
16452         else
16453         {
16454                 return _FALSE;
16455         }
16456 }
16457
16458 void btdm_HIDActionBC42Ant(PADAPTER padapter)
16459 {
16460 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16461         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16462         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16463
16464         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16465                 return;
16466
16467         if (BTDM_Legacy(padapter))
16468         {
16469                 RTPRINT(FBT, BT_TRACE, ("Current Wireless Mode is B/G\n"));
16470                 btdm_WLANActBTPrecedence(padapter);
16471         }
16472         else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16473         {
16474                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16475                 btdm_WLANActBTPrecedence(padapter);
16476         }
16477         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16478         {
16479                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16480                 btdm_WLANActOff(padapter);
16481         }
16482         else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
16483         {
16484                 RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
16485                 btdm_WLANActOff(padapter);
16486         }
16487         BTDM_SWCoexAllOff(padapter);
16488 }
16489
16490 void btdm_HIDActionBC82Ant(PADAPTER padapter)
16491 {
16492 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16493         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16494         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
16495         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16496         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16497         u8                      btRssiState;
16498
16499 #ifdef CONFIG_USB_HCI
16500         if (pHalData->CustomerID == RT_CID_PLANEX)
16501         {
16502                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16503                         return;
16504                 btdm_HIDActionBC42Ant(padapter);
16505                 return;
16506         }
16507 #endif
16508
16509         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16510         {
16511                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
16512         }
16513         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16514         {
16515                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
16516         }
16517
16518         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16519                 return;
16520
16521         if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16522         {
16523                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16524                 // Do the FW mechanism first
16525                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16526                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16527                 {
16528                         BTDM_FWCoexAllOff(padapter);
16529                 }
16530                 else
16531                 {
16532                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16533                         {
16534                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16535                                 BTDM_Balance(padapter, _FALSE, 0, 0);
16536                                 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
16537                         }
16538                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16539                         {
16540                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16541                                 BTDM_Balance(padapter, _TRUE, 0x15, 0x15);
16542                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x30, BT_FW_NAV_OFF);
16543                         }
16544                 }
16545                 // Then do the SW mechanism
16546                 BTDM_SWCoexAllOff(padapter);
16547         }
16548         else
16549         {
16550                 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16551                 BTDM_CoexAllOff(padapter);
16552         }
16553 }
16554
16555 void btdm_HIDActionBC82Ant92d(PADAPTER padapter)
16556 {
16557 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16558         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16559         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
16560         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16561         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16562         u8                      btRssiState;
16563
16564         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16565         {
16566                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
16567         }
16568         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16569         {
16570                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
16571         }
16572
16573         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16574                 return;
16575
16576         if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16577         {
16578                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16579                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16580                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16581                 {
16582                         // Do the FW mechanism first
16583                         BTDM_FWCoexAllOff(padapter);
16584
16585                         // Then do the SW mechanism
16586                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16587                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16588                         btdm_DacSwing(padapter, BT_DACSWING_M4);
16589                 }
16590                 else
16591                 {
16592                         // Do the FW mechanism first
16593                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16594                         {
16595                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16596                                 BTDM_Balance(padapter, _FALSE, 0, 0);
16597                                 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
16598                         }
16599                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16600                         {
16601                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16602                                 BTDM_Balance(padapter, _TRUE, 0x15, 0x15);
16603                                 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x30, BT_FW_NAV_OFF);
16604                         }
16605                         // Then do the SW mechanism
16606                         BTDM_SWCoexAllOff(padapter);
16607                 }
16608         }
16609         else
16610         {
16611                 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16612                 BTDM_CoexAllOff(padapter);
16613         }
16614 }
16615
16616 u8 btdm_HIDAction2Ant(PADAPTER padapter)
16617 {
16618         PBT30Info               pBTInfo = GET_BT_INFO(padapter) ;
16619         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16620         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
16621         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16622         u8                      bEnter = _FALSE;
16623
16624         if (pBtDbg->dbgCtrl == _TRUE )
16625         {
16626                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
16627                         bEnter = _TRUE;
16628         }
16629         else
16630         {
16631                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
16632                         bEnter = _TRUE;
16633         }
16634
16635         if (bEnter)
16636         {
16637                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDAction2Ant(), "));
16638                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
16639                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
16640                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
16641
16642                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16643                 {
16644                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16645                         btdm_HIDActionBC42Ant(padapter);
16646                 }
16647                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16648                 {
16649                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16650                         if (IS_HARDWARE_TYPE_8192D(padapter))
16651                                 btdm_HIDActionBC82Ant92d(padapter);
16652                         else
16653                         btdm_HIDActionBC42Ant(padapter);
16654                 }
16655                 return _TRUE;
16656         }
16657         else
16658         {
16659                 return _FALSE;
16660         }
16661 }
16662
16663 void btdm_SCOActionBC42Ant(PADAPTER padapter)
16664 {
16665         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16666
16667         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16668                 return;
16669
16670         btdm_WLANActOff(padapter);
16671         BTDM_SWCoexAllOff(padapter);
16672 }
16673
16674 void btdm_SCOActionBC82Ant(PADAPTER padapter)
16675 {
16676         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16677         u8      btRssiState;
16678
16679         if (BTDM_IsHT40(padapter))
16680         {
16681                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16682                         return;
16683
16684                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16685                 // Do the FW mechanism first
16686                 BTDM_Balance(padapter, _FALSE, 0, 0);
16687                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
16688
16689                 // Then do the SW mechanism
16690                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16691                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16692                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16693         }
16694         else
16695         {
16696                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16697                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16698                         return;
16699
16700                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16701                 // Do the FW mechanism first
16702                 BTDM_Balance(padapter, _FALSE, 0, 0);
16703                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
16704
16705                 // Then do the SW mechanism
16706                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16707                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16708                 {
16709                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16710                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16711                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
16712                 }
16713                 else
16714                 {
16715                         BTDM_SWCoexAllOff(padapter);
16716                 }
16717         }
16718 }
16719
16720 void btdm_SCOActionBC82Ant92d(PADAPTER padapter)
16721 {
16722         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16723         u8      btRssiState, rssiState1;
16724
16725         rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16726         if (BTDM_IsHT40(padapter))
16727         {
16728                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16729                         return;
16730
16731                 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16732                 // Do the FW mechanism first
16733                 BTDM_Balance(padapter, _FALSE, 0, 0);
16734                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
16735
16736                 // Then do the SW mechanism
16737                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16738                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16739                 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16740         }
16741         else
16742         {
16743                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16744                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16745                         return;
16746
16747                 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16748                 // Do the FW mechanism first
16749                 BTDM_Balance(padapter, _FALSE, 0, 0);
16750                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
16751
16752                 // Then do the SW mechanism
16753                 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16754                         (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16755                 {
16756                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16757                 }
16758                 else
16759                 {
16760                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16761                 }
16762                 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16763                         (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16764                 {
16765                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16766                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
16767                 }
16768                 else
16769                 {
16770                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16771                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
16772                 }
16773         }
16774 }
16775
16776 u8 btdm_SCOAction2Ant(PADAPTER padapter)
16777 {
16778         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16779         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16780         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16781         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
16782         u8                      bEnter = _FALSE;
16783
16784         if (pBtDbg->dbgCtrl == _TRUE )
16785         {
16786                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
16787                         bEnter = _TRUE;
16788         }
16789         else
16790         {
16791                 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
16792                         bEnter = _TRUE;
16793         }
16794         if (bEnter)
16795         {
16796                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_SCOAction2Ant(), "));
16797                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
16798
16799                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16800                 {
16801                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16802                         btdm_SCOActionBC42Ant(padapter);
16803                 }
16804                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16805                 {
16806                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16807                         if (IS_HARDWARE_TYPE_8192D(padapter))
16808                                 btdm_SCOActionBC82Ant92d(padapter);
16809                         else
16810                         btdm_SCOActionBC82Ant(padapter);
16811                 }
16812                 return _TRUE;
16813         }
16814         else
16815         {
16816                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
16817                 return _FALSE;
16818         }
16819 }
16820
16821 void btdm_HIDA2DPActionBC42Ant(PADAPTER padapter)
16822 {
16823 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
16824         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16825         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16826         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16827         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16828         u8                      btRssiState;
16829
16830         if (pBtMgnt->ExtConfig.bBTBusy)
16831         {
16832                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16833
16834                 if (BTDM_IsHT40(padapter))
16835                 {
16836                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16837                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16838                                 return;
16839 #if 0
16840                         // Do the FW mechanism first
16841                         BTDM_FWCoexAllOff(padapter);
16842 #else
16843                         // Do the FW mechanism first
16844                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16845                         {
16846                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16847                                 BTDM_Balance(padapter, _TRUE, 0x7, 0x20);
16848                                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
16849                         }
16850                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16851                         {
16852                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16853                                 BTDM_FWCoexAllOff(padapter);
16854                         }
16855 #endif
16856                         // Then do the SW mechanism
16857                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16858                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16859                         btdm_DacSwing(padapter, BT_DACSWING_M7);
16860                 }
16861                 else
16862                 {
16863                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16864                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16865                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16866                                 return;
16867 #if 0
16868                         // Do the FW mechanism first
16869                         BTDM_FWCoexAllOff(padapter);
16870 #else
16871                         // Do the FW mechanism first
16872                         if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16873                         {
16874                                 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16875                                 BTDM_Balance(padapter, _TRUE, 0x7, 0x20);
16876                                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
16877                         }
16878                         else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16879                         {
16880                                 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16881                                 BTDM_FWCoexAllOff(padapter);
16882                         }
16883 #endif
16884
16885                         // Then do the SW mechanism
16886                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16887                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16888                         {
16889                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16890                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16891                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
16892                         }
16893                         else
16894                         {
16895                                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16896                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16897                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
16898                         }
16899                 }
16900         }
16901         else
16902         {
16903                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16904                 BTDM_CoexAllOff(padapter);
16905         }
16906 }
16907
16908 void btdm_HIDA2DPActionBC82Ant(PADAPTER padapter)
16909 {
16910         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16911         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16912         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16913         u8                      btRssiState;
16914
16915         if (pBtMgnt->ExtConfig.bBTBusy)
16916         {
16917                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16918
16919                 if (BTDM_IsHT40(padapter))
16920                 {
16921                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16922                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16923                                 return;
16924
16925                         // Do the FW mechanism first
16926                         BTDM_FWCoexAllOff(padapter);
16927
16928                         // Then do the SW mechanism
16929                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16930                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16931                         btdm_DacSwing(padapter, BT_DACSWING_M7);
16932                 }
16933                 else
16934                 {
16935                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16936                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16937                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16938                                 return;
16939
16940                         BTDM_FWCoexAllOff(padapter);
16941
16942                         // Then do the SW mechanism
16943                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16944                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16945                         {
16946                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16947                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16948                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
16949                         }
16950                         else
16951                         {
16952                                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16953                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16954                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
16955                         }
16956                 }
16957         }
16958         else
16959         {
16960                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16961                 BTDM_CoexAllOff(padapter);
16962         }
16963 }
16964
16965 void btdm_HIDA2DPActionBC82Ant92d(PADAPTER padapter)
16966 {
16967         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
16968         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
16969         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
16970         u8                      btRssiState, rssiState1;
16971
16972         rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_35, 0);
16973         if (pBtMgnt->ExtConfig.bBTBusy)
16974         {
16975                 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16976
16977                 if (BTDM_IsHT40(padapter))
16978                 {
16979                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16980                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16981                                 return;
16982
16983                         // Do the FW mechanism first
16984                         BTDM_FWCoexAllOff(padapter);
16985
16986                         // Then do the SW mechanism
16987                         if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16988                                 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16989                         {
16990                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16991                         }
16992                         else
16993                         {
16994                                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16995                         }
16996                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16997                         btdm_DacSwing(padapter, BT_DACSWING_M7);
16998                 }
16999                 else
17000                 {
17001                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
17002                         btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
17003                         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17004                                 return;
17005
17006                         BTDM_FWCoexAllOff(padapter);
17007
17008                         // Then do the SW mechanism
17009                         if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
17010                                 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
17011                         {
17012                                 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
17013                         }
17014                         else
17015                         {
17016                                 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17017                         }
17018                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17019                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17020                         {
17021                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17022                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
17023                         }
17024                         else
17025                         {
17026                                 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17027                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
17028                         }
17029                 }
17030         }
17031         else
17032         {
17033                 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
17034                 BTDM_CoexAllOff(padapter);
17035         }
17036 }
17037
17038 u8 btdm_HIDA2DPAction2Ant(PADAPTER padapter)
17039 {
17040         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17041         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17042         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
17043         u8                      bEnter = _FALSE;
17044
17045         if (pBtDbg->dbgCtrl == _TRUE )
17046         {
17047                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
17048                         bEnter = _TRUE;
17049         }
17050         else
17051         {
17052                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
17053                         bEnter = _TRUE;
17054         }
17055
17056         if (bEnter)
17057         {
17058                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDA2DPAction2Ant(), "));
17059                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
17060
17061                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17062                 {
17063                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17064                         btdm_HIDA2DPActionBC42Ant(padapter);
17065                 }
17066                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17067                 {
17068                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17069                         if (IS_HARDWARE_TYPE_8192D(padapter))
17070                                 btdm_HIDA2DPActionBC82Ant92d(padapter);
17071                         else
17072                         btdm_HIDA2DPActionBC82Ant(padapter);
17073                 }
17074                 return _TRUE;
17075         }
17076         else
17077         {
17078                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
17079                 return _FALSE;
17080         }
17081 }
17082
17083 void btdm_HIDPANActionBC42Ant(PADAPTER padapter)
17084 {
17085 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
17086         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
17087         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17088         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
17089         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17090
17091         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17092                 return;
17093
17094         if (pBtMgnt->BtOperationOn)
17095         {
17096                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17097                         btdm_WLANActBTPrecedence(padapter);
17098                 }
17099         else
17100         {
17101                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17102                 if (BTDM_Legacy(padapter))
17103                 {
17104                         RTPRINT(FBT, BT_TRACE, ("B/G mode \n"));
17105                         btdm_WLANActBTPrecedence(padapter);
17106                 }
17107                 else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
17108                 {
17109                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink \n"));
17110                         btdm_WLANActBTPrecedence(padapter);
17111                 }
17112                 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
17113                 {
17114                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink \n"));
17115                         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
17116                         BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
17117                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17118                 }
17119                 else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
17120                 {
17121                         RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
17122                         btdm_WLANActOff(padapter);
17123                 }
17124         }
17125         BTDM_SWCoexAllOff(padapter);
17126 }
17127
17128 void btdm_HIDPANActionBC82Ant(PADAPTER padapter)
17129 {
17130 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
17131         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17132         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
17133         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17134         u8                      btRssiState;
17135
17136         if (!pBtMgnt->BtOperationOn)
17137         {
17138                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17139
17140                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
17141                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17142                         return;
17143
17144                 if ((pBtMgnt->ExtConfig.bBTBusy && padapter->mlmepriv.LinkDetectInfo.bBusyTraffic))
17145                 {
17146                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
17147
17148                         // Do the FW mechanism first
17149                         if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
17150                         {
17151                                 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
17152                                 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
17153                         }
17154                         else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
17155                         {
17156                                 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
17157                                 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
17158                         }
17159                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17160
17161                         // Then do the SW mechanism
17162                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17163                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17164                         {
17165                                 if (BTDM_IsHT40(padapter))
17166                                 {
17167                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
17168                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17169                                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17170                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17171                                 }
17172                                 else
17173                                 {
17174                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
17175                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
17176                                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17177                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17178                                 }
17179                         }
17180                         else
17181                         {
17182                                 BTDM_SWCoexAllOff(padapter);
17183                         }
17184                 }
17185                 else
17186                 {
17187                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
17188                         BTDM_CoexAllOff(padapter);
17189                 }
17190         }
17191         else
17192         {
17193                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17194 #ifdef CONFIG_USB_HCI
17195                 if (BTDM_IsWifiUplink(padapter))
17196                 {
17197                         RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
17198                         btdm_WLANActBTPrecedence(padapter);
17199                         if (pHalData->CustomerID == RT_CID_PLANEX)
17200                                 btdm_DacSwing(padapter, BT_DACSWING_M10);
17201                         else
17202                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
17203                 }
17204                 else if (BTDM_IsWifiDownlink(padapter))
17205                 {
17206                         RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
17207                         if (pHalData->CustomerID == RT_CID_PLANEX)
17208                                 btdm_DacSwing(padapter, BT_DACSWING_M10);
17209                         else
17210                                 btdm_DacSwing(padapter, BT_DACSWING_M7);
17211                 }
17212 #elif defined(CONFIG_PCI_HCI)
17213                 if (pBtMgnt->ExtConfig.bBTBusy)
17214                 {
17215                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
17216                         BTDM_FWCoexAllOff(padapter);
17217                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17218                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17219                         btdm_DacSwing(padapter, BT_DACSWING_M4);
17220                 }
17221                 else
17222                 {
17223                         RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17224                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17225                 }
17226 #endif
17227         }
17228 }
17229
17230 u8 btdm_HIDPANAction2Ant(PADAPTER padapter)
17231 {
17232         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17233         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17234         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
17235         u8                      bEnter = _FALSE;
17236
17237         if (pBtDbg->dbgCtrl == _TRUE )
17238         {
17239                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
17240                         bEnter = _TRUE;
17241         }
17242         else
17243         {
17244                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
17245                         bEnter = _TRUE;
17246         }
17247
17248         if (bEnter)
17249         {
17250                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDPANAction2Ant(), "));
17251                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
17252
17253                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17254                 {
17255                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17256                         btdm_HIDPANActionBC42Ant(padapter);
17257                 }
17258                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17259                 {
17260                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17261                         btdm_HIDPANActionBC82Ant(padapter);
17262                 }
17263                 return _TRUE;
17264         }
17265         else
17266         {
17267                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
17268                 return _FALSE;
17269         }
17270
17271 }
17272
17273 void btdm_PANA2DPActionBC42Ant(PADAPTER padapter)
17274 {
17275 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
17276         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
17277         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17278         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
17279         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17280
17281         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17282                 return;
17283
17284         rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
17285         if (pBtMgnt->BtOperationOn)
17286         {
17287                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17288
17289                 if (pBtMgnt->ExtConfig.bBTBusy)
17290                 {
17291                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
17292                         BTDM_FWCoexAllOff(padapter);
17293
17294                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17295                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17296                         btdm_DacSwing(padapter, BT_DACSWING_M4);
17297                 }
17298                 else
17299                 {
17300                         RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17301                         BTDM_CoexAllOff(padapter);
17302                 }
17303         }
17304         else
17305         {
17306                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17307                 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
17308                 {
17309                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
17310                         BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
17311                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17312                 }
17313                 else
17314                 {
17315                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
17316                         BTDM_Balance(padapter, _FALSE, 0, 0);
17317                         BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
17318                 }
17319                 BTDM_SWCoexAllOff(padapter);
17320         }
17321 }
17322
17323 void btdm_PANA2DPActionBC82Ant(PADAPTER padapter)
17324 {
17325 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
17326         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
17327         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17328         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
17329         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17330         u8                      btRssiState;
17331
17332         if (!pBtMgnt->BtOperationOn)
17333         {
17334                 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17335
17336                 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
17337                 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17338                         return;
17339
17340                 if ((pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic))
17341                 {
17342                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
17343
17344                         // Do the FW mechanism first
17345                         if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
17346                         {
17347                                 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
17348                                 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
17349                         }
17350                         else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
17351                         {
17352                                 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
17353                                 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
17354                         }
17355                         BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17356
17357                         // Then do the SW mechanism
17358                         if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17359                                 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17360                         {
17361                                 if (BTDM_IsHT40(padapter))
17362                                 {
17363                                         RTPRINT(FBT, BT_TRACE, ("HT40\n"));
17364                                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17365                                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17366                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17367                                 }
17368                                 else
17369                                 {
17370                                         RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
17371                                         BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
17372                                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17373                                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17374                                 }
17375                         }
17376                         else
17377                         {
17378                                 BTDM_SWCoexAllOff(padapter);
17379                         }
17380                 }
17381                 else
17382                 {
17383                         RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
17384                         BTDM_CoexAllOff(padapter);
17385                 }
17386         }
17387         else
17388         {
17389                 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17390                 if (pBtMgnt->ExtConfig.bBTBusy)
17391                 {
17392                         RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
17393                         BTDM_FWCoexAllOff(padapter);
17394                         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17395                         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17396                         btdm_DacSwing(padapter, BT_DACSWING_M4);
17397                 }
17398                 else
17399                 {
17400                         RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17401                         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17402                 }
17403         }
17404 }
17405
17406 u8 btdm_PANA2DPAction2Ant(PADAPTER padapter)
17407 {
17408         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17409         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17410         PBT_DBG                 pBtDbg = &pBTInfo->BtDbg;
17411         u8                      bEnter = _FALSE;
17412
17413         if (pBtDbg->dbgCtrl == _TRUE )
17414         {
17415                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
17416                         bEnter = _TRUE;
17417         }
17418         else
17419         {
17420                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
17421                         bEnter = _TRUE;
17422         }
17423
17424         if (bEnter)
17425         {
17426                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_PANA2DPAction2Ant(), "));
17427                 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
17428
17429                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17430                 {
17431                         RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17432                         btdm_PANA2DPActionBC42Ant(padapter);
17433                 }
17434                 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17435                 {
17436                         RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17437                         btdm_PANA2DPActionBC82Ant(padapter);
17438                 }
17439                 return _TRUE;
17440         }
17441         else
17442         {
17443                 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
17444                 return _FALSE;
17445         }
17446 }
17447
17448 //============================================================
17449 // extern function start with BTDM_
17450 //============================================================
17451
17452 void BTDM_SwCoexAllOff92C(PADAPTER padapter)
17453 {
17454         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17455         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17456         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17457 }
17458
17459 void BTDM_SwCoexAllOff92D(PADAPTER padapter)
17460 {
17461         BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17462         BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17463         btdm_DacSwing(padapter, BT_DACSWING_OFF);
17464 }
17465
17466 void
17467 BTDM_DiminishWiFi(
17468         PADAPTER        padapter,
17469         u8                      bDACOn,
17470         u8                      bInterruptOn,
17471         u8                      DACSwingLevel,
17472         u8                      bNAVOn
17473         )
17474 {
17475         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17476         u8                      H2C_Parameter[3] = {0};
17477
17478         if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
17479                 return;
17480
17481         if ((pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW) &&
17482                 (DACSwingLevel == 0x20))
17483         {
17484                 RTPRINT(FBT, BT_TRACE, ("[BT]DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n"));
17485                 DACSwingLevel = 0x18;
17486         }
17487
17488         H2C_Parameter[2] = 0;
17489         H2C_Parameter[1] = DACSwingLevel;
17490         H2C_Parameter[0] = 0;
17491         if (bDACOn)
17492         {
17493                 H2C_Parameter[2] |= 0x01;       //BIT0
17494                 if (bInterruptOn)
17495                 {
17496                         H2C_Parameter[2] |= 0x02;       //BIT1
17497                 }
17498                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
17499         }
17500         if (bNAVOn)
17501         {
17502                 H2C_Parameter[2] |= 0x08;       //BIT3
17503                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
17504         }
17505
17506         RTPRINT(FBT, BT_TRACE, ("[DM][BT], bDACOn = %s, bInterruptOn = %s, write 0xe = 0x%x\n",
17507                 bDACOn?"ON":"OFF", bInterruptOn?"ON":"OFF",
17508                 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
17509         RTPRINT(FBT, BT_TRACE, ("[DM][BT], bNAVOn = %s\n",
17510                 bNAVOn?"ON":"OFF"));
17511
17512         if (IS_HARDWARE_TYPE_8192C(padapter))
17513         {
17514                 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
17515         }
17516         else if (IS_HARDWARE_TYPE_8192D(padapter))
17517         {
17518                 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
17519         }
17520 }
17521
17522 void BTDM_BTCoexistWithProfile2Ant(PADAPTER padapter)
17523 {
17524         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17525         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
17526         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
17527
17528         if (pBtMgnt->ExtConfig.bManualControl)
17529                 return;
17530
17531         RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
17532                 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
17533
17534         if ((pHalData->bt_coexist.BluetoothCoexist) &&
17535                 ((pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ||
17536                 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
17537         {
17538                 BTHCI_GetProfileNameMoto(padapter);
17539                 BTHCI_GetBTRSSI(padapter);
17540                 btdm_CheckBTState2Ant(padapter);
17541                 BTDM_CheckWiFiState(padapter);
17542
17543                 if (btdm_SCOAction2Ant(padapter))
17544                 {
17545                         RTPRINT(FBT, BT_TRACE, ("Action SCO\n"));
17546                 }
17547                 else if (btdm_HIDAction2Ant(padapter))
17548                 {
17549                         RTPRINT(FBT, BT_TRACE, ("Action HID\n"));
17550                 }
17551                 else if (btdm_A2DPAction2Ant(padapter))
17552                 {
17553                         RTPRINT(FBT, BT_TRACE, ("Action A2DP\n"));
17554                 }
17555                 else if (btdm_PANAction2Ant(padapter))
17556                 {
17557                         RTPRINT(FBT, BT_TRACE, ("Action PAN\n"));
17558                 }
17559                 else if (btdm_HIDA2DPAction2Ant(padapter))
17560                 {
17561                         RTPRINT(FBT, BT_TRACE, ("Action HID_A2DP\n"));
17562                 }
17563                 else if (btdm_HIDPANAction2Ant(padapter))
17564                 {
17565                         RTPRINT(FBT, BT_TRACE, ("Action HID_PAN\n"));
17566                 }
17567                 else if (btdm_PANA2DPAction2Ant(padapter))
17568                 {
17569                         RTPRINT(FBT, BT_TRACE, ("Action PAN_A2DP\n"));
17570                 }
17571                 else
17572                 {
17573                         RTPRINT(FBT, BT_TRACE, ("No Action Matched \n"));
17574                 }
17575
17576                 if (pHalData->bt_coexist.PreviousState != pHalData->bt_coexist.CurrentState)
17577                 {
17578                         RTPRINT(FBT, BT_TRACE, ("Coexist State change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
17579                                 pHalData->bt_coexist.PreviousState,
17580                                 pHalData->bt_coexist.CurrentState));
17581                         pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
17582
17583                         RTPRINT(FBT, BT_TRACE, ("["));
17584                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
17585                                 RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
17586                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
17587                                 RTPRINT(FBT, BT_TRACE, ("HT20, "));
17588                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
17589                                 RTPRINT(FBT, BT_TRACE, ("HT40, "));
17590                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
17591                                 RTPRINT(FBT, BT_TRACE, ("Legacy, "));
17592                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
17593                                 RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
17594                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
17595                                 RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
17596                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
17597                                 RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
17598                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
17599                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
17600                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
17601                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
17602                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
17603                                 RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
17604                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
17605                                 RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
17606                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_IDLE)
17607                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_idle, "));
17608                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_UPLINK)
17609                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_uplink, "));
17610                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_DOWNLINK)
17611                                 RTPRINT(FBT, BT_TRACE, ("BT_PAN_downlink, "));
17612                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
17613                                 RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
17614                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
17615                                 RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
17616                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
17617                                 RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
17618                         if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
17619                                 RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
17620                         RTPRINT(FBT, BT_TRACE, ("]\n"));
17621                 }
17622         }
17623 }
17624
17625 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
17626 #endif
17627
17628 #ifdef __HALBTCOEXIST_C__ // HAL/BTCoexist/HalBtCoexist.c
17629 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
17630
17631 //============================================================
17632 // local function
17633 //============================================================
17634 void btdm_BTCoexistWithProfile(PADAPTER padapter)
17635 {
17636         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17637
17638         if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17639         {
17640                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 2 Ant mechanism\n"));
17641                 BTDM_BTCoexistWithProfile2Ant(padapter);
17642         }
17643         else
17644         {
17645                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 1 Ant mechanism\n"));
17646                 BTDM_BTCoexistWithProfile1Ant(padapter);
17647         }
17648 }
17649
17650 void btdm_ResetFWCoexState(PADAPTER padapter)
17651 {
17652         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17653
17654         pHalData->bt_coexist.CurrentState = 0;
17655         pHalData->bt_coexist.PreviousState = 0;
17656 }
17657
17658 void btdm_InitBtCoexistDM(PADAPTER padapter)
17659 {
17660         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17661
17662         // 20100415 Joseph: Restore RF register 0x1E and 0x1F value for further usage.
17663         if (IS_HARDWARE_TYPE_8723A(padapter))
17664         {
17665                 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
17666         }
17667         else if (IS_HARDWARE_TYPE_8192D(padapter))
17668         {
17669                 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
17670         }
17671         else
17672         {
17673                 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, 0xf0);
17674         }
17675         pHalData->bt_coexist.BtRfRegOrigin1F = PHY_QueryRFReg(padapter, PathA, RF_RCK2, 0xf0);
17676
17677         pHalData->bt_coexist.CurrentState = 0;
17678         pHalData->bt_coexist.PreviousState = 0;
17679
17680         BTDM_8723AInit(padapter);
17681         pHalData->bt_coexist.bInitlized = _TRUE;
17682 }
17683 #if 0
17684 void btdm_FWCoexAllOff92C(PADAPTER padapter)
17685 {
17686         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17687
17688         if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17689         {
17690                 BTDM_Balance(padapter, _FALSE, 0, 0);
17691                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
17692         }
17693         else
17694         {
17695                 BTDM_Balance(padapter, _FALSE, 0, 0);
17696                 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
17697         }
17698 }
17699
17700 void btdm_FWCoexAllOff92D(PADAPTER padapter)
17701 {
17702         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17703
17704         if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17705         {
17706                 BTDM_Balance(padapter, _FALSE, 0, 0);
17707                 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
17708         }
17709         else
17710         {
17711                 BTDM_Balance(padapter, _FALSE, 0, 0);
17712                 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
17713         }
17714 }
17715
17716 void
17717 btdm_BTCoexist8192C(
17718         PADAPTER        padapter
17719         )
17720 {
17721         PMGNT_INFO              pMgntInfo = &(padapter->MgntInfo);
17722         PBT_MGNT                pBtMgnt=GET_BT_INFO(padapter)->BtMgnt;
17723
17724         if (pBtMgnt->bSupportProfile)
17725         {
17726                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], profile notification co-exist mechanism\n"));
17727                 btdm_BTCoexistWithProfile(padapter);
17728         }
17729         else
17730         {
17731                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No profile notification!!\n"));
17732         }
17733 }
17734
17735 u8 btdm_IsBTCoexistEnter(PADAPTER padapter)
17736 {
17737 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
17738         struct mlme_priv *pmlmepriv;
17739         struct mlme_ext_priv *pmlmeext;
17740         PBT_MGNT                pBtMgnt;
17741         PHAL_DATA_TYPE  pHalData;
17742         u8                      bRet;
17743
17744
17745         pmlmepriv = &padapter->mlmepriv;
17746         pmlmeext = &padapter->mlmeextpriv;
17747         pHalData = GET_HAL_DATA(padapter);
17748         pBtMgnt = &pHalData->BtInfo.BtMgnt;
17749         bRet = _TRUE;
17750
17751         RTPRINT(FBT, BT_TRACE, ("[DM][BT], padapter->interfaceIndex = %d\n",
17752                 padapter->interfaceIndex));
17753
17754         if (SINGLEMAC_SINGLEPHY == pHalData->MacPhyMode92D)
17755         {
17756                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Single Mac & Single Phy\n"));
17757         }
17758         else if (DUALMAC_SINGLEPHY == pHalData->MacPhyMode92D)
17759         {
17760                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Dual Mac & Single Phy, do nothing!\n"));
17761                 bRet = _FALSE;
17762         }
17763         else if (DUALMAC_DUALPHY == pHalData->MacPhyMode92D)
17764         {
17765                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Dual Mac & Dual Phy, do nothing!\n"));
17766                 bRet = _FALSE;
17767         }
17768         else
17769         {
17770                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Unknown Mac & Phy, do nothing!\n"));
17771                 bRet = _FALSE;
17772         }
17773
17774 //      switch (pHalData->RF_Type)
17775         switch (pHalData->rf_type)
17776         {
17777                 case RF_1T2R:
17778                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 1T2R\n"));
17779                         break;
17780                 case RF_2T4R:
17781                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 2T4R\n"));
17782                         break;
17783                 case RF_2T2R:
17784                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 2T2R\n"));
17785                         break;
17786                 case RF_1T1R:
17787                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 1T1R\n"));
17788                         break;
17789                 default:
17790                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Unknown RF type!\n"));
17791                         bRet = _FALSE;
17792                         break;
17793         }
17794
17795         RTPRINT(FBT, BT_TRACE, ("[DM][BT], CurrentBssWirelessMode=%d, \
17796                 dot11CurrentWirelessMode=%d, Hal CurrentWirelessMode=%d \n", \
17797                 pMgntInfo->CurrentBssWirelessMode, pMgntInfo->dot11CurrentWirelessMode,
17798                 pHalData->CurrentWirelessMode));
17799
17800         if (WIRELESS_MODE_N_5G == pMgntInfo->dot11CurrentWirelessMode ||
17801                 WIRELESS_MODE_A == pMgntInfo->dot11CurrentWirelessMode)
17802         {
17803                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 5G or A band, do nothing and disable all bt coex mechanism!\n"));
17804                 BTDM_CoexAllOff(padapter);
17805                 bRet = _FALSE;
17806         }
17807
17808         return bRet;
17809 }
17810
17811 void btdm_BTCoexist8192D(PADAPTER padapter)
17812 {
17813         PMGNT_INFO              pMgntInfo = &(padapter->MgntInfo);
17814         PBT_MGNT                pBtMgnt=GET_BT_INFO(padapter)->BtMgnt;
17815         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17816
17817         if (!btdm_IsBTCoexistEnter(padapter))
17818                 return;
17819
17820         if ((pBtMgnt->bSupportProfile) ||
17821                 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8))
17822         {
17823                 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8 &&
17824                         !pBtMgnt->bSupportProfile)
17825                 {
17826                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM_Coexist(): Not specify condition\n"));
17827                 }
17828
17829                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM_CoexistWithProfile()\n"));
17830                 btdm_BTCoexistWithProfile(padapter);
17831         }
17832         else
17833         {
17834                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No profile notification!!\n"));
17835         }
17836 }
17837
17838 void
17839 btdm_AgcTable92d(
17840         PADAPTER        padapter,
17841         u8              type
17842         )
17843 {
17844         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
17845
17846         if (type == BT_AGCTABLE_OFF)
17847         {
17848                 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable Off!\n"));
17849                 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x30a99);
17850                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xdc000);
17851
17852                 rtw_write32(padapter, 0xc78, 0x7B000001);
17853                 rtw_write32(padapter, 0xc78, 0x7B010001);
17854                 rtw_write32(padapter, 0xc78, 0x7B020001);
17855                 rtw_write32(padapter, 0xc78, 0x7B030001);
17856                 rtw_write32(padapter, 0xc78, 0x7B040001);
17857                 rtw_write32(padapter, 0xc78, 0x7B050001);
17858                 rtw_write32(padapter, 0xc78, 0x7B060001);
17859                 rtw_write32(padapter, 0xc78, 0x7A070001);
17860                 rtw_write32(padapter, 0xc78, 0x79080001);
17861                 rtw_write32(padapter, 0xc78, 0x78090001);
17862                 rtw_write32(padapter, 0xc78, 0x770A0001);
17863                 rtw_write32(padapter, 0xc78, 0x760B0001);
17864                 rtw_write32(padapter, 0xc78, 0x750C0001);
17865                 rtw_write32(padapter, 0xc78, 0x740D0001);
17866                 rtw_write32(padapter, 0xc78, 0x730E0001);
17867                 rtw_write32(padapter, 0xc78, 0x720F0001);
17868                 rtw_write32(padapter, 0xc78, 0x71100001);
17869                 rtw_write32(padapter, 0xc78, 0x70110001);
17870                 rtw_write32(padapter, 0xc78, 0x6F120001);
17871                 rtw_write32(padapter, 0xc78, 0x6E130001);
17872                 rtw_write32(padapter, 0xc78, 0x6D140001);
17873                 rtw_write32(padapter, 0xc78, 0x6C150001);
17874                 rtw_write32(padapter, 0xc78, 0x6B160001);
17875                 rtw_write32(padapter, 0xc78, 0x6A170001);
17876                 rtw_write32(padapter, 0xc78, 0x69180001);
17877                 rtw_write32(padapter, 0xc78, 0x68190001);
17878                 rtw_write32(padapter, 0xc78, 0x671A0001);
17879                 rtw_write32(padapter, 0xc78, 0x661B0001);
17880                 rtw_write32(padapter, 0xc78, 0x651C0001);
17881                 rtw_write32(padapter, 0xc78, 0x641D0001);
17882                 rtw_write32(padapter, 0xc78, 0x631E0001);
17883                 rtw_write32(padapter, 0xc78, 0x621F0001);
17884                 rtw_write32(padapter, 0xc78, 0x61200001);
17885                 rtw_write32(padapter, 0xc78, 0x60210001);
17886                 rtw_write32(padapter, 0xc78, 0x49220001);
17887                 rtw_write32(padapter, 0xc78, 0x48230001);
17888                 rtw_write32(padapter, 0xc78, 0x47240001);
17889                 rtw_write32(padapter, 0xc78, 0x46250001);
17890                 rtw_write32(padapter, 0xc78, 0x45260001);
17891                 rtw_write32(padapter, 0xc78, 0x44270001);
17892                 rtw_write32(padapter, 0xc78, 0x43280001);
17893                 rtw_write32(padapter, 0xc78, 0x42290001);
17894                 rtw_write32(padapter, 0xc78, 0x412A0001);
17895                 rtw_write32(padapter, 0xc78, 0x402B0001);
17896
17897                 pHalData->bt_coexist.b92DAgcTableOn = _FALSE;
17898         }
17899         else if (type == BT_AGCTABLE_ON)
17900         {
17901                 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable ON!\n"));
17902                 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0xa99);
17903                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xd4000);
17904
17905                 rtw_write32(padapter, 0xc78, 0x7b000001);
17906                 rtw_write32(padapter, 0xc78, 0x7b010001);
17907                 rtw_write32(padapter, 0xc78, 0x7b020001);
17908                 rtw_write32(padapter, 0xc78, 0x7b030001);
17909                 rtw_write32(padapter, 0xc78, 0x7b040001);
17910                 rtw_write32(padapter, 0xc78, 0x7b050001);
17911                 rtw_write32(padapter, 0xc78, 0x7b060001);
17912                 rtw_write32(padapter, 0xc78, 0x7b070001);
17913                 rtw_write32(padapter, 0xc78, 0x7b080001);
17914                 rtw_write32(padapter, 0xc78, 0x7b090001);
17915                 rtw_write32(padapter, 0xc78, 0x7b0A0001);
17916                 rtw_write32(padapter, 0xc78, 0x7b0B0001);
17917                 rtw_write32(padapter, 0xc78, 0x7a0C0001);
17918                 rtw_write32(padapter, 0xc78, 0x790D0001);
17919                 rtw_write32(padapter, 0xc78, 0x780E0001);
17920                 rtw_write32(padapter, 0xc78, 0x770F0001);
17921                 rtw_write32(padapter, 0xc78, 0x76100001);
17922                 rtw_write32(padapter, 0xc78, 0x75110001);
17923                 rtw_write32(padapter, 0xc78, 0x74120001);
17924                 rtw_write32(padapter, 0xc78, 0x73130001);
17925                 rtw_write32(padapter, 0xc78, 0x72140001);
17926                 rtw_write32(padapter, 0xc78, 0x71150001);
17927                 rtw_write32(padapter, 0xc78, 0x70160001);
17928                 rtw_write32(padapter, 0xc78, 0x6f170001);
17929                 rtw_write32(padapter, 0xc78, 0x6e180001);
17930                 rtw_write32(padapter, 0xc78, 0x6d190001);
17931                 rtw_write32(padapter, 0xc78, 0x6c1A0001);
17932                 rtw_write32(padapter, 0xc78, 0x6b1B0001);
17933                 rtw_write32(padapter, 0xc78, 0x6a1C0001);
17934                 rtw_write32(padapter, 0xc78, 0x691D0001);
17935                 rtw_write32(padapter, 0xc78, 0x4f1E0001);
17936                 rtw_write32(padapter, 0xc78, 0x4e1F0001);
17937                 rtw_write32(padapter, 0xc78, 0x4d200001);
17938                 rtw_write32(padapter, 0xc78, 0x4c210001);
17939                 rtw_write32(padapter, 0xc78, 0x4b220001);
17940                 rtw_write32(padapter, 0xc78, 0x4a230001);
17941                 rtw_write32(padapter, 0xc78, 0x49240001);
17942                 rtw_write32(padapter, 0xc78, 0x48250001);
17943                 rtw_write32(padapter, 0xc78, 0x47260001);
17944                 rtw_write32(padapter, 0xc78, 0x46270001);
17945                 rtw_write32(padapter, 0xc78, 0x45280001);
17946                 rtw_write32(padapter, 0xc78, 0x44290001);
17947                 rtw_write32(padapter, 0xc78, 0x432A0001);
17948                 rtw_write32(padapter, 0xc78, 0x422B0001);
17949
17950                 pHalData->bt_coexist.b92DAgcTableOn = _TRUE;
17951                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
17952         }
17953 }
17954 #endif
17955 //============================================================
17956 // extern function
17957 //============================================================
17958 void BTDM_CheckAntSelMode(PADAPTER padapter)
17959 {
17960 #if 0
17961         if (!IS_HARDWARE_TYPE_8192C(padapter))
17962                 return;
17963         BTDM_CheckBTIdleChange1Ant(padapter);
17964 #endif
17965 }
17966
17967 u8 BTDM_NeedToRoamForBtEnableDisable(PADAPTER padapter)
17968 {
17969 #if 0
17970         HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(padapter);
17971
17972         if (IS_HARDWARE_TYPE_8192D(padapter))
17973         {
17974                 if (pHalData->bt_coexist.bNeedToRoamForBtDisableEnable)
17975                 {
17976                         pHalData->bt_coexist.bNeedToRoamForBtDisableEnable = _FALSE;
17977                         RTPRINT(FBT, BT_TRACE, ("92D bt need to roam caused by bt enable/disable!!!\n"));
17978                         return _TRUE;
17979                 }
17980         }
17981 #endif
17982         return _FALSE;
17983 }
17984
17985 void BTDM_FwC2hBtRssi(PADAPTER padapter, u8 *tmpBuf)
17986 {
17987         if (IS_HARDWARE_TYPE_8723A(padapter))
17988                 BTDM_FwC2hBtRssi8723A(padapter, tmpBuf);
17989 }
17990
17991 void BTDM_FwC2hBtInfo(PADAPTER padapter, u8 *tmpBuf, u8 length)
17992 {
17993         if (IS_HARDWARE_TYPE_8723A(padapter))
17994                 BTDM_FwC2hBtInfo8723A(padapter, tmpBuf, length);
17995 }
17996
17997 void BTDM_DisplayBtCoexInfo(PADAPTER padapter)
17998 {
17999         if (IS_HARDWARE_TYPE_8723A(padapter))
18000                 BTDM_Display8723ABtCoexInfo(padapter);
18001 }
18002
18003 void BTDM_RejectAPAggregatedPacket(PADAPTER padapter, u8 bReject)
18004 {
18005 #if 0
18006         PMGNT_INFO                              pMgntInfo = &padapter->MgntInfo;
18007         PRT_HIGH_THROUGHPUT     pHTInfo = GET_HT_INFO(pMgntInfo);
18008         PRX_TS_RECORD                   pRxTs = NULL;
18009
18010         {
18011                 if (bReject)
18012                 {
18013                         // Do not allow receiving A-MPDU aggregation.
18014                         if (pMgntInfo->IOTPeer == HT_IOT_PEER_CISCO)
18015                         {
18016                                 if (pHTInfo->bAcceptAddbaReq)
18017                                 {
18018                                         RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU \n"));
18019                                         pHTInfo->bAcceptAddbaReq = _FALSE;
18020                                         if (GetTs(padapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, _FALSE))
18021                                                 TsInitDelBA(padapter, (PTS_COMMON_INFO)pRxTs, RX_DIR);
18022                                 }
18023                         }
18024                         else
18025                         {
18026                                 if (!pHTInfo->bAcceptAddbaReq)
18027                                 {
18028                                         RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT Idle\n"));
18029                                         pHTInfo->bAcceptAddbaReq = _TRUE;
18030                                 }
18031                         }
18032                 }
18033                 else
18034                 {
18035                         if (pMgntInfo->IOTPeer == HT_IOT_PEER_CISCO)
18036                         {
18037                                 if (!pHTInfo->bAcceptAddbaReq)
18038                                 {
18039                                         RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU \n"));
18040                                         pHTInfo->bAcceptAddbaReq = _TRUE;
18041                                 }
18042                         }
18043                 }
18044         }
18045 #endif
18046 }
18047
18048 u8 BTDM_IsHT40(PADAPTER padapter)
18049 {
18050         u8 isHT40 = _TRUE;
18051         HT_CHANNEL_WIDTH bw;
18052
18053 #if 0
18054         rtw_hal_get_hwreg(padapter, HW_VAR_BW_MODE, (pu8)(&bw));
18055 #else
18056 #if 0
18057         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18058         bw = pHalData->CurrentChannelBW;
18059 #else
18060         bw = padapter->mlmeextpriv.cur_bwmode;
18061 #endif
18062 #endif
18063
18064         if (bw == HT_CHANNEL_WIDTH_20)
18065         {
18066                 isHT40 = _FALSE;
18067         }
18068         else if (bw == HT_CHANNEL_WIDTH_40)
18069         {
18070                 isHT40 = _TRUE;
18071         }
18072
18073         return isHT40;
18074 }
18075
18076 u8 BTDM_Legacy(PADAPTER padapter)
18077 {
18078         struct mlme_ext_priv *pmlmeext;
18079         u8                      isLegacy = _FALSE;
18080
18081         pmlmeext = &padapter->mlmeextpriv;
18082         if ((pmlmeext->cur_wireless_mode == WIRELESS_11B) ||
18083                 (pmlmeext->cur_wireless_mode == WIRELESS_11G) ||
18084                 (pmlmeext->cur_wireless_mode == WIRELESS_11BG))
18085                 isLegacy = _TRUE;
18086
18087         return isLegacy;
18088 }
18089
18090 void BTDM_CheckWiFiState(PADAPTER padapter)
18091 {
18092         PHAL_DATA_TYPE  pHalData;
18093         struct mlme_priv *pmlmepriv;
18094         PBT30Info               pBTInfo;
18095         PBT_MGNT                pBtMgnt;
18096
18097
18098         pHalData = GET_HAL_DATA(padapter);
18099         pmlmepriv = &padapter->mlmepriv;
18100         pBTInfo = GET_BT_INFO(padapter);
18101         pBtMgnt = &pBTInfo->BtMgnt;
18102
18103         if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
18104         {
18105                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_IDLE;
18106
18107                 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
18108                 {
18109                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_UPLINK;
18110                 }
18111                 else
18112                 {
18113                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_UPLINK;
18114                 }
18115
18116                 if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
18117                 {
18118                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_DOWNLINK;
18119                 }
18120                 else
18121                 {
18122                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_DOWNLINK;
18123                 }
18124         }
18125         else
18126         {
18127                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_IDLE;
18128                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_UPLINK;
18129                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_DOWNLINK;
18130         }
18131
18132         if (BTDM_Legacy(padapter))
18133         {
18134                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_LEGACY;
18135                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT20;
18136                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT40;
18137         }
18138         else
18139         {
18140                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_LEGACY;
18141                 if (BTDM_IsHT40(padapter))
18142                 {
18143                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT40;
18144                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT20;
18145                 }
18146                 else
18147                 {
18148                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT20;
18149                         pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT40;
18150                 }
18151         }
18152
18153         if (pBtMgnt->BtOperationOn)
18154         {
18155                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT30;
18156         }
18157         else
18158         {
18159                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT30;
18160         }
18161 }
18162
18163 s32 BTDM_GetRxSS(PADAPTER padapter)
18164 {
18165 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18166         struct mlme_priv *pmlmepriv;
18167         PHAL_DATA_TYPE  pHalData;
18168         s32                     UndecoratedSmoothedPWDB = 0;
18169
18170
18171         pmlmepriv = &padapter->mlmepriv;
18172         pHalData = GET_HAL_DATA(padapter);
18173
18174 //      if (pMgntInfo->bMediaConnect)   // Default port
18175         if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
18176         {
18177                 UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(padapter);
18178         }
18179         else // associated entry pwdb
18180         {
18181                 UndecoratedSmoothedPWDB = pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
18182                 //pHalData->BT_EntryMinUndecoratedSmoothedPWDB
18183         }
18184         RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxSS() = %d\n", UndecoratedSmoothedPWDB));
18185         return UndecoratedSmoothedPWDB;
18186 }
18187
18188 s32 BTDM_GetRxBeaconSS(PADAPTER padapter)
18189 {
18190 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18191         struct mlme_priv *pmlmepriv;
18192         PHAL_DATA_TYPE  pHalData;
18193         s32                     pwdbBeacon = 0;
18194
18195
18196         pmlmepriv = &padapter->mlmepriv;
18197         pHalData = GET_HAL_DATA(padapter);
18198
18199 //      if (pMgntInfo->bMediaConnect)   // Default port
18200         if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
18201         {
18202                 //pwdbBeacon = pHalData->dmpriv.UndecoratedSmoothedBeacon;
18203                 pwdbBeacon= pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
18204         }
18205         RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxBeaconSS() = %d\n", pwdbBeacon));
18206         return pwdbBeacon;
18207 }
18208
18209 // Get beacon rssi state
18210 u8
18211 BTDM_CheckCoexBcnRssiState(
18212         PADAPTER        padapter,
18213         u8                      levelNum,
18214         u8                      RssiThresh,
18215         u8                      RssiThresh1
18216         )
18217 {
18218         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18219         s32                     pwdbBeacon = 0;
18220         u8                      bcnRssiState;
18221
18222         pwdbBeacon = BTDM_GetRxBeaconSS(padapter);
18223
18224         if (levelNum == 2)
18225         {
18226                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18227
18228                 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
18229                         (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
18230                 {
18231                         if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18232                         {
18233                                 bcnRssiState = BT_RSSI_STATE_HIGH;
18234                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18235                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18236                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to High\n"));
18237                         }
18238                         else
18239                         {
18240                                 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
18241                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
18242                         }
18243                 }
18244                 else
18245                 {
18246                         if (pwdbBeacon < RssiThresh)
18247                         {
18248                                 bcnRssiState = BT_RSSI_STATE_LOW;
18249                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18250                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18251                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Low\n"));
18252                         }
18253                         else
18254                         {
18255                                 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
18256                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
18257                         }
18258                 }
18259         }
18260         else if (levelNum == 3)
18261         {
18262                 if (RssiThresh > RssiThresh1)
18263                 {
18264                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON thresh error!!\n"));
18265                         return pHalData->bt_coexist.preRssiStateBeacon;
18266                 }
18267
18268                 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
18269                         (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
18270                 {
18271                         if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18272                         {
18273                                 bcnRssiState = BT_RSSI_STATE_MEDIUM;
18274                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18275                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18276                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18277                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Medium\n"));
18278                         }
18279                         else
18280                         {
18281                                 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
18282                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
18283                         }
18284                 }
18285                 else if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_MEDIUM) ||
18286                         (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_MEDIUM))
18287                 {
18288                         if (pwdbBeacon >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
18289                         {
18290                                 bcnRssiState = BT_RSSI_STATE_HIGH;
18291                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18292                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18293                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18294                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to High\n"));
18295                         }
18296                         else if (pwdbBeacon < RssiThresh)
18297                         {
18298                                 bcnRssiState = BT_RSSI_STATE_LOW;
18299                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18300                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18301                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18302                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Low\n"));
18303                         }
18304                         else
18305                         {
18306                                 bcnRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18307                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Medium\n"));
18308                         }
18309                 }
18310                 else
18311                 {
18312                         if (pwdbBeacon < RssiThresh1)
18313                         {
18314                                 bcnRssiState = BT_RSSI_STATE_MEDIUM;
18315                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18316                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
18317                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
18318                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Medium\n"));
18319                         }
18320                         else
18321                         {
18322                                 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
18323                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
18324                         }
18325                 }
18326         }
18327
18328         pHalData->bt_coexist.preRssiStateBeacon = bcnRssiState;
18329
18330         return bcnRssiState;
18331 }
18332
18333 u8
18334 BTDM_CheckCoexRSSIState1(
18335         PADAPTER        padapter,
18336         u8                      levelNum,
18337         u8                      RssiThresh,
18338         u8                      RssiThresh1
18339         )
18340 {
18341         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18342         s32                     UndecoratedSmoothedPWDB = 0;
18343         u8                      btRssiState;
18344
18345         UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
18346
18347         if (levelNum == 2)
18348         {
18349                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18350
18351                 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
18352                         (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
18353                 {
18354                         if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18355                         {
18356                                 btRssiState = BT_RSSI_STATE_HIGH;
18357                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18358                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
18359                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
18360                         }
18361                         else
18362                         {
18363                                 btRssiState = BT_RSSI_STATE_STAY_LOW;
18364                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
18365                         }
18366                 }
18367                 else
18368                 {
18369                         if (UndecoratedSmoothedPWDB < RssiThresh)
18370                         {
18371                                 btRssiState = BT_RSSI_STATE_LOW;
18372                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
18373                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18374                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
18375                         }
18376                         else
18377                         {
18378                                 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18379                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
18380                         }
18381                 }
18382         }
18383         else if (levelNum == 3)
18384         {
18385                 if (RssiThresh > RssiThresh1)
18386                 {
18387                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 thresh error!!\n"));
18388                         return pHalData->bt_coexist.preRssiState1;
18389                 }
18390
18391                 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
18392                         (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
18393                 {
18394                         if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18395                         {
18396                                 btRssiState = BT_RSSI_STATE_MEDIUM;
18397                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18398                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
18399                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18400                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Medium\n"));
18401                         }
18402                         else
18403                         {
18404                                 btRssiState = BT_RSSI_STATE_STAY_LOW;
18405                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
18406                         }
18407                 }
18408                 else if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_MEDIUM) ||
18409                         (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_MEDIUM))
18410                 {
18411                         if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
18412                         {
18413                                 btRssiState = BT_RSSI_STATE_HIGH;
18414                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18415                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
18416                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18417                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
18418                         }
18419                         else if (UndecoratedSmoothedPWDB < RssiThresh)
18420                         {
18421                                 btRssiState = BT_RSSI_STATE_LOW;
18422                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
18423                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18424                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18425                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
18426                         }
18427                         else
18428                         {
18429                                 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18430                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Medium\n"));
18431                         }
18432                 }
18433                 else
18434                 {
18435                         if (UndecoratedSmoothedPWDB < RssiThresh1)
18436                         {
18437                                 btRssiState = BT_RSSI_STATE_MEDIUM;
18438                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18439                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
18440                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
18441                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Medium\n"));
18442                         }
18443                         else
18444                         {
18445                                 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18446                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
18447                         }
18448                 }
18449         }
18450
18451         pHalData->bt_coexist.preRssiState1 = btRssiState;
18452
18453         return btRssiState;
18454 }
18455
18456 u8
18457 BTDM_CheckCoexRSSIState(
18458         PADAPTER        padapter,
18459         u8                      levelNum,
18460         u8                      RssiThresh,
18461         u8                      RssiThresh1
18462         )
18463 {
18464         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18465         s32                     UndecoratedSmoothedPWDB = 0;
18466         u8                      btRssiState;
18467
18468         UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
18469
18470         if (levelNum == 2)
18471         {
18472                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18473
18474                 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
18475                         (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
18476                 {
18477                         if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18478                         {
18479                                 btRssiState = BT_RSSI_STATE_HIGH;
18480                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_HIGH;
18481                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
18482                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to High\n"));
18483                         }
18484                         else
18485                         {
18486                                 btRssiState = BT_RSSI_STATE_STAY_LOW;
18487                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
18488                         }
18489                 }
18490                 else
18491                 {
18492                         if (UndecoratedSmoothedPWDB < RssiThresh)
18493                         {
18494                                 btRssiState = BT_RSSI_STATE_LOW;
18495                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_LOW;
18496                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
18497                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Low\n"));
18498                         }
18499                         else
18500                         {
18501                                 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18502                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
18503                         }
18504                 }
18505         }
18506         else if (levelNum == 3)
18507         {
18508                 if (RssiThresh > RssiThresh1)
18509                 {
18510                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI thresh error!!\n"));
18511                         return pHalData->bt_coexist.preRssiState;
18512                 }
18513
18514                 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
18515                         (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
18516                 {
18517                         if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
18518                         {
18519                                 btRssiState = BT_RSSI_STATE_MEDIUM;
18520                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18521                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
18522                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
18523                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Medium\n"));
18524                         }
18525                         else
18526                         {
18527                                 btRssiState = BT_RSSI_STATE_STAY_LOW;
18528                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
18529                         }
18530                 }
18531                 else if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_MEDIUM) ||
18532                         (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_MEDIUM))
18533                 {
18534                         if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
18535                         {
18536                                 btRssiState = BT_RSSI_STATE_HIGH;
18537                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_HIGH;
18538                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
18539                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18540                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to High\n"));
18541                         }
18542                         else if (UndecoratedSmoothedPWDB < RssiThresh)
18543                         {
18544                                 btRssiState = BT_RSSI_STATE_LOW;
18545                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_LOW;
18546                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
18547                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18548                         RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Low\n"));
18549                         }
18550                         else
18551                         {
18552                                 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18553                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Medium\n"));
18554                         }
18555                 }
18556                 else
18557                 {
18558                         if (UndecoratedSmoothedPWDB < RssiThresh1)
18559                         {
18560                                 btRssiState = BT_RSSI_STATE_MEDIUM;
18561                                 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18562                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
18563                                 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
18564                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Medium\n"));
18565                         }
18566                         else
18567                         {
18568                                 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18569                                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
18570                         }
18571                 }
18572         }
18573
18574         pHalData->bt_coexist.preRssiState = btRssiState;
18575
18576         return btRssiState;
18577 }
18578
18579 u8 BTDM_DisableEDCATurbo(PADAPTER padapter)
18580 {
18581 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18582         PBT_MGNT                pBtMgnt;
18583         PHAL_DATA_TYPE  pHalData;
18584         u8                      bBtChangeEDCA = _FALSE;
18585         u32                     EDCA_BT_BE = 0x5ea42b, cur_EDCA_reg;
18586         u16                     aggr_num;
18587         u8                      bRet = _FALSE;
18588
18589
18590         pHalData = GET_HAL_DATA(padapter);
18591         pBtMgnt = &pHalData->BtInfo.BtMgnt;
18592
18593         if (!pHalData->bt_coexist.BluetoothCoexist)
18594         {
18595                 bRet = _FALSE;
18596                 pHalData->bt_coexist.lastBtEdca = 0;
18597                 return bRet;
18598         }
18599         if (!((pBtMgnt->bSupportProfile) ||
18600                 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
18601         {
18602                 bRet = _FALSE;
18603                 pHalData->bt_coexist.lastBtEdca = 0;
18604                 return bRet;
18605         }
18606
18607         if (BT_1Ant(padapter))
18608         {
18609                 bRet = _FALSE;
18610                 pHalData->bt_coexist.lastBtEdca = 0;
18611                 return bRet;
18612         }
18613
18614         if (pHalData->bt_coexist.exec_cnt < 3)
18615                 pHalData->bt_coexist.exec_cnt++;
18616         else
18617                 pHalData->bt_coexist.bEDCAInitialized = _TRUE;
18618
18619         // When BT is non idle
18620         if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
18621         {
18622                 RTPRINT(FBT, BT_TRACE, ("BT state non idle, set bt EDCA\n"));
18623
18624                 //aggr_num = 0x0909;
18625                 if (pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA == _TRUE)
18626                 {
18627                         bBtChangeEDCA = _TRUE;
18628                         pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
18629 //                      pHalData->bIsCurRDLState = _FALSE;
18630                         pHalData->dmpriv.prv_traffic_idx = 3;
18631                 }
18632                 cur_EDCA_reg = rtw_read32(padapter, REG_EDCA_BE_PARAM);
18633
18634                 if (cur_EDCA_reg != EDCA_BT_BE)
18635                 {
18636                         bBtChangeEDCA = _TRUE;
18637                 }
18638                 if (bBtChangeEDCA || !pHalData->bt_coexist.bEDCAInitialized)
18639                 {
18640                         rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCA_BT_BE);
18641                         pHalData->bt_coexist.lastBtEdca = EDCA_BT_BE;
18642                 }
18643                 bRet = _TRUE;
18644         }
18645         else
18646         {
18647                 RTPRINT(FBT, BT_TRACE, ("BT state idle, set original EDCA\n"));
18648                 pHalData->bt_coexist.lastBtEdca = 0;
18649                 bRet = _FALSE;
18650         }
18651
18652 #ifdef CONFIG_PCI_HCI
18653         if (IS_HARDWARE_TYPE_8192C(padapter))
18654         {
18655                 // When BT is non idle
18656                 if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
18657                 {
18658                         aggr_num = 0x0909;
18659                 }
18660                 else
18661                 {
18662                         aggr_num = 0x0A0A;
18663                 }
18664
18665                 if ((pHalData->bt_coexist.last_aggr_num != aggr_num) || !pHalData->bt_coexist.bEDCAInitialized)
18666                 {
18667                         RTPRINT(FBT, BT_TRACE, ("BT write AGGR NUM = 0x%x\n", aggr_num));
18668                         rtw_write16(padapter, REG_MAX_AGGR_NUM, aggr_num);
18669                         pHalData->bt_coexist.last_aggr_num = aggr_num;
18670                 }
18671         }
18672 #endif
18673
18674         return bRet;
18675 }
18676
18677 void
18678 BTDM_Balance(
18679         PADAPTER        padapter,
18680         u8                      bBalanceOn,
18681         u8                      ms0,
18682         u8                      ms1
18683         )
18684 {
18685         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18686         u8      H2C_Parameter[3] = {0};
18687
18688         if (bBalanceOn)
18689         {
18690                 H2C_Parameter[2] = 1;
18691                 H2C_Parameter[1] = ms1;
18692                 H2C_Parameter[0] = ms0;
18693                 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
18694         }
18695         else
18696         {
18697                 H2C_Parameter[2] = 0;
18698                 H2C_Parameter[1] = 0;
18699                 H2C_Parameter[0] = 0;
18700         }
18701         pHalData->bt_coexist.bBalanceOn = bBalanceOn;
18702
18703         RTPRINT(FBT, BT_TRACE, ("[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
18704                 bBalanceOn?"ON":"OFF", ms0, ms1,
18705                 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
18706
18707         FillH2CCmd(padapter, 0xc, 3, H2C_Parameter);
18708 }
18709
18710 void BTDM_AGCTable(PADAPTER padapter, u8 type)
18711 {
18712         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18713 #if 0
18714         if (IS_HARDWARE_TYPE_8192D(padapter))
18715         {
18716                 btdm_AgcTable92d(padapter, type);
18717                 return;
18718         }
18719 #endif
18720         if (type == BT_AGCTABLE_OFF)
18721         {
18722                 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable Off!\n"));
18723                 rtw_write32(padapter, 0xc78,0x641c0001);
18724                 rtw_write32(padapter, 0xc78,0x631d0001);
18725                 rtw_write32(padapter, 0xc78,0x621e0001);
18726                 rtw_write32(padapter, 0xc78,0x611f0001);
18727                 rtw_write32(padapter, 0xc78,0x60200001);
18728
18729                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x32000);
18730                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x71000);
18731                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xb0000);
18732                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xfc000);
18733                 if (IS_HARDWARE_TYPE_8723A(padapter))
18734                         PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x30355);
18735                 else
18736                         PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x10255);
18737
18738                 if (IS_HARDWARE_TYPE_8723A(padapter))
18739                         pHalData->bt_coexist.b8723aAgcTableOn = _FALSE;
18740         }
18741         else if (type == BT_AGCTABLE_ON)
18742         {
18743                 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable On!\n"));
18744                 rtw_write32(padapter, 0xc78,0x4e1c0001);
18745                 rtw_write32(padapter, 0xc78,0x4d1d0001);
18746                 rtw_write32(padapter, 0xc78,0x4c1e0001);
18747                 rtw_write32(padapter, 0xc78,0x4b1f0001);
18748                 rtw_write32(padapter, 0xc78,0x4a200001);
18749
18750                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xdc000);
18751                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x90000);
18752                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x51000);
18753                 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x12000);
18754                 if (IS_HARDWARE_TYPE_8723A(padapter))
18755                         PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x00355);
18756                 else
18757                         PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x00255);
18758
18759                 if (IS_HARDWARE_TYPE_8723A(padapter))
18760                         pHalData->bt_coexist.b8723aAgcTableOn = _TRUE;
18761
18762                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
18763         }
18764 }
18765
18766 void BTDM_BBBackOffLevel(PADAPTER padapter, u8 type)
18767 {
18768         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18769
18770         if (type == BT_BB_BACKOFF_OFF)
18771         {
18772                 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel Off!\n"));
18773                 rtw_write32(padapter, 0xc04,0x3a05611);
18774         }
18775         else if (type == BT_BB_BACKOFF_ON)
18776         {
18777                 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel On!\n"));
18778                 rtw_write32(padapter, 0xc04,0x3a07611);
18779                 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
18780         }
18781 }
18782
18783 void BTDM_FWCoexAllOff(PADAPTER padapter)
18784 {
18785 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18786         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
18787         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
18788         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);;
18789
18790
18791         RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff()\n"));
18792 #if 0
18793         if (!pBtMgnt->bSupportProfile)
18794                 return;
18795 #endif
18796         if (pHalData->bt_coexist.bFWCoexistAllOff)
18797                 return;
18798         RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff(), real Do\n"));
18799
18800 #if 0
18801         if (IS_HARDWARE_TYPE_8192C(padapter))
18802         {
18803                 btdm_FWCoexAllOff92C(padapter);
18804         }
18805         else if (IS_HARDWARE_TYPE_8192D(padapter))
18806         {
18807                 btdm_FWCoexAllOff92D(padapter);
18808         }
18809         else if (IS_HARDWARE_TYPE_8723A(padapter))
18810         {
18811                 BTDM_FWCoexAllOff8723A(padapter);
18812         }
18813 #else
18814         BTDM_FWCoexAllOff8723A(padapter);
18815 #endif
18816
18817         pHalData->bt_coexist.bFWCoexistAllOff = _TRUE;
18818 }
18819
18820 void BTDM_SWCoexAllOff(PADAPTER padapter)
18821 {
18822 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18823         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
18824         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
18825         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);;
18826
18827
18828         RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff()\n"));
18829 #if 0
18830         if (!pBtMgnt->bSupportProfile)
18831                 return;
18832 #endif
18833         if (pHalData->bt_coexist.bSWCoexistAllOff)
18834                 return;
18835         RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff(), real Do\n"));
18836 #if 0
18837         if (IS_HARDWARE_TYPE_8192C(padapter))
18838         {
18839                 BTDM_SwCoexAllOff92C(padapter);
18840         }
18841         else if (IS_HARDWARE_TYPE_8192D(padapter))
18842         {
18843                 BTDM_SwCoexAllOff92D(padapter);
18844         }
18845         else if (IS_HARDWARE_TYPE_8723A(padapter))
18846         {
18847                 BTDM_SWCoexAllOff8723A(padapter);
18848         }
18849 #else
18850         BTDM_SWCoexAllOff8723A(padapter);
18851 #endif
18852
18853         pHalData->bt_coexist.bSWCoexistAllOff = _TRUE;
18854 }
18855
18856 void BTDM_HWCoexAllOff(PADAPTER padapter)
18857 {
18858 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18859         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
18860         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
18861         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);;
18862
18863
18864         RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff()\n"));
18865 #if 0
18866         if (!pBtMgnt->bSupportProfile)
18867                 return;
18868 #endif
18869         if (pHalData->bt_coexist.bHWCoexistAllOff)
18870                 return;
18871         RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff(), real Do\n"));
18872
18873         if (IS_HARDWARE_TYPE_8723A(padapter))
18874         {
18875                 BTDM_HWCoexAllOff8723A(padapter);
18876         }
18877
18878         pHalData->bt_coexist.bHWCoexistAllOff = _TRUE;
18879 }
18880
18881 void BTDM_CoexAllOff(PADAPTER padapter)
18882 {
18883         BTDM_FWCoexAllOff(padapter);
18884         BTDM_SWCoexAllOff(padapter);
18885         BTDM_HWCoexAllOff(padapter);
18886 }
18887
18888 void BTDM_TurnOffBtCoexistBeforeEnterLPS(PADAPTER padapter)
18889 {
18890 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18891         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
18892         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
18893         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18894 //      PRT_POWER_SAVE_CONTROL  pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo);
18895         struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
18896
18897
18898         // Add temporarily.
18899         if ((!pHalData->bt_coexist.BluetoothCoexist) ||(!pBtMgnt->bSupportProfile))
18900                 return;
18901
18902         // 8723 1Ant doesn't need to turn off bt coexist mechanism.
18903         if (BTDM_1Ant8723A(padapter))
18904                 return;
18905
18906         if (IS_HARDWARE_TYPE_8192C(padapter) ||
18907                 IS_HARDWARE_TYPE_8192D(padapter) ||
18908                 IS_HARDWARE_TYPE_8723A(padapter))
18909         {
18910                 //
18911                 // Before enter LPS, turn off FW BT Co-exist mechanism
18912                 //
18913                 if (ppwrctrl->bLeisurePs)
18914                 {
18915                         RTPRINT(FBT, BT_TRACE, ("[BT][DM], Before enter LPS, turn off all Coexist DM\n"));
18916                         btdm_ResetFWCoexState(padapter);
18917                         BTDM_CoexAllOff(padapter);
18918                         BTDM_SetAntenna(padapter, BTDM_ANT_BT);
18919                 }
18920         }
18921 }
18922
18923 void BTDM_TurnOffBtCoexistBeforeEnterIPS(PADAPTER padapter)
18924 {
18925 //      PMGNT_INFO              pMgntInfo = &padapter->MgntInfo;
18926         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
18927         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
18928         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
18929 //      PRT_POWER_SAVE_CONTROL  pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo);
18930         struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
18931
18932         if (!pHalData->bt_coexist.BluetoothCoexist)
18933                 return;
18934
18935         // 8723 1Ant doesn't need to turn off bt coexist mechanism.
18936         if (BTDM_1Ant8723A(padapter))
18937                 return;
18938
18939         if (IS_HARDWARE_TYPE_8192C(padapter) ||
18940                 IS_HARDWARE_TYPE_8192D(padapter) ||
18941                 IS_HARDWARE_TYPE_8723A(padapter))
18942         {
18943                 //
18944                 // Before enter IPS, turn off FW BT Co-exist mechanism
18945                 //
18946 //              if (pPSC->bInactivePs)
18947                 if (ppwrctrl->reg_rfoff == rf_on)
18948                 {
18949                         RTPRINT(FBT, BT_TRACE, ("[BT][DM], Before enter IPS, turn off all Coexist DM\n"));
18950                         btdm_ResetFWCoexState(padapter);
18951                         BTDM_CoexAllOff(padapter);
18952                         BTDM_SetAntenna(padapter, BTDM_ANT_BT);
18953                 }
18954         }
18955 }
18956
18957 void BTDM_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
18958 {
18959         if (IS_HARDWARE_TYPE_8723A(padapter))
18960         {
18961                 BTDM_8723ASignalCompensation(padapter, rssi_wifi, rssi_bt);
18962         }
18963 }
18964 #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)
18965 /*
18966 0. write 0xa3 = 0x05
18967
18968 1. 0xa0 == 0x04
18969         write 0xF6?1:0] = 0x01
18970         write 0x3A[7:0] = 0x31
18971
18972 2. read 0xC0[31:0] == 0
18973         write 0xcc{2]= 1
18974
18975 3. read X=0x6b[4]
18976         if X== 1
18977         {
18978                 write 0x6b[4] = 0
18979                 write 0xcc{2]= 0
18980         }
18981         else if X == 0
18982         {
18983                 write 0x6b[4] = 1
18984                 write 0xcc{2]= 0
18985         }
18986
18987 */
18988 void dm_CheckBTState(_adapter *pAdapter)
18989 {
18990         u8 value=0,regValue8=0;
18991         u32 regvalue32=0;
18992         //_adapter *pAdapter = (_adapter*)context;
18993
18994 //      if (pAdapter->drv_in_test == CMCC_TEST)
18995 //              return;
18996
18997         rtw_write8(pAdapter, 0xa3, 5);
18998
18999         //DBG_8723A("------>%s,get 0xa3=%0x\n",__func__,rtw_read8(pAdapter, 0xa3));
19000
19001         regValue8 = rtw_read8(pAdapter, 0xa0);
19002         //DBG_8723A("Get 0xa0 = 0x%x\n",regValue8);
19003         if(regValue8 == 0x4){
19004                 value = rtw_read8(pAdapter, 0xf6);
19005                 value &= ~3;
19006                 value |= 1;
19007                 rtw_write8(pAdapter, 0xf6, value);
19008                 rtw_write8(pAdapter, 0x3A, 0x31);
19009         }
19010
19011         regvalue32 = rtw_read32(pAdapter, 0xc0);
19012         //DBG_8723A("Get 0xc0 = 0x%x\n",regvalue32);
19013         if(rtw_read32(pAdapter, 0xc0) == 0x0){
19014                 value = rtw_read8(pAdapter, 0xcc);
19015                 value |= 0x4;
19016                 rtw_write8(pAdapter, 0xcc, value);
19017         }
19018
19019         regValue8 = rtw_read8(pAdapter, 0x6b); //0x6b[28]
19020         //DBG_8723A("Get 0x6b = 0x%x\n",regValue8);
19021
19022         if((regValue8 & 0x10) == 0x10){
19023                 regValue8 &= 0xEF;
19024                 rtw_write8(pAdapter, 0x6b, regValue8);
19025                 value = rtw_read8(pAdapter, 0xcc);
19026                 value &= 0xfb;
19027                 rtw_write8(pAdapter, 0xcc, value);
19028         }
19029         else if ((regValue8 & 0x10) == 0){
19030                 regValue8 |= 0x10;
19031                 rtw_write8(pAdapter, 0x6b, regValue8);
19032                 value = rtw_read8(pAdapter, 0xcc);
19033                 value &= 0xfb;
19034                 rtw_write8(pAdapter, 0xcc, value);
19035         }
19036
19037         //DBG_8723A("<------%s,get 0x6b=0x%0x,0xcc=0x%x\n",__func__,rtw_read8(pAdapter, 0x6b),rtw_read8(pAdapter, 0xcc));
19038 }
19039
19040 void check_bt_status_work(void *data)
19041 {
19042         struct delayed_work *dwork;
19043         PADAPTER padapter;
19044
19045         dwork = container_of(data, struct delayed_work, work);
19046         padapter = container_of(dwork, struct _ADAPTER, checkbt_work);
19047         if(!padapter)
19048         {
19049                 DBG_8723A("%s padapter == NULL\n", __func__);
19050                 return;
19051         };
19052
19053         dm_CheckBTState(padapter);
19054 }
19055 #endif
19056 void BTDM_Coexist(PADAPTER padapter)
19057 {
19058         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19059
19060 #if defined(CONFIG_CONCURRENT_MODE)
19061         if (padapter->adapter_type != PRIMARY_ADAPTER)
19062         {
19063                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE  !!\n"));
19064                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], padapter->adapter_type != PRIMARY_ADAPTER  !!\n"));
19065                 return;
19066         }
19067 #endif
19068
19069         if (!pHalData->bt_coexist.BluetoothCoexist)
19070         {
19071                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT not exists!!\n"));
19072                 return;
19073         }
19074
19075         if (!pHalData->bt_coexist.bInitlized)
19076         {
19077                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_InitBtCoexistDM()\n"));
19078                 btdm_InitBtCoexistDM(padapter);
19079         }
19080
19081         RTPRINT(FBT, BT_TRACE, ("\n\n[DM][BT], BTDM start!!\n"));
19082
19083         BTDM_PWDBMonitor(padapter);
19084
19085         if (IS_HARDWARE_TYPE_8723A(padapter))
19086         {
19087                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 8723\n"));
19088                 BTDM_BTCoexist8723A(padapter);
19089         }
19090 #if 0
19091         else if (IS_HARDWARE_TYPE_8192C(padapter))
19092         {
19093                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 88C\n"));
19094                 btdm_BTCoexist8192C(padapter);
19095         }
19096         else if (IS_HARDWARE_TYPE_8192D(padapter))
19097         {
19098                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 92D\n"));
19099                 btdm_BTCoexist8192D(padapter);
19100         }
19101 #endif
19102         RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM end!!\n\n"));
19103 }
19104
19105 void BTDM_UpdateCoexState(PADAPTER padapter)
19106 {
19107         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19108
19109         if (!BTDM_IsSameCoexistState(padapter))
19110         {
19111                 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x,  changeBits=0x%"i64fmt"x\n",
19112                         pHalData->bt_coexist.PreviousState,
19113                         pHalData->bt_coexist.CurrentState,
19114                         (pHalData->bt_coexist.PreviousState^pHalData->bt_coexist.CurrentState)));
19115                 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
19116         }
19117 }
19118
19119 u8 BTDM_IsSameCoexistState(PADAPTER padapter)
19120 {
19121         PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19122
19123         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
19124         {
19125                 return _TRUE;
19126         }
19127         else
19128         {
19129                 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Coexist state changed!!\n"));
19130                 return _FALSE;
19131         }
19132 }
19133
19134 void BTDM_PWDBMonitor(PADAPTER padapter)
19135 {
19136 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19137         PBT30Info               pBTInfo = GET_BT_INFO(GetDefaultAdapter(padapter));
19138         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
19139         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19140         u8                      H2C_Parameter[3] = {0};
19141         s32                     tmpBTEntryMaxPWDB=0, tmpBTEntryMinPWDB=0xff;
19142         u8                      i;
19143
19144         if (pBtMgnt->BtOperationOn)
19145         {
19146                 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
19147                 {
19148                         if (pBTInfo->BtAsocEntry[i].bUsed)
19149                         {
19150                                 if (pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB < tmpBTEntryMinPWDB)
19151                                         tmpBTEntryMinPWDB = pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB;
19152                                 if (pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB > tmpBTEntryMaxPWDB)
19153                                         tmpBTEntryMaxPWDB = pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB;
19154
19155                                 //
19156                                 // Report every BT connection (HS mode) RSSI to FW
19157                                 //
19158                                 H2C_Parameter[2] = (u8)(pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB & 0xFF);
19159                                 H2C_Parameter[0] = (MAX_FW_SUPPORT_MACID_NUM-1-i);
19160                                 RTPRINT(FDM, DM_BT30, ("RSSI report for BT[%d], H2C_Par = 0x%x\n", i, H2C_Parameter[0]));
19161                                 FillH2CCmd(padapter, RSSI_SETTING_EID, 3, H2C_Parameter);
19162                                 RTPRINT_ADDR(FDM, (DM_PWDB|DM_BT30), ("BT_Entry Mac :"), pBTInfo->BtAsocEntry[i].BTRemoteMACAddr)
19163                                 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT rx pwdb[%d] = 0x%x(%d)\n", i, pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB,
19164                                         pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB));
19165                         }
19166                 }
19167                 if (tmpBTEntryMaxPWDB != 0)     // If associated entry is found
19168                 {
19169                         pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = tmpBTEntryMaxPWDB;
19170                         RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMaxPWDB = 0x%x(%d)\n",
19171                                 tmpBTEntryMaxPWDB, tmpBTEntryMaxPWDB));
19172                 }
19173                 else
19174                 {
19175                         pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = 0;
19176                 }
19177                 if (tmpBTEntryMinPWDB != 0xff) // If associated entry is found
19178                 {
19179                         pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = tmpBTEntryMinPWDB;
19180                         RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMinPWDB = 0x%x(%d)\n",
19181                                 tmpBTEntryMinPWDB, tmpBTEntryMinPWDB));
19182                 }
19183                 else
19184                 {
19185                         pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = 0;
19186                 }
19187         }
19188 }
19189
19190 u8 BTDM_DigByBtRssi(PADAPTER padapter)
19191 {
19192 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19193         PBT30Info               pBTInfo = GET_BT_INFO(GetDefaultAdapter(padapter));
19194         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
19195         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19196         u8                              bRet = _FALSE;
19197         PDM_ODM_T               pDM_OutSrc = &pHalData->odmpriv;
19198         u8                              digForBtHs=0, cckCcaThres=0;
19199
19200
19201         //
19202         // When running under HS mode, use bt related Dig and cck threshold.
19203         //
19204         if (pBtMgnt->BtOperationOn)
19205         {
19206                 if (pBtMgnt->bBTConnectInProgress)
19207                 {
19208                         if (IS_HARDWARE_TYPE_8723A(padapter))
19209                                 digForBtHs = 0x28;
19210                         else
19211                                 digForBtHs = 0x22;
19212                 }
19213                 else
19214                 {
19215                         //
19216                         // Decide DIG value by BT RSSI.
19217                         //
19218                         digForBtHs = (u8)pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB;
19219
19220                         if (IS_HARDWARE_TYPE_8723A(padapter))
19221                                 digForBtHs += 0x04;
19222
19223                         if (digForBtHs > DM_DIG_MAX_NIC)
19224                                 digForBtHs = DM_DIG_MAX_NIC;
19225                         if (digForBtHs < DM_DIG_MIN_NIC)
19226                                 digForBtHs = DM_DIG_MIN_NIC;
19227
19228                         RTPRINT(FDM, DM_BT30, ("BTDM_DigByBtRssi(), digForBtHs=0x%x\n",
19229                                         digForBtHs));
19230                 }
19231                 ODM_Write_DIG(pDM_OutSrc, digForBtHs);
19232
19233                 //
19234                 // Decide cck packet threshold
19235                 //
19236                 cckCcaThres = 0xcd;
19237                 ODM_Write_CCK_CCA_Thres(pDM_OutSrc, cckCcaThres);
19238
19239                 bRet = _TRUE;
19240         }
19241
19242         return bRet;
19243 }
19244
19245 u8 BTDM_IsBTBusy(PADAPTER padapter)
19246 {
19247         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
19248         PBT_MGNT                pBtMgnt = &pBTInfo->BtMgnt;
19249
19250         if (pBtMgnt->ExtConfig.bBTBusy)
19251                 return _TRUE;
19252         else
19253                 return _FALSE;
19254 }
19255
19256 u8 BTDM_IsWifiBusy(PADAPTER padapter)
19257 {
19258 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19259         struct mlme_priv *pmlmepriv = &(GetDefaultAdapter(padapter)->mlmepriv);
19260         PBT30Info               pBTInfo = GET_BT_INFO(padapter);
19261         PBT_TRAFFIC     pBtTraffic = &pBTInfo->BtTraffic;
19262
19263
19264         if (pmlmepriv->LinkDetectInfo.bBusyTraffic ||
19265                 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
19266                 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
19267                 return _TRUE;
19268         else
19269                 return _FALSE;
19270 }
19271
19272 u8 BTDM_IsCoexistStateChanged(PADAPTER padapter)
19273 {
19274         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19275
19276         if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
19277                 return _FALSE;
19278         else
19279                 return _TRUE;
19280 }
19281
19282 u8 BTDM_IsWifiUplink(PADAPTER padapter)
19283 {
19284 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19285         struct mlme_priv *pmlmepriv;
19286         PBT30Info               pBTInfo;
19287         PBT_TRAFFIC             pBtTraffic;
19288
19289
19290         pmlmepriv = &padapter->mlmepriv;
19291         pBTInfo = GET_BT_INFO(padapter);
19292         pBtTraffic = &pBTInfo->BtTraffic;
19293
19294         if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
19295                 (pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic))
19296                 return _TRUE;
19297         else
19298                 return _FALSE;
19299 }
19300
19301 u8 BTDM_IsWifiDownlink(PADAPTER padapter)
19302 {
19303 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19304         struct mlme_priv *pmlmepriv;
19305         PBT30Info               pBTInfo;
19306         PBT_TRAFFIC             pBtTraffic;
19307
19308
19309         pmlmepriv = &padapter->mlmepriv;
19310         pBTInfo = GET_BT_INFO(padapter);
19311         pBtTraffic = &pBTInfo->BtTraffic;
19312
19313         if ((pmlmepriv->LinkDetectInfo.bRxBusyTraffic) ||
19314                 (pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic))
19315                 return _TRUE;
19316         else
19317                 return _FALSE;
19318 }
19319
19320 u8 BTDM_IsBTHSMode(PADAPTER padapter)
19321 {
19322 //      PMGNT_INFO              pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19323         PHAL_DATA_TYPE  pHalData;
19324         PBT_MGNT                pBtMgnt;
19325
19326
19327         pHalData = GET_HAL_DATA(padapter);
19328         pBtMgnt = &pHalData->BtInfo.BtMgnt;
19329
19330         if (pBtMgnt->BtOperationOn)
19331                 return _TRUE;
19332         else
19333                 return _FALSE;
19334 }
19335
19336 u8 BTDM_IsBTUplink(PADAPTER padapter)
19337 {
19338         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19339
19340         if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
19341                 return _TRUE;
19342         else
19343                 return _FALSE;
19344 }
19345
19346 u8 BTDM_IsBTDownlink(PADAPTER padapter)
19347 {
19348         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19349
19350         if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
19351                 return _TRUE;
19352         else
19353                 return _FALSE;
19354 }
19355
19356 void BTDM_AdjustForBtOperation(PADAPTER padapter)
19357 {
19358         RTPRINT(FBT, BT_TRACE, ("[BT][DM], BTDM_AdjustForBtOperation()\n"));
19359         if (IS_HARDWARE_TYPE_8723A(padapter))
19360         {
19361                 BTDM_AdjustForBtOperation8723A(padapter);
19362         }
19363 }
19364
19365 u8 BTDM_AdjustRssiForAgcTableOn(PADAPTER padapter)
19366 {
19367         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19368
19369         if (!IS_HARDWARE_TYPE_8192D(padapter) &&
19370                 !IS_HARDWARE_TYPE_8723A(padapter))
19371                 return 0;
19372
19373         if (pHalData->bt_coexist.b92DAgcTableOn)
19374                 return 12;
19375
19376         if (pHalData->bt_coexist.b8723aAgcTableOn)
19377                 return 6;
19378
19379         return 0;
19380 }
19381
19382 void BTDM_SetBtCoexCurrAntNum(PADAPTER padapter, u8 antNum)
19383 {
19384         if (IS_HARDWARE_TYPE_8723A(padapter))
19385                 BTDM_Set8723ABtCoexCurrAntNum(padapter, antNum);
19386 }
19387
19388 void BTDM_ForHalt(PADAPTER padapter)
19389 {
19390         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19391
19392         if (!pHalData->bt_coexist.BluetoothCoexist)
19393         {
19394                 return;
19395         }
19396
19397         if (IS_HARDWARE_TYPE_8723A(padapter))
19398         {
19399                 BTDM_ForHalt8723A(padapter);
19400                 GET_HAL_DATA(padapter)->bt_coexist.bInitlized = _FALSE;
19401         }
19402 }
19403
19404 void BTDM_WifiScanNotify(PADAPTER padapter, u8 scanType)
19405 {
19406         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19407
19408         if (!pHalData->bt_coexist.BluetoothCoexist)
19409         {
19410                 return;
19411         }
19412
19413         if (IS_HARDWARE_TYPE_8723A(padapter))
19414                 BTDM_WifiScanNotify8723A(padapter, scanType);
19415 }
19416
19417 void BTDM_WifiAssociateNotify(PADAPTER padapter, u8 action)
19418 {
19419         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19420
19421         if (!pHalData->bt_coexist.BluetoothCoexist)
19422         {
19423                 return;
19424         }
19425
19426         if (IS_HARDWARE_TYPE_8723A(padapter))
19427                 BTDM_WifiAssociateNotify8723A(padapter, action);
19428 }
19429
19430 void BTDM_MediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
19431 {
19432         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19433
19434         if (!pHalData->bt_coexist.BluetoothCoexist)
19435         {
19436                 return;
19437         }
19438
19439         if (IS_HARDWARE_TYPE_8723A(padapter))
19440                 BTDM_MediaStatusNotify8723A(padapter, mstatus);
19441 }
19442
19443 void BTDM_ForDhcp(PADAPTER padapter)
19444 {
19445         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19446
19447         if (!pHalData->bt_coexist.BluetoothCoexist)
19448         {
19449                 return;
19450         }
19451
19452         if (IS_HARDWARE_TYPE_8723A(padapter))
19453                 BTDM_ForDhcp8723A(padapter);
19454 }
19455
19456 void BTDM_ResetActionProfileState(PADAPTER padapter)
19457 {
19458         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19459
19460         pHalData->bt_coexist.CurrentState &= ~\
19461                 (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP|
19462                 BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_SCO);
19463 }
19464
19465 u8 BTDM_IsActionSCO(PADAPTER padapter)
19466 {
19467         PHAL_DATA_TYPE  pHalData;
19468         PBT30Info               pBTInfo;
19469         PBT_MGNT                pBtMgnt;
19470         PBT_DBG                 pBtDbg;
19471         u8                      bRet;
19472
19473
19474         pHalData = GET_HAL_DATA(padapter);
19475         pBTInfo = GET_BT_INFO(padapter);
19476         pBtMgnt = &pBTInfo->BtMgnt;
19477         pBtDbg = &pBTInfo->BtDbg;
19478         bRet = _FALSE;
19479
19480         if (pBtDbg->dbgCtrl == _TRUE)
19481         {
19482                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
19483                 {
19484                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
19485                         bRet = _TRUE;
19486                 }
19487         }
19488         else
19489         {
19490                 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
19491                 {
19492                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
19493                         bRet = _TRUE;
19494                 }
19495         }
19496         return bRet;
19497 }
19498
19499 u8 BTDM_IsActionHID(PADAPTER padapter)
19500 {
19501         PBT30Info               pBTInfo;
19502         PHAL_DATA_TYPE  pHalData;
19503         PBT_MGNT                pBtMgnt;
19504         PBT_DBG                 pBtDbg;
19505         u8                      bRet;
19506
19507
19508         pHalData = GET_HAL_DATA(padapter);
19509         pBTInfo = GET_BT_INFO(padapter);
19510         pBtMgnt = &pBTInfo->BtMgnt;
19511         pBtDbg = &pBTInfo->BtDbg;
19512         bRet = _FALSE;
19513
19514         if (pBtDbg->dbgCtrl == _TRUE )
19515         {
19516                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
19517                 {
19518                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
19519                         bRet = _TRUE;
19520                 }
19521         }
19522         else
19523         {
19524                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19525                 {
19526                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
19527                         bRet = _TRUE;
19528                 }
19529         }
19530         return bRet;
19531 }
19532
19533 u8 BTDM_IsActionA2DP(PADAPTER padapter)
19534 {
19535         PHAL_DATA_TYPE  pHalData;
19536         PBT30Info               pBTInfo;
19537         PBT_MGNT                pBtMgnt;
19538         PBT_DBG                 pBtDbg;
19539         u8                      bRet;
19540
19541
19542         pHalData = GET_HAL_DATA(padapter);
19543         pBTInfo = GET_BT_INFO(padapter);
19544         pBtMgnt = &pBTInfo->BtMgnt;
19545         pBtDbg = &pBTInfo->BtDbg;
19546         bRet = _FALSE;
19547
19548         if (pBtDbg->dbgCtrl == _TRUE )
19549         {
19550                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
19551                 {
19552                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
19553                         bRet = _TRUE;
19554                 }
19555         }
19556         else
19557         {
19558                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19559                 {
19560                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
19561                         bRet = _TRUE;
19562                 }
19563         }
19564         return bRet;
19565 }
19566
19567 u8 BTDM_IsActionPAN(PADAPTER padapter)
19568 {
19569         PHAL_DATA_TYPE  pHalData;
19570         PBT30Info               pBTInfo;
19571         PBT_MGNT                pBtMgnt;
19572         PBT_DBG                 pBtDbg;
19573         u8                      bRet;
19574
19575
19576         pHalData = GET_HAL_DATA(padapter);
19577         pBTInfo = GET_BT_INFO(padapter);
19578         pBtMgnt = &pBTInfo->BtMgnt;
19579         pBtDbg = &pBTInfo->BtDbg;
19580         bRet = _FALSE;
19581
19582         if (pBtDbg->dbgCtrl == _TRUE)
19583         {
19584                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
19585                 {
19586                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
19587                         bRet = _TRUE;
19588                 }
19589         }
19590         else
19591         {
19592                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19593                 {
19594                         pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
19595                         bRet = _TRUE;
19596                 }
19597         }
19598         return bRet;
19599 }
19600
19601 u8 BTDM_IsActionHIDA2DP(PADAPTER padapter)
19602 {
19603         PHAL_DATA_TYPE  pHalData;
19604         PBT30Info               pBTInfo;
19605         PBT_MGNT                pBtMgnt;
19606         PBT_DBG                 pBtDbg;
19607         u8                      bRet;
19608
19609
19610         pHalData = GET_HAL_DATA(padapter);
19611         pBTInfo = GET_BT_INFO(padapter);
19612         pBtMgnt = &pBTInfo->BtMgnt;
19613         pBtDbg = &pBTInfo->BtDbg;
19614         bRet = _FALSE;
19615
19616         if (pBtDbg->dbgCtrl == _TRUE)
19617         {
19618                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
19619                 {
19620                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
19621                         bRet = _TRUE;
19622                 }
19623         }
19624         else
19625         {
19626                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
19627                 {
19628                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
19629                         bRet = _TRUE;
19630                 }
19631         }
19632         return bRet;
19633 }
19634
19635 u8 BTDM_IsActionHIDPAN(PADAPTER padapter)
19636 {
19637         PHAL_DATA_TYPE  pHalData;
19638         PBT30Info               pBTInfo;
19639         PBT_DBG                 pBtDbg;
19640         u8                      bRet;
19641
19642
19643         pHalData = GET_HAL_DATA(padapter);
19644         pBTInfo = GET_BT_INFO(padapter);
19645         pBtDbg = &pBTInfo->BtDbg;
19646         bRet = _FALSE;
19647
19648         if (pBtDbg->dbgCtrl == _TRUE )
19649         {
19650                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
19651                 {
19652                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
19653                         bRet = _TRUE;
19654                 }
19655         }
19656         else
19657         {
19658                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
19659                 {
19660                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
19661                         bRet = _TRUE;
19662                 }
19663         }
19664         return bRet;
19665 }
19666
19667 u8 BTDM_IsActionPANA2DP(PADAPTER padapter)
19668 {
19669         PHAL_DATA_TYPE  pHalData;
19670         PBT30Info               pBTInfo;
19671         PBT_DBG                 pBtDbg;
19672         u8                      bRet;
19673
19674
19675         pHalData = GET_HAL_DATA(padapter);
19676         pBTInfo = GET_BT_INFO(padapter);
19677         pBtDbg = &pBTInfo->BtDbg;
19678         bRet = _FALSE;
19679
19680         if (pBtDbg->dbgCtrl == _TRUE )
19681         {
19682                 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
19683                 {
19684                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
19685                         bRet = _TRUE;
19686                 }
19687         }
19688         else
19689         {
19690                 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
19691                 {
19692                         pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
19693                         bRet = _TRUE;
19694                 }
19695         }
19696         return bRet;
19697 }
19698
19699 u8 BTDM_IsBtDisabled(PADAPTER padapter)
19700 {
19701         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19702
19703         if (pHalData->bt_coexist.bCurBtDisabled)
19704                 return _TRUE;
19705         else
19706                 return _FALSE;
19707 }
19708
19709 //============================================
19710 // Started with "WA_" means this is a work around function.
19711 // Because fw need to count bt HW counters
19712 //(BT_ACTIVE/BT_STATE/BT_POLLING)
19713 // in beacon related interrupt, so we have to write beacon control
19714 // register now.
19715 //============================================
19716 void WA_BTDM_EnableBTFwCounterPolling(PADAPTER padapter)
19717 {
19718         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19719
19720         // Currently, only 88cu and 92de need to enter the function
19721         if (!IS_HARDWARE_TYPE_8192CU(padapter) &&
19722                 !IS_HARDWARE_TYPE_8192DE(padapter))
19723                 return;
19724
19725         if (!pHalData->bt_coexist.BluetoothCoexist)
19726         {
19727                 return;
19728         }
19729         else
19730         {
19731                 //
19732                 // Enable BT firmware counter statistics.
19733                 // We have to set 0x550[3]=1 to enable it.
19734                 // Advised by Scott.
19735                 //
19736                 u8      u1val = 0;
19737                 u1val = rtw_read8(padapter, REG_BCN_CTRL);
19738                 u1val |= BIT3;
19739                 rtw_write8(padapter, REG_BCN_CTRL, u1val);
19740         }
19741 }
19742
19743 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
19744 #endif
19745
19746 #ifdef __HALBT_C__ // HAL/HalBT.c
19747 // ===== Below this line is sync from SD7 driver HAL/HalBT.c =====
19748
19749 //==================================================
19750 //      local function
19751 //==================================================
19752 #if 0
19753 static void halbt_SetBTSwitchCtrl(PADAPTER padapter)
19754 {
19755         // switch control, here we set pathA to control
19756         // 0x878[13] = 1, 0:pathB, 1:pathA(default)
19757         PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, BIT(13), 0x1);
19758
19759         // antsel control, here we use phy0 and enable antsel.
19760         // 0x87c[16:15] = b'11, enable antsel, antsel output pin
19761         // 0x87c[30] = 0, 0: phy0, 1:phy 1
19762         PHY_SetBBReg(padapter, rFPGA0_XCD_RFParameter, bMaskDWord, 0x1fff8);
19763
19764         // antsel to Bt or Wifi, it depends Bt on/off.
19765         // 0x860[9:8] = 'b10, b10:Bt On, WL2G off(default), b01:Bt off, WL2G on.
19766         PHY_SetBBReg(padapter, rFPGA0_XA_RFInterfaceOE, BIT(9)|BIT(8), 0x2);
19767
19768         // sw/hw control switch, here we set sw control
19769         // 0x870[9:8] = 'b11 sw control, 'b00 hw control
19770         PHY_SetBBReg(padapter, rFPGA0_XAB_RFInterfaceSW, BIT(9)|BIT(8), 0x3);
19771 }
19772 #endif
19773
19774 static void halbt_InitHwConfig8723A(PADAPTER padapter)
19775 {
19776 }
19777
19778 //==================================================
19779 //      extern function
19780 //==================================================
19781 u8 HALBT_GetPGAntNum(PADAPTER padapter)
19782 {
19783         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19784
19785         return pHalData->bt_coexist.BT_Ant_Num;
19786 }
19787
19788 void HALBT_SetKey(PADAPTER padapter, u8 EntryNum)
19789 {
19790         PBT30Info               pBTinfo;
19791         PBT_ASOC_ENTRY  pBtAssocEntry;
19792         u16                             usConfig = 0;
19793
19794
19795         pBTinfo = GET_BT_INFO(padapter);
19796         pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
19797
19798         pBtAssocEntry->HwCAMIndex = BT_HWCAM_STAR + EntryNum;
19799
19800         usConfig = CAM_VALID | (CAM_AES << 2);
19801         write_cam(padapter, pBtAssocEntry->HwCAMIndex, usConfig, pBtAssocEntry->BTRemoteMACAddr, pBtAssocEntry->PTK + TKIP_ENC_KEY_POS);
19802 }
19803
19804 void HALBT_RemoveKey(PADAPTER padapter, u8 EntryNum)
19805 {
19806         PBT30Info               pBTinfo;
19807         PBT_ASOC_ENTRY  pBtAssocEntry;
19808
19809         pBTinfo = GET_BT_INFO(padapter);
19810         pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
19811
19812         if (pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex != 0) {
19813                 // ToDo : add New HALBT_RemoveKey function !!
19814                 if (pBtAssocEntry->HwCAMIndex >= BT_HWCAM_STAR && pBtAssocEntry->HwCAMIndex < HALF_CAM_ENTRY)
19815                         CAM_empty_entry(padapter, pBtAssocEntry->HwCAMIndex);
19816                 pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex = 0;
19817         }
19818 }
19819
19820 void HALBT_InitBTVars8723A(PADAPTER padapter)
19821 {
19822         PHAL_DATA_TYPE  pHalData;
19823
19824
19825         pHalData = GET_HAL_DATA(padapter);
19826
19827         pHalData->bt_coexist.BluetoothCoexist = pHalData->EEPROMBluetoothCoexist;
19828         pHalData->bt_coexist.BT_Ant_Num = pHalData->EEPROMBluetoothAntNum;
19829         pHalData->bt_coexist.BT_CoexistType = pHalData->EEPROMBluetoothType;
19830         pHalData->bt_coexist.BT_Ant_isolation = pHalData->EEPROMBluetoothAntIsolation;
19831         pHalData->bt_coexist.BT_RadioSharedType = pHalData->EEPROMBluetoothRadioShared;
19832
19833         RT_TRACE(_module_hal_init_c_, _drv_info_, ("BT Coexistance = 0x%x\n", pHalData->bt_coexist.BluetoothCoexist));
19834         if (pHalData->bt_coexist.BluetoothCoexist)
19835         {
19836                 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
19837                 {
19838                         BTDM_SetBtCoexCurrAntNum(padapter, 2);
19839                         RT_TRACE(_module_hal_init_c_, _drv_info_,("BlueTooth BT_Ant_Num = Antx2\n"));
19840 //                      DBG_8723A("%s WiFi BT coexist Ant_Num = Antx2\n",__func__);
19841                 }
19842                 else if (pHalData->bt_coexist.BT_Ant_Num == Ant_x1)
19843                 {
19844                         BTDM_SetBtCoexCurrAntNum(padapter, 1);
19845                         RT_TRACE(_module_hal_init_c_, _drv_info_,("BlueTooth BT_Ant_Num = Antx1\n"));
19846 //                      DBG_8723A("%s WiFi BT coexist Ant_Num Ant_Num = Antx1\n",__func__);
19847                 }
19848                 pHalData->bt_coexist.bBTBusyTraffic = _FALSE;
19849                 pHalData->bt_coexist.bBTTrafficModeSet = _FALSE;
19850                 pHalData->bt_coexist.bBTNonTrafficModeSet = _FALSE;
19851                 pHalData->bt_coexist.CurrentState = 0;
19852                 pHalData->bt_coexist.PreviousState = 0;
19853
19854                 RT_TRACE(_module_hal_init_c_, _drv_info_,("BT_RadioSharedType = 0x%x\n", pHalData->bt_coexist.BT_RadioSharedType));
19855         }
19856 }
19857
19858 u8 HALBT_IsBTExist(PADAPTER padapter)
19859 {
19860         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19861
19862         if (pHalData->bt_coexist.BluetoothCoexist)
19863                 return _TRUE;
19864         else
19865                 return _FALSE;
19866 }
19867
19868 u8 HALBT_BTChipType(PADAPTER padapter)
19869 {
19870         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19871
19872         return pHalData->bt_coexist.BT_CoexistType;
19873 }
19874
19875 void HALBT_InitHwConfig(PADAPTER padapter)
19876 {
19877 #if 0
19878         if (IS_HARDWARE_TYPE_8192C(padapter))
19879         {
19880                 halbt_InitHwConfig92C(padapter);
19881         }
19882         else if (IS_HARDWARE_TYPE_8192D(padapter))
19883         {
19884                 halbt_InitHwConfig92D(padapter);
19885         }
19886         else if (IS_HARDWARE_TYPE_8723A(padapter))
19887 #endif
19888         {
19889                 halbt_InitHwConfig8723A(padapter);
19890                 BTDM_Coexist(padapter);
19891         }
19892 }
19893
19894 void HALBT_IPSRFOffCheck(PADAPTER padapter)
19895 {
19896         PBT30Info               pBTinfo;
19897         PBT_MGNT                pBtMgnt;
19898         PHAL_DATA_TYPE  pHalData;
19899
19900
19901         pBTinfo = GET_BT_INFO(padapter);
19902         pBtMgnt = &pBTinfo->BtMgnt;
19903         pHalData = GET_HAL_DATA(padapter);
19904
19905         if (IS_HARDWARE_TYPE_8192C(padapter) ||
19906                 IS_HARDWARE_TYPE_8192D(padapter) ||
19907                 IS_HARDWARE_TYPE_8723A(padapter))
19908         {
19909                 if ((pHalData->bt_coexist.BluetoothCoexist) &&
19910                         (pBtMgnt->bSupportProfile))
19911                 {
19912                         RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_IPSRFOffCheck(), turn off all Coexist DM\n"));
19913                         BTDM_CoexAllOff(padapter);
19914                 }
19915         }
19916 }
19917
19918 void HALBT_LPSRFOffCheck(PADAPTER padapter)
19919 {
19920         PBT30Info               pBTinfo;
19921         PBT_MGNT                pBtMgnt;
19922         PHAL_DATA_TYPE  pHalData;
19923
19924
19925         pBTinfo = GET_BT_INFO(padapter);
19926         pBtMgnt = &pBTinfo->BtMgnt;
19927         pHalData = GET_HAL_DATA(padapter);
19928
19929         if (IS_HARDWARE_TYPE_8192C(padapter) ||
19930                 IS_HARDWARE_TYPE_8192D(padapter) ||
19931                 IS_HARDWARE_TYPE_8723A(padapter))
19932         {
19933                 if ((pHalData->bt_coexist.BluetoothCoexist) &&
19934                         (pBtMgnt->bSupportProfile))
19935                 {
19936                         RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_LPSRFOffCheck(), turn off all Coexist DM\n"));
19937                         BTDM_CoexAllOff(padapter);
19938                 }
19939         }
19940 }
19941
19942 void HALBT_SetRtsCtsNoLenLimit(PADAPTER padapter)
19943 {
19944 #if (RTS_CTS_NO_LEN_LIMIT == 1)
19945         rtw_write32(padapter, 0x4c8, 0xc140402);
19946 #endif
19947 }
19948
19949 u8 HALBT_OnlySupport1T(PADAPTER padapter)
19950 {
19951 #if 0
19952         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
19953
19954         if (IS_HARDWARE_TYPE_8192DE(padapter))
19955         {
19956                 if ((SINGLEMAC_SINGLEPHY == pHalData->MacPhyMode92D) &&
19957                         (pHalData->bt_coexist.BluetoothCoexist) &&
19958                         (pHalData->CurrentBandType92D==BAND_ON_2_4G) &&
19959                         (!pHalData->bt_coexist.bCurBtDisabled))
19960                 {
19961                         RTPRINT(FIOCTL, IOCTL_STATE, ("[92d], 1T condition!!\n"));
19962                         return _TRUE;
19963                 }
19964         }
19965         RTPRINT(FIOCTL, IOCTL_STATE, ("[92d], 2T condition!!\n"));
19966 #endif
19967         return _FALSE;
19968 }
19969
19970 u8
19971 HALBT_BtRegAccess(
19972         PADAPTER        padapter,
19973         u32                     accessType,
19974         u32                     regType,
19975         u32                     regOffset,
19976         u32                     wValue,
19977         u32                     *pRetVal
19978         )
19979 {
19980         u8      H2C_Parameter[5] = {0};
19981
19982         if (IS_HARDWARE_TYPE_8723A(padapter))
19983         {
19984                 *pRetVal = 0x223;
19985                 //FillH2CCmd(padapter, 0xaf, 5, H2C_Parameter);
19986         }
19987         else
19988         {
19989                 *pRetVal = 0xffffffff;
19990                 return _FALSE;
19991         }
19992
19993         return _TRUE;
19994 }
19995
19996 void HALBT_SwitchWirelessMode(PADAPTER padapter, u8 targetWirelessMode)
19997 {
19998 #if 0
19999         PMGNT_INFO      pMgntInfo = &padapter->MgntInfo;
20000         u8      band;
20001
20002         if (!IS_HARDWARE_TYPE_8192D(padapter))
20003                 return;
20004
20005         RTPRINT(FIOCTL, IOCTL_STATE, ("switch to wireless mode = 0x%x!!\n", targetWirelessMode));
20006         pMgntInfo->dot11CurrentWirelessMode = targetWirelessMode;
20007         pMgntInfo->SettingBeforeScan.WirelessMode = pMgntInfo->dot11CurrentWirelessMode;//For N solution won't be change the wireless mode in scan
20008         padapter->HalFunc.SetWirelessModeHandler(padapter, pMgntInfo->dot11CurrentWirelessMode);
20009
20010         if ((targetWirelessMode == WIRELESS_MODE_N_5G) ||
20011                 (targetWirelessMode == WIRELESS_MODE_A))
20012                 band = BAND_ON_5G;
20013         else
20014                 band = BAND_ON_2_4G;
20015         rtw_hal_set_hwreg(padapter, HW_VAR_DUAL_SWITCH_BAND, &band);
20016         rtw_mdelay_os(50);
20017 #endif
20018 }
20019
20020 // ===== End of sync from SD7 driver HAL/HalBT.c =====
20021 #endif