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