btbcm.c 14 KB

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