mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			344 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
| diff -drupN a/drivers/bluetooth/rtk_coex.h b/drivers/bluetooth/rtk_coex.h
 | |
| --- a/drivers/bluetooth/rtk_coex.h	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ b/drivers/bluetooth/rtk_coex.h	2022-06-12 05:28:14.000000000 +0300
 | |
| @@ -0,0 +1,339 @@
 | |
| +#include <net/bluetooth/hci_core.h>
 | |
| +#include <linux/list.h>
 | |
| +
 | |
| +/***********************************
 | |
| +** Realtek - For coexistence **
 | |
| +***********************************/
 | |
| +#define BTRTL_HCIUSB    0
 | |
| +#define BTRTL_HCIUART   1
 | |
| +
 | |
| +#define BTRTL_HCI_IF    BTRTL_HCIUART
 | |
| +
 | |
| +#define TRUE                1
 | |
| +#define FALSE               0
 | |
| +
 | |
| +#define CONNECT_PORT        30001
 | |
| +#define CONNECT_PORT_WIFI   30000
 | |
| +
 | |
| +#define invite_req          "INVITE_REQ"
 | |
| +#define invite_rsp          "INVITE_RSP"
 | |
| +#define attend_req          "ATTEND_REQ"
 | |
| +#define attend_ack          "ATTEND_ACK"
 | |
| +#define wifi_leave          "WIFI_LEAVE"
 | |
| +#define leave_ack           "LEAVE_ACK"
 | |
| +#define bt_leave            "BT_LEAVE"
 | |
| +
 | |
| +#define HCI_OP_PERIODIC_INQ								0x0403
 | |
| +#define HCI_EV_LE_META			                        0x3e
 | |
| +#define HCI_EV_LE_CONN_COMPLETE		                    0x01
 | |
| +#define HCI_EV_LE_CONN_UPDATE_COMPLETE	                0x03
 | |
| +
 | |
| +//vendor cmd to fw
 | |
| +#define HCI_VENDOR_ENABLE_PROFILE_REPORT_COMMAND        0xfc18
 | |
| +#define HCI_VENDOR_SET_PROFILE_REPORT_COMMAND           0xfc19
 | |
| +#define HCI_VENDOR_MAILBOX_CMD                          0xfc8f
 | |
| +#define HCI_VENDOR_SET_BITPOOL				0xfc51
 | |
| +
 | |
| +//subcmd to fw
 | |
| +#define HCI_VENDOR_SUB_CMD_WIFI_CHANNEL_AND_BANDWIDTH_CMD   0x11
 | |
| +#define HCI_VENDOR_SUB_CMD_WIFI_FORCE_TX_POWER_CMD          0x17
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_ENABLE_IGNORE_WLAN_ACT_CMD    0x1B
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_REPORT_CONN_SCO_INQ_INFO      0x23
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_AUTO_REPORT_STATUS_INFO       0x27
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_AUTO_REPORT_ENABLE            0x28
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_SET_TXRETRY_REPORT_PARAM      0x29
 | |
| +#define HCI_VENDOR_SUB_CMD_BT_SET_PTATABLE                  0x2A
 | |
| +#define HCI_VENDOR_SUB_CMD_SET_BT_PSD_MODE                  0x31
 | |
| +#define HCI_VENDOR_SUB_CMD_SET_BT_LNA_CONSTRAINT            0x32
 | |
| +#define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_L                    0x40
 | |
| +#define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_M                    0x41
 | |
| +#define HCI_VENDOR_SUB_CMD_GET_AFH_MAP_H                    0x42
 | |
| +#define HCI_VENDOR_SUB_CMD_RD_REG_REQ                       0x43
 | |
| +#define HCI_VENDOR_SUB_CMD_WR_REG_REQ                       0x44
 | |
| +
 | |
| +#define HCI_EV_VENDOR_SPECIFIC      0xff
 | |
| +
 | |
| +//sub event from fw start
 | |
| +#define HCI_VENDOR_PTA_REPORT_EVENT         0x24
 | |
| +#define HCI_VENDOR_PTA_AUTO_REPORT_EVENT    0x25
 | |
| +
 | |
| +//vendor cmd to wifi driver
 | |
| +#define HCI_GRP_VENDOR_SPECIFIC             (0x3f << 10)
 | |
| +#define HCI_OP_HCI_EXTENSION_VERSION_NOTIFY (0x0100 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_BT_OPERATION_NOTIFY          (0x0102 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_HCI_BT_INFO_NOTIFY           (0x0106 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_HCI_BT_COEX_NOTIFY           (0x0107 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_HCI_BT_PATCH_VER_NOTIFY      (0x0108 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_HCI_BT_AFH_MAP_NOTIFY        (0x0109 | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +#define HCI_OP_HCI_BT_REGISTER_VALUE_NOTIFY (0x010a | HCI_GRP_VENDOR_SPECIFIC)
 | |
| +
 | |
| +//bt info reason to wifi
 | |
| +#define HOST_RESPONSE                   0	//Host response when receive the BT Info Control Event
 | |
| +#define POLLING_RESPONSE                1	//The BT Info response for polling by BT firmware.
 | |
| +#define AUTO_REPORT                     2	//BT auto report by BT firmware.
 | |
| +#define STACK_REPORT_WHILE_DEVICE_D2    3	//Stack report when BT firmware is under power save state(ex:D2)
 | |
| +
 | |
| +// vendor event from wifi
 | |
| +#define RTK_HS_EXTENSION_EVENT_WIFI_SCAN            0x01
 | |
| +#define RTK_HS_EXTENSION_EVENT_RADIO_STATUS_NOTIFY  0x02
 | |
| +#define RTK_HS_EXTENSION_EVENT_HCI_BT_INFO_CONTROL  0x03
 | |
| +#define RTK_HS_EXTENSION_EVENT_HCI_BT_COEX_CONTROL  0x04
 | |
| +
 | |
| +//op code from wifi
 | |
| +#define BT_PATCH_VERSION_QUERY      0x00
 | |
| +#define IGNORE_WLAN_ACTIVE_CONTROL  0x01
 | |
| +#define LNA_CONSTRAIN_CONTROL       0x02
 | |
| +#define BT_POWER_DECREASE_CONTROL   0x03
 | |
| +#define BT_PSD_MODE_CONTROL         0x04
 | |
| +#define WIFI_BW_CHNL_NOTIFY         0x05
 | |
| +#define QUERY_BT_AFH_MAP            0x06
 | |
| +#define BT_REGISTER_ACCESS          0x07
 | |
| +
 | |
| +//bt operation to notify
 | |
| +#define BT_OPCODE_NONE                  0
 | |
| +#define BT_OPCODE_INQUIRY_START         1
 | |
| +#define BT_OPCODE_INQUIRY_END           2
 | |
| +#define BT_OPCODE_PAGE_START            3
 | |
| +#define BT_OPCODE_PAGE_SUCCESS_END      4
 | |
| +#define BT_OPCODE_PAGE_UNSUCCESS_END    5
 | |
| +#define BT_OPCODE_PAIR_START            6
 | |
| +#define BT_OPCODE_PAIR_END              7
 | |
| +#define BT_OPCODE_ENABLE_BT             8
 | |
| +#define BT_OPCODE_DISABLE_BT            9
 | |
| +
 | |
| +#define HCI_EXTENSION_VERSION           0x0004
 | |
| +#define HCI_CMD_PREAMBLE_SIZE           3
 | |
| +#define PAN_PACKET_COUNT                5
 | |
| +
 | |
| +#define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2; }
 | |
| +#define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8); }
 | |
| +
 | |
| +#define PSM_SDP     0x0001
 | |
| +#define PSM_RFCOMM  0x0003
 | |
| +#define PSM_PAN     0x000F
 | |
| +#define PSM_HID     0x0011
 | |
| +#define PSM_HID_INT 0x0013
 | |
| +#define PSM_AVCTP   0x0017
 | |
| +#define PSM_AVDTP   0x0019
 | |
| +#define PSM_FTP     0x1001
 | |
| +#define PSM_BIP     0x1003
 | |
| +#define PSM_OPP     0x1015
 | |
| +//--add more if needed--//
 | |
| +
 | |
| +enum {
 | |
| +	profile_sco = 0,
 | |
| +	profile_hid = 1,
 | |
| +	profile_a2dp = 2,
 | |
| +	profile_pan = 3,
 | |
| +	profile_hid_interval = 4,
 | |
| +	profile_hogp = 5,
 | |
| +	profile_voice = 6,
 | |
| +	profile_sink = 7,
 | |
| +	profile_max = 8
 | |
| +};
 | |
| +
 | |
| +#define A2DP_SIGNAL	0x01
 | |
| +#define A2DP_MEDIA	0x02
 | |
| +//profile info data
 | |
| +typedef struct {
 | |
| +	struct list_head list;
 | |
| +	uint16_t handle;
 | |
| +	uint16_t psm;
 | |
| +	uint16_t dcid;
 | |
| +	uint16_t scid;
 | |
| +	uint8_t profile_index;
 | |
| +	uint8_t flags;
 | |
| +} rtk_prof_info, *prtk_prof_info;
 | |
| +
 | |
| +//profile info for each connection
 | |
| +typedef struct rtl_hci_conn {
 | |
| +	struct list_head list;
 | |
| +	uint16_t handle;
 | |
| +	uint8_t type;		// 0:l2cap, 1:sco/esco, 2:le
 | |
| +	uint8_t profile_bitmap;
 | |
| +	int8_t profile_refcount[8];
 | |
| +} rtk_conn_prof, *prtk_conn_prof;
 | |
| +
 | |
| +struct rtl_btinfo {
 | |
| +	u8 cmd;
 | |
| +	u8 len;
 | |
| +	u8 data[6];
 | |
| +};
 | |
| +#define RTL_BTINFO_LEN	(sizeof(struct rtl_btinfo))
 | |
| +/* typedef struct {
 | |
| + * 	uint8_t cmd_index;
 | |
| + * 	uint8_t cmd_length;
 | |
| + * 	uint8_t link_status;
 | |
| + * 	uint8_t retry_cnt;
 | |
| + * 	uint8_t rssi;
 | |
| + * 	uint8_t mailbox_info;
 | |
| + * 	uint16_t acl_throughput;
 | |
| + * } hci_linkstatus_report; */
 | |
| +
 | |
| +typedef struct {
 | |
| +	uint8_t type;
 | |
| +	uint32_t offset;
 | |
| +	uint32_t value;
 | |
| +} hci_mailbox_register;
 | |
| +
 | |
| +struct rtl_btinfo_ctl {
 | |
| +	uint8_t polling_enable;
 | |
| +	uint8_t polling_time;
 | |
| +	uint8_t autoreport_enable;
 | |
| +};
 | |
| +
 | |
| +#define MAX_LEN_OF_HCI_EV	32
 | |
| +#define NUM_RTL_HCI_EV		32
 | |
| +struct rtl_hci_ev {
 | |
| +	__u8 data[MAX_LEN_OF_HCI_EV];
 | |
| +	__u16 len;
 | |
| +	struct list_head list;
 | |
| +};
 | |
| +
 | |
| +#define L2_MAX_SUBSEC_LEN	128
 | |
| +#define L2_MAX_PKTS	16
 | |
| +struct rtl_l2_buff {
 | |
| +	__u8 data[L2_MAX_SUBSEC_LEN];
 | |
| +	__u16 len;
 | |
| +	__u16 out;
 | |
| +	struct list_head list;
 | |
| +};
 | |
| +
 | |
| +struct rtl_coex_struct {
 | |
| +	struct list_head conn_hash;	//hash for connections
 | |
| +	struct list_head profile_list;	//hash for profile info
 | |
| +	struct hci_dev *hdev;
 | |
| +	struct socket *udpsock;
 | |
| +	struct sockaddr_in addr;
 | |
| +	struct sockaddr_in wifi_addr;
 | |
| +	struct timer_list polling_timer;
 | |
| +	struct timer_list a2dp_count_timer;
 | |
| +	struct timer_list pan_count_timer;
 | |
| +	struct timer_list hogp_count_timer;
 | |
| +	struct workqueue_struct *sock_wq;
 | |
| +	struct workqueue_struct *fw_wq;
 | |
| +	struct delayed_work sock_work;
 | |
| +	struct delayed_work fw_work;
 | |
| +	struct delayed_work l2_work;
 | |
| +	struct sock *sk;
 | |
| +	struct urb *urb;
 | |
| +	spinlock_t spin_lock_sock;
 | |
| +	spinlock_t spin_lock_profile;
 | |
| +	uint32_t a2dp_packet_count;
 | |
| +	uint32_t pan_packet_count;
 | |
| +	uint32_t hogp_packet_count;
 | |
| +	uint32_t voice_packet_count;
 | |
| +	uint8_t profile_bitmap;
 | |
| +	uint8_t profile_status;
 | |
| +	int8_t profile_refcount[8];
 | |
| +	uint8_t ispairing;
 | |
| +	uint8_t isinquirying;
 | |
| +	uint8_t ispaging;
 | |
| +	uint8_t wifi_state;
 | |
| +	uint8_t autoreport;
 | |
| +	uint8_t polling_enable;
 | |
| +	uint8_t polling_interval;
 | |
| +	uint8_t piconet_id;
 | |
| +	uint8_t mode;
 | |
| +	uint8_t afh_map[10];
 | |
| +	uint16_t hci_reversion;
 | |
| +	uint16_t lmp_subversion;
 | |
| +	uint8_t wifi_on;
 | |
| +	uint8_t sock_open;
 | |
| +	unsigned long cmd_last_tx;
 | |
| +
 | |
| +	/* hci ev buff */
 | |
| +	struct list_head ev_used_list;
 | |
| +	struct list_head ev_free_list;
 | |
| +
 | |
| +	spinlock_t rxlock;
 | |
| +	__u8 pkt_type;
 | |
| +	__u16 expect;
 | |
| +	__u8 *tbuff;
 | |
| +	__u16 elen;
 | |
| +	__u8 back_buff[HCI_MAX_EVENT_SIZE];
 | |
| +
 | |
| +	/* l2cap rx buff */
 | |
| +	struct list_head l2_used_list;
 | |
| +	struct list_head l2_free_list;
 | |
| +
 | |
| +	/* buff addr and size */
 | |
| +	spinlock_t buff_lock;
 | |
| +	unsigned long pages_addr;
 | |
| +	unsigned long buff_size;
 | |
| +
 | |
| +#define RTL_COEX_RUNNING	(1 << 0)
 | |
| +	unsigned long flags;
 | |
| +
 | |
| +};
 | |
| +
 | |
| +#ifdef __LITTLE_ENDIAN
 | |
| +struct sbc_frame_hdr {
 | |
| +	uint8_t syncword:8;		/* Sync word */
 | |
| +	uint8_t subbands:1;		/* Subbands */
 | |
| +	uint8_t allocation_method:1;	/* Allocation method */
 | |
| +	uint8_t channel_mode:2;		/* Channel mode */
 | |
| +	uint8_t blocks:2;		/* Blocks */
 | |
| +	uint8_t sampling_frequency:2;	/* Sampling frequency */
 | |
| +	uint8_t bitpool:8;		/* Bitpool */
 | |
| +	uint8_t crc_check:8;		/* CRC check */
 | |
| +} __attribute__ ((packed));
 | |
| +
 | |
| +/* NOTE: The code is copied from pa.
 | |
| + * only the bit field in 8-bit is affected by endian, not the 16-bit or 32-bit.
 | |
| + * why?
 | |
| + */
 | |
| +struct rtp_header {
 | |
| +	unsigned cc:4;
 | |
| +	unsigned x:1;
 | |
| +	unsigned p:1;
 | |
| +	unsigned v:2;
 | |
| +
 | |
| +	unsigned pt:7;
 | |
| +	unsigned m:1;
 | |
| +
 | |
| +	uint16_t sequence_number;
 | |
| +	uint32_t timestamp;
 | |
| +	uint32_t ssrc;
 | |
| +	uint32_t csrc[0];
 | |
| +} __attribute__ ((packed));
 | |
| +
 | |
| +#else
 | |
| +/* big endian */
 | |
| +struct sbc_frame_hdr {
 | |
| +	uint8_t syncword:8;		/* Sync word */
 | |
| +	uint8_t sampling_frequency:2;	/* Sampling frequency */
 | |
| +	uint8_t blocks:2;		/* Blocks */
 | |
| +	uint8_t channel_mode:2;		/* Channel mode */
 | |
| +	uint8_t allocation_method:1;	/* Allocation method */
 | |
| +	uint8_t subbands:1;		/* Subbands */
 | |
| +	uint8_t bitpool:8;		/* Bitpool */
 | |
| +	uint8_t crc_check:8;		/* CRC check */
 | |
| +} __attribute__ ((packed));
 | |
| +
 | |
| +struct rtp_header {
 | |
| +	unsigned v:2;
 | |
| +	unsigned p:1;
 | |
| +	unsigned x:1;
 | |
| +	unsigned cc:4;
 | |
| +
 | |
| +	unsigned m:1;
 | |
| +	unsigned pt:7;
 | |
| +
 | |
| +	uint16_t sequence_number;
 | |
| +	uint32_t timestamp;
 | |
| +	uint32_t ssrc;
 | |
| +	uint32_t csrc[0];
 | |
| +} __attribute__ ((packed));
 | |
| +#endif /* __LITTLE_ENDIAN */
 | |
| +
 | |
| +void rtk_btcoex_parse_event(uint8_t *buffer, int count);
 | |
| +void rtk_btcoex_parse_cmd(uint8_t *buffer, int count);
 | |
| +void rtk_btcoex_parse_l2cap_data_tx(uint8_t *buffer, int count);
 | |
| +void rtk_btcoex_parse_l2cap_data_rx(uint8_t *buffer, int count);
 | |
| +
 | |
| +void rtk_btcoex_open(struct hci_dev *hdev);
 | |
| +void rtk_btcoex_close(void);
 | |
| +void rtk_btcoex_probe(struct hci_dev *hdev);
 | |
| +void rtk_btcoex_init(void);
 | |
| +void rtk_btcoex_exit(void);
 |