1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Bluetooth support for Realtek devices 4 * 5 * Copyright (C) 2015 Endless Mobile, Inc. 6 */ 7 8 #define RTL_FRAG_LEN 252 9 10 #define rtl_dev_err(dev, fmt, ...) bt_dev_err(dev, "RTL: " fmt, ##__VA_ARGS__) 11 #define rtl_dev_warn(dev, fmt, ...) bt_dev_warn(dev, "RTL: " fmt, ##__VA_ARGS__) 12 #define rtl_dev_info(dev, fmt, ...) bt_dev_info(dev, "RTL: " fmt, ##__VA_ARGS__) 13 #define rtl_dev_dbg(dev, fmt, ...) bt_dev_dbg(dev, "RTL: " fmt, ##__VA_ARGS__) 14 15 struct btrtl_device_info; 16 17 struct rtl_chip_type_evt { 18 __u8 status; 19 __u8 type; 20 } __packed; 21 22 struct rtl_download_cmd { 23 __u8 index; 24 __u8 data[RTL_FRAG_LEN]; 25 } __packed; 26 27 struct rtl_download_response { 28 __u8 status; 29 __u8 index; 30 } __packed; 31 32 struct rtl_rom_version_evt { 33 __u8 status; 34 __u8 version; 35 } __packed; 36 37 struct rtl_epatch_header { 38 __u8 signature[8]; 39 __le32 fw_version; 40 __le16 num_patches; 41 } __packed; 42 43 struct rtl_vendor_config_entry { 44 __le16 offset; 45 __u8 len; 46 __u8 data[]; 47 } __packed; 48 49 struct rtl_vendor_config { 50 __le32 signature; 51 __le16 total_len; 52 __u8 entry[]; 53 } __packed; 54 55 struct rtl_epatch_header_v2 { 56 __u8 signature[8]; 57 __u8 fw_version[8]; 58 __le32 num_sections; 59 } __packed; 60 61 struct rtl_section { 62 __le32 opcode; 63 __le32 len; 64 u8 data[]; 65 } __packed; 66 67 struct rtl_section_hdr { 68 __le16 num; 69 __le16 reserved; 70 } __packed; 71 72 struct rtl_common_subsec { 73 __u8 eco; 74 __u8 prio; 75 __u8 cb[2]; 76 __le32 len; 77 __u8 data[]; 78 }; 79 80 struct rtl_sec_hdr { 81 __u8 eco; 82 __u8 prio; 83 __u8 key_id; 84 __u8 reserved; 85 __le32 len; 86 __u8 data[]; 87 } __packed; 88 89 struct rtl_subsection { 90 struct list_head list; 91 u32 opcode; 92 u32 len; 93 u8 prio; 94 u8 *data; 95 }; 96 97 struct rtl_iovec { 98 u8 *data; 99 u32 len; 100 }; 101 102 struct rtl_vendor_cmd { 103 __u8 param[5]; 104 } __packed; 105 106 enum { 107 REALTEK_ALT6_CONTINUOUS_TX_CHIP, 108 109 __REALTEK_NUM_FLAGS, 110 }; 111 112 struct rtl_dump_info { 113 const char *driver_name; 114 char *controller; 115 u32 fw_version; 116 }; 117 118 struct btrealtek_data { 119 DECLARE_BITMAP(flags, __REALTEK_NUM_FLAGS); 120 121 struct rtl_dump_info rtl_dump; 122 }; 123 124 #define btrealtek_set_flag(hdev, nr) \ 125 do { \ 126 struct btrealtek_data *realtek = hci_get_priv((hdev)); \ 127 set_bit((nr), realtek->flags); \ 128 } while (0) 129 130 #define btrealtek_get_flag(hdev) \ 131 (((struct btrealtek_data *)hci_get_priv(hdev))->flags) 132 133 #define btrealtek_test_flag(hdev, nr) test_bit((nr), btrealtek_get_flag(hdev)) 134 135 #if IS_ENABLED(CONFIG_BT_RTL) 136 137 struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 138 const char *postfix); 139 void btrtl_free(struct btrtl_device_info *btrtl_dev); 140 int btrtl_download_firmware(struct hci_dev *hdev, 141 struct btrtl_device_info *btrtl_dev); 142 void btrtl_set_quirks(struct hci_dev *hdev, 143 struct btrtl_device_info *btrtl_dev); 144 int btrtl_setup_realtek(struct hci_dev *hdev); 145 int btrtl_shutdown_realtek(struct hci_dev *hdev); 146 int btrtl_get_uart_settings(struct hci_dev *hdev, 147 struct btrtl_device_info *btrtl_dev, 148 unsigned int *controller_baudrate, 149 u32 *device_baudrate, bool *flow_control); 150 void btrtl_set_driver_name(struct hci_dev *hdev, const char *driver_name); 151 152 #else 153 154 static inline struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 155 const char *postfix) 156 { 157 return ERR_PTR(-EOPNOTSUPP); 158 } 159 160 static inline void btrtl_free(struct btrtl_device_info *btrtl_dev) 161 { 162 } 163 164 static inline int btrtl_download_firmware(struct hci_dev *hdev, 165 struct btrtl_device_info *btrtl_dev) 166 { 167 return -EOPNOTSUPP; 168 } 169 170 static inline void btrtl_set_quirks(struct hci_dev *hdev, 171 struct btrtl_device_info *btrtl_dev) 172 { 173 } 174 175 static inline int btrtl_setup_realtek(struct hci_dev *hdev) 176 { 177 return -EOPNOTSUPP; 178 } 179 180 static inline int btrtl_shutdown_realtek(struct hci_dev *hdev) 181 { 182 return -EOPNOTSUPP; 183 } 184 185 static inline int btrtl_get_uart_settings(struct hci_dev *hdev, 186 struct btrtl_device_info *btrtl_dev, 187 unsigned int *controller_baudrate, 188 u32 *device_baudrate, 189 bool *flow_control) 190 { 191 return -ENOENT; 192 } 193 194 static inline void btrtl_set_driver_name(struct hci_dev *hdev, const char *driver_name) 195 { 196 } 197 198 #endif 199