1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
20 #include <drv_types.h>
21 #include <rtl8723a_hal.h>
30 #define CHECK_BT_EXIST_FROM_REG
32 //#define BTCOEX_DECREASE_WIFI_POWER
33 //#define BTCOEX_CMCC_TEST
35 #ifdef CONFIG_BT_COEXIST
38 u32 BTCoexDbgLevel = _bt_dbg_off_;
40 #define RTPRINT(_Comp, _Level, Fmt)\
42 if((BTCoexDbgLevel ==_bt_dbg_on_)) {\
43 /* printk("%s", DRIVER_PREFIX);*/\
48 #define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\
49 if((BTCoexDbgLevel ==_bt_dbg_on_) ){\
51 u8 *ptr = (u8*)_Ptr; \
54 for( __i=0; __i<6; __i++ ) \
55 printk("%02X%s", ptr[__i], (__i==5)?"":"-"); \
58 #define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\
59 if((BTCoexDbgLevel ==_bt_dbg_on_) ){\
61 u8 *ptr = (u8*)_HexData; \
62 printk(_TitleString); \
63 for( __i=0; __i<(u32)_HexDataLen; __i++ ) \
65 printk("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\
66 if (((__i + 1) % 16) == 0) printk("\n");\
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) \
75 /* if (((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) */\
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++) \
84 if (!PRINTABLE(buffer[__i])) buffer[__i] = '?'; \
86 buffer[length] = '\0'; \
87 /* printk("Rtl819x: ");*/ \
88 printk(_TitleString); \
89 printk(": %d, <%s>\n", _Len, buffer); \
92 #endif // PLATFORM_LINUX
97 #define RTPRINT_ADDR(...)
98 #define RTPRINT_DATA(...)
99 #define RT_PRINT_STR(...)
103 #define DCMD_Printf(...)
104 #define RT_ASSERT(...)
106 #ifdef PLATFORM_LINUX
107 #define rsprintf snprintf
108 #elif defined(PLATFORM_WINDOWS)
109 #define rsprintf sprintf_s
114 #define GetDefaultAdapter(padapter) padapter
116 #define PlatformZeroMemory(ptr, sz) _rtw_memset(ptr, 0, sz)
118 #ifdef PLATFORM_LINUX
119 #define PlatformProcessHCICommands(...)
120 #define PlatformTxBTQueuedPackets(...)
121 #define PlatformIndicateBTACLData(...) (RT_STATUS_SUCCESS)
123 #define PlatformAcquireSpinLock(padapter, type)
124 #define PlatformReleaseSpinLock(padapter, type)
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)
133 _cancel_timer(ptimer, &bcancelled);
136 #define PlatformReleaseTimer(...)
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)
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)
151 #define GET_UNDECORATED_AVERAGE_RSSI(padapter) \
152 (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB)
154 #define RT_RF_CHANGE_SOURCE u32
156 typedef enum _RT_JOIN_ACTION{
165 #define IPSReturn(padapter, b) ips_enter(padapter)
166 #define IPSDisable(padapter, b, c) ips_leave(padapter)
168 #define IPSReturn(...)
169 #define IPSDisable(...)
172 #define LeisurePSLeave(padapter, b) LPS_Leave(padapter)
174 #define LeisurePSLeave(...)
177 #ifdef __BT_C__ // COMMOM/BT.c
178 // ===== Below this line is sync from SD7 driver COMMOM/BT.c =====
180 u8 BT_Operation(PADAPTER padapter)
182 PBT30Info pBTInfo = GET_BT_INFO(padapter);
183 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
185 if (pBtMgnt->BtOperationOn)
191 u8 BT_IsLegalChannel(PADAPTER padapter, u8 channel)
193 PRT_CHANNEL_INFO pChanneList = NULL;
197 pChanneList = padapter->mlmeextpriv.channel_set;
198 channelLen = padapter->mlmeextpriv.max_chan_nums;
200 for (i = 0; i < channelLen; i++)
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))
212 void BT_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
214 BTDM_SignalCompensation(padapter, rssi_wifi, rssi_bt);
217 void BT_WifiScanNotify(PADAPTER padapter, u8 scanType)
219 BTHCI_WifiScanNotify(padapter, scanType);
220 BTDM_CheckAntSelMode(padapter);
221 BTDM_WifiScanNotify(padapter, scanType);
224 void BT_WifiAssociateNotify(PADAPTER padapter, u8 action)
227 // TRUE = associate start
228 // FALSE = associate finished
230 BTDM_CheckAntSelMode(padapter);
232 BTDM_WifiAssociateNotify(padapter, action);
235 void BT_WifiMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
237 BTDM_MediaStatusNotify(padapter, mstatus);
240 void BT_SpecialPacketNotify(PADAPTER padapter)
242 BTDM_ForDhcp(padapter);
245 void BT_HaltProcess(PADAPTER padapter)
247 BTDM_ForHalt(padapter);
250 void BT_LpsLeave(PADAPTER padapter)
252 BTDM_LpsLeave(padapter);
255 // ===== End of sync from SD7 driver COMMOM/BT.c =====
258 #ifdef __BT_HANDLEPACKET_C__ // COMMOM/bt_handlepacket.c
259 // ===== Below this line is sync from SD7 driver COMMOM/bt_handlepacket.c =====
261 void btpkt_SendBeacon(PADAPTER padapter)
263 #if 0 // not implement yet
265 PRT_TX_LOCAL_BUFFER pBuf;
267 PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
269 if (MgntGetBuffer(padapter, &pTcb, &pBuf))
271 btpkt_ConstructBeaconFrame(
273 pBuf->Buffer.VirtualAddress,
274 &pTcb->PacketLength);
276 MgntSendPacket(padapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, MGN_1M);
280 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
284 void BTPKT_WPAAuthINITIALIZE(PADAPTER padapter, u8 EntryNum)
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);
293 RTPRINT(FIOCTL, IOCTL_STATE, ("BTPKT_WPAAuthINITIALIZE() EntryNum = %d\n",EntryNum));
295 if (pHalData->bBTMode)
297 // if (padapter->MgntInfo.OpMode == RT_OP_MODE_IBSS)
298 if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
300 pBtSec->bUsedHwEncrypt = _FALSE;
304 pBtSec->bUsedHwEncrypt = _TRUE;
308 pBtSec->bUsedHwEncrypt = _FALSE;
310 pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount = 0;
312 if (pBTinfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR)
314 u8 RdmBuf[20], NonceBuf[KEY_NONCE_LEN];
316 u64 KeyReplayCounter = 0;
319 // Gene Creator Nonce
320 GetRandomBuffer(RdmBuf);
321 for (index = 0; index < 16; index++)
323 NonceBuf[index] = RdmBuf[index];
324 NonceBuf[16+index] = RdmBuf[19-index];
326 _rtw_memcpy(pBTinfo->BtAsocEntry[EntryNum].ANonce, NonceBuf, KEY_NONCE_LEN);
329 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
331 for( index = 0 ; index < 8 ; index++)
332 temp[index] = (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >>( (7-index) *8)) &0xff);
334 _rtw_memcpy(&KeyReplayCounter, temp, 8);
335 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT pkt], 4-way packet, send 1st and wait for 2nd pkt\n"));
337 pBtDbg->dbgBtPkt.btPktTx4way1st++;
339 // Send 1st packet of 4-way
340 btpkt_SendEapolKeyPacket(
342 pBTinfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, //Sta MAC address
343 NULL, // Pointer to KCK (EAPOL-Key Confirmation Key).
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.
359 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_WAIT_PACKET_2;
361 PlatformSetTimer(padapter, &pBtSec->BTWPAAuthTimer , BT_WPA_AUTH_TIMEOUT_PERIOD);
362 // Set WPA Auth State
364 RTPRINT(FIOCTL, IOCTL_STATE, ("Initial BT WPA Creat mode successful !!\n"));
366 else if (pBTinfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
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"));
375 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_UNINITIALIZED;
376 RTPRINT(FIOCTL, IOCTL_STATE, ("=====> BT unknown mode\n"));
381 void BTPKT_TimerCallbackWPAAuth(PRT_TIMER pTimer)
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;
394 // Now we check all BT entry !!
396 for (index = 0; index < MAX_BT_ASOC_ENTRY_NUM; index++)
399 if (!pBTinfo->BtAsocEntry[index].bUsed)
403 if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_SUCCESSED)
406 if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_UNINITIALIZED)
408 RTPRINT(FIOCTL, IOCTL_STATE, ("====> BTPKT_TimerCallbackWPAAuth(), BTPKT_WPAAuthINITIALIZE!!\n"));
409 BTPKT_WPAAuthINITIALIZE(padapter,EntryNum);
413 // Add Re-play counter !!
414 pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount++;
416 if (pBTinfo->BtAsocEntry[EntryNum].WPAAuthReplayCount > BTMaxWPAAuthReTransmitCoun)
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"));
422 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_1)
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"));
429 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_2)
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 !!
434 u64 KeyReplayCounter = 0;
438 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
440 for (indexi = 0; indexi < 8; indexi++)
441 temp[indexi] = (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >>((7-indexi)*8))&0xff);
443 // Send 1st packet of 4-way
444 btpkt_SendEapolKeyPacket(
446 pBTinfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, //Sta MAC address
447 NULL, // Pointer to KCK (EAPOL-Key Confirmation Key).
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.
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"));
469 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_3)
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"));
476 else if (pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState == STATE_WPA_AUTH_WAIT_PACKET_4)
478 // Re-Send 3th of 4-way !!
480 u64 KeyReplayCounter = 0;
484 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter ++;
486 for (indexi = 0; indexi < 8; indexi++)
487 temp[indexi] = (u8)((pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter >> ((7-indexi)*8))&0xff);
489 btpkt_SendEapolKeyPacket(
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.
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"));
516 RTPRINT(FIOCTL, IOCTL_STATE, ("====> BTPKT_TimerCallbackWPAAuth(), Error State !!%d\n",pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState ));
523 void BTPKT_TimerCallbackBeacon(PRT_TIMER pTimer)
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;
531 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("=====> BTPKT_TimerCallbackBeacon\n"));
532 // if (RT_CANNOT_IO(padapter))
534 //pMgntInfo->BtInfo.BTBeaconTmrOn = _TRUE;
536 if (!pBTinfo->BTBeaconTmrOn)
539 if (pBtMgnt->BtOperationOn)
541 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("btpkt_SendBeacon\n"));
542 btpkt_SendBeacon(GetDefaultAdapter(padapter));
543 PlatformSetTimer(padapter, &pBTinfo->BTBeaconTimer, 100);
547 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("<===== BTPKT_TimerCallbackBeacon\n"));
552 // ===== End of sync from SD7 driver COMMOM/bt_handlepacket.c =====
555 #ifdef __BT_HCI_C__ // COMMOM/bt_hci.c
558 #define UINT64_C(v) (v)
560 #define FillOctetString(_os,_octet,_len) \
561 (_os).Octet=(u8*)(_octet); \
564 static RT_STATUS PlatformIndicateBTEvent(
570 RT_STATUS rt_status = RT_STATUS_FAILURE;
571 #ifdef PLATFORM_WINDOWS
572 NTSTATUS nt_status = STATUS_SUCCESS;
574 u32 BytesTransferred = 0;
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",
581 // if (pGBTDeviceExtension==NULL || pGBTDeviceExtension->padapter!=padapter)
584 BT_EventParse(padapter, pEvntData, dataLen);
586 #ifdef PLATFORM_LINUX
588 printk(KERN_WARNING "%s: Linux has no way to report BT event!!\n", __FUNCTION__);
590 #elif defined(PLATFORM_WINDOWS)
592 pIrp = IOCTL_BtIrpDequeue(pGBTDeviceExtension, IRP_HCI_EVENT_Q);
600 outbuf = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, HighPagePriority);
603 RTPRINT(FIOCTL, IOCTL_IRP, ("PlatformIndicateBTEvent(), error!! MdlAddress = NULL!!\n"));
604 BytesTransferred = 0;
605 nt_status = STATUS_UNSUCCESSFUL;
609 outlen = MmGetMdlByteCount(pIrp->MdlAddress);
610 offset = MmGetMdlByteOffset(pIrp->MdlAddress);
612 if(dataLen <= outlen)
613 BytesTransferred = dataLen;
615 BytesTransferred = outlen;
616 _rtw_memcpy(outbuf, pEvntData, BytesTransferred);
617 nt_status = STATUS_SUCCESS;
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);
623 IOCTL_CompleteSingleIRP(pIrp, nt_status, BytesTransferred);
624 if (nt_status == STATUS_SUCCESS)
625 rt_status = RT_STATUS_SUCCESS;
628 #endif // PLATFORM_WINDOWS
630 RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event end, %s\n",
631 (rt_status == RT_STATUS_SUCCESS)? "SUCCESS":"FAIL"));
636 // ===== Below this line is sync from SD7 driver COMMOM/bt_hci.c =====
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,
643 u8 bthci_GetLocalChannel(PADAPTER padapter)
645 return padapter->mlmeextpriv.cur_channel;
648 u8 bthci_GetCurrentEntryNum(PADAPTER padapter, u8 PhyHandle)
650 PBT30Info pBTInfo = GET_BT_INFO(padapter);
653 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
655 if ((pBTInfo->BtAsocEntry[i].bUsed == _TRUE) && (pBTInfo->BtAsocEntry[i].PhyLinkCmdData.BtPhyLinkhandle == PhyHandle))
664 void bthci_DecideBTChannel(PADAPTER padapter, u8 EntryNum)
666 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
667 struct mlme_priv *pmlmepriv;
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;
677 pmlmepriv = &padapter->mlmepriv;
678 pBTInfo = GET_BT_INFO(padapter);
679 pBtMgnt = &pBTInfo->BtMgnt;
680 pBtHciInfo = &pBTInfo->BtHciInfo;
682 pBtMgnt->CheckChnlIsSuit = _TRUE;
683 localchnl = bthci_GetLocalChannel(padapter);
686 #if 0 // for debug only
687 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
689 // contains country string len is 3
690 for (i=0; i<(pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
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);
696 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
698 // contains country string, len is 3
699 for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
702 // check every triplet, an triplet may be
703 // regulatory extension identifier or sub-band triplet
705 if (pTriple->byte_1st == 0xc9) // Regulatory Extension Identifier, skip it
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;
712 else // Sub-band triplet
714 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find Sub-band triplet \n"));
716 pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
718 // if remote first legal channel not found, then find first remote channel
719 // and it's legal for our channel plan.
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++)
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.
728 firstRemoteLegalChnlInTriplet = j;
729 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find first remote legal channel : %d\n", firstRemoteLegalChnlInTriplet));
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.
737 if (!MgntRoamingInProgress(pMgntInfo) &&
738 !MgntIsLinkInProgress(pMgntInfo) &&
739 !MgntScanInProgress(pMgntInfo))
743 if (!(pMgntInfo->mAssoc ||
745 IsAPModeExist(padapter)||
746 BTHCI_HsConnectionEstablished(padapter)))
748 if (!(check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE ||
749 BTHCI_HsConnectionEstablished(padapter)))
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));
758 if ((localchnl >= firstRemoteLegalChnlInTriplet) &&
759 (localchnl < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls)))
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));
773 if (subbandTripletCnt)
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)
779 //no legal channel is found, reject the connection.
780 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("no legal channel is found!!\n"));
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"));
788 pBtMgnt->CheckChnlIsSuit = _FALSE;
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"));
796 pBtMgnt->BTChannel = localchnl;
797 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Local channel (%d) is selected!!\n", pBtMgnt->BTChannel));
802 //Success:return _TRUE
804 u8 bthci_GetAssocInfo(PADAPTER padapter, u8 EntryNum)
806 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
808 PBT_HCI_INFO pBtHciInfo;
811 u8 BaseMemoryShift = 0;
814 PAMP_ASSOC_STRUCTURE pAmpAsoc;
817 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo start\n"));
819 pBTInfo = GET_BT_INFO(padapter);
820 pBtHciInfo = &pBTInfo->BtHciInfo;
822 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar == 0)
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;
830 else if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar > 0)
831 TotalLen = pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar;
833 while ((pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar >= BaseMemoryShift) || TotalLen > BaseMemoryShift)
835 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("GetAssocInfo, TotalLen=%d, BaseMemoryShift=%d\n",TotalLen,BaseMemoryShift));
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);
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;
848 pAmpAsoc = (PAMP_ASSOC_STRUCTURE)tempBuf;
849 pAmpAsoc->Length = EF2Byte(pAmpAsoc->Length);
850 BaseMemoryShift += 3 + pAmpAsoc->Length;
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)
859 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_MAC_ADDR\n"));
860 if (pAmpAsoc->Length > 6)
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);
870 case AMP_PREFERRED_CHANNEL_LIST:
872 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_PREFERRED_CHANNEL_LIST\n"));
873 pBtHciInfo->BtPreChnlListLen=pAmpAsoc->Length;
874 _rtw_memcpy(pBtHciInfo->BTPreChnllist,
876 pBtHciInfo->BtPreChnlListLen);
877 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, "Preferred channel list : \n", pBtHciInfo->BTPreChnllist, pBtHciInfo->BtPreChnlListLen);
878 bthci_DecideBTChannel(padapter,EntryNum);
882 case AMP_CONNECTED_CHANNEL:
884 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_CONNECTED_CHANNEL\n"));
885 pBtHciInfo->BTConnectChnlListLen=pAmpAsoc->Length;
886 _rtw_memcpy(pBtHciInfo->BTConnectChnllist,
888 pBtHciInfo->BTConnectChnlListLen);
893 case AMP_80211_PAL_CAP_LIST:
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)
902 //Signifies PAL capable of utilizing received activity reports.
904 if (pBTInfo->BtAsocEntry[EntryNum].BTCapability && 0x00000002)
907 //Signifies PAL is capable of utilizing scheduling information received in an activity reports.
912 case AMP_80211_PAL_VISION:
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));
925 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> Unsupport TypeID !!\n"));
930 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo end\n"));
935 u8 bthci_AddEntry(PADAPTER padapter)
942 pBTInfo = GET_BT_INFO(padapter);
943 pBtMgnt = &pBTInfo->BtMgnt;
945 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
947 if (pBTInfo->BtAsocEntry[i].bUsed == _FALSE)
949 pBTInfo->BtAsocEntry[i].bUsed = _TRUE;
950 pBtMgnt->CurrentConnectEntryNum = i;
955 if (i == MAX_BT_ASOC_ENTRY_NUM)
957 RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_AddEntry(), Add entry fail!!\n"));
963 u8 bthci_DiscardTxPackets(PADAPTER padapter, u16 LLH)
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;
972 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_DiscardTxPackets() ==>\n"));
974 PlatformAcquireSpinLock(padapter, RT_BTData_SPINLOCK);
975 while(!RTIsListEmpty(&padapter->BTDataTxQueue))
977 pLocalBuffer = (PRT_TX_LOCAL_BUFFER)RTRemoveHeadListWithCnt(&padapter->BTDataTxQueue, &padapter->NumTxBTDataBlock);
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);
986 PlatformReleaseSpinLock(padapter, RT_BTData_SPINLOCK);
988 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_DiscardTxPackets() <==\n"));
996 bthci_CheckLogLinkBehavior(
998 HCI_FLOW_SPEC TxFlowSpec
1001 u8 ID = TxFlowSpec.Identifier;
1002 u8 ServiceType = TxFlowSpec.ServiceType;
1003 u16 MaxSDUSize = TxFlowSpec.MaximumSDUSize;
1004 u32 SDUInterArrivatime = TxFlowSpec.SDUInterArrivalTime;
1011 if (ServiceType == BT_LL_BE)
1014 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX best effort flowspec\n"));
1016 else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 0xffff))
1019 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX guaranteed latency flowspec\n"));
1021 else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 2500))
1023 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX guaranteed Large latency flowspec\n"));
1029 if (ServiceType == BT_LL_BE)
1032 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX best effort flowspec\n"));
1039 if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 1492))
1042 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX guaranteed latency flowspec\n"));
1044 else if ((ServiceType==BT_LL_GU) && (MaxSDUSize==2500))
1046 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX guaranteed Large latency flowspec\n"));
1052 if (ServiceType == BT_LL_BE)
1054 if ((SDUInterArrivatime == 0xffffffff) && (ServiceType == BT_LL_BE) && (MaxSDUSize == 1492))
1057 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX/RX aggregated best effort flowspec\n"));
1060 else if (ServiceType == BT_LL_GU)
1062 if ((SDUInterArrivatime == 100) && 10000)
1065 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX/RX guaranteed bandwidth flowspec\n"));
1072 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = Unknow Type !!!!!!!!\n"));
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));
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));
1088 bthci_SelectFlowType(
1090 BT_LL_FLOWSPEC TxLLFlowSpec,
1091 BT_LL_FLOWSPEC RxLLFlowSpec,
1092 PHCI_FLOW_SPEC TxFlowSpec,
1093 PHCI_FLOW_SPEC RxFlowSpec
1096 switch (TxLLFlowSpec)
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;
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;
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;
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;
1138 case BT_TX_BE_AGG_FS:
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;
1148 case BT_RX_BE_AGG_FS:
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;
1158 case BT_TX_GU_BW_FS:
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;
1168 case BT_RX_GU_BW_FS:
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;
1178 case BT_TX_GU_LARGE_FS:
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;
1188 case BT_RX_GU_LARGE_FS:
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;
1202 switch (RxLLFlowSpec)
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;
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;
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;
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;
1244 case BT_TX_BE_AGG_FS:
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;
1254 case BT_RX_BE_AGG_FS:
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;
1264 case BT_TX_GU_BW_FS:
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;
1274 case BT_RX_GU_BW_FS:
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;
1284 case BT_TX_GU_LARGE_FS:
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;
1294 case BT_RX_GU_LARGE_FS:
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;
1315 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1317 u8 FakeAddress[6],i;
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);
1331 return (pAssoStrc->Length+3);
1335 bthci_PALCapabilities(
1340 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1342 pAssoStrc->TypeID = AMP_80211_PAL_CAP_LIST;
1343 pAssoStrc->Length = 0x04;
1345 pAssoStrc->Data[0] = 0x00;
1346 pAssoStrc->Data[1] = 0x00;
1348 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("PALCapabilities : \n"), pAssoStrc, pAssoStrc->Length+3);
1349 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("PALCapabilities \n"));
1351 RTPRINT(FIOCTL, IOCTL_BT_LOGO, (" TypeID = 0x%x,\n Length = 0x%x,\n Content =0x0000\n",
1353 pAssoStrc->Length));
1355 return (pAssoStrc->Length+3);
1359 bthci_AssocPreferredChannelList(
1365 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
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'};
1373 u8 i=0, NumTriples=0, preferredChnl;
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];
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) )
1389 _rtw_memcpy(&pAssoStrc->Data[0], &pDot11dInfo->CountryIeBuf[0], 3);
1391 pReg->regulatoryClass = 254; // should parse beacon frame
1392 pReg->coverageClass = 0;
1394 pTriple=(PCHNL_TXPOWER_TRIPLE)&pAssoStrc->Data[len];
1395 pTripleIE = (PCHNL_TXPOWER_TRIPLE)(&pDot11dInfo->CountryIeBuf[3]);
1397 NumTriples = (pDot11dInfo->CountryIeLen-3)/3;// skip 3-byte country string.
1398 for (i=0; i<NumTriples; i++)
1400 if ( (preferredChnl > pTripleIE->FirstChnl) &&
1401 (preferredChnl <= (pTripleIE->FirstChnl+pTripleIE->NumChnls-1)))
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
1409 // (1) group 1, preferred channel
1410 pTriple->FirstChnl = preferredChnl;
1411 pTriple->NumChnls = 1;
1412 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1414 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1416 // (2) group 2, first chnl~preferred-1
1417 pTriple->FirstChnl = pTripleIE->FirstChnl;
1418 pTriple->NumChnls = preferredChnl-pTriple->FirstChnl;
1419 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1421 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1423 if (preferredChnl < (pTripleIE->FirstChnl+pTripleIE->NumChnls-1))
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;
1430 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1435 pTriple->FirstChnl = pTripleIE->FirstChnl;
1436 pTriple->NumChnls = pTripleIE->NumChnls;
1437 pTriple->MaxTxPowerInDbm = pTripleIE->MaxTxPowerInDbm;
1439 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1441 pTripleIE = (PCHNL_TXPOWER_TRIPLE)((u8*)pTripleIE + 3);
1448 _rtw_memcpy(&pAssoStrc->Data[0], &ctrString[0], 3);
1450 pReg->regulatoryClass = 254;
1451 pReg->coverageClass = 0;
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];
1458 // (1) if any wifi or bt HS connection exists
1459 if ((pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR) ||
1461 pMgntInfo->mAssoc ||
1463 IsExtAPModeExist(padapter)) ||
1465 (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) ||
1467 BTHCI_HsConnectionEstablished(padapter))
1469 pTriple->FirstChnl = preferredChnl;
1470 pTriple->NumChnls = 1;
1471 pTriple->MaxTxPowerInDbm = 20;
1473 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1476 pTriple->MaxTxPowerInDbm));
1478 //pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1481 // If we are responder, we can fill all the channel list.
1482 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole!=AMP_BTAP_CREATOR)
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
1489 if (!pMgntInfo->mAssoc &&
1490 (padapter->MgntInfo.Regdot11networktype != RT_JOIN_NETWORKTYPE_ADHOC ))
1492 // (2) group 2, chnl 1~preferred-1
1493 if (preferredChnl > 1 && preferredChnl<15)
1495 pTriple->FirstChnl = 1;
1496 pTriple->NumChnls = preferredChnl-1;
1497 pTriple->MaxTxPowerInDbm = 20;
1499 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1502 pTriple->MaxTxPowerInDbm));
1503 pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1506 // (3) group 3, preferred+1~chnl 11
1507 if (preferredChnl < 11)
1509 pTriple->FirstChnl = preferredChnl+1;
1510 pTriple->NumChnls = 11-preferredChnl;
1511 pTriple->MaxTxPowerInDbm = 20;
1513 //pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1515 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1518 pTriple->MaxTxPowerInDbm));
1524 pAssoStrc->Length = (u16)len;
1525 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, ("AssocPreferredChannelList : \n"), pAssoStrc, pAssoStrc->Length+3);
1527 return (pAssoStrc->Length+3);
1530 u16 bthci_AssocPALVer(PADAPTER padapter, void *pbuf)
1532 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
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
1545 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("AssocPALVer : \n"), pAssoStrc, pAssoStrc->Length+3);
1546 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("AssocPALVer \n"));
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",
1550 pAssoStrc->Length));
1551 return (pAssoStrc->Length+3);
1555 bthci_ReservedForTestingPLV(
1560 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1562 pAssoStrc->TypeID = AMP_RESERVED_FOR_TESTING;
1563 pAssoStrc->Length = 0x10;
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;
1582 return (pAssoStrc->Length+3);
1585 u8 bthci_CheckRfStateBeforeConnect(PADAPTER padapter)
1588 rt_rf_power_state RfState;
1591 pBTInfo = GET_BT_INFO(padapter);
1593 // rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState));
1594 RfState = padapter->pwrctrlpriv.rf_pwrstate;
1596 if (RfState != rf_on)
1598 PlatformSetTimer(padapter, &pBTInfo->BTPsDisableTimer, 50);
1606 bthci_ConstructScanList(
1610 PRT_SCAN_TYPE pScanType,
1615 PBT_HCI_INFO pBtHciInfo;
1616 PCHNL_TXPOWER_TRIPLE pTriple_subband;
1617 PCOMMON_TRIPLE pTriple;
1618 u8 chnl, i, j, tripleLetsCnt=0;
1621 padapter = pBTInfo->padapter;
1622 pBtHciInfo = &pBTInfo->BtHciInfo;
1624 *pScanType = SCAN_ACTIVE;
1627 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
1629 // contains country string, len is 3
1630 for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
1632 if (pTriple->byte_1st == 0xc9) // Regulatory Extension Identifier, skip it
1634 else // Sub-band triplet
1637 pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
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++)
1642 if (BT_IsLegalChannel(padapter, chnl)) // remote channel is legal for our channel plan.
1644 //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1645 pChannels[*pNChannels] = chnl;
1652 if (tripleLetsCnt == 0)
1654 // Fill chnl 1~ chnl 11
1655 for (chnl=1; chnl<12; chnl++)
1657 //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1658 pChannels[*pNChannels] = chnl;
1663 if (*pNChannels == 0)
1669 void bthci_ResponderStartToScan(PADAPTER padapter)
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;
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"));
1688 pScanReq->bEnabled = _TRUE;
1689 pScanReq->DataRate = MGN_6M;
1691 BTPKT_ConstructProbeRequest(
1696 bthci_ConstructScanList(pBTInfo,
1698 &pScanReq->nChannels,
1699 &pScanReq->ScanType,
1700 &pScanReq->Duration);
1702 RTPRINT(FIOCTL, IOCTL_STATE, ("[Bt scan], scan channel list =["));
1703 for (i=0; i<pScanReq->nChannels; i++)
1705 if (i == pScanReq->nChannels-1)
1707 RTPRINT(FIOCTL, IOCTL_STATE, ("%d", pScanReq->Channels[i]));
1711 RTPRINT(FIOCTL, IOCTL_STATE, ("%d, \n", pScanReq->Channels[i]));
1714 RTPRINT(FIOCTL, IOCTL_STATE, ("]\n"));
1716 RTPRINT(FIOCTL, IOCTL_STATE, ("[Bt scan], customized scan started!!\n"));
1717 pBtMgnt->bBtScan = _TRUE;
1718 MgntActSet_802_11_CustomizedScanRequest((GetDefaultAdapter(padapter)), pScanReq);
1723 bthci_PhyLinkConnectionInProgress(
1732 pBTInfo = GET_BT_INFO(padapter);
1733 pBtMgnt = &pBTInfo->BtMgnt;
1735 if (pBtMgnt->bPhyLinkInProgress &&
1736 (pBtMgnt->BtCurrentPhyLinkhandle == PhyLinkHandle))
1744 bthci_ResetFlowSpec(
1753 pBTinfo = GET_BT_INFO(padapter);
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;
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;
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;
1777 void bthci_ResetEntry(PADAPTER padapter, u8 EntryNum)
1784 pBTinfo = GET_BT_INFO(padapter);
1785 pBtMgnt = &pBTinfo->BtMgnt;
1787 pBTinfo->BtAsocEntry[EntryNum].bUsed=_FALSE;
1788 pBTinfo->BtAsocEntry[EntryNum].BtCurrentState=HCI_STATE_DISCONNECTED;
1789 pBTinfo->BtAsocEntry[EntryNum].BtNextState=HCI_STATE_DISCONNECTED;
1791 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen=0;
1792 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle = 0;
1793 if (pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment != NULL)
1795 _rtw_memset(pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment, 0, TOTAL_ALLOCIATE_ASSOC_LEN);
1797 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar=0;
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;
1804 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout=0x3e80;//0x640; //0.625ms*1600=1000ms, 0.625ms*16000=10000ms
1806 pBTinfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_NONE;
1808 pBTinfo->BtAsocEntry[EntryNum].mAssoc=_FALSE;
1809 pBTinfo->BtAsocEntry[EntryNum].b4waySuccess = _FALSE;
1812 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter = 0;
1813 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_UNINITIALIZED;
1815 pBTinfo->BtAsocEntry[EntryNum].bSendSupervisionPacket=_FALSE;
1816 pBTinfo->BtAsocEntry[EntryNum].NoRxPktCnt=0;
1817 pBTinfo->BtAsocEntry[EntryNum].ShortRangeMode = 0;
1818 pBTinfo->BtAsocEntry[EntryNum].rxSuvpPktCnt = 0;
1820 for (j=0; j<MAX_LOGICAL_LINK_NUM; j++)
1822 bthci_ResetFlowSpec(padapter, EntryNum, j);
1825 pBtMgnt->BTAuthCount = 0;
1826 pBtMgnt->BTAsocCount = 0;
1827 pBtMgnt->BTCurrentConnectType = BT_DISCONNECT;
1828 pBtMgnt->BTReceiveConnectPkt = BT_DISCONNECT;
1830 HALBT_RemoveKey(padapter, EntryNum);
1834 bthci_RemoveEntryByEntryNum(
1839 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1840 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
1842 bthci_ResetEntry(padapter, EntryNum);
1844 if (pBtMgnt->CurrentBTConnectionCnt>0)
1845 pBtMgnt->CurrentBTConnectionCnt--;
1847 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], CurrentBTConnectionCnt = %d!!\n",
1848 pBtMgnt->CurrentBTConnectionCnt));
1850 if (pBtMgnt->CurrentBTConnectionCnt > 0)
1851 pBtMgnt->BtOperationOn = _TRUE;
1854 pBtMgnt->BtOperationOn = _FALSE;
1855 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], Bt Operation OFF!!\n"));
1858 if (pBtMgnt->BtOperationOn == _FALSE)
1860 PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
1861 #if (SENDTXMEHTOD == 0)
1862 PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
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);
1874 bthci_CommandCompleteHeader(
1881 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1882 u8 NumHCI_Comm = 0x1;
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);
1890 if (OGF == OGF_EXTENSION)
1892 if (OCF == HCI_SET_RSSI_VALUE)
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));
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));
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));
1911 u8 bthci_ExtensionEventHeader(u8 *pbuf, u8 extensionEvent)
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
1920 u8 bthci_ExtensionEventHeaderRtk(u8 *pbuf, u8 extensionEvent)
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
1930 bthci_IndicateEvent(
1936 RT_STATUS rt_status;
1938 rt_status = PlatformIndicateBTEvent(padapter, pEvntData, dataLen);
1944 bthci_EventWriteRemoteAmpAssoc(
1950 u8 localBuf[TmpLocalBufSize] = "";
1953 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1955 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
1956 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1958 len += bthci_CommandCompleteHeader(&localBuf[0],
1959 OGF_STATUS_PARAMETERS,
1960 HCI_WRITE_REMOTE_AMP_ASSOC,
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;
1968 PPacketIrpEvent->Length = len;
1970 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
1974 bthci_EventEnhancedFlushComplete(
1979 u8 localBuf[4] = "";
1980 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1981 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("EventEnhancedFlushComplete, LLH = 0x%x\n", LLH));
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);
1990 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
1994 bthci_EventShortRangeModeChangeComplete(
1996 HCI_STATUS HciStatus,
2001 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2002 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2003 u8 localBuf[5] = "";
2004 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2006 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_SHORT_RANGE_MODE_CHANGE_COMPLETE))
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"));
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));
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);
2024 bthci_EventSendFlowSpecModifyComplete(
2026 HCI_STATUS HciStatus,
2030 u8 localBuf[5] = "";
2031 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2032 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2033 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2035 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_FLOW_SPEC_MODIFY_COMPLETE))
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"));
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;
2045 PPacketIrpEvent->Data[0] = HciStatus;
2046 //Logical link handle
2047 PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(logicHandle);
2048 PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(logicHandle);
2050 bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
2054 bthci_EventExtGetBTRSSI(
2056 u16 ConnectionHandle
2060 u8 localBuf[7] = "";
2063 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2065 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2067 len += bthci_ExtensionEventHeader(&localBuf[0],
2068 HCI_EVENT_GET_BT_RSSI);
2070 // Return parameters starts from here
2071 pRetPar = &PPacketIrpEvent->Data[len];
2072 pu2Temp = (u16*)&pRetPar[0];
2073 *pu2Temp = ConnectionHandle;
2076 PPacketIrpEvent->Length = len;
2077 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
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));
2085 bthci_EventExtWifiScanNotify(
2090 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2091 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
2093 u8 localBuf[7] = "";
2096 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2098 if (!pBtMgnt->BtOperationOn)
2101 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2103 len += bthci_ExtensionEventHeaderRtk(&localBuf[0], HCI_EVENT_EXT_WIFI_SCAN_NOTIFY);
2105 // Return parameters starts from here
2106 pRetPar = &PPacketIrpEvent->Data[len];
2107 pu1Temp = (u8*)&pRetPar[0];
2108 *pu1Temp = scanType;
2111 PPacketIrpEvent->Length = len;
2113 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
2115 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Wifi scan notify, scan type = %d\n",
2122 bthci_EventAMPReceiverReport(
2127 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2128 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2130 if (pBtHciInfo->bTestNeedReport)
2132 u8 localBuf[20] = "";
2135 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
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;
2143 PPacketIrpEvent->Data[0] = pBtHciInfo->TestCtrType;
2145 PPacketIrpEvent->Data[1] =Reason;
2147 pu4Temp = (u32*)&PPacketIrpEvent->Data[2];
2148 *pu4Temp = pBtHciInfo->TestEventType;
2150 pu2Temp = (u16*)&PPacketIrpEvent->Data[6];
2151 *pu2Temp = pBtHciInfo->TestNumOfFrame;
2153 pu2Temp = (u16*)&PPacketIrpEvent->Data[8];
2154 *pu2Temp = pBtHciInfo->TestNumOfErrFrame;
2156 pu4Temp = (u32*)&PPacketIrpEvent->Data[10];
2157 *pu4Temp = pBtHciInfo->TestNumOfBits;
2159 pu4Temp = (u32*)&PPacketIrpEvent->Data[14];
2160 *pu4Temp = pBtHciInfo->TestNumOfErrBits;
2162 bthci_IndicateEvent(padapter, PPacketIrpEvent, 20);
2164 //Return to Idel state with RX and TX off.
2168 pBtHciInfo->TestNumOfFrame = 0x00;
2172 bthci_EventChannelSelected(
2177 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2178 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2179 u8 localBuf[3] = "";
2180 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2182 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_CHANNEL_SELECT))
2184 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Channel Selected, Ignore to send this event due to event mask page 2\n"));
2188 RTPRINT(FIOCTL, IOCTL_BT_EVENT|IOCTL_STATE, ("[BT event], Channel Selected, PhyLinkHandle %d\n",
2189 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle));
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);
2199 bthci_EventDisconnectPhyLinkComplete(
2201 HCI_STATUS HciStatus,
2206 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2207 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2208 u8 localBuf[5] = "";
2209 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2211 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_PHY_LINK_COMPLETE))
2213 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
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);
2228 bthci_EventPhysicalLinkComplete(
2230 HCI_STATUS HciStatus,
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;
2243 pBtMgnt->bPhyLinkInProgress = _FALSE;
2244 pBtDbg->dbgHciInfo.hciCmdPhyLinkStatus = HciStatus;
2245 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_PHY_LINK_COMPLETE))
2247 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
2251 if (EntryNum == 0xff)
2253 // connection not started yet, just use the input physical link handle to response.
2254 PL_handle = PLHandle;
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;
2263 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Status = 0x%x PhyLinkHandle = 0x%x\n",HciStatus,
2266 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2267 PPacketIrpEvent->EventCode=HCI_EVENT_PHY_LINK_COMPLETE;
2268 PPacketIrpEvent->Length=2;
2270 PPacketIrpEvent->Data[0] = HciStatus;
2271 PPacketIrpEvent->Data[1] = PL_handle;
2272 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
2277 bthci_EventCommandStatus(
2281 HCI_STATUS HciStatus
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));
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);
2299 bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
2304 bthci_EventLogicalLinkComplete(
2306 HCI_STATUS HciStatus,
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;
2319 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_LOGICAL_LINK_COMPLETE))
2321 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
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));
2328 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2329 PPacketIrpEvent->EventCode = HCI_EVENT_LOGICAL_LINK_COMPLETE;
2330 PPacketIrpEvent->Length = 5;
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)
2341 PPacketIrpEvent->Data[4] =
2342 pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData[LogLinkIndex].Tx_Flow_Spec.Identifier;
2345 PPacketIrpEvent->Data[4] = 0x0;
2347 bthci_IndicateEvent(padapter, PPacketIrpEvent, 7);
2351 bthci_EventDisconnectLogicalLinkComplete(
2353 HCI_STATUS HciStatus,
2358 u8 localBuf[6] = "";
2359 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2360 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2361 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2363 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE))
2365 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
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));
2370 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2371 PPacketIrpEvent->EventCode=HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE;
2372 PPacketIrpEvent->Length=4;
2374 PPacketIrpEvent->Data[0] = HciStatus;
2375 //Logical link handle
2376 PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(LogLinkHandle);
2377 PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
2379 PPacketIrpEvent->Data[3] = Reason;
2381 bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
2385 bthci_EventFlushOccurred(
2390 u8 localBuf[4] = "";
2391 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2392 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("bthci_EventFlushOccurred(), LLH = 0x%x\n", LogLinkHandle));
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);
2401 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
2405 bthci_BuildPhysicalLink(
2407 PPACKET_IRP_HCICMD_DATA pHciCmd,
2411 HCI_STATUS status = HCI_STATUS_SUCCESS;
2412 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2413 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
2416 //Send HCI Command status event to AMP.
2417 bthci_EventCommandStatus(padapter,
2418 OGF_LINK_CONTROL_COMMANDS,
2420 HCI_STATUS_SUCCESS);
2422 PLH = *((u8*)pHciCmd->Data);
2424 // Check if resource or bt connection is under progress, if yes, reject the link creation.
2425 if (bthci_AddEntry(padapter) == _FALSE)
2427 status = HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE;
2428 bthci_EventPhysicalLinkComplete(padapter, status, INVALID_ENTRY_NUM, PLH);
2432 EntryNum=pBtMgnt->CurrentConnectEntryNum;
2433 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle = PLH;
2434 pBtMgnt->BtCurrentPhyLinkhandle = PLH;
2436 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment == NULL)
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);
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);
2452 _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PMK, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey, PMK_LEN);
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,
2463 if (OCF == HCI_CREATE_PHYSICAL_LINK)
2465 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_CREATE_PHY_LINK, EntryNum);
2467 else if (OCF == HCI_ACCEPT_PHYSICAL_LINK)
2469 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ACCEPT_PHY_LINK, EntryNum);
2476 bthci_BuildLogicalLink(
2478 PPACKET_IRP_HCICMD_DATA pHciCmd,
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;
2489 HCI_FLOW_SPEC TxFlowSpec;
2490 HCI_FLOW_SPEC RxFlowSpec;
2491 u32 MaxSDUSize, ArriveTime, Bandwidth;
2493 PhyLinkHandle = *((u8*)pHciCmd->Data);
2495 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2497 _rtw_memcpy(&TxFlowSpec,
2498 &pHciCmd->Data[1], sizeof(HCI_FLOW_SPEC));
2499 _rtw_memcpy(&RxFlowSpec,
2500 &pHciCmd->Data[17], sizeof(HCI_FLOW_SPEC));
2502 #if 0 //for logo special test case only
2505 bthci_SelectFlowType(padapter,BT_TX_BE_FS,BT_RX_BE_FS,&TxFlowSpec,&RxFlowSpec);
2510 bthci_SelectFlowType(padapter,BT_TX_GU_FS,BT_RX_GU_FS,&TxFlowSpec,&RxFlowSpec);
2515 MaxSDUSize = TxFlowSpec.MaximumSDUSize;
2516 ArriveTime = TxFlowSpec.SDUInterArrivalTime;
2518 if (bthci_CheckLogLinkBehavior(padapter, TxFlowSpec)&& bthci_CheckLogLinkBehavior(padapter, RxFlowSpec))
2520 Bandwidth = BTTOTALBANDWIDTH;
2522 else if (MaxSDUSize==0xffff && ArriveTime==0xffffffff)
2524 Bandwidth = BTTOTALBANDWIDTH;
2528 Bandwidth = MaxSDUSize*8*1000/(ArriveTime+244);
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));
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));
2539 if (EntryNum == 0xff)
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;
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,
2552 if (pBtMgnt->bLogLinkInProgress == _FALSE)
2554 if (bthci_PhyLinkConnectionInProgress(padapter, PhyLinkHandle))
2556 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Physical link connection in progress, status=HCI_STATUS_CMD_DISALLOW, return\n"));
2557 status = HCI_STATUS_CMD_DISALLOW;
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,
2569 if (Bandwidth > BTTOTALBANDWIDTH)//BTTOTALBANDWIDTH
2571 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_QOS_REJECT, Bandwidth=0x%x, return\n", Bandwidth));
2572 status = HCI_STATUS_QOS_REJECT;
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,
2582 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_SUCCESS\n"));
2583 status = HCI_STATUS_SUCCESS;
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,
2591 #if 0// special logo test case only
2592 bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2596 if (pBTinfo->BtAsocEntry[EntryNum].BtCurrentState != HCI_STATE_CONNECTED)
2598 bthci_EventLogicalLinkComplete(padapter,
2599 HCI_STATUS_CMD_DISALLOW, 0, 0, 0,EntryNum);
2605 pBtMgnt->bLogLinkInProgress = _TRUE;
2607 // find an unused logical link index and copy the data
2608 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
2610 if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle == 0)
2612 HCI_STATUS LogCompEventstatus = HCI_STATUS_SUCCESS;
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));
2624 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet=_FALSE;
2626 if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCancelCMDIsSetandComplete)
2628 LogCompEventstatus = HCI_STATUS_UNKNOW_CONNECT_ID;
2630 bthci_EventLogicalLinkComplete(padapter,
2632 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtPhyLinkhandle,
2633 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle, i,EntryNum);
2635 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet = _TRUE;
2638 pBtMgnt->BtCurrentLogLinkhandle = AssignLogHandle;
2646 bthci_EventLogicalLinkComplete(padapter,
2647 HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE, 0, 0, 0,EntryNum);
2649 pBtMgnt->bLogLinkInProgress = _FALSE;
2654 bthci_EventLogicalLinkComplete(padapter,
2655 HCI_STATUS_CONTROLLER_BUSY, 0, 0, 0,EntryNum);
2658 #if 0// special logo test case only
2659 bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2664 bthci_StartBeaconAndConnect(
2666 PPACKET_IRP_HCICMD_DATA pHciCmd,
2670 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2671 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2672 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
2674 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("StartBeaconAndConnect, CurrentAssocNum=%d, AMPRole=%d\n",
2676 pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole));
2678 if (pBtMgnt->CheckChnlIsSuit == _FALSE)
2680 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND, CurrentAssocNum, INVALID_PL_HANDLE);
2681 bthci_RemoveEntryByEntryNum(padapter, CurrentAssocNum);
2686 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2688 rsprintf((char*)pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf,32,"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
2690 padapter->PermanentAddress[0],
2691 padapter->PermanentAddress[1],
2692 padapter->PermanentAddress[2],
2693 padapter->PermanentAddress[3],
2694 padapter->PermanentAddress[4],
2695 padapter->PermanentAddress[5]);
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]);
2705 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
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]);
2716 FillOctetString(pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid, pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf, 21);
2717 pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid.Length = 21;
2719 //To avoid set the start ap or connect twice, or the original connection will be disconnected.
2720 if (!pBtMgnt->bBTConnectInProgress)
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);
2726 #if 0 //for logo special test case only
2727 bthci_BuildLogicalLink(padapter, pHciCmd, HCI_CREATE_LOGICAL_LINK);
2730 // 20100325 Joseph: Check RF ON/OFF.
2731 // If RF OFF, it reschedule connecting operation after 50ms.
2732 if (!bthci_CheckRfStateBeforeConnect(padapter))
2735 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2737 // BTPKT_StartBeacon(padapter, CurrentAssocNum); // not implement yet
2738 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTING,STATE_CMD_MAC_CONNECT_COMPLETE,CurrentAssocNum);
2740 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
2742 bthci_ResponderStartToScan(padapter);
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);
2749 void bthci_ResetBtMgnt(PBT_MGNT pBtMgnt)
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;
2766 void bthci_ResetBtHciInfo(PBT_HCI_INFO pBtHciInfo)
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).
2778 pBtHciInfo->enFlush_LLH = 0;
2779 pBtHciInfo->FLTO_LLH = 0;
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;
2795 void bthci_ResetBtSec(PADAPTER padapter, PBT_SECURITY pBtSec)
2797 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2799 // Set BT used HW or SW encrypt !!
2800 if (GET_HAL_DATA(padapter)->bBTMode)
2801 pBtSec->bUsedHwEncrypt = _TRUE;
2803 pBtSec->bUsedHwEncrypt = _FALSE;
2804 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("%s: bUsedHwEncrypt=%d\n", __FUNCTION__, pBtSec->bUsedHwEncrypt));
2806 pBtSec->RSNIE.Octet = pBtSec->RSNIEBuf;
2809 void bthci_ResetBtExtInfo(PBT_MGNT pBtMgnt)
2813 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
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;
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;
2834 pBtMgnt->ExtConfig.bManualControl = _FALSE;
2835 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
2836 pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
2839 HCI_STATUS bthci_CmdReset(PADAPTER _padapter, u8 bNeedSendEvent)
2841 HCI_STATUS status = HCI_STATUS_SUCCESS;
2843 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2846 PBT_HCI_INFO pBtHciInfo;
2847 PBT_SECURITY pBtSec;
2852 RTPRINT(FIOCTL,IOCTL_BT_HCICMD, ("bthci_CmdReset()\n"));
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;
2861 pBTInfo->padapter = padapter;
2863 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
2865 bthci_ResetEntry(padapter, i);
2868 bthci_ResetBtMgnt(pBtMgnt);
2869 bthci_ResetBtHciInfo(pBtHciInfo);
2870 bthci_ResetBtSec(padapter, pBtSec);
2872 pBtMgnt->BTChannel = BT_Default_Chnl;
2873 pBtMgnt->CheckChnlIsSuit = _TRUE;
2875 pBTInfo->BTBeaconTmrOn = _FALSE;
2876 // QosInitializeBssDesc(&pBtMgnt->bssDesc.BssQos); // not implement yet
2878 pBtMgnt->bCreateSpportQos=_TRUE;
2880 PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
2881 #if (SENDTXMEHTOD == 0)
2882 PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
2884 PlatformCancelTimer(padapter, &pBTInfo->BTHCIDiscardAclDataTimer);
2885 PlatformCancelTimer(padapter, &pBTInfo->BTBeaconTimer);
2887 HALBT_SetRtsCtsNoLenLimit(padapter);
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
2893 bthci_ResetBtExtInfo(pBtMgnt);
2895 //send command complete event here when all data are received.
2898 u8 localBuf[6] = "";
2901 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2903 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2905 len += bthci_CommandCompleteHeader(&localBuf[0],
2906 OGF_SET_EVENT_MASK_COMMAND,
2910 // Return parameters starts from here
2911 pRetPar = &PPacketIrpEvent->Data[len];
2912 pRetPar[0] = status; //status
2914 PPacketIrpEvent->Length = len;
2916 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2923 bthci_CmdWriteRemoteAMPAssoc(
2925 PPACKET_IRP_HCICMD_DATA pHciCmd
2928 HCI_STATUS status = HCI_STATUS_SUCCESS;
2929 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2930 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
2934 pBtDbg->dbgHciInfo.hciCmdCntWriteRemoteAmpAssoc++;
2935 PhyLinkHandle = *((u8*)pHciCmd->Data);
2936 CurrentAssocNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2938 if (CurrentAssocNum == 0xff)
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);
2946 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment == NULL)
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);
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));
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));
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)
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);
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));
2974 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "WriteRemoteAMPAssoc :\n",
2975 pHciCmd->Data+5, pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen);
2977 if (!bthci_GetAssocInfo(padapter, CurrentAssocNum))
2978 status=HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
2980 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2982 bthci_StartBeaconAndConnect(padapter,pHciCmd,CurrentAssocNum);
2989 HCI_STATUS bthci_CmdReadConnectionAcceptTimeout(PADAPTER padapter)
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;
2997 u8 localBuf[8] = "";
3000 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3003 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3005 len += bthci_CommandCompleteHeader(&localBuf[0],
3006 OGF_SET_EVENT_MASK_COMMAND,
3007 HCI_READ_CONNECTION_ACCEPT_TIMEOUT,
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;
3016 PPacketIrpEvent->Length = len;
3018 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3026 bthci_CmdSetEventFilter(
3028 PPACKET_IRP_HCICMD_DATA pHciCmd
3031 HCI_STATUS status = HCI_STATUS_SUCCESS;
3038 bthci_CmdWriteConnectionAcceptTimeout(
3040 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3049 pu2Temp = (u16*)&pHciCmd->Data[0];
3050 pBtHciInfo->ConnAcceptTimeout = *pu2Temp;
3051 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("ConnAcceptTimeout = 0x%x",
3052 pBtHciInfo->ConnAcceptTimeout));
3054 //send command complete event here when all data are received.
3056 u8 localBuf[6] = "";
3059 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3061 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3063 len += bthci_CommandCompleteHeader(&localBuf[0],
3064 OGF_SET_EVENT_MASK_COMMAND,
3065 HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT,
3068 // Return parameters starts from here
3069 pRetPar = &PPacketIrpEvent->Data[len];
3070 pRetPar[0] = status; //status
3072 PPacketIrpEvent->Length = len;
3074 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3081 bthci_CmdReadPageTimeout(
3083 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3092 u8 localBuf[8] = "";
3095 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3098 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3100 len += bthci_CommandCompleteHeader(&localBuf[0],
3101 OGF_SET_EVENT_MASK_COMMAND,
3102 HCI_READ_PAGE_TIMEOUT,
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;
3112 PPacketIrpEvent->Length = len;
3114 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3121 bthci_CmdWritePageTimeout(
3123 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3132 pu2Temp = (u16*)&pHciCmd->Data[0];
3133 pBtHciInfo->PageTimeout = *pu2Temp;
3134 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Write PageTimeout = 0x%x\n",
3135 pBtHciInfo->PageTimeout));
3137 //send command complete event here when all data are received.
3139 u8 localBuf[6] = "";
3142 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3144 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3146 len += bthci_CommandCompleteHeader(&localBuf[0],
3147 OGF_SET_EVENT_MASK_COMMAND,
3148 HCI_WRITE_PAGE_TIMEOUT,
3151 // Return parameters starts from here
3152 pRetPar = &PPacketIrpEvent->Data[len];
3153 pRetPar[0] = status; //status
3155 PPacketIrpEvent->Length = len;
3157 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3164 bthci_CmdReadLinkSupervisionTimeout(
3166 PPACKET_IRP_HCICMD_DATA pHciCmd
3169 HCI_STATUS status = HCI_STATUS_SUCCESS;
3170 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3171 u8 physicalLinkHandle, EntryNum;
3173 physicalLinkHandle = *((u8*)pHciCmd->Data);
3175 EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
3177 if (EntryNum == 0xff)
3179 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLinkSupervisionTimeout, No such Handle in the Entry\n"));
3180 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3184 if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
3185 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3188 u8 localBuf[10] = "";
3191 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3194 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3196 len += bthci_CommandCompleteHeader(&localBuf[0],
3197 OGF_SET_EVENT_MASK_COMMAND,
3198 HCI_READ_LINK_SUPERVISION_TIMEOUT,
3201 // Return parameters starts from here
3202 pRetPar = &PPacketIrpEvent->Data[len];
3203 pRetPar[0] = status;
3204 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
3206 pu2Temp = (u16*)&pRetPar[3]; // Conn_Accept_Timeout
3207 *pu2Temp = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout;
3209 PPacketIrpEvent->Length = len;
3211 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3218 bthci_CmdWriteLinkSupervisionTimeout(
3220 PPACKET_IRP_HCICMD_DATA pHciCmd
3223 HCI_STATUS status = HCI_STATUS_SUCCESS;
3224 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3225 u8 physicalLinkHandle, EntryNum;
3227 physicalLinkHandle = *((u8*)pHciCmd->Data);
3229 EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
3231 if (EntryNum == 0xff)
3233 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("WriteLinkSupervisionTimeout, No such Handle in the Entry\n"));
3234 status=HCI_STATUS_UNKNOW_CONNECT_ID;
3238 if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
3239 status = HCI_STATUS_UNKNOW_CONNECT_ID;
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));
3249 u8 localBuf[8] = "";
3252 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3254 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3256 len += bthci_CommandCompleteHeader(&localBuf[0],
3257 OGF_SET_EVENT_MASK_COMMAND,
3258 HCI_WRITE_LINK_SUPERVISION_TIMEOUT,
3261 // Return parameters starts from here
3262 pRetPar = &PPacketIrpEvent->Data[len];
3263 pRetPar[0] = status;
3264 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
3267 PPacketIrpEvent->Length = len;
3269 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3276 bthci_CmdEnhancedFlush(
3278 PPACKET_IRP_HCICMD_DATA pHciCmd
3281 HCI_STATUS status = HCI_STATUS_SUCCESS;
3282 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3283 PBT_HCI_INFO pBtHciInfo = &pBTinfo->BtHciInfo;
3287 logicHandle = *((u16*)&pHciCmd->Data[0]);
3288 Packet_Type = pHciCmd->Data[2];
3290 if (Packet_Type != 0)
3292 status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
3295 pBtHciInfo->enFlush_LLH = logicHandle;
3297 if (bthci_DiscardTxPackets(padapter, pBtHciInfo->enFlush_LLH))
3299 bthci_EventFlushOccurred(padapter, pBtHciInfo->enFlush_LLH);
3302 // should send command status event
3303 bthci_EventCommandStatus(padapter,
3304 OGF_SET_EVENT_MASK_COMMAND,
3308 if (pBtHciInfo->enFlush_LLH)
3310 bthci_EventEnhancedFlushComplete(padapter, pBtHciInfo->enFlush_LLH);
3311 pBtHciInfo->enFlush_LLH = 0;
3318 bthci_CmdReadLogicalLinkAcceptTimeout(
3320 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3329 u8 localBuf[8] = "";
3332 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3335 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3337 len += bthci_CommandCompleteHeader(&localBuf[0],
3338 OGF_SET_EVENT_MASK_COMMAND,
3339 HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT,
3342 // Return parameters starts from here
3343 pRetPar = &PPacketIrpEvent->Data[len];
3344 pRetPar[0] = status;
3346 pu2Temp = (u16*)&pRetPar[1]; // Conn_Accept_Timeout
3347 *pu2Temp = pBtHciInfo->LogicalAcceptTimeout;
3349 PPacketIrpEvent->Length = len;
3351 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3358 bthci_CmdWriteLogicalLinkAcceptTimeout(
3360 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3368 pBtHciInfo->LogicalAcceptTimeout = *((u16*)pHciCmd->Data);
3371 u8 localBuf[6] = "";
3374 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3376 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3378 len += bthci_CommandCompleteHeader(&localBuf[0],
3379 OGF_SET_EVENT_MASK_COMMAND,
3380 HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT,
3383 // Return parameters starts from here
3384 pRetPar = &PPacketIrpEvent->Data[len];
3385 pRetPar[0] = status;
3388 PPacketIrpEvent->Length = len;
3390 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3396 bthci_CmdSetEventMask(
3398 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3407 pu8Temp = (u8*)&pHciCmd->Data[0];
3408 pBtHciInfo->BTEventMask = *pu8Temp;
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)));
3415 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("BTEventMask = 0x%"i64fmt"x\n",
3416 pBtHciInfo->BTEventMask));
3419 //send command complete event here when all data are received.
3421 u8 localBuf[6] = "";
3424 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3426 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3428 len += bthci_CommandCompleteHeader(&localBuf[0],
3429 OGF_SET_EVENT_MASK_COMMAND,
3433 // Return parameters starts from here
3434 pRetPar = &PPacketIrpEvent->Data[len];
3435 pRetPar[0] = status; //status
3437 PPacketIrpEvent->Length = len;
3439 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3447 bthci_CmdSetEventMaskPage2(
3449 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3458 pu8Temp = (u8*)&pHciCmd->Data[0];
3459 pBtHciInfo->BTEventMaskPage2 = *pu8Temp;
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)));
3466 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("BTEventMaskPage2 = 0x%"i64fmt"x\n",
3467 pBtHciInfo->BTEventMaskPage2));
3470 //send command complete event here when all data are received.
3472 u8 localBuf[6] = "";
3475 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3477 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3479 len += bthci_CommandCompleteHeader(&localBuf[0],
3480 OGF_SET_EVENT_MASK_COMMAND,
3481 HCI_SET_EVENT_MASK_PAGE_2,
3484 // Return parameters starts from here
3485 pRetPar = &PPacketIrpEvent->Data[len];
3486 pRetPar[0] = status; //status
3488 PPacketIrpEvent->Length = len;
3490 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3497 bthci_CmdReadLocationData(
3499 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3508 u8 localBuf[12] = "";
3511 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3514 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3516 len += bthci_CommandCompleteHeader(&localBuf[0],
3517 OGF_SET_EVENT_MASK_COMMAND,
3518 HCI_READ_LOCATION_DATA,
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));
3525 // Return parameters starts from here
3526 pRetPar = &PPacketIrpEvent->Data[len];
3527 pRetPar[0] = status;
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
3535 PPacketIrpEvent->Length = len;
3537 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3543 bthci_CmdWriteLocationData(
3545 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
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));
3564 //send command complete event here when all data are received.
3566 u8 localBuf[6] = "";
3569 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3571 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3573 len += bthci_CommandCompleteHeader(&localBuf[0],
3574 OGF_SET_EVENT_MASK_COMMAND,
3575 HCI_WRITE_LOCATION_DATA,
3578 // Return parameters starts from here
3579 pRetPar = &PPacketIrpEvent->Data[len];
3580 pRetPar[0] = status; //status
3582 PPacketIrpEvent->Length = len;
3584 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3591 bthci_CmdReadFlowControlMode(
3593 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3602 u8 localBuf[7] = "";
3605 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3607 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3609 len += bthci_CommandCompleteHeader(&localBuf[0],
3610 OGF_SET_EVENT_MASK_COMMAND,
3611 HCI_READ_FLOW_CONTROL_MODE,
3614 // Return parameters starts from here
3615 pRetPar = &PPacketIrpEvent->Data[len];
3616 pRetPar[0] = status;
3617 pRetPar[1] = pBtHciInfo->FlowControlMode; // Flow Control Mode
3619 PPacketIrpEvent->Length = len;
3621 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3627 bthci_CmdWriteFlowControlMode(
3629 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3637 pBtHciInfo->FlowControlMode = pHciCmd->Data[0];
3639 //send command complete event here when all data are received.
3641 u8 localBuf[6] = "";
3644 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3646 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3648 len += bthci_CommandCompleteHeader(&localBuf[0],
3649 OGF_SET_EVENT_MASK_COMMAND,
3650 HCI_WRITE_FLOW_CONTROL_MODE,
3653 // Return parameters starts from here
3654 pRetPar = &PPacketIrpEvent->Data[len];
3655 pRetPar[0] = status; //status
3657 PPacketIrpEvent->Length = len;
3659 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3666 bthci_CmdReadBestEffortFlushTimeout(
3668 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
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++)
3682 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3684 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3686 BestEffortFlushTimeout = pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout;
3694 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3697 u8 localBuf[10] = "";
3700 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3703 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3705 len += bthci_CommandCompleteHeader(&localBuf[0],
3706 OGF_SET_EVENT_MASK_COMMAND,
3707 HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT,
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;
3716 PPacketIrpEvent->Length = len;
3718 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3724 bthci_CmdWriteBestEffortFlushTimeout(
3726 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3736 logicHandle = *((u16*)pHciCmd->Data);
3737 BestEffortFlushTimeout = *((u32 *)(pHciCmd->Data+1));
3739 // find an matched logical link index and copy the data
3740 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
3742 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3744 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3746 pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout = BestEffortFlushTimeout;
3754 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3757 u8 localBuf[6] = "";
3760 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3762 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3764 len += bthci_CommandCompleteHeader(&localBuf[0],
3765 OGF_SET_EVENT_MASK_COMMAND,
3766 HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT,
3769 // Return parameters starts from here
3770 pRetPar = &PPacketIrpEvent->Data[len];
3771 pRetPar[0] = status;
3773 PPacketIrpEvent->Length = len;
3775 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3781 bthci_CmdShortRangeMode(
3783 PPACKET_IRP_HCICMD_DATA pHciCmd
3786 HCI_STATUS status = HCI_STATUS_SUCCESS;
3787 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3788 u8 PhyLinkHandle, EntryNum, ShortRangeMode;
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));
3794 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3795 if (EntryNum != 0xff)
3797 pBTInfo->BtAsocEntry[EntryNum].ShortRangeMode = ShortRangeMode;
3801 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PhyLinkHandle));
3802 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3805 bthci_EventCommandStatus(padapter,
3806 OGF_SET_EVENT_MASK_COMMAND,
3807 HCI_SHORT_RANGE_MODE,
3810 bthci_EventShortRangeModeChangeComplete(padapter, status, ShortRangeMode, EntryNum);
3815 HCI_STATUS bthci_CmdReadLocalSupportedCommands(PADAPTER padapter)
3817 HCI_STATUS status = HCI_STATUS_SUCCESS;
3819 // send command complete event here when all data are received.
3821 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3822 u8 localBuf[TmpLocalBufSize] = "";
3823 u8 *pRetPar, *pSupportedCmds;
3825 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3827 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3828 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3829 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3831 len += bthci_CommandCompleteHeader(&localBuf[0],
3832 OGF_INFORMATIONAL_PARAMETERS,
3833 HCI_READ_LOCAL_SUPPORTED_COMMANDS,
3836 // Return parameters starts from here
3837 pRetPar = &PPacketIrpEvent->Data[len];
3838 pRetPar[0] = status; //status
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;
3869 PPacketIrpEvent->Length = len;
3871 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3877 HCI_STATUS bthci_CmdReadLocalSupportedFeatures(PADAPTER padapter)
3879 HCI_STATUS status = HCI_STATUS_SUCCESS;
3881 //send command complete event here when all data are received.
3883 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3884 u8 localBuf[TmpLocalBufSize] = "";
3887 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3889 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3890 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3891 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3893 len += bthci_CommandCompleteHeader(&localBuf[0],
3894 OGF_INFORMATIONAL_PARAMETERS,
3895 HCI_READ_LOCAL_SUPPORTED_FEATURES,
3898 // Return parameters starts from here
3899 pRetPar = &PPacketIrpEvent->Data[len];
3900 pRetPar[0] = status; //status
3902 PPacketIrpEvent->Length = len;
3904 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3910 bthci_CmdReadLocalAMPAssoc(
3912 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
3921 pBtDbg->dbgHciInfo.hciCmdCntReadLocalAmpAssoc++;
3922 PhyLinkHandle = *((u8*)pHciCmd->Data);
3923 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3925 if ((EntryNum==0xff) && PhyLinkHandle != 0)
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;
3931 else if (pBtMgnt->bPhyLinkInProgressStartLL)
3933 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3934 pBtMgnt->bPhyLinkInProgressStartLL = _FALSE;
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));
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));
3949 //send command complete event here when all data are received.
3951 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3953 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3954 u8 localBuf[TmpLocalBufSize] = "";
3957 u16 typeLen=0, remainLen=0, ret_index=0;
3960 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3961 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3962 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3964 totalLen += bthci_CommandCompleteHeader(&localBuf[0],
3965 OGF_STATUS_PARAMETERS,
3966 HCI_READ_LOCAL_AMP_ASSOC,
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]
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;
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);
4003 bthci_IndicateEvent(padapter, PPacketIrpEvent, totalLen+2);
4010 bthci_CmdReadFailedContactCounter(
4012 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4022 handle=*((u16*)pHciCmd->Data);
4023 //send command complete event here when all data are received.
4025 u8 localBuf[TmpLocalBufSize] = "";
4028 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4030 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4031 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4033 len += bthci_CommandCompleteHeader(&localBuf[0],
4034 OGF_STATUS_PARAMETERS,
4035 HCI_READ_FAILED_CONTACT_COUNTER,
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);
4046 PPacketIrpEvent->Length = len;
4048 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4055 bthci_CmdResetFailedContactCounter(
4057 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4066 handle=*((u16*)pHciCmd->Data);
4067 pBtHciInfo->FailContactCount=0;
4069 //send command complete event here when all data are received.
4071 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4072 u8 localBuf[TmpLocalBufSize] = "";
4075 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4077 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4078 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4079 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4081 len += bthci_CommandCompleteHeader(&localBuf[0],
4082 OGF_STATUS_PARAMETERS,
4083 HCI_RESET_FAILED_CONTACT_COUNTER,
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);
4092 PPacketIrpEvent->Length = len;
4094 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4100 // BT 3.0+HS [Vol 2] 7.4.1
4103 bthci_CmdReadLocalVersionInformation(
4107 HCI_STATUS status = HCI_STATUS_SUCCESS;
4109 //send command complete event here when all data are received.
4111 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4112 u8 localBuf[TmpLocalBufSize] = "";
4115 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4118 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4119 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4120 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4122 len += bthci_CommandCompleteHeader(&localBuf[0],
4123 OGF_INFORMATIONAL_PARAMETERS,
4124 HCI_READ_LOCAL_VERSION_INFORMATION,
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
4133 pRetPar[4] = 0x05; // LMP/PAL_Version
4134 pu2Temp = (u16*)&pRetPar[5]; // Manufacturer_Name
4136 pu2Temp = (u16*)&pRetPar[7]; // LMP/PAL_Subversion
4139 PPacketIrpEvent->Length = len;
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"));
4149 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4156 HCI_STATUS bthci_CmdReadDataBlockSize(PADAPTER padapter)
4158 HCI_STATUS status = HCI_STATUS_SUCCESS;
4161 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4162 u8 localBuf[TmpLocalBufSize] = "";
4165 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4168 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4169 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4170 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4172 len += bthci_CommandCompleteHeader(&localBuf[0],
4173 OGF_INFORMATIONAL_PARAMETERS,
4174 HCI_READ_DATA_BLOCK_SIZE,
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;
4183 pu2Temp = (u16*)&pRetPar[3]; // Data_Block_Length
4184 *pu2Temp = Max80211PALPDUSize;
4185 pu2Temp = (u16*)&pRetPar[5]; // Total_Num_Data_Blocks
4186 *pu2Temp = BTTotalDataBlockNum;
4188 PPacketIrpEvent->Length = len;
4190 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4198 bthci_CmdReadBufferSize(
4202 HCI_STATUS status = HCI_STATUS_SUCCESS;
4205 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
4206 u8 localBuf[TmpLocalBufSize] = "";
4209 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4212 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4213 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4214 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4216 len += bthci_CommandCompleteHeader(&localBuf[0],
4217 OGF_INFORMATIONAL_PARAMETERS,
4218 HCI_READ_BUFFER_SIZE,
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;
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;
4235 PPacketIrpEvent->Length = len;
4237 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4244 bthci_CmdReadLocalAMPInfo(
4248 HCI_STATUS status = HCI_STATUS_SUCCESS;
4251 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4252 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
4253 u8 localBuf[TmpLocalBufSize] = "";
4256 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
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;
4264 if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
4265 (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
4267 AmpStatus = AMP_STATUS_NO_CAPACITY_FOR_BT;
4270 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
4271 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
4272 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4274 len += bthci_CommandCompleteHeader(&localBuf[0],
4275 OGF_STATUS_PARAMETERS,
4276 HCI_READ_LOCAL_AMP_INFO,
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
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;
4301 PPacketIrpEvent->Length = len;
4302 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("AmpStatus = 0x%x\n",
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);
4315 bthci_CmdCreatePhysicalLink(
4317 PPACKET_IRP_HCICMD_DATA pHciCmd
4321 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4322 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4324 pBtDbg->dbgHciInfo.hciCmdCntCreatePhyLink++;
4326 status = bthci_BuildPhysicalLink(padapter,
4327 pHciCmd, HCI_CREATE_PHYSICAL_LINK);
4333 bthci_CmdReadLinkQuality(
4335 PPACKET_IRP_HCICMD_DATA pHciCmd
4338 HCI_STATUS status = HCI_STATUS_SUCCESS;
4339 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4341 u8 EntryNum, LinkQuality=0x55;
4343 PLH = *((u16*)&pHciCmd->Data[0]);
4344 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PLH = 0x%x\n", PLH));
4346 EntryNum = bthci_GetCurrentEntryNum(padapter, (u8)PLH);
4347 if (EntryNum == 0xff)
4349 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PLH));
4350 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4354 u8 localBuf[11] = "";
4357 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4359 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4361 len += bthci_CommandCompleteHeader(&localBuf[0],
4362 OGF_STATUS_PARAMETERS,
4363 HCI_READ_LINK_QUALITY,
4366 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" PLH = 0x%x\n Link Quality = 0x%x\n", PLH, LinkQuality));
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
4374 PPacketIrpEvent->Length = len;
4376 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4382 HCI_STATUS bthci_CmdReadRSSI(PADAPTER padapter)
4384 HCI_STATUS status = HCI_STATUS_SUCCESS;
4389 bthci_CmdCreateLogicalLink(
4391 PPACKET_IRP_HCICMD_DATA pHciCmd
4394 HCI_STATUS status = HCI_STATUS_SUCCESS;
4395 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4396 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4398 pBtDbg->dbgHciInfo.hciCmdCntCreateLogLink++;
4400 bthci_BuildLogicalLink(padapter, pHciCmd,
4401 HCI_CREATE_LOGICAL_LINK);
4407 bthci_CmdAcceptLogicalLink(
4409 PPACKET_IRP_HCICMD_DATA pHciCmd
4412 HCI_STATUS status = HCI_STATUS_SUCCESS;
4413 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4414 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4416 pBtDbg->dbgHciInfo.hciCmdCntAcceptLogLink++;
4418 bthci_BuildLogicalLink(padapter, pHciCmd,
4419 HCI_ACCEPT_LOGICAL_LINK);
4425 bthci_CmdDisconnectLogicalLink(
4427 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4436 u8 i, j, find=0, LogLinkCount=0;
4438 pBtDbg->dbgHciInfo.hciCmdCntDisconnectLogLink++;
4440 logicHandle = *((u16*)pHciCmd->Data);
4441 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle = 0x%x\n", logicHandle));
4443 // find an created logical link index and clear the data
4444 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM;j++)
4446 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4448 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
4450 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle is matched 0x%x\n", logicHandle));
4451 bthci_ResetFlowSpec(padapter, j, i);
4453 pBtMgnt->DisconnectEntryNum = j;
4460 status = HCI_STATUS_UNKNOW_CONNECT_ID;
4463 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4465 if (pBTinfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].LogLinkCmdData[i].BtLogLinkhandle !=0)
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,
4477 //When we determines the logical link is established, we should send command complete event.
4479 if (status == HCI_STATUS_SUCCESS)
4481 bthci_EventDisconnectLogicalLinkComplete(padapter, status,
4482 logicHandle, HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST);
4485 if (LogLinkCount == 0)
4486 PlatformSetTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer, 100);
4492 bthci_CmdLogicalLinkCancel(
4494 PPACKET_IRP_HCICMD_DATA pHciCmd
4497 HCI_STATUS status = HCI_STATUS_SUCCESS;
4498 PBT30Info pBTinfo = GET_BT_INFO(padapter);
4499 PBT_MGNT pBtMgnt = &pBTinfo->BtMgnt;
4500 u8 CurrentEntryNum, CurrentLogEntryNum;
4502 u8 physicalLinkHandle, TxFlowSpecID,i;
4503 u16 CurrentLogicalHandle;
4505 physicalLinkHandle = *((u8*)pHciCmd->Data);
4506 TxFlowSpecID = *(((u8*)pHciCmd->Data)+1);
4508 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, physicalLinkHandle = 0x%x, TxFlowSpecID = 0x%x\n",
4509 physicalLinkHandle, TxFlowSpecID));
4511 CurrentEntryNum=pBtMgnt->CurrentConnectEntryNum;
4512 CurrentLogicalHandle = pBtMgnt->BtCurrentLogLinkhandle;
4514 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("CurrentEntryNum=0x%x, CurrentLogicalHandle = 0x%x\n",
4515 CurrentEntryNum, CurrentLogicalHandle));
4517 CurrentLogEntryNum = 0xff;
4518 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4520 if ((CurrentLogicalHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtLogLinkhandle) &&
4521 (physicalLinkHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtPhyLinkhandle))
4523 CurrentLogEntryNum = i;
4528 if (CurrentLogEntryNum == 0xff)
4530 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, CurrentLogEntryNum==0xff !!!!\n"));
4531 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4535 if (pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCompleteEventIsSet)
4537 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, LLCompleteEventIsSet!!!!\n"));
4538 status=HCI_STATUS_ACL_CONNECT_EXISTS;
4543 u8 localBuf[8] = "";
4546 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4548 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4550 len += bthci_CommandCompleteHeader(&localBuf[0],
4551 OGF_LINK_CONTROL_COMMANDS,
4552 HCI_LOGICAL_LINK_CANCEL,
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;
4561 PPacketIrpEvent->Length = len;
4563 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4566 pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCancelCMDIsSetandComplete=_TRUE;
4572 bthci_CmdFlowSpecModify(
4574 PPACKET_IRP_HCICMD_DATA pHciCmd
4577 HCI_STATUS status = HCI_STATUS_SUCCESS;
4578 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4579 PBT30Info pBTinfo = GET_BT_INFO(padapter);
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++)
4587 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4589 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
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));
4596 bthci_CheckLogLinkBehavior(padapter, pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Tx_Flow_Spec);
4602 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("FlowSpecModify, LLH = 0x%x, \n",logicHandle));
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);
4611 status = HCI_STATUS_UNKNOW_CONNECT_ID;
4613 bthci_EventSendFlowSpecModifyComplete(padapter, status, logicHandle);
4619 bthci_CmdAcceptPhysicalLink(
4621 PPACKET_IRP_HCICMD_DATA pHciCmd
4625 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4626 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4628 pBtDbg->dbgHciInfo.hciCmdCntAcceptPhyLink++;
4630 status = bthci_BuildPhysicalLink(padapter,
4631 pHciCmd, HCI_ACCEPT_PHYSICAL_LINK);
4637 bthci_CmdDisconnectPhysicalLink(
4639 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4648 pBtDbg->dbgHciInfo.hciCmdCntDisconnectPhyLink++;
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));
4655 CurrentEntryNum = bthci_GetCurrentEntryNum(padapter, PLH);
4657 if (CurrentEntryNum == 0xff)
4659 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectPhysicalLink, No such Handle in the Entry\n"));
4660 status=HCI_STATUS_UNKNOW_CONNECT_ID;
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,
4671 if (status != HCI_STATUS_SUCCESS)
4674 if (pBTInfo->BtAsocEntry[CurrentEntryNum].BtCurrentState == HCI_STATE_DISCONNECTED)
4676 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4680 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4687 bthci_CmdSetACLLinkDataFlowMode(
4689 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
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));
4706 u8 localBuf[8] = "";
4709 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4712 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4714 len += bthci_CommandCompleteHeader(&localBuf[0],
4716 HCI_SET_ACL_LINK_DATA_FLOW_MODE,
4719 // Return parameters starts from here
4720 pRetPar = &PPacketIrpEvent->Data[len];
4721 pRetPar[0] = status; //status
4723 pu2Temp = (u16*)&pRetPar[1];
4724 *pu2Temp = pBtMgnt->ExtConfig.CurrentConnectHandle;
4726 PPacketIrpEvent->Length = len;
4728 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4735 bthci_CmdSetACLLinkStatus(
4737 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4747 pBtDbg->dbgHciInfo.hciCmdCntSetAclLinkStatus++;
4748 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "SetACLLinkStatus, Hex Data :\n",
4749 &pHciCmd->Data[0], pHciCmd->Length);
4751 // Only Core Stack v251 and later version support this command.
4752 pBtMgnt->bSupportProfile = _TRUE;
4754 pBtMgnt->ExtConfig.NumberOfHandle= *((u8*)pHciCmd->Data);
4755 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfHandle = 0x%x\n", pBtMgnt->ExtConfig.NumberOfHandle));
4757 pTriple = &pHciCmd->Data[1];
4758 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
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));
4772 u8 localBuf[6] = "";
4775 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4777 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4779 len += bthci_CommandCompleteHeader(&localBuf[0],
4781 HCI_SET_ACL_LINK_STATUS,
4784 // Return parameters starts from here
4785 pRetPar = &PPacketIrpEvent->Data[len];
4786 pRetPar[0] = status; //status
4789 PPacketIrpEvent->Length = len;
4791 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4798 bthci_CmdSetSCOLinkStatus(
4800 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
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));
4815 u8 localBuf[6] = "";
4818 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4820 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4822 len += bthci_CommandCompleteHeader(&localBuf[0],
4824 HCI_SET_SCO_LINK_STATUS,
4827 // Return parameters starts from here
4828 pRetPar = &PPacketIrpEvent->Data[len];
4829 pRetPar[0] = status; //status
4832 PPacketIrpEvent->Length = len;
4834 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4841 bthci_CmdSetRSSIValue(
4843 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4853 if (pHciCmd->Length)
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);
4860 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4862 if (pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle == *((u16*)&pHciCmd->Data[0]))
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));
4870 // get the minimum bt rssi value
4871 if (pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI <= min_bt_rssi)
4873 min_bt_rssi = pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI;
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));
4883 u8 localBuf[6] = "";
4886 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4888 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4890 len += bthci_CommandCompleteHeader(&localBuf[0],
4895 // Return parameters starts from here
4896 pRetPar = &PPacketIrpEvent->Data[len];
4897 pRetPar[0] = status; //status
4900 PPacketIrpEvent->Length = len;
4902 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4909 bthci_CmdSetCurrentBluetoothStatus(
4911 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4919 pBtMgnt->ExtConfig.CurrentBTStatus = *((u8*)&pHciCmd->Data[0]);
4920 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("SetCurrentBluetoothStatus, CurrentBTStatus = 0x%x\n",
4921 pBtMgnt->ExtConfig.CurrentBTStatus));
4924 u8 localBuf[6] = "";
4927 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4929 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4931 len += bthci_CommandCompleteHeader(&localBuf[0],
4933 HCI_SET_CURRENT_BLUETOOTH_STATUS,
4936 // Return parameters starts from here
4937 pRetPar = &PPacketIrpEvent->Data[len];
4938 pRetPar[0] = status; //status
4941 PPacketIrpEvent->Length = len;
4943 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4950 bthci_CmdExtensionVersionNotify(
4952 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
4960 pBtDbg->dbgHciInfo.hciCmdCntExtensionVersionNotify++;
4961 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "ExtensionVersionNotify, Hex Data :\n",
4962 &pHciCmd->Data[0], pHciCmd->Length);
4964 pBtMgnt->ExtConfig.HCIExtensionVer = *((u16*)&pHciCmd->Data[0]);
4965 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = 0x%x\n", pBtMgnt->ExtConfig.HCIExtensionVer));
4968 u8 localBuf[6] = "";
4971 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4973 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4975 len += bthci_CommandCompleteHeader(&localBuf[0],
4977 HCI_EXTENSION_VERSION_NOTIFY,
4980 // Return parameters starts from here
4981 pRetPar = &PPacketIrpEvent->Data[len];
4982 pRetPar[0] = status; //status
4985 PPacketIrpEvent->Length = len;
4987 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4994 bthci_CmdLinkStatusNotify(
4996 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
5006 pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++;
5007 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n",
5008 &pHciCmd->Data[0], pHciCmd->Length);
5010 // Current only RTL8723 support this command.
5011 pBtMgnt->bSupportProfile = _TRUE;
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));
5017 pTriple = &pHciCmd->Data[1];
5018 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
5020 if (pBtMgnt->ExtConfig.HCIExtensionVer < 1)
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));
5032 else if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
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));
5048 BTHCI_UpdateBTProfileRTKToMoto(padapter);
5050 u8 localBuf[6] = "";
5053 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5055 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5057 len += bthci_CommandCompleteHeader(&localBuf[0],
5059 HCI_LINK_STATUS_NOTIFY,
5062 // Return parameters starts from here
5063 pRetPar = &PPacketIrpEvent->Data[len];
5064 pRetPar[0] = status; //status
5067 PPacketIrpEvent->Length = len;
5069 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5076 bthci_CmdBtOperationNotify(
5078 PPACKET_IRP_HCICMD_DATA pHciCmd
5081 HCI_STATUS status = HCI_STATUS_SUCCESS;
5082 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5083 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5085 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Bt Operation notify, Hex Data :\n",
5086 &pHciCmd->Data[0], pHciCmd->Length);
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)
5092 case HCI_BT_OP_NONE:
5093 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Operation None!!\n"));
5095 case HCI_BT_OP_INQUIRY_START:
5096 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire start!!\n"));
5098 case HCI_BT_OP_INQUIRY_FINISH:
5099 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire finished!!\n"));
5101 case HCI_BT_OP_PAGING_START:
5102 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging is started!!\n"));
5104 case HCI_BT_OP_PAGING_SUCCESS:
5105 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete successfully!!\n"));
5107 case HCI_BT_OP_PAGING_UNSUCCESS:
5108 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete unsuccessfully!!\n"));
5110 case HCI_BT_OP_PAIRING_START:
5111 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing start!!\n"));
5113 case HCI_BT_OP_PAIRING_FINISH:
5114 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing finished!!\n"));
5116 case HCI_BT_OP_BT_DEV_ENABLE:
5117 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is enabled!!\n"));
5119 case HCI_BT_OP_BT_DEV_DISABLE:
5120 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is disabled!!\n"));
5123 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Unknown, error!!\n"));
5126 BTDM_AdjustForBtOperation(padapter);
5128 u8 localBuf[6] = "";
5131 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5133 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5135 len += bthci_CommandCompleteHeader(&localBuf[0],
5137 HCI_BT_OPERATION_NOTIFY,
5140 // Return parameters starts from here
5141 pRetPar = &PPacketIrpEvent->Data[len];
5142 pRetPar[0] = status; //status
5145 PPacketIrpEvent->Length = len;
5147 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5154 bthci_CmdEnableWifiScanNotify(
5156 PPACKET_IRP_HCICMD_DATA pHciCmd
5159 HCI_STATUS status = HCI_STATUS_SUCCESS;
5160 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5161 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5163 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Enable Wifi scan notify, Hex Data :\n",
5164 &pHciCmd->Data[0], pHciCmd->Length);
5166 pBtMgnt->ExtConfig.bEnableWifiScanNotify = *((u8*)pHciCmd->Data);
5167 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("bEnableWifiScanNotify = %d\n", pBtMgnt->ExtConfig.bEnableWifiScanNotify));
5170 u8 localBuf[6] = "";
5173 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5175 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5177 len += bthci_CommandCompleteHeader(&localBuf[0],
5179 HCI_ENABLE_WIFI_SCAN_NOTIFY,
5182 // Return parameters starts from here
5183 pRetPar = &PPacketIrpEvent->Data[len];
5184 pRetPar[0] = status; //status
5187 PPacketIrpEvent->Length = len;
5189 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5196 bthci_CmdWIFICurrentChannel(
5198 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
5207 // if (pMgntInfo->pHTInfo->bCurBW40MHz == HT_CHANNEL_WIDTH_20_40)
5208 if (pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
5210 // if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_UPPER)
5211 if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
5215 // else if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_LOWER)
5216 else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
5222 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current Channel = 0x%x\n", chnl));
5225 u8 localBuf[8] = "";
5228 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5230 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5232 len += bthci_CommandCompleteHeader(&localBuf[0],
5234 HCI_WIFI_CURRENT_CHANNEL,
5237 // Return parameters starts from here
5238 pRetPar = &PPacketIrpEvent->Data[len];
5239 pRetPar[0] = status; //status
5240 pRetPar[1] = chnl; //current channel
5242 PPacketIrpEvent->Length = len;
5244 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5251 bthci_CmdWIFICurrentBandwidth(
5253 PPACKET_IRP_HCICMD_DATA pHciCmd
5256 HCI_STATUS status = HCI_STATUS_SUCCESS;
5257 HT_CHANNEL_WIDTH bw;
5261 // rtw_hal_get_hwreg(padapter, HW_VAR_BW_MODE, (u8*)(&bw));
5262 bw = padapter->mlmeextpriv.cur_bwmode;
5264 if (bw == HT_CHANNEL_WIDTH_20)
5268 else if (bw == HT_CHANNEL_WIDTH_40)
5273 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current BW = 0x%x\n",
5277 u8 localBuf[8] = "";
5280 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5282 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5284 len += bthci_CommandCompleteHeader(&localBuf[0],
5286 HCI_WIFI_CURRENT_BANDWIDTH,
5289 // Return parameters starts from here
5290 pRetPar = &PPacketIrpEvent->Data[len];
5291 pRetPar[0] = status; //status
5292 pRetPar[1] = CurrentBW; //current BW
5294 PPacketIrpEvent->Length = len;
5296 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5303 bthci_CmdWIFIConnectionStatus(
5305 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
5316 // Default port, connect to any
5317 if (pMgntInfo->bMediaConnect)
5318 connectStatus = HCI_WIFI_CONNECTED;
5319 if (pMgntInfo->mIbss)
5320 connectStatus = HCI_WIFI_CONNECTED;
5322 // AP mode, if any station associated
5323 if (padapter->MgntInfo.NdisVersion >= RT_NDIS_VERSION_6_20)
5325 if (IsAPModeExist(padapter))
5327 pExtAdapter = GetFirstExtAdapter(padapter);
5328 if (pExtAdapter == NULL) pExtAdapter = pDefaultAdapter;
5330 pExtMgntInfo = &pExtAdapter->MgntInfo;
5331 if (AsocEntry_AnyStationAssociated(pExtMgntInfo))
5332 connectStatus = HCI_WIFI_CONNECTED;
5336 if (AsocEntry_AnyStationAssociated(pMgntInfo))
5337 connectStatus = HCI_WIFI_CONNECTED;
5342 if (AsocEntry_AnyStationAssociated(pMgntInfo))
5343 connectStatus = HCI_WIFI_CONNECTED;
5346 if (connectStatus == HCI_WIFI_NOT_CONNECTED)
5348 if (!MgntRoamingInProgress(pMgntInfo) &&
5349 !MgntIsLinkInProgress(pMgntInfo) &&
5350 !MgntScanInProgress(pMgntInfo))
5352 connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS;
5356 if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) {
5357 if (padapter->stapriv.asoc_sta_count >= 3)
5358 connectStatus = HCI_WIFI_CONNECTED;
5360 connectStatus = HCI_WIFI_NOT_CONNECTED;
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;
5367 connectStatus = HCI_WIFI_NOT_CONNECTED;
5371 u8 localBuf[8] = "";
5374 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5376 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5378 len += bthci_CommandCompleteHeader(&localBuf[0],
5380 HCI_WIFI_CONNECTION_STATUS,
5383 // Return parameters starts from here
5384 pRetPar = &PPacketIrpEvent->Data[len];
5385 pRetPar[0] = status; //status
5386 pRetPar[1] = connectStatus; //connect status
5388 PPacketIrpEvent->Length = len;
5390 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5397 bthci_CmdEnableDeviceUnderTestMode(
5399 PPACKET_IRP_HCICMD_DATA pHciCmd
5402 HCI_STATUS status = HCI_STATUS_SUCCESS;
5403 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5404 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
5406 pBtHciInfo->bInTestMode = _TRUE;
5407 pBtHciInfo->bTestIsEnd = _FALSE;
5409 //send command complete event here when all data are received.
5411 u8 localBuf[6] = "";
5414 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5416 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5418 len += bthci_CommandCompleteHeader(&localBuf[0],
5419 OGF_TESTING_COMMANDS,
5420 HCI_ENABLE_DEVICE_UNDER_TEST_MODE,
5423 // Return parameters starts from here
5424 pRetPar = &PPacketIrpEvent->Data[len];
5425 pRetPar[0] = status; //status
5427 PPacketIrpEvent->Length = len;
5429 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5436 bthci_CmdAMPTestEnd(
5438 PPACKET_IRP_HCICMD_DATA pHciCmd
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;
5446 if (!pBtHciInfo->bInTestMode)
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;
5453 pBtHciInfo->bTestIsEnd=_TRUE;
5455 PlatformCancelTimer(padapter,&pBTInfo->BTTestSendPacketTimer);
5457 rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
5460 //send command complete event here when all data are received.
5462 u8 localBuf[4] = "";
5463 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
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;
5470 PPacketIrpEvent->Data[0] = status;
5471 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario;
5473 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5476 bthci_EventAMPReceiverReport(padapter,0x01);
5482 bthci_CmdAMPTestCommand(
5484 PPACKET_IRP_HCICMD_DATA pHciCmd
5487 HCI_STATUS status = HCI_STATUS_SUCCESS;
5488 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5489 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
5491 if (!pBtHciInfo->bInTestMode)
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;
5499 pBtHciInfo->TestScenario=*((u8*)pHciCmd->Data);
5501 if (pBtHciInfo->TestScenario == 0x01)
5503 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
5505 else if (pBtHciInfo->TestScenario == 0x02)
5507 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
5511 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("No Such Test !!!!!!!!!!!!!!!!!! \n"));
5515 if (pBtHciInfo->bTestIsEnd)
5517 u8 localBuf[5] = "";
5518 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
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;
5526 PPacketIrpEvent->Data[0] = status;
5527 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
5529 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5531 //Return to Idel state with RX and TX off.
5536 // should send command status event
5537 bthci_EventCommandStatus(padapter,
5538 OGF_TESTING_COMMANDS,
5539 HCI_AMP_TEST_COMMAND,
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
5547 u8 localBuf[5] = "";
5548 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
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;
5555 PPacketIrpEvent->Data[0] = status;
5556 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
5558 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5560 //Return to Idel state with RX and TX off.
5563 if (pBtHciInfo->TestScenario == 0x01)
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.
5569 PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
5570 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
5572 else if (pBtHciInfo->TestScenario == 0x02)
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"));
5584 bthci_CmdEnableAMPReceiverReports(
5586 PPACKET_IRP_HCICMD_DATA pHciCmd
5589 HCI_STATUS status = HCI_STATUS_SUCCESS;
5590 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5591 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
5593 if (!pBtHciInfo->bInTestMode)
5595 status = HCI_STATUS_CMD_DISALLOW;
5596 //send command complete event here when all data are received.
5598 u8 localBuf[6] = "";
5601 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5603 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5605 len += bthci_CommandCompleteHeader(&localBuf[0],
5606 OGF_TESTING_COMMANDS,
5607 HCI_ENABLE_AMP_RECEIVER_REPORTS,
5610 // Return parameters starts from here
5611 pRetPar = &PPacketIrpEvent->Data[len];
5612 pRetPar[0] = status; //status
5614 PPacketIrpEvent->Length = len;
5616 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5621 pBtHciInfo->bTestNeedReport= *((u8*)pHciCmd->Data);
5622 pBtHciInfo->TestReportInterval= (*((u8*)pHciCmd->Data+2));
5624 bthci_EventAMPReceiverReport(padapter,0x00);
5626 //send command complete event here when all data are received.
5628 u8 localBuf[6] = "";
5631 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5633 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5635 len += bthci_CommandCompleteHeader(&localBuf[0],
5636 OGF_TESTING_COMMANDS,
5637 HCI_ENABLE_AMP_RECEIVER_REPORTS,
5640 // Return parameters starts from here
5641 pRetPar = &PPacketIrpEvent->Data[len];
5642 pRetPar[0] = status; //status
5644 PPacketIrpEvent->Length = len;
5646 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5653 bthci_CmdHostBufferSize(
5655 PPACKET_IRP_HCICMD_DATA pHciCmd
5658 HCI_STATUS status = HCI_STATUS_SUCCESS;
5659 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5660 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
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));
5667 //send command complete event here when all data are received.
5669 u8 localBuf[6] = "";
5672 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5674 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5676 len += bthci_CommandCompleteHeader(&localBuf[0],
5677 OGF_SET_EVENT_MASK_COMMAND,
5678 HCI_HOST_BUFFER_SIZE,
5681 // Return parameters starts from here
5682 pRetPar = &PPacketIrpEvent->Data[len];
5683 pRetPar[0] = status; //status
5685 PPacketIrpEvent->Length = len;
5687 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5694 bthci_CmdHostNumberOfCompletedPackets(
5696 PPACKET_IRP_HCICMD_DATA pHciCmd
5699 HCI_STATUS status = HCI_STATUS_SUCCESS;
5707 PPACKET_IRP_HCICMD_DATA pHciCmd
5710 HCI_STATUS status = HCI_STATUS_UNKNOW_HCI_CMD;
5711 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5712 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
5714 pBtDbg->dbgHciInfo.hciCmdCntUnknown++;
5715 bthci_EventCommandStatus(padapter,
5724 bthci_HandleOGFInformationalParameters(
5726 PPACKET_IRP_HCICMD_DATA pHciCmd
5729 HCI_STATUS status = HCI_STATUS_SUCCESS;
5731 switch (pHciCmd->OCF)
5733 case HCI_READ_LOCAL_VERSION_INFORMATION:
5734 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_VERSION_INFORMATION\n"));
5735 status = bthci_CmdReadLocalVersionInformation(padapter);
5737 case HCI_READ_LOCAL_SUPPORTED_COMMANDS:
5738 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_COMMANDS\n"));
5739 status = bthci_CmdReadLocalSupportedCommands(padapter);
5741 case HCI_READ_LOCAL_SUPPORTED_FEATURES:
5742 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_FEATURES\n"));
5743 status = bthci_CmdReadLocalSupportedFeatures(padapter);
5745 case HCI_READ_BUFFER_SIZE:
5746 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_BUFFER_SIZE\n"));
5747 status = bthci_CmdReadBufferSize(padapter);
5749 case HCI_READ_DATA_BLOCK_SIZE:
5750 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_DATA_BLOCK_SIZE\n"));
5751 status = bthci_CmdReadDataBlockSize(padapter);
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);
5763 bthci_HandleOGFSetEventMaskCMD(
5765 PPACKET_IRP_HCICMD_DATA pHciCmd
5768 HCI_STATUS status = HCI_STATUS_SUCCESS;
5770 switch (pHciCmd->OCF)
5772 case HCI_SET_EVENT_MASK:
5773 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_MASK\n"));
5774 status = bthci_CmdSetEventMask(padapter, pHciCmd);
5777 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_RESET\n"));
5778 status = bthci_CmdReset(padapter, _TRUE);
5780 case HCI_READ_CONNECTION_ACCEPT_TIMEOUT:
5781 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_CONNECTION_ACCEPT_TIMEOUT\n"));
5782 status = bthci_CmdReadConnectionAcceptTimeout(padapter);
5784 case HCI_SET_EVENT_FILTER:
5785 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_FILTER\n"));
5786 status = bthci_CmdSetEventFilter(padapter, pHciCmd);
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);
5792 case HCI_READ_PAGE_TIMEOUT:
5793 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_PAGE_TIMEOUT\n"));
5794 status = bthci_CmdReadPageTimeout(padapter, pHciCmd);
5796 case HCI_WRITE_PAGE_TIMEOUT:
5797 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_PAGE_TIMEOUT\n"));
5798 status = bthci_CmdWritePageTimeout(padapter, pHciCmd);
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);
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);
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);
5812 case HCI_ENHANCED_FLUSH:
5813 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENHANCED_FLUSH\n"));
5814 status = bthci_CmdEnhancedFlush(padapter, pHciCmd);
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);
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);
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);
5828 case HCI_READ_LOCATION_DATA:
5829 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCATION_DATA\n"));
5830 status = bthci_CmdReadLocationData(padapter, pHciCmd);
5832 case HCI_WRITE_LOCATION_DATA:
5833 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LOCATION_DATA\n"));
5834 status = bthci_CmdWriteLocationData(padapter, pHciCmd);
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);
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);
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);
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);
5852 case HCI_SHORT_RANGE_MODE:
5853 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SHORT_RANGE_MODE\n"));
5854 status = bthci_CmdShortRangeMode(padapter, pHciCmd);
5856 case HCI_HOST_BUFFER_SIZE:
5857 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_HOST_BUFFER_SIZE\n"));
5858 status = bthci_CmdHostBufferSize(padapter,pHciCmd);
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);
5870 bthci_HandleOGFStatusParameters(
5872 PPACKET_IRP_HCICMD_DATA pHciCmd
5875 HCI_STATUS status = HCI_STATUS_SUCCESS;
5877 switch (pHciCmd->OCF)
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);
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);
5887 case HCI_READ_LINK_QUALITY:
5888 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LINK_QUALITY\n"));
5889 status = bthci_CmdReadLinkQuality(padapter, pHciCmd);
5892 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_RSSI\n"));
5893 status = bthci_CmdReadRSSI(padapter);
5895 case HCI_READ_LOCAL_AMP_INFO:
5896 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_AMP_INFO\n"));
5897 status = bthci_CmdReadLocalAMPInfo(padapter);
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);
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);
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);
5918 bthci_HandleOGFLinkControlCMD(
5920 PPACKET_IRP_HCICMD_DATA pHciCmd
5923 HCI_STATUS status = HCI_STATUS_SUCCESS;
5925 switch (pHciCmd->OCF)
5927 case HCI_CREATE_PHYSICAL_LINK:
5928 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_PHYSICAL_LINK\n"));
5929 status = bthci_CmdCreatePhysicalLink(padapter,pHciCmd);
5931 case HCI_ACCEPT_PHYSICAL_LINK:
5932 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_PHYSICAL_LINK\n"));
5933 status = bthci_CmdAcceptPhysicalLink(padapter,pHciCmd);
5935 case HCI_DISCONNECT_PHYSICAL_LINK:
5936 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_PHYSICAL_LINK\n"));
5937 status = bthci_CmdDisconnectPhysicalLink(padapter,pHciCmd);
5939 case HCI_CREATE_LOGICAL_LINK:
5940 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_LOGICAL_LINK\n"));
5941 status = bthci_CmdCreateLogicalLink(padapter,pHciCmd);
5943 case HCI_ACCEPT_LOGICAL_LINK:
5944 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_LOGICAL_LINK\n"));
5945 status = bthci_CmdAcceptLogicalLink(padapter,pHciCmd);
5947 case HCI_DISCONNECT_LOGICAL_LINK:
5948 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_LOGICAL_LINK\n"));
5949 status = bthci_CmdDisconnectLogicalLink(padapter,pHciCmd);
5951 case HCI_LOGICAL_LINK_CANCEL:
5952 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_LOGICAL_LINK_CANCEL\n"));
5953 status = bthci_CmdLogicalLinkCancel(padapter,pHciCmd);
5955 case HCI_FLOW_SPEC_MODIFY:
5956 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_FLOW_SPEC_MODIFY\n"));
5957 status = bthci_CmdFlowSpecModify(padapter,pHciCmd);
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);
5970 bthci_HandleOGFTestingCMD(
5972 PPACKET_IRP_HCICMD_DATA pHciCmd
5975 HCI_STATUS status = HCI_STATUS_SUCCESS;
5976 switch (pHciCmd->OCF)
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);
5982 case HCI_AMP_TEST_END:
5983 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_END\n"));
5984 bthci_CmdAMPTestEnd(padapter,pHciCmd);
5986 case HCI_AMP_TEST_COMMAND:
5987 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_COMMAND\n"));
5988 bthci_CmdAMPTestCommand(padapter,pHciCmd);
5990 case HCI_ENABLE_AMP_RECEIVER_REPORTS:
5991 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENABLE_AMP_RECEIVER_REPORTS\n"));
5992 bthci_CmdEnableAMPReceiverReports(padapter,pHciCmd);
5996 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5997 status = bthci_UnknownCMD(padapter, pHciCmd);
6004 bthci_HandleOGFExtension(
6006 PPACKET_IRP_HCICMD_DATA pHciCmd
6009 HCI_STATUS status = HCI_STATUS_SUCCESS;
6010 switch (pHciCmd->OCF)
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);
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);
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);
6024 case HCI_SET_RSSI_VALUE:
6025 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("HCI_SET_RSSI_VALUE\n"));
6026 status = bthci_CmdSetRSSIValue(padapter,pHciCmd);
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);
6032 //The following is for RTK8723
6034 case HCI_EXTENSION_VERSION_NOTIFY:
6035 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_EXTENSION_VERSION_NOTIFY\n"));
6036 status = bthci_CmdExtensionVersionNotify(padapter,pHciCmd);
6038 case HCI_LINK_STATUS_NOTIFY:
6039 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_LINK_STATUS_NOTIFY\n"));
6040 status = bthci_CmdLinkStatusNotify(padapter,pHciCmd);
6042 case HCI_BT_OPERATION_NOTIFY:
6043 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_BT_OPERATION_NOTIFY\n"));
6044 status = bthci_CmdBtOperationNotify(padapter,pHciCmd);
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);
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);
6056 case HCI_WIFI_CURRENT_BANDWIDTH:
6057 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CURRENT_BANDWIDTH\n"));
6058 status = bthci_CmdWIFICurrentBandwidth(padapter,pHciCmd);
6060 case HCI_WIFI_CONNECTION_STATUS:
6061 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CONNECTION_STATUS\n"));
6062 status = bthci_CmdWIFIConnectionStatus(padapter,pHciCmd);
6066 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_UNKNOWN_COMMAND\n"));
6067 status = bthci_UnknownCMD(padapter, pHciCmd);
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;
6084 PlatformZeroMemory(buffer, MAX_TMP_BUF_SIZE);
6089 if (OGF == OGF_LINK_CONTROL_COMMANDS && OCF == HCI_LOGICAL_LINK_CANCEL)
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);
6099 bthci_StateStarting(
6101 HCI_STATE_WITH_CMD StateCmd,
6105 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6106 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6108 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Starting], "));
6111 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
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);
6120 case STATE_CMD_DISCONNECT_PHY_LINK:
6122 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6124 bthci_EventDisconnectPhyLinkComplete(padapter,
6126 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6129 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6131 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6133 BTHCI_DisconnectPeer(padapter, EntryNum);
6137 case STATE_CMD_MAC_START_COMPLETE:
6139 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_START_COMPLETE\n"));
6140 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
6143 else if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR)
6145 bthci_EventChannelSelected(padapter,EntryNum);
6152 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6158 bthci_StateConnecting(
6160 HCI_STATE_WITH_CMD StateCmd,
6164 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6165 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6167 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connecting], "));
6170 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
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);
6179 case STATE_CMD_MAC_CONNECT_COMPLETE:
6181 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_COMPLETE\n"));
6183 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
6185 RT_TRACE(_module_rtl871x_security_c_, _drv_info_ , ("StateConnecting \n"));
6190 case STATE_CMD_DISCONNECT_PHY_LINK:
6192 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6194 bthci_EventDisconnectPhyLinkComplete(padapter,
6196 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6199 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6201 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6203 BTHCI_DisconnectPeer(padapter, EntryNum);
6208 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
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);
6220 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6226 bthci_StateConnected(
6228 HCI_STATE_WITH_CMD StateCmd,
6232 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6233 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6234 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6236 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connected], "));
6239 case STATE_CMD_DISCONNECT_PHY_LINK:
6241 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6244 //When we are trying to disconnect the phy link, we should disconnect log link first,
6248 u16 logicHandle = 0;
6249 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
6251 if (pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle != 0)
6253 logicHandle=pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle;
6255 bthci_EventDisconnectLogicalLinkComplete(padapter, HCI_STATUS_SUCCESS,
6256 logicHandle, pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason);
6258 pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle = 0;
6263 bthci_EventDisconnectPhyLinkComplete(padapter,
6265 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6268 PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
6270 BTHCI_DisconnectPeer(padapter, EntryNum);
6274 case STATE_CMD_MAC_DISCONNECT_INDICATE:
6276 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_DISCONNECT_INDICATE\n"));
6278 bthci_EventDisconnectPhyLinkComplete(padapter,
6280 // TODO: Remote Host not local host
6281 HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST,
6283 BTHCI_DisconnectPeer(padapter, EntryNum);
6288 case STATE_CMD_ENTER_STATE:
6290 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
6292 if (pBtMgnt->bBTConnectInProgress)
6294 pBtMgnt->bBTConnectInProgress = _FALSE;
6295 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6297 pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = HCI_STATE_CONNECTED;
6298 pBTInfo->BtAsocEntry[EntryNum].b4waySuccess = _TRUE;
6299 pBtMgnt->bStartSendSupervisionPkt = _TRUE;
6301 PlatformSetTimer(padapter, &pBTInfo->BTSupervisionPktTimer, 10000);
6302 // for rate adaptive
6304 padapter->HalFunc.UpdateHalRAMaskHandler(
6307 MAX_FW_SUPPORT_MACID_NUM-1-EntryNum,
6308 &pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr[0],
6312 rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, (u8*)(&pMgntInfo->mBrates));
6314 //Update_RA_Entry(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum);
6316 if(padapter->HalFunc.UpdateRAMaskHandler)
6317 padapter->HalFunc.UpdateRAMaskHandler(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum, 0);
6319 rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, padapter->mlmepriv.cur_network.network.SupportedRates);
6321 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
6323 //rtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8*)(&opMode));
6324 //rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
6329 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6337 HCI_STATE_WITH_CMD StateCmd,
6341 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6342 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6344 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Authenticating], "));
6347 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
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);
6356 case STATE_CMD_DISCONNECT_PHY_LINK:
6358 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6359 bthci_EventDisconnectPhyLinkComplete(padapter,
6361 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6364 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
6366 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6368 BTHCI_DisconnectPeer(padapter,EntryNum);
6372 case STATE_CMD_4WAY_FAILED:
6374 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_FAILED\n"));
6376 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_AUTH_FAIL;
6377 pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
6379 BTHCI_DisconnectPeer(padapter,EntryNum);
6381 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6385 case STATE_CMD_4WAY_SUCCESSED:
6387 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_SUCCESSED\n"));
6389 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_SUCCESS, EntryNum, INVALID_PL_HANDLE);
6391 PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
6393 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6398 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6404 bthci_StateDisconnecting(
6406 HCI_STATE_WITH_CMD StateCmd,
6410 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6411 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6413 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnecting], "));
6416 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
6418 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_CANCEL_INDICATE\n"));
6419 if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
6421 bthci_EventPhysicalLinkComplete(padapter,
6422 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus,
6423 EntryNum, INVALID_PL_HANDLE);
6426 if (pBtMgnt->bBTConnectInProgress)
6428 pBtMgnt->bBTConnectInProgress = _FALSE;
6429 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6432 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6436 case STATE_CMD_DISCONNECT_PHY_LINK:
6438 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6440 bthci_EventDisconnectPhyLinkComplete(padapter,
6442 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6445 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6447 BTHCI_DisconnectPeer(padapter, EntryNum);
6452 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6458 bthci_StateDisconnected(
6460 HCI_STATE_WITH_CMD StateCmd,
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;
6469 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnected], "));
6472 case STATE_CMD_CREATE_PHY_LINK:
6473 case STATE_CMD_ACCEPT_PHY_LINK:
6475 if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
6477 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CREATE_PHY_LINK\n"));
6481 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ACCEPT_PHY_LINK\n"));
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);
6488 pBtMgnt->bPhyLinkInProgress =_TRUE;
6489 pBtMgnt->BTCurrentConnectType=BT_DISCONNECT;
6490 if (!pBtMgnt->BtOperationOn)
6492 #if (SENDTXMEHTOD == 0)
6493 PlatformSetTimer(padapter, &pBTInfo->BTHCISendAclDataTimer, 1);
6495 #if (RTS_CTS_NO_LEN_LIMIT == 1)
6496 rtw_write32(padapter, 0x4c8, 0xc140400);
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));
6506 if (pBtMgnt->bBTConnectInProgress)
6508 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONTROLLER_BUSY, INVALID_ENTRY_NUM, pBtMgnt->BtCurrentPhyLinkhandle);
6509 bthci_RemoveEntryByEntryNum(padapter, EntryNum);
6513 if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
6515 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_CREATOR;
6519 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_JOINER;
6522 // 1. MAC not yet in selected channel
6524 while ((MgntRoamingInProgress(pMgntInfo)) ||
6525 (MgntIsLinkInProgress(pMgntInfo))||
6526 (MgntScanInProgress(pMgntInfo)))
6528 while (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE)
6531 RTPRINT(FIOCTL, IOCTL_STATE, ("Scan/Roaming/Wifi Link is in Progress, wait 200 ms\n"));
6534 // 2. MAC already in selected channel
6536 RTPRINT(FIOCTL, IOCTL_STATE, ("Channel is Ready\n"));
6537 PlatformSetTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer, pBtHciInfo->ConnAcceptTimeout);
6539 pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent = _TRUE;
6544 case STATE_CMD_DISCONNECT_PHY_LINK:
6546 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
6548 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
6550 bthci_EventDisconnectPhyLinkComplete(padapter,
6552 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
6555 if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
6557 bthci_EventPhysicalLinkComplete(padapter,
6558 HCI_STATUS_UNKNOW_CONNECT_ID,
6559 EntryNum, INVALID_PL_HANDLE);
6562 if (pBtMgnt->bBTConnectInProgress)
6564 pBtMgnt->bBTConnectInProgress = _FALSE;
6565 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6567 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
6568 bthci_RemoveEntryByEntryNum(padapter,EntryNum);
6572 case STATE_CMD_ENTER_STATE:
6574 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
6579 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6587 PPACKET_IRP_HCICMD_DATA pHciCmd
6590 if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_CREATE_LOGICAL_LINK)
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);
6597 else if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_FLOW_SPEC_MODIFY)
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);
6606 void bthci_TimerCallbackHCICmd(PRT_TIMER pTimer)
6608 #if (BT_THREAD == 0)
6609 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6610 PADAPTER padapter = (PADAPTER)pTimer;
6611 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6613 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() ==>\n"));
6615 PlatformScheduleWorkItem(&pBTinfo->HCICmdWorkItem);
6617 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() <==\n"));
6621 void bthci_TimerCallbackSendAclData(PRT_TIMER pTimer)
6623 #if (SENDTXMEHTOD == 0)
6624 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6625 PADAPTER padapter = (PADAPTER)pTimer;
6626 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6628 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() ==>\n"));
6629 if (padapter->bDriverIsGoingToUnload)
6633 PlatformScheduleWorkItem(&pBTinfo->HCISendACLDataWorkItem);
6634 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() <==\n"));
6638 void bthci_TimerCallbackDiscardAclData(PRT_TIMER pTimer)
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;
6645 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() ==>\n"));
6647 RTPRINT(FIOCTL, (IOCTL_CALLBACK_FUN|IOCTL_BT_LOGO), ("Flush Timeout ==>\n"));
6648 if (bthci_DiscardTxPackets(padapter, pBtHciInfo->FLTO_LLH))
6650 bthci_EventFlushOccurred(padapter, pBtHciInfo->FLTO_LLH);
6652 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() <==\n"));
6655 void bthci_TimerCallbackPsDisable(PRT_TIMER pTimer)
6657 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6658 PADAPTER padapter = (PADAPTER)pTimer;
6659 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6661 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() ==>\n"));
6663 PlatformScheduleWorkItem(&(pBTinfo->BTPsDisableWorkItem));
6665 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() <==\n"));
6668 void bthci_TimerCallbackJoinTimeout(PRT_TIMER pTimer)
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;
6676 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() ==> Current State %x\n",pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState));
6678 if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_STARTING)
6680 bthci_StateStarting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6682 else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_CONNECTING)
6684 bthci_StateConnecting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6686 else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_AUTHENTICATING)
6688 bthci_StateAuth(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6692 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <== No Such state!!!\n"));
6695 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <==\n"));
6698 void bthci_TimerCallbackSendTestPacket(PRT_TIMER pTimer)
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;
6705 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() \n"));
6706 if (pBtHciInfo->bTestIsEnd || !pBtHciInfo->bInTestMode)
6708 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==bTestIsEnd\n"));
6712 // BTPKT_SendTestPacket(padapter); // not porting yet
6713 PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
6714 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==\n"));
6717 void bthci_TimerCallbackBTSupervisionPacket(PRT_TIMER pTimer)
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;
6725 u8 isQosdata = _TRUE;
6726 int EntryTimer=5000;
6728 int callBackTimer=1000;
6731 if (pBTInfo->BTBeaconTmrOn)
6733 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT] stop beacon timer\n"));
6734 pBTInfo->BTBeaconTmrOn = _FALSE;
6735 PlatformCancelTimer(padapter, &(pBTInfo->BTBeaconTimer));
6738 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
6740 if (pBTInfo->BtAsocEntry[i].b4waySuccess)
6742 if (pBTInfo->BtAsocEntry[i].NoRxPktCnt)
6744 RTPRINT(FIOCTL, IOCTL_STATE, ("BtAsocEntry[%d].NoRxPktCnt = %ld\n", i, pBTInfo->BtAsocEntry[i].NoRxPktCnt));
6746 EntryTimer = ((pBTInfo->BtAsocEntry[i].PhyLinkCmdData.LinkSuperversionTimeout*625)/1000);
6747 EntryTOCnt = (EntryTimer/callBackTimer);
6749 if (pBtMgnt->bStartSendSupervisionPkt)
6751 if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_CONNECTED)
6754 if (pBTInfo->BtAsocEntry[i].NoRxPktCnt >= 4) // start to send supervision packet
6757 if (pBTInfo->BtAsocEntry[i].AMPRole == AMP_BTAP_JOINER)
6759 if (pBtMgnt->bssDesc.BssQos.bdQoSMode > QOS_DISABLE)
6762 else if (pBTInfo->BtAsocEntry[i].AMPRole == AMP_BTAP_CREATOR)
6764 if (pBTInfo->BtAsocEntry[i].bPeerQosSta)
6767 BTPKT_SendLinkSupervisionPacket(padapter, _TRUE, i, isQosdata);
6770 if (pBTInfo->BtAsocEntry[i].bSendSupervisionPacket)
6772 if (pBTInfo->BtAsocEntry[i].NoRxPktCnt >= EntryTOCnt)
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);
6782 pBTInfo->BtAsocEntry[i].bSendSupervisionPacket = _TRUE;
6787 pBTInfo->BtAsocEntry[i].NoRxPktCnt++;
6791 PlatformSetTimer(padapter, &pBTInfo->BTSupervisionPktTimer, callBackTimer);
6795 void bthci_TimerCallbackBTAuthTimeout(PRT_TIMER pTimer)
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;
6807 switch (pBtMgnt->BTCurrentConnectType)
6809 case BT_CONNECT_AUTH_REQ:
6811 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> BT_CONNECT_AUTH_REQ\n"));
6812 if (pBtMgnt->BTReceiveConnectPkt! = BT_CONNECT_AUTH_RSP)
6814 if (pBtMgnt->BTAuthCount < BTMaxAuthCount)
6816 FillOctetString(OurCText, pMgntInfo->arChalng, 0);
6818 arAlg = OPEN_SYSTEM;
6819 AuthStatusCode = StatusCode_success;
6821 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Re Send Auth Req %d\n", pBtMgnt->BTAuthCount));
6822 BTPKT_SendAuthenticatePacket(
6824 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr, // auStaAddr,
6827 AuthStatusCode, // AuthStatusCode
6828 OurCText // AuthChallengetext
6831 pBtMgnt->BTAuthCount++;
6833 PlatformSetTimer(padapter, &pBtInfo->BTAuthTimeoutTimer, 200);
6837 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Reach BTMaxAuthCount\n"));
6843 case BT_CONNECT_AUTH_RSP:
6845 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> BT_CONNECT_AUTH_RSP\n"));
6846 if (pBtMgnt->BTReceiveConnectPkt != BT_CONNECT_ASOC_REQ)
6848 if (pBtMgnt->BTAuthCount < BTMaxAuthCount)
6850 OurCText.Length = 0;
6851 OurCText.Octet = arChalng;
6853 arAlg = OPEN_SYSTEM;
6855 AuthStatusCode = StatusCode_success;
6857 BTPKT_SendAuthenticatePacket(
6859 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr, // auStaAddr,
6862 AuthStatusCode, // AuthStatusCode
6863 OurCText // AuthChallengetext
6866 pBtMgnt->BTAuthCount++;
6870 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> Reach BTMaxAuthCount\n"));
6878 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackBTAuthTimeout==> No Such Connect Type %d !!!!!!\n", pBtMgnt->BTCurrentConnectType));
6885 void bthci_TimerCallbackAsocTimeout(PRT_TIMER pTimer)
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;
6894 switch (pBtMgnt->BTCurrentConnectType)
6896 case BT_CONNECT_ASOC_REQ:
6898 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> BT_CONNECT_ASOC_REQ\n"));
6899 if (pBtMgnt->BTReceiveConnectPkt! = BT_CONNECT_ASOC_RSP)
6901 if (pBtMgnt->BTAsocCount < BTMaxAsocCount)
6903 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> Re Send Asoc Req %d\n", pBtMgnt->BTAsocCount));
6904 BTPKT_SendAssociateReq(
6906 pBtInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTRemoteMACAddr,
6909 pBtMgnt->CurrentConnectEntryNum);
6911 pBtMgnt->BTAsocCount++;
6913 PlatformSetTimer(padapter, &pBtInfo->BTAsocTimeoutTimer, 200);
6917 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> Reach BTMaxAuthCount\n"));
6922 case BT_CONNECT_ASOC_RSP:
6924 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> BT_CONNECT_ASOC_RSP\n"));
6929 RTPRINT(FIOCTL, (IOCTL_STATE|IOCTL_BT_LOGO), ("bthci_TimerCallbackAsocTimeout==> No Such Connect Type %d !!!!!!\n", pBtMgnt->BTCurrentConnectType));
6936 void bthci_TimerCallbackDisconnectPhysicalLink(PRT_TIMER pTimer)
6938 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6939 PADAPTER padapter = (PADAPTER)pTimer;
6940 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6941 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6943 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("===>bthci_TimerCallbackDisconnectPhysicalLink\n"));
6945 if (pBTInfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].BtCurrentState == HCI_STATE_CONNECTED)
6947 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTED,STATE_CMD_DISCONNECT_PHY_LINK, pBtMgnt->DisconnectEntryNum);
6950 BTHCI_EventNumOfCompletedDataBlocks(padapter);
6951 pBtMgnt->DisconnectEntryNum = 0xff;
6952 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("<===bthci_TimerCallbackDisconnectPhysicalLink\n"));
6956 u8 bthci_WaitForRfReady(PADAPTER padapter)
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;
6967 // rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState));
6968 RfState = ppwrctrl->rf_pwrstate;
6970 // if ((RfState != eRfOn) || (pPSC->bSwRfProcessing))
6971 if ((RfState != rf_on) || (ppwrctrl->bips_processing))
6974 if (waitcnt++ >= 200)
6976 // RT_ASSERT(_FALSE, ("bthci_WaitForRfReady(), wait for RF ON timeout\n"));
6983 RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_WaitForRfReady(), Rf is on, wait %d times\n", waitcnt));
6992 void bthci_WorkItemCallbackPsDisable(void *pContext)
6994 PADAPTER padapter = (PADAPTER)pContext;
6995 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6998 for (CurrentAssocNum=0; CurrentAssocNum<MAX_BT_ASOC_ENTRY_NUM; CurrentAssocNum++)
7000 if (pBTInfo->BtAsocEntry[CurrentAssocNum].bUsed == _TRUE)
7002 RTPRINT(FIOCTL, IOCTL_STATE, ("WorkItemCallbackPsDisable(): Handle Associate Entry %d\n", CurrentAssocNum));
7004 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
7006 // BTPKT_StartBeacon(padapter, CurrentAssocNum); // not porting yet
7007 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_COMPLETE, CurrentAssocNum);
7009 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
7011 bthci_WaitForRfReady(padapter);
7012 bthci_ResponderStartToScan(padapter);
7018 void bthci_WorkItemCallbackHCICmd(void *pContext)
7020 PlatformProcessHCICommands(pContext);
7023 void bthci_WorkItemCallbackSendACLData(void *pContext)
7025 #if (SENDTXMEHTOD == 0)
7026 PADAPTER padapter = (PADAPTER)pContext;
7027 #if 0 //cosa for special logo test case
7028 if (acldata_cnt >= 2)
7030 PlatformTxBTQueuedPackets(padapter);
7034 void bthci_WorkItemCallbackConnect(void *pContext)
7036 PADAPTER padapter = (PADAPTER)pContext;
7037 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7038 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7040 // BTPKT_JoinerConnectProcess(padapter, pBtMgnt->CurrentConnectEntryNum); // not porting yet
7043 u8 BTHCI_GetConnectEntryNum(PADAPTER padapter)
7045 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7046 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7048 return bthci_GetCurrentEntryNum(padapter, pBtMgnt->BtCurrentPhyLinkhandle);
7051 u8 BTHCI_GetCurrentEntryNumByMAC(PADAPTER padapter, u8 *SA)
7053 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7056 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7058 if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
7060 if (_rtw_memcmp(pBTInfo->BtAsocEntry[i].BTRemoteMACAddr, SA, 6) == _TRUE)
7069 void BTHCI_StatusWatchdog(PADAPTER padapter)
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;
7079 u8 testbuf[100]={0};
7080 PRTK_DBG_CTRL_OIDS pDbgCtrl;
7081 PPACKET_IRP_HCICMD_DATA pHCICMD;
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;
7093 *((u16*)&pHCICMD->Data[1]) = 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);
7102 if ((pMgntInfo->RfOffReason & RF_CHANGE_BY_HW) ||
7103 (pMgntInfo->RfOffReason & RF_CHANGE_BY_SW))
7105 if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
7106 (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
7111 if (!MgntRoamingInProgress(pMgntInfo) &&
7112 !MgntIsLinkInProgress(pMgntInfo) &&
7113 !MgntScanInProgress(pMgntInfo) &&
7115 if ((check_fwstate(&padapter->mlmepriv, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) &&
7119 static u8 BTwaitcnt=0;
7120 if (pBtMgnt->BTNeedAMPStatusChg)
7125 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_FULL_CAPACITY_FOR_BT);
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 )
7140 if (pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod)
7142 else if (pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod)
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));
7158 BTHCI_NotifyRFState(
7160 rt_rf_power_state StateToSet,
7161 RT_RF_CHANGE_SOURCE ChangeSource
7165 PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7166 RT_RF_CHANGE_SOURCE RfOffReason = pMgntInfo->RfOffReason;
7168 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
7169 RT_RF_CHANGE_SOURCE RfOffReason = ppwrctrl->rfoff_reason;
7172 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Old RfOffReason = 0x%x, ChangeSource = 0x%x\n", RfOffReason, ChangeSource));
7173 if (ChangeSource < RF_CHANGE_BY_HW)
7175 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), ChangeSource < RF_CHANGE_BY_HW\n"));
7180 // When RF is on/off by HW/SW(IPS/LPS not included), we have to notify
7181 // core stack the AMP_Status
7184 // We only have to check RF On/Off by HW/SW
7185 RfOffReason &= (RF_CHANGE_BY_HW|RF_CHANGE_BY_SW);
7193 // Previously, HW or SW Rf state is OFF, check if it is turned on by HW/SW
7195 RfOffReason &= ~ChangeSource;
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);
7209 // Previously, both HW/SW Rf state is ON, check if it is turned off by HW/SW
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);
7218 RTPRINT(FIOCTL, IOCTL_STATE, ("Unknown case!! \n"));
7224 BTHCI_IndicateAMPStatus(
7230 // PMGNT_INFO pMgntInfo = &(padapter->MgntInfo);
7231 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7232 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7233 u8 bNeedIndicate = _FALSE;
7235 RTPRINT(FIOCTL, IOCTL_STATE, ("JoinAction=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
7236 JoinAction, channel));
7243 // When join infra or ibss, check if bt channel is the current channel,
7244 // if not, we need to indicate AMPStatus=2
7246 if (channel != pBtMgnt->BTChannel)
7247 bNeedIndicate = _TRUE;
7251 // when start IBSS, we need to indicate AMPStatus=2 to
7252 // reset be hw security
7254 bNeedIndicate = _TRUE;
7264 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_IndicateAMPStatus(), BT channel=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
7265 pBtMgnt->BTChannel, channel));
7267 if (pBtMgnt->BtOperationOn)
7269 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in JoinRequest()\n"));
7270 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
7282 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pEvntData;
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));
7288 switch (PPacketIrpEvent->EventCode)
7290 case HCI_EVENT_COMMAND_COMPLETE:
7291 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_COMPLETE\n"));
7293 case HCI_EVENT_COMMAND_STATUS:
7294 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_STATUS\n"));
7302 BTHCI_GetPhysicalLinkHandle(
7307 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7310 handle = pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle;
7316 BTHCI_IndicateRxData(
7323 RT_STATUS rt_status;
7325 rt_status = PlatformIndicateBTACLData(padapter, pData, dataLen, EntryNum);
7330 void BTHCI_InitializeAllTimer(PADAPTER padapter)
7332 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7333 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
7335 #if (BT_THREAD == 0)
7336 PlatformInitializeTimer(padapter, &pBTinfo->BTHCICmdTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackHCICmd, NULL, "BTHCICmdTimer");
7338 #if (SENDTXMEHTOD == 0)
7339 PlatformInitializeTimer(padapter, &pBTinfo->BTHCISendAclDataTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackSendAclData, NULL, "BTHCISendAclDataTimer");
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");
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");
7354 void BTHCI_CancelAllTimer(PADAPTER padapter)
7356 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7357 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
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);
7364 PlatformCancelTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
7365 PlatformCancelTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
7366 PlatformCancelTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
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);
7377 void BTHCI_ReleaseAllTimer(PADAPTER padapter)
7379 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7380 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
7382 #if (BT_THREAD == 0)
7383 PlatformReleaseTimer(padapter, &pBTinfo->BTHCICmdTimer);
7385 #if (SENDTXMEHTOD == 0)
7386 PlatformReleaseTimer(padapter, &pBTinfo->BTHCISendAclDataTimer);
7388 PlatformReleaseTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
7389 PlatformReleaseTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
7390 PlatformReleaseTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
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);
7401 void BTHCI_InitializeAllWorkItem(PADAPTER padapter)
7403 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7404 #if (BT_THREAD == 0)
7405 PlatformInitializeWorkItem(
7407 &(pBTinfo->HCICmdWorkItem),
7408 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackHCICmd,
7412 #if (SENDTXMEHTOD == 0)
7413 PlatformInitializeWorkItem(
7415 &(pBTinfo->HCISendACLDataWorkItem),
7416 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackSendACLData,
7418 "HCISendACLDataWorkItem");
7420 PlatformInitializeWorkItem(
7422 &(pBTinfo->BTPsDisableWorkItem),
7423 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackPsDisable,
7425 "BTPsDisableWorkItem");
7427 PlatformInitializeWorkItem(
7429 &(pBTinfo->BTConnectWorkItem),
7430 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackConnect,
7432 "BTConnectWorkItem");
7435 void BTHCI_FreeAllWorkItem(PADAPTER padapter)
7437 PBT30Info pBTinfo = GET_BT_INFO(padapter);
7438 #if (BT_THREAD == 0)
7439 PlatformFreeWorkItem(&(pBTinfo->HCICmdWorkItem));
7441 #if (SENDTXMEHTOD == 0)
7442 PlatformFreeWorkItem(&(pBTinfo->HCISendACLDataWorkItem));
7444 PlatformFreeWorkItem(&(pBTinfo->BTPsDisableWorkItem));
7445 PlatformFreeWorkItem(&(pBTinfo->BTConnectWorkItem));
7448 void BTHCI_Reset(PADAPTER padapter)
7450 bthci_CmdReset(padapter, _FALSE);
7453 u8 BTHCI_HsConnectionEstablished(PADAPTER padapter)
7455 u8 bBtConnectionExist = _FALSE;
7456 PBT30Info pBtinfo = GET_BT_INFO(padapter);
7459 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7461 if (pBtinfo->BtAsocEntry[i].b4waySuccess == _TRUE)
7463 bBtConnectionExist = _TRUE;
7468 // RTPRINT(FIOCTL, IOCTL_STATE, (" BTHCI_HsConnectionEstablished(), connection exist = %d\n", bBtConnectionExist));
7470 return bBtConnectionExist;
7474 BTHCI_CheckProfileExist(
7476 BT_TRAFFIC_MODE_PROFILE Profile
7479 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7480 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7481 u8 IsPRofile = _FALSE;
7484 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7486 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == Profile)
7496 u8 BTHCI_GetBTCoreSpecByProf(PADAPTER padapter, u8 profile)
7498 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7499 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7500 u8 btSpec = BT_SPEC_1_2;
7503 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7505 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == profile)
7507 btSpec = pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec;
7516 void BTHCI_GetProfileNameMoto(PADAPTER padapter)
7518 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7519 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7521 u8 InCommingMode = 0,OutGoingMode = 0,ScoMode = 0;
7524 ScoMode = pBtMgnt->ExtConfig.NumberOfSCO;
7526 RTPRINT(FBT, BT_TRACE, ("[DM][BT], NumberOfHandle = %d, NumberOfSCO = %d\n",
7527 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
7529 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7531 InCommingMode=pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode;
7532 OutGoingMode=pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode;
7536 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_SCO;
7538 else if ((InCommingMode == BT_MOTOR_EXT_BE) && (OutGoingMode == BT_MOTOR_EXT_BE))
7540 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_PAN;
7542 else if ((InCommingMode == BT_MOTOR_EXT_GULB) && (OutGoingMode == BT_MOTOR_EXT_GULB))
7544 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_A2DP;
7546 else if ((InCommingMode == BT_MOTOR_EXT_GUL) && (OutGoingMode == BT_MOTOR_EXT_BE))
7548 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_HID;
7552 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
7557 void BTHCI_UpdateBTProfileRTKToMoto(PADAPTER padapter)
7559 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7560 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7563 pBtMgnt->ExtConfig.NumberOfSCO = 0;
7565 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7567 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
7569 if (pBtMgnt->ExtConfig.linkInfo[i].BTProfile == BT_PROFILE_SCO)
7571 pBtMgnt->ExtConfig.NumberOfSCO++;
7574 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = pBtMgnt->ExtConfig.linkInfo[i].BTProfile;
7575 switch (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile)
7577 case BT_PROFILE_SCO:
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;
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;
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;
7596 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RTK, NumberOfHandle = %d, NumberOfSCO = %d\n",
7597 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
7600 void BTHCI_GetBTRSSI(PADAPTER padapter)
7602 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7603 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7608 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
7610 bthci_EventExtGetBTRSSI(padapter, pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle);
7614 void BTHCI_WifiScanNotify(PADAPTER padapter, u8 scanType)
7616 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7617 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7619 if (pBtMgnt->ExtConfig.bEnableWifiScanNotify)
7620 bthci_EventExtWifiScanNotify(padapter, scanType);
7627 HCI_STATE_WITH_CMD StateCmd,
7631 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7632 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7634 if (EntryNum == 0xff)
7636 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, error EntryNum=0x%x \n",EntryNum));
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));
7642 if (pBTInfo->BtAsocEntry[EntryNum].BtNextState & StateToEnter)
7644 pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = StateToEnter;
7646 switch (StateToEnter)
7648 case HCI_STATE_STARTING:
7650 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTING;
7651 bthci_StateStarting(padapter,StateCmd,EntryNum);
7654 case HCI_STATE_CONNECTING:
7656 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTING | HCI_STATE_DISCONNECTING | HCI_STATE_AUTHENTICATING;
7657 bthci_StateConnecting(padapter,StateCmd,EntryNum);
7661 case HCI_STATE_AUTHENTICATING:
7663 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTED;
7664 bthci_StateAuth(padapter,StateCmd,EntryNum);
7668 case HCI_STATE_CONNECTED:
7670 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTED | HCI_STATE_DISCONNECTING;
7671 bthci_StateConnected(padapter,StateCmd,EntryNum);
7675 case HCI_STATE_DISCONNECTING:
7677 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_DISCONNECTING;
7678 bthci_StateDisconnecting(padapter,StateCmd,EntryNum);
7682 case HCI_STATE_DISCONNECTED:
7684 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_STARTING | HCI_STATE_CONNECTING;
7685 bthci_StateDisconnected(padapter,StateCmd,EntryNum);
7690 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Unknown state to enter!!!\n"));
7696 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Wrong state to enter\n"));
7699 // 20100325 Joseph: Disable/Enable IPS/LPS according to BT status.
7700 if (!pBtMgnt->bBTConnectInProgress && !pBtMgnt->BtOperationOn)
7702 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT PS], IPSReturn()\n"));
7703 IPSReturn(padapter, IPS_DISABLE_BT_ON);
7707 void BTHCI_DisconnectPeer(PADAPTER padapter, u8 EntryNum)
7709 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7710 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7712 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" BTHCI_DisconnectPeer()\n"));
7714 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_DISCONNECTING,STATE_CMD_MAC_CONNECT_CANCEL_INDICATE,EntryNum);
7716 if (pBTInfo->BtAsocEntry[EntryNum].bUsed)
7718 // BTPKT_SendDeauthentication(padapter, pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, unspec_reason); // not porting yet
7721 if (pBtMgnt->bBTConnectInProgress)
7723 pBtMgnt->bBTConnectInProgress = _FALSE;
7724 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
7727 bthci_RemoveEntryByEntryNum(padapter,EntryNum);
7729 if (pBtMgnt->bNeedNotifyAMPNoCap)
7731 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in BTHCI_DisconnectPeer()\n"));
7732 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
7736 void BTHCI_EventNumOfCompletedDataBlocks(PADAPTER padapter)
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;
7749 PlatformZeroMemory(padapter->IrpHCILocalbuf.Ptr, padapter->IrpHCILocalbuf.Length);
7750 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
7752 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7755 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS))
7757 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Num Of Completed DataBlocks, Ignore to send NumOfCompletedDataBlocksEvent due to event mask page 2\n"));
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++)
7767 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
7769 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
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);
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)
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));
7787 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
7788 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
7789 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
7797 pRetPar[2] = handleNum; // Number_of_Handles
7799 pu2Temp = (u16*)&pRetPar[0];
7800 *pu2Temp = BTTotalDataBlockNum;
7803 PPacketIrpEvent->EventCode = HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS;
7804 PPacketIrpEvent->Length = len;
7805 if (handleNum && sent)
7807 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
7811 void BTHCI_EventNumOfCompletedPackets(PADAPTER padapter)
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;
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++)
7828 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
7830 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
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)
7840 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
7841 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
7848 pRetPar[0] = handleNum; // Number_of_Handles
7851 PPacketIrpEvent->EventCode = HCI_EVENT_NUMBER_OF_COMPLETE_PACKETS;
7852 PPacketIrpEvent->Length = len;
7853 if (handleNum && sent)
7855 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BTHCI_EventNumOfCompletedPackets \n"));
7856 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
7861 BTHCI_EventAMPStatusChange(
7866 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7867 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7868 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7870 u8 localBuf[7] = "";
7872 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
7875 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_AMP_STATUS_CHANGE))
7877 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("Ignore to send this event due to event mask page 2\n"));
7882 if (AMP_Status==AMP_STATUS_NO_CAPACITY_FOR_BT)
7884 pBtMgnt->BTNeedAMPStatusChg = _TRUE;
7885 pBtMgnt->bNeedNotifyAMPNoCap = _FALSE;
7887 BTHCI_DisconnectAll(padapter);
7889 else if (AMP_Status == AMP_STATUS_FULL_CAPACITY_FOR_BT)
7891 pBtMgnt->BTNeedAMPStatusChg = _FALSE;
7894 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7895 // Return parameters starts from here
7896 pRetPar = &PPacketIrpEvent->Data[0];
7898 pRetPar[0] = 0; // Status
7900 pRetPar[1] = AMP_Status; // AMP_Status
7903 PPacketIrpEvent->EventCode = HCI_EVENT_AMP_STATUS_CHANGE;
7904 PPacketIrpEvent->Length = len;
7905 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
7907 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_STATE), ("[BT event], AMP Status Change, AMP_Status = %d\n", AMP_Status));
7911 void BTHCI_DisconnectAll(PADAPTER padapter)
7913 PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
7914 // PMGNT_INFO pMgntInfo = &(pDefaultAdapter->MgntInfo);
7915 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7919 RTPRINT(FIOCTL, IOCTL_STATE, (" DisconnectALL()\n"));
7921 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7923 if (pBTInfo->BtAsocEntry[i].b4waySuccess == _TRUE)
7925 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, i);
7927 else if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
7929 if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_CONNECTING)
7931 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7933 else if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_DISCONNECTING)
7935 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7944 PPACKET_IRP_HCICMD_DATA pHciCmd
7947 HCI_STATUS status = HCI_STATUS_SUCCESS;
7948 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7949 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
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);
7957 if (pHciCmd->Length)
7959 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "HCI Command, Hex Data :\n",
7960 &pHciCmd->Data[0], pHciCmd->Length);
7962 if (pHciCmd->OGF == OGF_EXTENSION)
7964 if (pHciCmd->OCF == HCI_SET_RSSI_VALUE)
7966 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("[BT cmd], "));
7970 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT cmd], "));
7975 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("[BT cmd], "));
7978 pBtDbg->dbgHciInfo.hciCmdCnt++;
7980 switch (pHciCmd->OGF)
7982 case OGF_LINK_CONTROL_COMMANDS:
7983 status = bthci_HandleOGFLinkControlCMD(padapter, pHciCmd);
7985 case OGF_HOLD_MODE_COMMAND:
7987 case OGF_SET_EVENT_MASK_COMMAND:
7988 status = bthci_HandleOGFSetEventMaskCMD(padapter, pHciCmd);
7990 case OGF_INFORMATIONAL_PARAMETERS:
7991 status = bthci_HandleOGFInformationalParameters(padapter, pHciCmd);
7993 case OGF_STATUS_PARAMETERS:
7994 status = bthci_HandleOGFStatusParameters(padapter, pHciCmd);
7996 case OGF_TESTING_COMMANDS:
7997 status = bthci_HandleOGFTestingCMD(padapter, pHciCmd);
8000 status = bthci_HandleOGFExtension(padapter,pHciCmd);
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);
8008 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("HCI Command execution end!!\n"));
8014 BTHCI_SetLinkStatusNotify(
8016 PPACKET_IRP_HCICMD_DATA pHciCmd
8019 bthci_CmdLinkStatusNotify(padapter, pHciCmd);
8022 // ===== End of sync from SD7 driver COMMOM/bt_hci.c =====
8025 #ifdef __HALBTC87231ANT_C__ // HAL/BTCoexist/HalBtc87231Ant.c
8027 const char *const BtStateString[] =
8036 "BT_ACL_INQ_OR_PAG",
8037 "BT_STATE_NOT_DEFINED"
8040 extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
8042 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
8052 u8 H2C_Parameter[3] = {0};
8054 H2C_Parameter[0] = byte1;
8055 H2C_Parameter[1] = byte2;
8056 H2C_Parameter[2] = byte3;
8058 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x50=0x%06x\n",
8059 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
8061 FillH2CCmd(padapter, 0x50, 3, H2C_Parameter);
8064 void btdm_SetFwIgnoreWlanAct(PADAPTER padapter, u8 bEnable)
8066 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8067 u8 H2C_Parameter[1] = {0};
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;
8077 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT don't ignore Wlan_Act !!\n"));
8080 RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%02x\n",
8083 FillH2CCmd(padapter, BT_IGNORE_WLAN_ACT_EID, 1, H2C_Parameter);
8086 void btdm_NotifyFwScan(PADAPTER padapter, u8 scanType)
8088 u8 H2C_Parameter[1] = {0};
8090 if (scanType == _TRUE)
8091 H2C_Parameter[0] = 0x1;
8093 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Notify FW for wifi scan, write 0x3b=0x%02x\n",
8096 FillH2CCmd(padapter, 0x3b, 1, H2C_Parameter);
8099 void btdm_1AntSetPSMode(PADAPTER padapter, u8 enable, u8 smartps, u8 mode)
8101 struct pwrctrl_priv *pwrctrl;
8104 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current LPS(%s, %d), smartps=%d\n", enable==_TRUE?"ON":"OFF", mode, smartps));
8106 pwrctrl = &padapter->pwrctrlpriv;
8108 if (enable == _TRUE) {
8109 rtw_set_ps_mode(padapter, PS_MODE_MIN, smartps, mode);
8111 rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0);
8112 LPS_RF_ON_check(padapter, 100);
8116 void btdm_1AntTSFSwitch(PADAPTER padapter, u8 enable)
8121 oldVal = rtw_read8(padapter, 0x550);
8124 newVal = oldVal | EN_BCN_FUNCTION;
8126 newVal = oldVal & ~EN_BCN_FUNCTION;
8128 if (oldVal != newVal)
8129 rtw_write8(padapter, 0x550, newVal);
8132 u8 btdm_Is1AntPsTdmaStateChange(PADAPTER padapter)
8134 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8135 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8138 if ((pBtdm8723->bPrePsTdmaOn != pBtdm8723->bCurPsTdmaOn) ||
8139 (pBtdm8723->prePsTdma != pBtdm8723->curPsTdma))
8149 // Before enter TDMA, make sure Power Saving is enable!
8157 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8158 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8161 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], TDMA(%s, %d)\n", (bTurnOn? "ON":"OFF"), type));
8162 pBtdm8723->bCurPsTdmaOn = bTurnOn;
8163 pBtdm8723->curPsTdma = type;
8168 case 1: // A2DP Level-1 or FTP/OPP
8170 if (btdm_Is1AntPsTdmaStateChange(padapter))
8172 // wide duration for WiFi
8173 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x58);
8176 case 2: // A2DP Level-2
8177 if (btdm_Is1AntPsTdmaStateChange(padapter))
8179 // normal duration for WiFi
8180 BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x58);
8183 case 3: // BT FTP/OPP
8184 if (btdm_Is1AntPsTdmaStateChange(padapter))
8186 // normal duration for WiFi
8187 BTDM_SetFw3a(padapter, 0xd3, 0x30, 0x03, 0x10, 0x58);
8191 case 4: // for wifi scan & BT is connected
8192 if (btdm_Is1AntPsTdmaStateChange(padapter))
8194 // protect 3 beacons in 3-beacon period & no Tx pause at BT slot
8195 BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0);
8198 case 5: // for WiFi connected-busy & BT is Non-Connected-Idle
8199 if (btdm_Is1AntPsTdmaStateChange(padapter))
8201 // SCO mode, Ant fixed at WiFi, WLAN_Act toggle
8202 BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x00);
8205 case 9: // ACL high-retry type - 2
8206 if (btdm_Is1AntPsTdmaStateChange(padapter))
8208 // narrow duration for WiFi
8209 BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi
8212 case 10: // for WiFi connect idle & BT ACL busy or WiFi Connected-Busy & BT is Inquiry
8213 if (btdm_Is1AntPsTdmaStateChange(padapter))
8215 BTDM_SetFw3a(padapter, 0x13, 0xa, 0xa, 0x0, 0x40);
8218 case 11: // ACL high-retry type - 3
8219 if (btdm_Is1AntPsTdmaStateChange(padapter))
8221 // narrow duration for WiFi
8222 BTDM_SetFw3a(padapter, 0xd3, 0x05, 0x05, 0x00, 0x58);
8225 case 12: // for WiFi Connected-Busy & BT is Connected-Idle
8226 if (btdm_Is1AntPsTdmaStateChange(padapter))
8228 // Allow High-Pri BT
8229 BTDM_SetFw3a(padapter, 0xeb, 0x0a, 0x03, 0x31, 0x18);
8232 case 20: // WiFi only busy ,TDMA mode for power saving
8233 if (btdm_Is1AntPsTdmaStateChange(padapter))
8235 BTDM_SetFw3a(padapter, 0x13, 0x25, 0x25, 0x00, 0x00);
8238 case 27: // WiFi DHCP/Site Survey & BT SCO busy
8239 if (btdm_Is1AntPsTdmaStateChange(padapter))
8241 BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x31, 0x98);
8244 case 28: // WiFi DHCP/Site Survey & BT idle
8245 if (btdm_Is1AntPsTdmaStateChange(padapter))
8247 BTDM_SetFw3a(padapter, 0x69, 0x25, 0x03, 0x31, 0x00);
8250 case 29: // WiFi DHCP/Site Survey & BT ACL busy
8251 if (btdm_Is1AntPsTdmaStateChange(padapter))
8253 BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18);
8254 rtw_write32(padapter, 0x6c0, 0x5afa5afa);
8255 rtw_write32(padapter, 0x6c4, 0x5afa5afa);
8258 case 30: // WiFi idle & BT Inquiry
8259 if (btdm_Is1AntPsTdmaStateChange(padapter))
8261 BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x00);
8265 if (btdm_Is1AntPsTdmaStateChange(padapter))
8267 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x58);
8270 case 32: // BT SCO & Inquiry
8271 if (btdm_Is1AntPsTdmaStateChange(padapter))
8273 BTDM_SetFw3a(padapter, 0xab, 0x0a, 0x03, 0x11, 0x98);
8276 case 33: // BT SCO & WiFi site survey
8277 if (btdm_Is1AntPsTdmaStateChange(padapter))
8279 BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x30, 0x98);
8282 case 34: // BT HID & WiFi site survey
8283 if (btdm_Is1AntPsTdmaStateChange(padapter))
8285 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x18);
8288 case 35: // BT HID & WiFi Connecting
8289 if (btdm_Is1AntPsTdmaStateChange(padapter))
8291 BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x18);
8302 if (btdm_Is1AntPsTdmaStateChange(padapter))
8304 // Antenna control by PTA, 0x870 = 0x310
8305 BTDM_SetFw3a(padapter, 0x8, 0x0, 0x0, 0x0, 0x0);
8310 if (btdm_Is1AntPsTdmaStateChange(padapter))
8312 // Antenna control by PTA, 0x870 = 0x310
8313 BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
8315 rtw_write16(padapter, 0x860, 0x210); // Switch Antenna to BT
8316 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x210, Switch Antenna to BT\n"));
8319 if (btdm_Is1AntPsTdmaStateChange(padapter))
8321 // Antenna control by PTA, 0x870 = 0x310
8322 BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
8324 rtw_write16(padapter, 0x860, 0x110); // Switch Antenna to WiFi
8325 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x110, Switch Antenna to WiFi\n"));
8330 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current TDMA(%s, %d)\n",
8331 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
8334 pBtdm8723->bPrePsTdmaOn = pBtdm8723->bCurPsTdmaOn;
8335 pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
8338 void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u8 bTDMAOn, u8 tdmaType)
8340 struct pwrctrl_priv *pwrctrl;
8341 PHAL_DATA_TYPE pHalData;
8342 PBTDM_8723A_1ANT pBtdm8723;
8347 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
8348 (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE))
8350 btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
8354 #ifdef DIS_PS_RX_BCN
8355 psOption &= ~BIT(0);
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));
8363 pwrctrl = &padapter->pwrctrlpriv;
8364 pHalData = GET_HAL_DATA(padapter);
8365 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8369 if (_TRUE == pBtdm8723->bWiFiHalt) {
8370 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Halt!!\n"));
8374 if (_TRUE == pwrctrl->bInSuspend) {
8375 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Suspend!!\n"));
8379 if (_TRUE == padapter->bDriverStopped) {
8380 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi driver stopped!!\n"));
8384 if (_TRUE == padapter->bSurpriseRemoved) {
8385 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi Surprise Removed!!\n"));
8389 psMode = PS_MODE_MIN;
8393 psMode = PS_MODE_ACTIVE;
8397 if (psMode != pwrctrl->pwr_mode)
8399 else if (psMode != PS_MODE_ACTIVE)
8401 if (psOption != pwrctrl->bcn_ant_mode)
8403 else if (smartps != pwrctrl->smart_ps)
8411 if (_TRUE == bSwitchPS)
8414 if (pBtdm8723->bCurPsTdmaOn == _TRUE)
8416 if (bTDMAOn == _FALSE)
8417 btdm_1AntPsTdma(padapter, _FALSE, tdmaType);
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);
8426 btdm_1AntPsTdma(padapter, _FALSE, 0);
8430 // change Power Save State
8431 btdm_1AntSetPSMode(padapter, bPSEn, smartps, psOption);
8434 btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
8437 void btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 psOption, u8 bTDMAOn, u8 tdmaType)
8439 _btdm_1AntSetPSTDMA(padapter, bPSEn, 0, psOption, bTDMAOn, tdmaType);
8442 void btdm_1AntWifiParaAdjust(PADAPTER padapter, u8 bEnable)
8444 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8445 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8449 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust enable!!\n"));
8450 pBtdm8723->curWifiPara = 1;
8451 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
8453 BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
8458 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust disable!!\n"));
8459 pBtdm8723->curWifiPara = 2;
8460 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
8462 BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_NORMAL);
8466 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], preWifiPara = %d, curWifiPara = %d!!\n",
8467 // pBtdm8723->preWifiPara, pBtdm8723->curWifiPara));
8468 // pBtdm8723->preWifiPara = pBtdm8723->curWifiPara;
8471 void btdm_1AntPtaParaReload(PADAPTER padapter)
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
8478 // Antenna switch control parameter
8479 rtw_write32(padapter, 0x858, 0xaaaaaaaa);
8480 if (IS_8723A_A_CUT(GET_HAL_DATA(padapter)->VersionID))
8482 rtw_write32(padapter, 0x870, 0x0); // SPDT(connected with TRSW) control by hardware PTA
8483 rtw_write8(padapter, 0x40, 0x24);
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
8493 // coexistence parameters
8494 rtw_write8(padapter, 0x778, 0x1); // enable RTK mode PTA
8496 // BT don't ignore WLAN_Act
8497 btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
8502 * 1: upgrade (add WiFi duration time)
8504 * -1: downgrade (add BT duration time)
8506 s8 btdm_1AntTdmaJudgement(PADAPTER padapter, u8 retry)
8508 PHAL_DATA_TYPE pHalData;
8509 PBTDM_8723A_1ANT pBtdm8723;
8510 static s8 up = 0, dn = 0, m = 1, n = 3, WaitCount= 0;
8514 pHalData = GET_HAL_DATA(padapter);
8515 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8518 if (pBtdm8723->psTdmaMonitorCnt == 0)
8531 if (retry == 0) // no retry in the last 2-second duration
8539 // retry=0 in consecutive 3m*(2s), add WiFi duration
8548 else if (retry <= 3) // retry<=3 in the last 2-second duration
8556 // retry<=3 in consecutive 2*(2s), minus WiFi duration (add BT duration)
8559 // record how many time downgrad WiFi duration
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;
8573 else // retry count > 3
8575 // retry>3, minus WiFi duration (add BT duration)
8578 // record how many time downgrad WiFi duration
8583 if (m >= 20) m = 20;
8593 void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter)
8595 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8596 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8599 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
8600 if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCnt)
8602 pBtdm8723->psTdmaMonitorCnt = 0;
8603 pBtdm8723->psTdmaGlobalCnt = 0;
8605 if (pBtdm8723->psTdmaMonitorCnt == 0)
8607 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, first time execute!!\n"));
8608 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 2);
8609 pBtdm8723->psTdmaDuAdjType = 2;
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))
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));
8624 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8630 judge = btdm_1AntTdmaJudgement(padapter, pHalData->bt_coexist.halCoex8723.btRetryCnt);
8633 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Upgrade WiFi duration\n"));
8634 if (pBtdm8723->curPsTdma == 1)
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"));
8642 pBtdm8723->psTdmaDuAdjType = 2;
8643 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8646 else if (pBtdm8723->curPsTdma == 2)
8648 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
8649 pBtdm8723->psTdmaDuAdjType = 9;
8651 else if (pBtdm8723->curPsTdma == 9)
8653 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
8654 pBtdm8723->psTdmaDuAdjType = 11;
8657 else if (judge == 1)
8659 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Downgrade WiFi duration!!\n"));
8661 if (pBtdm8723->curPsTdma == 11)
8663 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
8664 pBtdm8723->psTdmaDuAdjType = 9;
8666 else if (pBtdm8723->curPsTdma == 9)
8668 if (pHalData->bt_coexist.halCoex8723.btInfoExt){
8669 pBtdm8723->psTdmaDuAdjType = 9;
8670 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n"));
8673 pBtdm8723->psTdmaDuAdjType = 2;
8674 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8676 else if (pBtdm8723->curPsTdma == 2)
8678 if (pHalData->bt_coexist.halCoex8723.btInfoExt){
8679 pBtdm8723->psTdmaDuAdjType = 9;
8680 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n"));
8683 pBtdm8723->psTdmaDuAdjType = 1;
8684 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
8689 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, no need to change\n"));
8693 RTPRINT(FBT, BT_TRACE, ("[BTCoex], ACL current TDMA(%s, %d)\n",
8694 (pBtdm8723->bCurPsTdmaOn? "ON":"OFF"), pBtdm8723->curPsTdma));
8697 pBtdm8723->psTdmaMonitorCnt++;
8700 u8 btdm_1AntAdjustbyWiFiRSSI(u8 RSSI_Now, u8 RSSI_Last, u8 RSSI_Th)
8704 if (RSSI_Now>RSSI_Last)
8706 if (RSSI_Now > (RSSI_Th + 5))
8713 if (RSSI_Now > RSSI_Th)
8722 void btdm_1AntTdmaDurationAdjustForSCO(PADAPTER padapter)
8724 PHAL_DATA_TYPE pHalData;
8725 PBTDM_8723A_1ANT pBtdm8723;
8728 u8 RSSITh_WiFi, RSSITh12_BT, RSSITh23_BT;
8729 u8 Type, RSSIOffset;
8730 u8 RSSI_WiFi_Now, RSSI_BT_Now;
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;
8742 RSSI_WiFi_Now = pDigTable->Rssi_val_min;
8743 RSSI_BT_Now = pHalData->bt_coexist.halCoex8723.btRssi;
8745 if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCntForSCO)
8747 pBtdm8723->psTdmaMonitorCntForSCO = 0;
8748 pBtdm8723->psTdmaGlobalCnt = 0;
8751 if (pBtdm8723->psTdmaMonitorCntForSCO == 0)
8753 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, first time execute!!\n"));
8754 pBtdm8723->RSSI_WiFi_Last = 0;
8755 pBtdm8723->RSSI_BT_Last = 0;
8759 if ((pBtdm8723->curPsTdma != 23) &&
8760 (pBtdm8723->curPsTdma != 24) &&
8761 (pBtdm8723->curPsTdma != 25) &&
8762 (pBtdm8723->curPsTdma != 26))
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));
8767 Type = pBtdm8723->psTdmaDuAdjTypeForSCO;
8769 goto _exit_1AntTdmaDurationAdjustForSCO;
8773 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, pre curPsTdma=%d\n", pBtdm8723->curPsTdma));
8777 BTDM_1AntSignalCompensation(padapter, &RSSI_WiFi_Now, &RSSI_BT_Now);
8779 if (!BTDM_IsWifiBusy(padapter)) // WiFi LPS
8781 //Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8784 if(RSSI_BT_Now >= RSSITh12_BT + 4)
8791 if (RSSI_BT_Now >= RSSITh12_BT)
8800 //if (RSSI_BT_Now > pBtdm8723->RSSI_BT_Last)
8803 if (RSSI_BT_Now >= RSSITh12_BT + 4)
8805 else if (RSSI_BT_Now >= RSSITh23_BT + 4)
8808 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8812 if (RSSI_BT_Now >= RSSITh12_BT)
8814 else if (RSSI_BT_Now >= RSSITh23_BT)
8817 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
8821 _exit_1AntTdmaDurationAdjustForSCO:
8823 pBtdm8723->RSSI_WiFi_Last = RSSI_WiFi_Now;
8824 pBtdm8723->RSSI_BT_Last = RSSI_BT_Now;
8826 if (Type != pBtdm8723->curPsTdma)
8827 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, Type);
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));
8832 pBtdm8723->psTdmaDuAdjTypeForSCO = Type;
8834 pBtdm8723->psTdmaMonitorCntForSCO++;
8837 void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter)
8839 struct mlme_priv *pmlmepriv;
8840 PHAL_DATA_TYPE pHalData;
8841 PBT_COEXIST_8723A pBtCoex;
8842 PBTDM_8723A_1ANT pBtdm8723;
8846 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntCoexProcessForWifiConnect!!\n"));
8848 pmlmepriv = &padapter->mlmepriv;
8849 pHalData = GET_HAL_DATA(padapter);
8850 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8851 pBtdm8723 = &pBtCoex->btdm1Ant;
8852 BtState = pBtCoex->c2hBtInfo;
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]));
8857 padapter->pwrctrlpriv.btcoex_rfon = _FALSE;
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)))
8864 case BT_INFO_STATE_NO_CONNECTION:
8865 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9);
8867 case BT_INFO_STATE_CONNECT_IDLE:
8868 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 0);
8874 #ifdef BTCOEX_DECREASE_WIFI_POWER
8877 val8 = rtw_read8(padapter, 0x883);
8879 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8880 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8882 if (BTDM_IsHT40(padapter) == _TRUE)
8883 val8 |= 0x80; //0x880[31:27] = 10000;
8885 val8 |= 0x60; //0x880[31:27] = 01100;
8889 val8 |= 0xC0; // 0x880[31:27] = 11000;
8891 rtw_write8(padapter, 0x883, val8);
8892 #endif // BTCOEX_DECREASE_WIFI_POWER
8896 case BT_INFO_STATE_NO_CONNECTION:
8897 case BT_INFO_STATE_CONNECT_IDLE:
8899 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 5);
8900 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8901 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
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);
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);
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
8924 case BT_INFO_STATE_ACL_ONLY_BUSY:
8925 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8926 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
8928 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is HID\n"));
8929 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 31);
8931 else if (pBtCoex->c2hBtProfile == BT_INFO_FTP)
8933 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is FTP/OPP\n"));
8934 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 3);
8936 else if (pBtCoex->c2hBtProfile == (BT_INFO_A2DP|BT_INFO_FTP))
8938 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_FTP\n"));
8939 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
8943 if (pBtCoex->c2hBtProfile == BT_INFO_A2DP)
8945 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP\n"));
8949 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is UNKNOWN(0x%02X)! Use A2DP Profile\n", pBtCoex->c2hBtProfile));
8951 btdm_1AntTdmaDurationAdjustForACL(padapter);
8957 pBtdm8723->psTdmaGlobalCnt++;
8960 static void btdm_1AntUpdateHalRAMask(PADAPTER padapter, u32 mac_id, u32 filter)
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;
8975 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d, filter=0x%08x!!\n", __FUNCTION__, mac_id, filter));
8977 pHalData = GET_HAL_DATA(padapter);
8978 pdmpriv = &pHalData->dmpriv;
8979 pmlmeext = &padapter->mlmeextpriv;
8980 pmlmeinfo = &pmlmeext->mlmext_info;
8981 cur_network = &pmlmeinfo->network;
8983 if (mac_id >= NUM_STA) //CAM_SIZE
8985 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d illegal!!\n", __FUNCTION__, mac_id));
8989 psta = pmlmeinfo->FW_sta_info[mac_id].psta;
8992 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, Can't find station!!\n", __FUNCTION__));
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)))
9006 shortGIrate = _TRUE;
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);
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);
9020 mask |= ((raid<<28)&0xf0000000);
9023 init_rate = get_highest_rate_idx(mask)&0x3f;
9025 if (pHalData->fw_ractrl == _TRUE)
9029 arg = mac_id&0x1f;//MACID
9031 if (_TRUE == shortGIrate)
9034 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Update FW RAID entry, MASK=0x%08x, arg=0x%02x\n", mask, arg));
9036 rtl8192c_set_raid_cmd(padapter, mask, arg);
9040 if (_TRUE == shortGIrate)
9041 init_rate |= BIT(6);
9043 rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate);
9046 psta->init_rate = init_rate;
9047 pdmpriv->INIDATA_RATE[mac_id] = init_rate;
9050 static void btdm_1AntUpdateHalRAMaskForSCO(PADAPTER padapter, u8 forceUpdate)
9052 PBTDM_8723A_1ANT pBtdm8723;
9053 struct sta_priv *pstapriv;
9054 WLAN_BSSID_EX *cur_network;
9055 struct sta_info *psta;
9060 pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
9062 if ((pBtdm8723->bRAChanged == _TRUE) && (forceUpdate == _FALSE))
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;
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_);
9077 btdm_1AntUpdateHalRAMask(padapter, macid, filter);
9079 pBtdm8723->bRAChanged = _TRUE;
9082 static void btdm_1AntRecoverHalRAMask(PADAPTER padapter)
9084 PBTDM_8723A_1ANT pBtdm8723;
9085 struct sta_priv *pstapriv;
9086 WLAN_BSSID_EX *cur_network;
9087 struct sta_info *psta;
9091 pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
9093 if (pBtdm8723->bRAChanged == _FALSE)
9096 pstapriv = &padapter->stapriv;
9097 cur_network = &padapter->mlmeextpriv.mlmext_info.network;
9098 psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
9100 Update_RA_Entry(padapter, psta);
9102 pBtdm8723->bRAChanged = _FALSE;
9105 void btdm_1AntBTStateChangeHandler(PADAPTER padapter, BT_STATE_1ANT oldState, BT_STATE_1ANT newState)
9107 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT state change, %s => %s\n", BtStateString[oldState], BtStateString[newState]));
9109 // BT default ignore wlan active,
9110 // WiFi MUST disable this when BT is enable
9111 if (newState > BT_INFO_STATE_DISABLED)
9113 btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
9116 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) &&
9117 (BTDM_IsWifiConnectionExist(padapter) == _TRUE))
9119 if ((newState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9120 (newState == BT_INFO_STATE_ACL_SCO_BUSY))
9122 btdm_1AntUpdateHalRAMaskForSCO(padapter, _FALSE);
9126 // Recover original RA setting
9127 btdm_1AntRecoverHalRAMask(padapter);
9132 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bRAChanged = _FALSE;
9135 if (oldState == newState)
9138 if (oldState == BT_INFO_STATE_ACL_ONLY_BUSY)
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;
9145 if ((oldState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9146 (oldState == BT_INFO_STATE_ACL_SCO_BUSY))
9148 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9149 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCntForSCO = 0;
9152 // Active 2Ant mechanism when BT Connected
9153 if ((oldState == BT_INFO_STATE_DISABLED) ||
9154 (oldState == BT_INFO_STATE_NO_CONNECTION))
9156 if ((newState != BT_INFO_STATE_DISABLED) &&
9157 (newState != BT_INFO_STATE_NO_CONNECTION))
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);
9166 if ((newState == BT_INFO_STATE_DISABLED) ||
9167 (newState == BT_INFO_STATE_NO_CONNECTION))
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);
9176 void btdm_1AntBtCoexistHandler(PADAPTER padapter)
9178 PHAL_DATA_TYPE pHalData;
9179 PBT_COEXIST_8723A pBtCoex8723;
9180 PBTDM_8723A_1ANT pBtdm8723;
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)
9190 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is disabled\n"));
9192 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
9194 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
9196 if (BTDM_IsWifiBusy(padapter) == _TRUE)
9198 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is busy\n"));
9199 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9203 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is idle\n"));
9204 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 1, _FALSE, 9);
9209 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
9211 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9216 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is enabled\n"));
9218 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
9220 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
9222 btdm_1AntWifiParaAdjust(padapter, _TRUE);
9223 btdm_1AntCoexProcessForWifiConnect(padapter);
9227 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
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);
9235 btdm_1AntBTStateChangeHandler(padapter, pBtCoex8723->prec2hBtInfo, pBtCoex8723->c2hBtInfo);
9236 pBtCoex8723->prec2hBtInfo = pBtCoex8723->c2hBtInfo;
9239 void BTDM_1AntSignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
9241 PHAL_DATA_TYPE pHalData;
9242 PBTDM_8723A_1ANT pBtdm8723;
9243 u8 RSSI_WiFi_Cmpnstn, RSSI_BT_Cmpnstn;
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;
9252 switch (pBtdm8723->curPsTdma)
9254 case 1: // WiFi 52ms
9255 RSSI_WiFi_Cmpnstn = 11; // 22*0.48
9257 case 2: // WiFi 36ms
9258 RSSI_WiFi_Cmpnstn = 14; // 22*0.64
9260 case 9: // WiFi 20ms
9261 RSSI_WiFi_Cmpnstn = 18; // 22*0.80
9263 case 11: // WiFi 10ms
9264 RSSI_WiFi_Cmpnstn = 20; // 22*0.90
9266 case 4: // WiFi 21ms
9267 RSSI_WiFi_Cmpnstn = 17; // 22*0.79
9269 case 16: // WiFi 24ms
9270 RSSI_WiFi_Cmpnstn = 18; // 22*0.76
9272 case 18: // WiFi 37ms
9273 RSSI_WiFi_Cmpnstn = 14; // 22*0.64
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;
9287 if (rssi_wifi && RSSI_WiFi_Cmpnstn)
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;
9294 if (rssi_bt && RSSI_BT_Cmpnstn)
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;
9303 BTDM_1AntSetWifiRssiThresh(
9308 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9309 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
9311 pBtdm8723->wifiRssiThresh = rssiThresh;
9312 DBG_8723A("cosa set rssi thresh = %d\n", pBtdm8723->wifiRssiThresh);
9315 void BTDM_1AntParaInit(PADAPTER padapter)
9317 PHAL_DATA_TYPE pHalData;
9318 PBT_COEXIST_8723A pBtCoex;
9319 PBTDM_8723A_1ANT pBtdm8723;
9322 pHalData = GET_HAL_DATA(padapter);
9323 pBtCoex = &pHalData->bt_coexist.halCoex8723;
9324 pBtdm8723 = &pBtCoex->btdm1Ant;
9326 // Enable counter statistics
9327 rtw_write8(padapter, 0x76e, 0x4);
9328 btdm_1AntPtaParaReload(padapter);
9330 pBtdm8723->wifiRssiThresh = 48;
9332 pBtdm8723->bWiFiHalt = _FALSE;
9333 pBtdm8723->bRAChanged = _FALSE;
9335 if ((pBtCoex->c2hBtInfo != BT_INFO_STATE_DISABLED) &&
9336 (pBtCoex->c2hBtInfo != BT_INFO_STATE_NO_CONNECTION))
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);
9344 void BTDM_1AntForHalt(PADAPTER padapter)
9346 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for halt\n"));
9348 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt = _TRUE;
9350 btdm_1AntWifiParaAdjust(padapter, _FALSE);
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
9356 btdm_1AntPsTdma(padapter, _FALSE, 0);
9358 btdm_SetFwIgnoreWlanAct(padapter, _TRUE);
9361 void BTDM_1AntLpsLeave(PADAPTER padapter)
9363 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for LPS Leave\n"));
9365 // Prevent from entering LPS again
9366 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt == _TRUE;
9368 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
9369 // btdm_1AntPsTdma(padapter, _FALSE, 8);
9372 void BTDM_1AntWifiAssociateNotify(PADAPTER padapter, u8 type)
9374 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9377 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for associate, type=%d\n", type));
9381 rtl8723a_CheckAntenna_Selection(padapter);
9382 if (BT_IsBtDisabled(padapter) == _TRUE)
9384 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9388 PBT_COEXIST_8723A pBtCoex;
9391 pBtCoex = &pHalData->bt_coexist.halCoex8723;
9392 BtState = pBtCoex->c2hBtInfo;
9394 btdm_1AntTSFSwitch(padapter, _TRUE);
9396 if ((BtState == BT_INFO_STATE_NO_CONNECTION) ||
9397 (BtState == BT_INFO_STATE_CONNECT_IDLE))
9399 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
9401 else if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9402 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9404 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
9405 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
9406 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
9408 else if ((BtState == BT_INFO_STATE_ACL_ONLY_BUSY) ||
9409 (BtState == BT_INFO_STATE_ACL_INQ_OR_PAG))
9411 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
9412 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 35);
9414 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 29);
9420 if (BT_IsBtDisabled(padapter) == _FALSE)
9422 if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
9424 btdm_1AntPsTdma(padapter, _FALSE, 0);
9425 btdm_1AntTSFSwitch(padapter, _FALSE);
9429 btdm_1AntBtCoexistHandler(padapter);
9433 void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
9435 PBT_COEXIST_8723A pBtCoex;
9438 pBtCoex = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723;
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"));
9445 if (RT_MEDIA_CONNECT == mstatus)
9447 if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
9449 if ((pBtCoex->c2hBtInfo == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9450 (pBtCoex->c2hBtInfo == BT_INFO_STATE_ACL_SCO_BUSY))
9452 btdm_1AntUpdateHalRAMaskForSCO(padapter, _TRUE);
9456 padapter->pwrctrlpriv.DelayLPSLastTimeStamp = rtw_get_current_time();
9457 BTDM_1AntForDhcp(padapter);
9461 //DBG_8723A("%s rtl8723a_DeinitAntenna_Selection\n",__func__);
9462 rtl8723a_DeinitAntenna_Selection(padapter);
9463 btdm_1AntBtCoexistHandler(padapter);
9464 pBtCoex->btdm1Ant.bRAChanged = _FALSE;
9468 void BTDM_1AntForDhcp(PADAPTER padapter)
9470 PHAL_DATA_TYPE pHalData;
9473 PBT_COEXIST_8723A pBtCoex;
9474 PBTDM_8723A_1ANT pBtdm8723;
9477 pHalData = GET_HAL_DATA(padapter);
9478 pBtCoex = &pHalData->bt_coexist.halCoex8723;
9479 BtState = pBtCoex->c2hBtInfo;
9480 pBtdm8723 = &pBtCoex->btdm1Ant;
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]));
9488 BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
9492 // rtl8723a_set_lowpwr_lps_cmd(padapter, _FALSE);
9494 if (BT_IsBtDisabled(padapter) == _TRUE)
9496 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, BT is disabled\n"));
9497 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9501 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9502 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9504 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9505 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
9507 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 27);
9509 else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
9511 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9512 if(padapter->securitypriv.ndisencryptstatus != Ndis802_11EncryptionDisabled)
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));
9521 switch (pBtdm8723->curPsTdma)
9525 RTPRINT(FBT, BT_TRACE,
9526 ("[BTCoex], 1Ant for DHCP, Keep TDMA(%s, %d)\n",
9527 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
9530 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 16);
9537 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
9543 void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType)
9545 PHAL_DATA_TYPE pHalData;
9548 PBT_COEXIST_8723A pBtCoex;
9549 PBTDM_8723A_1ANT pBtdm8723;
9552 pHalData = GET_HAL_DATA(padapter);
9553 BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
9554 pBtCoex = &pHalData->bt_coexist.halCoex8723;
9555 pBtdm8723 = &pBtCoex->btdm1Ant;
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]));
9563 rtl8723a_CheckAntenna_Selection(padapter);
9564 if (BT_IsBtDisabled(padapter) == _TRUE)
9566 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
9568 else if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
9570 BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
9574 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
9575 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
9577 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9578 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
9581 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9582 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 33);
9585 else if (_TRUE == pBtCoex->bC2hBtInquiryPage)
9587 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9588 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30);
9590 else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
9592 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9593 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
9594 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 34);
9596 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 4);
9600 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
9601 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 5);
9605 btdm_NotifyFwScan(padapter, 1);
9607 else // WiFi_Finish_Scan
9609 btdm_NotifyFwScan(padapter, 0);
9610 btdm_1AntBtCoexistHandler(padapter);
9614 void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter)
9616 PHAL_DATA_TYPE pHalData;
9619 PBT_COEXIST_8723A pBtCoex;
9623 pHalData = GET_HAL_DATA(padapter);
9624 pBTInfo = GET_BT_INFO(padapter);
9625 pBtMgnt = &pBTInfo->BtMgnt;
9626 pBtCoex = &pHalData->bt_coexist.halCoex8723;
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;
9633 // default set bt to idle state.
9634 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
9635 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
9637 // check BIT2 first ==> check if bt is under inquiry or page scan
9638 if (btState & BIT(2))
9640 pBtCoex->bC2hBtInquiryPage = _TRUE;
9644 pBtCoex->bC2hBtInquiryPage = _FALSE;
9648 if (!(btState & BIT(0)))
9650 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
9656 pBtCoex->c2hBtInfo = BT_INFO_STATE_CONNECT_IDLE;
9658 else if (btState == 0x9)
9660 if(pBtCoex->bC2hBtInquiryPage == _TRUE)
9661 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_INQ_OR_PAG;
9663 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_ONLY_BUSY;
9664 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9666 else if (btState == 0x3)
9668 pBtCoex->c2hBtInfo = BT_INFO_STATE_SCO_ONLY_BUSY;
9669 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9671 else if (btState == 0xb)
9673 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_SCO_BUSY;
9674 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9678 pBtCoex->c2hBtInfo = BT_INFO_STATE_MAX;
9680 if (_TRUE == pBtMgnt->ExtConfig.bBTBusy)
9681 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
9684 if ((BT_INFO_STATE_NO_CONNECTION == pBtCoex->c2hBtInfo) ||
9685 (BT_INFO_STATE_CONNECT_IDLE == pBtCoex->c2hBtInfo))
9687 if (pBtCoex->bC2hBtInquiryPage)
9688 pBtCoex->c2hBtInfo = BT_INFO_STATE_INQ_OR_PAG;
9691 RTPRINT(FBT, BT_TRACE, ("[BTC2H], %s(%d)\n",
9692 BtStateString[pBtCoex->c2hBtInfo], pBtCoex->c2hBtInfo));
9694 if(pBtCoex->c2hBtProfile != BT_INFO_HID)
9695 pBtCoex->c2hBtProfile &= ~BT_INFO_HID;
9698 void BTDM_1AntBtCoexist8723A(PADAPTER padapter)
9700 struct mlme_priv *pmlmepriv;
9701 PHAL_DATA_TYPE pHalData;
9702 u32 curr_time, delta_time;
9705 pmlmepriv = &padapter->mlmepriv;
9706 pHalData = GET_HAL_DATA(padapter);
9708 if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _TRUE)
9710 // already done in BTDM_1AntForScan()
9711 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under scan progress!!\n"));
9715 if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE)
9717 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under link progress!!\n"));
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
9727 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under DHCP progress(%d ms)!!\n", delta_time));
9731 BTDM_CheckWiFiState(padapter);
9733 btdm_1AntBtCoexistHandler(padapter);
9736 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
9739 #ifdef __HALBTC87232ANT_C__ // HAL/BTCoexist/HalBtc87232Ant.c
9740 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
9742 //============================================================
9743 // local function proto type if needed
9744 //============================================================
9745 //============================================================
9746 // local function start with btdm_
9747 //============================================================
9748 u8 btdm_ActionAlgorithm(PADAPTER padapter)
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;
9757 if(pBtMgnt->ExtConfig.NumberOfHandle)
9759 bBtLinkExist = _TRUE;
9761 if(pBtMgnt->ExtConfig.NumberOfSCO)
9765 if(BT_HsConnectionEstablished(padapter))
9767 bBtHsModeExist = _TRUE;
9770 //======================
9771 // here we get BT status first
9772 //======================
9774 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
9776 if( (bScoExist) ||(bBtHsModeExist) ||
9777 (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID)))
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;
9785 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
9786 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) )
9788 if(BTDM_BtTxRxCounterL(padapter) < 100)
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;
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;
9800 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
9801 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
9803 if(BTDM_BtTxRxCounterL(padapter) < 600)
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;
9810 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
9812 if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
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;
9819 if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
9821 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, set BT non-idle!!!\n"));
9822 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9826 if( (pBtMgnt->ExtConfig.NumberOfHandle == 2) &&
9827 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) &&
9828 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
9830 if(BTDM_BtTxRxCounterL(padapter) < 600)
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;
9837 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
9839 if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
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;
9846 if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
9848 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, set BT non-idle!!!\n"));
9849 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9853 if(BT_2ANT_BT_STATUS_IDLE != pBtdm8723->btStatus)
9855 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9859 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
9861 //======================
9865 RTPRINT(FBT, BT_TRACE, ("[BTCoex], No profile exists!!!\n"));
9869 if(pBtMgnt->ExtConfig.NumberOfHandle == 1)
9873 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
9874 algorithm = BT_2ANT_COEX_ALGO_SCO;
9878 if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID))
9880 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID only\n"));
9881 algorithm = BT_2ANT_COEX_ALGO_HID;
9883 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9885 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP only\n"));
9886 algorithm = BT_2ANT_COEX_ALGO_A2DP;
9888 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9892 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(HS) only\n"));
9893 algorithm = BT_2ANT_COEX_ALGO_PANHS;
9897 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR) only\n"));
9898 algorithm = BT_2ANT_COEX_ALGO_PANEDR;
9903 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d \n",
9904 pBtMgnt->ExtConfig.NumberOfHandle));
9908 else if(pBtMgnt->ExtConfig.NumberOfHandle == 2)
9912 if(BTHCI_CheckProfileExist(padapter, BT_PROFILE_HID))
9914 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
9915 algorithm = BT_2ANT_COEX_ALGO_HID;
9917 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9919 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
9921 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9925 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
9926 algorithm = BT_2ANT_COEX_ALGO_SCO;
9930 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
9931 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9936 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched ACL profile for NumberOfHandle=%d\n",
9937 pBtMgnt->ExtConfig.NumberOfHandle));
9942 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9943 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9945 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
9946 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9948 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9949 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9953 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
9954 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9958 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
9959 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9962 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9963 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9967 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
9968 algorithm = BT_2ANT_COEX_ALGO_A2DP;
9972 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
9973 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
9978 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
9979 pBtMgnt->ExtConfig.NumberOfHandle));
9983 else if(pBtMgnt->ExtConfig.NumberOfHandle == 3)
9987 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9988 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9990 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP\n"));
9992 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9993 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9997 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));
9998 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
10002 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));
10003 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
10006 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10007 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10011 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(HS)\n"));
10012 algorithm = BT_2ANT_COEX_ALGO_SCO;
10016 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(EDR)\n"));
10022 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
10023 pBtMgnt->ExtConfig.NumberOfHandle));
10028 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
10029 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10030 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10034 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
10035 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANHS;
10039 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
10040 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
10045 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
10046 pBtMgnt->ExtConfig.NumberOfHandle));
10050 else if(pBtMgnt->ExtConfig.NumberOfHandle >= 3)
10054 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
10055 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
10056 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
10060 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
10065 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(EDR)\n"));
10071 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
10072 pBtMgnt->ExtConfig.NumberOfHandle));
10077 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
10078 pBtMgnt->ExtConfig.NumberOfHandle));
10085 u8 btdm_NeedToDecBtPwr(PADAPTER padapter)
10087 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10088 PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
10091 if(BT_Operation(padapter))
10093 if(pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB > 47)
10095 RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for HS mode!!\n"));
10100 RTPRINT(FBT, BT_TRACE, ("NO Need to decrease bt power for HS mode!!\n"));
10105 if(BTDM_IsWifiConnectionExist(padapter))
10107 RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for Wifi is connected!!\n"));
10111 if(MgntLinkStatusQuery(pDefaultAdapter) == RT_MEDIA_CONNECT)
10113 RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for Wifi is connected!!\n"));
10122 u8 btdm_IsBadIsolation(PADAPTER padapter)
10135 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c0=0x%x\n", val0x6c0));
10136 rtw_write32(padapter, 0x6c0, val0x6c0);
10138 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c8=0x%x\n", val0x6c8));
10139 rtw_write32(padapter, 0x6c8, val0x6c8);
10141 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6cc=0x%x\n", val0x6cc));
10142 rtw_write8(padapter, 0x6cc, val0x6cc);
10146 void btdm_SetSwFullTimeDacSwing(PADAPTER padapter,u8 bSwDacSwingOn,u32 swDacSwingLvl)
10148 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10152 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing = 0x%x\n", swDacSwingLvl));
10153 PHY_SetBBReg(padapter, 0x880, 0xff000000, swDacSwingLvl);
10154 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
10158 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing Off!\n"));
10159 PHY_SetBBReg(padapter, 0x880, 0xff000000, 0xc0);
10164 void btdm_SetFwDacSwingLevel(PADAPTER padapter, u8 dacSwingLvl)
10166 u1Byte H2C_Parameter[1] ={0};
10168 H2C_Parameter[0] = dacSwingLvl;
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]));
10173 FillH2CCmd(padapter, 0x29, 1, H2C_Parameter);
10176 void btdm_2AntDecBtPwr(PADAPTER padapter,u8 bDecBtPwr)
10178 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10179 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10181 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Dec BT power = %s\n", ((bDecBtPwr)? "ON":"OFF")));
10182 pBtdm8723->bCurDecBtPwr = bDecBtPwr;
10184 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
10185 // pBtdm8723->bPreDecBtPwr, pBtdm8723->bCurDecBtPwr));
10187 if(pBtdm8723->bPreDecBtPwr == pBtdm8723->bCurDecBtPwr)
10190 BTDM_SetFwDecBtPwr(padapter, pBtdm8723->bCurDecBtPwr);
10192 pBtdm8723->bPreDecBtPwr = pBtdm8723->bCurDecBtPwr;
10195 void btdm_2AntFwDacSwingLvl(PADAPTER padapter,u8 fwDacSwingLvl)
10197 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10198 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10200 RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW Dac Swing level = %d\n", fwDacSwingLvl));
10201 pBtdm8723->curFwDacSwingLvl = fwDacSwingLvl;
10203 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
10204 // pBtdm8723->preFwDacSwingLvl, pBtdm8723->curFwDacSwingLvl));
10206 if(pBtdm8723->preFwDacSwingLvl == pBtdm8723->curFwDacSwingLvl)
10209 btdm_SetFwDacSwingLevel(padapter, pBtdm8723->curFwDacSwingLvl);
10211 pBtdm8723->preFwDacSwingLvl = pBtdm8723->curFwDacSwingLvl;
10214 void btdm_2AntRfShrink( PADAPTER padapter, u8 bRxRfShrinkOn)
10216 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10217 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10219 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Rx RF Shrink = %s\n", ((bRxRfShrinkOn)? "ON":"OFF")));
10220 pBtdm8723->bCurRfRxLpfShrink = bRxRfShrinkOn;
10222 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n",
10223 // pBtdm8723->bPreRfRxLpfShrink, pBtdm8723->bCurRfRxLpfShrink));
10225 if(pBtdm8723->bPreRfRxLpfShrink == pBtdm8723->bCurRfRxLpfShrink)
10228 BTDM_SetSwRfRxLpfCorner(padapter, (u8)pBtdm8723->bCurRfRxLpfShrink);
10230 pBtdm8723->bPreRfRxLpfShrink = pBtdm8723->bCurRfRxLpfShrink;
10233 void btdm_2AntLowPenaltyRa(PADAPTER padapter, u8 bLowPenaltyRa)
10235 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10236 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10238 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn LowPenaltyRA = %s\n", ((bLowPenaltyRa)? "ON":"OFF")));
10239 pBtdm8723->bCurLowPenaltyRa = bLowPenaltyRa;
10241 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
10242 // pBtdm8723->bPreLowPenaltyRa, pBtdm8723->bCurLowPenaltyRa));
10244 if(pBtdm8723->bPreLowPenaltyRa == pBtdm8723->bCurLowPenaltyRa)
10247 BTDM_SetSwPenaltyTxRateAdaptive(padapter, (u1Byte)pBtdm8723->bCurLowPenaltyRa);
10249 pBtdm8723->bPreLowPenaltyRa = pBtdm8723->bCurLowPenaltyRa;
10254 void btdm_2AntDacSwing(PADAPTER padapter,u8 bDacSwingOn,u32 dacSwingLvl )
10256 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10257 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
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;
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));
10268 if( (pBtdm8723->bPreDacSwingOn == pBtdm8723->bCurDacSwingOn) &&
10269 (pBtdm8723->preDacSwingLvl == pBtdm8723->curDacSwingLvl) )
10273 btdm_SetSwFullTimeDacSwing(padapter, bDacSwingOn, dacSwingLvl);
10275 pBtdm8723->bPreDacSwingOn = pBtdm8723->bCurDacSwingOn;
10276 pBtdm8723->preDacSwingLvl = pBtdm8723->curDacSwingLvl;
10280 void btdm_2AntAdcBackOff(PADAPTER padapter,u8 bAdcBackOff)
10282 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10283 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10285 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn AdcBackOff = %s\n", ((bAdcBackOff)? "ON":"OFF")));
10286 pBtdm8723->bCurAdcBackOff = bAdcBackOff;
10288 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
10289 // pBtdm8723->bPreAdcBackOff, pBtdm8723->bCurAdcBackOff));
10291 if(pBtdm8723->bPreAdcBackOff == pBtdm8723->bCurAdcBackOff)
10294 BTDM_BBBackOffLevel(padapter, (u8)pBtdm8723->bCurAdcBackOff);
10296 pBtdm8723->bPreAdcBackOff = pBtdm8723->bCurAdcBackOff;
10299 void btdm_2AntAgcTable(PADAPTER padapter,u8 bAgcTableEn)
10301 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10302 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10304 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s Agc Table\n", ((bAgcTableEn)? "Enable":"Disable")));
10305 pBtdm8723->bCurAgcTableEn = bAgcTableEn;
10307 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
10308 // pBtdm8723->bPreAgcTableEn, pBtdm8723->bCurAgcTableEn));
10310 if(pBtdm8723->bPreAgcTableEn == pBtdm8723->bCurAgcTableEn)
10313 BTDM_AGCTable(padapter, (u8)bAgcTableEn);
10315 pBtdm8723->bPreAgcTableEn = pBtdm8723->bCurAgcTableEn;
10318 void btdm_2AntCoexTable( PADAPTER padapter,u32 val0x6c0,u32 val0x6c8,u8 val0x6cc)
10320 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10321 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
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;
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));
10334 if( (pBtdm8723->preVal0x6c0 == pBtdm8723->curVal0x6c0) &&
10335 (pBtdm8723->preVal0x6c8 == pBtdm8723->curVal0x6c8) &&
10336 (pBtdm8723->preVal0x6cc == pBtdm8723->curVal0x6cc) )
10339 btdm_SetCoexTable(padapter, val0x6c0, val0x6c8, val0x6cc);
10341 pBtdm8723->preVal0x6c0 = pBtdm8723->curVal0x6c0;
10342 pBtdm8723->preVal0x6c8 = pBtdm8723->curVal0x6c8;
10343 pBtdm8723->preVal0x6cc = pBtdm8723->curVal0x6cc;
10346 void btdm_2AntIgnoreWlanAct(PADAPTER padapter,u8 bEnable)
10348 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10349 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10351 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Ignore WlanAct %s\n", (bEnable? "ON":"OFF")));
10352 pBtdm8723->bCurIgnoreWlanAct = bEnable;
10354 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
10355 // pBtdm8723->bPreIgnoreWlanAct, pBtdm8723->bCurIgnoreWlanAct));
10357 if(pBtdm8723->bPreIgnoreWlanAct == pBtdm8723->bCurIgnoreWlanAct)
10360 btdm_SetFwIgnoreWlanAct(padapter,bEnable);
10361 pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct;
10364 void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)
10366 u8 H2C_Parameter[5] ={0};
10368 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10370 // byte1[1:0] != 0 means enable pstdma
10371 // for 2Ant bt coexist, if byte1 != 0 means enable pstdma
10374 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
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;
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;
10388 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n",
10390 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
10392 FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
10395 void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type)
10397 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10398 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
10400 u8 bTurnOnByCnt=_FALSE;
10401 u8 psTdmaTypeByCnt=0;
10403 btTxRxCnt = BTDM_BtTxRxCounterH(padapter)+BTDM_BtTxRxCounterL(padapter);
10404 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT TxRx Counters = %d\n", btTxRxCnt));
10405 if(btTxRxCnt > 3000)
10407 bTurnOnByCnt = _TRUE;
10408 psTdmaTypeByCnt = 8;
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;
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;
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));
10426 if( (pBtdm8723->bPrePsTdmaOn == pBtdm8723->bCurPsTdmaOn) &&
10427 (pBtdm8723->prePsTdma == pBtdm8723->curPsTdma) )
10436 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
10439 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
10442 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
10445 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xa1, 0x80);
10448 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
10451 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
10454 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
10457 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x20, 0x80);
10460 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
10463 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
10466 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
10469 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
10472 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
10475 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
10478 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
10481 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x20, 0x98);
10484 btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x20, 0x80);
10487 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
10490 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xa1, 0x98);
10493 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x20, 0x98);
10503 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
10506 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x0, 0x0);
10509 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
10514 // update pre state
10515 pBtdm8723->bPrePsTdmaOn = pBtdm8723->bCurPsTdmaOn;
10516 pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
10521 void btdm_2AntBtInquiryPage(PADAPTER padapter)
10523 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10524 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10525 btdm_2AntPsTdma(padapter, _TRUE, 8);
10529 u8 btdm_HoldForBtInqPage( PADAPTER padapter)
10531 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10532 u32 curTime=rtw_get_current_time();
10534 if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage)
10536 // bt inquiry or page is started.
10537 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime == 0)
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));
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));
10547 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
10549 if(( (curTime - pHalData->bt_coexist.halCoex8723.btInqPageStartTime)/1000000) >= 10)
10551 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page >= 10sec!!!"));
10552 pHalData->bt_coexist.halCoex8723.btInqPageStartTime = 0;
10556 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
10558 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10559 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10560 btdm_2AntPsTdma(padapter, _TRUE, 8);
10568 u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter)
10570 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10571 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
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));
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) )
10581 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt idle!!\n"));
10583 btdm_2AntLowPenaltyRa(padapter, _FALSE);
10584 btdm_2AntRfShrink(padapter, _FALSE);
10585 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10587 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10588 btdm_2AntPsTdma(padapter, _FALSE, 0);
10589 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10590 btdm_2AntDecBtPwr(padapter, _FALSE);
10592 btdm_2AntAgcTable(padapter, _FALSE);
10593 btdm_2AntAdcBackOff(padapter, _FALSE);
10594 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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) )
10602 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT idle!!\n"));
10604 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10605 btdm_2AntRfShrink(padapter, _FALSE);
10606 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10608 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10609 btdm_2AntPsTdma(padapter, _FALSE, 0);
10610 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10611 btdm_2AntDecBtPwr(padapter, _TRUE);
10613 btdm_2AntAgcTable(padapter, _FALSE);
10614 btdm_2AntAdcBackOff(padapter, _FALSE);
10615 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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) )
10623 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt connected idle!!\n"));
10625 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10626 btdm_2AntRfShrink(padapter, _TRUE);
10627 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10629 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10630 btdm_2AntPsTdma(padapter, _FALSE, 0);
10631 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10632 btdm_2AntDecBtPwr(padapter, _FALSE);
10634 btdm_2AntAgcTable(padapter, _FALSE);
10635 btdm_2AntAdcBackOff(padapter, _FALSE);
10636 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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) )
10644 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + Bt connected idle!!\n"));
10646 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10647 btdm_2AntRfShrink(padapter, _TRUE);
10648 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10650 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10651 btdm_2AntPsTdma(padapter, _FALSE, 0);
10652 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10653 btdm_2AntDecBtPwr(padapter, _TRUE);
10655 btdm_2AntAgcTable(padapter, _FALSE);
10656 btdm_2AntAdcBackOff(padapter, _FALSE);
10657 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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) )
10665 RTPRINT(FBT, BT_TRACE, ("Wifi idle + BT non-idle!!\n"));
10667 btdm_2AntLowPenaltyRa(padapter, _TRUE);
10668 btdm_2AntRfShrink(padapter, _TRUE);
10669 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10671 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10672 btdm_2AntPsTdma(padapter, _FALSE, 0);
10673 btdm_2AntFwDacSwingLvl(padapter, 0x20);
10674 btdm_2AntDecBtPwr(padapter, _FALSE);
10676 btdm_2AntAgcTable(padapter, _FALSE);
10677 btdm_2AntAdcBackOff(padapter, _FALSE);
10678 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
10698 void btdm_2AntTdmaDurationAdjust(PADAPTER padapter,u8 bScoHid,u8 bTxPause,u8 maxInterval)
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
10708 // BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
10710 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TdmaDurationAdjust()\n"));
10712 if(pBtdm8723->bResetTdmaAdjust)
10714 pBtdm8723->bResetTdmaAdjust = _FALSE;
10715 RTPRINT(FBT, BT_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
10721 if(maxInterval == 1)
10723 btdm_2AntPsTdma(padapter, _TRUE, 15);
10724 pBtdm8723->psTdmaDuAdjType = 15;
10726 else if(maxInterval == 2)
10728 btdm_2AntPsTdma(padapter, _TRUE, 15);
10729 pBtdm8723->psTdmaDuAdjType = 15;
10731 else if(maxInterval == 3)
10733 btdm_2AntPsTdma(padapter, _TRUE, 15);
10734 pBtdm8723->psTdmaDuAdjType = 15;
10738 btdm_2AntPsTdma(padapter, _TRUE, 15);
10739 pBtdm8723->psTdmaDuAdjType = 15;
10744 if(maxInterval == 1)
10746 btdm_2AntPsTdma(padapter, _TRUE, 11);
10747 pBtdm8723->psTdmaDuAdjType = 11;
10749 else if(maxInterval == 2)
10751 btdm_2AntPsTdma(padapter, _TRUE, 11);
10752 pBtdm8723->psTdmaDuAdjType = 11;
10754 else if(maxInterval == 3)
10756 btdm_2AntPsTdma(padapter, _TRUE, 11);
10757 pBtdm8723->psTdmaDuAdjType = 11;
10761 btdm_2AntPsTdma(padapter, _TRUE, 11);
10762 pBtdm8723->psTdmaDuAdjType = 11;
10770 if(maxInterval == 1)
10772 btdm_2AntPsTdma(padapter, _TRUE, 7);
10773 pBtdm8723->psTdmaDuAdjType = 7;
10775 else if(maxInterval == 2)
10777 btdm_2AntPsTdma(padapter, _TRUE, 7);
10778 pBtdm8723->psTdmaDuAdjType = 7;
10780 else if(maxInterval == 3)
10782 btdm_2AntPsTdma(padapter, _TRUE, 7);
10783 pBtdm8723->psTdmaDuAdjType = 7;
10787 btdm_2AntPsTdma(padapter, _TRUE, 7);
10788 pBtdm8723->psTdmaDuAdjType = 7;
10793 if(maxInterval == 1)
10795 btdm_2AntPsTdma(padapter, _TRUE, 3);
10796 pBtdm8723->psTdmaDuAdjType = 3;
10798 else if(maxInterval == 2)
10800 btdm_2AntPsTdma(padapter, _TRUE, 3);
10801 pBtdm8723->psTdmaDuAdjType = 3;
10803 else if(maxInterval == 3)
10805 btdm_2AntPsTdma(padapter, _TRUE, 3);
10806 pBtdm8723->psTdmaDuAdjType = 3;
10810 btdm_2AntPsTdma(padapter, _TRUE, 3);
10811 pBtdm8723->psTdmaDuAdjType = 3;
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));
10832 if(retryCount == 0) // no retry in the last 2-second duration
10840 if(up >= n) // if ³sÄò n Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration
10847 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Increase wifi duration!!\n"));
10850 else if (retryCount <= 3) // <=3 retry in the last 2-second duration
10858 if (dn == 2) // if ³sÄò 2 Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration
10860 if (WaitCount <= 2)
10861 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
10865 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10873 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
10876 else //retry count > 3, ¥un1¦¸ retry count > 3, «h½Õ¯¶WiFi duration
10878 if (WaitCount == 1)
10879 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
10883 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10891 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
10894 RTPRINT(FBT, BT_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval));
10895 if(maxInterval == 1)
10899 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
10900 if(pBtdm8723->curPsTdma == 1)
10902 btdm_2AntPsTdma(padapter, _TRUE, 5);
10903 pBtdm8723->psTdmaDuAdjType = 5;
10905 else if(pBtdm8723->curPsTdma == 2)
10907 btdm_2AntPsTdma(padapter, _TRUE, 6);
10908 pBtdm8723->psTdmaDuAdjType = 6;
10910 else if(pBtdm8723->curPsTdma == 3)
10912 btdm_2AntPsTdma(padapter, _TRUE, 7);
10913 pBtdm8723->psTdmaDuAdjType = 7;
10915 else if(pBtdm8723->curPsTdma == 4)
10917 btdm_2AntPsTdma(padapter, _TRUE, 8);
10918 pBtdm8723->psTdmaDuAdjType = 8;
10920 if(pBtdm8723->curPsTdma == 9)
10922 btdm_2AntPsTdma(padapter, _TRUE, 13);
10923 pBtdm8723->psTdmaDuAdjType = 13;
10925 else if(pBtdm8723->curPsTdma == 10)
10927 btdm_2AntPsTdma(padapter, _TRUE, 14);
10928 pBtdm8723->psTdmaDuAdjType = 14;
10930 else if(pBtdm8723->curPsTdma == 11)
10932 btdm_2AntPsTdma(padapter, _TRUE, 15);
10933 pBtdm8723->psTdmaDuAdjType = 15;
10935 else if(pBtdm8723->curPsTdma == 12)
10937 btdm_2AntPsTdma(padapter, _TRUE, 16);
10938 pBtdm8723->psTdmaDuAdjType = 16;
10943 if(pBtdm8723->curPsTdma == 5)
10945 btdm_2AntPsTdma(padapter, _TRUE, 6);
10946 pBtdm8723->psTdmaDuAdjType = 6;
10948 else if(pBtdm8723->curPsTdma == 6)
10950 btdm_2AntPsTdma(padapter, _TRUE, 7);
10951 pBtdm8723->psTdmaDuAdjType = 7;
10953 else if(pBtdm8723->curPsTdma == 7)
10955 btdm_2AntPsTdma(padapter, _TRUE, 8);
10956 pBtdm8723->psTdmaDuAdjType = 8;
10958 else if(pBtdm8723->curPsTdma == 13)
10960 btdm_2AntPsTdma(padapter, _TRUE, 14);
10961 pBtdm8723->psTdmaDuAdjType = 14;
10963 else if(pBtdm8723->curPsTdma == 14)
10965 btdm_2AntPsTdma(padapter, _TRUE, 15);
10966 pBtdm8723->psTdmaDuAdjType = 15;
10968 else if(pBtdm8723->curPsTdma == 15)
10970 btdm_2AntPsTdma(padapter, _TRUE, 16);
10971 pBtdm8723->psTdmaDuAdjType = 16;
10974 else if (result == 1)
10976 if(pBtdm8723->curPsTdma == 8)
10978 btdm_2AntPsTdma(padapter, _TRUE, 7);
10979 pBtdm8723->psTdmaDuAdjType = 7;
10981 else if(pBtdm8723->curPsTdma == 7)
10983 btdm_2AntPsTdma(padapter, _TRUE, 6);
10984 pBtdm8723->psTdmaDuAdjType = 6;
10986 else if(pBtdm8723->curPsTdma == 6)
10988 btdm_2AntPsTdma(padapter, _TRUE, 5);
10989 pBtdm8723->psTdmaDuAdjType = 5;
10991 else if(pBtdm8723->curPsTdma == 16)
10993 btdm_2AntPsTdma(padapter, _TRUE, 15);
10994 pBtdm8723->psTdmaDuAdjType = 15;
10996 else if(pBtdm8723->curPsTdma == 15)
10998 btdm_2AntPsTdma(padapter, _TRUE, 14);
10999 pBtdm8723->psTdmaDuAdjType = 14;
11001 else if(pBtdm8723->curPsTdma == 14)
11003 btdm_2AntPsTdma(padapter, _TRUE, 13);
11004 pBtdm8723->psTdmaDuAdjType = 13;
11010 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11011 if(pBtdm8723->curPsTdma == 5)
11013 btdm_2AntPsTdma(padapter, _TRUE, 1);
11014 pBtdm8723->psTdmaDuAdjType = 1;
11016 else if(pBtdm8723->curPsTdma == 6)
11018 btdm_2AntPsTdma(padapter, _TRUE, 2);
11019 pBtdm8723->psTdmaDuAdjType = 2;
11021 else if(pBtdm8723->curPsTdma == 7)
11023 btdm_2AntPsTdma(padapter, _TRUE, 3);
11024 pBtdm8723->psTdmaDuAdjType = 3;
11026 else if(pBtdm8723->curPsTdma == 8)
11028 btdm_2AntPsTdma(padapter, _TRUE, 4);
11029 pBtdm8723->psTdmaDuAdjType = 4;
11031 if(pBtdm8723->curPsTdma == 13)
11033 btdm_2AntPsTdma(padapter, _TRUE, 9);
11034 pBtdm8723->psTdmaDuAdjType = 9;
11036 else if(pBtdm8723->curPsTdma == 14)
11038 btdm_2AntPsTdma(padapter, _TRUE, 10);
11039 pBtdm8723->psTdmaDuAdjType = 10;
11041 else if(pBtdm8723->curPsTdma == 15)
11043 btdm_2AntPsTdma(padapter, _TRUE, 11);
11044 pBtdm8723->psTdmaDuAdjType = 11;
11046 else if(pBtdm8723->curPsTdma == 16)
11048 btdm_2AntPsTdma(padapter, _TRUE, 12);
11049 pBtdm8723->psTdmaDuAdjType = 12;
11054 if(pBtdm8723->curPsTdma == 1)
11056 btdm_2AntPsTdma(padapter, _TRUE, 2);
11057 pBtdm8723->psTdmaDuAdjType = 2;
11059 else if(pBtdm8723->curPsTdma == 2)
11061 btdm_2AntPsTdma(padapter, _TRUE, 3);
11062 pBtdm8723->psTdmaDuAdjType = 3;
11064 else if(pBtdm8723->curPsTdma == 3)
11066 btdm_2AntPsTdma(padapter, _TRUE, 4);
11067 pBtdm8723->psTdmaDuAdjType = 4;
11069 else if(pBtdm8723->curPsTdma == 9)
11071 btdm_2AntPsTdma(padapter, _TRUE, 10);
11072 pBtdm8723->psTdmaDuAdjType = 10;
11074 else if(pBtdm8723->curPsTdma == 10)
11076 btdm_2AntPsTdma(padapter, _TRUE, 11);
11077 pBtdm8723->psTdmaDuAdjType = 11;
11079 else if(pBtdm8723->curPsTdma == 11)
11081 btdm_2AntPsTdma(padapter, _TRUE, 12);
11082 pBtdm8723->psTdmaDuAdjType = 12;
11085 else if (result == 1)
11087 if(pBtdm8723->curPsTdma == 4)
11089 btdm_2AntPsTdma(padapter, _TRUE, 3);
11090 pBtdm8723->psTdmaDuAdjType = 3;
11092 else if(pBtdm8723->curPsTdma == 3)
11094 btdm_2AntPsTdma(padapter, _TRUE, 2);
11095 pBtdm8723->psTdmaDuAdjType = 2;
11097 else if(pBtdm8723->curPsTdma == 2)
11099 btdm_2AntPsTdma(padapter, _TRUE, 1);
11100 pBtdm8723->psTdmaDuAdjType = 1;
11102 else if(pBtdm8723->curPsTdma == 12)
11104 btdm_2AntPsTdma(padapter, _TRUE, 11);
11105 pBtdm8723->psTdmaDuAdjType = 11;
11107 else if(pBtdm8723->curPsTdma == 11)
11109 btdm_2AntPsTdma(padapter, _TRUE, 10);
11110 pBtdm8723->psTdmaDuAdjType = 10;
11112 else if(pBtdm8723->curPsTdma == 10)
11114 btdm_2AntPsTdma(padapter, _TRUE, 9);
11115 pBtdm8723->psTdmaDuAdjType = 9;
11120 else if(maxInterval == 2)
11124 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
11125 if(pBtdm8723->curPsTdma == 1)
11127 btdm_2AntPsTdma(padapter, _TRUE, 6);
11128 pBtdm8723->psTdmaDuAdjType = 6;
11130 else if(pBtdm8723->curPsTdma == 2)
11132 btdm_2AntPsTdma(padapter, _TRUE, 6);
11133 pBtdm8723->psTdmaDuAdjType = 6;
11135 else if(pBtdm8723->curPsTdma == 3)
11137 btdm_2AntPsTdma(padapter, _TRUE, 7);
11138 pBtdm8723->psTdmaDuAdjType = 7;
11140 else if(pBtdm8723->curPsTdma == 4)
11142 btdm_2AntPsTdma(padapter, _TRUE, 8);
11143 pBtdm8723->psTdmaDuAdjType = 8;
11145 if(pBtdm8723->curPsTdma == 9)
11147 btdm_2AntPsTdma(padapter, _TRUE, 14);
11148 pBtdm8723->psTdmaDuAdjType = 14;
11150 else if(pBtdm8723->curPsTdma == 10)
11152 btdm_2AntPsTdma(padapter, _TRUE, 14);
11153 pBtdm8723->psTdmaDuAdjType = 14;
11155 else if(pBtdm8723->curPsTdma == 11)
11157 btdm_2AntPsTdma(padapter, _TRUE, 15);
11158 pBtdm8723->psTdmaDuAdjType = 15;
11160 else if(pBtdm8723->curPsTdma == 12)
11162 btdm_2AntPsTdma(padapter, _TRUE, 16);
11163 pBtdm8723->psTdmaDuAdjType = 16;
11167 if(pBtdm8723->curPsTdma == 5)
11169 btdm_2AntPsTdma(padapter, _TRUE, 6);
11170 pBtdm8723->psTdmaDuAdjType = 6;
11172 else if(pBtdm8723->curPsTdma == 6)
11174 btdm_2AntPsTdma(padapter, _TRUE, 7);
11175 pBtdm8723->psTdmaDuAdjType = 7;
11177 else if(pBtdm8723->curPsTdma == 7)
11179 btdm_2AntPsTdma(padapter, _TRUE, 8);
11180 pBtdm8723->psTdmaDuAdjType = 8;
11182 else if(pBtdm8723->curPsTdma == 13)
11184 btdm_2AntPsTdma(padapter, _TRUE, 14);
11185 pBtdm8723->psTdmaDuAdjType = 14;
11187 else if(pBtdm8723->curPsTdma == 14)
11189 btdm_2AntPsTdma(padapter, _TRUE, 15);
11190 pBtdm8723->psTdmaDuAdjType = 15;
11192 else if(pBtdm8723->curPsTdma == 15)
11194 btdm_2AntPsTdma(padapter, _TRUE, 16);
11195 pBtdm8723->psTdmaDuAdjType = 16;
11198 else if (result == 1)
11200 if(pBtdm8723->curPsTdma == 8)
11202 btdm_2AntPsTdma(padapter, _TRUE, 7);
11203 pBtdm8723->psTdmaDuAdjType = 7;
11205 else if(pBtdm8723->curPsTdma == 7)
11207 btdm_2AntPsTdma(padapter, _TRUE, 6);
11208 pBtdm8723->psTdmaDuAdjType = 6;
11210 else if(pBtdm8723->curPsTdma == 6)
11212 btdm_2AntPsTdma(padapter, _TRUE, 6);
11213 pBtdm8723->psTdmaDuAdjType = 6;
11215 else if(pBtdm8723->curPsTdma == 16)
11217 btdm_2AntPsTdma(padapter, _TRUE, 15);
11218 pBtdm8723->psTdmaDuAdjType = 15;
11220 else if(pBtdm8723->curPsTdma == 15)
11222 btdm_2AntPsTdma(padapter, _TRUE, 14);
11223 pBtdm8723->psTdmaDuAdjType = 14;
11225 else if(pBtdm8723->curPsTdma == 14)
11227 btdm_2AntPsTdma(padapter, _TRUE, 14);
11228 pBtdm8723->psTdmaDuAdjType = 14;
11234 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11235 if(pBtdm8723->curPsTdma == 5)
11237 btdm_2AntPsTdma(padapter, _TRUE, 2);
11238 pBtdm8723->psTdmaDuAdjType = 2;
11240 else if(pBtdm8723->curPsTdma == 6)
11242 btdm_2AntPsTdma(padapter, _TRUE, 2);
11243 pBtdm8723->psTdmaDuAdjType = 2;
11245 else if(pBtdm8723->curPsTdma == 7)
11247 btdm_2AntPsTdma(padapter, _TRUE, 3);
11248 pBtdm8723->psTdmaDuAdjType = 3;
11250 else if(pBtdm8723->curPsTdma == 8)
11252 btdm_2AntPsTdma(padapter, _TRUE, 4);
11253 pBtdm8723->psTdmaDuAdjType = 4;
11255 if(pBtdm8723->curPsTdma == 13)
11257 btdm_2AntPsTdma(padapter, _TRUE, 10);
11258 pBtdm8723->psTdmaDuAdjType = 10;
11260 else if(pBtdm8723->curPsTdma == 14)
11262 btdm_2AntPsTdma(padapter, _TRUE, 10);
11263 pBtdm8723->psTdmaDuAdjType = 10;
11265 else if(pBtdm8723->curPsTdma == 15)
11267 btdm_2AntPsTdma(padapter, _TRUE, 11);
11268 pBtdm8723->psTdmaDuAdjType = 11;
11270 else if(pBtdm8723->curPsTdma == 16)
11272 btdm_2AntPsTdma(padapter, _TRUE, 12);
11273 pBtdm8723->psTdmaDuAdjType = 12;
11277 if(pBtdm8723->curPsTdma == 1)
11279 btdm_2AntPsTdma(padapter, _TRUE, 2);
11280 pBtdm8723->psTdmaDuAdjType = 2;
11282 else if(pBtdm8723->curPsTdma == 2)
11284 btdm_2AntPsTdma(padapter, _TRUE, 3);
11285 pBtdm8723->psTdmaDuAdjType = 3;
11287 else if(pBtdm8723->curPsTdma == 3)
11289 btdm_2AntPsTdma(padapter, _TRUE, 4);
11290 pBtdm8723->psTdmaDuAdjType = 4;
11292 else if(pBtdm8723->curPsTdma == 9)
11294 btdm_2AntPsTdma(padapter, _TRUE, 10);
11295 pBtdm8723->psTdmaDuAdjType = 10;
11297 else if(pBtdm8723->curPsTdma == 10)
11299 btdm_2AntPsTdma(padapter, _TRUE, 11);
11300 pBtdm8723->psTdmaDuAdjType = 11;
11302 else if(pBtdm8723->curPsTdma == 11)
11304 btdm_2AntPsTdma(padapter, _TRUE, 12);
11305 pBtdm8723->psTdmaDuAdjType = 12;
11308 else if (result == 1)
11310 if(pBtdm8723->curPsTdma == 4)
11312 btdm_2AntPsTdma(padapter, _TRUE, 3);
11313 pBtdm8723->psTdmaDuAdjType = 3;
11315 else if(pBtdm8723->curPsTdma == 3)
11317 btdm_2AntPsTdma(padapter, _TRUE, 2);
11318 pBtdm8723->psTdmaDuAdjType = 2;
11320 else if(pBtdm8723->curPsTdma == 2)
11322 btdm_2AntPsTdma(padapter, _TRUE, 2);
11323 pBtdm8723->psTdmaDuAdjType = 2;
11325 else if(pBtdm8723->curPsTdma == 12)
11327 btdm_2AntPsTdma(padapter, _TRUE, 11);
11328 pBtdm8723->psTdmaDuAdjType = 11;
11330 else if(pBtdm8723->curPsTdma == 11)
11332 btdm_2AntPsTdma(padapter, _TRUE, 10);
11333 pBtdm8723->psTdmaDuAdjType = 10;
11335 else if(pBtdm8723->curPsTdma == 10)
11337 btdm_2AntPsTdma(padapter, _TRUE, 10);
11338 pBtdm8723->psTdmaDuAdjType = 10;
11343 else if(maxInterval == 3)
11347 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
11348 if(pBtdm8723->curPsTdma == 1)
11350 btdm_2AntPsTdma(padapter, _TRUE, 7);
11351 pBtdm8723->psTdmaDuAdjType = 7;
11353 else if(pBtdm8723->curPsTdma == 2)
11355 btdm_2AntPsTdma(padapter, _TRUE, 7);
11356 pBtdm8723->psTdmaDuAdjType = 7;
11358 else if(pBtdm8723->curPsTdma == 3)
11360 btdm_2AntPsTdma(padapter, _TRUE, 7);
11361 pBtdm8723->psTdmaDuAdjType = 7;
11363 else if(pBtdm8723->curPsTdma == 4)
11365 btdm_2AntPsTdma(padapter, _TRUE, 8);
11366 pBtdm8723->psTdmaDuAdjType = 8;
11368 if(pBtdm8723->curPsTdma == 9)
11370 btdm_2AntPsTdma(padapter, _TRUE, 15);
11371 pBtdm8723->psTdmaDuAdjType = 15;
11373 else if(pBtdm8723->curPsTdma == 10)
11375 btdm_2AntPsTdma(padapter, _TRUE, 15);
11376 pBtdm8723->psTdmaDuAdjType = 15;
11378 else if(pBtdm8723->curPsTdma == 11)
11380 btdm_2AntPsTdma(padapter, _TRUE, 15);
11381 pBtdm8723->psTdmaDuAdjType = 15;
11383 else if(pBtdm8723->curPsTdma == 12)
11385 btdm_2AntPsTdma(padapter, _TRUE, 16);
11386 pBtdm8723->psTdmaDuAdjType = 16;
11390 if(pBtdm8723->curPsTdma == 5)
11392 btdm_2AntPsTdma(padapter, _TRUE, 7);
11393 pBtdm8723->psTdmaDuAdjType = 7;
11395 else if(pBtdm8723->curPsTdma == 6)
11397 btdm_2AntPsTdma(padapter, _TRUE, 7);
11398 pBtdm8723->psTdmaDuAdjType = 7;
11400 else if(pBtdm8723->curPsTdma == 7)
11402 btdm_2AntPsTdma(padapter, _TRUE, 8);
11403 pBtdm8723->psTdmaDuAdjType = 8;
11405 else if(pBtdm8723->curPsTdma == 13)
11407 btdm_2AntPsTdma(padapter, _TRUE, 15);
11408 pBtdm8723->psTdmaDuAdjType = 15;
11410 else if(pBtdm8723->curPsTdma == 14)
11412 btdm_2AntPsTdma(padapter, _TRUE, 15);
11413 pBtdm8723->psTdmaDuAdjType = 15;
11415 else if(pBtdm8723->curPsTdma == 15)
11417 btdm_2AntPsTdma(padapter, _TRUE, 16);
11418 pBtdm8723->psTdmaDuAdjType = 16;
11421 else if (result == 1)
11423 if(pBtdm8723->curPsTdma == 8)
11425 btdm_2AntPsTdma(padapter, _TRUE, 7);
11426 pBtdm8723->psTdmaDuAdjType = 7;
11428 else if(pBtdm8723->curPsTdma == 7)
11430 btdm_2AntPsTdma(padapter, _TRUE, 7);
11431 pBtdm8723->psTdmaDuAdjType = 7;
11433 else if(pBtdm8723->curPsTdma == 6)
11435 btdm_2AntPsTdma(padapter, _TRUE, 7);
11436 pBtdm8723->psTdmaDuAdjType = 7;
11438 else if(pBtdm8723->curPsTdma == 16)
11440 btdm_2AntPsTdma(padapter, _TRUE, 15);
11441 pBtdm8723->psTdmaDuAdjType = 15;
11443 else if(pBtdm8723->curPsTdma == 15)
11445 btdm_2AntPsTdma(padapter, _TRUE, 15);
11446 pBtdm8723->psTdmaDuAdjType = 15;
11448 else if(pBtdm8723->curPsTdma == 14)
11450 btdm_2AntPsTdma(padapter, _TRUE, 15);
11451 pBtdm8723->psTdmaDuAdjType = 15;
11457 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
11458 if(pBtdm8723->curPsTdma == 5)
11460 btdm_2AntPsTdma(padapter, _TRUE, 3);
11461 pBtdm8723->psTdmaDuAdjType = 3;
11463 else if(pBtdm8723->curPsTdma == 6)
11465 btdm_2AntPsTdma(padapter, _TRUE, 3);
11466 pBtdm8723->psTdmaDuAdjType = 3;
11468 else if(pBtdm8723->curPsTdma == 7)
11470 btdm_2AntPsTdma(padapter, _TRUE, 3);
11471 pBtdm8723->psTdmaDuAdjType = 3;
11473 else if(pBtdm8723->curPsTdma == 8)
11475 btdm_2AntPsTdma(padapter, _TRUE, 4);
11476 pBtdm8723->psTdmaDuAdjType = 4;
11478 if(pBtdm8723->curPsTdma == 13)
11480 btdm_2AntPsTdma(padapter, _TRUE, 11);
11481 pBtdm8723->psTdmaDuAdjType = 11;
11483 else if(pBtdm8723->curPsTdma == 14)
11485 btdm_2AntPsTdma(padapter, _TRUE, 11);
11486 pBtdm8723->psTdmaDuAdjType = 11;
11488 else if(pBtdm8723->curPsTdma == 15)
11490 btdm_2AntPsTdma(padapter, _TRUE, 11);
11491 pBtdm8723->psTdmaDuAdjType = 11;
11493 else if(pBtdm8723->curPsTdma == 16)
11495 btdm_2AntPsTdma(padapter, _TRUE, 12);
11496 pBtdm8723->psTdmaDuAdjType = 12;
11500 if(pBtdm8723->curPsTdma == 1)
11502 btdm_2AntPsTdma(padapter, _TRUE, 3);
11503 pBtdm8723->psTdmaDuAdjType = 3;
11505 else if(pBtdm8723->curPsTdma == 2)
11507 btdm_2AntPsTdma(padapter, _TRUE, 3);
11508 pBtdm8723->psTdmaDuAdjType = 3;
11510 else if(pBtdm8723->curPsTdma == 3)
11512 btdm_2AntPsTdma(padapter, _TRUE, 4);
11513 pBtdm8723->psTdmaDuAdjType = 4;
11515 else if(pBtdm8723->curPsTdma == 9)
11517 btdm_2AntPsTdma(padapter, _TRUE, 11);
11518 pBtdm8723->psTdmaDuAdjType = 11;
11520 else if(pBtdm8723->curPsTdma == 10)
11522 btdm_2AntPsTdma(padapter, _TRUE, 11);
11523 pBtdm8723->psTdmaDuAdjType = 11;
11525 else if(pBtdm8723->curPsTdma == 11)
11527 btdm_2AntPsTdma(padapter, _TRUE, 12);
11528 pBtdm8723->psTdmaDuAdjType = 12;
11531 else if (result == 1)
11533 if(pBtdm8723->curPsTdma == 4)
11535 btdm_2AntPsTdma(padapter, _TRUE, 3);
11536 pBtdm8723->psTdmaDuAdjType = 3;
11538 else if(pBtdm8723->curPsTdma == 3)
11540 btdm_2AntPsTdma(padapter, _TRUE, 3);
11541 pBtdm8723->psTdmaDuAdjType = 3;
11543 else if(pBtdm8723->curPsTdma == 2)
11545 btdm_2AntPsTdma(padapter, _TRUE, 3);
11546 pBtdm8723->psTdmaDuAdjType = 3;
11548 else if(pBtdm8723->curPsTdma == 12)
11550 btdm_2AntPsTdma(padapter, _TRUE, 11);
11551 pBtdm8723->psTdmaDuAdjType = 11;
11553 else if(pBtdm8723->curPsTdma == 11)
11555 btdm_2AntPsTdma(padapter, _TRUE, 11);
11556 pBtdm8723->psTdmaDuAdjType = 11;
11558 else if(pBtdm8723->curPsTdma == 10)
11560 btdm_2AntPsTdma(padapter, _TRUE, 11);
11561 pBtdm8723->psTdmaDuAdjType = 11;
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)
11572 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
11573 pBtdm8723->curPsTdma, pBtdm8723->psTdmaDuAdjType));
11575 if( check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE )
11577 btdm_2AntPsTdma(padapter, _TRUE, pBtdm8723->psTdmaDuAdjType);
11581 RTPRINT(FBT, BT_TRACE, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
11587 void btdm_2Ant8723AAction0(PADAPTER padapter)
11589 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11590 btdm_2AntPsTdma(padapter, _FALSE, 0);
11591 btdm_2AntDecBtPwr(padapter, _FALSE);
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);
11599 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11602 // SCO only or SCO+PAN(HS)
11603 void btdm_2Ant8723ASCOAction(PADAPTER padapter)
11605 u8 btRssiState, btRssiState1;
11608 if(btdm_NeedToDecBtPwr(padapter))
11609 btdm_2AntDecBtPwr(padapter, _TRUE);
11611 btdm_2AntDecBtPwr(padapter, _FALSE);
11613 if (BTDM_IsHT40(padapter))
11615 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11616 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11618 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11619 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11621 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11622 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11623 btdm_2AntPsTdma(padapter, _TRUE, 11);
11627 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11628 btdm_2AntPsTdma(padapter, _TRUE, 15);
11632 btdm_2AntAgcTable(padapter, _FALSE);
11633 btdm_2AntAdcBackOff(padapter, _TRUE);
11634 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
11643 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11644 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11646 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11647 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11648 btdm_2AntPsTdma(padapter, _TRUE, 11);
11652 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11653 btdm_2AntPsTdma(padapter, _TRUE, 15);
11658 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11659 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
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);
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);
11677 void btdm_2Ant8723AHIDAction(PADAPTER padapter)
11679 u8 btRssiState, btRssiState1;
11681 if(btdm_NeedToDecBtPwr(padapter))
11682 btdm_2AntDecBtPwr(padapter, _TRUE);
11684 btdm_2AntDecBtPwr(padapter, _FALSE);
11686 if (BTDM_IsHT40(padapter))
11688 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11689 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11691 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11692 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11694 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11695 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11696 btdm_2AntPsTdma(padapter, _TRUE, 9);
11700 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11701 btdm_2AntPsTdma(padapter, _TRUE, 13);
11705 btdm_2AntAgcTable(padapter, _FALSE);
11706 btdm_2AntAdcBackOff(padapter, _FALSE);
11707 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
11716 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11717 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11719 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11720 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11721 btdm_2AntPsTdma(padapter, _TRUE, 9);
11725 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11726 btdm_2AntPsTdma(padapter, _TRUE, 13);
11730 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11731 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
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);
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);
11748 //A2DP only / PAN(EDR) only/ A2DP+PAN(HS)
11749 void btdm_2Ant8723AA2DPAction(PADAPTER padapter)
11751 u8 btRssiState, btRssiState1;
11752 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11753 u8 btInfoExt=pHalData->bt_coexist.halCoex8723.btInfoExt;
11755 if(btdm_NeedToDecBtPwr(padapter))
11756 btdm_2AntDecBtPwr(padapter, _TRUE);
11758 btdm_2AntDecBtPwr(padapter, _FALSE);
11760 if(BTDM_IsHT40(padapter))
11762 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11763 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11766 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11767 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11769 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11770 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11772 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11774 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11775 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
11779 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11780 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11785 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11786 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11788 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11789 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
11793 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11794 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11799 btdm_2AntAgcTable(padapter, _FALSE);
11800 btdm_2AntAdcBackOff(padapter, _TRUE);
11801 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
11810 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11811 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
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
11817 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11818 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
11822 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11823 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11828 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11829 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11831 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11832 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
11836 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11837 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11842 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11843 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
11861 void btdm_2Ant8723APANEDRAction(PADAPTER padapter)
11863 u8 btRssiState, btRssiState1;
11865 if(btdm_NeedToDecBtPwr(padapter))
11866 btdm_2AntDecBtPwr(padapter, _TRUE);
11868 btdm_2AntDecBtPwr(padapter, _FALSE);
11870 if(BTDM_IsHT40(padapter))
11872 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11873 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11876 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11877 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11879 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11880 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11881 btdm_2AntPsTdma(padapter, _TRUE, 2);
11885 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11886 btdm_2AntPsTdma(padapter, _TRUE, 6);
11890 btdm_2AntAgcTable(padapter, _FALSE);
11891 btdm_2AntAdcBackOff(padapter, _TRUE);
11892 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
11901 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11902 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11904 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11905 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11906 btdm_2AntPsTdma(padapter, _TRUE, 2);
11910 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11911 btdm_2AntPsTdma(padapter, _TRUE, 6);
11915 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11916 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
11936 void btdm_2Ant8723APANHSAction(PADAPTER padapter)
11938 u8 btRssiState, btRssiState1;
11940 if (BTDM_IsHT40(padapter))
11942 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11943 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11945 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11946 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11948 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11949 btdm_2AntDecBtPwr(padapter, _TRUE);
11953 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11954 btdm_2AntDecBtPwr(padapter, _FALSE);
11956 btdm_2AntPsTdma(padapter, _FALSE, 0);
11959 btdm_2AntAgcTable(padapter, _FALSE);
11960 btdm_2AntAdcBackOff(padapter, _TRUE);
11961 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11965 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11966 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11968 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11969 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11971 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high\n"));
11973 btdm_2AntDecBtPwr(padapter, _TRUE);
11974 btdm_2AntPsTdma(padapter, _FALSE, 0);
11977 btdm_2AntAgcTable(padapter, _TRUE);
11978 btdm_2AntAdcBackOff(padapter, _TRUE);
11979 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11983 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low\n"));
11985 btdm_2AntDecBtPwr(padapter, _FALSE);
11986 btdm_2AntPsTdma(padapter, _FALSE, 0);
11989 btdm_2AntAgcTable(padapter, _FALSE);
11990 btdm_2AntAdcBackOff(padapter, _FALSE);
11991 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11998 void btdm_2Ant8723APANEDRA2DPAction(PADAPTER padapter)
12000 u8 btRssiState, btRssiState1, btInfoExt;
12001 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12003 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12005 if(btdm_NeedToDecBtPwr(padapter))
12006 btdm_2AntDecBtPwr(padapter, _TRUE);
12008 btdm_2AntDecBtPwr(padapter, _FALSE);
12010 if(BTDM_IsHT40(padapter))
12012 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12013 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12015 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12016 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12018 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12020 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12022 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12024 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12025 btdm_2AntPsTdma(padapter, _TRUE, 4);
12029 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12030 btdm_2AntPsTdma(padapter, _TRUE, 2);
12035 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12037 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12039 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12040 btdm_2AntPsTdma(padapter, _TRUE, 8);
12044 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12045 btdm_2AntPsTdma(padapter, _TRUE, 6);
12050 btdm_2AntAgcTable(padapter, _FALSE);
12051 btdm_2AntAdcBackOff(padapter, _TRUE);
12052 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12060 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12061 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12063 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12064 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12066 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12068 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12069 btdm_2AntPsTdma(padapter, _TRUE, 4);
12073 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12074 btdm_2AntPsTdma(padapter, _TRUE, 2);
12079 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12081 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12083 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12084 btdm_2AntPsTdma(padapter, _TRUE, 8);
12088 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12089 btdm_2AntPsTdma(padapter, _TRUE, 6);
12094 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12095 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12113 void btdm_2Ant8723APANEDRHIDAction(PADAPTER padapter)
12115 u8 btRssiState, btRssiState1;
12117 if(btdm_NeedToDecBtPwr(padapter))
12118 btdm_2AntDecBtPwr(padapter, _TRUE);
12120 btdm_2AntDecBtPwr(padapter, _FALSE);
12122 if(BTDM_IsHT40(padapter))
12124 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12125 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12127 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
12128 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
12130 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12131 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12132 btdm_2AntPsTdma(padapter, _TRUE, 10);
12136 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12137 btdm_2AntPsTdma(padapter, _TRUE, 14);
12141 btdm_2AntAgcTable(padapter, _FALSE);
12142 btdm_2AntAdcBackOff(padapter, _TRUE);
12143 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12152 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12153 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12155 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12156 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12157 btdm_2AntPsTdma(padapter, _TRUE, 10);
12161 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12162 btdm_2AntPsTdma(padapter, _TRUE, 14);
12166 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12167 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12184 // HID+A2DP+PAN(EDR)
12185 void btdm_2Ant8723AHIDA2DPPANEDRAction(PADAPTER padapter)
12187 u8 btRssiState, btRssiState1, btInfoExt;
12188 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12190 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12192 if(btdm_NeedToDecBtPwr(padapter))
12193 btdm_2AntDecBtPwr(padapter, _TRUE);
12195 btdm_2AntDecBtPwr(padapter, _FALSE);
12197 if (BTDM_IsHT40(padapter))
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) )
12204 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12205 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12207 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12209 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12210 btdm_2AntPsTdma(padapter, _TRUE, 12);
12214 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12215 btdm_2AntPsTdma(padapter, _TRUE, 10);
12220 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12221 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12223 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12224 btdm_2AntPsTdma(padapter, _TRUE, 16);
12228 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12229 btdm_2AntPsTdma(padapter, _TRUE, 14);
12234 btdm_2AntAgcTable(padapter, _FALSE);
12235 btdm_2AntAdcBackOff(padapter, _TRUE);
12236 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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))
12246 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12247 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12249 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12251 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12252 btdm_2AntPsTdma(padapter, _TRUE, 12);
12256 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12257 btdm_2AntPsTdma(padapter, _TRUE, 10);
12262 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12263 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12265 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12266 btdm_2AntPsTdma(padapter, _TRUE, 16);
12270 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12271 btdm_2AntPsTdma(padapter, _TRUE, 14);
12276 if ((btRssiState1 == BT_RSSI_STATE_HIGH) ||
12277 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH))
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);
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);
12295 void btdm_2Ant8723AHIDA2DPAction(PADAPTER padapter)
12297 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12298 u8 btRssiState, btRssiState1, btInfoExt;
12300 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12302 if(btdm_NeedToDecBtPwr(padapter))
12303 btdm_2AntDecBtPwr(padapter, _TRUE);
12305 btdm_2AntDecBtPwr(padapter, _FALSE);
12307 if (BTDM_IsHT40(padapter))
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) )
12314 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12315 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12317 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12319 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12320 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12324 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12325 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
12330 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12331 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12333 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12334 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12338 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12339 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
12344 btdm_2AntAgcTable(padapter, _FALSE);
12345 btdm_2AntAdcBackOff(padapter, _TRUE);
12346 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12354 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
12355 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
12357 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
12358 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12360 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12362 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12363 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12367 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12368 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
12373 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
12374 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12376 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12377 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12381 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12382 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
12385 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12386 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12388 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12390 btdm_2AntAgcTable(padapter, _TRUE);
12391 btdm_2AntAdcBackOff(padapter, _TRUE);
12392 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12396 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12398 btdm_2AntAgcTable(padapter, _FALSE);
12399 btdm_2AntAdcBackOff(padapter, _FALSE);
12400 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12406 void btdm_2Ant8723AHidScoEsco(PADAPTER padapter )
12408 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12409 u8 btRssiState, btRssiState1, btInfoExt;
12411 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12413 if(btdm_NeedToDecBtPwr(padapter))
12414 btdm_2AntDecBtPwr(padapter, _TRUE);
12416 btdm_2AntDecBtPwr(padapter, _FALSE);
12418 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12419 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12421 if(BTDM_IsHT40(padapter))
12423 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12424 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12426 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12427 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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
12433 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12434 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12438 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12439 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
12444 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12445 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12447 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12448 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12452 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12453 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
12458 btdm_2AntAgcTable(padapter, _FALSE);
12459 btdm_2AntAdcBackOff(padapter, _FALSE);
12460 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12469 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12470 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
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
12476 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12477 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
12481 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12482 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
12487 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12488 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
12490 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
12491 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
12495 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
12496 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
12501 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12502 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12519 void btdm_2Ant8723AFtpA2dp( PADAPTER padapter )
12521 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12522 u8 btRssiState, btRssiState1, btInfoExt;
12524 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12526 if(btdm_NeedToDecBtPwr(padapter))
12527 btdm_2AntDecBtPwr(padapter, _TRUE);
12529 btdm_2AntDecBtPwr(padapter, _FALSE);
12531 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12532 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12534 if(BTDM_IsHT40(padapter))
12536 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12537 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
12539 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12540 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12542 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12543 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12544 btdm_2AntPsTdma(padapter, _TRUE, 3);
12548 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12549 btdm_2AntPsTdma(padapter, _TRUE, 7);
12553 btdm_2AntAgcTable(padapter, _FALSE);
12554 btdm_2AntAdcBackOff(padapter, _TRUE);
12555 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12564 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12565 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12567 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12568 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12569 btdm_2AntPsTdma(padapter, _TRUE, 3);
12573 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12574 btdm_2AntPsTdma(padapter, _TRUE, 7);
12578 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12579 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12597 void btdm_2Ant8723AA2dp(PADAPTER padapter)
12599 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12600 u8 btRssiState, btRssiState1, btInfoExt;
12602 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12604 if(btdm_NeedToDecBtPwr(padapter))
12605 btdm_2AntDecBtPwr(padapter, _TRUE);
12607 btdm_2AntDecBtPwr(padapter, _FALSE);
12609 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12610 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12612 if(BTDM_IsHT40(padapter))
12614 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12615 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12617 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12618 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12620 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12621 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12622 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
12626 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12627 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
12631 btdm_2AntAgcTable(padapter, _FALSE);
12632 btdm_2AntAdcBackOff(padapter, _TRUE);
12633 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12642 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12643 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12645 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12646 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12647 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
12651 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12652 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
12656 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12657 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12675 void btdm_2Ant8723Ftp(PADAPTER padapter)
12677 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12678 u8 btRssiState, btRssiState1, btInfoExt;
12680 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
12682 if(btdm_NeedToDecBtPwr(padapter))
12683 btdm_2AntDecBtPwr(padapter, _TRUE);
12685 btdm_2AntDecBtPwr(padapter, _FALSE);
12687 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12688 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12690 if(BTDM_IsHT40(padapter))
12692 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
12693 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
12695 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12696 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
12698 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12699 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12700 btdm_2AntPsTdma(padapter, _TRUE, 1);
12704 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12705 btdm_2AntPsTdma(padapter, _TRUE, 5);
12709 btdm_2AntAgcTable(padapter, _FALSE);
12710 btdm_2AntAdcBackOff(padapter, _TRUE);
12711 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
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);
12720 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
12721 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
12723 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
12724 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
12725 btdm_2AntPsTdma(padapter, _TRUE, 1);
12729 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
12730 btdm_2AntPsTdma(padapter, _TRUE, 5);
12734 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
12735 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
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);
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);
12752 //============================================================
12753 // extern function start with BTDM_
12754 //============================================================
12755 void BTDM_2AntParaInit(PADAPTER padapter)
12758 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12759 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
12761 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2Ant Parameter Init!!\n"));
12763 // Enable counter statistics
12764 rtw_write8(padapter, 0x76e, 0x4);
12765 rtw_write8(padapter, 0x778, 0x3);
12766 rtw_write8(padapter, 0x40, 0x20);
12768 // force to reset coex mechanism
12769 pBtdm8723->preVal0x6c0 = 0x0;
12770 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12772 pBtdm8723->bPrePsTdmaOn = _TRUE;
12773 btdm_2AntPsTdma(padapter, _FALSE, 0);
12775 pBtdm8723->preFwDacSwingLvl = 0x10;
12776 btdm_2AntFwDacSwingLvl(padapter, 0x20);
12778 pBtdm8723->bPreDecBtPwr = _TRUE;
12779 btdm_2AntDecBtPwr(padapter, _FALSE);
12781 pBtdm8723->bPreAgcTableEn = _TRUE;
12782 btdm_2AntAgcTable(padapter, _FALSE);
12784 pBtdm8723->bPreAdcBackOff = _TRUE;
12785 btdm_2AntAdcBackOff(padapter, _FALSE);
12787 pBtdm8723->bPreLowPenaltyRa = _TRUE;
12788 btdm_2AntLowPenaltyRa(padapter, _FALSE);
12790 pBtdm8723->bPreRfRxLpfShrink = _TRUE;
12791 btdm_2AntRfShrink(padapter, _FALSE);
12793 pBtdm8723->bPreDacSwingOn = _TRUE;
12794 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
12796 pBtdm8723->bPreIgnoreWlanAct = _TRUE;
12797 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12800 void BTDM_2AntHwCoexAllOff8723A(PADAPTER padapter)
12802 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
12805 void BTDM_2AntFwCoexAllOff8723A(PADAPTER padapter)
12807 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
12808 btdm_2AntPsTdma(padapter, _FALSE, 0);
12809 btdm_2AntFwDacSwingLvl(padapter, 0x20);
12810 btdm_2AntDecBtPwr(padapter, _FALSE);
12813 void BTDM_2AntSwCoexAllOff8723A(PADAPTER padapter)
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);
12823 void BTDM_2AntIpsNotify8723A(PADAPTER padapter,u8 type)
12825 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12826 PBT_MGNT pBtMgnt=&pBTInfo->BtMgnt;
12828 if(pBtMgnt->bSupportProfile && (rf_off==type))
12830 RTPRINT(FBT, BT_TRACE, ("[BT][DM], enter IPS, turn off all BT Coexist DM\n"));
12831 BTDM_CoexAllOff(padapter);
12836 void BTDM_2AntNotifyBtOperation8723(PADAPTER padapter)
12838 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12839 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
12840 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12842 switch (pBtMgnt->ExtConfig.btOperationCode)
12844 case HCI_BT_OP_NONE:
12845 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for operation None!!\n"));
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);
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;
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);
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;
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;
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);
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;
12882 case HCI_BT_OP_BT_DEV_ENABLE:
12883 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device enable!!\n"));
12885 case HCI_BT_OP_BT_DEV_DISABLE:
12886 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device disable!!\n"));
12889 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Unknown, error!!\n"));
12896 void btdm_BtHwCountersMonitor(PADAPTER padapter);
12898 BTDM_2AntFwC2hBtInfo8723A(
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;
12907 u8 algorithm=BT_2ANT_COEX_ALGO_UNDEFINED;
12908 u8 bScoExist=_FALSE, bBtLinkExist=_FALSE, bBtHsModeExist=_FALSE;
12909 btInfo = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
12912 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
12914 // check BIT2 first ==> check if bt is under inquiry or page scan
12915 if(btInfo & BIT(2))
12917 if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage == _FALSE){
12918 pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12919 pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12920 btdm_2AntBtInquiryPage(padapter);
12923 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
12924 btdm_HoldForBtInqPage(padapter);
12926 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _TRUE;
12931 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _FALSE;
12932 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12933 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
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));
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)
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;
12951 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_CONNECTED_IDLE;
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){
12958 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
12959 algorithm = BT_2ANT_COEX_ALGO_HID;
12961 case BT_INFO_A2DP :
12962 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
12967 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
12968 algorithm = BT_2ANT_COEX_ALGO_SCO;
12972 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
12973 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
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;
12980 case (BT_INFO_HID|BT_INFO_FTP) :
12983 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
12984 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12988 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
12989 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12992 case (BT_INFO_A2DP|BT_INFO_FTP) :
12995 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
12996 algorithm = BT_2ANT_COEX_ALGO_A2DP;
13000 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
13001 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
13004 case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
13007 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
13008 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13012 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
13013 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
13020 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
13021 algorithm = BT_2ANT_COEX_ALGO_SCO;
13025 RTPRINT(FBT, BT_TRACE, ("[BTCoex], non SCO\n"));
13026 switch(btInfo&0xe0){
13028 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID\n"));
13029 algorithm = BT_2ANT_COEX_ALGO_HID;
13031 case BT_INFO_A2DP :
13032 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP\n"));
13033 algorithm = BT_2ANT_COEX_ALGO_A2DP;
13036 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR)\n"));
13037 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
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;
13043 case (BT_INFO_HID|BT_INFO_FTP) :
13046 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
13047 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13051 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
13052 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
13055 case (BT_INFO_A2DP|BT_INFO_FTP) :
13058 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
13059 algorithm = BT_2ANT_COEX_ALGO_A2DP;
13063 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
13064 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
13067 case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
13070 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
13071 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
13075 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
13076 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
13086 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BTInfo: bConnect=FALSE\n"));
13087 //pBtMgnt->ExtConfig.bBTBusy = _FALSE;
13088 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_IDLE;
13091 pBtdm8723->curAlgorithm =algorithm;
13092 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
13095 BTDM_CheckWiFiState(padapter);
13096 if(pBtMgnt->ExtConfig.bManualControl)
13098 RTPRINT(FBT, BT_TRACE, ("Action Manual control, won't execute bt coexist mechanism!!\n"));
13105 void BTDM_2AntBtCoexist8723A(PADAPTER padapter)
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;
13114 if (BTDM_BtProfileSupport(padapter))
13116 if (pBtMgnt->ExtConfig.bHoldForBtOperation)
13118 RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
13121 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
13123 RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n",
13124 pBtMgnt->ExtConfig.bHoldPeriodCnt));
13125 if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
13127 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
13128 // next time the coexist parameters should be reset again.
13131 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
13135 if(pBtDbg->dbgCtrl)
13137 RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
13140 pBtdm8723->curAlgorithm = btdm_ActionAlgorithm(padapter);
13141 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
13143 if (btdm_Is2Ant8723ACommonAction(padapter))
13145 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
13146 pBtdm8723->bResetTdmaAdjust = _TRUE;
13150 if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
13152 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
13153 pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
13154 pBtdm8723->bResetTdmaAdjust = _TRUE;
13156 switch(pBtdm8723->curAlgorithm)
13158 case BT_2ANT_COEX_ALGO_SCO:
13159 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
13160 btdm_2Ant8723ASCOAction(padapter);
13162 case BT_2ANT_COEX_ALGO_HID:
13163 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
13164 btdm_2Ant8723AHIDAction(padapter);
13166 case BT_2ANT_COEX_ALGO_A2DP:
13167 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
13168 btdm_2Ant8723AA2DPAction(padapter);
13170 case BT_2ANT_COEX_ALGO_PANEDR:
13171 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
13172 btdm_2Ant8723APANEDRAction(padapter);
13174 case BT_2ANT_COEX_ALGO_PANHS:
13175 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
13176 btdm_2Ant8723APANHSAction(padapter);
13178 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
13179 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
13180 btdm_2Ant8723APANEDRA2DPAction(padapter);
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);
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);
13190 case BT_2ANT_COEX_ALGO_HID_A2DP:
13191 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
13192 btdm_2Ant8723AHIDA2DPAction(padapter);
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);
13201 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
13202 //btdm_2Ant8723AAction0(padapter);
13203 btdm_2Ant8723AA2DPAction(padapter);
13206 pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
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)
13215 RTPRINT(FBT, BT_TRACE, ("[BTCoex] c2h for btInfo not rcvd yet!!\n"));
13218 //btRetryCnt = pHalData->bt_coexist.halCoex8723.btRetryCnt;
13219 btInfoOriginal = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
13221 if(pBtMgnt->ExtConfig.bHoldForBtOperation)
13223 RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
13226 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
13228 RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n", pBtMgnt->ExtConfig.bHoldPeriodCnt));
13229 if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
13231 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
13232 // next time the coexist parameters should be reset again.
13235 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
13239 if(pBtDbg->dbgCtrl)
13241 RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
13243 if (btdm_Is2Ant8723ACommonAction(padapter))
13245 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
13246 pBtdm8723->bResetTdmaAdjust = _TRUE;
13250 if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
13252 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
13253 pBtdm8723->bResetTdmaAdjust = _TRUE;
13255 switch(pBtdm8723->curAlgorithm)
13257 case BT_2ANT_COEX_ALGO_SCO:
13258 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
13259 btdm_2Ant8723ASCOAction(padapter);
13261 case BT_2ANT_COEX_ALGO_HID:
13262 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
13263 btdm_2Ant8723AHIDAction(padapter);
13265 case BT_2ANT_COEX_ALGO_A2DP:
13266 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
13267 btdm_2Ant8723AA2dp(padapter);
13269 case BT_2ANT_COEX_ALGO_PANEDR:
13270 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
13271 btdm_2Ant8723APANEDRAction(padapter);
13273 case BT_2ANT_COEX_ALGO_PANHS:
13274 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
13275 btdm_2Ant8723APANHSAction(padapter);
13277 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
13278 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
13279 btdm_2Ant8723APANEDRA2DPAction(padapter);
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);
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);
13289 case BT_2ANT_COEX_ALGO_HID_A2DP:
13290 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
13291 btdm_2Ant8723AHIDA2DPAction(padapter);
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);
13300 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
13301 //btdm_2Ant8723AAction0(padapter);
13302 btdm_2Ant8723AA2DPAction(padapter);
13305 pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
13307 // pHalData->bt_coexist.halCoex8723.prec2hBtInfo = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
13312 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
13315 #ifdef __HALBTC8723_C__ // HAL/BTCoexist/HalBtc8723.c
13316 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
13318 static u8 btCoexDbgBuf[BT_TMP_BUF_SIZE];
13319 const char *const BtProfileString[]={
13326 const char *const BtSpecString[]={
13335 const char *const BtLinkRoleString[]={
13340 u8 btdm_BtWifiAntNum(PADAPTER padapter)
13342 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13343 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
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)
13351 if (Ant_x2 == pBtCoex->TotalAntNum)
13364 void btdm_BtHwCountersMonitor(PADAPTER padapter)
13366 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13367 u32 regHPTxRx, regLPTxRx, u4Tmp;
13368 u32 regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
13372 regHPTxRx = REG_HIGH_PRIORITY_TXRX;
13373 regLPTxRx = REG_LOW_PRIORITY_TXRX;
13375 u4Tmp = rtw_read32(padapter, regHPTxRx);
13376 regHPTx = u4Tmp & bMaskLWord;
13377 regHPRx = (u4Tmp & bMaskHWord)>>16;
13379 u4Tmp = rtw_read32(padapter, regLPTxRx);
13380 regLPTx = u4Tmp & bMaskLWord;
13381 regLPRx = (u4Tmp & bMaskHWord)>>16;
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;
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));
13392 //u1Tmp = rtw_read8(padapter, 0x76e);
13393 //DbgPrint("read 2 back 0x76e= 0x%x\n", u1Tmp);
13395 rtw_write8(padapter, 0x76e, 0xc);
13398 // This function check if 8723 bt is disabled
13399 void btdm_BtEnableDisableCheck8723A(PADAPTER padapter)
13401 u8 btAlife = _TRUE;
13402 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13405 #ifdef CHECK_BT_EXIST_FROM_REG
13408 // ox68[28]=1 => BT enable; otherwise disable
13409 val8 = rtw_read8(padapter, 0x6B);
13410 if (!(val8 & BIT(4))) btAlife = _FALSE;
13414 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
13415 // RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
13419 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
13420 // RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
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)
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)
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)
13446 pHalData->bt_coexist.btActiveZeroCnt = 0;
13447 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
13448 RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
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)
13457 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
13458 RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
13463 if (pHalData->bt_coexist.bCurBtDisabled == _FALSE) {
13464 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
13465 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
13467 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_DISCONNECT);
13470 if (pHalData->bt_coexist.bPreBtDisabled !=
13471 pHalData->bt_coexist.bCurBtDisabled)
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;
13480 void btdm_BTCoexist8723AHandler(PADAPTER padapter)
13482 PHAL_DATA_TYPE pHalData;
13485 pHalData = GET_HAL_DATA(padapter);
13487 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13489 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2 Ant mechanism\n"));
13490 BTDM_2AntBtCoexist8723A(padapter);
13494 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
13495 BTDM_1AntBtCoexist8723A(padapter);
13498 if (!BTDM_IsSameCoexistState(padapter))
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;
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"));
13540 //============================================================
13541 // extern function start with BTDM_
13542 //============================================================
13543 u32 BTDM_BtTxRxCounterH( PADAPTER padapter)
13545 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13548 counters = pHalData->bt_coexist.halCoex8723.highPriorityTx+
13549 pHalData->bt_coexist.halCoex8723.highPriorityRx ;
13553 u32 BTDM_BtTxRxCounterL( PADAPTER padapter )
13555 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13558 counters = pHalData->bt_coexist.halCoex8723.lowPriorityTx+
13559 pHalData->bt_coexist.halCoex8723.lowPriorityRx ;
13563 void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
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};
13573 if (!IS_HARDWARE_TYPE_8723A(padapter))
13577 if (RT_MEDIA_CONNECT == mstatus)
13579 H2C_Parameter[0] = 0x1; // 0: disconnected, 1:connected
13582 if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
13585 chnl = pmlmeext->cur_channel;
13586 if (BTDM_IsHT40(padapter))
13588 if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
13592 else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
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 ));
13600 else // check if HS link is exists
13603 if (BT_Operation(padapter))
13604 H2C_Parameter[1] = pBtMgnt->BTChannel;
13606 H2C_Parameter[1] = pmlmeext->cur_channel;
13609 if (BTDM_IsHT40(padapter))
13611 H2C_Parameter[2] = 0x30;
13615 H2C_Parameter[2] = 0x20;
13618 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x19=0x%x\n",
13619 // H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
13621 FillH2CCmd(padapter, 0x19, 3, H2C_Parameter);
13624 u8 BTDM_IsWifiConnectionExist(PADAPTER padapter)
13629 if (BTHCI_HsConnectionEstablished(padapter))
13632 if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
13647 u8 H2C_Parameter[5] = {0};
13649 if (BTDM_1Ant8723A(padapter) == _TRUE)
13651 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
13652 (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) // for softap mode
13654 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13655 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
13656 u8 BtState = pBtCoex->c2hBtInfo;
13658 if ((BtState != BT_INFO_STATE_NO_CONNECTION) &&
13659 (BtState != BT_INFO_STATE_CONNECT_IDLE))
13661 if (byte1 & BIT(4))
13668 if (byte5 & BIT(6))
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;
13682 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%02x%08x\n",
13684 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
13686 FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
13689 void BTDM_ForceBtCoexMechanism(PADAPTER padapter, u8 type)
13691 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13694 pHalData->bt_coexist.halCoex8723.bForceFwBtInfo = type;
13696 if (pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
13698 DbgPrint("cosa force bt info from wifi fw !!!\n");
13702 DbgPrint("cosa force bt coexist bt info from bt stack\n");
13706 void BTDM_QueryBtInformation(PADAPTER padapter)
13708 u8 H2C_Parameter[1] = {0};
13709 PHAL_DATA_TYPE pHalData;
13710 PBT_COEXIST_8723A pBtCoex;
13713 pHalData = GET_HAL_DATA(padapter);
13714 pBtCoex = &pHalData->bt_coexist.halCoex8723;
13716 if (BT_IsBtDisabled(padapter) == _TRUE)
13718 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
13719 pBtCoex->bC2hBtInfoReqSent = _FALSE;
13723 if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
13724 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
13726 if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
13728 RTPRINT(FBT, BT_TRACE, ("[BTCoex], didn't recv previous BtInfo report!\n"));
13732 pBtCoex->bC2hBtInfoReqSent = _TRUE;
13735 H2C_Parameter[0] |= BIT(0); // trigger
13737 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], Query Bt information, write 0x38=0x%x\n",
13738 // H2C_Parameter[0]));
13740 FillH2CCmd(padapter, 0x38, 1, H2C_Parameter);
13743 void BTDM_SetSwRfRxLpfCorner(PADAPTER padapter, u8 type)
13745 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13747 if (BT_RF_RX_LPF_CORNER_SHRINK == type)
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;
13754 else if (BT_RF_RX_LPF_CORNER_RESUME == type)
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);
13763 BTDM_SetSwPenaltyTxRateAdaptive(
13768 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13771 tmpU1 = rtw_read8(padapter, 0x4fd);
13773 if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == raType)
13775 // RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set low penalty!!\n"));
13777 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
13779 else if (BT_TX_RATE_ADAPTIVE_NORMAL == raType)
13781 // RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set normal!!\n"));
13785 rtw_write8(padapter, 0x4fd, tmpU1);
13788 void BTDM_SetFwDecBtPwr(PADAPTER padapter, u8 bDecBtPwr)
13790 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13791 u8 H2C_Parameter[1] = {0};
13794 H2C_Parameter[0] = 0;
13798 H2C_Parameter[0] |= BIT(1);
13799 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
13802 RTPRINT(FBT, BT_TRACE, ("[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
13803 (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));
13805 FillH2CCmd(padapter, 0x21, 1, H2C_Parameter);
13808 u8 BTDM_BtProfileSupport(PADAPTER padapter)
13811 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13812 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13813 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13816 if (pBtMgnt->bSupportProfile &&
13817 !pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
13825 void BTDM_AdjustForBtOperation8723A(PADAPTER padapter)
13827 //BTDM_2AntAdjustForBtOperation8723(padapter);
13830 void BTDM_FwC2hBtRssi8723A(PADAPTER padapter, u8 *tmpBuf)
13832 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13833 u8 percent=0, u1tmp=0;
13836 percent = u1tmp*2+10;
13838 pHalData->bt_coexist.halCoex8723.btRssi = percent;
13839 // RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT RSSI=%d\n", percent));
13842 void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length)
13844 PHAL_DATA_TYPE pHalData;
13847 PBT_COEXIST_8723A pBtCoex;
13851 pHalData = GET_HAL_DATA(padapter);
13852 pBTInfo = GET_BT_INFO(padapter);
13853 pBtMgnt = &pBTInfo->BtMgnt;
13854 pBtCoex = &pHalData->bt_coexist.halCoex8723;
13856 pBtCoex->bC2hBtInfoReqSent = _FALSE;
13858 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT info[%d]=[", length));
13860 pBtCoex->btRetryCnt = 0;
13861 for (i=0; i<length; i++)
13866 pBtCoex->c2hBtInfoOriginal = tmpBuf[i];
13869 pBtCoex->btRetryCnt = tmpBuf[i];
13872 BTDM_FwC2hBtRssi8723A(padapter, &tmpBuf[i]);
13875 pBtCoex->btInfoExt=tmpBuf[i]&BIT(0);
13881 RTPRINT(FBT, BT_TRACE, ("0x%02x]\n", tmpBuf[i]));
13885 RTPRINT(FBT, BT_TRACE, ("0x%02x, ", tmpBuf[i]));
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));
13892 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13893 BTDM_1AntFwC2hBtInfo8723A(padapter);
13895 BTDM_2AntFwC2hBtInfo8723A(padapter);
13897 if (pBtMgnt->ExtConfig.bManualControl)
13899 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
13903 btdm_BTCoexist8723AHandler(padapter);
13906 void BTDM_Display8723ABtCoexInfo(PADAPTER padapter)
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;
13917 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
13918 DCMD_Printf(btCoexDbgBuf);
13920 if (!pHalData->bt_coexist.BluetoothCoexist)
13922 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
13923 DCMD_Printf(btCoexDbgBuf);
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);
13932 if (pBtMgnt->ExtConfig.bManualControl)
13934 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");
13935 DCMD_Printf(btCoexDbgBuf);
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);
13944 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = / %d", "Dot11 channel / BT channel", \
13945 pBtMgnt->BTChannel);
13946 DCMD_Printf(btCoexDbgBuf);
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);
13954 if(!pBtMgnt->ExtConfig.bManualControl)
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);
13961 if(pBtMgnt->bSupportProfile)
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);
13970 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
13972 if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
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);
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);
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);
13997 if (!pBtMgnt->ExtConfig.bManualControl)
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);
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);
14020 if (!pBtMgnt->ExtConfig.bManualControl)
14022 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw BT Coex mechanism]============");
14023 DCMD_Printf(btCoexDbgBuf);
14025 if (!pBtMgnt->ExtConfig.bManualControl)
14027 if(btdm_BtWifiAntNum(padapter) == Ant_x1)
14028 psTdmaCase = pHalData->bt_coexist.halCoex8723.btdm1Ant.curPsTdma;
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);
14037 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "Decrease Bt Power", \
14038 pBtCoex->btdm2Ant.bCurDecBtPwr);
14039 DCMD_Printf(btCoexDbgBuf);
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);
14048 if (!pBtMgnt->ExtConfig.bManualControl)
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);
14054 u4Tmp[0] = rtw_read32(padapter, 0x880);
14055 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x880", \
14057 DCMD_Printf(btCoexDbgBuf);
14060 if (!pBtMgnt->ExtConfig.bManualControl)
14062 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw BT Coex mechanism]============");
14063 DCMD_Printf(btCoexDbgBuf);
14066 u1Tmp = rtw_read8(padapter, 0x40);
14067 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x40", \
14069 DCMD_Printf(btCoexDbgBuf);
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", \
14075 DCMD_Printf(btCoexDbgBuf);
14077 u4Tmp[0] = rtw_read32(padapter, 0x484);
14078 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x484(rate adaptive)", \
14080 DCMD_Printf(btCoexDbgBuf);
14082 u4Tmp[0] = rtw_read32(padapter, 0x50);
14083 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \
14085 DCMD_Printf(btCoexDbgBuf);
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);
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);
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);
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)", \
14118 DCMD_Printf(btCoexDbgBuf);
14119 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
14120 pHalData->LastHMEBoxNum);
14121 DCMD_Printf(btCoexDbgBuf);
14124 void BTDM_8723ASignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
14126 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14127 BTDM_1AntSignalCompensation(padapter, rssi_wifi, rssi_bt);
14130 void BTDM_8723AInit(PADAPTER padapter)
14132 if (IS_HARDWARE_TYPE_8723A(padapter))
14134 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14135 BTDM_2AntParaInit(padapter);
14137 BTDM_1AntParaInit(padapter);
14141 void BTDM_HWCoexAllOff8723A(PADAPTER padapter)
14143 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14144 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14146 if (pBtMgnt->ExtConfig.bManualControl)
14149 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14150 BTDM_2AntHwCoexAllOff8723A(padapter);
14153 void BTDM_FWCoexAllOff8723A(PADAPTER padapter)
14155 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14156 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14158 if (pBtMgnt->ExtConfig.bManualControl)
14161 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14162 BTDM_2AntFwCoexAllOff8723A(padapter);
14165 void BTDM_SWCoexAllOff8723A(PADAPTER padapter)
14167 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14168 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14170 if (pBtMgnt->ExtConfig.bManualControl)
14173 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
14174 BTDM_2AntSwCoexAllOff8723A(padapter);
14178 BTDM_Set8723ABtCoexCurrAntNum(
14183 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14184 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
14188 pBtCoex->TotalAntNum = Ant_x1;
14190 else if (antNum == 2)
14192 pBtCoex->TotalAntNum = Ant_x2;
14196 void BTDM_LpsLeave(PADAPTER padapter)
14198 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14199 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14201 if (pBtMgnt->ExtConfig.bManualControl)
14204 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14205 BTDM_1AntLpsLeave(padapter);
14208 void BTDM_ForHalt8723A(PADAPTER padapter)
14210 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14211 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14213 if (pBtMgnt->ExtConfig.bManualControl)
14216 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14217 BTDM_1AntForHalt(padapter);
14220 void BTDM_WifiScanNotify8723A(PADAPTER padapter, u8 scanType)
14222 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14223 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14225 if (pBtMgnt->ExtConfig.bManualControl)
14228 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14229 BTDM_1AntWifiScanNotify(padapter, scanType);
14232 void BTDM_WifiAssociateNotify8723A(PADAPTER padapter, u8 action)
14234 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14235 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14237 if (pBtMgnt->ExtConfig.bManualControl)
14240 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14241 BTDM_1AntWifiAssociateNotify(padapter, action);
14244 void BTDM_MediaStatusNotify8723A(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
14246 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14247 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14250 RTPRINT(FBT, BT_TRACE, ("[BTCoex], MediaStatusNotify, %s\n", mstatus?"connect":"disconnect"));
14252 BTDM_SetFwChnlInfo(padapter, mstatus);
14254 if (pBtMgnt->ExtConfig.bManualControl)
14257 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14258 BTDM_1AntMediaStatusNotify(padapter, mstatus);
14261 void BTDM_ForDhcp8723A(PADAPTER padapter)
14263 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14264 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14266 if (pBtMgnt->ExtConfig.bManualControl)
14269 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14270 BTDM_1AntForDhcp(padapter);
14273 u8 BTDM_1Ant8723A(PADAPTER padapter)
14275 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
14281 void BTDM_BTCoexist8723A(PADAPTER padapter)
14283 PHAL_DATA_TYPE pHalData;
14286 PBT_COEXIST_8723A pBtCoex;
14289 pHalData = GET_HAL_DATA(padapter);
14290 pBTInfo = GET_BT_INFO(padapter);
14291 pBtMgnt = &pBTInfo->BtMgnt;
14292 pBtCoex = &pHalData->bt_coexist.halCoex8723;
14294 RTPRINT(FBT, BT_TRACE, ("[BTCoex], beacon RSSI=0x%x(%d)\n",
14295 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB,
14296 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB));
14298 btdm_BtHwCountersMonitor(padapter);
14299 btdm_BtEnableDisableCheck8723A(padapter);
14301 if (pBtMgnt->ExtConfig.bManualControl)
14303 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
14307 if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
14309 if (BT_IsBtDisabled(padapter) == _TRUE)
14311 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
14315 if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
14316 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
14319 btdm_BTCoexist8723AHandler(padapter);
14321 else if (BT_IsBtDisabled(padapter) == _TRUE)
14323 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
14324 btdm_BTCoexist8723AHandler(padapter);
14327 BTDM_QueryBtInformation(padapter);
14330 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
14333 #ifdef __HALBTCCSR1ANT_C__ // HAL/BTCoexist/HalBtcCsr1Ant.c
14334 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
14336 //============================================================
14337 // local function start with btdm_
14338 //============================================================
14339 void btdm_WriteReg860(PADAPTER padapter, u16 value)
14341 RTPRINT(FBT, BT_TRACE, ("btdm_WriteReg860(), value = 0x%x\n", value));
14342 PHY_SetBBReg(padapter, 0x860, bMaskLWord, value);
14345 void btdm_CheckCounterOnly1Ant(PADAPTER padapter)
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;
14353 if (!pHalData->bt_coexist.BluetoothCoexist)
14355 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14357 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14361 // The following we only consider CSR BC8 and fw version should be >= 62
14363 RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
14364 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
14366 regBTActive = REG_BT_ACTIVE;
14367 regBTState = REG_BT_STATE;
14368 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
14369 regBTPolling = REG_BT_POLLING1;
14371 regBTPolling = REG_BT_POLLING;
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;
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;
14382 BT_Polling = rtw_read32(padapter, regBTPolling);
14383 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
14385 Ratio_Act = BT_Active*1000/BT_Polling;
14386 Ratio_STA = BT_State*1000/BT_Polling;
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));
14400 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14403 if ((pHalData->bt_coexist.bInterruptOn == bInterruptOn) &&
14404 (pHalData->bt_coexist.bSingleAntOn == bSingleAntOn) &&
14405 (pHalData->bt_coexist.bMultiNAVOn == bMultiNAVOn))
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"));
14418 u8 btdm_IsBalance(PADAPTER padapter, u8 bBalanceOn)
14420 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14422 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_IsBalance(), bBalanceOn=%s\n",
14423 bBalanceOn?"ON":"OFF"));
14425 if (pHalData->bt_coexist.bBalanceOn == bBalanceOn)
14432 u8 btdm_EarphoneSpecDetect(PADAPTER padapter)
14434 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14436 switch (pHalData->bt_coexist.A2DPState)
14438 case BT_A2DP_STATE_NOT_ENTERED:
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;
14451 case BT_A2DP_STATE_DETECTING:
14453 // 32,12; the most critical for BT
14456 if (btdm_IsSingleAnt(padapter, _TRUE, _FALSE, _FALSE))
14458 if ((pHalData->bt_coexist.PreWLANActH == 0) &&
14459 (pHalData->bt_coexist.PreWLANActL == 0))
14461 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [0,0]\n"));
14462 pHalData->bt_coexist.WLANActH = 12;
14463 pHalData->bt_coexist.WLANActL = 24;
14465 else if ((pHalData->bt_coexist.PreWLANActH == 12) &&
14466 (pHalData->bt_coexist.PreWLANActL == 24))
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)))
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;
14481 RTPRINT(FBT, BT_TRACE, (" cosa set to 32/12\n "));
14482 pHalData->bt_coexist.WLANActH = 32;
14483 pHalData->bt_coexist.WLANActL = 12;
14486 else if ((pHalData->bt_coexist.PreWLANActH == 32) &&
14487 (pHalData->bt_coexist.PreWLANActL == 12))
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)))
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;
14501 if ((pHalData->bt_coexist.PreWLANActH != pHalData->bt_coexist.WLANActH) ||
14502 (pHalData->bt_coexist.PreWLANActL != pHalData->bt_coexist.WLANActL))
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;
14510 RTPRINT(FBT, BT_TRACE, ("earphone detected result: WLANActH=%d, WLANActL=%d\n",
14511 pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL));
14515 case BT_A2DP_STATE_DETECTED:
14519 RT_ASSERT(_FALSE, ("btdm_EarphoneSpecDetect(), unknown case\n"));
14525 //==============================================================
14528 // In the following, FW should be done before SW mechanism.
14530 //==============================================================
14532 void btdm_SCOActionBC81Ant(PADAPTER padapter)
14534 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
14535 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
14538 if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
14539 !(pmlmepriv->LinkDetectInfo.bBusyTraffic))
14541 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink or Wifi is idle\n"));
14542 if (BTDM_IsSameCoexistState(padapter))
14544 BTDM_Balance(padapter, _FALSE, 0, 0);
14545 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14547 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
14549 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
14551 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14553 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14554 if (BTDM_IsSameCoexistState(padapter))
14556 if ((btRssiState == BT_RSSI_STATE_LOW) ||
14557 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14559 BTDM_Balance(padapter, _FALSE, 0, 0);
14560 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14565 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
14566 if (BTDM_IsSameCoexistState(padapter))
14568 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14569 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14571 BTDM_Balance(padapter, _FALSE, 0, 0);
14572 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14576 BTDM_Balance(padapter, _FALSE, 0, 0);
14577 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14583 u8 btdm_SCOAction1Ant(PADAPTER padapter)
14585 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14586 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14587 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14589 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
14591 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
14592 btdm_SCOActionBC81Ant(padapter);
14597 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
14602 void btdm_HIDActionBC81Ant(PADAPTER padapter)
14605 if (BTDM_IsSameCoexistState(padapter))
14608 BTDM_Balance(padapter, _FALSE, 0, 0);
14609 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14612 u8 btdm_HIDAction1Ant(PADAPTER padapter)
14614 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
14615 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14616 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14618 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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);
14632 void btdm_A2DPActionBC81Ant(PADAPTER padapter)
14634 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14635 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14636 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14639 if (pBtMgnt->ExtConfig.bBTBusy)
14641 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14643 // We have to detect BT earphone spec first.
14644 btdm_EarphoneSpecDetect(padapter);
14646 if (!BTDM_IsHT40(padapter))
14648 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14649 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14651 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_30, 0);
14652 if (BTDM_IsSameCoexistState(padapter))
14655 if ((btRssiState == BT_RSSI_STATE_LOW) ||
14656 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14658 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14659 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14664 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_55, 0);
14665 if (BTDM_IsSameCoexistState(padapter))
14668 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14669 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14671 BTDM_Balance(padapter, _FALSE, 0, 0);
14672 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14676 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14677 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14683 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14684 if (BTDM_IsSameCoexistState(padapter))
14686 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
14687 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
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)
14696 RTPRINT(FBT, BT_TRACE, ("Ratio_STA > 3\n"));
14697 BTDM_Balance(padapter, _FALSE, 0, 0);
14698 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14702 RTPRINT(FBT, BT_TRACE, ("Ratio_STA <= 3\n"));
14703 BTDM_Balance(padapter, _TRUE, 32, 5);
14704 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14709 u8 btdm_A2DPAction1Ant(PADAPTER padapter)
14711 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14712 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
14713 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14715 if (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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);
14729 void btdm_PANActionBC81Ant(PADAPTER padapter)
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);
14738 if (pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn)
14740 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14742 if (!BTDM_IsHT40(padapter))
14744 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14745 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14747 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14748 if (BTDM_IsSameCoexistState(padapter))
14751 if ((btRssiState == BT_RSSI_STATE_LOW) ||
14752 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14754 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14755 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14760 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_50, 0);
14761 if (BTDM_IsSameCoexistState(padapter))
14763 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14764 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14766 BTDM_Balance(padapter, _FALSE, 0, 0);
14767 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14771 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14772 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14778 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14779 if ((pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic) &&
14780 (pmlmepriv->LinkDetectInfo.bTxBusyTraffic))
14782 RTPRINT(FBT, BT_TRACE, ("BT is Downlink and Wifi is Uplink\n"));
14783 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
14785 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
14786 if (BTDM_IsSameCoexistState(padapter))
14788 if ((btRssiState == BT_RSSI_STATE_LOW) ||
14789 (btRssiState == BT_RSSI_STATE_STAY_LOW))
14791 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14792 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14797 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
14798 if (BTDM_IsSameCoexistState(padapter))
14800 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14801 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14803 BTDM_Balance(padapter, _FALSE, 0, 0);
14804 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14808 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
14809 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
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);
14821 else if (pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn)
14823 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
14824 BTDM_FWCoexAllOff(padapter);
14828 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
14829 BTDM_Balance(padapter, _TRUE, 32, 5);
14830 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14834 u8 btdm_PANAction1Ant(PADAPTER padapter)
14836 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14837 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14838 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14840 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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);
14854 void btdm_HIDA2DPActionBC81Ant(PADAPTER padapter)
14856 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14857 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14859 if (pBtMgnt->ExtConfig.bBTBusy)
14861 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14862 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14863 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14867 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
14868 BTDM_Balance(padapter, _FALSE, 0, 0);
14869 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14873 u8 btdm_HIDA2DPAction1Ant(PADAPTER padapter)
14875 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14877 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14879 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14880 btdm_HIDA2DPActionBC81Ant(padapter);
14885 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14890 void btdm_HIDPANActionBC81Ant(PADAPTER padapter)
14892 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14893 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14895 if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
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);
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);
14909 u8 btdm_HIDPANAction1Ant(PADAPTER padapter)
14911 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14913 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
14915 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14916 btdm_HIDPANActionBC81Ant(padapter);
14921 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14926 void btdm_PANA2DPActionBC81Ant(PADAPTER padapter)
14928 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14929 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14931 if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
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);
14937 else if ((pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn))
14939 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
14940 btdm_A2DPActionBC81Ant(padapter);
14944 BTDM_Balance(padapter, _FALSE, 0, 0);
14945 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14949 u8 btdm_PANA2DPAction1Ant(PADAPTER padapter)
14951 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14953 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14955 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14956 btdm_PANA2DPActionBC81Ant(padapter);
14961 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14966 //============================================================
14967 // extern function start with BTDM_
14968 //============================================================
14970 void BTDM_SetAntenna(PADAPTER padapter, u8 who)
14972 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14973 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14974 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14976 if (!IS_HARDWARE_TYPE_8192C(padapter))
14978 if (!pHalData->bt_coexist.BluetoothCoexist)
14980 if (pBtMgnt->ExtConfig.bManualControl)
14982 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14984 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14986 // if (pHalData->bt_coexist.AntennaState == who)
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;
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;
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;
15016 RT_ASSERT(_FALSE, ("BTDM_SetAntenna(), error case\n"));
15029 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15030 u8 H2C_Parameter[3] = {0};
15032 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
15035 H2C_Parameter[2] = 0;
15036 H2C_Parameter[1] = 0;
15037 H2C_Parameter[0] = 0;
15041 H2C_Parameter[2] |= 0x02; //BIT1
15042 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15044 pHalData->bt_coexist.bInterruptOn = bInterruptOn;
15048 H2C_Parameter[2] |= 0x10; //BIT4
15049 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15051 pHalData->bt_coexist.bSingleAntOn = bSingleAntOn;
15055 H2C_Parameter[2] |= 0x20; //BIT5
15056 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
15058 pHalData->bt_coexist.bMultiNAVOn = bMultiNAVOn;
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]));
15064 if (IS_HARDWARE_TYPE_8192C(padapter))
15066 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
15068 else if (IS_HARDWARE_TYPE_8192D(padapter))
15070 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
15074 void BTDM_CheckBTIdleChange1Ant(PADAPTER padapter)
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;
15085 if (!pHalData->bt_coexist.BluetoothCoexist)
15087 if (pBtMgnt->ExtConfig.bManualControl)
15089 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
15091 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
15095 // The following we only consider CSR BC8 and fw version should be >= 62
15097 RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
15098 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
15100 regBTActive = REG_BT_ACTIVE;
15101 regBTState = REG_BT_STATE;
15102 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
15103 regBTPolling = REG_BT_POLLING1;
15105 regBTPolling = REG_BT_POLLING;
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;
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;
15116 BT_Polling = rtw_read32(padapter, regBTPolling);
15117 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
15119 if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
15121 if (BT_Polling == 0)
15124 Ratio_Act = BT_Active*1000/BT_Polling;
15125 Ratio_STA = BT_State*1000/BT_Polling;
15127 pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
15128 pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
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));
15133 if (Ratio_STA<60 && Ratio_Act<500) // BT PAN idle
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;
15141 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
15145 // Check if BT PAN (under BT 2.1) is uplink or downlink
15146 if ((Ratio_Act/Ratio_STA) < 2)
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;
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;
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;
15173 // Check BT is idle or not
15174 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15175 pBtMgnt->ExtConfig.NumberOfSCO==0)
15177 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15178 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15184 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15185 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15189 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15190 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15194 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15195 pBtMgnt->ExtConfig.NumberOfSCO==0)
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);
15203 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
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"));
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"));
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;
15224 if (!pBtMgnt->ExtConfig.bBTBusy)
15226 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
15230 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is non-idle\n"));
15233 if (!pBtMgnt->ExtConfig.bBTBusy)
15235 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
15237 if (MgntRoamingInProgress(pMgntInfo) ||
15238 MgntIsLinkInProgress(pMgntInfo) ||
15239 MgntScanInProgress(pMgntInfo))
15241 if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE)
15244 BTDM_SetAntenna(padapter, BTDM_ANT_WIFI);
15249 void BTDM_BTCoexistWithProfile1Ant(PADAPTER padapter)
15251 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15252 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15253 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15255 if (pBtMgnt->ExtConfig.bManualControl)
15257 btdm_CheckCounterOnly1Ant(padapter);
15261 RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
15262 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
15264 if ((pHalData->bt_coexist.BluetoothCoexist) &&
15265 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8))
15267 BTHCI_GetProfileNameMoto(padapter);
15268 BTHCI_GetBTRSSI(padapter);
15269 BTDM_CheckBTIdleChange1Ant(padapter);
15270 BTDM_CheckWiFiState(padapter);
15272 if (btdm_SCOAction1Ant(padapter))
15274 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action SCO\n"));
15276 else if (btdm_HIDAction1Ant(padapter))
15278 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID\n"));
15280 else if (btdm_A2DPAction1Ant(padapter))
15282 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action A2DP\n"));
15284 else if (btdm_PANAction1Ant(padapter))
15286 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN\n"));
15288 else if (btdm_HIDA2DPAction1Ant(padapter))
15290 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_A2DP\n"));
15292 else if (btdm_HIDPANAction1Ant(padapter))
15294 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_PAN\n"));
15296 else if (btdm_PANA2DPAction1Ant(padapter))
15298 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN_A2DP\n"));
15302 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No Action case!!!\n"));
15305 if (!BTDM_IsSameCoexistState(padapter))
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;
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"));
15354 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
15357 #ifdef __HALBTCCSR2ANT_C__ // HAL/BTCoexist/HalBtcCsr2Ant.c
15358 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
15360 //============================================================
15361 // local function start with btdm_
15362 //============================================================
15364 btdm_BtEnableDisableCheck(
15369 // This function check if 92D bt is disabled
15370 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15372 if (IS_HARDWARE_TYPE_8192D(padapter))
15376 pHalData->bt_coexist.btActiveZeroCnt = 0;
15377 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
15378 RTPRINT(FBT, BT_TRACE, ("92D Bt is enabled !!\n"));
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)
15387 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
15388 RTPRINT(FBT, BT_TRACE, ("92D Bt is disabled !!\n"));
15391 if (pHalData->bt_coexist.bPreBtDisabled !=
15392 pHalData->bt_coexist.bCurBtDisabled )
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;
15403 void btdm_CheckBTState2Ant(PADAPTER padapter)
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;
15416 RTPRINT(FBT, BT_TRACE, ("FirmwareVersion = 0x%x(%d)\n",
15417 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
15419 if (IS_HARDWARE_TYPE_8192C(padapter))
15421 if (pHalData->FirmwareVersion < FW_VER_BT_REG)
15423 regBTActive = REG_BT_ACTIVE_OLD;
15424 regBTState = REG_BT_STATE_OLD;
15425 regBTPolling = REG_BT_POLLING_OLD;
15429 regBTActive = REG_BT_ACTIVE;
15430 regBTState = REG_BT_STATE;
15431 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
15432 regBTPolling = REG_BT_POLLING1;
15434 regBTPolling = REG_BT_POLLING;
15437 else if (IS_HARDWARE_TYPE_8192D(padapter))
15439 regBTActive = REG_BT_ACTIVE;
15440 regBTState = REG_BT_STATE;
15441 regBTPolling = REG_BT_POLLING1;
15444 if (IS_HARDWARE_TYPE_8192D(padapter))
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;
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;
15461 BT_Polling = rtw_read32(padapter, regBTPolling);
15462 RTPRINT(FBT, BT_TRACE, ("BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
15464 if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
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
15474 btdm_BtEnableDisableCheck(padapter, BT_Active);
15476 Ratio_Act = BT_Active*1000/BT_Polling;
15477 Ratio_STA = BT_State*1000/BT_Polling;
15479 pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
15480 pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
15482 RTPRINT(FBT, BT_TRACE, ("Ratio_Act=%d\n", Ratio_Act));
15483 RTPRINT(FBT, BT_TRACE, ("Ratio_STA=%d\n", Ratio_STA));
15485 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15487 if (Ratio_STA < 60) // BT PAN idle
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;
15495 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
15497 // Check if BT PAN (under BT 2.1) is uplink or downlink
15498 if ((Ratio_Act/Ratio_STA) < 2)
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;
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;
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;
15523 // Check BT is idle or not
15524 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15525 pBtMgnt->ExtConfig.NumberOfSCO==0)
15527 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15528 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15532 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15534 if (Ratio_Act < 20)
15536 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15537 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15541 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15542 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15545 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15547 if (Ratio_STA < btBusyThresh)
15549 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
15550 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
15554 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
15555 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
15558 if ((Ratio_STA < btBusyThresh) ||
15559 (Ratio_Act<180 && Ratio_STA<130))
15561 pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
15562 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_A2DP_IDLE;
15566 pBtMgnt->ExtConfig.bBTA2DPBusy =_TRUE;
15567 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_A2DP_IDLE;
15572 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
15573 pBtMgnt->ExtConfig.NumberOfSCO==0)
15575 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15576 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
15580 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
15582 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_RSSI_LOW;
15583 RTPRINT(FBT, BT_TRACE, ("[bt rssi], Low\n"));
15587 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
15588 RTPRINT(FBT, BT_TRACE, ("[bt rssi], Normal\n"));
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;
15601 if (!pBtMgnt->ExtConfig.bBTBusy)
15604 RTPRINT(FBT, BT_TRACE, ("[BT] BT is idle or disable\n"));
15606 tempu1Byte = rtw_read8(padapter, 0x4fd);
15607 tempu1Byte |= BIT(2);
15609 rtw_write8(padapter, 0x4fd, tempu1Byte);
15611 //Resume RF Rx LPF corner
15612 if (IS_HARDWARE_TYPE_8192D(padapter))
15614 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, pHalData->bt_coexist.BtRfRegOrigin1E);
15618 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1E);
15620 BTDM_CoexAllOff(padapter);
15622 RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n"));
15624 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15629 RTPRINT(FBT, BT_TRACE, ("[BT] BT is non-idle\n"));
15631 tempu1Byte = rtw_read8(padapter, 0x4fd);
15632 tempu1Byte &=~ BIT(2);
15633 rtw_write8(padapter, 0x4fd, tempu1Byte);
15635 //Shrink RF Rx LPF corner
15636 if (IS_HARDWARE_TYPE_8192D(padapter))
15638 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, 0xf2ff7);
15642 //Shrink RF Rx LPF corner, 0x1e[7:4]=1111
15643 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, 0xf);
15650 if (pBtMgnt->ExtConfig.bBTBusy)
15652 BTDM_RejectAPAggregatedPacket(padapter, _TRUE);
15656 BTDM_RejectAPAggregatedPacket(padapter, _FALSE);
15661 void btdm_WLANActOff(PADAPTER padapter)
15663 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
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);
15671 void btdm_WLANActBTPrecedence(PADAPTER padapter)
15673 BTDM_Balance(padapter, _FALSE, 0, 0);
15674 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
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);
15682 //==============================================================
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().
15689 //==============================================================
15691 void btdm_DacSwing(PADAPTER padapter, u8 type)
15693 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15695 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
15698 if (type == BT_DACSWING_OFF)
15700 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing Off!\n"));
15701 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x30);
15703 else if (type == BT_DACSWING_M4)
15705 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW)
15707 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4 original, but Low RSSI!\n"));
15708 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
15712 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4!\n"));
15713 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x20);
15716 else if (type == BT_DACSWING_M7)
15718 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -7!\n"));
15719 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
15721 else if (type == BT_DACSWING_M10)
15723 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -10!\n"));
15724 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x10);
15727 if (type != BT_DACSWING_OFF)
15728 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
15731 void btdm_A2DPActionBC42Ant(PADAPTER padapter)
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);
15740 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15742 if (pBtMgnt->ExtConfig.bBTBusy)
15744 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15746 if (BTDM_IsHT40(padapter))
15748 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15749 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15752 // Do the FW mechanism first
15753 BTDM_FWCoexAllOff(padapter);
15755 // Do the FW mechanism first
15756 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
15762 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15764 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15765 BTDM_FWCoexAllOff(padapter);
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);
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)
15780 // Do the FW mechanism first
15781 BTDM_FWCoexAllOff(padapter);
15783 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
15789 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15791 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15792 BTDM_FWCoexAllOff(padapter);
15795 // Then do the SW mechanism
15796 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15797 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15799 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15800 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15801 btdm_DacSwing(padapter, BT_DACSWING_M4);
15805 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15806 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15807 btdm_DacSwing(padapter, BT_DACSWING_M4);
15813 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
15814 BTDM_CoexAllOff(padapter);
15818 void btdm_A2DPActionBC82Ant(PADAPTER padapter)
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);
15827 if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
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)
15834 // Do the FW mechanism first
15835 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
15841 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
15848 // Then do the SW mechanism
15849 if (BTDM_IsHT40(padapter))
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);
15858 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15859 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15860 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15862 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15863 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15864 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15868 BTDM_SWCoexAllOff(padapter);
15872 else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
15874 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15875 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15878 // Do the FW mechanism first
15879 BTDM_Balance(padapter, _FALSE, 0, 0);
15880 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15882 // Then do the SW mechanism
15883 BTDM_SWCoexAllOff(padapter);
15887 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
15888 BTDM_CoexAllOff(padapter);
15892 void btdm_A2DPActionBC82Ant92d(PADAPTER padapter)
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;
15901 if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15903 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15904 if (BTDM_IsHT40(padapter))
15906 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15907 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15911 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15912 if (BTDM_IsWifiUplink(padapter))
15914 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15915 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
15917 else if (BTDM_IsWifiDownlink(padapter))
15919 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15920 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_40, 0);
15923 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15924 if (!BTDM_IsCoexistStateChanged(padapter))
15927 // Do the FW mechanism first
15928 if (BTDM_IsWifiUplink(padapter))
15930 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15931 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15933 else if (BTDM_IsWifiDownlink(padapter))
15935 BTDM_Balance(padapter, _TRUE, 0x10, 0x18);
15936 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15939 // Then do the SW mechanism
15940 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15941 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15943 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15947 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15950 if (BTDM_IsHT40(padapter))
15952 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15953 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15957 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15958 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15960 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15961 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15965 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15966 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15970 else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
15972 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15973 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15976 // Do the FW mechanism first
15977 BTDM_Balance(padapter, _FALSE, 0, 0);
15978 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15980 // Then do the SW mechanism
15981 BTDM_SWCoexAllOff(padapter);
15985 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
15986 BTDM_CoexAllOff(padapter);
15990 u8 btdm_A2DPAction2Ant(PADAPTER padapter)
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;
15998 if (pBtDbg->dbgCtrl == _TRUE )
16000 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
16005 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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;
16016 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16018 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16019 btdm_A2DPActionBC42Ant(padapter);
16021 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16023 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16024 if (IS_HARDWARE_TYPE_8192D(padapter))
16025 btdm_A2DPActionBC82Ant92d(padapter);
16027 btdm_A2DPActionBC82Ant(padapter);
16037 void btdm_PANActionBC42Ant(PADAPTER padapter)
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);
16045 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16048 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
16050 if (pBtMgnt->BtOperationOn)
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);
16058 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16059 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
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);
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);
16072 BTDM_SWCoexAllOff(padapter);
16075 void btdm_PANActionBC82Ant(PADAPTER padapter)
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);
16084 if (pBtMgnt->BtOperationOn)
16086 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16087 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16090 BTDM_CoexAllOff(padapter);
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)
16099 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16101 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16103 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16104 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16106 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
16107 // Do the FW mechanism first
16108 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
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);
16114 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16116 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16117 BTDM_FWCoexAllOff(padapter);
16119 // Then do the SW mechanism
16120 if (BTDM_IsHT40(padapter))
16122 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16123 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16127 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16128 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16130 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16131 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16133 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16134 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16136 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16138 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16139 btdm_DacSwing(padapter, BT_DACSWING_M4);
16142 else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
16143 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
16145 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
16146 // Do the FW mechanism first
16147 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16149 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16151 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16152 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16154 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
16160 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16162 // Then do the SW mechanism
16163 if (BTDM_IsHT40(padapter))
16165 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16166 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16170 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16171 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16173 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16174 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16178 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
16179 // Do the FW mechanism first
16180 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16182 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16184 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16185 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16187 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16189 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16190 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16192 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16193 if (BTDM_IsHT40(padapter))
16195 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16196 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16200 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16201 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16204 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16206 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16207 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16210 // Then do the SW mechanism
16211 BTDM_SWCoexAllOff(padapter);
16214 else if (pBtMgnt->ExtConfig.bBTBusy &&
16215 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
16216 (BTDM_GetRxSS(padapter) < 30))
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);
16228 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16229 BTDM_CoexAllOff(padapter);
16234 void btdm_PANActionBC82Ant92d(PADAPTER padapter)
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;
16243 if (pBtMgnt->BtOperationOn)
16245 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16246 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16249 BTDM_CoexAllOff(padapter);
16253 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16254 if (BTDM_IsHT40(padapter))
16256 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16257 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16261 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16262 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
16264 btRssiState = BTDM_CheckCoexRSSIState(padapter, 3, BT_FW_COEX_THRESH_25, BT_FW_COEX_THRESH_50);
16265 if (!BTDM_IsCoexistStateChanged(padapter))
16268 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16270 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16272 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16273 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16275 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
16276 // Do the FW mechanism first
16277 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
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);
16283 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16285 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16286 BTDM_FWCoexAllOff(padapter);
16288 // Then do the SW mechanism
16289 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16290 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16292 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16296 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16298 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16299 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16301 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16302 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16304 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16306 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16307 btdm_DacSwing(padapter, BT_DACSWING_M4);
16310 else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
16311 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
16313 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
16314 // Do the FW mechanism first
16315 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16317 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16319 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16320 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16322 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
16328 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16330 // Then do the SW mechanism
16331 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16332 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16334 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16338 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16340 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16341 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16345 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
16346 // Do the FW mechanism first
16347 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
16349 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16351 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16352 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16354 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16356 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16357 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16359 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16360 if (BTDM_IsHT40(padapter))
16362 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16363 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
16367 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16368 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16371 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16373 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16374 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16377 // Then do the SW mechanism
16378 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16379 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16381 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16385 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16387 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16388 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16391 else if (pBtMgnt->ExtConfig.bBTBusy &&
16392 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
16393 (BTDM_GetRxSS(padapter) < 30))
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);
16405 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16406 BTDM_CoexAllOff(padapter);
16411 u8 btdm_PANAction2Ant(PADAPTER padapter)
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;
16419 if (pBtDbg->dbgCtrl == _TRUE )
16421 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
16426 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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;
16437 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16439 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16440 btdm_PANActionBC42Ant(padapter);
16442 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16444 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16445 if (IS_HARDWARE_TYPE_8192D(padapter))
16446 btdm_PANActionBC82Ant92d(padapter);
16448 btdm_PANActionBC82Ant(padapter);
16458 void btdm_HIDActionBC42Ant(PADAPTER padapter)
16460 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16461 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16462 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16464 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16467 if (BTDM_Legacy(padapter))
16469 RTPRINT(FBT, BT_TRACE, ("Current Wireless Mode is B/G\n"));
16470 btdm_WLANActBTPrecedence(padapter);
16472 else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16474 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16475 btdm_WLANActBTPrecedence(padapter);
16477 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16479 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16480 btdm_WLANActOff(padapter);
16482 else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
16484 RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
16485 btdm_WLANActOff(padapter);
16487 BTDM_SWCoexAllOff(padapter);
16490 void btdm_HIDActionBC82Ant(PADAPTER padapter)
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);
16499 #ifdef CONFIG_USB_HCI
16500 if (pHalData->CustomerID == RT_CID_PLANEX)
16502 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16504 btdm_HIDActionBC42Ant(padapter);
16509 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16511 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
16513 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16515 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
16518 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16521 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
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))
16528 BTDM_FWCoexAllOff(padapter);
16532 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
16538 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
16545 // Then do the SW mechanism
16546 BTDM_SWCoexAllOff(padapter);
16550 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16551 BTDM_CoexAllOff(padapter);
16555 void btdm_HIDActionBC82Ant92d(PADAPTER padapter)
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);
16564 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16566 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
16568 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16570 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
16573 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16576 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
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))
16582 // Do the FW mechanism first
16583 BTDM_FWCoexAllOff(padapter);
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);
16592 // Do the FW mechanism first
16593 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
16599 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
16605 // Then do the SW mechanism
16606 BTDM_SWCoexAllOff(padapter);
16611 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16612 BTDM_CoexAllOff(padapter);
16616 u8 btdm_HIDAction2Ant(PADAPTER padapter)
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;
16624 if (pBtDbg->dbgCtrl == _TRUE )
16626 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
16631 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
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;
16642 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16644 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16645 btdm_HIDActionBC42Ant(padapter);
16647 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16649 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16650 if (IS_HARDWARE_TYPE_8192D(padapter))
16651 btdm_HIDActionBC82Ant92d(padapter);
16653 btdm_HIDActionBC42Ant(padapter);
16663 void btdm_SCOActionBC42Ant(PADAPTER padapter)
16665 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16667 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16670 btdm_WLANActOff(padapter);
16671 BTDM_SWCoexAllOff(padapter);
16674 void btdm_SCOActionBC82Ant(PADAPTER padapter)
16676 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16679 if (BTDM_IsHT40(padapter))
16681 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
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);
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);
16696 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16697 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
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);
16705 // Then do the SW mechanism
16706 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16707 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16709 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16710 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16711 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16715 BTDM_SWCoexAllOff(padapter);
16720 void btdm_SCOActionBC82Ant92d(PADAPTER padapter)
16722 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16723 u8 btRssiState, rssiState1;
16725 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16726 if (BTDM_IsHT40(padapter))
16728 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
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);
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);
16743 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16744 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
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);
16752 // Then do the SW mechanism
16753 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16754 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16756 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16760 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16762 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16763 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16765 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16766 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16770 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16771 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16776 u8 btdm_SCOAction2Ant(PADAPTER padapter)
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;
16784 if (pBtDbg->dbgCtrl == _TRUE )
16786 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
16791 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
16796 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_SCOAction2Ant(), "));
16797 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
16799 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16801 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16802 btdm_SCOActionBC42Ant(padapter);
16804 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16806 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16807 if (IS_HARDWARE_TYPE_8192D(padapter))
16808 btdm_SCOActionBC82Ant92d(padapter);
16810 btdm_SCOActionBC82Ant(padapter);
16816 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
16821 void btdm_HIDA2DPActionBC42Ant(PADAPTER padapter)
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);
16830 if (pBtMgnt->ExtConfig.bBTBusy)
16832 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16834 if (BTDM_IsHT40(padapter))
16836 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16837 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16840 // Do the FW mechanism first
16841 BTDM_FWCoexAllOff(padapter);
16843 // Do the FW mechanism first
16844 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
16850 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16852 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16853 BTDM_FWCoexAllOff(padapter);
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);
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)
16868 // Do the FW mechanism first
16869 BTDM_FWCoexAllOff(padapter);
16871 // Do the FW mechanism first
16872 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
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);
16878 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16880 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16881 BTDM_FWCoexAllOff(padapter);
16885 // Then do the SW mechanism
16886 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16887 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16889 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16890 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16891 btdm_DacSwing(padapter, BT_DACSWING_M7);
16895 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16896 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16897 btdm_DacSwing(padapter, BT_DACSWING_M7);
16903 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16904 BTDM_CoexAllOff(padapter);
16908 void btdm_HIDA2DPActionBC82Ant(PADAPTER padapter)
16910 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16911 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16912 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16915 if (pBtMgnt->ExtConfig.bBTBusy)
16917 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16919 if (BTDM_IsHT40(padapter))
16921 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16922 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16925 // Do the FW mechanism first
16926 BTDM_FWCoexAllOff(padapter);
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);
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)
16940 BTDM_FWCoexAllOff(padapter);
16942 // Then do the SW mechanism
16943 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16944 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16946 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16947 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16948 btdm_DacSwing(padapter, BT_DACSWING_M7);
16952 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16953 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16954 btdm_DacSwing(padapter, BT_DACSWING_M7);
16960 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16961 BTDM_CoexAllOff(padapter);
16965 void btdm_HIDA2DPActionBC82Ant92d(PADAPTER padapter)
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;
16972 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_35, 0);
16973 if (pBtMgnt->ExtConfig.bBTBusy)
16975 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16977 if (BTDM_IsHT40(padapter))
16979 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16980 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16983 // Do the FW mechanism first
16984 BTDM_FWCoexAllOff(padapter);
16986 // Then do the SW mechanism
16987 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16988 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16990 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16994 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16996 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16997 btdm_DacSwing(padapter, BT_DACSWING_M7);
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)
17006 BTDM_FWCoexAllOff(padapter);
17008 // Then do the SW mechanism
17009 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
17010 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
17012 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
17016 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17018 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17019 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17021 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
17022 btdm_DacSwing(padapter, BT_DACSWING_M7);
17026 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17027 btdm_DacSwing(padapter, BT_DACSWING_M7);
17033 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
17034 BTDM_CoexAllOff(padapter);
17038 u8 btdm_HIDA2DPAction2Ant(PADAPTER padapter)
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;
17045 if (pBtDbg->dbgCtrl == _TRUE )
17047 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
17052 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
17058 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDA2DPAction2Ant(), "));
17059 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
17061 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17063 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17064 btdm_HIDA2DPActionBC42Ant(padapter);
17066 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17068 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17069 if (IS_HARDWARE_TYPE_8192D(padapter))
17070 btdm_HIDA2DPActionBC82Ant92d(padapter);
17072 btdm_HIDA2DPActionBC82Ant(padapter);
17078 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
17083 void btdm_HIDPANActionBC42Ant(PADAPTER padapter)
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);
17091 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17094 if (pBtMgnt->BtOperationOn)
17096 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17097 btdm_WLANActBTPrecedence(padapter);
17101 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17102 if (BTDM_Legacy(padapter))
17104 RTPRINT(FBT, BT_TRACE, ("B/G mode \n"));
17105 btdm_WLANActBTPrecedence(padapter);
17107 else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
17109 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink \n"));
17110 btdm_WLANActBTPrecedence(padapter);
17112 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
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);
17119 else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
17121 RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
17122 btdm_WLANActOff(padapter);
17125 BTDM_SWCoexAllOff(padapter);
17128 void btdm_HIDPANActionBC82Ant(PADAPTER padapter)
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);
17136 if (!pBtMgnt->BtOperationOn)
17138 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17140 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
17141 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17144 if ((pBtMgnt->ExtConfig.bBTBusy && padapter->mlmepriv.LinkDetectInfo.bBusyTraffic))
17146 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
17148 // Do the FW mechanism first
17149 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
17151 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
17152 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
17154 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
17156 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
17157 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
17159 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17161 // Then do the SW mechanism
17162 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17163 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17165 if (BTDM_IsHT40(padapter))
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);
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);
17182 BTDM_SWCoexAllOff(padapter);
17187 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
17188 BTDM_CoexAllOff(padapter);
17193 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17194 #ifdef CONFIG_USB_HCI
17195 if (BTDM_IsWifiUplink(padapter))
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);
17202 btdm_DacSwing(padapter, BT_DACSWING_M7);
17204 else if (BTDM_IsWifiDownlink(padapter))
17206 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
17207 if (pHalData->CustomerID == RT_CID_PLANEX)
17208 btdm_DacSwing(padapter, BT_DACSWING_M10);
17210 btdm_DacSwing(padapter, BT_DACSWING_M7);
17212 #elif defined(CONFIG_PCI_HCI)
17213 if (pBtMgnt->ExtConfig.bBTBusy)
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);
17223 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17224 btdm_DacSwing(padapter, BT_DACSWING_OFF);
17230 u8 btdm_HIDPANAction2Ant(PADAPTER padapter)
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;
17237 if (pBtDbg->dbgCtrl == _TRUE )
17239 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
17244 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
17250 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDPANAction2Ant(), "));
17251 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
17253 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17255 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17256 btdm_HIDPANActionBC42Ant(padapter);
17258 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17260 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17261 btdm_HIDPANActionBC82Ant(padapter);
17267 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
17273 void btdm_PANA2DPActionBC42Ant(PADAPTER padapter)
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);
17281 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17284 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
17285 if (pBtMgnt->BtOperationOn)
17287 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17289 if (pBtMgnt->ExtConfig.bBTBusy)
17291 RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
17292 BTDM_FWCoexAllOff(padapter);
17294 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17295 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17296 btdm_DacSwing(padapter, BT_DACSWING_M4);
17300 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17301 BTDM_CoexAllOff(padapter);
17306 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17307 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
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);
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);
17319 BTDM_SWCoexAllOff(padapter);
17323 void btdm_PANA2DPActionBC82Ant(PADAPTER padapter)
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);
17332 if (!pBtMgnt->BtOperationOn)
17334 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
17336 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
17337 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17340 if ((pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic))
17342 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
17344 // Do the FW mechanism first
17345 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
17347 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
17348 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
17350 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
17352 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
17353 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
17355 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
17357 // Then do the SW mechanism
17358 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
17359 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
17361 if (BTDM_IsHT40(padapter))
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);
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);
17378 BTDM_SWCoexAllOff(padapter);
17383 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
17384 BTDM_CoexAllOff(padapter);
17389 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
17390 if (pBtMgnt->ExtConfig.bBTBusy)
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);
17400 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
17401 btdm_DacSwing(padapter, BT_DACSWING_OFF);
17406 u8 btdm_PANA2DPAction2Ant(PADAPTER padapter)
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;
17413 if (pBtDbg->dbgCtrl == _TRUE )
17415 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
17420 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
17426 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_PANA2DPAction2Ant(), "));
17427 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
17429 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
17431 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
17432 btdm_PANA2DPActionBC42Ant(padapter);
17434 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
17436 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
17437 btdm_PANA2DPActionBC82Ant(padapter);
17443 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
17448 //============================================================
17449 // extern function start with BTDM_
17450 //============================================================
17452 void BTDM_SwCoexAllOff92C(PADAPTER padapter)
17454 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17455 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17456 btdm_DacSwing(padapter, BT_DACSWING_OFF);
17459 void BTDM_SwCoexAllOff92D(PADAPTER padapter)
17461 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
17462 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
17463 btdm_DacSwing(padapter, BT_DACSWING_OFF);
17475 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17476 u8 H2C_Parameter[3] = {0};
17478 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
17481 if ((pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW) &&
17482 (DACSwingLevel == 0x20))
17484 RTPRINT(FBT, BT_TRACE, ("[BT]DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n"));
17485 DACSwingLevel = 0x18;
17488 H2C_Parameter[2] = 0;
17489 H2C_Parameter[1] = DACSwingLevel;
17490 H2C_Parameter[0] = 0;
17493 H2C_Parameter[2] |= 0x01; //BIT0
17496 H2C_Parameter[2] |= 0x02; //BIT1
17498 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
17502 H2C_Parameter[2] |= 0x08; //BIT3
17503 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
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"));
17512 if (IS_HARDWARE_TYPE_8192C(padapter))
17514 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
17516 else if (IS_HARDWARE_TYPE_8192D(padapter))
17518 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
17522 void BTDM_BTCoexistWithProfile2Ant(PADAPTER padapter)
17524 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17525 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17526 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17528 if (pBtMgnt->ExtConfig.bManualControl)
17531 RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
17532 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
17534 if ((pHalData->bt_coexist.BluetoothCoexist) &&
17535 ((pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ||
17536 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
17538 BTHCI_GetProfileNameMoto(padapter);
17539 BTHCI_GetBTRSSI(padapter);
17540 btdm_CheckBTState2Ant(padapter);
17541 BTDM_CheckWiFiState(padapter);
17543 if (btdm_SCOAction2Ant(padapter))
17545 RTPRINT(FBT, BT_TRACE, ("Action SCO\n"));
17547 else if (btdm_HIDAction2Ant(padapter))
17549 RTPRINT(FBT, BT_TRACE, ("Action HID\n"));
17551 else if (btdm_A2DPAction2Ant(padapter))
17553 RTPRINT(FBT, BT_TRACE, ("Action A2DP\n"));
17555 else if (btdm_PANAction2Ant(padapter))
17557 RTPRINT(FBT, BT_TRACE, ("Action PAN\n"));
17559 else if (btdm_HIDA2DPAction2Ant(padapter))
17561 RTPRINT(FBT, BT_TRACE, ("Action HID_A2DP\n"));
17563 else if (btdm_HIDPANAction2Ant(padapter))
17565 RTPRINT(FBT, BT_TRACE, ("Action HID_PAN\n"));
17567 else if (btdm_PANA2DPAction2Ant(padapter))
17569 RTPRINT(FBT, BT_TRACE, ("Action PAN_A2DP\n"));
17573 RTPRINT(FBT, BT_TRACE, ("No Action Matched \n"));
17576 if (pHalData->bt_coexist.PreviousState != pHalData->bt_coexist.CurrentState)
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;
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"));
17625 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
17628 #ifdef __HALBTCOEXIST_C__ // HAL/BTCoexist/HalBtCoexist.c
17629 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
17631 //============================================================
17633 //============================================================
17634 void btdm_BTCoexistWithProfile(PADAPTER padapter)
17636 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17638 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17640 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 2 Ant mechanism\n"));
17641 BTDM_BTCoexistWithProfile2Ant(padapter);
17645 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 1 Ant mechanism\n"));
17646 BTDM_BTCoexistWithProfile1Ant(padapter);
17650 void btdm_ResetFWCoexState(PADAPTER padapter)
17652 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17654 pHalData->bt_coexist.CurrentState = 0;
17655 pHalData->bt_coexist.PreviousState = 0;
17658 void btdm_InitBtCoexistDM(PADAPTER padapter)
17660 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17662 // 20100415 Joseph: Restore RF register 0x1E and 0x1F value for further usage.
17663 if (IS_HARDWARE_TYPE_8723A(padapter))
17665 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
17667 else if (IS_HARDWARE_TYPE_8192D(padapter))
17669 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
17673 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, 0xf0);
17675 pHalData->bt_coexist.BtRfRegOrigin1F = PHY_QueryRFReg(padapter, PathA, RF_RCK2, 0xf0);
17677 pHalData->bt_coexist.CurrentState = 0;
17678 pHalData->bt_coexist.PreviousState = 0;
17680 BTDM_8723AInit(padapter);
17681 pHalData->bt_coexist.bInitlized = _TRUE;
17684 void btdm_FWCoexAllOff92C(PADAPTER padapter)
17686 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17688 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17690 BTDM_Balance(padapter, _FALSE, 0, 0);
17691 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
17695 BTDM_Balance(padapter, _FALSE, 0, 0);
17696 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
17700 void btdm_FWCoexAllOff92D(PADAPTER padapter)
17702 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17704 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
17706 BTDM_Balance(padapter, _FALSE, 0, 0);
17707 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
17711 BTDM_Balance(padapter, _FALSE, 0, 0);
17712 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
17717 btdm_BTCoexist8192C(
17721 PMGNT_INFO pMgntInfo = &(padapter->MgntInfo);
17722 PBT_MGNT pBtMgnt=GET_BT_INFO(padapter)->BtMgnt;
17724 if (pBtMgnt->bSupportProfile)
17726 RTPRINT(FBT, BT_TRACE, ("[DM][BT], profile notification co-exist mechanism\n"));
17727 btdm_BTCoexistWithProfile(padapter);
17731 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No profile notification!!\n"));
17735 u8 btdm_IsBTCoexistEnter(PADAPTER padapter)
17737 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
17738 struct mlme_priv *pmlmepriv;
17739 struct mlme_ext_priv *pmlmeext;
17741 PHAL_DATA_TYPE pHalData;
17745 pmlmepriv = &padapter->mlmepriv;
17746 pmlmeext = &padapter->mlmeextpriv;
17747 pHalData = GET_HAL_DATA(padapter);
17748 pBtMgnt = &pHalData->BtInfo.BtMgnt;
17751 RTPRINT(FBT, BT_TRACE, ("[DM][BT], padapter->interfaceIndex = %d\n",
17752 padapter->interfaceIndex));
17754 if (SINGLEMAC_SINGLEPHY == pHalData->MacPhyMode92D)
17756 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Single Mac & Single Phy\n"));
17758 else if (DUALMAC_SINGLEPHY == pHalData->MacPhyMode92D)
17760 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Dual Mac & Single Phy, do nothing!\n"));
17763 else if (DUALMAC_DUALPHY == pHalData->MacPhyMode92D)
17765 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Dual Mac & Dual Phy, do nothing!\n"));
17770 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Unknown Mac & Phy, do nothing!\n"));
17774 // switch (pHalData->RF_Type)
17775 switch (pHalData->rf_type)
17778 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 1T2R\n"));
17781 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 2T4R\n"));
17784 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 2T2R\n"));
17787 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RF 1T1R\n"));
17790 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Unknown RF type!\n"));
17795 RTPRINT(FBT, BT_TRACE, ("[DM][BT], CurrentBssWirelessMode=%d, \
17796 dot11CurrentWirelessMode=%d, Hal CurrentWirelessMode=%d \n", \
17797 pMgntInfo->CurrentBssWirelessMode, pMgntInfo->dot11CurrentWirelessMode,
17798 pHalData->CurrentWirelessMode));
17800 if (WIRELESS_MODE_N_5G == pMgntInfo->dot11CurrentWirelessMode ||
17801 WIRELESS_MODE_A == pMgntInfo->dot11CurrentWirelessMode)
17803 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 5G or A band, do nothing and disable all bt coex mechanism!\n"));
17804 BTDM_CoexAllOff(padapter);
17811 void btdm_BTCoexist8192D(PADAPTER padapter)
17813 PMGNT_INFO pMgntInfo = &(padapter->MgntInfo);
17814 PBT_MGNT pBtMgnt=GET_BT_INFO(padapter)->BtMgnt;
17815 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17817 if (!btdm_IsBTCoexistEnter(padapter))
17820 if ((pBtMgnt->bSupportProfile) ||
17821 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8))
17823 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8 &&
17824 !pBtMgnt->bSupportProfile)
17826 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM_Coexist(): Not specify condition\n"));
17829 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM_CoexistWithProfile()\n"));
17830 btdm_BTCoexistWithProfile(padapter);
17834 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No profile notification!!\n"));
17844 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17846 if (type == BT_AGCTABLE_OFF)
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);
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);
17897 pHalData->bt_coexist.b92DAgcTableOn = _FALSE;
17899 else if (type == BT_AGCTABLE_ON)
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);
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);
17950 pHalData->bt_coexist.b92DAgcTableOn = _TRUE;
17951 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
17955 //============================================================
17957 //============================================================
17958 void BTDM_CheckAntSelMode(PADAPTER padapter)
17961 if (!IS_HARDWARE_TYPE_8192C(padapter))
17963 BTDM_CheckBTIdleChange1Ant(padapter);
17967 u8 BTDM_NeedToRoamForBtEnableDisable(PADAPTER padapter)
17970 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
17972 if (IS_HARDWARE_TYPE_8192D(padapter))
17974 if (pHalData->bt_coexist.bNeedToRoamForBtDisableEnable)
17976 pHalData->bt_coexist.bNeedToRoamForBtDisableEnable = _FALSE;
17977 RTPRINT(FBT, BT_TRACE, ("92D bt need to roam caused by bt enable/disable!!!\n"));
17985 void BTDM_FwC2hBtRssi(PADAPTER padapter, u8 *tmpBuf)
17987 if (IS_HARDWARE_TYPE_8723A(padapter))
17988 BTDM_FwC2hBtRssi8723A(padapter, tmpBuf);
17991 void BTDM_FwC2hBtInfo(PADAPTER padapter, u8 *tmpBuf, u8 length)
17993 if (IS_HARDWARE_TYPE_8723A(padapter))
17994 BTDM_FwC2hBtInfo8723A(padapter, tmpBuf, length);
17997 void BTDM_DisplayBtCoexInfo(PADAPTER padapter)
17999 if (IS_HARDWARE_TYPE_8723A(padapter))
18000 BTDM_Display8723ABtCoexInfo(padapter);
18003 void BTDM_RejectAPAggregatedPacket(PADAPTER padapter, u8 bReject)
18006 PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
18007 PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);
18008 PRX_TS_RECORD pRxTs = NULL;
18013 // Do not allow receiving A-MPDU aggregation.
18014 if (pMgntInfo->IOTPeer == HT_IOT_PEER_CISCO)
18016 if (pHTInfo->bAcceptAddbaReq)
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);
18026 if (!pHTInfo->bAcceptAddbaReq)
18028 RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT Idle\n"));
18029 pHTInfo->bAcceptAddbaReq = _TRUE;
18035 if (pMgntInfo->IOTPeer == HT_IOT_PEER_CISCO)
18037 if (!pHTInfo->bAcceptAddbaReq)
18039 RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU \n"));
18040 pHTInfo->bAcceptAddbaReq = _TRUE;
18048 u8 BTDM_IsHT40(PADAPTER padapter)
18051 HT_CHANNEL_WIDTH bw;
18054 rtw_hal_get_hwreg(padapter, HW_VAR_BW_MODE, (pu8)(&bw));
18057 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18058 bw = pHalData->CurrentChannelBW;
18060 bw = padapter->mlmeextpriv.cur_bwmode;
18064 if (bw == HT_CHANNEL_WIDTH_20)
18068 else if (bw == HT_CHANNEL_WIDTH_40)
18076 u8 BTDM_Legacy(PADAPTER padapter)
18078 struct mlme_ext_priv *pmlmeext;
18079 u8 isLegacy = _FALSE;
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))
18090 void BTDM_CheckWiFiState(PADAPTER padapter)
18092 PHAL_DATA_TYPE pHalData;
18093 struct mlme_priv *pmlmepriv;
18098 pHalData = GET_HAL_DATA(padapter);
18099 pmlmepriv = &padapter->mlmepriv;
18100 pBTInfo = GET_BT_INFO(padapter);
18101 pBtMgnt = &pBTInfo->BtMgnt;
18103 if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
18105 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_IDLE;
18107 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
18109 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_UPLINK;
18113 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_UPLINK;
18116 if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
18118 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_DOWNLINK;
18122 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_DOWNLINK;
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;
18132 if (BTDM_Legacy(padapter))
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;
18140 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_LEGACY;
18141 if (BTDM_IsHT40(padapter))
18143 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT40;
18144 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT20;
18148 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT20;
18149 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT40;
18153 if (pBtMgnt->BtOperationOn)
18155 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT30;
18159 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT30;
18163 s32 BTDM_GetRxSS(PADAPTER padapter)
18165 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
18166 struct mlme_priv *pmlmepriv;
18167 PHAL_DATA_TYPE pHalData;
18168 s32 UndecoratedSmoothedPWDB = 0;
18171 pmlmepriv = &padapter->mlmepriv;
18172 pHalData = GET_HAL_DATA(padapter);
18174 // if (pMgntInfo->bMediaConnect) // Default port
18175 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
18177 UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(padapter);
18179 else // associated entry pwdb
18181 UndecoratedSmoothedPWDB = pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
18182 //pHalData->BT_EntryMinUndecoratedSmoothedPWDB
18184 RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxSS() = %d\n", UndecoratedSmoothedPWDB));
18185 return UndecoratedSmoothedPWDB;
18188 s32 BTDM_GetRxBeaconSS(PADAPTER padapter)
18190 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
18191 struct mlme_priv *pmlmepriv;
18192 PHAL_DATA_TYPE pHalData;
18193 s32 pwdbBeacon = 0;
18196 pmlmepriv = &padapter->mlmepriv;
18197 pHalData = GET_HAL_DATA(padapter);
18199 // if (pMgntInfo->bMediaConnect) // Default port
18200 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
18202 //pwdbBeacon = pHalData->dmpriv.UndecoratedSmoothedBeacon;
18203 pwdbBeacon= pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
18205 RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxBeaconSS() = %d\n", pwdbBeacon));
18209 // Get beacon rssi state
18211 BTDM_CheckCoexBcnRssiState(
18218 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18219 s32 pwdbBeacon = 0;
18222 pwdbBeacon = BTDM_GetRxBeaconSS(padapter);
18226 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
18228 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
18229 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
18231 if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18240 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
18241 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
18246 if (pwdbBeacon < RssiThresh)
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"));
18255 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
18256 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
18260 else if (levelNum == 3)
18262 if (RssiThresh > RssiThresh1)
18264 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON thresh error!!\n"));
18265 return pHalData->bt_coexist.preRssiStateBeacon;
18268 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
18269 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
18271 if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18281 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
18282 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
18285 else if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_MEDIUM) ||
18286 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_MEDIUM))
18288 if (pwdbBeacon >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
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"));
18296 else if (pwdbBeacon < RssiThresh)
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"));
18306 bcnRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18307 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Medium\n"));
18312 if (pwdbBeacon < RssiThresh1)
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"));
18322 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
18323 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
18328 pHalData->bt_coexist.preRssiStateBeacon = bcnRssiState;
18330 return bcnRssiState;
18334 BTDM_CheckCoexRSSIState1(
18341 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18342 s32 UndecoratedSmoothedPWDB = 0;
18345 UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
18349 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
18351 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
18352 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
18354 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18363 btRssiState = BT_RSSI_STATE_STAY_LOW;
18364 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
18369 if (UndecoratedSmoothedPWDB < RssiThresh)
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"));
18378 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18379 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
18383 else if (levelNum == 3)
18385 if (RssiThresh > RssiThresh1)
18387 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 thresh error!!\n"));
18388 return pHalData->bt_coexist.preRssiState1;
18391 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
18392 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
18394 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18404 btRssiState = BT_RSSI_STATE_STAY_LOW;
18405 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
18408 else if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_MEDIUM) ||
18409 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_MEDIUM))
18411 if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
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"));
18419 else if (UndecoratedSmoothedPWDB < RssiThresh)
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"));
18429 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18430 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Medium\n"));
18435 if (UndecoratedSmoothedPWDB < RssiThresh1)
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"));
18445 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18446 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
18451 pHalData->bt_coexist.preRssiState1 = btRssiState;
18453 return btRssiState;
18457 BTDM_CheckCoexRSSIState(
18464 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18465 s32 UndecoratedSmoothedPWDB = 0;
18468 UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
18472 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
18474 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
18475 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
18477 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18486 btRssiState = BT_RSSI_STATE_STAY_LOW;
18487 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
18492 if (UndecoratedSmoothedPWDB < RssiThresh)
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"));
18501 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18502 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
18506 else if (levelNum == 3)
18508 if (RssiThresh > RssiThresh1)
18510 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI thresh error!!\n"));
18511 return pHalData->bt_coexist.preRssiState;
18514 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
18515 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
18517 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
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"));
18527 btRssiState = BT_RSSI_STATE_STAY_LOW;
18528 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
18531 else if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_MEDIUM) ||
18532 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_MEDIUM))
18534 if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
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"));
18542 else if (UndecoratedSmoothedPWDB < RssiThresh)
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"));
18552 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
18553 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Medium\n"));
18558 if (UndecoratedSmoothedPWDB < RssiThresh1)
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"));
18568 btRssiState = BT_RSSI_STATE_STAY_HIGH;
18569 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
18574 pHalData->bt_coexist.preRssiState = btRssiState;
18576 return btRssiState;
18579 u8 BTDM_DisableEDCATurbo(PADAPTER padapter)
18581 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
18583 PHAL_DATA_TYPE pHalData;
18584 u8 bBtChangeEDCA = _FALSE;
18585 u32 EDCA_BT_BE = 0x5ea42b, cur_EDCA_reg;
18590 pHalData = GET_HAL_DATA(padapter);
18591 pBtMgnt = &pHalData->BtInfo.BtMgnt;
18593 if (!pHalData->bt_coexist.BluetoothCoexist)
18596 pHalData->bt_coexist.lastBtEdca = 0;
18599 if (!((pBtMgnt->bSupportProfile) ||
18600 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
18603 pHalData->bt_coexist.lastBtEdca = 0;
18607 if (BT_1Ant(padapter))
18610 pHalData->bt_coexist.lastBtEdca = 0;
18614 if (pHalData->bt_coexist.exec_cnt < 3)
18615 pHalData->bt_coexist.exec_cnt++;
18617 pHalData->bt_coexist.bEDCAInitialized = _TRUE;
18619 // When BT is non idle
18620 if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
18622 RTPRINT(FBT, BT_TRACE, ("BT state non idle, set bt EDCA\n"));
18624 //aggr_num = 0x0909;
18625 if (pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA == _TRUE)
18627 bBtChangeEDCA = _TRUE;
18628 pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
18629 // pHalData->bIsCurRDLState = _FALSE;
18630 pHalData->dmpriv.prv_traffic_idx = 3;
18632 cur_EDCA_reg = rtw_read32(padapter, REG_EDCA_BE_PARAM);
18634 if (cur_EDCA_reg != EDCA_BT_BE)
18636 bBtChangeEDCA = _TRUE;
18638 if (bBtChangeEDCA || !pHalData->bt_coexist.bEDCAInitialized)
18640 rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCA_BT_BE);
18641 pHalData->bt_coexist.lastBtEdca = EDCA_BT_BE;
18647 RTPRINT(FBT, BT_TRACE, ("BT state idle, set original EDCA\n"));
18648 pHalData->bt_coexist.lastBtEdca = 0;
18652 #ifdef CONFIG_PCI_HCI
18653 if (IS_HARDWARE_TYPE_8192C(padapter))
18655 // When BT is non idle
18656 if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
18665 if ((pHalData->bt_coexist.last_aggr_num != aggr_num) || !pHalData->bt_coexist.bEDCAInitialized)
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;
18685 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18686 u8 H2C_Parameter[3] = {0};
18690 H2C_Parameter[2] = 1;
18691 H2C_Parameter[1] = ms1;
18692 H2C_Parameter[0] = ms0;
18693 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
18697 H2C_Parameter[2] = 0;
18698 H2C_Parameter[1] = 0;
18699 H2C_Parameter[0] = 0;
18701 pHalData->bt_coexist.bBalanceOn = bBalanceOn;
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]));
18707 FillH2CCmd(padapter, 0xc, 3, H2C_Parameter);
18710 void BTDM_AGCTable(PADAPTER padapter, u8 type)
18712 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18714 if (IS_HARDWARE_TYPE_8192D(padapter))
18716 btdm_AgcTable92d(padapter, type);
18720 if (type == BT_AGCTABLE_OFF)
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);
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);
18736 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x10255);
18738 if (IS_HARDWARE_TYPE_8723A(padapter))
18739 pHalData->bt_coexist.b8723aAgcTableOn = _FALSE;
18741 else if (type == BT_AGCTABLE_ON)
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);
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);
18757 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x00255);
18759 if (IS_HARDWARE_TYPE_8723A(padapter))
18760 pHalData->bt_coexist.b8723aAgcTableOn = _TRUE;
18762 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
18766 void BTDM_BBBackOffLevel(PADAPTER padapter, u8 type)
18768 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18770 if (type == BT_BB_BACKOFF_OFF)
18772 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel Off!\n"));
18773 rtw_write32(padapter, 0xc04,0x3a05611);
18775 else if (type == BT_BB_BACKOFF_ON)
18777 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel On!\n"));
18778 rtw_write32(padapter, 0xc04,0x3a07611);
18779 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
18783 void BTDM_FWCoexAllOff(PADAPTER padapter)
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);;
18791 RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff()\n"));
18793 if (!pBtMgnt->bSupportProfile)
18796 if (pHalData->bt_coexist.bFWCoexistAllOff)
18798 RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff(), real Do\n"));
18801 if (IS_HARDWARE_TYPE_8192C(padapter))
18803 btdm_FWCoexAllOff92C(padapter);
18805 else if (IS_HARDWARE_TYPE_8192D(padapter))
18807 btdm_FWCoexAllOff92D(padapter);
18809 else if (IS_HARDWARE_TYPE_8723A(padapter))
18811 BTDM_FWCoexAllOff8723A(padapter);
18814 BTDM_FWCoexAllOff8723A(padapter);
18817 pHalData->bt_coexist.bFWCoexistAllOff = _TRUE;
18820 void BTDM_SWCoexAllOff(PADAPTER padapter)
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);;
18828 RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff()\n"));
18830 if (!pBtMgnt->bSupportProfile)
18833 if (pHalData->bt_coexist.bSWCoexistAllOff)
18835 RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff(), real Do\n"));
18837 if (IS_HARDWARE_TYPE_8192C(padapter))
18839 BTDM_SwCoexAllOff92C(padapter);
18841 else if (IS_HARDWARE_TYPE_8192D(padapter))
18843 BTDM_SwCoexAllOff92D(padapter);
18845 else if (IS_HARDWARE_TYPE_8723A(padapter))
18847 BTDM_SWCoexAllOff8723A(padapter);
18850 BTDM_SWCoexAllOff8723A(padapter);
18853 pHalData->bt_coexist.bSWCoexistAllOff = _TRUE;
18856 void BTDM_HWCoexAllOff(PADAPTER padapter)
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);;
18864 RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff()\n"));
18866 if (!pBtMgnt->bSupportProfile)
18869 if (pHalData->bt_coexist.bHWCoexistAllOff)
18871 RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff(), real Do\n"));
18873 if (IS_HARDWARE_TYPE_8723A(padapter))
18875 BTDM_HWCoexAllOff8723A(padapter);
18878 pHalData->bt_coexist.bHWCoexistAllOff = _TRUE;
18881 void BTDM_CoexAllOff(PADAPTER padapter)
18883 BTDM_FWCoexAllOff(padapter);
18884 BTDM_SWCoexAllOff(padapter);
18885 BTDM_HWCoexAllOff(padapter);
18888 void BTDM_TurnOffBtCoexistBeforeEnterLPS(PADAPTER padapter)
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;
18898 // Add temporarily.
18899 if ((!pHalData->bt_coexist.BluetoothCoexist) ||(!pBtMgnt->bSupportProfile))
18902 // 8723 1Ant doesn't need to turn off bt coexist mechanism.
18903 if (BTDM_1Ant8723A(padapter))
18906 if (IS_HARDWARE_TYPE_8192C(padapter) ||
18907 IS_HARDWARE_TYPE_8192D(padapter) ||
18908 IS_HARDWARE_TYPE_8723A(padapter))
18911 // Before enter LPS, turn off FW BT Co-exist mechanism
18913 if (ppwrctrl->bLeisurePs)
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);
18923 void BTDM_TurnOffBtCoexistBeforeEnterIPS(PADAPTER padapter)
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;
18932 if (!pHalData->bt_coexist.BluetoothCoexist)
18935 // 8723 1Ant doesn't need to turn off bt coexist mechanism.
18936 if (BTDM_1Ant8723A(padapter))
18939 if (IS_HARDWARE_TYPE_8192C(padapter) ||
18940 IS_HARDWARE_TYPE_8192D(padapter) ||
18941 IS_HARDWARE_TYPE_8723A(padapter))
18944 // Before enter IPS, turn off FW BT Co-exist mechanism
18946 // if (pPSC->bInactivePs)
18947 if (ppwrctrl->reg_rfoff == rf_on)
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);
18957 void BTDM_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
18959 if (IS_HARDWARE_TYPE_8723A(padapter))
18961 BTDM_8723ASignalCompensation(padapter, rssi_wifi, rssi_bt);
18964 #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)
18966 0. write 0xa3 = 0x05
18969 write 0xF6?1:0] = 0x01
18970 write 0x3A[7:0] = 0x31
18972 2. read 0xC0[31:0] == 0
18988 void dm_CheckBTState(_adapter *pAdapter)
18990 u8 value=0,regValue8=0;
18992 //_adapter *pAdapter = (_adapter*)context;
18994 // if (pAdapter->drv_in_test == CMCC_TEST)
18997 rtw_write8(pAdapter, 0xa3, 5);
18999 //DBG_8723A("------>%s,get 0xa3=%0x\n",__func__,rtw_read8(pAdapter, 0xa3));
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);
19007 rtw_write8(pAdapter, 0xf6, value);
19008 rtw_write8(pAdapter, 0x3A, 0x31);
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);
19016 rtw_write8(pAdapter, 0xcc, value);
19019 regValue8 = rtw_read8(pAdapter, 0x6b); //0x6b[28]
19020 //DBG_8723A("Get 0x6b = 0x%x\n",regValue8);
19022 if((regValue8 & 0x10) == 0x10){
19024 rtw_write8(pAdapter, 0x6b, regValue8);
19025 value = rtw_read8(pAdapter, 0xcc);
19027 rtw_write8(pAdapter, 0xcc, value);
19029 else if ((regValue8 & 0x10) == 0){
19031 rtw_write8(pAdapter, 0x6b, regValue8);
19032 value = rtw_read8(pAdapter, 0xcc);
19034 rtw_write8(pAdapter, 0xcc, value);
19037 //DBG_8723A("<------%s,get 0x6b=0x%0x,0xcc=0x%x\n",__func__,rtw_read8(pAdapter, 0x6b),rtw_read8(pAdapter, 0xcc));
19040 void check_bt_status_work(void *data)
19042 struct delayed_work *dwork;
19045 dwork = container_of(data, struct delayed_work, work);
19046 padapter = container_of(dwork, struct _ADAPTER, checkbt_work);
19049 DBG_8723A("%s padapter == NULL\n", __func__);
19053 dm_CheckBTState(padapter);
19056 void BTDM_Coexist(PADAPTER padapter)
19058 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19060 #if defined(CONFIG_CONCURRENT_MODE)
19061 if (padapter->adapter_type != PRIMARY_ADAPTER)
19063 RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE !!\n"));
19064 RTPRINT(FBT, BT_TRACE, ("[DM][BT], padapter->adapter_type != PRIMARY_ADAPTER !!\n"));
19069 if (!pHalData->bt_coexist.BluetoothCoexist)
19071 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT not exists!!\n"));
19075 if (!pHalData->bt_coexist.bInitlized)
19077 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_InitBtCoexistDM()\n"));
19078 btdm_InitBtCoexistDM(padapter);
19081 RTPRINT(FBT, BT_TRACE, ("\n\n[DM][BT], BTDM start!!\n"));
19083 BTDM_PWDBMonitor(padapter);
19085 if (IS_HARDWARE_TYPE_8723A(padapter))
19087 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 8723\n"));
19088 BTDM_BTCoexist8723A(padapter);
19091 else if (IS_HARDWARE_TYPE_8192C(padapter))
19093 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 88C\n"));
19094 btdm_BTCoexist8192C(padapter);
19096 else if (IS_HARDWARE_TYPE_8192D(padapter))
19098 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 92D\n"));
19099 btdm_BTCoexist8192D(padapter);
19102 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM end!!\n\n"));
19105 void BTDM_UpdateCoexState(PADAPTER padapter)
19107 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19109 if (!BTDM_IsSameCoexistState(padapter))
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;
19119 u8 BTDM_IsSameCoexistState(PADAPTER padapter)
19121 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19123 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
19129 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Coexist state changed!!\n"));
19134 void BTDM_PWDBMonitor(PADAPTER padapter)
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;
19144 if (pBtMgnt->BtOperationOn)
19146 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
19148 if (pBTInfo->BtAsocEntry[i].bUsed)
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;
19156 // Report every BT connection (HS mode) RSSI to FW
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));
19167 if (tmpBTEntryMaxPWDB != 0) // If associated entry is found
19169 pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = tmpBTEntryMaxPWDB;
19170 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMaxPWDB = 0x%x(%d)\n",
19171 tmpBTEntryMaxPWDB, tmpBTEntryMaxPWDB));
19175 pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = 0;
19177 if (tmpBTEntryMinPWDB != 0xff) // If associated entry is found
19179 pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = tmpBTEntryMinPWDB;
19180 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMinPWDB = 0x%x(%d)\n",
19181 tmpBTEntryMinPWDB, tmpBTEntryMinPWDB));
19185 pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = 0;
19190 u8 BTDM_DigByBtRssi(PADAPTER padapter)
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);
19197 PDM_ODM_T pDM_OutSrc = &pHalData->odmpriv;
19198 u8 digForBtHs=0, cckCcaThres=0;
19202 // When running under HS mode, use bt related Dig and cck threshold.
19204 if (pBtMgnt->BtOperationOn)
19206 if (pBtMgnt->bBTConnectInProgress)
19208 if (IS_HARDWARE_TYPE_8723A(padapter))
19216 // Decide DIG value by BT RSSI.
19218 digForBtHs = (u8)pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB;
19220 if (IS_HARDWARE_TYPE_8723A(padapter))
19221 digForBtHs += 0x04;
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;
19228 RTPRINT(FDM, DM_BT30, ("BTDM_DigByBtRssi(), digForBtHs=0x%x\n",
19231 ODM_Write_DIG(pDM_OutSrc, digForBtHs);
19234 // Decide cck packet threshold
19236 cckCcaThres = 0xcd;
19237 ODM_Write_CCK_CCA_Thres(pDM_OutSrc, cckCcaThres);
19245 u8 BTDM_IsBTBusy(PADAPTER padapter)
19247 PBT30Info pBTInfo = GET_BT_INFO(padapter);
19248 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
19250 if (pBtMgnt->ExtConfig.bBTBusy)
19256 u8 BTDM_IsWifiBusy(PADAPTER padapter)
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;
19264 if (pmlmepriv->LinkDetectInfo.bBusyTraffic ||
19265 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
19266 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
19272 u8 BTDM_IsCoexistStateChanged(PADAPTER padapter)
19274 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19276 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
19282 u8 BTDM_IsWifiUplink(PADAPTER padapter)
19284 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19285 struct mlme_priv *pmlmepriv;
19287 PBT_TRAFFIC pBtTraffic;
19290 pmlmepriv = &padapter->mlmepriv;
19291 pBTInfo = GET_BT_INFO(padapter);
19292 pBtTraffic = &pBTInfo->BtTraffic;
19294 if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
19295 (pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic))
19301 u8 BTDM_IsWifiDownlink(PADAPTER padapter)
19303 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19304 struct mlme_priv *pmlmepriv;
19306 PBT_TRAFFIC pBtTraffic;
19309 pmlmepriv = &padapter->mlmepriv;
19310 pBTInfo = GET_BT_INFO(padapter);
19311 pBtTraffic = &pBTInfo->BtTraffic;
19313 if ((pmlmepriv->LinkDetectInfo.bRxBusyTraffic) ||
19314 (pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic))
19320 u8 BTDM_IsBTHSMode(PADAPTER padapter)
19322 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
19323 PHAL_DATA_TYPE pHalData;
19327 pHalData = GET_HAL_DATA(padapter);
19328 pBtMgnt = &pHalData->BtInfo.BtMgnt;
19330 if (pBtMgnt->BtOperationOn)
19336 u8 BTDM_IsBTUplink(PADAPTER padapter)
19338 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19340 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
19346 u8 BTDM_IsBTDownlink(PADAPTER padapter)
19348 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19350 if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
19356 void BTDM_AdjustForBtOperation(PADAPTER padapter)
19358 RTPRINT(FBT, BT_TRACE, ("[BT][DM], BTDM_AdjustForBtOperation()\n"));
19359 if (IS_HARDWARE_TYPE_8723A(padapter))
19361 BTDM_AdjustForBtOperation8723A(padapter);
19365 u8 BTDM_AdjustRssiForAgcTableOn(PADAPTER padapter)
19367 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19369 if (!IS_HARDWARE_TYPE_8192D(padapter) &&
19370 !IS_HARDWARE_TYPE_8723A(padapter))
19373 if (pHalData->bt_coexist.b92DAgcTableOn)
19376 if (pHalData->bt_coexist.b8723aAgcTableOn)
19382 void BTDM_SetBtCoexCurrAntNum(PADAPTER padapter, u8 antNum)
19384 if (IS_HARDWARE_TYPE_8723A(padapter))
19385 BTDM_Set8723ABtCoexCurrAntNum(padapter, antNum);
19388 void BTDM_ForHalt(PADAPTER padapter)
19390 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19392 if (!pHalData->bt_coexist.BluetoothCoexist)
19397 if (IS_HARDWARE_TYPE_8723A(padapter))
19399 BTDM_ForHalt8723A(padapter);
19400 GET_HAL_DATA(padapter)->bt_coexist.bInitlized = _FALSE;
19404 void BTDM_WifiScanNotify(PADAPTER padapter, u8 scanType)
19406 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19408 if (!pHalData->bt_coexist.BluetoothCoexist)
19413 if (IS_HARDWARE_TYPE_8723A(padapter))
19414 BTDM_WifiScanNotify8723A(padapter, scanType);
19417 void BTDM_WifiAssociateNotify(PADAPTER padapter, u8 action)
19419 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19421 if (!pHalData->bt_coexist.BluetoothCoexist)
19426 if (IS_HARDWARE_TYPE_8723A(padapter))
19427 BTDM_WifiAssociateNotify8723A(padapter, action);
19430 void BTDM_MediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
19432 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19434 if (!pHalData->bt_coexist.BluetoothCoexist)
19439 if (IS_HARDWARE_TYPE_8723A(padapter))
19440 BTDM_MediaStatusNotify8723A(padapter, mstatus);
19443 void BTDM_ForDhcp(PADAPTER padapter)
19445 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19447 if (!pHalData->bt_coexist.BluetoothCoexist)
19452 if (IS_HARDWARE_TYPE_8723A(padapter))
19453 BTDM_ForDhcp8723A(padapter);
19456 void BTDM_ResetActionProfileState(PADAPTER padapter)
19458 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
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);
19465 u8 BTDM_IsActionSCO(PADAPTER padapter)
19467 PHAL_DATA_TYPE pHalData;
19474 pHalData = GET_HAL_DATA(padapter);
19475 pBTInfo = GET_BT_INFO(padapter);
19476 pBtMgnt = &pBTInfo->BtMgnt;
19477 pBtDbg = &pBTInfo->BtDbg;
19480 if (pBtDbg->dbgCtrl == _TRUE)
19482 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
19484 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
19490 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
19492 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
19499 u8 BTDM_IsActionHID(PADAPTER padapter)
19502 PHAL_DATA_TYPE pHalData;
19508 pHalData = GET_HAL_DATA(padapter);
19509 pBTInfo = GET_BT_INFO(padapter);
19510 pBtMgnt = &pBTInfo->BtMgnt;
19511 pBtDbg = &pBTInfo->BtDbg;
19514 if (pBtDbg->dbgCtrl == _TRUE )
19516 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
19518 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
19524 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19526 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
19533 u8 BTDM_IsActionA2DP(PADAPTER padapter)
19535 PHAL_DATA_TYPE pHalData;
19542 pHalData = GET_HAL_DATA(padapter);
19543 pBTInfo = GET_BT_INFO(padapter);
19544 pBtMgnt = &pBTInfo->BtMgnt;
19545 pBtDbg = &pBTInfo->BtDbg;
19548 if (pBtDbg->dbgCtrl == _TRUE )
19550 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
19552 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
19558 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19560 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
19567 u8 BTDM_IsActionPAN(PADAPTER padapter)
19569 PHAL_DATA_TYPE pHalData;
19576 pHalData = GET_HAL_DATA(padapter);
19577 pBTInfo = GET_BT_INFO(padapter);
19578 pBtMgnt = &pBTInfo->BtMgnt;
19579 pBtDbg = &pBTInfo->BtDbg;
19582 if (pBtDbg->dbgCtrl == _TRUE)
19584 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
19586 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
19592 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
19594 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
19601 u8 BTDM_IsActionHIDA2DP(PADAPTER padapter)
19603 PHAL_DATA_TYPE pHalData;
19610 pHalData = GET_HAL_DATA(padapter);
19611 pBTInfo = GET_BT_INFO(padapter);
19612 pBtMgnt = &pBTInfo->BtMgnt;
19613 pBtDbg = &pBTInfo->BtDbg;
19616 if (pBtDbg->dbgCtrl == _TRUE)
19618 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
19620 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
19626 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
19628 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
19635 u8 BTDM_IsActionHIDPAN(PADAPTER padapter)
19637 PHAL_DATA_TYPE pHalData;
19643 pHalData = GET_HAL_DATA(padapter);
19644 pBTInfo = GET_BT_INFO(padapter);
19645 pBtDbg = &pBTInfo->BtDbg;
19648 if (pBtDbg->dbgCtrl == _TRUE )
19650 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
19652 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
19658 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
19660 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
19667 u8 BTDM_IsActionPANA2DP(PADAPTER padapter)
19669 PHAL_DATA_TYPE pHalData;
19675 pHalData = GET_HAL_DATA(padapter);
19676 pBTInfo = GET_BT_INFO(padapter);
19677 pBtDbg = &pBTInfo->BtDbg;
19680 if (pBtDbg->dbgCtrl == _TRUE )
19682 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
19684 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
19690 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
19692 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
19699 u8 BTDM_IsBtDisabled(PADAPTER padapter)
19701 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19703 if (pHalData->bt_coexist.bCurBtDisabled)
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
19715 //============================================
19716 void WA_BTDM_EnableBTFwCounterPolling(PADAPTER padapter)
19718 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19720 // Currently, only 88cu and 92de need to enter the function
19721 if (!IS_HARDWARE_TYPE_8192CU(padapter) &&
19722 !IS_HARDWARE_TYPE_8192DE(padapter))
19725 if (!pHalData->bt_coexist.BluetoothCoexist)
19732 // Enable BT firmware counter statistics.
19733 // We have to set 0x550[3]=1 to enable it.
19734 // Advised by Scott.
19737 u1val = rtw_read8(padapter, REG_BCN_CTRL);
19739 rtw_write8(padapter, REG_BCN_CTRL, u1val);
19743 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
19746 #ifdef __HALBT_C__ // HAL/HalBT.c
19747 // ===== Below this line is sync from SD7 driver HAL/HalBT.c =====
19749 //==================================================
19751 //==================================================
19753 static void halbt_SetBTSwitchCtrl(PADAPTER padapter)
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);
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);
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);
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);
19774 static void halbt_InitHwConfig8723A(PADAPTER padapter)
19778 //==================================================
19780 //==================================================
19781 u8 HALBT_GetPGAntNum(PADAPTER padapter)
19783 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19785 return pHalData->bt_coexist.BT_Ant_Num;
19788 void HALBT_SetKey(PADAPTER padapter, u8 EntryNum)
19791 PBT_ASOC_ENTRY pBtAssocEntry;
19795 pBTinfo = GET_BT_INFO(padapter);
19796 pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
19798 pBtAssocEntry->HwCAMIndex = BT_HWCAM_STAR + EntryNum;
19800 usConfig = CAM_VALID | (CAM_AES << 2);
19801 write_cam(padapter, pBtAssocEntry->HwCAMIndex, usConfig, pBtAssocEntry->BTRemoteMACAddr, pBtAssocEntry->PTK + TKIP_ENC_KEY_POS);
19804 void HALBT_RemoveKey(PADAPTER padapter, u8 EntryNum)
19807 PBT_ASOC_ENTRY pBtAssocEntry;
19809 pBTinfo = GET_BT_INFO(padapter);
19810 pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
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;
19820 void HALBT_InitBTVars8723A(PADAPTER padapter)
19822 PHAL_DATA_TYPE pHalData;
19825 pHalData = GET_HAL_DATA(padapter);
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;
19833 RT_TRACE(_module_hal_init_c_, _drv_info_, ("BT Coexistance = 0x%x\n", pHalData->bt_coexist.BluetoothCoexist));
19834 if (pHalData->bt_coexist.BluetoothCoexist)
19836 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
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__);
19842 else if (pHalData->bt_coexist.BT_Ant_Num == Ant_x1)
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__);
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;
19854 RT_TRACE(_module_hal_init_c_, _drv_info_,("BT_RadioSharedType = 0x%x\n", pHalData->bt_coexist.BT_RadioSharedType));
19858 u8 HALBT_IsBTExist(PADAPTER padapter)
19860 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19862 if (pHalData->bt_coexist.BluetoothCoexist)
19868 u8 HALBT_BTChipType(PADAPTER padapter)
19870 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19872 return pHalData->bt_coexist.BT_CoexistType;
19875 void HALBT_InitHwConfig(PADAPTER padapter)
19878 if (IS_HARDWARE_TYPE_8192C(padapter))
19880 halbt_InitHwConfig92C(padapter);
19882 else if (IS_HARDWARE_TYPE_8192D(padapter))
19884 halbt_InitHwConfig92D(padapter);
19886 else if (IS_HARDWARE_TYPE_8723A(padapter))
19889 halbt_InitHwConfig8723A(padapter);
19890 BTDM_Coexist(padapter);
19894 void HALBT_IPSRFOffCheck(PADAPTER padapter)
19898 PHAL_DATA_TYPE pHalData;
19901 pBTinfo = GET_BT_INFO(padapter);
19902 pBtMgnt = &pBTinfo->BtMgnt;
19903 pHalData = GET_HAL_DATA(padapter);
19905 if (IS_HARDWARE_TYPE_8192C(padapter) ||
19906 IS_HARDWARE_TYPE_8192D(padapter) ||
19907 IS_HARDWARE_TYPE_8723A(padapter))
19909 if ((pHalData->bt_coexist.BluetoothCoexist) &&
19910 (pBtMgnt->bSupportProfile))
19912 RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_IPSRFOffCheck(), turn off all Coexist DM\n"));
19913 BTDM_CoexAllOff(padapter);
19918 void HALBT_LPSRFOffCheck(PADAPTER padapter)
19922 PHAL_DATA_TYPE pHalData;
19925 pBTinfo = GET_BT_INFO(padapter);
19926 pBtMgnt = &pBTinfo->BtMgnt;
19927 pHalData = GET_HAL_DATA(padapter);
19929 if (IS_HARDWARE_TYPE_8192C(padapter) ||
19930 IS_HARDWARE_TYPE_8192D(padapter) ||
19931 IS_HARDWARE_TYPE_8723A(padapter))
19933 if ((pHalData->bt_coexist.BluetoothCoexist) &&
19934 (pBtMgnt->bSupportProfile))
19936 RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_LPSRFOffCheck(), turn off all Coexist DM\n"));
19937 BTDM_CoexAllOff(padapter);
19942 void HALBT_SetRtsCtsNoLenLimit(PADAPTER padapter)
19944 #if (RTS_CTS_NO_LEN_LIMIT == 1)
19945 rtw_write32(padapter, 0x4c8, 0xc140402);
19949 u8 HALBT_OnlySupport1T(PADAPTER padapter)
19952 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
19954 if (IS_HARDWARE_TYPE_8192DE(padapter))
19956 if ((SINGLEMAC_SINGLEPHY == pHalData->MacPhyMode92D) &&
19957 (pHalData->bt_coexist.BluetoothCoexist) &&
19958 (pHalData->CurrentBandType92D==BAND_ON_2_4G) &&
19959 (!pHalData->bt_coexist.bCurBtDisabled))
19961 RTPRINT(FIOCTL, IOCTL_STATE, ("[92d], 1T condition!!\n"));
19965 RTPRINT(FIOCTL, IOCTL_STATE, ("[92d], 2T condition!!\n"));
19980 u8 H2C_Parameter[5] = {0};
19982 if (IS_HARDWARE_TYPE_8723A(padapter))
19985 //FillH2CCmd(padapter, 0xaf, 5, H2C_Parameter);
19989 *pRetVal = 0xffffffff;
19996 void HALBT_SwitchWirelessMode(PADAPTER padapter, u8 targetWirelessMode)
19999 PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
20002 if (!IS_HARDWARE_TYPE_8192D(padapter))
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);
20010 if ((targetWirelessMode == WIRELESS_MODE_N_5G) ||
20011 (targetWirelessMode == WIRELESS_MODE_A))
20014 band = BAND_ON_2_4G;
20015 rtw_hal_set_hwreg(padapter, HW_VAR_DUAL_SWITCH_BAND, &band);
20020 // ===== End of sync from SD7 driver HAL/HalBT.c =====