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 btrealtek_data { 113 DECLARE_BITMAP(flags, __REALTEK_NUM_FLAGS); 114 }; 115 116 #define btrealtek_set_flag(hdev, nr) \ 117 do { \ 118 struct btrealtek_data *realtek = hci_get_priv((hdev)); \ 119 set_bit((nr), realtek->flags); \ 120 } while (0) 121 122 #define btrealtek_get_flag(hdev) \ 123 (((struct btrealtek_data *)hci_get_priv(hdev))->flags) 124 125 #define btrealtek_test_flag(hdev, nr) test_bit((nr), btrealtek_get_flag(hdev)) 126 127 #if IS_ENABLED(CONFIG_BT_RTL) 128 129 struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 130 const char *postfix); 131 void btrtl_free(struct btrtl_device_info *btrtl_dev); 132 int btrtl_download_firmware(struct hci_dev *hdev, 133 struct btrtl_device_info *btrtl_dev); 134 void btrtl_set_quirks(struct hci_dev *hdev, 135 struct btrtl_device_info *btrtl_dev); 136 int btrtl_setup_realtek(struct hci_dev *hdev); 137 int btrtl_shutdown_realtek(struct hci_dev *hdev); 138 int btrtl_get_uart_settings(struct hci_dev *hdev, 139 struct btrtl_device_info *btrtl_dev, 140 unsigned int *controller_baudrate, 141 u32 *device_baudrate, bool *flow_control); 142 143 #else 144 145 static inline struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 146 const char *postfix) 147 { 148 return ERR_PTR(-EOPNOTSUPP); 149 } 150 151 static inline void btrtl_free(struct btrtl_device_info *btrtl_dev) 152 { 153 } 154 155 static inline int btrtl_download_firmware(struct hci_dev *hdev, 156 struct btrtl_device_info *btrtl_dev) 157 { 158 return -EOPNOTSUPP; 159 } 160 161 static inline void btrtl_set_quirks(struct hci_dev *hdev, 162 struct btrtl_device_info *btrtl_dev) 163 { 164 } 165 166 static inline int btrtl_setup_realtek(struct hci_dev *hdev) 167 { 168 return -EOPNOTSUPP; 169 } 170 171 static inline int btrtl_shutdown_realtek(struct hci_dev *hdev) 172 { 173 return -EOPNOTSUPP; 174 } 175 176 static inline int btrtl_get_uart_settings(struct hci_dev *hdev, 177 struct btrtl_device_info *btrtl_dev, 178 unsigned int *controller_baudrate, 179 u32 *device_baudrate, 180 bool *flow_control) 181 { 182 return -ENOENT; 183 } 184 185 #endif 186