xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bluetooth_uart_driver/rtk_coex.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun *  Realtek Bluetooth USB driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun *  This program is free software; you can redistribute it and/or modify
7*4882a593Smuzhiyun *  it under the terms of the GNU General Public License as published by
8*4882a593Smuzhiyun *  the Free Software Foundation; either version 2 of the License, or
9*4882a593Smuzhiyun *  (at your option) any later version.
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun *  This program is distributed in the hope that it will be useful,
12*4882a593Smuzhiyun *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*4882a593Smuzhiyun *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*4882a593Smuzhiyun *  GNU General Public License for more details.
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun *  You should have received a copy of the GNU General Public License
17*4882a593Smuzhiyun *  along with this program; if not, write to the Free Software
18*4882a593Smuzhiyun *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun */
21*4882a593Smuzhiyun #include <net/bluetooth/hci_core.h>
22*4882a593Smuzhiyun #include <linux/list.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /***********************************
25*4882a593Smuzhiyun ** Realtek - For coexistence **
26*4882a593Smuzhiyun ***********************************/
27*4882a593Smuzhiyun #define BTRTL_HCIUSB    0
28*4882a593Smuzhiyun #define BTRTL_HCIUART   1
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define BTRTL_HCI_IF    BTRTL_HCIUART
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define TRUE                1
33*4882a593Smuzhiyun #define FALSE               0
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define CONNECT_PORT        30001
36*4882a593Smuzhiyun #define CONNECT_PORT_WIFI   30000
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define invite_req          "INVITE_REQ"
39*4882a593Smuzhiyun #define invite_rsp          "INVITE_RSP"
40*4882a593Smuzhiyun #define attend_req          "ATTEND_REQ"
41*4882a593Smuzhiyun #define attend_ack          "ATTEND_ACK"
42*4882a593Smuzhiyun #define wifi_leave          "WIFI_LEAVE"
43*4882a593Smuzhiyun #define leave_ack           "LEAVE_ACK"
44*4882a593Smuzhiyun #define bt_leave            "BT_LEAVE"
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define HCI_OP_PERIODIC_INQ								0x0403
47*4882a593Smuzhiyun #define HCI_EV_LE_META			                        0x3e
48*4882a593Smuzhiyun #define HCI_EV_LE_CONN_COMPLETE		                    0x01
49*4882a593Smuzhiyun #define HCI_EV_LE_CONN_UPDATE_COMPLETE	                0x03
50*4882a593Smuzhiyun #define HCI_EV_LE_ENHANCED_CONN_COMPLETE    0x0a
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun //vendor cmd to fw
53*4882a593Smuzhiyun #define HCI_VENDOR_ENABLE_PROFILE_REPORT_COMMAND        0xfc18
54*4882a593Smuzhiyun #define HCI_VENDOR_SET_PROFILE_REPORT_COMMAND           0xfc19
55*4882a593Smuzhiyun #define HCI_VENDOR_MAILBOX_CMD                          0xfc8f
56*4882a593Smuzhiyun #define HCI_VENDOR_SET_BITPOOL				0xfc51
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun //subcmd to fw
59*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_WIFI_CHANNEL_AND_BANDWIDTH_CMD   0x11
60*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_WIFI_FORCE_TX_POWER_CMD          0x17
61*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_ENABLE_IGNORE_WLAN_ACT_CMD    0x1B
62*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_REPORT_CONN_SCO_INQ_INFO      0x23
63*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_AUTO_REPORT_STATUS_INFO       0x27
64*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_AUTO_REPORT_ENABLE            0x28
65*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_SET_TXRETRY_REPORT_PARAM      0x29
66*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_BT_SET_PTATABLE                  0x2A
67*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_SET_BT_PSD_MODE                  0x31
68*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_SET_BT_LNA_CONSTRAINT            0x32
69*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_L                    0x40
70*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_M                    0x41
71*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_H                    0x42
72*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_RD_REG_REQ                       0x43
73*4882a593Smuzhiyun #define HCI_VENDOR_SUB_CMD_WR_REG_REQ                       0x44
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define HCI_EV_VENDOR_SPECIFIC      0xff
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun //sub event from fw start
78*4882a593Smuzhiyun #define HCI_VENDOR_PTA_REPORT_EVENT         0x24
79*4882a593Smuzhiyun #define HCI_VENDOR_PTA_AUTO_REPORT_EVENT    0x25
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun //vendor cmd to wifi driver
82*4882a593Smuzhiyun #define HCI_GRP_VENDOR_SPECIFIC             (0x3f << 10)
83*4882a593Smuzhiyun #define HCI_OP_HCI_EXTENSION_VERSION_NOTIFY (0x0100 | HCI_GRP_VENDOR_SPECIFIC)
84*4882a593Smuzhiyun #define HCI_OP_BT_OPERATION_NOTIFY          (0x0102 | HCI_GRP_VENDOR_SPECIFIC)
85*4882a593Smuzhiyun #define HCI_OP_HCI_BT_INFO_NOTIFY           (0x0106 | HCI_GRP_VENDOR_SPECIFIC)
86*4882a593Smuzhiyun #define HCI_OP_HCI_BT_COEX_NOTIFY           (0x0107 | HCI_GRP_VENDOR_SPECIFIC)
87*4882a593Smuzhiyun #define HCI_OP_HCI_BT_PATCH_VER_NOTIFY      (0x0108 | HCI_GRP_VENDOR_SPECIFIC)
88*4882a593Smuzhiyun #define HCI_OP_HCI_BT_AFH_MAP_NOTIFY        (0x0109 | HCI_GRP_VENDOR_SPECIFIC)
89*4882a593Smuzhiyun #define HCI_OP_HCI_BT_REGISTER_VALUE_NOTIFY (0x010a | HCI_GRP_VENDOR_SPECIFIC)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun //bt info reason to wifi
92*4882a593Smuzhiyun #define HOST_RESPONSE                   0	//Host response when receive the BT Info Control Event
93*4882a593Smuzhiyun #define POLLING_RESPONSE                1	//The BT Info response for polling by BT firmware.
94*4882a593Smuzhiyun #define AUTO_REPORT                     2	//BT auto report by BT firmware.
95*4882a593Smuzhiyun #define STACK_REPORT_WHILE_DEVICE_D2    3	//Stack report when BT firmware is under power save state(ex:D2)
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun // vendor event from wifi
98*4882a593Smuzhiyun #define RTK_HS_EXTENSION_EVENT_WIFI_SCAN            0x01
99*4882a593Smuzhiyun #define RTK_HS_EXTENSION_EVENT_RADIO_STATUS_NOTIFY  0x02
100*4882a593Smuzhiyun #define RTK_HS_EXTENSION_EVENT_HCI_BT_INFO_CONTROL  0x03
101*4882a593Smuzhiyun #define RTK_HS_EXTENSION_EVENT_HCI_BT_COEX_CONTROL  0x04
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun //op code from wifi
104*4882a593Smuzhiyun #define BT_PATCH_VERSION_QUERY      0x00
105*4882a593Smuzhiyun #define IGNORE_WLAN_ACTIVE_CONTROL  0x01
106*4882a593Smuzhiyun #define LNA_CONSTRAIN_CONTROL       0x02
107*4882a593Smuzhiyun #define BT_POWER_DECREASE_CONTROL   0x03
108*4882a593Smuzhiyun #define BT_PSD_MODE_CONTROL         0x04
109*4882a593Smuzhiyun #define WIFI_BW_CHNL_NOTIFY         0x05
110*4882a593Smuzhiyun #define QUERY_BT_AFH_MAP            0x06
111*4882a593Smuzhiyun #define BT_REGISTER_ACCESS          0x07
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun //bt operation to notify
114*4882a593Smuzhiyun #define BT_OPCODE_NONE                  0
115*4882a593Smuzhiyun #define BT_OPCODE_INQUIRY_START         1
116*4882a593Smuzhiyun #define BT_OPCODE_INQUIRY_END           2
117*4882a593Smuzhiyun #define BT_OPCODE_PAGE_START            3
118*4882a593Smuzhiyun #define BT_OPCODE_PAGE_SUCCESS_END      4
119*4882a593Smuzhiyun #define BT_OPCODE_PAGE_UNSUCCESS_END    5
120*4882a593Smuzhiyun #define BT_OPCODE_PAIR_START            6
121*4882a593Smuzhiyun #define BT_OPCODE_PAIR_END              7
122*4882a593Smuzhiyun #define BT_OPCODE_ENABLE_BT             8
123*4882a593Smuzhiyun #define BT_OPCODE_DISABLE_BT            9
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define HCI_EXTENSION_VERSION           0x0004
126*4882a593Smuzhiyun #define HCI_CMD_PREAMBLE_SIZE           3
127*4882a593Smuzhiyun #define PAN_PACKET_COUNT                5
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
130*4882a593Smuzhiyun #define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define PSM_SDP     0x0001
133*4882a593Smuzhiyun #define PSM_RFCOMM  0x0003
134*4882a593Smuzhiyun #define PSM_PAN     0x000F
135*4882a593Smuzhiyun #define PSM_HID     0x0011
136*4882a593Smuzhiyun #define PSM_HID_INT 0x0013
137*4882a593Smuzhiyun #define PSM_AVCTP   0x0017
138*4882a593Smuzhiyun #define PSM_AVDTP   0x0019
139*4882a593Smuzhiyun #define PSM_FTP     0x1001
140*4882a593Smuzhiyun #define PSM_BIP     0x1003
141*4882a593Smuzhiyun #define PSM_OPP     0x1015
142*4882a593Smuzhiyun //--add more if needed--//
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun enum {
145*4882a593Smuzhiyun 	profile_sco = 0,
146*4882a593Smuzhiyun 	profile_hid = 1,
147*4882a593Smuzhiyun 	profile_a2dp = 2,
148*4882a593Smuzhiyun 	profile_pan = 3,
149*4882a593Smuzhiyun 	profile_hid_interval = 4,
150*4882a593Smuzhiyun 	profile_hogp = 5,
151*4882a593Smuzhiyun 	profile_voice = 6,
152*4882a593Smuzhiyun 	profile_sink = 7,
153*4882a593Smuzhiyun 	profile_max = 8
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define A2DP_SIGNAL	0x01
157*4882a593Smuzhiyun #define A2DP_MEDIA	0x02
158*4882a593Smuzhiyun //profile info data
159*4882a593Smuzhiyun typedef struct {
160*4882a593Smuzhiyun 	struct list_head list;
161*4882a593Smuzhiyun 	uint16_t handle;
162*4882a593Smuzhiyun 	uint16_t psm;
163*4882a593Smuzhiyun 	uint16_t dcid;
164*4882a593Smuzhiyun 	uint16_t scid;
165*4882a593Smuzhiyun 	uint8_t profile_index;
166*4882a593Smuzhiyun 	uint8_t flags;
167*4882a593Smuzhiyun } rtk_prof_info, *prtk_prof_info;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun //profile info for each connection
170*4882a593Smuzhiyun typedef struct rtl_hci_conn {
171*4882a593Smuzhiyun 	struct list_head list;
172*4882a593Smuzhiyun 	uint16_t handle;
173*4882a593Smuzhiyun 	uint8_t type;		// 0:l2cap, 1:sco/esco, 2:le
174*4882a593Smuzhiyun 	uint8_t profile_bitmap;
175*4882a593Smuzhiyun 	int8_t profile_refcount[8];
176*4882a593Smuzhiyun } rtk_conn_prof, *prtk_conn_prof;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun struct rtl_btinfo {
181*4882a593Smuzhiyun 	u8 cmd;
182*4882a593Smuzhiyun 	u8 len;
183*4882a593Smuzhiyun 	u8 data[6];
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun #define RTL_BTINFO_LEN	(sizeof(struct rtl_btinfo))
186*4882a593Smuzhiyun /* typedef struct {
187*4882a593Smuzhiyun  * 	uint8_t cmd_index;
188*4882a593Smuzhiyun  * 	uint8_t cmd_length;
189*4882a593Smuzhiyun  * 	uint8_t link_status;
190*4882a593Smuzhiyun  * 	uint8_t retry_cnt;
191*4882a593Smuzhiyun  * 	uint8_t rssi;
192*4882a593Smuzhiyun  * 	uint8_t mailbox_info;
193*4882a593Smuzhiyun  * 	uint16_t acl_throughput;
194*4882a593Smuzhiyun  * } hci_linkstatus_report; */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun typedef struct {
197*4882a593Smuzhiyun 	uint8_t type;
198*4882a593Smuzhiyun 	uint32_t offset;
199*4882a593Smuzhiyun 	uint32_t value;
200*4882a593Smuzhiyun } hci_mailbox_register;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun struct rtl_btinfo_ctl {
203*4882a593Smuzhiyun 	uint8_t polling_enable;
204*4882a593Smuzhiyun 	uint8_t polling_time;
205*4882a593Smuzhiyun 	uint8_t autoreport_enable;
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun #endif /* RTB_SOFTWARE_MAILBOX */
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #define MAX_LEN_OF_HCI_EV	32
210*4882a593Smuzhiyun #define NUM_RTL_HCI_EV		32
211*4882a593Smuzhiyun struct rtl_hci_ev {
212*4882a593Smuzhiyun 	__u8 data[MAX_LEN_OF_HCI_EV];
213*4882a593Smuzhiyun 	__u16 len;
214*4882a593Smuzhiyun 	struct list_head list;
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #define L2_MAX_SUBSEC_LEN	128
218*4882a593Smuzhiyun #define L2_MAX_PKTS	16
219*4882a593Smuzhiyun struct rtl_l2_buff {
220*4882a593Smuzhiyun 	__u8 data[L2_MAX_SUBSEC_LEN];
221*4882a593Smuzhiyun 	__u16 len;
222*4882a593Smuzhiyun 	__u16 out;
223*4882a593Smuzhiyun 	struct list_head list;
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun struct rtl_coex_struct {
227*4882a593Smuzhiyun 	struct list_head conn_hash;	//hash for connections
228*4882a593Smuzhiyun 	struct list_head profile_list;	//hash for profile info
229*4882a593Smuzhiyun 	struct hci_dev *hdev;
230*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
231*4882a593Smuzhiyun 	struct socket *udpsock;
232*4882a593Smuzhiyun 	struct sockaddr_in addr;
233*4882a593Smuzhiyun 	struct sockaddr_in wifi_addr;
234*4882a593Smuzhiyun 	struct timer_list polling_timer;
235*4882a593Smuzhiyun #endif
236*4882a593Smuzhiyun 	struct timer_list a2dp_count_timer;
237*4882a593Smuzhiyun 	struct timer_list pan_count_timer;
238*4882a593Smuzhiyun 	struct timer_list hogp_count_timer;
239*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
240*4882a593Smuzhiyun 	struct workqueue_struct *sock_wq;
241*4882a593Smuzhiyun 	struct delayed_work sock_work;
242*4882a593Smuzhiyun #endif
243*4882a593Smuzhiyun 	struct workqueue_struct *fw_wq;
244*4882a593Smuzhiyun 	struct delayed_work fw_work;
245*4882a593Smuzhiyun 	struct delayed_work l2_work;
246*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
247*4882a593Smuzhiyun 	struct sock *sk;
248*4882a593Smuzhiyun #endif
249*4882a593Smuzhiyun 	struct urb *urb;
250*4882a593Smuzhiyun 	spinlock_t spin_lock_sock;
251*4882a593Smuzhiyun 	spinlock_t spin_lock_profile;
252*4882a593Smuzhiyun 	uint32_t a2dp_packet_count;
253*4882a593Smuzhiyun 	uint32_t pan_packet_count;
254*4882a593Smuzhiyun 	uint32_t hogp_packet_count;
255*4882a593Smuzhiyun 	uint32_t voice_packet_count;
256*4882a593Smuzhiyun 	uint8_t profile_bitmap;
257*4882a593Smuzhiyun 	uint8_t profile_status;
258*4882a593Smuzhiyun 	int8_t profile_refcount[8];
259*4882a593Smuzhiyun 	uint8_t ispairing;
260*4882a593Smuzhiyun 	uint8_t isinquirying;
261*4882a593Smuzhiyun 	uint8_t ispaging;
262*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
263*4882a593Smuzhiyun 	uint8_t wifi_state;
264*4882a593Smuzhiyun 	uint8_t autoreport;
265*4882a593Smuzhiyun 	uint8_t polling_enable;
266*4882a593Smuzhiyun 	uint8_t polling_interval;
267*4882a593Smuzhiyun 	uint8_t piconet_id;
268*4882a593Smuzhiyun 	uint8_t mode;
269*4882a593Smuzhiyun 	uint8_t afh_map[10];
270*4882a593Smuzhiyun #endif
271*4882a593Smuzhiyun 	uint16_t hci_reversion;
272*4882a593Smuzhiyun 	uint16_t lmp_subversion;
273*4882a593Smuzhiyun #ifdef RTB_SOFTWARE_MAILBOX
274*4882a593Smuzhiyun 	uint8_t wifi_on;
275*4882a593Smuzhiyun 	uint8_t sock_open;
276*4882a593Smuzhiyun #endif
277*4882a593Smuzhiyun 	unsigned long cmd_last_tx;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	/* hci ev buff */
280*4882a593Smuzhiyun 	struct list_head ev_used_list;
281*4882a593Smuzhiyun 	struct list_head ev_free_list;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	spinlock_t rxlock;
284*4882a593Smuzhiyun 	__u8 pkt_type;
285*4882a593Smuzhiyun 	__u16 expect;
286*4882a593Smuzhiyun 	__u8 *tbuff;
287*4882a593Smuzhiyun 	__u16 elen;
288*4882a593Smuzhiyun 	__u8 back_buff[HCI_MAX_EVENT_SIZE];
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	/* l2cap rx buff */
291*4882a593Smuzhiyun 	struct list_head l2_used_list;
292*4882a593Smuzhiyun 	struct list_head l2_free_list;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	/* buff addr and size */
295*4882a593Smuzhiyun 	spinlock_t buff_lock;
296*4882a593Smuzhiyun 	unsigned long pages_addr;
297*4882a593Smuzhiyun 	unsigned long buff_size;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun #define RTL_COEX_RUNNING	(1 << 0)
300*4882a593Smuzhiyun 	unsigned long flags;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun };
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN
305*4882a593Smuzhiyun struct sbc_frame_hdr {
306*4882a593Smuzhiyun 	uint8_t syncword:8;		/* Sync word */
307*4882a593Smuzhiyun 	uint8_t subbands:1;		/* Subbands */
308*4882a593Smuzhiyun 	uint8_t allocation_method:1;	/* Allocation method */
309*4882a593Smuzhiyun 	uint8_t channel_mode:2;		/* Channel mode */
310*4882a593Smuzhiyun 	uint8_t blocks:2;		/* Blocks */
311*4882a593Smuzhiyun 	uint8_t sampling_frequency:2;	/* Sampling frequency */
312*4882a593Smuzhiyun 	uint8_t bitpool:8;		/* Bitpool */
313*4882a593Smuzhiyun 	uint8_t crc_check:8;		/* CRC check */
314*4882a593Smuzhiyun } __attribute__ ((packed));
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* NOTE: The code is copied from pa.
317*4882a593Smuzhiyun  * only the bit field in 8-bit is affected by endian, not the 16-bit or 32-bit.
318*4882a593Smuzhiyun  * why?
319*4882a593Smuzhiyun  */
320*4882a593Smuzhiyun struct rtp_header {
321*4882a593Smuzhiyun 	unsigned cc:4;
322*4882a593Smuzhiyun 	unsigned x:1;
323*4882a593Smuzhiyun 	unsigned p:1;
324*4882a593Smuzhiyun 	unsigned v:2;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	unsigned pt:7;
327*4882a593Smuzhiyun 	unsigned m:1;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	uint16_t sequence_number;
330*4882a593Smuzhiyun 	uint32_t timestamp;
331*4882a593Smuzhiyun 	uint32_t ssrc;
332*4882a593Smuzhiyun 	uint32_t csrc[0];
333*4882a593Smuzhiyun } __attribute__ ((packed));
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #else
336*4882a593Smuzhiyun /* big endian */
337*4882a593Smuzhiyun struct sbc_frame_hdr {
338*4882a593Smuzhiyun 	uint8_t syncword:8;		/* Sync word */
339*4882a593Smuzhiyun 	uint8_t sampling_frequency:2;	/* Sampling frequency */
340*4882a593Smuzhiyun 	uint8_t blocks:2;		/* Blocks */
341*4882a593Smuzhiyun 	uint8_t channel_mode:2;		/* Channel mode */
342*4882a593Smuzhiyun 	uint8_t allocation_method:1;	/* Allocation method */
343*4882a593Smuzhiyun 	uint8_t subbands:1;		/* Subbands */
344*4882a593Smuzhiyun 	uint8_t bitpool:8;		/* Bitpool */
345*4882a593Smuzhiyun 	uint8_t crc_check:8;		/* CRC check */
346*4882a593Smuzhiyun } __attribute__ ((packed));
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun struct rtp_header {
349*4882a593Smuzhiyun 	unsigned v:2;
350*4882a593Smuzhiyun 	unsigned p:1;
351*4882a593Smuzhiyun 	unsigned x:1;
352*4882a593Smuzhiyun 	unsigned cc:4;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	unsigned m:1;
355*4882a593Smuzhiyun 	unsigned pt:7;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	uint16_t sequence_number;
358*4882a593Smuzhiyun 	uint32_t timestamp;
359*4882a593Smuzhiyun 	uint32_t ssrc;
360*4882a593Smuzhiyun 	uint32_t csrc[0];
361*4882a593Smuzhiyun } __attribute__ ((packed));
362*4882a593Smuzhiyun #endif /* __LITTLE_ENDIAN */
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun void rtk_btcoex_parse_event(uint8_t *buffer, int count);
365*4882a593Smuzhiyun void rtk_btcoex_parse_cmd(uint8_t *buffer, int count);
366*4882a593Smuzhiyun void rtk_btcoex_parse_l2cap_data_tx(uint8_t *buffer, int count);
367*4882a593Smuzhiyun void rtk_btcoex_parse_l2cap_data_rx(uint8_t *buffer, int count);
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun void rtk_btcoex_open(struct hci_dev *hdev);
370*4882a593Smuzhiyun void rtk_btcoex_close(void);
371*4882a593Smuzhiyun void rtk_btcoex_probe(struct hci_dev *hdev);
372*4882a593Smuzhiyun void rtk_btcoex_init(void);
373*4882a593Smuzhiyun void rtk_btcoex_exit(void);
374