Lines Matching +full:non +full:- +full:secure +full:- +full:otp

1 // SPDX-License-Identifier: GPL-2.0-or-later
75 if (skb->len != sizeof(*bda)) { in btintel_check_bdaddr()
78 return -EIO; in btintel_check_bdaddr()
81 bda = (struct hci_rp_read_bd_addr *)skb->data; in btintel_check_bdaddr()
88 if (!bacmp(&bda->bdaddr, BDADDR_INTEL)) { in btintel_check_bdaddr()
90 &bda->bdaddr); in btintel_check_bdaddr()
91 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_check_bdaddr()
199 if (err == -ENODATA) in btintel_set_diag()
269 if (skb->len != 13) { in btintel_hw_error()
275 bt_dev_err(hdev, "Exception info %s", (char *)(skb->data + 1)); in btintel_hw_error()
288 if (ver->hw_platform != 0x37) { in btintel_version_info()
290 ver->hw_platform); in btintel_version_info()
291 return -EINVAL; in btintel_version_info()
300 switch (ver->hw_variant) { in btintel_version_info()
301 case 0x07: /* WP - Legacy ROM */ in btintel_version_info()
302 case 0x08: /* StP - Legacy ROM */ in btintel_version_info()
312 ver->hw_variant); in btintel_version_info()
313 return -EINVAL; in btintel_version_info()
316 switch (ver->fw_variant) { in btintel_version_info()
330 bt_dev_err(hdev, "Unsupported firmware variant(%02x)", ver->fw_variant); in btintel_version_info()
331 return -EINVAL; in btintel_version_info()
334 coredump_info.hw_variant = ver->hw_variant; in btintel_version_info()
335 coredump_info.fw_build_num = ver->fw_build_num; in btintel_version_info()
338 variant, ver->fw_revision >> 4, ver->fw_revision & 0x0f, in btintel_version_info()
339 ver->fw_build_num, ver->fw_build_ww, in btintel_version_info()
340 2000 + ver->fw_build_yy); in btintel_version_info()
363 plen -= fragment_len; in btintel_secure_send()
377 err = request_firmware_direct(&fw, ddc_name, &hdev->dev); in btintel_load_ddc_config()
386 fw_ptr = fw->data; in btintel_load_ddc_config()
389 * Length (1 byte), DDC ID (2 bytes), and DDC value (Length - 2). in btintel_load_ddc_config()
391 while (fw->size > fw_ptr - fw->data) { in btintel_load_ddc_config()
444 if (!skb || skb->len != sizeof(*ver)) { in btintel_read_version()
447 return -EILSEQ; in btintel_read_version()
450 memcpy(ver, skb->data, sizeof(*ver)); in btintel_read_version()
466 if (INTEL_HW_PLATFORM(version->cnvi_bt) != 0x37) { in btintel_version_info_tlv()
468 INTEL_HW_PLATFORM(version->cnvi_bt)); in btintel_version_info_tlv()
469 return -EINVAL; in btintel_version_info_tlv()
478 switch (INTEL_HW_VARIANT(version->cnvi_bt)) { in btintel_version_info_tlv()
481 case 0x19: /* Slr-F */ in btintel_version_info_tlv()
490 INTEL_HW_VARIANT(version->cnvi_bt)); in btintel_version_info_tlv()
491 return -EINVAL; in btintel_version_info_tlv()
494 switch (version->img_type) { in btintel_version_info_tlv()
501 if (version->limited_cce != 0x00) { in btintel_version_info_tlv()
503 version->limited_cce); in btintel_version_info_tlv()
504 return -EINVAL; in btintel_version_info_tlv()
507 /* Secure boot engine type should be either 1 (ECDSA) or 0 (RSA) */ in btintel_version_info_tlv()
508 if (version->sbe_type > 0x01) { in btintel_version_info_tlv()
509 bt_dev_err(hdev, "Unsupported Intel secure boot engine type (0x%x)", in btintel_version_info_tlv()
510 version->sbe_type); in btintel_version_info_tlv()
511 return -EINVAL; in btintel_version_info_tlv()
514 bt_dev_info(hdev, "Device revision is %u", version->dev_rev_id); in btintel_version_info_tlv()
515 bt_dev_info(hdev, "Secure boot is %s", in btintel_version_info_tlv()
516 str_enabled_disabled(version->secure_boot)); in btintel_version_info_tlv()
517 bt_dev_info(hdev, "OTP lock is %s", in btintel_version_info_tlv()
518 str_enabled_disabled(version->otp_lock)); in btintel_version_info_tlv()
520 str_enabled_disabled(version->api_lock)); in btintel_version_info_tlv()
522 str_enabled_disabled(version->debug_lock)); in btintel_version_info_tlv()
524 version->min_fw_build_nn, version->min_fw_build_cw, in btintel_version_info_tlv()
525 2000 + version->min_fw_build_yy); in btintel_version_info_tlv()
534 bt_dev_err(hdev, "Unsupported image type(%02x)", version->img_type); in btintel_version_info_tlv()
535 return -EINVAL; in btintel_version_info_tlv()
538 coredump_info.hw_variant = INTEL_HW_VARIANT(version->cnvi_bt); in btintel_version_info_tlv()
539 coredump_info.fw_build_num = version->build_num; in btintel_version_info_tlv()
542 2000 + (version->timestamp >> 8), version->timestamp & 0xff, in btintel_version_info_tlv()
543 version->build_type, version->build_num); in btintel_version_info_tlv()
544 if (version->img_type == BTINTEL_IMG_OP) in btintel_version_info_tlv()
545 bt_dev_info(hdev, "Firmware SHA1: 0x%8.8x", version->git_sha1); in btintel_version_info_tlv()
563 while (skb->len) { in btintel_parse_version_tlv()
567 if (skb->len < sizeof(*tlv)) in btintel_parse_version_tlv()
568 return -EINVAL; in btintel_parse_version_tlv()
570 tlv = (struct intel_tlv *)skb->data; in btintel_parse_version_tlv()
573 if (skb->len < tlv->len + sizeof(*tlv)) in btintel_parse_version_tlv()
574 return -EINVAL; in btintel_parse_version_tlv()
576 switch (tlv->type) { in btintel_parse_version_tlv()
578 version->cnvi_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
581 version->cnvr_top = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
584 version->cnvi_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
587 version->cnvr_bt = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
590 version->dev_rev_id = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
593 version->img_type = tlv->val[0]; in btintel_parse_version_tlv()
600 version->min_fw_build_cw = tlv->val[0]; in btintel_parse_version_tlv()
601 version->min_fw_build_yy = tlv->val[1]; in btintel_parse_version_tlv()
602 version->timestamp = get_unaligned_le16(tlv->val); in btintel_parse_version_tlv()
605 version->build_type = tlv->val[0]; in btintel_parse_version_tlv()
612 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
613 version->build_num = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
616 version->secure_boot = tlv->val[0]; in btintel_parse_version_tlv()
619 version->otp_lock = tlv->val[0]; in btintel_parse_version_tlv()
622 version->api_lock = tlv->val[0]; in btintel_parse_version_tlv()
625 version->debug_lock = tlv->val[0]; in btintel_parse_version_tlv()
628 version->min_fw_build_nn = tlv->val[0]; in btintel_parse_version_tlv()
629 version->min_fw_build_cw = tlv->val[1]; in btintel_parse_version_tlv()
630 version->min_fw_build_yy = tlv->val[2]; in btintel_parse_version_tlv()
633 version->limited_cce = tlv->val[0]; in btintel_parse_version_tlv()
636 version->sbe_type = tlv->val[0]; in btintel_parse_version_tlv()
639 memcpy(&version->otp_bd_addr, tlv->val, in btintel_parse_version_tlv()
643 version->git_sha1 = get_unaligned_le32(tlv->val); in btintel_parse_version_tlv()
646 snprintf(version->fw_id, sizeof(version->fw_id), in btintel_parse_version_tlv()
647 "%s", tlv->val); in btintel_parse_version_tlv()
654 skb_pull(skb, tlv->len + sizeof(*tlv)); in btintel_parse_version_tlv()
668 return -EINVAL; in btintel_read_version_tlv()
677 if (skb->data[0]) { in btintel_read_version_tlv()
679 skb->data[0]); in btintel_read_version_tlv()
681 return -EIO; in btintel_read_version_tlv()
690 /* ------- REGMAP IBT SUPPORT ------- */
725 return -EINVAL; in regmap_ibt_read()
738 return -EINVAL; in regmap_ibt_read()
741 /* regmap provides a little-endian formatted addr */ in regmap_ibt_read()
745 bt_dev_dbg(ctx->hdev, "Register (0x%x) read", le32_to_cpu(cp.addr)); in regmap_ibt_read()
747 skb = hci_cmd_sync(ctx->hdev, ctx->op_read, sizeof(cp), &cp, in regmap_ibt_read()
751 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error (%d)", in regmap_ibt_read()
756 if (skb->len != sizeof(*rp) + val_size) { in regmap_ibt_read()
757 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad len", in regmap_ibt_read()
759 err = -EINVAL; in regmap_ibt_read()
763 rp = (struct ibt_rp_reg_access *)skb->data; in regmap_ibt_read()
765 if (rp->addr != cp.addr) { in regmap_ibt_read()
766 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) read error, bad addr", in regmap_ibt_read()
767 le32_to_cpu(rp->addr)); in regmap_ibt_read()
768 err = -EINVAL; in regmap_ibt_read()
772 memcpy(val, rp->data, val_size); in regmap_ibt_read()
791 return -EINVAL; in regmap_ibt_gather_write()
804 return -EINVAL; in regmap_ibt_gather_write()
809 return -ENOMEM; in regmap_ibt_gather_write()
811 /* regmap provides a little-endian formatted addr/value */ in regmap_ibt_gather_write()
812 cp->addr = *(__le32 *)addr; in regmap_ibt_gather_write()
813 cp->mode = mode; in regmap_ibt_gather_write()
814 cp->len = val_size; in regmap_ibt_gather_write()
815 memcpy(&cp->data, val, val_size); in regmap_ibt_gather_write()
817 bt_dev_dbg(ctx->hdev, "Register (0x%x) write", le32_to_cpu(cp->addr)); in regmap_ibt_gather_write()
819 skb = hci_cmd_sync(ctx->hdev, ctx->op_write, plen, cp, HCI_CMD_TIMEOUT); in regmap_ibt_gather_write()
822 bt_dev_err(ctx->hdev, "regmap: Register (0x%x) write error (%d)", in regmap_ibt_gather_write()
823 le32_to_cpu(cp->addr), err); in regmap_ibt_gather_write()
839 return -EINVAL; in regmap_ibt_write()
841 return regmap_ibt_gather_write(context, data, 4, data + 4, count - 4); in regmap_ibt_write()
870 bt_dev_info(hdev, "regmap: Init R%x-W%x region", opcode_read, in btintel_regmap_init()
875 return ERR_PTR(-ENOMEM); in btintel_regmap_init()
877 ctx->op_read = opcode_read; in btintel_regmap_init()
878 ctx->op_write = opcode_write; in btintel_regmap_init()
879 ctx->hdev = hdev; in btintel_regmap_init()
881 return regmap_init(&hdev->dev, &regmap_ibt, ctx, &regmap_ibt_cfg); in btintel_regmap_init()
917 if (skb->len != sizeof(*params)) { in btintel_read_boot_params()
920 return -EILSEQ; in btintel_read_boot_params()
923 memcpy(params, skb->data, sizeof(*params)); in btintel_read_boot_params()
927 if (params->status) { in btintel_read_boot_params()
929 params->status); in btintel_read_boot_params()
930 return -bt_to_errno(params->status); in btintel_read_boot_params()
934 le16_to_cpu(params->dev_revid)); in btintel_read_boot_params()
936 bt_dev_info(hdev, "Secure boot is %s", in btintel_read_boot_params()
937 str_enabled_disabled(params->secure_boot)); in btintel_read_boot_params()
939 bt_dev_info(hdev, "OTP lock is %s", in btintel_read_boot_params()
940 str_enabled_disabled(params->otp_lock)); in btintel_read_boot_params()
943 str_enabled_disabled(params->api_lock)); in btintel_read_boot_params()
946 str_enabled_disabled(params->debug_lock)); in btintel_read_boot_params()
949 params->min_fw_build_nn, params->min_fw_build_cw, in btintel_read_boot_params()
950 2000 + params->min_fw_build_yy); in btintel_read_boot_params()
964 err = btintel_secure_send(hdev, 0x00, 128, fw->data); in btintel_sfi_rsa_header_secure_send()
973 err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); in btintel_sfi_rsa_header_secure_send()
982 err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); in btintel_sfi_rsa_header_secure_send()
1000 err = btintel_secure_send(hdev, 0x00, 128, fw->data + 644); in btintel_sfi_ecdsa_header_secure_send()
1009 err = btintel_secure_send(hdev, 0x03, 96, fw->data + 644 + 128); in btintel_sfi_ecdsa_header_secure_send()
1018 err = btintel_secure_send(hdev, 0x02, 96, fw->data + 644 + 224); in btintel_sfi_ecdsa_header_secure_send()
1035 fw_ptr = fw->data + offset; in btintel_download_firmware_payload()
1037 err = -EINVAL; in btintel_download_firmware_payload()
1039 while (fw_ptr - fw->data < fw->size) { in btintel_download_firmware_payload()
1042 frag_len += sizeof(*cmd) + cmd->plen; in btintel_download_firmware_payload()
1044 /* The parameter length of the secure send command requires in btintel_download_firmware_payload()
1077 fw_ptr = fw->data; in btintel_firmware_version()
1079 while (fw_ptr - fw->data < fw->size) { in btintel_firmware_version()
1087 if (le16_to_cpu(cmd->opcode) == CMD_WRITE_BOOT_PARAMS) { in btintel_firmware_version()
1092 *boot_addr = le32_to_cpu(params->boot_addr); in btintel_firmware_version()
1096 bt_dev_info(hdev, "Firmware Version: %u-%u.%u", in btintel_firmware_version()
1097 params->fw_build_num, params->fw_build_ww, in btintel_firmware_version()
1098 params->fw_build_yy); in btintel_firmware_version()
1100 return (num == params->fw_build_num && in btintel_firmware_version()
1101 ww == params->fw_build_ww && in btintel_firmware_version()
1102 yy == params->fw_build_yy); in btintel_firmware_version()
1105 fw_ptr += sizeof(*cmd) + cmd->plen; in btintel_firmware_version()
1121 switch (ver->hw_variant) { in btintel_download_firmware()
1129 if (btintel_firmware_version(hdev, ver->fw_build_num, in btintel_download_firmware()
1130 ver->fw_build_ww, ver->fw_build_yy, in btintel_download_firmware()
1133 /* Return -EALREADY to indicate that the firmware has in btintel_download_firmware()
1136 return -EALREADY; in btintel_download_firmware()
1148 if (ver->fw_variant == 0x23) in btintel_download_firmware()
1149 return -EINVAL; in btintel_download_firmware()
1168 if (btintel_firmware_version(hdev, ver->min_fw_build_nn, in btintel_download_fw_tlv()
1169 ver->min_fw_build_cw, in btintel_download_fw_tlv()
1170 ver->min_fw_build_yy, in btintel_download_fw_tlv()
1173 /* Return -EALREADY to indicate that firmware has in btintel_download_fw_tlv()
1176 return -EALREADY; in btintel_download_fw_tlv()
1187 if (ver->img_type == BTINTEL_IMG_OP) in btintel_download_fw_tlv()
1188 return -EINVAL; in btintel_download_fw_tlv()
1191 * only RSA secure boot engine. Hence, the corresponding sfi file will in btintel_download_fw_tlv()
1195 * secure boot engine. As a result, the corresponding sfi file will in btintel_download_fw_tlv()
1202 css_header_ver = get_unaligned_le32(fw->data + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1205 return -EINVAL; in btintel_download_fw_tlv()
1212 return -EINVAL; in btintel_download_fw_tlv()
1224 if (fw->data[ECDSA_OFFSET] != 0x06) in btintel_download_fw_tlv()
1225 return -EINVAL; in btintel_download_fw_tlv()
1228 css_header_ver = get_unaligned_le32(fw->data + ECDSA_OFFSET + CSS_HEADER_OFFSET); in btintel_download_fw_tlv()
1231 return -EINVAL; in btintel_download_fw_tlv()
1265 if (hdev->bus == HCI_PCI) in btintel_reset_to_bootloader()
1269 * re-enumeration of BT controller. in btintel_reset_to_bootloader()
1314 /* Intel controller supports two pages, each page is of 128-bit in btintel_read_debug_features()
1325 if (skb->len != (sizeof(features->page1) + 3)) { in btintel_read_debug_features()
1328 return -EILSEQ; in btintel_read_debug_features()
1331 memcpy(features->page1, skb->data + 3, sizeof(features->page1)); in btintel_read_debug_features()
1350 return -EINVAL; in btintel_set_debug_features()
1353 if (!(features->page1[0] & 0x3f)) { in btintel_set_debug_features()
1398 return -EINVAL; in btintel_reset_debug_features()
1401 if (!(features->page1[0] & 0x3f)) { in btintel_reset_debug_features()
1498 return -EOPNOTSUPP; in btintel_register_devcoredump_support()
1514 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq", in btintel_legacy_rom_get_fw()
1515 ver->hw_platform, ver->hw_variant, ver->hw_revision, in btintel_legacy_rom_get_fw()
1516 ver->fw_variant, ver->fw_revision, ver->fw_build_num, in btintel_legacy_rom_get_fw()
1517 ver->fw_build_ww, ver->fw_build_yy); in btintel_legacy_rom_get_fw()
1519 ret = request_firmware(&fw, fwname, &hdev->dev); in btintel_legacy_rom_get_fw()
1521 if (ret == -EINVAL) { in btintel_legacy_rom_get_fw()
1533 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq", in btintel_legacy_rom_get_fw()
1534 ver->hw_platform, ver->hw_variant); in btintel_legacy_rom_get_fw()
1535 if (request_firmware(&fw, fwname, &hdev->dev) < 0) { in btintel_legacy_rom_get_fw()
1556 int remain = fw->size - (*fw_ptr - fw->data); in btintel_legacy_rom_patching()
1567 return -EINVAL; in btintel_legacy_rom_patching()
1570 remain--; in btintel_legacy_rom_patching()
1574 remain -= sizeof(*cmd); in btintel_legacy_rom_patching()
1579 if (remain < cmd->plen) { in btintel_legacy_rom_patching()
1581 return -EFAULT; in btintel_legacy_rom_patching()
1590 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e) in btintel_legacy_rom_patching()
1594 *fw_ptr += cmd->plen; in btintel_legacy_rom_patching()
1595 remain -= cmd->plen; in btintel_legacy_rom_patching()
1606 remain--; in btintel_legacy_rom_patching()
1610 remain -= sizeof(*evt); in btintel_legacy_rom_patching()
1612 if (remain < evt->plen) { in btintel_legacy_rom_patching()
1614 return -EFAULT; in btintel_legacy_rom_patching()
1618 *fw_ptr += evt->plen; in btintel_legacy_rom_patching()
1619 remain -= evt->plen; in btintel_legacy_rom_patching()
1628 return -EFAULT; in btintel_legacy_rom_patching()
1631 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen, in btintel_legacy_rom_patching()
1632 cmd_param, evt->evt, HCI_INIT_TIMEOUT); in btintel_legacy_rom_patching()
1635 cmd->opcode, PTR_ERR(skb)); in btintel_legacy_rom_patching()
1643 if (skb->len != evt->plen) { in btintel_legacy_rom_patching()
1645 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1647 return -EFAULT; in btintel_legacy_rom_patching()
1650 if (memcmp(skb->data, evt_param, evt->plen)) { in btintel_legacy_rom_patching()
1652 le16_to_cpu(cmd->opcode)); in btintel_legacy_rom_patching()
1654 return -EFAULT; in btintel_legacy_rom_patching()
1669 BT_DBG("%s", hdev->name); in btintel_legacy_rom_setup()
1675 if (ver->fw_patch_num) { in btintel_legacy_rom_setup()
1678 ver->fw_patch_num); in btintel_legacy_rom_setup()
1691 fw_ptr = fw->data; in btintel_legacy_rom_setup()
1725 while (fw->size > fw_ptr - fw->data) { in btintel_legacy_rom_setup()
1747 * every power-on boot in btintel_legacy_rom_setup()
1804 if (err == -EINTR) { in btintel_download_wait()
1811 return -ETIMEDOUT; in btintel_download_wait()
1816 return -ENOEXEC; in btintel_download_wait()
1839 if (err == -EINTR) { in btintel_boot_wait()
1841 return -EINTR; in btintel_boot_wait()
1846 return -ETIMEDOUT; in btintel_boot_wait()
1870 if (err == -EINTR) { in btintel_boot_wait_d0()
1872 return -EINTR; in btintel_boot_wait_d0()
1877 return -ETIMEDOUT; in btintel_boot_wait_d0()
1914 if (err == -ETIMEDOUT) { in btintel_boot()
1919 if (hdev->bus == HCI_PCI) { in btintel_boot()
1940 switch (ver->hw_variant) { in btintel_get_fw_name()
1943 snprintf(fw_name, len, "intel/ibt-%u-%u.%s", in btintel_get_fw_name()
1944 ver->hw_variant, in btintel_get_fw_name()
1945 le16_to_cpu(params->dev_revid), in btintel_get_fw_name()
1952 snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s", in btintel_get_fw_name()
1953 ver->hw_variant, in btintel_get_fw_name()
1954 ver->hw_revision, in btintel_get_fw_name()
1955 ver->fw_revision, in btintel_get_fw_name()
1959 return -EINVAL; in btintel_get_fw_name()
1976 return -EINVAL; in btintel_download_fw()
1988 * It is not possible to use the Secure Boot Parameters in this in btintel_download_fw()
1991 if (ver->fw_variant == 0x23) { in btintel_download_fw()
1998 switch (ver->hw_variant) { in btintel_download_fw()
2008 /* Read the secure boot parameters to identify the operating in btintel_download_fw()
2019 if (params->limited_cce != 0x00) { in btintel_download_fw()
2021 params->limited_cce); in btintel_download_fw()
2022 return -EINVAL; in btintel_download_fw()
2025 /* If the OTP has no valid Bluetooth device address, then there will in btintel_download_fw()
2028 if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) { in btintel_download_fw()
2030 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_download_fw()
2038 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi. in btintel_download_fw()
2052 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi. in btintel_download_fw()
2064 return -EINVAL; in btintel_download_fw()
2067 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_download_fw()
2082 if (fw->size < 644) { in btintel_download_fw()
2084 fw->size); in btintel_download_fw()
2085 err = -EBADF; in btintel_download_fw()
2096 if (err == -EALREADY) { in btintel_download_fw()
2122 if (err == -ETIMEDOUT) in btintel_download_fw()
2139 BT_DBG("%s", hdev->name); in btintel_bootloader_setup()
2154 if (ver->fw_variant == 0x23) in btintel_bootloader_setup()
2207 cnvi = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), in btintel_get_fw_name_tlv()
2208 INTEL_CNVX_TOP_STEP(ver->cnvi_top)); in btintel_get_fw_name_tlv()
2210 cnvr = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), in btintel_get_fw_name_tlv()
2211 INTEL_CNVX_TOP_STEP(ver->cnvr_top)); in btintel_get_fw_name_tlv()
2216 if (INTEL_HW_VARIANT(ver->cnvi_bt) >= 0x1e) { in btintel_get_fw_name_tlv()
2219 if (ver->img_type == BTINTEL_IMG_BOOTLOADER) { in btintel_get_fw_name_tlv()
2220 format = "intel/ibt-%04x-%04x-iml.%s"; in btintel_get_fw_name_tlv()
2227 /* ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step-fw_id> */ in btintel_get_fw_name_tlv()
2228 if (memcmp(ver->fw_id, zero, sizeof(zero))) { in btintel_get_fw_name_tlv()
2229 format = "intel/ibt-%04x-%04x-%s.%s"; in btintel_get_fw_name_tlv()
2231 ver->fw_id, suffix); in btintel_get_fw_name_tlv()
2239 * ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step> in btintel_get_fw_name_tlv()
2241 format = "intel/ibt-%04x-%04x.%s"; in btintel_get_fw_name_tlv()
2252 cnvi = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), in btintel_get_iml_tlv()
2253 INTEL_CNVX_TOP_STEP(ver->cnvi_top)); in btintel_get_iml_tlv()
2255 cnvr = INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), in btintel_get_iml_tlv()
2256 INTEL_CNVX_TOP_STEP(ver->cnvr_top)); in btintel_get_iml_tlv()
2258 format = "intel/ibt-%04x-%04x-iml.%s"; in btintel_get_iml_tlv()
2272 return -EINVAL; in btintel_prepare_fw_download_tlv()
2284 * It is not possible to use the Secure Boot Parameters in this in btintel_prepare_fw_download_tlv()
2287 if (ver->img_type == BTINTEL_IMG_OP) { in btintel_prepare_fw_download_tlv()
2296 if (!bacmp(&ver->otp_bd_addr, BDADDR_ANY)) { in btintel_prepare_fw_download_tlv()
2298 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btintel_prepare_fw_download_tlv()
2302 if (ver->img_type == BTINTEL_IMG_OP) { in btintel_prepare_fw_download_tlv()
2308 if (INTEL_HW_VARIANT(ver->cnvi_bt) >= 0x1e) in btintel_prepare_fw_download_tlv()
2316 err = firmware_request_nowarn(&fw, fwname, &hdev->dev); in btintel_prepare_fw_download_tlv()
2332 if (fw->size < 644) { in btintel_prepare_fw_download_tlv()
2334 fw->size); in btintel_prepare_fw_download_tlv()
2335 err = -EBADF; in btintel_prepare_fw_download_tlv()
2345 INTEL_HW_VARIANT(ver->cnvi_bt), in btintel_prepare_fw_download_tlv()
2346 ver->sbe_type); in btintel_prepare_fw_download_tlv()
2348 if (err == -EALREADY) { in btintel_prepare_fw_download_tlv()
2374 if (err == -ETIMEDOUT) in btintel_prepare_fw_download_tlv()
2389 return -EINVAL; in btintel_get_codec_config_data()
2396 return -EINVAL; in btintel_get_codec_config_data()
2401 err = -ENOMEM; in btintel_get_codec_config_data()
2406 switch (codec->id) { in btintel_get_codec_config_data()
2414 err = -EINVAL; in btintel_get_codec_config_data()
2415 bt_dev_err(hdev, "Invalid codec id(%u)", codec->id); in btintel_get_codec_config_data()
2418 /* codec and its capabilities are pre-defined to ids in btintel_get_codec_config_data()
2451 if (skb->len < sizeof(*use_cases)) { in btintel_configure_offload()
2452 err = -EIO; in btintel_configure_offload()
2456 use_cases = (void *)skb->data; in btintel_configure_offload()
2458 if (use_cases->status) { in btintel_configure_offload()
2459 err = -bt_to_errno(skb->data[0]); in btintel_configure_offload()
2463 if (use_cases->preset[0] & 0x03) { in btintel_configure_offload()
2464 hdev->get_data_path_id = btintel_get_data_path_id; in btintel_configure_offload()
2465 hdev->get_codec_config_data = btintel_get_codec_config_data; in btintel_configure_offload()
2483 switch (ver->cnvr_top & 0xFFF) { in btintel_set_ppag()
2488 ver->cnvr_top & 0xFFF); in btintel_set_ppag()
2501 bt_dev_dbg(hdev, "PPAG-BT: ACPI entry not found"); in btintel_set_ppag()
2504 bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status)); in btintel_set_ppag()
2509 if (p->type != ACPI_TYPE_PACKAGE || p->package.count != 2) { in btintel_set_ppag()
2510 bt_dev_warn(hdev, "PPAG-BT: Invalid object type: %d or package count: %d", in btintel_set_ppag()
2511 p->type, p->package.count); in btintel_set_ppag()
2516 elements = p->package.elements; in btintel_set_ppag()
2521 domain = (u32)p->package.elements[0].integer.value; in btintel_set_ppag()
2522 mode = (u32)p->package.elements[1].integer.value; in btintel_set_ppag()
2526 bt_dev_dbg(hdev, "PPAG-BT: Bluetooth domain is disabled in ACPI firmware"); in btintel_set_ppag()
2539 bt_dev_dbg(hdev, "PPAG-BT: EU, China mode are disabled in BIOS"); in btintel_set_ppag()
2551 bt_dev_info(hdev, "PPAG-BT: Enabled (Mode %d)", mode); in btintel_set_ppag()
2565 ret = -ENODEV; in btintel_acpi_reset_method()
2570 if (p->package.count != 1 || p->type != ACPI_TYPE_PACKAGE) { in btintel_acpi_reset_method()
2572 ret = -EINVAL; in btintel_acpi_reset_method()
2576 ref = &p->package.elements[0]; in btintel_acpi_reset_method()
2577 if (ref->type != ACPI_TYPE_LOCAL_REFERENCE) { in btintel_acpi_reset_method()
2578 bt_dev_err(hdev, "Invalid object type: 0x%x", ref->type); in btintel_acpi_reset_method()
2579 ret = -EINVAL; in btintel_acpi_reset_method()
2583 status = acpi_evaluate_object(ref->reference.handle, "_RST", NULL, NULL); in btintel_acpi_reset_method()
2586 ret = -ENODEV; in btintel_acpi_reset_method()
2619 switch (ver_tlv->cnvi_top & 0xfff) { in btintel_set_dsm_reset_method()
2662 data->acpi_reset_method = btintel_acpi_reset_method; in btintel_set_dsm_reset_method()
2674 __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle); in btintel_classify_pkt_type()
2694 * header - defines revision number of the structure
2695 * dsbr - defines drive strength BRI response
2697 * 0 - instructs bluetooth firmware to use default values
2698 * 1 - instructs bluetooth firmware to override default values
2706 * 1. 0xF1 - indicates that the resistor on board is 33 Ohm
2707 * 2. 0x00 or 0xB1 - indicates that the resistor on board is 10 Ohm
2708 * 3. Non existing UEFI variable or invalid (none of the above) - indicates
2727 return -EOPNOTSUPP; in btintel_uefi_get_dsbr()
2730 return -EOPNOTSUPP; in btintel_uefi_get_dsbr()
2736 return -EIO; in btintel_uefi_get_dsbr()
2742 return -ENXIO; in btintel_uefi_get_dsbr()
2761 cnvi = ver->cnvi_top & 0xfff; in btintel_set_dsbr()
2771 if (ver->img_type == BTINTEL_IMG_IML && in btintel_set_dsbr()
2772 INTEL_CNVX_TOP_STEP(ver->cnvi_top) == 0x01) in btintel_set_dsbr()
2777 if (ver->img_type == BTINTEL_IMG_OP && in btintel_set_dsbr()
2778 hdev->bus == HCI_USB) in btintel_set_dsbr()
2782 if (ver->img_type == BTINTEL_IMG_IML) in btintel_set_dsbr()
2803 return -bt_to_errno(PTR_ERR(skb)); in btintel_set_dsbr()
2805 status = skb->data[0]; in btintel_set_dsbr()
2809 return -bt_to_errno(status); in btintel_set_dsbr()
2827 bt_dev_dbg(hdev, "ACPI-BT: No ACPI support for Bluetooth device"); in btintel_evaluate_acpi_method()
2834 bt_dev_dbg(hdev, "ACPI-BT: ACPI Failure: %s method: %s", in btintel_evaluate_acpi_method()
2841 if (p->type != ACPI_TYPE_PACKAGE || p->package.count < pkg_size) { in btintel_evaluate_acpi_method()
2842 bt_dev_warn(hdev, "ACPI-BT: Invalid object type: %d or package count: %d", in btintel_evaluate_acpi_method()
2843 p->type, p->package.count); in btintel_evaluate_acpi_method()
2857 for (i = 1; i < buffer->package.count; i++) { in btintel_acpi_get_bt_pkg()
2858 bt_pkg = &buffer->package.elements[i]; in btintel_acpi_get_bt_pkg()
2859 domain = &bt_pkg->package.elements[0]; in btintel_acpi_get_bt_pkg()
2860 if (domain->type == ACPI_TYPE_INTEGER && in btintel_acpi_get_bt_pkg()
2861 domain->integer.value == BTINTEL_BT_DOMAIN) in btintel_acpi_get_bt_pkg()
2864 return ERR_PTR(-ENOENT); in btintel_acpi_get_bt_pkg()
2874 le16_to_cpu(data->id), PTR_ERR(skb)); in btintel_send_sar_ddc()
2884 cmd->len = 5; in btintel_send_edr()
2885 cmd->id = cpu_to_le16(id); in btintel_send_edr()
2886 cmd->data[0] = sar->br >> 3; in btintel_send_edr()
2887 cmd->data[1] = sar->edr2 >> 3; in btintel_send_edr()
2888 cmd->data[2] = sar->edr3 >> 3; in btintel_send_edr()
2895 cmd->len = 3; in btintel_send_le()
2896 cmd->id = cpu_to_le16(id); in btintel_send_le()
2897 cmd->data[0] = min3(sar->le, sar->le_lr, sar->le_2mhz) >> 3; in btintel_send_le()
2904 cmd->len = 3; in btintel_send_br()
2905 cmd->id = cpu_to_le16(id); in btintel_send_br()
2906 cmd->data[0] = sar->br >> 3; in btintel_send_br()
2913 cmd->len = 3; in btintel_send_br_mutual()
2914 cmd->id = cpu_to_le16(id); in btintel_send_br_mutual()
2915 cmd->data[0] = sar->br; in btintel_send_br_mutual()
2922 cmd->len = 3; in btintel_send_edr2()
2923 cmd->id = cpu_to_le16(id); in btintel_send_edr2()
2924 cmd->data[0] = sar->edr2; in btintel_send_edr2()
2931 cmd->len = 3; in btintel_send_edr3()
2932 cmd->id = cpu_to_le16(id); in btintel_send_edr3()
2933 cmd->data[0] = sar->edr3; in btintel_send_edr3()
2983 cmd->len = 3; in btintel_set_mutual_sar()
2984 cmd->id = cpu_to_le16(0x019e); in btintel_set_mutual_sar()
2986 if (sar->revision == BTINTEL_SAR_INC_PWR && in btintel_set_mutual_sar()
2987 sar->inc_power_mode == BTINTEL_SAR_INC_PWR_SUPPORTED) in btintel_set_mutual_sar()
2988 cmd->data[0] = 0x01; in btintel_set_mutual_sar()
2990 cmd->data[0] = 0x00; in btintel_set_mutual_sar()
2996 if (sar->revision == BTINTEL_SAR_INC_PWR && in btintel_set_mutual_sar()
2997 sar->inc_power_mode == BTINTEL_SAR_INC_PWR_SUPPORTED) { in btintel_set_mutual_sar()
2998 cmd->len = 3; in btintel_set_mutual_sar()
2999 cmd->id = cpu_to_le16(0x019f); in btintel_set_mutual_sar()
3000 cmd->data[0] = sar->sar_2400_chain_a; in btintel_set_mutual_sar()
3040 cnvi = ver->cnvi_top & 0xfff; in btintel_sar_send_to_device()
3041 cnvr = ver->cnvr_top & 0xfff; in btintel_sar_send_to_device()
3050 ret = -EOPNOTSUPP; in btintel_sar_send_to_device()
3066 return -ENOENT; in btintel_acpi_set_sar()
3075 if (!bt_pkg->package.count) { in btintel_acpi_set_sar()
3076 ret = -EINVAL; in btintel_acpi_set_sar()
3080 revision = buffer->package.elements[0].integer.value; in btintel_acpi_set_sar()
3084 ret = -EOPNOTSUPP; in btintel_acpi_set_sar()
3090 if (revision == BTINTEL_SAR_LEGACY && bt_pkg->package.count == 8) { in btintel_acpi_set_sar()
3092 sar.bt_sar_bios = bt_pkg->package.elements[1].integer.value; in btintel_acpi_set_sar()
3093 sar.br = bt_pkg->package.elements[2].integer.value; in btintel_acpi_set_sar()
3094 sar.edr2 = bt_pkg->package.elements[3].integer.value; in btintel_acpi_set_sar()
3095 sar.edr3 = bt_pkg->package.elements[4].integer.value; in btintel_acpi_set_sar()
3096 sar.le = bt_pkg->package.elements[5].integer.value; in btintel_acpi_set_sar()
3097 sar.le_2mhz = bt_pkg->package.elements[6].integer.value; in btintel_acpi_set_sar()
3098 sar.le_lr = bt_pkg->package.elements[7].integer.value; in btintel_acpi_set_sar()
3100 } else if (revision == BTINTEL_SAR_INC_PWR && bt_pkg->package.count == 10) { in btintel_acpi_set_sar()
3102 sar.bt_sar_bios = bt_pkg->package.elements[1].integer.value; in btintel_acpi_set_sar()
3103 sar.inc_power_mode = bt_pkg->package.elements[2].integer.value; in btintel_acpi_set_sar()
3104 sar.sar_2400_chain_a = bt_pkg->package.elements[3].integer.value; in btintel_acpi_set_sar()
3105 sar.br = bt_pkg->package.elements[4].integer.value; in btintel_acpi_set_sar()
3106 sar.edr2 = bt_pkg->package.elements[5].integer.value; in btintel_acpi_set_sar()
3107 sar.edr3 = bt_pkg->package.elements[6].integer.value; in btintel_acpi_set_sar()
3108 sar.le = bt_pkg->package.elements[7].integer.value; in btintel_acpi_set_sar()
3109 sar.le_2mhz = bt_pkg->package.elements[8].integer.value; in btintel_acpi_set_sar()
3110 sar.le_lr = bt_pkg->package.elements[9].integer.value; in btintel_acpi_set_sar()
3112 ret = -EINVAL; in btintel_acpi_set_sar()
3119 ret = -EOPNOTSUPP; in btintel_acpi_set_sar()
3169 if (ver->img_type == BTINTEL_IMG_OP) in btintel_bootloader_setup_tlv()
3190 if (ver->img_type == BTINTEL_IMG_IML) { in btintel_bootloader_setup_tlv()
3285 if (skb->len < (sizeof(u32) * 16 + 2)) { in btintel_print_fseq_info()
3287 skb->len); in btintel_print_fseq_info()
3332 p = skb->data; in btintel_print_fseq_info()
3337 p = skb->data; in btintel_print_fseq_info()
3376 bt_dev_dbg(hdev, "Fseq OTP version: 0x%8.8x", val); in btintel_print_fseq_info()
3379 bt_dev_dbg(hdev, "Fseq MBX otp version: 0x%8.8x", val); in btintel_print_fseq_info()
3393 BT_DBG("%s", hdev->name); in btintel_setup_combined()
3436 if (skb->data[0]) { in btintel_setup_combined()
3438 skb->data[0]); in btintel_setup_combined()
3439 err = -EIO; in btintel_setup_combined()
3444 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btintel_setup_combined()
3445 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btintel_setup_combined()
3446 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); in btintel_setup_combined()
3449 hdev->set_quality_report = btintel_set_quality_report; in btintel_setup_combined()
3452 if (skb->len == sizeof(ver) && skb->data[1] == 0x37) { in btintel_setup_combined()
3455 memcpy(&ver, skb->data, sizeof(ver)); in btintel_setup_combined()
3475 * WBS for SdP - For the Legacy ROM products, only SdP in btintel_setup_combined()
3485 &hdev->quirks); in btintel_setup_combined()
3501 &hdev->quirks); in btintel_setup_combined()
3504 set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks); in btintel_setup_combined()
3515 err = -EINVAL; in btintel_setup_combined()
3540 err = -EINVAL; in btintel_setup_combined()
3580 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btintel_setup_combined()
3583 set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks); in btintel_setup_combined()
3593 /* Re-classify packet type for controllers with LE audio */ in btintel_setup_combined()
3594 hdev->classify_pkt_type = btintel_classify_pkt_type; in btintel_setup_combined()
3609 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btintel_setup_combined()
3626 err = -EINVAL; in btintel_setup_combined()
3678 hdev->manufacturer = 2; in btintel_configure_setup()
3679 hdev->setup = btintel_setup_combined; in btintel_configure_setup()
3680 hdev->shutdown = btintel_shutdown_combined; in btintel_configure_setup()
3681 hdev->hw_error = btintel_hw_error; in btintel_configure_setup()
3682 hdev->set_diag = btintel_set_diag_combined; in btintel_configure_setup()
3683 hdev->set_bdaddr = btintel_set_bdaddr; in btintel_configure_setup()
3693 struct intel_tlv *tlv = (void *)&skb->data[5]; in btintel_diagnostics()
3696 if (tlv->type != INTEL_TLV_TYPE_ID) in btintel_diagnostics()
3699 switch (tlv->val[0]) { in btintel_diagnostics()
3705 if (!hci_devcd_init(hdev, skb->len)) { in btintel_diagnostics()
3713 bt_dev_err(hdev, "Invalid exception type %02X", tlv->val[0]); in btintel_diagnostics()
3723 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_recv_event()
3726 if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff && in btintel_recv_event()
3727 hdr->plen > 0) { in btintel_recv_event()
3728 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_recv_event()
3729 unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1; in btintel_recv_event()
3732 switch (skb->data[2]) { in btintel_recv_event()
3757 memcmp(&skb->data[2], diagnostics_hdr, in btintel_recv_event()
3787 if (evt->result) in btintel_secure_send_result()
3800 MODULE_FIRMWARE("intel/ibt-11-5.sfi");
3801 MODULE_FIRMWARE("intel/ibt-11-5.ddc");
3802 MODULE_FIRMWARE("intel/ibt-12-16.sfi");
3803 MODULE_FIRMWARE("intel/ibt-12-16.ddc");