xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8822cs/include/rtw_btcoex.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2013 - 2017 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef __RTW_BTCOEX_H__
18*4882a593Smuzhiyun #define __RTW_BTCOEX_H__
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <drv_types.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* For H2C: H2C_BT_MP_OPER. Return status definition to the user layer */
23*4882a593Smuzhiyun typedef enum _BT_CTRL_STATUS {
24*4882a593Smuzhiyun 	BT_STATUS_SUCCESS								= 0x00, /* Success */
25*4882a593Smuzhiyun 	BT_STATUS_BT_OP_SUCCESS							= 0x01, /* bt fw op execution success */
26*4882a593Smuzhiyun 	BT_STATUS_H2C_SUCCESS							= 0x02, /* H2c success */
27*4882a593Smuzhiyun 	BT_STATUS_H2C_FAIL								= 0x03, /* H2c fail */
28*4882a593Smuzhiyun 	BT_STATUS_H2C_LENGTH_EXCEEDED					= 0x04, /* H2c command length exceeded */
29*4882a593Smuzhiyun 	BT_STATUS_H2C_TIMTOUT							= 0x05, /* H2c timeout */
30*4882a593Smuzhiyun 	BT_STATUS_H2C_BT_NO_RSP							= 0x06, /* H2c sent, bt no rsp */
31*4882a593Smuzhiyun 	BT_STATUS_C2H_SUCCESS							= 0x07, /* C2h success */
32*4882a593Smuzhiyun 	BT_STATUS_C2H_REQNUM_MISMATCH					= 0x08, /* bt fw wrong rsp */
33*4882a593Smuzhiyun 	BT_STATUS_OPCODE_U_VERSION_MISMATCH				= 0x08, /* Upper layer OP code version mismatch. */
34*4882a593Smuzhiyun 	BT_STATUS_OPCODE_L_VERSION_MISMATCH				= 0x0a, /* Lower layer OP code version mismatch. */
35*4882a593Smuzhiyun 	BT_STATUS_UNKNOWN_OPCODE_U						= 0x0b, /* Unknown Upper layer OP code */
36*4882a593Smuzhiyun 	BT_STATUS_UNKNOWN_OPCODE_L						= 0x0c, /* Unknown Lower layer OP code */
37*4882a593Smuzhiyun 	BT_STATUS_PARAMETER_FORMAT_ERROR_U				= 0x0d, /* Wrong parameters sent by upper layer. */
38*4882a593Smuzhiyun 	BT_STATUS_PARAMETER_FORMAT_ERROR_L				= 0x0e, /* bt fw parameter format is not consistency */
39*4882a593Smuzhiyun 	BT_STATUS_PARAMETER_OUT_OF_RANGE_U				= 0x0f, /* uppery layer parameter value is out of range */
40*4882a593Smuzhiyun 	BT_STATUS_PARAMETER_OUT_OF_RANGE_L				= 0x10, /* bt fw parameter value is out of range */
41*4882a593Smuzhiyun 	BT_STATUS_UNKNOWN_STATUS_L						= 0x11, /* bt returned an defined status code */
42*4882a593Smuzhiyun 	BT_STATUS_UNKNOWN_STATUS_H						= 0x12, /* driver need to do error handle or not handle-well. */
43*4882a593Smuzhiyun 	BT_STATUS_WRONG_LEVEL							= 0x13, /* should be under passive level */
44*4882a593Smuzhiyun 	BT_STATUS_NOT_IMPLEMENT						= 0x14, /* op code not implemented yet */
45*4882a593Smuzhiyun 	BT_STATUS_BT_STACK_OP_SUCCESS					= 0x15, /* bt stack op execution success */
46*4882a593Smuzhiyun 	BT_STATUS_BT_STACK_NOT_SUPPORT					= 0x16, /* stack version not support this. */
47*4882a593Smuzhiyun 	BT_STATUS_BT_STACK_SEND_HCI_EVENT_FAIL			= 0x17, /* send hci event fail */
48*4882a593Smuzhiyun 	BT_STATUS_BT_STACK_NOT_BIND						= 0x18, /* stack not bind wifi driver */
49*4882a593Smuzhiyun 	BT_STATUS_BT_STACK_NO_RSP						= 0x19, /* stack doesn't have any rsp. */
50*4882a593Smuzhiyun 	BT_STATUS_MAX
51*4882a593Smuzhiyun } BT_CTRL_STATUS, *PBT_CTRL_STATUS;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun typedef enum _BTCOEX_SUSPEND_STATE {
54*4882a593Smuzhiyun 	BTCOEX_SUSPEND_STATE_RESUME					= 0x0,
55*4882a593Smuzhiyun 	BTCOEX_SUSPEND_STATE_SUSPEND				= 0x1,
56*4882a593Smuzhiyun 	BTCOEX_SUSPEND_STATE_SUSPEND_KEEP_ANT		= 0x2,
57*4882a593Smuzhiyun 	BTCOEX_SUSPEND_STATE_MAX
58*4882a593Smuzhiyun } BTCOEX_SUSPEND_STATE, *PBTCOEX_SUSPEND_STATE;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun typedef enum _BTCOEX_POLICY_CONTROL {
61*4882a593Smuzhiyun 	BTCOEX_POLICY_CONTROL_AUTO,
62*4882a593Smuzhiyun 	BTCOEX_POLICY_CONTROL_FORCE_FREERUN,
63*4882a593Smuzhiyun 	BTCOEX_POLICY_CONTROL_FORCE_TDMA
64*4882a593Smuzhiyun } BTCOEX_POLICY_CONTROL, *PBTCOEX_POLICY_CONTROL;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define SET_BT_MP_OPER_RET(OpCode, StatusCode)						((OpCode << 8) | StatusCode)
67*4882a593Smuzhiyun #define GET_OP_CODE_FROM_BT_MP_OPER_RET(RetCode)					((RetCode & 0xF0) >> 8)
68*4882a593Smuzhiyun #define GET_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode)				(RetCode & 0x0F)
69*4882a593Smuzhiyun #define CHECK_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode, StatusCode)	(GET_STATUS_CODE_FROM_BT_MP_OPER_RET(RetCode) == StatusCode)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define NETLINK_USER 31
74*4882a593Smuzhiyun #define CONNECT_PORT 30000
75*4882a593Smuzhiyun #define CONNECT_PORT_BT 30001
76*4882a593Smuzhiyun #define KERNEL_SOCKET_OK 0x01
77*4882a593Smuzhiyun #define NETLINK_SOCKET_OK 0x02
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define OTHER 0
80*4882a593Smuzhiyun #define RX_ATTEND_ACK 1
81*4882a593Smuzhiyun #define RX_LEAVE_ACK 2
82*4882a593Smuzhiyun #define RX_BT_LEAVE 3
83*4882a593Smuzhiyun #define RX_INVITE_REQ 4
84*4882a593Smuzhiyun #define RX_ATTEND_REQ 5
85*4882a593Smuzhiyun #define RX_INVITE_RSP 6
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define invite_req "INVITE_REQ"
88*4882a593Smuzhiyun #define invite_rsp "INVITE_RSP"
89*4882a593Smuzhiyun #define attend_req "ATTEND_REQ"
90*4882a593Smuzhiyun #define attend_ack "ATTEND_ACK"
91*4882a593Smuzhiyun #define wifi_leave "WIFI_LEAVE"
92*4882a593Smuzhiyun #define leave_ack "LEAVE_ACK"
93*4882a593Smuzhiyun #define bt_leave "BT_LEAVE"
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define BT_INFO_NOTIFY_CMD 0x0106
96*4882a593Smuzhiyun #define BT_INFO_LEN 8
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun typedef struct _HCI_LINK_INFO {
99*4882a593Smuzhiyun 	u16					ConnectHandle;
100*4882a593Smuzhiyun 	u8					IncomingTrafficMode;
101*4882a593Smuzhiyun 	u8					OutgoingTrafficMode;
102*4882a593Smuzhiyun 	u8					BTProfile;
103*4882a593Smuzhiyun 	u8					BTCoreSpec;
104*4882a593Smuzhiyun 	s8					BT_RSSI;
105*4882a593Smuzhiyun 	u8					TrafficProfile;
106*4882a593Smuzhiyun 	u8					linkRole;
107*4882a593Smuzhiyun } HCI_LINK_INFO, *PHCI_LINK_INFO;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define	MAX_BT_ACL_LINK_NUM				8
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun typedef struct _HCI_EXT_CONFIG {
112*4882a593Smuzhiyun 	HCI_LINK_INFO				aclLink[MAX_BT_ACL_LINK_NUM];
113*4882a593Smuzhiyun 	u8					btOperationCode;
114*4882a593Smuzhiyun 	u16					CurrentConnectHandle;
115*4882a593Smuzhiyun 	u8					CurrentIncomingTrafficMode;
116*4882a593Smuzhiyun 	u8					CurrentOutgoingTrafficMode;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	u8					NumberOfACL;
119*4882a593Smuzhiyun 	u8					NumberOfSCO;
120*4882a593Smuzhiyun 	u8					CurrentBTStatus;
121*4882a593Smuzhiyun 	u16					HCIExtensionVer;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	BOOLEAN					bEnableWifiScanNotify;
124*4882a593Smuzhiyun } HCI_EXT_CONFIG, *PHCI_EXT_CONFIG;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun typedef struct _HCI_PHY_LINK_BSS_INFO {
127*4882a593Smuzhiyun 	u16						bdCap;			/* capability information */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	/* Qos related. Added by Annie, 2005-11-01. */
130*4882a593Smuzhiyun 	/* BSS_QOS						BssQos;		 */
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun } HCI_PHY_LINK_BSS_INFO, *PHCI_PHY_LINK_BSS_INFO;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun typedef enum _BT_CONNECT_TYPE {
135*4882a593Smuzhiyun 	BT_CONNECT_AUTH_REQ								= 0x00,
136*4882a593Smuzhiyun 	BT_CONNECT_AUTH_RSP								= 0x01,
137*4882a593Smuzhiyun 	BT_CONNECT_ASOC_REQ								= 0x02,
138*4882a593Smuzhiyun 	BT_CONNECT_ASOC_RSP								= 0x03,
139*4882a593Smuzhiyun 	BT_DISCONNECT										= 0x04
140*4882a593Smuzhiyun } BT_CONNECT_TYPE, *PBT_CONNECT_TYPE;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun typedef struct _PACKET_IRP_HCIEVENT_DATA {
144*4882a593Smuzhiyun 	u8		EventCode;
145*4882a593Smuzhiyun 	u8		Length; /* total cmd length = extension event length+1(extension event code length) */
146*4882a593Smuzhiyun 	u8		Data[1]; /* byte1 is extension event code */
147*4882a593Smuzhiyun } rtw_HCI_event;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun struct btinfo_8761ATV {
151*4882a593Smuzhiyun 	u8 cid;
152*4882a593Smuzhiyun 	u8 len;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	u8 bConnection:1;
155*4882a593Smuzhiyun 	u8 bSCOeSCO:1;
156*4882a593Smuzhiyun 	u8 bInQPage:1;
157*4882a593Smuzhiyun 	u8 bACLBusy:1;
158*4882a593Smuzhiyun 	u8 bSCOBusy:1;
159*4882a593Smuzhiyun 	u8 bHID:1;
160*4882a593Smuzhiyun 	u8 bA2DP:1;
161*4882a593Smuzhiyun 	u8 bFTP:1;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	u8 retry_cnt:4;
164*4882a593Smuzhiyun 	u8 rsvd_34:1;
165*4882a593Smuzhiyun 	u8 bPage:1;
166*4882a593Smuzhiyun 	u8 TRxMask:1;
167*4882a593Smuzhiyun 	u8 Sniff_attempt:1;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	u8 rssi;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	u8 A2dp_rate:1;
172*4882a593Smuzhiyun 	u8 ReInit:1;
173*4882a593Smuzhiyun 	u8 MaxPower:1;
174*4882a593Smuzhiyun 	u8 bEnIgnoreWlanAct:1;
175*4882a593Smuzhiyun 	u8 TxPowerLow:1;
176*4882a593Smuzhiyun 	u8 TxPowerHigh:1;
177*4882a593Smuzhiyun 	u8 eSCO_SCO:1;
178*4882a593Smuzhiyun 	u8 Master_Slave:1;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	u8 ACL_TRx_TP_low;
181*4882a593Smuzhiyun 	u8 ACL_TRx_TP_high;
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define HCIOPCODE(_OCF, _OGF)     ((_OGF)<<10|(_OCF))
185*4882a593Smuzhiyun #define HCIOPCODELOW(_OCF, _OGF)	(u8)(HCIOPCODE(_OCF, _OGF) & 0x00ff)
186*4882a593Smuzhiyun #define HCIOPCODEHIGHT(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF)>>8)
187*4882a593Smuzhiyun #define HCI_OGF(opCode)  (unsigned char)((0xFC00 & (opCode)) >> 10)
188*4882a593Smuzhiyun #define HCI_OCF(opCode)  (0x3FF & (opCode))
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun typedef enum _HCI_STATUS {
192*4882a593Smuzhiyun 	HCI_STATUS_SUCCESS										= 0x00, /* Success */
193*4882a593Smuzhiyun 	HCI_STATUS_UNKNOW_HCI_CMD								= 0x01, /* Unknown HCI Command */
194*4882a593Smuzhiyun 	HCI_STATUS_UNKNOW_CONNECT_ID							= 0X02, /* Unknown Connection Identifier */
195*4882a593Smuzhiyun 	HCI_STATUS_HW_FAIL										= 0X03, /* Hardware Failure */
196*4882a593Smuzhiyun 	HCI_STATUS_PAGE_TIMEOUT									= 0X04, /* Page Timeout */
197*4882a593Smuzhiyun 	HCI_STATUS_AUTH_FAIL										= 0X05, /* Authentication Failure */
198*4882a593Smuzhiyun 	HCI_STATUS_PIN_OR_KEY_MISSING							= 0X06, /* PIN or Key Missing */
199*4882a593Smuzhiyun 	HCI_STATUS_MEM_CAP_EXCEED								= 0X07, /* Memory Capacity Exceeded */
200*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_TIMEOUT								= 0X08, /* Connection Timeout */
201*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_LIMIT									= 0X09, /* Connection Limit Exceeded */
202*4882a593Smuzhiyun 	HCI_STATUS_SYN_CONNECT_LIMIT								= 0X0a, /* Synchronous Connection Limit To A Device Exceeded */
203*4882a593Smuzhiyun 	HCI_STATUS_ACL_CONNECT_EXISTS							= 0X0b, /* ACL Connection Already Exists */
204*4882a593Smuzhiyun 	HCI_STATUS_CMD_DISALLOW									= 0X0c, /* Command Disallowed */
205*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE					= 0X0d, /* Connection Rejected due to Limited Resources */
206*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_RJT_SEC_REASON						= 0X0e, /* Connection Rejected Due To Security Reasons */
207*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_RJT_UNACCEPT_BD_ADDR				= 0X0f, /* Connection Rejected due to Unacceptable BD_ADDR */
208*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_ACCEPT_TIMEOUT						= 0X10, /* Connection Accept Timeout Exceeded */
209*4882a593Smuzhiyun 	HCI_STATUS_UNSUPPORT_FEATURE_PARA_VALUE				= 0X11, /* Unsupported Feature or Parameter Value */
210*4882a593Smuzhiyun 	HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE					= 0X12, /* Invalid HCI Command Parameters */
211*4882a593Smuzhiyun 	HCI_STATUS_REMOTE_USER_TERMINATE_CONNECT				= 0X13, /* Remote User Terminated Connection */
212*4882a593Smuzhiyun 	HCI_STATUS_REMOTE_DEV_TERMINATE_LOW_RESOURCE			= 0X14, /* Remote Device Terminated Connection due to Low Resources */
213*4882a593Smuzhiyun 	HCI_STATUS_REMOTE_DEV_TERMINATE_CONNECT_POWER_OFF	= 0X15, /* Remote Device Terminated Connection due to Power Off */
214*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST				= 0X16, /* Connection Terminated By Local Host */
215*4882a593Smuzhiyun 	HCI_STATUS_REPEATE_ATTEMPT								= 0X17, /* Repeated Attempts */
216*4882a593Smuzhiyun 	HCI_STATUS_PAIR_NOT_ALLOW								= 0X18, /* Pairing Not Allowed */
217*4882a593Smuzhiyun 	HCI_STATUS_UNKNOW_LMP_PDU								= 0X19, /* Unknown LMP PDU */
218*4882a593Smuzhiyun 	HCI_STATUS_UNSUPPORT_REMOTE_LMP_FEATURE				= 0X1a, /* Unsupported Remote Feature / Unsupported LMP Feature */
219*4882a593Smuzhiyun 	HCI_STATUS_SOC_OFFSET_REJECT								= 0X1b, /* SCO Offset Rejected */
220*4882a593Smuzhiyun 	HCI_STATUS_SOC_INTERVAL_REJECT							= 0X1c, /* SCO Interval Rejected */
221*4882a593Smuzhiyun 	HCI_STATUS_SOC_AIR_MODE_REJECT							= 0X1d, /* SCO Air Mode Rejected */
222*4882a593Smuzhiyun 	HCI_STATUS_INVALID_LMP_PARA								= 0X1e, /* Invalid LMP Parameters */
223*4882a593Smuzhiyun 	HCI_STATUS_UNSPECIFIC_ERROR								= 0X1f, /* Unspecified Error */
224*4882a593Smuzhiyun 	HCI_STATUS_UNSUPPORT_LMP_PARA_VALUE					= 0X20, /* Unsupported LMP Parameter Value */
225*4882a593Smuzhiyun 	HCI_STATUS_ROLE_CHANGE_NOT_ALLOW						= 0X21, /* Role Change Not Allowed */
226*4882a593Smuzhiyun 	HCI_STATUS_LMP_RESPONSE_TIMEOUT							= 0X22, /* LMP Response Timeout */
227*4882a593Smuzhiyun 	HCI_STATUS_LMP_ERROR_TRANSACTION_COLLISION				= 0X23, /* LMP Error Transaction Collision */
228*4882a593Smuzhiyun 	HCI_STATUS_LMP_PDU_NOT_ALLOW							= 0X24, /* LMP PDU Not Allowed */
229*4882a593Smuzhiyun 	HCI_STATUS_ENCRYPTION_MODE_NOT_ALLOW					= 0X25, /* Encryption Mode Not Acceptable */
230*4882a593Smuzhiyun 	HCI_STATUS_LINK_KEY_CAN_NOT_CHANGE						= 0X26, /* Link Key Can Not be Changed */
231*4882a593Smuzhiyun 	HCI_STATUS_REQUEST_QOS_NOT_SUPPORT						= 0X27, /* Requested QoS Not Supported */
232*4882a593Smuzhiyun 	HCI_STATUS_INSTANT_PASSED								= 0X28, /* Instant Passed */
233*4882a593Smuzhiyun 	HCI_STATUS_PAIRING_UNIT_KEY_NOT_SUPPORT					= 0X29, /* Pairing With Unit Key Not Supported */
234*4882a593Smuzhiyun 	HCI_STATUS_DIFFERENT_TRANSACTION_COLLISION				= 0X2a, /* Different Transaction Collision */
235*4882a593Smuzhiyun 	HCI_STATUS_RESERVE_1										= 0X2b, /* Reserved */
236*4882a593Smuzhiyun 	HCI_STATUS_QOS_UNACCEPT_PARA							= 0X2c, /* QoS Unacceptable Parameter */
237*4882a593Smuzhiyun 	HCI_STATUS_QOS_REJECT										= 0X2d, /* QoS Rejected */
238*4882a593Smuzhiyun 	HCI_STATUS_CHNL_CLASSIFICATION_NOT_SUPPORT				= 0X2e, /* Channel Classification Not Supported */
239*4882a593Smuzhiyun 	HCI_STATUS_INSUFFICIENT_SECURITY							= 0X2f, /* Insufficient Security */
240*4882a593Smuzhiyun 	HCI_STATUS_PARA_OUT_OF_RANGE							= 0x30, /* Parameter Out Of Mandatory Range */
241*4882a593Smuzhiyun 	HCI_STATUS_RESERVE_2										= 0X31, /* Reserved */
242*4882a593Smuzhiyun 	HCI_STATUS_ROLE_SWITCH_PENDING							= 0X32, /* Role Switch Pending */
243*4882a593Smuzhiyun 	HCI_STATUS_RESERVE_3										= 0X33, /* Reserved */
244*4882a593Smuzhiyun 	HCI_STATUS_RESERVE_SOLT_VIOLATION						= 0X34, /* Reserved Slot Violation */
245*4882a593Smuzhiyun 	HCI_STATUS_ROLE_SWITCH_FAIL								= 0X35, /* Role Switch Failed */
246*4882a593Smuzhiyun 	HCI_STATUS_EXTEND_INQUIRY_RSP_TOO_LARGE				= 0X36, /* Extended Inquiry Response Too Large */
247*4882a593Smuzhiyun 	HCI_STATUS_SEC_SIMPLE_PAIRING_NOT_SUPPORT				= 0X37, /* Secure Simple Pairing Not Supported By Host. */
248*4882a593Smuzhiyun 	HCI_STATUS_HOST_BUSY_PAIRING								= 0X38, /* Host Busy - Pairing */
249*4882a593Smuzhiyun 	HCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND			= 0X39, /* Connection Rejected due to No Suitable Channel Found */
250*4882a593Smuzhiyun 	HCI_STATUS_CONTROLLER_BUSY								= 0X3a /* CONTROLLER BUSY */
251*4882a593Smuzhiyun } RTW_HCI_STATUS;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun #define HCI_EVENT_COMMAND_COMPLETE					0x0e
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #define OGF_EXTENSION									0X3f
256*4882a593Smuzhiyun typedef enum HCI_EXTENSION_COMMANDS {
257*4882a593Smuzhiyun 	HCI_SET_ACL_LINK_DATA_FLOW_MODE				= 0x0010,
258*4882a593Smuzhiyun 	HCI_SET_ACL_LINK_STATUS							= 0x0020,
259*4882a593Smuzhiyun 	HCI_SET_SCO_LINK_STATUS							= 0x0030,
260*4882a593Smuzhiyun 	HCI_SET_RSSI_VALUE								= 0x0040,
261*4882a593Smuzhiyun 	HCI_SET_CURRENT_BLUETOOTH_STATUS				= 0x0041,
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	/* The following is for RTK8723 */
264*4882a593Smuzhiyun 	HCI_EXTENSION_VERSION_NOTIFY					= 0x0100,
265*4882a593Smuzhiyun 	HCI_LINK_STATUS_NOTIFY							= 0x0101,
266*4882a593Smuzhiyun 	HCI_BT_OPERATION_NOTIFY							= 0x0102,
267*4882a593Smuzhiyun 	HCI_ENABLE_WIFI_SCAN_NOTIFY						= 0x0103,
268*4882a593Smuzhiyun 	HCI_QUERY_RF_STATUS								= 0x0104,
269*4882a593Smuzhiyun 	HCI_BT_ABNORMAL_NOTIFY							= 0x0105,
270*4882a593Smuzhiyun 	HCI_BT_INFO_NOTIFY								= 0x0106,
271*4882a593Smuzhiyun 	HCI_BT_COEX_NOTIFY								= 0x0107,
272*4882a593Smuzhiyun 	HCI_BT_PATCH_VERSION_NOTIFY						= 0x0108,
273*4882a593Smuzhiyun 	HCI_BT_AFH_MAP_NOTIFY							= 0x0109,
274*4882a593Smuzhiyun 	HCI_BT_REGISTER_VALUE_NOTIFY					= 0x010a,
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	/* The following is for IVT */
277*4882a593Smuzhiyun 	HCI_WIFI_CURRENT_CHANNEL						= 0x0300,
278*4882a593Smuzhiyun 	HCI_WIFI_CURRENT_BANDWIDTH						= 0x0301,
279*4882a593Smuzhiyun 	HCI_WIFI_CONNECTION_STATUS						= 0x0302
280*4882a593Smuzhiyun } RTW_HCI_EXT_CMD;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #define HCI_EVENT_EXTENSION_RTK						0xfe
283*4882a593Smuzhiyun typedef enum HCI_EXTENSION_EVENT_RTK {
284*4882a593Smuzhiyun 	HCI_EVENT_EXT_WIFI_SCAN_NOTIFY								= 0x01,
285*4882a593Smuzhiyun 	HCI_EVENT_EXT_WIFI_RF_STATUS_NOTIFY						= 0x02,
286*4882a593Smuzhiyun 	HCI_EVENT_EXT_BT_INFO_CONTROL								= 0x03,
287*4882a593Smuzhiyun 	HCI_EVENT_EXT_BT_COEX_CONTROL								= 0x04
288*4882a593Smuzhiyun } RTW_HCI_EXT_EVENT;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun typedef enum _BT_TRAFFIC_MODE {
291*4882a593Smuzhiyun 	BT_MOTOR_EXT_BE		= 0x00, /* Best Effort. Default. for HCRP, PAN, SDP, RFCOMM-based profiles like FTP,OPP, SPP, DUN, etc. */
292*4882a593Smuzhiyun 	BT_MOTOR_EXT_GUL		= 0x01, /* Guaranteed Latency. This type of traffic is used e.g. for HID and AVRCP. */
293*4882a593Smuzhiyun 	BT_MOTOR_EXT_GUB		= 0X02, /* Guaranteed Bandwidth. */
294*4882a593Smuzhiyun 	BT_MOTOR_EXT_GULB	= 0X03  /* Guaranteed Latency and Bandwidth. for A2DP and VDP. */
295*4882a593Smuzhiyun } BT_TRAFFIC_MODE;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun typedef enum _BT_TRAFFIC_MODE_PROFILE {
298*4882a593Smuzhiyun 	BT_PROFILE_NONE,
299*4882a593Smuzhiyun 	BT_PROFILE_A2DP,
300*4882a593Smuzhiyun 	BT_PROFILE_PAN	,
301*4882a593Smuzhiyun 	BT_PROFILE_HID,
302*4882a593Smuzhiyun 	BT_PROFILE_SCO
303*4882a593Smuzhiyun } BT_TRAFFIC_MODE_PROFILE;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun typedef enum _HCI_EXT_BT_OPERATION {
306*4882a593Smuzhiyun 	HCI_BT_OP_NONE				= 0x0,
307*4882a593Smuzhiyun 	HCI_BT_OP_INQUIRY_START		= 0x1,
308*4882a593Smuzhiyun 	HCI_BT_OP_INQUIRY_FINISH		= 0x2,
309*4882a593Smuzhiyun 	HCI_BT_OP_PAGING_START		= 0x3,
310*4882a593Smuzhiyun 	HCI_BT_OP_PAGING_SUCCESS		= 0x4,
311*4882a593Smuzhiyun 	HCI_BT_OP_PAGING_UNSUCCESS	= 0x5,
312*4882a593Smuzhiyun 	HCI_BT_OP_PAIRING_START		= 0x6,
313*4882a593Smuzhiyun 	HCI_BT_OP_PAIRING_FINISH		= 0x7,
314*4882a593Smuzhiyun 	HCI_BT_OP_BT_DEV_ENABLE		= 0x8,
315*4882a593Smuzhiyun 	HCI_BT_OP_BT_DEV_DISABLE		= 0x9,
316*4882a593Smuzhiyun 	HCI_BT_OP_MAX
317*4882a593Smuzhiyun } HCI_EXT_BT_OPERATION, *PHCI_EXT_BT_OPERATION;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun typedef struct _BT_MGNT {
320*4882a593Smuzhiyun 	BOOLEAN				bBTConnectInProgress;
321*4882a593Smuzhiyun 	BOOLEAN				bLogLinkInProgress;
322*4882a593Smuzhiyun 	BOOLEAN				bPhyLinkInProgress;
323*4882a593Smuzhiyun 	BOOLEAN				bPhyLinkInProgressStartLL;
324*4882a593Smuzhiyun 	u8				BtCurrentPhyLinkhandle;
325*4882a593Smuzhiyun 	u16				BtCurrentLogLinkhandle;
326*4882a593Smuzhiyun 	u8				CurrentConnectEntryNum;
327*4882a593Smuzhiyun 	u8				DisconnectEntryNum;
328*4882a593Smuzhiyun 	u8				CurrentBTConnectionCnt;
329*4882a593Smuzhiyun 	BT_CONNECT_TYPE		BTCurrentConnectType;
330*4882a593Smuzhiyun 	BT_CONNECT_TYPE		BTReceiveConnectPkt;
331*4882a593Smuzhiyun 	u8				BTAuthCount;
332*4882a593Smuzhiyun 	u8				BTAsocCount;
333*4882a593Smuzhiyun 	BOOLEAN				bStartSendSupervisionPkt;
334*4882a593Smuzhiyun 	BOOLEAN				BtOperationOn;
335*4882a593Smuzhiyun 	BOOLEAN				BTNeedAMPStatusChg;
336*4882a593Smuzhiyun 	BOOLEAN				JoinerNeedSendAuth;
337*4882a593Smuzhiyun 	HCI_PHY_LINK_BSS_INFO	bssDesc;
338*4882a593Smuzhiyun 	HCI_EXT_CONFIG		ExtConfig;
339*4882a593Smuzhiyun 	BOOLEAN				bNeedNotifyAMPNoCap;
340*4882a593Smuzhiyun 	BOOLEAN				bCreateSpportQos;
341*4882a593Smuzhiyun 	BOOLEAN				bSupportProfile;
342*4882a593Smuzhiyun 	u8				BTChannel;
343*4882a593Smuzhiyun 	BOOLEAN				CheckChnlIsSuit;
344*4882a593Smuzhiyun 	BOOLEAN				bBtScan;
345*4882a593Smuzhiyun 	BOOLEAN				btLogoTest;
346*4882a593Smuzhiyun 	BOOLEAN				bRfStatusNotified;
347*4882a593Smuzhiyun 	BOOLEAN				bBtRsvedPageDownload;
348*4882a593Smuzhiyun } BT_MGNT, *PBT_MGNT;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun struct bt_coex_info {
351*4882a593Smuzhiyun 	/* For Kernel Socket */
352*4882a593Smuzhiyun 	struct socket *udpsock;
353*4882a593Smuzhiyun 	struct sockaddr_in wifi_sockaddr; /*wifi socket*/
354*4882a593Smuzhiyun 	struct sockaddr_in bt_sockaddr;/* BT socket */
355*4882a593Smuzhiyun 	struct sock *sk_store;/*back up socket for UDP RX int*/
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	/* store which socket is OK */
358*4882a593Smuzhiyun 	u8 sock_open;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	u8 BT_attend;
361*4882a593Smuzhiyun 	u8 is_exist; /* socket exist */
362*4882a593Smuzhiyun 	BT_MGNT BtMgnt;
363*4882a593Smuzhiyun 	struct workqueue_struct *btcoex_wq;
364*4882a593Smuzhiyun 	struct delayed_work recvmsg_work;
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun #define	PACKET_NORMAL			0
369*4882a593Smuzhiyun #define	PACKET_DHCP				1
370*4882a593Smuzhiyun #define	PACKET_ARP				2
371*4882a593Smuzhiyun #define	PACKET_EAPOL			3
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun void rtw_btcoex_Initialize(PADAPTER);
374*4882a593Smuzhiyun void rtw_btcoex_PowerOnSetting(PADAPTER padapter);
375*4882a593Smuzhiyun void rtw_btcoex_AntInfoSetting(PADAPTER padapter);
376*4882a593Smuzhiyun void rtw_btcoex_PowerOffSetting(PADAPTER padapter);
377*4882a593Smuzhiyun void rtw_btcoex_PreLoadFirmware(PADAPTER padapter);
378*4882a593Smuzhiyun void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly);
379*4882a593Smuzhiyun void rtw_btcoex_IpsNotify(PADAPTER, u8 type);
380*4882a593Smuzhiyun void rtw_btcoex_LpsNotify(PADAPTER, u8 type);
381*4882a593Smuzhiyun void rtw_btcoex_ScanNotify(PADAPTER, u8 type);
382*4882a593Smuzhiyun void rtw_btcoex_MediaStatusNotify(PADAPTER, u8 mediaStatus);
383*4882a593Smuzhiyun void rtw_btcoex_SpecialPacketNotify(PADAPTER, u8 pktType);
384*4882a593Smuzhiyun void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state);
385*4882a593Smuzhiyun void rtw_btcoex_WLRFKNotify(PADAPTER padapter, u8 path, u8 type, u8 state);
386*4882a593Smuzhiyun void rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf);
387*4882a593Smuzhiyun void rtw_btcoex_BtMpRptNotify(PADAPTER, u8 length, u8 *tmpBuf);
388*4882a593Smuzhiyun void rtw_btcoex_SuspendNotify(PADAPTER, u8 state);
389*4882a593Smuzhiyun void rtw_btcoex_HaltNotify(PADAPTER);
390*4882a593Smuzhiyun void rtw_btcoex_switchband_notify(u8 under_scan, u8 band_type);
391*4882a593Smuzhiyun void rtw_btcoex_WlFwDbgInfoNotify(PADAPTER padapter, u8* tmpBuf, u8 length);
392*4882a593Smuzhiyun void rtw_btcoex_rx_rate_change_notify(PADAPTER padapter, u8 is_data_frame, u8 rate_id);
393*4882a593Smuzhiyun void rtw_btcoex_SwitchBtTRxMask(PADAPTER);
394*4882a593Smuzhiyun void rtw_btcoex_Switch(PADAPTER, u8 enable);
395*4882a593Smuzhiyun u8 rtw_btcoex_IsBtDisabled(PADAPTER);
396*4882a593Smuzhiyun void rtw_btcoex_Handler(PADAPTER);
397*4882a593Smuzhiyun s32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter);
398*4882a593Smuzhiyun s32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER);
399*4882a593Smuzhiyun u32 rtw_btcoex_GetAMPDUSize(PADAPTER);
400*4882a593Smuzhiyun void rtw_btcoex_SetManualControl(PADAPTER, u8 bmanual);
401*4882a593Smuzhiyun void rtw_btcoex_set_policy_control(PADAPTER, u8 btc_policy);
402*4882a593Smuzhiyun u8 rtw_btcoex_1Ant(PADAPTER);
403*4882a593Smuzhiyun u8 rtw_btcoex_IsBtControlLps(PADAPTER);
404*4882a593Smuzhiyun u8 rtw_btcoex_IsLpsOn(PADAPTER);
405*4882a593Smuzhiyun u8 rtw_btcoex_RpwmVal(PADAPTER);
406*4882a593Smuzhiyun u8 rtw_btcoex_LpsVal(PADAPTER);
407*4882a593Smuzhiyun u32 rtw_btcoex_GetRaMask(PADAPTER);
408*4882a593Smuzhiyun u8 rtw_btcoex_query_reduced_wl_pwr_lvl(PADAPTER padapter);
409*4882a593Smuzhiyun void rtw_btcoex_set_reduced_wl_pwr_lvl(PADAPTER padapter, u8 val);
410*4882a593Smuzhiyun void rtw_btcoex_do_reduce_wl_pwr_lvl(PADAPTER padapter);
411*4882a593Smuzhiyun void rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen);
412*4882a593Smuzhiyun void rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);
413*4882a593Smuzhiyun void rtw_btcoex_SetDBG(PADAPTER, u32 *pDbgModule);
414*4882a593Smuzhiyun u32 rtw_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize);
415*4882a593Smuzhiyun u8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER);
416*4882a593Smuzhiyun u8 rtw_btcoex_IsBtLinkExist(PADAPTER);
417*4882a593Smuzhiyun void rtw_btcoex_pta_off_on_notify(PADAPTER padapter, u8 bBTON);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun #ifdef CONFIG_RF4CE_COEXIST
420*4882a593Smuzhiyun void rtw_btcoex_SetRf4ceLinkState(PADAPTER padapter, u8 state);
421*4882a593Smuzhiyun u8 rtw_btcoex_GetRf4ceLinkState(PADAPTER padapter);
422*4882a593Smuzhiyun #endif
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun #ifdef CONFIG_BT_COEXIST_SOCKET_TRX
425*4882a593Smuzhiyun void rtw_btcoex_SetBtPatchVersion(PADAPTER padapter, u16 btHciVer, u16 btPatchVer);
426*4882a593Smuzhiyun void rtw_btcoex_SetHciVersion(PADAPTER  padapter, u16 hciVersion);
427*4882a593Smuzhiyun void rtw_btcoex_StackUpdateProfileInfo(void);
428*4882a593Smuzhiyun void rtw_btcoex_init_socket(_adapter *padapter);
429*4882a593Smuzhiyun void rtw_btcoex_close_socket(_adapter *padapter);
430*4882a593Smuzhiyun void rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name);
431*4882a593Smuzhiyun u8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force);
432*4882a593Smuzhiyun u8 rtw_btcoex_create_kernel_socket(_adapter *padapter);
433*4882a593Smuzhiyun void rtw_btcoex_close_kernel_socket(_adapter *padapter);
434*4882a593Smuzhiyun void rtw_btcoex_recvmsgbysocket(void *data);
435*4882a593Smuzhiyun u16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size);
436*4882a593Smuzhiyun u8 rtw_btcoex_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);
437*4882a593Smuzhiyun void rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *cmd, u16 len);
438*4882a593Smuzhiyun void rtw_btcoex_SendEventExtBtCoexControl(PADAPTER Adapter, u8 bNeedDbgRsp, u8 dataLen, void *pData);
439*4882a593Smuzhiyun void rtw_btcoex_SendEventExtBtInfoControl(PADAPTER Adapter, u8 dataLen, void *pData);
440*4882a593Smuzhiyun void rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType);
441*4882a593Smuzhiyun #define BT_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) rtw_btcoex_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData)
442*4882a593Smuzhiyun #define BT_SendEventExtBtInfoControl(Adapter, dataLen, pData) rtw_btcoex_SendEventExtBtInfoControl(Adapter, dataLen, pData)
443*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST_SOCKET_TRX */
444*4882a593Smuzhiyun u16 rtw_btcoex_btreg_read(PADAPTER padapter, u8 type, u16 addr, u32 *data);
445*4882a593Smuzhiyun u16 rtw_btcoex_btreg_write(PADAPTER padapter, u8 type, u16 addr, u16 val);
446*4882a593Smuzhiyun u8 rtw_btcoex_get_reduce_wl_txpwr(PADAPTER padapter);
447*4882a593Smuzhiyun u8 rtw_btcoex_get_bt_coexist(PADAPTER padapter);
448*4882a593Smuzhiyun u8 rtw_btcoex_get_chip_type(PADAPTER padapter);
449*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_ant_num(PADAPTER padapter);
450*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_single_ant_path(PADAPTER padapter);
451*4882a593Smuzhiyun u8 rtw_btcoex_get_pg_rfe_type(PADAPTER padapter);
452*4882a593Smuzhiyun u8 rtw_btcoex_is_tfbga_package_type(PADAPTER padapter);
453*4882a593Smuzhiyun u8 rtw_btcoex_get_ant_div_cfg(PADAPTER padapter);
454*4882a593Smuzhiyun u16 rtw_btcoex_btset_testmode(PADAPTER padapter, u8 type);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun /* ==================================================
457*4882a593Smuzhiyun  * Below Functions are called by BT-Coex
458*4882a593Smuzhiyun  * ================================================== */
459*4882a593Smuzhiyun void rtw_btcoex_rx_ampdu_apply(PADAPTER padapter);
460*4882a593Smuzhiyun void rtw_btcoex_LPS_Enter(PADAPTER padapter);
461*4882a593Smuzhiyun u8 rtw_btcoex_LPS_Leave(PADAPTER padapter);
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun #endif /* __RTW_BTCOEX_H__ */
464*4882a593Smuzhiyun #endif /* CONFIG_BT_COEXIST */
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun void rtw_btcoex_set_ant_info(PADAPTER padapter);
467*4882a593Smuzhiyun void rtw_btcoex_connect_notify(PADAPTER, u8 join_type);
468*4882a593Smuzhiyun 
469