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 set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); 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 <ytkim@qca.qualcomm.com>"); 1031 MODULE_DESCRIPTION("Bluetooth support for Qualcomm Atheros family"); 1032 MODULE_LICENSE("GPL"); 1033