Lines Matching +full:on +full:- +full:chip +full:- +full:buff +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0-or-later
212 if (skb->len != sizeof(struct hci_rp_read_local_version)) { in btrtl_read_local_version()
215 return ERR_PTR(-EIO); in btrtl_read_local_version()
234 if (skb->len != sizeof(*rom_version)) { in rtl_read_rom_version()
237 return -EIO; in rtl_read_rom_version()
240 rom_version = (struct rtl_rom_version_evt *)skb->data; in rtl_read_rom_version()
242 rom_version->status, rom_version->version); in rtl_read_rom_version()
244 *version = rom_version->version; in rtl_read_rom_version()
260 int project_id = -1; in rtlbt_parse_firmware()
281 if (btrtl_dev->fw_len < min_size) in rtlbt_parse_firmware()
282 return -EINVAL; in rtlbt_parse_firmware()
284 fwptr = btrtl_dev->fw_data + btrtl_dev->fw_len - sizeof(extension_sig); in rtlbt_parse_firmware()
287 return -EINVAL; in rtlbt_parse_firmware()
293 * Once we have that, we double-check that that project_id is suitable in rtlbt_parse_firmware()
296 while (fwptr >= btrtl_dev->fw_data + (sizeof(*epatch_info) + 3)) { in rtlbt_parse_firmware()
297 opcode = *--fwptr; in rtlbt_parse_firmware()
298 length = *--fwptr; in rtlbt_parse_firmware()
299 data = *--fwptr; in rtlbt_parse_firmware()
308 return -EINVAL; in rtlbt_parse_firmware()
316 fwptr -= length; in rtlbt_parse_firmware()
321 return -EINVAL; in rtlbt_parse_firmware()
332 return -EINVAL; in rtlbt_parse_firmware()
335 if (btrtl_dev->ic_info->lmp_subver != in rtlbt_parse_firmware()
339 btrtl_dev->ic_info->lmp_subver); in rtlbt_parse_firmware()
340 return -EINVAL; in rtlbt_parse_firmware()
343 epatch_info = (struct rtl_epatch_header *)btrtl_dev->fw_data; in rtlbt_parse_firmware()
344 if (memcmp(epatch_info->signature, RTL_EPATCH_SIGNATURE, 8) != 0) { in rtlbt_parse_firmware()
346 return -EINVAL; in rtlbt_parse_firmware()
349 num_patches = le16_to_cpu(epatch_info->num_patches); in rtlbt_parse_firmware()
351 le32_to_cpu(epatch_info->fw_version), num_patches); in rtlbt_parse_firmware()
357 * Find the right patch for this chip. in rtlbt_parse_firmware()
360 if (btrtl_dev->fw_len < min_size) in rtlbt_parse_firmware()
361 return -EINVAL; in rtlbt_parse_firmware()
363 chip_id_base = btrtl_dev->fw_data + sizeof(struct rtl_epatch_header); in rtlbt_parse_firmware()
369 if (chip_id == btrtl_dev->rom_version + 1) { in rtlbt_parse_firmware()
379 rtl_dev_err(hdev, "didn't find patch for chip id %d", in rtlbt_parse_firmware()
380 btrtl_dev->rom_version); in rtlbt_parse_firmware()
381 return -EINVAL; in rtlbt_parse_firmware()
386 if (btrtl_dev->fw_len < min_size) in rtlbt_parse_firmware()
387 return -EINVAL; in rtlbt_parse_firmware()
395 return -ENOMEM; in rtlbt_parse_firmware()
397 memcpy(buf, btrtl_dev->fw_data + patch_offset, patch_length - 4); in rtlbt_parse_firmware()
398 memcpy(buf + patch_length - 4, &epatch_info->fw_version, 4); in rtlbt_parse_firmware()
417 return -ENOMEM; in rtl_download_firmware()
425 dl_cmd->index = (i & 0x7f) + 1; in rtl_download_firmware()
427 dl_cmd->index = i; in rtl_download_firmware()
429 if (i == (frag_num - 1)) { in rtl_download_firmware()
430 dl_cmd->index |= 0x80; /* data end */ in rtl_download_firmware()
433 memcpy(dl_cmd->data, data, frag_len); in rtl_download_firmware()
445 if (skb->len != sizeof(struct rtl_download_response)) { in rtl_download_firmware()
448 ret = -EIO; in rtl_download_firmware()
463 rp = (struct hci_rp_read_local_version *)skb->data; in rtl_download_firmware()
465 __le16_to_cpu(rp->hci_rev), __le16_to_cpu(rp->lmp_subver)); in rtl_download_firmware()
473 static int rtl_load_file(struct hci_dev *hdev, const char *name, u8 **buff) in rtl_load_file() argument
479 ret = request_firmware(&fw, name, &hdev->dev); in rtl_load_file()
482 ret = fw->size; in rtl_load_file()
483 *buff = kvmalloc(fw->size, GFP_KERNEL); in rtl_load_file()
484 if (*buff) in rtl_load_file()
485 memcpy(*buff, fw->data, ret); in rtl_load_file()
487 ret = -ENOMEM; in rtl_load_file()
497 if (btrtl_dev->fw_len < 8) in btrtl_setup_rtl8723a()
498 return -EINVAL; in btrtl_setup_rtl8723a()
503 if (!memcmp(btrtl_dev->fw_data, RTL_EPATCH_SIGNATURE, 8)) { in btrtl_setup_rtl8723a()
505 return -EINVAL; in btrtl_setup_rtl8723a()
508 return rtl_download_firmware(hdev, btrtl_dev->fw_data, in btrtl_setup_rtl8723a()
509 btrtl_dev->fw_len); in btrtl_setup_rtl8723a()
523 if (btrtl_dev->cfg_len > 0) { in btrtl_setup_rtl8723b()
524 tbuff = kvzalloc(ret + btrtl_dev->cfg_len, GFP_KERNEL); in btrtl_setup_rtl8723b()
526 ret = -ENOMEM; in btrtl_setup_rtl8723b()
533 memcpy(tbuff + ret, btrtl_dev->cfg_data, btrtl_dev->cfg_len); in btrtl_setup_rtl8723b()
534 ret += btrtl_dev->cfg_len; in btrtl_setup_rtl8723b()
539 rtl_dev_info(hdev, "cfg_sz %d, total sz %d", btrtl_dev->cfg_len, ret); in btrtl_setup_rtl8723b()
550 kvfree(btrtl_dev->fw_data); in btrtl_free()
551 kvfree(btrtl_dev->cfg_data); in btrtl_free()
569 ret = -ENOMEM; in btrtl_initialize()
579 resp = (struct hci_rp_read_local_version *)skb->data; in btrtl_initialize()
581 resp->hci_ver, resp->hci_rev, in btrtl_initialize()
582 resp->lmp_ver, resp->lmp_subver); in btrtl_initialize()
584 hci_ver = resp->hci_ver; in btrtl_initialize()
585 hci_rev = le16_to_cpu(resp->hci_rev); in btrtl_initialize()
586 lmp_subver = le16_to_cpu(resp->lmp_subver); in btrtl_initialize()
589 btrtl_dev->ic_info = btrtl_match_ic(lmp_subver, hci_rev, hci_ver, in btrtl_initialize()
590 hdev->bus); in btrtl_initialize()
592 if (!btrtl_dev->ic_info) { in btrtl_initialize()
598 if (btrtl_dev->ic_info->has_rom_version) { in btrtl_initialize()
599 ret = rtl_read_rom_version(hdev, &btrtl_dev->rom_version); in btrtl_initialize()
604 btrtl_dev->fw_len = rtl_load_file(hdev, btrtl_dev->ic_info->fw_name, in btrtl_initialize()
605 &btrtl_dev->fw_data); in btrtl_initialize()
606 if (btrtl_dev->fw_len < 0) { in btrtl_initialize()
608 btrtl_dev->ic_info->fw_name); in btrtl_initialize()
609 ret = btrtl_dev->fw_len; in btrtl_initialize()
613 if (btrtl_dev->ic_info->cfg_name) { in btrtl_initialize()
615 snprintf(cfg_name, sizeof(cfg_name), "%s-%s.bin", in btrtl_initialize()
616 btrtl_dev->ic_info->cfg_name, postfix); in btrtl_initialize()
619 btrtl_dev->ic_info->cfg_name); in btrtl_initialize()
621 btrtl_dev->cfg_len = rtl_load_file(hdev, cfg_name, in btrtl_initialize()
622 &btrtl_dev->cfg_data); in btrtl_initialize()
623 if (btrtl_dev->ic_info->config_needed && in btrtl_initialize()
624 btrtl_dev->cfg_len <= 0) { in btrtl_initialize()
626 btrtl_dev->ic_info->cfg_name); in btrtl_initialize()
627 ret = btrtl_dev->cfg_len; in btrtl_initialize()
650 if (!btrtl_dev->ic_info) { in btrtl_download_firmware()
655 switch (btrtl_dev->ic_info->lmp_subver) { in btrtl_download_firmware()
687 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btrtl_setup_realtek()
698 /* According to the vendor driver, BT must be reset on close to avoid in btrtl_shutdown_realtek()
760 total_data_len = btrtl_dev->cfg_len - sizeof(*config); in btrtl_get_uart_settings()
763 return -EINVAL; in btrtl_get_uart_settings()
766 config = (struct rtl_vendor_config *)btrtl_dev->cfg_data; in btrtl_get_uart_settings()
767 if (le32_to_cpu(config->signature) != RTL_CONFIG_MAGIC) { in btrtl_get_uart_settings()
769 return -EINVAL; in btrtl_get_uart_settings()
772 if (total_data_len < le16_to_cpu(config->total_len)) { in btrtl_get_uart_settings()
774 return -EINVAL; in btrtl_get_uart_settings()
778 entry = ((void *)config->entry) + i; in btrtl_get_uart_settings()
780 switch (le16_to_cpu(entry->offset)) { in btrtl_get_uart_settings()
782 if (entry->len < sizeof(*device_baudrate)) { in btrtl_get_uart_settings()
784 return -EINVAL; in btrtl_get_uart_settings()
787 *device_baudrate = get_unaligned_le32(entry->data); in btrtl_get_uart_settings()
791 if (entry->len >= 13) in btrtl_get_uart_settings()
792 *flow_control = !!(entry->data[12] & BIT(2)); in btrtl_get_uart_settings()
801 le16_to_cpu(entry->offset), entry->len); in btrtl_get_uart_settings()
805 i += sizeof(*entry) + entry->len; in btrtl_get_uart_settings()
810 return -ENOENT; in btrtl_get_uart_settings()