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

Commit 9b74246f authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann
Browse files

Bluetooth: Reorganize set_connectable HCI command sending



This patch moves all the decisions of which HCI commands to send (or not
to send) to the code between hci_req_init() and hci_req_run() this
allows us to further extend the request with further commands but still
keep the same logic of handling whether to return a direct mgmt response
in the case that no HCI commands were sent.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent d97c899b
Loading
Loading
Loading
Loading
+20 −16
Original line number Diff line number Diff line
@@ -1144,17 +1144,17 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

	hci_req_init(&req, hdev);

	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
	    cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {

		if (cp->val) {
			scan = SCAN_PAGE;
		} else {
@@ -1165,9 +1165,8 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
				cancel_delayed_work(&hdev->discov_off);
		}

	hci_req_init(&req, hdev);

		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}

	/* If we're going from non-connectable to connectable or
	 * vice-versa when fast connectable is enabled ensure that fast
@@ -1179,8 +1178,13 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
		write_fast_connectable(&req, false);

	err = hci_req_run(&req, set_connectable_complete);
	if (err < 0)
	if (err < 0) {
		mgmt_pending_remove(cmd);
		if (err == -ENODATA)
			err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE,
						hdev);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);