btrtl.h 4.0 KB

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