mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
Bluetooth: HCI: Fix tracking of advertisement set/instance 0x00
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: 1488af7b8b ("Bluetooth: hci_sync: Fix hci_resume_advertising_sync")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user