net: qlogic: Fix memory leak in ql_alloc_large_buffers
[linux-2.6-block.git] / drivers / bluetooth / btbcm.c
CommitLineData
1a59d1b8 1// SPDX-License-Identifier: GPL-2.0-or-later
4fba30f0
MH
2/*
3 *
4 * Bluetooth support for Broadcom devices
5 *
6 * Copyright (C) 2015 Intel Corporation
4fba30f0
MH
7 */
8
9#include <linux/module.h>
1c8ba6d0
MH
10#include <linux/firmware.h>
11#include <asm/unaligned.h>
4fba30f0
MH
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}})
92ffe0db 21#define BDADDR_BCM20702A1 (&(bdaddr_t) {{0x00, 0x00, 0xa0, 0x02, 0x70, 0x20}})
300926b1 22#define BDADDR_BCM2076B1 (&(bdaddr_t) {{0x79, 0x56, 0x00, 0xa0, 0x76, 0x20}})
0697607a 23#define BDADDR_BCM43430A0 (&(bdaddr_t) {{0xac, 0x1f, 0x12, 0xa0, 0x43, 0x43}})
a8f3b941 24#define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
4a546ec3 25#define BDADDR_BCM4330B1 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb1, 0x30, 0x43}})
52c8c7a7 26#define BDADDR_BCM4345C5 (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0xc5, 0x45, 0x43}})
50357261 27#define BDADDR_BCM43341B (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0x1b, 0x34, 0x43}})
4fba30f0
MH
28
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);
2064ee33 38 bt_dev_err(hdev, "BCM: Reading device address failed (%d)", err);
4fba30f0
MH
39 return err;
40 }
41
42 if (skb->len != sizeof(*bda)) {
2064ee33 43 bt_dev_err(hdev, "BCM: Device address length mismatch");
4fba30f0
MH
44 kfree_skb(skb);
45 return -EIO;
46 }
47
48 bda = (struct hci_rp_read_bd_addr *)skb->data;
4fba30f0 49
a8f3b941
FD
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
4fba30f0 55 * with no configured address.
a8f3b941 56 *
92ffe0db
MR
57 * The address 20:70:02:A0:00:00 indicates a BCM20702A1 controller
58 * with no configured address.
59 *
300926b1
SG
60 * The address 20:76:A0:00:56:79 indicates a BCM2076B1 controller
61 * with no configured address.
62 *
a8f3b941
FD
63 * The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller
64 * with waiting for configuration state.
4a546ec3
FD
65 *
66 * The address 43:30:B1:00:00:00 indicates a BCM4330B1 controller
67 * with waiting for configuration state.
0697607a
CYT
68 *
69 * The address 43:43:A0:12:1F:AC indicates a BCM43430A0 controller
70 * with no configured address.
4fba30f0 71 */
a8f3b941 72 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
92ffe0db 73 !bacmp(&bda->bdaddr, BDADDR_BCM20702A1) ||
300926b1 74 !bacmp(&bda->bdaddr, BDADDR_BCM2076B1) ||
4a546ec3 75 !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) ||
0697607a 76 !bacmp(&bda->bdaddr, BDADDR_BCM4330B1) ||
52c8c7a7 77 !bacmp(&bda->bdaddr, BDADDR_BCM4345C5) ||
50357261
FT
78 !bacmp(&bda->bdaddr, BDADDR_BCM43430A0) ||
79 !bacmp(&bda->bdaddr, BDADDR_BCM43341B)) {
2064ee33
MH
80 bt_dev_info(hdev, "BCM: Using default device address (%pMR)",
81 &bda->bdaddr);
4fba30f0
MH
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);
2064ee33 99 bt_dev_err(hdev, "BCM: Change address command failed (%d)", err);
4fba30f0
MH
100 return err;
101 }
102 kfree_skb(skb);
103
104 return 0;
105}
106EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
107
18aeb444 108int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
50862ee5
MH
109{
110 const struct hci_command_hdr *cmd;
50862ee5
MH
111 const u8 *fw_ptr;
112 size_t fw_size;
113 struct sk_buff *skb;
114 u16 opcode;
18aeb444 115 int err = 0;
50862ee5
MH
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);
2064ee33
MH
121 bt_dev_err(hdev, "BCM: Download Minidrv command failed (%d)",
122 err);
50862ee5
MH
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) {
2064ee33 141 bt_dev_err(hdev, "BCM: Patch is corrupted");
50862ee5
MH
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);
2064ee33
MH
156 bt_dev_err(hdev, "BCM: Patch command %04x failed (%d)",
157 opcode, err);
50862ee5
MH
158 goto done;
159 }
160 kfree_skb(skb);
161 }
162
163 /* 250 msec delay after Launch Ram completes */
164 msleep(250);
165
166done:
50862ee5
MH
167 return err;
168}
169EXPORT_SYMBOL(btbcm_patchram);
170
1c8ba6d0
MH
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);
2064ee33 178 bt_dev_err(hdev, "BCM: Reset failed (%d)", err);
1c8ba6d0
MH
179 return err;
180 }
181 kfree_skb(skb);
182
3af3a594
WJS
183 /* 100 msec delay for module to complete reset process */
184 msleep(100);
185
1c8ba6d0
MH
186 return 0;
187}
188
9bc63ca0
MH
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)) {
2064ee33
MH
196 bt_dev_err(hdev, "BCM: Reading local name failed (%ld)",
197 PTR_ERR(skb));
9bc63ca0
MH
198 return skb;
199 }
200
201 if (skb->len != sizeof(struct hci_rp_read_local_name)) {
2064ee33 202 bt_dev_err(hdev, "BCM: Local name length mismatch");
9bc63ca0
MH
203 kfree_skb(skb);
204 return ERR_PTR(-EIO);
205 }
206
207 return skb;
208}
209
1c8ba6d0
MH
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)) {
2064ee33
MH
217 bt_dev_err(hdev, "BCM: Reading local version info failed (%ld)",
218 PTR_ERR(skb));
1c8ba6d0
MH
219 return skb;
220 }
221
222 if (skb->len != sizeof(struct hci_rp_read_local_version)) {
2064ee33 223 bt_dev_err(hdev, "BCM: Local version length mismatch");
1c8ba6d0
MH
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)) {
2064ee33
MH
237 bt_dev_err(hdev, "BCM: Read verbose config info failed (%ld)",
238 PTR_ERR(skb));
1c8ba6d0
MH
239 return skb;
240 }
241
242 if (skb->len != 7) {
2064ee33 243 bt_dev_err(hdev, "BCM: Verbose config length mismatch");
1c8ba6d0
MH
244 kfree_skb(skb);
245 return ERR_PTR(-EIO);
246 }
247
248 return skb;
249}
250
4284ecbe
MH
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)) {
2064ee33
MH
257 bt_dev_err(hdev, "BCM: Read controller features failed (%ld)",
258 PTR_ERR(skb));
4284ecbe
MH
259 return skb;
260 }
261
262 if (skb->len != 9) {
2064ee33 263 bt_dev_err(hdev, "BCM: Controller features length mismatch");
4284ecbe
MH
264 kfree_skb(skb);
265 return ERR_PTR(-EIO);
266 }
267
268 return skb;
269}
270
1c8ba6d0
MH
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)) {
2064ee33
MH
277 bt_dev_err(hdev, "BCM: Read USB product info failed (%ld)",
278 PTR_ERR(skb));
1c8ba6d0
MH
279 return skb;
280 }
281
282 if (skb->len != 5) {
2064ee33 283 bt_dev_err(hdev, "BCM: USB product length mismatch");
1c8ba6d0
MH
284 kfree_skb(skb);
285 return ERR_PTR(-EIO);
286 }
287
288 return skb;
289}
290
e76dc1dd
MH
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
2064ee33 300 bt_dev_info(hdev, "BCM: chip id %u", skb->data[1]);
e76dc1dd
MH
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
2064ee33 308 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
e76dc1dd
MH
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
2064ee33 316 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
e76dc1dd
MH
317 kfree_skb(skb);
318
319 return 0;
320}
321
f7328381 322struct bcm_subver_table {
1c8ba6d0
MH
323 u16 subver;
324 const char *name;
f7328381
HG
325};
326
327static const struct bcm_subver_table bcm_uart_subver_table[] = {
4a546ec3 328 { 0x4103, "BCM4330B1" }, /* 002.001.003 */
9a0bb57d 329 { 0x410e, "BCM43341B0" }, /* 002.001.014 */
039287aa 330 { 0x4204, "BCM2076B1" }, /* 002.002.004 */
a8f3b941 331 { 0x4406, "BCM4324B3" }, /* 002.004.006 */
a357ea09 332 { 0x6109, "BCM4335C0" }, /* 003.001.009 */
40db5f0e 333 { 0x610c, "BCM4354" }, /* 003.001.012 */
d456f678 334 { 0x2122, "BCM4343A0" }, /* 001.001.034 */
feb16722 335 { 0x2209, "BCM43430A1" }, /* 001.002.009 */
18a39b9a 336 { 0x6119, "BCM4345C0" }, /* 003.001.025 */
52c8c7a7 337 { 0x6606, "BCM4345C5" }, /* 003.006.006 */
b133e0c4 338 { 0x230f, "BCM4356A2" }, /* 001.003.015 */
92ffe0db 339 { 0x220e, "BCM20702A1" }, /* 001.002.014 */
e3ca60d0 340 { 0x4217, "BCM4329B1" }, /* 002.002.023 */
f4d297ee 341 { 0x6106, "BCM4359C0" }, /* 003.001.006 */
9a0bb57d
MH
342 { }
343};
344
fec0de23
HG
345static const struct bcm_subver_table bcm_usb_subver_table[] = {
346 { 0x210b, "BCM43142A0" }, /* 001.001.011 */
347 { 0x2112, "BCM4314A0" }, /* 001.001.018 */
348 { 0x2118, "BCM20702A0" }, /* 001.001.024 */
349 { 0x2126, "BCM4335A0" }, /* 001.001.038 */
350 { 0x220e, "BCM20702A1" }, /* 001.002.014 */
351 { 0x230f, "BCM4354A2" }, /* 001.003.015 */
352 { 0x4106, "BCM4335B0" }, /* 002.001.006 */
353 { 0x410e, "BCM20702B0" }, /* 002.001.014 */
354 { 0x6109, "BCM4335C0" }, /* 003.001.009 */
355 { 0x610c, "BCM4354" }, /* 003.001.012 */
356 { }
357};
358
22ac1916
HG
359int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
360 bool reinit)
75e167e6 361{
fec0de23 362 u16 subver, rev, pid, vid;
2cc6d079 363 const char *hw_name = "BCM";
75e167e6
FD
364 struct sk_buff *skb;
365 struct hci_rp_read_local_version *ver;
fec0de23 366 const struct bcm_subver_table *bcm_subver_table;
75e167e6
FD
367 int i, err;
368
369 /* Reset */
370 err = btbcm_reset(hdev);
371 if (err)
372 return err;
373
374 /* Read Local Version Info */
375 skb = btbcm_read_local_version(hdev);
376 if (IS_ERR(skb))
377 return PTR_ERR(skb);
378
379 ver = (struct hci_rp_read_local_version *)skb->data;
380 rev = le16_to_cpu(ver->hci_rev);
381 subver = le16_to_cpu(ver->lmp_subver);
382 kfree_skb(skb);
383
e76dc1dd 384 /* Read controller information */
22ac1916
HG
385 if (!reinit) {
386 err = btbcm_read_info(hdev);
387 if (err)
388 return err;
389 }
75e167e6 390
fec0de23
HG
391 /* Upper nibble of rev should be between 0 and 3? */
392 if (((rev & 0xf000) >> 12) > 3)
393 return 0;
394
395 bcm_subver_table = (hdev->bus == HCI_USB) ? bcm_usb_subver_table :
396 bcm_uart_subver_table;
397
398 for (i = 0; bcm_subver_table[i].name; i++) {
399 if (subver == bcm_subver_table[i].subver) {
400 hw_name = bcm_subver_table[i].name;
401 break;
75e167e6 402 }
fec0de23 403 }
75e167e6 404
fec0de23
HG
405 if (hdev->bus == HCI_USB) {
406 /* Read USB Product Info */
407 skb = btbcm_read_usb_product(hdev);
408 if (IS_ERR(skb))
409 return PTR_ERR(skb);
410
411 vid = get_unaligned_le16(skb->data + 1);
412 pid = get_unaligned_le16(skb->data + 3);
413 kfree_skb(skb);
414
415 snprintf(fw_name, len, "brcm/%s-%4.4x-%4.4x.hcd",
2cc6d079 416 hw_name, vid, pid);
fec0de23 417 } else {
2cc6d079 418 snprintf(fw_name, len, "brcm/%s.hcd", hw_name);
75e167e6
FD
419 }
420
2064ee33 421 bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u",
2cc6d079 422 hw_name, (subver & 0xe000) >> 13,
2064ee33 423 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
75e167e6
FD
424
425 return 0;
426}
427EXPORT_SYMBOL_GPL(btbcm_initialize);
428
429int btbcm_finalize(struct hci_dev *hdev)
430{
22ac1916 431 char fw_name[64];
75e167e6
FD
432 int err;
433
22ac1916
HG
434 /* Re-initialize */
435 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
75e167e6
FD
436 if (err)
437 return err;
438
75e167e6
FD
439 btbcm_check_bdaddr(hdev);
440
441 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
442
443 return 0;
444}
445EXPORT_SYMBOL_GPL(btbcm_finalize);
446
1c8ba6d0
MH
447int btbcm_setup_patchram(struct hci_dev *hdev)
448{
1c8ba6d0 449 char fw_name[64];
18aeb444 450 const struct firmware *fw;
1c8ba6d0 451 struct sk_buff *skb;
59ce5699 452 int err;
1c8ba6d0 453
59ce5699
HG
454 /* Initialize */
455 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), false);
e76dc1dd
MH
456 if (err)
457 return err;
9bc63ca0 458
18aeb444
FD
459 err = request_firmware(&fw, fw_name, &hdev->dev);
460 if (err < 0) {
2064ee33 461 bt_dev_info(hdev, "BCM: Patch %s not found", fw_name);
ad750fa1 462 goto done;
18aeb444
FD
463 }
464
465 btbcm_patchram(hdev, fw);
466
467 release_firmware(fw);
1c8ba6d0 468
59ce5699
HG
469 /* Re-initialize */
470 err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
1c8ba6d0 471 if (err)
50862ee5 472 return err;
1c8ba6d0 473
9bc63ca0
MH
474 /* Read Local Name */
475 skb = btbcm_read_local_name(hdev);
476 if (IS_ERR(skb))
477 return PTR_ERR(skb);
478
2064ee33 479 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
9bc63ca0
MH
480 kfree_skb(skb);
481
ad750fa1 482done:
1c8ba6d0
MH
483 btbcm_check_bdaddr(hdev);
484
941521e2
MH
485 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
486
50862ee5 487 return 0;
1c8ba6d0
MH
488}
489EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
490
491int btbcm_setup_apple(struct hci_dev *hdev)
492{
493 struct sk_buff *skb;
b224d3ff
MH
494 int err;
495
496 /* Reset */
497 err = btbcm_reset(hdev);
498 if (err)
499 return err;
1c8ba6d0
MH
500
501 /* Read Verbose Config Version Info */
502 skb = btbcm_read_verbose_config(hdev);
7bee8b08 503 if (!IS_ERR(skb)) {
2064ee33
MH
504 bt_dev_info(hdev, "BCM: chip id %u build %4.4u",
505 skb->data[1], get_unaligned_le16(skb->data + 5));
7bee8b08
CM
506 kfree_skb(skb);
507 }
1c8ba6d0 508
34cea41e
MH
509 /* Read USB Product Info */
510 skb = btbcm_read_usb_product(hdev);
511 if (!IS_ERR(skb)) {
2064ee33
MH
512 bt_dev_info(hdev, "BCM: product %4.4x:%4.4x",
513 get_unaligned_le16(skb->data + 1),
514 get_unaligned_le16(skb->data + 3));
34cea41e
MH
515 kfree_skb(skb);
516 }
517
4284ecbe
MH
518 /* Read Controller Features */
519 skb = btbcm_read_controller_features(hdev);
520 if (!IS_ERR(skb)) {
2064ee33 521 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]);
4284ecbe
MH
522 kfree_skb(skb);
523 }
524
9bc63ca0
MH
525 /* Read Local Name */
526 skb = btbcm_read_local_name(hdev);
527 if (!IS_ERR(skb)) {
2064ee33 528 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
9bc63ca0
MH
529 kfree_skb(skb);
530 }
531
941521e2
MH
532 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
533
1c8ba6d0
MH
534 return 0;
535}
536EXPORT_SYMBOL_GPL(btbcm_setup_apple);
537
4fba30f0
MH
538MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
539MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION);
540MODULE_VERSION(VERSION);
541MODULE_LICENSE("GPL");