8723BU: Update 8723BU wifi driver to version v4.3.16_14189.20150519_BTCOEX2015119...
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / core / rtw_btcoex.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2013 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #ifdef CONFIG_BT_COEXIST
21
22 #include <drv_types.h>
23 #include <hal_btcoex.h>
24 #include <hal_data.h>
25
26
27 void rtw_btcoex_Initialize(PADAPTER padapter)
28 {
29         hal_btcoex_Initialize(padapter);
30 }
31
32 void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
33 {
34         hal_btcoex_PowerOnSetting(padapter);
35 }
36
37 void rtw_btcoex_PreLoadFirmware(PADAPTER padapter)
38 {
39         hal_btcoex_PreLoadFirmware(padapter);
40 }
41
42 void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly)
43 {
44         hal_btcoex_InitHwConfig(padapter, bWifiOnly);
45 }
46
47 void rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type)
48 {
49         PHAL_DATA_TYPE  pHalData;
50
51         pHalData = GET_HAL_DATA(padapter);
52         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
53                 return;
54
55         hal_btcoex_IpsNotify(padapter, type);
56 }
57
58 void rtw_btcoex_LpsNotify(PADAPTER padapter, u8 type)
59 {
60         PHAL_DATA_TYPE  pHalData;
61
62         pHalData = GET_HAL_DATA(padapter);
63         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
64                 return;
65
66         hal_btcoex_LpsNotify(padapter, type);
67 }
68
69 void rtw_btcoex_ScanNotify(PADAPTER padapter, u8 type)
70 {
71         PHAL_DATA_TYPE  pHalData;
72 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
73         struct bt_coex_info *pcoex_info = &padapter->coex_info;
74         PBT_MGNT        pBtMgnt=&pcoex_info->BtMgnt;
75 #endif //CONFIG_BT_COEXIST_SOCKET_TRX
76
77         pHalData = GET_HAL_DATA(padapter);
78         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
79                 return;
80
81 #ifdef CONFIG_CONCURRENT_MODE
82         if ((_FALSE == type) && (padapter->pbuddy_adapter))
83         {
84                 PADAPTER pbuddy = padapter->pbuddy_adapter;
85                 if (check_fwstate(&pbuddy->mlmepriv, WIFI_SITE_MONITOR) == _TRUE)
86                         return;
87         }
88 #endif
89
90 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
91         if(pBtMgnt->ExtConfig.bEnableWifiScanNotify)
92                 rtw_btcoex_SendScanNotify(padapter, type);
93 #endif //CONFIG_BT_COEXIST_SOCKET_TRX   
94
95         hal_btcoex_ScanNotify(padapter, type);
96 }
97
98 void rtw_btcoex_ConnectNotify(PADAPTER padapter, u8 action)
99 {
100         PHAL_DATA_TYPE  pHalData;
101
102         pHalData = GET_HAL_DATA(padapter);
103         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
104                 return;
105
106 #ifdef DBG_CONFIG_ERROR_RESET
107         if (_TRUE == rtw_hal_sreset_inprogress(padapter))
108         {
109                 DBG_8192C(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n",
110                         FUNC_ADPT_ARG(padapter));
111                 return;
112         }
113 #endif // DBG_CONFIG_ERROR_RESET
114                 
115 #ifdef CONFIG_CONCURRENT_MODE
116         if ((_FALSE == action) && (padapter->pbuddy_adapter))
117         {
118                 PADAPTER pbuddy = padapter->pbuddy_adapter;
119                 if (check_fwstate(&pbuddy->mlmepriv, WIFI_UNDER_LINKING) == _TRUE)
120                         return;
121         }
122 #endif
123
124         hal_btcoex_ConnectNotify(padapter, action);
125 }
126
127 void rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus)
128 {
129         PHAL_DATA_TYPE  pHalData;
130
131         pHalData = GET_HAL_DATA(padapter);
132         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
133                 return;
134
135 #ifdef DBG_CONFIG_ERROR_RESET
136         if (_TRUE == rtw_hal_sreset_inprogress(padapter))
137         {
138                 DBG_8192C(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n",
139                         FUNC_ADPT_ARG(padapter));
140                 return;
141         }
142 #endif // DBG_CONFIG_ERROR_RESET
143
144 #ifdef CONFIG_CONCURRENT_MODE
145         if ((RT_MEDIA_DISCONNECT == mediaStatus) && (padapter->pbuddy_adapter))
146         {
147                 PADAPTER pbuddy = padapter->pbuddy_adapter;
148                 if (check_fwstate(&pbuddy->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
149                         return;
150         }
151 #endif // CONFIG_CONCURRENT_MODE
152
153         if ((RT_MEDIA_CONNECT == mediaStatus)
154                 && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE))
155         {
156                 rtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL);
157         }
158
159         hal_btcoex_MediaStatusNotify(padapter, mediaStatus);
160 }
161
162 void rtw_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType)
163 {
164         PHAL_DATA_TYPE  pHalData;
165
166         pHalData = GET_HAL_DATA(padapter);
167         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
168                 return;
169
170         hal_btcoex_SpecialPacketNotify(padapter, pktType);
171 }
172
173 void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state)
174 {
175         PHAL_DATA_TYPE  pHalData;
176
177         pHalData = GET_HAL_DATA(padapter);
178         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
179                 return;
180
181         hal_btcoex_IQKNotify(padapter, state);
182 }
183
184 void rtw_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf)
185 {
186         PHAL_DATA_TYPE  pHalData;
187
188         pHalData = GET_HAL_DATA(padapter);
189         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
190                 return;
191
192         hal_btcoex_BtInfoNotify(padapter, length, tmpBuf);
193 }
194
195 void rtw_btcoex_SuspendNotify(PADAPTER padapter, u8 state)
196 {
197         PHAL_DATA_TYPE  pHalData;
198
199         pHalData = GET_HAL_DATA(padapter);
200         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
201                 return;
202
203         hal_btcoex_SuspendNotify(padapter, state);
204 }
205
206 void rtw_btcoex_HaltNotify(PADAPTER padapter)
207 {
208         PHAL_DATA_TYPE  pHalData;
209
210         pHalData = GET_HAL_DATA(padapter);
211         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
212                 return;
213
214         if (_FALSE == padapter->bup)
215         {
216                 DBG_871X(FUNC_ADPT_FMT ": bup=%d Skip!\n",
217                         FUNC_ADPT_ARG(padapter), padapter->bup);
218
219                 return;
220         }
221
222         if (_TRUE == padapter->bSurpriseRemoved)
223         {
224                 DBG_871X(FUNC_ADPT_FMT ": bSurpriseRemoved=%d Skip!\n",
225                         FUNC_ADPT_ARG(padapter), padapter->bSurpriseRemoved);
226
227                 return;
228         }
229
230         hal_btcoex_HaltNotify(padapter);
231 }
232
233 void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)
234 {
235         hal_btcoex_SwitchBtTRxMask(padapter);   
236 }
237
238 void rtw_btcoex_Switch(PADAPTER padapter, u8 enable)
239 {
240         hal_btcoex_SetBTCoexist(padapter, enable);
241 }
242
243 u8 rtw_btcoex_IsBtDisabled(PADAPTER padapter)
244 {
245         return hal_btcoex_IsBtDisabled(padapter);
246 }
247
248 void rtw_btcoex_Handler(PADAPTER padapter)
249 {
250         PHAL_DATA_TYPE  pHalData;
251
252         pHalData = GET_HAL_DATA(padapter);
253
254         if (_FALSE == pHalData->EEPROMBluetoothCoexist)
255                 return;
256
257 #if defined(CONFIG_CONCURRENT_MODE)
258         if (padapter->adapter_type != PRIMARY_ADAPTER)
259                 return;
260 #endif
261
262
263
264         hal_btcoex_Hanlder(padapter);
265 }
266
267 s32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter)
268 {
269         s32 coexctrl;
270
271         coexctrl = hal_btcoex_IsBTCoexRejectAMPDU(padapter);
272
273         return coexctrl;
274 }
275
276 s32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter)
277 {
278         s32 coexctrl;
279
280         coexctrl = hal_btcoex_IsBTCoexCtrlAMPDUSize(padapter);
281
282         return coexctrl;
283 }
284
285 u32 rtw_btcoex_GetAMPDUSize(PADAPTER padapter)
286 {
287         u32 size;
288
289         size = hal_btcoex_GetAMPDUSize(padapter);
290
291         return size;
292 }
293
294 void rtw_btcoex_SetManualControl(PADAPTER padapter, u8 manual)
295 {
296         if (_TRUE == manual)
297         {
298                 hal_btcoex_SetManualControl(padapter, _TRUE);
299         }
300         else
301         {
302                 hal_btcoex_SetManualControl(padapter, _FALSE);
303         }
304 }
305
306 u8 rtw_btcoex_1Ant(PADAPTER padapter)
307 {
308         return hal_btcoex_1Ant(padapter);
309 }
310
311 u8 rtw_btcoex_IsBtControlLps(PADAPTER padapter)
312 {
313         return hal_btcoex_IsBtControlLps(padapter);
314 }
315
316 u8 rtw_btcoex_IsLpsOn(PADAPTER padapter)
317 {
318         return hal_btcoex_IsLpsOn(padapter);
319 }
320
321 u8 rtw_btcoex_RpwmVal(PADAPTER padapter)
322 {
323         return hal_btcoex_RpwmVal(padapter);
324 }
325
326 u8 rtw_btcoex_LpsVal(PADAPTER padapter)
327 {
328         return hal_btcoex_LpsVal(padapter);
329 }
330
331 void rtw_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)
332 {
333         hal_btcoex_SetBTCoexist(padapter, bBtExist);
334 }
335
336 void rtw_btcoex_SetChipType(PADAPTER padapter, u8 chipType)
337 {
338         hal_btcoex_SetChipType(padapter, chipType);
339 }
340
341 void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum)
342 {
343         hal_btcoex_SetPgAntNum(padapter, antNum);
344 }
345
346 u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
347 {
348         return hal_btcoex_GetPgAntNum(padapter);
349 }
350
351 void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
352 {
353         hal_btcoex_SetSingleAntPath(padapter, singleAntPath);
354 }
355
356 u32 rtw_btcoex_GetRaMask(PADAPTER padapter)
357 {
358         return hal_btcoex_GetRaMask(padapter);
359 }
360
361 void rtw_btcoex_RecordPwrMode(PADAPTER padapter, u8 *pCmdBuf, u8 cmdLen)
362 {
363         hal_btcoex_RecordPwrMode(padapter, pCmdBuf, cmdLen);
364 }
365
366 void rtw_btcoex_DisplayBtCoexInfo(PADAPTER padapter, u8 *pbuf, u32 bufsize)
367 {
368         hal_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);
369 }
370
371 void rtw_btcoex_SetDBG(PADAPTER padapter, u32 *pDbgModule)
372 {
373         hal_btcoex_SetDBG(padapter, pDbgModule);
374 }
375
376 u32 rtw_btcoex_GetDBG(PADAPTER padapter, u8 *pStrBuf, u32 bufSize)
377 {
378         return hal_btcoex_GetDBG(padapter, pStrBuf, bufSize);
379 }
380
381 u8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER padapter)
382 {
383         return hal_btcoex_IncreaseScanDeviceNum(padapter);
384 }
385
386 u8 rtw_btcoex_IsBtLinkExist(PADAPTER padapter)
387 {
388         return hal_btcoex_IsBtLinkExist(padapter);
389 }
390
391 void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer)
392 {
393         hal_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer);
394 }
395
396 void rtw_btcoex_SetHciVersion(PADAPTER  padapter, u16 hciVersion)
397 {
398         hal_btcoex_SetHciVersion(padapter, hciVersion);
399 }
400
401 void rtw_btcoex_StackUpdateProfileInfo(void) 
402 {
403         hal_btcoex_StackUpdateProfileInfo();
404 }
405
406 // ==================================================
407 // Below Functions are called by BT-Coex
408 // ==================================================
409 void rtw_btcoex_rx_ampdu_apply(PADAPTER padapter)
410 {
411         rtw_rx_ampdu_apply(padapter);
412 }
413
414 void rtw_btcoex_LPS_Enter(PADAPTER padapter)
415 {
416         struct pwrctrl_priv *pwrpriv;
417         u8 lpsVal;
418
419
420         pwrpriv = adapter_to_pwrctl(padapter);
421
422         pwrpriv->bpower_saving = _TRUE;
423         lpsVal = rtw_btcoex_LpsVal(padapter);
424         rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, lpsVal, "BTCOEX");
425 }
426
427 void rtw_btcoex_LPS_Leave(PADAPTER padapter)
428 {
429         struct pwrctrl_priv *pwrpriv;
430
431
432         pwrpriv = adapter_to_pwrctl(padapter);
433
434         if (pwrpriv->pwr_mode != PS_MODE_ACTIVE)
435         {
436                 rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "BTCOEX");
437                 LPS_RF_ON_check(padapter, 100);
438                 pwrpriv->bpower_saving = _FALSE;
439         }
440 }
441
442
443 // ==================================================
444 // Below Functions are BT-Coex socket related function
445 // ==================================================
446
447 #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
448 _adapter *pbtcoexadapter = NULL;
449 u8 rtw_btcoex_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)
450 {
451         struct cmd_obj *ph2c;
452         struct drvextra_cmd_parm *pdrvextra_cmd_parm;
453         u8 *btinfo;
454         struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
455         u8      res = _SUCCESS;
456
457         ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
458         if (ph2c == NULL) {
459                 res = _FAIL;
460                 goto exit;
461         }
462
463         pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
464         if (pdrvextra_cmd_parm == NULL) {
465                 rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
466                 res = _FAIL;
467                 goto exit;
468         }
469
470         btinfo = rtw_zmalloc(len);
471         if (btinfo == NULL) {
472                 rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
473                 rtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));
474                 res = _FAIL;
475                 goto exit;
476         }
477
478         pdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;
479         pdrvextra_cmd_parm->type = 0;
480         pdrvextra_cmd_parm->size = len;
481         pdrvextra_cmd_parm->pbuf = btinfo;
482
483         _rtw_memcpy(btinfo, buf, len);
484
485         init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
486
487         res = rtw_enqueue_cmd(pcmdpriv, ph2c);
488
489 exit:
490         return res;
491 }
492
493 u8 rtw_btcoex_send_event_to_BT(_adapter *padapter, u8 status,  u8 event_code, u8 opcode_low, u8 opcode_high,u8 *dbg_msg)
494 {
495         u8 localBuf[6] = "";
496         u8 *pRetPar;
497         u8      len=0,tx_event_length = 0;
498         rtw_HCI_event *pEvent;
499         
500         pEvent = (rtw_HCI_event*)(&localBuf[0]);
501
502         pEvent->EventCode = event_code;
503         pEvent->Data[0] = 0x1;  //packet #
504         pEvent->Data[1] = opcode_low;
505         pEvent->Data[2] = opcode_high;
506         len = len + 3;
507
508                 // Return parameters starts from here
509         pRetPar = &pEvent->Data[len];           
510         pRetPar[0] = status;            //status
511
512         len++;
513         pEvent->Length = len;
514
515         //total tx event length + EventCode length + sizeof(length)
516         tx_event_length = pEvent->Length + 2;
517 #if 0
518         rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, dbg_msg);
519 #endif          
520         status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
521                 
522         return status;
523 }
524
525 /* 
526 Ref: 
527 Realtek Wi-Fi Driver
528 Host Controller Interface for
529 Bluetooth 3.0 + HS V1.4 2013/02/07
530
531 Window team code & BT team code
532  */
533
534
535 u8 rtw_btcoex_parse_BT_info_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
536 {
537         #define BT_INFO_LENGTH 8
538         
539         u8 curPollEnable = pcmd[0];
540         u8 curPollTime = pcmd[1];
541         u8 btInfoReason = pcmd[2];
542         u8 btInfoLen = pcmd[3];
543         u8 btinfo[BT_INFO_LENGTH];
544
545         u8 localBuf[6] = "";
546         u8 *pRetPar;
547         u8      len=0,tx_event_length = 0;
548         RTW_HCI_STATUS status = HCI_STATUS_SUCCESS;
549         rtw_HCI_event *pEvent;
550
551         DBG_871X("%s\n",__func__);
552         DBG_871X("current Poll Enable: %d, currrent Poll Time: %d\n",curPollEnable,curPollTime);
553         DBG_871X("BT Info reason: %d, BT Info length: %d\n",btInfoReason,btInfoLen);
554         /*DBG_871X("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n"
555                 ,pcmd[4],pcmd[5],pcmd[6],pcmd[7],pcmd[8],pcmd[9],pcmd[10],pcmd[11]);*/
556
557         _rtw_memset(btinfo, 0, BT_INFO_LENGTH);
558         
559 #if 1
560         if(BT_INFO_LENGTH != btInfoLen)
561         {
562                 status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
563                 DBG_871X("Error BT Info Length: %d\n",btInfoLen);
564                 //return _FAIL;
565         }
566         else
567 #endif
568         {
569                 if(0x1 == btInfoReason || 0x2 == btInfoReason)
570                 {
571                         _rtw_memcpy(btinfo, &pcmd[4], btInfoLen);
572                         btinfo[0] = btInfoReason;
573                         rtw_btcoex_btinfo_cmd(padapter,btinfo,btInfoLen);
574                 }
575                 else
576                 {
577                         DBG_871X("Other BT info reason\n");
578                 }
579         }
580
581         //send complete event to BT
582         {
583
584                 pEvent = (rtw_HCI_event*)(&localBuf[0]);
585
586                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
587                 pEvent->Data[0] = 0x1;  //packet #
588                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_INFO_NOTIFY, OGF_EXTENSION);
589                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_INFO_NOTIFY, OGF_EXTENSION);
590                 len = len + 3;
591
592                         // Return parameters starts from here
593                 pRetPar = &pEvent->Data[len];           
594                 pRetPar[0] = status;            //status
595
596                 len++;
597                 pEvent->Length = len;
598
599                         //total tx event length + EventCode length + sizeof(length)
600                 tx_event_length = pEvent->Length + 2;
601 #if 0
602                 rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,"BT_info_event");
603 #endif          
604                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
605                 
606                 return status;
607                         //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
608         }
609 }
610
611 u8 rtw_btcoex_parse_BT_patch_ver_info_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
612 {
613         RTW_HCI_STATUS status=HCI_STATUS_SUCCESS;
614         u16             btPatchVer=0x0, btHciVer=0x0;
615         //u16           *pU2tmp;
616         
617         u8 localBuf[6] = "";
618         u8 *pRetPar;
619         u8      len=0, tx_event_length =0;
620         rtw_HCI_event *pEvent;
621
622         btHciVer = pcmd[0] | pcmd[1]<<8;
623         btPatchVer = pcmd[2] | pcmd[3]<<8;
624
625
626         DBG_871X("%s, cmd:%02x %02x %02x %02x\n",__func__, pcmd[0] ,pcmd[1] ,pcmd[2] ,pcmd[3]);
627         DBG_871X("%s, HCI Ver:%d, Patch Ver:%d\n",__func__, btHciVer,btPatchVer);
628         
629         rtw_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer);
630
631
632         //send complete event to BT
633         {
634                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
635
636
637                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
638                 pEvent->Data[0] = 0x1;  //packet #
639                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION);
640                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION);
641                 len = len + 3;
642
643                 // Return parameters starts from here
644                 pRetPar = &pEvent->Data[len];           
645                 pRetPar[0] = status;            //status
646
647                 len++;
648                 pEvent->Length = len;
649
650                 //total tx event length + EventCode length + sizeof(length)
651                 tx_event_length = pEvent->Length + 2;
652 #if 0
653                 rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,"BT_patch_event");
654 #endif
655                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
656                 return status;
657                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
658         }
659 }
660
661 u8 rtw_btcoex_parse_HCI_Ver_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
662 {
663         RTW_HCI_STATUS status=HCI_STATUS_SUCCESS;
664         u16 hciver = pcmd[0] | pcmd[1] <<8;
665         
666         u8 localBuf[6] = "";
667         u8 *pRetPar;
668         u8      len=0, tx_event_length =0;
669         rtw_HCI_event *pEvent;
670         
671         struct bt_coex_info *pcoex_info = &padapter->coex_info;
672         PBT_MGNT        pBtMgnt=&pcoex_info->BtMgnt;
673         pBtMgnt->ExtConfig.HCIExtensionVer = hciver;
674         DBG_871X("%s, HCI Version: %d\n",__func__,pBtMgnt->ExtConfig.HCIExtensionVer);
675         if(pBtMgnt->ExtConfig.HCIExtensionVer  < 4)
676         {
677                 status = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;
678                 DBG_871X("%s, Version = %d, HCI Version < 4\n",__func__,pBtMgnt->ExtConfig.HCIExtensionVer );
679         }
680         else
681         {
682                 rtw_btcoex_SetHciVersion(padapter,hciver);
683         }
684         //send complete event to BT
685         {
686                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
687
688
689                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
690                 pEvent->Data[0] = 0x1;  //packet #
691                 pEvent->Data[1] = HCIOPCODELOW(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION);
692                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION);
693                 len = len + 3;
694
695                 // Return parameters starts from here
696                 pRetPar = &pEvent->Data[len];           
697                 pRetPar[0] = status;            //status
698
699                 len++;
700                 pEvent->Length = len;
701
702                 //total tx event length + EventCode length + sizeof(length)
703                 tx_event_length = pEvent->Length + 2;
704
705                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
706                 return status;
707                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
708         }
709         
710 }
711
712 u8 rtw_btcoex_parse_WIFI_scan_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
713 {
714         RTW_HCI_STATUS status=HCI_STATUS_SUCCESS;
715
716         u8 localBuf[6] = "";
717         u8 *pRetPar;
718         u8      len=0, tx_event_length =0;
719         rtw_HCI_event *pEvent;
720         
721         struct bt_coex_info *pcoex_info = &padapter->coex_info;
722         PBT_MGNT        pBtMgnt=&pcoex_info->BtMgnt;
723         pBtMgnt->ExtConfig.bEnableWifiScanNotify= pcmd[0];
724         DBG_871X("%s, bEnableWifiScanNotify: %d\n",__func__,pBtMgnt->ExtConfig.bEnableWifiScanNotify);
725         
726         //send complete event to BT
727         {
728                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
729
730
731                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
732                 pEvent->Data[0] = 0x1;  //packet #
733                 pEvent->Data[1] = HCIOPCODELOW(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION);
734                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION);
735                 len = len + 3;
736
737                 // Return parameters starts from here
738                 pRetPar = &pEvent->Data[len];           
739                 pRetPar[0] = status;            //status
740
741                 len++;
742                 pEvent->Length = len;
743
744                 //total tx event length + EventCode length + sizeof(length)
745                 tx_event_length = pEvent->Length + 2;
746
747                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
748                 return status;
749                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
750         }
751 }
752
753 u8 rtw_btcoex_parse_HCI_link_status_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
754 {
755         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
756         struct bt_coex_info     *pcoex_info=&padapter->coex_info;
757         PBT_MGNT        pBtMgnt=&pcoex_info->BtMgnt;
758         //PBT_DBG               pBtDbg=&padapter->MgntInfo.BtInfo.BtDbg;
759         u8              i, numOfHandle=0, numOfAcl=0;
760         u16             conHandle;
761         u8              btProfile, btCoreSpec, linkRole;
762         u8              *pTriple;
763
764         u8 localBuf[6] = "";
765         u8 *pRetPar;
766         u8      len=0, tx_event_length =0;
767         rtw_HCI_event *pEvent;
768         
769         //pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++;
770         //RT_DISP_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, "LinkStatusNotify, Hex Data :\n", 
771         //              &pHciCmd->Data[0], pHciCmd->Length);
772
773         DBG_871X("BTLinkStatusNotify\n");
774
775         // Current only RTL8723 support this command.
776         //pBtMgnt->bSupportProfile = TRUE;
777         pBtMgnt->bSupportProfile = _FALSE;
778
779         pBtMgnt->ExtConfig.NumberOfACL = 0;
780         pBtMgnt->ExtConfig.NumberOfSCO = 0;
781         
782         numOfHandle = pcmd[0];
783         //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, ("numOfHandle = 0x%x\n", numOfHandle));
784         //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, ("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer));
785         DBG_871X("numOfHandle = 0x%x\n", numOfHandle);
786         DBG_871X("HCIExtensionVer = %d\n", pBtMgnt->ExtConfig.HCIExtensionVer);
787         
788         pTriple = &pcmd[1];
789         for(i=0; i<numOfHandle; i++)
790         {       
791                 if(pBtMgnt->ExtConfig.HCIExtensionVer < 1)
792                 {
793                         conHandle = *((u8 *)&pTriple[0]);
794                         btProfile = pTriple[2];
795                         btCoreSpec = pTriple[3];
796                         if(BT_PROFILE_SCO == btProfile)
797                         {
798                                 pBtMgnt->ExtConfig.NumberOfSCO++;
799                         }
800                         else
801                         {
802                                 pBtMgnt->ExtConfig.NumberOfACL++;                       
803                                 pBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle;
804                                 pBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile;
805                                 pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec;
806                         }
807                         //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, 
808                         //      ("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n",
809                         //              conHandle, btProfile, btCoreSpec));
810                         DBG_871X("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\n", conHandle, btProfile, btCoreSpec);
811                         pTriple += 4;
812                 }
813                 else if(pBtMgnt->ExtConfig.HCIExtensionVer >= 1)
814                 {
815                         conHandle = *((pu2Byte)&pTriple[0]);
816                         btProfile = pTriple[2];
817                         btCoreSpec = pTriple[3];
818                         linkRole = pTriple[4];
819                         if(BT_PROFILE_SCO == btProfile)
820                         {
821                                 pBtMgnt->ExtConfig.NumberOfSCO++;
822                         }
823                         else
824                         {
825                                 pBtMgnt->ExtConfig.NumberOfACL++;                       
826                                 pBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle;
827                                 pBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile;
828                                 pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec;
829                                 pBtMgnt->ExtConfig.aclLink[i].linkRole = linkRole;
830                         }
831                         //RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, 
832                         DBG_871X("Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d, LinkRole=%d\n",
833                                 conHandle, btProfile, btCoreSpec, linkRole);
834                         pTriple += 5;
835                 }       
836         }
837         rtw_btcoex_StackUpdateProfileInfo();
838
839                 //send complete event to BT
840         {
841                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
842
843
844                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
845                 pEvent->Data[0] = 0x1;  //packet #
846                 pEvent->Data[1] = HCIOPCODELOW(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION);
847                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION);
848                 len = len + 3;
849
850                 // Return parameters starts from here
851                 pRetPar = &pEvent->Data[len];           
852                 pRetPar[0] = status;            //status
853
854                 len++;
855                 pEvent->Length = len;
856
857                 //total tx event length + EventCode length + sizeof(length)
858                 tx_event_length = pEvent->Length + 2;
859
860                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
861                 return status;
862                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
863         }
864         
865         
866 }
867
868 u8 rtw_btcoex_parse_HCI_BT_coex_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
869 {
870         u8 localBuf[6] = "";
871         u8 *pRetPar;
872         u8      len=0, tx_event_length =0;
873         rtw_HCI_event *pEvent;
874         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
875
876         {
877                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
878
879
880                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
881                 pEvent->Data[0] = 0x1;  //packet #
882                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_COEX_NOTIFY, OGF_EXTENSION);
883                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_COEX_NOTIFY, OGF_EXTENSION);
884                 len = len + 3;
885
886                 // Return parameters starts from here
887                 pRetPar = &pEvent->Data[len];           
888                 pRetPar[0] = status;            //status
889
890                 len++;
891                 pEvent->Length = len;
892
893                 //total tx event length + EventCode length + sizeof(length)
894                 tx_event_length = pEvent->Length + 2;
895
896                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
897                 return status;
898                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
899         }
900 }
901
902 u8 rtw_btcoex_parse_HCI_BT_operation_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
903 {
904         u8 localBuf[6] = "";
905         u8 *pRetPar;
906         u8      len=0, tx_event_length =0;
907         rtw_HCI_event *pEvent;
908         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
909
910         DBG_871X("%s, OP code: %d\n",__func__,pcmd[0]);
911
912         switch(pcmd[0])
913         {
914                 case HCI_BT_OP_NONE:
915                         DBG_871X("[bt operation] : Operation None!!\n");
916                         break;
917                 case HCI_BT_OP_INQUIRY_START:
918                         DBG_871X("[bt operation] : Inquiry start!!\n");
919                         break;
920                 case HCI_BT_OP_INQUIRY_FINISH:
921                         DBG_871X("[bt operation] : Inquiry finished!!\n");
922                         break;
923                 case HCI_BT_OP_PAGING_START:
924                         DBG_871X("[bt operation] : Paging is started!!\n");
925                         break;
926                 case HCI_BT_OP_PAGING_SUCCESS:
927                         DBG_871X("[bt operation] : Paging complete successfully!!\n");
928                         break;
929                 case HCI_BT_OP_PAGING_UNSUCCESS:
930                         DBG_871X("[bt operation] : Paging complete unsuccessfully!!\n");
931                         break;
932                 case HCI_BT_OP_PAIRING_START:
933                         DBG_871X("[bt operation] : Pairing start!!\n");
934                         break;
935                 case HCI_BT_OP_PAIRING_FINISH:
936                         DBG_871X("[bt operation] : Pairing finished!!\n");
937                         break;
938                 case HCI_BT_OP_BT_DEV_ENABLE:
939                         DBG_871X("[bt operation] : BT Device is enabled!!\n");
940                         break;
941                 case HCI_BT_OP_BT_DEV_DISABLE:
942                         DBG_871X("[bt operation] : BT Device is disabled!!\n");
943                         break;
944                 default:
945                         DBG_871X("[bt operation] : Unknown, error!!\n");
946                         break;
947         }
948
949                         //send complete event to BT
950         {
951                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
952
953
954                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
955                 pEvent->Data[0] = 0x1;  //packet #
956                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION);
957                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION);
958                 len = len + 3;
959
960                 // Return parameters starts from here
961                 pRetPar = &pEvent->Data[len];           
962                 pRetPar[0] = status;            //status
963
964                 len++;
965                 pEvent->Length = len;
966
967                 //total tx event length + EventCode length + sizeof(length)
968                 tx_event_length = pEvent->Length + 2;
969
970                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
971                 return status;
972                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
973         }
974 }
975
976 u8 rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
977 {
978         u8 localBuf[6] = "";
979         u8 *pRetPar;
980         u8      len=0, tx_event_length =0;
981         rtw_HCI_event *pEvent;
982         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
983
984         {
985                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
986
987
988                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
989                 pEvent->Data[0] = 0x1;  //packet #
990                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION);
991                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION);
992                 len = len + 3;
993
994                 // Return parameters starts from here
995                 pRetPar = &pEvent->Data[len];           
996                 pRetPar[0] = status;            //status
997
998                 len++;
999                 pEvent->Length = len;
1000
1001                 //total tx event length + EventCode length + sizeof(length)
1002                 tx_event_length = pEvent->Length + 2;
1003
1004                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1005                 return status;
1006                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
1007         }
1008 }
1009
1010 u8 rtw_btcoex_parse_BT_register_val_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
1011 {
1012         
1013         u8 localBuf[6] = "";
1014         u8 *pRetPar;
1015         u8      len=0, tx_event_length =0;
1016         rtw_HCI_event *pEvent;
1017         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
1018
1019         {
1020                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
1021
1022
1023                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
1024                 pEvent->Data[0] = 0x1;  //packet #
1025                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION);
1026                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION);
1027                 len = len + 3;
1028
1029                 // Return parameters starts from here
1030                 pRetPar = &pEvent->Data[len];           
1031                 pRetPar[0] = status;            //status
1032
1033                 len++;
1034                 pEvent->Length = len;
1035
1036                 //total tx event length + EventCode length + sizeof(length)
1037                 tx_event_length = pEvent->Length + 2;
1038
1039                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1040                 return status;
1041                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
1042         }
1043 }
1044
1045 u8 rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
1046 {
1047         u8 localBuf[6] = "";
1048         u8 *pRetPar;
1049         u8      len=0, tx_event_length =0;
1050         rtw_HCI_event *pEvent;
1051         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
1052
1053         {
1054                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
1055
1056
1057                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
1058                 pEvent->Data[0] = 0x1;  //packet #
1059                 pEvent->Data[1] = HCIOPCODELOW(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION);
1060                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION);
1061                 len = len + 3;
1062
1063                 // Return parameters starts from here
1064                 pRetPar = &pEvent->Data[len];           
1065                 pRetPar[0] = status;            //status
1066
1067                 len++;
1068                 pEvent->Length = len;
1069
1070                 //total tx event length + EventCode length + sizeof(length)
1071                 tx_event_length = pEvent->Length + 2;
1072
1073                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1074                 return status;
1075                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
1076         }
1077 }
1078
1079 u8 rtw_btcoex_parse_HCI_query_RF_status_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)
1080 {
1081         u8 localBuf[6] = "";
1082         u8 *pRetPar;
1083         u8      len=0, tx_event_length =0;
1084         rtw_HCI_event *pEvent;
1085         RTW_HCI_STATUS  status=HCI_STATUS_SUCCESS;
1086
1087         {
1088                 pEvent = (rtw_HCI_event *)(&localBuf[0]);
1089
1090
1091                 pEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;
1092                 pEvent->Data[0] = 0x1;  //packet #
1093                 pEvent->Data[1] = HCIOPCODELOW(HCI_QUERY_RF_STATUS, OGF_EXTENSION);
1094                 pEvent->Data[2] = HCIOPCODEHIGHT(HCI_QUERY_RF_STATUS, OGF_EXTENSION);
1095                 len = len + 3;
1096
1097                 // Return parameters starts from here
1098                 pRetPar = &pEvent->Data[len];           
1099                 pRetPar[0] = status;            //status
1100
1101                 len++;
1102                 pEvent->Length = len;
1103
1104                 //total tx event length + EventCode length + sizeof(length)
1105                 tx_event_length = pEvent->Length + 2;
1106
1107                 status = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1108                 return status;
1109                 //bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);
1110         }
1111 }
1112
1113 /*****************************************
1114 * HCI cmd format :
1115 *| 15 - 0                                               |       
1116 *| OPcode (OCF|OGF<<10)         |
1117 *| 15 - 8               |7 - 0                  |
1118 *|Cmd para      |Cmd para Length        |
1119 *|Cmd para......                                |
1120 ******************************************/
1121
1122 //bit 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
1123 //       |      OCF                                  |     OGF       |
1124 void rtw_btcoex_parse_hci_extend_cmd(_adapter *padapter, u8 *pcmd, u16 len,const u16 hci_OCF)
1125 {
1126
1127         DBG_871X("%s: OCF: %x\n",__func__,hci_OCF);
1128         switch(hci_OCF)
1129         {
1130                 case HCI_EXTENSION_VERSION_NOTIFY:
1131                         DBG_871X("HCI_EXTENSION_VERSION_NOTIFY\n");
1132                         rtw_btcoex_parse_HCI_Ver_notify_cmd(padapter,pcmd, len);
1133                         break;
1134                 case HCI_LINK_STATUS_NOTIFY:
1135                         DBG_871X("HCI_LINK_STATUS_NOTIFY\n");
1136                         rtw_btcoex_parse_HCI_link_status_notify_cmd(padapter,pcmd, len);
1137                         break;
1138                 case HCI_BT_OPERATION_NOTIFY:
1139                         // only for 8723a 2ant
1140                         DBG_871X("HCI_BT_OPERATION_NOTIFY\n");
1141                         rtw_btcoex_parse_HCI_BT_operation_notify_cmd(padapter,pcmd, len);
1142                         //
1143                         break;
1144                 case HCI_ENABLE_WIFI_SCAN_NOTIFY:
1145                         DBG_871X("HCI_ENABLE_WIFI_SCAN_NOTIFY\n");
1146                         rtw_btcoex_parse_WIFI_scan_notify_cmd(padapter,pcmd, len);
1147                         break;
1148                 case HCI_QUERY_RF_STATUS:
1149                         // only for 8723b 2ant
1150                         DBG_871X("HCI_QUERY_RF_STATUS\n");
1151                         rtw_btcoex_parse_HCI_query_RF_status_cmd(padapter,pcmd, len);
1152                         break;
1153                 case HCI_BT_ABNORMAL_NOTIFY:
1154                         DBG_871X("HCI_BT_ABNORMAL_NOTIFY\n");
1155                         rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(padapter,pcmd, len);
1156                         break;
1157                 case HCI_BT_INFO_NOTIFY:
1158                         DBG_871X("HCI_BT_INFO_NOTIFY\n");
1159                         rtw_btcoex_parse_BT_info_notify_cmd(padapter,pcmd, len);
1160                         break;
1161                 case HCI_BT_COEX_NOTIFY:
1162                         DBG_871X("HCI_BT_COEX_NOTIFY\n");
1163                         rtw_btcoex_parse_HCI_BT_coex_notify_cmd(padapter,pcmd, len);
1164                         break;
1165                 case HCI_BT_PATCH_VERSION_NOTIFY:
1166                         DBG_871X("HCI_BT_PATCH_VERSION_NOTIFY\n");
1167                         rtw_btcoex_parse_BT_patch_ver_info_cmd(padapter,pcmd, len);
1168                         break;
1169                 case HCI_BT_AFH_MAP_NOTIFY:
1170                         DBG_871X("HCI_BT_AFH_MAP_NOTIFY\n");
1171                         rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(padapter,pcmd, len);
1172                         break;
1173                 case HCI_BT_REGISTER_VALUE_NOTIFY:
1174                         DBG_871X("HCI_BT_REGISTER_VALUE_NOTIFY\n");
1175                         rtw_btcoex_parse_BT_register_val_notify_cmd(padapter,pcmd, len);
1176                         break;
1177                 default:
1178                         DBG_871X("ERROR!!! Unknown OCF: %x\n",hci_OCF);
1179                         break;
1180                         
1181         }
1182 }
1183
1184 void rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *pcmd, u16 len)
1185 {
1186         u16 opcode = pcmd[0] | pcmd[1]<<8;
1187         u16 hci_OGF = HCI_OGF(opcode);
1188         u16 hci_OCF = HCI_OCF(opcode);
1189         u8 cmdlen = len -3;
1190         u8 pare_len = pcmd[2];
1191
1192         DBG_871X("%s\n",__func__);
1193         DBG_871X("OGF: %x,OCF: %x\n",hci_OGF,hci_OCF);
1194         switch(hci_OGF)
1195         {
1196                 case OGF_EXTENSION:
1197                         DBG_871X("HCI_EXTENSION_CMD_OGF\n");
1198                         rtw_btcoex_parse_hci_extend_cmd(padapter, &pcmd[3], cmdlen, hci_OCF);
1199                         break;
1200                 default:
1201                         DBG_871X("Other OGF: %x\n",hci_OGF);
1202                         break;
1203         }
1204 }
1205
1206 u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size)
1207 {
1208         u8 cmp_msg1[32] = attend_ack;
1209         u8 cmp_msg2[32] = leave_ack;
1210         u8 cmp_msg3[32] = bt_leave;
1211         u8 cmp_msg4[32] = invite_req;
1212         u8 cmp_msg5[32] = attend_req;
1213         u8 cmp_msg6[32] = invite_rsp;
1214         u8 res = OTHER;
1215         
1216         if (_rtw_memcmp(cmp_msg1, msg, msg_size) == _TRUE) {
1217                 /*DBG_871X("%s, msg:%s\n",__func__,msg);*/
1218                 res = RX_ATTEND_ACK;
1219         } else if (_rtw_memcmp(cmp_msg2, msg, msg_size) == _TRUE) {
1220                 /*DBG_871X("%s, msg:%s\n",__func__,msg);*/
1221                 res = RX_LEAVE_ACK;
1222         } else if (_rtw_memcmp(cmp_msg3, msg, msg_size) == _TRUE) {
1223                 /*DBG_871X("%s, msg:%s\n",__func__,msg);*/
1224                 res = RX_BT_LEAVE;
1225         } else if (_rtw_memcmp(cmp_msg4, msg, msg_size) == _TRUE) {
1226                 /*DBG_871X("%s, msg:%s\n",__func__,msg);*/
1227                 res = RX_INVITE_REQ;
1228         } else if (_rtw_memcmp(cmp_msg5, msg, msg_size) == _TRUE) {
1229                 res = RX_ATTEND_REQ;
1230         } else if (_rtw_memcmp(cmp_msg6, msg, msg_size) == _TRUE) {
1231                 res = RX_INVITE_RSP;
1232         } else {
1233                 DBG_871X("%s, %s\n", __func__, msg);
1234                 res = OTHER;
1235         }
1236         
1237         DBG_871X("%s, res:%d\n", __func__, res);
1238         
1239         return res;
1240 }
1241
1242 void rtw_btcoex_recvmsgbysocket(void *data)
1243 {
1244         u8 recv_data[255];
1245         u8 tx_msg[255] = leave_ack;
1246         u32 len = 0;
1247         
1248         u16 recv_length = 0;
1249         u16 parse_res = 0;
1250 #if 0
1251         u8 para_len = 0, polling_enable = 0, poling_interval = 0, reason = 0, btinfo_len = 0;
1252         u8 btinfo[BT_INFO_LEN] = {0};
1253 #endif
1254
1255         struct bt_coex_info *pcoex_info = NULL;
1256         struct sock *sk = NULL;
1257         struct sk_buff *skb = NULL;
1258         
1259         DBG_871X("%s\n",__func__);
1260
1261         if (pbtcoexadapter == NULL) {
1262                 DBG_871X("%s: btcoexadapter NULL!\n", __func__);
1263                 return;
1264         }
1265
1266         pcoex_info = &pbtcoexadapter->coex_info;
1267         sk = pcoex_info->sk_store;
1268
1269         if (sk == NULL) {
1270                 DBG_871X("%s: critical error when receive socket data!\n", __func__);
1271                 return;
1272         }
1273         
1274         len = skb_queue_len(&sk->sk_receive_queue);
1275         while (len > 0) {
1276                 skb = skb_dequeue(&sk->sk_receive_queue);
1277
1278                 /*important: cut the udp header from skb->data! header length is 8 byte*/
1279                 recv_length = skb->len-8;
1280                 _rtw_memset(recv_data, 0, sizeof(recv_data));
1281                 _rtw_memcpy(recv_data, skb->data+8, recv_length);
1282                 
1283                 parse_res = rtw_btcoex_parse_recv_data(recv_data, recv_length);
1284 /*
1285                 if (RX_ATTEND_ACK == parse_res) {
1286                         //attend ack 
1287                         pcoex_info->BT_attend = _TRUE;
1288                         DBG_871X("RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1289                 } else if (RX_ATTEND_REQ == parse_res) {
1290                         //attend req from BT 
1291                         pcoex_info->BT_attend = _TRUE;
1292                         DBG_871X("RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1293                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE);
1294                 } else if (RX_INVITE_REQ == parse_res) {
1295                         //invite req from BT
1296                         pcoex_info->BT_attend = _TRUE;
1297                         DBG_871X("RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1298                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE);
1299                 } else if (RX_INVITE_RSP == parse_res) {
1300                         //invite rsp
1301                         pcoex_info->BT_attend = _TRUE;
1302                         DBG_871X("RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1303                 } else if (RX_LEAVE_ACK == parse_res) {
1304                         //mean BT know wifi  will leave
1305                         pcoex_info->BT_attend = _FALSE;
1306                         DBG_871X("RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);                   
1307                 } else if (RX_BT_LEAVE == parse_res) {
1308                         //BT leave
1309                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); // no ack
1310                         pcoex_info->BT_attend = _FALSE;
1311                         DBG_871X("RX_BT_LEAVE!sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);                     
1312                 } else {
1313                         //todo: check if recv data are really hci cmds
1314                         if (_TRUE == pcoex_info->BT_attend)
1315                                 rtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length);
1316                 }
1317 */
1318                 switch (parse_res) {
1319                 case RX_ATTEND_ACK:
1320                         /* attend ack */
1321                         pcoex_info->BT_attend = _TRUE;
1322                         DBG_871X("RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1323                         break;
1324
1325                 case RX_ATTEND_REQ:
1326                         pcoex_info->BT_attend = _TRUE;
1327                         DBG_871X("RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1328                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE);
1329                         break;
1330
1331                 case RX_INVITE_REQ:
1332                         /* invite req from BT */
1333                         pcoex_info->BT_attend = _TRUE;
1334                         DBG_871X("RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1335                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE);
1336                         break;
1337
1338                 case RX_INVITE_RSP:
1339                          /*invite rsp*/
1340                         pcoex_info->BT_attend = _TRUE;
1341                         DBG_871X("RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1342                         break;
1343
1344                 case RX_LEAVE_ACK:
1345                         /* mean BT know wifi  will leave */
1346                         pcoex_info->BT_attend = _FALSE;
1347                         DBG_871X("RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);   
1348                         break;
1349
1350                 case RX_BT_LEAVE:
1351                         /* BT leave */
1352                         rtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); /* no ack */
1353                         pcoex_info->BT_attend = _FALSE;
1354                         DBG_871X("RX_BT_LEAVE!sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);             
1355                         break;
1356
1357                 default:
1358                         if (_TRUE == pcoex_info->BT_attend)
1359                                 rtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length);
1360                         else
1361                                 DBG_871X("ERROR!! BT is UP\n");
1362                         break;
1363
1364                 }
1365                 
1366                 len--;
1367                 kfree_skb(skb);
1368         }
1369 }
1370
1371 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0))
1372 void rtw_btcoex_recvmsg_init(struct sock *sk_in, s32 bytes)
1373 #else
1374 void rtw_btcoex_recvmsg_init(struct sock *sk_in)
1375 #endif
1376 {
1377         struct bt_coex_info *pcoex_info = NULL;
1378         
1379         if (pbtcoexadapter == NULL) {
1380                 DBG_871X("%s: btcoexadapter NULL\n", __func__);
1381                 return;
1382         }
1383         pcoex_info = &pbtcoexadapter->coex_info;
1384         pcoex_info->sk_store = sk_in;
1385         if (pcoex_info->btcoex_wq != NULL)
1386                 queue_delayed_work(pcoex_info->btcoex_wq, &pcoex_info->recvmsg_work, 0);
1387         else
1388                 DBG_871X("%s: BTCOEX workqueue NULL\n", __func__);
1389 }
1390
1391 u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force)
1392 {
1393         u8 error; 
1394         struct msghdr   udpmsg; 
1395         mm_segment_t    oldfs; 
1396         struct iovec    iov; 
1397         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1398
1399         DBG_871X("%s: msg:%s, force:%s\n", __func__, msg, force == _TRUE?"TRUE":"FALSE");
1400         if (_FALSE == force) {
1401                 if (_FALSE == pcoex_info->BT_attend) {
1402                         DBG_871X("TX Blocked: WiFi-BT disconnected\n");                 
1403                         return _FAIL;
1404                 }
1405         }
1406                 
1407         iov.iov_base     = (void *)msg; 
1408         iov.iov_len      = msg_size; 
1409         udpmsg.msg_name  = &pcoex_info->bt_sockaddr; 
1410         udpmsg.msg_namelen      = sizeof(struct sockaddr_in); 
1411         udpmsg.msg_iov   = &iov; 
1412         udpmsg.msg_iovlen       = 1; 
1413         udpmsg.msg_control      = NULL; 
1414         udpmsg.msg_controllen = 0; 
1415         udpmsg.msg_flags        = MSG_DONTWAIT | MSG_NOSIGNAL; 
1416         oldfs = get_fs(); 
1417         set_fs(KERNEL_DS); 
1418         error = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size); 
1419         set_fs(oldfs); 
1420         if (error < 0) {
1421                 DBG_871X("Error when sendimg msg, error:%d\n", error); 
1422                 return _FAIL;
1423         } else
1424                 return _SUCCESS;
1425 }
1426
1427 u8 rtw_btcoex_create_kernel_socket(_adapter *padapter)
1428 {
1429         s8 kernel_socket_err; 
1430         u8 tx_msg[255] = attend_req;
1431         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1432         s32 sock_reuse = 1;
1433         u8 status = _FAIL;
1434         
1435         DBG_871X("%s CONNECT_PORT %d\n", __func__, CONNECT_PORT);
1436
1437         if (NULL == pcoex_info) {
1438                 DBG_871X("coex_info: NULL\n"); 
1439                 status =  _FAIL;
1440         }
1441         
1442         kernel_socket_err = sock_create(PF_INET, SOCK_DGRAM, 0, &pcoex_info->udpsock); 
1443     
1444         if (kernel_socket_err < 0) { 
1445                 DBG_871X("Error during creation of socket error:%d\n", kernel_socket_err); 
1446                 status = _FAIL; 
1447         } else {
1448                 _rtw_memset(&(pcoex_info->wifi_sockaddr), 0, sizeof(pcoex_info->wifi_sockaddr)); 
1449                 pcoex_info->wifi_sockaddr.sin_family = AF_INET; 
1450                 pcoex_info->wifi_sockaddr.sin_port = htons(CONNECT_PORT); 
1451                 pcoex_info->wifi_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1452
1453                 _rtw_memset(&(pcoex_info->bt_sockaddr), 0, sizeof(pcoex_info->bt_sockaddr)); 
1454                 pcoex_info->bt_sockaddr.sin_family = AF_INET; 
1455                 pcoex_info->bt_sockaddr.sin_port = htons(CONNECT_PORT_BT); 
1456                 pcoex_info->bt_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1457
1458                 pcoex_info->sk_store = NULL;
1459                 kernel_socket_err = pcoex_info->udpsock->ops->bind(pcoex_info->udpsock, (struct sockaddr *)&pcoex_info->wifi_sockaddr, 
1460                         sizeof(pcoex_info->wifi_sockaddr)); 
1461                 if (kernel_socket_err == 0) {   
1462                         DBG_871X("binding socket success\n"); 
1463                         pcoex_info->udpsock->sk->sk_data_ready = rtw_btcoex_recvmsg_init;
1464                         pcoex_info->sock_open |=  KERNEL_SOCKET_OK;
1465                         pcoex_info->BT_attend = _FALSE;
1466                         DBG_871X("WIFI sending attend_req\n"); 
1467                         rtw_btcoex_sendmsgbysocket(padapter, attend_req, sizeof(attend_req), _TRUE);
1468                         status = _SUCCESS;
1469                 } else { 
1470                         pcoex_info->BT_attend = _FALSE;
1471                         sock_release(pcoex_info->udpsock); /* bind fail release socket */
1472                         DBG_871X("Error binding socket: %d\n", kernel_socket_err); 
1473                         status = _FAIL;
1474                 } 
1475                         
1476         }
1477
1478         return status;
1479 }
1480
1481 void rtw_btcoex_close_kernel_socket(_adapter *padapter)
1482 {
1483         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1484         if (pcoex_info->sock_open & KERNEL_SOCKET_OK) {
1485                 DBG_871X("release kernel socket\n");
1486                 sock_release(pcoex_info->udpsock);
1487                 pcoex_info->sock_open &= ~(KERNEL_SOCKET_OK);   
1488                 if (_TRUE == pcoex_info->BT_attend)
1489                         pcoex_info->BT_attend = _FALSE;
1490                 
1491                 DBG_871X("sock_open:%d, BT_attend:%d\n", pcoex_info->sock_open, pcoex_info->BT_attend);
1492         }
1493 }
1494
1495 void rtw_btcoex_init_socket(_adapter *padapter)
1496 {
1497                 
1498         u8 is_invite = _FALSE;
1499         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1500         DBG_871X("%s\n", __func__);
1501         if (_FALSE == pcoex_info->is_exist) {
1502                 _rtw_memset(pcoex_info,0,sizeof(struct bt_coex_info));
1503                 pcoex_info->btcoex_wq = create_workqueue("BTCOEX");
1504                 INIT_DELAYED_WORK(&pcoex_info->recvmsg_work,
1505                           (void *)rtw_btcoex_recvmsgbysocket);
1506                 pbtcoexadapter = padapter;
1507                 if (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS) {
1508                         pcoex_info->is_exist = _TRUE;
1509                 } else {
1510                         pcoex_info->is_exist = _FALSE;
1511                         pbtcoexadapter = NULL;
1512                 }
1513                 
1514                 DBG_871X("%s: pbtcoexadapter:%p, coex_info->is_exist: %s\n"
1515                         , __func__, pbtcoexadapter, pcoex_info->is_exist == _TRUE?"TRUE":"FALSE");
1516         }
1517 }
1518
1519 void rtw_btcoex_close_socket(_adapter *padapter)
1520 {
1521         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1522
1523         DBG_871X("%s--coex_info->is_exist: %s, pcoex_info->BT_attend:%s\n"
1524                 , __func__, pcoex_info->is_exist == _TRUE?"TRUE":"FALSE", pcoex_info->BT_attend == _TRUE?"TRUE":"FALSE");
1525         
1526         if (_TRUE == pcoex_info->is_exist) {
1527                 if (_TRUE == pcoex_info->BT_attend) {
1528                         /*inform BT wifi leave*/
1529                         rtw_btcoex_sendmsgbysocket(padapter, wifi_leave, sizeof(wifi_leave), _FALSE);
1530                         msleep(50);
1531                 }
1532                 rtw_btcoex_close_kernel_socket(padapter);
1533                 pbtcoexadapter = NULL;
1534                 pcoex_info->is_exist = _FALSE;
1535         }
1536         if (pcoex_info->btcoex_wq != NULL) {
1537                 flush_workqueue(pcoex_info->btcoex_wq);
1538                 destroy_workqueue(pcoex_info->btcoex_wq);
1539         }
1540 }
1541
1542 void rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name)
1543 {
1544         u8      i = 0;
1545         DBG_871X("======> Msg name: %s\n", msg_name);
1546         for(i=0;i<len;i++)
1547         {
1548                 printk("%02x ", tx_msg[i]);
1549         }
1550         printk("\n");
1551         DBG_871X("Msg name: %s <======\n", msg_name);
1552 }
1553
1554 /* Porting from Windows team */
1555 void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER padapter, u8 bNeedDbgRsp, u8 dataLen, void *pData)
1556 {
1557         u8                      len=0, tx_event_length = 0;
1558         u8                      localBuf[32] = "";
1559         u8                      *pRetPar;
1560         u8                      opCode=0;
1561         u8                      *pInBuf=(pu1Byte)pData;
1562         u8                      *pOpCodeContent;
1563         rtw_HCI_event *pEvent;
1564
1565         opCode = pInBuf[0];     
1566
1567         DBG_871X("%s, OPCode:%02x\n",__func__,opCode);
1568
1569         pEvent = (rtw_HCI_event*)(&localBuf[0]);
1570
1571         //len += bthci_ExtensionEventHeaderRtk(&localBuf[0], 
1572         //      HCI_EVENT_EXT_BT_COEX_CONTROL);
1573         pEvent->EventCode = HCI_EVENT_EXTENSION_RTK;
1574         pEvent->Data[0] = HCI_EVENT_EXT_BT_COEX_CONTROL;        //extension event code
1575         len ++;
1576         
1577         // Return parameters starts from here
1578         pRetPar = &pEvent->Data[len];
1579         _rtw_memcpy(&pRetPar[0], pData, dataLen);
1580
1581         len += dataLen;
1582
1583         pEvent->Length = len;
1584
1585         //total tx event length + EventCode length + sizeof(length)
1586         tx_event_length = pEvent->Length + 2;
1587 #if 0
1588         rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "BT COEX CONTROL", _FALSE);
1589 #endif
1590         rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1591
1592 }
1593
1594 /* Porting from Windows team */
1595 void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER padapter, u8 dataLen, void *pData)
1596 {
1597         rtw_HCI_event *pEvent;
1598         u8                      *pRetPar;
1599         u8                      len=0, tx_event_length = 0;
1600         u8                      localBuf[32] = "";
1601
1602         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1603         PBT_MGNT                pBtMgnt = &pcoex_info->BtMgnt;
1604         
1605         DBG_871X("%s\n",__func__);
1606         if(pBtMgnt->ExtConfig.HCIExtensionVer < 4) //not support
1607         {
1608                 DBG_871X("ERROR: HCIExtensionVer = %d, HCIExtensionVer<4 !!!!\n",pBtMgnt->ExtConfig.HCIExtensionVer);
1609                 return;
1610         }
1611
1612         pEvent = (rtw_HCI_event *)(&localBuf[0]);
1613
1614         //len += bthci_ExtensionEventHeaderRtk(&localBuf[0], 
1615         //              HCI_EVENT_EXT_BT_INFO_CONTROL);
1616         pEvent->EventCode = HCI_EVENT_EXTENSION_RTK;
1617         pEvent->Data[0] = HCI_EVENT_EXT_BT_INFO_CONTROL;                //extension event code
1618         len ++;
1619
1620         // Return parameters starts from here
1621         pRetPar = &pEvent->Data[len];
1622         _rtw_memcpy(&pRetPar[0], pData, dataLen);
1623
1624         len += dataLen;
1625
1626         pEvent->Length = len;
1627
1628         //total tx event length + EventCode length + sizeof(length)
1629         tx_event_length = pEvent->Length + 2;
1630 #if 0
1631         rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "BT INFO CONTROL");
1632 #endif
1633         rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1634         
1635 }
1636
1637 void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType)
1638 {
1639         u8      len=0, tx_event_length=0;
1640         u8      localBuf[7] = "";
1641         u8      *pRetPar;
1642         u8      *pu1Temp;
1643         rtw_HCI_event *pEvent;
1644         struct bt_coex_info *pcoex_info = &padapter->coex_info;
1645         PBT_MGNT                pBtMgnt = &pcoex_info->BtMgnt;
1646
1647 //      if(!pBtMgnt->BtOperationOn)
1648 //              return;
1649                 
1650         pEvent = (rtw_HCI_event *)(&localBuf[0]);
1651
1652 //      len += bthci_ExtensionEventHeaderRtk(&localBuf[0], 
1653 //                      HCI_EVENT_EXT_WIFI_SCAN_NOTIFY);
1654
1655         pEvent->EventCode = HCI_EVENT_EXTENSION_RTK;
1656         pEvent->Data[0] = HCI_EVENT_EXT_WIFI_SCAN_NOTIFY;               //extension event code
1657         len ++;
1658
1659         // Return parameters starts from here
1660         //pRetPar = &PPacketIrpEvent->Data[len];
1661         //pu1Temp = (u8 *)&pRetPar[0];
1662         //*pu1Temp = scanType;
1663         pEvent->Data[len] = scanType;
1664         len += 1;
1665
1666         pEvent->Length = len;
1667
1668         //total tx event length + EventCode length + sizeof(length)
1669         tx_event_length = pEvent->Length + 2;
1670 #if 0
1671         rtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, "WIFI SCAN OPERATION");
1672 #endif  
1673         rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);
1674 }
1675 #endif //CONFIG_BT_COEXIST_SOCKET_TRX
1676 #endif // CONFIG_BT_COEXIST
1677