Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / drivers / bluetooth / btbcm.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *
4  *  Bluetooth support for Broadcom devices
5  *
6  *  Copyright (C) 2015  Intel Corporation
7  */
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}})
21 #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}})
24 #define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
25 #define BDADDR_BCM4330B1 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb1, 0x30, 0x43}})
26 #define BDADDR_BCM4345C5 (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0xc5, 0x45, 0x43}})
27 #define BDADDR_BCM43341B (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0x1b, 0x34, 0x43}})
28
29 int 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          *
57          * 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          *
63          * 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.
68          *
69          * The address 43:43:A0:12:1F:AC indicates a BCM43430A0 controller
70          * with no configured address.
71          */
72         if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
73             !bacmp(&bda->bdaddr, BDADDR_BCM20702A1) ||
74             !bacmp(&bda->bdaddr, BDADDR_BCM2076B1) ||
75             !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) ||
76             !bacmp(&bda->bdaddr, BDADDR_BCM4330B1) ||
77             !bacmp(&bda->bdaddr, BDADDR_BCM4345C5) ||
78             !bacmp(&bda->bdaddr, BDADDR_BCM43430A0) ||
79             !bacmp(&bda->bdaddr, BDADDR_BCM43341B)) {
80                 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 }
89 EXPORT_SYMBOL_GPL(btbcm_check_bdaddr);
90
91 int 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 }
106 EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
107
108 int 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
166 done:
167         return err;
168 }
169 EXPORT_SYMBOL(btbcm_patchram);
170
171 static 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
189 static 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
210 static 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
231 static 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
251 static 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
271 static 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
291 static 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
322 struct bcm_subver_table {
323         u16 subver;
324         const char *name;
325 };
326
327 static const struct bcm_subver_table bcm_uart_subver_table[] = {
328         { 0x4103, "BCM4330B1"   },      /* 002.001.003 */
329         { 0x410e, "BCM43341B0"  },      /* 002.001.014 */
330         { 0x4204, "BCM2076B1"   },      /* 002.002.004 */
331         { 0x4406, "BCM4324B3"   },      /* 002.004.006 */
332         { 0x4606, "BCM4324B5"   },      /* 002.006.006 */
333         { 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 */
338         { 0x6606, "BCM4345C5"   },      /* 003.006.006 */
339         { 0x230f, "BCM4356A2"   },      /* 001.003.015 */
340         { 0x220e, "BCM20702A1"  },      /* 001.002.014 */
341         { 0x4217, "BCM4329B1"   },      /* 002.002.023 */
342         { 0x6106, "BCM4359C0"   },      /* 003.001.006 */
343         { }
344 };
345
346 static const struct bcm_subver_table bcm_usb_subver_table[] = {
347         { 0x2105, "BCM20703A1"  },      /* 001.001.005 */
348         { 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
361 int 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, "/*(DEBLOBBED)*/",
418                          hw_name, vid, pid);
419         } else {
420                 snprintf(fw_name, len, "/*(DEBLOBBED)*/", 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 }
429 EXPORT_SYMBOL_GPL(btbcm_initialize);
430
431 int 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
445         /* 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
451         return 0;
452 }
453 EXPORT_SYMBOL_GPL(btbcm_finalize);
454
455 int 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 = reject_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
490 done:
491         btbcm_check_bdaddr(hdev);
492
493         set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
494
495         return 0;
496 }
497 EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
498
499 int 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 }
544 EXPORT_SYMBOL_GPL(btbcm_setup_apple);
545
546 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
547 MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION);
548 MODULE_VERSION(VERSION);
549 MODULE_LICENSE("GPL");