mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Bluetooth: hci_core: Fix tracking of periodic advertisement
Periodic advertising enabled flag cannot be tracked by the enabled
flag since advertising and periodic advertising each can be
enabled/disabled separately from one another causing the states to be
inconsistent when for example an advertising set is disabled its
enabled flag is set to false which is then used for periodic which has
not being disabled.
Fixes: eca0ae4aea ("Bluetooth: Add initial implementation of BIS connections")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
@@ -244,6 +244,7 @@ struct adv_info {
|
||||
bool enabled;
|
||||
bool pending;
|
||||
bool periodic;
|
||||
bool periodic_enabled;
|
||||
__u8 mesh;
|
||||
__u8 instance;
|
||||
__u8 handle;
|
||||
|
||||
@@ -1607,7 +1607,7 @@ static u8 hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev, void *data,
|
||||
|
||||
hci_dev_set_flag(hdev, HCI_LE_ADV);
|
||||
|
||||
if (adv && !adv->periodic)
|
||||
if (adv)
|
||||
adv->enabled = true;
|
||||
else if (!set->handle)
|
||||
hci_dev_set_flag(hdev, HCI_LE_ADV_0);
|
||||
@@ -3963,8 +3963,11 @@ static u8 hci_cc_le_set_per_adv_enable(struct hci_dev *hdev, void *data,
|
||||
hci_dev_set_flag(hdev, HCI_LE_PER_ADV);
|
||||
|
||||
if (adv)
|
||||
adv->enabled = true;
|
||||
adv->periodic_enabled = true;
|
||||
} else {
|
||||
if (adv)
|
||||
adv->periodic_enabled = false;
|
||||
|
||||
/* If just one instance was disabled check if there are
|
||||
* any other instance enabled before clearing HCI_LE_PER_ADV.
|
||||
* The current periodic adv instance will be marked as
|
||||
|
||||
@@ -1607,7 +1607,7 @@ int hci_disable_per_advertising_sync(struct hci_dev *hdev, u8 instance)
|
||||
|
||||
/* If periodic advertising already disabled there is nothing to do. */
|
||||
adv = hci_find_adv_instance(hdev, instance);
|
||||
if (!adv || !adv->periodic || !adv->enabled)
|
||||
if (!adv || !adv->periodic_enabled)
|
||||
return 0;
|
||||
|
||||
memset(&cp, 0, sizeof(cp));
|
||||
@@ -1672,7 +1672,7 @@ static int hci_enable_per_advertising_sync(struct hci_dev *hdev, u8 instance)
|
||||
|
||||
/* If periodic advertising already enabled there is nothing to do. */
|
||||
adv = hci_find_adv_instance(hdev, instance);
|
||||
if (adv && adv->periodic && adv->enabled)
|
||||
if (adv && adv->periodic_enabled)
|
||||
return 0;
|
||||
|
||||
memset(&cp, 0, sizeof(cp));
|
||||
|
||||
Reference in New Issue
Block a user