btintel.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /*
  2. *
  3. * Bluetooth support for Intel devices
  4. *
  5. * Copyright (C) 2015 Intel Corporation
  6. *
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *
  22. */
  23. #include <linux/module.h>
  24. #include <linux/firmware.h>
  25. #include <linux/regmap.h>
  26. #include <net/bluetooth/bluetooth.h>
  27. #include <net/bluetooth/hci_core.h>
  28. #include "btintel.h"
  29. #define VERSION "0.1"
  30. #define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
  31. int btintel_check_bdaddr(struct hci_dev *hdev)
  32. {
  33. struct hci_rp_read_bd_addr *bda;
  34. struct sk_buff *skb;
  35. skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
  36. HCI_INIT_TIMEOUT);
  37. if (IS_ERR(skb)) {
  38. int err = PTR_ERR(skb);
  39. BT_ERR("%s: Reading Intel device address failed (%d)",
  40. hdev->name, err);
  41. return err;
  42. }
  43. if (skb->len != sizeof(*bda)) {
  44. BT_ERR("%s: Intel device address length mismatch", hdev->name);
  45. kfree_skb(skb);
  46. return -EIO;
  47. }
  48. bda = (struct hci_rp_read_bd_addr *)skb->data;
  49. /* For some Intel based controllers, the default Bluetooth device
  50. * address 00:03:19:9E:8B:00 can be found. These controllers are
  51. * fully operational, but have the danger of duplicate addresses
  52. * and that in turn can cause problems with Bluetooth operation.
  53. */
  54. if (!bacmp(&bda->bdaddr, BDADDR_INTEL)) {
  55. BT_ERR("%s: Found Intel default device address (%pMR)",
  56. hdev->name, &bda->bdaddr);
  57. set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
  58. }
  59. kfree_skb(skb);
  60. return 0;
  61. }
  62. EXPORT_SYMBOL_GPL(btintel_check_bdaddr);
  63. int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
  64. {
  65. struct sk_buff *skb;
  66. int err;
  67. skb = __hci_cmd_sync(hdev, 0xfc31, 6, bdaddr, HCI_INIT_TIMEOUT);
  68. if (IS_ERR(skb)) {
  69. err = PTR_ERR(skb);
  70. BT_ERR("%s: Changing Intel device address failed (%d)",
  71. hdev->name, err);
  72. return err;
  73. }
  74. kfree_skb(skb);
  75. return 0;
  76. }
  77. EXPORT_SYMBOL_GPL(btintel_set_bdaddr);
  78. void btintel_hw_error(struct hci_dev *hdev, u8 code)
  79. {
  80. struct sk_buff *skb;
  81. u8 type = 0x00;
  82. BT_ERR("%s: Hardware error 0x%2.2x", hdev->name, code);
  83. skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
  84. if (IS_ERR(skb)) {
  85. BT_ERR("%s: Reset after hardware error failed (%ld)",
  86. hdev->name, PTR_ERR(skb));
  87. return;
  88. }
  89. kfree_skb(skb);
  90. skb = __hci_cmd_sync(hdev, 0xfc22, 1, &type, HCI_INIT_TIMEOUT);
  91. if (IS_ERR(skb)) {
  92. BT_ERR("%s: Retrieving Intel exception info failed (%ld)",
  93. hdev->name, PTR_ERR(skb));
  94. return;
  95. }
  96. if (skb->len != 13) {
  97. BT_ERR("%s: Exception info size mismatch", hdev->name);
  98. kfree_skb(skb);
  99. return;
  100. }
  101. BT_ERR("%s: Exception info %s", hdev->name, (char *)(skb->data + 1));
  102. kfree_skb(skb);
  103. }
  104. EXPORT_SYMBOL_GPL(btintel_hw_error);
  105. void btintel_version_info(struct hci_dev *hdev, struct intel_version *ver)
  106. {
  107. const char *variant;
  108. switch (ver->fw_variant) {
  109. case 0x06:
  110. variant = "Bootloader";
  111. break;
  112. case 0x23:
  113. variant = "Firmware";
  114. break;
  115. default:
  116. return;
  117. }
  118. BT_INFO("%s: %s revision %u.%u build %u week %u %u", hdev->name,
  119. variant, ver->fw_revision >> 4, ver->fw_revision & 0x0f,
  120. ver->fw_build_num, ver->fw_build_ww, 2000 + ver->fw_build_yy);
  121. }
  122. EXPORT_SYMBOL_GPL(btintel_version_info);
  123. int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type, u32 plen,
  124. const void *param)
  125. {
  126. while (plen > 0) {
  127. struct sk_buff *skb;
  128. u8 cmd_param[253], fragment_len = (plen > 252) ? 252 : plen;
  129. cmd_param[0] = fragment_type;
  130. memcpy(cmd_param + 1, param, fragment_len);
  131. skb = __hci_cmd_sync(hdev, 0xfc09, fragment_len + 1,
  132. cmd_param, HCI_INIT_TIMEOUT);
  133. if (IS_ERR(skb))
  134. return PTR_ERR(skb);
  135. kfree_skb(skb);
  136. plen -= fragment_len;
  137. param += fragment_len;
  138. }
  139. return 0;
  140. }
  141. EXPORT_SYMBOL_GPL(btintel_secure_send);
  142. int btintel_load_ddc_config(struct hci_dev *hdev, const char *ddc_name)
  143. {
  144. const struct firmware *fw;
  145. struct sk_buff *skb;
  146. const u8 *fw_ptr;
  147. int err;
  148. err = request_firmware_direct(&fw, ddc_name, &hdev->dev);
  149. if (err < 0) {
  150. bt_dev_err(hdev, "Failed to load Intel DDC file %s (%d)",
  151. ddc_name, err);
  152. return err;
  153. }
  154. bt_dev_info(hdev, "Found Intel DDC parameters: %s", ddc_name);
  155. fw_ptr = fw->data;
  156. /* DDC file contains one or more DDC structure which has
  157. * Length (1 byte), DDC ID (2 bytes), and DDC value (Length - 2).
  158. */
  159. while (fw->size > fw_ptr - fw->data) {
  160. u8 cmd_plen = fw_ptr[0] + sizeof(u8);
  161. skb = __hci_cmd_sync(hdev, 0xfc8b, cmd_plen, fw_ptr,
  162. HCI_INIT_TIMEOUT);
  163. if (IS_ERR(skb)) {
  164. bt_dev_err(hdev, "Failed to send Intel_Write_DDC (%ld)",
  165. PTR_ERR(skb));
  166. release_firmware(fw);
  167. return PTR_ERR(skb);
  168. }
  169. fw_ptr += cmd_plen;
  170. kfree_skb(skb);
  171. }
  172. release_firmware(fw);
  173. bt_dev_info(hdev, "Applying Intel DDC parameters completed");
  174. return 0;
  175. }
  176. EXPORT_SYMBOL_GPL(btintel_load_ddc_config);
  177. /* ------- REGMAP IBT SUPPORT ------- */
  178. #define IBT_REG_MODE_8BIT 0x00
  179. #define IBT_REG_MODE_16BIT 0x01
  180. #define IBT_REG_MODE_32BIT 0x02
  181. struct regmap_ibt_context {
  182. struct hci_dev *hdev;
  183. __u16 op_write;
  184. __u16 op_read;
  185. };
  186. struct ibt_cp_reg_access {
  187. __le32 addr;
  188. __u8 mode;
  189. __u8 len;
  190. __u8 data[0];
  191. } __packed;
  192. struct ibt_rp_reg_access {
  193. __u8 status;
  194. __le32 addr;
  195. __u8 data[0];
  196. } __packed;
  197. static int regmap_ibt_read(void *context, const void *addr, size_t reg_size,
  198. void *val, size_t val_size)
  199. {
  200. struct regmap_ibt_context *ctx = context;
  201. struct ibt_cp_reg_access cp;
  202. struct ibt_rp_reg_access *rp;
  203. struct sk_buff *skb;
  204. int err = 0;
  205. if (reg_size != sizeof(__le32))
  206. return -EINVAL;
  207. switch (val_size) {
  208. case 1:
  209. cp.mode = IBT_REG_MODE_8BIT;
  210. break;
  211. case 2:
  212. cp.mode = IBT_REG_MODE_16BIT;
  213. break;
  214. case 4:
  215. cp.mode = IBT_REG_MODE_32BIT;
  216. break;
  217. default:
  218. return -EINVAL;
  219. }
  220. /* regmap provides a little-endian formatted addr */
  221. cp.addr = *(__le32 *)addr;
  222. cp.len = val_size;
  223. bt_dev_dbg(ctx->hdev, "Register (0x%x) read", le32_to_cpu(cp.addr));
  224. skb = hci_cmd_sync(ctx->hdev, ctx->op_read, sizeof(cp), &cp,
  225. HCI_CMD_TIMEOUT);
  226. if (IS_ERR(skb)) {
  227. err = PTR_ERR(skb);
  228. bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error (%d)",
  229. le32_to_cpu(cp.addr), err);
  230. return err;
  231. }
  232. if (skb->len != sizeof(*rp) + val_size) {
  233. bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad len",
  234. le32_to_cpu(cp.addr));
  235. err = -EINVAL;
  236. goto done;
  237. }
  238. rp = (struct ibt_rp_reg_access *)skb->data;
  239. if (rp->addr != cp.addr) {
  240. bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad addr",
  241. le32_to_cpu(rp->addr));
  242. err = -EINVAL;
  243. goto done;
  244. }
  245. memcpy(val, rp->data, val_size);
  246. done:
  247. kfree_skb(skb);
  248. return err;
  249. }
  250. static int regmap_ibt_gather_write(void *context,
  251. const void *addr, size_t reg_size,
  252. const void *val, size_t val_size)
  253. {
  254. struct regmap_ibt_context *ctx = context;
  255. struct ibt_cp_reg_access *cp;
  256. struct sk_buff *skb;
  257. int plen = sizeof(*cp) + val_size;
  258. u8 mode;
  259. int err = 0;
  260. if (reg_size != sizeof(__le32))
  261. return -EINVAL;
  262. switch (val_size) {
  263. case 1:
  264. mode = IBT_REG_MODE_8BIT;
  265. break;
  266. case 2:
  267. mode = IBT_REG_MODE_16BIT;
  268. break;
  269. case 4:
  270. mode = IBT_REG_MODE_32BIT;
  271. break;
  272. default:
  273. return -EINVAL;
  274. }
  275. cp = kmalloc(plen, GFP_KERNEL);
  276. if (!cp)
  277. return -ENOMEM;
  278. /* regmap provides a little-endian formatted addr/value */
  279. cp->addr = *(__le32 *)addr;
  280. cp->mode = mode;
  281. cp->len = val_size;
  282. memcpy(&cp->data, val, val_size);
  283. bt_dev_dbg(ctx->hdev, "Register (0x%x) write", le32_to_cpu(cp->addr));
  284. skb = hci_cmd_sync(ctx->hdev, ctx->op_write, plen, cp, HCI_CMD_TIMEOUT);
  285. if (IS_ERR(skb)) {
  286. err = PTR_ERR(skb);
  287. bt_dev_err(ctx->hdev, "regmap: Register (0x%x) write error (%d)",
  288. le32_to_cpu(cp->addr), err);
  289. goto done;
  290. }
  291. kfree_skb(skb);
  292. done:
  293. kfree(cp);
  294. return err;
  295. }
  296. static int regmap_ibt_write(void *context, const void *data, size_t count)
  297. {
  298. /* data contains register+value, since we only support 32bit addr,
  299. * minimum data size is 4 bytes.
  300. */
  301. if (WARN_ONCE(count < 4, "Invalid register access"))
  302. return -EINVAL;
  303. return regmap_ibt_gather_write(context, data, 4, data + 4, count - 4);
  304. }
  305. static void regmap_ibt_free_context(void *context)
  306. {
  307. kfree(context);
  308. }
  309. static struct regmap_bus regmap_ibt = {
  310. .read = regmap_ibt_read,
  311. .write = regmap_ibt_write,
  312. .gather_write = regmap_ibt_gather_write,
  313. .free_context = regmap_ibt_free_context,
  314. .reg_format_endian_default = REGMAP_ENDIAN_LITTLE,
  315. .val_format_endian_default = REGMAP_ENDIAN_LITTLE,
  316. };
  317. /* Config is the same for all register regions */
  318. static const struct regmap_config regmap_ibt_cfg = {
  319. .name = "btintel_regmap",
  320. .reg_bits = 32,
  321. .val_bits = 32,
  322. };
  323. struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,
  324. u16 opcode_write)
  325. {
  326. struct regmap_ibt_context *ctx;
  327. bt_dev_info(hdev, "regmap: Init R%x-W%x region", opcode_read,
  328. opcode_write);
  329. ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  330. if (!ctx)
  331. return ERR_PTR(-ENOMEM);
  332. ctx->op_read = opcode_read;
  333. ctx->op_write = opcode_write;
  334. ctx->hdev = hdev;
  335. return regmap_init(&hdev->dev, &regmap_ibt, ctx, &regmap_ibt_cfg);
  336. }
  337. EXPORT_SYMBOL_GPL(btintel_regmap_init);
  338. MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
  339. MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION);
  340. MODULE_VERSION(VERSION);
  341. MODULE_LICENSE("GPL");
  342. MODULE_FIRMWARE("intel/ibt-11-5.sfi");
  343. MODULE_FIRMWARE("intel/ibt-11-5.ddc");