hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/bluetooth/btrtl.c
....@@ -1,18 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Bluetooth support for Realtek devices
34 *
45 * Copyright (C) 2015 Endless Mobile, Inc.
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation; either version 2 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
166 */
177
188 #include <linux/module.h>
....@@ -31,6 +21,7 @@
3121 #define RTL_ROM_LMP_3499 0x3499
3222 #define RTL_ROM_LMP_8723A 0x1200
3323 #define RTL_ROM_LMP_8723B 0x8723
24
+#define RTL_ROM_LMP_8723D 0x8873
3425 #define RTL_ROM_LMP_8821A 0x8821
3526 #define RTL_ROM_LMP_8761A 0x8761
3627 #define RTL_ROM_LMP_8822B 0x8822
....@@ -117,6 +108,13 @@
117108 .fw_name = "rtl_bt/rtl8723ds_fw.bin",
118109 .cfg_name = "rtl_bt/rtl8723ds_config" },
119110
111
+ /* 8723DU */
112
+ { IC_INFO(RTL_ROM_LMP_8723D, 0x826C),
113
+ .config_needed = true,
114
+ .has_rom_version = true,
115
+ .fw_name = "rtl_bt/rtl8723d_fw.bin",
116
+ .cfg_name = "rtl_bt/rtl8723d_config" },
117
+
120118 /* 8821A */
121119 { IC_INFO(RTL_ROM_LMP_8821A, 0xa),
122120 .config_needed = false,
....@@ -132,11 +130,37 @@
132130 .cfg_name = "rtl_bt/rtl8821c_config" },
133131
134132 /* 8761A */
135
- { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_8761A, 0x0,
133
+ { IC_INFO(RTL_ROM_LMP_8761A, 0xa),
136134 .config_needed = false,
137135 .has_rom_version = true,
138136 .fw_name = "rtl_bt/rtl8761a_fw.bin",
139137 .cfg_name = "rtl_bt/rtl8761a_config" },
138
+
139
+ /* 8761B */
140
+ { IC_INFO(RTL_ROM_LMP_8761A, 0xb),
141
+ .config_needed = false,
142
+ .has_rom_version = true,
143
+ .fw_name = "rtl_bt/rtl8761b_fw.bin",
144
+ .cfg_name = "rtl_bt/rtl8761b_config" },
145
+
146
+ /* 8822C with UART interface */
147
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV |
148
+ IC_MATCH_FL_HCIBUS,
149
+ .lmp_subver = RTL_ROM_LMP_8822B,
150
+ .hci_rev = 0x000c,
151
+ .hci_ver = 0x0a,
152
+ .hci_bus = HCI_UART,
153
+ .config_needed = true,
154
+ .has_rom_version = true,
155
+ .fw_name = "rtl_bt/rtl8822cs_fw.bin",
156
+ .cfg_name = "rtl_bt/rtl8822cs_config" },
157
+
158
+ /* 8822C with USB interface */
159
+ { IC_INFO(RTL_ROM_LMP_8822B, 0xc),
160
+ .config_needed = false,
161
+ .has_rom_version = true,
162
+ .fw_name = "rtl_bt/rtl8822cu_fw.bin",
163
+ .cfg_name = "rtl_bt/rtl8822cu_config" },
140164
141165 /* 8822B */
142166 { IC_INFO(RTL_ROM_LMP_8822B, 0xb),
....@@ -173,6 +197,27 @@
173197 return &ic_id_table[i];
174198 }
175199
200
+static struct sk_buff *btrtl_read_local_version(struct hci_dev *hdev)
201
+{
202
+ struct sk_buff *skb;
203
+
204
+ skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
205
+ HCI_INIT_TIMEOUT);
206
+ if (IS_ERR(skb)) {
207
+ rtl_dev_err(hdev, "HCI_OP_READ_LOCAL_VERSION failed (%ld)",
208
+ PTR_ERR(skb));
209
+ return skb;
210
+ }
211
+
212
+ if (skb->len != sizeof(struct hci_rp_read_local_version)) {
213
+ rtl_dev_err(hdev, "HCI_OP_READ_LOCAL_VERSION event length mismatch");
214
+ kfree_skb(skb);
215
+ return ERR_PTR(-EIO);
216
+ }
217
+
218
+ return skb;
219
+}
220
+
176221 static int rtl_read_rom_version(struct hci_dev *hdev, u8 *version)
177222 {
178223 struct rtl_rom_version_evt *rom_version;
....@@ -181,19 +226,19 @@
181226 /* Read RTL ROM version command */
182227 skb = __hci_cmd_sync(hdev, 0xfc6d, 0, NULL, HCI_INIT_TIMEOUT);
183228 if (IS_ERR(skb)) {
184
- rtl_dev_err(hdev, "Read ROM version failed (%ld)\n",
229
+ rtl_dev_err(hdev, "Read ROM version failed (%ld)",
185230 PTR_ERR(skb));
186231 return PTR_ERR(skb);
187232 }
188233
189234 if (skb->len != sizeof(*rom_version)) {
190
- rtl_dev_err(hdev, "RTL version event length mismatch\n");
235
+ rtl_dev_err(hdev, "version event length mismatch");
191236 kfree_skb(skb);
192237 return -EIO;
193238 }
194239
195240 rom_version = (struct rtl_rom_version_evt *)skb->data;
196
- rtl_dev_info(hdev, "rom_version status=%x version=%x\n",
241
+ rtl_dev_info(hdev, "rom_version status=%x version=%x",
197242 rom_version->status, rom_version->version);
198243
199244 *version = rom_version->version;
....@@ -206,7 +251,7 @@
206251 struct btrtl_device_info *btrtl_dev,
207252 unsigned char **_buf)
208253 {
209
- const u8 extension_sig[] = { 0x51, 0x04, 0xfd, 0x77 };
254
+ static const u8 extension_sig[] = { 0x51, 0x04, 0xfd, 0x77 };
210255 struct rtl_epatch_header *epatch_info;
211256 unsigned char *buf;
212257 int i, len;
....@@ -228,6 +273,8 @@
228273 { RTL_ROM_LMP_8822B, 8 },
229274 { RTL_ROM_LMP_8723B, 9 }, /* 8723D */
230275 { RTL_ROM_LMP_8821A, 10 }, /* 8821C */
276
+ { RTL_ROM_LMP_8822B, 13 }, /* 8822C */
277
+ { RTL_ROM_LMP_8761A, 14 }, /* 8761B */
231278 };
232279
233280 min_size = sizeof(struct rtl_epatch_header) + sizeof(extension_sig) + 3;
....@@ -236,7 +283,7 @@
236283
237284 fwptr = btrtl_dev->fw_data + btrtl_dev->fw_len - sizeof(extension_sig);
238285 if (memcmp(fwptr, extension_sig, sizeof(extension_sig)) != 0) {
239
- rtl_dev_err(hdev, "extension section signature mismatch\n");
286
+ rtl_dev_err(hdev, "extension section signature mismatch");
240287 return -EINVAL;
241288 }
242289
....@@ -257,7 +304,7 @@
257304 break;
258305
259306 if (length == 0) {
260
- rtl_dev_err(hdev, "found instruction with length 0\n");
307
+ rtl_dev_err(hdev, "found instruction with length 0");
261308 return -EINVAL;
262309 }
263310
....@@ -270,7 +317,7 @@
270317 }
271318
272319 if (project_id < 0) {
273
- rtl_dev_err(hdev, "failed to find version instruction\n");
320
+ rtl_dev_err(hdev, "failed to find version instruction");
274321 return -EINVAL;
275322 }
276323
....@@ -281,13 +328,13 @@
281328 }
282329
283330 if (i >= ARRAY_SIZE(project_id_to_lmp_subver)) {
284
- rtl_dev_err(hdev, "unknown project id %d\n", project_id);
331
+ rtl_dev_err(hdev, "unknown project id %d", project_id);
285332 return -EINVAL;
286333 }
287334
288335 if (btrtl_dev->ic_info->lmp_subver !=
289336 project_id_to_lmp_subver[i].lmp_subver) {
290
- rtl_dev_err(hdev, "firmware is for %x but this is a %x\n",
337
+ rtl_dev_err(hdev, "firmware is for %x but this is a %x",
291338 project_id_to_lmp_subver[i].lmp_subver,
292339 btrtl_dev->ic_info->lmp_subver);
293340 return -EINVAL;
....@@ -295,7 +342,7 @@
295342
296343 epatch_info = (struct rtl_epatch_header *)btrtl_dev->fw_data;
297344 if (memcmp(epatch_info->signature, RTL_EPATCH_SIGNATURE, 8) != 0) {
298
- rtl_dev_err(hdev, "bad EPATCH signature\n");
345
+ rtl_dev_err(hdev, "bad EPATCH signature");
299346 return -EINVAL;
300347 }
301348
....@@ -362,6 +409,8 @@
362409 int frag_len = RTL_FRAG_LEN;
363410 int ret = 0;
364411 int i;
412
+ struct sk_buff *skb;
413
+ struct hci_rp_read_local_version *rp;
365414
366415 dl_cmd = kmalloc(sizeof(struct rtl_download_cmd), GFP_KERNEL);
367416 if (!dl_cmd)
....@@ -372,7 +421,11 @@
372421
373422 BT_DBG("download fw (%d/%d)", i, frag_num);
374423
375
- dl_cmd->index = i;
424
+ if (i > 0x7f)
425
+ dl_cmd->index = (i & 0x7f) + 1;
426
+ else
427
+ dl_cmd->index = i;
428
+
376429 if (i == (frag_num - 1)) {
377430 dl_cmd->index |= 0x80; /* data end */
378431 frag_len = fw_len % RTL_FRAG_LEN;
....@@ -383,14 +436,14 @@
383436 skb = __hci_cmd_sync(hdev, 0xfc20, frag_len + 1, dl_cmd,
384437 HCI_INIT_TIMEOUT);
385438 if (IS_ERR(skb)) {
386
- rtl_dev_err(hdev, "download fw command failed (%ld)\n",
439
+ rtl_dev_err(hdev, "download fw command failed (%ld)",
387440 PTR_ERR(skb));
388
- ret = -PTR_ERR(skb);
441
+ ret = PTR_ERR(skb);
389442 goto out;
390443 }
391444
392445 if (skb->len != sizeof(struct rtl_download_response)) {
393
- rtl_dev_err(hdev, "download fw event length mismatch\n");
446
+ rtl_dev_err(hdev, "download fw event length mismatch");
394447 kfree_skb(skb);
395448 ret = -EIO;
396449 goto out;
....@@ -399,6 +452,18 @@
399452 kfree_skb(skb);
400453 data += RTL_FRAG_LEN;
401454 }
455
+
456
+ skb = btrtl_read_local_version(hdev);
457
+ if (IS_ERR(skb)) {
458
+ ret = PTR_ERR(skb);
459
+ rtl_dev_err(hdev, "read local version failed");
460
+ goto out;
461
+ }
462
+
463
+ rp = (struct hci_rp_read_local_version *)skb->data;
464
+ rtl_dev_info(hdev, "fw version 0x%04x%04x",
465
+ __le16_to_cpu(rp->hci_rev), __le16_to_cpu(rp->lmp_subver));
466
+ kfree_skb(skb);
402467
403468 out:
404469 kfree(dl_cmd);
....@@ -410,7 +475,7 @@
410475 const struct firmware *fw;
411476 int ret;
412477
413
- rtl_dev_info(hdev, "rtl: loading %s\n", name);
478
+ rtl_dev_info(hdev, "loading %s", name);
414479 ret = request_firmware(&fw, name, &hdev->dev);
415480 if (ret < 0)
416481 return ret;
....@@ -436,7 +501,7 @@
436501 * (which is only for RTL8723B and newer).
437502 */
438503 if (!memcmp(btrtl_dev->fw_data, RTL_EPATCH_SIGNATURE, 8)) {
439
- rtl_dev_err(hdev, "unexpected EPATCH signature!\n");
504
+ rtl_dev_err(hdev, "unexpected EPATCH signature!");
440505 return -EINVAL;
441506 }
442507
....@@ -471,34 +536,13 @@
471536 fw_data = tbuff;
472537 }
473538
474
- rtl_dev_info(hdev, "cfg_sz %d, total sz %d\n", btrtl_dev->cfg_len, ret);
539
+ rtl_dev_info(hdev, "cfg_sz %d, total sz %d", btrtl_dev->cfg_len, ret);
475540
476541 ret = rtl_download_firmware(hdev, fw_data, ret);
477542
478543 out:
479544 kvfree(fw_data);
480545 return ret;
481
-}
482
-
483
-static struct sk_buff *btrtl_read_local_version(struct hci_dev *hdev)
484
-{
485
- struct sk_buff *skb;
486
-
487
- skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
488
- HCI_INIT_TIMEOUT);
489
- if (IS_ERR(skb)) {
490
- rtl_dev_err(hdev, "HCI_OP_READ_LOCAL_VERSION failed (%ld)\n",
491
- PTR_ERR(skb));
492
- return skb;
493
- }
494
-
495
- if (skb->len != sizeof(struct hci_rp_read_local_version)) {
496
- rtl_dev_err(hdev, "HCI_OP_READ_LOCAL_VERSION event length mismatch\n");
497
- kfree_skb(skb);
498
- return ERR_PTR(-EIO);
499
- }
500
-
501
- return skb;
502546 }
503547
504548 void btrtl_free(struct btrtl_device_info *btrtl_dev)
....@@ -533,7 +577,7 @@
533577 }
534578
535579 resp = (struct hci_rp_read_local_version *)skb->data;
536
- rtl_dev_info(hdev, "rtl: examining hci_ver=%02x hci_rev=%04x lmp_ver=%02x lmp_subver=%04x\n",
580
+ rtl_dev_info(hdev, "examining hci_ver=%02x hci_rev=%04x lmp_ver=%02x lmp_subver=%04x",
537581 resp->hci_ver, resp->hci_rev,
538582 resp->lmp_ver, resp->lmp_subver);
539583
....@@ -546,7 +590,7 @@
546590 hdev->bus);
547591
548592 if (!btrtl_dev->ic_info) {
549
- rtl_dev_info(hdev, "rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x",
593
+ rtl_dev_info(hdev, "unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x",
550594 lmp_subver, hci_rev, hci_ver);
551595 return btrtl_dev;
552596 }
....@@ -560,7 +604,7 @@
560604 btrtl_dev->fw_len = rtl_load_file(hdev, btrtl_dev->ic_info->fw_name,
561605 &btrtl_dev->fw_data);
562606 if (btrtl_dev->fw_len < 0) {
563
- rtl_dev_err(hdev, "firmware file %s not found\n",
607
+ rtl_dev_err(hdev, "firmware file %s not found",
564608 btrtl_dev->ic_info->fw_name);
565609 ret = btrtl_dev->fw_len;
566610 goto err_free;
....@@ -578,7 +622,7 @@
578622 &btrtl_dev->cfg_data);
579623 if (btrtl_dev->ic_info->config_needed &&
580624 btrtl_dev->cfg_len <= 0) {
581
- rtl_dev_err(hdev, "mandatory config file %s not found\n",
625
+ rtl_dev_err(hdev, "mandatory config file %s not found",
582626 btrtl_dev->ic_info->cfg_name);
583627 ret = btrtl_dev->cfg_len;
584628 goto err_free;
....@@ -604,7 +648,7 @@
604648 * to a different value.
605649 */
606650 if (!btrtl_dev->ic_info) {
607
- rtl_dev_info(hdev, "rtl: assuming no firmware upload needed\n");
651
+ rtl_dev_info(hdev, "assuming no firmware upload needed");
608652 return 0;
609653 }
610654
....@@ -618,7 +662,7 @@
618662 case RTL_ROM_LMP_8822B:
619663 return btrtl_setup_rtl8723b(hdev, btrtl_dev);
620664 default:
621
- rtl_dev_info(hdev, "rtl: assuming no firmware upload needed\n");
665
+ rtl_dev_info(hdev, "assuming no firmware upload needed");
622666 return 0;
623667 }
624668 }
....@@ -636,6 +680,11 @@
636680 ret = btrtl_download_firmware(hdev, btrtl_dev);
637681
638682 btrtl_free(btrtl_dev);
683
+
684
+ /* Enable controller to do both LE scan and BR/EDR inquiry
685
+ * simultaneously.
686
+ */
687
+ set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
639688
640689 return ret;
641690 }
....@@ -710,18 +759,18 @@
710759
711760 total_data_len = btrtl_dev->cfg_len - sizeof(*config);
712761 if (total_data_len <= 0) {
713
- rtl_dev_warn(hdev, "no config loaded\n");
762
+ rtl_dev_warn(hdev, "no config loaded");
714763 return -EINVAL;
715764 }
716765
717766 config = (struct rtl_vendor_config *)btrtl_dev->cfg_data;
718767 if (le32_to_cpu(config->signature) != RTL_CONFIG_MAGIC) {
719
- rtl_dev_err(hdev, "invalid config magic\n");
768
+ rtl_dev_err(hdev, "invalid config magic");
720769 return -EINVAL;
721770 }
722771
723772 if (total_data_len < le16_to_cpu(config->total_len)) {
724
- rtl_dev_err(hdev, "config is too short\n");
773
+ rtl_dev_err(hdev, "config is too short");
725774 return -EINVAL;
726775 }
727776
....@@ -731,7 +780,7 @@
731780 switch (le16_to_cpu(entry->offset)) {
732781 case 0xc:
733782 if (entry->len < sizeof(*device_baudrate)) {
734
- rtl_dev_err(hdev, "invalid UART config entry\n");
783
+ rtl_dev_err(hdev, "invalid UART config entry");
735784 return -EINVAL;
736785 }
737786
....@@ -748,22 +797,22 @@
748797 break;
749798
750799 default:
751
- rtl_dev_dbg(hdev, "skipping config entry 0x%x (len %u)\n",
800
+ rtl_dev_dbg(hdev, "skipping config entry 0x%x (len %u)",
752801 le16_to_cpu(entry->offset), entry->len);
753802 break;
754
- };
803
+ }
755804
756805 i += sizeof(*entry) + entry->len;
757806 }
758807
759808 if (!found) {
760
- rtl_dev_err(hdev, "no UART config entry found\n");
809
+ rtl_dev_err(hdev, "no UART config entry found");
761810 return -ENOENT;
762811 }
763812
764
- rtl_dev_dbg(hdev, "device baudrate = 0x%08x\n", *device_baudrate);
765
- rtl_dev_dbg(hdev, "controller baudrate = %u\n", *controller_baudrate);
766
- rtl_dev_dbg(hdev, "flow control %d\n", *flow_control);
813
+ rtl_dev_dbg(hdev, "device baudrate = 0x%08x", *device_baudrate);
814
+ rtl_dev_dbg(hdev, "controller baudrate = %u", *controller_baudrate);
815
+ rtl_dev_dbg(hdev, "flow control %d", *flow_control);
767816
768817 return 0;
769818 }