I encounter same problem with Jetson nano and Intel AX200 and this procedure is my solution.
-
Check the firmware in /lib/firmware/intel
You need the ibt-20-1-3.ddc and ibt-20-1-3.sfi
-
Edit Linux kernel for Tegra
linux_for_Tegra/source/public/kernel_src/kernel/kernel-4.9/drivers/bluetooth/btusb.c
Add new device in variable: blacklist_table
/* Intel Bluetooth devices */
{ USB_DEVICE(0x8087, 0x0029), .driver_info = BTUSB_INTEL_NEW | 0x400000 },
...
...
Add new function: btusb_setup_intel_new_get_fw_name
static bool btusb_setup_intel_new_get_fw_name(struct intel_version *ver,
struct intel_boot_params *params,
char *fw_name, size_t len,
const char *suffix)
{
switch (ver->hw_variant) {
case 0x0b: /* SfP */
case 0x0c: /* WsP */
snprintf(fw_name, len, "intel/ibt-%u-%u.%s",
le16_to_cpu(ver->hw_variant),
le16_to_cpu(params->dev_revid),
suffix);
break;
case 0x11: /* JfP */
case 0x12: /* ThP */
case 0x13: /* HrP */
case 0x14: /* CcP */
snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s",
le16_to_cpu(ver->hw_variant),
le16_to_cpu(ver->dev_revid),
le16_to_cpu(ver->fw_revision),
suffix);
break;
default:
return false;
}
return true;
}
Edit function: btusb_setup_intel_new
- Add 0x0b, 0x0c, 0x11, 0x12, 0x13, 0x14 to support intel hardware(ver.hw_variant)
- Parse sfi and ddc filename by btusb_setup_intel_new_get_fw_name
...
...
/* At the moment the iBT 3.0 hardware variants 0x0b (LnP/SfP)
* and 0x0c (WsP) are supported by this firmware loading method.
*
* This check has been put in place to ensure correct forward
* compatibility options when newer hardware variants come along.
*/
switch (ver.hw_variant) {
case 0x0b: /* SfP */
case 0x0c: /* WsP */
case 0x11: /* JfP */
case 0x12: /* ThP */
case 0x13: /* HrP */
case 0x14: /* CcP */
break;
default:
bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)", ver.hw_variant);
return -EINVAL;
}
btintel_version_info(hdev, &ver);
...
...
err = btusb_setup_intel_new_get_fw_name(&ver, params, fwname,
sizeof(fwname), "sfi");
if (!err) {
bt_dev_err(hdev, "Unsupported Intel firmware naming");
return -EINVAL;
}
err = request_firmware(&fw, fwname, &hdev->dev);
if (err < 0) {
BT_ERR("%s: Failed to load Intel firmware file (%d)",
hdev->name, err);
kfree_skb(skb);
return err;
}
BT_INFO("%s: Found device firmware: %s", hdev->name, fwname);
/* Save the DDC file name for later use to apply once the firmware
* downloading is done.
*/
err = btusb_setup_intel_new_get_fw_name(&ver, params, fwname, sizeof(fwname), "ddc");
if (!err) {
bt_dev_err(hdev, "Unsupported Intel firmware naming");
return -EINVAL;
}
Replace the btusb.ko by new one