mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01: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:
parent
77343b8b4f
commit
0d92808024
|
|
@ -434,6 +434,7 @@ enum {
|
||||||
HCI_USER_CHANNEL,
|
HCI_USER_CHANNEL,
|
||||||
HCI_EXT_CONFIGURED,
|
HCI_EXT_CONFIGURED,
|
||||||
HCI_LE_ADV,
|
HCI_LE_ADV,
|
||||||
|
HCI_LE_ADV_0,
|
||||||
HCI_LE_PER_ADV,
|
HCI_LE_PER_ADV,
|
||||||
HCI_LE_SCAN,
|
HCI_LE_SCAN,
|
||||||
HCI_SSP_ENABLED,
|
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)
|
if (adv && !adv->periodic)
|
||||||
adv->enabled = true;
|
adv->enabled = true;
|
||||||
|
else if (!set->handle)
|
||||||
|
hci_dev_set_flag(hdev, HCI_LE_ADV_0);
|
||||||
|
|
||||||
conn = hci_lookup_le_connect(hdev);
|
conn = hci_lookup_le_connect(hdev);
|
||||||
if (conn)
|
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 (cp->num_of_sets) {
|
||||||
if (adv)
|
if (adv)
|
||||||
adv->enabled = false;
|
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
|
/* If just one instance was disabled check if there are
|
||||||
* any other instance enabled before clearing HCI_LE_ADV
|
* 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
|
/* If current advertising instance is set to instance 0x00
|
||||||
* then we need to re-enable it.
|
* then we need to re-enable it.
|
||||||
*/
|
*/
|
||||||
if (!hdev->cur_adv_instance)
|
if (hci_dev_test_and_clear_flag(hdev, HCI_LE_ADV_0))
|
||||||
err = hci_enable_ext_advertising_sync(hdev,
|
err = hci_enable_ext_advertising_sync(hdev, 0x00);
|
||||||
hdev->cur_adv_instance);
|
|
||||||
} else {
|
} else {
|
||||||
/* Schedule for most recent instance to be restarted and begin
|
/* Schedule for most recent instance to be restarted and begin
|
||||||
* the software rotation loop
|
* the software rotation loop
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user