xref: /openbmc/linux/net/bluetooth/hci_sync.c (revision cba6b758711cab946c787f7c15be92cc749b8e1f)
16a98e383SMarcel Holtmann // SPDX-License-Identifier: GPL-2.0
26a98e383SMarcel Holtmann /*
36a98e383SMarcel Holtmann  * BlueZ - Bluetooth protocol stack for Linux
46a98e383SMarcel Holtmann  *
56a98e383SMarcel Holtmann  * Copyright (C) 2021 Intel Corporation
66a98e383SMarcel Holtmann  */
76a98e383SMarcel Holtmann 
86a98e383SMarcel Holtmann #include <net/bluetooth/bluetooth.h>
96a98e383SMarcel Holtmann #include <net/bluetooth/hci_core.h>
106a98e383SMarcel Holtmann #include <net/bluetooth/mgmt.h>
116a98e383SMarcel Holtmann 
126a98e383SMarcel Holtmann #include "hci_request.h"
136a98e383SMarcel Holtmann #include "smp.h"
14161510ccSLuiz Augusto von Dentz #include "eir.h"
156a98e383SMarcel Holtmann 
166a98e383SMarcel Holtmann static void hci_cmd_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode,
176a98e383SMarcel Holtmann 				  struct sk_buff *skb)
186a98e383SMarcel Holtmann {
196a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "result 0x%2.2x", result);
206a98e383SMarcel Holtmann 
216a98e383SMarcel Holtmann 	if (hdev->req_status != HCI_REQ_PEND)
226a98e383SMarcel Holtmann 		return;
236a98e383SMarcel Holtmann 
246a98e383SMarcel Holtmann 	hdev->req_result = result;
256a98e383SMarcel Holtmann 	hdev->req_status = HCI_REQ_DONE;
266a98e383SMarcel Holtmann 
27*cba6b758SLuiz Augusto von Dentz 	if (skb) {
28*cba6b758SLuiz Augusto von Dentz 		struct sock *sk = hci_skb_sk(skb);
29*cba6b758SLuiz Augusto von Dentz 
30*cba6b758SLuiz Augusto von Dentz 		/* Drop sk reference if set */
31*cba6b758SLuiz Augusto von Dentz 		if (sk)
32*cba6b758SLuiz Augusto von Dentz 			sock_put(sk);
33*cba6b758SLuiz Augusto von Dentz 
34*cba6b758SLuiz Augusto von Dentz 		hdev->req_skb = skb_get(skb);
35*cba6b758SLuiz Augusto von Dentz 	}
36*cba6b758SLuiz Augusto von Dentz 
376a98e383SMarcel Holtmann 	wake_up_interruptible(&hdev->req_wait_q);
386a98e383SMarcel Holtmann }
396a98e383SMarcel Holtmann 
406a98e383SMarcel Holtmann static struct sk_buff *hci_cmd_sync_alloc(struct hci_dev *hdev, u16 opcode,
416a98e383SMarcel Holtmann 					  u32 plen, const void *param,
426a98e383SMarcel Holtmann 					  struct sock *sk)
436a98e383SMarcel Holtmann {
446a98e383SMarcel Holtmann 	int len = HCI_COMMAND_HDR_SIZE + plen;
456a98e383SMarcel Holtmann 	struct hci_command_hdr *hdr;
466a98e383SMarcel Holtmann 	struct sk_buff *skb;
476a98e383SMarcel Holtmann 
486a98e383SMarcel Holtmann 	skb = bt_skb_alloc(len, GFP_ATOMIC);
496a98e383SMarcel Holtmann 	if (!skb)
506a98e383SMarcel Holtmann 		return NULL;
516a98e383SMarcel Holtmann 
526a98e383SMarcel Holtmann 	hdr = skb_put(skb, HCI_COMMAND_HDR_SIZE);
536a98e383SMarcel Holtmann 	hdr->opcode = cpu_to_le16(opcode);
546a98e383SMarcel Holtmann 	hdr->plen   = plen;
556a98e383SMarcel Holtmann 
566a98e383SMarcel Holtmann 	if (plen)
576a98e383SMarcel Holtmann 		skb_put_data(skb, param, plen);
586a98e383SMarcel Holtmann 
596a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "skb len %d", skb->len);
606a98e383SMarcel Holtmann 
616a98e383SMarcel Holtmann 	hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
626a98e383SMarcel Holtmann 	hci_skb_opcode(skb) = opcode;
636a98e383SMarcel Holtmann 
64*cba6b758SLuiz Augusto von Dentz 	/* Grab a reference if command needs to be associated with a sock (e.g.
65*cba6b758SLuiz Augusto von Dentz 	 * likely mgmt socket that initiated the command).
66*cba6b758SLuiz Augusto von Dentz 	 */
67*cba6b758SLuiz Augusto von Dentz 	if (sk) {
68*cba6b758SLuiz Augusto von Dentz 		hci_skb_sk(skb) = sk;
69*cba6b758SLuiz Augusto von Dentz 		sock_hold(sk);
70*cba6b758SLuiz Augusto von Dentz 	}
71*cba6b758SLuiz Augusto von Dentz 
726a98e383SMarcel Holtmann 	return skb;
736a98e383SMarcel Holtmann }
746a98e383SMarcel Holtmann 
756a98e383SMarcel Holtmann static void hci_cmd_sync_add(struct hci_request *req, u16 opcode, u32 plen,
766a98e383SMarcel Holtmann 			     const void *param, u8 event, struct sock *sk)
776a98e383SMarcel Holtmann {
786a98e383SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
796a98e383SMarcel Holtmann 	struct sk_buff *skb;
806a98e383SMarcel Holtmann 
816a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "opcode 0x%4.4x plen %d", opcode, plen);
826a98e383SMarcel Holtmann 
836a98e383SMarcel Holtmann 	/* If an error occurred during request building, there is no point in
846a98e383SMarcel Holtmann 	 * queueing the HCI command. We can simply return.
856a98e383SMarcel Holtmann 	 */
866a98e383SMarcel Holtmann 	if (req->err)
876a98e383SMarcel Holtmann 		return;
886a98e383SMarcel Holtmann 
896a98e383SMarcel Holtmann 	skb = hci_cmd_sync_alloc(hdev, opcode, plen, param, sk);
906a98e383SMarcel Holtmann 	if (!skb) {
916a98e383SMarcel Holtmann 		bt_dev_err(hdev, "no memory for command (opcode 0x%4.4x)",
926a98e383SMarcel Holtmann 			   opcode);
936a98e383SMarcel Holtmann 		req->err = -ENOMEM;
946a98e383SMarcel Holtmann 		return;
956a98e383SMarcel Holtmann 	}
966a98e383SMarcel Holtmann 
976a98e383SMarcel Holtmann 	if (skb_queue_empty(&req->cmd_q))
986a98e383SMarcel Holtmann 		bt_cb(skb)->hci.req_flags |= HCI_REQ_START;
996a98e383SMarcel Holtmann 
1006a98e383SMarcel Holtmann 	bt_cb(skb)->hci.req_event = event;
1016a98e383SMarcel Holtmann 
1026a98e383SMarcel Holtmann 	skb_queue_tail(&req->cmd_q, skb);
1036a98e383SMarcel Holtmann }
1046a98e383SMarcel Holtmann 
1056a98e383SMarcel Holtmann static int hci_cmd_sync_run(struct hci_request *req)
1066a98e383SMarcel Holtmann {
1076a98e383SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
1086a98e383SMarcel Holtmann 	struct sk_buff *skb;
1096a98e383SMarcel Holtmann 	unsigned long flags;
1106a98e383SMarcel Holtmann 
1116a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "length %u", skb_queue_len(&req->cmd_q));
1126a98e383SMarcel Holtmann 
1136a98e383SMarcel Holtmann 	/* If an error occurred during request building, remove all HCI
1146a98e383SMarcel Holtmann 	 * commands queued on the HCI request queue.
1156a98e383SMarcel Holtmann 	 */
1166a98e383SMarcel Holtmann 	if (req->err) {
1176a98e383SMarcel Holtmann 		skb_queue_purge(&req->cmd_q);
1186a98e383SMarcel Holtmann 		return req->err;
1196a98e383SMarcel Holtmann 	}
1206a98e383SMarcel Holtmann 
1216a98e383SMarcel Holtmann 	/* Do not allow empty requests */
1226a98e383SMarcel Holtmann 	if (skb_queue_empty(&req->cmd_q))
1236a98e383SMarcel Holtmann 		return -ENODATA;
1246a98e383SMarcel Holtmann 
1256a98e383SMarcel Holtmann 	skb = skb_peek_tail(&req->cmd_q);
1266a98e383SMarcel Holtmann 	bt_cb(skb)->hci.req_complete_skb = hci_cmd_sync_complete;
1276a98e383SMarcel Holtmann 	bt_cb(skb)->hci.req_flags |= HCI_REQ_SKB;
1286a98e383SMarcel Holtmann 
1296a98e383SMarcel Holtmann 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
1306a98e383SMarcel Holtmann 	skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
1316a98e383SMarcel Holtmann 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
1326a98e383SMarcel Holtmann 
1336a98e383SMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->cmd_work);
1346a98e383SMarcel Holtmann 
1356a98e383SMarcel Holtmann 	return 0;
1366a98e383SMarcel Holtmann }
1376a98e383SMarcel Holtmann 
1386a98e383SMarcel Holtmann /* This function requires the caller holds hdev->req_lock. */
1396a98e383SMarcel Holtmann struct sk_buff *__hci_cmd_sync_sk(struct hci_dev *hdev, u16 opcode, u32 plen,
1406a98e383SMarcel Holtmann 				  const void *param, u8 event, u32 timeout,
1416a98e383SMarcel Holtmann 				  struct sock *sk)
1426a98e383SMarcel Holtmann {
1436a98e383SMarcel Holtmann 	struct hci_request req;
1446a98e383SMarcel Holtmann 	struct sk_buff *skb;
1456a98e383SMarcel Holtmann 	int err = 0;
1466a98e383SMarcel Holtmann 
1476a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "");
1486a98e383SMarcel Holtmann 
1496a98e383SMarcel Holtmann 	hci_req_init(&req, hdev);
1506a98e383SMarcel Holtmann 
1516a98e383SMarcel Holtmann 	hci_cmd_sync_add(&req, opcode, plen, param, event, sk);
1526a98e383SMarcel Holtmann 
1536a98e383SMarcel Holtmann 	hdev->req_status = HCI_REQ_PEND;
1546a98e383SMarcel Holtmann 
1556a98e383SMarcel Holtmann 	err = hci_cmd_sync_run(&req);
1566a98e383SMarcel Holtmann 	if (err < 0)
1576a98e383SMarcel Holtmann 		return ERR_PTR(err);
1586a98e383SMarcel Holtmann 
1596a98e383SMarcel Holtmann 	err = wait_event_interruptible_timeout(hdev->req_wait_q,
1606a98e383SMarcel Holtmann 					       hdev->req_status != HCI_REQ_PEND,
1616a98e383SMarcel Holtmann 					       timeout);
1626a98e383SMarcel Holtmann 
1636a98e383SMarcel Holtmann 	if (err == -ERESTARTSYS)
1646a98e383SMarcel Holtmann 		return ERR_PTR(-EINTR);
1656a98e383SMarcel Holtmann 
1666a98e383SMarcel Holtmann 	switch (hdev->req_status) {
1676a98e383SMarcel Holtmann 	case HCI_REQ_DONE:
1686a98e383SMarcel Holtmann 		err = -bt_to_errno(hdev->req_result);
1696a98e383SMarcel Holtmann 		break;
1706a98e383SMarcel Holtmann 
1716a98e383SMarcel Holtmann 	case HCI_REQ_CANCELED:
1726a98e383SMarcel Holtmann 		err = -hdev->req_result;
1736a98e383SMarcel Holtmann 		break;
1746a98e383SMarcel Holtmann 
1756a98e383SMarcel Holtmann 	default:
1766a98e383SMarcel Holtmann 		err = -ETIMEDOUT;
1776a98e383SMarcel Holtmann 		break;
1786a98e383SMarcel Holtmann 	}
1796a98e383SMarcel Holtmann 
1806a98e383SMarcel Holtmann 	hdev->req_status = 0;
1816a98e383SMarcel Holtmann 	hdev->req_result = 0;
1826a98e383SMarcel Holtmann 	skb = hdev->req_skb;
1836a98e383SMarcel Holtmann 	hdev->req_skb = NULL;
1846a98e383SMarcel Holtmann 
1856a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "end: err %d", err);
1866a98e383SMarcel Holtmann 
1876a98e383SMarcel Holtmann 	if (err < 0) {
1886a98e383SMarcel Holtmann 		kfree_skb(skb);
1896a98e383SMarcel Holtmann 		return ERR_PTR(err);
1906a98e383SMarcel Holtmann 	}
1916a98e383SMarcel Holtmann 
1926a98e383SMarcel Holtmann 	if (!skb)
1936a98e383SMarcel Holtmann 		return ERR_PTR(-ENODATA);
1946a98e383SMarcel Holtmann 
1956a98e383SMarcel Holtmann 	return skb;
1966a98e383SMarcel Holtmann }
1976a98e383SMarcel Holtmann EXPORT_SYMBOL(__hci_cmd_sync_sk);
1986a98e383SMarcel Holtmann 
1996a98e383SMarcel Holtmann /* This function requires the caller holds hdev->req_lock. */
2006a98e383SMarcel Holtmann struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
2016a98e383SMarcel Holtmann 			       const void *param, u32 timeout)
2026a98e383SMarcel Holtmann {
2036a98e383SMarcel Holtmann 	return __hci_cmd_sync_sk(hdev, opcode, plen, param, 0, timeout, NULL);
2046a98e383SMarcel Holtmann }
2056a98e383SMarcel Holtmann EXPORT_SYMBOL(__hci_cmd_sync);
2066a98e383SMarcel Holtmann 
2076a98e383SMarcel Holtmann /* Send HCI command and wait for command complete event */
2086a98e383SMarcel Holtmann struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
2096a98e383SMarcel Holtmann 			     const void *param, u32 timeout)
2106a98e383SMarcel Holtmann {
2116a98e383SMarcel Holtmann 	struct sk_buff *skb;
2126a98e383SMarcel Holtmann 
2136a98e383SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
2146a98e383SMarcel Holtmann 		return ERR_PTR(-ENETDOWN);
2156a98e383SMarcel Holtmann 
2166a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "opcode 0x%4.4x plen %d", opcode, plen);
2176a98e383SMarcel Holtmann 
2186a98e383SMarcel Holtmann 	hci_req_sync_lock(hdev);
2196a98e383SMarcel Holtmann 	skb = __hci_cmd_sync(hdev, opcode, plen, param, timeout);
2206a98e383SMarcel Holtmann 	hci_req_sync_unlock(hdev);
2216a98e383SMarcel Holtmann 
2226a98e383SMarcel Holtmann 	return skb;
2236a98e383SMarcel Holtmann }
2246a98e383SMarcel Holtmann EXPORT_SYMBOL(hci_cmd_sync);
2256a98e383SMarcel Holtmann 
2266a98e383SMarcel Holtmann /* This function requires the caller holds hdev->req_lock. */
2276a98e383SMarcel Holtmann struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
2286a98e383SMarcel Holtmann 				  const void *param, u8 event, u32 timeout)
2296a98e383SMarcel Holtmann {
2306a98e383SMarcel Holtmann 	return __hci_cmd_sync_sk(hdev, opcode, plen, param, event, timeout,
2316a98e383SMarcel Holtmann 				 NULL);
2326a98e383SMarcel Holtmann }
2336a98e383SMarcel Holtmann EXPORT_SYMBOL(__hci_cmd_sync_ev);
2346a98e383SMarcel Holtmann 
2356a98e383SMarcel Holtmann /* This function requires the caller holds hdev->req_lock. */
2366a98e383SMarcel Holtmann int __hci_cmd_sync_status_sk(struct hci_dev *hdev, u16 opcode, u32 plen,
2376a98e383SMarcel Holtmann 			     const void *param, u8 event, u32 timeout,
2386a98e383SMarcel Holtmann 			     struct sock *sk)
2396a98e383SMarcel Holtmann {
2406a98e383SMarcel Holtmann 	struct sk_buff *skb;
2416a98e383SMarcel Holtmann 	u8 status;
2426a98e383SMarcel Holtmann 
2436a98e383SMarcel Holtmann 	skb = __hci_cmd_sync_sk(hdev, opcode, plen, param, event, timeout, sk);
2446a98e383SMarcel Holtmann 	if (IS_ERR_OR_NULL(skb)) {
2456a98e383SMarcel Holtmann 		bt_dev_err(hdev, "Opcode 0x%4x failed: %ld", opcode,
2466a98e383SMarcel Holtmann 			   PTR_ERR(skb));
2476a98e383SMarcel Holtmann 		return PTR_ERR(skb);
2486a98e383SMarcel Holtmann 	}
2496a98e383SMarcel Holtmann 
2506a98e383SMarcel Holtmann 	status = skb->data[0];
2516a98e383SMarcel Holtmann 
2526a98e383SMarcel Holtmann 	kfree_skb(skb);
2536a98e383SMarcel Holtmann 
2546a98e383SMarcel Holtmann 	return status;
2556a98e383SMarcel Holtmann }
2566a98e383SMarcel Holtmann EXPORT_SYMBOL(__hci_cmd_sync_status_sk);
2576a98e383SMarcel Holtmann 
2586a98e383SMarcel Holtmann int __hci_cmd_sync_status(struct hci_dev *hdev, u16 opcode, u32 plen,
2596a98e383SMarcel Holtmann 			  const void *param, u32 timeout)
2606a98e383SMarcel Holtmann {
2616a98e383SMarcel Holtmann 	return __hci_cmd_sync_status_sk(hdev, opcode, plen, param, 0, timeout,
2626a98e383SMarcel Holtmann 					NULL);
2636a98e383SMarcel Holtmann }
2646a98e383SMarcel Holtmann EXPORT_SYMBOL(__hci_cmd_sync_status);
2656a98e383SMarcel Holtmann 
2666a98e383SMarcel Holtmann static void hci_cmd_sync_work(struct work_struct *work)
2676a98e383SMarcel Holtmann {
2686a98e383SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work);
2696a98e383SMarcel Holtmann 	struct hci_cmd_sync_work_entry *entry;
2706a98e383SMarcel Holtmann 	hci_cmd_sync_work_func_t func;
2716a98e383SMarcel Holtmann 	hci_cmd_sync_work_destroy_t destroy;
2726a98e383SMarcel Holtmann 	void *data;
2736a98e383SMarcel Holtmann 
2746a98e383SMarcel Holtmann 	bt_dev_dbg(hdev, "");
2756a98e383SMarcel Holtmann 
2766a98e383SMarcel Holtmann 	mutex_lock(&hdev->cmd_sync_work_lock);
2776a98e383SMarcel Holtmann 	entry = list_first_entry(&hdev->cmd_sync_work_list,
2786a98e383SMarcel Holtmann 				 struct hci_cmd_sync_work_entry, list);
2796a98e383SMarcel Holtmann 	if (entry) {
2806a98e383SMarcel Holtmann 		list_del(&entry->list);
2816a98e383SMarcel Holtmann 		func = entry->func;
2826a98e383SMarcel Holtmann 		data = entry->data;
2836a98e383SMarcel Holtmann 		destroy = entry->destroy;
2846a98e383SMarcel Holtmann 		kfree(entry);
2856a98e383SMarcel Holtmann 	} else {
2866a98e383SMarcel Holtmann 		func = NULL;
2876a98e383SMarcel Holtmann 		data = NULL;
2886a98e383SMarcel Holtmann 		destroy = NULL;
2896a98e383SMarcel Holtmann 	}
2906a98e383SMarcel Holtmann 	mutex_unlock(&hdev->cmd_sync_work_lock);
2916a98e383SMarcel Holtmann 
2926a98e383SMarcel Holtmann 	if (func) {
2936a98e383SMarcel Holtmann 		int err;
2946a98e383SMarcel Holtmann 
2956a98e383SMarcel Holtmann 		hci_req_sync_lock(hdev);
2966a98e383SMarcel Holtmann 
2976a98e383SMarcel Holtmann 		err = func(hdev, data);
2986a98e383SMarcel Holtmann 
2996a98e383SMarcel Holtmann 		if (destroy)
3006a98e383SMarcel Holtmann 			destroy(hdev, data, err);
3016a98e383SMarcel Holtmann 
3026a98e383SMarcel Holtmann 		hci_req_sync_unlock(hdev);
3036a98e383SMarcel Holtmann 	}
3046a98e383SMarcel Holtmann }
3056a98e383SMarcel Holtmann 
3066a98e383SMarcel Holtmann void hci_cmd_sync_init(struct hci_dev *hdev)
3076a98e383SMarcel Holtmann {
3086a98e383SMarcel Holtmann 	INIT_WORK(&hdev->cmd_sync_work, hci_cmd_sync_work);
3096a98e383SMarcel Holtmann 	INIT_LIST_HEAD(&hdev->cmd_sync_work_list);
3106a98e383SMarcel Holtmann 	mutex_init(&hdev->cmd_sync_work_lock);
3116a98e383SMarcel Holtmann }
3126a98e383SMarcel Holtmann 
3136a98e383SMarcel Holtmann void hci_cmd_sync_clear(struct hci_dev *hdev)
3146a98e383SMarcel Holtmann {
3156a98e383SMarcel Holtmann 	struct hci_cmd_sync_work_entry *entry, *tmp;
3166a98e383SMarcel Holtmann 
3176a98e383SMarcel Holtmann 	cancel_work_sync(&hdev->cmd_sync_work);
3186a98e383SMarcel Holtmann 
3196a98e383SMarcel Holtmann 	list_for_each_entry_safe(entry, tmp, &hdev->cmd_sync_work_list, list) {
3206a98e383SMarcel Holtmann 		if (entry->destroy)
3216a98e383SMarcel Holtmann 			entry->destroy(hdev, entry->data, -ECANCELED);
3226a98e383SMarcel Holtmann 
3236a98e383SMarcel Holtmann 		list_del(&entry->list);
3246a98e383SMarcel Holtmann 		kfree(entry);
3256a98e383SMarcel Holtmann 	}
3266a98e383SMarcel Holtmann }
3276a98e383SMarcel Holtmann 
3286a98e383SMarcel Holtmann int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
3296a98e383SMarcel Holtmann 		       void *data, hci_cmd_sync_work_destroy_t destroy)
3306a98e383SMarcel Holtmann {
3316a98e383SMarcel Holtmann 	struct hci_cmd_sync_work_entry *entry;
3326a98e383SMarcel Holtmann 
3336a98e383SMarcel Holtmann 	entry = kmalloc(sizeof(*entry), GFP_KERNEL);
3346a98e383SMarcel Holtmann 	if (!entry)
3356a98e383SMarcel Holtmann 		return -ENOMEM;
3366a98e383SMarcel Holtmann 
3376a98e383SMarcel Holtmann 	entry->func = func;
3386a98e383SMarcel Holtmann 	entry->data = data;
3396a98e383SMarcel Holtmann 	entry->destroy = destroy;
3406a98e383SMarcel Holtmann 
3416a98e383SMarcel Holtmann 	mutex_lock(&hdev->cmd_sync_work_lock);
3426a98e383SMarcel Holtmann 	list_add_tail(&entry->list, &hdev->cmd_sync_work_list);
3436a98e383SMarcel Holtmann 	mutex_unlock(&hdev->cmd_sync_work_lock);
3446a98e383SMarcel Holtmann 
3456a98e383SMarcel Holtmann 	queue_work(hdev->req_workqueue, &hdev->cmd_sync_work);
3466a98e383SMarcel Holtmann 
3476a98e383SMarcel Holtmann 	return 0;
3486a98e383SMarcel Holtmann }
3496a98e383SMarcel Holtmann EXPORT_SYMBOL(hci_cmd_sync_queue);
350161510ccSLuiz Augusto von Dentz 
351161510ccSLuiz Augusto von Dentz int hci_update_eir_sync(struct hci_dev *hdev)
352161510ccSLuiz Augusto von Dentz {
353161510ccSLuiz Augusto von Dentz 	struct hci_cp_write_eir cp;
354161510ccSLuiz Augusto von Dentz 
355161510ccSLuiz Augusto von Dentz 	bt_dev_dbg(hdev, "");
356161510ccSLuiz Augusto von Dentz 
357161510ccSLuiz Augusto von Dentz 	if (!hdev_is_powered(hdev))
358161510ccSLuiz Augusto von Dentz 		return 0;
359161510ccSLuiz Augusto von Dentz 
360161510ccSLuiz Augusto von Dentz 	if (!lmp_ext_inq_capable(hdev))
361161510ccSLuiz Augusto von Dentz 		return 0;
362161510ccSLuiz Augusto von Dentz 
363161510ccSLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
364161510ccSLuiz Augusto von Dentz 		return 0;
365161510ccSLuiz Augusto von Dentz 
366161510ccSLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
367161510ccSLuiz Augusto von Dentz 		return 0;
368161510ccSLuiz Augusto von Dentz 
369161510ccSLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
370161510ccSLuiz Augusto von Dentz 
371161510ccSLuiz Augusto von Dentz 	eir_create(hdev, cp.data);
372161510ccSLuiz Augusto von Dentz 
373161510ccSLuiz Augusto von Dentz 	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
374161510ccSLuiz Augusto von Dentz 		return 0;
375161510ccSLuiz Augusto von Dentz 
376161510ccSLuiz Augusto von Dentz 	memcpy(hdev->eir, cp.data, sizeof(cp.data));
377161510ccSLuiz Augusto von Dentz 
378161510ccSLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp,
379161510ccSLuiz Augusto von Dentz 				     HCI_CMD_TIMEOUT);
380161510ccSLuiz Augusto von Dentz }
381161510ccSLuiz Augusto von Dentz 
382161510ccSLuiz Augusto von Dentz static u8 get_service_classes(struct hci_dev *hdev)
383161510ccSLuiz Augusto von Dentz {
384161510ccSLuiz Augusto von Dentz 	struct bt_uuid *uuid;
385161510ccSLuiz Augusto von Dentz 	u8 val = 0;
386161510ccSLuiz Augusto von Dentz 
387161510ccSLuiz Augusto von Dentz 	list_for_each_entry(uuid, &hdev->uuids, list)
388161510ccSLuiz Augusto von Dentz 		val |= uuid->svc_hint;
389161510ccSLuiz Augusto von Dentz 
390161510ccSLuiz Augusto von Dentz 	return val;
391161510ccSLuiz Augusto von Dentz }
392161510ccSLuiz Augusto von Dentz 
393161510ccSLuiz Augusto von Dentz int hci_update_class_sync(struct hci_dev *hdev)
394161510ccSLuiz Augusto von Dentz {
395161510ccSLuiz Augusto von Dentz 	u8 cod[3];
396161510ccSLuiz Augusto von Dentz 
397161510ccSLuiz Augusto von Dentz 	bt_dev_dbg(hdev, "");
398161510ccSLuiz Augusto von Dentz 
399161510ccSLuiz Augusto von Dentz 	if (!hdev_is_powered(hdev))
400161510ccSLuiz Augusto von Dentz 		return 0;
401161510ccSLuiz Augusto von Dentz 
402161510ccSLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
403161510ccSLuiz Augusto von Dentz 		return 0;
404161510ccSLuiz Augusto von Dentz 
405161510ccSLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
406161510ccSLuiz Augusto von Dentz 		return 0;
407161510ccSLuiz Augusto von Dentz 
408161510ccSLuiz Augusto von Dentz 	cod[0] = hdev->minor_class;
409161510ccSLuiz Augusto von Dentz 	cod[1] = hdev->major_class;
410161510ccSLuiz Augusto von Dentz 	cod[2] = get_service_classes(hdev);
411161510ccSLuiz Augusto von Dentz 
412161510ccSLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
413161510ccSLuiz Augusto von Dentz 		cod[1] |= 0x20;
414161510ccSLuiz Augusto von Dentz 
415161510ccSLuiz Augusto von Dentz 	if (memcmp(cod, hdev->dev_class, 3) == 0)
416161510ccSLuiz Augusto von Dentz 		return 0;
417161510ccSLuiz Augusto von Dentz 
418161510ccSLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_WRITE_CLASS_OF_DEV,
419161510ccSLuiz Augusto von Dentz 				     sizeof(cod), cod, HCI_CMD_TIMEOUT);
420161510ccSLuiz Augusto von Dentz }
421*cba6b758SLuiz Augusto von Dentz 
422*cba6b758SLuiz Augusto von Dentz static bool is_advertising_allowed(struct hci_dev *hdev, bool connectable)
423*cba6b758SLuiz Augusto von Dentz {
424*cba6b758SLuiz Augusto von Dentz 	/* If there is no connection we are OK to advertise. */
425*cba6b758SLuiz Augusto von Dentz 	if (hci_conn_num(hdev, LE_LINK) == 0)
426*cba6b758SLuiz Augusto von Dentz 		return true;
427*cba6b758SLuiz Augusto von Dentz 
428*cba6b758SLuiz Augusto von Dentz 	/* Check le_states if there is any connection in peripheral role. */
429*cba6b758SLuiz Augusto von Dentz 	if (hdev->conn_hash.le_num_peripheral > 0) {
430*cba6b758SLuiz Augusto von Dentz 		/* Peripheral connection state and non connectable mode
431*cba6b758SLuiz Augusto von Dentz 		 * bit 20.
432*cba6b758SLuiz Augusto von Dentz 		 */
433*cba6b758SLuiz Augusto von Dentz 		if (!connectable && !(hdev->le_states[2] & 0x10))
434*cba6b758SLuiz Augusto von Dentz 			return false;
435*cba6b758SLuiz Augusto von Dentz 
436*cba6b758SLuiz Augusto von Dentz 		/* Peripheral connection state and connectable mode bit 38
437*cba6b758SLuiz Augusto von Dentz 		 * and scannable bit 21.
438*cba6b758SLuiz Augusto von Dentz 		 */
439*cba6b758SLuiz Augusto von Dentz 		if (connectable && (!(hdev->le_states[4] & 0x40) ||
440*cba6b758SLuiz Augusto von Dentz 				    !(hdev->le_states[2] & 0x20)))
441*cba6b758SLuiz Augusto von Dentz 			return false;
442*cba6b758SLuiz Augusto von Dentz 	}
443*cba6b758SLuiz Augusto von Dentz 
444*cba6b758SLuiz Augusto von Dentz 	/* Check le_states if there is any connection in central role. */
445*cba6b758SLuiz Augusto von Dentz 	if (hci_conn_num(hdev, LE_LINK) != hdev->conn_hash.le_num_peripheral) {
446*cba6b758SLuiz Augusto von Dentz 		/* Central connection state and non connectable mode bit 18. */
447*cba6b758SLuiz Augusto von Dentz 		if (!connectable && !(hdev->le_states[2] & 0x02))
448*cba6b758SLuiz Augusto von Dentz 			return false;
449*cba6b758SLuiz Augusto von Dentz 
450*cba6b758SLuiz Augusto von Dentz 		/* Central connection state and connectable mode bit 35 and
451*cba6b758SLuiz Augusto von Dentz 		 * scannable 19.
452*cba6b758SLuiz Augusto von Dentz 		 */
453*cba6b758SLuiz Augusto von Dentz 		if (connectable && (!(hdev->le_states[4] & 0x08) ||
454*cba6b758SLuiz Augusto von Dentz 				    !(hdev->le_states[2] & 0x08)))
455*cba6b758SLuiz Augusto von Dentz 			return false;
456*cba6b758SLuiz Augusto von Dentz 	}
457*cba6b758SLuiz Augusto von Dentz 
458*cba6b758SLuiz Augusto von Dentz 	return true;
459*cba6b758SLuiz Augusto von Dentz }
460*cba6b758SLuiz Augusto von Dentz 
461*cba6b758SLuiz Augusto von Dentz static bool adv_use_rpa(struct hci_dev *hdev, uint32_t flags)
462*cba6b758SLuiz Augusto von Dentz {
463*cba6b758SLuiz Augusto von Dentz 	/* If privacy is not enabled don't use RPA */
464*cba6b758SLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
465*cba6b758SLuiz Augusto von Dentz 		return false;
466*cba6b758SLuiz Augusto von Dentz 
467*cba6b758SLuiz Augusto von Dentz 	/* If basic privacy mode is enabled use RPA */
468*cba6b758SLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_LIMITED_PRIVACY))
469*cba6b758SLuiz Augusto von Dentz 		return true;
470*cba6b758SLuiz Augusto von Dentz 
471*cba6b758SLuiz Augusto von Dentz 	/* If limited privacy mode is enabled don't use RPA if we're
472*cba6b758SLuiz Augusto von Dentz 	 * both discoverable and bondable.
473*cba6b758SLuiz Augusto von Dentz 	 */
474*cba6b758SLuiz Augusto von Dentz 	if ((flags & MGMT_ADV_FLAG_DISCOV) &&
475*cba6b758SLuiz Augusto von Dentz 	    hci_dev_test_flag(hdev, HCI_BONDABLE))
476*cba6b758SLuiz Augusto von Dentz 		return false;
477*cba6b758SLuiz Augusto von Dentz 
478*cba6b758SLuiz Augusto von Dentz 	/* We're neither bondable nor discoverable in the limited
479*cba6b758SLuiz Augusto von Dentz 	 * privacy mode, therefore use RPA.
480*cba6b758SLuiz Augusto von Dentz 	 */
481*cba6b758SLuiz Augusto von Dentz 	return true;
482*cba6b758SLuiz Augusto von Dentz }
483*cba6b758SLuiz Augusto von Dentz 
484*cba6b758SLuiz Augusto von Dentz static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)
485*cba6b758SLuiz Augusto von Dentz {
486*cba6b758SLuiz Augusto von Dentz 	/* If we're advertising or initiating an LE connection we can't
487*cba6b758SLuiz Augusto von Dentz 	 * go ahead and change the random address at this time. This is
488*cba6b758SLuiz Augusto von Dentz 	 * because the eventual initiator address used for the
489*cba6b758SLuiz Augusto von Dentz 	 * subsequently created connection will be undefined (some
490*cba6b758SLuiz Augusto von Dentz 	 * controllers use the new address and others the one we had
491*cba6b758SLuiz Augusto von Dentz 	 * when the operation started).
492*cba6b758SLuiz Augusto von Dentz 	 *
493*cba6b758SLuiz Augusto von Dentz 	 * In this kind of scenario skip the update and let the random
494*cba6b758SLuiz Augusto von Dentz 	 * address be updated at the next cycle.
495*cba6b758SLuiz Augusto von Dentz 	 */
496*cba6b758SLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_LE_ADV) ||
497*cba6b758SLuiz Augusto von Dentz 	    hci_lookup_le_connect(hdev)) {
498*cba6b758SLuiz Augusto von Dentz 		bt_dev_dbg(hdev, "Deferring random address update");
499*cba6b758SLuiz Augusto von Dentz 		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
500*cba6b758SLuiz Augusto von Dentz 		return 0;
501*cba6b758SLuiz Augusto von Dentz 	}
502*cba6b758SLuiz Augusto von Dentz 
503*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_RANDOM_ADDR,
504*cba6b758SLuiz Augusto von Dentz 				     6, rpa, HCI_CMD_TIMEOUT);
505*cba6b758SLuiz Augusto von Dentz }
506*cba6b758SLuiz Augusto von Dentz 
507*cba6b758SLuiz Augusto von Dentz int hci_update_random_address_sync(struct hci_dev *hdev, bool require_privacy,
508*cba6b758SLuiz Augusto von Dentz 				   bool rpa, u8 *own_addr_type)
509*cba6b758SLuiz Augusto von Dentz {
510*cba6b758SLuiz Augusto von Dentz 	int err;
511*cba6b758SLuiz Augusto von Dentz 
512*cba6b758SLuiz Augusto von Dentz 	/* If privacy is enabled use a resolvable private address. If
513*cba6b758SLuiz Augusto von Dentz 	 * current RPA has expired or there is something else than
514*cba6b758SLuiz Augusto von Dentz 	 * the current RPA in use, then generate a new one.
515*cba6b758SLuiz Augusto von Dentz 	 */
516*cba6b758SLuiz Augusto von Dentz 	if (rpa) {
517*cba6b758SLuiz Augusto von Dentz 		/* If Controller supports LL Privacy use own address type is
518*cba6b758SLuiz Augusto von Dentz 		 * 0x03
519*cba6b758SLuiz Augusto von Dentz 		 */
520*cba6b758SLuiz Augusto von Dentz 		if (use_ll_privacy(hdev) &&
521*cba6b758SLuiz Augusto von Dentz 		    hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
522*cba6b758SLuiz Augusto von Dentz 			*own_addr_type = ADDR_LE_DEV_RANDOM_RESOLVED;
523*cba6b758SLuiz Augusto von Dentz 		else
524*cba6b758SLuiz Augusto von Dentz 			*own_addr_type = ADDR_LE_DEV_RANDOM;
525*cba6b758SLuiz Augusto von Dentz 
526*cba6b758SLuiz Augusto von Dentz 		/* Check if RPA is valid */
527*cba6b758SLuiz Augusto von Dentz 		if (rpa_valid(hdev))
528*cba6b758SLuiz Augusto von Dentz 			return 0;
529*cba6b758SLuiz Augusto von Dentz 
530*cba6b758SLuiz Augusto von Dentz 		err = smp_generate_rpa(hdev, hdev->irk, &hdev->rpa);
531*cba6b758SLuiz Augusto von Dentz 		if (err < 0) {
532*cba6b758SLuiz Augusto von Dentz 			bt_dev_err(hdev, "failed to generate new RPA");
533*cba6b758SLuiz Augusto von Dentz 			return err;
534*cba6b758SLuiz Augusto von Dentz 		}
535*cba6b758SLuiz Augusto von Dentz 
536*cba6b758SLuiz Augusto von Dentz 		err = hci_set_random_addr_sync(hdev, &hdev->rpa);
537*cba6b758SLuiz Augusto von Dentz 		if (err)
538*cba6b758SLuiz Augusto von Dentz 			return err;
539*cba6b758SLuiz Augusto von Dentz 
540*cba6b758SLuiz Augusto von Dentz 		return 0;
541*cba6b758SLuiz Augusto von Dentz 	}
542*cba6b758SLuiz Augusto von Dentz 
543*cba6b758SLuiz Augusto von Dentz 	/* In case of required privacy without resolvable private address,
544*cba6b758SLuiz Augusto von Dentz 	 * use an non-resolvable private address. This is useful for active
545*cba6b758SLuiz Augusto von Dentz 	 * scanning and non-connectable advertising.
546*cba6b758SLuiz Augusto von Dentz 	 */
547*cba6b758SLuiz Augusto von Dentz 	if (require_privacy) {
548*cba6b758SLuiz Augusto von Dentz 		bdaddr_t nrpa;
549*cba6b758SLuiz Augusto von Dentz 
550*cba6b758SLuiz Augusto von Dentz 		while (true) {
551*cba6b758SLuiz Augusto von Dentz 			/* The non-resolvable private address is generated
552*cba6b758SLuiz Augusto von Dentz 			 * from random six bytes with the two most significant
553*cba6b758SLuiz Augusto von Dentz 			 * bits cleared.
554*cba6b758SLuiz Augusto von Dentz 			 */
555*cba6b758SLuiz Augusto von Dentz 			get_random_bytes(&nrpa, 6);
556*cba6b758SLuiz Augusto von Dentz 			nrpa.b[5] &= 0x3f;
557*cba6b758SLuiz Augusto von Dentz 
558*cba6b758SLuiz Augusto von Dentz 			/* The non-resolvable private address shall not be
559*cba6b758SLuiz Augusto von Dentz 			 * equal to the public address.
560*cba6b758SLuiz Augusto von Dentz 			 */
561*cba6b758SLuiz Augusto von Dentz 			if (bacmp(&hdev->bdaddr, &nrpa))
562*cba6b758SLuiz Augusto von Dentz 				break;
563*cba6b758SLuiz Augusto von Dentz 		}
564*cba6b758SLuiz Augusto von Dentz 
565*cba6b758SLuiz Augusto von Dentz 		*own_addr_type = ADDR_LE_DEV_RANDOM;
566*cba6b758SLuiz Augusto von Dentz 
567*cba6b758SLuiz Augusto von Dentz 		return hci_set_random_addr_sync(hdev, &nrpa);
568*cba6b758SLuiz Augusto von Dentz 	}
569*cba6b758SLuiz Augusto von Dentz 
570*cba6b758SLuiz Augusto von Dentz 	/* If forcing static address is in use or there is no public
571*cba6b758SLuiz Augusto von Dentz 	 * address use the static address as random address (but skip
572*cba6b758SLuiz Augusto von Dentz 	 * the HCI command if the current random address is already the
573*cba6b758SLuiz Augusto von Dentz 	 * static one.
574*cba6b758SLuiz Augusto von Dentz 	 *
575*cba6b758SLuiz Augusto von Dentz 	 * In case BR/EDR has been disabled on a dual-mode controller
576*cba6b758SLuiz Augusto von Dentz 	 * and a static address has been configured, then use that
577*cba6b758SLuiz Augusto von Dentz 	 * address instead of the public BR/EDR address.
578*cba6b758SLuiz Augusto von Dentz 	 */
579*cba6b758SLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
580*cba6b758SLuiz Augusto von Dentz 	    !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
581*cba6b758SLuiz Augusto von Dentz 	    (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
582*cba6b758SLuiz Augusto von Dentz 	     bacmp(&hdev->static_addr, BDADDR_ANY))) {
583*cba6b758SLuiz Augusto von Dentz 		*own_addr_type = ADDR_LE_DEV_RANDOM;
584*cba6b758SLuiz Augusto von Dentz 		if (bacmp(&hdev->static_addr, &hdev->random_addr))
585*cba6b758SLuiz Augusto von Dentz 			return hci_set_random_addr_sync(hdev,
586*cba6b758SLuiz Augusto von Dentz 							&hdev->static_addr);
587*cba6b758SLuiz Augusto von Dentz 		return 0;
588*cba6b758SLuiz Augusto von Dentz 	}
589*cba6b758SLuiz Augusto von Dentz 
590*cba6b758SLuiz Augusto von Dentz 	/* Neither privacy nor static address is being used so use a
591*cba6b758SLuiz Augusto von Dentz 	 * public address.
592*cba6b758SLuiz Augusto von Dentz 	 */
593*cba6b758SLuiz Augusto von Dentz 	*own_addr_type = ADDR_LE_DEV_PUBLIC;
594*cba6b758SLuiz Augusto von Dentz 
595*cba6b758SLuiz Augusto von Dentz 	return 0;
596*cba6b758SLuiz Augusto von Dentz }
597*cba6b758SLuiz Augusto von Dentz 
598*cba6b758SLuiz Augusto von Dentz static int hci_disable_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance)
599*cba6b758SLuiz Augusto von Dentz {
600*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_ext_adv_enable *cp;
601*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_ext_adv_set *set;
602*cba6b758SLuiz Augusto von Dentz 	u8 data[sizeof(*cp) + sizeof(*set) * 1];
603*cba6b758SLuiz Augusto von Dentz 	u8 size;
604*cba6b758SLuiz Augusto von Dentz 
605*cba6b758SLuiz Augusto von Dentz 	/* If request specifies an instance that doesn't exist, fail */
606*cba6b758SLuiz Augusto von Dentz 	if (instance > 0) {
607*cba6b758SLuiz Augusto von Dentz 		struct adv_info *adv;
608*cba6b758SLuiz Augusto von Dentz 
609*cba6b758SLuiz Augusto von Dentz 		adv = hci_find_adv_instance(hdev, instance);
610*cba6b758SLuiz Augusto von Dentz 		if (!adv)
611*cba6b758SLuiz Augusto von Dentz 			return -EINVAL;
612*cba6b758SLuiz Augusto von Dentz 
613*cba6b758SLuiz Augusto von Dentz 		/* If not enabled there is nothing to do */
614*cba6b758SLuiz Augusto von Dentz 		if (!adv->enabled)
615*cba6b758SLuiz Augusto von Dentz 			return 0;
616*cba6b758SLuiz Augusto von Dentz 	}
617*cba6b758SLuiz Augusto von Dentz 
618*cba6b758SLuiz Augusto von Dentz 	memset(data, 0, sizeof(data));
619*cba6b758SLuiz Augusto von Dentz 
620*cba6b758SLuiz Augusto von Dentz 	cp = (void *)data;
621*cba6b758SLuiz Augusto von Dentz 	set = (void *)cp->data;
622*cba6b758SLuiz Augusto von Dentz 
623*cba6b758SLuiz Augusto von Dentz 	/* Instance 0x00 indicates all advertising instances will be disabled */
624*cba6b758SLuiz Augusto von Dentz 	cp->num_of_sets = !!instance;
625*cba6b758SLuiz Augusto von Dentz 	cp->enable = 0x00;
626*cba6b758SLuiz Augusto von Dentz 
627*cba6b758SLuiz Augusto von Dentz 	set->handle = instance;
628*cba6b758SLuiz Augusto von Dentz 
629*cba6b758SLuiz Augusto von Dentz 	size = sizeof(*cp) + sizeof(*set) * cp->num_of_sets;
630*cba6b758SLuiz Augusto von Dentz 
631*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
632*cba6b758SLuiz Augusto von Dentz 				     size, data, HCI_CMD_TIMEOUT);
633*cba6b758SLuiz Augusto von Dentz }
634*cba6b758SLuiz Augusto von Dentz 
635*cba6b758SLuiz Augusto von Dentz static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance,
636*cba6b758SLuiz Augusto von Dentz 					    bdaddr_t *random_addr)
637*cba6b758SLuiz Augusto von Dentz {
638*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_adv_set_rand_addr cp;
639*cba6b758SLuiz Augusto von Dentz 	int err;
640*cba6b758SLuiz Augusto von Dentz 
641*cba6b758SLuiz Augusto von Dentz 	if (!instance) {
642*cba6b758SLuiz Augusto von Dentz 		/* Instance 0x00 doesn't have an adv_info, instead it uses
643*cba6b758SLuiz Augusto von Dentz 		 * hdev->random_addr to track its address so whenever it needs
644*cba6b758SLuiz Augusto von Dentz 		 * to be updated this also set the random address since
645*cba6b758SLuiz Augusto von Dentz 		 * hdev->random_addr is shared with scan state machine.
646*cba6b758SLuiz Augusto von Dentz 		 */
647*cba6b758SLuiz Augusto von Dentz 		err = hci_set_random_addr_sync(hdev, random_addr);
648*cba6b758SLuiz Augusto von Dentz 		if (err)
649*cba6b758SLuiz Augusto von Dentz 			return err;
650*cba6b758SLuiz Augusto von Dentz 	}
651*cba6b758SLuiz Augusto von Dentz 
652*cba6b758SLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
653*cba6b758SLuiz Augusto von Dentz 
654*cba6b758SLuiz Augusto von Dentz 	cp.handle = instance;
655*cba6b758SLuiz Augusto von Dentz 	bacpy(&cp.bdaddr, random_addr);
656*cba6b758SLuiz Augusto von Dentz 
657*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR,
658*cba6b758SLuiz Augusto von Dentz 				     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
659*cba6b758SLuiz Augusto von Dentz }
660*cba6b758SLuiz Augusto von Dentz 
661*cba6b758SLuiz Augusto von Dentz int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance)
662*cba6b758SLuiz Augusto von Dentz {
663*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_ext_adv_params cp;
664*cba6b758SLuiz Augusto von Dentz 	bool connectable;
665*cba6b758SLuiz Augusto von Dentz 	u32 flags;
666*cba6b758SLuiz Augusto von Dentz 	bdaddr_t random_addr;
667*cba6b758SLuiz Augusto von Dentz 	u8 own_addr_type;
668*cba6b758SLuiz Augusto von Dentz 	int err;
669*cba6b758SLuiz Augusto von Dentz 	struct adv_info *adv;
670*cba6b758SLuiz Augusto von Dentz 	bool secondary_adv;
671*cba6b758SLuiz Augusto von Dentz 
672*cba6b758SLuiz Augusto von Dentz 	if (instance > 0) {
673*cba6b758SLuiz Augusto von Dentz 		adv = hci_find_adv_instance(hdev, instance);
674*cba6b758SLuiz Augusto von Dentz 		if (!adv)
675*cba6b758SLuiz Augusto von Dentz 			return -EINVAL;
676*cba6b758SLuiz Augusto von Dentz 	} else {
677*cba6b758SLuiz Augusto von Dentz 		adv = NULL;
678*cba6b758SLuiz Augusto von Dentz 	}
679*cba6b758SLuiz Augusto von Dentz 
680*cba6b758SLuiz Augusto von Dentz 	/* Updating parameters of an active instance will return a
681*cba6b758SLuiz Augusto von Dentz 	 * Command Disallowed error, so we must first disable the
682*cba6b758SLuiz Augusto von Dentz 	 * instance if it is active.
683*cba6b758SLuiz Augusto von Dentz 	 */
684*cba6b758SLuiz Augusto von Dentz 	if (adv && !adv->pending) {
685*cba6b758SLuiz Augusto von Dentz 		err = hci_disable_ext_adv_instance_sync(hdev, instance);
686*cba6b758SLuiz Augusto von Dentz 		if (err)
687*cba6b758SLuiz Augusto von Dentz 			return err;
688*cba6b758SLuiz Augusto von Dentz 	}
689*cba6b758SLuiz Augusto von Dentz 
690*cba6b758SLuiz Augusto von Dentz 	flags = hci_adv_instance_flags(hdev, instance);
691*cba6b758SLuiz Augusto von Dentz 
692*cba6b758SLuiz Augusto von Dentz 	/* If the "connectable" instance flag was not set, then choose between
693*cba6b758SLuiz Augusto von Dentz 	 * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
694*cba6b758SLuiz Augusto von Dentz 	 */
695*cba6b758SLuiz Augusto von Dentz 	connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE) ||
696*cba6b758SLuiz Augusto von Dentz 		      mgmt_get_connectable(hdev);
697*cba6b758SLuiz Augusto von Dentz 
698*cba6b758SLuiz Augusto von Dentz 	if (!is_advertising_allowed(hdev, connectable))
699*cba6b758SLuiz Augusto von Dentz 		return -EPERM;
700*cba6b758SLuiz Augusto von Dentz 
701*cba6b758SLuiz Augusto von Dentz 	/* Set require_privacy to true only when non-connectable
702*cba6b758SLuiz Augusto von Dentz 	 * advertising is used. In that case it is fine to use a
703*cba6b758SLuiz Augusto von Dentz 	 * non-resolvable private address.
704*cba6b758SLuiz Augusto von Dentz 	 */
705*cba6b758SLuiz Augusto von Dentz 	err = hci_get_random_address(hdev, !connectable,
706*cba6b758SLuiz Augusto von Dentz 				     adv_use_rpa(hdev, flags), adv,
707*cba6b758SLuiz Augusto von Dentz 				     &own_addr_type, &random_addr);
708*cba6b758SLuiz Augusto von Dentz 	if (err < 0)
709*cba6b758SLuiz Augusto von Dentz 		return err;
710*cba6b758SLuiz Augusto von Dentz 
711*cba6b758SLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
712*cba6b758SLuiz Augusto von Dentz 
713*cba6b758SLuiz Augusto von Dentz 	if (adv) {
714*cba6b758SLuiz Augusto von Dentz 		hci_cpu_to_le24(adv->min_interval, cp.min_interval);
715*cba6b758SLuiz Augusto von Dentz 		hci_cpu_to_le24(adv->max_interval, cp.max_interval);
716*cba6b758SLuiz Augusto von Dentz 		cp.tx_power = adv->tx_power;
717*cba6b758SLuiz Augusto von Dentz 	} else {
718*cba6b758SLuiz Augusto von Dentz 		hci_cpu_to_le24(hdev->le_adv_min_interval, cp.min_interval);
719*cba6b758SLuiz Augusto von Dentz 		hci_cpu_to_le24(hdev->le_adv_max_interval, cp.max_interval);
720*cba6b758SLuiz Augusto von Dentz 		cp.tx_power = HCI_ADV_TX_POWER_NO_PREFERENCE;
721*cba6b758SLuiz Augusto von Dentz 	}
722*cba6b758SLuiz Augusto von Dentz 
723*cba6b758SLuiz Augusto von Dentz 	secondary_adv = (flags & MGMT_ADV_FLAG_SEC_MASK);
724*cba6b758SLuiz Augusto von Dentz 
725*cba6b758SLuiz Augusto von Dentz 	if (connectable) {
726*cba6b758SLuiz Augusto von Dentz 		if (secondary_adv)
727*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_EXT_ADV_CONN_IND);
728*cba6b758SLuiz Augusto von Dentz 		else
729*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_LEGACY_ADV_IND);
730*cba6b758SLuiz Augusto von Dentz 	} else if (hci_adv_instance_is_scannable(hdev, instance) ||
731*cba6b758SLuiz Augusto von Dentz 		   (flags & MGMT_ADV_PARAM_SCAN_RSP)) {
732*cba6b758SLuiz Augusto von Dentz 		if (secondary_adv)
733*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_EXT_ADV_SCAN_IND);
734*cba6b758SLuiz Augusto von Dentz 		else
735*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_LEGACY_ADV_SCAN_IND);
736*cba6b758SLuiz Augusto von Dentz 	} else {
737*cba6b758SLuiz Augusto von Dentz 		if (secondary_adv)
738*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_EXT_ADV_NON_CONN_IND);
739*cba6b758SLuiz Augusto von Dentz 		else
740*cba6b758SLuiz Augusto von Dentz 			cp.evt_properties = cpu_to_le16(LE_LEGACY_NONCONN_IND);
741*cba6b758SLuiz Augusto von Dentz 	}
742*cba6b758SLuiz Augusto von Dentz 
743*cba6b758SLuiz Augusto von Dentz 	cp.own_addr_type = own_addr_type;
744*cba6b758SLuiz Augusto von Dentz 	cp.channel_map = hdev->le_adv_channel_map;
745*cba6b758SLuiz Augusto von Dentz 	cp.handle = instance;
746*cba6b758SLuiz Augusto von Dentz 
747*cba6b758SLuiz Augusto von Dentz 	if (flags & MGMT_ADV_FLAG_SEC_2M) {
748*cba6b758SLuiz Augusto von Dentz 		cp.primary_phy = HCI_ADV_PHY_1M;
749*cba6b758SLuiz Augusto von Dentz 		cp.secondary_phy = HCI_ADV_PHY_2M;
750*cba6b758SLuiz Augusto von Dentz 	} else if (flags & MGMT_ADV_FLAG_SEC_CODED) {
751*cba6b758SLuiz Augusto von Dentz 		cp.primary_phy = HCI_ADV_PHY_CODED;
752*cba6b758SLuiz Augusto von Dentz 		cp.secondary_phy = HCI_ADV_PHY_CODED;
753*cba6b758SLuiz Augusto von Dentz 	} else {
754*cba6b758SLuiz Augusto von Dentz 		/* In all other cases use 1M */
755*cba6b758SLuiz Augusto von Dentz 		cp.primary_phy = HCI_ADV_PHY_1M;
756*cba6b758SLuiz Augusto von Dentz 		cp.secondary_phy = HCI_ADV_PHY_1M;
757*cba6b758SLuiz Augusto von Dentz 	}
758*cba6b758SLuiz Augusto von Dentz 
759*cba6b758SLuiz Augusto von Dentz 	err = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS,
760*cba6b758SLuiz Augusto von Dentz 				    sizeof(cp), &cp, HCI_CMD_TIMEOUT);
761*cba6b758SLuiz Augusto von Dentz 	if (err)
762*cba6b758SLuiz Augusto von Dentz 		return err;
763*cba6b758SLuiz Augusto von Dentz 
764*cba6b758SLuiz Augusto von Dentz 	if ((own_addr_type == ADDR_LE_DEV_RANDOM ||
765*cba6b758SLuiz Augusto von Dentz 	     own_addr_type == ADDR_LE_DEV_RANDOM_RESOLVED) &&
766*cba6b758SLuiz Augusto von Dentz 	    bacmp(&random_addr, BDADDR_ANY)) {
767*cba6b758SLuiz Augusto von Dentz 		/* Check if random address need to be updated */
768*cba6b758SLuiz Augusto von Dentz 		if (adv) {
769*cba6b758SLuiz Augusto von Dentz 			if (!bacmp(&random_addr, &adv->random_addr))
770*cba6b758SLuiz Augusto von Dentz 				return 0;
771*cba6b758SLuiz Augusto von Dentz 		} else {
772*cba6b758SLuiz Augusto von Dentz 			if (!bacmp(&random_addr, &hdev->random_addr))
773*cba6b758SLuiz Augusto von Dentz 				return 0;
774*cba6b758SLuiz Augusto von Dentz 		}
775*cba6b758SLuiz Augusto von Dentz 
776*cba6b758SLuiz Augusto von Dentz 		return hci_set_adv_set_random_addr_sync(hdev, instance,
777*cba6b758SLuiz Augusto von Dentz 							&random_addr);
778*cba6b758SLuiz Augusto von Dentz 	}
779*cba6b758SLuiz Augusto von Dentz 
780*cba6b758SLuiz Augusto von Dentz 	return 0;
781*cba6b758SLuiz Augusto von Dentz }
782*cba6b758SLuiz Augusto von Dentz 
783*cba6b758SLuiz Augusto von Dentz static int hci_set_ext_scan_rsp_data_sync(struct hci_dev *hdev, u8 instance)
784*cba6b758SLuiz Augusto von Dentz {
785*cba6b758SLuiz Augusto von Dentz 	struct {
786*cba6b758SLuiz Augusto von Dentz 		struct hci_cp_le_set_ext_scan_rsp_data cp;
787*cba6b758SLuiz Augusto von Dentz 		u8 data[HCI_MAX_EXT_AD_LENGTH];
788*cba6b758SLuiz Augusto von Dentz 	} pdu;
789*cba6b758SLuiz Augusto von Dentz 	u8 len;
790*cba6b758SLuiz Augusto von Dentz 
791*cba6b758SLuiz Augusto von Dentz 	memset(&pdu, 0, sizeof(pdu));
792*cba6b758SLuiz Augusto von Dentz 
793*cba6b758SLuiz Augusto von Dentz 	len = eir_create_scan_rsp(hdev, instance, pdu.data);
794*cba6b758SLuiz Augusto von Dentz 
795*cba6b758SLuiz Augusto von Dentz 	if (hdev->scan_rsp_data_len == len &&
796*cba6b758SLuiz Augusto von Dentz 	    !memcmp(pdu.data, hdev->scan_rsp_data, len))
797*cba6b758SLuiz Augusto von Dentz 		return 0;
798*cba6b758SLuiz Augusto von Dentz 
799*cba6b758SLuiz Augusto von Dentz 	memcpy(hdev->scan_rsp_data, pdu.data, len);
800*cba6b758SLuiz Augusto von Dentz 	hdev->scan_rsp_data_len = len;
801*cba6b758SLuiz Augusto von Dentz 
802*cba6b758SLuiz Augusto von Dentz 	pdu.cp.handle = instance;
803*cba6b758SLuiz Augusto von Dentz 	pdu.cp.length = len;
804*cba6b758SLuiz Augusto von Dentz 	pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
805*cba6b758SLuiz Augusto von Dentz 	pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
806*cba6b758SLuiz Augusto von Dentz 
807*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_SCAN_RSP_DATA,
808*cba6b758SLuiz Augusto von Dentz 				     sizeof(pdu.cp) + len, &pdu.cp,
809*cba6b758SLuiz Augusto von Dentz 				     HCI_CMD_TIMEOUT);
810*cba6b758SLuiz Augusto von Dentz }
811*cba6b758SLuiz Augusto von Dentz 
812*cba6b758SLuiz Augusto von Dentz static int __hci_set_scan_rsp_data_sync(struct hci_dev *hdev, u8 instance)
813*cba6b758SLuiz Augusto von Dentz {
814*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_scan_rsp_data cp;
815*cba6b758SLuiz Augusto von Dentz 	u8 len;
816*cba6b758SLuiz Augusto von Dentz 
817*cba6b758SLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
818*cba6b758SLuiz Augusto von Dentz 
819*cba6b758SLuiz Augusto von Dentz 	len = eir_create_scan_rsp(hdev, instance, cp.data);
820*cba6b758SLuiz Augusto von Dentz 
821*cba6b758SLuiz Augusto von Dentz 	if (hdev->scan_rsp_data_len == len &&
822*cba6b758SLuiz Augusto von Dentz 	    !memcmp(cp.data, hdev->scan_rsp_data, len))
823*cba6b758SLuiz Augusto von Dentz 		return 0;
824*cba6b758SLuiz Augusto von Dentz 
825*cba6b758SLuiz Augusto von Dentz 	memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data));
826*cba6b758SLuiz Augusto von Dentz 	hdev->scan_rsp_data_len = len;
827*cba6b758SLuiz Augusto von Dentz 
828*cba6b758SLuiz Augusto von Dentz 	cp.length = len;
829*cba6b758SLuiz Augusto von Dentz 
830*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_SCAN_RSP_DATA,
831*cba6b758SLuiz Augusto von Dentz 				     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
832*cba6b758SLuiz Augusto von Dentz }
833*cba6b758SLuiz Augusto von Dentz 
834*cba6b758SLuiz Augusto von Dentz int hci_update_scan_rsp_data_sync(struct hci_dev *hdev, u8 instance)
835*cba6b758SLuiz Augusto von Dentz {
836*cba6b758SLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
837*cba6b758SLuiz Augusto von Dentz 		return 0;
838*cba6b758SLuiz Augusto von Dentz 
839*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
840*cba6b758SLuiz Augusto von Dentz 		return hci_set_ext_scan_rsp_data_sync(hdev, instance);
841*cba6b758SLuiz Augusto von Dentz 
842*cba6b758SLuiz Augusto von Dentz 	return __hci_set_scan_rsp_data_sync(hdev, instance);
843*cba6b758SLuiz Augusto von Dentz }
844*cba6b758SLuiz Augusto von Dentz 
845*cba6b758SLuiz Augusto von Dentz int hci_enable_ext_advertising_sync(struct hci_dev *hdev, u8 instance)
846*cba6b758SLuiz Augusto von Dentz {
847*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_ext_adv_enable *cp;
848*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_ext_adv_set *set;
849*cba6b758SLuiz Augusto von Dentz 	u8 data[sizeof(*cp) + sizeof(*set) * 1];
850*cba6b758SLuiz Augusto von Dentz 	struct adv_info *adv;
851*cba6b758SLuiz Augusto von Dentz 
852*cba6b758SLuiz Augusto von Dentz 	if (instance > 0) {
853*cba6b758SLuiz Augusto von Dentz 		adv = hci_find_adv_instance(hdev, instance);
854*cba6b758SLuiz Augusto von Dentz 		if (!adv)
855*cba6b758SLuiz Augusto von Dentz 			return -EINVAL;
856*cba6b758SLuiz Augusto von Dentz 		/* If already enabled there is nothing to do */
857*cba6b758SLuiz Augusto von Dentz 		if (adv->enabled)
858*cba6b758SLuiz Augusto von Dentz 			return 0;
859*cba6b758SLuiz Augusto von Dentz 	} else {
860*cba6b758SLuiz Augusto von Dentz 		adv = NULL;
861*cba6b758SLuiz Augusto von Dentz 	}
862*cba6b758SLuiz Augusto von Dentz 
863*cba6b758SLuiz Augusto von Dentz 	cp = (void *)data;
864*cba6b758SLuiz Augusto von Dentz 	set = (void *)cp->data;
865*cba6b758SLuiz Augusto von Dentz 
866*cba6b758SLuiz Augusto von Dentz 	memset(cp, 0, sizeof(*cp));
867*cba6b758SLuiz Augusto von Dentz 
868*cba6b758SLuiz Augusto von Dentz 	cp->enable = 0x01;
869*cba6b758SLuiz Augusto von Dentz 	cp->num_of_sets = 0x01;
870*cba6b758SLuiz Augusto von Dentz 
871*cba6b758SLuiz Augusto von Dentz 	memset(set, 0, sizeof(*set));
872*cba6b758SLuiz Augusto von Dentz 
873*cba6b758SLuiz Augusto von Dentz 	set->handle = instance;
874*cba6b758SLuiz Augusto von Dentz 
875*cba6b758SLuiz Augusto von Dentz 	/* Set duration per instance since controller is responsible for
876*cba6b758SLuiz Augusto von Dentz 	 * scheduling it.
877*cba6b758SLuiz Augusto von Dentz 	 */
878*cba6b758SLuiz Augusto von Dentz 	if (adv && adv->duration) {
879*cba6b758SLuiz Augusto von Dentz 		u16 duration = adv->timeout * MSEC_PER_SEC;
880*cba6b758SLuiz Augusto von Dentz 
881*cba6b758SLuiz Augusto von Dentz 		/* Time = N * 10 ms */
882*cba6b758SLuiz Augusto von Dentz 		set->duration = cpu_to_le16(duration / 10);
883*cba6b758SLuiz Augusto von Dentz 	}
884*cba6b758SLuiz Augusto von Dentz 
885*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
886*cba6b758SLuiz Augusto von Dentz 				     sizeof(*cp) +
887*cba6b758SLuiz Augusto von Dentz 				     sizeof(*set) * cp->num_of_sets,
888*cba6b758SLuiz Augusto von Dentz 				     data, HCI_CMD_TIMEOUT);
889*cba6b758SLuiz Augusto von Dentz }
890*cba6b758SLuiz Augusto von Dentz 
891*cba6b758SLuiz Augusto von Dentz int hci_start_ext_adv_sync(struct hci_dev *hdev, u8 instance)
892*cba6b758SLuiz Augusto von Dentz {
893*cba6b758SLuiz Augusto von Dentz 	int err;
894*cba6b758SLuiz Augusto von Dentz 
895*cba6b758SLuiz Augusto von Dentz 	err = hci_setup_ext_adv_instance_sync(hdev, instance);
896*cba6b758SLuiz Augusto von Dentz 	if (err)
897*cba6b758SLuiz Augusto von Dentz 		return err;
898*cba6b758SLuiz Augusto von Dentz 
899*cba6b758SLuiz Augusto von Dentz 	err = hci_set_ext_scan_rsp_data_sync(hdev, instance);
900*cba6b758SLuiz Augusto von Dentz 	if (err)
901*cba6b758SLuiz Augusto von Dentz 		return err;
902*cba6b758SLuiz Augusto von Dentz 
903*cba6b758SLuiz Augusto von Dentz 	return hci_enable_ext_advertising_sync(hdev, instance);
904*cba6b758SLuiz Augusto von Dentz }
905*cba6b758SLuiz Augusto von Dentz 
906*cba6b758SLuiz Augusto von Dentz static int hci_start_adv_sync(struct hci_dev *hdev, u8 instance)
907*cba6b758SLuiz Augusto von Dentz {
908*cba6b758SLuiz Augusto von Dentz 	int err;
909*cba6b758SLuiz Augusto von Dentz 
910*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
911*cba6b758SLuiz Augusto von Dentz 		return hci_start_ext_adv_sync(hdev, instance);
912*cba6b758SLuiz Augusto von Dentz 
913*cba6b758SLuiz Augusto von Dentz 	err = hci_update_adv_data_sync(hdev, instance);
914*cba6b758SLuiz Augusto von Dentz 	if (err)
915*cba6b758SLuiz Augusto von Dentz 		return err;
916*cba6b758SLuiz Augusto von Dentz 
917*cba6b758SLuiz Augusto von Dentz 	err = hci_update_scan_rsp_data_sync(hdev, instance);
918*cba6b758SLuiz Augusto von Dentz 	if (err)
919*cba6b758SLuiz Augusto von Dentz 		return err;
920*cba6b758SLuiz Augusto von Dentz 
921*cba6b758SLuiz Augusto von Dentz 	return hci_enable_advertising_sync(hdev);
922*cba6b758SLuiz Augusto von Dentz }
923*cba6b758SLuiz Augusto von Dentz 
924*cba6b758SLuiz Augusto von Dentz int hci_enable_advertising_sync(struct hci_dev *hdev)
925*cba6b758SLuiz Augusto von Dentz {
926*cba6b758SLuiz Augusto von Dentz 	struct adv_info *adv_instance;
927*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_adv_param cp;
928*cba6b758SLuiz Augusto von Dentz 	u8 own_addr_type, enable = 0x01;
929*cba6b758SLuiz Augusto von Dentz 	bool connectable;
930*cba6b758SLuiz Augusto von Dentz 	u16 adv_min_interval, adv_max_interval;
931*cba6b758SLuiz Augusto von Dentz 	u32 flags;
932*cba6b758SLuiz Augusto von Dentz 	u8 status;
933*cba6b758SLuiz Augusto von Dentz 
934*cba6b758SLuiz Augusto von Dentz 	flags = hci_adv_instance_flags(hdev, hdev->cur_adv_instance);
935*cba6b758SLuiz Augusto von Dentz 	adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
936*cba6b758SLuiz Augusto von Dentz 
937*cba6b758SLuiz Augusto von Dentz 	/* If the "connectable" instance flag was not set, then choose between
938*cba6b758SLuiz Augusto von Dentz 	 * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
939*cba6b758SLuiz Augusto von Dentz 	 */
940*cba6b758SLuiz Augusto von Dentz 	connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE) ||
941*cba6b758SLuiz Augusto von Dentz 		      mgmt_get_connectable(hdev);
942*cba6b758SLuiz Augusto von Dentz 
943*cba6b758SLuiz Augusto von Dentz 	if (!is_advertising_allowed(hdev, connectable))
944*cba6b758SLuiz Augusto von Dentz 		return -EINVAL;
945*cba6b758SLuiz Augusto von Dentz 
946*cba6b758SLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_LE_ADV)) {
947*cba6b758SLuiz Augusto von Dentz 		status = hci_disable_advertising_sync(hdev);
948*cba6b758SLuiz Augusto von Dentz 		if (status)
949*cba6b758SLuiz Augusto von Dentz 			return status;
950*cba6b758SLuiz Augusto von Dentz 	}
951*cba6b758SLuiz Augusto von Dentz 
952*cba6b758SLuiz Augusto von Dentz 	/* Clear the HCI_LE_ADV bit temporarily so that the
953*cba6b758SLuiz Augusto von Dentz 	 * hci_update_random_address knows that it's safe to go ahead
954*cba6b758SLuiz Augusto von Dentz 	 * and write a new random address. The flag will be set back on
955*cba6b758SLuiz Augusto von Dentz 	 * as soon as the SET_ADV_ENABLE HCI command completes.
956*cba6b758SLuiz Augusto von Dentz 	 */
957*cba6b758SLuiz Augusto von Dentz 	hci_dev_clear_flag(hdev, HCI_LE_ADV);
958*cba6b758SLuiz Augusto von Dentz 
959*cba6b758SLuiz Augusto von Dentz 	/* Set require_privacy to true only when non-connectable
960*cba6b758SLuiz Augusto von Dentz 	 * advertising is used. In that case it is fine to use a
961*cba6b758SLuiz Augusto von Dentz 	 * non-resolvable private address.
962*cba6b758SLuiz Augusto von Dentz 	 */
963*cba6b758SLuiz Augusto von Dentz 	status = hci_update_random_address_sync(hdev, !connectable,
964*cba6b758SLuiz Augusto von Dentz 						adv_use_rpa(hdev, flags),
965*cba6b758SLuiz Augusto von Dentz 						&own_addr_type);
966*cba6b758SLuiz Augusto von Dentz 	if (status)
967*cba6b758SLuiz Augusto von Dentz 		return status;
968*cba6b758SLuiz Augusto von Dentz 
969*cba6b758SLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
970*cba6b758SLuiz Augusto von Dentz 
971*cba6b758SLuiz Augusto von Dentz 	if (adv_instance) {
972*cba6b758SLuiz Augusto von Dentz 		adv_min_interval = adv_instance->min_interval;
973*cba6b758SLuiz Augusto von Dentz 		adv_max_interval = adv_instance->max_interval;
974*cba6b758SLuiz Augusto von Dentz 	} else {
975*cba6b758SLuiz Augusto von Dentz 		adv_min_interval = hdev->le_adv_min_interval;
976*cba6b758SLuiz Augusto von Dentz 		adv_max_interval = hdev->le_adv_max_interval;
977*cba6b758SLuiz Augusto von Dentz 	}
978*cba6b758SLuiz Augusto von Dentz 
979*cba6b758SLuiz Augusto von Dentz 	if (connectable) {
980*cba6b758SLuiz Augusto von Dentz 		cp.type = LE_ADV_IND;
981*cba6b758SLuiz Augusto von Dentz 	} else {
982*cba6b758SLuiz Augusto von Dentz 		if (hci_adv_instance_is_scannable(hdev, hdev->cur_adv_instance))
983*cba6b758SLuiz Augusto von Dentz 			cp.type = LE_ADV_SCAN_IND;
984*cba6b758SLuiz Augusto von Dentz 		else
985*cba6b758SLuiz Augusto von Dentz 			cp.type = LE_ADV_NONCONN_IND;
986*cba6b758SLuiz Augusto von Dentz 
987*cba6b758SLuiz Augusto von Dentz 		if (!hci_dev_test_flag(hdev, HCI_DISCOVERABLE) ||
988*cba6b758SLuiz Augusto von Dentz 		    hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) {
989*cba6b758SLuiz Augusto von Dentz 			adv_min_interval = DISCOV_LE_FAST_ADV_INT_MIN;
990*cba6b758SLuiz Augusto von Dentz 			adv_max_interval = DISCOV_LE_FAST_ADV_INT_MAX;
991*cba6b758SLuiz Augusto von Dentz 		}
992*cba6b758SLuiz Augusto von Dentz 	}
993*cba6b758SLuiz Augusto von Dentz 
994*cba6b758SLuiz Augusto von Dentz 	cp.min_interval = cpu_to_le16(adv_min_interval);
995*cba6b758SLuiz Augusto von Dentz 	cp.max_interval = cpu_to_le16(adv_max_interval);
996*cba6b758SLuiz Augusto von Dentz 	cp.own_address_type = own_addr_type;
997*cba6b758SLuiz Augusto von Dentz 	cp.channel_map = hdev->le_adv_channel_map;
998*cba6b758SLuiz Augusto von Dentz 
999*cba6b758SLuiz Augusto von Dentz 	status = __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_PARAM,
1000*cba6b758SLuiz Augusto von Dentz 				       sizeof(cp), &cp, HCI_CMD_TIMEOUT);
1001*cba6b758SLuiz Augusto von Dentz 	if (status)
1002*cba6b758SLuiz Augusto von Dentz 		return status;
1003*cba6b758SLuiz Augusto von Dentz 
1004*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_ENABLE,
1005*cba6b758SLuiz Augusto von Dentz 				     sizeof(enable), &enable, HCI_CMD_TIMEOUT);
1006*cba6b758SLuiz Augusto von Dentz }
1007*cba6b758SLuiz Augusto von Dentz 
1008*cba6b758SLuiz Augusto von Dentz static int hci_remove_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance,
1009*cba6b758SLuiz Augusto von Dentz 					    struct sock *sk)
1010*cba6b758SLuiz Augusto von Dentz {
1011*cba6b758SLuiz Augusto von Dentz 	int err;
1012*cba6b758SLuiz Augusto von Dentz 
1013*cba6b758SLuiz Augusto von Dentz 	if (!ext_adv_capable(hdev))
1014*cba6b758SLuiz Augusto von Dentz 		return 0;
1015*cba6b758SLuiz Augusto von Dentz 
1016*cba6b758SLuiz Augusto von Dentz 	err = hci_disable_ext_adv_instance_sync(hdev, instance);
1017*cba6b758SLuiz Augusto von Dentz 	if (err)
1018*cba6b758SLuiz Augusto von Dentz 		return err;
1019*cba6b758SLuiz Augusto von Dentz 
1020*cba6b758SLuiz Augusto von Dentz 	/* If request specifies an instance that doesn't exist, fail */
1021*cba6b758SLuiz Augusto von Dentz 	if (instance > 0 && !hci_find_adv_instance(hdev, instance))
1022*cba6b758SLuiz Augusto von Dentz 		return -EINVAL;
1023*cba6b758SLuiz Augusto von Dentz 
1024*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status_sk(hdev, HCI_OP_LE_REMOVE_ADV_SET,
1025*cba6b758SLuiz Augusto von Dentz 					sizeof(instance), &instance, 0,
1026*cba6b758SLuiz Augusto von Dentz 					HCI_CMD_TIMEOUT, sk);
1027*cba6b758SLuiz Augusto von Dentz }
1028*cba6b758SLuiz Augusto von Dentz 
1029*cba6b758SLuiz Augusto von Dentz static void cancel_adv_timeout(struct hci_dev *hdev)
1030*cba6b758SLuiz Augusto von Dentz {
1031*cba6b758SLuiz Augusto von Dentz 	if (hdev->adv_instance_timeout) {
1032*cba6b758SLuiz Augusto von Dentz 		hdev->adv_instance_timeout = 0;
1033*cba6b758SLuiz Augusto von Dentz 		cancel_delayed_work(&hdev->adv_instance_expire);
1034*cba6b758SLuiz Augusto von Dentz 	}
1035*cba6b758SLuiz Augusto von Dentz }
1036*cba6b758SLuiz Augusto von Dentz 
1037*cba6b758SLuiz Augusto von Dentz static int hci_set_ext_adv_data_sync(struct hci_dev *hdev, u8 instance)
1038*cba6b758SLuiz Augusto von Dentz {
1039*cba6b758SLuiz Augusto von Dentz 	struct {
1040*cba6b758SLuiz Augusto von Dentz 		struct hci_cp_le_set_ext_adv_data cp;
1041*cba6b758SLuiz Augusto von Dentz 		u8 data[HCI_MAX_EXT_AD_LENGTH];
1042*cba6b758SLuiz Augusto von Dentz 	} pdu;
1043*cba6b758SLuiz Augusto von Dentz 	u8 len;
1044*cba6b758SLuiz Augusto von Dentz 
1045*cba6b758SLuiz Augusto von Dentz 	memset(&pdu, 0, sizeof(pdu));
1046*cba6b758SLuiz Augusto von Dentz 
1047*cba6b758SLuiz Augusto von Dentz 	len = eir_create_adv_data(hdev, instance, pdu.data);
1048*cba6b758SLuiz Augusto von Dentz 
1049*cba6b758SLuiz Augusto von Dentz 	/* There's nothing to do if the data hasn't changed */
1050*cba6b758SLuiz Augusto von Dentz 	if (hdev->adv_data_len == len &&
1051*cba6b758SLuiz Augusto von Dentz 	    memcmp(pdu.data, hdev->adv_data, len) == 0)
1052*cba6b758SLuiz Augusto von Dentz 		return 0;
1053*cba6b758SLuiz Augusto von Dentz 
1054*cba6b758SLuiz Augusto von Dentz 	memcpy(hdev->adv_data, pdu.data, len);
1055*cba6b758SLuiz Augusto von Dentz 	hdev->adv_data_len = len;
1056*cba6b758SLuiz Augusto von Dentz 
1057*cba6b758SLuiz Augusto von Dentz 	pdu.cp.length = len;
1058*cba6b758SLuiz Augusto von Dentz 	pdu.cp.handle = instance;
1059*cba6b758SLuiz Augusto von Dentz 	pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
1060*cba6b758SLuiz Augusto von Dentz 	pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
1061*cba6b758SLuiz Augusto von Dentz 
1062*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_EXT_ADV_DATA,
1063*cba6b758SLuiz Augusto von Dentz 				     sizeof(pdu.cp) + len, &pdu.cp,
1064*cba6b758SLuiz Augusto von Dentz 				     HCI_CMD_TIMEOUT);
1065*cba6b758SLuiz Augusto von Dentz }
1066*cba6b758SLuiz Augusto von Dentz 
1067*cba6b758SLuiz Augusto von Dentz static int hci_set_adv_data_sync(struct hci_dev *hdev, u8 instance)
1068*cba6b758SLuiz Augusto von Dentz {
1069*cba6b758SLuiz Augusto von Dentz 	struct hci_cp_le_set_adv_data cp;
1070*cba6b758SLuiz Augusto von Dentz 	u8 len;
1071*cba6b758SLuiz Augusto von Dentz 
1072*cba6b758SLuiz Augusto von Dentz 	memset(&cp, 0, sizeof(cp));
1073*cba6b758SLuiz Augusto von Dentz 
1074*cba6b758SLuiz Augusto von Dentz 	len = eir_create_adv_data(hdev, instance, cp.data);
1075*cba6b758SLuiz Augusto von Dentz 
1076*cba6b758SLuiz Augusto von Dentz 	/* There's nothing to do if the data hasn't changed */
1077*cba6b758SLuiz Augusto von Dentz 	if (hdev->adv_data_len == len &&
1078*cba6b758SLuiz Augusto von Dentz 	    memcmp(cp.data, hdev->adv_data, len) == 0)
1079*cba6b758SLuiz Augusto von Dentz 		return 0;
1080*cba6b758SLuiz Augusto von Dentz 
1081*cba6b758SLuiz Augusto von Dentz 	memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
1082*cba6b758SLuiz Augusto von Dentz 	hdev->adv_data_len = len;
1083*cba6b758SLuiz Augusto von Dentz 
1084*cba6b758SLuiz Augusto von Dentz 	cp.length = len;
1085*cba6b758SLuiz Augusto von Dentz 
1086*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA,
1087*cba6b758SLuiz Augusto von Dentz 				     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
1088*cba6b758SLuiz Augusto von Dentz }
1089*cba6b758SLuiz Augusto von Dentz 
1090*cba6b758SLuiz Augusto von Dentz int hci_update_adv_data_sync(struct hci_dev *hdev, u8 instance)
1091*cba6b758SLuiz Augusto von Dentz {
1092*cba6b758SLuiz Augusto von Dentz 	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1093*cba6b758SLuiz Augusto von Dentz 		return 0;
1094*cba6b758SLuiz Augusto von Dentz 
1095*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
1096*cba6b758SLuiz Augusto von Dentz 		return hci_set_ext_adv_data_sync(hdev, instance);
1097*cba6b758SLuiz Augusto von Dentz 
1098*cba6b758SLuiz Augusto von Dentz 	return hci_set_adv_data_sync(hdev, instance);
1099*cba6b758SLuiz Augusto von Dentz }
1100*cba6b758SLuiz Augusto von Dentz 
1101*cba6b758SLuiz Augusto von Dentz int hci_schedule_adv_instance_sync(struct hci_dev *hdev, u8 instance,
1102*cba6b758SLuiz Augusto von Dentz 				   bool force)
1103*cba6b758SLuiz Augusto von Dentz {
1104*cba6b758SLuiz Augusto von Dentz 	struct adv_info *adv = NULL;
1105*cba6b758SLuiz Augusto von Dentz 	u16 timeout;
1106*cba6b758SLuiz Augusto von Dentz 
1107*cba6b758SLuiz Augusto von Dentz 	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
1108*cba6b758SLuiz Augusto von Dentz 	    list_empty(&hdev->adv_instances))
1109*cba6b758SLuiz Augusto von Dentz 		return -EPERM;
1110*cba6b758SLuiz Augusto von Dentz 
1111*cba6b758SLuiz Augusto von Dentz 	if (hdev->adv_instance_timeout)
1112*cba6b758SLuiz Augusto von Dentz 		return -EBUSY;
1113*cba6b758SLuiz Augusto von Dentz 
1114*cba6b758SLuiz Augusto von Dentz 	adv = hci_find_adv_instance(hdev, instance);
1115*cba6b758SLuiz Augusto von Dentz 	if (!adv)
1116*cba6b758SLuiz Augusto von Dentz 		return -ENOENT;
1117*cba6b758SLuiz Augusto von Dentz 
1118*cba6b758SLuiz Augusto von Dentz 	/* A zero timeout means unlimited advertising. As long as there is
1119*cba6b758SLuiz Augusto von Dentz 	 * only one instance, duration should be ignored. We still set a timeout
1120*cba6b758SLuiz Augusto von Dentz 	 * in case further instances are being added later on.
1121*cba6b758SLuiz Augusto von Dentz 	 *
1122*cba6b758SLuiz Augusto von Dentz 	 * If the remaining lifetime of the instance is more than the duration
1123*cba6b758SLuiz Augusto von Dentz 	 * then the timeout corresponds to the duration, otherwise it will be
1124*cba6b758SLuiz Augusto von Dentz 	 * reduced to the remaining instance lifetime.
1125*cba6b758SLuiz Augusto von Dentz 	 */
1126*cba6b758SLuiz Augusto von Dentz 	if (adv->timeout == 0 || adv->duration <= adv->remaining_time)
1127*cba6b758SLuiz Augusto von Dentz 		timeout = adv->duration;
1128*cba6b758SLuiz Augusto von Dentz 	else
1129*cba6b758SLuiz Augusto von Dentz 		timeout = adv->remaining_time;
1130*cba6b758SLuiz Augusto von Dentz 
1131*cba6b758SLuiz Augusto von Dentz 	/* The remaining time is being reduced unless the instance is being
1132*cba6b758SLuiz Augusto von Dentz 	 * advertised without time limit.
1133*cba6b758SLuiz Augusto von Dentz 	 */
1134*cba6b758SLuiz Augusto von Dentz 	if (adv->timeout)
1135*cba6b758SLuiz Augusto von Dentz 		adv->remaining_time = adv->remaining_time - timeout;
1136*cba6b758SLuiz Augusto von Dentz 
1137*cba6b758SLuiz Augusto von Dentz 	/* Only use work for scheduling instances with legacy advertising */
1138*cba6b758SLuiz Augusto von Dentz 	if (!ext_adv_capable(hdev)) {
1139*cba6b758SLuiz Augusto von Dentz 		hdev->adv_instance_timeout = timeout;
1140*cba6b758SLuiz Augusto von Dentz 		queue_delayed_work(hdev->req_workqueue,
1141*cba6b758SLuiz Augusto von Dentz 				   &hdev->adv_instance_expire,
1142*cba6b758SLuiz Augusto von Dentz 				   msecs_to_jiffies(timeout * 1000));
1143*cba6b758SLuiz Augusto von Dentz 	}
1144*cba6b758SLuiz Augusto von Dentz 
1145*cba6b758SLuiz Augusto von Dentz 	/* If we're just re-scheduling the same instance again then do not
1146*cba6b758SLuiz Augusto von Dentz 	 * execute any HCI commands. This happens when a single instance is
1147*cba6b758SLuiz Augusto von Dentz 	 * being advertised.
1148*cba6b758SLuiz Augusto von Dentz 	 */
1149*cba6b758SLuiz Augusto von Dentz 	if (!force && hdev->cur_adv_instance == instance &&
1150*cba6b758SLuiz Augusto von Dentz 	    hci_dev_test_flag(hdev, HCI_LE_ADV))
1151*cba6b758SLuiz Augusto von Dentz 		return 0;
1152*cba6b758SLuiz Augusto von Dentz 
1153*cba6b758SLuiz Augusto von Dentz 	hdev->cur_adv_instance = instance;
1154*cba6b758SLuiz Augusto von Dentz 
1155*cba6b758SLuiz Augusto von Dentz 	return hci_start_adv_sync(hdev, instance);
1156*cba6b758SLuiz Augusto von Dentz }
1157*cba6b758SLuiz Augusto von Dentz 
1158*cba6b758SLuiz Augusto von Dentz static int hci_clear_adv_sets_sync(struct hci_dev *hdev, struct sock *sk)
1159*cba6b758SLuiz Augusto von Dentz {
1160*cba6b758SLuiz Augusto von Dentz 	int err;
1161*cba6b758SLuiz Augusto von Dentz 
1162*cba6b758SLuiz Augusto von Dentz 	if (!ext_adv_capable(hdev))
1163*cba6b758SLuiz Augusto von Dentz 		return 0;
1164*cba6b758SLuiz Augusto von Dentz 
1165*cba6b758SLuiz Augusto von Dentz 	/* Disable instance 0x00 to disable all instances */
1166*cba6b758SLuiz Augusto von Dentz 	err = hci_disable_ext_adv_instance_sync(hdev, 0x00);
1167*cba6b758SLuiz Augusto von Dentz 	if (err)
1168*cba6b758SLuiz Augusto von Dentz 		return err;
1169*cba6b758SLuiz Augusto von Dentz 
1170*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status_sk(hdev, HCI_OP_LE_CLEAR_ADV_SETS,
1171*cba6b758SLuiz Augusto von Dentz 					0, NULL, 0, HCI_CMD_TIMEOUT, sk);
1172*cba6b758SLuiz Augusto von Dentz }
1173*cba6b758SLuiz Augusto von Dentz 
1174*cba6b758SLuiz Augusto von Dentz static int hci_clear_adv_sync(struct hci_dev *hdev, struct sock *sk, bool force)
1175*cba6b758SLuiz Augusto von Dentz {
1176*cba6b758SLuiz Augusto von Dentz 	struct adv_info *adv, *n;
1177*cba6b758SLuiz Augusto von Dentz 
1178*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
1179*cba6b758SLuiz Augusto von Dentz 		/* Remove all existing sets */
1180*cba6b758SLuiz Augusto von Dentz 		return hci_clear_adv_sets_sync(hdev, sk);
1181*cba6b758SLuiz Augusto von Dentz 
1182*cba6b758SLuiz Augusto von Dentz 	/* This is safe as long as there is no command send while the lock is
1183*cba6b758SLuiz Augusto von Dentz 	 * held.
1184*cba6b758SLuiz Augusto von Dentz 	 */
1185*cba6b758SLuiz Augusto von Dentz 	hci_dev_lock(hdev);
1186*cba6b758SLuiz Augusto von Dentz 
1187*cba6b758SLuiz Augusto von Dentz 	/* Cleanup non-ext instances */
1188*cba6b758SLuiz Augusto von Dentz 	list_for_each_entry_safe(adv, n, &hdev->adv_instances, list) {
1189*cba6b758SLuiz Augusto von Dentz 		u8 instance = adv->instance;
1190*cba6b758SLuiz Augusto von Dentz 		int err;
1191*cba6b758SLuiz Augusto von Dentz 
1192*cba6b758SLuiz Augusto von Dentz 		if (!(force || adv->timeout))
1193*cba6b758SLuiz Augusto von Dentz 			continue;
1194*cba6b758SLuiz Augusto von Dentz 
1195*cba6b758SLuiz Augusto von Dentz 		err = hci_remove_adv_instance(hdev, instance);
1196*cba6b758SLuiz Augusto von Dentz 		if (!err)
1197*cba6b758SLuiz Augusto von Dentz 			mgmt_advertising_removed(sk, hdev, instance);
1198*cba6b758SLuiz Augusto von Dentz 	}
1199*cba6b758SLuiz Augusto von Dentz 
1200*cba6b758SLuiz Augusto von Dentz 	hci_dev_unlock(hdev);
1201*cba6b758SLuiz Augusto von Dentz 
1202*cba6b758SLuiz Augusto von Dentz 	return 0;
1203*cba6b758SLuiz Augusto von Dentz }
1204*cba6b758SLuiz Augusto von Dentz 
1205*cba6b758SLuiz Augusto von Dentz static int hci_remove_adv_sync(struct hci_dev *hdev, u8 instance,
1206*cba6b758SLuiz Augusto von Dentz 			       struct sock *sk)
1207*cba6b758SLuiz Augusto von Dentz {
1208*cba6b758SLuiz Augusto von Dentz 	int err;
1209*cba6b758SLuiz Augusto von Dentz 
1210*cba6b758SLuiz Augusto von Dentz 	/* If we use extended advertising, instance has to be removed first. */
1211*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
1212*cba6b758SLuiz Augusto von Dentz 		return hci_remove_ext_adv_instance_sync(hdev, instance, sk);
1213*cba6b758SLuiz Augusto von Dentz 
1214*cba6b758SLuiz Augusto von Dentz 	/* This is safe as long as there is no command send while the lock is
1215*cba6b758SLuiz Augusto von Dentz 	 * held.
1216*cba6b758SLuiz Augusto von Dentz 	 */
1217*cba6b758SLuiz Augusto von Dentz 	hci_dev_lock(hdev);
1218*cba6b758SLuiz Augusto von Dentz 
1219*cba6b758SLuiz Augusto von Dentz 	err = hci_remove_adv_instance(hdev, instance);
1220*cba6b758SLuiz Augusto von Dentz 	if (!err)
1221*cba6b758SLuiz Augusto von Dentz 		mgmt_advertising_removed(sk, hdev, instance);
1222*cba6b758SLuiz Augusto von Dentz 
1223*cba6b758SLuiz Augusto von Dentz 	hci_dev_unlock(hdev);
1224*cba6b758SLuiz Augusto von Dentz 
1225*cba6b758SLuiz Augusto von Dentz 	return err;
1226*cba6b758SLuiz Augusto von Dentz }
1227*cba6b758SLuiz Augusto von Dentz 
1228*cba6b758SLuiz Augusto von Dentz /* For a single instance:
1229*cba6b758SLuiz Augusto von Dentz  * - force == true: The instance will be removed even when its remaining
1230*cba6b758SLuiz Augusto von Dentz  *   lifetime is not zero.
1231*cba6b758SLuiz Augusto von Dentz  * - force == false: the instance will be deactivated but kept stored unless
1232*cba6b758SLuiz Augusto von Dentz  *   the remaining lifetime is zero.
1233*cba6b758SLuiz Augusto von Dentz  *
1234*cba6b758SLuiz Augusto von Dentz  * For instance == 0x00:
1235*cba6b758SLuiz Augusto von Dentz  * - force == true: All instances will be removed regardless of their timeout
1236*cba6b758SLuiz Augusto von Dentz  *   setting.
1237*cba6b758SLuiz Augusto von Dentz  * - force == false: Only instances that have a timeout will be removed.
1238*cba6b758SLuiz Augusto von Dentz  */
1239*cba6b758SLuiz Augusto von Dentz int hci_remove_advertising_sync(struct hci_dev *hdev, struct sock *sk,
1240*cba6b758SLuiz Augusto von Dentz 				u8 instance, bool force)
1241*cba6b758SLuiz Augusto von Dentz {
1242*cba6b758SLuiz Augusto von Dentz 	struct adv_info *next = NULL;
1243*cba6b758SLuiz Augusto von Dentz 	int err;
1244*cba6b758SLuiz Augusto von Dentz 
1245*cba6b758SLuiz Augusto von Dentz 	/* Cancel any timeout concerning the removed instance(s). */
1246*cba6b758SLuiz Augusto von Dentz 	if (!instance || hdev->cur_adv_instance == instance)
1247*cba6b758SLuiz Augusto von Dentz 		cancel_adv_timeout(hdev);
1248*cba6b758SLuiz Augusto von Dentz 
1249*cba6b758SLuiz Augusto von Dentz 	/* Get the next instance to advertise BEFORE we remove
1250*cba6b758SLuiz Augusto von Dentz 	 * the current one. This can be the same instance again
1251*cba6b758SLuiz Augusto von Dentz 	 * if there is only one instance.
1252*cba6b758SLuiz Augusto von Dentz 	 */
1253*cba6b758SLuiz Augusto von Dentz 	if (hdev->cur_adv_instance == instance)
1254*cba6b758SLuiz Augusto von Dentz 		next = hci_get_next_instance(hdev, instance);
1255*cba6b758SLuiz Augusto von Dentz 
1256*cba6b758SLuiz Augusto von Dentz 	if (!instance) {
1257*cba6b758SLuiz Augusto von Dentz 		err = hci_clear_adv_sync(hdev, sk, force);
1258*cba6b758SLuiz Augusto von Dentz 		if (err)
1259*cba6b758SLuiz Augusto von Dentz 			return err;
1260*cba6b758SLuiz Augusto von Dentz 	} else {
1261*cba6b758SLuiz Augusto von Dentz 		struct adv_info *adv = hci_find_adv_instance(hdev, instance);
1262*cba6b758SLuiz Augusto von Dentz 
1263*cba6b758SLuiz Augusto von Dentz 		if (force || (adv && adv->timeout && !adv->remaining_time)) {
1264*cba6b758SLuiz Augusto von Dentz 			/* Don't advertise a removed instance. */
1265*cba6b758SLuiz Augusto von Dentz 			if (next && next->instance == instance)
1266*cba6b758SLuiz Augusto von Dentz 				next = NULL;
1267*cba6b758SLuiz Augusto von Dentz 
1268*cba6b758SLuiz Augusto von Dentz 			err = hci_remove_adv_sync(hdev, instance, sk);
1269*cba6b758SLuiz Augusto von Dentz 			if (err)
1270*cba6b758SLuiz Augusto von Dentz 				return err;
1271*cba6b758SLuiz Augusto von Dentz 		}
1272*cba6b758SLuiz Augusto von Dentz 	}
1273*cba6b758SLuiz Augusto von Dentz 
1274*cba6b758SLuiz Augusto von Dentz 	if (!hdev_is_powered(hdev) || hci_dev_test_flag(hdev, HCI_ADVERTISING))
1275*cba6b758SLuiz Augusto von Dentz 		return 0;
1276*cba6b758SLuiz Augusto von Dentz 
1277*cba6b758SLuiz Augusto von Dentz 	if (next && !ext_adv_capable(hdev))
1278*cba6b758SLuiz Augusto von Dentz 		hci_schedule_adv_instance_sync(hdev, next->instance, false);
1279*cba6b758SLuiz Augusto von Dentz 
1280*cba6b758SLuiz Augusto von Dentz 	return 0;
1281*cba6b758SLuiz Augusto von Dentz }
1282*cba6b758SLuiz Augusto von Dentz 
1283*cba6b758SLuiz Augusto von Dentz int hci_disable_advertising_sync(struct hci_dev *hdev)
1284*cba6b758SLuiz Augusto von Dentz {
1285*cba6b758SLuiz Augusto von Dentz 	u8 enable = 0x00;
1286*cba6b758SLuiz Augusto von Dentz 
1287*cba6b758SLuiz Augusto von Dentz 	if (ext_adv_capable(hdev))
1288*cba6b758SLuiz Augusto von Dentz 		return hci_disable_ext_adv_instance_sync(hdev, 0x00);
1289*cba6b758SLuiz Augusto von Dentz 
1290*cba6b758SLuiz Augusto von Dentz 	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_ENABLE,
1291*cba6b758SLuiz Augusto von Dentz 				     sizeof(enable), &enable, HCI_CMD_TIMEOUT);
1292*cba6b758SLuiz Augusto von Dentz }
1293