Lines Matching +full:firmware +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #include <linux/firmware.h>
49 if (skb->len != sizeof(*bda)) { in btintel_check_bdaddr()
52 return -EIO; in btintel_check_bdaddr()
55 bda = (struct hci_rp_read_bd_addr *)skb->data; in btintel_check_bdaddr()
62 if (!bacmp(&bda->bdaddr, BDADDR_INTEL)) { in btintel_check_bdaddr()
64 &bda->bdaddr); in btintel_check_bdaddr()
65 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_check_bdaddr()
91 int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched) in btintel_exit_mfg() argument
98 * 0x01: Disable manufacturing mode and reset with patches deactivated. in btintel_exit_mfg()
99 * 0x02: Disable manufacturing mode and reset with patches activated. in btintel_exit_mfg()
101 if (reset) in btintel_exit_mfg()
173 if (err == -ENODATA) in btintel_set_diag()
230 bt_dev_err(hdev, "Reset after hardware error failed (%ld)", in btintel_hw_error()
243 if (skb->len != 13) { in btintel_hw_error()
249 bt_dev_err(hdev, "Exception info %s", (char *)(skb->data + 1)); in btintel_hw_error()
261 if (ver->hw_platform != 0x37) { in btintel_version_info()
263 ver->hw_platform); in btintel_version_info()
264 return -EINVAL; in btintel_version_info()
267 /* Check for supported iBT hardware variants of this firmware in btintel_version_info()
273 switch (ver->hw_variant) { in btintel_version_info()
274 case 0x07: /* WP - Legacy ROM */ in btintel_version_info()
275 case 0x08: /* StP - Legacy ROM */ in btintel_version_info()
285 ver->hw_variant); in btintel_version_info()
286 return -EINVAL; in btintel_version_info()
289 switch (ver->fw_variant) { in btintel_version_info()
300 variant = "Firmware"; in btintel_version_info()
303 bt_dev_err(hdev, "Unsupported firmware variant(%02x)", ver->fw_variant); in btintel_version_info()
304 return -EINVAL; in btintel_version_info()
308 variant, ver->fw_revision >> 4, ver->fw_revision & 0x0f, in btintel_version_info()
309 ver->fw_build_num, ver->fw_build_ww, in btintel_version_info()
310 2000 + ver->fw_build_yy); in btintel_version_info()
333 plen -= fragment_len; in btintel_secure_send()
342 const struct firmware *fw; in btintel_load_ddc_config()
347 err = request_firmware_direct(&fw, ddc_name, &hdev->dev); in btintel_load_ddc_config()
356 fw_ptr = fw->data; in btintel_load_ddc_config()
359 * Length (1 byte), DDC ID (2 bytes), and DDC value (Length - 2). in btintel_load_ddc_config()
361 while (fw->size > fw_ptr - fw->data) { in btintel_load_ddc_config()
414 if (skb->len != sizeof(*ver)) { in btintel_read_version()
417 return -EILSEQ; in btintel_read_version()
420 memcpy(ver, skb->data, sizeof(*ver)); in btintel_read_version()
436 if (INTEL_HW_PLATFORM(version->cnvi_bt) != 0x37) { in btintel_version_info_tlv()
438 INTEL_HW_PLATFORM(version->cnvi_bt)); in btintel_version_info_tlv()
439 return -EINVAL; in btintel_version_info_tlv()
442 /* Check for supported iBT hardware variants of this firmware in btintel_version_info_tlv()
448 switch (INTEL_HW_VARIANT(version->cnvi_bt)) { in btintel_version_info_tlv()
451 case 0x19: /* Slr-F */ in btintel_version_info_tlv()
455 INTEL_HW_VARIANT(version->cnvi_bt)); in btintel_version_info_tlv()
456 return -EINVAL; in btintel_version_info_tlv()
459 switch (version->img_type) { in btintel_version_info_tlv()
462 /* It is required that every single firmware fragment is acknowledged in btintel_version_info_tlv()
466 if (version->limited_cce != 0x00) { in btintel_version_info_tlv()
467 bt_dev_err(hdev, "Unsupported Intel firmware loading method (0x%x)", in btintel_version_info_tlv()
468 version->limited_cce); in btintel_version_info_tlv()
469 return -EINVAL; in btintel_version_info_tlv()
473 if (version->sbe_type > 0x01) { in btintel_version_info_tlv()
475 version->sbe_type); in btintel_version_info_tlv()
476 return -EINVAL; in btintel_version_info_tlv()
479 bt_dev_info(hdev, "Device revision is %u", version->dev_rev_id); in btintel_version_info_tlv()
481 version->secure_boot ? "enabled" : "disabled"); in btintel_version_info_tlv()
483 version->otp_lock ? "enabled" : "disabled"); in btintel_version_info_tlv()
485 version->api_lock ? "enabled" : "disabled"); in btintel_version_info_tlv()
487 version->debug_lock ? "enabled" : "disabled"); in btintel_version_info_tlv()
488 bt_dev_info(hdev, "Minimum firmware build %u week %u %u", in btintel_version_info_tlv()
489 version->min_fw_build_nn, version->min_fw_build_cw, in btintel_version_info_tlv()
490 2000 + version->min_fw_build_yy); in btintel_version_info_tlv()
493 variant = "Firmware"; in btintel_version_info_tlv()
496 bt_dev_err(hdev, "Unsupported image type(%02x)", version->img_type); in btintel_version_info_tlv()
497 return -EINVAL; in btintel_version_info_tlv()
501 2000 + (version->timestamp >> 8), version->timestamp & 0xff, in btintel_version_info_tlv()
502 version->build_type, version->build_num); in btintel_version_info_tlv()
519 while (skb->len) { in btintel_parse_version_tlv()
523 if (skb->len < sizeof(*tlv)) in btintel_parse_version_tlv()
524 return -EINVAL; in btintel_parse_version_tlv()
526 tlv = (struct intel_tlv *)skb->data; in btintel_parse_version_tlv()
529 if (skb->len < tlv->len + sizeof(*tlv)) in btintel_parse_version_tlv()
530 return -EINVAL; in btintel_parse_version_tlv()
532 switch (tlv->type) { in btintel_parse_version_tlv()
534 version->cnvi_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
537 version->cnvr_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
540 version->cnvi_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
543 version->cnvr_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
546 version->dev_rev_id = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
549 version->img_type = tlv->val[0]; in btintel_parse_version_tlv()
552 /* If image type is Operational firmware (0x03), then in btintel_parse_version_tlv()
556 version->min_fw_build_cw = tlv->val[0]; in btintel_parse_version_tlv()
557 version->min_fw_build_yy = tlv->val[1]; in btintel_parse_version_tlv()
558 version->timestamp = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
561 version->build_type = tlv->val[0]; in btintel_parse_version_tlv()
564 /* If image type is Operational firmware (0x03), then in btintel_parse_version_tlv()
568 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
569 version->build_num = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
572 version->secure_boot = tlv->val[0]; in btintel_parse_version_tlv()
575 version->otp_lock = tlv->val[0]; in btintel_parse_version_tlv()
578 version->api_lock = tlv->val[0]; in btintel_parse_version_tlv()
581 version->debug_lock = tlv->val[0]; in btintel_parse_version_tlv()
584 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
585 version->min_fw_build_cw = tlv->val[1]; in btintel_parse_version_tlv()
586 version->min_fw_build_yy = tlv->val[2]; in btintel_parse_version_tlv()
589 version->limited_cce = tlv->val[0]; in btintel_parse_version_tlv()
592 version->sbe_type = tlv->val[0]; in btintel_parse_version_tlv()
595 memcpy(&version->otp_bd_addr, tlv->val, in btintel_parse_version_tlv()
603 skb_pull(skb, tlv->len + sizeof(*tlv)); in btintel_parse_version_tlv()
616 return -EINVAL; in btintel_read_version_tlv()
625 if (skb->data[0]) { in btintel_read_version_tlv()
627 skb->data[0]); in btintel_read_version_tlv()
629 return -EIO; in btintel_read_version_tlv()
638 /* ------- REGMAP IBT SUPPORT ------- */
673 return -EINVAL; in regmap_ibt_read()
686 return -EINVAL; in regmap_ibt_read()
689 /* regmap provides a little-endian formatted addr */ in regmap_ibt_read()
693 bt_dev_dbg(ctx->hdev, "Register (0x%x) read", le32_to_cpu(cp.addr)); in regmap_ibt_read()
695 skb = hci_cmd_sync(ctx->hdev, ctx->op_read, sizeof(cp), &cp, in regmap_ibt_read()
699 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error (%d)", in regmap_ibt_read()
704 if (skb->len != sizeof(*rp) + val_size) { in regmap_ibt_read()
705 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad len", in regmap_ibt_read()
707 err = -EINVAL; in regmap_ibt_read()
711 rp = (struct ibt_rp_reg_access *)skb->data; in regmap_ibt_read()
713 if (rp->addr != cp.addr) { in regmap_ibt_read()
714 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad addr", in regmap_ibt_read()
715 le32_to_cpu(rp->addr)); in regmap_ibt_read()
716 err = -EINVAL; in regmap_ibt_read()
720 memcpy(val, rp->data, val_size); in regmap_ibt_read()
739 return -EINVAL; in regmap_ibt_gather_write()
752 return -EINVAL; in regmap_ibt_gather_write()
757 return -ENOMEM; in regmap_ibt_gather_write()
759 /* regmap provides a little-endian formatted addr/value */ in regmap_ibt_gather_write()
760 cp->addr = *(__le32 *)addr; in regmap_ibt_gather_write()
761 cp->mode = mode; in regmap_ibt_gather_write()
762 cp->len = val_size; in regmap_ibt_gather_write()
763 memcpy(&cp->data, val, val_size); in regmap_ibt_gather_write()
765 bt_dev_dbg(ctx->hdev, "Register (0x%x) write", le32_to_cpu(cp->addr)); in regmap_ibt_gather_write()
767 skb = hci_cmd_sync(ctx->hdev, ctx->op_write, plen, cp, HCI_CMD_TIMEOUT); in regmap_ibt_gather_write()
770 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) write error (%d)", in regmap_ibt_gather_write()
771 le32_to_cpu(cp->addr), err); in regmap_ibt_gather_write()
787 return -EINVAL; in regmap_ibt_write()
789 return regmap_ibt_gather_write(context, data, 4, data + 4, count - 4); in regmap_ibt_write()
818 bt_dev_info(hdev, "regmap: Init R%x-W%x region", opcode_read, in btintel_regmap_init()
823 return ERR_PTR(-ENOMEM); in btintel_regmap_init()
825 ctx->op_read = opcode_read; in btintel_regmap_init()
826 ctx->op_write = opcode_write; in btintel_regmap_init()
827 ctx->hdev = hdev; in btintel_regmap_init()
829 return regmap_init(&hdev->dev, &regmap_ibt, ctx, &regmap_ibt_cfg); in btintel_regmap_init()
843 bt_dev_err(hdev, "Failed to send Intel Reset command"); in btintel_send_intel_reset()
865 if (skb->len != sizeof(*params)) { in btintel_read_boot_params()
868 return -EILSEQ; in btintel_read_boot_params()
871 memcpy(params, skb->data, sizeof(*params)); in btintel_read_boot_params()
875 if (params->status) { in btintel_read_boot_params()
877 params->status); in btintel_read_boot_params()
878 return -bt_to_errno(params->status); in btintel_read_boot_params()
882 le16_to_cpu(params->dev_revid)); in btintel_read_boot_params()
885 params->secure_boot ? "enabled" : "disabled"); in btintel_read_boot_params()
888 params->otp_lock ? "enabled" : "disabled"); in btintel_read_boot_params()
891 params->api_lock ? "enabled" : "disabled"); in btintel_read_boot_params()
894 params->debug_lock ? "enabled" : "disabled"); in btintel_read_boot_params()
896 bt_dev_info(hdev, "Minimum firmware build %u week %u %u", in btintel_read_boot_params()
897 params->min_fw_build_nn, params->min_fw_build_cw, in btintel_read_boot_params()
898 2000 + params->min_fw_build_yy); in btintel_read_boot_params()
905 const struct firmware *fw) in btintel_sfi_rsa_header_secure_send()
909 /* Start the firmware download transaction with the Init fragment in btintel_sfi_rsa_header_secure_send()
912 err = btintel_secure_send(hdev, 0x00, 128, fw->data); in btintel_sfi_rsa_header_secure_send()
914 bt_dev_err(hdev, "Failed to send firmware header (%d)", err); in btintel_sfi_rsa_header_secure_send()
918 /* Send the 256 bytes of public key information from the firmware in btintel_sfi_rsa_header_secure_send()
921 err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); in btintel_sfi_rsa_header_secure_send()
923 bt_dev_err(hdev, "Failed to send firmware pkey (%d)", err); in btintel_sfi_rsa_header_secure_send()
927 /* Send the 256 bytes of signature information from the firmware in btintel_sfi_rsa_header_secure_send()
930 err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); in btintel_sfi_rsa_header_secure_send()
932 bt_dev_err(hdev, "Failed to send firmware signature (%d)", err); in btintel_sfi_rsa_header_secure_send()
941 const struct firmware *fw) in btintel_sfi_ecdsa_header_secure_send()
945 /* Start the firmware download transaction with the Init fragment in btintel_sfi_ecdsa_header_secure_send()
948 err = btintel_secure_send(hdev, 0x00, 128, fw->data + 644); in btintel_sfi_ecdsa_header_secure_send()
950 bt_dev_err(hdev, "Failed to send firmware header (%d)", err); in btintel_sfi_ecdsa_header_secure_send()
954 /* Send the 96 bytes of public key information from the firmware in btintel_sfi_ecdsa_header_secure_send()
957 err = btintel_secure_send(hdev, 0x03, 96, fw->data + 644 + 128); in btintel_sfi_ecdsa_header_secure_send()
959 bt_dev_err(hdev, "Failed to send firmware pkey (%d)", err); in btintel_sfi_ecdsa_header_secure_send()
963 /* Send the 96 bytes of signature information from the firmware in btintel_sfi_ecdsa_header_secure_send()
966 err = btintel_secure_send(hdev, 0x02, 96, fw->data + 644 + 224); in btintel_sfi_ecdsa_header_secure_send()
968 bt_dev_err(hdev, "Failed to send firmware signature (%d)", in btintel_sfi_ecdsa_header_secure_send()
976 const struct firmware *fw, in btintel_download_firmware_payload()
983 fw_ptr = fw->data + offset; in btintel_download_firmware_payload()
985 err = -EINVAL; in btintel_download_firmware_payload()
987 while (fw_ptr - fw->data < fw->size) { in btintel_download_firmware_payload()
990 frag_len += sizeof(*cmd) + cmd->plen; in btintel_download_firmware_payload()
993 * a 4 byte alignment. It happens so that the firmware file in btintel_download_firmware_payload()
998 * firmware data buffer as a single Data fragement. in btintel_download_firmware_payload()
1004 "Failed to send firmware data (%d)", in btintel_download_firmware_payload()
1020 const struct firmware *fw, in btintel_firmware_version()
1025 fw_ptr = fw->data; in btintel_firmware_version()
1027 while (fw_ptr - fw->data < fw->size) { in btintel_firmware_version()
1030 /* Each SKU has a different reset parameter to use in the in btintel_firmware_version()
1031 * HCI_Intel_Reset command and it is embedded in the firmware in btintel_firmware_version()
1033 * the firmware data and save it for later use. in btintel_firmware_version()
1035 if (le16_to_cpu(cmd->opcode) == CMD_WRITE_BOOT_PARAMS) { in btintel_firmware_version()
1041 le32_to_cpu(params->boot_addr)); in btintel_firmware_version()
1043 bt_dev_info(hdev, "Firmware Version: %u-%u.%u", in btintel_firmware_version()
1044 params->fw_build_num, params->fw_build_ww, in btintel_firmware_version()
1045 params->fw_build_yy); in btintel_firmware_version()
1047 return (num == params->fw_build_num && in btintel_firmware_version()
1048 ww == params->fw_build_ww && in btintel_firmware_version()
1049 yy == params->fw_build_yy); in btintel_firmware_version()
1052 fw_ptr += sizeof(*cmd) + cmd->plen; in btintel_firmware_version()
1060 const struct firmware *fw, in btintel_download_firmware()
1065 /* SfP and WsP don't seem to update the firmware version on file in btintel_download_firmware()
1068 switch (ver->hw_variant) { in btintel_download_firmware()
1074 /* Skip reading firmware file version in bootloader mode */ in btintel_download_firmware()
1075 if (ver->fw_variant == 0x06) in btintel_download_firmware()
1078 /* Skip download if firmware has the same version */ in btintel_download_firmware()
1079 if (btintel_firmware_version(hdev, ver->fw_build_num, in btintel_download_firmware()
1080 ver->fw_build_ww, ver->fw_build_yy, in btintel_download_firmware()
1082 bt_dev_info(hdev, "Firmware already loaded"); in btintel_download_firmware()
1083 /* Return -EALREADY to indicate that the firmware has in btintel_download_firmware()
1086 return -EALREADY; in btintel_download_firmware()
1090 /* The firmware variant determines if the device is in bootloader in btintel_download_firmware()
1091 * mode or is running operational firmware. The value 0x06 identifies in btintel_download_firmware()
1093 * firmware. in btintel_download_firmware()
1095 * If the firmware version has changed that means it needs to be reset in btintel_download_firmware()
1096 * to bootloader when operational so the new firmware can be loaded. in btintel_download_firmware()
1098 if (ver->fw_variant == 0x23) in btintel_download_firmware()
1099 return -EINVAL; in btintel_download_firmware()
1111 const struct firmware *fw, u32 *boot_param, in btintel_download_fw_tlv()
1117 /* Skip reading firmware file version in bootloader mode */ in btintel_download_fw_tlv()
1118 if (ver->img_type != 0x01) { in btintel_download_fw_tlv()
1119 /* Skip download if firmware has the same version */ in btintel_download_fw_tlv()
1120 if (btintel_firmware_version(hdev, ver->min_fw_build_nn, in btintel_download_fw_tlv()
1121 ver->min_fw_build_cw, in btintel_download_fw_tlv()
1122 ver->min_fw_build_yy, in btintel_download_fw_tlv()
1124 bt_dev_info(hdev, "Firmware already loaded"); in btintel_download_fw_tlv()
1125 /* Return -EALREADY to indicate that firmware has in btintel_download_fw_tlv()
1128 return -EALREADY; in btintel_download_fw_tlv()
1132 /* The firmware variant determines if the device is in bootloader in btintel_download_fw_tlv()
1133 * mode or is running operational firmware. The value 0x01 identifies in btintel_download_fw_tlv()
1135 * firmware. in btintel_download_fw_tlv()
1137 * If the firmware version has changed that means it needs to be reset in btintel_download_fw_tlv()
1138 * to bootloader when operational so the new firmware can be loaded. in btintel_download_fw_tlv()
1140 if (ver->img_type == 0x03) in btintel_download_fw_tlv()
1141 return -EINVAL; in btintel_download_fw_tlv()
1155 css_header_ver = get_unaligned_le32(fw->data + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1158 return -EINVAL; in btintel_download_fw_tlv()
1165 return -EINVAL; in btintel_download_fw_tlv()
1177 if (fw->data[ECDSA_OFFSET] != 0x06) in btintel_download_fw_tlv()
1178 return -EINVAL; in btintel_download_fw_tlv()
1181 css_header_ver = get_unaligned_le32(fw->data + ECDSA_OFFSET + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1184 return -EINVAL; in btintel_download_fw_tlv()
1215 /* Send Intel Reset command. This will result in in btintel_reset_to_bootloader()
1216 * re-enumeration of BT controller. in btintel_reset_to_bootloader()
1218 * Intel Reset parameter description: in btintel_reset_to_bootloader()
1219 * reset_type : 0x00 (Soft reset), in btintel_reset_to_bootloader()
1220 * 0x01 (Hard reset) in btintel_reset_to_bootloader()
1243 bt_dev_info(hdev, "Intel reset sent to retry FW download"); in btintel_reset_to_bootloader()
1246 /* Current Intel BT controllers(ThP/JfP) hold the USB reset in btintel_reset_to_bootloader()
1247 * lines for 2ms when it receives Intel Reset in bootloader mode. in btintel_reset_to_bootloader()
1248 * Whereas, the upcoming Intel BT controllers will hold USB reset in btintel_reset_to_bootloader()
1260 /* Intel controller supports two pages, each page is of 128-bit in btintel_read_debug_features()
1271 if (skb->len != (sizeof(features->page1) + 3)) { in btintel_read_debug_features()
1274 return -EILSEQ; in btintel_read_debug_features()
1277 memcpy(features->page1, skb->data + 3, sizeof(features->page1)); in btintel_read_debug_features()
1293 return -EINVAL; in btintel_set_debug_features()
1295 if (!(features->page1[0] & 0x3f)) { in btintel_set_debug_features()
1311 static const struct firmware *btintel_legacy_rom_get_fw(struct hci_dev *hdev, in btintel_legacy_rom_get_fw()
1314 const struct firmware *fw; in btintel_legacy_rom_get_fw()
1319 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq", in btintel_legacy_rom_get_fw()
1320 ver->hw_platform, ver->hw_variant, ver->hw_revision, in btintel_legacy_rom_get_fw()
1321 ver->fw_variant, ver->fw_revision, ver->fw_build_num, in btintel_legacy_rom_get_fw()
1322 ver->fw_build_ww, ver->fw_build_yy); in btintel_legacy_rom_get_fw()
1324 ret = request_firmware(&fw, fwname, &hdev->dev); in btintel_legacy_rom_get_fw()
1326 if (ret == -EINVAL) { in btintel_legacy_rom_get_fw()
1327 bt_dev_err(hdev, "Intel firmware file request failed (%d)", in btintel_legacy_rom_get_fw()
1332 bt_dev_err(hdev, "failed to open Intel firmware file: %s (%d)", in btintel_legacy_rom_get_fw()
1335 /* If the correct firmware patch file is not found, use the in btintel_legacy_rom_get_fw()
1336 * default firmware patch file instead in btintel_legacy_rom_get_fw()
1338 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq", in btintel_legacy_rom_get_fw()
1339 ver->hw_platform, ver->hw_variant); in btintel_legacy_rom_get_fw()
1340 if (request_firmware(&fw, fwname, &hdev->dev) < 0) { in btintel_legacy_rom_get_fw()
1347 bt_dev_info(hdev, "Intel Bluetooth firmware file: %s", fwname); in btintel_legacy_rom_get_fw()
1353 const struct firmware *fw, in btintel_legacy_rom_patching()
1361 int remain = fw->size - (*fw_ptr - fw->data); in btintel_legacy_rom_patching()
1365 * in the current firmware buffer doesn't start with 0x01 or in btintel_legacy_rom_patching()
1367 * the firmware file is corrupted and it should stop the patching in btintel_legacy_rom_patching()
1372 return -EINVAL; in btintel_legacy_rom_patching()
1375 remain--; in btintel_legacy_rom_patching()
1379 remain -= sizeof(*cmd); in btintel_legacy_rom_patching()
1381 /* Ensure that the remain firmware data is long enough than the length in btintel_legacy_rom_patching()
1382 * of command parameter. If not, the firmware file is corrupted. in btintel_legacy_rom_patching()
1384 if (remain < cmd->plen) { in btintel_legacy_rom_patching()
1386 return -EFAULT; in btintel_legacy_rom_patching()
1389 /* If there is a command that loads a patch in the firmware in btintel_legacy_rom_patching()
1392 * is not required when the default firmware patch file is used in btintel_legacy_rom_patching()
1395 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e) in btintel_legacy_rom_patching()
1399 *fw_ptr += cmd->plen; in btintel_legacy_rom_patching()
1400 remain -= cmd->plen; in btintel_legacy_rom_patching()
1411 remain--; in btintel_legacy_rom_patching()
1415 remain -= sizeof(*evt); in btintel_legacy_rom_patching()
1417 if (remain < evt->plen) { in btintel_legacy_rom_patching()
1419 return -EFAULT; in btintel_legacy_rom_patching()
1423 *fw_ptr += evt->plen; in btintel_legacy_rom_patching()
1424 remain -= evt->plen; in btintel_legacy_rom_patching()
1427 /* Every HCI commands in the firmware file has its correspond event. in btintel_legacy_rom_patching()
1428 * If event is not found or remain is smaller than zero, the firmware in btintel_legacy_rom_patching()
1433 return -EFAULT; in btintel_legacy_rom_patching()
1436 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen, in btintel_legacy_rom_patching()
1437 cmd_param, evt->evt, HCI_INIT_TIMEOUT); in btintel_legacy_rom_patching()
1440 cmd->opcode, PTR_ERR(skb)); in btintel_legacy_rom_patching()
1445 * the firmware file. At fist, it checks the length and then in btintel_legacy_rom_patching()
1448 if (skb->len != evt->plen) { in btintel_legacy_rom_patching()
1450 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1452 return -EFAULT; in btintel_legacy_rom_patching()
1455 if (memcmp(skb->data, evt_param, evt->plen)) { in btintel_legacy_rom_patching()
1457 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1459 return -EFAULT; in btintel_legacy_rom_patching()
1469 const struct firmware *fw; in btintel_legacy_rom_setup()
1474 BT_DBG("%s", hdev->name); in btintel_legacy_rom_setup()
1480 if (ver->fw_patch_num) { in btintel_legacy_rom_setup()
1483 ver->fw_patch_num); in btintel_legacy_rom_setup()
1487 /* Opens the firmware patch file based on the firmware version read in btintel_legacy_rom_setup()
1488 * from the controller. If it fails to open the matching firmware in btintel_legacy_rom_setup()
1489 * patch file, it tries to open the default firmware patch file. in btintel_legacy_rom_setup()
1496 fw_ptr = fw->data; in btintel_legacy_rom_setup()
1500 * firmware patch data and configuration parameters. in btintel_legacy_rom_setup()
1510 /* The firmware data file consists of list of Intel specific HCI in btintel_legacy_rom_setup()
1514 * It reads the command and its expected event from the firmware file, in btintel_legacy_rom_setup()
1516 * the returned event is compared with the event read from the firmware in btintel_legacy_rom_setup()
1520 * Once the firmware patching is completed successfully, in btintel_legacy_rom_setup()
1521 * the manufacturer mode is disabled with reset and activating the in btintel_legacy_rom_setup()
1524 * If the firmware patching fails, the manufacturer mode is in btintel_legacy_rom_setup()
1525 * disabled with reset and deactivating the patch. in btintel_legacy_rom_setup()
1527 * If the default patch file is used, no reset is done when disabling in btintel_legacy_rom_setup()
1530 while (fw->size > fw_ptr - fw->data) { in btintel_legacy_rom_setup()
1545 * with reset and activate the downloaded firmware patches. in btintel_legacy_rom_setup()
1552 * every power-on boot in btintel_legacy_rom_setup()
1564 /* Disable the manufacturer mode without reset */ in btintel_legacy_rom_setup()
1569 bt_dev_info(hdev, "Intel firmware patch completed"); in btintel_legacy_rom_setup()
1576 /* Patching failed. Disable the manufacturer mode with reset and in btintel_legacy_rom_setup()
1577 * deactivate the downloaded firmware patches. in btintel_legacy_rom_setup()
1583 bt_dev_info(hdev, "Intel firmware patch completed and deactivated"); in btintel_legacy_rom_setup()
1604 bt_dev_info(hdev, "Waiting for firmware download to complete"); in btintel_download_wait()
1609 if (err == -EINTR) { in btintel_download_wait()
1610 bt_dev_err(hdev, "Firmware loading interrupted"); in btintel_download_wait()
1615 bt_dev_err(hdev, "Firmware loading timeout"); in btintel_download_wait()
1616 return -ETIMEDOUT; in btintel_download_wait()
1620 bt_dev_err(hdev, "Firmware loading failed"); in btintel_download_wait()
1621 return -ENOEXEC; in btintel_download_wait()
1628 bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration); in btintel_download_wait()
1644 if (err == -EINTR) { in btintel_boot_wait()
1646 return -EINTR; in btintel_boot_wait()
1651 return -ETIMEDOUT; in btintel_boot_wait()
1674 bt_dev_err(hdev, "Intel Soft Reset failed (%d)", err); in btintel_boot()
1680 * is done by the operational firmware sending bootup notification. in btintel_boot()
1682 * Booting into operational firmware should not take longer than in btintel_boot()
1687 if (err == -ETIMEDOUT) in btintel_boot()
1698 switch (ver->hw_variant) { in btintel_get_fw_name()
1701 snprintf(fw_name, len, "intel/ibt-%u-%u.%s", in btintel_get_fw_name()
1702 le16_to_cpu(ver->hw_variant), in btintel_get_fw_name()
1703 le16_to_cpu(params->dev_revid), in btintel_get_fw_name()
1710 snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s", in btintel_get_fw_name()
1711 le16_to_cpu(ver->hw_variant), in btintel_get_fw_name()
1712 le16_to_cpu(ver->hw_revision), in btintel_get_fw_name()
1713 le16_to_cpu(ver->fw_revision), in btintel_get_fw_name()
1717 return -EINVAL; in btintel_get_fw_name()
1728 const struct firmware *fw; in btintel_download_fw()
1734 return -EINVAL; in btintel_download_fw()
1736 /* The firmware variant determines if the device is in bootloader in btintel_download_fw()
1737 * mode or is running operational firmware. The value 0x06 identifies in btintel_download_fw()
1739 * firmware. in btintel_download_fw()
1741 * When the operational firmware is already present, then only in btintel_download_fw()
1749 if (ver->fw_variant == 0x23) { in btintel_download_fw()
1753 /* SfP and WsP don't seem to update the firmware version on file in btintel_download_fw()
1756 switch (ver->hw_variant) { in btintel_download_fw()
1773 /* It is required that every single firmware fragment is acknowledged in btintel_download_fw()
1777 if (params->limited_cce != 0x00) { in btintel_download_fw()
1778 bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)", in btintel_download_fw()
1779 params->limited_cce); in btintel_download_fw()
1780 return -EINVAL; in btintel_download_fw()
1784 * also be no valid address for the operational firmware. in btintel_download_fw()
1786 if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) { in btintel_download_fw()
1788 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_download_fw()
1793 * revision information are used to select the right firmware for SfP in btintel_download_fw()
1796 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi. in btintel_download_fw()
1809 * The firmware file name for these will be in btintel_download_fw()
1810 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi. in btintel_download_fw()
1816 /* Firmware has already been loaded */ in btintel_download_fw()
1821 bt_dev_err(hdev, "Unsupported Intel firmware naming"); in btintel_download_fw()
1822 return -EINVAL; in btintel_download_fw()
1825 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_download_fw()
1828 /* Firmware has already been loaded */ in btintel_download_fw()
1833 bt_dev_err(hdev, "Failed to load Intel firmware file %s (%d)", in btintel_download_fw()
1838 bt_dev_info(hdev, "Found device firmware: %s", fwname); in btintel_download_fw()
1840 if (fw->size < 644) { in btintel_download_fw()
1841 bt_dev_err(hdev, "Invalid size of firmware file (%zu)", in btintel_download_fw()
1842 fw->size); in btintel_download_fw()
1843 err = -EBADF; in btintel_download_fw()
1851 /* Start firmware downloading and get boot parameter */ in btintel_download_fw()
1854 if (err == -EALREADY) { in btintel_download_fw()
1855 /* Firmware has already been loaded */ in btintel_download_fw()
1861 /* When FW download fails, send Intel Reset to retry in btintel_download_fw()
1869 * booting the loaded firmware, wait for the bootloader notification in btintel_download_fw()
1875 * The firmware loading should not take longer than 5 seconds in btintel_download_fw()
1880 if (err == -ETIMEDOUT) in btintel_download_fw()
1898 BT_DBG("%s", hdev->name); in btintel_bootloader_setup()
1902 * command while downloading the firmware. in btintel_bootloader_setup()
1912 /* controller is already having an operational firmware */ in btintel_bootloader_setup()
1913 if (ver->fw_variant == 0x23) in btintel_bootloader_setup()
1926 bt_dev_err(hdev, "Unsupported Intel firmware naming"); in btintel_bootloader_setup()
1970 /* The firmware file name for new generation controllers will be in btintel_get_fw_name_tlv()
1971 * ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step> in btintel_get_fw_name_tlv()
1973 snprintf(fw_name, len, "intel/ibt-%04x-%04x.%s", in btintel_get_fw_name_tlv()
1974 INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), in btintel_get_fw_name_tlv()
1975 INTEL_CNVX_TOP_STEP(ver->cnvi_top)), in btintel_get_fw_name_tlv()
1976 INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), in btintel_get_fw_name_tlv()
1977 INTEL_CNVX_TOP_STEP(ver->cnvr_top)), in btintel_get_fw_name_tlv()
1985 const struct firmware *fw; in btintel_prepare_fw_download_tlv()
1991 return -EINVAL; in btintel_prepare_fw_download_tlv()
1993 /* The firmware variant determines if the device is in bootloader in btintel_prepare_fw_download_tlv()
1994 * mode or is running operational firmware. The value 0x03 identifies in btintel_prepare_fw_download_tlv()
1996 * firmware. in btintel_prepare_fw_download_tlv()
1998 * When the operational firmware is already present, then only in btintel_prepare_fw_download_tlv()
2006 if (ver->img_type == 0x03) { in btintel_prepare_fw_download_tlv()
2012 * also be no valid address for the operational firmware. in btintel_prepare_fw_download_tlv()
2014 if (!bacmp(&ver->otp_bd_addr, BDADDR_ANY)) { in btintel_prepare_fw_download_tlv()
2016 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_prepare_fw_download_tlv()
2020 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_prepare_fw_download_tlv()
2023 /* Firmware has already been loaded */ in btintel_prepare_fw_download_tlv()
2028 bt_dev_err(hdev, "Failed to load Intel firmware file %s (%d)", in btintel_prepare_fw_download_tlv()
2034 bt_dev_info(hdev, "Found device firmware: %s", fwname); in btintel_prepare_fw_download_tlv()
2036 if (fw->size < 644) { in btintel_prepare_fw_download_tlv()
2037 bt_dev_err(hdev, "Invalid size of firmware file (%zu)", in btintel_prepare_fw_download_tlv()
2038 fw->size); in btintel_prepare_fw_download_tlv()
2039 err = -EBADF; in btintel_prepare_fw_download_tlv()
2047 /* Start firmware downloading and get boot parameter */ in btintel_prepare_fw_download_tlv()
2049 INTEL_HW_VARIANT(ver->cnvi_bt), in btintel_prepare_fw_download_tlv()
2050 ver->sbe_type); in btintel_prepare_fw_download_tlv()
2052 if (err == -EALREADY) { in btintel_prepare_fw_download_tlv()
2053 /* Firmware has already been loaded */ in btintel_prepare_fw_download_tlv()
2059 /* When FW download fails, send Intel Reset to retry in btintel_prepare_fw_download_tlv()
2067 * booting the loaded firmware, wait for the bootloader notification in btintel_prepare_fw_download_tlv()
2073 * The firmware loading should not take longer than 5 seconds in btintel_prepare_fw_download_tlv()
2078 if (err == -ETIMEDOUT) in btintel_prepare_fw_download_tlv()
2099 * command while downloading the firmware. in btintel_bootloader_setup_tlv()
2109 /* check if controller is already having an operational firmware */ in btintel_bootloader_setup_tlv()
2110 if (ver->img_type == 0x03) in btintel_bootloader_setup_tlv()
2187 BT_DBG("%s", hdev->name); in btintel_setup_combined()
2193 * As a workaround, send HCI Reset command first which will reset the in btintel_setup_combined()
2202 "sending initial HCI reset failed (%ld)", in btintel_setup_combined()
2223 if (skb->data[0]) { in btintel_setup_combined()
2225 skb->data[0]); in btintel_setup_combined()
2226 err = -EIO; in btintel_setup_combined()
2231 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btintel_setup_combined()
2232 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btintel_setup_combined()
2233 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); in btintel_setup_combined()
2236 if (skb->len == sizeof(ver) && skb->data[1] == 0x37) { in btintel_setup_combined()
2239 memcpy(&ver, skb->data, sizeof(ver)); in btintel_setup_combined()
2244 /* Check for supported iBT hardware variants of this firmware in btintel_setup_combined()
2259 * WBS for SdP - SdP and Stp have a same hw_varaint but in btintel_setup_combined()
2264 &hdev->quirks); in btintel_setup_combined()
2285 &hdev->quirks); in btintel_setup_combined()
2290 &hdev->quirks); in btintel_setup_combined()
2300 err = -EINVAL; in btintel_setup_combined()
2316 err = -EINVAL; in btintel_setup_combined()
2320 /* Check for supported iBT hardware variants of this firmware in btintel_setup_combined()
2359 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btintel_setup_combined()
2363 set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks); in btintel_setup_combined()
2374 return -EINVAL; in btintel_setup_combined()
2388 /* Send HCI Reset to the controller to stop any BT activity which in btintel_shutdown_combined()
2394 bt_dev_err(hdev, "HCI reset during shutdown failed"); in btintel_shutdown_combined()
2419 hdev->manufacturer = 2; in btintel_configure_setup()
2420 hdev->setup = btintel_setup_combined; in btintel_configure_setup()
2421 hdev->shutdown = btintel_shutdown_combined; in btintel_configure_setup()
2422 hdev->hw_error = btintel_hw_error; in btintel_configure_setup()
2423 hdev->set_diag = btintel_set_diag_combined; in btintel_configure_setup()
2424 hdev->set_bdaddr = btintel_set_bdaddr; in btintel_configure_setup()
2450 if (evt->result) in btintel_secure_send_result()
2463 MODULE_FIRMWARE("intel/ibt-11-5.sfi");
2464 MODULE_FIRMWARE("intel/ibt-11-5.ddc");
2465 MODULE_FIRMWARE("intel/ibt-12-16.sfi");
2466 MODULE_FIRMWARE("intel/ibt-12-16.ddc");