Lines Matching +full:firmware +full:- +full:reset
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #include <linux/firmware.h>
70 if (skb->len != sizeof(*bda)) { in btintel_check_bdaddr()
73 return -EIO; in btintel_check_bdaddr()
76 bda = (struct hci_rp_read_bd_addr *)skb->data; in btintel_check_bdaddr()
83 if (!bacmp(&bda->bdaddr, BDADDR_INTEL)) { in btintel_check_bdaddr()
85 &bda->bdaddr); in btintel_check_bdaddr()
86 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_check_bdaddr()
112 int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched) in btintel_exit_mfg() argument
119 * 0x01: Disable manufacturing mode and reset with patches deactivated. in btintel_exit_mfg()
120 * 0x02: Disable manufacturing mode and reset with patches activated. in btintel_exit_mfg()
122 if (reset) in btintel_exit_mfg()
194 if (err == -ENODATA) in btintel_set_diag()
251 bt_dev_err(hdev, "Reset after hardware error failed (%ld)", in btintel_hw_error()
264 if (skb->len != 13) { in btintel_hw_error()
270 bt_dev_err(hdev, "Exception info %s", (char *)(skb->data + 1)); in btintel_hw_error()
283 if (ver->hw_platform != 0x37) { in btintel_version_info()
285 ver->hw_platform); in btintel_version_info()
286 return -EINVAL; in btintel_version_info()
289 /* Check for supported iBT hardware variants of this firmware in btintel_version_info()
295 switch (ver->hw_variant) { in btintel_version_info()
296 case 0x07: /* WP - Legacy ROM */ in btintel_version_info()
297 case 0x08: /* StP - Legacy ROM */ in btintel_version_info()
307 ver->hw_variant); in btintel_version_info()
308 return -EINVAL; in btintel_version_info()
311 switch (ver->fw_variant) { in btintel_version_info()
322 variant = "Firmware"; in btintel_version_info()
325 bt_dev_err(hdev, "Unsupported firmware variant(%02x)", ver->fw_variant); in btintel_version_info()
326 return -EINVAL; in btintel_version_info()
329 coredump_info.hw_variant = ver->hw_variant; in btintel_version_info()
330 coredump_info.fw_build_num = ver->fw_build_num; in btintel_version_info()
333 variant, ver->fw_revision >> 4, ver->fw_revision & 0x0f, in btintel_version_info()
334 ver->fw_build_num, ver->fw_build_ww, in btintel_version_info()
335 2000 + ver->fw_build_yy); in btintel_version_info()
358 plen -= fragment_len; in btintel_secure_send()
367 const struct firmware *fw; in btintel_load_ddc_config()
372 err = request_firmware_direct(&fw, ddc_name, &hdev->dev); in btintel_load_ddc_config()
381 fw_ptr = fw->data; in btintel_load_ddc_config()
384 * Length (1 byte), DDC ID (2 bytes), and DDC value (Length - 2). in btintel_load_ddc_config()
386 while (fw->size > fw_ptr - fw->data) { in btintel_load_ddc_config()
439 if (!skb || skb->len != sizeof(*ver)) { in btintel_read_version()
442 return -EILSEQ; in btintel_read_version()
445 memcpy(ver, skb->data, sizeof(*ver)); in btintel_read_version()
461 if (INTEL_HW_PLATFORM(version->cnvi_bt) != 0x37) { in btintel_version_info_tlv()
463 INTEL_HW_PLATFORM(version->cnvi_bt)); in btintel_version_info_tlv()
464 return -EINVAL; in btintel_version_info_tlv()
467 /* Check for supported iBT hardware variants of this firmware in btintel_version_info_tlv()
473 switch (INTEL_HW_VARIANT(version->cnvi_bt)) { in btintel_version_info_tlv()
476 case 0x19: /* Slr-F */ in btintel_version_info_tlv()
484 INTEL_HW_VARIANT(version->cnvi_bt)); in btintel_version_info_tlv()
485 return -EINVAL; in btintel_version_info_tlv()
488 switch (version->img_type) { in btintel_version_info_tlv()
491 /* It is required that every single firmware fragment is acknowledged in btintel_version_info_tlv()
495 if (version->limited_cce != 0x00) { in btintel_version_info_tlv()
496 bt_dev_err(hdev, "Unsupported Intel firmware loading method (0x%x)", in btintel_version_info_tlv()
497 version->limited_cce); in btintel_version_info_tlv()
498 return -EINVAL; in btintel_version_info_tlv()
502 if (version->sbe_type > 0x01) { in btintel_version_info_tlv()
504 version->sbe_type); in btintel_version_info_tlv()
505 return -EINVAL; in btintel_version_info_tlv()
508 bt_dev_info(hdev, "Device revision is %u", version->dev_rev_id); in btintel_version_info_tlv()
510 str_enabled_disabled(version->secure_boot)); in btintel_version_info_tlv()
512 str_enabled_disabled(version->otp_lock)); in btintel_version_info_tlv()
514 str_enabled_disabled(version->api_lock)); in btintel_version_info_tlv()
516 str_enabled_disabled(version->debug_lock)); in btintel_version_info_tlv()
517 bt_dev_info(hdev, "Minimum firmware build %u week %u %u", in btintel_version_info_tlv()
518 version->min_fw_build_nn, version->min_fw_build_cw, in btintel_version_info_tlv()
519 2000 + version->min_fw_build_yy); in btintel_version_info_tlv()
525 variant = "Firmware"; in btintel_version_info_tlv()
528 bt_dev_err(hdev, "Unsupported image type(%02x)", version->img_type); in btintel_version_info_tlv()
529 return -EINVAL; in btintel_version_info_tlv()
532 coredump_info.hw_variant = INTEL_HW_VARIANT(version->cnvi_bt); in btintel_version_info_tlv()
533 coredump_info.fw_build_num = version->build_num; in btintel_version_info_tlv()
536 2000 + (version->timestamp >> 8), version->timestamp & 0xff, in btintel_version_info_tlv()
537 version->build_type, version->build_num); in btintel_version_info_tlv()
538 if (version->img_type == BTINTEL_IMG_OP) in btintel_version_info_tlv()
539 bt_dev_info(hdev, "Firmware SHA1: 0x%8.8x", version->git_sha1); in btintel_version_info_tlv()
557 while (skb->len) { in btintel_parse_version_tlv()
561 if (skb->len < sizeof(*tlv)) in btintel_parse_version_tlv()
562 return -EINVAL; in btintel_parse_version_tlv()
564 tlv = (struct intel_tlv *)skb->data; in btintel_parse_version_tlv()
567 if (skb->len < tlv->len + sizeof(*tlv)) in btintel_parse_version_tlv()
568 return -EINVAL; in btintel_parse_version_tlv()
570 switch (tlv->type) { in btintel_parse_version_tlv()
572 version->cnvi_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
575 version->cnvr_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
578 version->cnvi_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
581 version->cnvr_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
584 version->dev_rev_id = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
587 version->img_type = tlv->val[0]; in btintel_parse_version_tlv()
590 /* If image type is Operational firmware (0x03), then in btintel_parse_version_tlv()
594 version->min_fw_build_cw = tlv->val[0]; in btintel_parse_version_tlv()
595 version->min_fw_build_yy = tlv->val[1]; in btintel_parse_version_tlv()
596 version->timestamp = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
599 version->build_type = tlv->val[0]; in btintel_parse_version_tlv()
602 /* If image type is Operational firmware (0x03), then in btintel_parse_version_tlv()
606 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
607 version->build_num = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
610 version->secure_boot = tlv->val[0]; in btintel_parse_version_tlv()
613 version->otp_lock = tlv->val[0]; in btintel_parse_version_tlv()
616 version->api_lock = tlv->val[0]; in btintel_parse_version_tlv()
619 version->debug_lock = tlv->val[0]; in btintel_parse_version_tlv()
622 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
623 version->min_fw_build_cw = tlv->val[1]; in btintel_parse_version_tlv()
624 version->min_fw_build_yy = tlv->val[2]; in btintel_parse_version_tlv()
627 version->limited_cce = tlv->val[0]; in btintel_parse_version_tlv()
630 version->sbe_type = tlv->val[0]; in btintel_parse_version_tlv()
633 memcpy(&version->otp_bd_addr, tlv->val, in btintel_parse_version_tlv()
637 version->git_sha1 = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
640 snprintf(version->fw_id, sizeof(version->fw_id), in btintel_parse_version_tlv()
641 "%s", tlv->val); in btintel_parse_version_tlv()
648 skb_pull(skb, tlv->len + sizeof(*tlv)); in btintel_parse_version_tlv()
662 return -EINVAL; in btintel_read_version_tlv()
671 if (skb->data[0]) { in btintel_read_version_tlv()
673 skb->data[0]); in btintel_read_version_tlv()
675 return -EIO; in btintel_read_version_tlv()
684 /* ------- REGMAP IBT SUPPORT ------- */
719 return -EINVAL; in regmap_ibt_read()
732 return -EINVAL; in regmap_ibt_read()
735 /* regmap provides a little-endian formatted addr */ in regmap_ibt_read()
739 bt_dev_dbg(ctx->hdev, "Register (0x%x) read", le32_to_cpu(cp.addr)); in regmap_ibt_read()
741 skb = hci_cmd_sync(ctx->hdev, ctx->op_read, sizeof(cp), &cp, in regmap_ibt_read()
745 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error (%d)", in regmap_ibt_read()
750 if (skb->len != sizeof(*rp) + val_size) { in regmap_ibt_read()
751 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad len", in regmap_ibt_read()
753 err = -EINVAL; in regmap_ibt_read()
757 rp = (struct ibt_rp_reg_access *)skb->data; in regmap_ibt_read()
759 if (rp->addr != cp.addr) { in regmap_ibt_read()
760 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad addr", in regmap_ibt_read()
761 le32_to_cpu(rp->addr)); in regmap_ibt_read()
762 err = -EINVAL; in regmap_ibt_read()
766 memcpy(val, rp->data, val_size); in regmap_ibt_read()
785 return -EINVAL; in regmap_ibt_gather_write()
798 return -EINVAL; in regmap_ibt_gather_write()
803 return -ENOMEM; in regmap_ibt_gather_write()
805 /* regmap provides a little-endian formatted addr/value */ in regmap_ibt_gather_write()
806 cp->addr = *(__le32 *)addr; in regmap_ibt_gather_write()
807 cp->mode = mode; in regmap_ibt_gather_write()
808 cp->len = val_size; in regmap_ibt_gather_write()
809 memcpy(&cp->data, val, val_size); in regmap_ibt_gather_write()
811 bt_dev_dbg(ctx->hdev, "Register (0x%x) write", le32_to_cpu(cp->addr)); in regmap_ibt_gather_write()
813 skb = hci_cmd_sync(ctx->hdev, ctx->op_write, plen, cp, HCI_CMD_TIMEOUT); in regmap_ibt_gather_write()
816 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) write error (%d)", in regmap_ibt_gather_write()
817 le32_to_cpu(cp->addr), err); in regmap_ibt_gather_write()
833 return -EINVAL; in regmap_ibt_write()
835 return regmap_ibt_gather_write(context, data, 4, data + 4, count - 4); in regmap_ibt_write()
864 bt_dev_info(hdev, "regmap: Init R%x-W%x region", opcode_read, in btintel_regmap_init()
869 return ERR_PTR(-ENOMEM); in btintel_regmap_init()
871 ctx->op_read = opcode_read; in btintel_regmap_init()
872 ctx->op_write = opcode_write; in btintel_regmap_init()
873 ctx->hdev = hdev; in btintel_regmap_init()
875 return regmap_init(&hdev->dev, ®map_ibt, ctx, ®map_ibt_cfg); in btintel_regmap_init()
889 bt_dev_err(hdev, "Failed to send Intel Reset command"); in btintel_send_intel_reset()
911 if (skb->len != sizeof(*params)) { in btintel_read_boot_params()
914 return -EILSEQ; in btintel_read_boot_params()
917 memcpy(params, skb->data, sizeof(*params)); in btintel_read_boot_params()
921 if (params->status) { in btintel_read_boot_params()
923 params->status); in btintel_read_boot_params()
924 return -bt_to_errno(params->status); in btintel_read_boot_params()
928 le16_to_cpu(params->dev_revid)); in btintel_read_boot_params()
931 str_enabled_disabled(params->secure_boot)); in btintel_read_boot_params()
934 str_enabled_disabled(params->otp_lock)); in btintel_read_boot_params()
937 str_enabled_disabled(params->api_lock)); in btintel_read_boot_params()
940 str_enabled_disabled(params->debug_lock)); in btintel_read_boot_params()
942 bt_dev_info(hdev, "Minimum firmware build %u week %u %u", in btintel_read_boot_params()
943 params->min_fw_build_nn, params->min_fw_build_cw, in btintel_read_boot_params()
944 2000 + params->min_fw_build_yy); in btintel_read_boot_params()
951 const struct firmware *fw) in btintel_sfi_rsa_header_secure_send()
955 /* Start the firmware download transaction with the Init fragment in btintel_sfi_rsa_header_secure_send()
958 err = btintel_secure_send(hdev, 0x00, 128, fw->data); in btintel_sfi_rsa_header_secure_send()
960 bt_dev_err(hdev, "Failed to send firmware header (%d)", err); in btintel_sfi_rsa_header_secure_send()
964 /* Send the 256 bytes of public key information from the firmware in btintel_sfi_rsa_header_secure_send()
967 err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); in btintel_sfi_rsa_header_secure_send()
969 bt_dev_err(hdev, "Failed to send firmware pkey (%d)", err); in btintel_sfi_rsa_header_secure_send()
973 /* Send the 256 bytes of signature information from the firmware in btintel_sfi_rsa_header_secure_send()
976 err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); in btintel_sfi_rsa_header_secure_send()
978 bt_dev_err(hdev, "Failed to send firmware signature (%d)", err); in btintel_sfi_rsa_header_secure_send()
987 const struct firmware *fw) in btintel_sfi_ecdsa_header_secure_send()
991 /* Start the firmware download transaction with the Init fragment in btintel_sfi_ecdsa_header_secure_send()
994 err = btintel_secure_send(hdev, 0x00, 128, fw->data + 644); in btintel_sfi_ecdsa_header_secure_send()
996 bt_dev_err(hdev, "Failed to send firmware header (%d)", err); in btintel_sfi_ecdsa_header_secure_send()
1000 /* Send the 96 bytes of public key information from the firmware in btintel_sfi_ecdsa_header_secure_send()
1003 err = btintel_secure_send(hdev, 0x03, 96, fw->data + 644 + 128); in btintel_sfi_ecdsa_header_secure_send()
1005 bt_dev_err(hdev, "Failed to send firmware pkey (%d)", err); in btintel_sfi_ecdsa_header_secure_send()
1009 /* Send the 96 bytes of signature information from the firmware in btintel_sfi_ecdsa_header_secure_send()
1012 err = btintel_secure_send(hdev, 0x02, 96, fw->data + 644 + 224); in btintel_sfi_ecdsa_header_secure_send()
1014 bt_dev_err(hdev, "Failed to send firmware signature (%d)", in btintel_sfi_ecdsa_header_secure_send()
1022 const struct firmware *fw, in btintel_download_firmware_payload()
1029 fw_ptr = fw->data + offset; in btintel_download_firmware_payload()
1031 err = -EINVAL; in btintel_download_firmware_payload()
1033 while (fw_ptr - fw->data < fw->size) { in btintel_download_firmware_payload()
1036 frag_len += sizeof(*cmd) + cmd->plen; in btintel_download_firmware_payload()
1039 * a 4 byte alignment. It happens so that the firmware file in btintel_download_firmware_payload()
1044 * firmware data buffer as a single Data fragment. in btintel_download_firmware_payload()
1050 "Failed to send firmware data (%d)", in btintel_download_firmware_payload()
1066 const struct firmware *fw, in btintel_firmware_version()
1071 fw_ptr = fw->data; in btintel_firmware_version()
1073 while (fw_ptr - fw->data < fw->size) { in btintel_firmware_version()
1076 /* Each SKU has a different reset parameter to use in the in btintel_firmware_version()
1077 * HCI_Intel_Reset command and it is embedded in the firmware in btintel_firmware_version()
1079 * the firmware data and save it for later use. in btintel_firmware_version()
1081 if (le16_to_cpu(cmd->opcode) == CMD_WRITE_BOOT_PARAMS) { in btintel_firmware_version()
1086 *boot_addr = le32_to_cpu(params->boot_addr); in btintel_firmware_version()
1090 bt_dev_info(hdev, "Firmware Version: %u-%u.%u", in btintel_firmware_version()
1091 params->fw_build_num, params->fw_build_ww, in btintel_firmware_version()
1092 params->fw_build_yy); in btintel_firmware_version()
1094 return (num == params->fw_build_num && in btintel_firmware_version()
1095 ww == params->fw_build_ww && in btintel_firmware_version()
1096 yy == params->fw_build_yy); in btintel_firmware_version()
1099 fw_ptr += sizeof(*cmd) + cmd->plen; in btintel_firmware_version()
1107 const struct firmware *fw, in btintel_download_firmware()
1112 /* SfP and WsP don't seem to update the firmware version on file in btintel_download_firmware()
1115 switch (ver->hw_variant) { in btintel_download_firmware()
1122 /* Skip download if firmware has the same version */ in btintel_download_firmware()
1123 if (btintel_firmware_version(hdev, ver->fw_build_num, in btintel_download_firmware()
1124 ver->fw_build_ww, ver->fw_build_yy, in btintel_download_firmware()
1126 bt_dev_info(hdev, "Firmware already loaded"); in btintel_download_firmware()
1127 /* Return -EALREADY to indicate that the firmware has in btintel_download_firmware()
1130 return -EALREADY; in btintel_download_firmware()
1134 /* The firmware variant determines if the device is in bootloader in btintel_download_firmware()
1135 * mode or is running operational firmware. The value 0x06 identifies in btintel_download_firmware()
1137 * firmware. in btintel_download_firmware()
1139 * If the firmware version has changed that means it needs to be reset in btintel_download_firmware()
1140 * to bootloader when operational so the new firmware can be loaded. in btintel_download_firmware()
1142 if (ver->fw_variant == 0x23) in btintel_download_firmware()
1143 return -EINVAL; in btintel_download_firmware()
1155 const struct firmware *fw, u32 *boot_param, in btintel_download_fw_tlv()
1161 /* Skip download if firmware has the same version */ in btintel_download_fw_tlv()
1162 if (btintel_firmware_version(hdev, ver->min_fw_build_nn, in btintel_download_fw_tlv()
1163 ver->min_fw_build_cw, in btintel_download_fw_tlv()
1164 ver->min_fw_build_yy, in btintel_download_fw_tlv()
1166 bt_dev_info(hdev, "Firmware already loaded"); in btintel_download_fw_tlv()
1167 /* Return -EALREADY to indicate that firmware has in btintel_download_fw_tlv()
1170 return -EALREADY; in btintel_download_fw_tlv()
1173 /* The firmware variant determines if the device is in bootloader in btintel_download_fw_tlv()
1174 * mode or is running operational firmware. The value 0x01 identifies in btintel_download_fw_tlv()
1176 * firmware. in btintel_download_fw_tlv()
1178 * If the firmware version has changed that means it needs to be reset in btintel_download_fw_tlv()
1179 * to bootloader when operational so the new firmware can be loaded. in btintel_download_fw_tlv()
1181 if (ver->img_type == BTINTEL_IMG_OP) in btintel_download_fw_tlv()
1182 return -EINVAL; in btintel_download_fw_tlv()
1196 css_header_ver = get_unaligned_le32(fw->data + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1199 return -EINVAL; in btintel_download_fw_tlv()
1206 return -EINVAL; in btintel_download_fw_tlv()
1218 if (fw->data[ECDSA_OFFSET] != 0x06) in btintel_download_fw_tlv()
1219 return -EINVAL; in btintel_download_fw_tlv()
1222 css_header_ver = get_unaligned_le32(fw->data + ECDSA_OFFSET + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1225 return -EINVAL; in btintel_download_fw_tlv()
1256 /* PCIe transport uses shared hardware reset mechanism for recovery in btintel_reset_to_bootloader()
1259 if (hdev->bus == HCI_PCI) in btintel_reset_to_bootloader()
1262 /* Send Intel Reset command. This will result in in btintel_reset_to_bootloader()
1263 * re-enumeration of BT controller. in btintel_reset_to_bootloader()
1265 * Intel Reset parameter description: in btintel_reset_to_bootloader()
1266 * reset_type : 0x00 (Soft reset), in btintel_reset_to_bootloader()
1267 * 0x01 (Hard reset) in btintel_reset_to_bootloader()
1291 bt_dev_info(hdev, "Intel reset sent to retry FW download"); in btintel_reset_to_bootloader()
1294 /* Current Intel BT controllers(ThP/JfP) hold the USB reset in btintel_reset_to_bootloader()
1295 * lines for 2ms when it receives Intel Reset in bootloader mode. in btintel_reset_to_bootloader()
1296 * Whereas, the upcoming Intel BT controllers will hold USB reset in btintel_reset_to_bootloader()
1308 /* Intel controller supports two pages, each page is of 128-bit in btintel_read_debug_features()
1319 if (skb->len != (sizeof(features->page1) + 3)) { in btintel_read_debug_features()
1322 return -EILSEQ; in btintel_read_debug_features()
1325 memcpy(features->page1, skb->data + 3, sizeof(features->page1)); in btintel_read_debug_features()
1344 return -EINVAL; in btintel_set_debug_features()
1347 if (!(features->page1[0] & 0x3f)) { in btintel_set_debug_features()
1392 return -EINVAL; in btintel_reset_debug_features()
1395 if (!(features->page1[0] & 0x3f)) { in btintel_reset_debug_features()
1417 bt_dev_info(hdev, "reset debug features: trace_enable 0x%02x mask 0x%02x", in btintel_reset_debug_features()
1437 /* Set or reset the debug features. */ in btintel_set_quality_report()
1468 snprintf(buf, sizeof(buf), "Firmware Version: 0x%X\n", in btintel_dmp_hdr()
1492 return -EOPNOTSUPP; in btintel_register_devcoredump_support()
1500 static const struct firmware *btintel_legacy_rom_get_fw(struct hci_dev *hdev, in btintel_legacy_rom_get_fw()
1503 const struct firmware *fw; in btintel_legacy_rom_get_fw()
1508 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq", in btintel_legacy_rom_get_fw()
1509 ver->hw_platform, ver->hw_variant, ver->hw_revision, in btintel_legacy_rom_get_fw()
1510 ver->fw_variant, ver->fw_revision, ver->fw_build_num, in btintel_legacy_rom_get_fw()
1511 ver->fw_build_ww, ver->fw_build_yy); in btintel_legacy_rom_get_fw()
1513 ret = request_firmware(&fw, fwname, &hdev->dev); in btintel_legacy_rom_get_fw()
1515 if (ret == -EINVAL) { in btintel_legacy_rom_get_fw()
1516 bt_dev_err(hdev, "Intel firmware file request failed (%d)", in btintel_legacy_rom_get_fw()
1521 bt_dev_err(hdev, "failed to open Intel firmware file: %s (%d)", in btintel_legacy_rom_get_fw()
1524 /* If the correct firmware patch file is not found, use the in btintel_legacy_rom_get_fw()
1525 * default firmware patch file instead in btintel_legacy_rom_get_fw()
1527 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq", in btintel_legacy_rom_get_fw()
1528 ver->hw_platform, ver->hw_variant); in btintel_legacy_rom_get_fw()
1529 if (request_firmware(&fw, fwname, &hdev->dev) < 0) { in btintel_legacy_rom_get_fw()
1536 bt_dev_info(hdev, "Intel Bluetooth firmware file: %s", fwname); in btintel_legacy_rom_get_fw()
1542 const struct firmware *fw, in btintel_legacy_rom_patching()
1550 int remain = fw->size - (*fw_ptr - fw->data); in btintel_legacy_rom_patching()
1554 * in the current firmware buffer doesn't start with 0x01 or in btintel_legacy_rom_patching()
1556 * the firmware file is corrupted and it should stop the patching in btintel_legacy_rom_patching()
1561 return -EINVAL; in btintel_legacy_rom_patching()
1564 remain--; in btintel_legacy_rom_patching()
1568 remain -= sizeof(*cmd); in btintel_legacy_rom_patching()
1570 /* Ensure that the remain firmware data is long enough than the length in btintel_legacy_rom_patching()
1571 * of command parameter. If not, the firmware file is corrupted. in btintel_legacy_rom_patching()
1573 if (remain < cmd->plen) { in btintel_legacy_rom_patching()
1575 return -EFAULT; in btintel_legacy_rom_patching()
1578 /* If there is a command that loads a patch in the firmware in btintel_legacy_rom_patching()
1581 * is not required when the default firmware patch file is used in btintel_legacy_rom_patching()
1584 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e) in btintel_legacy_rom_patching()
1588 *fw_ptr += cmd->plen; in btintel_legacy_rom_patching()
1589 remain -= cmd->plen; in btintel_legacy_rom_patching()
1600 remain--; in btintel_legacy_rom_patching()
1604 remain -= sizeof(*evt); in btintel_legacy_rom_patching()
1606 if (remain < evt->plen) { in btintel_legacy_rom_patching()
1608 return -EFAULT; in btintel_legacy_rom_patching()
1612 *fw_ptr += evt->plen; in btintel_legacy_rom_patching()
1613 remain -= evt->plen; in btintel_legacy_rom_patching()
1616 /* Every HCI commands in the firmware file has its correspond event. in btintel_legacy_rom_patching()
1617 * If event is not found or remain is smaller than zero, the firmware in btintel_legacy_rom_patching()
1622 return -EFAULT; in btintel_legacy_rom_patching()
1625 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen, in btintel_legacy_rom_patching()
1626 cmd_param, evt->evt, HCI_INIT_TIMEOUT); in btintel_legacy_rom_patching()
1629 cmd->opcode, PTR_ERR(skb)); in btintel_legacy_rom_patching()
1634 * the firmware file. At fist, it checks the length and then in btintel_legacy_rom_patching()
1637 if (skb->len != evt->plen) { in btintel_legacy_rom_patching()
1639 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1641 return -EFAULT; in btintel_legacy_rom_patching()
1644 if (memcmp(skb->data, evt_param, evt->plen)) { in btintel_legacy_rom_patching()
1646 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1648 return -EFAULT; in btintel_legacy_rom_patching()
1658 const struct firmware *fw; in btintel_legacy_rom_setup()
1663 BT_DBG("%s", hdev->name); in btintel_legacy_rom_setup()
1669 if (ver->fw_patch_num) { in btintel_legacy_rom_setup()
1672 ver->fw_patch_num); in btintel_legacy_rom_setup()
1676 /* Opens the firmware patch file based on the firmware version read in btintel_legacy_rom_setup()
1677 * from the controller. If it fails to open the matching firmware in btintel_legacy_rom_setup()
1678 * patch file, it tries to open the default firmware patch file. in btintel_legacy_rom_setup()
1685 fw_ptr = fw->data; in btintel_legacy_rom_setup()
1689 * firmware patch data and configuration parameters. in btintel_legacy_rom_setup()
1699 /* The firmware data file consists of list of Intel specific HCI in btintel_legacy_rom_setup()
1703 * It reads the command and its expected event from the firmware file, in btintel_legacy_rom_setup()
1705 * the returned event is compared with the event read from the firmware in btintel_legacy_rom_setup()
1709 * Once the firmware patching is completed successfully, in btintel_legacy_rom_setup()
1710 * the manufacturer mode is disabled with reset and activating the in btintel_legacy_rom_setup()
1713 * If the firmware patching fails, the manufacturer mode is in btintel_legacy_rom_setup()
1714 * disabled with reset and deactivating the patch. in btintel_legacy_rom_setup()
1716 * If the default patch file is used, no reset is done when disabling in btintel_legacy_rom_setup()
1719 while (fw->size > fw_ptr - fw->data) { in btintel_legacy_rom_setup()
1734 * with reset and activate the downloaded firmware patches. in btintel_legacy_rom_setup()
1741 * every power-on boot in btintel_legacy_rom_setup()
1753 /* Disable the manufacturer mode without reset */ in btintel_legacy_rom_setup()
1758 bt_dev_info(hdev, "Intel firmware patch completed"); in btintel_legacy_rom_setup()
1765 /* Patching failed. Disable the manufacturer mode with reset and in btintel_legacy_rom_setup()
1766 * deactivate the downloaded firmware patches. in btintel_legacy_rom_setup()
1772 bt_dev_info(hdev, "Intel firmware patch completed and deactivated"); in btintel_legacy_rom_setup()
1793 bt_dev_info(hdev, "Waiting for firmware download to complete"); in btintel_download_wait()
1798 if (err == -EINTR) { in btintel_download_wait()
1799 bt_dev_err(hdev, "Firmware loading interrupted"); in btintel_download_wait()
1804 bt_dev_err(hdev, "Firmware loading timeout"); in btintel_download_wait()
1805 return -ETIMEDOUT; in btintel_download_wait()
1809 bt_dev_err(hdev, "Firmware loading failed"); in btintel_download_wait()
1810 return -ENOEXEC; in btintel_download_wait()
1817 bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration); in btintel_download_wait()
1833 if (err == -EINTR) { in btintel_boot_wait()
1835 return -EINTR; in btintel_boot_wait()
1840 return -ETIMEDOUT; in btintel_boot_wait()
1864 if (err == -EINTR) { in btintel_boot_wait_d0()
1866 return -EINTR; in btintel_boot_wait_d0()
1871 return -ETIMEDOUT; in btintel_boot_wait_d0()
1895 bt_dev_err(hdev, "Intel Soft Reset failed (%d)", err); in btintel_boot()
1901 * is done by the operational firmware sending bootup notification. in btintel_boot()
1903 * Booting into operational firmware should not take longer than in btintel_boot()
1908 if (err == -ETIMEDOUT) { in btintel_boot()
1913 if (hdev->bus == HCI_PCI) { in btintel_boot()
1917 * Firmware acks with alive interrupt indicating host is full ready to in btintel_boot()
1934 switch (ver->hw_variant) { in btintel_get_fw_name()
1937 snprintf(fw_name, len, "intel/ibt-%u-%u.%s", in btintel_get_fw_name()
1938 ver->hw_variant, in btintel_get_fw_name()
1939 le16_to_cpu(params->dev_revid), in btintel_get_fw_name()
1946 snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s", in btintel_get_fw_name()
1947 ver->hw_variant, in btintel_get_fw_name()
1948 ver->hw_revision, in btintel_get_fw_name()
1949 ver->fw_revision, in btintel_get_fw_name()
1953 return -EINVAL; in btintel_get_fw_name()
1964 const struct firmware *fw; in btintel_download_fw()
1970 return -EINVAL; in btintel_download_fw()
1972 /* The firmware variant determines if the device is in bootloader in btintel_download_fw()
1973 * mode or is running operational firmware. The value 0x06 identifies in btintel_download_fw()
1975 * firmware. in btintel_download_fw()
1977 * When the operational firmware is already present, then only in btintel_download_fw()
1985 if (ver->fw_variant == 0x23) { in btintel_download_fw()
1989 /* SfP and WsP don't seem to update the firmware version on file in btintel_download_fw()
1992 switch (ver->hw_variant) { in btintel_download_fw()
2009 /* It is required that every single firmware fragment is acknowledged in btintel_download_fw()
2013 if (params->limited_cce != 0x00) { in btintel_download_fw()
2014 bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)", in btintel_download_fw()
2015 params->limited_cce); in btintel_download_fw()
2016 return -EINVAL; in btintel_download_fw()
2020 * also be no valid address for the operational firmware. in btintel_download_fw()
2022 if (!bacmp(¶ms->otp_bdaddr, BDADDR_ANY)) { in btintel_download_fw()
2024 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_download_fw()
2029 * revision information are used to select the right firmware for SfP in btintel_download_fw()
2032 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi. in btintel_download_fw()
2045 * The firmware file name for these will be in btintel_download_fw()
2046 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi. in btintel_download_fw()
2052 /* Firmware has already been loaded */ in btintel_download_fw()
2057 bt_dev_err(hdev, "Unsupported Intel firmware naming"); in btintel_download_fw()
2058 return -EINVAL; in btintel_download_fw()
2061 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_download_fw()
2064 /* Firmware has already been loaded */ in btintel_download_fw()
2069 bt_dev_err(hdev, "Failed to load Intel firmware file %s (%d)", in btintel_download_fw()
2074 bt_dev_info(hdev, "Found device firmware: %s", fwname); in btintel_download_fw()
2076 if (fw->size < 644) { in btintel_download_fw()
2077 bt_dev_err(hdev, "Invalid size of firmware file (%zu)", in btintel_download_fw()
2078 fw->size); in btintel_download_fw()
2079 err = -EBADF; in btintel_download_fw()
2087 /* Start firmware downloading and get boot parameter */ in btintel_download_fw()
2090 if (err == -EALREADY) { in btintel_download_fw()
2091 /* Firmware has already been loaded */ in btintel_download_fw()
2097 /* When FW download fails, send Intel Reset to retry in btintel_download_fw()
2105 * booting the loaded firmware, wait for the bootloader notification in btintel_download_fw()
2111 * The firmware loading should not take longer than 5 seconds in btintel_download_fw()
2116 if (err == -ETIMEDOUT) in btintel_download_fw()
2133 BT_DBG("%s", hdev->name); in btintel_bootloader_setup()
2137 * command while downloading the firmware. in btintel_bootloader_setup()
2147 /* controller is already having an operational firmware */ in btintel_bootloader_setup()
2148 if (ver->fw_variant == 0x23) in btintel_bootloader_setup()
2161 bt_dev_err(hdev, "Unsupported Intel firmware naming"); in btintel_bootloader_setup()
2201 cnvi = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), in btintel_get_fw_name_tlv()
2202 INTEL_CNVX_TOP_STEP(ver->cnvi_top)); in btintel_get_fw_name_tlv()
2204 cnvr = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), in btintel_get_fw_name_tlv()
2205 INTEL_CNVX_TOP_STEP(ver->cnvr_top)); in btintel_get_fw_name_tlv()
2210 if (INTEL_HW_VARIANT(ver->cnvi_bt) >= 0x1e) { in btintel_get_fw_name_tlv()
2213 if (ver->img_type == BTINTEL_IMG_BOOTLOADER) { in btintel_get_fw_name_tlv()
2214 format = "intel/ibt-%04x-%04x-iml.%s"; in btintel_get_fw_name_tlv()
2221 /* ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step-fw_id> */ in btintel_get_fw_name_tlv()
2222 if (memcmp(ver->fw_id, zero, sizeof(zero))) { in btintel_get_fw_name_tlv()
2223 format = "intel/ibt-%04x-%04x-%s.%s"; in btintel_get_fw_name_tlv()
2225 ver->fw_id, suffix); in btintel_get_fw_name_tlv()
2228 /* If firmware id is not present, fallback to legacy naming in btintel_get_fw_name_tlv()
2233 * ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step> in btintel_get_fw_name_tlv()
2235 format = "intel/ibt-%04x-%04x.%s"; in btintel_get_fw_name_tlv()
2246 cnvi = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), in btintel_get_iml_tlv()
2247 INTEL_CNVX_TOP_STEP(ver->cnvi_top)); in btintel_get_iml_tlv()
2249 cnvr = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), in btintel_get_iml_tlv()
2250 INTEL_CNVX_TOP_STEP(ver->cnvr_top)); in btintel_get_iml_tlv()
2252 format = "intel/ibt-%04x-%04x-iml.%s"; in btintel_get_iml_tlv()
2260 const struct firmware *fw; in btintel_prepare_fw_download_tlv()
2266 return -EINVAL; in btintel_prepare_fw_download_tlv()
2268 /* The firmware variant determines if the device is in bootloader in btintel_prepare_fw_download_tlv()
2269 * mode or is running operational firmware. The value 0x03 identifies in btintel_prepare_fw_download_tlv()
2271 * firmware. in btintel_prepare_fw_download_tlv()
2273 * When the operational firmware is already present, then only in btintel_prepare_fw_download_tlv()
2281 if (ver->img_type == BTINTEL_IMG_OP) { in btintel_prepare_fw_download_tlv()
2290 if (!bacmp(&ver->otp_bd_addr, BDADDR_ANY)) { in btintel_prepare_fw_download_tlv()
2292 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_prepare_fw_download_tlv()
2296 if (ver->img_type == BTINTEL_IMG_OP) { in btintel_prepare_fw_download_tlv()
2299 * firmware image which doesn't exist. Lets compare the version in btintel_prepare_fw_download_tlv()
2302 if (INTEL_HW_VARIANT(ver->cnvi_bt) >= 0x1e) in btintel_prepare_fw_download_tlv()
2310 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_prepare_fw_download_tlv()
2313 /* Firmware has already been loaded */ in btintel_prepare_fw_download_tlv()
2318 bt_dev_err(hdev, "Failed to load Intel firmware file %s (%d)", in btintel_prepare_fw_download_tlv()
2324 bt_dev_info(hdev, "Found device firmware: %s", fwname); in btintel_prepare_fw_download_tlv()
2326 if (fw->size < 644) { in btintel_prepare_fw_download_tlv()
2327 bt_dev_err(hdev, "Invalid size of firmware file (%zu)", in btintel_prepare_fw_download_tlv()
2328 fw->size); in btintel_prepare_fw_download_tlv()
2329 err = -EBADF; in btintel_prepare_fw_download_tlv()
2337 /* Start firmware downloading and get boot parameter */ in btintel_prepare_fw_download_tlv()
2339 INTEL_HW_VARIANT(ver->cnvi_bt), in btintel_prepare_fw_download_tlv()
2340 ver->sbe_type); in btintel_prepare_fw_download_tlv()
2342 if (err == -EALREADY) { in btintel_prepare_fw_download_tlv()
2343 /* Firmware has already been loaded */ in btintel_prepare_fw_download_tlv()
2349 /* When FW download fails, send Intel Reset to retry in btintel_prepare_fw_download_tlv()
2357 * booting the loaded firmware, wait for the bootloader notification in btintel_prepare_fw_download_tlv()
2363 * The firmware loading should not take longer than 5 seconds in btintel_prepare_fw_download_tlv()
2368 if (err == -ETIMEDOUT) in btintel_prepare_fw_download_tlv()
2383 return -EINVAL; in btintel_get_codec_config_data()
2390 return -EINVAL; in btintel_get_codec_config_data()
2395 err = -ENOMEM; in btintel_get_codec_config_data()
2400 switch (codec->id) { in btintel_get_codec_config_data()
2408 err = -EINVAL; in btintel_get_codec_config_data()
2409 bt_dev_err(hdev, "Invalid codec id(%u)", codec->id); in btintel_get_codec_config_data()
2412 /* codec and its capabilities are pre-defined to ids in btintel_get_codec_config_data()
2445 if (skb->len < sizeof(*use_cases)) { in btintel_configure_offload()
2446 err = -EIO; in btintel_configure_offload()
2450 use_cases = (void *)skb->data; in btintel_configure_offload()
2452 if (use_cases->status) { in btintel_configure_offload()
2453 err = -bt_to_errno(skb->data[0]); in btintel_configure_offload()
2457 if (use_cases->preset[0] & 0x03) { in btintel_configure_offload()
2458 hdev->get_data_path_id = btintel_get_data_path_id; in btintel_configure_offload()
2459 hdev->get_codec_config_data = btintel_get_codec_config_data; in btintel_configure_offload()
2477 switch (ver->cnvr_top & 0xFFF) { in btintel_set_ppag()
2482 ver->cnvr_top & 0xFFF); in btintel_set_ppag()
2488 bt_dev_info(hdev, "No support for BT device in ACPI firmware"); in btintel_set_ppag()
2495 bt_dev_dbg(hdev, "PPAG-BT: ACPI entry not found"); in btintel_set_ppag()
2498 bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status)); in btintel_set_ppag()
2503 if (p->type != ACPI_TYPE_PACKAGE || p->package.count != 2) { in btintel_set_ppag()
2504 bt_dev_warn(hdev, "PPAG-BT: Invalid object type: %d or package count: %d", in btintel_set_ppag()
2505 p->type, p->package.count); in btintel_set_ppag()
2510 elements = p->package.elements; in btintel_set_ppag()
2515 domain = (u32)p->package.elements[0].integer.value; in btintel_set_ppag()
2516 mode = (u32)p->package.elements[1].integer.value; in btintel_set_ppag()
2520 bt_dev_dbg(hdev, "PPAG-BT: Bluetooth domain is disabled in ACPI firmware"); in btintel_set_ppag()
2533 bt_dev_dbg(hdev, "PPAG-BT: EU, China mode are disabled in BIOS"); in btintel_set_ppag()
2545 bt_dev_info(hdev, "PPAG-BT: Enabled (Mode %d)", mode); in btintel_set_ppag()
2559 ret = -ENODEV; in btintel_acpi_reset_method()
2564 if (p->package.count != 1 || p->type != ACPI_TYPE_PACKAGE) { in btintel_acpi_reset_method()
2566 ret = -EINVAL; in btintel_acpi_reset_method()
2570 ref = &p->package.elements[0]; in btintel_acpi_reset_method()
2571 if (ref->type != ACPI_TYPE_LOCAL_REFERENCE) { in btintel_acpi_reset_method()
2572 bt_dev_err(hdev, "Invalid object type: 0x%x", ref->type); in btintel_acpi_reset_method()
2573 ret = -EINVAL; in btintel_acpi_reset_method()
2577 status = acpi_evaluate_object(ref->reference.handle, "_RST", NULL, NULL); in btintel_acpi_reset_method()
2580 ret = -ENODEV; in btintel_acpi_reset_method()
2604 bt_dev_dbg(hdev, "No support for bluetooth device in ACPI firmware"); in btintel_set_dsm_reset_method()
2613 switch (ver_tlv->cnvi_top & 0xfff) { in btintel_set_dsm_reset_method()
2618 /* WDISABLE2 is the default reset method */ in btintel_set_dsm_reset_method()
2623 bt_dev_err(hdev, "No dsm support to set reset delay"); in btintel_set_dsm_reset_method()
2632 bt_dev_err(hdev, "Failed to call dsm to set reset delay"); in btintel_set_dsm_reset_method()
2638 bt_dev_info(hdev, "DSM reset method type: 0x%02x", reset_payload[2]); in btintel_set_dsm_reset_method()
2642 bt_dev_warn(hdev, "No support for dsm to set reset method"); in btintel_set_dsm_reset_method()
2652 bt_dev_err(hdev, "Failed to call dsm to set reset method"); in btintel_set_dsm_reset_method()
2656 data->acpi_reset_method = btintel_acpi_reset_method; in btintel_set_dsm_reset_method()
2668 __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle); in btintel_classify_pkt_type()
2681 * configauration, bluetooth firmware shall adjust the BRI response line drive
2688 * header - defines revision number of the structure
2689 * dsbr - defines drive strength BRI response
2691 * 0 - instructs bluetooth firmware to use default values
2692 * 1 - instructs bluetooth firmware to override default values
2700 * 1. 0xF1 - indicates that the resistor on board is 33 Ohm
2701 * 2. 0x00 or 0xB1 - indicates that the resistor on board is 10 Ohm
2702 * 3. Non existing UEFI variable or invalid (none of the above) - indicates
2705 * firmware to use default values.
2721 return -EOPNOTSUPP; in btintel_uefi_get_dsbr()
2724 return -EOPNOTSUPP; in btintel_uefi_get_dsbr()
2730 return -EIO; in btintel_uefi_get_dsbr()
2736 return -ENXIO; in btintel_uefi_get_dsbr()
2755 cnvi = ver->cnvi_top & 0xfff; in btintel_set_dsbr()
2764 if (ver->img_type == BTINTEL_IMG_IML && in btintel_set_dsbr()
2765 INTEL_CNVX_TOP_STEP(ver->cnvi_top) == 0x01) in btintel_set_dsbr()
2770 if (ver->img_type == BTINTEL_IMG_OP && in btintel_set_dsbr()
2771 hdev->bus == HCI_USB) in btintel_set_dsbr()
2792 return -bt_to_errno(PTR_ERR(skb)); in btintel_set_dsbr()
2794 status = skb->data[0]; in btintel_set_dsbr()
2798 return -bt_to_errno(status); in btintel_set_dsbr()
2815 * command while downloading the firmware. in btintel_bootloader_setup_tlv()
2820 * same hdev instance if there is any error on firmware download. in btintel_bootloader_setup_tlv()
2821 * Need to clear stale bits of previous firmware download attempt. in btintel_bootloader_setup_tlv()
2832 /* check if controller is already having an operational firmware */ in btintel_bootloader_setup_tlv()
2833 if (ver->img_type == BTINTEL_IMG_OP) in btintel_bootloader_setup_tlv()
2854 if (ver->img_type == BTINTEL_IMG_IML) { in btintel_bootloader_setup_tlv()
2945 if (skb->len < (sizeof(u32) * 16 + 2)) { in btintel_print_fseq_info()
2947 skb->len); in btintel_print_fseq_info()
2992 p = skb->data; in btintel_print_fseq_info()
2997 p = skb->data; in btintel_print_fseq_info()
3015 bt_dev_dbg(hdev, "Fseq Top reset address: 0x%8.8x", val); in btintel_print_fseq_info()
3053 BT_DBG("%s", hdev->name); in btintel_setup_combined()
3059 * As a workaround, send HCI Reset command first which will reset the in btintel_setup_combined()
3075 "sending initial HCI reset failed (%ld)", in btintel_setup_combined()
3096 if (skb->data[0]) { in btintel_setup_combined()
3098 skb->data[0]); in btintel_setup_combined()
3099 err = -EIO; in btintel_setup_combined()
3104 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btintel_setup_combined()
3105 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btintel_setup_combined()
3106 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); in btintel_setup_combined()
3109 hdev->set_quality_report = btintel_set_quality_report; in btintel_setup_combined()
3112 if (skb->len == sizeof(ver) && skb->data[1] == 0x37) { in btintel_setup_combined()
3115 memcpy(&ver, skb->data, sizeof(ver)); in btintel_setup_combined()
3120 /* Check for supported iBT hardware variants of this firmware in btintel_setup_combined()
3135 * WBS for SdP - For the Legacy ROM products, only SdP in btintel_setup_combined()
3145 &hdev->quirks); in btintel_setup_combined()
3161 &hdev->quirks); in btintel_setup_combined()
3164 set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks); in btintel_setup_combined()
3175 err = -EINVAL; in btintel_setup_combined()
3200 err = -EINVAL; in btintel_setup_combined()
3204 /* Check for supported iBT hardware variants of this firmware in btintel_setup_combined()
3217 * the operational firmware supports both old and TLV based in btintel_setup_combined()
3221 * For upgrading firmware case, the TLV based version cannot in btintel_setup_combined()
3222 * be used because the firmware filename for legacy bootloader in btintel_setup_combined()
3240 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btintel_setup_combined()
3243 set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks); in btintel_setup_combined()
3253 /* Re-classify packet type for controllers with LE audio */ in btintel_setup_combined()
3254 hdev->classify_pkt_type = btintel_classify_pkt_type; in btintel_setup_combined()
3268 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btintel_setup_combined()
3285 err = -EINVAL; in btintel_setup_combined()
3304 /* Send HCI Reset to the controller to stop any BT activity which in btintel_shutdown_combined()
3310 bt_dev_err(hdev, "HCI reset during shutdown failed"); in btintel_shutdown_combined()
3337 hdev->manufacturer = 2; in btintel_configure_setup()
3338 hdev->setup = btintel_setup_combined; in btintel_configure_setup()
3339 hdev->shutdown = btintel_shutdown_combined; in btintel_configure_setup()
3340 hdev->hw_error = btintel_hw_error; in btintel_configure_setup()
3341 hdev->set_diag = btintel_set_diag_combined; in btintel_configure_setup()
3342 hdev->set_bdaddr = btintel_set_bdaddr; in btintel_configure_setup()
3352 struct intel_tlv *tlv = (void *)&skb->data[5]; in btintel_diagnostics()
3355 if (tlv->type != INTEL_TLV_TYPE_ID) in btintel_diagnostics()
3358 switch (tlv->val[0]) { in btintel_diagnostics()
3364 if (!hci_devcd_init(hdev, skb->len)) { in btintel_diagnostics()
3372 bt_dev_err(hdev, "Invalid exception type %02X", tlv->val[0]); in btintel_diagnostics()
3382 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_recv_event()
3385 if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff && in btintel_recv_event()
3386 hdr->plen > 0) { in btintel_recv_event()
3387 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_recv_event()
3388 unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1; in btintel_recv_event()
3391 switch (skb->data[2]) { in btintel_recv_event()
3393 /* When switching to the operational firmware in btintel_recv_event()
3401 /* When the firmware loading completes the in btintel_recv_event()
3403 * indicating the result of the firmware in btintel_recv_event()
3416 memcmp(&skb->data[2], diagnostics_hdr, in btintel_recv_event()
3446 if (evt->result) in btintel_secure_send_result()
3459 MODULE_FIRMWARE("intel/ibt-11-5.sfi");
3460 MODULE_FIRMWARE("intel/ibt-11-5.ddc");
3461 MODULE_FIRMWARE("intel/ibt-12-16.sfi");
3462 MODULE_FIRMWARE("intel/ibt-12-16.ddc");