|
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
|
index 8c41c76..9632251 100644 |
|
--- a/drivers/bluetooth/btusb.c |
|
+++ b/drivers/bluetooth/btusb.c |
|
@@ -1979,6 +1979,8 @@ static int btusb_setup_csr(struct hci_dev *hdev) |
|
*/ |
|
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); |
|
set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks); |
|
+ set_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks); |
|
+ set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks); |
|
|
|
/* Clear the reset quirk since this is not an actual |
|
* early Bluetooth 1.1 device from CSR. |
|
@@ -2018,7 +2020,7 @@ static int btusb_setup_csr(struct hci_dev *hdev) |
|
if (ret >= 0) |
|
msleep(200); |
|
else |
|
- bt_dev_err(hdev, "CSR: Failed to suspend the device for our Barrot 8041a02 receive-issue workaround"); |
|
+ bt_dev_warn(hdev, "CSR: Couldn't suspend the device for our Barrot 8041a02 receive-issue workaround"); |
|
|
|
pm_runtime_forbid(&data->udev->dev); |
|
|
|
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h |
|
index 9ce46cb..b97602a 100644 |
|
--- a/include/net/bluetooth/hci.h |
|
+++ b/include/net/bluetooth/hci.h |
|
@@ -255,6 +255,7 @@ enum { |
|
* during the hdev->setup vendor callback. |
|
*/ |
|
HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, |
|
+ HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, |
|
}; |
|
|
|
/* HCI device flags */ |
|
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c |
|
index bb84ff5..2a7af9a 100644 |
|
--- a/net/bluetooth/hci_core.c |
|
+++ b/net/bluetooth/hci_core.c |
|
@@ -294,6 +294,7 @@ static void bredr_setup(struct hci_request *req) |
|
|
|
/* Clear Event Filters */ |
|
flt_type = HCI_FLT_CLEAR_ALL; |
|
+ if (!test_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &req->hdev->quirks)) |
|
hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type); |
|
|
|
/* Connection accept timeout ~20 secs */ |
|
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c |
|
index c2db60a..39a871a 100644 |
|
--- a/net/bluetooth/hci_request.c |
|
+++ b/net/bluetooth/hci_request.c |
|
@@ -1160,6 +1160,9 @@ static void hci_req_clear_event_filter(struct hci_request *req) |
|
if (!hci_dev_test_flag(req->hdev, HCI_BREDR_ENABLED)) |
|
return; |
|
|
|
+ if (test_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &req->hdev->quirks)) |
|
+ return; |
|
+ |
|
if (hci_dev_test_flag(req->hdev, HCI_EVENT_FILTER_CONFIGURED)) { |
|
memset(&f, 0, sizeof(f)); |
|
f.flt_type = HCI_FLT_CLEAR_ALL; |
|
@@ -1178,6 +1181,9 @@ static void hci_req_set_event_filter(struct hci_request *req) |
|
if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) |
|
return; |
|
|
|
+ if (test_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks)) |
|
+ return; |
|
+ |
|
/* Always clear event filter when starting */ |
|
hci_req_clear_event_filter(req); |