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 #define PlatformInitializeWorkItem(padapter, pwi, pfunc, cntx, szID) \
141 _init_workitem(pwi, pfunc, padapter)
142 #define PlatformFreeWorkItem(...)
143 #define PlatformScheduleWorkItem(pwork) _set_workitem(pwork)
144 #define GET_UNDECORATED_AVERAGE_RSSI(padapter) \
145 (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB)
146 #define RT_RF_CHANGE_SOURCE u32
148 typedef enum _RT_JOIN_ACTION{
157 #define IPSReturn(padapter, b) ips_enter(padapter)
158 #define IPSDisable(padapter, b, c) ips_leave(padapter)
160 #define IPSReturn(...)
161 #define IPSDisable(...)
164 #define LeisurePSLeave(padapter, b) LPS_Leave(padapter)
166 #define LeisurePSLeave(...)
169 #ifdef __BT_C__ // COMMOM/BT.c
170 // ===== Below this line is sync from SD7 driver COMMOM/BT.c =====
172 u8 BT_Operation(PADAPTER padapter)
174 PBT30Info pBTInfo = GET_BT_INFO(padapter);
175 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
177 if (pBtMgnt->BtOperationOn)
183 u8 BT_IsLegalChannel(PADAPTER padapter, u8 channel)
185 PRT_CHANNEL_INFO pChanneList = NULL;
189 pChanneList = padapter->mlmeextpriv.channel_set;
190 channelLen = padapter->mlmeextpriv.max_chan_nums;
192 for (i = 0; i < channelLen; i++)
194 RTPRINT(FIOCTL, IOCTL_STATE, ("Check if chnl(%d) in channel plan contains bt target chnl(%d) for BT connection\n", pChanneList[i].ChannelNum, channel));
195 if ((channel == pChanneList[i].ChannelNum) ||
196 (channel == pChanneList[i].ChannelNum + 2))
204 void BT_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
206 BTDM_SignalCompensation(padapter, rssi_wifi, rssi_bt);
209 void BT_WifiScanNotify(PADAPTER padapter, u8 scanType)
211 BTHCI_WifiScanNotify(padapter, scanType);
212 BTDM_CheckAntSelMode(padapter);
213 BTDM_WifiScanNotify(padapter, scanType);
216 void BT_WifiAssociateNotify(PADAPTER padapter, u8 action)
219 // TRUE = associate start
220 // FALSE = associate finished
222 BTDM_CheckAntSelMode(padapter);
224 BTDM_WifiAssociateNotify(padapter, action);
227 void BT_WifiMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
229 BTDM_MediaStatusNotify(padapter, mstatus);
232 void BT_SpecialPacketNotify(PADAPTER padapter)
234 BTDM_ForDhcp(padapter);
237 void BT_HaltProcess(PADAPTER padapter)
239 BTDM_ForHalt(padapter);
242 void BT_LpsLeave(PADAPTER padapter)
244 BTDM_LpsLeave(padapter);
247 // ===== End of sync from SD7 driver COMMOM/BT.c =====
250 #ifdef __BT_HANDLEPACKET_C__ // COMMOM/bt_handlepacket.c
251 // ===== Below this line is sync from SD7 driver COMMOM/bt_handlepacket.c =====
253 void btpkt_SendBeacon(PADAPTER padapter)
257 void BTPKT_WPAAuthINITIALIZE(PADAPTER padapter, u8 EntryNum)
261 void BTPKT_TimerCallbackWPAAuth(PRT_TIMER pTimer)
265 void BTPKT_TimerCallbackBeacon(PRT_TIMER pTimer)
267 PADAPTER padapter = (PADAPTER)pTimer;
268 PBT30Info pBTinfo = GET_BT_INFO(padapter);
269 PBT_MGNT pBtMgnt = &pBTinfo->BtMgnt;
271 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("=====> BTPKT_TimerCallbackBeacon\n"));
273 if (!pBTinfo->BTBeaconTmrOn)
276 if (pBtMgnt->BtOperationOn)
278 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("btpkt_SendBeacon\n"));
279 btpkt_SendBeacon(GetDefaultAdapter(padapter));
280 PlatformSetTimer(padapter, &pBTinfo->BTBeaconTimer, 100);
284 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("<===== BTPKT_TimerCallbackBeacon\n"));
289 // ===== End of sync from SD7 driver COMMOM/bt_handlepacket.c =====
292 #ifdef __BT_HCI_C__ // COMMOM/bt_hci.c
295 #define UINT64_C(v) (v)
297 #define FillOctetString(_os,_octet,_len) \
298 (_os).Octet=(u8*)(_octet); \
301 static RT_STATUS PlatformIndicateBTEvent(
307 RT_STATUS rt_status = RT_STATUS_FAILURE;
308 #ifdef PLATFORM_WINDOWS
309 NTSTATUS nt_status = STATUS_SUCCESS;
311 u32 BytesTransferred = 0;
314 RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event start, %d bytes data to Transferred!!\n", dataLen));
315 RTPRINT_DATA(FIOCTL, IOCTL_BT_EVENT_DETAIL, "To transfer Hex Data :\n",
318 // if (pGBTDeviceExtension==NULL || pGBTDeviceExtension->padapter!=padapter)
321 BT_EventParse(padapter, pEvntData, dataLen);
323 #ifdef PLATFORM_LINUX
325 printk(KERN_WARNING "%s: Linux has no way to report BT event!!\n", __FUNCTION__);
327 #elif defined(PLATFORM_WINDOWS)
329 pIrp = IOCTL_BtIrpDequeue(pGBTDeviceExtension, IRP_HCI_EVENT_Q);
337 outbuf = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, HighPagePriority);
340 RTPRINT(FIOCTL, IOCTL_IRP, ("PlatformIndicateBTEvent(), error!! MdlAddress = NULL!!\n"));
341 BytesTransferred = 0;
342 nt_status = STATUS_UNSUCCESSFUL;
346 outlen = MmGetMdlByteCount(pIrp->MdlAddress);
347 offset = MmGetMdlByteOffset(pIrp->MdlAddress);
349 if(dataLen <= outlen)
350 BytesTransferred = dataLen;
352 BytesTransferred = outlen;
353 _rtw_memcpy(outbuf, pEvntData, BytesTransferred);
354 nt_status = STATUS_SUCCESS;
356 RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event, %d bytes data Transferred!!\n", BytesTransferred));
357 RTPRINT_DATA(FIOCTL, (IOCTL_BT_EVENT_DETAIL|IOCTL_BT_LOGO), "BT EVENT Hex Data :\n",
358 outbuf, BytesTransferred);
360 IOCTL_CompleteSingleIRP(pIrp, nt_status, BytesTransferred);
361 if (nt_status == STATUS_SUCCESS)
362 rt_status = RT_STATUS_SUCCESS;
365 #endif // PLATFORM_WINDOWS
367 RTPRINT(FIOCTL, IOCTL_BT_EVENT_DETAIL, ("BT event end, %s\n",
368 (rt_status == RT_STATUS_SUCCESS)? "SUCCESS":"FAIL"));
373 // ===== Below this line is sync from SD7 driver COMMOM/bt_hci.c =====
375 u8 testPMK[PMK_LEN] = {2,2,3,3,4,4,5,5,6,6,
376 7,7,8,8,9,9,2,2,3,3,
377 4,4,2,2,8,8,9,9,2,2,
380 static u8 bthci_GetLocalChannel(PADAPTER padapter)
382 return padapter->mlmeextpriv.cur_channel;
385 static u8 bthci_GetCurrentEntryNum(PADAPTER padapter, u8 PhyHandle)
387 PBT30Info pBTInfo = GET_BT_INFO(padapter);
390 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
392 if ((pBTInfo->BtAsocEntry[i].bUsed == _TRUE) && (pBTInfo->BtAsocEntry[i].PhyLinkCmdData.BtPhyLinkhandle == PhyHandle))
401 static void bthci_DecideBTChannel(PADAPTER padapter, u8 EntryNum)
403 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
404 struct mlme_priv *pmlmepriv;
407 PBT_HCI_INFO pBtHciInfo;
408 PCHNL_TXPOWER_TRIPLE pTriple_subband = NULL;
409 PCOMMON_TRIPLE pTriple;
410 u8 i, j, localchnl, firstRemoteLegalChnlInTriplet=0, regulatory_skipLen=0;
411 u8 subbandTripletCnt = 0;
414 pmlmepriv = &padapter->mlmepriv;
415 pBTInfo = GET_BT_INFO(padapter);
416 pBtMgnt = &pBTInfo->BtMgnt;
417 pBtHciInfo = &pBTInfo->BtHciInfo;
419 pBtMgnt->CheckChnlIsSuit = _TRUE;
420 localchnl = bthci_GetLocalChannel(padapter);
423 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
425 // contains country string, len is 3
426 for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
429 // check every triplet, an triplet may be
430 // regulatory extension identifier or sub-band triplet
432 if (pTriple->byte_1st == 0xc9) // Regulatory Extension Identifier, skip it
434 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find Regulatory ID, regulatory class = %d\n", pTriple->byte_2nd));
435 regulatory_skipLen += 3;
436 pTriple_subband = NULL;
439 else // Sub-band triplet
441 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find Sub-band triplet \n"));
443 pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
445 // if remote first legal channel not found, then find first remote channel
446 // and it's legal for our channel plan.
449 // search the sub-band triplet and find if remote channel is legal to our channel plan.
450 for (j = pTriple_subband->FirstChnl; j < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls); j++)
452 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), (" Check if chnl(%d) is legal\n", j));
453 if (BT_IsLegalChannel(padapter, j)) // remote channel is legal for our channel plan.
455 firstRemoteLegalChnlInTriplet = j;
456 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Find first remote legal channel : %d\n", firstRemoteLegalChnlInTriplet));
459 // If we find a remote legal channel in the sub-band triplet
460 // and only BT connection is established(local not connect to any AP or IBSS),
461 // then we just switch channel to remote channel.
464 if (!(check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE ||
465 BTHCI_HsConnectionEstablished(padapter)))
467 pBtMgnt->BTChannel = firstRemoteLegalChnlInTriplet;
468 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Remote legal channel (%d) is selected, Local not connect to any!!\n", pBtMgnt->BTChannel));
473 if ((localchnl >= firstRemoteLegalChnlInTriplet) &&
474 (localchnl < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls)))
476 pBtMgnt->BTChannel = localchnl;
477 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Local channel (%d) is selected, wifi or BT connection exists\n", pBtMgnt->BTChannel));
488 if (subbandTripletCnt)
490 //if any preferred channel triplet exists
491 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("There are %d sub band triplet exists, ", subbandTripletCnt));
492 if (firstRemoteLegalChnlInTriplet == 0)
494 //no legal channel is found, reject the connection.
495 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("no legal channel is found!!\n"));
499 // Remote Legal channel is found but not match to local
500 //(wifi connection exists), so reject the connection.
501 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Remote Legal channel is found but not match to local(wifi connection exists)!!\n"));
503 pBtMgnt->CheckChnlIsSuit = _FALSE;
507 // There are not any preferred channel triplet exists
508 // Use current legal channel as the bt channel.
509 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("No sub band triplet exists!!\n"));
511 pBtMgnt->BTChannel = localchnl;
512 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Local channel (%d) is selected!!\n", pBtMgnt->BTChannel));
517 //Success:return _TRUE
519 static u8 bthci_GetAssocInfo(PADAPTER padapter, u8 EntryNum)
521 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
523 PBT_HCI_INFO pBtHciInfo;
526 u8 BaseMemoryShift = 0;
529 PAMP_ASSOC_STRUCTURE pAmpAsoc;
532 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo start\n"));
534 pBTInfo = GET_BT_INFO(padapter);
535 pBtHciInfo = &pBTInfo->BtHciInfo;
537 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar == 0)
540 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen < (MAX_AMP_ASSOC_FRAG_LEN))
541 TotalLen = pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen;
542 else if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen == (MAX_AMP_ASSOC_FRAG_LEN))
543 TotalLen = MAX_AMP_ASSOC_FRAG_LEN;
545 else if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar > 0)
546 TotalLen = pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar;
548 while ((pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar >= BaseMemoryShift) || TotalLen > BaseMemoryShift)
550 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("GetAssocInfo, TotalLen=%d, BaseMemoryShift=%d\n",TotalLen,BaseMemoryShift));
552 (u8*)pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment+BaseMemoryShift,
553 TotalLen-BaseMemoryShift);
554 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, "GetAssocInfo :\n",
555 tempBuf, TotalLen-BaseMemoryShift);
557 pAmpAsoc = (PAMP_ASSOC_STRUCTURE)tempBuf;
558 pAmpAsoc->Length = EF2Byte(pAmpAsoc->Length);
559 BaseMemoryShift += 3 + pAmpAsoc->Length;
561 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("TypeID = 0x%x, ", pAmpAsoc->TypeID));
562 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, "Hex Data: \n", pAmpAsoc->Data, pAmpAsoc->Length);
563 switch (pAmpAsoc->TypeID)
567 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_MAC_ADDR\n"));
568 if (pAmpAsoc->Length > 6)
573 _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, pAmpAsoc->Data,6);
574 RTPRINT_ADDR(FIOCTL, IOCTL_BT_HCICMD, ("Remote Mac address \n"), pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr);
578 case AMP_PREFERRED_CHANNEL_LIST:
580 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_PREFERRED_CHANNEL_LIST\n"));
581 pBtHciInfo->BtPreChnlListLen=pAmpAsoc->Length;
582 _rtw_memcpy(pBtHciInfo->BTPreChnllist,
584 pBtHciInfo->BtPreChnlListLen);
585 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, "Preferred channel list : \n", pBtHciInfo->BTPreChnllist, pBtHciInfo->BtPreChnlListLen);
586 bthci_DecideBTChannel(padapter,EntryNum);
590 case AMP_CONNECTED_CHANNEL:
592 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_CONNECTED_CHANNEL\n"));
593 pBtHciInfo->BTConnectChnlListLen=pAmpAsoc->Length;
594 _rtw_memcpy(pBtHciInfo->BTConnectChnllist,
596 pBtHciInfo->BTConnectChnlListLen);
601 case AMP_80211_PAL_CAP_LIST:
604 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> AMP_80211_PAL_CAP_LIST\n"));
605 pBTInfo->BtAsocEntry[EntryNum].BTCapability=*(u32 *)(pAmpAsoc->Data);
606 if (pBTInfo->BtAsocEntry[EntryNum].BTCapability && 0x00000001)
610 //Signifies PAL capable of utilizing received activity reports.
612 if (pBTInfo->BtAsocEntry[EntryNum].BTCapability && 0x00000002)
615 //Signifies PAL is capable of utilizing scheduling information received in an activity reports.
620 case AMP_80211_PAL_VISION:
622 pBtHciInfo->BTPalVersion=*(u8 *)(pAmpAsoc->Data);
623 pBtHciInfo->BTPalCompanyID=*(u16 *)(((u8 *)(pAmpAsoc->Data))+1);
624 pBtHciInfo->BTPalsubversion=*(u16 *)(((u8 *)(pAmpAsoc->Data))+3);
625 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("==> AMP_80211_PAL_VISION PalVersion 0x%x, PalCompanyID 0x%x, Palsubversion 0x%x\n",
626 pBtHciInfo->BTPalVersion,
627 pBtHciInfo->BTPalCompanyID,
628 pBtHciInfo->BTPalsubversion));
633 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("==> Unsupport TypeID !!\n"));
638 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("GetAssocInfo end\n"));
643 static u8 bthci_AddEntry(PADAPTER padapter)
650 pBTInfo = GET_BT_INFO(padapter);
651 pBtMgnt = &pBTInfo->BtMgnt;
653 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
655 if (pBTInfo->BtAsocEntry[i].bUsed == _FALSE)
657 pBTInfo->BtAsocEntry[i].bUsed = _TRUE;
658 pBtMgnt->CurrentConnectEntryNum = i;
663 if (i == MAX_BT_ASOC_ENTRY_NUM)
665 RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_AddEntry(), Add entry fail!!\n"));
671 static u8 bthci_DiscardTxPackets(PADAPTER padapter, u16 LLH)
677 bthci_CheckLogLinkBehavior(
679 HCI_FLOW_SPEC TxFlowSpec
682 u8 ID = TxFlowSpec.Identifier;
683 u8 ServiceType = TxFlowSpec.ServiceType;
684 u16 MaxSDUSize = TxFlowSpec.MaximumSDUSize;
685 u32 SDUInterArrivatime = TxFlowSpec.SDUInterArrivalTime;
692 if (ServiceType == BT_LL_BE)
695 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX best effort flowspec\n"));
697 else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 0xffff))
700 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX guaranteed latency flowspec\n"));
702 else if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 2500))
704 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX guaranteed Large latency flowspec\n"));
710 if (ServiceType == BT_LL_BE)
713 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = RX best effort flowspec\n"));
720 if ((ServiceType == BT_LL_GU) && (MaxSDUSize == 1492))
723 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX guaranteed latency flowspec\n"));
725 else if ((ServiceType==BT_LL_GU) && (MaxSDUSize==2500))
727 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX guaranteed Large latency flowspec\n"));
733 if (ServiceType == BT_LL_BE)
735 if ((SDUInterArrivatime == 0xffffffff) && (ServiceType == BT_LL_BE) && (MaxSDUSize == 1492))
738 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX/RX aggregated best effort flowspec\n"));
741 else if (ServiceType == BT_LL_GU)
743 if ((SDUInterArrivatime == 100) && 10000)
746 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = TX/RX guaranteed bandwidth flowspec\n"));
753 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Logical Link Type = Unknow Type !!!!!!!!\n"));
758 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",
759 TxFlowSpec.Identifier, TxFlowSpec.ServiceType, MaxSDUSize, SDUInterArrivatime, TxFlowSpec.AccessLatency, TxFlowSpec.FlushTimeout));
764 bthci_SelectFlowType(
766 BT_LL_FLOWSPEC TxLLFlowSpec,
767 BT_LL_FLOWSPEC RxLLFlowSpec,
768 PHCI_FLOW_SPEC TxFlowSpec,
769 PHCI_FLOW_SPEC RxFlowSpec
772 switch (TxLLFlowSpec)
776 TxFlowSpec->Identifier = 0x1;
777 TxFlowSpec->ServiceType = BT_LL_BE;
778 TxFlowSpec->MaximumSDUSize = 0xffff;
779 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
780 TxFlowSpec->AccessLatency = 0xffffffff;
781 TxFlowSpec->FlushTimeout = 0xffffffff;
786 RxFlowSpec->Identifier = 0x2;
787 RxFlowSpec->ServiceType = BT_LL_BE;
788 RxFlowSpec->MaximumSDUSize = 0xffff;
789 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
790 RxFlowSpec->AccessLatency = 0xffffffff;
791 RxFlowSpec->FlushTimeout = 0xffffffff;
796 TxFlowSpec->Identifier = 0x3;
797 TxFlowSpec->ServiceType = BT_LL_GU;
798 TxFlowSpec->MaximumSDUSize = 1492;
799 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
800 TxFlowSpec->AccessLatency = 10000;
801 TxFlowSpec->FlushTimeout = 10000;
806 RxFlowSpec->Identifier = 0x1;
807 RxFlowSpec->ServiceType = BT_LL_GU;
808 RxFlowSpec->MaximumSDUSize = 0xffff;
809 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
810 RxFlowSpec->AccessLatency = 10000;
811 RxFlowSpec->FlushTimeout = 10000;
814 case BT_TX_BE_AGG_FS:
816 TxFlowSpec->Identifier = 0x4;
817 TxFlowSpec->ServiceType = BT_LL_BE;
818 TxFlowSpec->MaximumSDUSize = 1492;
819 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
820 TxFlowSpec->AccessLatency = 0xffffffff;
821 TxFlowSpec->FlushTimeout = 0xffffffff;
824 case BT_RX_BE_AGG_FS:
826 RxFlowSpec->Identifier = 0x4;
827 RxFlowSpec->ServiceType = BT_LL_BE;
828 RxFlowSpec->MaximumSDUSize = 1492;
829 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
830 RxFlowSpec->AccessLatency = 0xffffffff;
831 RxFlowSpec->FlushTimeout = 0xffffffff;
836 TxFlowSpec->Identifier = 0x4;
837 TxFlowSpec->ServiceType = BT_LL_GU;
838 TxFlowSpec->MaximumSDUSize = 1492;
839 TxFlowSpec->SDUInterArrivalTime = 100;
840 TxFlowSpec->AccessLatency = 0xffffffff;
841 TxFlowSpec->FlushTimeout = 0xffffffff;
846 RxFlowSpec->Identifier = 0x4;
847 RxFlowSpec->ServiceType = BT_LL_GU;
848 RxFlowSpec->MaximumSDUSize = 1492;
849 RxFlowSpec->SDUInterArrivalTime = 100;
850 RxFlowSpec->AccessLatency = 0xffffffff;
851 RxFlowSpec->FlushTimeout = 0xffffffff;
854 case BT_TX_GU_LARGE_FS:
856 TxFlowSpec->Identifier = 0x3;
857 TxFlowSpec->ServiceType = BT_LL_GU;
858 TxFlowSpec->MaximumSDUSize = 2500;
859 TxFlowSpec->SDUInterArrivalTime = 0x1;
860 TxFlowSpec->AccessLatency = 10000;
861 TxFlowSpec->FlushTimeout = 10000;
864 case BT_RX_GU_LARGE_FS:
866 RxFlowSpec->Identifier = 0x1;
867 RxFlowSpec->ServiceType = BT_LL_GU;
868 RxFlowSpec->MaximumSDUSize = 2500;
869 RxFlowSpec->SDUInterArrivalTime = 0x1;
870 RxFlowSpec->AccessLatency = 10000;
871 RxFlowSpec->FlushTimeout = 10000;
878 switch (RxLLFlowSpec)
882 TxFlowSpec->Identifier = 0x1;
883 TxFlowSpec->ServiceType = BT_LL_BE;
884 TxFlowSpec->MaximumSDUSize = 0xffff;
885 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
886 TxFlowSpec->AccessLatency = 0xffffffff;
887 TxFlowSpec->FlushTimeout = 0xffffffff;
892 RxFlowSpec->Identifier = 0x2;
893 RxFlowSpec->ServiceType = BT_LL_BE;
894 RxFlowSpec->MaximumSDUSize = 0xffff;
895 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
896 RxFlowSpec->AccessLatency = 0xffffffff;
897 RxFlowSpec->FlushTimeout = 0xffffffff;
902 TxFlowSpec->Identifier = 0x3;
903 TxFlowSpec->ServiceType = BT_LL_GU;
904 TxFlowSpec->MaximumSDUSize = 1492;
905 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
906 TxFlowSpec->AccessLatency = 10000;
907 TxFlowSpec->FlushTimeout = 10000;
912 RxFlowSpec->Identifier = 0x1;
913 RxFlowSpec->ServiceType = BT_LL_GU;
914 RxFlowSpec->MaximumSDUSize = 0xffff;
915 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
916 RxFlowSpec->AccessLatency = 10000;
917 RxFlowSpec->FlushTimeout = 10000;
920 case BT_TX_BE_AGG_FS:
922 TxFlowSpec->Identifier = 0x4;
923 TxFlowSpec->ServiceType = BT_LL_BE;
924 TxFlowSpec->MaximumSDUSize = 1492;
925 TxFlowSpec->SDUInterArrivalTime = 0xffffffff;
926 TxFlowSpec->AccessLatency = 0xffffffff;
927 TxFlowSpec->FlushTimeout = 0xffffffff;
930 case BT_RX_BE_AGG_FS:
932 RxFlowSpec->Identifier = 0x4;
933 RxFlowSpec->ServiceType = BT_LL_BE;
934 RxFlowSpec->MaximumSDUSize = 1492;
935 RxFlowSpec->SDUInterArrivalTime = 0xffffffff;
936 RxFlowSpec->AccessLatency = 0xffffffff;
937 RxFlowSpec->FlushTimeout = 0xffffffff;
942 TxFlowSpec->Identifier = 0x4;
943 TxFlowSpec->ServiceType = BT_LL_GU;
944 TxFlowSpec->MaximumSDUSize = 1492;
945 TxFlowSpec->SDUInterArrivalTime = 100;
946 TxFlowSpec->AccessLatency = 0xffffffff;
947 TxFlowSpec->FlushTimeout = 0xffffffff;
952 RxFlowSpec->Identifier = 0x4;
953 RxFlowSpec->ServiceType = BT_LL_GU;
954 RxFlowSpec->MaximumSDUSize = 1492;
955 RxFlowSpec->SDUInterArrivalTime = 100;
956 RxFlowSpec->AccessLatency = 0xffffffff;
957 RxFlowSpec->FlushTimeout = 0xffffffff;
960 case BT_TX_GU_LARGE_FS:
962 TxFlowSpec->Identifier = 0x3;
963 TxFlowSpec->ServiceType = BT_LL_GU;
964 TxFlowSpec->MaximumSDUSize = 2500;
965 TxFlowSpec->SDUInterArrivalTime = 0x1;
966 TxFlowSpec->AccessLatency = 10000;
967 TxFlowSpec->FlushTimeout = 10000;
970 case BT_RX_GU_LARGE_FS:
972 RxFlowSpec->Identifier = 0x1;
973 RxFlowSpec->ServiceType = BT_LL_GU;
974 RxFlowSpec->MaximumSDUSize = 2500;
975 RxFlowSpec->SDUInterArrivalTime = 0x1;
976 RxFlowSpec->AccessLatency = 10000;
977 RxFlowSpec->FlushTimeout = 10000;
991 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1000 pAssoStrc->TypeID = AMP_MAC_ADDR;
1001 pAssoStrc->Length = 0x06;
1002 // _rtw_memcpy(&pAssoStrc->Data[0], Adapter->CurrentAddress, 6);
1003 _rtw_memcpy(&pAssoStrc->Data[0], padapter->eeprompriv.mac_addr, 6);
1004 //_rtw_memcpy(&pAssoStrc->Data[0], FakeAddress, 6);
1005 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("AssocMACAddr : \n"), pAssoStrc, pAssoStrc->Length+3);
1007 return (pAssoStrc->Length+3);
1011 bthci_PALCapabilities(
1016 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1018 pAssoStrc->TypeID = AMP_80211_PAL_CAP_LIST;
1019 pAssoStrc->Length = 0x04;
1021 pAssoStrc->Data[0] = 0x00;
1022 pAssoStrc->Data[1] = 0x00;
1024 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("PALCapabilities : \n"), pAssoStrc, pAssoStrc->Length+3);
1025 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("PALCapabilities \n"));
1027 RTPRINT(FIOCTL, IOCTL_BT_LOGO, (" TypeID = 0x%x,\n Length = 0x%x,\n Content =0x0000\n",
1029 pAssoStrc->Length));
1031 return (pAssoStrc->Length+3);
1035 bthci_AssocPreferredChannelList(
1042 PAMP_ASSOC_STRUCTURE pAssoStrc;
1043 PAMP_PREF_CHNL_REGULATORY pReg;
1044 PCHNL_TXPOWER_TRIPLE pTripleIE, pTriple;
1045 char ctrString[3] = {'X', 'X', 'X'};
1047 u8 i=0, NumTriples=0, preferredChnl;
1050 pBTInfo = GET_BT_INFO(padapter);
1051 // pDot11dInfo = GET_DOT11D_INFO(pMgntInfo);
1052 pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1053 pReg = (PAMP_PREF_CHNL_REGULATORY)&pAssoStrc->Data[3];
1055 preferredChnl = bthci_GetLocalChannel(padapter);
1056 pAssoStrc->TypeID = AMP_PREFERRED_CHANNEL_LIST;
1059 _rtw_memcpy(&pAssoStrc->Data[0], &ctrString[0], 3);
1061 pReg->regulatoryClass = 254;
1062 pReg->coverageClass = 0;
1064 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("PREFERRED_CHNL_LIST\n"));
1065 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("XXX, 201,254,0\n"));
1066 // at the following, chnl 1~11 should be contained
1067 pTriple = (PCHNL_TXPOWER_TRIPLE)&pAssoStrc->Data[len];
1069 // (1) if any wifi or bt HS connection exists
1070 if ((pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR) ||
1072 pMgntInfo->mAssoc ||
1074 IsExtAPModeExist(padapter)) ||
1076 (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) ||
1078 BTHCI_HsConnectionEstablished(padapter))
1080 pTriple->FirstChnl = preferredChnl;
1081 pTriple->NumChnls = 1;
1082 pTriple->MaxTxPowerInDbm = 20;
1084 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD | IOCTL_BT_LOGO), ("First Channel = %d, Channel Num = %d, MaxDbm = %d\n",
1087 pTriple->MaxTxPowerInDbm));
1089 //pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
1092 pAssoStrc->Length = (u16)len;
1093 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD, ("AssocPreferredChannelList : \n"), pAssoStrc, pAssoStrc->Length+3);
1095 return (pAssoStrc->Length+3);
1098 static u16 bthci_AssocPALVer(PADAPTER padapter, void *pbuf)
1100 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1104 pAssoStrc->TypeID = AMP_80211_PAL_VISION;
1105 pAssoStrc->Length = 0x5;
1106 pu1Tmp = &pAssoStrc->Data[0];
1107 *pu1Tmp = 0x1; // PAL Version
1108 pu2Tmp = (u16*)&pAssoStrc->Data[1];
1109 *pu2Tmp = 0x5D; // SIG Company identifier of 802.11 PAL vendor
1110 pu2Tmp = (u16*)&pAssoStrc->Data[3];
1111 *pu2Tmp = 0x1; // PAL Sub-version specifier
1113 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("AssocPALVer : \n"), pAssoStrc, pAssoStrc->Length+3);
1114 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("AssocPALVer \n"));
1116 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",
1118 pAssoStrc->Length));
1119 return (pAssoStrc->Length+3);
1123 bthci_ReservedForTestingPLV(
1128 PAMP_ASSOC_STRUCTURE pAssoStrc = (PAMP_ASSOC_STRUCTURE)pbuf;
1130 pAssoStrc->TypeID = AMP_RESERVED_FOR_TESTING;
1131 pAssoStrc->Length = 0x10;
1133 pAssoStrc->Data[0] = 0x00;
1134 pAssoStrc->Data[1] = 0x01;
1135 pAssoStrc->Data[2] = 0x02;
1136 pAssoStrc->Data[3] = 0x03;
1137 pAssoStrc->Data[4] = 0x04;
1138 pAssoStrc->Data[5] = 0x05;
1139 pAssoStrc->Data[6] = 0x06;
1140 pAssoStrc->Data[7] = 0x07;
1141 pAssoStrc->Data[8] = 0x08;
1142 pAssoStrc->Data[9] = 0x09;
1143 pAssoStrc->Data[10] = 0x0a;
1144 pAssoStrc->Data[11] = 0x0b;
1145 pAssoStrc->Data[12] = 0x0c;
1146 pAssoStrc->Data[13] = 0x0d;
1147 pAssoStrc->Data[14] = 0x0e;
1148 pAssoStrc->Data[15] = 0x0f;
1150 return (pAssoStrc->Length+3);
1153 static u8 bthci_CheckRfStateBeforeConnect(PADAPTER padapter)
1156 rt_rf_power_state RfState;
1159 pBTInfo = GET_BT_INFO(padapter);
1161 // rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState));
1162 RfState = padapter->pwrctrlpriv.rf_pwrstate;
1164 if (RfState != rf_on)
1166 PlatformSetTimer(padapter, &pBTInfo->BTPsDisableTimer, 50);
1174 bthci_ConstructScanList(
1178 PRT_SCAN_TYPE pScanType,
1183 PBT_HCI_INFO pBtHciInfo;
1184 PCHNL_TXPOWER_TRIPLE pTriple_subband;
1185 PCOMMON_TRIPLE pTriple;
1186 u8 chnl, i, j, tripleLetsCnt=0;
1189 padapter = pBTInfo->padapter;
1190 pBtHciInfo = &pBTInfo->BtHciInfo;
1192 *pScanType = SCAN_ACTIVE;
1195 pTriple = (PCOMMON_TRIPLE)&(pBtHciInfo->BTPreChnllist[COUNTRY_STR_LEN]);
1197 // contains country string, len is 3
1198 for (i = 0; i < (pBtHciInfo->BtPreChnlListLen-COUNTRY_STR_LEN); i+=3, pTriple++)
1200 if (pTriple->byte_1st == 0xc9) // Regulatory Extension Identifier, skip it
1202 else // Sub-band triplet
1205 pTriple_subband = (PCHNL_TXPOWER_TRIPLE)pTriple;
1207 // search the sub-band triplet and find if remote channel is legal to our channel plan.
1208 for (chnl = pTriple_subband->FirstChnl; chnl < (pTriple_subband->FirstChnl+pTriple_subband->NumChnls); chnl++)
1210 if (BT_IsLegalChannel(padapter, chnl)) // remote channel is legal for our channel plan.
1212 //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1213 pChannels[*pNChannels] = chnl;
1220 if (tripleLetsCnt == 0)
1222 // Fill chnl 1~ chnl 11
1223 for (chnl=1; chnl<12; chnl++)
1225 //DbgPrint("cosa insert chnl(%d) into scan list\n", chnl);
1226 pChannels[*pNChannels] = chnl;
1231 if (*pNChannels == 0)
1237 static void bthci_ResponderStartToScan(PADAPTER padapter)
1242 bthci_PhyLinkConnectionInProgress(
1251 pBTInfo = GET_BT_INFO(padapter);
1252 pBtMgnt = &pBTInfo->BtMgnt;
1254 if (pBtMgnt->bPhyLinkInProgress &&
1255 (pBtMgnt->BtCurrentPhyLinkhandle == PhyLinkHandle))
1263 bthci_ResetFlowSpec(
1272 pBTinfo = GET_BT_INFO(padapter);
1274 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtLogLinkhandle = 0;
1275 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtPhyLinkhandle = 0;
1276 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].bLLCompleteEventIsSet = _FALSE;
1277 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].bLLCancelCMDIsSetandComplete = _FALSE;
1278 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].BtTxFlowSpecID = 0;
1279 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].TxPacketCount = 0;
1281 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.Identifier = 0x01;
1282 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.ServiceType = SERVICE_BEST_EFFORT;
1283 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.MaximumSDUSize = 0xffff;
1284 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.SDUInterArrivalTime = 0xffffffff;
1285 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.AccessLatency = 0xffffffff;
1286 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Tx_Flow_Spec.FlushTimeout = 0xffffffff;
1288 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.Identifier = 0x01;
1289 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.ServiceType = SERVICE_BEST_EFFORT;
1290 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.MaximumSDUSize = 0xffff;
1291 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.SDUInterArrivalTime = 0xffffffff;
1292 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.AccessLatency = 0xffffffff;
1293 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[index].Rx_Flow_Spec.FlushTimeout = 0xffffffff;
1296 static void bthci_ResetEntry(PADAPTER padapter, u8 EntryNum)
1303 pBTinfo = GET_BT_INFO(padapter);
1304 pBtMgnt = &pBTinfo->BtMgnt;
1306 pBTinfo->BtAsocEntry[EntryNum].bUsed=_FALSE;
1307 pBTinfo->BtAsocEntry[EntryNum].BtCurrentState=HCI_STATE_DISCONNECTED;
1308 pBTinfo->BtAsocEntry[EntryNum].BtNextState=HCI_STATE_DISCONNECTED;
1310 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocRemLen=0;
1311 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle = 0;
1312 if (pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment != NULL)
1314 _rtw_memset(pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment, 0, TOTAL_ALLOCIATE_ASSOC_LEN);
1316 pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar=0;
1318 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType = 0;
1319 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle = 0;
1320 _rtw_memset(pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey, 0, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
1321 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen=0;
1323 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout=0x3e80;//0x640; //0.625ms*1600=1000ms, 0.625ms*16000=10000ms
1325 pBTinfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_NONE;
1327 pBTinfo->BtAsocEntry[EntryNum].mAssoc=_FALSE;
1328 pBTinfo->BtAsocEntry[EntryNum].b4waySuccess = _FALSE;
1331 pBTinfo->BtAsocEntry[EntryNum].KeyReplayCounter = 0;
1332 pBTinfo->BtAsocEntry[EntryNum].BTWPAAuthState = STATE_WPA_AUTH_UNINITIALIZED;
1334 pBTinfo->BtAsocEntry[EntryNum].bSendSupervisionPacket=_FALSE;
1335 pBTinfo->BtAsocEntry[EntryNum].NoRxPktCnt=0;
1336 pBTinfo->BtAsocEntry[EntryNum].ShortRangeMode = 0;
1337 pBTinfo->BtAsocEntry[EntryNum].rxSuvpPktCnt = 0;
1339 for (j=0; j<MAX_LOGICAL_LINK_NUM; j++)
1341 bthci_ResetFlowSpec(padapter, EntryNum, j);
1344 pBtMgnt->BTAuthCount = 0;
1345 pBtMgnt->BTAsocCount = 0;
1346 pBtMgnt->BTCurrentConnectType = BT_DISCONNECT;
1347 pBtMgnt->BTReceiveConnectPkt = BT_DISCONNECT;
1349 HALBT_RemoveKey(padapter, EntryNum);
1353 bthci_RemoveEntryByEntryNum(
1358 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1359 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
1361 bthci_ResetEntry(padapter, EntryNum);
1363 if (pBtMgnt->CurrentBTConnectionCnt>0)
1364 pBtMgnt->CurrentBTConnectionCnt--;
1366 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], CurrentBTConnectionCnt = %d!!\n",
1367 pBtMgnt->CurrentBTConnectionCnt));
1369 if (pBtMgnt->CurrentBTConnectionCnt > 0)
1370 pBtMgnt->BtOperationOn = _TRUE;
1373 pBtMgnt->BtOperationOn = _FALSE;
1374 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], Bt Operation OFF!!\n"));
1377 if (pBtMgnt->BtOperationOn == _FALSE)
1379 PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
1380 #if (SENDTXMEHTOD == 0)
1381 PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
1383 PlatformCancelTimer(padapter, &pBTInfo->BTHCIDiscardAclDataTimer);
1384 PlatformCancelTimer(padapter, &pBTInfo->BTBeaconTimer);
1385 pBtMgnt->bStartSendSupervisionPkt = _FALSE;
1386 #if (RTS_CTS_NO_LEN_LIMIT == 1)
1387 rtw_write32(padapter, 0x4c8, 0xc140402);
1393 bthci_CommandCompleteHeader(
1400 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1401 u8 NumHCI_Comm = 0x1;
1404 PPacketIrpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
1405 PPacketIrpEvent->Data[0] = NumHCI_Comm; //packet #
1406 PPacketIrpEvent->Data[1] = HCIOPCODELOW(OCF, OGF);
1407 PPacketIrpEvent->Data[2] = HCIOPCODEHIGHT(OCF, OGF);
1409 if (OGF == OGF_EXTENSION)
1411 if (OCF == HCI_SET_RSSI_VALUE)
1413 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",
1414 NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1418 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",
1419 NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1424 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",
1425 NumHCI_Comm,(HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), status, OGF, OCF));
1430 static u8 bthci_ExtensionEventHeader(u8 *pbuf, u8 extensionEvent)
1432 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1433 PPacketIrpEvent->EventCode = HCI_EVENT_EXTENSION_MOTO;
1434 PPacketIrpEvent->Data[0] = extensionEvent; //extension event code
1439 static u8 bthci_ExtensionEventHeaderRtk(u8 *pbuf, u8 extensionEvent)
1441 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pbuf;
1442 PPacketIrpEvent->EventCode = HCI_EVENT_EXTENSION_RTK;
1443 PPacketIrpEvent->Data[0] = extensionEvent; //extension event code
1449 bthci_IndicateEvent(
1455 RT_STATUS rt_status;
1457 rt_status = PlatformIndicateBTEvent(padapter, pEvntData, dataLen);
1463 bthci_EventWriteRemoteAmpAssoc(
1469 u8 localBuf[TmpLocalBufSize] = "";
1472 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1474 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
1475 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1477 len += bthci_CommandCompleteHeader(&localBuf[0],
1478 OGF_STATUS_PARAMETERS,
1479 HCI_WRITE_REMOTE_AMP_ASSOC,
1481 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("PhyLinkHandle = 0x%x, status = %d\n", PLHandle, status));
1482 // Return parameters starts from here
1483 pRetPar = &PPacketIrpEvent->Data[len];
1484 pRetPar[0] = status; //status
1485 pRetPar[1] = PLHandle;
1487 PPacketIrpEvent->Length = len;
1489 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
1493 bthci_EventEnhancedFlushComplete(
1498 u8 localBuf[4] = "";
1499 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1500 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("EventEnhancedFlushComplete, LLH = 0x%x\n", LLH));
1502 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1503 PPacketIrpEvent->EventCode=HCI_EVENT_ENHANCED_FLUSH_COMPLETE;
1504 PPacketIrpEvent->Length=2;
1505 //Logical link handle
1506 PPacketIrpEvent->Data[0] = TWOBYTE_LOWBYTE(LLH);
1507 PPacketIrpEvent->Data[1] = TWOBYTE_HIGHTBYTE(LLH);
1509 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
1513 bthci_EventShortRangeModeChangeComplete(
1515 HCI_STATUS HciStatus,
1520 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1521 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1522 u8 localBuf[5] = "";
1523 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1525 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_SHORT_RANGE_MODE_CHANGE_COMPLETE))
1527 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Short Range Mode Change Complete, Ignore to send this event due to event mask page 2\n"));
1530 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",
1531 HciStatus, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle, ShortRangeState));
1533 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1534 PPacketIrpEvent->EventCode=HCI_EVENT_SHORT_RANGE_MODE_CHANGE_COMPLETE;
1535 PPacketIrpEvent->Length=3;
1536 PPacketIrpEvent->Data[0] = HciStatus;
1537 PPacketIrpEvent->Data[1] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
1538 PPacketIrpEvent->Data[2] = ShortRangeState;
1539 bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
1543 bthci_EventSendFlowSpecModifyComplete(
1545 HCI_STATUS HciStatus,
1549 u8 localBuf[5] = "";
1550 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1551 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1552 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1554 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_FLOW_SPEC_MODIFY_COMPLETE))
1556 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"));
1559 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("[BT event], Flow Spec Modify Complete, status = 0x%x, LLH = 0x%x\n",HciStatus,logicHandle));
1560 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1561 PPacketIrpEvent->EventCode=HCI_EVENT_FLOW_SPEC_MODIFY_COMPLETE;
1562 PPacketIrpEvent->Length=3;
1564 PPacketIrpEvent->Data[0] = HciStatus;
1565 //Logical link handle
1566 PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(logicHandle);
1567 PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(logicHandle);
1569 bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
1573 bthci_EventExtGetBTRSSI(
1575 u16 ConnectionHandle
1579 u8 localBuf[7] = "";
1582 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1584 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1586 len += bthci_ExtensionEventHeader(&localBuf[0],
1587 HCI_EVENT_GET_BT_RSSI);
1589 // Return parameters starts from here
1590 pRetPar = &PPacketIrpEvent->Data[len];
1591 pu2Temp = (u16*)&pRetPar[0];
1592 *pu2Temp = ConnectionHandle;
1595 PPacketIrpEvent->Length = len;
1596 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
1598 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("[BT event], Get BT RSSI, Connection Handle = 0x%x, Extension event code = 0x%x\n",
1599 ConnectionHandle, HCI_EVENT_GET_BT_RSSI));
1604 bthci_EventExtWifiScanNotify(
1609 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1610 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
1612 u8 localBuf[7] = "";
1615 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1617 if (!pBtMgnt->BtOperationOn)
1620 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1622 len += bthci_ExtensionEventHeaderRtk(&localBuf[0], HCI_EVENT_EXT_WIFI_SCAN_NOTIFY);
1624 // Return parameters starts from here
1625 pRetPar = &PPacketIrpEvent->Data[len];
1626 pu1Temp = (u8*)&pRetPar[0];
1627 *pu1Temp = scanType;
1630 PPacketIrpEvent->Length = len;
1632 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
1634 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Wifi scan notify, scan type = %d\n",
1641 bthci_EventAMPReceiverReport(
1646 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1647 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1649 if (pBtHciInfo->bTestNeedReport)
1651 u8 localBuf[20] = "";
1654 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1657 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), (" HCI_EVENT_AMP_RECEIVER_REPORT \n"));
1658 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1659 PPacketIrpEvent->EventCode = HCI_EVENT_AMP_RECEIVER_REPORT;
1660 PPacketIrpEvent->Length = 2;
1662 PPacketIrpEvent->Data[0] = pBtHciInfo->TestCtrType;
1664 PPacketIrpEvent->Data[1] =Reason;
1666 pu4Temp = (u32*)&PPacketIrpEvent->Data[2];
1667 *pu4Temp = pBtHciInfo->TestEventType;
1669 pu2Temp = (u16*)&PPacketIrpEvent->Data[6];
1670 *pu2Temp = pBtHciInfo->TestNumOfFrame;
1672 pu2Temp = (u16*)&PPacketIrpEvent->Data[8];
1673 *pu2Temp = pBtHciInfo->TestNumOfErrFrame;
1675 pu4Temp = (u32*)&PPacketIrpEvent->Data[10];
1676 *pu4Temp = pBtHciInfo->TestNumOfBits;
1678 pu4Temp = (u32*)&PPacketIrpEvent->Data[14];
1679 *pu4Temp = pBtHciInfo->TestNumOfErrBits;
1681 bthci_IndicateEvent(padapter, PPacketIrpEvent, 20);
1683 //Return to Idel state with RX and TX off.
1687 pBtHciInfo->TestNumOfFrame = 0x00;
1691 bthci_EventChannelSelected(
1696 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1697 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1698 u8 localBuf[3] = "";
1699 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1701 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_CHANNEL_SELECT))
1703 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Channel Selected, Ignore to send this event due to event mask page 2\n"));
1707 RTPRINT(FIOCTL, IOCTL_BT_EVENT|IOCTL_STATE, ("[BT event], Channel Selected, PhyLinkHandle %d\n",
1708 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle));
1710 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1711 PPacketIrpEvent->EventCode=HCI_EVENT_CHANNEL_SELECT;
1712 PPacketIrpEvent->Length=1;
1713 PPacketIrpEvent->Data[0] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
1714 bthci_IndicateEvent(padapter, PPacketIrpEvent, 3);
1718 bthci_EventDisconnectPhyLinkComplete(
1720 HCI_STATUS HciStatus,
1725 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1726 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1727 u8 localBuf[5] = "";
1728 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1730 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_PHY_LINK_COMPLETE))
1732 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
1735 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Physical Link Complete, Status = 0x%x, PLH = 0x%x Reason =0x%x\n",
1736 HciStatus,pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,Reason));
1737 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1738 PPacketIrpEvent->EventCode=HCI_EVENT_DISCONNECT_PHY_LINK_COMPLETE;
1739 PPacketIrpEvent->Length=3;
1740 PPacketIrpEvent->Data[0] = HciStatus;
1741 PPacketIrpEvent->Data[1] = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
1742 PPacketIrpEvent->Data[2] = Reason;
1743 bthci_IndicateEvent(padapter, PPacketIrpEvent, 5);
1747 bthci_EventPhysicalLinkComplete(
1749 HCI_STATUS HciStatus,
1754 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1755 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
1756 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1757 PBT_DBG pBtDbg=&pBTInfo->BtDbg;
1758 u8 localBuf[4] = "";
1759 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1762 pBtMgnt->bPhyLinkInProgress = _FALSE;
1763 pBtDbg->dbgHciInfo.hciCmdPhyLinkStatus = HciStatus;
1764 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_PHY_LINK_COMPLETE))
1766 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Ignore to send this event due to event mask page 2\n"));
1770 if (EntryNum == 0xff)
1772 // connection not started yet, just use the input physical link handle to response.
1773 PL_handle = PLHandle;
1777 // connection is under progress, use the phy link handle we recorded.
1778 PL_handle = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
1779 pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent=_FALSE;
1782 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Physical Link Complete, Status = 0x%x PhyLinkHandle = 0x%x\n",HciStatus,
1785 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1786 PPacketIrpEvent->EventCode=HCI_EVENT_PHY_LINK_COMPLETE;
1787 PPacketIrpEvent->Length=2;
1789 PPacketIrpEvent->Data[0] = HciStatus;
1790 PPacketIrpEvent->Data[1] = PL_handle;
1791 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
1796 bthci_EventCommandStatus(
1800 HCI_STATUS HciStatus
1804 u8 localBuf[6] = "";
1805 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1806 u8 Num_Hci_Comm = 0x1;
1807 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",
1808 (HCIOPCODEHIGHT(OCF, OGF)), (HCIOPCODELOW(OCF, OGF)), OGF, OCF, HciStatus,Num_Hci_Comm));
1810 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1811 PPacketIrpEvent->EventCode=HCI_EVENT_COMMAND_STATUS;
1812 PPacketIrpEvent->Length=4;
1813 PPacketIrpEvent->Data[0] = HciStatus; //current pending
1814 PPacketIrpEvent->Data[1] = Num_Hci_Comm; //packet #
1815 PPacketIrpEvent->Data[2] = HCIOPCODELOW(OCF, OGF);
1816 PPacketIrpEvent->Data[3] = HCIOPCODEHIGHT(OCF, OGF);
1818 bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
1823 bthci_EventLogicalLinkComplete(
1825 HCI_STATUS HciStatus,
1832 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
1833 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1834 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1835 u8 localBuf[7] = "";
1836 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1838 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_LOGICAL_LINK_COMPLETE))
1840 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
1843 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Logical Link Complete, PhyLinkHandle = 0x%x, LogLinkHandle = 0x%x, Status= 0x%x\n",
1844 PhyLinkHandle, LogLinkHandle, HciStatus));
1847 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1848 PPacketIrpEvent->EventCode = HCI_EVENT_LOGICAL_LINK_COMPLETE;
1849 PPacketIrpEvent->Length = 5;
1851 PPacketIrpEvent->Data[0] = HciStatus;//status code
1852 //Logical link handle
1853 PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(LogLinkHandle);
1854 PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
1855 //Physical link handle
1856 PPacketIrpEvent->Data[3] = TWOBYTE_LOWBYTE(PhyLinkHandle);
1857 //corresponding Tx flow spec ID
1858 if (HciStatus == HCI_STATUS_SUCCESS)
1860 PPacketIrpEvent->Data[4] =
1861 pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData[LogLinkIndex].Tx_Flow_Spec.Identifier;
1864 PPacketIrpEvent->Data[4] = 0x0;
1866 bthci_IndicateEvent(padapter, PPacketIrpEvent, 7);
1870 bthci_EventDisconnectLogicalLinkComplete(
1872 HCI_STATUS HciStatus,
1877 u8 localBuf[6] = "";
1878 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1879 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
1880 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1882 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE))
1884 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Logical Link Complete, Ignore to send this event due to event mask page 2\n"));
1887 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Disconnect Logical Link Complete, Status = 0x%x,LLH = 0x%x Reason =0x%x\n",HciStatus,LogLinkHandle,Reason));
1889 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1890 PPacketIrpEvent->EventCode=HCI_EVENT_DISCONNECT_LOGICAL_LINK_COMPLETE;
1891 PPacketIrpEvent->Length=4;
1893 PPacketIrpEvent->Data[0] = HciStatus;
1894 //Logical link handle
1895 PPacketIrpEvent->Data[1] = TWOBYTE_LOWBYTE(LogLinkHandle);
1896 PPacketIrpEvent->Data[2] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
1898 PPacketIrpEvent->Data[3] = Reason;
1900 bthci_IndicateEvent(padapter, PPacketIrpEvent, 6);
1904 bthci_EventFlushOccurred(
1909 u8 localBuf[4] = "";
1910 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
1911 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("bthci_EventFlushOccurred(), LLH = 0x%x\n", LogLinkHandle));
1913 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
1914 PPacketIrpEvent->EventCode = HCI_EVENT_FLUSH_OCCRUED;
1915 PPacketIrpEvent->Length = 2;
1916 //Logical link handle
1917 PPacketIrpEvent->Data[0] = TWOBYTE_LOWBYTE(LogLinkHandle);
1918 PPacketIrpEvent->Data[1] = TWOBYTE_HIGHTBYTE(LogLinkHandle);
1920 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
1924 bthci_BuildPhysicalLink(
1926 PPACKET_IRP_HCICMD_DATA pHciCmd,
1930 HCI_STATUS status = HCI_STATUS_SUCCESS;
1931 PBT30Info pBTInfo = GET_BT_INFO(padapter);
1932 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
1935 //Send HCI Command status event to AMP.
1936 bthci_EventCommandStatus(padapter,
1937 OGF_LINK_CONTROL_COMMANDS,
1939 HCI_STATUS_SUCCESS);
1941 PLH = *((u8*)pHciCmd->Data);
1943 // Check if resource or bt connection is under progress, if yes, reject the link creation.
1944 if (bthci_AddEntry(padapter) == _FALSE)
1946 status = HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE;
1947 bthci_EventPhysicalLinkComplete(padapter, status, INVALID_ENTRY_NUM, PLH);
1951 EntryNum=pBtMgnt->CurrentConnectEntryNum;
1952 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle = PLH;
1953 pBtMgnt->BtCurrentPhyLinkhandle = PLH;
1955 if (pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.AMPAssocfragment == NULL)
1957 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Create/Accept PhysicalLink, AMP controller is busy\n"));
1958 status = HCI_STATUS_CONTROLLER_BUSY;
1959 bthci_EventPhysicalLinkComplete(padapter, status, INVALID_ENTRY_NUM, PLH);
1963 // Record Key and the info
1964 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen=(*((u8*)pHciCmd->Data+1));
1965 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType=(*((u8*)pHciCmd->Data+2));
1966 _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey,
1967 (((u8*)pHciCmd->Data+3)), pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
1968 #if (LOCAL_PMK == 1)
1969 _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PMK, testPMK, PMK_LEN);
1971 _rtw_memcpy(pBTInfo->BtAsocEntry[EntryNum].PMK, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey, PMK_LEN);
1973 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildPhysicalLink, EntryNum = %d, PLH = 0x%x KeyLen = 0x%x, KeyType =0x%x\n",
1974 EntryNum, pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,
1975 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen,
1976 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyType));
1977 RTPRINT_DATA(FIOCTL, (IOCTL_BT_LOGO|IOCTL_BT_HCICMD), ("BtAMPKey\n"), pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKey,
1978 pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtAMPKeyLen);
1979 RTPRINT_DATA(FIOCTL, (IOCTL_BT_LOGO|IOCTL_BT_HCICMD), ("PMK\n"), pBTInfo->BtAsocEntry[EntryNum].PMK,
1982 if (OCF == HCI_CREATE_PHYSICAL_LINK)
1984 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_CREATE_PHY_LINK, EntryNum);
1986 else if (OCF == HCI_ACCEPT_PHYSICAL_LINK)
1988 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ACCEPT_PHY_LINK, EntryNum);
1995 bthci_BuildLogicalLink(
1997 PPACKET_IRP_HCICMD_DATA pHciCmd,
2001 HCI_STATUS status = HCI_STATUS_SUCCESS;
2002 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2003 PBT30Info pBTinfo = GET_BT_INFO(padapter);
2004 PBT_MGNT pBtMgnt = &pBTinfo->BtMgnt;
2005 u8 PhyLinkHandle, EntryNum;
2006 static u16 AssignLogHandle = 1;
2008 HCI_FLOW_SPEC TxFlowSpec;
2009 HCI_FLOW_SPEC RxFlowSpec;
2010 u32 MaxSDUSize, ArriveTime, Bandwidth;
2012 PhyLinkHandle = *((u8*)pHciCmd->Data);
2014 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2016 _rtw_memcpy(&TxFlowSpec,
2017 &pHciCmd->Data[1], sizeof(HCI_FLOW_SPEC));
2018 _rtw_memcpy(&RxFlowSpec,
2019 &pHciCmd->Data[17], sizeof(HCI_FLOW_SPEC));
2021 #if 0 //for logo special test case only
2024 bthci_SelectFlowType(padapter,BT_TX_BE_FS,BT_RX_BE_FS,&TxFlowSpec,&RxFlowSpec);
2029 bthci_SelectFlowType(padapter,BT_TX_GU_FS,BT_RX_GU_FS,&TxFlowSpec,&RxFlowSpec);
2034 MaxSDUSize = TxFlowSpec.MaximumSDUSize;
2035 ArriveTime = TxFlowSpec.SDUInterArrivalTime;
2037 if (bthci_CheckLogLinkBehavior(padapter, TxFlowSpec)&& bthci_CheckLogLinkBehavior(padapter, RxFlowSpec))
2039 Bandwidth = BTTOTALBANDWIDTH;
2041 else if (MaxSDUSize==0xffff && ArriveTime==0xffffffff)
2043 Bandwidth = BTTOTALBANDWIDTH;
2047 Bandwidth = MaxSDUSize*8*1000/(ArriveTime+244);
2051 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, PhyLinkHandle = 0x%x, MaximumSDUSize = 0x%lx, SDUInterArrivalTime = 0x%lx, Bandwidth=0x%lx\n",
2052 PhyLinkHandle, MaxSDUSize,ArriveTime, Bandwidth));
2054 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, PhyLinkHandle=0x%x, MaximumSDUSize=0x%x, SDUInterArrivalTime=0x%x, Bandwidth=0x%x\n",
2055 PhyLinkHandle, MaxSDUSize, ArriveTime, Bandwidth));
2058 if (EntryNum == 0xff)
2060 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Invalid Physical Link handle = 0x%x, status=HCI_STATUS_UNKNOW_CONNECT_ID, return\n", PhyLinkHandle));
2061 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2063 //When we receive Create/Accept logical link command, we should send command status event first.
2064 bthci_EventCommandStatus(padapter,
2065 OGF_LINK_CONTROL_COMMANDS,
2071 if (pBtMgnt->bLogLinkInProgress == _FALSE)
2073 if (bthci_PhyLinkConnectionInProgress(padapter, PhyLinkHandle))
2075 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Physical link connection in progress, status=HCI_STATUS_CMD_DISALLOW, return\n"));
2076 status = HCI_STATUS_CMD_DISALLOW;
2078 pBtMgnt->bPhyLinkInProgressStartLL = _TRUE;
2079 //When we receive Create/Accept logical link command, we should send command status event first.
2080 bthci_EventCommandStatus(padapter,
2081 OGF_LINK_CONTROL_COMMANDS,
2088 if (Bandwidth > BTTOTALBANDWIDTH)//BTTOTALBANDWIDTH
2090 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_QOS_REJECT, Bandwidth=0x%x, return\n", Bandwidth));
2091 status = HCI_STATUS_QOS_REJECT;
2093 //When we receive Create/Accept logical link command, we should send command status event first.
2094 bthci_EventCommandStatus(padapter,
2095 OGF_LINK_CONTROL_COMMANDS,
2101 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("status=HCI_STATUS_SUCCESS\n"));
2102 status = HCI_STATUS_SUCCESS;
2104 //When we receive Create/Accept logical link command, we should send command status event first.
2105 bthci_EventCommandStatus(padapter,
2106 OGF_LINK_CONTROL_COMMANDS,
2110 #if 0// special logo test case only
2111 bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2115 if (pBTinfo->BtAsocEntry[EntryNum].BtCurrentState != HCI_STATE_CONNECTED)
2117 bthci_EventLogicalLinkComplete(padapter,
2118 HCI_STATUS_CMD_DISALLOW, 0, 0, 0,EntryNum);
2124 pBtMgnt->bLogLinkInProgress = _TRUE;
2126 // find an unused logical link index and copy the data
2127 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
2129 if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle == 0)
2131 HCI_STATUS LogCompEventstatus = HCI_STATUS_SUCCESS;
2133 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtPhyLinkhandle = *((u8*)pHciCmd->Data);
2134 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle = AssignLogHandle;
2135 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("BuildLogicalLink, EntryNum = %d, physical link handle = 0x%x, logical link handle = 0x%x\n",
2136 EntryNum, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle,
2137 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle));
2138 _rtw_memcpy(&pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].Tx_Flow_Spec,
2139 &TxFlowSpec, sizeof(HCI_FLOW_SPEC));
2140 _rtw_memcpy(&pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].Rx_Flow_Spec,
2141 &RxFlowSpec, sizeof(HCI_FLOW_SPEC));
2143 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet=_FALSE;
2145 if (pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCancelCMDIsSetandComplete)
2147 LogCompEventstatus = HCI_STATUS_UNKNOW_CONNECT_ID;
2149 bthci_EventLogicalLinkComplete(padapter,
2151 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtPhyLinkhandle,
2152 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].BtLogLinkhandle, i,EntryNum);
2154 pBTinfo->BtAsocEntry[EntryNum].LogLinkCmdData[i].bLLCompleteEventIsSet = _TRUE;
2157 pBtMgnt->BtCurrentLogLinkhandle = AssignLogHandle;
2165 bthci_EventLogicalLinkComplete(padapter,
2166 HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE, 0, 0, 0,EntryNum);
2168 pBtMgnt->bLogLinkInProgress = _FALSE;
2173 bthci_EventLogicalLinkComplete(padapter,
2174 HCI_STATUS_CONTROLLER_BUSY, 0, 0, 0,EntryNum);
2177 #if 0// special logo test case only
2178 bthci_FakeCommand(padapter, OGF_LINK_CONTROL_COMMANDS, HCI_LOGICAL_LINK_CANCEL);
2183 bthci_StartBeaconAndConnect(
2185 PPACKET_IRP_HCICMD_DATA pHciCmd,
2189 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2190 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2191 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
2193 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("StartBeaconAndConnect, CurrentAssocNum=%d, AMPRole=%d\n",
2195 pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole));
2197 if (pBtMgnt->CheckChnlIsSuit == _FALSE)
2199 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND, CurrentAssocNum, INVALID_PL_HANDLE);
2200 bthci_RemoveEntryByEntryNum(padapter, CurrentAssocNum);
2205 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2207 rsprintf((char*)pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf,32,"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
2209 padapter->PermanentAddress[0],
2210 padapter->PermanentAddress[1],
2211 padapter->PermanentAddress[2],
2212 padapter->PermanentAddress[3],
2213 padapter->PermanentAddress[4],
2214 padapter->PermanentAddress[5]);
2216 padapter->eeprompriv.mac_addr[0],
2217 padapter->eeprompriv.mac_addr[1],
2218 padapter->eeprompriv.mac_addr[2],
2219 padapter->eeprompriv.mac_addr[3],
2220 padapter->eeprompriv.mac_addr[4],
2221 padapter->eeprompriv.mac_addr[5]);
2224 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
2226 rsprintf((char*)pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf,32,"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
2227 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[0],
2228 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[1],
2229 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[2],
2230 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[3],
2231 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[4],
2232 pBTInfo->BtAsocEntry[CurrentAssocNum].BTRemoteMACAddr[5]);
2235 FillOctetString(pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid, pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsidBuf, 21);
2236 pBTInfo->BtAsocEntry[CurrentAssocNum].BTSsid.Length = 21;
2238 //To avoid set the start ap or connect twice, or the original connection will be disconnected.
2239 if (!pBtMgnt->bBTConnectInProgress)
2241 pBtMgnt->bBTConnectInProgress=_TRUE;
2242 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress ON!!\n"));
2243 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_STARTING,STATE_CMD_MAC_START_COMPLETE,CurrentAssocNum);
2245 #if 0 //for logo special test case only
2246 bthci_BuildLogicalLink(padapter, pHciCmd, HCI_CREATE_LOGICAL_LINK);
2249 // 20100325 Joseph: Check RF ON/OFF.
2250 // If RF OFF, it reschedule connecting operation after 50ms.
2251 if (!bthci_CheckRfStateBeforeConnect(padapter))
2254 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
2256 // BTPKT_StartBeacon(padapter, CurrentAssocNum); // not implement yet
2257 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTING,STATE_CMD_MAC_CONNECT_COMPLETE,CurrentAssocNum);
2259 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
2261 bthci_ResponderStartToScan(padapter);
2264 RT_PRINT_STR(_module_rtl871x_mlme_c_, _drv_notice_, "StartBeaconAndConnect, SSID:\n", pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTSsid.Octet, pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].BTSsid.Length);
2268 static void bthci_ResetBtMgnt(PBT_MGNT pBtMgnt)
2270 pBtMgnt->BtOperationOn = _FALSE;
2271 pBtMgnt->bBTConnectInProgress = _FALSE;
2272 pBtMgnt->bLogLinkInProgress = _FALSE;
2273 pBtMgnt->bPhyLinkInProgress = _FALSE;
2274 pBtMgnt->bPhyLinkInProgressStartLL = _FALSE;
2275 pBtMgnt->DisconnectEntryNum = 0xff;
2276 pBtMgnt->bStartSendSupervisionPkt = _FALSE;
2277 pBtMgnt->JoinerNeedSendAuth = _FALSE;
2278 pBtMgnt->CurrentBTConnectionCnt = 0;
2279 pBtMgnt->BTCurrentConnectType = BT_DISCONNECT;
2280 pBtMgnt->BTReceiveConnectPkt = BT_DISCONNECT;
2281 pBtMgnt->BTAuthCount = 0;
2282 pBtMgnt->btLogoTest = 0;
2285 static void bthci_ResetBtHciInfo(PBT_HCI_INFO pBtHciInfo)
2287 pBtHciInfo->BTEventMask = 0;
2288 pBtHciInfo->BTEventMaskPage2 = 0;
2289 pBtHciInfo->ConnAcceptTimeout = 10000;
2290 pBtHciInfo->PageTimeout = 0x30;
2291 pBtHciInfo->LocationDomainAware = 0x0;
2292 pBtHciInfo->LocationDomain = 0x5858;
2293 pBtHciInfo->LocationDomainOptions = 0x58;
2294 pBtHciInfo->LocationOptions = 0x0;
2295 pBtHciInfo->FlowControlMode = 0x1; // 0:Packet based data flow control mode(BR/EDR), 1: Data block based data flow control mode(AMP).
2297 pBtHciInfo->enFlush_LLH = 0;
2298 pBtHciInfo->FLTO_LLH = 0;
2301 pBtHciInfo->bTestIsEnd = _TRUE;
2302 pBtHciInfo->bInTestMode = _FALSE;
2303 pBtHciInfo->bTestNeedReport = _FALSE;
2304 pBtHciInfo->TestScenario = 0xff;
2305 pBtHciInfo->TestReportInterval = 0x01;
2306 pBtHciInfo->TestCtrType = 0x5d;
2307 pBtHciInfo->TestEventType = 0x00;
2308 pBtHciInfo->TestNumOfFrame = 0;
2309 pBtHciInfo->TestNumOfErrFrame = 0;
2310 pBtHciInfo->TestNumOfBits = 0;
2311 pBtHciInfo->TestNumOfErrBits = 0;
2314 static void bthci_ResetBtSec(PADAPTER padapter, PBT_SECURITY pBtSec)
2316 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2318 // Set BT used HW or SW encrypt !!
2319 if (GET_HAL_DATA(padapter)->bBTMode)
2320 pBtSec->bUsedHwEncrypt = _TRUE;
2322 pBtSec->bUsedHwEncrypt = _FALSE;
2323 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("%s: bUsedHwEncrypt=%d\n", __FUNCTION__, pBtSec->bUsedHwEncrypt));
2325 pBtSec->RSNIE.Octet = pBtSec->RSNIEBuf;
2328 static void bthci_ResetBtExtInfo(PBT_MGNT pBtMgnt)
2332 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
2334 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = 0;
2335 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = 0;
2336 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = 0;
2337 pBtMgnt->ExtConfig.linkInfo[i].BTProfile = BT_PROFILE_NONE;
2338 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = BT_SPEC_2_1_EDR;
2339 pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI = 0;
2340 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
2341 pBtMgnt->ExtConfig.linkInfo[i].linkRole = BT_LINK_MASTER;
2344 pBtMgnt->ExtConfig.CurrentConnectHandle = 0;
2345 pBtMgnt->ExtConfig.CurrentIncomingTrafficMode = 0;
2346 pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode = 0;
2347 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
2348 pBtMgnt->ExtConfig.NumberOfHandle = 0;
2349 pBtMgnt->ExtConfig.NumberOfSCO = 0;
2350 pBtMgnt->ExtConfig.CurrentBTStatus = 0;
2351 pBtMgnt->ExtConfig.HCIExtensionVer = 0;
2353 pBtMgnt->ExtConfig.bManualControl = _FALSE;
2354 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
2355 pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
2358 static HCI_STATUS bthci_CmdReset(PADAPTER _padapter, u8 bNeedSendEvent)
2360 HCI_STATUS status = HCI_STATUS_SUCCESS;
2362 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2365 PBT_HCI_INFO pBtHciInfo;
2366 PBT_SECURITY pBtSec;
2371 RTPRINT(FIOCTL,IOCTL_BT_HCICMD, ("bthci_CmdReset()\n"));
2373 padapter = GetDefaultAdapter(_padapter);
2374 pBTInfo = GET_BT_INFO(padapter);
2375 pBtMgnt = &pBTInfo->BtMgnt;
2376 pBtHciInfo = &pBTInfo->BtHciInfo;
2377 pBtSec = &pBTInfo->BtSec;
2378 pBtDbg = &pBTInfo->BtDbg;
2380 pBTInfo->padapter = padapter;
2382 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
2384 bthci_ResetEntry(padapter, i);
2387 bthci_ResetBtMgnt(pBtMgnt);
2388 bthci_ResetBtHciInfo(pBtHciInfo);
2389 bthci_ResetBtSec(padapter, pBtSec);
2391 pBtMgnt->BTChannel = BT_Default_Chnl;
2392 pBtMgnt->CheckChnlIsSuit = _TRUE;
2394 pBTInfo->BTBeaconTmrOn = _FALSE;
2395 // QosInitializeBssDesc(&pBtMgnt->bssDesc.BssQos); // not implement yet
2397 pBtMgnt->bCreateSpportQos=_TRUE;
2399 PlatformCancelTimer(padapter, &pBTInfo->BTSupervisionPktTimer);
2400 #if (SENDTXMEHTOD == 0)
2401 PlatformCancelTimer(padapter, &pBTInfo->BTHCISendAclDataTimer);
2403 PlatformCancelTimer(padapter, &pBTInfo->BTHCIDiscardAclDataTimer);
2404 PlatformCancelTimer(padapter, &pBTInfo->BTBeaconTimer);
2406 HALBT_SetRtsCtsNoLenLimit(padapter);
2408 // Maybe we need to take care Group != AES case !!
2409 // now we Pairwise and Group all used AES !!
2410 // BTPKT_ConstructRSNIE(padapter); // not implement yet
2412 bthci_ResetBtExtInfo(pBtMgnt);
2414 //send command complete event here when all data are received.
2417 u8 localBuf[6] = "";
2420 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2422 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2424 len += bthci_CommandCompleteHeader(&localBuf[0],
2425 OGF_SET_EVENT_MASK_COMMAND,
2429 // Return parameters starts from here
2430 pRetPar = &PPacketIrpEvent->Data[len];
2431 pRetPar[0] = status; //status
2433 PPacketIrpEvent->Length = len;
2435 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2442 bthci_CmdWriteRemoteAMPAssoc(
2444 PPACKET_IRP_HCICMD_DATA pHciCmd
2447 HCI_STATUS status = HCI_STATUS_SUCCESS;
2448 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2449 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
2453 pBtDbg->dbgHciInfo.hciCmdCntWriteRemoteAmpAssoc++;
2454 PhyLinkHandle = *((u8*)pHciCmd->Data);
2455 CurrentAssocNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
2457 if (CurrentAssocNum == 0xff)
2459 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, No such Handle in the Entry\n"));
2460 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2461 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2465 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment == NULL)
2467 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, AMP controller is busy\n"));
2468 status = HCI_STATUS_CONTROLLER_BUSY;
2469 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2473 pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.BtPhyLinkhandle = PhyLinkHandle;//*((u8*)pHciCmd->Data);
2474 pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar = *((u16*)((u8*)pHciCmd->Data+1));
2475 pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen = *((u16*)((u8*)pHciCmd->Data+3));
2477 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc, LenSoFar= 0x%x, AssocRemLen= 0x%x\n",
2478 pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar,pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen));
2480 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("WriteRemoteAMPAssoc fragment \n"), pHciCmd->Data,pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen+5);
2481 if ((pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen) > MAX_AMP_ASSOC_FRAG_LEN)
2483 _rtw_memcpy(((u8*)pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment+(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar*(sizeof(u8)))),
2484 (u8*)pHciCmd->Data+5,
2485 MAX_AMP_ASSOC_FRAG_LEN);
2489 _rtw_memcpy((u8*)(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocfragment)+(pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.LenSoFar*(sizeof(u8))),
2490 ((u8*)pHciCmd->Data+5),
2491 (pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen));
2493 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "WriteRemoteAMPAssoc :\n",
2494 pHciCmd->Data+5, pBTInfo->BtAsocEntry[CurrentAssocNum].AmpAsocCmdData.AMPAssocRemLen);
2496 if (!bthci_GetAssocInfo(padapter, CurrentAssocNum))
2497 status=HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
2499 bthci_EventWriteRemoteAmpAssoc(padapter, status, PhyLinkHandle);
2501 bthci_StartBeaconAndConnect(padapter,pHciCmd,CurrentAssocNum);
2508 static HCI_STATUS bthci_CmdReadConnectionAcceptTimeout(PADAPTER padapter)
2510 HCI_STATUS status = HCI_STATUS_SUCCESS;
2511 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2512 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2513 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2516 u8 localBuf[8] = "";
2519 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2522 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2524 len += bthci_CommandCompleteHeader(&localBuf[0],
2525 OGF_SET_EVENT_MASK_COMMAND,
2526 HCI_READ_CONNECTION_ACCEPT_TIMEOUT,
2529 // Return parameters starts from here
2530 pRetPar = &PPacketIrpEvent->Data[len];
2531 pRetPar[0] = status; //status
2532 pu2Temp = (u16*)&pRetPar[1]; // Conn_Accept_Timeout
2533 *pu2Temp = pBtHciInfo->ConnAcceptTimeout;
2535 PPacketIrpEvent->Length = len;
2537 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2545 bthci_CmdSetEventFilter(
2547 PPACKET_IRP_HCICMD_DATA pHciCmd
2550 HCI_STATUS status = HCI_STATUS_SUCCESS;
2557 bthci_CmdWriteConnectionAcceptTimeout(
2559 PPACKET_IRP_HCICMD_DATA pHciCmd
2562 HCI_STATUS status = HCI_STATUS_SUCCESS;
2563 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2564 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2565 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2568 pu2Temp = (u16*)&pHciCmd->Data[0];
2569 pBtHciInfo->ConnAcceptTimeout = *pu2Temp;
2570 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("ConnAcceptTimeout = 0x%x",
2571 pBtHciInfo->ConnAcceptTimeout));
2573 //send command complete event here when all data are received.
2575 u8 localBuf[6] = "";
2578 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2580 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2582 len += bthci_CommandCompleteHeader(&localBuf[0],
2583 OGF_SET_EVENT_MASK_COMMAND,
2584 HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT,
2587 // Return parameters starts from here
2588 pRetPar = &PPacketIrpEvent->Data[len];
2589 pRetPar[0] = status; //status
2591 PPacketIrpEvent->Length = len;
2593 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2600 bthci_CmdReadPageTimeout(
2602 PPACKET_IRP_HCICMD_DATA pHciCmd
2605 HCI_STATUS status = HCI_STATUS_SUCCESS;
2606 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2607 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2608 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2611 u8 localBuf[8] = "";
2614 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2617 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2619 len += bthci_CommandCompleteHeader(&localBuf[0],
2620 OGF_SET_EVENT_MASK_COMMAND,
2621 HCI_READ_PAGE_TIMEOUT,
2624 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Read PageTimeout = 0x%x\n", pBtHciInfo->PageTimeout));
2625 // Return parameters starts from here
2626 pRetPar = &PPacketIrpEvent->Data[len];
2627 pRetPar[0] = status; //status
2628 pu2Temp = (u16*)&pRetPar[1]; // Page_Timeout
2629 *pu2Temp = pBtHciInfo->PageTimeout;
2631 PPacketIrpEvent->Length = len;
2633 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2640 bthci_CmdWritePageTimeout(
2642 PPACKET_IRP_HCICMD_DATA pHciCmd
2645 HCI_STATUS status = HCI_STATUS_SUCCESS;
2646 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2647 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2648 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2651 pu2Temp = (u16*)&pHciCmd->Data[0];
2652 pBtHciInfo->PageTimeout = *pu2Temp;
2653 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Write PageTimeout = 0x%x\n",
2654 pBtHciInfo->PageTimeout));
2656 //send command complete event here when all data are received.
2658 u8 localBuf[6] = "";
2661 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2663 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2665 len += bthci_CommandCompleteHeader(&localBuf[0],
2666 OGF_SET_EVENT_MASK_COMMAND,
2667 HCI_WRITE_PAGE_TIMEOUT,
2670 // Return parameters starts from here
2671 pRetPar = &PPacketIrpEvent->Data[len];
2672 pRetPar[0] = status; //status
2674 PPacketIrpEvent->Length = len;
2676 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2683 bthci_CmdReadLinkSupervisionTimeout(
2685 PPACKET_IRP_HCICMD_DATA pHciCmd
2688 HCI_STATUS status = HCI_STATUS_SUCCESS;
2689 PBT30Info pBTinfo = GET_BT_INFO(padapter);
2690 u8 physicalLinkHandle, EntryNum;
2692 physicalLinkHandle = *((u8*)pHciCmd->Data);
2694 EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
2696 if (EntryNum == 0xff)
2698 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLinkSupervisionTimeout, No such Handle in the Entry\n"));
2699 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2703 if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
2704 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2707 u8 localBuf[10] = "";
2710 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2713 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2715 len += bthci_CommandCompleteHeader(&localBuf[0],
2716 OGF_SET_EVENT_MASK_COMMAND,
2717 HCI_READ_LINK_SUPERVISION_TIMEOUT,
2720 // Return parameters starts from here
2721 pRetPar = &PPacketIrpEvent->Data[len];
2722 pRetPar[0] = status;
2723 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2725 pu2Temp = (u16*)&pRetPar[3]; // Conn_Accept_Timeout
2726 *pu2Temp = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout;
2728 PPacketIrpEvent->Length = len;
2730 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2737 bthci_CmdWriteLinkSupervisionTimeout(
2739 PPACKET_IRP_HCICMD_DATA pHciCmd
2742 HCI_STATUS status = HCI_STATUS_SUCCESS;
2743 PBT30Info pBTinfo = GET_BT_INFO(padapter);
2744 u8 physicalLinkHandle, EntryNum;
2746 physicalLinkHandle = *((u8*)pHciCmd->Data);
2748 EntryNum = bthci_GetCurrentEntryNum(padapter, physicalLinkHandle);
2750 if (EntryNum == 0xff)
2752 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("WriteLinkSupervisionTimeout, No such Handle in the Entry\n"));
2753 status=HCI_STATUS_UNKNOW_CONNECT_ID;
2757 if (pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle != physicalLinkHandle)
2758 status = HCI_STATUS_UNKNOW_CONNECT_ID;
2761 pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout=*((u16 *)(((u8*)pHciCmd->Data)+2));
2762 RTPRINT(FIOCTL, IOCTL_STATE, ("BT Write LinkSuperversionTimeout[%d] = 0x%x\n",
2763 EntryNum, pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.LinkSuperversionTimeout));
2768 u8 localBuf[8] = "";
2771 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2773 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2775 len += bthci_CommandCompleteHeader(&localBuf[0],
2776 OGF_SET_EVENT_MASK_COMMAND,
2777 HCI_WRITE_LINK_SUPERVISION_TIMEOUT,
2780 // Return parameters starts from here
2781 pRetPar = &PPacketIrpEvent->Data[len];
2782 pRetPar[0] = status;
2783 pRetPar[1] = pBTinfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle;
2786 PPacketIrpEvent->Length = len;
2788 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2795 bthci_CmdEnhancedFlush(
2797 PPACKET_IRP_HCICMD_DATA pHciCmd
2800 HCI_STATUS status = HCI_STATUS_SUCCESS;
2801 PBT30Info pBTinfo = GET_BT_INFO(padapter);
2802 PBT_HCI_INFO pBtHciInfo = &pBTinfo->BtHciInfo;
2806 logicHandle = *((u16*)&pHciCmd->Data[0]);
2807 Packet_Type = pHciCmd->Data[2];
2809 if (Packet_Type != 0)
2811 status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
2814 pBtHciInfo->enFlush_LLH = logicHandle;
2816 if (bthci_DiscardTxPackets(padapter, pBtHciInfo->enFlush_LLH))
2818 bthci_EventFlushOccurred(padapter, pBtHciInfo->enFlush_LLH);
2821 // should send command status event
2822 bthci_EventCommandStatus(padapter,
2823 OGF_SET_EVENT_MASK_COMMAND,
2827 if (pBtHciInfo->enFlush_LLH)
2829 bthci_EventEnhancedFlushComplete(padapter, pBtHciInfo->enFlush_LLH);
2830 pBtHciInfo->enFlush_LLH = 0;
2837 bthci_CmdReadLogicalLinkAcceptTimeout(
2839 PPACKET_IRP_HCICMD_DATA pHciCmd
2842 HCI_STATUS status = HCI_STATUS_SUCCESS;
2843 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2844 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2845 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2848 u8 localBuf[8] = "";
2851 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2854 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2856 len += bthci_CommandCompleteHeader(&localBuf[0],
2857 OGF_SET_EVENT_MASK_COMMAND,
2858 HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT,
2861 // Return parameters starts from here
2862 pRetPar = &PPacketIrpEvent->Data[len];
2863 pRetPar[0] = status;
2865 pu2Temp = (u16*)&pRetPar[1]; // Conn_Accept_Timeout
2866 *pu2Temp = pBtHciInfo->LogicalAcceptTimeout;
2868 PPacketIrpEvent->Length = len;
2870 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2877 bthci_CmdWriteLogicalLinkAcceptTimeout(
2879 PPACKET_IRP_HCICMD_DATA pHciCmd
2882 HCI_STATUS status = HCI_STATUS_SUCCESS;
2883 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2884 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2885 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2887 pBtHciInfo->LogicalAcceptTimeout = *((u16*)pHciCmd->Data);
2890 u8 localBuf[6] = "";
2893 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2895 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2897 len += bthci_CommandCompleteHeader(&localBuf[0],
2898 OGF_SET_EVENT_MASK_COMMAND,
2899 HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT,
2902 // Return parameters starts from here
2903 pRetPar = &PPacketIrpEvent->Data[len];
2904 pRetPar[0] = status;
2907 PPacketIrpEvent->Length = len;
2909 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2915 bthci_CmdSetEventMask(
2917 PPACKET_IRP_HCICMD_DATA pHciCmd
2920 HCI_STATUS status = HCI_STATUS_SUCCESS;
2921 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
2922 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2923 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2926 pu8Temp = (u8*)&pHciCmd->Data[0];
2927 pBtHciInfo->BTEventMask = *pu8Temp;
2929 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("BTEventMask = 0x%"i64fmt"x\n",
2930 ((pBtHciInfo->BTEventMask & UINT64_C(0xffffffff00000000))>>32)));
2931 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("%"i64fmt"x\n",
2932 (pBtHciInfo->BTEventMask & 0xffffffff)));
2934 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("BTEventMask = 0x%"i64fmt"x\n",
2935 pBtHciInfo->BTEventMask));
2938 //send command complete event here when all data are received.
2940 u8 localBuf[6] = "";
2943 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2945 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2947 len += bthci_CommandCompleteHeader(&localBuf[0],
2948 OGF_SET_EVENT_MASK_COMMAND,
2952 // Return parameters starts from here
2953 pRetPar = &PPacketIrpEvent->Data[len];
2954 pRetPar[0] = status; //status
2956 PPacketIrpEvent->Length = len;
2958 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
2966 bthci_CmdSetEventMaskPage2(
2968 PPACKET_IRP_HCICMD_DATA pHciCmd
2971 HCI_STATUS status = HCI_STATUS_SUCCESS;
2972 PBT30Info pBTInfo = GET_BT_INFO(padapter);
2973 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
2976 pu8Temp = (u8*)&pHciCmd->Data[0];
2977 pBtHciInfo->BTEventMaskPage2 = *pu8Temp;
2978 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("BTEventMaskPage2 = 0x%"i64fmt"x\n",
2979 pBtHciInfo->BTEventMaskPage2));
2981 //send command complete event here when all data are received.
2983 u8 localBuf[6] = "";
2986 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
2988 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
2990 len += bthci_CommandCompleteHeader(&localBuf[0],
2991 OGF_SET_EVENT_MASK_COMMAND,
2992 HCI_SET_EVENT_MASK_PAGE_2,
2995 // Return parameters starts from here
2996 pRetPar = &PPacketIrpEvent->Data[len];
2997 pRetPar[0] = status; //status
2999 PPacketIrpEvent->Length = len;
3001 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3008 bthci_CmdReadLocationData(
3010 PPACKET_IRP_HCICMD_DATA pHciCmd
3013 HCI_STATUS status = HCI_STATUS_SUCCESS;
3014 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3015 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3016 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3019 u8 localBuf[12] = "";
3022 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3025 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3027 len += bthci_CommandCompleteHeader(&localBuf[0],
3028 OGF_SET_EVENT_MASK_COMMAND,
3029 HCI_READ_LOCATION_DATA,
3031 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainAware = 0x%x\n", pBtHciInfo->LocationDomainAware));
3032 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Domain = 0x%x\n", pBtHciInfo->LocationDomain));
3033 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainOptions = 0x%x\n", pBtHciInfo->LocationDomainOptions));
3034 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Options = 0x%x\n", pBtHciInfo->LocationOptions));
3036 // Return parameters starts from here
3037 pRetPar = &PPacketIrpEvent->Data[len];
3038 pRetPar[0] = status;
3040 pRetPar[1] = pBtHciInfo->LocationDomainAware; //0x0; // Location_Domain_Aware
3041 pu2Temp = (u16*)&pRetPar[2]; // Location_Domain
3042 *pu2Temp = pBtHciInfo->LocationDomain; //0x5858;
3043 pRetPar[4] = pBtHciInfo->LocationDomainOptions; //0x58; //Location_Domain_Options
3044 pRetPar[5] = pBtHciInfo->LocationOptions; //0x0; //Location_Options
3046 PPacketIrpEvent->Length = len;
3048 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3054 bthci_CmdWriteLocationData(
3056 PPACKET_IRP_HCICMD_DATA pHciCmd
3059 HCI_STATUS status = HCI_STATUS_SUCCESS;
3060 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3061 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3064 pBtHciInfo->LocationDomainAware = pHciCmd->Data[0];
3065 pu2Temp = (u16*)&pHciCmd->Data[1];
3066 pBtHciInfo->LocationDomain = *pu2Temp;
3067 pBtHciInfo->LocationDomainOptions = pHciCmd->Data[3];
3068 pBtHciInfo->LocationOptions = pHciCmd->Data[4];
3069 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainAware = 0x%x\n", pBtHciInfo->LocationDomainAware));
3070 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Domain = 0x%x\n", pBtHciInfo->LocationDomain));
3071 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DomainOptions = 0x%x\n", pBtHciInfo->LocationDomainOptions));
3072 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Options = 0x%x\n", pBtHciInfo->LocationOptions));
3074 //send command complete event here when all data are received.
3076 u8 localBuf[6] = "";
3079 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3081 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3083 len += bthci_CommandCompleteHeader(&localBuf[0],
3084 OGF_SET_EVENT_MASK_COMMAND,
3085 HCI_WRITE_LOCATION_DATA,
3088 // Return parameters starts from here
3089 pRetPar = &PPacketIrpEvent->Data[len];
3090 pRetPar[0] = status; //status
3092 PPacketIrpEvent->Length = len;
3094 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3101 bthci_CmdReadFlowControlMode(
3103 PPACKET_IRP_HCICMD_DATA pHciCmd
3106 HCI_STATUS status = HCI_STATUS_SUCCESS;
3107 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3108 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3111 u8 localBuf[7] = "";
3114 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3116 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3118 len += bthci_CommandCompleteHeader(&localBuf[0],
3119 OGF_SET_EVENT_MASK_COMMAND,
3120 HCI_READ_FLOW_CONTROL_MODE,
3123 // Return parameters starts from here
3124 pRetPar = &PPacketIrpEvent->Data[len];
3125 pRetPar[0] = status;
3126 pRetPar[1] = pBtHciInfo->FlowControlMode; // Flow Control Mode
3128 PPacketIrpEvent->Length = len;
3130 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3136 bthci_CmdWriteFlowControlMode(
3138 PPACKET_IRP_HCICMD_DATA pHciCmd
3141 HCI_STATUS status = HCI_STATUS_SUCCESS;
3142 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3143 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3144 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3146 pBtHciInfo->FlowControlMode = pHciCmd->Data[0];
3148 //send command complete event here when all data are received.
3150 u8 localBuf[6] = "";
3153 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3155 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3157 len += bthci_CommandCompleteHeader(&localBuf[0],
3158 OGF_SET_EVENT_MASK_COMMAND,
3159 HCI_WRITE_FLOW_CONTROL_MODE,
3162 // Return parameters starts from here
3163 pRetPar = &PPacketIrpEvent->Data[len];
3164 pRetPar[0] = status; //status
3166 PPacketIrpEvent->Length = len;
3168 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3175 bthci_CmdReadBestEffortFlushTimeout(
3177 PPACKET_IRP_HCICMD_DATA pHciCmd
3180 HCI_STATUS status = HCI_STATUS_SUCCESS;
3181 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3182 u16 i, j, logicHandle;
3183 u32 BestEffortFlushTimeout = 0xffffffff;
3186 logicHandle = *((u16*)pHciCmd->Data);
3187 // find an matched logical link index and copy the data
3188 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
3190 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3192 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3194 BestEffortFlushTimeout = pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout;
3202 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3205 u8 localBuf[10] = "";
3208 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3211 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3213 len += bthci_CommandCompleteHeader(&localBuf[0],
3214 OGF_SET_EVENT_MASK_COMMAND,
3215 HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT,
3218 // Return parameters starts from here
3219 pRetPar = &PPacketIrpEvent->Data[len];
3220 pRetPar[0] = status;
3221 pu4Temp = (u32*)&pRetPar[1]; // Best_Effort_Flush_Timeout
3222 *pu4Temp = BestEffortFlushTimeout;
3224 PPacketIrpEvent->Length = len;
3226 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3232 bthci_CmdWriteBestEffortFlushTimeout(
3234 PPACKET_IRP_HCICMD_DATA pHciCmd
3237 HCI_STATUS status = HCI_STATUS_SUCCESS;
3238 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3239 u16 i, j, logicHandle;
3240 u32 BestEffortFlushTimeout = 0xffffffff;
3243 logicHandle = *((u16*)pHciCmd->Data);
3244 BestEffortFlushTimeout = *((u32 *)(pHciCmd->Data+1));
3246 // find an matched logical link index and copy the data
3247 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
3249 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3251 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3253 pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BestEffortFlushTimeout = BestEffortFlushTimeout;
3261 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3264 u8 localBuf[6] = "";
3267 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3269 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3271 len += bthci_CommandCompleteHeader(&localBuf[0],
3272 OGF_SET_EVENT_MASK_COMMAND,
3273 HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT,
3276 // Return parameters starts from here
3277 pRetPar = &PPacketIrpEvent->Data[len];
3278 pRetPar[0] = status;
3280 PPacketIrpEvent->Length = len;
3282 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3288 bthci_CmdShortRangeMode(
3290 PPACKET_IRP_HCICMD_DATA pHciCmd
3293 HCI_STATUS status = HCI_STATUS_SUCCESS;
3294 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3295 u8 PhyLinkHandle, EntryNum, ShortRangeMode;
3297 PhyLinkHandle = pHciCmd->Data[0];
3298 ShortRangeMode = pHciCmd->Data[1];
3299 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PLH = 0x%x, Short_Range_Mode = 0x%x\n", PhyLinkHandle, ShortRangeMode));
3301 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3302 if (EntryNum != 0xff)
3304 pBTInfo->BtAsocEntry[EntryNum].ShortRangeMode = ShortRangeMode;
3308 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PhyLinkHandle));
3309 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3312 bthci_EventCommandStatus(padapter,
3313 OGF_SET_EVENT_MASK_COMMAND,
3314 HCI_SHORT_RANGE_MODE,
3317 bthci_EventShortRangeModeChangeComplete(padapter, status, ShortRangeMode, EntryNum);
3322 static HCI_STATUS bthci_CmdReadLocalSupportedCommands(PADAPTER padapter)
3324 HCI_STATUS status = HCI_STATUS_SUCCESS;
3326 // send command complete event here when all data are received.
3328 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3329 u8 localBuf[TmpLocalBufSize] = "";
3330 u8 *pRetPar, *pSupportedCmds;
3332 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3334 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3335 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3336 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3338 len += bthci_CommandCompleteHeader(&localBuf[0],
3339 OGF_INFORMATIONAL_PARAMETERS,
3340 HCI_READ_LOCAL_SUPPORTED_COMMANDS,
3343 // Return parameters starts from here
3344 pRetPar = &PPacketIrpEvent->Data[len];
3345 pRetPar[0] = status; //status
3347 pSupportedCmds = &pRetPar[1];
3348 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[5]=0xc0\nBit [6]=Set Event Mask, [7]=Reset\n"));
3349 pSupportedCmds[5] = 0xc0;
3350 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[6]=0x01\nBit [0]=Set Event Filter\n"));
3351 pSupportedCmds[6] = 0x01;
3352 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[7]=0x0c\nBit [2]=Read Connection Accept Timeout, [3]=Write Connection Accept Timeout\n"));
3353 pSupportedCmds[7] = 0x0c;
3354 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[10]=0x80\nBit [7]=Host Number Of Completed Packets\n"));
3355 pSupportedCmds[10] = 0x80;
3356 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[11]=0x03\nBit [0]=Read Link Supervision Timeout, [1]=Write Link Supervision Timeout\n"));
3357 pSupportedCmds[11] = 0x03;
3358 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"));
3359 pSupportedCmds[14] = 0xa8;
3360 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"));
3361 pSupportedCmds[15] = 0x1c;
3362 //pSupportedCmds[16] = 0x04;
3363 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD|IOCTL_BT_LOGO), ("Octet[19]=0x40\nBit [6]=Enhanced Flush\n"));
3364 pSupportedCmds[19] = 0x40;
3365 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"));
3366 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"));
3367 pSupportedCmds[21] = 0xff;
3368 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"));
3369 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"));
3370 pSupportedCmds[22] = 0xff;
3371 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"));
3372 pSupportedCmds[23] = 0x07;
3373 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"));
3374 pSupportedCmds[24] = 0x1c;
3376 PPacketIrpEvent->Length = len;
3378 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3384 static HCI_STATUS bthci_CmdReadLocalSupportedFeatures(PADAPTER padapter)
3386 HCI_STATUS status = HCI_STATUS_SUCCESS;
3388 //send command complete event here when all data are received.
3390 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3391 u8 localBuf[TmpLocalBufSize] = "";
3394 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3396 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3397 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3398 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3400 len += bthci_CommandCompleteHeader(&localBuf[0],
3401 OGF_INFORMATIONAL_PARAMETERS,
3402 HCI_READ_LOCAL_SUPPORTED_FEATURES,
3405 // Return parameters starts from here
3406 pRetPar = &PPacketIrpEvent->Data[len];
3407 pRetPar[0] = status; //status
3409 PPacketIrpEvent->Length = len;
3411 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3417 bthci_CmdReadLocalAMPAssoc(
3419 PPACKET_IRP_HCICMD_DATA pHciCmd
3422 HCI_STATUS status = HCI_STATUS_SUCCESS;
3423 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3424 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
3425 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
3426 u8 PhyLinkHandle, EntryNum;
3428 pBtDbg->dbgHciInfo.hciCmdCntReadLocalAmpAssoc++;
3429 PhyLinkHandle = *((u8*)pHciCmd->Data);
3430 EntryNum = bthci_GetCurrentEntryNum(padapter, PhyLinkHandle);
3432 if ((EntryNum==0xff) && PhyLinkHandle != 0)
3434 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, EntryNum = %d !!!!!, physical link handle = 0x%x\n",
3435 EntryNum, PhyLinkHandle));
3436 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3438 else if (pBtMgnt->bPhyLinkInProgressStartLL)
3440 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3441 pBtMgnt->bPhyLinkInProgressStartLL = _FALSE;
3445 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle = *((u8*)pHciCmd->Data);
3446 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar = *((u16*)((u8*)pHciCmd->Data+1));
3447 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.MaxRemoteASSOCLen = *((u16*)((u8*)pHciCmd->Data+3));
3448 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("ReadLocalAMPAssoc, LenSoFar=%d, MaxRemoteASSOCLen=%d\n",
3449 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar,
3450 pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.MaxRemoteASSOCLen));
3453 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, EntryNum = %d !!!!!, physical link handle = 0x%x, LengthSoFar = %x \n",
3454 EntryNum, PhyLinkHandle, pBTInfo->BtAsocEntry[EntryNum].AmpAsocCmdData.LenSoFar));
3456 //send command complete event here when all data are received.
3458 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3460 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3461 u8 localBuf[TmpLocalBufSize] = "";
3464 u16 typeLen=0, remainLen=0, ret_index=0;
3467 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3468 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3469 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3471 totalLen += bthci_CommandCompleteHeader(&localBuf[0],
3472 OGF_STATUS_PARAMETERS,
3473 HCI_READ_LOCAL_AMP_ASSOC,
3475 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, Remaining_Len=%d \n", remainLen));
3476 // Return parameters starts from here
3477 pRetPar = &PPacketIrpEvent->Data[totalLen];
3478 pRetPar[0] = status; //status
3479 pRetPar[1] = *((u8*)pHciCmd->Data);
3480 pRemainLen = (u16*)&pRetPar[2]; // AMP_ASSOC_Remaining_Length
3481 totalLen += 4; //[0]~[3]
3484 typeLen = bthci_AssocMACAddr(padapter, &pRetPar[ret_index]);
3485 totalLen += typeLen;
3486 remainLen += typeLen;
3487 ret_index += typeLen;
3488 typeLen = bthci_AssocPreferredChannelList(padapter, &pRetPar[ret_index], EntryNum);
3489 totalLen += typeLen;
3490 remainLen += typeLen;
3491 ret_index += typeLen;
3492 typeLen = bthci_PALCapabilities(padapter, &pRetPar[ret_index]);
3493 totalLen += typeLen;
3494 remainLen += typeLen;
3495 ret_index += typeLen;
3496 typeLen = bthci_AssocPALVer(padapter, &pRetPar[ret_index]);
3497 totalLen += typeLen;
3498 remainLen += typeLen;
3499 #if 0//for logo special test case only
3500 ret_index += typeLen;
3501 typeLen = bthci_ReservedForTestingPLV(padapter, &pRetPar[ret_index]);
3502 totalLen += typeLen;
3503 remainLen += typeLen;
3505 PPacketIrpEvent->Length = (UCHAR)totalLen;
3506 *pRemainLen = remainLen; // AMP_ASSOC_Remaining_Length
3507 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("ReadLocalAMPAssoc, Remaining_Len=%d \n", remainLen));
3508 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("AMP_ASSOC_fragment : \n"), PPacketIrpEvent->Data, totalLen);
3510 bthci_IndicateEvent(padapter, PPacketIrpEvent, totalLen+2);
3517 bthci_CmdReadFailedContactCounter(
3519 PPACKET_IRP_HCICMD_DATA pHciCmd
3523 HCI_STATUS status = HCI_STATUS_SUCCESS;
3524 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3525 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3526 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3529 handle=*((u16*)pHciCmd->Data);
3530 //send command complete event here when all data are received.
3532 u8 localBuf[TmpLocalBufSize] = "";
3535 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3537 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3538 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3540 len += bthci_CommandCompleteHeader(&localBuf[0],
3541 OGF_STATUS_PARAMETERS,
3542 HCI_READ_FAILED_CONTACT_COUNTER,
3545 // Return parameters starts from here
3546 pRetPar = &PPacketIrpEvent->Data[len];
3547 pRetPar[0] = status; //status
3548 pRetPar[1] = TWOBYTE_LOWBYTE(handle);
3549 pRetPar[2] = TWOBYTE_HIGHTBYTE(handle);
3550 pRetPar[3] = TWOBYTE_LOWBYTE(pBtHciInfo->FailContactCount);
3551 pRetPar[4] = TWOBYTE_HIGHTBYTE(pBtHciInfo->FailContactCount);
3553 PPacketIrpEvent->Length = len;
3555 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3562 bthci_CmdResetFailedContactCounter(
3564 PPACKET_IRP_HCICMD_DATA pHciCmd
3567 HCI_STATUS status = HCI_STATUS_SUCCESS;
3568 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3569 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3570 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
3573 handle=*((u16*)pHciCmd->Data);
3574 pBtHciInfo->FailContactCount=0;
3576 //send command complete event here when all data are received.
3578 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3579 u8 localBuf[TmpLocalBufSize] = "";
3582 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3584 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3585 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3586 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3588 len += bthci_CommandCompleteHeader(&localBuf[0],
3589 OGF_STATUS_PARAMETERS,
3590 HCI_RESET_FAILED_CONTACT_COUNTER,
3593 // Return parameters starts from here
3594 pRetPar = &PPacketIrpEvent->Data[len];
3595 pRetPar[0] = status; //status
3596 pRetPar[1] = TWOBYTE_LOWBYTE(handle);
3597 pRetPar[2] = TWOBYTE_HIGHTBYTE(handle);
3599 PPacketIrpEvent->Length = len;
3601 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3607 // BT 3.0+HS [Vol 2] 7.4.1
3610 bthci_CmdReadLocalVersionInformation(
3614 HCI_STATUS status = HCI_STATUS_SUCCESS;
3616 //send command complete event here when all data are received.
3618 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3619 u8 localBuf[TmpLocalBufSize] = "";
3622 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3625 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3626 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3627 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3629 len += bthci_CommandCompleteHeader(&localBuf[0],
3630 OGF_INFORMATIONAL_PARAMETERS,
3631 HCI_READ_LOCAL_VERSION_INFORMATION,
3634 // Return parameters starts from here
3635 pRetPar = &PPacketIrpEvent->Data[len];
3636 pRetPar[0] = status; //status
3637 pRetPar[1] = 0x05; // HCI_Version
3638 pu2Temp = (u16*)&pRetPar[2]; // HCI_Revision
3640 pRetPar[4] = 0x05; // LMP/PAL_Version
3641 pu2Temp = (u16*)&pRetPar[5]; // Manufacturer_Name
3643 pu2Temp = (u16*)&pRetPar[7]; // LMP/PAL_Subversion
3646 PPacketIrpEvent->Length = len;
3648 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LOCAL_VERSION_INFORMATION\n"));
3649 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("Status %x\n",status));
3650 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI_Version = 0x05\n"));
3651 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI_Revision = 0x0001\n"));
3652 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LMP/PAL_Version = 0x05\n"));
3653 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("Manufacturer_Name = 0x0001\n"));
3654 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("LMP/PAL_Subversion = 0x0001\n"));
3656 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3663 static HCI_STATUS bthci_CmdReadDataBlockSize(PADAPTER padapter)
3665 HCI_STATUS status = HCI_STATUS_SUCCESS;
3668 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3669 u8 localBuf[TmpLocalBufSize] = "";
3672 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3675 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3676 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3677 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3679 len += bthci_CommandCompleteHeader(&localBuf[0],
3680 OGF_INFORMATIONAL_PARAMETERS,
3681 HCI_READ_DATA_BLOCK_SIZE,
3684 // Return parameters starts from here
3685 pRetPar = &PPacketIrpEvent->Data[len];
3686 pRetPar[0] = HCI_STATUS_SUCCESS; //status
3687 pu2Temp = (u16*)&pRetPar[1]; // Max_ACL_Data_Packet_Length
3688 *pu2Temp = Max80211PALPDUSize;
3690 pu2Temp = (u16*)&pRetPar[3]; // Data_Block_Length
3691 *pu2Temp = Max80211PALPDUSize;
3692 pu2Temp = (u16*)&pRetPar[5]; // Total_Num_Data_Blocks
3693 *pu2Temp = BTTotalDataBlockNum;
3695 PPacketIrpEvent->Length = len;
3697 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3705 bthci_CmdReadBufferSize(
3709 HCI_STATUS status = HCI_STATUS_SUCCESS;
3712 //PVOID buffer = padapter->IrpHCILocalbuf.Ptr;
3713 u8 localBuf[TmpLocalBufSize] = "";
3716 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3719 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3720 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3721 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3723 len += bthci_CommandCompleteHeader(&localBuf[0],
3724 OGF_INFORMATIONAL_PARAMETERS,
3725 HCI_READ_BUFFER_SIZE,
3727 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Synchronous_Data_Packet_Length = 0x%x\n", BTSynDataPacketLength));
3728 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Total_Num_ACL_Data_Packets = 0x%x\n", BTTotalDataBlockNum));
3729 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("Total_Num_Synchronous_Data_Packets = 0x%x\n", BTTotalDataBlockNum));
3730 // Return parameters starts from here
3731 pRetPar = &PPacketIrpEvent->Data[len];
3732 pRetPar[0] = status; //status
3733 pu2Temp = (u16*)&pRetPar[1]; // HC_ACL_Data_Packet_Length
3734 *pu2Temp = Max80211PALPDUSize;
3736 pRetPar[3] = BTSynDataPacketLength; // HC_Synchronous_Data_Packet_Length
3737 pu2Temp = (u16*)&pRetPar[4]; // HC_Total_Num_ACL_Data_Packets
3738 *pu2Temp = BTTotalDataBlockNum;
3739 pu2Temp = (u16*)&pRetPar[6]; // HC_Total_Num_Synchronous_Data_Packets
3740 *pu2Temp = BTTotalDataBlockNum;
3742 PPacketIrpEvent->Length = len;
3744 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3751 bthci_CmdReadLocalAMPInfo(
3755 HCI_STATUS status = HCI_STATUS_SUCCESS;
3758 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3759 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
3760 u8 localBuf[TmpLocalBufSize] = "";
3763 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3766 u32 TotalBandwidth=BTTOTALBANDWIDTH, MaxBandGUBandwidth=BTMAXBANDGUBANDWIDTH;
3767 u8 ControlType=0x01, AmpStatus=0x01;
3768 u32 MaxFlushTimeout=10000, BestEffortFlushTimeout=5000;
3769 u16 MaxPDUSize=Max80211PALPDUSize, PalCap=0x1, AmpAssocLen=Max80211AMPASSOCLen, MinLatency=20;
3771 if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
3772 (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
3774 AmpStatus = AMP_STATUS_NO_CAPACITY_FOR_BT;
3777 PlatformZeroMemory(&localBuf[0], TmpLocalBufSize);
3778 //PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(buffer);
3779 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3781 len += bthci_CommandCompleteHeader(&localBuf[0],
3782 OGF_STATUS_PARAMETERS,
3783 HCI_READ_LOCAL_AMP_INFO,
3786 // Return parameters starts from here
3787 pRetPar = &PPacketIrpEvent->Data[len];
3788 pRetPar[0] = status; //status
3789 pRetPar[1] = AmpStatus; // AMP_Status
3790 pu4Temp = (u32*)&pRetPar[2]; // Total_Bandwidth
3791 *pu4Temp = TotalBandwidth;//0x19bfcc00;//0x7530;
3792 pu4Temp = (u32*)&pRetPar[6]; // Max_Guaranteed_Bandwidth
3793 *pu4Temp = MaxBandGUBandwidth;//0x19bfcc00;//0x4e20;
3794 pu4Temp = (u32*)&pRetPar[10]; // Min_Latency
3795 *pu4Temp = MinLatency;//150;
3796 pu4Temp = (u32*)&pRetPar[14]; // Max_PDU_Size
3797 *pu4Temp = MaxPDUSize;
3798 pRetPar[18] = ControlType; // Controller_Type
3799 pu2Temp = (u16*)&pRetPar[19]; // PAL_Capabilities
3801 pu2Temp = (u16*)&pRetPar[21]; // AMP_ASSOC_Length
3802 *pu2Temp = AmpAssocLen;
3803 pu4Temp = (u32*)&pRetPar[23]; // Max_Flush_Timeout
3804 *pu4Temp = MaxFlushTimeout;
3805 pu4Temp = (u32*)&pRetPar[27]; // Best_Effort_Flush_Timeout
3806 *pu4Temp = BestEffortFlushTimeout;
3808 PPacketIrpEvent->Length = len;
3809 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("AmpStatus = 0x%x\n",
3811 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("TotalBandwidth = 0x%x, MaxBandGUBandwidth = 0x%x, MinLatency = 0x%x, \n MaxPDUSize = 0x%x, ControlType = 0x%x\n",
3812 TotalBandwidth,MaxBandGUBandwidth,MinLatency,MaxPDUSize,ControlType));
3813 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PalCap = 0x%x, AmpAssocLen = 0x%x, MaxFlushTimeout = 0x%x, BestEffortFlushTimeout = 0x%x\n",
3814 PalCap,AmpAssocLen,MaxFlushTimeout,BestEffortFlushTimeout));
3815 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3822 bthci_CmdCreatePhysicalLink(
3824 PPACKET_IRP_HCICMD_DATA pHciCmd
3828 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3829 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
3831 pBtDbg->dbgHciInfo.hciCmdCntCreatePhyLink++;
3833 status = bthci_BuildPhysicalLink(padapter,
3834 pHciCmd, HCI_CREATE_PHYSICAL_LINK);
3840 bthci_CmdReadLinkQuality(
3842 PPACKET_IRP_HCICMD_DATA pHciCmd
3845 HCI_STATUS status = HCI_STATUS_SUCCESS;
3846 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3848 u8 EntryNum, LinkQuality=0x55;
3850 PLH = *((u16*)&pHciCmd->Data[0]);
3851 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("PLH = 0x%x\n", PLH));
3853 EntryNum = bthci_GetCurrentEntryNum(padapter, (u8)PLH);
3854 if (EntryNum == 0xff)
3856 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("No such PLH(0x%x)\n", PLH));
3857 status=HCI_STATUS_UNKNOW_CONNECT_ID;
3861 u8 localBuf[11] = "";
3864 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
3866 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
3868 len += bthci_CommandCompleteHeader(&localBuf[0],
3869 OGF_STATUS_PARAMETERS,
3870 HCI_READ_LINK_QUALITY,
3873 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" PLH = 0x%x\n Link Quality = 0x%x\n", PLH, LinkQuality));
3875 // Return parameters starts from here
3876 pRetPar = &PPacketIrpEvent->Data[len];
3877 pRetPar[0] = status; //status
3878 *((u16*)&(pRetPar[1])) = pBTInfo->BtAsocEntry[EntryNum].PhyLinkCmdData.BtPhyLinkhandle; // Handle
3879 pRetPar[3] = 0x55; //Link Quailty
3881 PPacketIrpEvent->Length = len;
3883 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
3889 static HCI_STATUS bthci_CmdReadRSSI(PADAPTER padapter)
3891 HCI_STATUS status = HCI_STATUS_SUCCESS;
3896 bthci_CmdCreateLogicalLink(
3898 PPACKET_IRP_HCICMD_DATA pHciCmd
3901 HCI_STATUS status = HCI_STATUS_SUCCESS;
3902 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3903 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
3905 pBtDbg->dbgHciInfo.hciCmdCntCreateLogLink++;
3907 bthci_BuildLogicalLink(padapter, pHciCmd,
3908 HCI_CREATE_LOGICAL_LINK);
3914 bthci_CmdAcceptLogicalLink(
3916 PPACKET_IRP_HCICMD_DATA pHciCmd
3919 HCI_STATUS status = HCI_STATUS_SUCCESS;
3920 PBT30Info pBTInfo = GET_BT_INFO(padapter);
3921 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
3923 pBtDbg->dbgHciInfo.hciCmdCntAcceptLogLink++;
3925 bthci_BuildLogicalLink(padapter, pHciCmd,
3926 HCI_ACCEPT_LOGICAL_LINK);
3932 bthci_CmdDisconnectLogicalLink(
3934 PPACKET_IRP_HCICMD_DATA pHciCmd
3937 HCI_STATUS status = HCI_STATUS_SUCCESS;
3938 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
3939 PBT30Info pBTinfo = GET_BT_INFO(padapter);
3940 PBT_MGNT pBtMgnt = &pBTinfo->BtMgnt;
3941 PBT_DBG pBtDbg = &pBTinfo->BtDbg;
3943 u8 i, j, find=0, LogLinkCount=0;
3945 pBtDbg->dbgHciInfo.hciCmdCntDisconnectLogLink++;
3947 logicHandle = *((u16*)pHciCmd->Data);
3948 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle = 0x%x\n", logicHandle));
3950 // find an created logical link index and clear the data
3951 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM;j++)
3953 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3955 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
3957 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectLogicalLink, logicHandle is matched 0x%x\n", logicHandle));
3958 bthci_ResetFlowSpec(padapter, j, i);
3960 pBtMgnt->DisconnectEntryNum = j;
3967 status = HCI_STATUS_UNKNOW_CONNECT_ID;
3970 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
3972 if (pBTinfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].LogLinkCmdData[i].BtLogLinkhandle !=0)
3978 //When we receive Create logical link command, we should send command status event first.
3979 bthci_EventCommandStatus(padapter,
3980 OGF_LINK_CONTROL_COMMANDS,
3981 HCI_DISCONNECT_LOGICAL_LINK,
3984 //When we determines the logical link is established, we should send command complete event.
3986 if (status == HCI_STATUS_SUCCESS)
3988 bthci_EventDisconnectLogicalLinkComplete(padapter, status,
3989 logicHandle, HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST);
3992 if (LogLinkCount == 0)
3993 PlatformSetTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer, 100);
3999 bthci_CmdLogicalLinkCancel(
4001 PPACKET_IRP_HCICMD_DATA pHciCmd
4004 HCI_STATUS status = HCI_STATUS_SUCCESS;
4005 PBT30Info pBTinfo = GET_BT_INFO(padapter);
4006 PBT_MGNT pBtMgnt = &pBTinfo->BtMgnt;
4007 u8 CurrentEntryNum, CurrentLogEntryNum;
4009 u8 physicalLinkHandle, TxFlowSpecID,i;
4010 u16 CurrentLogicalHandle;
4012 physicalLinkHandle = *((u8*)pHciCmd->Data);
4013 TxFlowSpecID = *(((u8*)pHciCmd->Data)+1);
4015 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, physicalLinkHandle = 0x%x, TxFlowSpecID = 0x%x\n",
4016 physicalLinkHandle, TxFlowSpecID));
4018 CurrentEntryNum=pBtMgnt->CurrentConnectEntryNum;
4019 CurrentLogicalHandle = pBtMgnt->BtCurrentLogLinkhandle;
4021 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("CurrentEntryNum=0x%x, CurrentLogicalHandle = 0x%x\n",
4022 CurrentEntryNum, CurrentLogicalHandle));
4024 CurrentLogEntryNum = 0xff;
4025 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4027 if ((CurrentLogicalHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtLogLinkhandle) &&
4028 (physicalLinkHandle == pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[i].BtPhyLinkhandle))
4030 CurrentLogEntryNum = i;
4035 if (CurrentLogEntryNum == 0xff)
4037 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, CurrentLogEntryNum==0xff !!!!\n"));
4038 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4042 if (pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCompleteEventIsSet)
4044 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("LogicalLinkCancel, LLCompleteEventIsSet!!!!\n"));
4045 status=HCI_STATUS_ACL_CONNECT_EXISTS;
4050 u8 localBuf[8] = "";
4053 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4055 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4057 len += bthci_CommandCompleteHeader(&localBuf[0],
4058 OGF_LINK_CONTROL_COMMANDS,
4059 HCI_LOGICAL_LINK_CANCEL,
4062 // Return parameters starts from here
4063 pRetPar = &PPacketIrpEvent->Data[len];
4064 pRetPar[0] = status; //status
4065 pRetPar[1] = pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].BtPhyLinkhandle;
4066 pRetPar[2] = pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].BtTxFlowSpecID;
4068 PPacketIrpEvent->Length = len;
4070 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4073 pBTinfo->BtAsocEntry[CurrentEntryNum].LogLinkCmdData[CurrentLogEntryNum].bLLCancelCMDIsSetandComplete=_TRUE;
4079 bthci_CmdFlowSpecModify(
4081 PPACKET_IRP_HCICMD_DATA pHciCmd
4084 HCI_STATUS status = HCI_STATUS_SUCCESS;
4085 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4086 PBT30Info pBTinfo = GET_BT_INFO(padapter);
4090 logicHandle = *((u16*)pHciCmd->Data);
4091 // find an matched logical link index and copy the data
4092 for (j=0;j<MAX_BT_ASOC_ENTRY_NUM;j++)
4094 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
4096 if (pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle == logicHandle)
4098 _rtw_memcpy(&pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Tx_Flow_Spec,
4099 &pHciCmd->Data[2], sizeof(HCI_FLOW_SPEC));
4100 _rtw_memcpy(&pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Rx_Flow_Spec,
4101 &pHciCmd->Data[18], sizeof(HCI_FLOW_SPEC));
4103 bthci_CheckLogLinkBehavior(padapter, pBTinfo->BtAsocEntry[j].LogLinkCmdData[i].Tx_Flow_Spec);
4109 RTPRINT(FIOCTL, IOCTL_BT_LOGO, ("FlowSpecModify, LLH = 0x%x, \n",logicHandle));
4111 //When we receive Flow Spec Modify command, we should send command status event first.
4112 bthci_EventCommandStatus(padapter,
4113 OGF_LINK_CONTROL_COMMANDS,
4114 HCI_FLOW_SPEC_MODIFY,
4115 HCI_STATUS_SUCCESS);
4118 status = HCI_STATUS_UNKNOW_CONNECT_ID;
4120 bthci_EventSendFlowSpecModifyComplete(padapter, status, logicHandle);
4126 bthci_CmdAcceptPhysicalLink(
4128 PPACKET_IRP_HCICMD_DATA pHciCmd
4132 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4133 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4135 pBtDbg->dbgHciInfo.hciCmdCntAcceptPhyLink++;
4137 status = bthci_BuildPhysicalLink(padapter,
4138 pHciCmd, HCI_ACCEPT_PHYSICAL_LINK);
4144 bthci_CmdDisconnectPhysicalLink(
4146 PPACKET_IRP_HCICMD_DATA pHciCmd
4150 HCI_STATUS status = HCI_STATUS_SUCCESS;
4151 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4152 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4153 u8 PLH, CurrentEntryNum, PhysLinkDisconnectReason;
4155 pBtDbg->dbgHciInfo.hciCmdCntDisconnectPhyLink++;
4157 PLH = *((u8*)pHciCmd->Data);
4158 PhysLinkDisconnectReason = (*((u8*)pHciCmd->Data+1));
4159 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_PHYSICAL_LINK PhyHandle = 0x%x, Reason=0x%x\n",
4160 PLH, PhysLinkDisconnectReason));
4162 CurrentEntryNum = bthci_GetCurrentEntryNum(padapter, PLH);
4164 if (CurrentEntryNum == 0xff)
4166 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("DisconnectPhysicalLink, No such Handle in the Entry\n"));
4167 status=HCI_STATUS_UNKNOW_CONNECT_ID;
4171 pBTInfo->BtAsocEntry[CurrentEntryNum].PhyLinkDisconnectReason=(HCI_STATUS)PhysLinkDisconnectReason;
4172 //Send HCI Command status event to AMP.
4173 bthci_EventCommandStatus(padapter,
4174 OGF_LINK_CONTROL_COMMANDS,
4175 HCI_DISCONNECT_PHYSICAL_LINK,
4178 if (status != HCI_STATUS_SUCCESS)
4181 if (pBTInfo->BtAsocEntry[CurrentEntryNum].BtCurrentState == HCI_STATE_DISCONNECTED)
4183 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4187 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_DISCONNECT_PHY_LINK, CurrentEntryNum);
4194 bthci_CmdSetACLLinkDataFlowMode(
4196 PPACKET_IRP_HCICMD_DATA pHciCmd
4199 HCI_STATUS status = HCI_STATUS_SUCCESS;
4200 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4201 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4202 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4204 pBtMgnt->ExtConfig.CurrentConnectHandle = *((u16*)pHciCmd->Data);
4205 pBtMgnt->ExtConfig.CurrentIncomingTrafficMode = *((u8*)pHciCmd->Data)+2;
4206 pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode = *((u8*)pHciCmd->Data)+3;
4207 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Connection Handle = 0x%x, Incoming Traffic mode = 0x%x, Outgoing Traffic mode = 0x%x",
4208 pBtMgnt->ExtConfig.CurrentConnectHandle,
4209 pBtMgnt->ExtConfig.CurrentIncomingTrafficMode,
4210 pBtMgnt->ExtConfig.CurrentOutgoingTrafficMode));
4213 u8 localBuf[8] = "";
4216 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4219 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4221 len += bthci_CommandCompleteHeader(&localBuf[0],
4223 HCI_SET_ACL_LINK_DATA_FLOW_MODE,
4226 // Return parameters starts from here
4227 pRetPar = &PPacketIrpEvent->Data[len];
4228 pRetPar[0] = status; //status
4230 pu2Temp = (u16*)&pRetPar[1];
4231 *pu2Temp = pBtMgnt->ExtConfig.CurrentConnectHandle;
4233 PPacketIrpEvent->Length = len;
4235 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4242 bthci_CmdSetACLLinkStatus(
4244 PPACKET_IRP_HCICMD_DATA pHciCmd
4247 HCI_STATUS status = HCI_STATUS_SUCCESS;
4248 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4249 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4250 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4254 pBtDbg->dbgHciInfo.hciCmdCntSetAclLinkStatus++;
4255 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "SetACLLinkStatus, Hex Data :\n",
4256 &pHciCmd->Data[0], pHciCmd->Length);
4258 // Only Core Stack v251 and later version support this command.
4259 pBtMgnt->bSupportProfile = _TRUE;
4261 pBtMgnt->ExtConfig.NumberOfHandle= *((u8*)pHciCmd->Data);
4262 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfHandle = 0x%x\n", pBtMgnt->ExtConfig.NumberOfHandle));
4264 pTriple = &pHciCmd->Data[1];
4265 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4267 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
4268 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = pTriple[2];
4269 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = pTriple[3];
4270 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
4271 ("Connection_Handle = 0x%x, Incoming Traffic mode = 0x%x, Outgoing Traffic Mode = 0x%x\n",
4272 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4273 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode,
4274 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode));
4279 u8 localBuf[6] = "";
4282 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4284 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4286 len += bthci_CommandCompleteHeader(&localBuf[0],
4288 HCI_SET_ACL_LINK_STATUS,
4291 // Return parameters starts from here
4292 pRetPar = &PPacketIrpEvent->Data[len];
4293 pRetPar[0] = status; //status
4296 PPacketIrpEvent->Length = len;
4298 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4305 bthci_CmdSetSCOLinkStatus(
4307 PPACKET_IRP_HCICMD_DATA pHciCmd
4310 HCI_STATUS status = HCI_STATUS_SUCCESS;
4311 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4312 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4313 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4315 pBtDbg->dbgHciInfo.hciCmdCntSetScoLinkStatus++;
4316 pBtMgnt->ExtConfig.NumberOfSCO= *((u8*)pHciCmd->Data);
4317 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfSCO = 0x%x\n",
4318 pBtMgnt->ExtConfig.NumberOfSCO));
4321 u8 localBuf[6] = "";
4324 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4326 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4328 len += bthci_CommandCompleteHeader(&localBuf[0],
4330 HCI_SET_SCO_LINK_STATUS,
4333 // Return parameters starts from here
4334 pRetPar = &PPacketIrpEvent->Data[len];
4335 pRetPar[0] = status; //status
4338 PPacketIrpEvent->Length = len;
4340 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4347 bthci_CmdSetRSSIValue(
4349 PPACKET_IRP_HCICMD_DATA pHciCmd
4352 HCI_STATUS status = HCI_STATUS_SUCCESS;
4353 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4354 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4357 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4359 if (pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle == *((u16*)&pHciCmd->Data[0]))
4361 pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI = (s8)(pHciCmd->Data[2]);
4362 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL,
4363 ("Connection_Handle = 0x%x, RSSI = %d \n",
4364 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4365 pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI));
4367 // get the minimum bt rssi value
4368 if (pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI <= min_bt_rssi)
4370 min_bt_rssi = pBtMgnt->ExtConfig.linkInfo[i].BT_RSSI;
4375 pBtMgnt->ExtConfig.MIN_BT_RSSI = min_bt_rssi;
4376 RTPRINT(FBT, BT_TRACE, ("[bt rssi], the min rssi is %d\n", min_bt_rssi));
4380 u8 localBuf[6] = "";
4383 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4385 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4387 len += bthci_CommandCompleteHeader(&localBuf[0],
4392 // Return parameters starts from here
4393 pRetPar = &PPacketIrpEvent->Data[len];
4394 pRetPar[0] = status; //status
4397 PPacketIrpEvent->Length = len;
4399 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4406 bthci_CmdSetCurrentBluetoothStatus(
4408 PPACKET_IRP_HCICMD_DATA pHciCmd
4411 HCI_STATUS status = HCI_STATUS_SUCCESS;
4412 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4413 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4414 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4416 pBtMgnt->ExtConfig.CurrentBTStatus = *((u8*)&pHciCmd->Data[0]);
4417 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("SetCurrentBluetoothStatus, CurrentBTStatus = 0x%x\n",
4418 pBtMgnt->ExtConfig.CurrentBTStatus));
4421 u8 localBuf[6] = "";
4424 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4426 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4428 len += bthci_CommandCompleteHeader(&localBuf[0],
4430 HCI_SET_CURRENT_BLUETOOTH_STATUS,
4433 // Return parameters starts from here
4434 pRetPar = &PPacketIrpEvent->Data[len];
4435 pRetPar[0] = status; //status
4438 PPacketIrpEvent->Length = len;
4440 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4447 bthci_CmdExtensionVersionNotify(
4449 PPACKET_IRP_HCICMD_DATA pHciCmd
4452 HCI_STATUS status = HCI_STATUS_SUCCESS;
4453 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4454 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4455 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4457 pBtDbg->dbgHciInfo.hciCmdCntExtensionVersionNotify++;
4458 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "ExtensionVersionNotify, Hex Data :\n",
4459 &pHciCmd->Data[0], pHciCmd->Length);
4461 pBtMgnt->ExtConfig.HCIExtensionVer = *((u16*)&pHciCmd->Data[0]);
4462 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = 0x%x\n", pBtMgnt->ExtConfig.HCIExtensionVer));
4465 u8 localBuf[6] = "";
4468 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4470 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4472 len += bthci_CommandCompleteHeader(&localBuf[0],
4474 HCI_EXTENSION_VERSION_NOTIFY,
4477 // Return parameters starts from here
4478 pRetPar = &PPacketIrpEvent->Data[len];
4479 pRetPar[0] = status; //status
4482 PPacketIrpEvent->Length = len;
4484 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4491 bthci_CmdLinkStatusNotify(
4493 PPACKET_IRP_HCICMD_DATA pHciCmd
4496 HCI_STATUS status = HCI_STATUS_SUCCESS;
4497 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4498 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4499 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
4503 pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++;
4504 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n",
4505 &pHciCmd->Data[0], pHciCmd->Length);
4507 // Current only RTL8723 support this command.
4508 pBtMgnt->bSupportProfile = _TRUE;
4510 pBtMgnt->ExtConfig.NumberOfHandle= *((u8*)pHciCmd->Data);
4511 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("NumberOfHandle = 0x%x\n", pBtMgnt->ExtConfig.NumberOfHandle));
4512 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer));
4514 pTriple = &pHciCmd->Data[1];
4515 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
4517 if (pBtMgnt->ExtConfig.HCIExtensionVer < 1)
4519 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
4520 pBtMgnt->ExtConfig.linkInfo[i].BTProfile = pTriple[2];
4521 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = pTriple[3];
4522 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
4523 ("Connection_Handle = 0x%x, BTProfile=%d, BTSpec=%d\n",
4524 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4525 pBtMgnt->ExtConfig.linkInfo[i].BTProfile,
4526 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec));
4529 else if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
4531 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle = *((u16*)&pTriple[0]);
4532 pBtMgnt->ExtConfig.linkInfo[i].BTProfile = pTriple[2];
4533 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec = pTriple[3];
4534 pBtMgnt->ExtConfig.linkInfo[i].linkRole = pTriple[4];
4535 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT,
4536 ("Connection_Handle = 0x%x, BTProfile=%d, BTSpec=%d, LinkRole=%d\n",
4537 pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle,
4538 pBtMgnt->ExtConfig.linkInfo[i].BTProfile,
4539 pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec,
4540 pBtMgnt->ExtConfig.linkInfo[i].linkRole));
4545 BTHCI_UpdateBTProfileRTKToMoto(padapter);
4547 u8 localBuf[6] = "";
4550 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4552 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4554 len += bthci_CommandCompleteHeader(&localBuf[0],
4556 HCI_LINK_STATUS_NOTIFY,
4559 // Return parameters starts from here
4560 pRetPar = &PPacketIrpEvent->Data[len];
4561 pRetPar[0] = status; //status
4564 PPacketIrpEvent->Length = len;
4566 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4573 bthci_CmdBtOperationNotify(
4575 PPACKET_IRP_HCICMD_DATA pHciCmd
4578 HCI_STATUS status = HCI_STATUS_SUCCESS;
4579 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4580 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4582 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Bt Operation notify, Hex Data :\n",
4583 &pHciCmd->Data[0], pHciCmd->Length);
4585 pBtMgnt->ExtConfig.btOperationCode = *((u8*)pHciCmd->Data);
4586 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("btOperationCode = 0x%x\n", pBtMgnt->ExtConfig.btOperationCode));
4587 switch (pBtMgnt->ExtConfig.btOperationCode)
4589 case HCI_BT_OP_NONE:
4590 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Operation None!!\n"));
4592 case HCI_BT_OP_INQUIRY_START:
4593 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire start!!\n"));
4595 case HCI_BT_OP_INQUIRY_FINISH:
4596 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Inquire finished!!\n"));
4598 case HCI_BT_OP_PAGING_START:
4599 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging is started!!\n"));
4601 case HCI_BT_OP_PAGING_SUCCESS:
4602 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete successfully!!\n"));
4604 case HCI_BT_OP_PAGING_UNSUCCESS:
4605 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Paging complete unsuccessfully!!\n"));
4607 case HCI_BT_OP_PAIRING_START:
4608 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing start!!\n"));
4610 case HCI_BT_OP_PAIRING_FINISH:
4611 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Pairing finished!!\n"));
4613 case HCI_BT_OP_BT_DEV_ENABLE:
4614 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is enabled!!\n"));
4616 case HCI_BT_OP_BT_DEV_DISABLE:
4617 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : BT Device is disabled!!\n"));
4620 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[bt operation] : Unknown, error!!\n"));
4623 BTDM_AdjustForBtOperation(padapter);
4625 u8 localBuf[6] = "";
4628 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4630 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4632 len += bthci_CommandCompleteHeader(&localBuf[0],
4634 HCI_BT_OPERATION_NOTIFY,
4637 // Return parameters starts from here
4638 pRetPar = &PPacketIrpEvent->Data[len];
4639 pRetPar[0] = status; //status
4642 PPacketIrpEvent->Length = len;
4644 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4651 bthci_CmdEnableWifiScanNotify(
4653 PPACKET_IRP_HCICMD_DATA pHciCmd
4656 HCI_STATUS status = HCI_STATUS_SUCCESS;
4657 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4658 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
4660 RTPRINT_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "Enable Wifi scan notify, Hex Data :\n",
4661 &pHciCmd->Data[0], pHciCmd->Length);
4663 pBtMgnt->ExtConfig.bEnableWifiScanNotify = *((u8*)pHciCmd->Data);
4664 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("bEnableWifiScanNotify = %d\n", pBtMgnt->ExtConfig.bEnableWifiScanNotify));
4667 u8 localBuf[6] = "";
4670 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4672 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4674 len += bthci_CommandCompleteHeader(&localBuf[0],
4676 HCI_ENABLE_WIFI_SCAN_NOTIFY,
4679 // Return parameters starts from here
4680 pRetPar = &PPacketIrpEvent->Data[len];
4681 pRetPar[0] = status; //status
4684 PPacketIrpEvent->Length = len;
4686 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4693 bthci_CmdWIFICurrentChannel(
4695 PPACKET_IRP_HCICMD_DATA pHciCmd
4698 HCI_STATUS status = HCI_STATUS_SUCCESS;
4699 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
4700 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
4701 // u8 chnl = pMgntInfo->dot11CurrentChannelNumber;
4702 u8 chnl = pmlmeext->cur_channel;
4704 // if (pMgntInfo->pHTInfo->bCurBW40MHz == HT_CHANNEL_WIDTH_20_40)
4705 if (pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)
4707 // if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_UPPER)
4708 if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
4712 // else if (pMgntInfo->pHTInfo->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_LOWER)
4713 else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
4719 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current Channel = 0x%x\n", chnl));
4722 u8 localBuf[8] = "";
4725 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4727 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4729 len += bthci_CommandCompleteHeader(&localBuf[0],
4731 HCI_WIFI_CURRENT_CHANNEL,
4734 // Return parameters starts from here
4735 pRetPar = &PPacketIrpEvent->Data[len];
4736 pRetPar[0] = status; //status
4737 pRetPar[1] = chnl; //current channel
4739 PPacketIrpEvent->Length = len;
4741 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4748 bthci_CmdWIFICurrentBandwidth(
4750 PPACKET_IRP_HCICMD_DATA pHciCmd
4753 HCI_STATUS status = HCI_STATUS_SUCCESS;
4754 HT_CHANNEL_WIDTH bw;
4758 // rtw_hal_get_hwreg(padapter, HW_VAR_BW_MODE, (u8*)(&bw));
4759 bw = padapter->mlmeextpriv.cur_bwmode;
4761 if (bw == HT_CHANNEL_WIDTH_20)
4765 else if (bw == HT_CHANNEL_WIDTH_40)
4770 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("Current BW = 0x%x\n",
4774 u8 localBuf[8] = "";
4777 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4779 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4781 len += bthci_CommandCompleteHeader(&localBuf[0],
4783 HCI_WIFI_CURRENT_BANDWIDTH,
4786 // Return parameters starts from here
4787 pRetPar = &PPacketIrpEvent->Data[len];
4788 pRetPar[0] = status; //status
4789 pRetPar[1] = CurrentBW; //current BW
4791 PPacketIrpEvent->Length = len;
4793 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4800 bthci_CmdWIFIConnectionStatus(
4802 PPACKET_IRP_HCICMD_DATA pHciCmd
4805 HCI_STATUS status = HCI_STATUS_SUCCESS;
4806 PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
4807 u8 connectStatus = HCI_WIFI_NOT_CONNECTED;
4809 if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) {
4810 if (padapter->stapriv.asoc_sta_count >= 3)
4811 connectStatus = HCI_WIFI_CONNECTED;
4813 connectStatus = HCI_WIFI_NOT_CONNECTED;
4815 else if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE)
4816 connectStatus = HCI_WIFI_CONNECTED;
4817 else if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING) == _TRUE)
4818 connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS;
4820 connectStatus = HCI_WIFI_NOT_CONNECTED;
4823 u8 localBuf[8] = "";
4826 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4828 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4830 len += bthci_CommandCompleteHeader(&localBuf[0],
4832 HCI_WIFI_CONNECTION_STATUS,
4835 // Return parameters starts from here
4836 pRetPar = &PPacketIrpEvent->Data[len];
4837 pRetPar[0] = status; //status
4838 pRetPar[1] = connectStatus; //connect status
4840 PPacketIrpEvent->Length = len;
4842 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4849 bthci_CmdEnableDeviceUnderTestMode(
4851 PPACKET_IRP_HCICMD_DATA pHciCmd
4854 HCI_STATUS status = HCI_STATUS_SUCCESS;
4855 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4856 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
4858 pBtHciInfo->bInTestMode = _TRUE;
4859 pBtHciInfo->bTestIsEnd = _FALSE;
4861 //send command complete event here when all data are received.
4863 u8 localBuf[6] = "";
4866 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4868 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4870 len += bthci_CommandCompleteHeader(&localBuf[0],
4871 OGF_TESTING_COMMANDS,
4872 HCI_ENABLE_DEVICE_UNDER_TEST_MODE,
4875 // Return parameters starts from here
4876 pRetPar = &PPacketIrpEvent->Data[len];
4877 pRetPar[0] = status; //status
4879 PPacketIrpEvent->Length = len;
4881 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
4888 bthci_CmdAMPTestEnd(
4890 PPACKET_IRP_HCICMD_DATA pHciCmd
4893 HCI_STATUS status = HCI_STATUS_SUCCESS;
4894 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4895 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
4896 u8 bFilterOutNonAssociatedBSSID = _TRUE;
4898 if (!pBtHciInfo->bInTestMode)
4900 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Not in Test mode, return status=HCI_STATUS_CMD_DISALLOW\n"));
4901 status = HCI_STATUS_CMD_DISALLOW;
4905 pBtHciInfo->bTestIsEnd=_TRUE;
4907 PlatformCancelTimer(padapter,&pBTInfo->BTTestSendPacketTimer);
4909 rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
4912 //send command complete event here when all data are received.
4914 u8 localBuf[4] = "";
4915 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4917 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("AMP Test End Event \n"));
4918 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4919 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_TEST_END;
4920 PPacketIrpEvent->Length=2;
4922 PPacketIrpEvent->Data[0] = status;
4923 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario;
4925 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
4928 bthci_EventAMPReceiverReport(padapter,0x01);
4934 bthci_CmdAMPTestCommand(
4936 PPACKET_IRP_HCICMD_DATA pHciCmd
4939 HCI_STATUS status = HCI_STATUS_SUCCESS;
4940 PBT30Info pBTInfo = GET_BT_INFO(padapter);
4941 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
4943 if (!pBtHciInfo->bInTestMode)
4945 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Not in Test mode, return status=HCI_STATUS_CMD_DISALLOW\n"));
4946 status = HCI_STATUS_CMD_DISALLOW;
4951 pBtHciInfo->TestScenario=*((u8*)pHciCmd->Data);
4953 if (pBtHciInfo->TestScenario == 0x01)
4955 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
4957 else if (pBtHciInfo->TestScenario == 0x02)
4959 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
4963 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("No Such Test !!!!!!!!!!!!!!!!!! \n"));
4967 if (pBtHciInfo->bTestIsEnd)
4969 u8 localBuf[5] = "";
4970 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
4973 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("AMP Test End Event \n"));
4974 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
4975 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_TEST_END;
4976 PPacketIrpEvent->Length=2;
4978 PPacketIrpEvent->Data[0] = status;
4979 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
4981 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
4983 //Return to Idel state with RX and TX off.
4988 // should send command status event
4989 bthci_EventCommandStatus(padapter,
4990 OGF_TESTING_COMMANDS,
4991 HCI_AMP_TEST_COMMAND,
4994 //The HCI_AMP_Start Test Event shall be generated when the
4995 //HCI_AMP_Test_Command has completed and the first data is ready to be sent
4999 u8 localBuf[5] = "";
5000 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5002 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), (" HCI_AMP_Start Test Event \n"));
5003 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5004 PPacketIrpEvent->EventCode=HCI_EVENT_AMP_START_TEST;
5005 PPacketIrpEvent->Length=2;
5007 PPacketIrpEvent->Data[0] = status;
5008 PPacketIrpEvent->Data[1] = pBtHciInfo->TestScenario ;
5010 bthci_IndicateEvent(padapter, PPacketIrpEvent, 4);
5012 //Return to Idel state with RX and TX off.
5015 if (pBtHciInfo->TestScenario == 0x01)
5018 When in a transmitter test scenario and the frames/bursts count have been
5019 transmitted the HCI_AMP_Test_End event shall be sent.
5021 PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
5022 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("TX Single Test \n"));
5024 else if (pBtHciInfo->TestScenario == 0x02)
5026 u8 bFilterOutNonAssociatedBSSID=_FALSE;
5027 rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
5028 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("Receive Frame Test \n"));
5036 bthci_CmdEnableAMPReceiverReports(
5038 PPACKET_IRP_HCICMD_DATA pHciCmd
5041 HCI_STATUS status = HCI_STATUS_SUCCESS;
5042 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5043 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
5045 if (!pBtHciInfo->bInTestMode)
5047 status = HCI_STATUS_CMD_DISALLOW;
5048 //send command complete event here when all data are received.
5050 u8 localBuf[6] = "";
5053 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5055 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5057 len += bthci_CommandCompleteHeader(&localBuf[0],
5058 OGF_TESTING_COMMANDS,
5059 HCI_ENABLE_AMP_RECEIVER_REPORTS,
5062 // Return parameters starts from here
5063 pRetPar = &PPacketIrpEvent->Data[len];
5064 pRetPar[0] = status; //status
5066 PPacketIrpEvent->Length = len;
5068 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5073 pBtHciInfo->bTestNeedReport= *((u8*)pHciCmd->Data);
5074 pBtHciInfo->TestReportInterval= (*((u8*)pHciCmd->Data+2));
5076 bthci_EventAMPReceiverReport(padapter,0x00);
5078 //send command complete event here when all data are received.
5080 u8 localBuf[6] = "";
5083 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5085 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5087 len += bthci_CommandCompleteHeader(&localBuf[0],
5088 OGF_TESTING_COMMANDS,
5089 HCI_ENABLE_AMP_RECEIVER_REPORTS,
5092 // Return parameters starts from here
5093 pRetPar = &PPacketIrpEvent->Data[len];
5094 pRetPar[0] = status; //status
5096 PPacketIrpEvent->Length = len;
5098 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5105 bthci_CmdHostBufferSize(
5107 PPACKET_IRP_HCICMD_DATA pHciCmd
5110 HCI_STATUS status = HCI_STATUS_SUCCESS;
5111 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5112 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5114 pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].ACLPacketsData.ACLDataPacketLen= *((u16*)pHciCmd->Data);
5115 pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].SyncDataPacketLen= *((u8 *)(pHciCmd->Data+2));
5116 pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].TotalNumACLDataPackets= *((u16 *)(pHciCmd->Data+3));
5117 pBTInfo->BtAsocEntry[pBtMgnt->CurrentConnectEntryNum].TotalSyncNumDataPackets= *((u16 *)(pHciCmd->Data+5));
5119 //send command complete event here when all data are received.
5121 u8 localBuf[6] = "";
5124 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
5126 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
5128 len += bthci_CommandCompleteHeader(&localBuf[0],
5129 OGF_SET_EVENT_MASK_COMMAND,
5130 HCI_HOST_BUFFER_SIZE,
5133 // Return parameters starts from here
5134 pRetPar = &PPacketIrpEvent->Data[len];
5135 pRetPar[0] = status; //status
5137 PPacketIrpEvent->Length = len;
5139 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
5146 bthci_CmdHostNumberOfCompletedPackets(
5148 PPACKET_IRP_HCICMD_DATA pHciCmd
5151 HCI_STATUS status = HCI_STATUS_SUCCESS;
5159 PPACKET_IRP_HCICMD_DATA pHciCmd
5162 HCI_STATUS status = HCI_STATUS_UNKNOW_HCI_CMD;
5163 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5164 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
5166 pBtDbg->dbgHciInfo.hciCmdCntUnknown++;
5167 bthci_EventCommandStatus(padapter,
5176 bthci_HandleOGFInformationalParameters(
5178 PPACKET_IRP_HCICMD_DATA pHciCmd
5181 HCI_STATUS status = HCI_STATUS_SUCCESS;
5183 switch (pHciCmd->OCF)
5185 case HCI_READ_LOCAL_VERSION_INFORMATION:
5186 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_VERSION_INFORMATION\n"));
5187 status = bthci_CmdReadLocalVersionInformation(padapter);
5189 case HCI_READ_LOCAL_SUPPORTED_COMMANDS:
5190 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_COMMANDS\n"));
5191 status = bthci_CmdReadLocalSupportedCommands(padapter);
5193 case HCI_READ_LOCAL_SUPPORTED_FEATURES:
5194 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_SUPPORTED_FEATURES\n"));
5195 status = bthci_CmdReadLocalSupportedFeatures(padapter);
5197 case HCI_READ_BUFFER_SIZE:
5198 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_BUFFER_SIZE\n"));
5199 status = bthci_CmdReadBufferSize(padapter);
5201 case HCI_READ_DATA_BLOCK_SIZE:
5202 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_DATA_BLOCK_SIZE\n"));
5203 status = bthci_CmdReadDataBlockSize(padapter);
5206 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFInformationalParameters(), Unknown case = 0x%x\n", pHciCmd->OCF));
5207 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5208 status = bthci_UnknownCMD(padapter, pHciCmd);
5215 bthci_HandleOGFSetEventMaskCMD(
5217 PPACKET_IRP_HCICMD_DATA pHciCmd
5220 HCI_STATUS status = HCI_STATUS_SUCCESS;
5222 switch (pHciCmd->OCF)
5224 case HCI_SET_EVENT_MASK:
5225 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_MASK\n"));
5226 status = bthci_CmdSetEventMask(padapter, pHciCmd);
5229 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_RESET\n"));
5230 status = bthci_CmdReset(padapter, _TRUE);
5232 case HCI_READ_CONNECTION_ACCEPT_TIMEOUT:
5233 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_CONNECTION_ACCEPT_TIMEOUT\n"));
5234 status = bthci_CmdReadConnectionAcceptTimeout(padapter);
5236 case HCI_SET_EVENT_FILTER:
5237 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_FILTER\n"));
5238 status = bthci_CmdSetEventFilter(padapter, pHciCmd);
5240 case HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT:
5241 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT\n"));
5242 status = bthci_CmdWriteConnectionAcceptTimeout(padapter, pHciCmd);
5244 case HCI_READ_PAGE_TIMEOUT:
5245 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_PAGE_TIMEOUT\n"));
5246 status = bthci_CmdReadPageTimeout(padapter, pHciCmd);
5248 case HCI_WRITE_PAGE_TIMEOUT:
5249 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_PAGE_TIMEOUT\n"));
5250 status = bthci_CmdWritePageTimeout(padapter, pHciCmd);
5252 case HCI_HOST_NUMBER_OF_COMPLETED_PACKETS:
5253 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_HOST_NUMBER_OF_COMPLETED_PACKETS\n"));
5254 status = bthci_CmdHostNumberOfCompletedPackets(padapter, pHciCmd);
5256 case HCI_READ_LINK_SUPERVISION_TIMEOUT:
5257 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LINK_SUPERVISION_TIMEOUT\n"));
5258 status = bthci_CmdReadLinkSupervisionTimeout(padapter, pHciCmd);
5260 case HCI_WRITE_LINK_SUPERVISION_TIMEOUT:
5261 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LINK_SUPERVISION_TIMEOUT\n"));
5262 status = bthci_CmdWriteLinkSupervisionTimeout(padapter, pHciCmd);
5264 case HCI_ENHANCED_FLUSH:
5265 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENHANCED_FLUSH\n"));
5266 status = bthci_CmdEnhancedFlush(padapter, pHciCmd);
5268 case HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT:
5269 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOGICAL_LINK_ACCEPT_TIMEOUT\n"));
5270 status = bthci_CmdReadLogicalLinkAcceptTimeout(padapter, pHciCmd);
5272 case HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT:
5273 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT\n"));
5274 status = bthci_CmdWriteLogicalLinkAcceptTimeout(padapter, pHciCmd);
5276 case HCI_SET_EVENT_MASK_PAGE_2:
5277 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SET_EVENT_MASK_PAGE_2\n"));
5278 status = bthci_CmdSetEventMaskPage2(padapter, pHciCmd);
5280 case HCI_READ_LOCATION_DATA:
5281 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCATION_DATA\n"));
5282 status = bthci_CmdReadLocationData(padapter, pHciCmd);
5284 case HCI_WRITE_LOCATION_DATA:
5285 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_LOCATION_DATA\n"));
5286 status = bthci_CmdWriteLocationData(padapter, pHciCmd);
5288 case HCI_READ_FLOW_CONTROL_MODE:
5289 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_FLOW_CONTROL_MODE\n"));
5290 status = bthci_CmdReadFlowControlMode(padapter, pHciCmd);
5292 case HCI_WRITE_FLOW_CONTROL_MODE:
5293 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_FLOW_CONTROL_MODE\n"));
5294 status = bthci_CmdWriteFlowControlMode(padapter, pHciCmd);
5296 case HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT:
5297 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_BEST_EFFORT_FLUSH_TIMEOUT\n"));
5298 status = bthci_CmdReadBestEffortFlushTimeout(padapter, pHciCmd);
5300 case HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT:
5301 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_BEST_EFFORT_FLUSH_TIMEOUT\n"));
5302 status = bthci_CmdWriteBestEffortFlushTimeout(padapter, pHciCmd);
5304 case HCI_SHORT_RANGE_MODE:
5305 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_SHORT_RANGE_MODE\n"));
5306 status = bthci_CmdShortRangeMode(padapter, pHciCmd);
5308 case HCI_HOST_BUFFER_SIZE:
5309 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_HOST_BUFFER_SIZE\n"));
5310 status = bthci_CmdHostBufferSize(padapter,pHciCmd);
5313 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFSetEventMaskCMD(), Unknown case = 0x%x\n", pHciCmd->OCF));
5314 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5315 status = bthci_UnknownCMD(padapter, pHciCmd);
5322 bthci_HandleOGFStatusParameters(
5324 PPACKET_IRP_HCICMD_DATA pHciCmd
5327 HCI_STATUS status = HCI_STATUS_SUCCESS;
5329 switch (pHciCmd->OCF)
5331 case HCI_READ_FAILED_CONTACT_COUNTER:
5332 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_FAILED_CONTACT_COUNTER\n"));
5333 status = bthci_CmdReadFailedContactCounter(padapter,pHciCmd);
5335 case HCI_RESET_FAILED_CONTACT_COUNTER:
5336 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_RESET_FAILED_CONTACT_COUNTER\n"));
5337 status = bthci_CmdResetFailedContactCounter(padapter,pHciCmd);
5339 case HCI_READ_LINK_QUALITY:
5340 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LINK_QUALITY\n"));
5341 status = bthci_CmdReadLinkQuality(padapter, pHciCmd);
5344 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_RSSI\n"));
5345 status = bthci_CmdReadRSSI(padapter);
5347 case HCI_READ_LOCAL_AMP_INFO:
5348 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_AMP_INFO\n"));
5349 status = bthci_CmdReadLocalAMPInfo(padapter);
5351 case HCI_READ_LOCAL_AMP_ASSOC:
5352 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_READ_LOCAL_AMP_ASSOC\n"));
5353 status = bthci_CmdReadLocalAMPAssoc(padapter,pHciCmd);
5355 case HCI_WRITE_REMOTE_AMP_ASSOC:
5356 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_WRITE_REMOTE_AMP_ASSOC\n"));
5357 status = bthci_CmdWriteRemoteAMPAssoc(padapter,pHciCmd);
5360 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFStatusParameters(), Unknown case = 0x%x\n", pHciCmd->OCF));
5361 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5362 status = bthci_UnknownCMD(padapter, pHciCmd);
5370 bthci_HandleOGFLinkControlCMD(
5372 PPACKET_IRP_HCICMD_DATA pHciCmd
5375 HCI_STATUS status = HCI_STATUS_SUCCESS;
5377 switch (pHciCmd->OCF)
5379 case HCI_CREATE_PHYSICAL_LINK:
5380 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_PHYSICAL_LINK\n"));
5381 status = bthci_CmdCreatePhysicalLink(padapter,pHciCmd);
5383 case HCI_ACCEPT_PHYSICAL_LINK:
5384 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_PHYSICAL_LINK\n"));
5385 status = bthci_CmdAcceptPhysicalLink(padapter,pHciCmd);
5387 case HCI_DISCONNECT_PHYSICAL_LINK:
5388 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_PHYSICAL_LINK\n"));
5389 status = bthci_CmdDisconnectPhysicalLink(padapter,pHciCmd);
5391 case HCI_CREATE_LOGICAL_LINK:
5392 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_CREATE_LOGICAL_LINK\n"));
5393 status = bthci_CmdCreateLogicalLink(padapter,pHciCmd);
5395 case HCI_ACCEPT_LOGICAL_LINK:
5396 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ACCEPT_LOGICAL_LINK\n"));
5397 status = bthci_CmdAcceptLogicalLink(padapter,pHciCmd);
5399 case HCI_DISCONNECT_LOGICAL_LINK:
5400 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_DISCONNECT_LOGICAL_LINK\n"));
5401 status = bthci_CmdDisconnectLogicalLink(padapter,pHciCmd);
5403 case HCI_LOGICAL_LINK_CANCEL:
5404 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_LOGICAL_LINK_CANCEL\n"));
5405 status = bthci_CmdLogicalLinkCancel(padapter,pHciCmd);
5407 case HCI_FLOW_SPEC_MODIFY:
5408 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_FLOW_SPEC_MODIFY\n"));
5409 status = bthci_CmdFlowSpecModify(padapter,pHciCmd);
5413 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("bthci_HandleOGFLinkControlCMD(), Unknown case = 0x%x\n", pHciCmd->OCF));
5414 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5415 status = bthci_UnknownCMD(padapter, pHciCmd);
5422 bthci_HandleOGFTestingCMD(
5424 PPACKET_IRP_HCICMD_DATA pHciCmd
5427 HCI_STATUS status = HCI_STATUS_SUCCESS;
5428 switch (pHciCmd->OCF)
5430 case HCI_ENABLE_DEVICE_UNDER_TEST_MODE:
5431 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENABLE_DEVICE_UNDER_TEST_MODE\n"));
5432 bthci_CmdEnableDeviceUnderTestMode(padapter,pHciCmd);
5434 case HCI_AMP_TEST_END:
5435 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_END\n"));
5436 bthci_CmdAMPTestEnd(padapter,pHciCmd);
5438 case HCI_AMP_TEST_COMMAND:
5439 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_AMP_TEST_COMMAND\n"));
5440 bthci_CmdAMPTestCommand(padapter,pHciCmd);
5442 case HCI_ENABLE_AMP_RECEIVER_REPORTS:
5443 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_ENABLE_AMP_RECEIVER_REPORTS\n"));
5444 bthci_CmdEnableAMPReceiverReports(padapter,pHciCmd);
5448 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
5449 status = bthci_UnknownCMD(padapter, pHciCmd);
5456 bthci_HandleOGFExtension(
5458 PPACKET_IRP_HCICMD_DATA pHciCmd
5461 HCI_STATUS status = HCI_STATUS_SUCCESS;
5462 switch (pHciCmd->OCF)
5464 case HCI_SET_ACL_LINK_DATA_FLOW_MODE:
5465 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_ACL_LINK_DATA_FLOW_MODE\n"));
5466 status = bthci_CmdSetACLLinkDataFlowMode(padapter,pHciCmd);
5468 case HCI_SET_ACL_LINK_STATUS:
5469 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_ACL_LINK_STATUS\n"));
5470 status = bthci_CmdSetACLLinkStatus(padapter,pHciCmd);
5472 case HCI_SET_SCO_LINK_STATUS:
5473 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_SCO_LINK_STATUS\n"));
5474 status = bthci_CmdSetSCOLinkStatus(padapter,pHciCmd);
5476 case HCI_SET_RSSI_VALUE:
5477 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("HCI_SET_RSSI_VALUE\n"));
5478 status = bthci_CmdSetRSSIValue(padapter,pHciCmd);
5480 case HCI_SET_CURRENT_BLUETOOTH_STATUS:
5481 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_SET_CURRENT_BLUETOOTH_STATUS\n"));
5482 status = bthci_CmdSetCurrentBluetoothStatus(padapter,pHciCmd);
5484 //The following is for RTK8723
5486 case HCI_EXTENSION_VERSION_NOTIFY:
5487 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_EXTENSION_VERSION_NOTIFY\n"));
5488 status = bthci_CmdExtensionVersionNotify(padapter,pHciCmd);
5490 case HCI_LINK_STATUS_NOTIFY:
5491 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_LINK_STATUS_NOTIFY\n"));
5492 status = bthci_CmdLinkStatusNotify(padapter,pHciCmd);
5494 case HCI_BT_OPERATION_NOTIFY:
5495 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_BT_OPERATION_NOTIFY\n"));
5496 status = bthci_CmdBtOperationNotify(padapter,pHciCmd);
5498 case HCI_ENABLE_WIFI_SCAN_NOTIFY:
5499 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_ENABLE_WIFI_SCAN_NOTIFY\n"));
5500 status = bthci_CmdEnableWifiScanNotify(padapter,pHciCmd);
5503 //The following is for IVT
5504 case HCI_WIFI_CURRENT_CHANNEL:
5505 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CURRENT_CHANNEL\n"));
5506 status = bthci_CmdWIFICurrentChannel(padapter,pHciCmd);
5508 case HCI_WIFI_CURRENT_BANDWIDTH:
5509 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CURRENT_BANDWIDTH\n"));
5510 status = bthci_CmdWIFICurrentBandwidth(padapter,pHciCmd);
5512 case HCI_WIFI_CONNECTION_STATUS:
5513 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_WIFI_CONNECTION_STATUS\n"));
5514 status = bthci_CmdWIFIConnectionStatus(padapter,pHciCmd);
5518 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCI_UNKNOWN_COMMAND\n"));
5519 status = bthci_UnknownCMD(padapter, pHciCmd);
5532 #define MAX_TMP_BUF_SIZE 200
5533 u8 buffer[MAX_TMP_BUF_SIZE];
5534 PPACKET_IRP_HCICMD_DATA pCmd=(PPACKET_IRP_HCICMD_DATA)buffer;
5536 PlatformZeroMemory(buffer, MAX_TMP_BUF_SIZE);
5541 if (OGF == OGF_LINK_CONTROL_COMMANDS && OCF == HCI_LOGICAL_LINK_CANCEL)
5544 pCmd->Data[0] = 1; //physical link handle
5545 pCmd->Data[1] = 0x16; //Tx_Flow_Spec_ID
5546 BTHCI_HandleHCICMD(padapter, (PPACKET_IRP_HCICMD_DATA)buffer);
5551 bthci_StateStarting(
5553 HCI_STATE_WITH_CMD StateCmd,
5557 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5558 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5560 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Starting], "));
5563 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
5565 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
5566 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
5567 pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
5568 BTHCI_DisconnectPeer(padapter,EntryNum);
5572 case STATE_CMD_DISCONNECT_PHY_LINK:
5574 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5576 bthci_EventDisconnectPhyLinkComplete(padapter,
5578 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5581 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5583 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
5585 BTHCI_DisconnectPeer(padapter, EntryNum);
5589 case STATE_CMD_MAC_START_COMPLETE:
5591 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_START_COMPLETE\n"));
5592 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
5595 else if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_CREATOR)
5597 bthci_EventChannelSelected(padapter,EntryNum);
5604 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
5610 bthci_StateConnecting(
5612 HCI_STATE_WITH_CMD StateCmd,
5616 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5617 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5619 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connecting], "));
5622 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
5624 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
5625 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
5626 pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
5627 BTHCI_DisconnectPeer(padapter, EntryNum);
5631 case STATE_CMD_MAC_CONNECT_COMPLETE:
5633 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_COMPLETE\n"));
5635 if (pBTInfo->BtAsocEntry[EntryNum].AMPRole == AMP_BTAP_JOINER)
5637 RT_TRACE(_module_rtl871x_security_c_, _drv_info_ , ("StateConnecting \n"));
5642 case STATE_CMD_DISCONNECT_PHY_LINK:
5644 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5646 bthci_EventDisconnectPhyLinkComplete(padapter,
5648 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5651 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
5653 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5655 BTHCI_DisconnectPeer(padapter, EntryNum);
5660 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
5662 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_CANCEL_INDICATE\n"));
5663 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONTROLLER_BUSY;
5664 // Because this state cmd is caused by the BTHCI_EventAMPStatusChange(),
5665 // we don't need to send event in the following BTHCI_DisconnectPeer() again.
5666 pBtMgnt->bNeedNotifyAMPNoCap = _FALSE;
5667 BTHCI_DisconnectPeer(padapter, EntryNum);
5672 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
5678 bthci_StateConnected(
5680 HCI_STATE_WITH_CMD StateCmd,
5684 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
5685 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5686 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5688 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Connected], "));
5691 case STATE_CMD_DISCONNECT_PHY_LINK:
5693 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5696 //When we are trying to disconnect the phy link, we should disconnect log link first,
5700 u16 logicHandle = 0;
5701 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
5703 if (pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle != 0)
5705 logicHandle=pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle;
5707 bthci_EventDisconnectLogicalLinkComplete(padapter, HCI_STATUS_SUCCESS,
5708 logicHandle, pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason);
5710 pBTInfo->BtAsocEntry[EntryNum].LogLinkCmdData->BtLogLinkhandle = 0;
5715 bthci_EventDisconnectPhyLinkComplete(padapter,
5717 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5720 PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
5722 BTHCI_DisconnectPeer(padapter, EntryNum);
5726 case STATE_CMD_MAC_DISCONNECT_INDICATE:
5728 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_DISCONNECT_INDICATE\n"));
5730 bthci_EventDisconnectPhyLinkComplete(padapter,
5732 // TODO: Remote Host not local host
5733 HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST,
5735 BTHCI_DisconnectPeer(padapter, EntryNum);
5740 case STATE_CMD_ENTER_STATE:
5742 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
5744 if (pBtMgnt->bBTConnectInProgress)
5746 pBtMgnt->bBTConnectInProgress = _FALSE;
5747 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
5749 pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = HCI_STATE_CONNECTED;
5750 pBTInfo->BtAsocEntry[EntryNum].b4waySuccess = _TRUE;
5751 pBtMgnt->bStartSendSupervisionPkt = _TRUE;
5753 PlatformSetTimer(padapter, &pBTInfo->BTSupervisionPktTimer, 10000);
5754 // for rate adaptive
5756 if(padapter->HalFunc.UpdateRAMaskHandler)
5757 padapter->HalFunc.UpdateRAMaskHandler(padapter, MAX_FW_SUPPORT_MACID_NUM-1-EntryNum, 0);
5759 rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, padapter->mlmepriv.cur_network.network.SupportedRates);
5760 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
5766 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
5774 HCI_STATE_WITH_CMD StateCmd,
5778 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5779 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5781 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Authenticating], "));
5784 case STATE_CMD_CONNECT_ACCEPT_TIMEOUT:
5786 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CONNECT_ACCEPT_TIMEOUT\n"));
5787 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_CONNECT_ACCEPT_TIMEOUT;
5788 pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
5789 BTHCI_DisconnectPeer(padapter, EntryNum);
5793 case STATE_CMD_DISCONNECT_PHY_LINK:
5795 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5796 bthci_EventDisconnectPhyLinkComplete(padapter,
5798 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5801 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_UNKNOW_CONNECT_ID;
5803 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5805 BTHCI_DisconnectPeer(padapter,EntryNum);
5809 case STATE_CMD_4WAY_FAILED:
5811 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_FAILED\n"));
5813 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus=HCI_STATUS_AUTH_FAIL;
5814 pBtMgnt->bNeedNotifyAMPNoCap = _TRUE;
5816 BTHCI_DisconnectPeer(padapter,EntryNum);
5818 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5822 case STATE_CMD_4WAY_SUCCESSED:
5824 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_4WAY_SUCCESSED\n"));
5826 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_SUCCESS, EntryNum, INVALID_PL_HANDLE);
5828 PlatformCancelTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer);
5830 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
5835 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
5841 bthci_StateDisconnecting(
5843 HCI_STATE_WITH_CMD StateCmd,
5847 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5848 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5850 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnecting], "));
5853 case STATE_CMD_MAC_CONNECT_CANCEL_INDICATE:
5855 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_MAC_CONNECT_CANCEL_INDICATE\n"));
5856 if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
5858 bthci_EventPhysicalLinkComplete(padapter,
5859 pBTInfo->BtAsocEntry[EntryNum].PhysLinkCompleteStatus,
5860 EntryNum, INVALID_PL_HANDLE);
5863 if (pBtMgnt->bBTConnectInProgress)
5865 pBtMgnt->bBTConnectInProgress = _FALSE;
5866 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
5869 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
5873 case STATE_CMD_DISCONNECT_PHY_LINK:
5875 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5877 bthci_EventDisconnectPhyLinkComplete(padapter,
5879 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5882 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5884 BTHCI_DisconnectPeer(padapter, EntryNum);
5889 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
5895 bthci_StateDisconnected(
5897 HCI_STATE_WITH_CMD StateCmd,
5901 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
5902 PBT30Info pBTInfo = GET_BT_INFO(padapter);
5903 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
5904 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
5906 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT state], [Disconnected], "));
5909 case STATE_CMD_CREATE_PHY_LINK:
5910 case STATE_CMD_ACCEPT_PHY_LINK:
5912 if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
5914 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_CREATE_PHY_LINK\n"));
5918 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ACCEPT_PHY_LINK\n"));
5921 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT PS], Disable IPS and LPS\n"));
5922 IPSDisable(padapter, _FALSE, IPS_DISABLE_BT_ON);
5923 LeisurePSLeave(padapter, LPS_DISABLE_BT_HS_CONNECTION);
5925 pBtMgnt->bPhyLinkInProgress =_TRUE;
5926 pBtMgnt->BTCurrentConnectType=BT_DISCONNECT;
5927 if (!pBtMgnt->BtOperationOn)
5929 #if (SENDTXMEHTOD == 0)
5930 PlatformSetTimer(padapter, &pBTInfo->BTHCISendAclDataTimer, 1);
5932 #if (RTS_CTS_NO_LEN_LIMIT == 1)
5933 rtw_write32(padapter, 0x4c8, 0xc140400);
5936 pBtMgnt->CurrentBTConnectionCnt++;
5937 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], CurrentBTConnectionCnt = %d\n",
5938 pBtMgnt->CurrentBTConnectionCnt));
5939 pBtMgnt->BtOperationOn = _TRUE;
5940 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], Bt Operation ON!! CurrentConnectEntryNum = %d\n",
5941 pBtMgnt->CurrentConnectEntryNum));
5943 if (pBtMgnt->bBTConnectInProgress)
5945 bthci_EventPhysicalLinkComplete(padapter, HCI_STATUS_CONTROLLER_BUSY, INVALID_ENTRY_NUM, pBtMgnt->BtCurrentPhyLinkhandle);
5946 bthci_RemoveEntryByEntryNum(padapter, EntryNum);
5950 if (StateCmd == STATE_CMD_CREATE_PHY_LINK)
5952 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_CREATOR;
5956 pBTInfo->BtAsocEntry[EntryNum].AMPRole = AMP_BTAP_JOINER;
5959 // 1. MAC not yet in selected channel
5960 while (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE)
5962 RTPRINT(FIOCTL, IOCTL_STATE, ("Scan/Roaming/Wifi Link is in Progress, wait 200 ms\n"));
5965 // 2. MAC already in selected channel
5967 RTPRINT(FIOCTL, IOCTL_STATE, ("Channel is Ready\n"));
5968 PlatformSetTimer(padapter, &pBTInfo->BTHCIJoinTimeoutTimer, pBtHciInfo->ConnAcceptTimeout);
5970 pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent = _TRUE;
5975 case STATE_CMD_DISCONNECT_PHY_LINK:
5977 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_DISCONNECT_PHY_LINK\n"));
5979 PlatformCancelTimer(padapter,&pBTInfo->BTHCIJoinTimeoutTimer);
5981 bthci_EventDisconnectPhyLinkComplete(padapter,
5983 pBTInfo->BtAsocEntry[EntryNum].PhyLinkDisconnectReason,
5986 if (pBTInfo->BtAsocEntry[EntryNum].bNeedPhysLinkCompleteEvent)
5988 bthci_EventPhysicalLinkComplete(padapter,
5989 HCI_STATUS_UNKNOW_CONNECT_ID,
5990 EntryNum, INVALID_PL_HANDLE);
5993 if (pBtMgnt->bBTConnectInProgress)
5995 pBtMgnt->bBTConnectInProgress = _FALSE;
5996 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
5998 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTED, STATE_CMD_ENTER_STATE, EntryNum);
5999 bthci_RemoveEntryByEntryNum(padapter,EntryNum);
6003 case STATE_CMD_ENTER_STATE:
6005 RTPRINT(FIOCTL, IOCTL_STATE, ("STATE_CMD_ENTER_STATE\n"));
6010 RTPRINT(FIOCTL, IOCTL_STATE, ("State command(%d) is Wrong !!!\n", StateCmd));
6018 PPACKET_IRP_HCICMD_DATA pHciCmd
6021 if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_CREATE_LOGICAL_LINK)
6023 PHCI_FLOW_SPEC pTxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[1];
6024 PHCI_FLOW_SPEC pRxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[17];
6025 bthci_SelectFlowType(padapter, BT_TX_BE_FS, BT_RX_BE_FS, pTxFlowSpec, pRxFlowSpec);
6026 //bthci_SelectFlowType(padapter, BT_TX_be_FS, BT_RX_GU_FS, pTxFlowSpec, pRxFlowSpec);
6028 else if (pHciCmd->OGF == OGF_LINK_CONTROL_COMMANDS && pHciCmd->OCF == HCI_FLOW_SPEC_MODIFY)
6030 PHCI_FLOW_SPEC pTxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[2];
6031 PHCI_FLOW_SPEC pRxFlowSpec = (PHCI_FLOW_SPEC)&pHciCmd->Data[18];
6032 //bthci_SelectFlowType(padapter, BT_TX_BE_FS, BT_RX_BE_FS, pTxFlowSpec, pRxFlowSpec);
6033 bthci_SelectFlowType(padapter, BT_TX_BE_AGG_FS, BT_RX_BE_AGG_FS, pTxFlowSpec, pRxFlowSpec);
6037 void bthci_TimerCallbackHCICmd(PRT_TIMER pTimer)
6039 #if (BT_THREAD == 0)
6040 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6041 PADAPTER padapter = (PADAPTER)pTimer;
6042 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6044 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() ==>\n"));
6046 PlatformScheduleWorkItem(&pBTinfo->HCICmdWorkItem);
6048 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackHCICmd() <==\n"));
6052 void bthci_TimerCallbackSendAclData(PRT_TIMER pTimer)
6054 #if (SENDTXMEHTOD == 0)
6055 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6056 PADAPTER padapter = (PADAPTER)pTimer;
6057 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6059 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() ==>\n"));
6060 if (padapter->bDriverIsGoingToUnload)
6064 PlatformScheduleWorkItem(&pBTinfo->HCISendACLDataWorkItem);
6065 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("HCIAclDataTimerCallback() <==\n"));
6069 void bthci_TimerCallbackDiscardAclData(PRT_TIMER pTimer)
6071 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6072 PADAPTER padapter = (PADAPTER)pTimer;
6073 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6074 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
6076 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() ==>\n"));
6078 RTPRINT(FIOCTL, (IOCTL_CALLBACK_FUN|IOCTL_BT_LOGO), ("Flush Timeout ==>\n"));
6079 if (bthci_DiscardTxPackets(padapter, pBtHciInfo->FLTO_LLH))
6081 bthci_EventFlushOccurred(padapter, pBtHciInfo->FLTO_LLH);
6083 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackDiscardAclData() <==\n"));
6086 void bthci_TimerCallbackPsDisable(PRT_TIMER pTimer)
6088 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6089 PADAPTER padapter = (PADAPTER)pTimer;
6090 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6092 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() ==>\n"));
6094 PlatformScheduleWorkItem(&(pBTinfo->BTPsDisableWorkItem));
6096 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackPsDisable() <==\n"));
6099 void bthci_TimerCallbackJoinTimeout(PRT_TIMER pTimer)
6101 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6102 PADAPTER padapter = (PADAPTER)pTimer;
6103 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6104 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6105 u8 CurrentEntry = pBtMgnt->CurrentConnectEntryNum;
6107 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() ==> Current State %x\n",pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState));
6109 if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_STARTING)
6111 bthci_StateStarting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6113 else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_CONNECTING)
6115 bthci_StateConnecting(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6117 else if (pBTInfo->BtAsocEntry[CurrentEntry].BtCurrentState == HCI_STATE_AUTHENTICATING)
6119 bthci_StateAuth(padapter, STATE_CMD_CONNECT_ACCEPT_TIMEOUT,CurrentEntry);
6123 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <== No Such state!!!\n"));
6126 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackJoinTimeout() <==\n"));
6129 void bthci_TimerCallbackSendTestPacket(PRT_TIMER pTimer)
6131 // PADAPTER padapter = (PADAPTER)pTimer->padapter;
6132 PADAPTER padapter = (PADAPTER)pTimer;
6133 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6134 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
6136 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() \n"));
6137 if (pBtHciInfo->bTestIsEnd || !pBtHciInfo->bInTestMode)
6139 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==bTestIsEnd\n"));
6143 // BTPKT_SendTestPacket(padapter); // not porting yet
6144 PlatformSetTimer(padapter, &pBTInfo->BTTestSendPacketTimer, 50);
6145 RTPRINT(FIOCTL, IOCTL_CALLBACK_FUN, ("bthci_TimerCallbackSendTestPacket() <==\n"));
6148 void bthci_TimerCallbackBTSupervisionPacket(PRT_TIMER pTimer)
6152 void bthci_TimerCallbackBTAuthTimeout(PRT_TIMER pTimer)
6156 void bthci_TimerCallbackAsocTimeout(PRT_TIMER pTimer)
6160 void bthci_TimerCallbackDisconnectPhysicalLink(PRT_TIMER pTimer)
6162 PADAPTER padapter = (PADAPTER)pTimer;
6163 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6164 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6166 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("===>bthci_TimerCallbackDisconnectPhysicalLink\n"));
6168 if (pBTInfo->BtAsocEntry[pBtMgnt->DisconnectEntryNum].BtCurrentState == HCI_STATE_CONNECTED)
6170 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_CONNECTED,STATE_CMD_DISCONNECT_PHY_LINK, pBtMgnt->DisconnectEntryNum);
6173 BTHCI_EventNumOfCompletedDataBlocks(padapter);
6174 pBtMgnt->DisconnectEntryNum = 0xff;
6175 RT_TRACE(_module_rtl871x_security_c_, _drv_info_, ("<===bthci_TimerCallbackDisconnectPhysicalLink\n"));
6179 u8 bthci_WaitForRfReady(PADAPTER padapter)
6183 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
6184 rt_rf_power_state RfState;
6189 RfState = ppwrctrl->rf_pwrstate;
6191 if ((RfState != rf_on) || (ppwrctrl->bips_processing))
6194 if (waitcnt++ >= 200)
6202 RTPRINT(FIOCTL, IOCTL_STATE, ("bthci_WaitForRfReady(), Rf is on, wait %d times\n", waitcnt));
6211 void bthci_WorkItemCallbackPsDisable(void *pContext)
6213 PADAPTER padapter = (PADAPTER)pContext;
6214 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6217 for (CurrentAssocNum=0; CurrentAssocNum<MAX_BT_ASOC_ENTRY_NUM; CurrentAssocNum++)
6219 if (pBTInfo->BtAsocEntry[CurrentAssocNum].bUsed == _TRUE)
6221 RTPRINT(FIOCTL, IOCTL_STATE, ("WorkItemCallbackPsDisable(): Handle Associate Entry %d\n", CurrentAssocNum));
6223 if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_CREATOR)
6225 // BTPKT_StartBeacon(padapter, CurrentAssocNum); // not porting yet
6226 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_COMPLETE, CurrentAssocNum);
6228 else if (pBTInfo->BtAsocEntry[CurrentAssocNum].AMPRole == AMP_BTAP_JOINER)
6230 bthci_WaitForRfReady(padapter);
6231 bthci_ResponderStartToScan(padapter);
6237 void bthci_WorkItemCallbackHCICmd(void *pContext)
6239 PlatformProcessHCICommands(pContext);
6242 void bthci_WorkItemCallbackSendACLData(void *pContext)
6244 #if (SENDTXMEHTOD == 0)
6245 PADAPTER padapter = (PADAPTER)pContext;
6246 PlatformTxBTQueuedPackets(padapter);
6250 void bthci_WorkItemCallbackConnect(void *pContext)
6252 PADAPTER padapter = (PADAPTER)pContext;
6253 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6254 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6256 // BTPKT_JoinerConnectProcess(padapter, pBtMgnt->CurrentConnectEntryNum); // not porting yet
6259 u8 BTHCI_GetConnectEntryNum(PADAPTER padapter)
6261 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6262 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6264 return bthci_GetCurrentEntryNum(padapter, pBtMgnt->BtCurrentPhyLinkhandle);
6267 u8 BTHCI_GetCurrentEntryNumByMAC(PADAPTER padapter, u8 *SA)
6269 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6272 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
6274 if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
6276 if (_rtw_memcmp(pBTInfo->BtAsocEntry[i].BTRemoteMACAddr, SA, 6) == _TRUE)
6285 void BTHCI_StatusWatchdog(PADAPTER padapter)
6287 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6288 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
6289 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6290 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6291 PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic;
6292 u8 bRfOff=_FALSE, bTxBusy = _FALSE, bRxBusy = _FALSE;
6295 if ((ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) ||
6296 (ppwrctrl->rfoff_reason & RF_CHANGE_BY_SW))
6299 if ((check_fwstate(&padapter->mlmepriv, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) &&
6302 static u8 BTwaitcnt=0;
6303 if (pBtMgnt->BTNeedAMPStatusChg)
6308 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_FULL_CAPACITY_FOR_BT);
6314 RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], TxPktCntInPeriod=%d, TxPktLenInPeriod=%"i64fmt"d\n",
6315 pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod,
6316 pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod));
6317 RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], RxPktCntInPeriod=%d, RxPktLenInPeriod=%"i64fmt"d\n",
6318 pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod,
6319 pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod));
6320 if (pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod > 100 ||
6321 pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod > 100 )
6323 if (pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod)
6325 else if (pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod > pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod)
6329 pBtTraffic->Bt30TrafficStatistics.TxPktCntInPeriod = 0;
6330 pBtTraffic->Bt30TrafficStatistics.RxPktCntInPeriod = 0;
6331 pBtTraffic->Bt30TrafficStatistics.TxPktLenInPeriod = 0;
6332 pBtTraffic->Bt30TrafficStatistics.RxPktLenInPeriod = 0;
6333 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic = bTxBusy;
6334 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic = bRxBusy;
6335 RTPRINT(FIOCTL, IOCTL_BT_TP, ("[BT traffic], bTxBusyTraffic=%d, bRxBusyTraffic=%d\n",
6336 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic,
6337 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic));
6341 BTHCI_NotifyRFState(
6343 rt_rf_power_state StateToSet,
6344 RT_RF_CHANGE_SOURCE ChangeSource
6347 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
6348 RT_RF_CHANGE_SOURCE RfOffReason = ppwrctrl->rfoff_reason;
6350 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Old RfOffReason = 0x%x, ChangeSource = 0x%x\n", RfOffReason, ChangeSource));
6351 if (ChangeSource < RF_CHANGE_BY_HW)
6353 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), ChangeSource < RF_CHANGE_BY_HW\n"));
6358 // When RF is on/off by HW/SW(IPS/LPS not included), we have to notify
6359 // core stack the AMP_Status
6362 // We only have to check RF On/Off by HW/SW
6363 RfOffReason &= (RF_CHANGE_BY_HW|RF_CHANGE_BY_SW);
6371 // Previously, HW or SW Rf state is OFF, check if it is turned on by HW/SW
6373 RfOffReason &= ~ChangeSource;
6376 // Both HW/SW Rf is turned on
6377 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Rf is turned On!\n"));
6378 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_FULL_CAPACITY_FOR_BT);
6387 // Previously, both HW/SW Rf state is ON, check if it is turned off by HW/SW
6389 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_NotifyRFState(), Rf is turned Off!\n"));
6390 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in BTHCI_NotifyRFState()\n"));
6391 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
6396 RTPRINT(FIOCTL, IOCTL_STATE, ("Unknown case!! \n"));
6402 BTHCI_IndicateAMPStatus(
6408 // PMGNT_INFO pMgntInfo = &(padapter->MgntInfo);
6409 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6410 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6411 u8 bNeedIndicate = _FALSE;
6413 RTPRINT(FIOCTL, IOCTL_STATE, ("JoinAction=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
6414 JoinAction, channel));
6421 // When join infra or ibss, check if bt channel is the current channel,
6422 // if not, we need to indicate AMPStatus=2
6424 if (channel != pBtMgnt->BTChannel)
6425 bNeedIndicate = _TRUE;
6429 // when start IBSS, we need to indicate AMPStatus=2 to
6430 // reset be hw security
6432 bNeedIndicate = _TRUE;
6442 RTPRINT(FIOCTL, IOCTL_STATE, ("BTHCI_IndicateAMPStatus(), BT channel=%d, bssDesc->bdDsParms.ChannelNumber=%d\n",
6443 pBtMgnt->BTChannel, channel));
6445 if (pBtMgnt->BtOperationOn)
6447 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in JoinRequest()\n"));
6448 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
6460 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)pEvntData;
6463 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BT Event Code = 0x%x\n", PPacketIrpEvent->EventCode));
6464 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BT Event Length = 0x%x\n", PPacketIrpEvent->Length));
6466 switch (PPacketIrpEvent->EventCode)
6468 case HCI_EVENT_COMMAND_COMPLETE:
6469 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_COMPLETE\n"));
6471 case HCI_EVENT_COMMAND_STATUS:
6472 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_BT_LOGO), ("HCI_EVENT_COMMAND_STATUS\n"));
6480 BTHCI_GetPhysicalLinkHandle(
6485 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6488 handle = pBTinfo->BtAsocEntry[EntryNum].AmpAsocCmdData.BtPhyLinkhandle;
6494 BTHCI_IndicateRxData(
6501 RT_STATUS rt_status;
6503 rt_status = PlatformIndicateBTACLData(padapter, pData, dataLen, EntryNum);
6508 void BTHCI_InitializeAllTimer(PADAPTER padapter)
6510 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6511 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
6513 #if (BT_THREAD == 0)
6514 PlatformInitializeTimer(padapter, &pBTinfo->BTHCICmdTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackHCICmd, NULL, "BTHCICmdTimer");
6516 #if (SENDTXMEHTOD == 0)
6517 PlatformInitializeTimer(padapter, &pBTinfo->BTHCISendAclDataTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackSendAclData, NULL, "BTHCISendAclDataTimer");
6519 PlatformInitializeTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackDiscardAclData, NULL, "BTHCIDiscardAclDataTimer");
6520 PlatformInitializeTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackJoinTimeout, NULL, "BTHCIJoinTimeoutTimer");
6521 PlatformInitializeTimer(padapter, &pBTinfo->BTTestSendPacketTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackSendTestPacket, NULL, "BTTestSendPacketTimer");
6523 PlatformInitializeTimer(padapter, &pBTinfo->BTBeaconTimer, (RT_TIMER_CALL_BACK)BTPKT_TimerCallbackBeacon, NULL, "BTBeaconTimer");
6524 PlatformInitializeTimer(padapter, &pBtSec->BTWPAAuthTimer, (RT_TIMER_CALL_BACK)BTPKT_TimerCallbackWPAAuth, NULL, "BTWPAAuthTimer");
6525 PlatformInitializeTimer(padapter, &pBTinfo->BTSupervisionPktTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackBTSupervisionPacket, NULL, "BTGeneralPurposeTimer");
6526 PlatformInitializeTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackDisconnectPhysicalLink, NULL, "BTDisconnectPhyLinkTimer");
6527 PlatformInitializeTimer(padapter, &pBTinfo->BTPsDisableTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackPsDisable, NULL, "BTPsDisableTimer");
6528 PlatformInitializeTimer(padapter, &pBTinfo->BTAuthTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackBTAuthTimeout, NULL, "BTAuthTimeoutTimer");
6529 PlatformInitializeTimer(padapter, &pBTinfo->BTAsocTimeoutTimer, (RT_TIMER_CALL_BACK)bthci_TimerCallbackAsocTimeout, NULL, "BTAsocTimeoutTimer");
6532 void BTHCI_CancelAllTimer(PADAPTER padapter)
6534 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6535 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
6537 // Note: don't cancel BTHCICmdTimer, if you cancel this timer, there will
6538 // have posibility to cause irp not completed.
6539 #if (SENDTXMEHTOD == 0)
6540 PlatformCancelTimer(padapter, &pBTinfo->BTHCISendAclDataTimer);
6542 PlatformCancelTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
6543 PlatformCancelTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
6544 PlatformCancelTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
6546 PlatformCancelTimer(padapter, &pBTinfo->BTBeaconTimer);
6547 PlatformCancelTimer(padapter, &pBtSec->BTWPAAuthTimer);
6548 PlatformCancelTimer(padapter, &pBTinfo->BTSupervisionPktTimer);
6549 PlatformCancelTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer);
6550 PlatformCancelTimer(padapter, &pBTinfo->BTPsDisableTimer);
6551 PlatformCancelTimer(padapter, &pBTinfo->BTAuthTimeoutTimer);
6552 PlatformCancelTimer(padapter, &pBTinfo->BTAsocTimeoutTimer);
6555 void BTHCI_ReleaseAllTimer(PADAPTER padapter)
6557 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6558 PBT_SECURITY pBtSec = &pBTinfo->BtSec;
6560 #if (BT_THREAD == 0)
6561 PlatformReleaseTimer(padapter, &pBTinfo->BTHCICmdTimer);
6563 #if (SENDTXMEHTOD == 0)
6564 PlatformReleaseTimer(padapter, &pBTinfo->BTHCISendAclDataTimer);
6566 PlatformReleaseTimer(padapter, &pBTinfo->BTHCIDiscardAclDataTimer);
6567 PlatformReleaseTimer(padapter, &pBTinfo->BTHCIJoinTimeoutTimer);
6568 PlatformReleaseTimer(padapter, &pBTinfo->BTTestSendPacketTimer);
6570 PlatformReleaseTimer(padapter, &pBTinfo->BTBeaconTimer);
6571 PlatformReleaseTimer(padapter, &pBtSec->BTWPAAuthTimer);
6572 PlatformReleaseTimer(padapter, &pBTinfo->BTSupervisionPktTimer);
6573 PlatformReleaseTimer(padapter, &pBTinfo->BTDisconnectPhyLinkTimer);
6574 PlatformReleaseTimer(padapter, &pBTinfo->BTAuthTimeoutTimer);
6575 PlatformReleaseTimer(padapter, &pBTinfo->BTAsocTimeoutTimer);
6576 PlatformReleaseTimer(padapter, &pBTinfo->BTPsDisableTimer);
6579 void BTHCI_InitializeAllWorkItem(PADAPTER padapter)
6581 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6582 #if (BT_THREAD == 0)
6583 PlatformInitializeWorkItem(
6585 &(pBTinfo->HCICmdWorkItem),
6586 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackHCICmd,
6590 #if (SENDTXMEHTOD == 0)
6591 PlatformInitializeWorkItem(
6593 &(pBTinfo->HCISendACLDataWorkItem),
6594 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackSendACLData,
6596 "HCISendACLDataWorkItem");
6598 PlatformInitializeWorkItem(
6600 &(pBTinfo->BTPsDisableWorkItem),
6601 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackPsDisable,
6603 "BTPsDisableWorkItem");
6605 PlatformInitializeWorkItem(
6607 &(pBTinfo->BTConnectWorkItem),
6608 (RT_WORKITEM_CALL_BACK)bthci_WorkItemCallbackConnect,
6610 "BTConnectWorkItem");
6613 void BTHCI_FreeAllWorkItem(PADAPTER padapter)
6615 PBT30Info pBTinfo = GET_BT_INFO(padapter);
6616 #if (BT_THREAD == 0)
6617 PlatformFreeWorkItem(&(pBTinfo->HCICmdWorkItem));
6619 #if (SENDTXMEHTOD == 0)
6620 PlatformFreeWorkItem(&(pBTinfo->HCISendACLDataWorkItem));
6622 PlatformFreeWorkItem(&(pBTinfo->BTPsDisableWorkItem));
6623 PlatformFreeWorkItem(&(pBTinfo->BTConnectWorkItem));
6626 void BTHCI_Reset(PADAPTER padapter)
6628 bthci_CmdReset(padapter, _FALSE);
6631 u8 BTHCI_HsConnectionEstablished(PADAPTER padapter)
6633 u8 bBtConnectionExist = _FALSE;
6634 PBT30Info pBtinfo = GET_BT_INFO(padapter);
6637 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
6639 if (pBtinfo->BtAsocEntry[i].b4waySuccess == _TRUE)
6641 bBtConnectionExist = _TRUE;
6646 // RTPRINT(FIOCTL, IOCTL_STATE, (" BTHCI_HsConnectionEstablished(), connection exist = %d\n", bBtConnectionExist));
6648 return bBtConnectionExist;
6652 BTHCI_CheckProfileExist(
6654 BT_TRAFFIC_MODE_PROFILE Profile
6657 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6658 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6659 u8 IsPRofile = _FALSE;
6662 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
6664 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == Profile)
6674 u8 BTHCI_GetBTCoreSpecByProf(PADAPTER padapter, u8 profile)
6676 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6677 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6678 u8 btSpec = BT_SPEC_1_2;
6681 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
6683 if (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile == profile)
6685 btSpec = pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec;
6694 void BTHCI_GetProfileNameMoto(PADAPTER padapter)
6696 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6697 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6699 u8 InCommingMode = 0,OutGoingMode = 0,ScoMode = 0;
6702 ScoMode = pBtMgnt->ExtConfig.NumberOfSCO;
6704 RTPRINT(FBT, BT_TRACE, ("[DM][BT], NumberOfHandle = %d, NumberOfSCO = %d\n",
6705 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
6707 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
6709 InCommingMode=pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode;
6710 OutGoingMode=pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode;
6714 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_SCO;
6716 else if ((InCommingMode == BT_MOTOR_EXT_BE) && (OutGoingMode == BT_MOTOR_EXT_BE))
6718 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_PAN;
6720 else if ((InCommingMode == BT_MOTOR_EXT_GULB) && (OutGoingMode == BT_MOTOR_EXT_GULB))
6722 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_A2DP;
6724 else if ((InCommingMode == BT_MOTOR_EXT_GUL) && (OutGoingMode == BT_MOTOR_EXT_BE))
6726 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_HID;
6730 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
6735 void BTHCI_UpdateBTProfileRTKToMoto(PADAPTER padapter)
6737 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6738 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6741 pBtMgnt->ExtConfig.NumberOfSCO = 0;
6743 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
6745 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = BT_PROFILE_NONE;
6747 if (pBtMgnt->ExtConfig.linkInfo[i].BTProfile == BT_PROFILE_SCO)
6749 pBtMgnt->ExtConfig.NumberOfSCO++;
6752 pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile = pBtMgnt->ExtConfig.linkInfo[i].BTProfile;
6753 switch (pBtMgnt->ExtConfig.linkInfo[i].TrafficProfile)
6755 case BT_PROFILE_SCO:
6757 case BT_PROFILE_PAN:
6758 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_BE;
6759 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_BE;
6761 case BT_PROFILE_A2DP:
6762 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_GULB;
6763 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_GULB;
6765 case BT_PROFILE_HID:
6766 pBtMgnt->ExtConfig.linkInfo[i].IncomingTrafficMode = BT_MOTOR_EXT_GUL;
6767 pBtMgnt->ExtConfig.linkInfo[i].OutgoingTrafficMode = BT_MOTOR_EXT_BE;
6774 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RTK, NumberOfHandle = %d, NumberOfSCO = %d\n",
6775 pBtMgnt->ExtConfig.NumberOfHandle, pBtMgnt->ExtConfig.NumberOfSCO));
6778 void BTHCI_GetBTRSSI(PADAPTER padapter)
6780 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6781 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6786 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
6788 bthci_EventExtGetBTRSSI(padapter, pBtMgnt->ExtConfig.linkInfo[i].ConnectHandle);
6792 void BTHCI_WifiScanNotify(PADAPTER padapter, u8 scanType)
6794 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6795 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6797 if (pBtMgnt->ExtConfig.bEnableWifiScanNotify)
6798 bthci_EventExtWifiScanNotify(padapter, scanType);
6805 HCI_STATE_WITH_CMD StateCmd,
6809 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6810 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6812 if (EntryNum == 0xff)
6814 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, error EntryNum=0x%x \n",EntryNum));
6817 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, EntryNum = 0x%x, CurrentState = 0x%x, BtNextState = 0x%x, StateCmd = 0x%x ,StateToEnter = 0x%x\n",
6818 EntryNum,pBTInfo->BtAsocEntry[EntryNum].BtCurrentState,pBTInfo->BtAsocEntry[EntryNum].BtNextState,StateCmd,StateToEnter));
6820 if (pBTInfo->BtAsocEntry[EntryNum].BtNextState & StateToEnter)
6822 pBTInfo->BtAsocEntry[EntryNum].BtCurrentState = StateToEnter;
6824 switch (StateToEnter)
6826 case HCI_STATE_STARTING:
6828 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTING;
6829 bthci_StateStarting(padapter,StateCmd,EntryNum);
6832 case HCI_STATE_CONNECTING:
6834 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTING | HCI_STATE_DISCONNECTING | HCI_STATE_AUTHENTICATING;
6835 bthci_StateConnecting(padapter,StateCmd,EntryNum);
6839 case HCI_STATE_AUTHENTICATING:
6841 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTING | HCI_STATE_CONNECTED;
6842 bthci_StateAuth(padapter,StateCmd,EntryNum);
6846 case HCI_STATE_CONNECTED:
6848 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_CONNECTED | HCI_STATE_DISCONNECTING;
6849 bthci_StateConnected(padapter,StateCmd,EntryNum);
6853 case HCI_STATE_DISCONNECTING:
6855 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_DISCONNECTING;
6856 bthci_StateDisconnecting(padapter,StateCmd,EntryNum);
6860 case HCI_STATE_DISCONNECTED:
6862 pBTInfo->BtAsocEntry[EntryNum].BtNextState = HCI_STATE_DISCONNECTED | HCI_STATE_STARTING | HCI_STATE_CONNECTING;
6863 bthci_StateDisconnected(padapter,StateCmd,EntryNum);
6868 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Unknown state to enter!!!\n"));
6874 RTPRINT(FIOCTL, IOCTL_STATE, (" StateMachine, Wrong state to enter\n"));
6877 // 20100325 Joseph: Disable/Enable IPS/LPS according to BT status.
6878 if (!pBtMgnt->bBTConnectInProgress && !pBtMgnt->BtOperationOn)
6880 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT PS], IPSReturn()\n"));
6881 IPSReturn(padapter, IPS_DISABLE_BT_ON);
6885 void BTHCI_DisconnectPeer(PADAPTER padapter, u8 EntryNum)
6887 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6888 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
6890 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, (" BTHCI_DisconnectPeer()\n"));
6892 BTHCI_SM_WITH_INFO(padapter,HCI_STATE_DISCONNECTING,STATE_CMD_MAC_CONNECT_CANCEL_INDICATE,EntryNum);
6894 if (pBTInfo->BtAsocEntry[EntryNum].bUsed)
6896 // BTPKT_SendDeauthentication(padapter, pBTInfo->BtAsocEntry[EntryNum].BTRemoteMACAddr, unspec_reason); // not porting yet
6899 if (pBtMgnt->bBTConnectInProgress)
6901 pBtMgnt->bBTConnectInProgress = _FALSE;
6902 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT Flag], BT Connect in progress OFF!!\n"));
6905 bthci_RemoveEntryByEntryNum(padapter,EntryNum);
6907 if (pBtMgnt->bNeedNotifyAMPNoCap)
6909 RTPRINT(FIOCTL, IOCTL_STATE, ("[BT AMPStatus], set to invalid in BTHCI_DisconnectPeer()\n"));
6910 BTHCI_EventAMPStatusChange(padapter, AMP_STATUS_NO_CAPACITY_FOR_BT);
6914 void BTHCI_EventNumOfCompletedDataBlocks(PADAPTER padapter)
6916 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6917 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6918 PBT_HCI_INFO pBtHciInfo = &pBTInfo->BtHciInfo;
6919 u8 localBuf[TmpLocalBufSize] = "";
6920 u8 *pRetPar, *pTriple;
6921 u8 len=0, i, j, handleNum=0;
6922 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
6923 u16 *pu2Temp, *pPackets, *pHandle, *pDblocks;
6926 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
6928 if (!(pBtHciInfo->BTEventMaskPage2 & EMP2_HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS))
6930 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("[BT event], Num Of Completed DataBlocks, Ignore to send NumOfCompletedDataBlocksEvent due to event mask page 2\n"));
6934 // Return parameters starts from here
6935 pRetPar = &PPacketIrpEvent->Data[0];
6936 pTriple = &pRetPar[3];
6937 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
6940 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
6942 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
6945 pHandle = (u16*)&pTriple[0]; // Handle[i]
6946 pPackets = (u16*)&pTriple[2]; // Num_Of_Completed_Packets[i]
6947 pDblocks = (u16*)&pTriple[4]; // Num_Of_Completed_Blocks[i]
6948 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
6949 PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
6951 *pHandle = pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle;
6952 *pPackets = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
6953 *pDblocks = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
6954 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount)
6957 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",
6958 *pHandle, *pPackets, *pDblocks));
6960 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
6961 #if (SENDTXMEHTOD == 0 || SENDTXMEHTOD == 2)
6962 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
6970 pRetPar[2] = handleNum; // Number_of_Handles
6972 pu2Temp = (u16*)&pRetPar[0];
6973 *pu2Temp = BTTotalDataBlockNum;
6976 PPacketIrpEvent->EventCode = HCI_EVENT_NUM_OF_COMPLETE_DATA_BLOCKS;
6977 PPacketIrpEvent->Length = len;
6978 if (handleNum && sent)
6980 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
6984 void BTHCI_EventNumOfCompletedPackets(PADAPTER padapter)
6986 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
6987 PBT30Info pBTInfo = GET_BT_INFO(padapter);
6988 u8 localBuf[TmpLocalBufSize] = "";
6989 u8 *pRetPar, *pDouble;
6990 u8 len=0, i, j, handleNum=0;
6991 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
6992 u16 *pPackets, *pHandle;
6995 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
6996 // Return parameters starts from here
6997 pRetPar = &PPacketIrpEvent->Data[0];
6998 pDouble = &pRetPar[1];
6999 for (j=0; j<MAX_BT_ASOC_ENTRY_NUM; j++)
7001 for (i=0; i<MAX_LOGICAL_LINK_NUM; i++)
7003 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle)
7006 pHandle = (u16*)&pDouble[0]; // Handle[i]
7007 pPackets = (u16*)&pDouble[2]; // Num_Of_Completed_Packets[i]
7008 PlatformAcquireSpinLock(padapter, RT_TX_SPINLOCK);
7009 *pHandle = pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].BtLogLinkhandle;
7010 *pPackets = (u16)pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount;
7011 if (pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount)
7013 pBTInfo->BtAsocEntry[j].LogLinkCmdData[i].TxPacketCount = 0;
7014 PlatformReleaseSpinLock(padapter, RT_TX_SPINLOCK);
7021 pRetPar[0] = handleNum; // Number_of_Handles
7024 PPacketIrpEvent->EventCode = HCI_EVENT_NUMBER_OF_COMPLETE_PACKETS;
7025 PPacketIrpEvent->Length = len;
7026 if (handleNum && sent)
7028 RTPRINT(FIOCTL, IOCTL_BT_EVENT, ("BTHCI_EventNumOfCompletedPackets \n"));
7029 bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2);
7034 BTHCI_EventAMPStatusChange(
7039 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
7040 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7041 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
7043 u8 localBuf[7] = "";
7045 PPACKET_IRP_HCIEVENT_DATA PPacketIrpEvent;
7047 if (AMP_Status==AMP_STATUS_NO_CAPACITY_FOR_BT)
7049 pBtMgnt->BTNeedAMPStatusChg = _TRUE;
7050 pBtMgnt->bNeedNotifyAMPNoCap = _FALSE;
7052 BTHCI_DisconnectAll(padapter);
7054 else if (AMP_Status == AMP_STATUS_FULL_CAPACITY_FOR_BT)
7056 pBtMgnt->BTNeedAMPStatusChg = _FALSE;
7059 PPacketIrpEvent = (PPACKET_IRP_HCIEVENT_DATA)(&localBuf[0]);
7060 // Return parameters starts from here
7061 pRetPar = &PPacketIrpEvent->Data[0];
7063 pRetPar[0] = 0; // Status
7065 pRetPar[1] = AMP_Status; // AMP_Status
7068 PPacketIrpEvent->EventCode = HCI_EVENT_AMP_STATUS_CHANGE;
7069 PPacketIrpEvent->Length = len;
7070 if (bthci_IndicateEvent(padapter, PPacketIrpEvent, len+2) == RT_STATUS_SUCCESS)
7072 RTPRINT(FIOCTL, (IOCTL_BT_EVENT|IOCTL_STATE), ("[BT event], AMP Status Change, AMP_Status = %d\n", AMP_Status));
7076 void BTHCI_DisconnectAll(PADAPTER padapter)
7078 PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
7079 // PMGNT_INFO pMgntInfo = &(pDefaultAdapter->MgntInfo);
7080 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7084 RTPRINT(FIOCTL, IOCTL_STATE, (" DisconnectALL()\n"));
7086 for (i=0; i<MAX_BT_ASOC_ENTRY_NUM; i++)
7088 if (pBTInfo->BtAsocEntry[i].b4waySuccess == _TRUE)
7090 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTED, STATE_CMD_DISCONNECT_PHY_LINK, i);
7092 else if (pBTInfo->BtAsocEntry[i].bUsed == _TRUE)
7094 if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_CONNECTING)
7096 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_CONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7098 else if (pBTInfo->BtAsocEntry[i].BtCurrentState == HCI_STATE_DISCONNECTING)
7100 BTHCI_SM_WITH_INFO(padapter, HCI_STATE_DISCONNECTING, STATE_CMD_MAC_CONNECT_CANCEL_INDICATE, i);
7109 PPACKET_IRP_HCICMD_DATA pHciCmd
7112 HCI_STATUS status = HCI_STATUS_SUCCESS;
7113 PBT30Info pBTInfo = GET_BT_INFO(padapter);
7114 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
7116 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("\n"));
7117 RTPRINT(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), ("HCI Command start, OGF=0x%x, OCF=0x%x, Length=0x%x\n",
7118 pHciCmd->OGF, pHciCmd->OCF, pHciCmd->Length));
7119 if (pHciCmd->Length)
7121 RTPRINT_DATA(FIOCTL, (IOCTL_BT_HCICMD_DETAIL|IOCTL_BT_LOGO), "HCI Command, Hex Data :\n",
7122 &pHciCmd->Data[0], pHciCmd->Length);
7124 if (pHciCmd->OGF == OGF_EXTENSION)
7126 if (pHciCmd->OCF == HCI_SET_RSSI_VALUE)
7128 RTPRINT(FIOCTL, IOCTL_BT_EVENT_PERIODICAL, ("[BT cmd], "));
7132 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT cmd], "));
7137 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("[BT cmd], "));
7140 pBtDbg->dbgHciInfo.hciCmdCnt++;
7142 switch (pHciCmd->OGF)
7144 case OGF_LINK_CONTROL_COMMANDS:
7145 status = bthci_HandleOGFLinkControlCMD(padapter, pHciCmd);
7147 case OGF_HOLD_MODE_COMMAND:
7149 case OGF_SET_EVENT_MASK_COMMAND:
7150 status = bthci_HandleOGFSetEventMaskCMD(padapter, pHciCmd);
7152 case OGF_INFORMATIONAL_PARAMETERS:
7153 status = bthci_HandleOGFInformationalParameters(padapter, pHciCmd);
7155 case OGF_STATUS_PARAMETERS:
7156 status = bthci_HandleOGFStatusParameters(padapter, pHciCmd);
7158 case OGF_TESTING_COMMANDS:
7159 status = bthci_HandleOGFTestingCMD(padapter, pHciCmd);
7162 status = bthci_HandleOGFExtension(padapter,pHciCmd);
7165 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI Command(), Unknown OGF = 0x%x\n", pHciCmd->OGF));
7166 RTPRINT(FIOCTL, IOCTL_BT_HCICMD, ("HCI_UNKNOWN_COMMAND\n"));
7167 status = bthci_UnknownCMD(padapter, pHciCmd);
7170 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_DETAIL, ("HCI Command execution end!!\n"));
7176 BTHCI_SetLinkStatusNotify(
7178 PPACKET_IRP_HCICMD_DATA pHciCmd
7181 bthci_CmdLinkStatusNotify(padapter, pHciCmd);
7184 // ===== End of sync from SD7 driver COMMOM/bt_hci.c =====
7187 #ifdef __HALBTC87231ANT_C__ // HAL/BTCoexist/HalBtc87231Ant.c
7189 const char *const BtStateString[] =
7198 "BT_ACL_INQ_OR_PAG",
7199 "BT_STATE_NOT_DEFINED"
7202 extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
7204 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
7214 u8 H2C_Parameter[3] = {0};
7216 H2C_Parameter[0] = byte1;
7217 H2C_Parameter[1] = byte2;
7218 H2C_Parameter[2] = byte3;
7220 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x50=0x%06x\n",
7221 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
7223 FillH2CCmd(padapter, 0x50, 3, H2C_Parameter);
7226 void btdm_SetFwIgnoreWlanAct(PADAPTER padapter, u8 bEnable)
7228 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
7229 u8 H2C_Parameter[1] = {0};
7233 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Ignore Wlan_Act !!\n"));
7234 H2C_Parameter[0] |= BIT(0); // function enable
7235 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
7239 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT don't ignore Wlan_Act !!\n"));
7242 RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%02x\n",
7245 FillH2CCmd(padapter, BT_IGNORE_WLAN_ACT_EID, 1, H2C_Parameter);
7248 void btdm_NotifyFwScan(PADAPTER padapter, u8 scanType)
7250 u8 H2C_Parameter[1] = {0};
7252 if (scanType == _TRUE)
7253 H2C_Parameter[0] = 0x1;
7255 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Notify FW for wifi scan, write 0x3b=0x%02x\n",
7258 FillH2CCmd(padapter, 0x3b, 1, H2C_Parameter);
7261 void btdm_1AntSetPSMode(PADAPTER padapter, u8 enable, u8 smartps, u8 mode)
7263 struct pwrctrl_priv *pwrctrl;
7266 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current LPS(%s, %d), smartps=%d\n", enable==_TRUE?"ON":"OFF", mode, smartps));
7268 pwrctrl = &padapter->pwrctrlpriv;
7270 if (enable == _TRUE) {
7271 rtw_set_ps_mode(padapter, PS_MODE_MIN, smartps, mode);
7273 rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0);
7274 LPS_RF_ON_check(padapter, 100);
7278 void btdm_1AntTSFSwitch(PADAPTER padapter, u8 enable)
7283 oldVal = rtw_read8(padapter, 0x550);
7286 newVal = oldVal | EN_BCN_FUNCTION;
7288 newVal = oldVal & ~EN_BCN_FUNCTION;
7290 if (oldVal != newVal)
7291 rtw_write8(padapter, 0x550, newVal);
7294 u8 btdm_Is1AntPsTdmaStateChange(PADAPTER padapter)
7296 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
7297 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7300 if ((pBtdm8723->bPrePsTdmaOn != pBtdm8723->bCurPsTdmaOn) ||
7301 (pBtdm8723->prePsTdma != pBtdm8723->curPsTdma))
7311 // Before enter TDMA, make sure Power Saving is enable!
7319 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
7320 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7323 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], TDMA(%s, %d)\n", (bTurnOn? "ON":"OFF"), type));
7324 pBtdm8723->bCurPsTdmaOn = bTurnOn;
7325 pBtdm8723->curPsTdma = type;
7330 case 1: // A2DP Level-1 or FTP/OPP
7332 if (btdm_Is1AntPsTdmaStateChange(padapter))
7334 // wide duration for WiFi
7335 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x58);
7338 case 2: // A2DP Level-2
7339 if (btdm_Is1AntPsTdmaStateChange(padapter))
7341 // normal duration for WiFi
7342 BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x58);
7345 case 3: // BT FTP/OPP
7346 if (btdm_Is1AntPsTdmaStateChange(padapter))
7348 // normal duration for WiFi
7349 BTDM_SetFw3a(padapter, 0xd3, 0x30, 0x03, 0x10, 0x58);
7353 case 4: // for wifi scan & BT is connected
7354 if (btdm_Is1AntPsTdmaStateChange(padapter))
7356 // protect 3 beacons in 3-beacon period & no Tx pause at BT slot
7357 BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0);
7360 case 5: // for WiFi connected-busy & BT is Non-Connected-Idle
7361 if (btdm_Is1AntPsTdmaStateChange(padapter))
7363 // SCO mode, Ant fixed at WiFi, WLAN_Act toggle
7364 BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x00);
7367 case 9: // ACL high-retry type - 2
7368 if (btdm_Is1AntPsTdmaStateChange(padapter))
7370 // narrow duration for WiFi
7371 BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi
7374 case 10: // for WiFi connect idle & BT ACL busy or WiFi Connected-Busy & BT is Inquiry
7375 if (btdm_Is1AntPsTdmaStateChange(padapter))
7377 BTDM_SetFw3a(padapter, 0x13, 0xa, 0xa, 0x0, 0x40);
7380 case 11: // ACL high-retry type - 3
7381 if (btdm_Is1AntPsTdmaStateChange(padapter))
7383 // narrow duration for WiFi
7384 BTDM_SetFw3a(padapter, 0xd3, 0x05, 0x05, 0x00, 0x58);
7387 case 12: // for WiFi Connected-Busy & BT is Connected-Idle
7388 if (btdm_Is1AntPsTdmaStateChange(padapter))
7390 // Allow High-Pri BT
7391 BTDM_SetFw3a(padapter, 0xeb, 0x0a, 0x03, 0x31, 0x18);
7394 case 20: // WiFi only busy ,TDMA mode for power saving
7395 if (btdm_Is1AntPsTdmaStateChange(padapter))
7397 BTDM_SetFw3a(padapter, 0x13, 0x25, 0x25, 0x00, 0x00);
7400 case 27: // WiFi DHCP/Site Survey & BT SCO busy
7401 if (btdm_Is1AntPsTdmaStateChange(padapter))
7403 BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x31, 0x98);
7406 case 28: // WiFi DHCP/Site Survey & BT idle
7407 if (btdm_Is1AntPsTdmaStateChange(padapter))
7409 BTDM_SetFw3a(padapter, 0x69, 0x25, 0x03, 0x31, 0x00);
7412 case 29: // WiFi DHCP/Site Survey & BT ACL busy
7413 if (btdm_Is1AntPsTdmaStateChange(padapter))
7415 BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18);
7416 rtw_write32(padapter, 0x6c0, 0x5afa5afa);
7417 rtw_write32(padapter, 0x6c4, 0x5afa5afa);
7420 case 30: // WiFi idle & BT Inquiry
7421 if (btdm_Is1AntPsTdmaStateChange(padapter))
7423 BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x00);
7427 if (btdm_Is1AntPsTdmaStateChange(padapter))
7429 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x58);
7432 case 32: // BT SCO & Inquiry
7433 if (btdm_Is1AntPsTdmaStateChange(padapter))
7435 BTDM_SetFw3a(padapter, 0xab, 0x0a, 0x03, 0x11, 0x98);
7438 case 33: // BT SCO & WiFi site survey
7439 if (btdm_Is1AntPsTdmaStateChange(padapter))
7441 BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x30, 0x98);
7444 case 34: // BT HID & WiFi site survey
7445 if (btdm_Is1AntPsTdmaStateChange(padapter))
7447 BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x18);
7450 case 35: // BT HID & WiFi Connecting
7451 if (btdm_Is1AntPsTdmaStateChange(padapter))
7453 BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x18);
7464 if (btdm_Is1AntPsTdmaStateChange(padapter))
7466 // Antenna control by PTA, 0x870 = 0x310
7467 BTDM_SetFw3a(padapter, 0x8, 0x0, 0x0, 0x0, 0x0);
7472 if (btdm_Is1AntPsTdmaStateChange(padapter))
7474 // Antenna control by PTA, 0x870 = 0x310
7475 BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
7477 rtw_write16(padapter, 0x860, 0x210); // Switch Antenna to BT
7478 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x210, Switch Antenna to BT\n"));
7481 if (btdm_Is1AntPsTdmaStateChange(padapter))
7483 // Antenna control by PTA, 0x870 = 0x310
7484 BTDM_SetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
7486 rtw_write16(padapter, 0x860, 0x110); // Switch Antenna to WiFi
7487 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x110, Switch Antenna to WiFi\n"));
7492 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current TDMA(%s, %d)\n",
7493 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
7496 pBtdm8723->bPrePsTdmaOn = pBtdm8723->bCurPsTdmaOn;
7497 pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
7500 void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u8 bTDMAOn, u8 tdmaType)
7502 struct pwrctrl_priv *pwrctrl;
7503 PHAL_DATA_TYPE pHalData;
7504 PBTDM_8723A_1ANT pBtdm8723;
7509 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
7510 (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE))
7512 btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
7516 #ifdef DIS_PS_RX_BCN
7517 psOption &= ~BIT(0);
7520 RTPRINT(FBT, BT_TRACE,
7521 ("[BTCoex], Set LPS(%s, %d) TDMA(%s, %d)\n",
7522 bPSEn==_TRUE?"ON":"OFF", psOption,
7523 bTDMAOn==_TRUE?"ON":"OFF", tdmaType));
7525 pwrctrl = &padapter->pwrctrlpriv;
7526 pHalData = GET_HAL_DATA(padapter);
7527 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7531 if (_TRUE == pBtdm8723->bWiFiHalt) {
7532 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Halt!!\n"));
7536 if (_TRUE == pwrctrl->bInSuspend) {
7537 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi in Suspend!!\n"));
7541 if (_TRUE == padapter->bDriverStopped) {
7542 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi driver stopped!!\n"));
7546 if (_TRUE == padapter->bSurpriseRemoved) {
7547 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Enable PS Fail, WiFi Surprise Removed!!\n"));
7551 psMode = PS_MODE_MIN;
7555 psMode = PS_MODE_ACTIVE;
7559 if (psMode != pwrctrl->pwr_mode)
7561 else if (psMode != PS_MODE_ACTIVE)
7563 if (psOption != pwrctrl->bcn_ant_mode)
7565 else if (smartps != pwrctrl->smart_ps)
7573 if (_TRUE == bSwitchPS)
7576 if (pBtdm8723->bCurPsTdmaOn == _TRUE)
7578 if (bTDMAOn == _FALSE)
7579 btdm_1AntPsTdma(padapter, _FALSE, tdmaType);
7582 if ((BT_IsBtDisabled(padapter) == _TRUE) ||
7583 (pHalData->bt_coexist.halCoex8723.c2hBtInfo == BT_INFO_STATE_NO_CONNECTION) ||
7584 (pHalData->bt_coexist.halCoex8723.c2hBtInfo == BT_INFO_STATE_CONNECT_IDLE)
7585 || (tdmaType == 29))
7586 btdm_1AntPsTdma(padapter, _FALSE, 9);
7588 btdm_1AntPsTdma(padapter, _FALSE, 0);
7592 // change Power Save State
7593 btdm_1AntSetPSMode(padapter, bPSEn, smartps, psOption);
7596 btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType);
7599 void btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 psOption, u8 bTDMAOn, u8 tdmaType)
7601 _btdm_1AntSetPSTDMA(padapter, bPSEn, 0, psOption, bTDMAOn, tdmaType);
7604 void btdm_1AntWifiParaAdjust(PADAPTER padapter, u8 bEnable)
7606 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
7607 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7611 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust enable!!\n"));
7612 pBtdm8723->curWifiPara = 1;
7613 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
7615 BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
7620 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi para adjust disable!!\n"));
7621 pBtdm8723->curWifiPara = 2;
7622 if (pBtdm8723->preWifiPara != pBtdm8723->curWifiPara)
7624 BTDM_SetSwPenaltyTxRateAdaptive(padapter, BT_TX_RATE_ADAPTIVE_NORMAL);
7628 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], preWifiPara = %d, curWifiPara = %d!!\n",
7629 // pBtdm8723->preWifiPara, pBtdm8723->curWifiPara));
7630 // pBtdm8723->preWifiPara = pBtdm8723->curWifiPara;
7633 void btdm_1AntPtaParaReload(PADAPTER padapter)
7636 rtw_write8(padapter, 0x6cc, 0x0); // 1-Ant coex
7637 rtw_write32(padapter, 0x6c8, 0xffff); // wifi break table
7638 rtw_write32(padapter, 0x6c4, 0x55555555); // coex table
7640 // Antenna switch control parameter
7641 rtw_write32(padapter, 0x858, 0xaaaaaaaa);
7642 if (IS_8723A_A_CUT(GET_HAL_DATA(padapter)->VersionID))
7644 rtw_write32(padapter, 0x870, 0x0); // SPDT(connected with TRSW) control by hardware PTA
7645 rtw_write8(padapter, 0x40, 0x24);
7649 rtw_write8(padapter, 0x40, 0x20);
7650 rtw_write16(padapter, 0x860, 0x210); // set antenna at bt side if ANTSW is software control
7651 rtw_write32(padapter, 0x870, 0x300); // SPDT(connected with TRSW) control by hardware PTA
7652 rtw_write32(padapter, 0x874, 0x22804000); // ANTSW keep by GNT_BT
7655 // coexistence parameters
7656 rtw_write8(padapter, 0x778, 0x1); // enable RTK mode PTA
7658 // BT don't ignore WLAN_Act
7659 btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
7664 * 1: upgrade (add WiFi duration time)
7666 * -1: downgrade (add BT duration time)
7668 s8 btdm_1AntTdmaJudgement(PADAPTER padapter, u8 retry)
7670 PHAL_DATA_TYPE pHalData;
7671 PBTDM_8723A_1ANT pBtdm8723;
7672 static s8 up = 0, dn = 0, m = 1, n = 3, WaitCount= 0;
7676 pHalData = GET_HAL_DATA(padapter);
7677 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7680 if (pBtdm8723->psTdmaMonitorCnt == 0)
7693 if (retry == 0) // no retry in the last 2-second duration
7701 // retry=0 in consecutive 3m*(2s), add WiFi duration
7710 else if (retry <= 3) // retry<=3 in the last 2-second duration
7718 // retry<=3 in consecutive 2*(2s), minus WiFi duration (add BT duration)
7721 // record how many time downgrad WiFi duration
7726 // the max number of m is 20
7727 // the longest time of upgrade WiFi duration is 20*3*2s = 120s
7728 if (m >= 20) m = 20;
7735 else // retry count > 3
7737 // retry>3, minus WiFi duration (add BT duration)
7740 // record how many time downgrad WiFi duration
7745 if (m >= 20) m = 20;
7755 void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter)
7757 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
7758 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7761 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
7762 if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCnt)
7764 pBtdm8723->psTdmaMonitorCnt = 0;
7765 pBtdm8723->psTdmaGlobalCnt = 0;
7767 if (pBtdm8723->psTdmaMonitorCnt == 0)
7769 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, first time execute!!\n"));
7770 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 2);
7771 pBtdm8723->psTdmaDuAdjType = 2;
7775 // Now we only have 4 level Ps Tdma,
7776 // if that's not the following 4 level(will changed by wifi scan, dhcp...),
7777 // then we have to adjust it back to the previous record one.
7778 if ((pBtdm8723->curPsTdma != 1) &&
7779 (pBtdm8723->curPsTdma != 2) &&
7780 (pBtdm8723->curPsTdma != 9) &&
7781 (pBtdm8723->curPsTdma != 11))
7783 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], tdma adjust type can only be 1/2/9/11 !!!\n"));
7784 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], the latest adjust type = %d\n", pBtdm8723->psTdmaDuAdjType));
7786 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
7792 judge = btdm_1AntTdmaJudgement(padapter, pHalData->bt_coexist.halCoex8723.btRetryCnt);
7795 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Upgrade WiFi duration\n"));
7796 if (pBtdm8723->curPsTdma == 1)
7798 // Decrease WiFi duration for high BT retry
7799 if(pHalData->bt_coexist.halCoex8723.btInfoExt){
7800 pBtdm8723->psTdmaDuAdjType = 9;
7801 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n"));
7804 pBtdm8723->psTdmaDuAdjType = 2;
7805 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
7808 else if (pBtdm8723->curPsTdma == 2)
7810 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
7811 pBtdm8723->psTdmaDuAdjType = 9;
7813 else if (pBtdm8723->curPsTdma == 9)
7815 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
7816 pBtdm8723->psTdmaDuAdjType = 11;
7819 else if (judge == 1)
7821 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, Downgrade WiFi duration!!\n"));
7823 if (pBtdm8723->curPsTdma == 11)
7825 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9);
7826 pBtdm8723->psTdmaDuAdjType = 9;
7828 else if (pBtdm8723->curPsTdma == 9)
7830 if (pHalData->bt_coexist.halCoex8723.btInfoExt){
7831 pBtdm8723->psTdmaDuAdjType = 9;
7832 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n"));
7835 pBtdm8723->psTdmaDuAdjType = 2;
7836 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
7838 else if (pBtdm8723->curPsTdma == 2)
7840 if (pHalData->bt_coexist.halCoex8723.btInfoExt){
7841 pBtdm8723->psTdmaDuAdjType = 9;
7842 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n"));
7845 pBtdm8723->psTdmaDuAdjType = 1;
7846 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, pBtdm8723->psTdmaDuAdjType);
7851 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, no need to change\n"));
7855 RTPRINT(FBT, BT_TRACE, ("[BTCoex], ACL current TDMA(%s, %d)\n",
7856 (pBtdm8723->bCurPsTdmaOn? "ON":"OFF"), pBtdm8723->curPsTdma));
7859 pBtdm8723->psTdmaMonitorCnt++;
7862 u8 btdm_1AntAdjustbyWiFiRSSI(u8 RSSI_Now, u8 RSSI_Last, u8 RSSI_Th)
7866 if (RSSI_Now>RSSI_Last)
7868 if (RSSI_Now > (RSSI_Th + 5))
7875 if (RSSI_Now > RSSI_Th)
7884 void btdm_1AntTdmaDurationAdjustForSCO(PADAPTER padapter)
7886 PHAL_DATA_TYPE pHalData;
7887 PBTDM_8723A_1ANT pBtdm8723;
7890 u8 RSSITh_WiFi, RSSITh12_BT, RSSITh23_BT;
7891 u8 Type, RSSIOffset;
7892 u8 RSSI_WiFi_Now, RSSI_BT_Now;
7895 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
7896 pHalData = GET_HAL_DATA(padapter);
7897 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
7898 podm = &pHalData->odmpriv;
7899 pDigTable = &podm->DM_DigTable;
7904 RSSI_WiFi_Now = pDigTable->Rssi_val_min;
7905 RSSI_BT_Now = pHalData->bt_coexist.halCoex8723.btRssi;
7907 if (pBtdm8723->psTdmaGlobalCnt != pBtdm8723->psTdmaMonitorCntForSCO)
7909 pBtdm8723->psTdmaMonitorCntForSCO = 0;
7910 pBtdm8723->psTdmaGlobalCnt = 0;
7913 if (pBtdm8723->psTdmaMonitorCntForSCO == 0)
7915 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, first time execute!!\n"));
7916 pBtdm8723->RSSI_WiFi_Last = 0;
7917 pBtdm8723->RSSI_BT_Last = 0;
7921 if ((pBtdm8723->curPsTdma != 23) &&
7922 (pBtdm8723->curPsTdma != 24) &&
7923 (pBtdm8723->curPsTdma != 25) &&
7924 (pBtdm8723->curPsTdma != 26))
7926 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, tdma adjust type can only be 23/24/25/26 !!!\n"));
7927 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, the latest adjust type=%d\n", pBtdm8723->psTdmaDuAdjTypeForSCO));
7929 Type = pBtdm8723->psTdmaDuAdjTypeForSCO;
7931 goto _exit_1AntTdmaDurationAdjustForSCO;
7935 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjSCO, pre curPsTdma=%d\n", pBtdm8723->curPsTdma));
7939 BTDM_1AntSignalCompensation(padapter, &RSSI_WiFi_Now, &RSSI_BT_Now);
7941 if (!BTDM_IsWifiBusy(padapter)) // WiFi LPS
7943 //Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
7946 if(RSSI_BT_Now >= RSSITh12_BT + 4)
7953 if (RSSI_BT_Now >= RSSITh12_BT)
7962 //if (RSSI_BT_Now > pBtdm8723->RSSI_BT_Last)
7965 if (RSSI_BT_Now >= RSSITh12_BT + 4)
7967 else if (RSSI_BT_Now >= RSSITh23_BT + 4)
7970 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
7974 if (RSSI_BT_Now >= RSSITh12_BT)
7976 else if (RSSI_BT_Now >= RSSITh23_BT)
7979 Type = btdm_1AntAdjustbyWiFiRSSI(RSSI_WiFi_Now, pBtdm8723->RSSI_WiFi_Last, RSSITh_WiFi);
7983 _exit_1AntTdmaDurationAdjustForSCO:
7985 pBtdm8723->RSSI_WiFi_Last = RSSI_WiFi_Now;
7986 pBtdm8723->RSSI_BT_Last = RSSI_BT_Now;
7988 if (Type != pBtdm8723->curPsTdma)
7989 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, Type);
7991 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO current TDMA(ON, %d), RSSI_WiFi=%d, RSSI_BT=%d\n",
7992 Type, RSSI_WiFi_Now, RSSI_BT_Now));
7994 pBtdm8723->psTdmaDuAdjTypeForSCO = Type;
7996 pBtdm8723->psTdmaMonitorCntForSCO++;
7999 void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter)
8001 struct mlme_priv *pmlmepriv;
8002 PHAL_DATA_TYPE pHalData;
8003 PBT_COEXIST_8723A pBtCoex;
8004 PBTDM_8723A_1ANT pBtdm8723;
8008 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntCoexProcessForWifiConnect!!\n"));
8010 pmlmepriv = &padapter->mlmepriv;
8011 pHalData = GET_HAL_DATA(padapter);
8012 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8013 pBtdm8723 = &pBtCoex->btdm1Ant;
8014 BtState = pBtCoex->c2hBtInfo;
8016 RTPRINT(FBT, BT_TRACE, ("[BTCoex], WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
8017 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is %s\n", BtStateString[BtState]));
8019 padapter->pwrctrlpriv.btcoex_rfon = _FALSE;
8021 if ((!BTDM_IsWifiBusy(padapter)) &&(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) != _TRUE)&&
8022 ((BtState == BT_INFO_STATE_NO_CONNECTION) || (BtState == BT_INFO_STATE_CONNECT_IDLE)))
8026 case BT_INFO_STATE_NO_CONNECTION:
8027 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9);
8029 case BT_INFO_STATE_CONNECT_IDLE:
8030 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 0);
8036 #ifdef BTCOEX_DECREASE_WIFI_POWER
8039 val8 = rtw_read8(padapter, 0x883);
8041 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8042 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8044 if (BTDM_IsHT40(padapter) == _TRUE)
8045 val8 |= 0x80; //0x880[31:27] = 10000;
8047 val8 |= 0x60; //0x880[31:27] = 01100;
8051 val8 |= 0xC0; // 0x880[31:27] = 11000;
8053 rtw_write8(padapter, 0x883, val8);
8054 #endif // BTCOEX_DECREASE_WIFI_POWER
8058 case BT_INFO_STATE_NO_CONNECTION:
8059 case BT_INFO_STATE_CONNECT_IDLE:
8061 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 5);
8062 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8063 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
8065 case BT_INFO_STATE_ACL_INQ_OR_PAG:
8066 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is BT_INFO_STATE_ACL_INQ_OR_PAG\n"));
8067 case BT_INFO_STATE_INQ_OR_PAG:
8068 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8069 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30);
8071 case BT_INFO_STATE_SCO_ONLY_BUSY:
8072 case BT_INFO_STATE_ACL_SCO_BUSY:
8073 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
8074 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
8077 #ifdef BTCOEX_CMCC_TEST
8078 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 23);
8079 #else // !BTCOEX_CMCC_TEST
8080 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
8081 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8082 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
8083 #endif // !BTCOEX_CMCC_TEST
8086 case BT_INFO_STATE_ACL_ONLY_BUSY:
8087 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8088 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
8090 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is HID\n"));
8091 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 31);
8093 else if (pBtCoex->c2hBtProfile == BT_INFO_FTP)
8095 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is FTP/OPP\n"));
8096 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 3);
8098 else if (pBtCoex->c2hBtProfile == (BT_INFO_A2DP|BT_INFO_FTP))
8100 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_FTP\n"));
8101 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11);
8105 if (pBtCoex->c2hBtProfile == BT_INFO_A2DP)
8107 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP\n"));
8111 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is UNKNOWN(0x%02X)! Use A2DP Profile\n", pBtCoex->c2hBtProfile));
8113 btdm_1AntTdmaDurationAdjustForACL(padapter);
8119 pBtdm8723->psTdmaGlobalCnt++;
8122 static void btdm_1AntUpdateHalRAMask(PADAPTER padapter, u32 mac_id, u32 filter)
8127 u8 shortGIrate = _FALSE;
8128 int supportRateNum = 0;
8129 struct sta_info *psta;
8130 PHAL_DATA_TYPE pHalData;
8131 struct dm_priv *pdmpriv;
8132 struct mlme_ext_priv *pmlmeext;
8133 struct mlme_ext_info *pmlmeinfo;
8134 WLAN_BSSID_EX *cur_network;
8137 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d, filter=0x%08x!!\n", __FUNCTION__, mac_id, filter));
8139 pHalData = GET_HAL_DATA(padapter);
8140 pdmpriv = &pHalData->dmpriv;
8141 pmlmeext = &padapter->mlmeextpriv;
8142 pmlmeinfo = &pmlmeext->mlmext_info;
8143 cur_network = &pmlmeinfo->network;
8145 if (mac_id >= NUM_STA) //CAM_SIZE
8147 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, MACID=%d illegal!!\n", __FUNCTION__, mac_id));
8151 psta = pmlmeinfo->FW_sta_info[mac_id].psta;
8154 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s, Can't find station!!\n", __FUNCTION__));
8162 case 0:// for infra mode
8163 supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates);
8164 mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
8165 mask |= (pmlmeinfo->HT_enable) ? update_MSC_rate(&(pmlmeinfo->HT_caps)):0;
8166 if (support_short_GI(padapter, &(pmlmeinfo->HT_caps)))
8168 shortGIrate = _TRUE;
8172 case 1://for broadcast/multicast
8173 supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
8174 mask = update_basic_rate(cur_network->SupportedRates, supportRateNum);
8177 default: //for each sta in IBSS
8178 supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
8179 mask = update_supported_rate(cur_network->SupportedRates, supportRateNum);
8182 mask |= ((raid<<28)&0xf0000000);
8185 init_rate = get_highest_rate_idx(mask)&0x3f;
8187 if (pHalData->fw_ractrl == _TRUE)
8191 arg = mac_id&0x1f;//MACID
8193 if (_TRUE == shortGIrate)
8196 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Update FW RAID entry, MASK=0x%08x, arg=0x%02x\n", mask, arg));
8198 rtl8192c_set_raid_cmd(padapter, mask, arg);
8202 if (_TRUE == shortGIrate)
8203 init_rate |= BIT(6);
8205 rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate);
8208 psta->init_rate = init_rate;
8209 pdmpriv->INIDATA_RATE[mac_id] = init_rate;
8212 static void btdm_1AntUpdateHalRAMaskForSCO(PADAPTER padapter, u8 forceUpdate)
8214 PBTDM_8723A_1ANT pBtdm8723;
8215 struct sta_priv *pstapriv;
8216 WLAN_BSSID_EX *cur_network;
8217 struct sta_info *psta;
8222 pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
8224 if ((pBtdm8723->bRAChanged == _TRUE) && (forceUpdate == _FALSE))
8227 pstapriv = &padapter->stapriv;
8228 cur_network = &padapter->mlmeextpriv.mlmext_info.network;
8229 psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
8230 macid = psta->mac_id;
8232 filter |= BIT(_1M_RATE_);
8233 filter |= BIT(_2M_RATE_);
8234 filter |= BIT(_5M_RATE_);
8235 filter |= BIT(_11M_RATE_);
8236 filter |= BIT(_6M_RATE_);
8237 filter |= BIT(_9M_RATE_);
8239 btdm_1AntUpdateHalRAMask(padapter, macid, filter);
8241 pBtdm8723->bRAChanged = _TRUE;
8244 static void btdm_1AntRecoverHalRAMask(PADAPTER padapter)
8246 PBTDM_8723A_1ANT pBtdm8723;
8247 struct sta_priv *pstapriv;
8248 WLAN_BSSID_EX *cur_network;
8249 struct sta_info *psta;
8253 pBtdm8723 = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant;
8255 if (pBtdm8723->bRAChanged == _FALSE)
8258 pstapriv = &padapter->stapriv;
8259 cur_network = &padapter->mlmeextpriv.mlmext_info.network;
8260 psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
8262 Update_RA_Entry(padapter, psta);
8264 pBtdm8723->bRAChanged = _FALSE;
8267 void btdm_1AntBTStateChangeHandler(PADAPTER padapter, BT_STATE_1ANT oldState, BT_STATE_1ANT newState)
8269 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT state change, %s => %s\n", BtStateString[oldState], BtStateString[newState]));
8271 // BT default ignore wlan active,
8272 // WiFi MUST disable this when BT is enable
8273 if (newState > BT_INFO_STATE_DISABLED)
8275 btdm_SetFwIgnoreWlanAct(padapter, _FALSE);
8278 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) &&
8279 (BTDM_IsWifiConnectionExist(padapter) == _TRUE))
8281 if ((newState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8282 (newState == BT_INFO_STATE_ACL_SCO_BUSY))
8284 btdm_1AntUpdateHalRAMaskForSCO(padapter, _FALSE);
8288 // Recover original RA setting
8289 btdm_1AntRecoverHalRAMask(padapter);
8294 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bRAChanged = _FALSE;
8297 if (oldState == newState)
8300 if (oldState == BT_INFO_STATE_ACL_ONLY_BUSY)
8302 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8303 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCnt = 0;
8304 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCntForSCO = 0;
8307 if ((oldState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8308 (oldState == BT_INFO_STATE_ACL_SCO_BUSY))
8310 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8311 pHalData->bt_coexist.halCoex8723.btdm1Ant.psTdmaMonitorCntForSCO = 0;
8314 // Active 2Ant mechanism when BT Connected
8315 if ((oldState == BT_INFO_STATE_DISABLED) ||
8316 (oldState == BT_INFO_STATE_NO_CONNECTION))
8318 if ((newState != BT_INFO_STATE_DISABLED) &&
8319 (newState != BT_INFO_STATE_NO_CONNECTION))
8321 BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_SHRINK);
8322 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
8323 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
8328 if ((newState == BT_INFO_STATE_DISABLED) ||
8329 (newState == BT_INFO_STATE_NO_CONNECTION))
8331 BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_RESUME);
8332 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
8333 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
8338 void btdm_1AntBtCoexistHandler(PADAPTER padapter)
8340 PHAL_DATA_TYPE pHalData;
8341 PBT_COEXIST_8723A pBtCoex8723;
8342 PBTDM_8723A_1ANT pBtdm8723;
8346 pHalData = GET_HAL_DATA(padapter);
8347 pBtCoex8723 = &pHalData->bt_coexist.halCoex8723;
8348 pBtdm8723 = &pBtCoex8723->btdm1Ant;
8349 padapter->pwrctrlpriv.btcoex_rfon = _FALSE;
8350 if (BT_IsBtDisabled(padapter) == _TRUE)
8352 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is disabled\n"));
8354 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
8356 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
8358 if (BTDM_IsWifiBusy(padapter) == _TRUE)
8360 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is busy\n"));
8361 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
8365 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Wifi is idle\n"));
8366 _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 1, _FALSE, 9);
8371 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
8373 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
8378 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is enabled\n"));
8380 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
8382 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is connected\n"));
8384 btdm_1AntWifiParaAdjust(padapter, _TRUE);
8385 btdm_1AntCoexProcessForWifiConnect(padapter);
8389 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is disconnected\n"));
8391 // Antenna switch at BT side(0x870 = 0x300, 0x860 = 0x210) after PSTDMA off
8392 btdm_1AntWifiParaAdjust(padapter, _FALSE);
8393 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 0);
8397 btdm_1AntBTStateChangeHandler(padapter, pBtCoex8723->prec2hBtInfo, pBtCoex8723->c2hBtInfo);
8398 pBtCoex8723->prec2hBtInfo = pBtCoex8723->c2hBtInfo;
8401 void BTDM_1AntSignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
8403 PHAL_DATA_TYPE pHalData;
8404 PBTDM_8723A_1ANT pBtdm8723;
8405 u8 RSSI_WiFi_Cmpnstn, RSSI_BT_Cmpnstn;
8408 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s\n", __FUNCTION__));
8409 pHalData = GET_HAL_DATA(padapter);
8410 pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8411 RSSI_WiFi_Cmpnstn = 0;
8412 RSSI_BT_Cmpnstn = 0;
8414 switch (pBtdm8723->curPsTdma)
8416 case 1: // WiFi 52ms
8417 RSSI_WiFi_Cmpnstn = 11; // 22*0.48
8419 case 2: // WiFi 36ms
8420 RSSI_WiFi_Cmpnstn = 14; // 22*0.64
8422 case 9: // WiFi 20ms
8423 RSSI_WiFi_Cmpnstn = 18; // 22*0.80
8425 case 11: // WiFi 10ms
8426 RSSI_WiFi_Cmpnstn = 20; // 22*0.90
8428 case 4: // WiFi 21ms
8429 RSSI_WiFi_Cmpnstn = 17; // 22*0.79
8431 case 16: // WiFi 24ms
8432 RSSI_WiFi_Cmpnstn = 18; // 22*0.76
8434 case 18: // WiFi 37ms
8435 RSSI_WiFi_Cmpnstn = 14; // 22*0.64
8437 case 23: //Level-1, Antenna switch to BT at all time
8438 case 24: //Level-2, Antenna switch to BT at all time
8439 case 25: //Level-3a, Antenna switch to BT at all time
8440 case 26: //Level-3b, Antenna switch to BT at all time
8441 case 27: //Level-3b, Antenna switch to BT at all time
8442 case 33: //BT SCO & WiFi site survey
8443 RSSI_WiFi_Cmpnstn = 22;
8449 if (rssi_wifi && RSSI_WiFi_Cmpnstn)
8451 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntSgnlCmpnstn, case %d, WiFiCmpnstn=%d(%d => %d)\n",
8452 pBtdm8723->curPsTdma, RSSI_WiFi_Cmpnstn, *rssi_wifi, *rssi_wifi+RSSI_WiFi_Cmpnstn));
8453 *rssi_wifi += RSSI_WiFi_Cmpnstn;
8456 if (rssi_bt && RSSI_BT_Cmpnstn)
8458 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntSgnlCmpnstn, case %d, BTCmpnstn=%d(%d => %d)\n",
8459 pBtdm8723->curPsTdma, RSSI_BT_Cmpnstn, *rssi_bt, *rssi_bt+RSSI_BT_Cmpnstn));
8460 *rssi_bt += RSSI_BT_Cmpnstn;
8465 BTDM_1AntSetWifiRssiThresh(
8470 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8471 PBTDM_8723A_1ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant;
8473 pBtdm8723->wifiRssiThresh = rssiThresh;
8474 DBG_8723A("cosa set rssi thresh = %d\n", pBtdm8723->wifiRssiThresh);
8477 void BTDM_1AntParaInit(PADAPTER padapter)
8479 PHAL_DATA_TYPE pHalData;
8480 PBT_COEXIST_8723A pBtCoex;
8481 PBTDM_8723A_1ANT pBtdm8723;
8484 pHalData = GET_HAL_DATA(padapter);
8485 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8486 pBtdm8723 = &pBtCoex->btdm1Ant;
8488 // Enable counter statistics
8489 rtw_write8(padapter, 0x76e, 0x4);
8490 btdm_1AntPtaParaReload(padapter);
8492 pBtdm8723->wifiRssiThresh = 48;
8494 pBtdm8723->bWiFiHalt = _FALSE;
8495 pBtdm8723->bRAChanged = _FALSE;
8497 if ((pBtCoex->c2hBtInfo != BT_INFO_STATE_DISABLED) &&
8498 (pBtCoex->c2hBtInfo != BT_INFO_STATE_NO_CONNECTION))
8500 BTDM_SetSwRfRxLpfCorner(padapter, BT_RF_RX_LPF_CORNER_SHRINK);
8501 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
8502 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
8506 void BTDM_1AntForHalt(PADAPTER padapter)
8508 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for halt\n"));
8510 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt = _TRUE;
8512 btdm_1AntWifiParaAdjust(padapter, _FALSE);
8514 // don't use btdm_1AntSetPSTDMA() here
8515 // it will call rtw_set_ps_mode() and request pwrpriv->lock.
8516 // This will lead to deadlock, if this function is called in IPS
8518 btdm_1AntPsTdma(padapter, _FALSE, 0);
8520 btdm_SetFwIgnoreWlanAct(padapter, _TRUE);
8523 void BTDM_1AntLpsLeave(PADAPTER padapter)
8525 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for LPS Leave\n"));
8527 // Prevent from entering LPS again
8528 GET_HAL_DATA(padapter)->bt_coexist.halCoex8723.btdm1Ant.bWiFiHalt == _TRUE;
8530 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
8531 // btdm_1AntPsTdma(padapter, _FALSE, 8);
8534 void BTDM_1AntWifiAssociateNotify(PADAPTER padapter, u8 type)
8536 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8539 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for associate, type=%d\n", type));
8543 rtl8723a_CheckAntenna_Selection(padapter);
8544 if (BT_IsBtDisabled(padapter) == _TRUE)
8546 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
8550 PBT_COEXIST_8723A pBtCoex;
8553 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8554 BtState = pBtCoex->c2hBtInfo;
8556 btdm_1AntTSFSwitch(padapter, _TRUE);
8558 if ((BtState == BT_INFO_STATE_NO_CONNECTION) ||
8559 (BtState == BT_INFO_STATE_CONNECT_IDLE))
8561 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
8563 else if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8564 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8566 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8);
8567 rtw_write32(padapter, 0x6c0, 0x5a5a5a5a);
8568 rtw_write32(padapter, 0x6c4, 0x5a5a5a5a);
8570 else if ((BtState == BT_INFO_STATE_ACL_ONLY_BUSY) ||
8571 (BtState == BT_INFO_STATE_ACL_INQ_OR_PAG))
8573 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
8574 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 35);
8576 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 29);
8582 if (BT_IsBtDisabled(padapter) == _FALSE)
8584 if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
8586 btdm_1AntPsTdma(padapter, _FALSE, 0);
8587 btdm_1AntTSFSwitch(padapter, _FALSE);
8591 btdm_1AntBtCoexistHandler(padapter);
8595 void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
8597 PBT_COEXIST_8723A pBtCoex;
8600 pBtCoex = &GET_HAL_DATA(padapter)->bt_coexist.halCoex8723;
8602 RTPRINT(FBT, BT_TRACE, ("\n\n[BTCoex]******************************\n"));
8603 RTPRINT(FBT, BT_TRACE, ("[BTCoex], MediaStatus, WiFi %s !!\n",
8604 mstatus==RT_MEDIA_CONNECT?"CONNECT":"DISCONNECT"));
8605 RTPRINT(FBT, BT_TRACE, ("[BTCoex]******************************\n"));
8607 if (RT_MEDIA_CONNECT == mstatus)
8609 if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
8611 if ((pBtCoex->c2hBtInfo == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8612 (pBtCoex->c2hBtInfo == BT_INFO_STATE_ACL_SCO_BUSY))
8614 btdm_1AntUpdateHalRAMaskForSCO(padapter, _TRUE);
8618 padapter->pwrctrlpriv.DelayLPSLastTimeStamp = rtw_get_current_time();
8619 BTDM_1AntForDhcp(padapter);
8623 //DBG_8723A("%s rtl8723a_DeinitAntenna_Selection\n",__func__);
8624 rtl8723a_DeinitAntenna_Selection(padapter);
8625 btdm_1AntBtCoexistHandler(padapter);
8626 pBtCoex->btdm1Ant.bRAChanged = _FALSE;
8630 void BTDM_1AntForDhcp(PADAPTER padapter)
8632 PHAL_DATA_TYPE pHalData;
8635 PBT_COEXIST_8723A pBtCoex;
8636 PBTDM_8723A_1ANT pBtdm8723;
8639 pHalData = GET_HAL_DATA(padapter);
8640 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8641 BtState = pBtCoex->c2hBtInfo;
8642 pBtdm8723 = &pBtCoex->btdm1Ant;
8644 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for DHCP\n"));
8645 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
8646 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, %s\n", BtStateString[BtState]));
8650 BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
8654 // rtl8723a_set_lowpwr_lps_cmd(padapter, _FALSE);
8656 if (BT_IsBtDisabled(padapter) == _TRUE)
8658 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for DHCP, BT is disabled\n"));
8659 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
8663 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8664 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8666 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
8667 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
8669 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 27);
8671 else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
8673 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8674 if(padapter->securitypriv.ndisencryptstatus != Ndis802_11EncryptionDisabled)
8676 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 18);
8677 RTPRINT(FBT, BT_TRACE,
8678 ("[BTCoex], 1Ant for DHCP, Encrypted AP, set TDMA(%s, %d)\n",
8679 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
8683 switch (pBtdm8723->curPsTdma)
8687 RTPRINT(FBT, BT_TRACE,
8688 ("[BTCoex], 1Ant for DHCP, Keep TDMA(%s, %d)\n",
8689 pBtdm8723->bCurPsTdmaOn?"ON":"OFF", pBtdm8723->curPsTdma));
8692 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 16);
8699 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 28);
8705 void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType)
8707 PHAL_DATA_TYPE pHalData;
8710 PBT_COEXIST_8723A pBtCoex;
8711 PBTDM_8723A_1ANT pBtdm8723;
8714 pHalData = GET_HAL_DATA(padapter);
8715 BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
8716 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8717 pBtdm8723 = &pBtCoex->btdm1Ant;
8719 RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for wifi scan=%d!!\n", scanType));
8720 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for wifi scan, WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE"));
8721 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1Ant for wifi scan, %s\n", BtStateString[BtState]));
8725 rtl8723a_CheckAntenna_Selection(padapter);
8726 if (BT_IsBtDisabled(padapter) == _TRUE)
8728 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 9);
8730 else if (BTDM_IsWifiConnectionExist(padapter) == _FALSE)
8732 BTDM_1AntWifiAssociateNotify(padapter, _TRUE);
8736 if ((BtState == BT_INFO_STATE_SCO_ONLY_BUSY) ||
8737 (BtState == BT_INFO_STATE_ACL_SCO_BUSY))
8739 if (_TRUE == pBtCoex->bC2hBtInquiryPage)
8740 btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32);
8743 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8744 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 33);
8747 else if (_TRUE == pBtCoex->bC2hBtInquiryPage)
8749 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8750 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30);
8752 else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY)
8754 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8755 if (pBtCoex->c2hBtProfile == BT_INFO_HID)
8756 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 34);
8758 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 4);
8762 padapter->pwrctrlpriv.btcoex_rfon = _TRUE;
8763 btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 5);
8767 btdm_NotifyFwScan(padapter, 1);
8769 else // WiFi_Finish_Scan
8771 btdm_NotifyFwScan(padapter, 0);
8772 btdm_1AntBtCoexistHandler(padapter);
8776 void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter)
8778 PHAL_DATA_TYPE pHalData;
8781 PBT_COEXIST_8723A pBtCoex;
8785 pHalData = GET_HAL_DATA(padapter);
8786 pBTInfo = GET_BT_INFO(padapter);
8787 pBtMgnt = &pBTInfo->BtMgnt;
8788 pBtCoex = &pHalData->bt_coexist.halCoex8723;
8790 u1tmp = pBtCoex->c2hBtInfoOriginal;
8791 // sco BUSY bit is not used on voice over PCM platform
8792 btState = u1tmp & 0xF;
8793 pBtCoex->c2hBtProfile = u1tmp & 0xE0;
8795 // default set bt to idle state.
8796 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
8797 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
8799 // check BIT2 first ==> check if bt is under inquiry or page scan
8800 if (btState & BIT(2))
8802 pBtCoex->bC2hBtInquiryPage = _TRUE;
8806 pBtCoex->bC2hBtInquiryPage = _FALSE;
8810 if (!(btState & BIT(0)))
8812 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
8818 pBtCoex->c2hBtInfo = BT_INFO_STATE_CONNECT_IDLE;
8820 else if (btState == 0x9)
8822 if(pBtCoex->bC2hBtInquiryPage == _TRUE)
8823 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_INQ_OR_PAG;
8825 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_ONLY_BUSY;
8826 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
8828 else if (btState == 0x3)
8830 pBtCoex->c2hBtInfo = BT_INFO_STATE_SCO_ONLY_BUSY;
8831 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
8833 else if (btState == 0xb)
8835 pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_SCO_BUSY;
8836 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
8840 pBtCoex->c2hBtInfo = BT_INFO_STATE_MAX;
8842 if (_TRUE == pBtMgnt->ExtConfig.bBTBusy)
8843 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
8846 if ((BT_INFO_STATE_NO_CONNECTION == pBtCoex->c2hBtInfo) ||
8847 (BT_INFO_STATE_CONNECT_IDLE == pBtCoex->c2hBtInfo))
8849 if (pBtCoex->bC2hBtInquiryPage)
8850 pBtCoex->c2hBtInfo = BT_INFO_STATE_INQ_OR_PAG;
8853 RTPRINT(FBT, BT_TRACE, ("[BTC2H], %s(%d)\n",
8854 BtStateString[pBtCoex->c2hBtInfo], pBtCoex->c2hBtInfo));
8856 if(pBtCoex->c2hBtProfile != BT_INFO_HID)
8857 pBtCoex->c2hBtProfile &= ~BT_INFO_HID;
8860 void BTDM_1AntBtCoexist8723A(PADAPTER padapter)
8862 struct mlme_priv *pmlmepriv;
8863 PHAL_DATA_TYPE pHalData;
8864 u32 curr_time, delta_time;
8867 pmlmepriv = &padapter->mlmepriv;
8868 pHalData = GET_HAL_DATA(padapter);
8870 if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _TRUE)
8872 // already done in BTDM_1AntForScan()
8873 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under scan progress!!\n"));
8877 if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE)
8879 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under link progress!!\n"));
8883 // under DHCP(Special packet)
8884 curr_time = rtw_get_current_time();
8885 delta_time = curr_time - padapter->pwrctrlpriv.DelayLPSLastTimeStamp;
8886 delta_time = rtw_systime_to_ms(delta_time);
8887 if (delta_time < 500) // 500ms
8889 RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under DHCP progress(%d ms)!!\n", delta_time));
8893 BTDM_CheckWiFiState(padapter);
8895 btdm_1AntBtCoexistHandler(padapter);
8898 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87231Ant.c =====
8901 #ifdef __HALBTC87232ANT_C__ // HAL/BTCoexist/HalBtc87232Ant.c
8902 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
8904 //============================================================
8905 // local function proto type if needed
8906 //============================================================
8907 //============================================================
8908 // local function start with btdm_
8909 //============================================================
8910 u8 btdm_ActionAlgorithm(PADAPTER padapter)
8912 PBT30Info pBTInfo = GET_BT_INFO(padapter);
8913 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
8914 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
8915 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
8916 u8 bScoExist=_FALSE, bBtLinkExist=_FALSE, bBtHsModeExist=_FALSE;
8917 u8 algorithm=BT_2ANT_COEX_ALGO_UNDEFINED;
8919 if(pBtMgnt->ExtConfig.NumberOfHandle)
8921 bBtLinkExist = _TRUE;
8923 if(pBtMgnt->ExtConfig.NumberOfSCO)
8927 if(BT_HsConnectionEstablished(padapter))
8929 bBtHsModeExist = _TRUE;
8932 //======================
8933 // here we get BT status first
8934 //======================
8936 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
8938 if( (bScoExist) ||(bBtHsModeExist) ||
8939 (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID)))
8941 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO or HID or HS exists, set BT non-idle !!!\n"));
8942 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
8947 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
8948 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) )
8950 if(BTDM_BtTxRxCounterL(padapter) < 100)
8952 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP, low priority tx+rx < 100, set BT connected-idle!!!\n"));
8953 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
8957 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP, low priority tx+rx >= 100, set BT non-idle!!!\n"));
8958 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
8962 if( (pBtMgnt->ExtConfig.NumberOfHandle == 1) &&
8963 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
8965 if(BTDM_BtTxRxCounterL(padapter) < 600)
8967 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, low priority tx+rx < 600, set BT connected-idle!!!\n"));
8968 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
8972 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
8974 if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
8976 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, low priority rx/tx > 9, set BT connected-idle!!!\n"));
8977 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
8981 if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
8983 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN, set BT non-idle!!!\n"));
8984 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
8988 if( (pBtMgnt->ExtConfig.NumberOfHandle == 2) &&
8989 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP)) &&
8990 (BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN)) )
8992 if(BTDM_BtTxRxCounterL(padapter) < 600)
8994 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, low priority tx+rx < 600, set BT connected-idle!!!\n"));
8995 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
8999 if(pHalData->bt_coexist.halCoex8723.lowPriorityTx)
9001 if((pHalData->bt_coexist.halCoex8723.lowPriorityRx /pHalData->bt_coexist.halCoex8723.lowPriorityTx)>9 )
9003 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, low priority rx/tx > 9, set BT connected-idle!!!\n"));
9004 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_CONNECTED_IDLE;
9008 if(BT_2ANT_BT_STATUS_CONNECTED_IDLE != pBtdm8723->btStatus)
9010 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN+A2DP, set BT non-idle!!!\n"));
9011 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_NON_IDLE;
9015 if(BT_2ANT_BT_STATUS_IDLE != pBtdm8723->btStatus)
9017 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
9021 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
9023 //======================
9027 RTPRINT(FBT, BT_TRACE, ("[BTCoex], No profile exists!!!\n"));
9031 if(pBtMgnt->ExtConfig.NumberOfHandle == 1)
9035 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
9036 algorithm = BT_2ANT_COEX_ALGO_SCO;
9040 if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID))
9042 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID only\n"));
9043 algorithm = BT_2ANT_COEX_ALGO_HID;
9045 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9047 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP only\n"));
9048 algorithm = BT_2ANT_COEX_ALGO_A2DP;
9050 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9054 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(HS) only\n"));
9055 algorithm = BT_2ANT_COEX_ALGO_PANHS;
9059 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR) only\n"));
9060 algorithm = BT_2ANT_COEX_ALGO_PANEDR;
9065 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d \n",
9066 pBtMgnt->ExtConfig.NumberOfHandle));
9070 else if(pBtMgnt->ExtConfig.NumberOfHandle == 2)
9074 if(BTHCI_CheckProfileExist(padapter, BT_PROFILE_HID))
9076 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
9077 algorithm = BT_2ANT_COEX_ALGO_HID;
9079 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
9081 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
9083 else if(BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
9087 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
9088 algorithm = BT_2ANT_COEX_ALGO_SCO;
9092 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
9093 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9098 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched ACL profile for NumberOfHandle=%d\n",
9099 pBtMgnt->ExtConfig.NumberOfHandle));
9104 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9105 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9107 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
9108 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9110 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9111 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9115 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
9116 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9120 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
9121 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9124 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9125 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9129 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
9130 algorithm = BT_2ANT_COEX_ALGO_A2DP;
9134 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
9135 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
9140 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
9141 pBtMgnt->ExtConfig.NumberOfHandle));
9145 else if(pBtMgnt->ExtConfig.NumberOfHandle == 3)
9149 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9150 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9152 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP\n"));
9154 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9155 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) )
9159 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));
9160 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
9164 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));
9165 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
9168 else if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9169 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9173 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(HS)\n"));
9174 algorithm = BT_2ANT_COEX_ALGO_SCO;
9178 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP + PAN(EDR)\n"));
9184 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
9185 pBtMgnt->ExtConfig.NumberOfHandle));
9190 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9191 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9192 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9196 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
9197 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANHS;
9201 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
9202 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
9207 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
9208 pBtMgnt->ExtConfig.NumberOfHandle));
9212 else if(pBtMgnt->ExtConfig.NumberOfHandle >= 3)
9216 if( BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) &&
9217 BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) &&
9218 BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) )
9222 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
9227 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(EDR)\n"));
9233 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO exists but why NO matched profile for NumberOfHandle=%d\n",
9234 pBtMgnt->ExtConfig.NumberOfHandle));
9239 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! NO matched profile for NumberOfHandle=%d\n",
9240 pBtMgnt->ExtConfig.NumberOfHandle));
9247 u8 btdm_NeedToDecBtPwr(PADAPTER padapter)
9249 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9250 PADAPTER pDefaultAdapter = GetDefaultAdapter(padapter);
9253 if(BT_Operation(padapter)) {
9254 if(pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB > 47) {
9255 RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for HS mode!!\n"));
9258 RTPRINT(FBT, BT_TRACE, ("NO Need to decrease bt power for HS mode!!\n"));
9261 if(BTDM_IsWifiConnectionExist(padapter)) {
9262 RTPRINT(FBT, BT_TRACE, ("Need to decrease bt power for Wifi is connected!!\n"));
9270 u8 btdm_IsBadIsolation(PADAPTER padapter)
9283 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c0=0x%x\n", val0x6c0));
9284 rtw_write32(padapter, 0x6c0, val0x6c0);
9286 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c8=0x%x\n", val0x6c8));
9287 rtw_write32(padapter, 0x6c8, val0x6c8);
9289 RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6cc=0x%x\n", val0x6cc));
9290 rtw_write8(padapter, 0x6cc, val0x6cc);
9294 void btdm_SetSwFullTimeDacSwing(PADAPTER padapter,u8 bSwDacSwingOn,u32 swDacSwingLvl)
9296 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9300 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing = 0x%x\n", swDacSwingLvl));
9301 PHY_SetBBReg(padapter, 0x880, 0xff000000, swDacSwingLvl);
9302 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
9306 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SwDacSwing Off!\n"));
9307 PHY_SetBBReg(padapter, 0x880, 0xff000000, 0xc0);
9312 void btdm_SetFwDacSwingLevel(PADAPTER padapter, u8 dacSwingLvl)
9314 u1Byte H2C_Parameter[1] ={0};
9316 H2C_Parameter[0] = dacSwingLvl;
9318 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl));
9319 RTPRINT(FBT, BT_TRACE, ("[BTCoex], write 0x29=0x%x\n", H2C_Parameter[0]));
9321 FillH2CCmd(padapter, 0x29, 1, H2C_Parameter);
9324 void btdm_2AntDecBtPwr(PADAPTER padapter,u8 bDecBtPwr)
9326 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9327 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9329 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Dec BT power = %s\n", ((bDecBtPwr)? "ON":"OFF")));
9330 pBtdm8723->bCurDecBtPwr = bDecBtPwr;
9332 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
9333 // pBtdm8723->bPreDecBtPwr, pBtdm8723->bCurDecBtPwr));
9335 if(pBtdm8723->bPreDecBtPwr == pBtdm8723->bCurDecBtPwr)
9338 BTDM_SetFwDecBtPwr(padapter, pBtdm8723->bCurDecBtPwr);
9340 pBtdm8723->bPreDecBtPwr = pBtdm8723->bCurDecBtPwr;
9343 void btdm_2AntFwDacSwingLvl(PADAPTER padapter,u8 fwDacSwingLvl)
9345 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9346 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9348 RTPRINT(FBT, BT_TRACE, ("[BTCoex], set FW Dac Swing level = %d\n", fwDacSwingLvl));
9349 pBtdm8723->curFwDacSwingLvl = fwDacSwingLvl;
9351 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
9352 // pBtdm8723->preFwDacSwingLvl, pBtdm8723->curFwDacSwingLvl));
9354 if(pBtdm8723->preFwDacSwingLvl == pBtdm8723->curFwDacSwingLvl)
9357 btdm_SetFwDacSwingLevel(padapter, pBtdm8723->curFwDacSwingLvl);
9359 pBtdm8723->preFwDacSwingLvl = pBtdm8723->curFwDacSwingLvl;
9362 void btdm_2AntRfShrink( PADAPTER padapter, u8 bRxRfShrinkOn)
9364 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9365 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9367 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Rx RF Shrink = %s\n", ((bRxRfShrinkOn)? "ON":"OFF")));
9368 pBtdm8723->bCurRfRxLpfShrink = bRxRfShrinkOn;
9370 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n",
9371 // pBtdm8723->bPreRfRxLpfShrink, pBtdm8723->bCurRfRxLpfShrink));
9373 if(pBtdm8723->bPreRfRxLpfShrink == pBtdm8723->bCurRfRxLpfShrink)
9376 BTDM_SetSwRfRxLpfCorner(padapter, (u8)pBtdm8723->bCurRfRxLpfShrink);
9378 pBtdm8723->bPreRfRxLpfShrink = pBtdm8723->bCurRfRxLpfShrink;
9381 void btdm_2AntLowPenaltyRa(PADAPTER padapter, u8 bLowPenaltyRa)
9383 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9384 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9386 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn LowPenaltyRA = %s\n", ((bLowPenaltyRa)? "ON":"OFF")));
9387 pBtdm8723->bCurLowPenaltyRa = bLowPenaltyRa;
9389 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
9390 // pBtdm8723->bPreLowPenaltyRa, pBtdm8723->bCurLowPenaltyRa));
9392 if(pBtdm8723->bPreLowPenaltyRa == pBtdm8723->bCurLowPenaltyRa)
9395 BTDM_SetSwPenaltyTxRateAdaptive(padapter, (u1Byte)pBtdm8723->bCurLowPenaltyRa);
9397 pBtdm8723->bPreLowPenaltyRa = pBtdm8723->bCurLowPenaltyRa;
9402 void btdm_2AntDacSwing(PADAPTER padapter,u8 bDacSwingOn,u32 dacSwingLvl )
9404 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9405 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9407 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn DacSwing=%s, dacSwingLvl=0x%x\n",
9408 ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl));
9409 pBtdm8723->bCurDacSwingOn = bDacSwingOn;
9410 pBtdm8723->curDacSwingLvl = dacSwingLvl;
9412 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
9413 // pBtdm8723->bPreDacSwingOn, pBtdm8723->preDacSwingLvl,
9414 // pBtdm8723->bCurDacSwingOn, pBtdm8723->curDacSwingLvl));
9416 if( (pBtdm8723->bPreDacSwingOn == pBtdm8723->bCurDacSwingOn) &&
9417 (pBtdm8723->preDacSwingLvl == pBtdm8723->curDacSwingLvl) )
9421 btdm_SetSwFullTimeDacSwing(padapter, bDacSwingOn, dacSwingLvl);
9423 pBtdm8723->bPreDacSwingOn = pBtdm8723->bCurDacSwingOn;
9424 pBtdm8723->preDacSwingLvl = pBtdm8723->curDacSwingLvl;
9428 void btdm_2AntAdcBackOff(PADAPTER padapter,u8 bAdcBackOff)
9430 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9431 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9433 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn AdcBackOff = %s\n", ((bAdcBackOff)? "ON":"OFF")));
9434 pBtdm8723->bCurAdcBackOff = bAdcBackOff;
9436 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
9437 // pBtdm8723->bPreAdcBackOff, pBtdm8723->bCurAdcBackOff));
9439 if(pBtdm8723->bPreAdcBackOff == pBtdm8723->bCurAdcBackOff)
9442 BTDM_BBBackOffLevel(padapter, (u8)pBtdm8723->bCurAdcBackOff);
9444 pBtdm8723->bPreAdcBackOff = pBtdm8723->bCurAdcBackOff;
9447 void btdm_2AntAgcTable(PADAPTER padapter,u8 bAgcTableEn)
9449 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9450 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9452 RTPRINT(FBT, BT_TRACE, ("[BTCoex], %s Agc Table\n", ((bAgcTableEn)? "Enable":"Disable")));
9453 pBtdm8723->bCurAgcTableEn = bAgcTableEn;
9455 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
9456 // pBtdm8723->bPreAgcTableEn, pBtdm8723->bCurAgcTableEn));
9458 if(pBtdm8723->bPreAgcTableEn == pBtdm8723->bCurAgcTableEn)
9461 BTDM_AGCTable(padapter, (u8)bAgcTableEn);
9463 pBtdm8723->bPreAgcTableEn = pBtdm8723->bCurAgcTableEn;
9466 void btdm_2AntCoexTable( PADAPTER padapter,u32 val0x6c0,u32 val0x6c8,u8 val0x6cc)
9468 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9469 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9471 RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
9472 val0x6c0, val0x6c8, val0x6cc));
9473 pBtdm8723->curVal0x6c0 = val0x6c0;
9474 pBtdm8723->curVal0x6c8 = val0x6c8;
9475 pBtdm8723->curVal0x6cc = val0x6cc;
9477 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
9478 // pBtdm8723->preVal0x6c0, pBtdm8723->preVal0x6c8, pBtdm8723->preVal0x6cc));
9479 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
9480 // pBtdm8723->curVal0x6c0, pBtdm8723->curVal0x6c8, pBtdm8723->curVal0x6cc));
9482 if( (pBtdm8723->preVal0x6c0 == pBtdm8723->curVal0x6c0) &&
9483 (pBtdm8723->preVal0x6c8 == pBtdm8723->curVal0x6c8) &&
9484 (pBtdm8723->preVal0x6cc == pBtdm8723->curVal0x6cc) )
9487 btdm_SetCoexTable(padapter, val0x6c0, val0x6c8, val0x6cc);
9489 pBtdm8723->preVal0x6c0 = pBtdm8723->curVal0x6c0;
9490 pBtdm8723->preVal0x6c8 = pBtdm8723->curVal0x6c8;
9491 pBtdm8723->preVal0x6cc = pBtdm8723->curVal0x6cc;
9494 void btdm_2AntIgnoreWlanAct(PADAPTER padapter,u8 bEnable)
9496 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9497 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9499 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn Ignore WlanAct %s\n", (bEnable? "ON":"OFF")));
9500 pBtdm8723->bCurIgnoreWlanAct = bEnable;
9502 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
9503 // pBtdm8723->bPreIgnoreWlanAct, pBtdm8723->bCurIgnoreWlanAct));
9505 if(pBtdm8723->bPreIgnoreWlanAct == pBtdm8723->bCurIgnoreWlanAct)
9508 btdm_SetFwIgnoreWlanAct(padapter,bEnable);
9509 pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct;
9512 void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)
9514 u8 H2C_Parameter[5] ={0};
9516 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9518 // byte1[1:0] != 0 means enable pstdma
9519 // for 2Ant bt coexist, if byte1 != 0 means enable pstdma
9522 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
9524 H2C_Parameter[0] = byte1;
9525 H2C_Parameter[1] = byte2;
9526 H2C_Parameter[2] = byte3;
9527 H2C_Parameter[3] = byte4;
9528 H2C_Parameter[4] = byte5;
9530 pHalData->bt_coexist.fw3aVal[0] = byte1;
9531 pHalData->bt_coexist.fw3aVal[1] = byte2;
9532 pHalData->bt_coexist.fw3aVal[2] = byte3;
9533 pHalData->bt_coexist.fw3aVal[3] = byte4;
9534 pHalData->bt_coexist.fw3aVal[4] = byte5;
9536 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\n",
9538 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
9540 FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
9543 void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type)
9545 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9546 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9548 u8 bTurnOnByCnt=_FALSE;
9549 u8 psTdmaTypeByCnt=0;
9551 btTxRxCnt = BTDM_BtTxRxCounterH(padapter)+BTDM_BtTxRxCounterL(padapter);
9552 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT TxRx Counters = %d\n", btTxRxCnt));
9553 if(btTxRxCnt > 3000)
9555 bTurnOnByCnt = _TRUE;
9556 psTdmaTypeByCnt = 8;
9558 RTPRINT(FBT, BT_TRACE, ("[BTCoex], For BTTxRxCounters, turn %s PS TDMA, type=%d\n", (bTurnOnByCnt? "ON":"OFF"), psTdmaTypeByCnt));
9559 pBtdm8723->bCurPsTdmaOn = bTurnOnByCnt;
9560 pBtdm8723->curPsTdma = psTdmaTypeByCnt;
9564 RTPRINT(FBT, BT_TRACE, ("[BTCoex], turn %s PS TDMA, type=%d\n", (bTurnOn? "ON":"OFF"), type));
9565 pBtdm8723->bCurPsTdmaOn = bTurnOn;
9566 pBtdm8723->curPsTdma = type;
9569 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
9570 // pBtdm8723->bPrePsTdmaOn, pBtdm8723->bCurPsTdmaOn));
9571 //RTPRINT(FBT, BT_TRACE, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
9572 // pBtdm8723->prePsTdma, pBtdm8723->curPsTdma));
9574 if( (pBtdm8723->bPrePsTdmaOn == pBtdm8723->bCurPsTdmaOn) &&
9575 (pBtdm8723->prePsTdma == pBtdm8723->curPsTdma) )
9584 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
9587 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
9590 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
9593 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xa1, 0x80);
9596 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
9599 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
9602 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
9605 btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x20, 0x80);
9608 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98);
9611 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98);
9614 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98);
9617 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
9620 btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98);
9623 btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98);
9626 btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98);
9629 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x20, 0x98);
9632 btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x20, 0x80);
9635 btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98);
9638 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xa1, 0x98);
9641 btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x20, 0x98);
9651 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
9654 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x0, 0x0);
9657 btdm_2AntSetFw3a(padapter, 0x0, 0x0, 0x0, 0x8, 0x0);
9663 pBtdm8723->bPrePsTdmaOn = pBtdm8723->bCurPsTdmaOn;
9664 pBtdm8723->prePsTdma = pBtdm8723->curPsTdma;
9669 void btdm_2AntBtInquiryPage(PADAPTER padapter)
9671 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9672 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9673 btdm_2AntPsTdma(padapter, _TRUE, 8);
9677 u8 btdm_HoldForBtInqPage( PADAPTER padapter)
9679 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9680 u32 curTime=rtw_get_current_time();
9682 if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage)
9684 // bt inquiry or page is started.
9685 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime == 0)
9687 pHalData->bt_coexist.halCoex8723.btInqPageStartTime = curTime;
9688 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page is started at time : 0x%"i64fmt"x \n",
9689 pHalData->bt_coexist.halCoex8723.btInqPageStartTime));
9692 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page started time : 0x%"i64fmt"x, curTime : 0x%x \n",
9693 pHalData->bt_coexist.halCoex8723.btInqPageStartTime, curTime));
9695 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
9697 if(( (curTime - pHalData->bt_coexist.halCoex8723.btInqPageStartTime)/1000000) >= 10)
9699 RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT Inquiry/page >= 10sec!!!"));
9700 pHalData->bt_coexist.halCoex8723.btInqPageStartTime = 0;
9704 if(pHalData->bt_coexist.halCoex8723.btInqPageStartTime)
9706 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9707 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9708 btdm_2AntPsTdma(padapter, _TRUE, 8);
9716 u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter)
9718 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9719 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9722 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));
9725 // if(!BTDM_IsWifiBusy(padapter) &&
9726 if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
9727 (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) )
9729 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt idle!!\n"));
9731 btdm_2AntLowPenaltyRa(padapter, _FALSE);
9732 btdm_2AntRfShrink(padapter, _FALSE);
9733 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9735 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9736 btdm_2AntPsTdma(padapter, _FALSE, 0);
9737 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9738 btdm_2AntDecBtPwr(padapter, _FALSE);
9740 btdm_2AntAgcTable(padapter, _FALSE);
9741 btdm_2AntAdcBackOff(padapter, _FALSE);
9742 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
9746 // else if( BTDM_IsWifiBusy(padapter) &&
9747 else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&&
9748 (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) )
9750 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT idle!!\n"));
9752 btdm_2AntLowPenaltyRa(padapter, _TRUE);
9753 btdm_2AntRfShrink(padapter, _FALSE);
9754 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9756 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9757 btdm_2AntPsTdma(padapter, _FALSE, 0);
9758 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9759 btdm_2AntDecBtPwr(padapter, _TRUE);
9761 btdm_2AntAgcTable(padapter, _FALSE);
9762 btdm_2AntAdcBackOff(padapter, _FALSE);
9763 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
9767 // else if(!BTDM_IsWifiBusy(padapter) &&
9768 else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
9769 (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) )
9771 RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt connected idle!!\n"));
9773 btdm_2AntLowPenaltyRa(padapter, _TRUE);
9774 btdm_2AntRfShrink(padapter, _TRUE);
9775 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9777 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9778 btdm_2AntPsTdma(padapter, _FALSE, 0);
9779 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9780 btdm_2AntDecBtPwr(padapter, _FALSE);
9782 btdm_2AntAgcTable(padapter, _FALSE);
9783 btdm_2AntAdcBackOff(padapter, _FALSE);
9784 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
9788 // else if(BTDM_IsWifiBusy(padapter) &&
9789 else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&&
9790 (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) )
9792 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + Bt connected idle!!\n"));
9794 btdm_2AntLowPenaltyRa(padapter, _TRUE);
9795 btdm_2AntRfShrink(padapter, _TRUE);
9796 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9798 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9799 btdm_2AntPsTdma(padapter, _FALSE, 0);
9800 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9801 btdm_2AntDecBtPwr(padapter, _TRUE);
9803 btdm_2AntAgcTable(padapter, _FALSE);
9804 btdm_2AntAdcBackOff(padapter, _FALSE);
9805 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
9809 // else if(!BTDM_IsWifiBusy(padapter) &&
9810 else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&&
9811 (BT_2ANT_BT_STATUS_NON_IDLE == pBtdm8723->btStatus) )
9813 RTPRINT(FBT, BT_TRACE, ("Wifi idle + BT non-idle!!\n"));
9815 btdm_2AntLowPenaltyRa(padapter, _TRUE);
9816 btdm_2AntRfShrink(padapter, _TRUE);
9817 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9819 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9820 btdm_2AntPsTdma(padapter, _FALSE, 0);
9821 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9822 btdm_2AntDecBtPwr(padapter, _FALSE);
9824 btdm_2AntAgcTable(padapter, _FALSE);
9825 btdm_2AntAdcBackOff(padapter, _FALSE);
9826 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
9832 RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT non-idle!!\n"));
9833 btdm_2AntLowPenaltyRa(padapter, _TRUE);
9834 btdm_2AntRfShrink(padapter, _TRUE);
9835 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
9836 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
9837 btdm_2AntFwDacSwingLvl(padapter, 0x20);
9846 void btdm_2AntTdmaDurationAdjust(PADAPTER padapter,u8 bScoHid,u8 bTxPause,u8 maxInterval)
9848 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
9849 PBT_MGNT pBtMgnt = &pHalData->BtInfo.BtMgnt;
9850 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
9851 static s32 up,dn,m,n,WaitCount;
9852 s32 result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration
9856 // BtState = pHalData->bt_coexist.halCoex8723.c2hBtInfo;
9858 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TdmaDurationAdjust()\n"));
9860 if(pBtdm8723->bResetTdmaAdjust)
9862 pBtdm8723->bResetTdmaAdjust = _FALSE;
9863 RTPRINT(FBT, BT_TRACE, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
9869 if(maxInterval == 1)
9871 btdm_2AntPsTdma(padapter, _TRUE, 15);
9872 pBtdm8723->psTdmaDuAdjType = 15;
9874 else if(maxInterval == 2)
9876 btdm_2AntPsTdma(padapter, _TRUE, 15);
9877 pBtdm8723->psTdmaDuAdjType = 15;
9879 else if(maxInterval == 3)
9881 btdm_2AntPsTdma(padapter, _TRUE, 15);
9882 pBtdm8723->psTdmaDuAdjType = 15;
9886 btdm_2AntPsTdma(padapter, _TRUE, 15);
9887 pBtdm8723->psTdmaDuAdjType = 15;
9892 if(maxInterval == 1)
9894 btdm_2AntPsTdma(padapter, _TRUE, 11);
9895 pBtdm8723->psTdmaDuAdjType = 11;
9897 else if(maxInterval == 2)
9899 btdm_2AntPsTdma(padapter, _TRUE, 11);
9900 pBtdm8723->psTdmaDuAdjType = 11;
9902 else if(maxInterval == 3)
9904 btdm_2AntPsTdma(padapter, _TRUE, 11);
9905 pBtdm8723->psTdmaDuAdjType = 11;
9909 btdm_2AntPsTdma(padapter, _TRUE, 11);
9910 pBtdm8723->psTdmaDuAdjType = 11;
9918 if(maxInterval == 1)
9920 btdm_2AntPsTdma(padapter, _TRUE, 7);
9921 pBtdm8723->psTdmaDuAdjType = 7;
9923 else if(maxInterval == 2)
9925 btdm_2AntPsTdma(padapter, _TRUE, 7);
9926 pBtdm8723->psTdmaDuAdjType = 7;
9928 else if(maxInterval == 3)
9930 btdm_2AntPsTdma(padapter, _TRUE, 7);
9931 pBtdm8723->psTdmaDuAdjType = 7;
9935 btdm_2AntPsTdma(padapter, _TRUE, 7);
9936 pBtdm8723->psTdmaDuAdjType = 7;
9941 if(maxInterval == 1)
9943 btdm_2AntPsTdma(padapter, _TRUE, 3);
9944 pBtdm8723->psTdmaDuAdjType = 3;
9946 else if(maxInterval == 2)
9948 btdm_2AntPsTdma(padapter, _TRUE, 3);
9949 pBtdm8723->psTdmaDuAdjType = 3;
9951 else if(maxInterval == 3)
9953 btdm_2AntPsTdma(padapter, _TRUE, 3);
9954 pBtdm8723->psTdmaDuAdjType = 3;
9958 btdm_2AntPsTdma(padapter, _TRUE, 3);
9959 pBtdm8723->psTdmaDuAdjType = 3;
9974 //accquire the BT TRx retry count from BT_Info byte2
9975 retryCount = pHalData->bt_coexist.halCoex8723.btRetryCnt;
9976 RTPRINT(FBT, BT_TRACE, ("[BTCoex], retryCount = %d\n", retryCount));
9980 if(retryCount == 0) // no retry in the last 2-second duration
9988 if(up >= n) // if ³sÄò n Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration
9995 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Increase wifi duration!!\n"));
9998 else if (retryCount <= 3) // <=3 retry in the last 2-second duration
10006 if (dn == 2) // if ³sÄò 2 Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration
10008 if (WaitCount <= 2)
10009 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
10013 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10021 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
10024 else //retry count > 3, ¥un1¦¸ retry count > 3, «h½Õ¯¶WiFi duration
10026 if (WaitCount == 1)
10027 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
10031 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
10039 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
10042 RTPRINT(FBT, BT_TRACE, ("[BTCoex], max Interval = %d\n", maxInterval));
10043 if(maxInterval == 1)
10047 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
10048 if(pBtdm8723->curPsTdma == 1)
10050 btdm_2AntPsTdma(padapter, _TRUE, 5);
10051 pBtdm8723->psTdmaDuAdjType = 5;
10053 else if(pBtdm8723->curPsTdma == 2)
10055 btdm_2AntPsTdma(padapter, _TRUE, 6);
10056 pBtdm8723->psTdmaDuAdjType = 6;
10058 else if(pBtdm8723->curPsTdma == 3)
10060 btdm_2AntPsTdma(padapter, _TRUE, 7);
10061 pBtdm8723->psTdmaDuAdjType = 7;
10063 else if(pBtdm8723->curPsTdma == 4)
10065 btdm_2AntPsTdma(padapter, _TRUE, 8);
10066 pBtdm8723->psTdmaDuAdjType = 8;
10068 if(pBtdm8723->curPsTdma == 9)
10070 btdm_2AntPsTdma(padapter, _TRUE, 13);
10071 pBtdm8723->psTdmaDuAdjType = 13;
10073 else if(pBtdm8723->curPsTdma == 10)
10075 btdm_2AntPsTdma(padapter, _TRUE, 14);
10076 pBtdm8723->psTdmaDuAdjType = 14;
10078 else if(pBtdm8723->curPsTdma == 11)
10080 btdm_2AntPsTdma(padapter, _TRUE, 15);
10081 pBtdm8723->psTdmaDuAdjType = 15;
10083 else if(pBtdm8723->curPsTdma == 12)
10085 btdm_2AntPsTdma(padapter, _TRUE, 16);
10086 pBtdm8723->psTdmaDuAdjType = 16;
10091 if(pBtdm8723->curPsTdma == 5)
10093 btdm_2AntPsTdma(padapter, _TRUE, 6);
10094 pBtdm8723->psTdmaDuAdjType = 6;
10096 else if(pBtdm8723->curPsTdma == 6)
10098 btdm_2AntPsTdma(padapter, _TRUE, 7);
10099 pBtdm8723->psTdmaDuAdjType = 7;
10101 else if(pBtdm8723->curPsTdma == 7)
10103 btdm_2AntPsTdma(padapter, _TRUE, 8);
10104 pBtdm8723->psTdmaDuAdjType = 8;
10106 else if(pBtdm8723->curPsTdma == 13)
10108 btdm_2AntPsTdma(padapter, _TRUE, 14);
10109 pBtdm8723->psTdmaDuAdjType = 14;
10111 else if(pBtdm8723->curPsTdma == 14)
10113 btdm_2AntPsTdma(padapter, _TRUE, 15);
10114 pBtdm8723->psTdmaDuAdjType = 15;
10116 else if(pBtdm8723->curPsTdma == 15)
10118 btdm_2AntPsTdma(padapter, _TRUE, 16);
10119 pBtdm8723->psTdmaDuAdjType = 16;
10122 else if (result == 1)
10124 if(pBtdm8723->curPsTdma == 8)
10126 btdm_2AntPsTdma(padapter, _TRUE, 7);
10127 pBtdm8723->psTdmaDuAdjType = 7;
10129 else if(pBtdm8723->curPsTdma == 7)
10131 btdm_2AntPsTdma(padapter, _TRUE, 6);
10132 pBtdm8723->psTdmaDuAdjType = 6;
10134 else if(pBtdm8723->curPsTdma == 6)
10136 btdm_2AntPsTdma(padapter, _TRUE, 5);
10137 pBtdm8723->psTdmaDuAdjType = 5;
10139 else if(pBtdm8723->curPsTdma == 16)
10141 btdm_2AntPsTdma(padapter, _TRUE, 15);
10142 pBtdm8723->psTdmaDuAdjType = 15;
10144 else if(pBtdm8723->curPsTdma == 15)
10146 btdm_2AntPsTdma(padapter, _TRUE, 14);
10147 pBtdm8723->psTdmaDuAdjType = 14;
10149 else if(pBtdm8723->curPsTdma == 14)
10151 btdm_2AntPsTdma(padapter, _TRUE, 13);
10152 pBtdm8723->psTdmaDuAdjType = 13;
10158 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
10159 if(pBtdm8723->curPsTdma == 5)
10161 btdm_2AntPsTdma(padapter, _TRUE, 1);
10162 pBtdm8723->psTdmaDuAdjType = 1;
10164 else if(pBtdm8723->curPsTdma == 6)
10166 btdm_2AntPsTdma(padapter, _TRUE, 2);
10167 pBtdm8723->psTdmaDuAdjType = 2;
10169 else if(pBtdm8723->curPsTdma == 7)
10171 btdm_2AntPsTdma(padapter, _TRUE, 3);
10172 pBtdm8723->psTdmaDuAdjType = 3;
10174 else if(pBtdm8723->curPsTdma == 8)
10176 btdm_2AntPsTdma(padapter, _TRUE, 4);
10177 pBtdm8723->psTdmaDuAdjType = 4;
10179 if(pBtdm8723->curPsTdma == 13)
10181 btdm_2AntPsTdma(padapter, _TRUE, 9);
10182 pBtdm8723->psTdmaDuAdjType = 9;
10184 else if(pBtdm8723->curPsTdma == 14)
10186 btdm_2AntPsTdma(padapter, _TRUE, 10);
10187 pBtdm8723->psTdmaDuAdjType = 10;
10189 else if(pBtdm8723->curPsTdma == 15)
10191 btdm_2AntPsTdma(padapter, _TRUE, 11);
10192 pBtdm8723->psTdmaDuAdjType = 11;
10194 else if(pBtdm8723->curPsTdma == 16)
10196 btdm_2AntPsTdma(padapter, _TRUE, 12);
10197 pBtdm8723->psTdmaDuAdjType = 12;
10202 if(pBtdm8723->curPsTdma == 1)
10204 btdm_2AntPsTdma(padapter, _TRUE, 2);
10205 pBtdm8723->psTdmaDuAdjType = 2;
10207 else if(pBtdm8723->curPsTdma == 2)
10209 btdm_2AntPsTdma(padapter, _TRUE, 3);
10210 pBtdm8723->psTdmaDuAdjType = 3;
10212 else if(pBtdm8723->curPsTdma == 3)
10214 btdm_2AntPsTdma(padapter, _TRUE, 4);
10215 pBtdm8723->psTdmaDuAdjType = 4;
10217 else if(pBtdm8723->curPsTdma == 9)
10219 btdm_2AntPsTdma(padapter, _TRUE, 10);
10220 pBtdm8723->psTdmaDuAdjType = 10;
10222 else if(pBtdm8723->curPsTdma == 10)
10224 btdm_2AntPsTdma(padapter, _TRUE, 11);
10225 pBtdm8723->psTdmaDuAdjType = 11;
10227 else if(pBtdm8723->curPsTdma == 11)
10229 btdm_2AntPsTdma(padapter, _TRUE, 12);
10230 pBtdm8723->psTdmaDuAdjType = 12;
10233 else if (result == 1)
10235 if(pBtdm8723->curPsTdma == 4)
10237 btdm_2AntPsTdma(padapter, _TRUE, 3);
10238 pBtdm8723->psTdmaDuAdjType = 3;
10240 else if(pBtdm8723->curPsTdma == 3)
10242 btdm_2AntPsTdma(padapter, _TRUE, 2);
10243 pBtdm8723->psTdmaDuAdjType = 2;
10245 else if(pBtdm8723->curPsTdma == 2)
10247 btdm_2AntPsTdma(padapter, _TRUE, 1);
10248 pBtdm8723->psTdmaDuAdjType = 1;
10250 else if(pBtdm8723->curPsTdma == 12)
10252 btdm_2AntPsTdma(padapter, _TRUE, 11);
10253 pBtdm8723->psTdmaDuAdjType = 11;
10255 else if(pBtdm8723->curPsTdma == 11)
10257 btdm_2AntPsTdma(padapter, _TRUE, 10);
10258 pBtdm8723->psTdmaDuAdjType = 10;
10260 else if(pBtdm8723->curPsTdma == 10)
10262 btdm_2AntPsTdma(padapter, _TRUE, 9);
10263 pBtdm8723->psTdmaDuAdjType = 9;
10268 else if(maxInterval == 2)
10272 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
10273 if(pBtdm8723->curPsTdma == 1)
10275 btdm_2AntPsTdma(padapter, _TRUE, 6);
10276 pBtdm8723->psTdmaDuAdjType = 6;
10278 else if(pBtdm8723->curPsTdma == 2)
10280 btdm_2AntPsTdma(padapter, _TRUE, 6);
10281 pBtdm8723->psTdmaDuAdjType = 6;
10283 else if(pBtdm8723->curPsTdma == 3)
10285 btdm_2AntPsTdma(padapter, _TRUE, 7);
10286 pBtdm8723->psTdmaDuAdjType = 7;
10288 else if(pBtdm8723->curPsTdma == 4)
10290 btdm_2AntPsTdma(padapter, _TRUE, 8);
10291 pBtdm8723->psTdmaDuAdjType = 8;
10293 if(pBtdm8723->curPsTdma == 9)
10295 btdm_2AntPsTdma(padapter, _TRUE, 14);
10296 pBtdm8723->psTdmaDuAdjType = 14;
10298 else if(pBtdm8723->curPsTdma == 10)
10300 btdm_2AntPsTdma(padapter, _TRUE, 14);
10301 pBtdm8723->psTdmaDuAdjType = 14;
10303 else if(pBtdm8723->curPsTdma == 11)
10305 btdm_2AntPsTdma(padapter, _TRUE, 15);
10306 pBtdm8723->psTdmaDuAdjType = 15;
10308 else if(pBtdm8723->curPsTdma == 12)
10310 btdm_2AntPsTdma(padapter, _TRUE, 16);
10311 pBtdm8723->psTdmaDuAdjType = 16;
10315 if(pBtdm8723->curPsTdma == 5)
10317 btdm_2AntPsTdma(padapter, _TRUE, 6);
10318 pBtdm8723->psTdmaDuAdjType = 6;
10320 else if(pBtdm8723->curPsTdma == 6)
10322 btdm_2AntPsTdma(padapter, _TRUE, 7);
10323 pBtdm8723->psTdmaDuAdjType = 7;
10325 else if(pBtdm8723->curPsTdma == 7)
10327 btdm_2AntPsTdma(padapter, _TRUE, 8);
10328 pBtdm8723->psTdmaDuAdjType = 8;
10330 else if(pBtdm8723->curPsTdma == 13)
10332 btdm_2AntPsTdma(padapter, _TRUE, 14);
10333 pBtdm8723->psTdmaDuAdjType = 14;
10335 else if(pBtdm8723->curPsTdma == 14)
10337 btdm_2AntPsTdma(padapter, _TRUE, 15);
10338 pBtdm8723->psTdmaDuAdjType = 15;
10340 else if(pBtdm8723->curPsTdma == 15)
10342 btdm_2AntPsTdma(padapter, _TRUE, 16);
10343 pBtdm8723->psTdmaDuAdjType = 16;
10346 else if (result == 1)
10348 if(pBtdm8723->curPsTdma == 8)
10350 btdm_2AntPsTdma(padapter, _TRUE, 7);
10351 pBtdm8723->psTdmaDuAdjType = 7;
10353 else if(pBtdm8723->curPsTdma == 7)
10355 btdm_2AntPsTdma(padapter, _TRUE, 6);
10356 pBtdm8723->psTdmaDuAdjType = 6;
10358 else if(pBtdm8723->curPsTdma == 6)
10360 btdm_2AntPsTdma(padapter, _TRUE, 6);
10361 pBtdm8723->psTdmaDuAdjType = 6;
10363 else if(pBtdm8723->curPsTdma == 16)
10365 btdm_2AntPsTdma(padapter, _TRUE, 15);
10366 pBtdm8723->psTdmaDuAdjType = 15;
10368 else if(pBtdm8723->curPsTdma == 15)
10370 btdm_2AntPsTdma(padapter, _TRUE, 14);
10371 pBtdm8723->psTdmaDuAdjType = 14;
10373 else if(pBtdm8723->curPsTdma == 14)
10375 btdm_2AntPsTdma(padapter, _TRUE, 14);
10376 pBtdm8723->psTdmaDuAdjType = 14;
10382 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
10383 if(pBtdm8723->curPsTdma == 5)
10385 btdm_2AntPsTdma(padapter, _TRUE, 2);
10386 pBtdm8723->psTdmaDuAdjType = 2;
10388 else if(pBtdm8723->curPsTdma == 6)
10390 btdm_2AntPsTdma(padapter, _TRUE, 2);
10391 pBtdm8723->psTdmaDuAdjType = 2;
10393 else if(pBtdm8723->curPsTdma == 7)
10395 btdm_2AntPsTdma(padapter, _TRUE, 3);
10396 pBtdm8723->psTdmaDuAdjType = 3;
10398 else if(pBtdm8723->curPsTdma == 8)
10400 btdm_2AntPsTdma(padapter, _TRUE, 4);
10401 pBtdm8723->psTdmaDuAdjType = 4;
10403 if(pBtdm8723->curPsTdma == 13)
10405 btdm_2AntPsTdma(padapter, _TRUE, 10);
10406 pBtdm8723->psTdmaDuAdjType = 10;
10408 else if(pBtdm8723->curPsTdma == 14)
10410 btdm_2AntPsTdma(padapter, _TRUE, 10);
10411 pBtdm8723->psTdmaDuAdjType = 10;
10413 else if(pBtdm8723->curPsTdma == 15)
10415 btdm_2AntPsTdma(padapter, _TRUE, 11);
10416 pBtdm8723->psTdmaDuAdjType = 11;
10418 else if(pBtdm8723->curPsTdma == 16)
10420 btdm_2AntPsTdma(padapter, _TRUE, 12);
10421 pBtdm8723->psTdmaDuAdjType = 12;
10425 if(pBtdm8723->curPsTdma == 1)
10427 btdm_2AntPsTdma(padapter, _TRUE, 2);
10428 pBtdm8723->psTdmaDuAdjType = 2;
10430 else if(pBtdm8723->curPsTdma == 2)
10432 btdm_2AntPsTdma(padapter, _TRUE, 3);
10433 pBtdm8723->psTdmaDuAdjType = 3;
10435 else if(pBtdm8723->curPsTdma == 3)
10437 btdm_2AntPsTdma(padapter, _TRUE, 4);
10438 pBtdm8723->psTdmaDuAdjType = 4;
10440 else if(pBtdm8723->curPsTdma == 9)
10442 btdm_2AntPsTdma(padapter, _TRUE, 10);
10443 pBtdm8723->psTdmaDuAdjType = 10;
10445 else if(pBtdm8723->curPsTdma == 10)
10447 btdm_2AntPsTdma(padapter, _TRUE, 11);
10448 pBtdm8723->psTdmaDuAdjType = 11;
10450 else if(pBtdm8723->curPsTdma == 11)
10452 btdm_2AntPsTdma(padapter, _TRUE, 12);
10453 pBtdm8723->psTdmaDuAdjType = 12;
10456 else if (result == 1)
10458 if(pBtdm8723->curPsTdma == 4)
10460 btdm_2AntPsTdma(padapter, _TRUE, 3);
10461 pBtdm8723->psTdmaDuAdjType = 3;
10463 else if(pBtdm8723->curPsTdma == 3)
10465 btdm_2AntPsTdma(padapter, _TRUE, 2);
10466 pBtdm8723->psTdmaDuAdjType = 2;
10468 else if(pBtdm8723->curPsTdma == 2)
10470 btdm_2AntPsTdma(padapter, _TRUE, 2);
10471 pBtdm8723->psTdmaDuAdjType = 2;
10473 else if(pBtdm8723->curPsTdma == 12)
10475 btdm_2AntPsTdma(padapter, _TRUE, 11);
10476 pBtdm8723->psTdmaDuAdjType = 11;
10478 else if(pBtdm8723->curPsTdma == 11)
10480 btdm_2AntPsTdma(padapter, _TRUE, 10);
10481 pBtdm8723->psTdmaDuAdjType = 10;
10483 else if(pBtdm8723->curPsTdma == 10)
10485 btdm_2AntPsTdma(padapter, _TRUE, 10);
10486 pBtdm8723->psTdmaDuAdjType = 10;
10491 else if(maxInterval == 3)
10495 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 1\n"));
10496 if(pBtdm8723->curPsTdma == 1)
10498 btdm_2AntPsTdma(padapter, _TRUE, 7);
10499 pBtdm8723->psTdmaDuAdjType = 7;
10501 else if(pBtdm8723->curPsTdma == 2)
10503 btdm_2AntPsTdma(padapter, _TRUE, 7);
10504 pBtdm8723->psTdmaDuAdjType = 7;
10506 else if(pBtdm8723->curPsTdma == 3)
10508 btdm_2AntPsTdma(padapter, _TRUE, 7);
10509 pBtdm8723->psTdmaDuAdjType = 7;
10511 else if(pBtdm8723->curPsTdma == 4)
10513 btdm_2AntPsTdma(padapter, _TRUE, 8);
10514 pBtdm8723->psTdmaDuAdjType = 8;
10516 if(pBtdm8723->curPsTdma == 9)
10518 btdm_2AntPsTdma(padapter, _TRUE, 15);
10519 pBtdm8723->psTdmaDuAdjType = 15;
10521 else if(pBtdm8723->curPsTdma == 10)
10523 btdm_2AntPsTdma(padapter, _TRUE, 15);
10524 pBtdm8723->psTdmaDuAdjType = 15;
10526 else if(pBtdm8723->curPsTdma == 11)
10528 btdm_2AntPsTdma(padapter, _TRUE, 15);
10529 pBtdm8723->psTdmaDuAdjType = 15;
10531 else if(pBtdm8723->curPsTdma == 12)
10533 btdm_2AntPsTdma(padapter, _TRUE, 16);
10534 pBtdm8723->psTdmaDuAdjType = 16;
10538 if(pBtdm8723->curPsTdma == 5)
10540 btdm_2AntPsTdma(padapter, _TRUE, 7);
10541 pBtdm8723->psTdmaDuAdjType = 7;
10543 else if(pBtdm8723->curPsTdma == 6)
10545 btdm_2AntPsTdma(padapter, _TRUE, 7);
10546 pBtdm8723->psTdmaDuAdjType = 7;
10548 else if(pBtdm8723->curPsTdma == 7)
10550 btdm_2AntPsTdma(padapter, _TRUE, 8);
10551 pBtdm8723->psTdmaDuAdjType = 8;
10553 else if(pBtdm8723->curPsTdma == 13)
10555 btdm_2AntPsTdma(padapter, _TRUE, 15);
10556 pBtdm8723->psTdmaDuAdjType = 15;
10558 else if(pBtdm8723->curPsTdma == 14)
10560 btdm_2AntPsTdma(padapter, _TRUE, 15);
10561 pBtdm8723->psTdmaDuAdjType = 15;
10563 else if(pBtdm8723->curPsTdma == 15)
10565 btdm_2AntPsTdma(padapter, _TRUE, 16);
10566 pBtdm8723->psTdmaDuAdjType = 16;
10569 else if (result == 1)
10571 if(pBtdm8723->curPsTdma == 8)
10573 btdm_2AntPsTdma(padapter, _TRUE, 7);
10574 pBtdm8723->psTdmaDuAdjType = 7;
10576 else if(pBtdm8723->curPsTdma == 7)
10578 btdm_2AntPsTdma(padapter, _TRUE, 7);
10579 pBtdm8723->psTdmaDuAdjType = 7;
10581 else if(pBtdm8723->curPsTdma == 6)
10583 btdm_2AntPsTdma(padapter, _TRUE, 7);
10584 pBtdm8723->psTdmaDuAdjType = 7;
10586 else if(pBtdm8723->curPsTdma == 16)
10588 btdm_2AntPsTdma(padapter, _TRUE, 15);
10589 pBtdm8723->psTdmaDuAdjType = 15;
10591 else if(pBtdm8723->curPsTdma == 15)
10593 btdm_2AntPsTdma(padapter, _TRUE, 15);
10594 pBtdm8723->psTdmaDuAdjType = 15;
10596 else if(pBtdm8723->curPsTdma == 14)
10598 btdm_2AntPsTdma(padapter, _TRUE, 15);
10599 pBtdm8723->psTdmaDuAdjType = 15;
10605 RTPRINT(FBT, BT_TRACE, ("[BTCoex], TxPause = 0\n"));
10606 if(pBtdm8723->curPsTdma == 5)
10608 btdm_2AntPsTdma(padapter, _TRUE, 3);
10609 pBtdm8723->psTdmaDuAdjType = 3;
10611 else if(pBtdm8723->curPsTdma == 6)
10613 btdm_2AntPsTdma(padapter, _TRUE, 3);
10614 pBtdm8723->psTdmaDuAdjType = 3;
10616 else if(pBtdm8723->curPsTdma == 7)
10618 btdm_2AntPsTdma(padapter, _TRUE, 3);
10619 pBtdm8723->psTdmaDuAdjType = 3;
10621 else if(pBtdm8723->curPsTdma == 8)
10623 btdm_2AntPsTdma(padapter, _TRUE, 4);
10624 pBtdm8723->psTdmaDuAdjType = 4;
10626 if(pBtdm8723->curPsTdma == 13)
10628 btdm_2AntPsTdma(padapter, _TRUE, 11);
10629 pBtdm8723->psTdmaDuAdjType = 11;
10631 else if(pBtdm8723->curPsTdma == 14)
10633 btdm_2AntPsTdma(padapter, _TRUE, 11);
10634 pBtdm8723->psTdmaDuAdjType = 11;
10636 else if(pBtdm8723->curPsTdma == 15)
10638 btdm_2AntPsTdma(padapter, _TRUE, 11);
10639 pBtdm8723->psTdmaDuAdjType = 11;
10641 else if(pBtdm8723->curPsTdma == 16)
10643 btdm_2AntPsTdma(padapter, _TRUE, 12);
10644 pBtdm8723->psTdmaDuAdjType = 12;
10648 if(pBtdm8723->curPsTdma == 1)
10650 btdm_2AntPsTdma(padapter, _TRUE, 3);
10651 pBtdm8723->psTdmaDuAdjType = 3;
10653 else if(pBtdm8723->curPsTdma == 2)
10655 btdm_2AntPsTdma(padapter, _TRUE, 3);
10656 pBtdm8723->psTdmaDuAdjType = 3;
10658 else if(pBtdm8723->curPsTdma == 3)
10660 btdm_2AntPsTdma(padapter, _TRUE, 4);
10661 pBtdm8723->psTdmaDuAdjType = 4;
10663 else if(pBtdm8723->curPsTdma == 9)
10665 btdm_2AntPsTdma(padapter, _TRUE, 11);
10666 pBtdm8723->psTdmaDuAdjType = 11;
10668 else if(pBtdm8723->curPsTdma == 10)
10670 btdm_2AntPsTdma(padapter, _TRUE, 11);
10671 pBtdm8723->psTdmaDuAdjType = 11;
10673 else if(pBtdm8723->curPsTdma == 11)
10675 btdm_2AntPsTdma(padapter, _TRUE, 12);
10676 pBtdm8723->psTdmaDuAdjType = 12;
10679 else if (result == 1)
10681 if(pBtdm8723->curPsTdma == 4)
10683 btdm_2AntPsTdma(padapter, _TRUE, 3);
10684 pBtdm8723->psTdmaDuAdjType = 3;
10686 else if(pBtdm8723->curPsTdma == 3)
10688 btdm_2AntPsTdma(padapter, _TRUE, 3);
10689 pBtdm8723->psTdmaDuAdjType = 3;
10691 else if(pBtdm8723->curPsTdma == 2)
10693 btdm_2AntPsTdma(padapter, _TRUE, 3);
10694 pBtdm8723->psTdmaDuAdjType = 3;
10696 else if(pBtdm8723->curPsTdma == 12)
10698 btdm_2AntPsTdma(padapter, _TRUE, 11);
10699 pBtdm8723->psTdmaDuAdjType = 11;
10701 else if(pBtdm8723->curPsTdma == 11)
10703 btdm_2AntPsTdma(padapter, _TRUE, 11);
10704 pBtdm8723->psTdmaDuAdjType = 11;
10706 else if(pBtdm8723->curPsTdma == 10)
10708 btdm_2AntPsTdma(padapter, _TRUE, 11);
10709 pBtdm8723->psTdmaDuAdjType = 11;
10715 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type : recordPsTdma=%d\n",pBtdm8723->psTdmaDuAdjType));
10716 // if current PsTdma not match with the recorded one (when scan, dhcp...),
10717 // then we have to adjust it back to the previous record one.
10718 if(pBtdm8723->curPsTdma != pBtdm8723->psTdmaDuAdjType)
10720 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
10721 pBtdm8723->curPsTdma, pBtdm8723->psTdmaDuAdjType));
10723 if( check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE )
10725 btdm_2AntPsTdma(padapter, _TRUE, pBtdm8723->psTdmaDuAdjType);
10729 RTPRINT(FBT, BT_TRACE, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
10735 void btdm_2Ant8723AAction0(PADAPTER padapter)
10737 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
10738 btdm_2AntPsTdma(padapter, _FALSE, 0);
10739 btdm_2AntDecBtPwr(padapter, _FALSE);
10741 btdm_2AntAgcTable(padapter, _FALSE);
10742 btdm_2AntAdcBackOff(padapter, _FALSE);
10743 btdm_2AntLowPenaltyRa(padapter, _FALSE);
10744 btdm_2AntRfShrink(padapter, _FALSE);
10745 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10747 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
10750 // SCO only or SCO+PAN(HS)
10751 void btdm_2Ant8723ASCOAction(PADAPTER padapter)
10753 u8 btRssiState, btRssiState1;
10756 if(btdm_NeedToDecBtPwr(padapter))
10757 btdm_2AntDecBtPwr(padapter, _TRUE);
10759 btdm_2AntDecBtPwr(padapter, _FALSE);
10761 if (BTDM_IsHT40(padapter))
10763 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
10764 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10766 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
10767 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
10769 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
10770 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10771 btdm_2AntPsTdma(padapter, _TRUE, 11);
10775 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
10776 btdm_2AntPsTdma(padapter, _TRUE, 15);
10780 btdm_2AntAgcTable(padapter, _FALSE);
10781 btdm_2AntAdcBackOff(padapter, _TRUE);
10782 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10786 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
10787 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10788 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
10791 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
10792 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
10794 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
10795 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10796 btdm_2AntPsTdma(padapter, _TRUE, 11);
10800 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
10801 btdm_2AntPsTdma(padapter, _TRUE, 15);
10806 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
10807 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
10809 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
10810 btdm_2AntAgcTable(padapter, _TRUE);
10811 btdm_2AntAdcBackOff(padapter, _TRUE);
10812 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10816 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
10817 btdm_2AntAgcTable(padapter, _FALSE);
10818 btdm_2AntAdcBackOff(padapter, _FALSE);
10819 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10825 void btdm_2Ant8723AHIDAction(PADAPTER padapter)
10827 u8 btRssiState, btRssiState1;
10829 if(btdm_NeedToDecBtPwr(padapter))
10830 btdm_2AntDecBtPwr(padapter, _TRUE);
10832 btdm_2AntDecBtPwr(padapter, _FALSE);
10834 if (BTDM_IsHT40(padapter))
10836 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
10837 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10839 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
10840 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
10842 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
10843 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10844 btdm_2AntPsTdma(padapter, _TRUE, 9);
10848 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
10849 btdm_2AntPsTdma(padapter, _TRUE, 13);
10853 btdm_2AntAgcTable(padapter, _FALSE);
10854 btdm_2AntAdcBackOff(padapter, _FALSE);
10855 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10859 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
10860 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10861 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
10864 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
10865 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
10867 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
10868 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10869 btdm_2AntPsTdma(padapter, _TRUE, 9);
10873 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
10874 btdm_2AntPsTdma(padapter, _TRUE, 13);
10878 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
10879 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
10881 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
10882 btdm_2AntAgcTable(padapter, _TRUE);
10883 btdm_2AntAdcBackOff(padapter, _TRUE);
10884 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10888 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
10889 btdm_2AntAgcTable(padapter, _FALSE);
10890 btdm_2AntAdcBackOff(padapter, _FALSE);
10891 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10896 //A2DP only / PAN(EDR) only/ A2DP+PAN(HS)
10897 void btdm_2Ant8723AA2DPAction(PADAPTER padapter)
10899 u8 btRssiState, btRssiState1;
10900 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
10901 u8 btInfoExt=pHalData->bt_coexist.halCoex8723.btInfoExt;
10903 if(btdm_NeedToDecBtPwr(padapter))
10904 btdm_2AntDecBtPwr(padapter, _TRUE);
10906 btdm_2AntDecBtPwr(padapter, _FALSE);
10908 if(BTDM_IsHT40(padapter))
10910 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
10911 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10914 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
10915 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
10917 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
10918 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10920 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
10922 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
10923 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
10927 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
10928 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
10933 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
10934 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
10936 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
10937 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
10941 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
10942 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
10947 btdm_2AntAgcTable(padapter, _FALSE);
10948 btdm_2AntAdcBackOff(padapter, _TRUE);
10949 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
10953 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
10954 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
10955 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
10958 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
10959 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
10961 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
10962 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
10963 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
10965 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
10966 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 3);
10970 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
10971 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
10976 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
10977 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
10979 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
10980 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 3);
10984 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
10985 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
10990 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
10991 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
10993 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
10994 btdm_2AntAgcTable(padapter, _TRUE);
10995 btdm_2AntAdcBackOff(padapter, _TRUE);
10996 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11000 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11001 btdm_2AntAgcTable(padapter, _FALSE);
11002 btdm_2AntAdcBackOff(padapter, _FALSE);
11003 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11009 void btdm_2Ant8723APANEDRAction(PADAPTER padapter)
11011 u8 btRssiState, btRssiState1;
11013 if(btdm_NeedToDecBtPwr(padapter))
11014 btdm_2AntDecBtPwr(padapter, _TRUE);
11016 btdm_2AntDecBtPwr(padapter, _FALSE);
11018 if(BTDM_IsHT40(padapter))
11020 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11021 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11024 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11025 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11027 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11028 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11029 btdm_2AntPsTdma(padapter, _TRUE, 2);
11033 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11034 btdm_2AntPsTdma(padapter, _TRUE, 6);
11038 btdm_2AntAgcTable(padapter, _FALSE);
11039 btdm_2AntAdcBackOff(padapter, _TRUE);
11040 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11044 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11045 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11046 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11049 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11050 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11052 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11053 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11054 btdm_2AntPsTdma(padapter, _TRUE, 2);
11058 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11059 btdm_2AntPsTdma(padapter, _TRUE, 6);
11063 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11064 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11066 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11067 btdm_2AntAgcTable(padapter, _TRUE);
11068 btdm_2AntAdcBackOff(padapter, _TRUE);
11069 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11073 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11074 btdm_2AntAgcTable(padapter, _FALSE);
11075 btdm_2AntAdcBackOff(padapter, _FALSE);
11076 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11084 void btdm_2Ant8723APANHSAction(PADAPTER padapter)
11086 u8 btRssiState, btRssiState1;
11088 if (BTDM_IsHT40(padapter))
11090 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11091 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11093 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11094 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11096 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11097 btdm_2AntDecBtPwr(padapter, _TRUE);
11101 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11102 btdm_2AntDecBtPwr(padapter, _FALSE);
11104 btdm_2AntPsTdma(padapter, _FALSE, 0);
11107 btdm_2AntAgcTable(padapter, _FALSE);
11108 btdm_2AntAdcBackOff(padapter, _TRUE);
11109 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11113 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11114 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11116 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11117 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11119 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high\n"));
11121 btdm_2AntDecBtPwr(padapter, _TRUE);
11122 btdm_2AntPsTdma(padapter, _FALSE, 0);
11125 btdm_2AntAgcTable(padapter, _TRUE);
11126 btdm_2AntAdcBackOff(padapter, _TRUE);
11127 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11131 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low\n"));
11133 btdm_2AntDecBtPwr(padapter, _FALSE);
11134 btdm_2AntPsTdma(padapter, _FALSE, 0);
11137 btdm_2AntAgcTable(padapter, _FALSE);
11138 btdm_2AntAdcBackOff(padapter, _FALSE);
11139 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11146 void btdm_2Ant8723APANEDRA2DPAction(PADAPTER padapter)
11148 u8 btRssiState, btRssiState1, btInfoExt;
11149 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11151 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11153 if(btdm_NeedToDecBtPwr(padapter))
11154 btdm_2AntDecBtPwr(padapter, _TRUE);
11156 btdm_2AntDecBtPwr(padapter, _FALSE);
11158 if(BTDM_IsHT40(padapter))
11160 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11161 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11163 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11164 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11166 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11168 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11170 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11172 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11173 btdm_2AntPsTdma(padapter, _TRUE, 4);
11177 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11178 btdm_2AntPsTdma(padapter, _TRUE, 2);
11183 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11185 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11187 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11188 btdm_2AntPsTdma(padapter, _TRUE, 8);
11192 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11193 btdm_2AntPsTdma(padapter, _TRUE, 6);
11198 btdm_2AntAgcTable(padapter, _FALSE);
11199 btdm_2AntAdcBackOff(padapter, _TRUE);
11200 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11204 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11205 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11206 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11208 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11209 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11211 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11212 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11214 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11216 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11217 btdm_2AntPsTdma(padapter, _TRUE, 4);
11221 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11222 btdm_2AntPsTdma(padapter, _TRUE, 2);
11227 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11229 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11231 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11232 btdm_2AntPsTdma(padapter, _TRUE, 8);
11236 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11237 btdm_2AntPsTdma(padapter, _TRUE, 6);
11242 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11243 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11245 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11246 btdm_2AntAgcTable(padapter, _TRUE);
11247 btdm_2AntAdcBackOff(padapter, _TRUE);
11248 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11252 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11253 btdm_2AntAgcTable(padapter, _FALSE);
11254 btdm_2AntAdcBackOff(padapter, _FALSE);
11255 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11261 void btdm_2Ant8723APANEDRHIDAction(PADAPTER padapter)
11263 u8 btRssiState, btRssiState1;
11265 if(btdm_NeedToDecBtPwr(padapter))
11266 btdm_2AntDecBtPwr(padapter, _TRUE);
11268 btdm_2AntDecBtPwr(padapter, _FALSE);
11270 if(BTDM_IsHT40(padapter))
11272 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11273 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11275 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11276 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11278 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11279 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11280 btdm_2AntPsTdma(padapter, _TRUE, 10);
11284 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11285 btdm_2AntPsTdma(padapter, _TRUE, 14);
11289 btdm_2AntAgcTable(padapter, _FALSE);
11290 btdm_2AntAdcBackOff(padapter, _TRUE);
11291 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11295 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11296 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11297 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11300 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11301 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11303 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11304 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11305 btdm_2AntPsTdma(padapter, _TRUE, 10);
11309 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11310 btdm_2AntPsTdma(padapter, _TRUE, 14);
11314 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11315 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11317 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11318 btdm_2AntAgcTable(padapter, _TRUE);
11319 btdm_2AntAdcBackOff(padapter, _TRUE);
11320 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11324 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11325 btdm_2AntAgcTable(padapter, _FALSE);
11326 btdm_2AntAdcBackOff(padapter, _FALSE);
11327 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11332 // HID+A2DP+PAN(EDR)
11333 void btdm_2Ant8723AHIDA2DPPANEDRAction(PADAPTER padapter)
11335 u8 btRssiState, btRssiState1, btInfoExt;
11336 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11338 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11340 if(btdm_NeedToDecBtPwr(padapter))
11341 btdm_2AntDecBtPwr(padapter, _TRUE);
11343 btdm_2AntDecBtPwr(padapter, _FALSE);
11345 if (BTDM_IsHT40(padapter))
11347 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11348 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11349 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11350 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11352 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11353 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11355 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11357 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11358 btdm_2AntPsTdma(padapter, _TRUE, 12);
11362 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11363 btdm_2AntPsTdma(padapter, _TRUE, 10);
11368 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11369 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11371 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11372 btdm_2AntPsTdma(padapter, _TRUE, 16);
11376 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11377 btdm_2AntPsTdma(padapter, _TRUE, 14);
11382 btdm_2AntAgcTable(padapter, _FALSE);
11383 btdm_2AntAdcBackOff(padapter, _TRUE);
11384 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11388 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11389 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 37, 0);
11390 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
11391 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11392 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11394 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11395 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11397 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11399 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11400 btdm_2AntPsTdma(padapter, _TRUE, 12);
11404 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11405 btdm_2AntPsTdma(padapter, _TRUE, 10);
11410 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11411 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11413 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11414 btdm_2AntPsTdma(padapter, _TRUE, 16);
11418 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11419 btdm_2AntPsTdma(padapter, _TRUE, 14);
11424 if ((btRssiState1 == BT_RSSI_STATE_HIGH) ||
11425 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH))
11427 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11428 btdm_2AntAgcTable(padapter, _TRUE);
11429 btdm_2AntAdcBackOff(padapter, _TRUE);
11430 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11434 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11435 btdm_2AntAgcTable(padapter, _FALSE);
11436 btdm_2AntAdcBackOff(padapter, _FALSE);
11437 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11443 void btdm_2Ant8723AHIDA2DPAction(PADAPTER padapter)
11445 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11446 u8 btRssiState, btRssiState1, btInfoExt;
11448 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11450 if(btdm_NeedToDecBtPwr(padapter))
11451 btdm_2AntDecBtPwr(padapter, _TRUE);
11453 btdm_2AntDecBtPwr(padapter, _FALSE);
11455 if (BTDM_IsHT40(padapter))
11457 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11458 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11459 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11460 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11462 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11463 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11465 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11467 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11468 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
11472 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11473 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
11478 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11479 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11481 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11482 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
11486 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11487 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
11492 btdm_2AntAgcTable(padapter, _FALSE);
11493 btdm_2AntAdcBackOff(padapter, _TRUE);
11494 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11498 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11499 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11500 btRssiState1 = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
11502 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
11503 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
11505 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11506 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11508 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11510 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11511 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
11515 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11516 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 1);
11521 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11522 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11524 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11525 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
11529 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11530 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 1);
11533 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11534 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11536 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11538 btdm_2AntAgcTable(padapter, _TRUE);
11539 btdm_2AntAdcBackOff(padapter, _TRUE);
11540 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11544 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11546 btdm_2AntAgcTable(padapter, _FALSE);
11547 btdm_2AntAdcBackOff(padapter, _FALSE);
11548 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11554 void btdm_2Ant8723AHidScoEsco(PADAPTER padapter )
11556 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11557 u8 btRssiState, btRssiState1, btInfoExt;
11559 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11561 if(btdm_NeedToDecBtPwr(padapter))
11562 btdm_2AntDecBtPwr(padapter, _TRUE);
11564 btdm_2AntDecBtPwr(padapter, _FALSE);
11566 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11567 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11569 if(BTDM_IsHT40(padapter))
11571 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11572 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11574 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11575 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11577 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11578 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11579 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11581 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11582 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
11586 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11587 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
11592 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11593 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11595 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11596 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
11600 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11601 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
11606 btdm_2AntAgcTable(padapter, _FALSE);
11607 btdm_2AntAdcBackOff(padapter, _FALSE);
11608 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11612 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11613 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11614 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11617 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11618 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11620 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11621 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11622 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11624 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11625 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 3);
11629 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11630 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _FALSE, 2);
11635 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11636 if(btInfoExt&BIT(0)) //a2dp rate, 1:basic /0:edr
11638 RTPRINT(FBT, BT_TRACE, ("a2dp basic rate \n"));
11639 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 3);
11643 RTPRINT(FBT, BT_TRACE, ("a2dp edr rate \n"));
11644 btdm_2AntTdmaDurationAdjust(padapter, _TRUE, _TRUE, 2);
11649 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11650 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11652 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11653 btdm_2AntAgcTable(padapter, _TRUE);
11654 btdm_2AntAdcBackOff(padapter, _TRUE);
11655 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11659 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11660 btdm_2AntAgcTable(padapter, _FALSE);
11661 btdm_2AntAdcBackOff(padapter, _FALSE);
11662 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11667 void btdm_2Ant8723AFtpA2dp( PADAPTER padapter )
11669 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11670 u8 btRssiState, btRssiState1, btInfoExt;
11672 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11674 if(btdm_NeedToDecBtPwr(padapter))
11675 btdm_2AntDecBtPwr(padapter, _TRUE);
11677 btdm_2AntDecBtPwr(padapter, _FALSE);
11679 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11680 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11682 if(BTDM_IsHT40(padapter))
11684 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11685 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 27, 0);
11687 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11688 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11690 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11691 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11692 btdm_2AntPsTdma(padapter, _TRUE, 3);
11696 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11697 btdm_2AntPsTdma(padapter, _TRUE, 7);
11701 btdm_2AntAgcTable(padapter, _FALSE);
11702 btdm_2AntAdcBackOff(padapter, _TRUE);
11703 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11707 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11708 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11709 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11712 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11713 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11715 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11716 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11717 btdm_2AntPsTdma(padapter, _TRUE, 3);
11721 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11722 btdm_2AntPsTdma(padapter, _TRUE, 7);
11726 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11727 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11729 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11730 btdm_2AntAgcTable(padapter, _TRUE);
11731 btdm_2AntAdcBackOff(padapter, _TRUE);
11732 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11736 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11737 btdm_2AntAgcTable(padapter, _FALSE);
11738 btdm_2AntAdcBackOff(padapter, _FALSE);
11739 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11745 void btdm_2Ant8723AA2dp(PADAPTER padapter)
11747 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11748 u8 btRssiState, btRssiState1, btInfoExt;
11750 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11752 if(btdm_NeedToDecBtPwr(padapter))
11753 btdm_2AntDecBtPwr(padapter, _TRUE);
11755 btdm_2AntDecBtPwr(padapter, _FALSE);
11757 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11758 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11760 if(BTDM_IsHT40(padapter))
11762 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11763 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11765 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11766 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11768 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11769 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11770 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11774 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11775 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11779 btdm_2AntAgcTable(padapter, _FALSE);
11780 btdm_2AntAdcBackOff(padapter, _TRUE);
11781 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11785 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11786 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11787 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11790 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11791 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11793 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11794 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11795 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _FALSE, 1);
11799 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11800 btdm_2AntTdmaDurationAdjust(padapter, _FALSE, _TRUE, 1);
11804 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11805 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11807 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11808 btdm_2AntAgcTable(padapter, _TRUE);
11809 btdm_2AntAdcBackOff(padapter, _TRUE);
11810 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11814 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11815 btdm_2AntAgcTable(padapter, _FALSE);
11816 btdm_2AntAdcBackOff(padapter, _FALSE);
11817 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11823 void btdm_2Ant8723Ftp(PADAPTER padapter)
11825 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11826 u8 btRssiState, btRssiState1, btInfoExt;
11828 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
11830 if(btdm_NeedToDecBtPwr(padapter))
11831 btdm_2AntDecBtPwr(padapter, _TRUE);
11833 btdm_2AntDecBtPwr(padapter, _FALSE);
11835 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11836 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11838 if(BTDM_IsHT40(padapter))
11840 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
11841 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 37, 0);
11843 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11844 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11846 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11847 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11848 btdm_2AntPsTdma(padapter, _TRUE, 1);
11852 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11853 btdm_2AntPsTdma(padapter, _TRUE, 5);
11857 btdm_2AntAgcTable(padapter, _FALSE);
11858 btdm_2AntAdcBackOff(padapter, _TRUE);
11859 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11863 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
11864 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, 47, 0);
11865 btRssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, 27, 0);
11868 if( (btRssiState1 == BT_RSSI_STATE_HIGH) ||
11869 (btRssiState1 == BT_RSSI_STATE_STAY_HIGH) )
11871 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 high \n"));
11872 PlatformEFIOWrite1Byte(padapter, 0x883, 0x40);
11873 btdm_2AntPsTdma(padapter, _TRUE, 1);
11877 RTPRINT(FBT, BT_TRACE, ("Wifi rssi-1 low \n"));
11878 btdm_2AntPsTdma(padapter, _TRUE, 5);
11882 if( (btRssiState == BT_RSSI_STATE_HIGH) ||
11883 (btRssiState == BT_RSSI_STATE_STAY_HIGH) )
11885 RTPRINT(FBT, BT_TRACE, ("Wifi rssi high \n"));
11886 btdm_2AntAgcTable(padapter, _TRUE);
11887 btdm_2AntAdcBackOff(padapter, _TRUE);
11888 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11892 RTPRINT(FBT, BT_TRACE, ("Wifi rssi low \n"));
11893 btdm_2AntAgcTable(padapter, _FALSE);
11894 btdm_2AntAdcBackOff(padapter, _FALSE);
11895 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11900 //============================================================
11901 // extern function start with BTDM_
11902 //============================================================
11903 void BTDM_2AntParaInit(PADAPTER padapter)
11906 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11907 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
11909 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2Ant Parameter Init!!\n"));
11911 // Enable counter statistics
11912 rtw_write8(padapter, 0x76e, 0x4);
11913 rtw_write8(padapter, 0x778, 0x3);
11914 rtw_write8(padapter, 0x40, 0x20);
11916 // force to reset coex mechanism
11917 pBtdm8723->preVal0x6c0 = 0x0;
11918 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11920 pBtdm8723->bPrePsTdmaOn = _TRUE;
11921 btdm_2AntPsTdma(padapter, _FALSE, 0);
11923 pBtdm8723->preFwDacSwingLvl = 0x10;
11924 btdm_2AntFwDacSwingLvl(padapter, 0x20);
11926 pBtdm8723->bPreDecBtPwr = _TRUE;
11927 btdm_2AntDecBtPwr(padapter, _FALSE);
11929 pBtdm8723->bPreAgcTableEn = _TRUE;
11930 btdm_2AntAgcTable(padapter, _FALSE);
11932 pBtdm8723->bPreAdcBackOff = _TRUE;
11933 btdm_2AntAdcBackOff(padapter, _FALSE);
11935 pBtdm8723->bPreLowPenaltyRa = _TRUE;
11936 btdm_2AntLowPenaltyRa(padapter, _FALSE);
11938 pBtdm8723->bPreRfRxLpfShrink = _TRUE;
11939 btdm_2AntRfShrink(padapter, _FALSE);
11941 pBtdm8723->bPreDacSwingOn = _TRUE;
11942 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11944 pBtdm8723->bPreIgnoreWlanAct = _TRUE;
11945 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11948 void BTDM_2AntHwCoexAllOff8723A(PADAPTER padapter)
11950 btdm_2AntCoexTable(padapter, 0x55555555, 0xffff, 0x3);
11953 void BTDM_2AntFwCoexAllOff8723A(PADAPTER padapter)
11955 btdm_2AntIgnoreWlanAct(padapter, _FALSE);
11956 btdm_2AntPsTdma(padapter, _FALSE, 0);
11957 btdm_2AntFwDacSwingLvl(padapter, 0x20);
11958 btdm_2AntDecBtPwr(padapter, _FALSE);
11961 void BTDM_2AntSwCoexAllOff8723A(PADAPTER padapter)
11963 btdm_2AntAgcTable(padapter, _FALSE);
11964 btdm_2AntAdcBackOff(padapter, _FALSE);
11965 btdm_2AntLowPenaltyRa(padapter, _FALSE);
11966 btdm_2AntRfShrink(padapter, _FALSE);
11967 btdm_2AntDacSwing(padapter, _FALSE, 0xc0);
11971 void BTDM_2AntIpsNotify8723A(PADAPTER padapter,u8 type)
11973 PBT30Info pBTInfo = GET_BT_INFO(padapter);
11974 PBT_MGNT pBtMgnt=&pBTInfo->BtMgnt;
11976 if(pBtMgnt->bSupportProfile && (rf_off==type))
11978 RTPRINT(FBT, BT_TRACE, ("[BT][DM], enter IPS, turn off all BT Coexist DM\n"));
11979 BTDM_CoexAllOff(padapter);
11984 void BTDM_2AntNotifyBtOperation8723(PADAPTER padapter)
11986 PBT30Info pBTInfo = GET_BT_INFO(padapter);
11987 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
11988 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
11990 switch (pBtMgnt->ExtConfig.btOperationCode)
11992 case HCI_BT_OP_NONE:
11993 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for operation None!!\n"));
11995 case HCI_BT_OP_INQUIRY_START:
11996 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Inquiry start!!\n"));
11997 pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
11998 pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
11999 btdm_2AntBtInquiryPage(padapter);
12001 case HCI_BT_OP_INQUIRY_FINISH:
12002 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Inquiry finished!!\n"));
12003 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12005 case HCI_BT_OP_PAGING_START:
12006 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging start!!\n"));
12007 pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12008 pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12009 btdm_2AntBtInquiryPage(padapter);
12011 case HCI_BT_OP_PAGING_SUCCESS:
12012 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging successfully!!\n"));
12013 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12015 case HCI_BT_OP_PAGING_UNSUCCESS:
12016 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for paging unsuccessfully!!\n"));
12017 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12019 case HCI_BT_OP_PAIRING_START:
12020 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Pairing start!!\n"));
12021 pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12022 pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12023 btdm_2AntBtInquiryPage(padapter);
12025 case HCI_BT_OP_PAIRING_FINISH:
12026 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Pairing finished!!\n"));
12027 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12030 case HCI_BT_OP_BT_DEV_ENABLE:
12031 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device enable!!\n"));
12033 case HCI_BT_OP_BT_DEV_DISABLE:
12034 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for BT Device disable!!\n"));
12037 RTPRINT(FIOCTL, IOCTL_BT_HCICMD_EXT, ("[BT OP] : Adjust for Unknown, error!!\n"));
12044 void btdm_BtHwCountersMonitor(PADAPTER padapter);
12046 BTDM_2AntFwC2hBtInfo8723A(
12050 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12051 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
12052 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12053 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
12055 u8 algorithm=BT_2ANT_COEX_ALGO_UNDEFINED;
12056 u8 bScoExist=_FALSE, bBtLinkExist=_FALSE, bBtHsModeExist=_FALSE;
12057 btInfo = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
12060 pBtdm8723->btStatus = BT_2ANT_BT_STATUS_IDLE;
12062 // check BIT2 first ==> check if bt is under inquiry or page scan
12063 if(btInfo & BIT(2))
12065 if(pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage == _FALSE){
12066 pBtMgnt->ExtConfig.bHoldForBtOperation = _TRUE;
12067 pBtMgnt->ExtConfig.bHoldPeriodCnt = 1;
12068 btdm_2AntBtInquiryPage(padapter);
12071 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
12072 btdm_HoldForBtInqPage(padapter);
12074 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _TRUE;
12079 pHalData->bt_coexist.halCoex8723.bC2hBtInquiryPage = _FALSE;
12080 pBtMgnt->ExtConfig.bHoldForBtOperation = _FALSE;
12081 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
12085 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));
12087 RTPRINT(FBT, BT_TRACE, ("[BTC2H], btInfo=%x pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal=%x\n",btInfo,pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal));
12088 // btdm_BtHwCountersMonitor(padapter);
12089 // btdm_2AntBtEnableDisableCheck8723A(padapter);
12090 if(btInfo&BT_INFO_ACL)
12092 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BTInfo: bConnect=TRUE btInfo=%x\n",btInfo));
12093 //pBtMgnt->ExtConfig.bBTBusy = _TRUE;
12094 bBtLinkExist = _TRUE;
12095 if(((btInfo&(BT_INFO_FTP|BT_INFO_A2DP|BT_INFO_HID|BT_INFO_SCO_BUSY))!=0) || pHalData->bt_coexist.halCoex8723.btRetryCnt>0){
12096 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_NON_IDLE;
12099 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_CONNECTED_IDLE;
12102 if(btInfo&BT_INFO_SCO|| btInfo&BT_INFO_SCO_BUSY){
12103 if(btInfo&BT_INFO_FTP|| btInfo&BT_INFO_A2DP||btInfo&BT_INFO_HID){
12104 switch(btInfo&0xe0){
12106 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + HID\n"));
12107 algorithm = BT_2ANT_COEX_ALGO_HID;
12109 case BT_INFO_A2DP :
12110 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Error!!! SCO + A2DP\n"));
12115 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
12116 algorithm = BT_2ANT_COEX_ALGO_SCO;
12120 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
12121 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12124 case (BT_INFO_HID|BT_INFO_A2DP) :
12125 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
12126 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12128 case (BT_INFO_HID|BT_INFO_FTP) :
12131 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
12132 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12136 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
12137 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12140 case (BT_INFO_A2DP|BT_INFO_FTP) :
12143 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
12144 algorithm = BT_2ANT_COEX_ALGO_A2DP;
12148 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
12149 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
12152 case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
12155 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
12156 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12160 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
12161 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
12168 RTPRINT(FBT, BT_TRACE, ("[BTCoex], SCO only\n"));
12169 algorithm = BT_2ANT_COEX_ALGO_SCO;
12173 RTPRINT(FBT, BT_TRACE, ("[BTCoex], non SCO\n"));
12174 switch(btInfo&0xe0){
12176 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID\n"));
12177 algorithm = BT_2ANT_COEX_ALGO_HID;
12179 case BT_INFO_A2DP :
12180 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP\n"));
12181 algorithm = BT_2ANT_COEX_ALGO_A2DP;
12184 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PAN(EDR)\n"));
12185 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12187 case (BT_INFO_HID|BT_INFO_A2DP) :
12188 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP\n"));
12189 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12191 case (BT_INFO_HID|BT_INFO_FTP) :
12194 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
12195 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12199 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
12200 algorithm = BT_2ANT_COEX_ALGO_PANEDR_HID;
12203 case (BT_INFO_A2DP|BT_INFO_FTP) :
12206 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
12207 algorithm = BT_2ANT_COEX_ALGO_A2DP;
12211 RTPRINT(FBT, BT_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
12212 algorithm = BT_2ANT_COEX_ALGO_PANEDR_A2DP;
12215 case (BT_INFO_HID|BT_INFO_A2DP|BT_INFO_FTP) :
12218 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
12219 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP;
12223 RTPRINT(FBT, BT_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
12224 algorithm = BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
12234 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BTInfo: bConnect=FALSE\n"));
12235 //pBtMgnt->ExtConfig.bBTBusy = _FALSE;
12236 pBtdm8723->btStatus =BT_2ANT_BT_STATUS_IDLE;
12239 pBtdm8723->curAlgorithm =algorithm;
12240 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
12243 BTDM_CheckWiFiState(padapter);
12244 if(pBtMgnt->ExtConfig.bManualControl)
12246 RTPRINT(FBT, BT_TRACE, ("Action Manual control, won't execute bt coexist mechanism!!\n"));
12253 void BTDM_2AntBtCoexist8723A(PADAPTER padapter)
12255 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12256 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
12257 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
12258 u8 BtState = 0, btInfoOriginal=0, btRetryCnt=0;
12259 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12260 PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant;
12262 if (BTDM_BtProfileSupport(padapter))
12264 if (pBtMgnt->ExtConfig.bHoldForBtOperation)
12266 RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
12269 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
12271 RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n",
12272 pBtMgnt->ExtConfig.bHoldPeriodCnt));
12273 if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
12275 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
12276 // next time the coexist parameters should be reset again.
12279 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
12283 if(pBtDbg->dbgCtrl)
12285 RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
12288 pBtdm8723->curAlgorithm = btdm_ActionAlgorithm(padapter);
12289 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Algorithm = %d \n", pBtdm8723->curAlgorithm));
12291 if (btdm_Is2Ant8723ACommonAction(padapter))
12293 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
12294 pBtdm8723->bResetTdmaAdjust = _TRUE;
12298 if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
12300 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
12301 pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
12302 pBtdm8723->bResetTdmaAdjust = _TRUE;
12304 switch(pBtdm8723->curAlgorithm)
12306 case BT_2ANT_COEX_ALGO_SCO:
12307 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
12308 btdm_2Ant8723ASCOAction(padapter);
12310 case BT_2ANT_COEX_ALGO_HID:
12311 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
12312 btdm_2Ant8723AHIDAction(padapter);
12314 case BT_2ANT_COEX_ALGO_A2DP:
12315 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
12316 btdm_2Ant8723AA2DPAction(padapter);
12318 case BT_2ANT_COEX_ALGO_PANEDR:
12319 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
12320 btdm_2Ant8723APANEDRAction(padapter);
12322 case BT_2ANT_COEX_ALGO_PANHS:
12323 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
12324 btdm_2Ant8723APANHSAction(padapter);
12326 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
12327 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
12328 btdm_2Ant8723APANEDRA2DPAction(padapter);
12330 case BT_2ANT_COEX_ALGO_PANEDR_HID:
12331 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
12332 btdm_2Ant8723APANEDRHIDAction(padapter);
12334 case BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
12335 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
12336 btdm_2Ant8723AHIDA2DPPANEDRAction(padapter);
12338 case BT_2ANT_COEX_ALGO_HID_A2DP:
12339 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
12340 btdm_2Ant8723AHIDA2DPAction(padapter);
12343 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
12344 btdm_2Ant8723AA2DPAction(padapter);
12347 pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
12352 RTPRINT(FBT, BT_TRACE, ("[BTCoex] Get bt info by fw!!\n"));
12353 //msg shows c2h rsp for bt_info is received or not.
12354 if (pHalData->bt_coexist.halCoex8723.bC2hBtInfoReqSent)
12356 RTPRINT(FBT, BT_TRACE, ("[BTCoex] c2h for btInfo not rcvd yet!!\n"));
12359 //btRetryCnt = pHalData->bt_coexist.halCoex8723.btRetryCnt;
12360 btInfoOriginal = pHalData->bt_coexist.halCoex8723.c2hBtInfoOriginal;
12362 if(pBtMgnt->ExtConfig.bHoldForBtOperation)
12364 RTPRINT(FBT, BT_TRACE, ("Action for BT Operation adjust!!\n"));
12367 if(pBtMgnt->ExtConfig.bHoldPeriodCnt)
12369 RTPRINT(FBT, BT_TRACE, ("Hold BT inquiry/page scan setting (cnt = %d)!!\n", pBtMgnt->ExtConfig.bHoldPeriodCnt));
12370 if(pBtMgnt->ExtConfig.bHoldPeriodCnt >= 11)
12372 pBtMgnt->ExtConfig.bHoldPeriodCnt = 0;
12373 // next time the coexist parameters should be reset again.
12376 pBtMgnt->ExtConfig.bHoldPeriodCnt++;
12380 if(pBtDbg->dbgCtrl)
12382 RTPRINT(FBT, BT_TRACE, ("[Dbg control], "));
12384 if (btdm_Is2Ant8723ACommonAction(padapter))
12386 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant common.\n"));
12387 pBtdm8723->bResetTdmaAdjust = _TRUE;
12391 if(pBtdm8723->curAlgorithm != pBtdm8723->preAlgorithm)
12393 RTPRINT(FBT, BT_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", pBtdm8723->preAlgorithm, pBtdm8723->curAlgorithm));
12394 pBtdm8723->bResetTdmaAdjust = _TRUE;
12396 switch(pBtdm8723->curAlgorithm)
12398 case BT_2ANT_COEX_ALGO_SCO:
12399 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = SCO.\n"));
12400 btdm_2Ant8723ASCOAction(padapter);
12402 case BT_2ANT_COEX_ALGO_HID:
12403 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID.\n"));
12404 btdm_2Ant8723AHIDAction(padapter);
12406 case BT_2ANT_COEX_ALGO_A2DP:
12407 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = A2DP.\n"));
12408 btdm_2Ant8723AA2dp(padapter);
12410 case BT_2ANT_COEX_ALGO_PANEDR:
12411 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR).\n"));
12412 btdm_2Ant8723APANEDRAction(padapter);
12414 case BT_2ANT_COEX_ALGO_PANHS:
12415 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HS mode.\n"));
12416 btdm_2Ant8723APANHSAction(padapter);
12418 case BT_2ANT_COEX_ALGO_PANEDR_A2DP:
12419 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN+A2DP.\n"));
12420 btdm_2Ant8723APANEDRA2DPAction(padapter);
12422 case BT_2ANT_COEX_ALGO_PANEDR_HID:
12423 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
12424 btdm_2Ant8723APANEDRHIDAction(padapter);
12426 case BT_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
12427 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
12428 btdm_2Ant8723AHIDA2DPPANEDRAction(padapter);
12430 case BT_2ANT_COEX_ALGO_HID_A2DP:
12431 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = HID+A2DP.\n"));
12432 btdm_2Ant8723AHIDA2DPAction(padapter);
12435 RTPRINT(FBT, BT_TRACE, ("Action 2-Ant, algorithm = 0.\n"));
12436 //btdm_2Ant8723AAction0(padapter);
12437 btdm_2Ant8723AA2DPAction(padapter);
12440 pBtdm8723->preAlgorithm = pBtdm8723->curAlgorithm;
12446 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc87232Ant.c =====
12449 #ifdef __HALBTC8723_C__ // HAL/BTCoexist/HalBtc8723.c
12450 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
12452 static u8 btCoexDbgBuf[BT_TMP_BUF_SIZE];
12453 const char *const BtProfileString[]={
12460 const char *const BtSpecString[]={
12469 const char *const BtLinkRoleString[]={
12474 u8 btdm_BtWifiAntNum(PADAPTER padapter)
12476 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12477 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
12479 // RTPRINT(FBT, BT_TRACE, ("%s pHalData->bt_coexist.BluetoothCoexist =%x pHalData->EEPROMBluetoothCoexist=%x \n",
12480 // __func__,pHalData->bt_coexist.BluetoothCoexist,pHalData->EEPROMBluetoothCoexist));
12481 // RTPRINT(FBT, BT_TRACE, ("%s pHalData->bt_coexist.BT_Ant_Num =%x pHalData->EEPROMBluetoothAntNum=%x \n",
12482 // __func__,pHalData->bt_coexist.BT_Ant_Num,pHalData->EEPROMBluetoothAntNum));
12483 if (Ant_x2 == pHalData->bt_coexist.BT_Ant_Num)
12485 if (Ant_x2 == pBtCoex->TotalAntNum)
12498 void btdm_BtHwCountersMonitor(PADAPTER padapter)
12500 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12501 u32 regHPTxRx, regLPTxRx, u4Tmp;
12502 u32 regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
12506 regHPTxRx = REG_HIGH_PRIORITY_TXRX;
12507 regLPTxRx = REG_LOW_PRIORITY_TXRX;
12509 u4Tmp = rtw_read32(padapter, regHPTxRx);
12510 regHPTx = u4Tmp & bMaskLWord;
12511 regHPRx = (u4Tmp & bMaskHWord)>>16;
12513 u4Tmp = rtw_read32(padapter, regLPTxRx);
12514 regLPTx = u4Tmp & bMaskLWord;
12515 regLPRx = (u4Tmp & bMaskHWord)>>16;
12517 pHalData->bt_coexist.halCoex8723.highPriorityTx = regHPTx;
12518 pHalData->bt_coexist.halCoex8723.highPriorityRx = regHPRx;
12519 pHalData->bt_coexist.halCoex8723.lowPriorityTx = regLPTx;
12520 pHalData->bt_coexist.halCoex8723.lowPriorityRx = regLPRx;
12522 RTPRINT(FBT, BT_TRACE, ("High Priority Tx/Rx= %d / %d\n", regHPTx, regHPRx));
12523 RTPRINT(FBT, BT_TRACE, ("Low Priority Tx/Rx= %d / %d\n", regLPTx, regLPRx));
12526 //u1Tmp = rtw_read8(padapter, 0x76e);
12527 //DbgPrint("read 2 back 0x76e= 0x%x\n", u1Tmp);
12529 rtw_write8(padapter, 0x76e, 0xc);
12532 // This function check if 8723 bt is disabled
12533 void btdm_BtEnableDisableCheck8723A(PADAPTER padapter)
12535 u8 btAlife = _TRUE;
12536 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12539 #ifdef CHECK_BT_EXIST_FROM_REG
12542 // ox68[28]=1 => BT enable; otherwise disable
12543 val8 = rtw_read8(padapter, 0x6B);
12544 if (!(val8 & BIT(4))) btAlife = _FALSE;
12548 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
12549 // RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
12553 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
12554 // RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
12557 if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0 &&
12558 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0 &&
12559 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0 &&
12560 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0)
12564 if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0xeaea &&
12565 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0xeaea &&
12566 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0xeaea &&
12567 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0xeaea)
12571 if (pHalData->bt_coexist.halCoex8723.highPriorityTx == 0xffff &&
12572 pHalData->bt_coexist.halCoex8723.highPriorityRx == 0xffff &&
12573 pHalData->bt_coexist.halCoex8723.lowPriorityTx == 0xffff &&
12574 pHalData->bt_coexist.halCoex8723.lowPriorityRx == 0xffff)
12580 pHalData->bt_coexist.btActiveZeroCnt = 0;
12581 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
12582 RTPRINT(FBT, BT_TRACE, ("8723A BT is enabled !!\n"));
12586 pHalData->bt_coexist.btActiveZeroCnt++;
12587 RTPRINT(FBT, BT_TRACE, ("8723A bt all counters=0, %d times!!\n",
12588 pHalData->bt_coexist.btActiveZeroCnt));
12589 if (pHalData->bt_coexist.btActiveZeroCnt >= 2)
12591 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
12592 RTPRINT(FBT, BT_TRACE, ("8723A BT is disabled !!\n"));
12597 if (pHalData->bt_coexist.bCurBtDisabled == _FALSE) {
12598 if (BTDM_IsWifiConnectionExist(padapter) == _TRUE)
12599 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_CONNECT);
12601 BTDM_SetFwChnlInfo(padapter, RT_MEDIA_DISCONNECT);
12604 if (pHalData->bt_coexist.bPreBtDisabled !=
12605 pHalData->bt_coexist.bCurBtDisabled)
12607 RTPRINT(FBT, BT_TRACE, ("8723A BT is from %s to %s!!\n",
12608 (pHalData->bt_coexist.bPreBtDisabled ? "disabled":"enabled"),
12609 (pHalData->bt_coexist.bCurBtDisabled ? "disabled":"enabled")));
12610 pHalData->bt_coexist.bPreBtDisabled = pHalData->bt_coexist.bCurBtDisabled;
12614 void btdm_BTCoexist8723AHandler(PADAPTER padapter)
12616 PHAL_DATA_TYPE pHalData;
12619 pHalData = GET_HAL_DATA(padapter);
12621 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
12623 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 2 Ant mechanism\n"));
12624 BTDM_2AntBtCoexist8723A(padapter);
12628 RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1 Ant mechanism\n"));
12629 BTDM_1AntBtCoexist8723A(padapter);
12632 if (!BTDM_IsSameCoexistState(padapter))
12634 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
12635 pHalData->bt_coexist.PreviousState,
12636 pHalData->bt_coexist.CurrentState));
12637 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
12639 RTPRINT(FBT, BT_TRACE, ("["));
12640 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
12641 RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
12642 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
12643 RTPRINT(FBT, BT_TRACE, ("HT20, "));
12644 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
12645 RTPRINT(FBT, BT_TRACE, ("HT40, "));
12646 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
12647 RTPRINT(FBT, BT_TRACE, ("Legacy, "));
12648 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
12649 RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
12650 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
12651 RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
12652 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
12653 RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
12654 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
12655 RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
12656 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
12657 RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
12658 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
12659 RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
12660 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
12661 RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
12662 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
12663 RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
12664 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
12665 RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
12666 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
12667 RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
12668 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
12669 RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
12670 RTPRINT(FBT, BT_TRACE, ("]\n"));
12674 //============================================================
12675 // extern function start with BTDM_
12676 //============================================================
12677 u32 BTDM_BtTxRxCounterH( PADAPTER padapter)
12679 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12682 counters = pHalData->bt_coexist.halCoex8723.highPriorityTx+
12683 pHalData->bt_coexist.halCoex8723.highPriorityRx ;
12687 u32 BTDM_BtTxRxCounterL( PADAPTER padapter )
12689 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12692 counters = pHalData->bt_coexist.halCoex8723.lowPriorityTx+
12693 pHalData->bt_coexist.halCoex8723.lowPriorityRx ;
12697 void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
12699 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
12700 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
12701 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12702 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
12703 u8 H2C_Parameter[3] ={0};
12707 if (!IS_HARDWARE_TYPE_8723A(padapter))
12711 if (RT_MEDIA_CONNECT == mstatus)
12713 H2C_Parameter[0] = 0x1; // 0: disconnected, 1:connected
12716 if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
12719 chnl = pmlmeext->cur_channel;
12720 if (BTDM_IsHT40(padapter))
12722 if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)
12726 else if (pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)
12731 H2C_Parameter[1] = chnl;
12732 // 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 ));
12734 else // check if HS link is exists
12737 if (BT_Operation(padapter))
12738 H2C_Parameter[1] = pBtMgnt->BTChannel;
12740 H2C_Parameter[1] = pmlmeext->cur_channel;
12743 if (BTDM_IsHT40(padapter))
12745 H2C_Parameter[2] = 0x30;
12749 H2C_Parameter[2] = 0x20;
12752 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x19=0x%x\n",
12753 // H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
12755 FillH2CCmd(padapter, 0x19, 3, H2C_Parameter);
12758 u8 BTDM_IsWifiConnectionExist(PADAPTER padapter)
12763 if (BTHCI_HsConnectionEstablished(padapter))
12766 if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
12781 u8 H2C_Parameter[5] = {0};
12783 if (BTDM_1Ant8723A(padapter) == _TRUE)
12785 if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) &&
12786 (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) // for softap mode
12788 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12789 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
12790 u8 BtState = pBtCoex->c2hBtInfo;
12792 if ((BtState != BT_INFO_STATE_NO_CONNECTION) &&
12793 (BtState != BT_INFO_STATE_CONNECT_IDLE))
12795 if (byte1 & BIT(4))
12802 if (byte5 & BIT(6))
12810 H2C_Parameter[0] = byte1;
12811 H2C_Parameter[1] = byte2;
12812 H2C_Parameter[2] = byte3;
12813 H2C_Parameter[3] = byte4;
12814 H2C_Parameter[4] = byte5;
12816 RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x3a(5bytes)=0x%02x%08x\n",
12818 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
12820 FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter);
12823 void BTDM_ForceBtCoexMechanism(PADAPTER padapter, u8 type)
12825 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12828 pHalData->bt_coexist.halCoex8723.bForceFwBtInfo = type;
12830 if (pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
12832 DbgPrint("cosa force bt info from wifi fw !!!\n");
12836 DbgPrint("cosa force bt coexist bt info from bt stack\n");
12840 void BTDM_QueryBtInformation(PADAPTER padapter)
12842 u8 H2C_Parameter[1] = {0};
12843 PHAL_DATA_TYPE pHalData;
12844 PBT_COEXIST_8723A pBtCoex;
12847 pHalData = GET_HAL_DATA(padapter);
12848 pBtCoex = &pHalData->bt_coexist.halCoex8723;
12850 if (BT_IsBtDisabled(padapter) == _TRUE)
12852 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
12853 pBtCoex->bC2hBtInfoReqSent = _FALSE;
12857 if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
12858 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
12860 if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
12862 RTPRINT(FBT, BT_TRACE, ("[BTCoex], didn't recv previous BtInfo report!\n"));
12866 pBtCoex->bC2hBtInfoReqSent = _TRUE;
12869 H2C_Parameter[0] |= BIT(0); // trigger
12871 // RTPRINT(FBT, BT_TRACE, ("[BTCoex], Query Bt information, write 0x38=0x%x\n",
12872 // H2C_Parameter[0]));
12874 FillH2CCmd(padapter, 0x38, 1, H2C_Parameter);
12877 void BTDM_SetSwRfRxLpfCorner(PADAPTER padapter, u8 type)
12879 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12881 if (BT_RF_RX_LPF_CORNER_SHRINK == type)
12883 //Shrink RF Rx LPF corner
12884 RTPRINT(FBT, BT_TRACE, ("Shrink RF Rx LPF corner!!\n"));
12885 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, 0xf0ff7);
12886 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
12888 else if (BT_RF_RX_LPF_CORNER_RESUME == type)
12890 //Resume RF Rx LPF corner
12891 RTPRINT(FBT, BT_TRACE, ("Resume RF Rx LPF corner!!\n"));
12892 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, pHalData->bt_coexist.BtRfRegOrigin1E);
12897 BTDM_SetSwPenaltyTxRateAdaptive(
12902 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12905 tmpU1 = rtw_read8(padapter, 0x4fd);
12907 if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == raType)
12909 // RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set low penalty!!\n"));
12911 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
12913 else if (BT_TX_RATE_ADAPTIVE_NORMAL == raType)
12915 // RTPRINT(FBT, BT_TRACE, ("Tx rate adaptive, set normal!!\n"));
12919 rtw_write8(padapter, 0x4fd, tmpU1);
12922 void BTDM_SetFwDecBtPwr(PADAPTER padapter, u8 bDecBtPwr)
12924 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12925 u8 H2C_Parameter[1] = {0};
12928 H2C_Parameter[0] = 0;
12932 H2C_Parameter[0] |= BIT(1);
12933 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
12936 RTPRINT(FBT, BT_TRACE, ("[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
12937 (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));
12939 FillH2CCmd(padapter, 0x21, 1, H2C_Parameter);
12942 u8 BTDM_BtProfileSupport(PADAPTER padapter)
12945 PBT30Info pBTInfo = GET_BT_INFO(padapter);
12946 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
12947 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12950 if (pBtMgnt->bSupportProfile &&
12951 !pHalData->bt_coexist.halCoex8723.bForceFwBtInfo)
12959 void BTDM_AdjustForBtOperation8723A(PADAPTER padapter)
12961 //BTDM_2AntAdjustForBtOperation8723(padapter);
12964 void BTDM_FwC2hBtRssi8723A(PADAPTER padapter, u8 *tmpBuf)
12966 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
12967 u8 percent=0, u1tmp=0;
12970 percent = u1tmp*2+10;
12972 pHalData->bt_coexist.halCoex8723.btRssi = percent;
12973 // RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT RSSI=%d\n", percent));
12976 void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length)
12978 PHAL_DATA_TYPE pHalData;
12981 PBT_COEXIST_8723A pBtCoex;
12985 pHalData = GET_HAL_DATA(padapter);
12986 pBTInfo = GET_BT_INFO(padapter);
12987 pBtMgnt = &pBTInfo->BtMgnt;
12988 pBtCoex = &pHalData->bt_coexist.halCoex8723;
12990 pBtCoex->bC2hBtInfoReqSent = _FALSE;
12992 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT info[%d]=[", length));
12994 pBtCoex->btRetryCnt = 0;
12995 for (i=0; i<length; i++)
13000 pBtCoex->c2hBtInfoOriginal = tmpBuf[i];
13003 pBtCoex->btRetryCnt = tmpBuf[i];
13006 BTDM_FwC2hBtRssi8723A(padapter, &tmpBuf[i]);
13009 pBtCoex->btInfoExt=tmpBuf[i]&BIT(0);
13015 RTPRINT(FBT, BT_TRACE, ("0x%02x]\n", tmpBuf[i]));
13019 RTPRINT(FBT, BT_TRACE, ("0x%02x, ", tmpBuf[i]));
13022 RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT RSSI=%d\n", pBtCoex->btRssi));
13023 if (pBtCoex->btInfoExt)
13024 RTPRINT(FBT, BT_TRACE, ("[BTC2H], pBtCoex->btInfoExt=%x\n", pBtCoex->btInfoExt));
13026 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13027 BTDM_1AntFwC2hBtInfo8723A(padapter);
13029 BTDM_2AntFwC2hBtInfo8723A(padapter);
13031 if (pBtMgnt->ExtConfig.bManualControl)
13033 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
13037 btdm_BTCoexist8723AHandler(padapter);
13040 void BTDM_Display8723ABtCoexInfo(PADAPTER padapter)
13042 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13043 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
13044 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13045 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13046 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
13047 u8 u1Tmp, u1Tmp1, u1Tmp2, i, btInfoExt, psTdmaCase=0;
13051 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
13052 DCMD_Printf(btCoexDbgBuf);
13054 if (!pHalData->bt_coexist.BluetoothCoexist)
13056 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
13057 DCMD_Printf(btCoexDbgBuf);
13061 antNum = btdm_BtWifiAntNum(padapter);
13062 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/%d ", "Ant mechanism PG/Now run :", \
13063 ((pHalData->bt_coexist.BT_Ant_Num==Ant_x2)? 2:1), ((antNum==Ant_x2)? 2:1));
13064 DCMD_Printf(btCoexDbgBuf);
13066 if (pBtMgnt->ExtConfig.bManualControl)
13068 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");
13069 DCMD_Printf(btCoexDbgBuf);
13073 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
13074 ((pBtMgnt->bSupportProfile)? "Yes":"No"), pBtMgnt->ExtConfig.HCIExtensionVer);
13075 DCMD_Printf(btCoexDbgBuf);
13078 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = / %d", "Dot11 channel / BT channel", \
13079 pBtMgnt->BTChannel);
13080 DCMD_Printf(btCoexDbgBuf);
13082 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d", "Wifi/BT/HS rssi", \
13083 BTDM_GetRxSS(padapter),
13084 pHalData->bt_coexist.halCoex8723.btRssi,
13085 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB);
13086 DCMD_Printf(btCoexDbgBuf);
13088 if(!pBtMgnt->ExtConfig.bManualControl)
13090 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s ", "WIfi status", \
13091 ((BTDM_Legacy(padapter))? "Legacy": (((BTDM_IsHT40(padapter))? "HT40":"HT20"))),
13092 ((!BTDM_IsWifiBusy(padapter))? "idle": ((BTDM_IsWifiUplink(padapter))? "uplink":"downlink")));
13093 DCMD_Printf(btCoexDbgBuf);
13095 if(pBtMgnt->bSupportProfile)
13097 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
13098 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_SCO))? 1: 0),
13099 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_HID))? 1: 0),
13100 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_PAN))? 1: 0),
13101 ((BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP))? 1: 0) );
13102 DCMD_Printf(btCoexDbgBuf);
13104 for (i=0; i<pBtMgnt->ExtConfig.NumberOfHandle; i++)
13106 if (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
13108 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", "Bt link type/spec/role", \
13109 BtProfileString[pBtMgnt->ExtConfig.linkInfo[i].BTProfile],
13110 BtSpecString[pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec],
13111 BtLinkRoleString[pBtMgnt->ExtConfig.linkInfo[i].linkRole]);
13112 DCMD_Printf(btCoexDbgBuf);
13114 btInfoExt = pHalData->bt_coexist.halCoex8723.btInfoExt;
13115 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "A2DP rate", \
13116 (btInfoExt&BIT0)? "Basic rate":"EDR rate");
13117 DCMD_Printf(btCoexDbgBuf);
13121 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s", "Bt link type/spec", \
13122 BtProfileString[pBtMgnt->ExtConfig.linkInfo[i].BTProfile],
13123 BtSpecString[pBtMgnt->ExtConfig.linkInfo[i].BTCoreSpec]);
13124 DCMD_Printf(btCoexDbgBuf);
13131 if (!pBtMgnt->ExtConfig.bManualControl)
13133 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw BT Coex mechanism]============");
13134 DCMD_Printf(btCoexDbgBuf);
13135 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "AGC Table", \
13136 pBtCoex->btdm2Ant.bCurAgcTableEn);
13137 DCMD_Printf(btCoexDbgBuf);
13138 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "ADC Backoff", \
13139 pBtCoex->btdm2Ant.bCurAdcBackOff);
13140 DCMD_Printf(btCoexDbgBuf);
13141 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "Low penalty RA", \
13142 pBtCoex->btdm2Ant.bCurLowPenaltyRa);
13143 DCMD_Printf(btCoexDbgBuf);
13144 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "RF Rx LPF Shrink", \
13145 pBtCoex->btdm2Ant.bCurRfRxLpfShrink);
13146 DCMD_Printf(btCoexDbgBuf);
13148 u4Tmp[0] = PHY_QueryRFReg(padapter, PathA, 0x1e, 0xff0);
13149 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "RF-A, 0x1e[11:4]/original val", \
13150 u4Tmp[0], pHalData->bt_coexist.BtRfRegOrigin1E);
13151 DCMD_Printf(btCoexDbgBuf);
13154 if (!pBtMgnt->ExtConfig.bManualControl)
13156 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw BT Coex mechanism]============");
13157 DCMD_Printf(btCoexDbgBuf);
13159 if (!pBtMgnt->ExtConfig.bManualControl)
13161 if(btdm_BtWifiAntNum(padapter) == Ant_x1)
13162 psTdmaCase = pHalData->bt_coexist.halCoex8723.btdm1Ant.curPsTdma;
13164 psTdmaCase = pHalData->bt_coexist.halCoex8723.btdm2Ant.curPsTdma;
13165 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA(0x3a)", \
13166 pHalData->bt_coexist.fw3aVal[0], pHalData->bt_coexist.fw3aVal[1],
13167 pHalData->bt_coexist.fw3aVal[2], pHalData->bt_coexist.fw3aVal[3],
13168 pHalData->bt_coexist.fw3aVal[4], psTdmaCase);
13169 DCMD_Printf(btCoexDbgBuf);
13171 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "Decrease Bt Power", \
13172 pBtCoex->btdm2Ant.bCurDecBtPwr);
13173 DCMD_Printf(btCoexDbgBuf);
13175 u1Tmp = rtw_read8(padapter, 0x778);
13176 u1Tmp1 = rtw_read8(padapter, 0x783);
13177 u1Tmp2 = rtw_read8(padapter, 0x796);
13178 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x778/ 0x783/ 0x796", \
13179 u1Tmp, u1Tmp1, u1Tmp2);
13180 DCMD_Printf(btCoexDbgBuf);
13182 if (!pBtMgnt->ExtConfig.bManualControl)
13184 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "Sw DacSwing Ctrl/Val", \
13185 pBtCoex->btdm2Ant.bCurDacSwingOn, pBtCoex->btdm2Ant.curDacSwingLvl);
13186 DCMD_Printf(btCoexDbgBuf);
13188 u4Tmp[0] = rtw_read32(padapter, 0x880);
13189 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x880", \
13191 DCMD_Printf(btCoexDbgBuf);
13194 if (!pBtMgnt->ExtConfig.bManualControl)
13196 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw BT Coex mechanism]============");
13197 DCMD_Printf(btCoexDbgBuf);
13200 u1Tmp = rtw_read8(padapter, 0x40);
13201 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x40", \
13203 DCMD_Printf(btCoexDbgBuf);
13205 u4Tmp[0] = rtw_read32(padapter, 0x550);
13206 u1Tmp = rtw_read8(padapter, 0x522);
13207 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x", "0x550(bcn contrl)/0x522", \
13209 DCMD_Printf(btCoexDbgBuf);
13211 u4Tmp[0] = rtw_read32(padapter, 0x484);
13212 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x484(rate adaptive)", \
13214 DCMD_Printf(btCoexDbgBuf);
13216 u4Tmp[0] = rtw_read32(padapter, 0x50);
13217 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \
13219 DCMD_Printf(btCoexDbgBuf);
13221 u4Tmp[0] = rtw_read32(padapter, 0xda0);
13222 u4Tmp[1] = rtw_read32(padapter, 0xda4);
13223 u4Tmp[2] = rtw_read32(padapter, 0xda8);
13224 u4Tmp[3] = rtw_read32(padapter, 0xdac);
13225 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0xda0/0xda4/0xda8/0xdac(FA cnt)", \
13226 u4Tmp[0], u4Tmp[1], u4Tmp[2], u4Tmp[3]);
13227 DCMD_Printf(btCoexDbgBuf);
13229 u4Tmp[0] = rtw_read32(padapter, 0x6c0);
13230 u4Tmp[1] = rtw_read32(padapter, 0x6c4);
13231 u4Tmp[2] = rtw_read32(padapter, 0x6c8);
13232 u1Tmp = rtw_read8(padapter, 0x6cc);
13233 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
13234 u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp);
13235 DCMD_Printf(btCoexDbgBuf);
13237 //u4Tmp = rtw_read32(padapter, 0x770);
13238 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "0x770(Hi pri Rx[31:16]/Tx[15:0])", \
13239 pHalData->bt_coexist.halCoex8723.highPriorityRx,
13240 pHalData->bt_coexist.halCoex8723.highPriorityTx);
13241 DCMD_Printf(btCoexDbgBuf);
13242 //u4Tmp = rtw_read32(padapter, 0x774);
13243 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "0x774(Lo pri Rx[31:16]/Tx[15:0])", \
13244 pHalData->bt_coexist.halCoex8723.lowPriorityRx,
13245 pHalData->bt_coexist.halCoex8723.lowPriorityTx);
13246 DCMD_Printf(btCoexDbgBuf);
13248 // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang
13249 u1Tmp = rtw_read8(padapter, 0x41b);
13250 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (hang chk == 0xf)", \
13252 DCMD_Printf(btCoexDbgBuf);
13253 rsprintf(btCoexDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
13254 pHalData->LastHMEBoxNum);
13255 DCMD_Printf(btCoexDbgBuf);
13258 void BTDM_8723ASignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
13260 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13261 BTDM_1AntSignalCompensation(padapter, rssi_wifi, rssi_bt);
13264 void BTDM_8723AInit(PADAPTER padapter)
13266 if (IS_HARDWARE_TYPE_8723A(padapter))
13268 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13269 BTDM_2AntParaInit(padapter);
13271 BTDM_1AntParaInit(padapter);
13275 void BTDM_HWCoexAllOff8723A(PADAPTER padapter)
13277 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13278 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13280 if (pBtMgnt->ExtConfig.bManualControl)
13283 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13284 BTDM_2AntHwCoexAllOff8723A(padapter);
13287 void BTDM_FWCoexAllOff8723A(PADAPTER padapter)
13289 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13290 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13292 if (pBtMgnt->ExtConfig.bManualControl)
13295 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13296 BTDM_2AntFwCoexAllOff8723A(padapter);
13299 void BTDM_SWCoexAllOff8723A(PADAPTER padapter)
13301 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13302 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13304 if (pBtMgnt->ExtConfig.bManualControl)
13307 if (btdm_BtWifiAntNum(padapter) == Ant_x2)
13308 BTDM_2AntSwCoexAllOff8723A(padapter);
13312 BTDM_Set8723ABtCoexCurrAntNum(
13317 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13318 PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723;
13322 pBtCoex->TotalAntNum = Ant_x1;
13324 else if (antNum == 2)
13326 pBtCoex->TotalAntNum = Ant_x2;
13330 void BTDM_LpsLeave(PADAPTER padapter)
13332 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13333 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13335 if (pBtMgnt->ExtConfig.bManualControl)
13338 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13339 BTDM_1AntLpsLeave(padapter);
13342 void BTDM_ForHalt8723A(PADAPTER padapter)
13344 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13345 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13347 if (pBtMgnt->ExtConfig.bManualControl)
13350 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13351 BTDM_1AntForHalt(padapter);
13354 void BTDM_WifiScanNotify8723A(PADAPTER padapter, u8 scanType)
13356 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13357 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13359 if (pBtMgnt->ExtConfig.bManualControl)
13362 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13363 BTDM_1AntWifiScanNotify(padapter, scanType);
13366 void BTDM_WifiAssociateNotify8723A(PADAPTER padapter, u8 action)
13368 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13369 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13371 if (pBtMgnt->ExtConfig.bManualControl)
13374 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13375 BTDM_1AntWifiAssociateNotify(padapter, action);
13378 void BTDM_MediaStatusNotify8723A(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
13380 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13381 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13384 RTPRINT(FBT, BT_TRACE, ("[BTCoex], MediaStatusNotify, %s\n", mstatus?"connect":"disconnect"));
13386 BTDM_SetFwChnlInfo(padapter, mstatus);
13388 if (pBtMgnt->ExtConfig.bManualControl)
13391 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13392 BTDM_1AntMediaStatusNotify(padapter, mstatus);
13395 void BTDM_ForDhcp8723A(PADAPTER padapter)
13397 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13398 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13400 if (pBtMgnt->ExtConfig.bManualControl)
13403 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13404 BTDM_1AntForDhcp(padapter);
13407 u8 BTDM_1Ant8723A(PADAPTER padapter)
13409 if (btdm_BtWifiAntNum(padapter) == Ant_x1)
13415 void BTDM_BTCoexist8723A(PADAPTER padapter)
13417 PHAL_DATA_TYPE pHalData;
13420 PBT_COEXIST_8723A pBtCoex;
13423 pHalData = GET_HAL_DATA(padapter);
13424 pBTInfo = GET_BT_INFO(padapter);
13425 pBtMgnt = &pBTInfo->BtMgnt;
13426 pBtCoex = &pHalData->bt_coexist.halCoex8723;
13428 RTPRINT(FBT, BT_TRACE, ("[BTCoex], beacon RSSI=0x%x(%d)\n",
13429 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB,
13430 pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB));
13432 btdm_BtHwCountersMonitor(padapter);
13433 btdm_BtEnableDisableCheck8723A(padapter);
13435 if (pBtMgnt->ExtConfig.bManualControl)
13437 RTPRINT(FBT, BT_TRACE, ("%s: Action Manual control!!\n", __FUNCTION__));
13441 if (pBtCoex->bC2hBtInfoReqSent == _TRUE)
13443 if (BT_IsBtDisabled(padapter) == _TRUE)
13445 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
13449 if (pBtCoex->c2hBtInfo == BT_INFO_STATE_DISABLED)
13450 pBtCoex->c2hBtInfo = BT_INFO_STATE_NO_CONNECTION;
13453 btdm_BTCoexist8723AHandler(padapter);
13455 else if (BT_IsBtDisabled(padapter) == _TRUE)
13457 pBtCoex->c2hBtInfo = BT_INFO_STATE_DISABLED;
13458 btdm_BTCoexist8723AHandler(padapter);
13461 BTDM_QueryBtInformation(padapter);
13464 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.c =====
13467 #ifdef __HALBTCCSR1ANT_C__ // HAL/BTCoexist/HalBtcCsr1Ant.c
13468 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
13470 //============================================================
13471 // local function start with btdm_
13472 //============================================================
13473 void btdm_WriteReg860(PADAPTER padapter, u16 value)
13475 RTPRINT(FBT, BT_TRACE, ("btdm_WriteReg860(), value = 0x%x\n", value));
13476 PHY_SetBBReg(padapter, 0x860, bMaskLWord, value);
13479 void btdm_CheckCounterOnly1Ant(PADAPTER padapter)
13481 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13482 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
13483 u32 BT_Polling, Ratio_Act, Ratio_STA;
13484 u32 BT_Active, BT_State;
13485 u32 regBTActive = 0, regBTState = 0, regBTPolling=0;
13487 if (!pHalData->bt_coexist.BluetoothCoexist)
13489 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
13491 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
13495 // The following we only consider CSR BC8 and fw version should be >= 62
13497 RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
13498 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
13500 regBTActive = REG_BT_ACTIVE;
13501 regBTState = REG_BT_STATE;
13502 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
13503 regBTPolling = REG_BT_POLLING1;
13505 regBTPolling = REG_BT_POLLING;
13508 BT_Active = rtw_read32(padapter, regBTActive);
13509 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
13510 BT_Active = BT_Active & 0x00ffffff;
13512 BT_State = rtw_read32(padapter, regBTState);
13513 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_State(0x%x)=%x\n", regBTState, BT_State));
13514 BT_State = BT_State & 0x00ffffff;
13516 BT_Polling = rtw_read32(padapter, regBTPolling);
13517 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
13519 Ratio_Act = BT_Active*1000/BT_Polling;
13520 Ratio_STA = BT_State*1000/BT_Polling;
13522 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_Act=%d\n", Ratio_Act));
13523 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_STA=%d\n", Ratio_STA));
13534 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13537 if ((pHalData->bt_coexist.bInterruptOn == bInterruptOn) &&
13538 (pHalData->bt_coexist.bSingleAntOn == bSingleAntOn) &&
13539 (pHalData->bt_coexist.bMultiNAVOn == bMultiNAVOn))
13544 RTPRINT(FBT, BT_TRACE, ("[DM][BT], current SingleAntenna = [%s:%s:%s]\n",
13545 pHalData->bt_coexist.bSingleAntOn?"ON":"OFF",
13546 pHalData->bt_coexist.bInterruptOn?"ON":"OFF",
13547 pHalData->bt_coexist.bMultiNAVOn?"ON":"OFF"));
13552 u8 btdm_IsBalance(PADAPTER padapter, u8 bBalanceOn)
13554 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13556 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_IsBalance(), bBalanceOn=%s\n",
13557 bBalanceOn?"ON":"OFF"));
13559 if (pHalData->bt_coexist.bBalanceOn == bBalanceOn)
13566 u8 btdm_EarphoneSpecDetect(PADAPTER padapter)
13568 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13570 switch (pHalData->bt_coexist.A2DPState)
13572 case BT_A2DP_STATE_NOT_ENTERED:
13574 RTPRINT(FBT, BT_TRACE, (" set default balance = ON, for WLANActH=12, WLANActL=24!!\n"));
13575 pHalData->bt_coexist.PreWLANActH = 12;
13576 pHalData->bt_coexist.PreWLANActL = 24;
13577 pHalData->bt_coexist.WLANActH = 12;
13578 pHalData->bt_coexist.WLANActL = 24;
13579 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
13580 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13581 pHalData->bt_coexist.A2DPState = BT_A2DP_STATE_DETECTING;
13585 case BT_A2DP_STATE_DETECTING:
13587 // 32,12; the most critical for BT
13590 if (btdm_IsSingleAnt(padapter, _TRUE, _FALSE, _FALSE))
13592 if ((pHalData->bt_coexist.PreWLANActH == 0) &&
13593 (pHalData->bt_coexist.PreWLANActL == 0))
13595 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [0,0]\n"));
13596 pHalData->bt_coexist.WLANActH = 12;
13597 pHalData->bt_coexist.WLANActL = 24;
13599 else if ((pHalData->bt_coexist.PreWLANActH == 12) &&
13600 (pHalData->bt_coexist.PreWLANActL == 24))
13602 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [12,24]\n"));
13603 if (((pHalData->bt_coexist.Ratio_Tx>600) &&
13604 (pHalData->bt_coexist.Ratio_PRI>500)) ||
13605 ((pHalData->bt_coexist.Ratio_Tx*10 ) >
13606 (pHalData->bt_coexist.Ratio_PRI*15)))
13608 RTPRINT(FBT, BT_TRACE, ("Ratio_Act > 600 && Ratio_STA > 500 or "));
13609 RTPRINT(FBT, BT_TRACE, ("Ratio_Act/Ratio_STA > 1.5\n"));
13610 pHalData->bt_coexist.WLANActH = 12;
13611 pHalData->bt_coexist.WLANActL = 24;
13615 RTPRINT(FBT, BT_TRACE, (" cosa set to 32/12\n "));
13616 pHalData->bt_coexist.WLANActH = 32;
13617 pHalData->bt_coexist.WLANActL = 12;
13620 else if ((pHalData->bt_coexist.PreWLANActH == 32) &&
13621 (pHalData->bt_coexist.PreWLANActL == 12))
13623 RTPRINT(FBT, BT_TRACE, ("[WLANActH, WLANActL] = [32,12]\n"));
13624 if (((pHalData->bt_coexist.Ratio_Tx>650) &&
13625 (pHalData->bt_coexist.Ratio_PRI>550)) ||
13626 ((pHalData->bt_coexist.Ratio_Tx*10 ) >
13627 (pHalData->bt_coexist.Ratio_PRI*15)))
13629 RTPRINT(FBT, BT_TRACE, ("Ratio_Act > 650 && Ratio_STA > 550 or "));
13630 RTPRINT(FBT, BT_TRACE, ("Ratio_Act/Ratio_STA > 1.5\n"));
13631 pHalData->bt_coexist.WLANActH = 12;
13632 pHalData->bt_coexist.WLANActL = 24;
13635 if ((pHalData->bt_coexist.PreWLANActH != pHalData->bt_coexist.WLANActH) ||
13636 (pHalData->bt_coexist.PreWLANActL != pHalData->bt_coexist.WLANActL))
13638 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
13639 pHalData->bt_coexist.PreWLANActH = pHalData->bt_coexist.WLANActH;
13640 pHalData->bt_coexist.PreWLANActL = pHalData->bt_coexist.WLANActL;
13644 RTPRINT(FBT, BT_TRACE, ("earphone detected result: WLANActH=%d, WLANActL=%d\n",
13645 pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL));
13649 case BT_A2DP_STATE_DETECTED:
13653 RT_ASSERT(_FALSE, ("btdm_EarphoneSpecDetect(), unknown case\n"));
13659 //==============================================================
13662 // In the following, FW should be done before SW mechanism.
13664 //==============================================================
13666 void btdm_SCOActionBC81Ant(PADAPTER padapter)
13668 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
13669 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
13672 if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
13673 !(pmlmepriv->LinkDetectInfo.bBusyTraffic))
13675 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink or Wifi is idle\n"));
13676 if (BTDM_IsSameCoexistState(padapter))
13678 BTDM_Balance(padapter, _FALSE, 0, 0);
13679 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
13681 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
13683 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
13685 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
13687 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
13688 if (BTDM_IsSameCoexistState(padapter))
13690 if ((btRssiState == BT_RSSI_STATE_LOW) ||
13691 (btRssiState == BT_RSSI_STATE_STAY_LOW))
13693 BTDM_Balance(padapter, _FALSE, 0, 0);
13694 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
13699 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
13700 if (BTDM_IsSameCoexistState(padapter))
13702 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
13703 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
13705 BTDM_Balance(padapter, _FALSE, 0, 0);
13706 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
13710 BTDM_Balance(padapter, _FALSE, 0, 0);
13711 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
13717 u8 btdm_SCOAction1Ant(PADAPTER padapter)
13719 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13720 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13721 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13723 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
13725 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
13726 btdm_SCOActionBC81Ant(padapter);
13731 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
13736 void btdm_HIDActionBC81Ant(PADAPTER padapter)
13738 BTDM_Balance(padapter, _FALSE, 0, 0);
13739 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
13742 u8 btdm_HIDAction1Ant(PADAPTER padapter)
13744 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
13745 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13746 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13748 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
13750 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
13751 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
13752 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
13753 btdm_HIDActionBC81Ant(padapter);
13762 void btdm_A2DPActionBC81Ant(PADAPTER padapter)
13764 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13765 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13766 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13769 if (pBtMgnt->ExtConfig.bBTBusy)
13771 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
13773 // We have to detect BT earphone spec first.
13774 btdm_EarphoneSpecDetect(padapter);
13776 if (!BTDM_IsHT40(padapter))
13778 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
13779 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
13781 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_30, 0);
13782 if (BTDM_IsSameCoexistState(padapter))
13785 if ((btRssiState == BT_RSSI_STATE_LOW) ||
13786 (btRssiState == BT_RSSI_STATE_STAY_LOW))
13788 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
13789 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13794 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_55, 0);
13795 if (BTDM_IsSameCoexistState(padapter))
13798 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
13799 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
13801 BTDM_Balance(padapter, _FALSE, 0, 0);
13802 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
13806 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
13807 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13813 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
13814 if (BTDM_IsSameCoexistState(padapter))
13816 BTDM_Balance(padapter, _TRUE, pHalData->bt_coexist.WLANActH, pHalData->bt_coexist.WLANActL);
13817 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13822 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
13823 pHalData->bt_coexist.A2DPState = BT_A2DP_STATE_NOT_ENTERED;
13824 if (pHalData->bt_coexist.Ratio_PRI > 3)
13826 RTPRINT(FBT, BT_TRACE, ("Ratio_STA > 3\n"));
13827 BTDM_Balance(padapter, _FALSE, 0, 0);
13828 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
13832 RTPRINT(FBT, BT_TRACE, ("Ratio_STA <= 3\n"));
13833 BTDM_Balance(padapter, _TRUE, 32, 5);
13834 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13839 u8 btdm_A2DPAction1Ant(PADAPTER padapter)
13841 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13842 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
13843 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13845 if (BTHCI_CheckProfileExist(padapter, BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
13847 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
13848 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
13849 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
13850 btdm_A2DPActionBC81Ant(padapter);
13859 void btdm_PANActionBC81Ant(PADAPTER padapter)
13861 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
13862 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
13863 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
13864 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13865 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13868 if (pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn)
13870 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
13872 if (!BTDM_IsHT40(padapter))
13874 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
13875 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
13877 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
13878 if (BTDM_IsSameCoexistState(padapter))
13881 if ((btRssiState == BT_RSSI_STATE_LOW) ||
13882 (btRssiState == BT_RSSI_STATE_STAY_LOW))
13884 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
13885 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13890 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_50, 0);
13891 if (BTDM_IsSameCoexistState(padapter))
13893 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
13894 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
13896 BTDM_Balance(padapter, _FALSE, 0, 0);
13897 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
13901 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
13902 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13908 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
13909 if ((pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic) &&
13910 (pmlmepriv->LinkDetectInfo.bTxBusyTraffic))
13912 RTPRINT(FBT, BT_TRACE, ("BT is Downlink and Wifi is Uplink\n"));
13913 if (btdm_IsSingleAnt(padapter, _FALSE, _FALSE, _FALSE))
13915 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
13916 if (BTDM_IsSameCoexistState(padapter))
13918 if ((btRssiState == BT_RSSI_STATE_LOW) ||
13919 (btRssiState == BT_RSSI_STATE_STAY_LOW))
13921 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
13922 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13927 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
13928 if (BTDM_IsSameCoexistState(padapter))
13930 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
13931 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
13933 BTDM_Balance(padapter, _FALSE, 0, 0);
13934 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
13938 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
13939 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13945 RTPRINT(FBT, BT_TRACE, ("BT Uplink or BTdownlink+Wifi downlink\n"));
13946 BTDM_Balance(padapter, _TRUE, 0x1c, 0x20);
13947 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13951 else if (pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn)
13953 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
13954 BTDM_FWCoexAllOff(padapter);
13958 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
13959 BTDM_Balance(padapter, _TRUE, 32, 5);
13960 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13964 u8 btdm_PANAction1Ant(PADAPTER padapter)
13966 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
13967 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13968 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13970 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
13972 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
13973 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
13974 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
13975 btdm_PANActionBC81Ant(padapter);
13984 void btdm_HIDA2DPActionBC81Ant(PADAPTER padapter)
13986 PBT30Info pBTInfo = GET_BT_INFO(padapter);
13987 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
13989 if (pBtMgnt->ExtConfig.bBTBusy)
13991 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
13992 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
13993 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
13997 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
13998 BTDM_Balance(padapter, _FALSE, 0, 0);
13999 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14003 u8 btdm_HIDA2DPAction1Ant(PADAPTER padapter)
14005 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14007 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14009 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14010 btdm_HIDA2DPActionBC81Ant(padapter);
14015 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
14020 void btdm_HIDPANActionBC81Ant(PADAPTER padapter)
14022 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14023 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14025 if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
14027 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14028 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14029 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14033 RTPRINT(FBT, BT_TRACE, ("BT is idle or [BT 3.0]\n"));
14034 BTDM_Balance(padapter, _FALSE, 0, 0);
14035 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14039 u8 btdm_HIDPANAction1Ant(PADAPTER padapter)
14041 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14043 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
14045 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14046 btdm_HIDPANActionBC81Ant(padapter);
14051 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
14056 void btdm_PANA2DPActionBC81Ant(PADAPTER padapter)
14058 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14059 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14061 if ((pBtMgnt->ExtConfig.bBTBusy && !pBtMgnt->BtOperationOn))
14063 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 2.1]\n"));
14064 BTDM_Balance(padapter, _TRUE, 0x5, 0x1a);
14065 BTDM_SingleAnt(padapter, _TRUE, _FALSE, _FALSE);
14067 else if ((pBtMgnt->ExtConfig.bBTBusy && pBtMgnt->BtOperationOn))
14069 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && [BT 3.0]\n"));
14070 btdm_A2DPActionBC81Ant(padapter);
14074 BTDM_Balance(padapter, _FALSE, 0, 0);
14075 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14079 u8 btdm_PANA2DPAction1Ant(PADAPTER padapter)
14081 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14083 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
14085 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14086 btdm_PANA2DPActionBC81Ant(padapter);
14091 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
14096 //============================================================
14097 // extern function start with BTDM_
14098 //============================================================
14100 void BTDM_SetAntenna(PADAPTER padapter, u8 who)
14102 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14103 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14104 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14106 if (!IS_HARDWARE_TYPE_8192C(padapter))
14108 if (!pHalData->bt_coexist.BluetoothCoexist)
14110 if (pBtMgnt->ExtConfig.bManualControl)
14112 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14114 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14116 // if (pHalData->bt_coexist.AntennaState == who)
14121 case BTDM_ANT_BT_IDLE:
14122 RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_BT_IDLE\n"));
14123 BTDM_Balance(padapter, _FALSE, 0, 0);
14124 BTDM_SingleAnt(padapter, _TRUE, _TRUE, _FALSE);
14125 pHalData->bt_coexist.AntennaState = BTDM_ANT_BT_IDLE;
14128 case BTDM_ANT_WIFI:
14129 RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_WIFI\n"));
14130 BTDM_Balance(padapter, _FALSE, 0, 0);
14131 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14132 rtw_mdelay_os(3); // 1 will fail, 2 ok
14133 btdm_WriteReg860(padapter, 0x130);
14134 pHalData->bt_coexist.AntennaState = BTDM_ANT_WIFI;
14138 RTPRINT(FBT, BT_TRACE, ("BTDM_SetAntenna(), BTDM_ANT_BT\n"));
14139 BTDM_Balance(padapter, _FALSE, 0, 0);
14140 BTDM_SingleAnt(padapter, _FALSE, _FALSE, _FALSE);
14141 //btdm_WriteReg860(padapter, 0x230);
14142 pHalData->bt_coexist.AntennaState = BTDM_ANT_BT;
14146 RT_ASSERT(_FALSE, ("BTDM_SetAntenna(), error case\n"));
14159 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14160 u8 H2C_Parameter[3] = {0};
14162 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14165 H2C_Parameter[2] = 0;
14166 H2C_Parameter[1] = 0;
14167 H2C_Parameter[0] = 0;
14171 H2C_Parameter[2] |= 0x02; //BIT1
14172 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
14174 pHalData->bt_coexist.bInterruptOn = bInterruptOn;
14178 H2C_Parameter[2] |= 0x10; //BIT4
14179 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
14181 pHalData->bt_coexist.bSingleAntOn = bSingleAntOn;
14185 H2C_Parameter[2] |= 0x20; //BIT5
14186 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
14188 pHalData->bt_coexist.bMultiNAVOn = bMultiNAVOn;
14190 RTPRINT(FBT, BT_TRACE, ("[DM][BT], SingleAntenna=[%s:%s:%s], write 0xe = 0x%x\n",
14191 bSingleAntOn?"ON":"OFF", bInterruptOn?"ON":"OFF", bMultiNAVOn?"ON":"OFF",
14192 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
14194 if (IS_HARDWARE_TYPE_8192C(padapter))
14196 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
14198 else if (IS_HARDWARE_TYPE_8192D(padapter))
14200 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
14204 void BTDM_CheckBTIdleChange1Ant(PADAPTER padapter)
14206 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14207 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14208 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14209 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
14210 u8 stateChange = _FALSE;
14211 u32 BT_Polling, Ratio_Act, Ratio_STA;
14212 u32 BT_Active, BT_State;
14213 u32 regBTActive=0, regBTState=0, regBTPolling=0;
14215 if (!pHalData->bt_coexist.BluetoothCoexist)
14217 if (pBtMgnt->ExtConfig.bManualControl)
14219 if (pHalData->bt_coexist.BT_CoexistType != BT_CSR_BC8)
14221 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x1)
14225 // The following we only consider CSR BC8 and fw version should be >= 62
14227 RTPRINT(FBT, BT_TRACE, ("[DM][BT], FirmwareVersion = 0x%x(%d)\n",
14228 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
14230 regBTActive = REG_BT_ACTIVE;
14231 regBTState = REG_BT_STATE;
14232 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
14233 regBTPolling = REG_BT_POLLING1;
14235 regBTPolling = REG_BT_POLLING;
14238 BT_Active = rtw_read32(padapter, regBTActive);
14239 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
14240 BT_Active = BT_Active & 0x00ffffff;
14242 BT_State = rtw_read32(padapter, regBTState);
14243 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_State(0x%x)=%x\n", regBTState, BT_State));
14244 BT_State = BT_State & 0x00ffffff;
14246 BT_Polling = rtw_read32(padapter, regBTPolling);
14247 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
14249 if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
14251 if (BT_Polling == 0)
14254 Ratio_Act = BT_Active*1000/BT_Polling;
14255 Ratio_STA = BT_State*1000/BT_Polling;
14257 pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
14258 pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
14260 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_Act=%d\n", Ratio_Act));
14261 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Ratio_STA=%d\n", Ratio_STA));
14263 if (Ratio_STA<60 && Ratio_Act<500) // BT PAN idle
14265 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
14266 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
14267 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14271 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
14275 // Check if BT PAN (under BT 2.1) is uplink or downlink
14276 if ((Ratio_Act/Ratio_STA) < 2)
14279 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _TRUE;
14280 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_UPLINK;
14281 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _FALSE;
14282 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
14287 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
14288 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14289 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
14290 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
14296 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
14297 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14298 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
14299 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
14303 // Check BT is idle or not
14304 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
14305 pBtMgnt->ExtConfig.NumberOfSCO==0)
14307 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
14308 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
14314 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
14315 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
14319 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
14320 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
14324 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
14325 pBtMgnt->ExtConfig.NumberOfSCO==0)
14327 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
14328 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
14329 BTDM_SetAntenna(padapter, BTDM_ANT_BT_IDLE);
14333 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
14335 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_RSSI_LOW;
14336 RTPRINT(FBT, BT_TRACE, ("[DM][BT], core stack notify bt rssi Low\n"));
14340 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
14341 RTPRINT(FBT, BT_TRACE, ("[DM][BT], core stack notify bt rssi Normal\n"));
14345 if (pHalData->bt_coexist.bBTBusyTraffic !=
14346 pBtMgnt->ExtConfig.bBTBusy)
14347 { // BT idle or BT non-idle
14348 pHalData->bt_coexist.bBTBusyTraffic = pBtMgnt->ExtConfig.bBTBusy;
14349 stateChange = _TRUE;
14354 if (!pBtMgnt->ExtConfig.bBTBusy)
14356 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
14360 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is non-idle\n"));
14363 if (!pBtMgnt->ExtConfig.bBTBusy) {
14364 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT is idle or disable\n"));
14365 if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE)
14366 BTDM_SetAntenna(padapter, BTDM_ANT_WIFI);
14370 void BTDM_BTCoexistWithProfile1Ant(PADAPTER padapter)
14372 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14373 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14374 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14376 if (pBtMgnt->ExtConfig.bManualControl)
14378 btdm_CheckCounterOnly1Ant(padapter);
14382 RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
14383 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
14385 if ((pHalData->bt_coexist.BluetoothCoexist) &&
14386 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8))
14388 BTHCI_GetProfileNameMoto(padapter);
14389 BTHCI_GetBTRSSI(padapter);
14390 BTDM_CheckBTIdleChange1Ant(padapter);
14391 BTDM_CheckWiFiState(padapter);
14393 if (btdm_SCOAction1Ant(padapter))
14395 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action SCO\n"));
14397 else if (btdm_HIDAction1Ant(padapter))
14399 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID\n"));
14401 else if (btdm_A2DPAction1Ant(padapter))
14403 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action A2DP\n"));
14405 else if (btdm_PANAction1Ant(padapter))
14407 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN\n"));
14409 else if (btdm_HIDA2DPAction1Ant(padapter))
14411 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_A2DP\n"));
14413 else if (btdm_HIDPANAction1Ant(padapter))
14415 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action HID_PAN\n"));
14417 else if (btdm_PANA2DPAction1Ant(padapter))
14419 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Action PAN_A2DP\n"));
14423 RTPRINT(FBT, BT_TRACE, ("[DM][BT], No Action case!!!\n"));
14426 if (!BTDM_IsSameCoexistState(padapter))
14428 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
14429 pHalData->bt_coexist.PreviousState,
14430 pHalData->bt_coexist.CurrentState));
14431 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
14433 RTPRINT(FBT, BT_TRACE, ("["));
14434 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
14435 RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
14436 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
14437 RTPRINT(FBT, BT_TRACE, ("HT20, "));
14438 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
14439 RTPRINT(FBT, BT_TRACE, ("HT40, "));
14440 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
14441 RTPRINT(FBT, BT_TRACE, ("Legacy, "));
14442 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
14443 RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
14444 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
14445 RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
14446 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
14447 RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
14448 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
14449 RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
14450 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
14451 RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
14452 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
14453 RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
14454 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
14455 RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
14456 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_IDLE)
14457 RTPRINT(FBT, BT_TRACE, ("BT_PAN_idle, "));
14458 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_UPLINK)
14459 RTPRINT(FBT, BT_TRACE, ("BT_PAN_uplink, "));
14460 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_DOWNLINK)
14461 RTPRINT(FBT, BT_TRACE, ("BT_PAN_downlink, "));
14462 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
14463 RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
14464 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
14465 RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
14466 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
14467 RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
14468 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
14469 RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
14470 RTPRINT(FBT, BT_TRACE, ("]\n"));
14475 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr1Ant.c =====
14478 #ifdef __HALBTCCSR2ANT_C__ // HAL/BTCoexist/HalBtcCsr2Ant.c
14479 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
14481 //============================================================
14482 // local function start with btdm_
14483 //============================================================
14485 btdm_BtEnableDisableCheck(
14490 // This function check if 92D bt is disabled
14491 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14493 if (IS_HARDWARE_TYPE_8192D(padapter))
14497 pHalData->bt_coexist.btActiveZeroCnt = 0;
14498 pHalData->bt_coexist.bCurBtDisabled = _FALSE;
14499 RTPRINT(FBT, BT_TRACE, ("92D Bt is enabled !!\n"));
14503 pHalData->bt_coexist.btActiveZeroCnt++;
14504 RTPRINT(FBT, BT_TRACE, ("92D BT_Active = 0, cnt = %d!!\n",
14505 pHalData->bt_coexist.btActiveZeroCnt));
14506 if (pHalData->bt_coexist.btActiveZeroCnt >= 2)
14508 pHalData->bt_coexist.bCurBtDisabled = _TRUE;
14509 RTPRINT(FBT, BT_TRACE, ("92D Bt is disabled !!\n"));
14512 if (pHalData->bt_coexist.bPreBtDisabled !=
14513 pHalData->bt_coexist.bCurBtDisabled )
14515 RTPRINT(FBT, BT_TRACE, ("92D Bt is from %s to %s!!\n",
14516 (pHalData->bt_coexist.bPreBtDisabled ? "disabled":"enabled"),
14517 (pHalData->bt_coexist.bCurBtDisabled ? "disabled":"enabled")));
14518 pHalData->bt_coexist.bNeedToRoamForBtDisableEnable = _TRUE;
14519 pHalData->bt_coexist.bPreBtDisabled = pHalData->bt_coexist.bCurBtDisabled;
14524 void btdm_CheckBTState2Ant(PADAPTER padapter)
14526 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14527 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
14528 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14529 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14530 // PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);
14531 u8 stateChange = _FALSE;
14532 u32 BT_Polling, Ratio_Act, Ratio_STA;
14533 u32 BT_Active, BT_State;
14534 u32 regBTActive = 0, regBTState = 0, regBTPolling=0;
14535 u32 btBusyThresh = 0;
14537 RTPRINT(FBT, BT_TRACE, ("FirmwareVersion = 0x%x(%d)\n",
14538 pHalData->FirmwareVersion, pHalData->FirmwareVersion));
14540 if (IS_HARDWARE_TYPE_8192C(padapter))
14542 if (pHalData->FirmwareVersion < FW_VER_BT_REG)
14544 regBTActive = REG_BT_ACTIVE_OLD;
14545 regBTState = REG_BT_STATE_OLD;
14546 regBTPolling = REG_BT_POLLING_OLD;
14550 regBTActive = REG_BT_ACTIVE;
14551 regBTState = REG_BT_STATE;
14552 if (pHalData->FirmwareVersion >= FW_VER_BT_REG1)
14553 regBTPolling = REG_BT_POLLING1;
14555 regBTPolling = REG_BT_POLLING;
14558 else if (IS_HARDWARE_TYPE_8192D(padapter))
14560 regBTActive = REG_BT_ACTIVE;
14561 regBTState = REG_BT_STATE;
14562 regBTPolling = REG_BT_POLLING1;
14565 if (IS_HARDWARE_TYPE_8192D(padapter))
14574 BT_Active = rtw_read32(padapter, regBTActive);
14575 RTPRINT(FBT, BT_TRACE, ("BT_Active(0x%x)=%x\n", regBTActive, BT_Active));
14576 BT_Active = BT_Active & 0x00ffffff;
14578 BT_State = rtw_read32(padapter, regBTState);
14579 RTPRINT(FBT, BT_TRACE, ("BT_State(0x%x)=%x\n", regBTState, BT_State));
14580 BT_State = BT_State & 0x00ffffff;
14582 BT_Polling = rtw_read32(padapter, regBTPolling);
14583 RTPRINT(FBT, BT_TRACE, ("BT_Polling(0x%x)=%x\n", regBTPolling, BT_Polling));
14585 if (BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )
14588 // 2011/05/04 MH For Slim combo test meet a problem. Surprise remove and WLAN is running
14589 // DHCP process. At the same time, the register read value might be zero. And cause BSOD 0x7f
14590 // EXCEPTION_DIVIDED_BY_ZERO. In This case, the stack content may always be wrong due to
14595 btdm_BtEnableDisableCheck(padapter, BT_Active);
14597 Ratio_Act = BT_Active*1000/BT_Polling;
14598 Ratio_STA = BT_State*1000/BT_Polling;
14600 pHalData->bt_coexist.Ratio_Tx = Ratio_Act;
14601 pHalData->bt_coexist.Ratio_PRI = Ratio_STA;
14603 RTPRINT(FBT, BT_TRACE, ("Ratio_Act=%d\n", Ratio_Act));
14604 RTPRINT(FBT, BT_TRACE, ("Ratio_STA=%d\n", Ratio_STA));
14606 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
14608 if (Ratio_STA < 60) // BT PAN idle
14610 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
14611 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
14612 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14616 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_IDLE;
14618 // Check if BT PAN (under BT 2.1) is uplink or downlink
14619 if ((Ratio_Act/Ratio_STA) < 2)
14621 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _TRUE;
14622 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_UPLINK;
14623 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _FALSE;
14624 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
14627 { // BT PAN downlink
14628 pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic = _FALSE;
14629 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14630 pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic = _TRUE;
14631 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_DOWNLINK;
14637 // BC4, doesn't use the following variables.
14638 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_PAN_IDLE;
14639 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_DOWNLINK;
14640 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_PAN_UPLINK;
14644 // Check BT is idle or not
14645 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
14646 pBtMgnt->ExtConfig.NumberOfSCO==0)
14648 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
14649 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
14653 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
14655 if (Ratio_Act < 20)
14657 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
14658 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
14662 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
14663 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
14666 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
14668 if (Ratio_STA < btBusyThresh)
14670 pBtMgnt->ExtConfig.bBTBusy = _FALSE;
14671 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_IDLE;
14675 pBtMgnt->ExtConfig.bBTBusy = _TRUE;
14676 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_IDLE;
14679 if ((Ratio_STA < btBusyThresh) ||
14680 (Ratio_Act<180 && Ratio_STA<130))
14682 pBtMgnt->ExtConfig.bBTA2DPBusy = _FALSE;
14683 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_A2DP_IDLE;
14687 pBtMgnt->ExtConfig.bBTA2DPBusy =_TRUE;
14688 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_A2DP_IDLE;
14693 if (pBtMgnt->ExtConfig.NumberOfHandle==0 &&
14694 pBtMgnt->ExtConfig.NumberOfSCO==0)
14696 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
14697 pBtMgnt->ExtConfig.MIN_BT_RSSI = 0;
14701 if (pBtMgnt->ExtConfig.MIN_BT_RSSI <= -5)
14703 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT_RSSI_LOW;
14704 RTPRINT(FBT, BT_TRACE, ("[bt rssi], Low\n"));
14708 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT_RSSI_LOW;
14709 RTPRINT(FBT, BT_TRACE, ("[bt rssi], Normal\n"));
14713 if (pHalData->bt_coexist.bBTBusyTraffic !=
14714 pBtMgnt->ExtConfig.bBTBusy)
14715 { // BT idle or BT non-idle
14716 pHalData->bt_coexist.bBTBusyTraffic = pBtMgnt->ExtConfig.bBTBusy;
14717 stateChange = _TRUE;
14722 if (!pBtMgnt->ExtConfig.bBTBusy)
14725 RTPRINT(FBT, BT_TRACE, ("[BT] BT is idle or disable\n"));
14727 tempu1Byte = rtw_read8(padapter, 0x4fd);
14728 tempu1Byte |= BIT(2);
14730 rtw_write8(padapter, 0x4fd, tempu1Byte);
14732 //Resume RF Rx LPF corner
14733 if (IS_HARDWARE_TYPE_8192D(padapter))
14735 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, pHalData->bt_coexist.BtRfRegOrigin1E);
14739 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1E);
14741 BTDM_CoexAllOff(padapter);
14743 RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n"));
14745 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
14750 RTPRINT(FBT, BT_TRACE, ("[BT] BT is non-idle\n"));
14752 tempu1Byte = rtw_read8(padapter, 0x4fd);
14753 tempu1Byte &=~ BIT(2);
14754 rtw_write8(padapter, 0x4fd, tempu1Byte);
14756 //Shrink RF Rx LPF corner
14757 if (IS_HARDWARE_TYPE_8192D(padapter))
14759 PHY_SetRFReg(padapter, PathA, 0x1e, bRFRegOffsetMask, 0xf2ff7);
14763 //Shrink RF Rx LPF corner, 0x1e[7:4]=1111
14764 PHY_SetRFReg(padapter, PathA, 0x1e, 0xf0, 0xf);
14771 if (pBtMgnt->ExtConfig.bBTBusy)
14773 BTDM_RejectAPAggregatedPacket(padapter, _TRUE);
14777 BTDM_RejectAPAggregatedPacket(padapter, _FALSE);
14782 void btdm_WLANActOff(PADAPTER padapter)
14784 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14786 //Only used in BC4 setting
14787 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
14788 BTDM_Balance(padapter, _FALSE, 0, 0);
14789 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
14792 void btdm_WLANActBTPrecedence(PADAPTER padapter)
14794 BTDM_Balance(padapter, _FALSE, 0, 0);
14795 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
14797 rtw_write32(padapter, 0x6c4,0x55555555);
14798 rtw_write32(padapter, 0x6c8,0x000000f0);
14799 rtw_write32(padapter, 0x6cc,0x40000010);
14800 rtw_write8(padapter, REG_GPIO_MUXCFG, 0xa0);
14803 //==============================================================
14806 // In the following, FW should be done before SW mechanism.
14807 // BTDM_Balance(), BTDM_DiminishWiFi(), BT_NAV() should be done
14808 // before BTDM_AGCTable(), BTDM_BBBackOffLevel(), btdm_DacSwing().
14810 //==============================================================
14812 void btdm_DacSwing(PADAPTER padapter, u8 type)
14814 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14816 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
14819 if (type == BT_DACSWING_OFF)
14821 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing Off!\n"));
14822 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x30);
14824 else if (type == BT_DACSWING_M4)
14826 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW)
14828 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4 original, but Low RSSI!\n"));
14829 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
14833 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -4!\n"));
14834 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x20);
14837 else if (type == BT_DACSWING_M7)
14839 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -7!\n"));
14840 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x18);
14842 else if (type == BT_DACSWING_M10)
14844 RTPRINT(FBT, BT_TRACE, ("[BT]DACSwing -10!\n"));
14845 PHY_SetBBReg(padapter, 0x880, 0xfc000000, 0x10);
14848 if (type != BT_DACSWING_OFF)
14849 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
14852 void btdm_A2DPActionBC42Ant(PADAPTER padapter)
14854 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
14855 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
14856 PBT30Info pBTInfo = GET_BT_INFO(padapter);
14857 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14858 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14861 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
14863 if (pBtMgnt->ExtConfig.bBTBusy)
14865 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14867 if (BTDM_IsHT40(padapter))
14869 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14870 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
14872 // Do the FW mechanism first
14873 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
14875 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
14876 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
14877 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
14879 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
14881 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
14882 BTDM_FWCoexAllOff(padapter);
14884 // Then do the SW mechanism
14885 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
14886 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
14887 btdm_DacSwing(padapter, BT_DACSWING_M4);
14891 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14892 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
14893 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
14895 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
14897 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
14898 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
14899 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
14901 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
14903 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
14904 BTDM_FWCoexAllOff(padapter);
14906 // Then do the SW mechanism
14907 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14908 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14910 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
14911 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
14912 btdm_DacSwing(padapter, BT_DACSWING_M4);
14916 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
14917 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
14918 btdm_DacSwing(padapter, BT_DACSWING_M4);
14924 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
14925 BTDM_CoexAllOff(padapter);
14929 void btdm_A2DPActionBC82Ant(PADAPTER padapter)
14931 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
14932 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
14933 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
14934 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
14935 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
14938 if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
14940 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
14941 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
14942 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
14945 // Do the FW mechanism first
14946 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
14948 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
14949 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
14950 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
14952 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
14954 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
14955 BTDM_Balance(padapter, _TRUE, 0x10, 0x18);
14956 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
14959 // Then do the SW mechanism
14960 if (BTDM_IsHT40(padapter))
14962 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
14963 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
14964 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
14965 btdm_DacSwing(padapter, BT_DACSWING_OFF);
14969 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
14970 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
14971 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
14973 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
14974 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
14975 btdm_DacSwing(padapter, BT_DACSWING_OFF);
14979 BTDM_SWCoexAllOff(padapter);
14983 else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
14985 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
14986 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
14989 // Do the FW mechanism first
14990 BTDM_Balance(padapter, _FALSE, 0, 0);
14991 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
14993 // Then do the SW mechanism
14994 BTDM_SWCoexAllOff(padapter);
14998 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
14999 BTDM_CoexAllOff(padapter);
15003 void btdm_A2DPActionBC82Ant92d(PADAPTER padapter)
15005 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15006 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15007 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15008 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15009 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15010 u8 btRssiState, rssiState1;
15012 if (pBtMgnt->ExtConfig.bBTA2DPBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15014 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15015 if (BTDM_IsHT40(padapter))
15017 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15018 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15022 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15023 if (BTDM_IsWifiUplink(padapter))
15025 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15026 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
15028 else if (BTDM_IsWifiDownlink(padapter))
15030 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15031 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_40, 0);
15034 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15035 if (!BTDM_IsCoexistStateChanged(padapter))
15038 // Do the FW mechanism first
15039 if (BTDM_IsWifiUplink(padapter))
15041 BTDM_Balance(padapter, _TRUE, 0xc, 0x18);
15042 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15044 else if (BTDM_IsWifiDownlink(padapter))
15046 BTDM_Balance(padapter, _TRUE, 0x10, 0x18);
15047 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15050 // Then do the SW mechanism
15051 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15052 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15054 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15058 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15061 if (BTDM_IsHT40(padapter))
15063 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15064 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15068 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15069 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15071 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15072 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15076 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15077 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15081 else if (pBtMgnt->ExtConfig.bBTA2DPBusy)
15083 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15084 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15087 // Do the FW mechanism first
15088 BTDM_Balance(padapter, _FALSE, 0, 0);
15089 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15091 // Then do the SW mechanism
15092 BTDM_SWCoexAllOff(padapter);
15096 RTPRINT(FBT, BT_TRACE, ("BT is idle and Wifi is idle!\n"));
15097 BTDM_CoexAllOff(padapter);
15101 u8 btdm_A2DPAction2Ant(PADAPTER padapter)
15103 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15104 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15105 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15106 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
15107 u8 bEnter = _FALSE;
15109 if (pBtDbg->dbgCtrl == _TRUE )
15111 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
15116 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
15122 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_A2DPAction2Ant(), "));
15123 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
15124 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
15125 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
15127 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15129 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
15130 btdm_A2DPActionBC42Ant(padapter);
15132 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15134 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
15135 if (IS_HARDWARE_TYPE_8192D(padapter))
15136 btdm_A2DPActionBC82Ant92d(padapter);
15138 btdm_A2DPActionBC82Ant(padapter);
15148 void btdm_PANActionBC42Ant(PADAPTER padapter)
15150 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15151 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15152 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15153 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15154 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15156 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15159 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
15161 if (pBtMgnt->BtOperationOn)
15163 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
15164 BTDM_Balance(padapter, _FALSE, 0, 0);
15165 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
15169 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
15170 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15172 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15173 BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
15174 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15178 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
15179 BTDM_Balance(padapter, _FALSE, 0, 0);
15180 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
15183 BTDM_SWCoexAllOff(padapter);
15186 void btdm_PANActionBC82Ant(PADAPTER padapter)
15188 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15189 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15190 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15191 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15192 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15195 if (pBtMgnt->BtOperationOn)
15197 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
15198 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15201 BTDM_CoexAllOff(padapter);
15205 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
15206 btRssiState = BTDM_CheckCoexRSSIState(padapter, 3, BT_FW_COEX_THRESH_25, BT_FW_COEX_THRESH_50);
15207 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15210 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15212 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15214 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15215 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15217 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
15218 // Do the FW mechanism first
15219 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15221 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15222 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15223 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15225 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15227 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15228 BTDM_FWCoexAllOff(padapter);
15230 // Then do the SW mechanism
15231 if (BTDM_IsHT40(padapter))
15233 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15234 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15238 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15239 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15241 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15242 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15244 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15245 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15247 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15249 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15250 btdm_DacSwing(padapter, BT_DACSWING_M4);
15253 else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
15254 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
15256 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
15257 // Do the FW mechanism first
15258 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15260 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15262 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15263 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15265 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15267 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15268 if (BTDM_IsHT40(padapter))
15269 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
15271 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15273 // Then do the SW mechanism
15274 if (BTDM_IsHT40(padapter))
15276 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15277 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15281 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15282 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15284 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15285 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15289 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
15290 // Do the FW mechanism first
15291 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15293 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15295 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15296 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15298 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15300 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15301 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15303 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15304 if (BTDM_IsHT40(padapter))
15306 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15307 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
15311 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15312 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15315 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15317 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15318 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15321 // Then do the SW mechanism
15322 BTDM_SWCoexAllOff(padapter);
15325 else if (pBtMgnt->ExtConfig.bBTBusy &&
15326 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
15327 (BTDM_GetRxSS(padapter) < 30))
15329 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is idle!\n"));
15330 RTPRINT(FBT, BT_TRACE, ("RSSI < 30\n"));
15331 // Do the FW mechanism first
15332 BTDM_Balance(padapter, _TRUE, 0x0a, 0x20);
15333 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15334 // Then do the SW mechanism
15335 BTDM_SWCoexAllOff(padapter);
15339 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
15340 BTDM_CoexAllOff(padapter);
15345 void btdm_PANActionBC82Ant92d(PADAPTER padapter)
15347 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15348 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15349 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15350 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15351 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15352 u8 btRssiState, rssiState1;
15354 if (pBtMgnt->BtOperationOn)
15356 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
15357 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15360 BTDM_CoexAllOff(padapter);
15364 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
15365 if (BTDM_IsHT40(padapter))
15367 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15368 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15372 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15373 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_25, 0);
15375 btRssiState = BTDM_CheckCoexRSSIState(padapter, 3, BT_FW_COEX_THRESH_25, BT_FW_COEX_THRESH_50);
15376 if (!BTDM_IsCoexistStateChanged(padapter))
15379 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15381 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15383 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15384 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15386 RTPRINT(FBT, BT_TRACE, ("RSSI stay HIGH or High \n"));
15387 // Do the FW mechanism first
15388 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15390 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15391 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15392 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15394 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15396 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15397 BTDM_FWCoexAllOff(padapter);
15399 // Then do the SW mechanism
15400 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15401 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15403 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15407 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15409 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15410 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15412 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15413 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15415 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15417 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15418 btdm_DacSwing(padapter, BT_DACSWING_M4);
15421 else if ((btRssiState == BT_RSSI_STATE_MEDIUM) ||
15422 (btRssiState == BT_RSSI_STATE_STAY_MEDIUM))
15424 RTPRINT(FBT, BT_TRACE, ("RSSI stay Medium or Medium \n"));
15425 // Do the FW mechanism first
15426 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15428 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15430 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15431 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15433 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15435 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15436 if (BTDM_IsHT40(padapter))
15437 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
15439 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15441 // Then do the SW mechanism
15442 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15443 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15445 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15449 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15451 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15452 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15456 RTPRINT(FBT, BT_TRACE, ("RSSI stay LOW or LOW \n"));
15457 // Do the FW mechanism first
15458 BTDM_Balance(padapter, _TRUE, 0x20, 0x20);
15460 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15462 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15463 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15465 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15467 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15468 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
15470 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
15471 if (BTDM_IsHT40(padapter))
15473 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15474 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);//BT_FW_NAV_ON);
15478 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15479 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15482 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
15484 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
15485 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15488 // Then do the SW mechanism
15489 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15490 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15492 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15496 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15498 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15499 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15502 else if (pBtMgnt->ExtConfig.bBTBusy &&
15503 !pmlmepriv->LinkDetectInfo.bBusyTraffic &&
15504 (BTDM_GetRxSS(padapter) < 30))
15506 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is idle!\n"));
15507 RTPRINT(FBT, BT_TRACE, ("RSSI < 30\n"));
15508 // Do the FW mechanism first
15509 BTDM_Balance(padapter, _TRUE, 0x0a, 0x20);
15510 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
15511 // Then do the SW mechanism
15512 BTDM_SWCoexAllOff(padapter);
15516 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
15517 BTDM_CoexAllOff(padapter);
15522 u8 btdm_PANAction2Ant(PADAPTER padapter)
15524 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15525 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15526 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15527 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
15528 u8 bEnter = _FALSE;
15530 if (pBtDbg->dbgCtrl == _TRUE )
15532 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
15537 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
15543 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_PANAction2Ant(), "));
15544 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
15545 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_HID;
15546 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
15548 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15550 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
15551 btdm_PANActionBC42Ant(padapter);
15553 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15555 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
15556 if (IS_HARDWARE_TYPE_8192D(padapter))
15557 btdm_PANActionBC82Ant92d(padapter);
15559 btdm_PANActionBC82Ant(padapter);
15569 void btdm_HIDActionBC42Ant(PADAPTER padapter)
15571 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15572 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15573 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15575 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15578 if (BTDM_Legacy(padapter))
15580 RTPRINT(FBT, BT_TRACE, ("Current Wireless Mode is B/G\n"));
15581 btdm_WLANActBTPrecedence(padapter);
15583 else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15585 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15586 btdm_WLANActBTPrecedence(padapter);
15588 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15590 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15591 btdm_WLANActOff(padapter);
15593 else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
15595 RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
15596 btdm_WLANActOff(padapter);
15598 BTDM_SWCoexAllOff(padapter);
15601 void btdm_HIDActionBC82Ant(PADAPTER padapter)
15603 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15604 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15605 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15606 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15607 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15610 #ifdef CONFIG_USB_HCI
15611 if (pHalData->CustomerID == RT_CID_PLANEX)
15613 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15615 btdm_HIDActionBC42Ant(padapter);
15620 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15622 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
15624 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15626 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
15629 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15632 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15634 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15635 // Do the FW mechanism first
15636 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15637 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15639 BTDM_FWCoexAllOff(padapter);
15643 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15645 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15646 BTDM_Balance(padapter, _FALSE, 0, 0);
15647 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15649 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15651 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15652 BTDM_Balance(padapter, _TRUE, 0x15, 0x15);
15653 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x30, BT_FW_NAV_OFF);
15656 // Then do the SW mechanism
15657 BTDM_SWCoexAllOff(padapter);
15661 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
15662 BTDM_CoexAllOff(padapter);
15666 void btdm_HIDActionBC82Ant92d(PADAPTER padapter)
15668 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15669 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15670 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15671 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15672 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15675 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15677 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_45, 0);
15679 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15681 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_20, 0);
15684 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15687 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
15689 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
15690 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15691 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15693 // Do the FW mechanism first
15694 BTDM_FWCoexAllOff(padapter);
15696 // Then do the SW mechanism
15697 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15698 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15699 btdm_DacSwing(padapter, BT_DACSWING_M4);
15703 // Do the FW mechanism first
15704 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15706 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15707 BTDM_Balance(padapter, _FALSE, 0, 0);
15708 BTDM_DiminishWiFi(padapter, _TRUE, _TRUE, 0x18, BT_FW_NAV_OFF);
15710 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15712 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15713 BTDM_Balance(padapter, _TRUE, 0x15, 0x15);
15714 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x30, BT_FW_NAV_OFF);
15716 // Then do the SW mechanism
15717 BTDM_SWCoexAllOff(padapter);
15722 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
15723 BTDM_CoexAllOff(padapter);
15727 u8 btdm_HIDAction2Ant(PADAPTER padapter)
15729 PBT30Info pBTInfo = GET_BT_INFO(padapter) ;
15730 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15731 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
15732 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15733 u8 bEnter = _FALSE;
15735 if (pBtDbg->dbgCtrl == _TRUE )
15737 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
15742 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
15748 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDAction2Ant(), "));
15749 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
15750 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_PAN;
15751 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_A2DP;
15753 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15755 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
15756 btdm_HIDActionBC42Ant(padapter);
15758 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15760 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
15761 if (IS_HARDWARE_TYPE_8192D(padapter))
15762 btdm_HIDActionBC82Ant92d(padapter);
15764 btdm_HIDActionBC42Ant(padapter);
15774 void btdm_SCOActionBC42Ant(PADAPTER padapter)
15776 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15778 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15781 btdm_WLANActOff(padapter);
15782 BTDM_SWCoexAllOff(padapter);
15785 void btdm_SCOActionBC82Ant(PADAPTER padapter)
15787 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15790 if (BTDM_IsHT40(padapter))
15792 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15795 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15796 // Do the FW mechanism first
15797 BTDM_Balance(padapter, _FALSE, 0, 0);
15798 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
15800 // Then do the SW mechanism
15801 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15802 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15803 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15807 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15808 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15811 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15812 // Do the FW mechanism first
15813 BTDM_Balance(padapter, _FALSE, 0, 0);
15814 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
15816 // Then do the SW mechanism
15817 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15818 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15820 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15821 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15822 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15826 BTDM_SWCoexAllOff(padapter);
15831 void btdm_SCOActionBC82Ant92d(PADAPTER padapter)
15833 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15834 u8 btRssiState, rssiState1;
15836 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15837 if (BTDM_IsHT40(padapter))
15839 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15842 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15843 // Do the FW mechanism first
15844 BTDM_Balance(padapter, _FALSE, 0, 0);
15845 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
15847 // Then do the SW mechanism
15848 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15849 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15850 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15854 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15855 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15858 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15859 // Do the FW mechanism first
15860 BTDM_Balance(padapter, _FALSE, 0, 0);
15861 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0, BT_FW_NAV_OFF);
15863 // Then do the SW mechanism
15864 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
15865 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
15867 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15871 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15873 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15874 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15876 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15877 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15881 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15882 btdm_DacSwing(padapter, BT_DACSWING_OFF);
15887 u8 btdm_SCOAction2Ant(PADAPTER padapter)
15889 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15890 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15891 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15892 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
15893 u8 bEnter = _FALSE;
15895 if (pBtDbg->dbgCtrl == _TRUE )
15897 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
15902 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
15907 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_SCOAction2Ant(), "));
15908 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
15910 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
15912 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
15913 btdm_SCOActionBC42Ant(padapter);
15915 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
15917 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
15918 if (IS_HARDWARE_TYPE_8192D(padapter))
15919 btdm_SCOActionBC82Ant92d(padapter);
15921 btdm_SCOActionBC82Ant(padapter);
15927 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_PROFILE_SCO;
15932 void btdm_HIDA2DPActionBC42Ant(PADAPTER padapter)
15934 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
15935 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
15936 PBT30Info pBTInfo = GET_BT_INFO(padapter);
15937 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
15938 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
15941 if (pBtMgnt->ExtConfig.bBTBusy)
15943 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
15945 if (BTDM_IsHT40(padapter))
15947 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
15948 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15950 // Do the FW mechanism first
15951 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15953 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15954 BTDM_Balance(padapter, _TRUE, 0x7, 0x20);
15955 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
15957 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15959 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15960 BTDM_FWCoexAllOff(padapter);
15962 // Then do the SW mechanism
15963 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15964 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15965 btdm_DacSwing(padapter, BT_DACSWING_M7);
15969 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
15970 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
15971 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
15973 // Do the FW mechanism first
15974 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
15976 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
15977 BTDM_Balance(padapter, _TRUE, 0x7, 0x20);
15978 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x20, BT_FW_NAV_OFF);
15980 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
15982 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
15983 BTDM_FWCoexAllOff(padapter);
15986 // Then do the SW mechanism
15987 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
15988 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
15990 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
15991 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
15992 btdm_DacSwing(padapter, BT_DACSWING_M7);
15996 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
15997 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
15998 btdm_DacSwing(padapter, BT_DACSWING_M7);
16004 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16005 BTDM_CoexAllOff(padapter);
16009 void btdm_HIDA2DPActionBC82Ant(PADAPTER padapter)
16011 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16012 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16013 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16016 if (pBtMgnt->ExtConfig.bBTBusy)
16018 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16020 if (BTDM_IsHT40(padapter))
16022 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16023 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16026 // Do the FW mechanism first
16027 BTDM_FWCoexAllOff(padapter);
16029 // Then do the SW mechanism
16030 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16031 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16032 btdm_DacSwing(padapter, BT_DACSWING_M7);
16036 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16037 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16038 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16041 BTDM_FWCoexAllOff(padapter);
16043 // Then do the SW mechanism
16044 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16045 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16047 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16048 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16049 btdm_DacSwing(padapter, BT_DACSWING_M7);
16053 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16054 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16055 btdm_DacSwing(padapter, BT_DACSWING_M7);
16061 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16062 BTDM_CoexAllOff(padapter);
16066 void btdm_HIDA2DPActionBC82Ant92d(PADAPTER padapter)
16068 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16069 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16070 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16071 u8 btRssiState, rssiState1;
16073 rssiState1 = BTDM_CheckCoexRSSIState1(padapter, 2, BT_FW_COEX_THRESH_35, 0);
16074 if (pBtMgnt->ExtConfig.bBTBusy)
16076 RTPRINT(FBT, BT_TRACE, ("BT is non-idle!\n"));
16078 if (BTDM_IsHT40(padapter))
16080 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16081 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16084 // Do the FW mechanism first
16085 BTDM_FWCoexAllOff(padapter);
16087 // Then do the SW mechanism
16088 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16089 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16091 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16095 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16097 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16098 btdm_DacSwing(padapter, BT_DACSWING_M7);
16102 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16103 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_47, 0);
16104 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16107 BTDM_FWCoexAllOff(padapter);
16109 // Then do the SW mechanism
16110 if ((rssiState1 == BT_RSSI_STATE_HIGH) ||
16111 (rssiState1 == BT_RSSI_STATE_STAY_HIGH))
16113 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16117 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16119 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16120 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16122 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16123 btdm_DacSwing(padapter, BT_DACSWING_M7);
16127 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16128 btdm_DacSwing(padapter, BT_DACSWING_M7);
16134 RTPRINT(FBT, BT_TRACE, ("BT is idle!\n"));
16135 BTDM_CoexAllOff(padapter);
16139 u8 btdm_HIDA2DPAction2Ant(PADAPTER padapter)
16141 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16142 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16143 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
16144 u8 bEnter = _FALSE;
16146 if (pBtDbg->dbgCtrl == _TRUE )
16148 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
16153 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
16159 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDA2DPAction2Ant(), "));
16160 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
16162 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16164 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16165 btdm_HIDA2DPActionBC42Ant(padapter);
16167 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16169 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16170 if (IS_HARDWARE_TYPE_8192D(padapter))
16171 btdm_HIDA2DPActionBC82Ant92d(padapter);
16173 btdm_HIDA2DPActionBC82Ant(padapter);
16179 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
16184 void btdm_HIDPANActionBC42Ant(PADAPTER padapter)
16186 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16187 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16188 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16189 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16190 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16192 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16195 if (pBtMgnt->BtOperationOn)
16197 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16198 btdm_WLANActBTPrecedence(padapter);
16202 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16203 if (BTDM_Legacy(padapter))
16205 RTPRINT(FBT, BT_TRACE, ("B/G mode \n"));
16206 btdm_WLANActBTPrecedence(padapter);
16208 else if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16210 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink \n"));
16211 btdm_WLANActBTPrecedence(padapter);
16213 else if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16215 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink \n"));
16216 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
16217 BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
16218 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16220 else if (!pmlmepriv->LinkDetectInfo.bBusyTraffic)
16222 RTPRINT(FBT, BT_TRACE, ("Wifi Idel \n"));
16223 btdm_WLANActOff(padapter);
16226 BTDM_SWCoexAllOff(padapter);
16229 void btdm_HIDPANActionBC82Ant(PADAPTER padapter)
16231 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16232 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16233 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16234 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16237 if (!pBtMgnt->BtOperationOn)
16239 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16241 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
16242 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16245 if ((pBtMgnt->ExtConfig.bBTBusy && padapter->mlmepriv.LinkDetectInfo.bBusyTraffic))
16247 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
16249 // Do the FW mechanism first
16250 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16252 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16253 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
16255 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16257 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16258 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
16260 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16262 // Then do the SW mechanism
16263 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16264 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16266 if (BTDM_IsHT40(padapter))
16268 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16269 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16270 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16271 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16275 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16276 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16277 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16278 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16283 BTDM_SWCoexAllOff(padapter);
16288 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16289 BTDM_CoexAllOff(padapter);
16294 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16295 #ifdef CONFIG_USB_HCI
16296 if (BTDM_IsWifiUplink(padapter))
16298 RTPRINT(FBT, BT_TRACE, ("Wifi Uplink\n"));
16299 btdm_WLANActBTPrecedence(padapter);
16300 if (pHalData->CustomerID == RT_CID_PLANEX)
16301 btdm_DacSwing(padapter, BT_DACSWING_M10);
16303 btdm_DacSwing(padapter, BT_DACSWING_M7);
16305 else if (BTDM_IsWifiDownlink(padapter))
16307 RTPRINT(FBT, BT_TRACE, ("Wifi Downlink\n"));
16308 if (pHalData->CustomerID == RT_CID_PLANEX)
16309 btdm_DacSwing(padapter, BT_DACSWING_M10);
16311 btdm_DacSwing(padapter, BT_DACSWING_M7);
16313 #elif defined(CONFIG_PCI_HCI)
16314 if (pBtMgnt->ExtConfig.bBTBusy)
16316 RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
16317 BTDM_FWCoexAllOff(padapter);
16318 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16319 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16320 btdm_DacSwing(padapter, BT_DACSWING_M4);
16324 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
16325 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16331 u8 btdm_HIDPANAction2Ant(PADAPTER padapter)
16333 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16334 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16335 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
16336 u8 bEnter = _FALSE;
16338 if (pBtDbg->dbgCtrl == _TRUE )
16340 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
16345 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
16351 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_HIDPANAction2Ant(), "));
16352 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
16354 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16356 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16357 btdm_HIDPANActionBC42Ant(padapter);
16359 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16361 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16362 btdm_HIDPANActionBC82Ant(padapter);
16368 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
16374 void btdm_PANA2DPActionBC42Ant(PADAPTER padapter)
16376 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16377 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16378 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16379 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16380 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16382 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16385 rtw_write8(padapter, REG_GPIO_MUXCFG, 0x0);
16386 if (pBtMgnt->BtOperationOn)
16388 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16390 if (pBtMgnt->ExtConfig.bBTBusy)
16392 RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
16393 BTDM_FWCoexAllOff(padapter);
16395 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16396 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16397 btdm_DacSwing(padapter, BT_DACSWING_M4);
16401 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
16402 BTDM_CoexAllOff(padapter);
16407 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16408 if (pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic)
16410 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle!\n"));
16411 BTDM_Balance(padapter, _TRUE, 0x20, 0x10);
16412 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16416 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16417 BTDM_Balance(padapter, _FALSE, 0, 0);
16418 BTDM_DiminishWiFi(padapter, _FALSE, _FALSE, 0x0, BT_FW_NAV_OFF);
16420 BTDM_SWCoexAllOff(padapter);
16424 void btdm_PANA2DPActionBC82Ant(PADAPTER padapter)
16426 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16427 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
16428 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16429 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16430 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16433 if (!pBtMgnt->BtOperationOn)
16435 RTPRINT(FBT, BT_TRACE, ("[BT 2.1]\n"));
16437 btRssiState = BTDM_CheckCoexRSSIState(padapter, 2, BT_FW_COEX_THRESH_25, 0);
16438 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
16441 if ((pBtMgnt->ExtConfig.bBTBusy && pmlmepriv->LinkDetectInfo.bBusyTraffic))
16443 RTPRINT(FBT, BT_TRACE, ("BT is non-idle && Wifi is non-idle, "));
16445 // Do the FW mechanism first
16446 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
16448 RTPRINT(FBT, BT_TRACE, ("BT Uplink\n"));
16449 BTDM_Balance(padapter, _TRUE, 0x15, 0x20);
16451 else if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
16453 RTPRINT(FBT, BT_TRACE, ("BT Downlink\n"));
16454 BTDM_Balance(padapter, _TRUE, 0x10, 0x20);
16456 BTDM_DiminishWiFi(padapter, _TRUE, _FALSE, 0x20, BT_FW_NAV_OFF);
16458 // Then do the SW mechanism
16459 if ((btRssiState == BT_RSSI_STATE_HIGH) ||
16460 (btRssiState == BT_RSSI_STATE_STAY_HIGH))
16462 if (BTDM_IsHT40(padapter))
16464 RTPRINT(FBT, BT_TRACE, ("HT40\n"));
16465 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16466 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16467 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16471 RTPRINT(FBT, BT_TRACE, ("HT20 or Legacy\n"));
16472 BTDM_AGCTable(padapter, BT_AGCTABLE_ON);
16473 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_ON);
16474 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16479 BTDM_SWCoexAllOff(padapter);
16484 RTPRINT(FBT, BT_TRACE, ("BT is idle or Wifi is idle!\n"));
16485 BTDM_CoexAllOff(padapter);
16490 RTPRINT(FBT, BT_TRACE, ("[BT 3.0]\n"));
16491 if (pBtMgnt->ExtConfig.bBTBusy)
16493 RTPRINT(FBT, BT_TRACE, ("BT is non-idle\n"));
16494 BTDM_FWCoexAllOff(padapter);
16495 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16496 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16497 btdm_DacSwing(padapter, BT_DACSWING_M4);
16501 RTPRINT(FBT, BT_TRACE, ("BT is idle\n"));
16502 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16507 u8 btdm_PANA2DPAction2Ant(PADAPTER padapter)
16509 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16510 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16511 PBT_DBG pBtDbg = &pBTInfo->BtDbg;
16512 u8 bEnter = _FALSE;
16514 if (pBtDbg->dbgCtrl == _TRUE )
16516 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
16521 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
16527 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_PANA2DPAction2Ant(), "));
16528 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
16530 if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4)
16532 RTPRINT(FBT, BT_TRACE, ("[BC4]\n"));
16533 btdm_PANA2DPActionBC42Ant(padapter);
16535 else if (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)
16537 RTPRINT(FBT, BT_TRACE, ("[BC8]\n"));
16538 btdm_PANA2DPActionBC82Ant(padapter);
16544 pHalData->bt_coexist.CurrentState &= ~(BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
16549 //============================================================
16550 // extern function start with BTDM_
16551 //============================================================
16553 void BTDM_SwCoexAllOff92C(PADAPTER padapter)
16555 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16556 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16557 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16560 void BTDM_SwCoexAllOff92D(PADAPTER padapter)
16562 BTDM_AGCTable(padapter, BT_AGCTABLE_OFF);
16563 BTDM_BBBackOffLevel(padapter, BT_BB_BACKOFF_OFF);
16564 btdm_DacSwing(padapter, BT_DACSWING_OFF);
16576 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16577 u8 H2C_Parameter[3] = {0};
16579 if (pHalData->bt_coexist.BT_Ant_Num != Ant_x2)
16582 if ((pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_RSSI_LOW) &&
16583 (DACSwingLevel == 0x20))
16585 RTPRINT(FBT, BT_TRACE, ("[BT]DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\n"));
16586 DACSwingLevel = 0x18;
16589 H2C_Parameter[2] = 0;
16590 H2C_Parameter[1] = DACSwingLevel;
16591 H2C_Parameter[0] = 0;
16594 H2C_Parameter[2] |= 0x01; //BIT0
16597 H2C_Parameter[2] |= 0x02; //BIT1
16599 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
16603 H2C_Parameter[2] |= 0x08; //BIT3
16604 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
16607 RTPRINT(FBT, BT_TRACE, ("[DM][BT], bDACOn = %s, bInterruptOn = %s, write 0xe = 0x%x\n",
16608 bDACOn?"ON":"OFF", bInterruptOn?"ON":"OFF",
16609 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
16610 RTPRINT(FBT, BT_TRACE, ("[DM][BT], bNAVOn = %s\n",
16611 bNAVOn?"ON":"OFF"));
16613 if (IS_HARDWARE_TYPE_8192C(padapter))
16615 FillH2CCmd(padapter, 0xe, 3, H2C_Parameter);
16617 else if (IS_HARDWARE_TYPE_8192D(padapter))
16619 FillH2CCmd(padapter, 0x12, 3, H2C_Parameter);
16623 void BTDM_BTCoexistWithProfile2Ant(PADAPTER padapter)
16625 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16626 PBT30Info pBTInfo = GET_BT_INFO(padapter);
16627 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
16629 if (pBtMgnt->ExtConfig.bManualControl)
16632 RTPRINT(FIOCTL, IOCTL_BT_FLAG_MON, ("CurrentBTConnectionCnt=%d, BtOperationOn=%d, bBTConnectInProgress=%d !!\n",
16633 pBtMgnt->CurrentBTConnectionCnt, pBtMgnt->BtOperationOn, pBtMgnt->bBTConnectInProgress));
16635 if ((pHalData->bt_coexist.BluetoothCoexist) &&
16636 ((pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ||
16637 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
16639 BTHCI_GetProfileNameMoto(padapter);
16640 BTHCI_GetBTRSSI(padapter);
16641 btdm_CheckBTState2Ant(padapter);
16642 BTDM_CheckWiFiState(padapter);
16644 if (btdm_SCOAction2Ant(padapter))
16646 RTPRINT(FBT, BT_TRACE, ("Action SCO\n"));
16648 else if (btdm_HIDAction2Ant(padapter))
16650 RTPRINT(FBT, BT_TRACE, ("Action HID\n"));
16652 else if (btdm_A2DPAction2Ant(padapter))
16654 RTPRINT(FBT, BT_TRACE, ("Action A2DP\n"));
16656 else if (btdm_PANAction2Ant(padapter))
16658 RTPRINT(FBT, BT_TRACE, ("Action PAN\n"));
16660 else if (btdm_HIDA2DPAction2Ant(padapter))
16662 RTPRINT(FBT, BT_TRACE, ("Action HID_A2DP\n"));
16664 else if (btdm_HIDPANAction2Ant(padapter))
16666 RTPRINT(FBT, BT_TRACE, ("Action HID_PAN\n"));
16668 else if (btdm_PANA2DPAction2Ant(padapter))
16670 RTPRINT(FBT, BT_TRACE, ("Action PAN_A2DP\n"));
16674 RTPRINT(FBT, BT_TRACE, ("No Action Matched \n"));
16677 if (pHalData->bt_coexist.PreviousState != pHalData->bt_coexist.CurrentState)
16679 RTPRINT(FBT, BT_TRACE, ("Coexist State change from 0x%"i64fmt"x to 0x%"i64fmt"x\n",
16680 pHalData->bt_coexist.PreviousState,
16681 pHalData->bt_coexist.CurrentState));
16682 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
16684 RTPRINT(FBT, BT_TRACE, ("["));
16685 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT30)
16686 RTPRINT(FBT, BT_TRACE, ("BT 3.0, "));
16687 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT20)
16688 RTPRINT(FBT, BT_TRACE, ("HT20, "));
16689 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_HT40)
16690 RTPRINT(FBT, BT_TRACE, ("HT40, "));
16691 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_LEGACY)
16692 RTPRINT(FBT, BT_TRACE, ("Legacy, "));
16693 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_LOW)
16694 RTPRINT(FBT, BT_TRACE, ("Rssi_Low, "));
16695 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_MEDIUM)
16696 RTPRINT(FBT, BT_TRACE, ("Rssi_Mid, "));
16697 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_RSSI_HIGH)
16698 RTPRINT(FBT, BT_TRACE, ("Rssi_High, "));
16699 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_IDLE)
16700 RTPRINT(FBT, BT_TRACE, ("Wifi_Idle, "));
16701 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_UPLINK)
16702 RTPRINT(FBT, BT_TRACE, ("Wifi_Uplink, "));
16703 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_WIFI_DOWNLINK)
16704 RTPRINT(FBT, BT_TRACE, ("Wifi_Downlink, "));
16705 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE)
16706 RTPRINT(FBT, BT_TRACE, ("BT_idle, "));
16707 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_IDLE)
16708 RTPRINT(FBT, BT_TRACE, ("BT_PAN_idle, "));
16709 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_UPLINK)
16710 RTPRINT(FBT, BT_TRACE, ("BT_PAN_uplink, "));
16711 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_PAN_DOWNLINK)
16712 RTPRINT(FBT, BT_TRACE, ("BT_PAN_downlink, "));
16713 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_HID)
16714 RTPRINT(FBT, BT_TRACE, ("PRO_HID, "));
16715 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_A2DP)
16716 RTPRINT(FBT, BT_TRACE, ("PRO_A2DP, "));
16717 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_PAN)
16718 RTPRINT(FBT, BT_TRACE, ("PRO_PAN, "));
16719 if (pHalData->bt_coexist.CurrentState & BT_COEX_STATE_PROFILE_SCO)
16720 RTPRINT(FBT, BT_TRACE, ("PRO_SCO, "));
16721 RTPRINT(FBT, BT_TRACE, ("]\n"));
16726 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtcCsr2Ant.c =====
16729 #ifdef __HALBTCOEXIST_C__ // HAL/BTCoexist/HalBtCoexist.c
16730 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
16732 //============================================================
16734 //============================================================
16735 void btdm_BTCoexistWithProfile(PADAPTER padapter)
16737 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16739 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
16741 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 2 Ant mechanism\n"));
16742 BTDM_BTCoexistWithProfile2Ant(padapter);
16746 RTPRINT(FBT, BT_TRACE, ("[DM][BT], 1 Ant mechanism\n"));
16747 BTDM_BTCoexistWithProfile1Ant(padapter);
16751 void btdm_ResetFWCoexState(PADAPTER padapter)
16753 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16755 pHalData->bt_coexist.CurrentState = 0;
16756 pHalData->bt_coexist.PreviousState = 0;
16759 void btdm_InitBtCoexistDM(PADAPTER padapter)
16761 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16763 // 20100415 Joseph: Restore RF register 0x1E and 0x1F value for further usage.
16764 if (IS_HARDWARE_TYPE_8723A(padapter))
16766 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
16768 else if (IS_HARDWARE_TYPE_8192D(padapter))
16770 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, bRFRegOffsetMask);
16774 pHalData->bt_coexist.BtRfRegOrigin1E = PHY_QueryRFReg(padapter, PathA, RF_RCK1, 0xf0);
16776 pHalData->bt_coexist.BtRfRegOrigin1F = PHY_QueryRFReg(padapter, PathA, RF_RCK2, 0xf0);
16778 pHalData->bt_coexist.CurrentState = 0;
16779 pHalData->bt_coexist.PreviousState = 0;
16781 BTDM_8723AInit(padapter);
16782 pHalData->bt_coexist.bInitlized = _TRUE;
16785 //============================================================
16787 //============================================================
16788 void BTDM_CheckAntSelMode(PADAPTER padapter)
16792 u8 BTDM_NeedToRoamForBtEnableDisable(PADAPTER padapter)
16797 void BTDM_FwC2hBtRssi(PADAPTER padapter, u8 *tmpBuf)
16799 if (IS_HARDWARE_TYPE_8723A(padapter))
16800 BTDM_FwC2hBtRssi8723A(padapter, tmpBuf);
16803 void BTDM_FwC2hBtInfo(PADAPTER padapter, u8 *tmpBuf, u8 length)
16805 if (IS_HARDWARE_TYPE_8723A(padapter))
16806 BTDM_FwC2hBtInfo8723A(padapter, tmpBuf, length);
16809 void BTDM_DisplayBtCoexInfo(PADAPTER padapter)
16811 if (IS_HARDWARE_TYPE_8723A(padapter))
16812 BTDM_Display8723ABtCoexInfo(padapter);
16815 void BTDM_RejectAPAggregatedPacket(PADAPTER padapter, u8 bReject)
16819 u8 BTDM_IsHT40(PADAPTER padapter)
16822 HT_CHANNEL_WIDTH bw;
16824 bw = padapter->mlmeextpriv.cur_bwmode;
16826 if (bw == HT_CHANNEL_WIDTH_20)
16830 else if (bw == HT_CHANNEL_WIDTH_40)
16838 u8 BTDM_Legacy(PADAPTER padapter)
16840 struct mlme_ext_priv *pmlmeext;
16841 u8 isLegacy = _FALSE;
16843 pmlmeext = &padapter->mlmeextpriv;
16844 if ((pmlmeext->cur_wireless_mode == WIRELESS_11B) ||
16845 (pmlmeext->cur_wireless_mode == WIRELESS_11G) ||
16846 (pmlmeext->cur_wireless_mode == WIRELESS_11BG))
16852 void BTDM_CheckWiFiState(PADAPTER padapter)
16854 PHAL_DATA_TYPE pHalData;
16855 struct mlme_priv *pmlmepriv;
16860 pHalData = GET_HAL_DATA(padapter);
16861 pmlmepriv = &padapter->mlmepriv;
16862 pBTInfo = GET_BT_INFO(padapter);
16863 pBtMgnt = &pBTInfo->BtMgnt;
16865 if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
16867 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_IDLE;
16869 if (pmlmepriv->LinkDetectInfo.bTxBusyTraffic)
16871 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_UPLINK;
16875 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_UPLINK;
16878 if (pmlmepriv->LinkDetectInfo.bRxBusyTraffic)
16880 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_DOWNLINK;
16884 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_DOWNLINK;
16889 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_IDLE;
16890 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_UPLINK;
16891 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_DOWNLINK;
16894 if (BTDM_Legacy(padapter))
16896 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_LEGACY;
16897 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT20;
16898 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT40;
16902 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_LEGACY;
16903 if (BTDM_IsHT40(padapter))
16905 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT40;
16906 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT20;
16910 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_HT20;
16911 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_HT40;
16915 if (pBtMgnt->BtOperationOn)
16917 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_BT30;
16921 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_BT30;
16925 s32 BTDM_GetRxSS(PADAPTER padapter)
16927 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16928 struct mlme_priv *pmlmepriv;
16929 PHAL_DATA_TYPE pHalData;
16930 s32 UndecoratedSmoothedPWDB = 0;
16933 pmlmepriv = &padapter->mlmepriv;
16934 pHalData = GET_HAL_DATA(padapter);
16936 // if (pMgntInfo->bMediaConnect) // Default port
16937 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
16939 UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(padapter);
16941 else // associated entry pwdb
16943 UndecoratedSmoothedPWDB = pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
16944 //pHalData->BT_EntryMinUndecoratedSmoothedPWDB
16946 RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxSS() = %d\n", UndecoratedSmoothedPWDB));
16947 return UndecoratedSmoothedPWDB;
16950 s32 BTDM_GetRxBeaconSS(PADAPTER padapter)
16952 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
16953 struct mlme_priv *pmlmepriv;
16954 PHAL_DATA_TYPE pHalData;
16955 s32 pwdbBeacon = 0;
16958 pmlmepriv = &padapter->mlmepriv;
16959 pHalData = GET_HAL_DATA(padapter);
16961 // if (pMgntInfo->bMediaConnect) // Default port
16962 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
16964 //pwdbBeacon = pHalData->dmpriv.UndecoratedSmoothedBeacon;
16965 pwdbBeacon= pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB;
16967 RTPRINT(FBT, BT_TRACE, ("BTDM_GetRxBeaconSS() = %d\n", pwdbBeacon));
16971 // Get beacon rssi state
16973 BTDM_CheckCoexBcnRssiState(
16980 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
16981 s32 pwdbBeacon = 0;
16984 pwdbBeacon = BTDM_GetRxBeaconSS(padapter);
16988 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
16990 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
16991 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
16993 if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
16995 bcnRssiState = BT_RSSI_STATE_HIGH;
16996 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
16997 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
16998 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to High\n"));
17002 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
17003 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
17008 if (pwdbBeacon < RssiThresh)
17010 bcnRssiState = BT_RSSI_STATE_LOW;
17011 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
17012 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
17013 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Low\n"));
17017 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
17018 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
17022 else if (levelNum == 3)
17024 if (RssiThresh > RssiThresh1)
17026 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON thresh error!!\n"));
17027 return pHalData->bt_coexist.preRssiStateBeacon;
17030 if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_LOW) ||
17031 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_LOW))
17033 if (pwdbBeacon >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
17035 bcnRssiState = BT_RSSI_STATE_MEDIUM;
17036 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
17037 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
17038 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
17039 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Medium\n"));
17043 bcnRssiState = BT_RSSI_STATE_STAY_LOW;
17044 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Low\n"));
17047 else if ((pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_MEDIUM) ||
17048 (pHalData->bt_coexist.preRssiStateBeacon == BT_RSSI_STATE_STAY_MEDIUM))
17050 if (pwdbBeacon >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
17052 bcnRssiState = BT_RSSI_STATE_HIGH;
17053 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
17054 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
17055 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
17056 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to High\n"));
17058 else if (pwdbBeacon < RssiThresh)
17060 bcnRssiState = BT_RSSI_STATE_LOW;
17061 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
17062 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
17063 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
17064 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Low\n"));
17068 bcnRssiState = BT_RSSI_STATE_STAY_MEDIUM;
17069 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at Medium\n"));
17074 if (pwdbBeacon < RssiThresh1)
17076 bcnRssiState = BT_RSSI_STATE_MEDIUM;
17077 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_BEACON_MEDIUM;
17078 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_HIGH;
17079 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_BEACON_LOW;
17080 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state switch to Medium\n"));
17084 bcnRssiState = BT_RSSI_STATE_STAY_HIGH;
17085 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_BEACON state stay at High\n"));
17090 pHalData->bt_coexist.preRssiStateBeacon = bcnRssiState;
17092 return bcnRssiState;
17096 BTDM_CheckCoexRSSIState1(
17103 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17104 s32 UndecoratedSmoothedPWDB = 0;
17107 UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
17111 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
17113 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
17114 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
17116 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
17118 btRssiState = BT_RSSI_STATE_HIGH;
17119 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17120 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
17121 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
17125 btRssiState = BT_RSSI_STATE_STAY_LOW;
17126 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
17131 if (UndecoratedSmoothedPWDB < RssiThresh)
17133 btRssiState = BT_RSSI_STATE_LOW;
17134 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
17135 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17136 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
17140 btRssiState = BT_RSSI_STATE_STAY_HIGH;
17141 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
17145 else if (levelNum == 3)
17147 if (RssiThresh > RssiThresh1)
17149 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 thresh error!!\n"));
17150 return pHalData->bt_coexist.preRssiState1;
17153 if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_LOW) ||
17154 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_LOW))
17156 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
17158 btRssiState = BT_RSSI_STATE_MEDIUM;
17159 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
17160 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
17161 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17162 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Medium\n"));
17166 btRssiState = BT_RSSI_STATE_STAY_LOW;
17167 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Low\n"));
17170 else if ((pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_MEDIUM) ||
17171 (pHalData->bt_coexist.preRssiState1 == BT_RSSI_STATE_STAY_MEDIUM))
17173 if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
17175 btRssiState = BT_RSSI_STATE_HIGH;
17176 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17177 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
17178 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
17179 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to High\n"));
17181 else if (UndecoratedSmoothedPWDB < RssiThresh)
17183 btRssiState = BT_RSSI_STATE_LOW;
17184 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_LOW;
17185 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17186 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
17187 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Low\n"));
17191 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
17192 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at Medium\n"));
17197 if (UndecoratedSmoothedPWDB < RssiThresh1)
17199 btRssiState = BT_RSSI_STATE_MEDIUM;
17200 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
17201 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
17202 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
17203 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state switch to Medium\n"));
17207 btRssiState = BT_RSSI_STATE_STAY_HIGH;
17208 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI_1 state stay at High\n"));
17213 pHalData->bt_coexist.preRssiState1 = btRssiState;
17215 return btRssiState;
17219 BTDM_CheckCoexRSSIState(
17226 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17227 s32 UndecoratedSmoothedPWDB = 0;
17230 UndecoratedSmoothedPWDB = BTDM_GetRxSS(padapter);
17234 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
17236 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
17237 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
17239 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
17241 btRssiState = BT_RSSI_STATE_HIGH;
17242 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_HIGH;
17243 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
17244 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to High\n"));
17248 btRssiState = BT_RSSI_STATE_STAY_LOW;
17249 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
17254 if (UndecoratedSmoothedPWDB < RssiThresh)
17256 btRssiState = BT_RSSI_STATE_LOW;
17257 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_LOW;
17258 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
17259 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Low\n"));
17263 btRssiState = BT_RSSI_STATE_STAY_HIGH;
17264 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
17268 else if (levelNum == 3)
17270 if (RssiThresh > RssiThresh1)
17272 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI thresh error!!\n"));
17273 return pHalData->bt_coexist.preRssiState;
17276 if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_LOW) ||
17277 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_LOW))
17279 if (UndecoratedSmoothedPWDB >= (RssiThresh+BT_FW_COEX_THRESH_TOL))
17281 btRssiState = BT_RSSI_STATE_MEDIUM;
17282 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
17283 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
17284 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
17285 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Medium\n"));
17289 btRssiState = BT_RSSI_STATE_STAY_LOW;
17290 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Low\n"));
17293 else if ((pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_MEDIUM) ||
17294 (pHalData->bt_coexist.preRssiState == BT_RSSI_STATE_STAY_MEDIUM))
17296 if (UndecoratedSmoothedPWDB >= (RssiThresh1+BT_FW_COEX_THRESH_TOL))
17298 btRssiState = BT_RSSI_STATE_HIGH;
17299 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_HIGH;
17300 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
17301 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
17302 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to High\n"));
17304 else if (UndecoratedSmoothedPWDB < RssiThresh)
17306 btRssiState = BT_RSSI_STATE_LOW;
17307 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_LOW;
17308 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
17309 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
17310 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Low\n"));
17314 btRssiState = BT_RSSI_STATE_STAY_MEDIUM;
17315 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at Medium\n"));
17320 if (UndecoratedSmoothedPWDB < RssiThresh1)
17322 btRssiState = BT_RSSI_STATE_MEDIUM;
17323 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
17324 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
17325 pHalData->bt_coexist.CurrentState &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
17326 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state switch to Medium\n"));
17330 btRssiState = BT_RSSI_STATE_STAY_HIGH;
17331 RTPRINT(FBT, BT_TRACE, ("[DM][BT], RSSI state stay at High\n"));
17336 pHalData->bt_coexist.preRssiState = btRssiState;
17338 return btRssiState;
17341 u8 BTDM_DisableEDCATurbo(PADAPTER padapter)
17343 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
17345 PHAL_DATA_TYPE pHalData;
17346 u8 bBtChangeEDCA = _FALSE;
17347 u32 EDCA_BT_BE = 0x5ea42b, cur_EDCA_reg;
17352 pHalData = GET_HAL_DATA(padapter);
17353 pBtMgnt = &pHalData->BtInfo.BtMgnt;
17355 if (!pHalData->bt_coexist.BluetoothCoexist)
17358 pHalData->bt_coexist.lastBtEdca = 0;
17361 if (!((pBtMgnt->bSupportProfile) ||
17362 (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC8)))
17365 pHalData->bt_coexist.lastBtEdca = 0;
17369 if (BT_1Ant(padapter))
17372 pHalData->bt_coexist.lastBtEdca = 0;
17376 if (pHalData->bt_coexist.exec_cnt < 3)
17377 pHalData->bt_coexist.exec_cnt++;
17379 pHalData->bt_coexist.bEDCAInitialized = _TRUE;
17381 // When BT is non idle
17382 if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
17384 RTPRINT(FBT, BT_TRACE, ("BT state non idle, set bt EDCA\n"));
17386 //aggr_num = 0x0909;
17387 if (pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA == _TRUE)
17389 bBtChangeEDCA = _TRUE;
17390 pHalData->odmpriv.DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
17391 // pHalData->bIsCurRDLState = _FALSE;
17392 pHalData->dmpriv.prv_traffic_idx = 3;
17394 cur_EDCA_reg = rtw_read32(padapter, REG_EDCA_BE_PARAM);
17396 if (cur_EDCA_reg != EDCA_BT_BE)
17398 bBtChangeEDCA = _TRUE;
17400 if (bBtChangeEDCA || !pHalData->bt_coexist.bEDCAInitialized)
17402 rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCA_BT_BE);
17403 pHalData->bt_coexist.lastBtEdca = EDCA_BT_BE;
17409 RTPRINT(FBT, BT_TRACE, ("BT state idle, set original EDCA\n"));
17410 pHalData->bt_coexist.lastBtEdca = 0;
17414 #ifdef CONFIG_PCI_HCI
17415 if (IS_HARDWARE_TYPE_8192C(padapter))
17417 // When BT is non idle
17418 if (!(pHalData->bt_coexist.CurrentState & BT_COEX_STATE_BT_IDLE))
17427 if ((pHalData->bt_coexist.last_aggr_num != aggr_num) || !pHalData->bt_coexist.bEDCAInitialized)
17429 RTPRINT(FBT, BT_TRACE, ("BT write AGGR NUM = 0x%x\n", aggr_num));
17430 rtw_write16(padapter, REG_MAX_AGGR_NUM, aggr_num);
17431 pHalData->bt_coexist.last_aggr_num = aggr_num;
17447 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17448 u8 H2C_Parameter[3] = {0};
17452 H2C_Parameter[2] = 1;
17453 H2C_Parameter[1] = ms1;
17454 H2C_Parameter[0] = ms0;
17455 pHalData->bt_coexist.bFWCoexistAllOff = _FALSE;
17459 H2C_Parameter[2] = 0;
17460 H2C_Parameter[1] = 0;
17461 H2C_Parameter[0] = 0;
17463 pHalData->bt_coexist.bBalanceOn = bBalanceOn;
17465 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
17466 bBalanceOn?"ON":"OFF", ms0, ms1,
17467 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
17469 FillH2CCmd(padapter, 0xc, 3, H2C_Parameter);
17472 void BTDM_AGCTable(PADAPTER padapter, u8 type)
17474 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17475 if (type == BT_AGCTABLE_OFF)
17477 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable Off!\n"));
17478 rtw_write32(padapter, 0xc78,0x641c0001);
17479 rtw_write32(padapter, 0xc78,0x631d0001);
17480 rtw_write32(padapter, 0xc78,0x621e0001);
17481 rtw_write32(padapter, 0xc78,0x611f0001);
17482 rtw_write32(padapter, 0xc78,0x60200001);
17484 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x32000);
17485 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x71000);
17486 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xb0000);
17487 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xfc000);
17488 if (IS_HARDWARE_TYPE_8723A(padapter))
17489 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x30355);
17491 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x10255);
17493 if (IS_HARDWARE_TYPE_8723A(padapter))
17494 pHalData->bt_coexist.b8723aAgcTableOn = _FALSE;
17496 else if (type == BT_AGCTABLE_ON)
17498 RTPRINT(FBT, BT_TRACE, ("[BT]AGCTable On!\n"));
17499 rtw_write32(padapter, 0xc78,0x4e1c0001);
17500 rtw_write32(padapter, 0xc78,0x4d1d0001);
17501 rtw_write32(padapter, 0xc78,0x4c1e0001);
17502 rtw_write32(padapter, 0xc78,0x4b1f0001);
17503 rtw_write32(padapter, 0xc78,0x4a200001);
17505 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0xdc000);
17506 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x90000);
17507 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x51000);
17508 PHY_SetRFReg(padapter, PathA, RF_RX_AGC_HP, bRFRegOffsetMask, 0x12000);
17509 if (IS_HARDWARE_TYPE_8723A(padapter))
17510 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x00355);
17512 PHY_SetRFReg(padapter, PathA, RF_RX_G1, bRFRegOffsetMask, 0x00255);
17514 if (IS_HARDWARE_TYPE_8723A(padapter))
17515 pHalData->bt_coexist.b8723aAgcTableOn = _TRUE;
17517 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
17521 void BTDM_BBBackOffLevel(PADAPTER padapter, u8 type)
17523 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17525 if (type == BT_BB_BACKOFF_OFF)
17527 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel Off!\n"));
17528 rtw_write32(padapter, 0xc04,0x3a05611);
17530 else if (type == BT_BB_BACKOFF_ON)
17532 RTPRINT(FBT, BT_TRACE, ("[BT]BBBackOffLevel On!\n"));
17533 rtw_write32(padapter, 0xc04,0x3a07611);
17534 pHalData->bt_coexist.bSWCoexistAllOff = _FALSE;
17538 void BTDM_FWCoexAllOff(PADAPTER padapter)
17540 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17541 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17542 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);;
17545 RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff()\n"));
17546 if (pHalData->bt_coexist.bFWCoexistAllOff)
17548 RTPRINT(FBT, BT_TRACE, ("BTDM_FWCoexAllOff(), real Do\n"));
17550 BTDM_FWCoexAllOff8723A(padapter);
17552 pHalData->bt_coexist.bFWCoexistAllOff = _TRUE;
17555 void BTDM_SWCoexAllOff(PADAPTER padapter)
17557 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17558 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17559 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);;
17562 RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff()\n"));
17563 if (pHalData->bt_coexist.bSWCoexistAllOff)
17565 RTPRINT(FBT, BT_TRACE, ("BTDM_SWCoexAllOff(), real Do\n"));
17566 BTDM_SWCoexAllOff8723A(padapter);
17568 pHalData->bt_coexist.bSWCoexistAllOff = _TRUE;
17571 void BTDM_HWCoexAllOff(PADAPTER padapter)
17573 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17574 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17575 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);;
17578 RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff()\n"));
17579 if (pHalData->bt_coexist.bHWCoexistAllOff)
17581 RTPRINT(FBT, BT_TRACE, ("BTDM_HWCoexAllOff(), real Do\n"));
17583 if (IS_HARDWARE_TYPE_8723A(padapter))
17585 BTDM_HWCoexAllOff8723A(padapter);
17588 pHalData->bt_coexist.bHWCoexistAllOff = _TRUE;
17591 void BTDM_CoexAllOff(PADAPTER padapter)
17593 BTDM_FWCoexAllOff(padapter);
17594 BTDM_SWCoexAllOff(padapter);
17595 BTDM_HWCoexAllOff(padapter);
17598 void BTDM_TurnOffBtCoexistBeforeEnterLPS(PADAPTER padapter)
17600 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17601 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17602 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17603 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
17606 // Add temporarily.
17607 if ((!pHalData->bt_coexist.BluetoothCoexist) ||(!pBtMgnt->bSupportProfile))
17610 // 8723 1Ant doesn't need to turn off bt coexist mechanism.
17611 if (BTDM_1Ant8723A(padapter))
17614 if (IS_HARDWARE_TYPE_8192C(padapter) ||
17615 IS_HARDWARE_TYPE_8192D(padapter) ||
17616 IS_HARDWARE_TYPE_8723A(padapter))
17619 // Before enter LPS, turn off FW BT Co-exist mechanism
17621 if (ppwrctrl->bLeisurePs)
17623 RTPRINT(FBT, BT_TRACE, ("[BT][DM], Before enter LPS, turn off all Coexist DM\n"));
17624 btdm_ResetFWCoexState(padapter);
17625 BTDM_CoexAllOff(padapter);
17626 BTDM_SetAntenna(padapter, BTDM_ANT_BT);
17631 void BTDM_TurnOffBtCoexistBeforeEnterIPS(PADAPTER padapter)
17633 // PMGNT_INFO pMgntInfo = &padapter->MgntInfo;
17634 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17635 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17636 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17637 // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo);
17638 struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv;
17640 if (!pHalData->bt_coexist.BluetoothCoexist)
17643 // 8723 1Ant doesn't need to turn off bt coexist mechanism.
17644 if (BTDM_1Ant8723A(padapter))
17647 if (IS_HARDWARE_TYPE_8192C(padapter) ||
17648 IS_HARDWARE_TYPE_8192D(padapter) ||
17649 IS_HARDWARE_TYPE_8723A(padapter))
17652 // Before enter IPS, turn off FW BT Co-exist mechanism
17654 // if (pPSC->bInactivePs)
17655 if (ppwrctrl->reg_rfoff == rf_on)
17657 RTPRINT(FBT, BT_TRACE, ("[BT][DM], Before enter IPS, turn off all Coexist DM\n"));
17658 btdm_ResetFWCoexState(padapter);
17659 BTDM_CoexAllOff(padapter);
17660 BTDM_SetAntenna(padapter, BTDM_ANT_BT);
17665 void BTDM_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt)
17667 if (IS_HARDWARE_TYPE_8723A(padapter))
17669 BTDM_8723ASignalCompensation(padapter, rssi_wifi, rssi_bt);
17672 #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)
17674 0. write 0xa3 = 0x05
17677 write 0xF6?1:0] = 0x01
17678 write 0x3A[7:0] = 0x31
17680 2. read 0xC0[31:0] == 0
17696 void dm_CheckBTState(_adapter *pAdapter)
17698 u8 value=0,regValue8=0;
17700 //_adapter *pAdapter = (_adapter*)context;
17702 // if (pAdapter->drv_in_test == CMCC_TEST)
17705 rtw_write8(pAdapter, 0xa3, 5);
17707 //DBG_8723A("------>%s,get 0xa3=%0x\n",__func__,rtw_read8(pAdapter, 0xa3));
17709 regValue8 = rtw_read8(pAdapter, 0xa0);
17710 //DBG_8723A("Get 0xa0 = 0x%x\n",regValue8);
17711 if(regValue8 == 0x4){
17712 value = rtw_read8(pAdapter, 0xf6);
17715 rtw_write8(pAdapter, 0xf6, value);
17716 rtw_write8(pAdapter, 0x3A, 0x31);
17719 regvalue32 = rtw_read32(pAdapter, 0xc0);
17720 //DBG_8723A("Get 0xc0 = 0x%x\n",regvalue32);
17721 if(rtw_read32(pAdapter, 0xc0) == 0x0){
17722 value = rtw_read8(pAdapter, 0xcc);
17724 rtw_write8(pAdapter, 0xcc, value);
17727 regValue8 = rtw_read8(pAdapter, 0x6b); //0x6b[28]
17728 //DBG_8723A("Get 0x6b = 0x%x\n",regValue8);
17730 if((regValue8 & 0x10) == 0x10){
17732 rtw_write8(pAdapter, 0x6b, regValue8);
17733 value = rtw_read8(pAdapter, 0xcc);
17735 rtw_write8(pAdapter, 0xcc, value);
17737 else if ((regValue8 & 0x10) == 0){
17739 rtw_write8(pAdapter, 0x6b, regValue8);
17740 value = rtw_read8(pAdapter, 0xcc);
17742 rtw_write8(pAdapter, 0xcc, value);
17745 //DBG_8723A("<------%s,get 0x6b=0x%0x,0xcc=0x%x\n",__func__,rtw_read8(pAdapter, 0x6b),rtw_read8(pAdapter, 0xcc));
17748 void check_bt_status_work(void *data)
17750 struct delayed_work *dwork;
17753 dwork = container_of(data, struct delayed_work, work);
17754 padapter = container_of(dwork, struct _ADAPTER, checkbt_work);
17757 DBG_8723A("%s padapter == NULL\n", __func__);
17761 dm_CheckBTState(padapter);
17764 void BTDM_Coexist(PADAPTER padapter)
17766 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17768 #if defined(CONFIG_CONCURRENT_MODE)
17769 if (padapter->adapter_type != PRIMARY_ADAPTER)
17771 RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE !!\n"));
17772 RTPRINT(FBT, BT_TRACE, ("[DM][BT], padapter->adapter_type != PRIMARY_ADAPTER !!\n"));
17777 if (!pHalData->bt_coexist.BluetoothCoexist)
17779 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BT not exists!!\n"));
17783 if (!pHalData->bt_coexist.bInitlized)
17785 RTPRINT(FBT, BT_TRACE, ("[DM][BT], btdm_InitBtCoexistDM()\n"));
17786 btdm_InitBtCoexistDM(padapter);
17789 RTPRINT(FBT, BT_TRACE, ("\n\n[DM][BT], BTDM start!!\n"));
17791 BTDM_PWDBMonitor(padapter);
17793 if (IS_HARDWARE_TYPE_8723A(padapter))
17795 RTPRINT(FBT, BT_TRACE, ("[DM][BT], HW type is 8723\n"));
17796 BTDM_BTCoexist8723A(padapter);
17798 RTPRINT(FBT, BT_TRACE, ("[DM][BT], BTDM end!!\n\n"));
17801 void BTDM_UpdateCoexState(PADAPTER padapter)
17803 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17805 if (!BTDM_IsSameCoexistState(padapter))
17807 RTPRINT(FBT, BT_TRACE, ("[BTCoex], Coexist State[bitMap] change from 0x%"i64fmt"x to 0x%"i64fmt"x, changeBits=0x%"i64fmt"x\n",
17808 pHalData->bt_coexist.PreviousState,
17809 pHalData->bt_coexist.CurrentState,
17810 (pHalData->bt_coexist.PreviousState^pHalData->bt_coexist.CurrentState)));
17811 pHalData->bt_coexist.PreviousState = pHalData->bt_coexist.CurrentState;
17815 u8 BTDM_IsSameCoexistState(PADAPTER padapter)
17817 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17819 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17825 RTPRINT(FBT, BT_TRACE, ("[DM][BT], Coexist state changed!!\n"));
17830 void BTDM_PWDBMonitor(PADAPTER padapter)
17832 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
17833 PBT30Info pBTInfo = GET_BT_INFO(GetDefaultAdapter(padapter));
17834 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17835 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17836 u8 H2C_Parameter[3] = {0};
17837 s32 tmpBTEntryMaxPWDB=0, tmpBTEntryMinPWDB=0xff;
17840 if (pBtMgnt->BtOperationOn)
17842 for (i = 0; i < MAX_BT_ASOC_ENTRY_NUM; i++)
17844 if (pBTInfo->BtAsocEntry[i].bUsed)
17846 if (pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB < tmpBTEntryMinPWDB)
17847 tmpBTEntryMinPWDB = pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB;
17848 if (pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB > tmpBTEntryMaxPWDB)
17849 tmpBTEntryMaxPWDB = pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB;
17852 // Report every BT connection (HS mode) RSSI to FW
17854 H2C_Parameter[2] = (u8)(pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB & 0xFF);
17855 H2C_Parameter[0] = (MAX_FW_SUPPORT_MACID_NUM-1-i);
17856 RTPRINT(FDM, DM_BT30, ("RSSI report for BT[%d], H2C_Par = 0x%x\n", i, H2C_Parameter[0]));
17857 FillH2CCmd(padapter, RSSI_SETTING_EID, 3, H2C_Parameter);
17858 RTPRINT_ADDR(FDM, (DM_PWDB|DM_BT30), ("BT_Entry Mac :"), pBTInfo->BtAsocEntry[i].BTRemoteMACAddr)
17859 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT rx pwdb[%d] = 0x%x(%d)\n", i, pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB,
17860 pBTInfo->BtAsocEntry[i].UndecoratedSmoothedPWDB));
17863 if (tmpBTEntryMaxPWDB != 0) // If associated entry is found
17865 pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = tmpBTEntryMaxPWDB;
17866 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMaxPWDB = 0x%x(%d)\n",
17867 tmpBTEntryMaxPWDB, tmpBTEntryMaxPWDB));
17871 pHalData->dmpriv.BT_EntryMaxUndecoratedSmoothedPWDB = 0;
17873 if (tmpBTEntryMinPWDB != 0xff) // If associated entry is found
17875 pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = tmpBTEntryMinPWDB;
17876 RTPRINT(FDM, (DM_PWDB|DM_BT30), ("BT_EntryMinPWDB = 0x%x(%d)\n",
17877 tmpBTEntryMinPWDB, tmpBTEntryMinPWDB));
17881 pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB = 0;
17886 u8 BTDM_DigByBtRssi(PADAPTER padapter)
17888 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
17889 PBT30Info pBTInfo = GET_BT_INFO(GetDefaultAdapter(padapter));
17890 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17891 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17893 PDM_ODM_T pDM_OutSrc = &pHalData->odmpriv;
17894 u8 digForBtHs=0, cckCcaThres=0;
17898 // When running under HS mode, use bt related Dig and cck threshold.
17900 if (pBtMgnt->BtOperationOn)
17902 if (pBtMgnt->bBTConnectInProgress)
17904 if (IS_HARDWARE_TYPE_8723A(padapter))
17912 // Decide DIG value by BT RSSI.
17914 digForBtHs = (u8)pHalData->dmpriv.BT_EntryMinUndecoratedSmoothedPWDB;
17916 if (IS_HARDWARE_TYPE_8723A(padapter))
17917 digForBtHs += 0x04;
17919 if (digForBtHs > DM_DIG_MAX_NIC)
17920 digForBtHs = DM_DIG_MAX_NIC;
17921 if (digForBtHs < DM_DIG_MIN_NIC)
17922 digForBtHs = DM_DIG_MIN_NIC;
17924 RTPRINT(FDM, DM_BT30, ("BTDM_DigByBtRssi(), digForBtHs=0x%x\n",
17927 ODM_Write_DIG(pDM_OutSrc, digForBtHs);
17930 // Decide cck packet threshold
17932 cckCcaThres = 0xcd;
17933 ODM_Write_CCK_CCA_Thres(pDM_OutSrc, cckCcaThres);
17941 u8 BTDM_IsBTBusy(PADAPTER padapter)
17943 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17944 PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt;
17946 if (pBtMgnt->ExtConfig.bBTBusy)
17952 u8 BTDM_IsWifiBusy(PADAPTER padapter)
17954 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
17955 struct mlme_priv *pmlmepriv = &(GetDefaultAdapter(padapter)->mlmepriv);
17956 PBT30Info pBTInfo = GET_BT_INFO(padapter);
17957 PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic;
17960 if (pmlmepriv->LinkDetectInfo.bBusyTraffic ||
17961 pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
17962 pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
17968 u8 BTDM_IsCoexistStateChanged(PADAPTER padapter)
17970 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
17972 if (pHalData->bt_coexist.PreviousState == pHalData->bt_coexist.CurrentState)
17978 u8 BTDM_IsWifiUplink(PADAPTER padapter)
17980 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
17981 struct mlme_priv *pmlmepriv;
17983 PBT_TRAFFIC pBtTraffic;
17986 pmlmepriv = &padapter->mlmepriv;
17987 pBTInfo = GET_BT_INFO(padapter);
17988 pBtTraffic = &pBTInfo->BtTraffic;
17990 if ((pmlmepriv->LinkDetectInfo.bTxBusyTraffic) ||
17991 (pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic))
17997 u8 BTDM_IsWifiDownlink(PADAPTER padapter)
17999 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
18000 struct mlme_priv *pmlmepriv;
18002 PBT_TRAFFIC pBtTraffic;
18005 pmlmepriv = &padapter->mlmepriv;
18006 pBTInfo = GET_BT_INFO(padapter);
18007 pBtTraffic = &pBTInfo->BtTraffic;
18009 if ((pmlmepriv->LinkDetectInfo.bRxBusyTraffic) ||
18010 (pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic))
18016 u8 BTDM_IsBTHSMode(PADAPTER padapter)
18018 // PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
18019 PHAL_DATA_TYPE pHalData;
18023 pHalData = GET_HAL_DATA(padapter);
18024 pBtMgnt = &pHalData->BtInfo.BtMgnt;
18026 if (pBtMgnt->BtOperationOn)
18032 u8 BTDM_IsBTUplink(PADAPTER padapter)
18034 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18036 if (pHalData->bt_coexist.BT21TrafficStatistics.bTxBusyTraffic)
18042 u8 BTDM_IsBTDownlink(PADAPTER padapter)
18044 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18046 if (pHalData->bt_coexist.BT21TrafficStatistics.bRxBusyTraffic)
18052 void BTDM_AdjustForBtOperation(PADAPTER padapter)
18054 RTPRINT(FBT, BT_TRACE, ("[BT][DM], BTDM_AdjustForBtOperation()\n"));
18055 if (IS_HARDWARE_TYPE_8723A(padapter))
18057 BTDM_AdjustForBtOperation8723A(padapter);
18061 u8 BTDM_AdjustRssiForAgcTableOn(PADAPTER padapter)
18063 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18065 if (!IS_HARDWARE_TYPE_8192D(padapter) &&
18066 !IS_HARDWARE_TYPE_8723A(padapter))
18069 if (pHalData->bt_coexist.b92DAgcTableOn)
18072 if (pHalData->bt_coexist.b8723aAgcTableOn)
18078 void BTDM_SetBtCoexCurrAntNum(PADAPTER padapter, u8 antNum)
18080 if (IS_HARDWARE_TYPE_8723A(padapter))
18081 BTDM_Set8723ABtCoexCurrAntNum(padapter, antNum);
18084 void BTDM_ForHalt(PADAPTER padapter)
18086 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18088 if (!pHalData->bt_coexist.BluetoothCoexist)
18093 if (IS_HARDWARE_TYPE_8723A(padapter))
18095 BTDM_ForHalt8723A(padapter);
18096 GET_HAL_DATA(padapter)->bt_coexist.bInitlized = _FALSE;
18100 void BTDM_WifiScanNotify(PADAPTER padapter, u8 scanType)
18102 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18104 if (!pHalData->bt_coexist.BluetoothCoexist)
18109 if (IS_HARDWARE_TYPE_8723A(padapter))
18110 BTDM_WifiScanNotify8723A(padapter, scanType);
18113 void BTDM_WifiAssociateNotify(PADAPTER padapter, u8 action)
18115 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18117 if (!pHalData->bt_coexist.BluetoothCoexist)
18122 if (IS_HARDWARE_TYPE_8723A(padapter))
18123 BTDM_WifiAssociateNotify8723A(padapter, action);
18126 void BTDM_MediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus)
18128 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18130 if (!pHalData->bt_coexist.BluetoothCoexist)
18135 if (IS_HARDWARE_TYPE_8723A(padapter))
18136 BTDM_MediaStatusNotify8723A(padapter, mstatus);
18139 void BTDM_ForDhcp(PADAPTER padapter)
18141 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18143 if (!pHalData->bt_coexist.BluetoothCoexist)
18148 if (IS_HARDWARE_TYPE_8723A(padapter))
18149 BTDM_ForDhcp8723A(padapter);
18152 void BTDM_ResetActionProfileState(PADAPTER padapter)
18154 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18156 pHalData->bt_coexist.CurrentState &= ~\
18157 (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP|
18158 BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_SCO);
18161 u8 BTDM_IsActionSCO(PADAPTER padapter)
18163 PHAL_DATA_TYPE pHalData;
18170 pHalData = GET_HAL_DATA(padapter);
18171 pBTInfo = GET_BT_INFO(padapter);
18172 pBtMgnt = &pBTInfo->BtMgnt;
18173 pBtDbg = &pBTInfo->BtDbg;
18176 if (pBtDbg->dbgCtrl == _TRUE)
18178 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_SCO)
18180 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
18186 if (pBtMgnt->ExtConfig.NumberOfSCO > 0)
18188 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_SCO;
18195 u8 BTDM_IsActionHID(PADAPTER padapter)
18198 PHAL_DATA_TYPE pHalData;
18204 pHalData = GET_HAL_DATA(padapter);
18205 pBTInfo = GET_BT_INFO(padapter);
18206 pBtMgnt = &pBTInfo->BtMgnt;
18207 pBtDbg = &pBTInfo->BtDbg;
18210 if (pBtDbg->dbgCtrl == _TRUE )
18212 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID)
18214 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
18220 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && pBtMgnt->ExtConfig.NumberOfHandle==1)
18222 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_HID;
18229 u8 BTDM_IsActionA2DP(PADAPTER padapter)
18231 PHAL_DATA_TYPE pHalData;
18238 pHalData = GET_HAL_DATA(padapter);
18239 pBTInfo = GET_BT_INFO(padapter);
18240 pBtMgnt = &pBTInfo->BtMgnt;
18241 pBtDbg = &pBTInfo->BtDbg;
18244 if (pBtDbg->dbgCtrl == _TRUE )
18246 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_A2DP)
18248 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
18254 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP) && pBtMgnt->ExtConfig.NumberOfHandle==1)
18256 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_A2DP;
18263 u8 BTDM_IsActionPAN(PADAPTER padapter)
18265 PHAL_DATA_TYPE pHalData;
18272 pHalData = GET_HAL_DATA(padapter);
18273 pBTInfo = GET_BT_INFO(padapter);
18274 pBtMgnt = &pBTInfo->BtMgnt;
18275 pBtDbg = &pBTInfo->BtDbg;
18278 if (pBtDbg->dbgCtrl == _TRUE)
18280 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN)
18282 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
18288 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && pBtMgnt->ExtConfig.NumberOfHandle==1)
18290 pHalData->bt_coexist.CurrentState |= BT_COEX_STATE_PROFILE_PAN;
18297 u8 BTDM_IsActionHIDA2DP(PADAPTER padapter)
18299 PHAL_DATA_TYPE pHalData;
18306 pHalData = GET_HAL_DATA(padapter);
18307 pBTInfo = GET_BT_INFO(padapter);
18308 pBtMgnt = &pBTInfo->BtMgnt;
18309 pBtDbg = &pBTInfo->BtDbg;
18312 if (pBtDbg->dbgCtrl == _TRUE)
18314 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_A2DP)
18316 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
18322 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
18324 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_A2DP);
18331 u8 BTDM_IsActionHIDPAN(PADAPTER padapter)
18333 PHAL_DATA_TYPE pHalData;
18339 pHalData = GET_HAL_DATA(padapter);
18340 pBTInfo = GET_BT_INFO(padapter);
18341 pBtDbg = &pBTInfo->BtDbg;
18344 if (pBtDbg->dbgCtrl == _TRUE )
18346 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_HID_PAN)
18348 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
18354 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_HID) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN))
18356 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_HID|BT_COEX_STATE_PROFILE_PAN);
18363 u8 BTDM_IsActionPANA2DP(PADAPTER padapter)
18365 PHAL_DATA_TYPE pHalData;
18371 pHalData = GET_HAL_DATA(padapter);
18372 pBTInfo = GET_BT_INFO(padapter);
18373 pBtDbg = &pBTInfo->BtDbg;
18376 if (pBtDbg->dbgCtrl == _TRUE )
18378 if (pBtDbg->dbgProfile == BT_DBG_PROFILE_PAN_A2DP)
18380 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
18386 if (BTHCI_CheckProfileExist(padapter,BT_PROFILE_PAN) && BTHCI_CheckProfileExist(padapter,BT_PROFILE_A2DP))
18388 pHalData->bt_coexist.CurrentState |= (BT_COEX_STATE_PROFILE_PAN|BT_COEX_STATE_PROFILE_A2DP);
18395 u8 BTDM_IsBtDisabled(PADAPTER padapter)
18397 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18399 if (pHalData->bt_coexist.bCurBtDisabled)
18405 //============================================
18406 // Started with "WA_" means this is a work around function.
18407 // Because fw need to count bt HW counters
18408 //(BT_ACTIVE/BT_STATE/BT_POLLING)
18409 // in beacon related interrupt, so we have to write beacon control
18411 //============================================
18412 void WA_BTDM_EnableBTFwCounterPolling(PADAPTER padapter)
18414 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18416 // Currently, only 88cu and 92de need to enter the function
18417 if (!IS_HARDWARE_TYPE_8192CU(padapter) &&
18418 !IS_HARDWARE_TYPE_8192DE(padapter))
18421 if (!pHalData->bt_coexist.BluetoothCoexist)
18428 // Enable BT firmware counter statistics.
18429 // We have to set 0x550[3]=1 to enable it.
18430 // Advised by Scott.
18433 u1val = rtw_read8(padapter, REG_BCN_CTRL);
18435 rtw_write8(padapter, REG_BCN_CTRL, u1val);
18439 // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtCoexist.c =====
18442 #ifdef __HALBT_C__ // HAL/HalBT.c
18443 // ===== Below this line is sync from SD7 driver HAL/HalBT.c =====
18445 //==================================================
18447 //==================================================
18449 static void halbt_InitHwConfig8723A(PADAPTER padapter)
18453 //==================================================
18455 //==================================================
18456 u8 HALBT_GetPGAntNum(PADAPTER padapter)
18458 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18460 return pHalData->bt_coexist.BT_Ant_Num;
18463 void HALBT_SetKey(PADAPTER padapter, u8 EntryNum)
18466 PBT_ASOC_ENTRY pBtAssocEntry;
18470 pBTinfo = GET_BT_INFO(padapter);
18471 pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
18473 pBtAssocEntry->HwCAMIndex = BT_HWCAM_STAR + EntryNum;
18475 usConfig = CAM_VALID | (CAM_AES << 2);
18476 write_cam(padapter, pBtAssocEntry->HwCAMIndex, usConfig, pBtAssocEntry->BTRemoteMACAddr, pBtAssocEntry->PTK + TKIP_ENC_KEY_POS);
18479 void HALBT_RemoveKey(PADAPTER padapter, u8 EntryNum)
18482 PBT_ASOC_ENTRY pBtAssocEntry;
18484 pBTinfo = GET_BT_INFO(padapter);
18485 pBtAssocEntry = &(pBTinfo->BtAsocEntry[EntryNum]);
18487 if (pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex != 0) {
18488 // ToDo : add New HALBT_RemoveKey function !!
18489 if (pBtAssocEntry->HwCAMIndex >= BT_HWCAM_STAR && pBtAssocEntry->HwCAMIndex < HALF_CAM_ENTRY)
18490 CAM_empty_entry(padapter, pBtAssocEntry->HwCAMIndex);
18491 pBTinfo->BtAsocEntry[EntryNum].HwCAMIndex = 0;
18495 void HALBT_InitBTVars8723A(PADAPTER padapter)
18497 PHAL_DATA_TYPE pHalData;
18500 pHalData = GET_HAL_DATA(padapter);
18502 pHalData->bt_coexist.BluetoothCoexist = pHalData->EEPROMBluetoothCoexist;
18503 pHalData->bt_coexist.BT_Ant_Num = pHalData->EEPROMBluetoothAntNum;
18504 pHalData->bt_coexist.BT_CoexistType = pHalData->EEPROMBluetoothType;
18505 pHalData->bt_coexist.BT_Ant_isolation = pHalData->EEPROMBluetoothAntIsolation;
18506 pHalData->bt_coexist.BT_RadioSharedType = pHalData->EEPROMBluetoothRadioShared;
18508 RT_TRACE(_module_hal_init_c_, _drv_info_, ("BT Coexistance = 0x%x\n", pHalData->bt_coexist.BluetoothCoexist));
18509 if (pHalData->bt_coexist.BluetoothCoexist)
18511 if (pHalData->bt_coexist.BT_Ant_Num == Ant_x2)
18513 BTDM_SetBtCoexCurrAntNum(padapter, 2);
18514 RT_TRACE(_module_hal_init_c_, _drv_info_,("BlueTooth BT_Ant_Num = Antx2\n"));
18515 // DBG_8723A("%s WiFi BT coexist Ant_Num = Antx2\n",__func__);
18517 else if (pHalData->bt_coexist.BT_Ant_Num == Ant_x1)
18519 BTDM_SetBtCoexCurrAntNum(padapter, 1);
18520 RT_TRACE(_module_hal_init_c_, _drv_info_,("BlueTooth BT_Ant_Num = Antx1\n"));
18521 // DBG_8723A("%s WiFi BT coexist Ant_Num Ant_Num = Antx1\n",__func__);
18523 pHalData->bt_coexist.bBTBusyTraffic = _FALSE;
18524 pHalData->bt_coexist.bBTTrafficModeSet = _FALSE;
18525 pHalData->bt_coexist.bBTNonTrafficModeSet = _FALSE;
18526 pHalData->bt_coexist.CurrentState = 0;
18527 pHalData->bt_coexist.PreviousState = 0;
18529 RT_TRACE(_module_hal_init_c_, _drv_info_,("BT_RadioSharedType = 0x%x\n", pHalData->bt_coexist.BT_RadioSharedType));
18533 u8 HALBT_IsBTExist(PADAPTER padapter)
18535 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18537 if (pHalData->bt_coexist.BluetoothCoexist)
18543 u8 HALBT_BTChipType(PADAPTER padapter)
18545 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
18547 return pHalData->bt_coexist.BT_CoexistType;
18550 void HALBT_InitHwConfig(PADAPTER padapter)
18552 halbt_InitHwConfig8723A(padapter);
18553 BTDM_Coexist(padapter);
18556 void HALBT_IPSRFOffCheck(PADAPTER padapter)
18560 PHAL_DATA_TYPE pHalData;
18563 pBTinfo = GET_BT_INFO(padapter);
18564 pBtMgnt = &pBTinfo->BtMgnt;
18565 pHalData = GET_HAL_DATA(padapter);
18567 if (IS_HARDWARE_TYPE_8192C(padapter) ||
18568 IS_HARDWARE_TYPE_8192D(padapter) ||
18569 IS_HARDWARE_TYPE_8723A(padapter))
18571 if ((pHalData->bt_coexist.BluetoothCoexist) &&
18572 (pBtMgnt->bSupportProfile))
18574 RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_IPSRFOffCheck(), turn off all Coexist DM\n"));
18575 BTDM_CoexAllOff(padapter);
18580 void HALBT_LPSRFOffCheck(PADAPTER padapter)
18584 PHAL_DATA_TYPE pHalData;
18587 pBTinfo = GET_BT_INFO(padapter);
18588 pBtMgnt = &pBTinfo->BtMgnt;
18589 pHalData = GET_HAL_DATA(padapter);
18591 if (IS_HARDWARE_TYPE_8192C(padapter) ||
18592 IS_HARDWARE_TYPE_8192D(padapter) ||
18593 IS_HARDWARE_TYPE_8723A(padapter))
18595 if ((pHalData->bt_coexist.BluetoothCoexist) &&
18596 (pBtMgnt->bSupportProfile))
18598 RTPRINT(FBT, BT_TRACE, ("[BT][DM], HALBT_LPSRFOffCheck(), turn off all Coexist DM\n"));
18599 BTDM_CoexAllOff(padapter);
18604 void HALBT_SetRtsCtsNoLenLimit(PADAPTER padapter)
18606 #if (RTS_CTS_NO_LEN_LIMIT == 1)
18607 rtw_write32(padapter, 0x4c8, 0xc140402);
18611 u8 HALBT_OnlySupport1T(PADAPTER padapter)
18626 u8 H2C_Parameter[5] = {0};
18628 if (IS_HARDWARE_TYPE_8723A(padapter))
18631 //FillH2CCmd(padapter, 0xaf, 5, H2C_Parameter);
18635 *pRetVal = 0xffffffff;
18642 void HALBT_SwitchWirelessMode(PADAPTER padapter, u8 targetWirelessMode)
18646 // ===== End of sync from SD7 driver HAL/HalBT.c =====