Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *  Realtek Bluetooth USB driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *  it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *  the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *  (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *  This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *  GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *  You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *  along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #include <linux/cdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #include <linux/version.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #include <linux/suspend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define CONFIG_BLUEDROID        1 /* bleuz 0, bluedroid 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) //#define CONFIG_SCO_OVER_HCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #ifdef CONFIG_SCO_OVER_HCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #include <linux/usb/audio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #include <sound/core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #include <sound/initval.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #include <sound/pcm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #include <sound/pcm_params.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define RTK_SCO_ID "snd_sco_rtk"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	USB_CAPTURE_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	USB_PLAYBACK_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	ALSA_CAPTURE_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	ALSA_PLAYBACK_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	ALSA_CAPTURE_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	ALSA_PLAYBACK_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	CAPTURE_URB_COMPLETED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	PLAYBACK_URB_COMPLETED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	DISCONNECTED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) // RTK sound card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) typedef struct RTK_sco_card {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63)     struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)     struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)     struct usb_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)     struct btusb_data *usb_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)     unsigned long states;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)     struct rtk_sco_stream {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 		    struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		    unsigned int sco_packet_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		    snd_pcm_uframes_t buffer_pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	  } capture, playback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)     spinlock_t capture_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)     spinlock_t playback_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)     struct work_struct send_sco_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) } RTK_sco_card_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) /* Some Android system may use standard Linux kernel, while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  * standard Linux may also implement early suspend feature.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * So exclude earysuspend.h from CONFIG_BLUEDROID.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) #ifdef CONFIG_HAS_EARLYSUSPEND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #include <linux/earlysuspend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #if CONFIG_BLUEDROID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) #include <net/bluetooth/hci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) /***********************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) ** Realtek - For rtk_btusb driver **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) ***********************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) #define URB_CANCELING_DELAY_MS          10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) /* when OS suspended, module is still powered,usb is not powered,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  * this may set to 1, and must comply with special patch code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define CONFIG_RESET_RESUME     1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define PRINT_CMD_EVENT         0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define PRINT_ACL_DATA          0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define PRINT_SCO_DATA          0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define RTKBT_DBG_FLAG          0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #if RTKBT_DBG_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define RTKBT_DBG(fmt, arg...) printk(KERN_INFO "rtk_btusb: " fmt "\n" , ## arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define RTKBT_DBG(fmt, arg...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define RTKBT_INFO(fmt, arg...) printk(KERN_INFO "rtk_btusb: " fmt "\n" , ## arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define RTKBT_WARN(fmt, arg...) printk(KERN_WARNING "rtk_btusb: " fmt "\n" , ## arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define RTKBT_ERR(fmt, arg...) printk(KERN_ERR "rtk_btusb: " fmt "\n" , ## arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define HDEV_BUS        hdev->bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define USB_RPM            1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define HDEV_BUS        hdev->type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define USB_RPM            0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define NUM_REASSEMBLY 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define GET_DRV_DATA(x)        hci_get_drvdata(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define GET_DRV_DATA(x)        x->driver_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define BTUSB_RPM        (0 * USB_RPM) /* 1 SS enable; 0 SS disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define BTUSB_WAKEUP_HOST        0    /* 1  enable; 0  disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define BTUSB_MAX_ISOC_FRAMES    48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define BTUSB_INTR_RUNNING        0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define BTUSB_BULK_RUNNING        1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define BTUSB_ISOC_RUNNING        2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define BTUSB_SUSPENDING        3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define BTUSB_DID_ISO_RESUME    4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define HCI_CMD_READ_BD_ADDR 0x1009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define HCI_VENDOR_CHANGE_BDRATE 0xfc17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define HCI_VENDOR_READ_RTK_ROM_VERISION 0xfc6d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define HCI_VENDOR_READ_LMP_VERISION 0x1001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define HCI_VENDOR_FORCE_RESET_AND_PATCHABLE 0xfc66
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define HCI_VENDOR_RESET                       0x0C03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define HCI_VENDOR_ADD_WAKE_UP_DEVICE       0xfc7b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define HCI_VENDOR_REMOVE_WAKE_UP_DEVICE    0xfc7c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define HCI_VENDOR_CLEAR_POWERON_LIST       0xfc7d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define HCI_VENDOR_USB_DISC_HARDWARE_ERROR   0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SET_WAKEUP_DEVICE_CONF      "/data/misc/bluedroid/rtkbt_wakeup_ble.conf"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define DRV_NORMAL_MODE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define DRV_MP_MODE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) int mp_drv_mode = 0; /* 1 Mptool Fw; 0 Normal Fw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define ROM_LMP_NONE                0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define ROM_LMP_8723a               0x1200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define ROM_LMP_8723b               0x8723
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define ROM_LMP_8821a               0X8821
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define ROM_LMP_8761a               0X8761
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define ROM_LMP_8703a               0x8723
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define ROM_LMP_8763a               0x8763
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define ROM_LMP_8703b               0x8703
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define ROM_LMP_8723c               0x8703
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define ROM_LMP_8822b               0x8822
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define ROM_LMP_8723d               0x8723
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define ROM_LMP_8821c               0x8821
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* signature: Realtek */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) const uint8_t RTK_EPATCH_SIGNATURE[8] = {0x52,0x65,0x61,0x6C,0x74,0x65,0x63,0x68};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* Extension Section IGNATURE:0x77FD0451 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) const uint8_t EXTENSION_SECTION_SIGNATURE[4] = {0x51,0x04,0xFD,0x77};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) uint16_t project_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)     ROM_LMP_8723a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)     ROM_LMP_8723b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)     ROM_LMP_8821a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)     ROM_LMP_8761a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)     ROM_LMP_8703a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)     ROM_LMP_8763a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)     ROM_LMP_8703b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)     ROM_LMP_8723c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)     ROM_LMP_8822b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)     ROM_LMP_8723d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)     ROM_LMP_8821c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)     ROM_LMP_NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct rtk_eversion_evt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)     uint8_t status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)     uint8_t version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /*modified by lamparten 1020*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct rtk_reset_evt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)     uint8_t status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /*modified by lamparten 1020*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct rtk_localversion_evt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)     uint8_t status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)     uint8_t hci_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)     uint16_t hci_revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)     uint8_t lmp_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)     uint16_t lmp_manufacture;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)     uint16_t lmp_subversion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct rtk_epatch_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)     uint16_t chip_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)     uint16_t patch_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)     uint32_t start_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)     uint32_t coex_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)     uint32_t svn_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)     uint32_t fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct rtk_epatch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)     uint8_t signature[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)     uint32_t fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)     uint16_t number_of_total_patch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)     struct rtk_epatch_entry entry[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct rtk_extension_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)     uint8_t opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)     uint8_t length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)     uint8_t *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct rtk_bt_vendor_config_entry{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)     uint16_t offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)     uint8_t entry_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)     uint8_t entry_data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) struct rtk_bt_vendor_config{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)     uint32_t signature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)     uint16_t data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)     struct rtk_bt_vendor_config_entry entry[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* Realtek - For rtk_btusb driver end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #if CONFIG_BLUEDROID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define QUEUE_SIZE 500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /***************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ** Realtek - Integrate from bluetooth.h **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) *****************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* Reserv for core and drivers use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define BT_SKB_RESERVE    8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* BD Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)     __u8 b[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) } __packed bdaddr_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* Skb helpers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct bt_skb_cb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)     __u8 pkt_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)     __u8 incoming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)     __u16 expect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)     __u16 tx_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)     __u8 retries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)     __u8 sar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)     __u8 force_active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)     struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)     if ((skb = alloc_skb(len + BT_SKB_RESERVE, how))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)         skb_reserve(skb, BT_SKB_RESERVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)         bt_cb(skb)->incoming  = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)     return skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* Realtek - Integrate from bluetooth.h end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /***********************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) ** Realtek - Integrate from hci.h **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ***********************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define HCI_MAX_ACL_SIZE    1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define HCI_MAX_SCO_SIZE    255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define HCI_MAX_EVENT_SIZE    260
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define HCI_MAX_FRAME_SIZE    (HCI_MAX_ACL_SIZE + 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* HCI bus types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define HCI_VIRTUAL    0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define HCI_USB        1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define HCI_PCCARD    2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define HCI_UART    3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define HCI_RS232    4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define HCI_PCI        5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define HCI_SDIO    6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* HCI controller types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define HCI_BREDR    0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #define HCI_AMP        0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /* HCI device flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)     HCI_UP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)     HCI_INIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)     HCI_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)     HCI_PSCAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)     HCI_ISCAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)     HCI_AUTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)     HCI_ENCRYPT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)     HCI_INQUIRY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)     HCI_RAW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)     HCI_RESET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)  * BR/EDR and/or LE controller flags: the flags defined here should represent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)  * states from the controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)     HCI_SETUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)     HCI_AUTO_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)     HCI_MGMT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)     HCI_PAIRABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)     HCI_SERVICE_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)     HCI_LINK_KEYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)     HCI_DEBUG_KEYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)     HCI_UNREGISTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)     HCI_LE_SCAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)     HCI_SSP_ENABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)     HCI_HS_ENABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)     HCI_LE_ENABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)     HCI_CONNECTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)     HCI_DISCOVERABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)     HCI_LINK_SECURITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)     HCI_PENDING_CLASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* HCI data types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define HCI_COMMAND_PKT        0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define HCI_ACLDATA_PKT        0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define HCI_SCODATA_PKT        0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define HCI_EVENT_PKT        0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define HCI_VENDOR_PKT        0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define HCI_MAX_NAME_LENGTH        248
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define HCI_MAX_EIR_LENGTH        240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define HCI_OP_READ_LOCAL_VERSION    0x1001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct hci_rp_read_local_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)     __u8     status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)     __u8     hci_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)     __le16   hci_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)     __u8     lmp_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)     __le16   manufacturer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)     __le16   lmp_subver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #define HCI_EV_CMD_COMPLETE        0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct hci_ev_cmd_complete {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)     __u8     ncmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)     __le16   opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /* ---- HCI Packet structures ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #define HCI_COMMAND_HDR_SIZE 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define HCI_EVENT_HDR_SIZE   2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #define HCI_ACL_HDR_SIZE     4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #define HCI_SCO_HDR_SIZE     3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct hci_command_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)     __le16    opcode;        /* OCF & OGF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)     __u8    plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) struct hci_event_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)     __u8    evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)     __u8    plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct hci_acl_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)     __le16    handle;        /* Handle & Flags(PB, BC) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)     __le16    dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct hci_sco_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)     __le16    handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)     __u8    dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) static inline struct hci_event_hdr *hci_event_hdr(const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)     return (struct hci_event_hdr *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) static inline struct hci_acl_hdr *hci_acl_hdr(const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)     return (struct hci_acl_hdr *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) static inline struct hci_sco_hdr *hci_sco_hdr(const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)     return (struct hci_sco_hdr *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* ---- HCI Ioctl requests structures ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) struct hci_dev_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)     __u32 err_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)     __u32 err_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)     __u32 cmd_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)     __u32 evt_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)     __u32 acl_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)     __u32 acl_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)     __u32 sco_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)     __u32 sco_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)     __u32 byte_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)     __u32 byte_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) /* Realtek - Integrate from hci.h end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /*****************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) ** Realtek - Integrate from hci_core.h  **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) *****************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) struct hci_conn_hash {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)     struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)     unsigned int     acl_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)     unsigned int     sco_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)     unsigned int     le_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) #define HCI_MAX_SHORT_NAME_LENGTH    10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) #define NUM_REASSEMBLY 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct hci_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)     struct mutex    lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)     char        name[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)     unsigned long    flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)     __u16        id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)     __u8        bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)     __u8        dev_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)     struct sk_buff        *reassembly[NUM_REASSEMBLY];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)     struct hci_conn_hash    conn_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)     struct hci_dev_stats    stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) #if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)     atomic_t        refcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)     struct module           *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)     void                    *driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)     atomic_t        promisc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)     struct device        *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)     struct device        dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)     unsigned long        dev_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)     int (*open)(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)     int (*close)(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)     int (*flush)(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)     int (*send)(struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)     void (*destruct)(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)     __u16               voice_setting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)     void (*notify)(struct hci_dev *hdev, unsigned int evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)     int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) #if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 4, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)     atomic_inc(&d->refcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)     return d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) static inline void __hci_dev_put(struct hci_dev *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)     if (atomic_dec_and_test(&d->refcnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)         d->destruct(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static inline void *hci_get_drvdata(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)     return dev_get_drvdata(&hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)     dev_set_drvdata(&hdev->dev, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) #define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /* Realtek - Integrate from hci_core.h end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) /* -----  HCI Commands ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) #define HCI_OP_INQUIRY            0x0401
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) #define HCI_OP_INQUIRY_CANCEL        0x0402
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) #define HCI_OP_EXIT_PERIODIC_INQ    0x0404
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) #define HCI_OP_CREATE_CONN        0x0405
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) #define HCI_OP_DISCONNECT                0x0406
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) #define HCI_OP_ADD_SCO            0x0407
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) #define HCI_OP_CREATE_CONN_CANCEL    0x0408
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #define HCI_OP_ACCEPT_CONN_REQ        0x0409
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) #define HCI_OP_REJECT_CONN_REQ        0x040a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #define HCI_OP_LINK_KEY_REPLY        0x040b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) #define HCI_OP_LINK_KEY_NEG_REPLY    0x040c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) #define HCI_OP_PIN_CODE_REPLY        0x040d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) #define HCI_OP_PIN_CODE_NEG_REPLY    0x040e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) #define HCI_OP_CHANGE_CONN_PTYPE    0x040f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) #define HCI_OP_AUTH_REQUESTED        0x0411
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) #define HCI_OP_SET_CONN_ENCRYPT        0x0413
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) #define HCI_OP_CHANGE_CONN_LINK_KEY    0x0415
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #define HCI_OP_REMOTE_NAME_REQ        0x0419
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) #define HCI_OP_REMOTE_NAME_REQ_CANCEL    0x041a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) #define HCI_OP_READ_REMOTE_FEATURES    0x041b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) #define HCI_OP_READ_REMOTE_EXT_FEATURES    0x041c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #define HCI_OP_READ_REMOTE_VERSION    0x041d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) #define HCI_OP_SETUP_SYNC_CONN        0x0428
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) #define HCI_OP_ACCEPT_SYNC_CONN_REQ    0x0429
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) #define HCI_OP_REJECT_SYNC_CONN_REQ    0x042a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) #define HCI_OP_SNIFF_MODE        0x0803
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #define HCI_OP_EXIT_SNIFF_MODE        0x0804
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) #define HCI_OP_ROLE_DISCOVERY        0x0809
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #define HCI_OP_SWITCH_ROLE        0x080b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #define HCI_OP_READ_LINK_POLICY        0x080c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #define HCI_OP_WRITE_LINK_POLICY    0x080d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) #define HCI_OP_READ_DEF_LINK_POLICY    0x080e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #define HCI_OP_WRITE_DEF_LINK_POLICY    0x080f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #define HCI_OP_SNIFF_SUBRATE        0x0811
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) #define HCI_OP_SET_EVENT_MASK        0x0c01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) #define HCI_OP_RESET            0x0c03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) #define HCI_OP_SET_EVENT_FLT        0x0c05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) #define HCI_OP_Write_Extended_Inquiry_Response        0x0c52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) /* -----  HCI events---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) #define HCI_OP_DISCONNECT        0x0406
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) #define HCI_EV_INQUIRY_COMPLETE        0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #define HCI_EV_INQUIRY_RESULT        0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) #define HCI_EV_CONN_COMPLETE        0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #define HCI_EV_CONN_REQUEST            0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #define HCI_EV_DISCONN_COMPLETE        0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) #define HCI_EV_AUTH_COMPLETE        0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) #define HCI_EV_REMOTE_NAME            0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) #define HCI_EV_ENCRYPT_CHANGE        0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) #define HCI_EV_CHANGE_LINK_KEY_COMPLETE    0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) #define HCI_EV_REMOTE_FEATURES        0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) #define HCI_EV_REMOTE_VERSION        0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #define HCI_EV_QOS_SETUP_COMPLETE    0x0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) #define HCI_EV_CMD_COMPLETE            0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) #define HCI_EV_CMD_STATUS            0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #define HCI_EV_ROLE_CHANGE            0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) #define HCI_EV_NUM_COMP_PKTS        0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #define HCI_EV_MODE_CHANGE            0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) #define HCI_EV_PIN_CODE_REQ            0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #define HCI_EV_LINK_KEY_REQ            0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) #define HCI_EV_LINK_KEY_NOTIFY        0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) #define HCI_EV_CLOCK_OFFSET            0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define HCI_EV_PKT_TYPE_CHANGE        0x1d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) #define HCI_EV_PSCAN_REP_MODE        0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) #define HCI_EV_INQUIRY_RESULT_WITH_RSSI    0x22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) #define HCI_EV_REMOTE_EXT_FEATURES    0x23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) #define HCI_EV_SYNC_CONN_COMPLETE    0x2c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) #define HCI_EV_SYNC_CONN_CHANGED    0x2d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) #define HCI_EV_SNIFF_SUBRATE            0x2e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) #define HCI_EV_EXTENDED_INQUIRY_RESULT    0x2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) #define HCI_EV_IO_CAPA_REQUEST        0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) #define HCI_EV_SIMPLE_PAIR_COMPLETE    0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) #define HCI_EV_REMOTE_HOST_FEATURES    0x3d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) #define CONFIG_MAC_OFFSET_GEN_1_2       (0x3C)      //MAC's OFFSET in config/efuse for realtek generation 1~2 bluetooth chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) #define CONFIG_MAC_OFFSET_GEN_3PLUS     (0x44)      //MAC's OFFSET in config/efuse for rtk generation 3+ bluetooth chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) /*******************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) **    Reasil patch code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) ********************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) #define CMD_CMP_EVT        0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #define PKT_LEN            300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) #define MSG_TO            1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) #define PATCH_SEG_MAX    252
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) #define DATA_END        0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) #define DOWNLOAD_OPCODE    0xfc20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #define BTOFF_OPCODE    0xfc28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) #define TRUE            1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) #define FALSE            0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) #define CMD_HDR_LEN        sizeof(struct hci_command_hdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) #define EVT_HDR_LEN        sizeof(struct hci_event_hdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) #define CMD_CMP_LEN        sizeof(struct hci_ev_cmd_complete)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) #define MAX_PATCH_SIZE_24K (1024*24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) #define MAX_PATCH_SIZE_40K (1024*40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) enum rtk_endpoit {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)     CTRL_EP = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)     INTR_EP = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)     BULK_EP = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)     ISOC_EP = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)     uint16_t    vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)     uint16_t    pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)     uint16_t    lmp_sub_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)     uint16_t    lmp_sub;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)     uint16_t    eversion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)     char        *mp_patch_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)     char        *patch_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)     char        *config_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)     uint8_t     *fw_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)     int         fw_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)     uint16_t    mac_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)     uint32_t    max_patch_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) } patch_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)     struct usb_interface    *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)     struct usb_device        *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)     patch_info *patch_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)     int            pipe_in, pipe_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)     uint8_t        *send_pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)     uint8_t        *rcv_pkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)     struct hci_command_hdr        *cmd_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)     struct hci_event_hdr        *evt_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)     struct hci_ev_cmd_complete    *cmd_cmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)     uint8_t        *req_para,    *rsp_para;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)     uint8_t        *fw_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)     int            pkt_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)     int            fw_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) } firmware_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)     uint8_t index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)     uint8_t data[PATCH_SEG_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) } __attribute__((packed)) download_cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)     uint8_t status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)     uint8_t index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) } __attribute__((packed)) download_rp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) //Define ioctl cmd the same as HCIDEVUP in the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #define DOWN_FW_CFG  _IOW('H', 201, int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) #ifdef CONFIG_SCO_OVER_HCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) #define SET_ISO_CFG  _IOW('H', 202, int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) #define GET_USB_INFO            _IOW('H', 203, int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) #define RESET_CONTROLLER        _IOW('H', 204, int)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) /*  for altsettings*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) #define BDADDR_FILE "/data/misc/bluetooth/bdaddr"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) #define FACTORY_BT_BDADDR_STORAGE_LEN 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static inline int getmacaddr(uint8_t * vnd_local_bd_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)     struct file  *bdaddr_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)     mm_segment_t oldfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)     char buf[FACTORY_BT_BDADDR_STORAGE_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)     int32_t i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)     int ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)     memset(buf, 0, FACTORY_BT_BDADDR_STORAGE_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)     bdaddr_file = filp_open(BDADDR_FILE, O_RDONLY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)     if (IS_ERR(bdaddr_file)){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)         RTKBT_INFO("No Mac Config for BT\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)         return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)     oldfs = get_fs(); set_fs(KERNEL_DS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)     bdaddr_file->f_op->llseek(bdaddr_file, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)     ret = vfs_read(bdaddr_file, buf, FACTORY_BT_BDADDR_STORAGE_LEN, &bdaddr_file->f_pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)     set_fs(oldfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)     filp_close(bdaddr_file, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)     if(ret == FACTORY_BT_BDADDR_STORAGE_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)         for (i = 0; i < 6; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)             if(buf[3*i]>'9')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)                 if(buf[3*i]>'Z')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)                     buf[3*i] -=('a'-'A'); //change  a to A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)                 buf[3*i] -= ('A'-'9'-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)             if(buf[3*i+1]>'9')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)             {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)                 if(buf[3*i+1]>'Z')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)                     buf[3*i+1] -=('a'-'A'); //change  a to A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)                 buf[3*i+1] -= ('A'-'9'-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)             }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)             vnd_local_bd_addr[5-i] = ((uint8_t)buf[3*i]-'0')*16 + ((uint8_t)buf[3*i+1]-'0');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)         return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)     return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) static inline int getAltSettings(patch_info *patch_entry, unsigned short *offset, int max_group_cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)     int n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)     if(patch_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)         offset[n++] = patch_entry->mac_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) //sample code, add special settings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)     offset[n++] = 0x15B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)     return n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static inline int getAltSettingVal(patch_info *patch_entry, unsigned short offset, unsigned char * val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)     int res = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)     switch(offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) //sample code, add special settings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)         case 0x15B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)             val[0] = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)             val[1] = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)             val[2] = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)             val[3] = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)             res = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)         default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)             res = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)             break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)     if((patch_entry)&&(offset == patch_entry->mac_offset)&&(res == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)         if(getmacaddr(val) == 0){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)             RTKBT_INFO("MAC: %02x:%02x:%02x:%02x:%02x:%02x", val[5], val[4], val[3], val[2], val[1], val[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)             res = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)     return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) #endif /* CONFIG_BLUEDROID */