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_download_cmd { 18 __u8 index; 19 __u8 data[RTL_FRAG_LEN]; 20 } __packed; 21 22 struct rtl_download_response { 23 __u8 status; 24 __u8 index; 25 } __packed; 26 27 struct rtl_rom_version_evt { 28 __u8 status; 29 __u8 version; 30 } __packed; 31 32 struct rtl_epatch_header { 33 __u8 signature[8]; 34 __le32 fw_version; 35 __le16 num_patches; 36 } __packed; 37 38 struct rtl_vendor_config_entry { 39 __le16 offset; 40 __u8 len; 41 __u8 data[]; 42 } __packed; 43 44 struct rtl_vendor_config { 45 __le32 signature; 46 __le16 total_len; 47 struct rtl_vendor_config_entry entry[]; 48 } __packed; 49 50 enum { 51 REALTEK_ALT6_CONTINUOUS_TX_CHIP, 52 53 __REALTEK_NUM_FLAGS, 54 }; 55 56 struct btrealtek_data { 57 DECLARE_BITMAP(flags, __REALTEK_NUM_FLAGS); 58 }; 59 60 #define btrealtek_set_flag(hdev, nr) \ 61 do { \ 62 struct btrealtek_data *realtek = hci_get_priv((hdev)); \ 63 set_bit((nr), realtek->flags); \ 64 } while (0) 65 66 #define btrealtek_get_flag(hdev) \ 67 (((struct btrealtek_data *)hci_get_priv(hdev))->flags) 68 69 #define btrealtek_test_flag(hdev, nr) test_bit((nr), btrealtek_get_flag(hdev)) 70 71 #if IS_ENABLED(CONFIG_BT_RTL) 72 73 struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 74 const char *postfix); 75 void btrtl_free(struct btrtl_device_info *btrtl_dev); 76 int btrtl_download_firmware(struct hci_dev *hdev, 77 struct btrtl_device_info *btrtl_dev); 78 void btrtl_set_quirks(struct hci_dev *hdev, 79 struct btrtl_device_info *btrtl_dev); 80 int btrtl_setup_realtek(struct hci_dev *hdev); 81 int btrtl_shutdown_realtek(struct hci_dev *hdev); 82 int btrtl_get_uart_settings(struct hci_dev *hdev, 83 struct btrtl_device_info *btrtl_dev, 84 unsigned int *controller_baudrate, 85 u32 *device_baudrate, bool *flow_control); 86 87 #else 88 89 static inline struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 90 const char *postfix) 91 { 92 return ERR_PTR(-EOPNOTSUPP); 93 } 94 95 static inline void btrtl_free(struct btrtl_device_info *btrtl_dev) 96 { 97 } 98 99 static inline int btrtl_download_firmware(struct hci_dev *hdev, 100 struct btrtl_device_info *btrtl_dev) 101 { 102 return -EOPNOTSUPP; 103 } 104 105 static inline void btrtl_set_quirks(struct hci_dev *hdev, 106 struct btrtl_device_info *btrtl_dev) 107 { 108 } 109 110 static inline int btrtl_setup_realtek(struct hci_dev *hdev) 111 { 112 return -EOPNOTSUPP; 113 } 114 115 static inline int btrtl_shutdown_realtek(struct hci_dev *hdev) 116 { 117 return -EOPNOTSUPP; 118 } 119 120 static inline int btrtl_get_uart_settings(struct hci_dev *hdev, 121 struct btrtl_device_info *btrtl_dev, 122 unsigned int *controller_baudrate, 123 u32 *device_baudrate, 124 bool *flow_control) 125 { 126 return -ENOENT; 127 } 128 129 #endif 130