Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/bluetooth/btqca.c
26378 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Bluetooth supports for Qualcomm Atheros chips
4
*
5
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
6
*/
7
#include <linux/module.h>
8
#include <linux/firmware.h>
9
#include <linux/vmalloc.h>
10
11
#include <net/bluetooth/bluetooth.h>
12
#include <net/bluetooth/hci_core.h>
13
14
#include "btqca.h"
15
16
int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
17
enum qca_btsoc_type soc_type)
18
{
19
struct sk_buff *skb;
20
struct edl_event_hdr *edl;
21
char cmd;
22
int err = 0;
23
u8 event_type = HCI_EV_VENDOR;
24
u8 rlen = sizeof(*edl) + sizeof(*ver);
25
u8 rtype = EDL_APP_VER_RES_EVT;
26
27
bt_dev_dbg(hdev, "QCA Version Request");
28
29
/* Unlike other SoC's sending version command response as payload to
30
* VSE event. WCN3991 sends version command response as a payload to
31
* command complete event.
32
*/
33
if (soc_type >= QCA_WCN3991) {
34
event_type = 0;
35
rlen += 1;
36
rtype = EDL_PATCH_VER_REQ_CMD;
37
}
38
39
cmd = EDL_PATCH_VER_REQ_CMD;
40
skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
41
&cmd, event_type, HCI_INIT_TIMEOUT);
42
if (IS_ERR(skb)) {
43
err = PTR_ERR(skb);
44
bt_dev_err(hdev, "Reading QCA version information failed (%d)",
45
err);
46
return err;
47
}
48
49
if (skb->len != rlen) {
50
bt_dev_err(hdev, "QCA Version size mismatch len %d", skb->len);
51
err = -EILSEQ;
52
goto out;
53
}
54
55
edl = (struct edl_event_hdr *)(skb->data);
56
57
if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
58
edl->rtype != rtype) {
59
bt_dev_err(hdev, "QCA Wrong packet received %d %d", edl->cresp,
60
edl->rtype);
61
err = -EIO;
62
goto out;
63
}
64
65
if (soc_type >= QCA_WCN3991)
66
memcpy(ver, edl->data + 1, sizeof(*ver));
67
else
68
memcpy(ver, &edl->data, sizeof(*ver));
69
70
bt_dev_info(hdev, "QCA Product ID :0x%08x",
71
le32_to_cpu(ver->product_id));
72
bt_dev_info(hdev, "QCA SOC Version :0x%08x",
73
le32_to_cpu(ver->soc_id));
74
bt_dev_info(hdev, "QCA ROM Version :0x%08x",
75
le16_to_cpu(ver->rom_ver));
76
bt_dev_info(hdev, "QCA Patch Version:0x%08x",
77
le16_to_cpu(ver->patch_ver));
78
79
if (ver->soc_id == 0 || ver->rom_ver == 0)
80
err = -EILSEQ;
81
82
out:
83
kfree_skb(skb);
84
if (err)
85
bt_dev_err(hdev, "QCA Failed to get version (%d)", err);
86
87
return err;
88
}
89
EXPORT_SYMBOL_GPL(qca_read_soc_version);
90
91
static int qca_read_fw_build_info(struct hci_dev *hdev)
92
{
93
struct sk_buff *skb;
94
struct edl_event_hdr *edl;
95
char *build_label;
96
char cmd;
97
int build_lbl_len, err = 0;
98
99
bt_dev_dbg(hdev, "QCA read fw build info");
100
101
cmd = EDL_GET_BUILD_INFO_CMD;
102
skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
103
&cmd, 0, HCI_INIT_TIMEOUT);
104
if (IS_ERR(skb)) {
105
err = PTR_ERR(skb);
106
bt_dev_err(hdev, "Reading QCA fw build info failed (%d)",
107
err);
108
return err;
109
}
110
111
if (skb->len < sizeof(*edl)) {
112
err = -EILSEQ;
113
goto out;
114
}
115
116
edl = (struct edl_event_hdr *)(skb->data);
117
118
if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
119
edl->rtype != EDL_GET_BUILD_INFO_CMD) {
120
bt_dev_err(hdev, "QCA Wrong packet received %d %d", edl->cresp,
121
edl->rtype);
122
err = -EIO;
123
goto out;
124
}
125
126
if (skb->len < sizeof(*edl) + 1) {
127
err = -EILSEQ;
128
goto out;
129
}
130
131
build_lbl_len = edl->data[0];
132
133
if (skb->len < sizeof(*edl) + 1 + build_lbl_len) {
134
err = -EILSEQ;
135
goto out;
136
}
137
138
build_label = kstrndup(&edl->data[1], build_lbl_len, GFP_KERNEL);
139
if (!build_label) {
140
err = -ENOMEM;
141
goto out;
142
}
143
144
hci_set_fw_info(hdev, "%s", build_label);
145
146
kfree(build_label);
147
out:
148
kfree_skb(skb);
149
return err;
150
}
151
152
static int qca_send_patch_config_cmd(struct hci_dev *hdev)
153
{
154
const u8 cmd[] = { EDL_PATCH_CONFIG_CMD, 0x01, 0, 0, 0 };
155
struct sk_buff *skb;
156
struct edl_event_hdr *edl;
157
int err;
158
159
bt_dev_dbg(hdev, "QCA Patch config");
160
161
skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, sizeof(cmd),
162
cmd, 0, HCI_INIT_TIMEOUT);
163
if (IS_ERR(skb)) {
164
err = PTR_ERR(skb);
165
bt_dev_err(hdev, "Sending QCA Patch config failed (%d)", err);
166
return err;
167
}
168
169
if (skb->len != 2) {
170
bt_dev_err(hdev, "QCA Patch config cmd size mismatch len %d", skb->len);
171
err = -EILSEQ;
172
goto out;
173
}
174
175
edl = (struct edl_event_hdr *)(skb->data);
176
177
if (edl->cresp != EDL_PATCH_CONFIG_RES_EVT || edl->rtype != EDL_PATCH_CONFIG_CMD) {
178
bt_dev_err(hdev, "QCA Wrong packet received %d %d", edl->cresp,
179
edl->rtype);
180
err = -EIO;
181
goto out;
182
}
183
184
err = 0;
185
186
out:
187
kfree_skb(skb);
188
return err;
189
}
190
191
static int qca_send_reset(struct hci_dev *hdev)
192
{
193
struct sk_buff *skb;
194
int err;
195
196
bt_dev_dbg(hdev, "QCA HCI_RESET");
197
198
skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
199
if (IS_ERR(skb)) {
200
err = PTR_ERR(skb);
201
bt_dev_err(hdev, "QCA Reset failed (%d)", err);
202
return err;
203
}
204
205
kfree_skb(skb);
206
207
return 0;
208
}
209
210
static int qca_read_fw_board_id(struct hci_dev *hdev, u16 *bid)
211
{
212
u8 cmd;
213
struct sk_buff *skb;
214
struct edl_event_hdr *edl;
215
int err = 0;
216
217
cmd = EDL_GET_BID_REQ_CMD;
218
skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
219
&cmd, 0, HCI_INIT_TIMEOUT);
220
if (IS_ERR(skb)) {
221
err = PTR_ERR(skb);
222
bt_dev_err(hdev, "Reading QCA board ID failed (%d)", err);
223
return err;
224
}
225
226
edl = skb_pull_data(skb, sizeof(*edl));
227
if (!edl) {
228
bt_dev_err(hdev, "QCA read board ID with no header");
229
err = -EILSEQ;
230
goto out;
231
}
232
233
if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
234
edl->rtype != EDL_GET_BID_REQ_CMD) {
235
bt_dev_err(hdev, "QCA Wrong packet: %d %d", edl->cresp, edl->rtype);
236
err = -EIO;
237
goto out;
238
}
239
240
if (skb->len < 3) {
241
err = -EILSEQ;
242
goto out;
243
}
244
245
*bid = (edl->data[1] << 8) + edl->data[2];
246
bt_dev_dbg(hdev, "%s: bid = %x", __func__, *bid);
247
248
out:
249
kfree_skb(skb);
250
return err;
251
}
252
253
int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
254
{
255
struct sk_buff *skb;
256
int err;
257
258
bt_dev_dbg(hdev, "QCA pre shutdown cmd");
259
260
skb = __hci_cmd_sync_ev(hdev, QCA_PRE_SHUTDOWN_CMD, 0,
261
NULL, HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
262
263
if (IS_ERR(skb)) {
264
err = PTR_ERR(skb);
265
bt_dev_err(hdev, "QCA preshutdown_cmd failed (%d)", err);
266
return err;
267
}
268
269
kfree_skb(skb);
270
271
return 0;
272
}
273
EXPORT_SYMBOL_GPL(qca_send_pre_shutdown_cmd);
274
275
static bool qca_filename_has_extension(const char *filename)
276
{
277
const char *suffix = strrchr(filename, '.');
278
279
/* File extensions require a dot, but not as the first or last character */
280
if (!suffix || suffix == filename || *(suffix + 1) == '\0')
281
return 0;
282
283
/* Avoid matching directories with names that look like files with extensions */
284
return !strchr(suffix, '/');
285
}
286
287
static bool qca_get_alt_nvm_file(char *filename, size_t max_size)
288
{
289
char fwname[64];
290
const char *suffix;
291
292
/* nvm file name has an extension, replace with .bin */
293
if (qca_filename_has_extension(filename)) {
294
suffix = strrchr(filename, '.');
295
strscpy(fwname, filename, suffix - filename + 1);
296
snprintf(fwname + (suffix - filename),
297
sizeof(fwname) - (suffix - filename), ".bin");
298
/* If nvm file is already the default one, return false to skip the retry. */
299
if (strcmp(fwname, filename) == 0)
300
return false;
301
302
snprintf(filename, max_size, "%s", fwname);
303
return true;
304
}
305
return false;
306
}
307
308
static int qca_tlv_check_data(struct hci_dev *hdev,
309
struct qca_fw_config *config,
310
u8 *fw_data, size_t fw_size,
311
enum qca_btsoc_type soc_type)
312
{
313
const u8 *data;
314
u32 type_len;
315
u16 tag_id, tag_len;
316
int idx, length;
317
struct tlv_type_hdr *tlv;
318
struct tlv_type_patch *tlv_patch;
319
struct tlv_type_nvm *tlv_nvm;
320
uint8_t nvm_baud_rate = config->user_baud_rate;
321
u8 type;
322
323
config->dnld_mode = QCA_SKIP_EVT_NONE;
324
config->dnld_type = QCA_SKIP_EVT_NONE;
325
326
switch (config->type) {
327
case ELF_TYPE_PATCH:
328
if (fw_size < 7)
329
return -EINVAL;
330
331
config->dnld_mode = QCA_SKIP_EVT_VSE_CC;
332
config->dnld_type = QCA_SKIP_EVT_VSE_CC;
333
334
bt_dev_dbg(hdev, "File Class : 0x%x", fw_data[4]);
335
bt_dev_dbg(hdev, "Data Encoding : 0x%x", fw_data[5]);
336
bt_dev_dbg(hdev, "File version : 0x%x", fw_data[6]);
337
break;
338
case TLV_TYPE_PATCH:
339
if (fw_size < sizeof(struct tlv_type_hdr) + sizeof(struct tlv_type_patch))
340
return -EINVAL;
341
342
tlv = (struct tlv_type_hdr *)fw_data;
343
type_len = le32_to_cpu(tlv->type_len);
344
tlv_patch = (struct tlv_type_patch *)tlv->data;
345
346
/* For Rome version 1.1 to 3.1, all segment commands
347
* are acked by a vendor specific event (VSE).
348
* For Rome >= 3.2, the download mode field indicates
349
* if VSE is skipped by the controller.
350
* In case VSE is skipped, only the last segment is acked.
351
*/
352
config->dnld_mode = tlv_patch->download_mode;
353
config->dnld_type = config->dnld_mode;
354
355
BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff);
356
BT_DBG("Total Length : %d bytes",
357
le32_to_cpu(tlv_patch->total_size));
358
BT_DBG("Patch Data Length : %d bytes",
359
le32_to_cpu(tlv_patch->data_length));
360
BT_DBG("Signing Format Version : 0x%x",
361
tlv_patch->format_version);
362
BT_DBG("Signature Algorithm : 0x%x",
363
tlv_patch->signature);
364
BT_DBG("Download mode : 0x%x",
365
tlv_patch->download_mode);
366
BT_DBG("Reserved : 0x%x",
367
tlv_patch->reserved1);
368
BT_DBG("Product ID : 0x%04x",
369
le16_to_cpu(tlv_patch->product_id));
370
BT_DBG("Rom Build Version : 0x%04x",
371
le16_to_cpu(tlv_patch->rom_build));
372
BT_DBG("Patch Version : 0x%04x",
373
le16_to_cpu(tlv_patch->patch_version));
374
BT_DBG("Reserved : 0x%x",
375
le16_to_cpu(tlv_patch->reserved2));
376
BT_DBG("Patch Entry Address : 0x%x",
377
le32_to_cpu(tlv_patch->entry));
378
break;
379
380
case TLV_TYPE_NVM:
381
if (fw_size < sizeof(struct tlv_type_hdr))
382
return -EINVAL;
383
384
tlv = (struct tlv_type_hdr *)fw_data;
385
386
type_len = le32_to_cpu(tlv->type_len);
387
length = type_len >> 8;
388
type = type_len & 0xff;
389
390
/* Some NVM files have more than one set of tags, only parse
391
* the first set when it has type 2 for now. When there is
392
* more than one set there is an enclosing header of type 4.
393
*/
394
if (type == 4) {
395
if (fw_size < 2 * sizeof(struct tlv_type_hdr))
396
return -EINVAL;
397
398
tlv++;
399
400
type_len = le32_to_cpu(tlv->type_len);
401
length = type_len >> 8;
402
type = type_len & 0xff;
403
}
404
405
BT_DBG("TLV Type\t\t : 0x%x", type);
406
BT_DBG("Length\t\t : %d bytes", length);
407
408
if (type != 2)
409
break;
410
411
if (fw_size < length + (tlv->data - fw_data))
412
return -EINVAL;
413
414
idx = 0;
415
data = tlv->data;
416
while (idx < length - sizeof(struct tlv_type_nvm)) {
417
tlv_nvm = (struct tlv_type_nvm *)(data + idx);
418
419
tag_id = le16_to_cpu(tlv_nvm->tag_id);
420
tag_len = le16_to_cpu(tlv_nvm->tag_len);
421
422
if (length < idx + sizeof(struct tlv_type_nvm) + tag_len)
423
return -EINVAL;
424
425
/* Update NVM tags as needed */
426
switch (tag_id) {
427
case EDL_TAG_ID_BD_ADDR:
428
if (tag_len != sizeof(bdaddr_t))
429
return -EINVAL;
430
431
memcpy(&config->bdaddr, tlv_nvm->data, sizeof(bdaddr_t));
432
433
break;
434
435
case EDL_TAG_ID_HCI:
436
if (tag_len < 3)
437
return -EINVAL;
438
439
/* HCI transport layer parameters
440
* enabling software inband sleep
441
* onto controller side.
442
*/
443
tlv_nvm->data[0] |= 0x80;
444
445
/* UART Baud Rate */
446
if (soc_type >= QCA_WCN3991)
447
tlv_nvm->data[1] = nvm_baud_rate;
448
else
449
tlv_nvm->data[2] = nvm_baud_rate;
450
451
break;
452
453
case EDL_TAG_ID_DEEP_SLEEP:
454
if (tag_len < 1)
455
return -EINVAL;
456
457
/* Sleep enable mask
458
* enabling deep sleep feature on controller.
459
*/
460
tlv_nvm->data[0] |= 0x01;
461
462
break;
463
}
464
465
idx += sizeof(struct tlv_type_nvm) + tag_len;
466
}
467
break;
468
469
default:
470
BT_ERR("Unknown TLV type %d", config->type);
471
return -EINVAL;
472
}
473
474
return 0;
475
}
476
477
static int qca_tlv_send_segment(struct hci_dev *hdev, int seg_size,
478
const u8 *data, enum qca_tlv_dnld_mode mode,
479
enum qca_btsoc_type soc_type)
480
{
481
struct sk_buff *skb;
482
struct edl_event_hdr *edl;
483
struct tlv_seg_resp *tlv_resp;
484
u8 cmd[MAX_SIZE_PER_TLV_SEGMENT + 2];
485
int err = 0;
486
u8 event_type = HCI_EV_VENDOR;
487
u8 rlen = (sizeof(*edl) + sizeof(*tlv_resp));
488
u8 rtype = EDL_TVL_DNLD_RES_EVT;
489
490
cmd[0] = EDL_PATCH_TLV_REQ_CMD;
491
cmd[1] = seg_size;
492
memcpy(cmd + 2, data, seg_size);
493
494
if (mode == QCA_SKIP_EVT_VSE_CC || mode == QCA_SKIP_EVT_VSE)
495
return __hci_cmd_send(hdev, EDL_PATCH_CMD_OPCODE, seg_size + 2,
496
cmd);
497
498
/* Unlike other SoC's sending version command response as payload to
499
* VSE event. WCN3991 sends version command response as a payload to
500
* command complete event.
501
*/
502
if (soc_type >= QCA_WCN3991) {
503
event_type = 0;
504
rlen = sizeof(*edl);
505
rtype = EDL_PATCH_TLV_REQ_CMD;
506
}
507
508
skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, seg_size + 2, cmd,
509
event_type, HCI_INIT_TIMEOUT);
510
if (IS_ERR(skb)) {
511
err = PTR_ERR(skb);
512
bt_dev_err(hdev, "QCA Failed to send TLV segment (%d)", err);
513
return err;
514
}
515
516
if (skb->len != rlen) {
517
bt_dev_err(hdev, "QCA TLV response size mismatch");
518
err = -EILSEQ;
519
goto out;
520
}
521
522
edl = (struct edl_event_hdr *)(skb->data);
523
524
if (edl->cresp != EDL_CMD_REQ_RES_EVT || edl->rtype != rtype) {
525
bt_dev_err(hdev, "QCA TLV with error stat 0x%x rtype 0x%x",
526
edl->cresp, edl->rtype);
527
err = -EIO;
528
}
529
530
if (soc_type >= QCA_WCN3991)
531
goto out;
532
533
tlv_resp = (struct tlv_seg_resp *)(edl->data);
534
if (tlv_resp->result) {
535
bt_dev_err(hdev, "QCA TLV with error stat 0x%x rtype 0x%x (0x%x)",
536
edl->cresp, edl->rtype, tlv_resp->result);
537
}
538
539
out:
540
kfree_skb(skb);
541
542
return err;
543
}
544
545
static int qca_inject_cmd_complete_event(struct hci_dev *hdev)
546
{
547
struct hci_event_hdr *hdr;
548
struct hci_ev_cmd_complete *evt;
549
struct sk_buff *skb;
550
551
skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_KERNEL);
552
if (!skb)
553
return -ENOMEM;
554
555
hdr = skb_put(skb, sizeof(*hdr));
556
hdr->evt = HCI_EV_CMD_COMPLETE;
557
hdr->plen = sizeof(*evt) + 1;
558
559
evt = skb_put(skb, sizeof(*evt));
560
evt->ncmd = 1;
561
evt->opcode = cpu_to_le16(QCA_HCI_CC_OPCODE);
562
563
skb_put_u8(skb, QCA_HCI_CC_SUCCESS);
564
565
hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
566
567
return hci_recv_frame(hdev, skb);
568
}
569
570
static int qca_download_firmware(struct hci_dev *hdev,
571
struct qca_fw_config *config,
572
enum qca_btsoc_type soc_type,
573
u8 rom_ver)
574
{
575
const struct firmware *fw;
576
u8 *data;
577
const u8 *segment;
578
int ret, size, remain, i = 0;
579
580
bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
581
582
ret = request_firmware(&fw, config->fwname, &hdev->dev);
583
if (ret) {
584
/* For WCN6750, if mbn file is not present then check for
585
* tlv file.
586
*/
587
if (soc_type == QCA_WCN6750 && config->type == ELF_TYPE_PATCH) {
588
bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)",
589
config->fwname, ret);
590
config->type = TLV_TYPE_PATCH;
591
snprintf(config->fwname, sizeof(config->fwname),
592
"qca/msbtfw%02x.tlv", rom_ver);
593
bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
594
ret = request_firmware(&fw, config->fwname, &hdev->dev);
595
if (ret) {
596
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
597
config->fwname, ret);
598
return ret;
599
}
600
}
601
/* If the board-specific file is missing, try loading the default
602
* one, unless that was attempted already.
603
*/
604
else if (config->type == TLV_TYPE_NVM &&
605
qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) {
606
bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
607
ret = request_firmware(&fw, config->fwname, &hdev->dev);
608
if (ret) {
609
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
610
config->fwname, ret);
611
return ret;
612
}
613
} else {
614
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
615
config->fwname, ret);
616
return ret;
617
}
618
}
619
620
size = fw->size;
621
data = vmalloc(fw->size);
622
if (!data) {
623
bt_dev_err(hdev, "QCA Failed to allocate memory for file: %s",
624
config->fwname);
625
release_firmware(fw);
626
return -ENOMEM;
627
}
628
629
memcpy(data, fw->data, size);
630
release_firmware(fw);
631
632
ret = qca_tlv_check_data(hdev, config, data, size, soc_type);
633
if (ret)
634
goto out;
635
636
segment = data;
637
remain = size;
638
while (remain > 0) {
639
int segsize = min(MAX_SIZE_PER_TLV_SEGMENT, remain);
640
641
bt_dev_dbg(hdev, "Send segment %d, size %d", i++, segsize);
642
643
remain -= segsize;
644
/* The last segment is always acked regardless download mode */
645
if (!remain || segsize < MAX_SIZE_PER_TLV_SEGMENT)
646
config->dnld_mode = QCA_SKIP_EVT_NONE;
647
648
ret = qca_tlv_send_segment(hdev, segsize, segment,
649
config->dnld_mode, soc_type);
650
if (ret)
651
goto out;
652
653
segment += segsize;
654
}
655
656
/* Latest qualcomm chipsets are not sending a command complete event
657
* for every fw packet sent. They only respond with a vendor specific
658
* event for the last packet. This optimization in the chip will
659
* decrease the BT in initialization time. Here we will inject a command
660
* complete event to avoid a command timeout error message.
661
*/
662
if (config->dnld_type == QCA_SKIP_EVT_VSE_CC ||
663
config->dnld_type == QCA_SKIP_EVT_VSE)
664
ret = qca_inject_cmd_complete_event(hdev);
665
666
out:
667
vfree(data);
668
669
return ret;
670
}
671
672
static int qca_disable_soc_logging(struct hci_dev *hdev)
673
{
674
struct sk_buff *skb;
675
u8 cmd[2];
676
int err;
677
678
cmd[0] = QCA_DISABLE_LOGGING_SUB_OP;
679
cmd[1] = 0x00;
680
skb = __hci_cmd_sync_ev(hdev, QCA_DISABLE_LOGGING, sizeof(cmd), cmd,
681
HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
682
if (IS_ERR(skb)) {
683
err = PTR_ERR(skb);
684
bt_dev_err(hdev, "QCA Failed to disable soc logging(%d)", err);
685
return err;
686
}
687
688
kfree_skb(skb);
689
690
return 0;
691
}
692
693
int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
694
{
695
struct sk_buff *skb;
696
u8 cmd[9];
697
int err;
698
699
cmd[0] = EDL_NVM_ACCESS_SET_REQ_CMD;
700
cmd[1] = 0x02; /* TAG ID */
701
cmd[2] = sizeof(bdaddr_t); /* size */
702
memcpy(cmd + 3, bdaddr, sizeof(bdaddr_t));
703
skb = __hci_cmd_sync_ev(hdev, EDL_NVM_ACCESS_OPCODE, sizeof(cmd), cmd,
704
HCI_EV_VENDOR, HCI_INIT_TIMEOUT);
705
if (IS_ERR(skb)) {
706
err = PTR_ERR(skb);
707
bt_dev_err(hdev, "QCA Change address command failed (%d)", err);
708
return err;
709
}
710
711
kfree_skb(skb);
712
713
return 0;
714
}
715
EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
716
717
static int qca_check_bdaddr(struct hci_dev *hdev, const struct qca_fw_config *config)
718
{
719
struct hci_rp_read_bd_addr *bda;
720
struct sk_buff *skb;
721
int err;
722
723
if (bacmp(&hdev->public_addr, BDADDR_ANY))
724
return 0;
725
726
skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
727
HCI_INIT_TIMEOUT);
728
if (IS_ERR(skb)) {
729
err = PTR_ERR(skb);
730
bt_dev_err(hdev, "Failed to read device address (%d)", err);
731
return err;
732
}
733
734
if (skb->len != sizeof(*bda)) {
735
bt_dev_err(hdev, "Device address length mismatch");
736
kfree_skb(skb);
737
return -EIO;
738
}
739
740
bda = (struct hci_rp_read_bd_addr *)skb->data;
741
if (!bacmp(&bda->bdaddr, &config->bdaddr))
742
hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
743
744
kfree_skb(skb);
745
746
return 0;
747
}
748
749
static void qca_get_nvm_name_by_board(char *fwname, size_t max_size,
750
const char *stem, enum qca_btsoc_type soc_type,
751
struct qca_btsoc_version ver, u8 rom_ver, u16 bid)
752
{
753
const char *variant;
754
const char *prefix;
755
756
/* Set the default value to variant and prefix */
757
variant = "";
758
prefix = "b";
759
760
if (soc_type == QCA_QCA2066)
761
prefix = "";
762
763
if (soc_type == QCA_WCN6855 || soc_type == QCA_QCA2066) {
764
/* If the chip is manufactured by GlobalFoundries */
765
if ((le32_to_cpu(ver.soc_id) & QCA_HSP_GF_SOC_MASK) == QCA_HSP_GF_SOC_ID)
766
variant = "g";
767
}
768
769
if (rom_ver != 0) {
770
if (bid == 0x0 || bid == 0xffff)
771
snprintf(fwname, max_size, "qca/%s%02x%s.bin", stem, rom_ver, variant);
772
else
773
snprintf(fwname, max_size, "qca/%s%02x%s.%s%02x", stem, rom_ver,
774
variant, prefix, bid);
775
} else {
776
if (bid == 0x0 || bid == 0xffff)
777
snprintf(fwname, max_size, "qca/%s%s.bin", stem, variant);
778
else
779
snprintf(fwname, max_size, "qca/%s%s.%s%02x", stem, variant, prefix, bid);
780
}
781
}
782
783
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
784
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
785
const char *firmware_name, const char *rampatch_name)
786
{
787
struct qca_fw_config config = {};
788
const char *variant = "";
789
int err;
790
u8 rom_ver = 0;
791
u32 soc_ver;
792
u16 boardid = 0;
793
794
bt_dev_dbg(hdev, "QCA setup on UART");
795
796
soc_ver = get_soc_ver(ver.soc_id, ver.rom_ver);
797
798
bt_dev_info(hdev, "QCA controller version 0x%08x", soc_ver);
799
800
config.user_baud_rate = baudrate;
801
802
/* Firmware files to download are based on ROM version.
803
* ROM version is derived from last two bytes of soc_ver.
804
*/
805
if (soc_type == QCA_WCN3988)
806
rom_ver = ((soc_ver & 0x00000f00) >> 0x05) | (soc_ver & 0x0000000f);
807
else
808
rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
809
810
if (soc_type == QCA_WCN6750)
811
qca_send_patch_config_cmd(hdev);
812
813
/* Download rampatch file */
814
config.type = TLV_TYPE_PATCH;
815
if (rampatch_name) {
816
snprintf(config.fwname, sizeof(config.fwname), "qca/%s", rampatch_name);
817
} else {
818
switch (soc_type) {
819
case QCA_WCN3950:
820
snprintf(config.fwname, sizeof(config.fwname),
821
"qca/cmbtfw%02x.tlv", rom_ver);
822
break;
823
case QCA_WCN3990:
824
case QCA_WCN3991:
825
case QCA_WCN3998:
826
snprintf(config.fwname, sizeof(config.fwname),
827
"qca/crbtfw%02x.tlv", rom_ver);
828
break;
829
case QCA_WCN3988:
830
snprintf(config.fwname, sizeof(config.fwname),
831
"qca/apbtfw%02x.tlv", rom_ver);
832
break;
833
case QCA_QCA2066:
834
snprintf(config.fwname, sizeof(config.fwname),
835
"qca/hpbtfw%02x.tlv", rom_ver);
836
break;
837
case QCA_QCA6390:
838
snprintf(config.fwname, sizeof(config.fwname),
839
"qca/htbtfw%02x.tlv", rom_ver);
840
break;
841
case QCA_WCN6750:
842
/* Choose mbn file by default.If mbn file is not found
843
* then choose tlv file
844
*/
845
config.type = ELF_TYPE_PATCH;
846
snprintf(config.fwname, sizeof(config.fwname),
847
"qca/msbtfw%02x.mbn", rom_ver);
848
break;
849
case QCA_WCN6855:
850
snprintf(config.fwname, sizeof(config.fwname),
851
"qca/hpbtfw%02x.tlv", rom_ver);
852
break;
853
case QCA_WCN7850:
854
snprintf(config.fwname, sizeof(config.fwname),
855
"qca/hmtbtfw%02x.tlv", rom_ver);
856
break;
857
default:
858
snprintf(config.fwname, sizeof(config.fwname),
859
"qca/rampatch_%08x.bin", soc_ver);
860
}
861
}
862
863
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
864
if (err < 0) {
865
bt_dev_err(hdev, "QCA Failed to download patch (%d)", err);
866
return err;
867
}
868
869
/* Give the controller some time to get ready to receive the NVM */
870
msleep(10);
871
872
if (soc_type == QCA_QCA2066 || soc_type == QCA_WCN7850)
873
qca_read_fw_board_id(hdev, &boardid);
874
875
/* Download NVM configuration */
876
config.type = TLV_TYPE_NVM;
877
if (firmware_name) {
878
/* The firmware name has an extension, use it directly */
879
if (qca_filename_has_extension(firmware_name)) {
880
snprintf(config.fwname, sizeof(config.fwname), "qca/%s", firmware_name);
881
} else {
882
qca_read_fw_board_id(hdev, &boardid);
883
qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname),
884
firmware_name, soc_type, ver, 0, boardid);
885
}
886
} else {
887
switch (soc_type) {
888
case QCA_WCN3950:
889
if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_T)
890
variant = "t";
891
else if (le32_to_cpu(ver.soc_id) == QCA_WCN3950_SOC_ID_S)
892
variant = "s";
893
894
snprintf(config.fwname, sizeof(config.fwname),
895
"qca/cmnv%02x%s.bin", rom_ver, variant);
896
break;
897
case QCA_WCN3990:
898
case QCA_WCN3991:
899
case QCA_WCN3998:
900
if (le32_to_cpu(ver.soc_id) == QCA_WCN3991_SOC_ID)
901
variant = "u";
902
903
snprintf(config.fwname, sizeof(config.fwname),
904
"qca/crnv%02x%s.bin", rom_ver, variant);
905
break;
906
case QCA_WCN3988:
907
snprintf(config.fwname, sizeof(config.fwname),
908
"qca/apnv%02x.bin", rom_ver);
909
break;
910
case QCA_QCA2066:
911
qca_get_nvm_name_by_board(config.fwname,
912
sizeof(config.fwname), "hpnv", soc_type, ver,
913
rom_ver, boardid);
914
break;
915
case QCA_QCA6390:
916
snprintf(config.fwname, sizeof(config.fwname),
917
"qca/htnv%02x.bin", rom_ver);
918
break;
919
case QCA_WCN6750:
920
snprintf(config.fwname, sizeof(config.fwname),
921
"qca/msnv%02x.bin", rom_ver);
922
break;
923
case QCA_WCN6855:
924
qca_read_fw_board_id(hdev, &boardid);
925
qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname),
926
"hpnv", soc_type, ver, rom_ver, boardid);
927
break;
928
case QCA_WCN7850:
929
qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname),
930
"hmtnv", soc_type, ver, rom_ver, boardid);
931
break;
932
default:
933
snprintf(config.fwname, sizeof(config.fwname),
934
"qca/nvm_%08x.bin", soc_ver);
935
}
936
}
937
938
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
939
if (err < 0) {
940
bt_dev_err(hdev, "QCA Failed to download NVM (%d)", err);
941
return err;
942
}
943
944
switch (soc_type) {
945
case QCA_WCN3991:
946
case QCA_QCA2066:
947
case QCA_QCA6390:
948
case QCA_WCN6750:
949
case QCA_WCN6855:
950
case QCA_WCN7850:
951
err = qca_disable_soc_logging(hdev);
952
if (err < 0)
953
return err;
954
break;
955
default:
956
break;
957
}
958
959
/* WCN399x and WCN6750 supports the Microsoft vendor extension with 0xFD70 as the
960
* VsMsftOpCode.
961
*/
962
switch (soc_type) {
963
case QCA_WCN3950:
964
case QCA_WCN3988:
965
case QCA_WCN3990:
966
case QCA_WCN3991:
967
case QCA_WCN3998:
968
case QCA_WCN6750:
969
hci_set_msft_opcode(hdev, 0xFD70);
970
break;
971
default:
972
break;
973
}
974
975
/* Perform HCI reset */
976
err = qca_send_reset(hdev);
977
if (err < 0) {
978
bt_dev_err(hdev, "QCA Failed to run HCI_RESET (%d)", err);
979
return err;
980
}
981
982
switch (soc_type) {
983
case QCA_WCN3991:
984
case QCA_WCN6750:
985
case QCA_WCN6855:
986
case QCA_WCN7850:
987
/* get fw build info */
988
err = qca_read_fw_build_info(hdev);
989
if (err < 0)
990
return err;
991
break;
992
default:
993
break;
994
}
995
996
err = qca_check_bdaddr(hdev, &config);
997
if (err)
998
return err;
999
1000
bt_dev_info(hdev, "QCA setup on UART is completed");
1001
1002
return 0;
1003
}
1004
EXPORT_SYMBOL_GPL(qca_uart_setup);
1005
1006
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
1007
{
1008
bdaddr_t bdaddr_swapped;
1009
struct sk_buff *skb;
1010
int err;
1011
1012
baswap(&bdaddr_swapped, bdaddr);
1013
1014
skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6,
1015
&bdaddr_swapped, HCI_EV_VENDOR,
1016
HCI_INIT_TIMEOUT);
1017
if (IS_ERR(skb)) {
1018
err = PTR_ERR(skb);
1019
bt_dev_err(hdev, "QCA Change address cmd failed (%d)", err);
1020
return err;
1021
}
1022
1023
kfree_skb(skb);
1024
1025
return 0;
1026
}
1027
EXPORT_SYMBOL_GPL(qca_set_bdaddr);
1028
1029
1030
MODULE_AUTHOR("Ben Young Tae Kim <[email protected]>");
1031
MODULE_DESCRIPTION("Bluetooth support for Qualcomm Atheros family");
1032
MODULE_LICENSE("GPL");
1033
1034