btbcm.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. /*
  2. *
  3. * Bluetooth support for Broadcom 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 <asm/unaligned.h>
  26. #include <net/bluetooth/bluetooth.h>
  27. #include <net/bluetooth/hci_core.h>
  28. #include "btbcm.h"
  29. #define VERSION "0.1"
  30. #define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
  31. #define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
  32. #define BDADDR_BCM4330B1 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb1, 0x30, 0x43}})
  33. int btbcm_check_bdaddr(struct hci_dev *hdev)
  34. {
  35. struct hci_rp_read_bd_addr *bda;
  36. struct sk_buff *skb;
  37. skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
  38. HCI_INIT_TIMEOUT);
  39. if (IS_ERR(skb)) {
  40. int err = PTR_ERR(skb);
  41. bt_dev_err(hdev, "BCM: Reading device address failed (%d)", err);
  42. return err;
  43. }
  44. if (skb->len != sizeof(*bda)) {
  45. bt_dev_err(hdev, "BCM: Device address length mismatch");
  46. kfree_skb(skb);
  47. return -EIO;
  48. }
  49. bda = (struct hci_rp_read_bd_addr *)skb->data;
  50. /* Check if the address indicates a controller with either an
  51. * invalid or default address. In both cases the device needs
  52. * to be marked as not having a valid address.
  53. *
  54. * The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
  55. * with no configured address.
  56. *
  57. * The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller
  58. * with waiting for configuration state.
  59. *
  60. * The address 43:30:B1:00:00:00 indicates a BCM4330B1 controller
  61. * with waiting for configuration state.
  62. */
  63. if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
  64. !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) ||
  65. !bacmp(&bda->bdaddr, BDADDR_BCM4330B1)) {
  66. bt_dev_info(hdev, "BCM: Using default device address (%pMR)",
  67. &bda->bdaddr);
  68. set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
  69. }
  70. kfree_skb(skb);
  71. return 0;
  72. }
  73. EXPORT_SYMBOL_GPL(btbcm_check_bdaddr);
  74. int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
  75. {
  76. struct sk_buff *skb;
  77. int err;
  78. skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT);
  79. if (IS_ERR(skb)) {
  80. err = PTR_ERR(skb);
  81. bt_dev_err(hdev, "BCM: Change address command failed (%d)", err);
  82. return err;
  83. }
  84. kfree_skb(skb);
  85. return 0;
  86. }
  87. EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
  88. int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
  89. {
  90. const struct hci_command_hdr *cmd;
  91. const u8 *fw_ptr;
  92. size_t fw_size;
  93. struct sk_buff *skb;
  94. u16 opcode;
  95. int err = 0;
  96. /* Start Download */
  97. skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT);
  98. if (IS_ERR(skb)) {
  99. err = PTR_ERR(skb);
  100. bt_dev_err(hdev, "BCM: Download Minidrv command failed (%d)",
  101. err);
  102. goto done;
  103. }
  104. kfree_skb(skb);
  105. /* 50 msec delay after Download Minidrv completes */
  106. msleep(50);
  107. fw_ptr = fw->data;
  108. fw_size = fw->size;
  109. while (fw_size >= sizeof(*cmd)) {
  110. const u8 *cmd_param;
  111. cmd = (struct hci_command_hdr *)fw_ptr;
  112. fw_ptr += sizeof(*cmd);
  113. fw_size -= sizeof(*cmd);
  114. if (fw_size < cmd->plen) {
  115. bt_dev_err(hdev, "BCM: Patch is corrupted");
  116. err = -EINVAL;
  117. goto done;
  118. }
  119. cmd_param = fw_ptr;
  120. fw_ptr += cmd->plen;
  121. fw_size -= cmd->plen;
  122. opcode = le16_to_cpu(cmd->opcode);
  123. skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param,
  124. HCI_INIT_TIMEOUT);
  125. if (IS_ERR(skb)) {
  126. err = PTR_ERR(skb);
  127. bt_dev_err(hdev, "BCM: Patch command %04x failed (%d)",
  128. opcode, err);
  129. goto done;
  130. }
  131. kfree_skb(skb);
  132. }
  133. /* 250 msec delay after Launch Ram completes */
  134. msleep(250);
  135. done:
  136. return err;
  137. }
  138. EXPORT_SYMBOL(btbcm_patchram);
  139. static int btbcm_reset(struct hci_dev *hdev)
  140. {
  141. struct sk_buff *skb;
  142. skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
  143. if (IS_ERR(skb)) {
  144. int err = PTR_ERR(skb);
  145. bt_dev_err(hdev, "BCM: Reset failed (%d)", err);
  146. return err;
  147. }
  148. kfree_skb(skb);
  149. /* 100 msec delay for module to complete reset process */
  150. msleep(100);
  151. return 0;
  152. }
  153. static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev)
  154. {
  155. struct sk_buff *skb;
  156. skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL,
  157. HCI_INIT_TIMEOUT);
  158. if (IS_ERR(skb)) {
  159. bt_dev_err(hdev, "BCM: Reading local name failed (%ld)",
  160. PTR_ERR(skb));
  161. return skb;
  162. }
  163. if (skb->len != sizeof(struct hci_rp_read_local_name)) {
  164. bt_dev_err(hdev, "BCM: Local name length mismatch");
  165. kfree_skb(skb);
  166. return ERR_PTR(-EIO);
  167. }
  168. return skb;
  169. }
  170. static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev)
  171. {
  172. struct sk_buff *skb;
  173. skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
  174. HCI_INIT_TIMEOUT);
  175. if (IS_ERR(skb)) {
  176. bt_dev_err(hdev, "BCM: Reading local version info failed (%ld)",
  177. PTR_ERR(skb));
  178. return skb;
  179. }
  180. if (skb->len != sizeof(struct hci_rp_read_local_version)) {
  181. bt_dev_err(hdev, "BCM: Local version length mismatch");
  182. kfree_skb(skb);
  183. return ERR_PTR(-EIO);
  184. }
  185. return skb;
  186. }
  187. static struct sk_buff *btbcm_read_verbose_config(struct hci_dev *hdev)
  188. {
  189. struct sk_buff *skb;
  190. skb = __hci_cmd_sync(hdev, 0xfc79, 0, NULL, HCI_INIT_TIMEOUT);
  191. if (IS_ERR(skb)) {
  192. bt_dev_err(hdev, "BCM: Read verbose config info failed (%ld)",
  193. PTR_ERR(skb));
  194. return skb;
  195. }
  196. if (skb->len != 7) {
  197. bt_dev_err(hdev, "BCM: Verbose config length mismatch");
  198. kfree_skb(skb);
  199. return ERR_PTR(-EIO);
  200. }
  201. return skb;
  202. }
  203. static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev)
  204. {
  205. struct sk_buff *skb;
  206. skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT);
  207. if (IS_ERR(skb)) {
  208. bt_dev_err(hdev, "BCM: Read controller features failed (%ld)",
  209. PTR_ERR(skb));
  210. return skb;
  211. }
  212. if (skb->len != 9) {
  213. bt_dev_err(hdev, "BCM: Controller features length mismatch");
  214. kfree_skb(skb);
  215. return ERR_PTR(-EIO);
  216. }
  217. return skb;
  218. }
  219. static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev)
  220. {
  221. struct sk_buff *skb;
  222. skb = __hci_cmd_sync(hdev, 0xfc5a, 0, NULL, HCI_INIT_TIMEOUT);
  223. if (IS_ERR(skb)) {
  224. bt_dev_err(hdev, "BCM: Read USB product info failed (%ld)",
  225. PTR_ERR(skb));
  226. return skb;
  227. }
  228. if (skb->len != 5) {
  229. bt_dev_err(hdev, "BCM: USB product length mismatch");
  230. kfree_skb(skb);
  231. return ERR_PTR(-EIO);
  232. }
  233. return skb;
  234. }
  235. static int btbcm_read_info(struct hci_dev *hdev)
  236. {
  237. struct sk_buff *skb;
  238. /* Read Verbose Config Version Info */
  239. skb = btbcm_read_verbose_config(hdev);
  240. if (IS_ERR(skb))
  241. return PTR_ERR(skb);
  242. bt_dev_info(hdev, "BCM: chip id %u", skb->data[1]);
  243. kfree_skb(skb);
  244. /* Read Controller Features */
  245. skb = btbcm_read_controller_features(hdev);
  246. if (IS_ERR(skb))
  247. return PTR_ERR(skb);
  248. bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
  249. kfree_skb(skb);
  250. /* Read Local Name */
  251. skb = btbcm_read_local_name(hdev);
  252. if (IS_ERR(skb))
  253. return PTR_ERR(skb);
  254. bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
  255. kfree_skb(skb);
  256. return 0;
  257. }
  258. struct bcm_subver_table {
  259. u16 subver;
  260. const char *name;
  261. };
  262. static const struct bcm_subver_table bcm_uart_subver_table[] = {
  263. { 0x4103, "BCM4330B1" }, /* 002.001.003 */
  264. { 0x410e, "BCM43341B0" }, /* 002.001.014 */
  265. { 0x4406, "BCM4324B3" }, /* 002.004.006 */
  266. { 0x4606, "BCM4324B5" }, /* 002.006.006 */
  267. { 0x6109, "BCM4335C0" }, /* 003.001.009 */
  268. { 0x610c, "BCM4354" }, /* 003.001.012 */
  269. { 0x2122, "BCM4343A0" }, /* 001.001.034 */
  270. { 0x2209, "BCM43430A1" }, /* 001.002.009 */
  271. { 0x6119, "BCM4345C0" }, /* 003.001.025 */
  272. { 0x230f, "BCM4356A2" }, /* 001.003.015 */
  273. { }
  274. };
  275. static const struct bcm_subver_table bcm_usb_subver_table[] = {
  276. { 0x2105, "BCM20703A1" }, /* 001.001.005 */
  277. { 0x210b, "BCM43142A0" }, /* 001.001.011 */
  278. { 0x2112, "BCM4314A0" }, /* 001.001.018 */
  279. { 0x2118, "BCM20702A0" }, /* 001.001.024 */
  280. { 0x2126, "BCM4335A0" }, /* 001.001.038 */
  281. { 0x220e, "BCM20702A1" }, /* 001.002.014 */
  282. { 0x230f, "BCM4354A2" }, /* 001.003.015 */
  283. { 0x4106, "BCM4335B0" }, /* 002.001.006 */
  284. { 0x410e, "BCM20702B0" }, /* 002.001.014 */
  285. { 0x6109, "BCM4335C0" }, /* 003.001.009 */
  286. { 0x610c, "BCM4354" }, /* 003.001.012 */
  287. { }
  288. };
  289. int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
  290. bool reinit)
  291. {
  292. u16 subver, rev, pid, vid;
  293. const char *hw_name = "BCM";
  294. struct sk_buff *skb;
  295. struct hci_rp_read_local_version *ver;
  296. const struct bcm_subver_table *bcm_subver_table;
  297. int i, err;
  298. /* Reset */
  299. err = btbcm_reset(hdev);
  300. if (err)
  301. return err;
  302. /* Read Local Version Info */
  303. skb = btbcm_read_local_version(hdev);
  304. if (IS_ERR(skb))
  305. return PTR_ERR(skb);
  306. ver = (struct hci_rp_read_local_version *)skb->data;
  307. rev = le16_to_cpu(ver->hci_rev);
  308. subver = le16_to_cpu(ver->lmp_subver);
  309. kfree_skb(skb);
  310. /* Read controller information */
  311. if (!reinit) {
  312. err = btbcm_read_info(hdev);
  313. if (err)
  314. return err;
  315. }
  316. /* Upper nibble of rev should be between 0 and 3? */
  317. if (((rev & 0xf000) >> 12) > 3)
  318. return 0;
  319. bcm_subver_table = (hdev->bus == HCI_USB) ? bcm_usb_subver_table :
  320. bcm_uart_subver_table;
  321. for (i = 0; bcm_subver_table[i].name; i++) {
  322. if (subver == bcm_subver_table[i].subver) {
  323. hw_name = bcm_subver_table[i].name;
  324. break;
  325. }
  326. }
  327. if (hdev->bus == HCI_USB) {
  328. /* Read USB Product Info */
  329. skb = btbcm_read_usb_product(hdev);
  330. if (IS_ERR(skb))
  331. return PTR_ERR(skb);
  332. vid = get_unaligned_le16(skb->data + 1);
  333. pid = get_unaligned_le16(skb->data + 3);
  334. kfree_skb(skb);
  335. snprintf(fw_name, len, "brcm/%s-%4.4x-%4.4x.hcd",
  336. hw_name, vid, pid);
  337. } else {
  338. snprintf(fw_name, len, "brcm/%s.hcd", hw_name);
  339. }
  340. bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u",
  341. hw_name, (subver & 0xe000) >> 13,
  342. (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
  343. return 0;
  344. }
  345. EXPORT_SYMBOL_GPL(btbcm_initialize);
  346. int btbcm_finalize(struct hci_dev *hdev)
  347. {
  348. char fw_name[64];
  349. int err;
  350. /* Re-initialize */
  351. err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
  352. if (err)
  353. return err;
  354. btbcm_check_bdaddr(hdev);
  355. set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
  356. return 0;
  357. }
  358. EXPORT_SYMBOL_GPL(btbcm_finalize);
  359. int btbcm_setup_patchram(struct hci_dev *hdev)
  360. {
  361. char fw_name[64];
  362. const struct firmware *fw;
  363. struct sk_buff *skb;
  364. int err;
  365. /* Initialize */
  366. err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), false);
  367. if (err)
  368. return err;
  369. err = request_firmware(&fw, fw_name, &hdev->dev);
  370. if (err < 0) {
  371. bt_dev_info(hdev, "BCM: Patch %s not found", fw_name);
  372. goto done;
  373. }
  374. btbcm_patchram(hdev, fw);
  375. release_firmware(fw);
  376. /* Re-initialize */
  377. err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
  378. if (err)
  379. return err;
  380. /* Read Local Name */
  381. skb = btbcm_read_local_name(hdev);
  382. if (IS_ERR(skb))
  383. return PTR_ERR(skb);
  384. bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
  385. kfree_skb(skb);
  386. done:
  387. btbcm_check_bdaddr(hdev);
  388. set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
  389. return 0;
  390. }
  391. EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
  392. int btbcm_setup_apple(struct hci_dev *hdev)
  393. {
  394. struct sk_buff *skb;
  395. int err;
  396. /* Reset */
  397. err = btbcm_reset(hdev);
  398. if (err)
  399. return err;
  400. /* Read Verbose Config Version Info */
  401. skb = btbcm_read_verbose_config(hdev);
  402. if (!IS_ERR(skb)) {
  403. bt_dev_info(hdev, "BCM: chip id %u build %4.4u",
  404. skb->data[1], get_unaligned_le16(skb->data + 5));
  405. kfree_skb(skb);
  406. }
  407. /* Read USB Product Info */
  408. skb = btbcm_read_usb_product(hdev);
  409. if (!IS_ERR(skb)) {
  410. bt_dev_info(hdev, "BCM: product %4.4x:%4.4x",
  411. get_unaligned_le16(skb->data + 1),
  412. get_unaligned_le16(skb->data + 3));
  413. kfree_skb(skb);
  414. }
  415. /* Read Controller Features */
  416. skb = btbcm_read_controller_features(hdev);
  417. if (!IS_ERR(skb)) {
  418. bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
  419. kfree_skb(skb);
  420. }
  421. /* Read Local Name */
  422. skb = btbcm_read_local_name(hdev);
  423. if (!IS_ERR(skb)) {
  424. bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
  425. kfree_skb(skb);
  426. }
  427. set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
  428. return 0;
  429. }
  430. EXPORT_SYMBOL_GPL(btbcm_setup_apple);
  431. MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
  432. MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION);
  433. MODULE_VERSION(VERSION);
  434. MODULE_LICENSE("GPL");