^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 */