1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2db33c77dSCarlo Caione /* 3db33c77dSCarlo Caione * Bluetooth support for Realtek devices 4db33c77dSCarlo Caione * 5db33c77dSCarlo Caione * Copyright (C) 2015 Endless Mobile, Inc. 6db33c77dSCarlo Caione */ 7db33c77dSCarlo Caione 8db33c77dSCarlo Caione #define RTL_FRAG_LEN 252 9db33c77dSCarlo Caione 1026503ad2SMartin Blumenstingl #define rtl_dev_err(dev, fmt, ...) bt_dev_err(dev, "RTL: " fmt, ##__VA_ARGS__) 1126503ad2SMartin Blumenstingl #define rtl_dev_warn(dev, fmt, ...) bt_dev_warn(dev, "RTL: " fmt, ##__VA_ARGS__) 1226503ad2SMartin Blumenstingl #define rtl_dev_info(dev, fmt, ...) bt_dev_info(dev, "RTL: " fmt, ##__VA_ARGS__) 1326503ad2SMartin Blumenstingl #define rtl_dev_dbg(dev, fmt, ...) bt_dev_dbg(dev, "RTL: " fmt, ##__VA_ARGS__) 1426503ad2SMartin Blumenstingl 1526503ad2SMartin Blumenstingl struct btrtl_device_info; 1626503ad2SMartin Blumenstingl 17db33c77dSCarlo Caione struct rtl_download_cmd { 18db33c77dSCarlo Caione __u8 index; 19db33c77dSCarlo Caione __u8 data[RTL_FRAG_LEN]; 20db33c77dSCarlo Caione } __packed; 21db33c77dSCarlo Caione 22db33c77dSCarlo Caione struct rtl_download_response { 23db33c77dSCarlo Caione __u8 status; 24db33c77dSCarlo Caione __u8 index; 25db33c77dSCarlo Caione } __packed; 26db33c77dSCarlo Caione 27db33c77dSCarlo Caione struct rtl_rom_version_evt { 28db33c77dSCarlo Caione __u8 status; 29db33c77dSCarlo Caione __u8 version; 30db33c77dSCarlo Caione } __packed; 31db33c77dSCarlo Caione 32db33c77dSCarlo Caione struct rtl_epatch_header { 33db33c77dSCarlo Caione __u8 signature[8]; 34db33c77dSCarlo Caione __le32 fw_version; 35db33c77dSCarlo Caione __le16 num_patches; 36db33c77dSCarlo Caione } __packed; 37db33c77dSCarlo Caione 38b85b0ee1SMartin Blumenstingl struct rtl_vendor_config_entry { 39b85b0ee1SMartin Blumenstingl __le16 offset; 40b85b0ee1SMartin Blumenstingl __u8 len; 41a7e45454SGustavo A. R. Silva __u8 data[]; 42b85b0ee1SMartin Blumenstingl } __packed; 43b85b0ee1SMartin Blumenstingl 44b85b0ee1SMartin Blumenstingl struct rtl_vendor_config { 45b85b0ee1SMartin Blumenstingl __le32 signature; 46b85b0ee1SMartin Blumenstingl __le16 total_len; 47a7e45454SGustavo A. R. Silva struct rtl_vendor_config_entry entry[]; 48b85b0ee1SMartin Blumenstingl } __packed; 49b85b0ee1SMartin Blumenstingl 50db33c77dSCarlo Caione #if IS_ENABLED(CONFIG_BT_RTL) 51db33c77dSCarlo Caione 521cc194caSHans de Goede struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 531cc194caSHans de Goede const char *postfix); 5426503ad2SMartin Blumenstingl void btrtl_free(struct btrtl_device_info *btrtl_dev); 5526503ad2SMartin Blumenstingl int btrtl_download_firmware(struct hci_dev *hdev, 5626503ad2SMartin Blumenstingl struct btrtl_device_info *btrtl_dev); 57*3011faa2SArchie Pusaka void btrtl_set_quirks(struct hci_dev *hdev, 58*3011faa2SArchie Pusaka struct btrtl_device_info *btrtl_dev); 59db33c77dSCarlo Caione int btrtl_setup_realtek(struct hci_dev *hdev); 607af3f558SJian-Hong Pan int btrtl_shutdown_realtek(struct hci_dev *hdev); 61b85b0ee1SMartin Blumenstingl int btrtl_get_uart_settings(struct hci_dev *hdev, 62b85b0ee1SMartin Blumenstingl struct btrtl_device_info *btrtl_dev, 63b85b0ee1SMartin Blumenstingl unsigned int *controller_baudrate, 64b85b0ee1SMartin Blumenstingl u32 *device_baudrate, bool *flow_control); 65db33c77dSCarlo Caione 66db33c77dSCarlo Caione #else 67db33c77dSCarlo Caione 681cc194caSHans de Goede static inline struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, 691cc194caSHans de Goede const char *postfix) 7026503ad2SMartin Blumenstingl { 7126503ad2SMartin Blumenstingl return ERR_PTR(-EOPNOTSUPP); 7226503ad2SMartin Blumenstingl } 7326503ad2SMartin Blumenstingl 7426503ad2SMartin Blumenstingl static inline void btrtl_free(struct btrtl_device_info *btrtl_dev) 7526503ad2SMartin Blumenstingl { 7626503ad2SMartin Blumenstingl } 7726503ad2SMartin Blumenstingl 7826503ad2SMartin Blumenstingl static inline int btrtl_download_firmware(struct hci_dev *hdev, 7926503ad2SMartin Blumenstingl struct btrtl_device_info *btrtl_dev) 8026503ad2SMartin Blumenstingl { 8126503ad2SMartin Blumenstingl return -EOPNOTSUPP; 8226503ad2SMartin Blumenstingl } 8326503ad2SMartin Blumenstingl 84*3011faa2SArchie Pusaka static inline void btrtl_set_quirks(struct hci_dev *hdev, 85*3011faa2SArchie Pusaka struct btrtl_device_info *btrtl_dev) 86*3011faa2SArchie Pusaka { 87*3011faa2SArchie Pusaka } 88*3011faa2SArchie Pusaka 89db33c77dSCarlo Caione static inline int btrtl_setup_realtek(struct hci_dev *hdev) 90db33c77dSCarlo Caione { 91db33c77dSCarlo Caione return -EOPNOTSUPP; 92db33c77dSCarlo Caione } 93db33c77dSCarlo Caione 947af3f558SJian-Hong Pan static inline int btrtl_shutdown_realtek(struct hci_dev *hdev) 957af3f558SJian-Hong Pan { 967af3f558SJian-Hong Pan return -EOPNOTSUPP; 977af3f558SJian-Hong Pan } 987af3f558SJian-Hong Pan 99b85b0ee1SMartin Blumenstingl static inline int btrtl_get_uart_settings(struct hci_dev *hdev, 100b85b0ee1SMartin Blumenstingl struct btrtl_device_info *btrtl_dev, 101b85b0ee1SMartin Blumenstingl unsigned int *controller_baudrate, 102b85b0ee1SMartin Blumenstingl u32 *device_baudrate, 103b85b0ee1SMartin Blumenstingl bool *flow_control) 104b85b0ee1SMartin Blumenstingl { 105b85b0ee1SMartin Blumenstingl return -ENOENT; 106b85b0ee1SMartin Blumenstingl } 107b85b0ee1SMartin Blumenstingl 108db33c77dSCarlo Caione #endif 109