Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 320b3bf7 authored by Florian Grandel's avatar Florian Grandel Committed by Marcel Holtmann
Browse files

Bluetooth: mgmt: program multi-adv on power on



Advertising instances programmed while powered off should be advertised
once the device is powered. This patch ensures that all combinations
of setting and/or adding advertising configuration while powered off
will be correctly activated on power on.

Signed-off-by: default avatarFlorian Grandel <fgrandel@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 01948331
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -7564,6 +7564,7 @@ static void powered_complete(struct hci_dev *hdev, u8 status, u16 opcode)
static int powered_update_hci(struct hci_dev *hdev)
{
	struct hci_request req;
	struct adv_info *adv_instance;
	u8 link_sec;

	hci_req_init(&req, hdev);
@@ -7603,14 +7604,27 @@ static int powered_update_hci(struct hci_dev *hdev)
		 * advertising data. This also applies to the case
		 * where BR/EDR was toggled during the AUTO_OFF phase.
		 */
		if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
		if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
		    (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
		     !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))) {
			update_adv_data(&req);
			update_scan_rsp_data(&req);
		}

		if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
		    hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
		if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
		    hdev->cur_adv_instance == 0x00 &&
		    !list_empty(&hdev->adv_instances)) {
			adv_instance = list_first_entry(&hdev->adv_instances,
							struct adv_info, list);
			hdev->cur_adv_instance = adv_instance->instance;
		}

		if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
			enable_advertising(&req);
		else if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
			 hdev->cur_adv_instance)
			schedule_adv_instance(&req, hdev->cur_adv_instance,
					      true);

		restart_le_actions(&req);
	}