blob: dd29d687cd380d6d9da52a3eabf54fe13f79ecc5 [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001// SPDX-License-Identifier: GPL-2.0-or-later
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
3 *
4 * Bluetooth support for Broadcom devices
5 *
6 * Copyright (C) 2015 Intel Corporation
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00007 */
8
9#include <linux/module.h>
10#include <linux/firmware.h>
11#include <asm/unaligned.h>
12
13#include <net/bluetooth/bluetooth.h>
14#include <net/bluetooth/hci_core.h>
15
16#include "btbcm.h"
17
18#define VERSION "0.1"
19
20#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
David Brazdil0f672f62019-12-10 10:32:29 +000021#define BDADDR_BCM20702A1 (&(bdaddr_t) {{0x00, 0x00, 0xa0, 0x02, 0x70, 0x20}})
22#define BDADDR_BCM2076B1 (&(bdaddr_t) {{0x79, 0x56, 0x00, 0xa0, 0x76, 0x20}})
23#define BDADDR_BCM43430A0 (&(bdaddr_t) {{0xac, 0x1f, 0x12, 0xa0, 0x43, 0x43}})
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000024#define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
25#define BDADDR_BCM4330B1 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb1, 0x30, 0x43}})
David Brazdil0f672f62019-12-10 10:32:29 +000026#define BDADDR_BCM4345C5 (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0xc5, 0x45, 0x43}})
27#define BDADDR_BCM43341B (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0x1b, 0x34, 0x43}})
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000028
29int btbcm_check_bdaddr(struct hci_dev *hdev)
30{
31 struct hci_rp_read_bd_addr *bda;
32 struct sk_buff *skb;
33
34 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
35 HCI_INIT_TIMEOUT);
36 if (IS_ERR(skb)) {
37 int err = PTR_ERR(skb);
38 bt_dev_err(hdev, "BCM: Reading device address failed (%d)", err);
39 return err;
40 }
41
42 if (skb->len != sizeof(*bda)) {
43 bt_dev_err(hdev, "BCM: Device address length mismatch");
44 kfree_skb(skb);
45 return -EIO;
46 }
47
48 bda = (struct hci_rp_read_bd_addr *)skb->data;
49
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 *
David Brazdil0f672f62019-12-10 10:32:29 +000057 * The address 20:70:02:A0:00:00 indicates a BCM20702A1 controller
58 * with no configured address.
59 *
60 * The address 20:76:A0:00:56:79 indicates a BCM2076B1 controller
61 * with no configured address.
62 *
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000063 * The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller
64 * with waiting for configuration state.
65 *
66 * The address 43:30:B1:00:00:00 indicates a BCM4330B1 controller
67 * with waiting for configuration state.
David Brazdil0f672f62019-12-10 10:32:29 +000068 *
69 * The address 43:43:A0:12:1F:AC indicates a BCM43430A0 controller
70 * with no configured address.
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000071 */
72 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
David Brazdil0f672f62019-12-10 10:32:29 +000073 !bacmp(&bda->bdaddr, BDADDR_BCM20702A1) ||
74 !bacmp(&bda->bdaddr, BDADDR_BCM2076B1) ||
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000075 !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) ||
David Brazdil0f672f62019-12-10 10:32:29 +000076 !bacmp(&bda->bdaddr, BDADDR_BCM4330B1) ||
77 !bacmp(&bda->bdaddr, BDADDR_BCM4345C5) ||
78 !bacmp(&bda->bdaddr, BDADDR_BCM43430A0) ||
79 !bacmp(&bda->bdaddr, BDADDR_BCM43341B)) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000080 bt_dev_info(hdev, "BCM: Using default device address (%pMR)",
81 &bda->bdaddr);
82 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
83 }
84
85 kfree_skb(skb);
86
87 return 0;
88}
89EXPORT_SYMBOL_GPL(btbcm_check_bdaddr);
90
91int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
92{
93 struct sk_buff *skb;
94 int err;
95
96 skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT);
97 if (IS_ERR(skb)) {
98 err = PTR_ERR(skb);
99 bt_dev_err(hdev, "BCM: Change address command failed (%d)", err);
100 return err;
101 }
102 kfree_skb(skb);
103
104 return 0;
105}
106EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
107
108int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
109{
110 const struct hci_command_hdr *cmd;
111 const u8 *fw_ptr;
112 size_t fw_size;
113 struct sk_buff *skb;
114 u16 opcode;
115 int err = 0;
116
117 /* Start Download */
118 skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT);
119 if (IS_ERR(skb)) {
120 err = PTR_ERR(skb);
121 bt_dev_err(hdev, "BCM: Download Minidrv command failed (%d)",
122 err);
123 goto done;
124 }
125 kfree_skb(skb);
126
127 /* 50 msec delay after Download Minidrv completes */
128 msleep(50);
129
130 fw_ptr = fw->data;
131 fw_size = fw->size;
132
133 while (fw_size >= sizeof(*cmd)) {
134 const u8 *cmd_param;
135
136 cmd = (struct hci_command_hdr *)fw_ptr;
137 fw_ptr += sizeof(*cmd);
138 fw_size -= sizeof(*cmd);
139
140 if (fw_size < cmd->plen) {
141 bt_dev_err(hdev, "BCM: Patch is corrupted");
142 err = -EINVAL;
143 goto done;
144 }
145
146 cmd_param = fw_ptr;
147 fw_ptr += cmd->plen;
148 fw_size -= cmd->plen;
149
150 opcode = le16_to_cpu(cmd->opcode);
151
152 skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param,
153 HCI_INIT_TIMEOUT);
154 if (IS_ERR(skb)) {
155 err = PTR_ERR(skb);
156 bt_dev_err(hdev, "BCM: Patch command %04x failed (%d)",
157 opcode, err);
158 goto done;
159 }
160 kfree_skb(skb);
161 }
162
163 /* 250 msec delay after Launch Ram completes */
164 msleep(250);
165
166done:
167 return err;
168}
169EXPORT_SYMBOL(btbcm_patchram);
170
171static int btbcm_reset(struct hci_dev *hdev)
172{
173 struct sk_buff *skb;
174
175 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
176 if (IS_ERR(skb)) {
177 int err = PTR_ERR(skb);
178 bt_dev_err(hdev, "BCM: Reset failed (%d)", err);
179 return err;
180 }
181 kfree_skb(skb);
182
183 /* 100 msec delay for module to complete reset process */
184 msleep(100);
185
186 return 0;
187}
188
189static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev)
190{
191 struct sk_buff *skb;
192
193 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL,
194 HCI_INIT_TIMEOUT);
195 if (IS_ERR(skb)) {
196 bt_dev_err(hdev, "BCM: Reading local name failed (%ld)",
197 PTR_ERR(skb));
198 return skb;
199 }
200
201 if (skb->len != sizeof(struct hci_rp_read_local_name)) {
202 bt_dev_err(hdev, "BCM: Local name length mismatch");
203 kfree_skb(skb);
204 return ERR_PTR(-EIO);
205 }
206
207 return skb;
208}
209
210static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev)
211{
212 struct sk_buff *skb;
213
214 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
215 HCI_INIT_TIMEOUT);
216 if (IS_ERR(skb)) {
217 bt_dev_err(hdev, "BCM: Reading local version info failed (%ld)",
218 PTR_ERR(skb));
219 return skb;
220 }
221
222 if (skb->len != sizeof(struct hci_rp_read_local_version)) {
223 bt_dev_err(hdev, "BCM: Local version length mismatch");
224 kfree_skb(skb);
225 return ERR_PTR(-EIO);
226 }
227
228 return skb;
229}
230
231static struct sk_buff *btbcm_read_verbose_config(struct hci_dev *hdev)
232{
233 struct sk_buff *skb;
234
235 skb = __hci_cmd_sync(hdev, 0xfc79, 0, NULL, HCI_INIT_TIMEOUT);
236 if (IS_ERR(skb)) {
237 bt_dev_err(hdev, "BCM: Read verbose config info failed (%ld)",
238 PTR_ERR(skb));
239 return skb;
240 }
241
242 if (skb->len != 7) {
243 bt_dev_err(hdev, "BCM: Verbose config length mismatch");
244 kfree_skb(skb);
245 return ERR_PTR(-EIO);
246 }
247
248 return skb;
249}
250
251static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev)
252{
253 struct sk_buff *skb;
254
255 skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT);
256 if (IS_ERR(skb)) {
257 bt_dev_err(hdev, "BCM: Read controller features failed (%ld)",
258 PTR_ERR(skb));
259 return skb;
260 }
261
262 if (skb->len != 9) {
263 bt_dev_err(hdev, "BCM: Controller features length mismatch");
264 kfree_skb(skb);
265 return ERR_PTR(-EIO);
266 }
267
268 return skb;
269}
270
271static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev)
272{
273 struct sk_buff *skb;
274
275 skb = __hci_cmd_sync(hdev, 0xfc5a, 0, NULL, HCI_INIT_TIMEOUT);
276 if (IS_ERR(skb)) {
277 bt_dev_err(hdev, "BCM: Read USB product info failed (%ld)",
278 PTR_ERR(skb));
279 return skb;
280 }
281
282 if (skb->len != 5) {
283 bt_dev_err(hdev, "BCM: USB product length mismatch");
284 kfree_skb(skb);
285 return ERR_PTR(-EIO);
286 }
287
288 return skb;
289}
290
291static int btbcm_read_info(struct hci_dev *hdev)
292{
293 struct sk_buff *skb;
294
295 /* Read Verbose Config Version Info */
296 skb = btbcm_read_verbose_config(hdev);
297 if (IS_ERR(skb))
298 return PTR_ERR(skb);
299
300 bt_dev_info(hdev, "BCM: chip id %u", skb->data[1]);
301 kfree_skb(skb);
302
303 /* Read Controller Features */
304 skb = btbcm_read_controller_features(hdev);
305 if (IS_ERR(skb))
306 return PTR_ERR(skb);
307
308 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
309 kfree_skb(skb);
310
311 /* Read Local Name */
312 skb = btbcm_read_local_name(hdev);
313 if (IS_ERR(skb))
314 return PTR_ERR(skb);
315
316 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
317 kfree_skb(skb);
318
319 return 0;
320}
321
322struct bcm_subver_table {
323 u16 subver;
324 const char *name;
325};
326
327static const struct bcm_subver_table bcm_uart_subver_table[] = {
328 { 0x4103, "BCM4330B1" }, /* 002.001.003 */
329 { 0x410e, "BCM43341B0" }, /* 002.001.014 */
David Brazdil0f672f62019-12-10 10:32:29 +0000330 { 0x4204, "BCM2076B1" }, /* 002.002.004 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000331 { 0x4406, "BCM4324B3" }, /* 002.004.006 */
Olivier Deprez0e641232021-09-23 10:07:05 +0200332 { 0x4606, "BCM4324B5" }, /* 002.006.006 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000333 { 0x6109, "BCM4335C0" }, /* 003.001.009 */
334 { 0x610c, "BCM4354" }, /* 003.001.012 */
335 { 0x2122, "BCM4343A0" }, /* 001.001.034 */
336 { 0x2209, "BCM43430A1" }, /* 001.002.009 */
337 { 0x6119, "BCM4345C0" }, /* 003.001.025 */
David Brazdil0f672f62019-12-10 10:32:29 +0000338 { 0x6606, "BCM4345C5" }, /* 003.006.006 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000339 { 0x230f, "BCM4356A2" }, /* 001.003.015 */
David Brazdil0f672f62019-12-10 10:32:29 +0000340 { 0x220e, "BCM20702A1" }, /* 001.002.014 */
341 { 0x4217, "BCM4329B1" }, /* 002.002.023 */
342 { 0x6106, "BCM4359C0" }, /* 003.001.006 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000343 { }
344};
345
346static const struct bcm_subver_table bcm_usb_subver_table[] = {
Olivier Deprez0e641232021-09-23 10:07:05 +0200347 { 0x2105, "BCM20703A1" }, /* 001.001.005 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000348 { 0x210b, "BCM43142A0" }, /* 001.001.011 */
349 { 0x2112, "BCM4314A0" }, /* 001.001.018 */
350 { 0x2118, "BCM20702A0" }, /* 001.001.024 */
351 { 0x2126, "BCM4335A0" }, /* 001.001.038 */
352 { 0x220e, "BCM20702A1" }, /* 001.002.014 */
353 { 0x230f, "BCM4354A2" }, /* 001.003.015 */
354 { 0x4106, "BCM4335B0" }, /* 002.001.006 */
355 { 0x410e, "BCM20702B0" }, /* 002.001.014 */
356 { 0x6109, "BCM4335C0" }, /* 003.001.009 */
357 { 0x610c, "BCM4354" }, /* 003.001.012 */
358 { }
359};
360
361int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
362 bool reinit)
363{
364 u16 subver, rev, pid, vid;
365 const char *hw_name = "BCM";
366 struct sk_buff *skb;
367 struct hci_rp_read_local_version *ver;
368 const struct bcm_subver_table *bcm_subver_table;
369 int i, err;
370
371 /* Reset */
372 err = btbcm_reset(hdev);
373 if (err)
374 return err;
375
376 /* Read Local Version Info */
377 skb = btbcm_read_local_version(hdev);
378 if (IS_ERR(skb))
379 return PTR_ERR(skb);
380
381 ver = (struct hci_rp_read_local_version *)skb->data;
382 rev = le16_to_cpu(ver->hci_rev);
383 subver = le16_to_cpu(ver->lmp_subver);
384 kfree_skb(skb);
385
386 /* Read controller information */
387 if (!reinit) {
388 err = btbcm_read_info(hdev);
389 if (err)
390 return err;
391 }
392
393 /* Upper nibble of rev should be between 0 and 3? */
394 if (((rev & 0xf000) >> 12) > 3)
395 return 0;
396
397 bcm_subver_table = (hdev->bus == HCI_USB) ? bcm_usb_subver_table :
398 bcm_uart_subver_table;
399
400 for (i = 0; bcm_subver_table[i].name; i++) {
401 if (subver == bcm_subver_table[i].subver) {
402 hw_name = bcm_subver_table[i].name;
403 break;
404 }
405 }
406
407 if (hdev->bus == HCI_USB) {
408 /* Read USB Product Info */
409 skb = btbcm_read_usb_product(hdev);
410 if (IS_ERR(skb))
411 return PTR_ERR(skb);
412
413 vid = get_unaligned_le16(skb->data + 1);
414 pid = get_unaligned_le16(skb->data + 3);
415 kfree_skb(skb);
416
417 snprintf(fw_name, len, "brcm/%s-%4.4x-%4.4x.hcd",
418 hw_name, vid, pid);
419 } else {
420 snprintf(fw_name, len, "brcm/%s.hcd", hw_name);
421 }
422
423 bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u",
424 hw_name, (subver & 0xe000) >> 13,
425 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
426
427 return 0;
428}
429EXPORT_SYMBOL_GPL(btbcm_initialize);
430
431int btbcm_finalize(struct hci_dev *hdev)
432{
433 char fw_name[64];
434 int err;
435
436 /* Re-initialize */
437 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
438 if (err)
439 return err;
440
441 btbcm_check_bdaddr(hdev);
442
443 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
444
Olivier Deprez0e641232021-09-23 10:07:05 +0200445 /* Some devices ship with the controller default address.
446 * Allow the bootloader to set a valid address through the
447 * device tree.
448 */
449 set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
450
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000451 return 0;
452}
453EXPORT_SYMBOL_GPL(btbcm_finalize);
454
455int btbcm_setup_patchram(struct hci_dev *hdev)
456{
457 char fw_name[64];
458 const struct firmware *fw;
459 struct sk_buff *skb;
460 int err;
461
462 /* Initialize */
463 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), false);
464 if (err)
465 return err;
466
467 err = request_firmware(&fw, fw_name, &hdev->dev);
468 if (err < 0) {
469 bt_dev_info(hdev, "BCM: Patch %s not found", fw_name);
470 goto done;
471 }
472
473 btbcm_patchram(hdev, fw);
474
475 release_firmware(fw);
476
477 /* Re-initialize */
478 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
479 if (err)
480 return err;
481
482 /* Read Local Name */
483 skb = btbcm_read_local_name(hdev);
484 if (IS_ERR(skb))
485 return PTR_ERR(skb);
486
487 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
488 kfree_skb(skb);
489
490done:
491 btbcm_check_bdaddr(hdev);
492
493 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
494
495 return 0;
496}
497EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
498
499int btbcm_setup_apple(struct hci_dev *hdev)
500{
501 struct sk_buff *skb;
502 int err;
503
504 /* Reset */
505 err = btbcm_reset(hdev);
506 if (err)
507 return err;
508
509 /* Read Verbose Config Version Info */
510 skb = btbcm_read_verbose_config(hdev);
511 if (!IS_ERR(skb)) {
512 bt_dev_info(hdev, "BCM: chip id %u build %4.4u",
513 skb->data[1], get_unaligned_le16(skb->data + 5));
514 kfree_skb(skb);
515 }
516
517 /* Read USB Product Info */
518 skb = btbcm_read_usb_product(hdev);
519 if (!IS_ERR(skb)) {
520 bt_dev_info(hdev, "BCM: product %4.4x:%4.4x",
521 get_unaligned_le16(skb->data + 1),
522 get_unaligned_le16(skb->data + 3));
523 kfree_skb(skb);
524 }
525
526 /* Read Controller Features */
527 skb = btbcm_read_controller_features(hdev);
528 if (!IS_ERR(skb)) {
529 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
530 kfree_skb(skb);
531 }
532
533 /* Read Local Name */
534 skb = btbcm_read_local_name(hdev);
535 if (!IS_ERR(skb)) {
536 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
537 kfree_skb(skb);
538 }
539
540 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
541
542 return 0;
543}
544EXPORT_SYMBOL_GPL(btbcm_setup_apple);
545
546MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
547MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION);
548MODULE_VERSION(VERSION);
549MODULE_LICENSE("GPL");