]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: HCI: Fix tracking of advertisement set/instance 0x00
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 1 Oct 2025 14:55:58 +0000 (10:55 -0400)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 24 Oct 2025 14:21:07 +0000 (10:21 -0400)
This fixes the state tracking of advertisement set/instance 0x00 which
is considered a legacy instance and is not tracked individually by
adv_instances list, previously it was assumed that hci_dev itself would
track it via HCI_LE_ADV but that is a global state not specifc to
instance 0x00, so to fix it a new flag is introduced that only tracks the
state of instance 0x00.

Fixes: 1488af7b8b5f ("Bluetooth: hci_sync: Fix hci_resume_advertising_sync")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
include/net/bluetooth/hci.h
net/bluetooth/hci_event.c
net/bluetooth/hci_sync.c

index 9ecc70baaca97a9748a4b2f36aa8de2ce30b4978..8d0e703bc929e870ef15d1c385e62474fe2f7895 100644 (file)
@@ -434,6 +434,7 @@ enum {
        HCI_USER_CHANNEL,
        HCI_EXT_CONFIGURED,
        HCI_LE_ADV,
+       HCI_LE_ADV_0,
        HCI_LE_PER_ADV,
        HCI_LE_SCAN,
        HCI_SSP_ENABLED,
index d790b0d4eb9ace6719d1ff062bda1131f28d730c..1dabf5a7ae188dcf8d9706be959f61187f0ac692 100644 (file)
@@ -1609,6 +1609,8 @@ static u8 hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev, void *data,
 
                if (adv && !adv->periodic)
                        adv->enabled = true;
+               else if (!set->handle)
+                       hci_dev_set_flag(hdev, HCI_LE_ADV_0);
 
                conn = hci_lookup_le_connect(hdev);
                if (conn)
@@ -1619,6 +1621,8 @@ static u8 hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev, void *data,
                if (cp->num_of_sets) {
                        if (adv)
                                adv->enabled = false;
+                       else if (!set->handle)
+                               hci_dev_clear_flag(hdev, HCI_LE_ADV_0);
 
                        /* If just one instance was disabled check if there are
                         * any other instance enabled before clearing HCI_LE_ADV
index d160e5e1fe8ab31db02dd383276cb07289ddaa61..28ad08cd7d70671603dd307c4cd591d60af1f9d8 100644 (file)
@@ -2606,9 +2606,8 @@ static int hci_resume_advertising_sync(struct hci_dev *hdev)
                /* If current advertising instance is set to instance 0x00
                 * then we need to re-enable it.
                 */
-               if (!hdev->cur_adv_instance)
-                       err = hci_enable_ext_advertising_sync(hdev,
-                                                             hdev->cur_adv_instance);
+               if (hci_dev_test_and_clear_flag(hdev, HCI_LE_ADV_0))
+                       err = hci_enable_ext_advertising_sync(hdev, 0x00);
        } else {
                /* Schedule for most recent instance to be restarted and begin
                 * the software rotation loop