There's a recovery mechanism via `cmd_timeout` that the btusb driver uses to recover from these issues. For Intel chipsets, this requires having a reset gpio available and listed in the ACPI/DeviceTree. From the logs above, it looks like that's not the case.
If you don't mind patching your kernel, you could try the following and see if it helps (you will need the series I linked above as well if you're not using bluetooth-next master branch).
if (!reset_gpio) {
- bt_dev_err(hdev, "No way to reset. Ignoring and continuing");
+ bt_dev_err(hdev, "No reset gpio. Resetting usb instead.");
+ btusb_qca_cmd_timeout(hdev); return;
}
There's a recovery mechanism via `cmd_timeout` that the btusb driver uses to recover from these issues. For Intel chipsets, this requires having a reset gpio available and listed in the ACPI/DeviceTree. From the logs above, it looks like that's not the case.
I've had some success on a QCA chipset (6174A) by just resetting the port when this happens (see https:/ /patchwork. kernel. org/patch/ 11624041/)
If you don't mind patching your kernel, you could try the following and see if it helps (you will need the series I linked above as well if you're not using bluetooth-next master branch).
diff --git a/drivers/ bluetooth/ btusb.c b/drivers/ bluetooth/ btusb.c .cf86104fd62018 100644 bluetooth/ btusb.c bluetooth/ btusb.c
index 0e143c0cecf2a1.
--- a/drivers/
+++ b/drivers/
@@ -511,6 +511,7 @@ struct btusb_data {
unsigned cmd_timeout_cnt;
};
+static void btusb_qca_ cmd_timeout( struct hci_dev *hdev); cmd_timeout( struct hci_dev *hdev) drvdata( hdev); cmd_timeout( struct hci_dev *hdev)
return;
static void btusb_intel_
{
struct btusb_data *data = hci_get_
@@ -520,7 +521,8 @@ static void btusb_intel_
if (!reset_gpio) { cmd_timeout( hdev);
return;
- bt_dev_err(hdev, "No way to reset. Ignoring and continuing");
+ bt_dev_err(hdev, "No reset gpio. Resetting usb instead.");
+ btusb_qca_
}