Bluetooth: hci_sync: Fix handling of HCI_QUIRK_STRICT_DUPLICATE_FILTER
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 29 Aug 2023 20:50:06 +0000 (13:50 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 20 Sep 2023 18:00:49 +0000 (11:00 -0700)
When HCI_QUIRK_STRICT_DUPLICATE_FILTER is set LE scanning requires
periodic restarts of the scanning procedure as the controller would
consider device previously found as duplicated despite of RSSI changes,
but in order to set the scan timeout properly set le_scan_restart needs
to be synchronous so it shall not use hci_cmd_sync_queue which defers
the command processing to cmd_sync_work.

Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/linux-bluetooth/578e6d7afd676129decafba846a933f5@agner.ch/#t
Fixes: 27d54b778ad1 ("Bluetooth: Rework le_scan_restart for hci_sync")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_sync.c

index 9b93653c6197300eb5f4c8d55dd3f38557b1976d..fd7c5d90285688d1d6a6b9425560ce10c12b33de 100644 (file)
@@ -413,11 +413,6 @@ static int hci_le_scan_restart_sync(struct hci_dev *hdev)
                                           LE_SCAN_FILTER_DUP_ENABLE);
 }
 
-static int le_scan_restart_sync(struct hci_dev *hdev, void *data)
-{
-       return hci_le_scan_restart_sync(hdev);
-}
-
 static void le_scan_restart(struct work_struct *work)
 {
        struct hci_dev *hdev = container_of(work, struct hci_dev,
@@ -427,15 +422,15 @@ static void le_scan_restart(struct work_struct *work)
 
        bt_dev_dbg(hdev, "");
 
-       hci_dev_lock(hdev);
-
-       status = hci_cmd_sync_queue(hdev, le_scan_restart_sync, NULL, NULL);
+       status = hci_le_scan_restart_sync(hdev);
        if (status) {
                bt_dev_err(hdev, "failed to restart LE scan: status %d",
                           status);
-               goto unlock;
+               return;
        }
 
+       hci_dev_lock(hdev);
+
        if (!test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks) ||
            !hdev->discovery.scan_start)
                goto unlock;