xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 04422da9)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds    BlueZ - Bluetooth protocol stack for Linux
31da177e4SLinus Torvalds    Copyright (C) 2000-2001 Qualcomm Incorporated
4590051deSGustavo F. Padovan    Copyright (C) 2011 ProFUSION Embedded Systems
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds    This program is free software; you can redistribute it and/or modify
91da177e4SLinus Torvalds    it under the terms of the GNU General Public License version 2 as
101da177e4SLinus Torvalds    published by the Free Software Foundation;
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
131da177e4SLinus Torvalds    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
141da177e4SLinus Torvalds    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
151da177e4SLinus Torvalds    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
161da177e4SLinus Torvalds    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
171da177e4SLinus Torvalds    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
181da177e4SLinus Torvalds    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
191da177e4SLinus Torvalds    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
221da177e4SLinus Torvalds    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
231da177e4SLinus Torvalds    SOFTWARE IS DISCLAIMED.
241da177e4SLinus Torvalds */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds /* Bluetooth HCI core. */
271da177e4SLinus Torvalds 
288c520a59SGustavo Padovan #include <linux/export.h>
293df92b31SSasha Levin #include <linux/idr.h>
30611b30f7SMarcel Holtmann #include <linux/rfkill.h>
31baf27f6eSMarcel Holtmann #include <linux/debugfs.h>
3299780a7bSJohan Hedberg #include <linux/crypto.h>
3347219839SMarcel Holtmann #include <asm/unaligned.h>
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds #include <net/bluetooth/bluetooth.h>
361da177e4SLinus Torvalds #include <net/bluetooth/hci_core.h>
374bc58f51SJohan Hedberg #include <net/bluetooth/l2cap.h>
38af58925cSMarcel Holtmann #include <net/bluetooth/mgmt.h>
391da177e4SLinus Torvalds 
400857dd3bSJohan Hedberg #include "hci_request.h"
4160c5f5fbSMarcel Holtmann #include "hci_debugfs.h"
42970c4e46SJohan Hedberg #include "smp.h"
43970c4e46SJohan Hedberg 
44b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work);
45c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work);
463eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work);
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds /* HCI device list */
491da177e4SLinus Torvalds LIST_HEAD(hci_dev_list);
501da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock);
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds /* HCI callback list */
531da177e4SLinus Torvalds LIST_HEAD(hci_cb_list);
541da177e4SLinus Torvalds DEFINE_RWLOCK(hci_cb_list_lock);
551da177e4SLinus Torvalds 
563df92b31SSasha Levin /* HCI ID Numbering */
573df92b31SSasha Levin static DEFINE_IDA(hci_index_ida);
583df92b31SSasha Levin 
59899de765SMarcel Holtmann /* ----- HCI requests ----- */
60899de765SMarcel Holtmann 
61899de765SMarcel Holtmann #define HCI_REQ_DONE	  0
62899de765SMarcel Holtmann #define HCI_REQ_PEND	  1
63899de765SMarcel Holtmann #define HCI_REQ_CANCELED  2
64899de765SMarcel Holtmann 
65899de765SMarcel Holtmann #define hci_req_lock(d)		mutex_lock(&d->req_lock)
66899de765SMarcel Holtmann #define hci_req_unlock(d)	mutex_unlock(&d->req_lock)
67899de765SMarcel Holtmann 
681da177e4SLinus Torvalds /* ---- HCI notifications ---- */
691da177e4SLinus Torvalds 
706516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event)
711da177e4SLinus Torvalds {
72040030efSMarcel Holtmann 	hci_sock_dev_event(hdev, event);
731da177e4SLinus Torvalds }
741da177e4SLinus Torvalds 
75baf27f6eSMarcel Holtmann /* ---- HCI debugfs entries ---- */
76baf27f6eSMarcel Holtmann 
774b4148e9SMarcel Holtmann static ssize_t dut_mode_read(struct file *file, char __user *user_buf,
784b4148e9SMarcel Holtmann 			     size_t count, loff_t *ppos)
794b4148e9SMarcel Holtmann {
804b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
814b4148e9SMarcel Holtmann 	char buf[3];
824b4148e9SMarcel Holtmann 
83111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_DUT_MODE, &hdev->dbg_flags) ? 'Y': 'N';
844b4148e9SMarcel Holtmann 	buf[1] = '\n';
854b4148e9SMarcel Holtmann 	buf[2] = '\0';
864b4148e9SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
874b4148e9SMarcel Holtmann }
884b4148e9SMarcel Holtmann 
894b4148e9SMarcel Holtmann static ssize_t dut_mode_write(struct file *file, const char __user *user_buf,
904b4148e9SMarcel Holtmann 			      size_t count, loff_t *ppos)
914b4148e9SMarcel Holtmann {
924b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
934b4148e9SMarcel Holtmann 	struct sk_buff *skb;
944b4148e9SMarcel Holtmann 	char buf[32];
954b4148e9SMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
964b4148e9SMarcel Holtmann 	bool enable;
974b4148e9SMarcel Holtmann 	int err;
984b4148e9SMarcel Holtmann 
994b4148e9SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
1004b4148e9SMarcel Holtmann 		return -ENETDOWN;
1014b4148e9SMarcel Holtmann 
1024b4148e9SMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
1034b4148e9SMarcel Holtmann 		return -EFAULT;
1044b4148e9SMarcel Holtmann 
1054b4148e9SMarcel Holtmann 	buf[buf_size] = '\0';
1064b4148e9SMarcel Holtmann 	if (strtobool(buf, &enable))
1074b4148e9SMarcel Holtmann 		return -EINVAL;
1084b4148e9SMarcel Holtmann 
109111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_DUT_MODE, &hdev->dbg_flags))
1104b4148e9SMarcel Holtmann 		return -EALREADY;
1114b4148e9SMarcel Holtmann 
1124b4148e9SMarcel Holtmann 	hci_req_lock(hdev);
1134b4148e9SMarcel Holtmann 	if (enable)
1144b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL,
1154b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1164b4148e9SMarcel Holtmann 	else
1174b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
1184b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1194b4148e9SMarcel Holtmann 	hci_req_unlock(hdev);
1204b4148e9SMarcel Holtmann 
1214b4148e9SMarcel Holtmann 	if (IS_ERR(skb))
1224b4148e9SMarcel Holtmann 		return PTR_ERR(skb);
1234b4148e9SMarcel Holtmann 
1244b4148e9SMarcel Holtmann 	err = -bt_to_errno(skb->data[0]);
1254b4148e9SMarcel Holtmann 	kfree_skb(skb);
1264b4148e9SMarcel Holtmann 
1274b4148e9SMarcel Holtmann 	if (err < 0)
1284b4148e9SMarcel Holtmann 		return err;
1294b4148e9SMarcel Holtmann 
130111902f7SMarcel Holtmann 	change_bit(HCI_DUT_MODE, &hdev->dbg_flags);
1314b4148e9SMarcel Holtmann 
1324b4148e9SMarcel Holtmann 	return count;
1334b4148e9SMarcel Holtmann }
1344b4148e9SMarcel Holtmann 
1354b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = {
1364b4148e9SMarcel Holtmann 	.open		= simple_open,
1374b4148e9SMarcel Holtmann 	.read		= dut_mode_read,
1384b4148e9SMarcel Holtmann 	.write		= dut_mode_write,
1394b4148e9SMarcel Holtmann 	.llseek		= default_llseek,
1404b4148e9SMarcel Holtmann };
1414b4148e9SMarcel Holtmann 
1421da177e4SLinus Torvalds /* ---- HCI requests ---- */
1431da177e4SLinus Torvalds 
14442c6b129SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result)
1451da177e4SLinus Torvalds {
14642c6b129SJohan Hedberg 	BT_DBG("%s result 0x%2.2x", hdev->name, result);
14775fb0e32SJohan Hedberg 
1481da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
1491da177e4SLinus Torvalds 		hdev->req_result = result;
1501da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_DONE;
1511da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
1521da177e4SLinus Torvalds 	}
1531da177e4SLinus Torvalds }
1541da177e4SLinus Torvalds 
1551da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err)
1561da177e4SLinus Torvalds {
1571da177e4SLinus Torvalds 	BT_DBG("%s err 0x%2.2x", hdev->name, err);
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
1601da177e4SLinus Torvalds 		hdev->req_result = err;
1611da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_CANCELED;
1621da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
1631da177e4SLinus Torvalds 	}
1641da177e4SLinus Torvalds }
1651da177e4SLinus Torvalds 
16677a63e0aSFengguang Wu static struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
16777a63e0aSFengguang Wu 					    u8 event)
16875e84b7cSJohan Hedberg {
16975e84b7cSJohan Hedberg 	struct hci_ev_cmd_complete *ev;
17075e84b7cSJohan Hedberg 	struct hci_event_hdr *hdr;
17175e84b7cSJohan Hedberg 	struct sk_buff *skb;
17275e84b7cSJohan Hedberg 
17375e84b7cSJohan Hedberg 	hci_dev_lock(hdev);
17475e84b7cSJohan Hedberg 
17575e84b7cSJohan Hedberg 	skb = hdev->recv_evt;
17675e84b7cSJohan Hedberg 	hdev->recv_evt = NULL;
17775e84b7cSJohan Hedberg 
17875e84b7cSJohan Hedberg 	hci_dev_unlock(hdev);
17975e84b7cSJohan Hedberg 
18075e84b7cSJohan Hedberg 	if (!skb)
18175e84b7cSJohan Hedberg 		return ERR_PTR(-ENODATA);
18275e84b7cSJohan Hedberg 
18375e84b7cSJohan Hedberg 	if (skb->len < sizeof(*hdr)) {
18475e84b7cSJohan Hedberg 		BT_ERR("Too short HCI event");
18575e84b7cSJohan Hedberg 		goto failed;
18675e84b7cSJohan Hedberg 	}
18775e84b7cSJohan Hedberg 
18875e84b7cSJohan Hedberg 	hdr = (void *) skb->data;
18975e84b7cSJohan Hedberg 	skb_pull(skb, HCI_EVENT_HDR_SIZE);
19075e84b7cSJohan Hedberg 
1917b1abbbeSJohan Hedberg 	if (event) {
1927b1abbbeSJohan Hedberg 		if (hdr->evt != event)
1937b1abbbeSJohan Hedberg 			goto failed;
1947b1abbbeSJohan Hedberg 		return skb;
1957b1abbbeSJohan Hedberg 	}
1967b1abbbeSJohan Hedberg 
19775e84b7cSJohan Hedberg 	if (hdr->evt != HCI_EV_CMD_COMPLETE) {
19875e84b7cSJohan Hedberg 		BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
19975e84b7cSJohan Hedberg 		goto failed;
20075e84b7cSJohan Hedberg 	}
20175e84b7cSJohan Hedberg 
20275e84b7cSJohan Hedberg 	if (skb->len < sizeof(*ev)) {
20375e84b7cSJohan Hedberg 		BT_ERR("Too short cmd_complete event");
20475e84b7cSJohan Hedberg 		goto failed;
20575e84b7cSJohan Hedberg 	}
20675e84b7cSJohan Hedberg 
20775e84b7cSJohan Hedberg 	ev = (void *) skb->data;
20875e84b7cSJohan Hedberg 	skb_pull(skb, sizeof(*ev));
20975e84b7cSJohan Hedberg 
21075e84b7cSJohan Hedberg 	if (opcode == __le16_to_cpu(ev->opcode))
21175e84b7cSJohan Hedberg 		return skb;
21275e84b7cSJohan Hedberg 
21375e84b7cSJohan Hedberg 	BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
21475e84b7cSJohan Hedberg 	       __le16_to_cpu(ev->opcode));
21575e84b7cSJohan Hedberg 
21675e84b7cSJohan Hedberg failed:
21775e84b7cSJohan Hedberg 	kfree_skb(skb);
21875e84b7cSJohan Hedberg 	return ERR_PTR(-ENODATA);
21975e84b7cSJohan Hedberg }
22075e84b7cSJohan Hedberg 
2217b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
22207dc93ddSJohan Hedberg 				  const void *param, u8 event, u32 timeout)
22375e84b7cSJohan Hedberg {
22475e84b7cSJohan Hedberg 	DECLARE_WAITQUEUE(wait, current);
22575e84b7cSJohan Hedberg 	struct hci_request req;
22675e84b7cSJohan Hedberg 	int err = 0;
22775e84b7cSJohan Hedberg 
22875e84b7cSJohan Hedberg 	BT_DBG("%s", hdev->name);
22975e84b7cSJohan Hedberg 
23075e84b7cSJohan Hedberg 	hci_req_init(&req, hdev);
23175e84b7cSJohan Hedberg 
2327b1abbbeSJohan Hedberg 	hci_req_add_ev(&req, opcode, plen, param, event);
23375e84b7cSJohan Hedberg 
23475e84b7cSJohan Hedberg 	hdev->req_status = HCI_REQ_PEND;
23575e84b7cSJohan Hedberg 
23675e84b7cSJohan Hedberg 	add_wait_queue(&hdev->req_wait_q, &wait);
23775e84b7cSJohan Hedberg 	set_current_state(TASK_INTERRUPTIBLE);
23875e84b7cSJohan Hedberg 
239039fada5SChan-yeol Park 	err = hci_req_run(&req, hci_req_sync_complete);
240039fada5SChan-yeol Park 	if (err < 0) {
241039fada5SChan-yeol Park 		remove_wait_queue(&hdev->req_wait_q, &wait);
24222a3ceabSJohan Hedberg 		set_current_state(TASK_RUNNING);
243039fada5SChan-yeol Park 		return ERR_PTR(err);
244039fada5SChan-yeol Park 	}
245039fada5SChan-yeol Park 
24675e84b7cSJohan Hedberg 	schedule_timeout(timeout);
24775e84b7cSJohan Hedberg 
24875e84b7cSJohan Hedberg 	remove_wait_queue(&hdev->req_wait_q, &wait);
24975e84b7cSJohan Hedberg 
25075e84b7cSJohan Hedberg 	if (signal_pending(current))
25175e84b7cSJohan Hedberg 		return ERR_PTR(-EINTR);
25275e84b7cSJohan Hedberg 
25375e84b7cSJohan Hedberg 	switch (hdev->req_status) {
25475e84b7cSJohan Hedberg 	case HCI_REQ_DONE:
25575e84b7cSJohan Hedberg 		err = -bt_to_errno(hdev->req_result);
25675e84b7cSJohan Hedberg 		break;
25775e84b7cSJohan Hedberg 
25875e84b7cSJohan Hedberg 	case HCI_REQ_CANCELED:
25975e84b7cSJohan Hedberg 		err = -hdev->req_result;
26075e84b7cSJohan Hedberg 		break;
26175e84b7cSJohan Hedberg 
26275e84b7cSJohan Hedberg 	default:
26375e84b7cSJohan Hedberg 		err = -ETIMEDOUT;
26475e84b7cSJohan Hedberg 		break;
26575e84b7cSJohan Hedberg 	}
26675e84b7cSJohan Hedberg 
26775e84b7cSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
26875e84b7cSJohan Hedberg 
26975e84b7cSJohan Hedberg 	BT_DBG("%s end: err %d", hdev->name, err);
27075e84b7cSJohan Hedberg 
27175e84b7cSJohan Hedberg 	if (err < 0)
27275e84b7cSJohan Hedberg 		return ERR_PTR(err);
27375e84b7cSJohan Hedberg 
2747b1abbbeSJohan Hedberg 	return hci_get_cmd_complete(hdev, opcode, event);
2757b1abbbeSJohan Hedberg }
2767b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev);
2777b1abbbeSJohan Hedberg 
2787b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
27907dc93ddSJohan Hedberg 			       const void *param, u32 timeout)
2807b1abbbeSJohan Hedberg {
2817b1abbbeSJohan Hedberg 	return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
28275e84b7cSJohan Hedberg }
28375e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync);
28475e84b7cSJohan Hedberg 
2851da177e4SLinus Torvalds /* Execute request and wait for completion. */
28601178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev,
28742c6b129SJohan Hedberg 			  void (*func)(struct hci_request *req,
28842c6b129SJohan Hedberg 				      unsigned long opt),
2891da177e4SLinus Torvalds 			  unsigned long opt, __u32 timeout)
2901da177e4SLinus Torvalds {
29142c6b129SJohan Hedberg 	struct hci_request req;
2921da177e4SLinus Torvalds 	DECLARE_WAITQUEUE(wait, current);
2931da177e4SLinus Torvalds 	int err = 0;
2941da177e4SLinus Torvalds 
2951da177e4SLinus Torvalds 	BT_DBG("%s start", hdev->name);
2961da177e4SLinus Torvalds 
29742c6b129SJohan Hedberg 	hci_req_init(&req, hdev);
29842c6b129SJohan Hedberg 
2991da177e4SLinus Torvalds 	hdev->req_status = HCI_REQ_PEND;
3001da177e4SLinus Torvalds 
30142c6b129SJohan Hedberg 	func(&req, opt);
30253cce22dSJohan Hedberg 
303039fada5SChan-yeol Park 	add_wait_queue(&hdev->req_wait_q, &wait);
304039fada5SChan-yeol Park 	set_current_state(TASK_INTERRUPTIBLE);
305039fada5SChan-yeol Park 
30642c6b129SJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
30742c6b129SJohan Hedberg 	if (err < 0) {
30853cce22dSJohan Hedberg 		hdev->req_status = 0;
309920c8300SAndre Guedes 
310039fada5SChan-yeol Park 		remove_wait_queue(&hdev->req_wait_q, &wait);
31122a3ceabSJohan Hedberg 		set_current_state(TASK_RUNNING);
312039fada5SChan-yeol Park 
313920c8300SAndre Guedes 		/* ENODATA means the HCI request command queue is empty.
314920c8300SAndre Guedes 		 * This can happen when a request with conditionals doesn't
315920c8300SAndre Guedes 		 * trigger any commands to be sent. This is normal behavior
316920c8300SAndre Guedes 		 * and should not trigger an error return.
31742c6b129SJohan Hedberg 		 */
318920c8300SAndre Guedes 		if (err == -ENODATA)
31942c6b129SJohan Hedberg 			return 0;
320920c8300SAndre Guedes 
321920c8300SAndre Guedes 		return err;
32253cce22dSJohan Hedberg 	}
32353cce22dSJohan Hedberg 
3241da177e4SLinus Torvalds 	schedule_timeout(timeout);
3251da177e4SLinus Torvalds 
3261da177e4SLinus Torvalds 	remove_wait_queue(&hdev->req_wait_q, &wait);
3271da177e4SLinus Torvalds 
3281da177e4SLinus Torvalds 	if (signal_pending(current))
3291da177e4SLinus Torvalds 		return -EINTR;
3301da177e4SLinus Torvalds 
3311da177e4SLinus Torvalds 	switch (hdev->req_status) {
3321da177e4SLinus Torvalds 	case HCI_REQ_DONE:
333e175072fSJoe Perches 		err = -bt_to_errno(hdev->req_result);
3341da177e4SLinus Torvalds 		break;
3351da177e4SLinus Torvalds 
3361da177e4SLinus Torvalds 	case HCI_REQ_CANCELED:
3371da177e4SLinus Torvalds 		err = -hdev->req_result;
3381da177e4SLinus Torvalds 		break;
3391da177e4SLinus Torvalds 
3401da177e4SLinus Torvalds 	default:
3411da177e4SLinus Torvalds 		err = -ETIMEDOUT;
3421da177e4SLinus Torvalds 		break;
3433ff50b79SStephen Hemminger 	}
3441da177e4SLinus Torvalds 
345a5040efaSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
3461da177e4SLinus Torvalds 
3471da177e4SLinus Torvalds 	BT_DBG("%s end: err %d", hdev->name, err);
3481da177e4SLinus Torvalds 
3491da177e4SLinus Torvalds 	return err;
3501da177e4SLinus Torvalds }
3511da177e4SLinus Torvalds 
35201178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev,
35342c6b129SJohan Hedberg 			void (*req)(struct hci_request *req,
35442c6b129SJohan Hedberg 				    unsigned long opt),
3551da177e4SLinus Torvalds 			unsigned long opt, __u32 timeout)
3561da177e4SLinus Torvalds {
3571da177e4SLinus Torvalds 	int ret;
3581da177e4SLinus Torvalds 
3597c6a329eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
3607c6a329eSMarcel Holtmann 		return -ENETDOWN;
3617c6a329eSMarcel Holtmann 
3621da177e4SLinus Torvalds 	/* Serialize all requests */
3631da177e4SLinus Torvalds 	hci_req_lock(hdev);
36401178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, req, opt, timeout);
3651da177e4SLinus Torvalds 	hci_req_unlock(hdev);
3661da177e4SLinus Torvalds 
3671da177e4SLinus Torvalds 	return ret;
3681da177e4SLinus Torvalds }
3691da177e4SLinus Torvalds 
37042c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt)
3711da177e4SLinus Torvalds {
37242c6b129SJohan Hedberg 	BT_DBG("%s %ld", req->hdev->name, opt);
3731da177e4SLinus Torvalds 
3741da177e4SLinus Torvalds 	/* Reset device */
37542c6b129SJohan Hedberg 	set_bit(HCI_RESET, &req->hdev->flags);
37642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_RESET, 0, NULL);
3771da177e4SLinus Torvalds }
3781da177e4SLinus Torvalds 
37942c6b129SJohan Hedberg static void bredr_init(struct hci_request *req)
3801da177e4SLinus Torvalds {
38142c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
3822455a3eaSAndrei Emeltchenko 
3831da177e4SLinus Torvalds 	/* Read Local Supported Features */
38442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
3851da177e4SLinus Torvalds 
3861143e5a6SMarcel Holtmann 	/* Read Local Version */
38742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
3882177bab5SJohan Hedberg 
3892177bab5SJohan Hedberg 	/* Read BD Address */
39042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
3911da177e4SLinus Torvalds }
3921da177e4SLinus Torvalds 
39342c6b129SJohan Hedberg static void amp_init(struct hci_request *req)
394e61ef499SAndrei Emeltchenko {
39542c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
3962455a3eaSAndrei Emeltchenko 
397e61ef499SAndrei Emeltchenko 	/* Read Local Version */
39842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
3996bcbc489SAndrei Emeltchenko 
400f6996cfeSMarcel Holtmann 	/* Read Local Supported Commands */
401f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
402f6996cfeSMarcel Holtmann 
403f6996cfeSMarcel Holtmann 	/* Read Local Supported Features */
404f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
405f6996cfeSMarcel Holtmann 
4066bcbc489SAndrei Emeltchenko 	/* Read Local AMP Info */
40742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
408e71dfabaSAndrei Emeltchenko 
409e71dfabaSAndrei Emeltchenko 	/* Read Data Blk size */
41042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
4117528ca1cSMarcel Holtmann 
412f38ba941SMarcel Holtmann 	/* Read Flow Control Mode */
413f38ba941SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL);
414f38ba941SMarcel Holtmann 
4157528ca1cSMarcel Holtmann 	/* Read Location Data */
4167528ca1cSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL);
417e61ef499SAndrei Emeltchenko }
418e61ef499SAndrei Emeltchenko 
41942c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt)
420e61ef499SAndrei Emeltchenko {
42142c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
422e61ef499SAndrei Emeltchenko 
423e61ef499SAndrei Emeltchenko 	BT_DBG("%s %ld", hdev->name, opt);
424e61ef499SAndrei Emeltchenko 
42511778716SAndrei Emeltchenko 	/* Reset */
42611778716SAndrei Emeltchenko 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
42742c6b129SJohan Hedberg 		hci_reset_req(req, 0);
42811778716SAndrei Emeltchenko 
429e61ef499SAndrei Emeltchenko 	switch (hdev->dev_type) {
430e61ef499SAndrei Emeltchenko 	case HCI_BREDR:
43142c6b129SJohan Hedberg 		bredr_init(req);
432e61ef499SAndrei Emeltchenko 		break;
433e61ef499SAndrei Emeltchenko 
434e61ef499SAndrei Emeltchenko 	case HCI_AMP:
43542c6b129SJohan Hedberg 		amp_init(req);
436e61ef499SAndrei Emeltchenko 		break;
437e61ef499SAndrei Emeltchenko 
438e61ef499SAndrei Emeltchenko 	default:
439e61ef499SAndrei Emeltchenko 		BT_ERR("Unknown device type %d", hdev->dev_type);
440e61ef499SAndrei Emeltchenko 		break;
441e61ef499SAndrei Emeltchenko 	}
442e61ef499SAndrei Emeltchenko }
443e61ef499SAndrei Emeltchenko 
44442c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req)
4452177bab5SJohan Hedberg {
4462177bab5SJohan Hedberg 	__le16 param;
4472177bab5SJohan Hedberg 	__u8 flt_type;
4482177bab5SJohan Hedberg 
4492177bab5SJohan Hedberg 	/* Read Buffer Size (ACL mtu, max pkt, etc.) */
45042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
4512177bab5SJohan Hedberg 
4522177bab5SJohan Hedberg 	/* Read Class of Device */
45342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
4542177bab5SJohan Hedberg 
4552177bab5SJohan Hedberg 	/* Read Local Name */
45642c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
4572177bab5SJohan Hedberg 
4582177bab5SJohan Hedberg 	/* Read Voice Setting */
45942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
4602177bab5SJohan Hedberg 
461b4cb9fb2SMarcel Holtmann 	/* Read Number of Supported IAC */
462b4cb9fb2SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL);
463b4cb9fb2SMarcel Holtmann 
4644b836f39SMarcel Holtmann 	/* Read Current IAC LAP */
4654b836f39SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL);
4664b836f39SMarcel Holtmann 
4672177bab5SJohan Hedberg 	/* Clear Event Filters */
4682177bab5SJohan Hedberg 	flt_type = HCI_FLT_CLEAR_ALL;
46942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
4702177bab5SJohan Hedberg 
4712177bab5SJohan Hedberg 	/* Connection accept timeout ~20 secs */
472dcf4adbfSJoe Perches 	param = cpu_to_le16(0x7d00);
47342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
4742177bab5SJohan Hedberg }
4752177bab5SJohan Hedberg 
47642c6b129SJohan Hedberg static void le_setup(struct hci_request *req)
4772177bab5SJohan Hedberg {
478c73eee91SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
479c73eee91SJohan Hedberg 
4802177bab5SJohan Hedberg 	/* Read LE Buffer Size */
48142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
4822177bab5SJohan Hedberg 
4832177bab5SJohan Hedberg 	/* Read LE Local Supported Features */
48442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
4852177bab5SJohan Hedberg 
486747d3f03SMarcel Holtmann 	/* Read LE Supported States */
487747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
488747d3f03SMarcel Holtmann 
4892177bab5SJohan Hedberg 	/* Read LE White List Size */
49042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
4912177bab5SJohan Hedberg 
492747d3f03SMarcel Holtmann 	/* Clear LE White List */
493747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
494c73eee91SJohan Hedberg 
495c73eee91SJohan Hedberg 	/* LE-only controllers have LE implicitly enabled */
496c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
497c73eee91SJohan Hedberg 		set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
4982177bab5SJohan Hedberg }
4992177bab5SJohan Hedberg 
50042c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req)
5012177bab5SJohan Hedberg {
50242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
50342c6b129SJohan Hedberg 
5042177bab5SJohan Hedberg 	/* The second byte is 0xff instead of 0x9f (two reserved bits
5052177bab5SJohan Hedberg 	 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
5062177bab5SJohan Hedberg 	 * command otherwise.
5072177bab5SJohan Hedberg 	 */
5082177bab5SJohan Hedberg 	u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
5092177bab5SJohan Hedberg 
5102177bab5SJohan Hedberg 	/* CSR 1.1 dongles does not accept any bitfield so don't try to set
5112177bab5SJohan Hedberg 	 * any event mask for pre 1.2 devices.
5122177bab5SJohan Hedberg 	 */
5132177bab5SJohan Hedberg 	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
5142177bab5SJohan Hedberg 		return;
5152177bab5SJohan Hedberg 
5162177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
5172177bab5SJohan Hedberg 		events[4] |= 0x01; /* Flow Specification Complete */
5182177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
5192177bab5SJohan Hedberg 		events[4] |= 0x04; /* Read Remote Extended Features Complete */
5202177bab5SJohan Hedberg 		events[5] |= 0x08; /* Synchronous Connection Complete */
5212177bab5SJohan Hedberg 		events[5] |= 0x10; /* Synchronous Connection Changed */
522c7882cbdSMarcel Holtmann 	} else {
523c7882cbdSMarcel Holtmann 		/* Use a different default for LE-only devices */
524c7882cbdSMarcel Holtmann 		memset(events, 0, sizeof(events));
525c7882cbdSMarcel Holtmann 		events[0] |= 0x10; /* Disconnection Complete */
526c7882cbdSMarcel Holtmann 		events[1] |= 0x08; /* Read Remote Version Information Complete */
527c7882cbdSMarcel Holtmann 		events[1] |= 0x20; /* Command Complete */
528c7882cbdSMarcel Holtmann 		events[1] |= 0x40; /* Command Status */
529c7882cbdSMarcel Holtmann 		events[1] |= 0x80; /* Hardware Error */
530c7882cbdSMarcel Holtmann 		events[2] |= 0x04; /* Number of Completed Packets */
531c7882cbdSMarcel Holtmann 		events[3] |= 0x02; /* Data Buffer Overflow */
5320da71f1bSMarcel Holtmann 
5330da71f1bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION) {
5340da71f1bSMarcel Holtmann 			events[0] |= 0x80; /* Encryption Change */
535c7882cbdSMarcel Holtmann 			events[5] |= 0x80; /* Encryption Key Refresh Complete */
5362177bab5SJohan Hedberg 		}
5370da71f1bSMarcel Holtmann 	}
5382177bab5SJohan Hedberg 
5392177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
5402177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
5412177bab5SJohan Hedberg 
5422177bab5SJohan Hedberg 	if (lmp_sniffsubr_capable(hdev))
5432177bab5SJohan Hedberg 		events[5] |= 0x20; /* Sniff Subrating */
5442177bab5SJohan Hedberg 
5452177bab5SJohan Hedberg 	if (lmp_pause_enc_capable(hdev))
5462177bab5SJohan Hedberg 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
5472177bab5SJohan Hedberg 
5482177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
5492177bab5SJohan Hedberg 		events[5] |= 0x40; /* Extended Inquiry Result */
5502177bab5SJohan Hedberg 
5512177bab5SJohan Hedberg 	if (lmp_no_flush_capable(hdev))
5522177bab5SJohan Hedberg 		events[7] |= 0x01; /* Enhanced Flush Complete */
5532177bab5SJohan Hedberg 
5542177bab5SJohan Hedberg 	if (lmp_lsto_capable(hdev))
5552177bab5SJohan Hedberg 		events[6] |= 0x80; /* Link Supervision Timeout Changed */
5562177bab5SJohan Hedberg 
5572177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
5582177bab5SJohan Hedberg 		events[6] |= 0x01;	/* IO Capability Request */
5592177bab5SJohan Hedberg 		events[6] |= 0x02;	/* IO Capability Response */
5602177bab5SJohan Hedberg 		events[6] |= 0x04;	/* User Confirmation Request */
5612177bab5SJohan Hedberg 		events[6] |= 0x08;	/* User Passkey Request */
5622177bab5SJohan Hedberg 		events[6] |= 0x10;	/* Remote OOB Data Request */
5632177bab5SJohan Hedberg 		events[6] |= 0x20;	/* Simple Pairing Complete */
5642177bab5SJohan Hedberg 		events[7] |= 0x04;	/* User Passkey Notification */
5652177bab5SJohan Hedberg 		events[7] |= 0x08;	/* Keypress Notification */
5662177bab5SJohan Hedberg 		events[7] |= 0x10;	/* Remote Host Supported
5672177bab5SJohan Hedberg 					 * Features Notification
5682177bab5SJohan Hedberg 					 */
5692177bab5SJohan Hedberg 	}
5702177bab5SJohan Hedberg 
5712177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
5722177bab5SJohan Hedberg 		events[7] |= 0x20;	/* LE Meta-Event */
5732177bab5SJohan Hedberg 
57442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
5752177bab5SJohan Hedberg }
5762177bab5SJohan Hedberg 
57742c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt)
5782177bab5SJohan Hedberg {
57942c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
58042c6b129SJohan Hedberg 
5812177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev))
58242c6b129SJohan Hedberg 		bredr_setup(req);
58356f87901SJohan Hedberg 	else
58456f87901SJohan Hedberg 		clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
5852177bab5SJohan Hedberg 
5862177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
58742c6b129SJohan Hedberg 		le_setup(req);
5882177bab5SJohan Hedberg 
5890f3adeaeSMarcel Holtmann 	/* All Bluetooth 1.2 and later controllers should support the
5900f3adeaeSMarcel Holtmann 	 * HCI command for reading the local supported commands.
5910f3adeaeSMarcel Holtmann 	 *
5920f3adeaeSMarcel Holtmann 	 * Unfortunately some controllers indicate Bluetooth 1.2 support,
5930f3adeaeSMarcel Holtmann 	 * but do not have support for this command. If that is the case,
5940f3adeaeSMarcel Holtmann 	 * the driver can quirk the behavior and skip reading the local
5950f3adeaeSMarcel Holtmann 	 * supported commands.
5963f8e2d75SJohan Hedberg 	 */
5970f3adeaeSMarcel Holtmann 	if (hdev->hci_ver > BLUETOOTH_VER_1_1 &&
5980f3adeaeSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks))
59942c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
6002177bab5SJohan Hedberg 
6012177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
60257af75a8SMarcel Holtmann 		/* When SSP is available, then the host features page
60357af75a8SMarcel Holtmann 		 * should also be available as well. However some
60457af75a8SMarcel Holtmann 		 * controllers list the max_page as 0 as long as SSP
60557af75a8SMarcel Holtmann 		 * has not been enabled. To achieve proper debugging
60657af75a8SMarcel Holtmann 		 * output, force the minimum max_page to 1 at least.
60757af75a8SMarcel Holtmann 		 */
60857af75a8SMarcel Holtmann 		hdev->max_page = 0x01;
60957af75a8SMarcel Holtmann 
6102177bab5SJohan Hedberg 		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
6112177bab5SJohan Hedberg 			u8 mode = 0x01;
61242c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
6132177bab5SJohan Hedberg 				    sizeof(mode), &mode);
6142177bab5SJohan Hedberg 		} else {
6152177bab5SJohan Hedberg 			struct hci_cp_write_eir cp;
6162177bab5SJohan Hedberg 
6172177bab5SJohan Hedberg 			memset(hdev->eir, 0, sizeof(hdev->eir));
6182177bab5SJohan Hedberg 			memset(&cp, 0, sizeof(cp));
6192177bab5SJohan Hedberg 
62042c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
6212177bab5SJohan Hedberg 		}
6222177bab5SJohan Hedberg 	}
6232177bab5SJohan Hedberg 
62404422da9SMarcel Holtmann 	if (lmp_inq_rssi_capable(hdev)) {
62504422da9SMarcel Holtmann 		u8 mode;
62604422da9SMarcel Holtmann 
62704422da9SMarcel Holtmann 		/* If Extended Inquiry Result events are supported, then
62804422da9SMarcel Holtmann 		 * they are clearly preferred over Inquiry Result with RSSI
62904422da9SMarcel Holtmann 		 * events.
63004422da9SMarcel Holtmann 		 */
63104422da9SMarcel Holtmann 		mode = lmp_ext_inq_capable(hdev) ? 0x02 : 0x01;
63204422da9SMarcel Holtmann 
63304422da9SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
63404422da9SMarcel Holtmann 	}
6352177bab5SJohan Hedberg 
6362177bab5SJohan Hedberg 	if (lmp_inq_tx_pwr_capable(hdev))
63742c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
6382177bab5SJohan Hedberg 
6392177bab5SJohan Hedberg 	if (lmp_ext_feat_capable(hdev)) {
6402177bab5SJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
6412177bab5SJohan Hedberg 
6422177bab5SJohan Hedberg 		cp.page = 0x01;
64342c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
64442c6b129SJohan Hedberg 			    sizeof(cp), &cp);
6452177bab5SJohan Hedberg 	}
6462177bab5SJohan Hedberg 
6472177bab5SJohan Hedberg 	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags)) {
6482177bab5SJohan Hedberg 		u8 enable = 1;
64942c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
6502177bab5SJohan Hedberg 			    &enable);
6512177bab5SJohan Hedberg 	}
6522177bab5SJohan Hedberg }
6532177bab5SJohan Hedberg 
65442c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req)
6552177bab5SJohan Hedberg {
65642c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
6572177bab5SJohan Hedberg 	struct hci_cp_write_def_link_policy cp;
6582177bab5SJohan Hedberg 	u16 link_policy = 0;
6592177bab5SJohan Hedberg 
6602177bab5SJohan Hedberg 	if (lmp_rswitch_capable(hdev))
6612177bab5SJohan Hedberg 		link_policy |= HCI_LP_RSWITCH;
6622177bab5SJohan Hedberg 	if (lmp_hold_capable(hdev))
6632177bab5SJohan Hedberg 		link_policy |= HCI_LP_HOLD;
6642177bab5SJohan Hedberg 	if (lmp_sniff_capable(hdev))
6652177bab5SJohan Hedberg 		link_policy |= HCI_LP_SNIFF;
6662177bab5SJohan Hedberg 	if (lmp_park_capable(hdev))
6672177bab5SJohan Hedberg 		link_policy |= HCI_LP_PARK;
6682177bab5SJohan Hedberg 
6692177bab5SJohan Hedberg 	cp.policy = cpu_to_le16(link_policy);
67042c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
6712177bab5SJohan Hedberg }
6722177bab5SJohan Hedberg 
67342c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req)
6742177bab5SJohan Hedberg {
67542c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
6762177bab5SJohan Hedberg 	struct hci_cp_write_le_host_supported cp;
6772177bab5SJohan Hedberg 
678c73eee91SJohan Hedberg 	/* LE-only devices do not support explicit enablement */
679c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
680c73eee91SJohan Hedberg 		return;
681c73eee91SJohan Hedberg 
6822177bab5SJohan Hedberg 	memset(&cp, 0, sizeof(cp));
6832177bab5SJohan Hedberg 
6842177bab5SJohan Hedberg 	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
6852177bab5SJohan Hedberg 		cp.le = 0x01;
68632226e4fSMarcel Holtmann 		cp.simul = 0x00;
6872177bab5SJohan Hedberg 	}
6882177bab5SJohan Hedberg 
6892177bab5SJohan Hedberg 	if (cp.le != lmp_host_le_capable(hdev))
69042c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
6912177bab5SJohan Hedberg 			    &cp);
6922177bab5SJohan Hedberg }
6932177bab5SJohan Hedberg 
694d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req)
695d62e6d67SJohan Hedberg {
696d62e6d67SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
697d62e6d67SJohan Hedberg 	u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
698d62e6d67SJohan Hedberg 
699d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast master role is supported
700d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
701d62e6d67SJohan Hedberg 	 */
70253b834d2SMarcel Holtmann 	if (lmp_csb_master_capable(hdev)) {
703d62e6d67SJohan Hedberg 		events[1] |= 0x40;	/* Triggered Clock Capture */
704d62e6d67SJohan Hedberg 		events[1] |= 0x80;	/* Synchronization Train Complete */
705d62e6d67SJohan Hedberg 		events[2] |= 0x10;	/* Slave Page Response Timeout */
706d62e6d67SJohan Hedberg 		events[2] |= 0x20;	/* CSB Channel Map Change */
707d62e6d67SJohan Hedberg 	}
708d62e6d67SJohan Hedberg 
709d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast slave role is supported
710d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
711d62e6d67SJohan Hedberg 	 */
71253b834d2SMarcel Holtmann 	if (lmp_csb_slave_capable(hdev)) {
713d62e6d67SJohan Hedberg 		events[2] |= 0x01;	/* Synchronization Train Received */
714d62e6d67SJohan Hedberg 		events[2] |= 0x02;	/* CSB Receive */
715d62e6d67SJohan Hedberg 		events[2] |= 0x04;	/* CSB Timeout */
716d62e6d67SJohan Hedberg 		events[2] |= 0x08;	/* Truncated Page Complete */
717d62e6d67SJohan Hedberg 	}
718d62e6d67SJohan Hedberg 
71940c59fcbSMarcel Holtmann 	/* Enable Authenticated Payload Timeout Expired event if supported */
720cd7ca0ecSMarcel Holtmann 	if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING)
72140c59fcbSMarcel Holtmann 		events[2] |= 0x80;
72240c59fcbSMarcel Holtmann 
723d62e6d67SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events);
724d62e6d67SJohan Hedberg }
725d62e6d67SJohan Hedberg 
72642c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt)
7272177bab5SJohan Hedberg {
72842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
729d2c5d77fSJohan Hedberg 	u8 p;
73042c6b129SJohan Hedberg 
7310da71f1bSMarcel Holtmann 	hci_setup_event_mask(req);
7320da71f1bSMarcel Holtmann 
733b8f4e068SGustavo Padovan 	/* Some Broadcom based Bluetooth controllers do not support the
734b8f4e068SGustavo Padovan 	 * Delete Stored Link Key command. They are clearly indicating its
735b8f4e068SGustavo Padovan 	 * absence in the bit mask of supported commands.
736b8f4e068SGustavo Padovan 	 *
737b8f4e068SGustavo Padovan 	 * Check the supported commands and only if the the command is marked
738b8f4e068SGustavo Padovan 	 * as supported send it. If not supported assume that the controller
739b8f4e068SGustavo Padovan 	 * does not have actual support for stored link keys which makes this
740b8f4e068SGustavo Padovan 	 * command redundant anyway.
741f9f462faSMarcel Holtmann 	 *
742f9f462faSMarcel Holtmann 	 * Some controllers indicate that they support handling deleting
743f9f462faSMarcel Holtmann 	 * stored link keys, but they don't. The quirk lets a driver
744f9f462faSMarcel Holtmann 	 * just disable this command.
745b8f4e068SGustavo Padovan 	 */
746f9f462faSMarcel Holtmann 	if (hdev->commands[6] & 0x80 &&
747f9f462faSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
74859f45d57SJohan Hedberg 		struct hci_cp_delete_stored_link_key cp;
74959f45d57SJohan Hedberg 
75059f45d57SJohan Hedberg 		bacpy(&cp.bdaddr, BDADDR_ANY);
75159f45d57SJohan Hedberg 		cp.delete_all = 0x01;
75259f45d57SJohan Hedberg 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
75359f45d57SJohan Hedberg 			    sizeof(cp), &cp);
75459f45d57SJohan Hedberg 	}
75559f45d57SJohan Hedberg 
7562177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
75742c6b129SJohan Hedberg 		hci_setup_link_policy(req);
7582177bab5SJohan Hedberg 
759417287deSMarcel Holtmann 	if (hdev->commands[8] & 0x01)
760417287deSMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
761417287deSMarcel Holtmann 
762417287deSMarcel Holtmann 	/* Some older Broadcom based Bluetooth 1.2 controllers do not
763417287deSMarcel Holtmann 	 * support the Read Page Scan Type command. Check support for
764417287deSMarcel Holtmann 	 * this command in the bit mask of supported commands.
765417287deSMarcel Holtmann 	 */
766417287deSMarcel Holtmann 	if (hdev->commands[13] & 0x01)
767417287deSMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
768417287deSMarcel Holtmann 
7699193c6e8SAndre Guedes 	if (lmp_le_capable(hdev)) {
7709193c6e8SAndre Guedes 		u8 events[8];
7719193c6e8SAndre Guedes 
7729193c6e8SAndre Guedes 		memset(events, 0, sizeof(events));
7734d6c705bSMarcel Holtmann 		events[0] = 0x0f;
7744d6c705bSMarcel Holtmann 
7754d6c705bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION)
7764d6c705bSMarcel Holtmann 			events[0] |= 0x10;	/* LE Long Term Key Request */
777662bc2e6SAndre Guedes 
778662bc2e6SAndre Guedes 		/* If controller supports the Connection Parameters Request
779662bc2e6SAndre Guedes 		 * Link Layer Procedure, enable the corresponding event.
780662bc2e6SAndre Guedes 		 */
781662bc2e6SAndre Guedes 		if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC)
782662bc2e6SAndre Guedes 			events[0] |= 0x20;	/* LE Remote Connection
783662bc2e6SAndre Guedes 						 * Parameter Request
784662bc2e6SAndre Guedes 						 */
785662bc2e6SAndre Guedes 
786a9f6068eSMarcel Holtmann 		/* If the controller supports the Data Length Extension
787a9f6068eSMarcel Holtmann 		 * feature, enable the corresponding event.
788a9f6068eSMarcel Holtmann 		 */
789a9f6068eSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT)
790a9f6068eSMarcel Holtmann 			events[0] |= 0x40;	/* LE Data Length Change */
791a9f6068eSMarcel Holtmann 
7924b71bba4SMarcel Holtmann 		/* If the controller supports Extended Scanner Filter
7934b71bba4SMarcel Holtmann 		 * Policies, enable the correspondig event.
7944b71bba4SMarcel Holtmann 		 */
7954b71bba4SMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY)
7964b71bba4SMarcel Holtmann 			events[1] |= 0x04;	/* LE Direct Advertising
7974b71bba4SMarcel Holtmann 						 * Report
7984b71bba4SMarcel Holtmann 						 */
7994b71bba4SMarcel Holtmann 
8005a34bd5fSMarcel Holtmann 		/* If the controller supports the LE Read Local P-256
8015a34bd5fSMarcel Holtmann 		 * Public Key command, enable the corresponding event.
8025a34bd5fSMarcel Holtmann 		 */
8035a34bd5fSMarcel Holtmann 		if (hdev->commands[34] & 0x02)
8045a34bd5fSMarcel Holtmann 			events[0] |= 0x80;	/* LE Read Local P-256
8055a34bd5fSMarcel Holtmann 						 * Public Key Complete
8065a34bd5fSMarcel Holtmann 						 */
8075a34bd5fSMarcel Holtmann 
8085a34bd5fSMarcel Holtmann 		/* If the controller supports the LE Generate DHKey
8095a34bd5fSMarcel Holtmann 		 * command, enable the corresponding event.
8105a34bd5fSMarcel Holtmann 		 */
8115a34bd5fSMarcel Holtmann 		if (hdev->commands[34] & 0x04)
8125a34bd5fSMarcel Holtmann 			events[1] |= 0x01;	/* LE Generate DHKey Complete */
8135a34bd5fSMarcel Holtmann 
8149193c6e8SAndre Guedes 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
8159193c6e8SAndre Guedes 			    events);
8169193c6e8SAndre Guedes 
81715a49ccaSMarcel Holtmann 		if (hdev->commands[25] & 0x40) {
81815a49ccaSMarcel Holtmann 			/* Read LE Advertising Channel TX Power */
81915a49ccaSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
82015a49ccaSMarcel Holtmann 		}
82115a49ccaSMarcel Holtmann 
822a9f6068eSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
823a9f6068eSMarcel Holtmann 			/* Read LE Maximum Data Length */
824a9f6068eSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL);
825a9f6068eSMarcel Holtmann 
826a9f6068eSMarcel Holtmann 			/* Read LE Suggested Default Data Length */
827a9f6068eSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL);
828a9f6068eSMarcel Holtmann 		}
829a9f6068eSMarcel Holtmann 
83042c6b129SJohan Hedberg 		hci_set_le_support(req);
8319193c6e8SAndre Guedes 	}
832d2c5d77fSJohan Hedberg 
833d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
834d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
835d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
836d2c5d77fSJohan Hedberg 
837d2c5d77fSJohan Hedberg 		cp.page = p;
838d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
839d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
840d2c5d77fSJohan Hedberg 	}
8412177bab5SJohan Hedberg }
8422177bab5SJohan Hedberg 
8435d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt)
8445d4e7e8dSJohan Hedberg {
8455d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
8465d4e7e8dSJohan Hedberg 
847d62e6d67SJohan Hedberg 	/* Set event mask page 2 if the HCI command for it is supported */
848d62e6d67SJohan Hedberg 	if (hdev->commands[22] & 0x04)
849d62e6d67SJohan Hedberg 		hci_set_event_mask_page_2(req);
850d62e6d67SJohan Hedberg 
851109e3191SMarcel Holtmann 	/* Read local codec list if the HCI command is supported */
852109e3191SMarcel Holtmann 	if (hdev->commands[29] & 0x20)
853109e3191SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL);
854109e3191SMarcel Holtmann 
855f4fe73edSMarcel Holtmann 	/* Get MWS transport configuration if the HCI command is supported */
856f4fe73edSMarcel Holtmann 	if (hdev->commands[30] & 0x08)
857f4fe73edSMarcel Holtmann 		hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL);
858f4fe73edSMarcel Holtmann 
8595d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
86053b834d2SMarcel Holtmann 	if (lmp_sync_train_capable(hdev))
8615d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
862a6d0d690SMarcel Holtmann 
863a6d0d690SMarcel Holtmann 	/* Enable Secure Connections if supported and configured */
864710f11c0SJohan Hedberg 	if (bredr_sc_enabled(hdev)) {
865a6d0d690SMarcel Holtmann 		u8 support = 0x01;
866a6d0d690SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT,
867a6d0d690SMarcel Holtmann 			    sizeof(support), &support);
868a6d0d690SMarcel Holtmann 	}
8695d4e7e8dSJohan Hedberg }
8705d4e7e8dSJohan Hedberg 
8712177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
8722177bab5SJohan Hedberg {
8732177bab5SJohan Hedberg 	int err;
8742177bab5SJohan Hedberg 
8752177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
8762177bab5SJohan Hedberg 	if (err < 0)
8772177bab5SJohan Hedberg 		return err;
8782177bab5SJohan Hedberg 
8794b4148e9SMarcel Holtmann 	/* The Device Under Test (DUT) mode is special and available for
8804b4148e9SMarcel Holtmann 	 * all controller types. So just create it early on.
8814b4148e9SMarcel Holtmann 	 */
8824b4148e9SMarcel Holtmann 	if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
8834b4148e9SMarcel Holtmann 		debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev,
8844b4148e9SMarcel Holtmann 				    &dut_mode_fops);
8854b4148e9SMarcel Holtmann 	}
8864b4148e9SMarcel Holtmann 
8872177bab5SJohan Hedberg 	/* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
8882177bab5SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
8892177bab5SJohan Hedberg 	 * first stage init.
8902177bab5SJohan Hedberg 	 */
8912177bab5SJohan Hedberg 	if (hdev->dev_type != HCI_BREDR)
8922177bab5SJohan Hedberg 		return 0;
8932177bab5SJohan Hedberg 
8942177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
8952177bab5SJohan Hedberg 	if (err < 0)
8962177bab5SJohan Hedberg 		return err;
8972177bab5SJohan Hedberg 
8985d4e7e8dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
8995d4e7e8dSJohan Hedberg 	if (err < 0)
9005d4e7e8dSJohan Hedberg 		return err;
9015d4e7e8dSJohan Hedberg 
902baf27f6eSMarcel Holtmann 	err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
903baf27f6eSMarcel Holtmann 	if (err < 0)
904baf27f6eSMarcel Holtmann 		return err;
905baf27f6eSMarcel Holtmann 
906ec6cef9cSMarcel Holtmann 	/* This function is only called when the controller is actually in
907ec6cef9cSMarcel Holtmann 	 * configured state. When the controller is marked as unconfigured,
908ec6cef9cSMarcel Holtmann 	 * this initialization procedure is not run.
909ec6cef9cSMarcel Holtmann 	 *
910ec6cef9cSMarcel Holtmann 	 * It means that it is possible that a controller runs through its
911ec6cef9cSMarcel Holtmann 	 * setup phase and then discovers missing settings. If that is the
912ec6cef9cSMarcel Holtmann 	 * case, then this function will not be called. It then will only
913ec6cef9cSMarcel Holtmann 	 * be called during the config phase.
914ec6cef9cSMarcel Holtmann 	 *
915ec6cef9cSMarcel Holtmann 	 * So only when in setup phase or config phase, create the debugfs
916ec6cef9cSMarcel Holtmann 	 * entries and register the SMP channels.
917baf27f6eSMarcel Holtmann 	 */
918ec6cef9cSMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
919ec6cef9cSMarcel Holtmann 	    !test_bit(HCI_CONFIG, &hdev->dev_flags))
920baf27f6eSMarcel Holtmann 		return 0;
921baf27f6eSMarcel Holtmann 
92260c5f5fbSMarcel Holtmann 	hci_debugfs_create_common(hdev);
92360c5f5fbSMarcel Holtmann 
92471c3b60eSMarcel Holtmann 	if (lmp_bredr_capable(hdev))
92560c5f5fbSMarcel Holtmann 		hci_debugfs_create_bredr(hdev);
9262bfa3531SMarcel Holtmann 
927d0f729b8SMarcel Holtmann 	if (lmp_le_capable(hdev)) {
92860c5f5fbSMarcel Holtmann 		hci_debugfs_create_le(hdev);
929711eafe3SJohan Hedberg 		smp_register(hdev);
930d0f729b8SMarcel Holtmann 	}
931e7b8fc92SMarcel Holtmann 
932baf27f6eSMarcel Holtmann 	return 0;
9332177bab5SJohan Hedberg }
9342177bab5SJohan Hedberg 
9350ebca7d6SMarcel Holtmann static void hci_init0_req(struct hci_request *req, unsigned long opt)
9360ebca7d6SMarcel Holtmann {
9370ebca7d6SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
9380ebca7d6SMarcel Holtmann 
9390ebca7d6SMarcel Holtmann 	BT_DBG("%s %ld", hdev->name, opt);
9400ebca7d6SMarcel Holtmann 
9410ebca7d6SMarcel Holtmann 	/* Reset */
9420ebca7d6SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
9430ebca7d6SMarcel Holtmann 		hci_reset_req(req, 0);
9440ebca7d6SMarcel Holtmann 
9450ebca7d6SMarcel Holtmann 	/* Read Local Version */
9460ebca7d6SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
9470ebca7d6SMarcel Holtmann 
9480ebca7d6SMarcel Holtmann 	/* Read BD Address */
9490ebca7d6SMarcel Holtmann 	if (hdev->set_bdaddr)
9500ebca7d6SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
9510ebca7d6SMarcel Holtmann }
9520ebca7d6SMarcel Holtmann 
9530ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev)
9540ebca7d6SMarcel Holtmann {
9550ebca7d6SMarcel Holtmann 	int err;
9560ebca7d6SMarcel Holtmann 
957cc78b44bSMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
958cc78b44bSMarcel Holtmann 		return 0;
959cc78b44bSMarcel Holtmann 
9600ebca7d6SMarcel Holtmann 	err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT);
9610ebca7d6SMarcel Holtmann 	if (err < 0)
9620ebca7d6SMarcel Holtmann 		return err;
9630ebca7d6SMarcel Holtmann 
9640ebca7d6SMarcel Holtmann 	return 0;
9650ebca7d6SMarcel Holtmann }
9660ebca7d6SMarcel Holtmann 
96742c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt)
9681da177e4SLinus Torvalds {
9691da177e4SLinus Torvalds 	__u8 scan = opt;
9701da177e4SLinus Torvalds 
97142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
9721da177e4SLinus Torvalds 
9731da177e4SLinus Torvalds 	/* Inquiry and Page scans */
97442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
9751da177e4SLinus Torvalds }
9761da177e4SLinus Torvalds 
97742c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt)
9781da177e4SLinus Torvalds {
9791da177e4SLinus Torvalds 	__u8 auth = opt;
9801da177e4SLinus Torvalds 
98142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
9821da177e4SLinus Torvalds 
9831da177e4SLinus Torvalds 	/* Authentication */
98442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
9851da177e4SLinus Torvalds }
9861da177e4SLinus Torvalds 
98742c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
9881da177e4SLinus Torvalds {
9891da177e4SLinus Torvalds 	__u8 encrypt = opt;
9901da177e4SLinus Torvalds 
99142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
9921da177e4SLinus Torvalds 
993e4e8e37cSMarcel Holtmann 	/* Encryption */
99442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
9951da177e4SLinus Torvalds }
9961da177e4SLinus Torvalds 
99742c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
998e4e8e37cSMarcel Holtmann {
999e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
1000e4e8e37cSMarcel Holtmann 
100142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
1002e4e8e37cSMarcel Holtmann 
1003e4e8e37cSMarcel Holtmann 	/* Default link policy */
100442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
1005e4e8e37cSMarcel Holtmann }
1006e4e8e37cSMarcel Holtmann 
10071da177e4SLinus Torvalds /* Get HCI device by index.
10081da177e4SLinus Torvalds  * Device is held on return. */
10091da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
10101da177e4SLinus Torvalds {
10118035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
10121da177e4SLinus Torvalds 
10131da177e4SLinus Torvalds 	BT_DBG("%d", index);
10141da177e4SLinus Torvalds 
10151da177e4SLinus Torvalds 	if (index < 0)
10161da177e4SLinus Torvalds 		return NULL;
10171da177e4SLinus Torvalds 
10181da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
10198035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
10201da177e4SLinus Torvalds 		if (d->id == index) {
10211da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
10221da177e4SLinus Torvalds 			break;
10231da177e4SLinus Torvalds 		}
10241da177e4SLinus Torvalds 	}
10251da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
10261da177e4SLinus Torvalds 	return hdev;
10271da177e4SLinus Torvalds }
10281da177e4SLinus Torvalds 
10291da177e4SLinus Torvalds /* ---- Inquiry support ---- */
1030ff9ef578SJohan Hedberg 
103130dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
103230dc78e1SJohan Hedberg {
103330dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
103430dc78e1SJohan Hedberg 
10356fbe195dSAndre Guedes 	switch (discov->state) {
1036343f935bSAndre Guedes 	case DISCOVERY_FINDING:
10376fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
103830dc78e1SJohan Hedberg 		return true;
103930dc78e1SJohan Hedberg 
10406fbe195dSAndre Guedes 	default:
104130dc78e1SJohan Hedberg 		return false;
104230dc78e1SJohan Hedberg 	}
10436fbe195dSAndre Guedes }
104430dc78e1SJohan Hedberg 
1045ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
1046ff9ef578SJohan Hedberg {
1047bb3e0a33SJohan Hedberg 	int old_state = hdev->discovery.state;
1048bb3e0a33SJohan Hedberg 
1049ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
1050ff9ef578SJohan Hedberg 
1051bb3e0a33SJohan Hedberg 	if (old_state == state)
1052ff9ef578SJohan Hedberg 		return;
1053ff9ef578SJohan Hedberg 
1054bb3e0a33SJohan Hedberg 	hdev->discovery.state = state;
1055bb3e0a33SJohan Hedberg 
1056ff9ef578SJohan Hedberg 	switch (state) {
1057ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
1058c54c3860SAndre Guedes 		hci_update_background_scan(hdev);
1059c54c3860SAndre Guedes 
1060bb3e0a33SJohan Hedberg 		if (old_state != DISCOVERY_STARTING)
1061ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
1062ff9ef578SJohan Hedberg 		break;
1063ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
1064ff9ef578SJohan Hedberg 		break;
1065343f935bSAndre Guedes 	case DISCOVERY_FINDING:
1066ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
1067ff9ef578SJohan Hedberg 		break;
106830dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
106930dc78e1SJohan Hedberg 		break;
1070ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
1071ff9ef578SJohan Hedberg 		break;
1072ff9ef578SJohan Hedberg 	}
1073ff9ef578SJohan Hedberg }
1074ff9ef578SJohan Hedberg 
10751f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
10761da177e4SLinus Torvalds {
107730883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1078b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
10791da177e4SLinus Torvalds 
1080561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
1081561aafbcSJohan Hedberg 		list_del(&p->all);
1082b57c1a56SJohan Hedberg 		kfree(p);
10831da177e4SLinus Torvalds 	}
1084561aafbcSJohan Hedberg 
1085561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
1086561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
10871da177e4SLinus Torvalds }
10881da177e4SLinus Torvalds 
1089a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
1090a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
10911da177e4SLinus Torvalds {
109230883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
10931da177e4SLinus Torvalds 	struct inquiry_entry *e;
10941da177e4SLinus Torvalds 
10956ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
10961da177e4SLinus Torvalds 
1097561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
10981da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
10991da177e4SLinus Torvalds 			return e;
11001da177e4SLinus Torvalds 	}
11011da177e4SLinus Torvalds 
1102b57c1a56SJohan Hedberg 	return NULL;
1103b57c1a56SJohan Hedberg }
1104b57c1a56SJohan Hedberg 
1105561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
1106561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
1107561aafbcSJohan Hedberg {
110830883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1109561aafbcSJohan Hedberg 	struct inquiry_entry *e;
1110561aafbcSJohan Hedberg 
11116ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
1112561aafbcSJohan Hedberg 
1113561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
1114561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
1115561aafbcSJohan Hedberg 			return e;
1116561aafbcSJohan Hedberg 	}
1117561aafbcSJohan Hedberg 
1118561aafbcSJohan Hedberg 	return NULL;
1119561aafbcSJohan Hedberg }
1120561aafbcSJohan Hedberg 
112130dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
112230dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
112330dc78e1SJohan Hedberg 						       int state)
112430dc78e1SJohan Hedberg {
112530dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
112630dc78e1SJohan Hedberg 	struct inquiry_entry *e;
112730dc78e1SJohan Hedberg 
11286ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
112930dc78e1SJohan Hedberg 
113030dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
113130dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
113230dc78e1SJohan Hedberg 			return e;
113330dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
113430dc78e1SJohan Hedberg 			return e;
113530dc78e1SJohan Hedberg 	}
113630dc78e1SJohan Hedberg 
113730dc78e1SJohan Hedberg 	return NULL;
113830dc78e1SJohan Hedberg }
113930dc78e1SJohan Hedberg 
1140a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
1141a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
1142a3d4e20aSJohan Hedberg {
1143a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
1144a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
1145a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
1146a3d4e20aSJohan Hedberg 
1147a3d4e20aSJohan Hedberg 	list_del(&ie->list);
1148a3d4e20aSJohan Hedberg 
1149a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
1150a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
1151a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
1152a3d4e20aSJohan Hedberg 			break;
1153a3d4e20aSJohan Hedberg 		pos = &p->list;
1154a3d4e20aSJohan Hedberg 	}
1155a3d4e20aSJohan Hedberg 
1156a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
1157a3d4e20aSJohan Hedberg }
1158a3d4e20aSJohan Hedberg 
1159af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
1160af58925cSMarcel Holtmann 			     bool name_known)
11611da177e4SLinus Torvalds {
116230883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
116370f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
1164af58925cSMarcel Holtmann 	u32 flags = 0;
11651da177e4SLinus Torvalds 
11666ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
11671da177e4SLinus Torvalds 
11686928a924SJohan Hedberg 	hci_remove_remote_oob_data(hdev, &data->bdaddr, BDADDR_BREDR);
11692b2fec4dSSzymon Janc 
1170af58925cSMarcel Holtmann 	if (!data->ssp_mode)
1171af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
1172388fc8faSJohan Hedberg 
117370f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
1174a3d4e20aSJohan Hedberg 	if (ie) {
1175af58925cSMarcel Holtmann 		if (!ie->data.ssp_mode)
1176af58925cSMarcel Holtmann 			flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
1177388fc8faSJohan Hedberg 
1178a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
1179a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
1180a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
1181a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
1182a3d4e20aSJohan Hedberg 		}
1183a3d4e20aSJohan Hedberg 
1184561aafbcSJohan Hedberg 		goto update;
1185a3d4e20aSJohan Hedberg 	}
1186561aafbcSJohan Hedberg 
11871da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
118827f70f3eSJohan Hedberg 	ie = kzalloc(sizeof(*ie), GFP_KERNEL);
1189af58925cSMarcel Holtmann 	if (!ie) {
1190af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
1191af58925cSMarcel Holtmann 		goto done;
1192af58925cSMarcel Holtmann 	}
119370f23020SAndrei Emeltchenko 
1194561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
1195561aafbcSJohan Hedberg 
1196561aafbcSJohan Hedberg 	if (name_known) {
1197561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
1198561aafbcSJohan Hedberg 	} else {
1199561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
1200561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
1201561aafbcSJohan Hedberg 	}
1202561aafbcSJohan Hedberg 
1203561aafbcSJohan Hedberg update:
1204561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
1205561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
1206561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
1207561aafbcSJohan Hedberg 		list_del(&ie->list);
12081da177e4SLinus Torvalds 	}
12091da177e4SLinus Torvalds 
121070f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
121170f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
12121da177e4SLinus Torvalds 	cache->timestamp = jiffies;
12133175405bSJohan Hedberg 
12143175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
1215af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
12163175405bSJohan Hedberg 
1217af58925cSMarcel Holtmann done:
1218af58925cSMarcel Holtmann 	return flags;
12191da177e4SLinus Torvalds }
12201da177e4SLinus Torvalds 
12211da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
12221da177e4SLinus Torvalds {
122330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
12241da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
12251da177e4SLinus Torvalds 	struct inquiry_entry *e;
12261da177e4SLinus Torvalds 	int copied = 0;
12271da177e4SLinus Torvalds 
1228561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
12291da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
1230b57c1a56SJohan Hedberg 
1231b57c1a56SJohan Hedberg 		if (copied >= num)
1232b57c1a56SJohan Hedberg 			break;
1233b57c1a56SJohan Hedberg 
12341da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
12351da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
12361da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
12371da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
12381da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
12391da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
1240b57c1a56SJohan Hedberg 
12411da177e4SLinus Torvalds 		info++;
1242b57c1a56SJohan Hedberg 		copied++;
12431da177e4SLinus Torvalds 	}
12441da177e4SLinus Torvalds 
12451da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
12461da177e4SLinus Torvalds 	return copied;
12471da177e4SLinus Torvalds }
12481da177e4SLinus Torvalds 
124942c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt)
12501da177e4SLinus Torvalds {
12511da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
125242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
12531da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
12541da177e4SLinus Torvalds 
12551da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
12561da177e4SLinus Torvalds 
12571da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
12581da177e4SLinus Torvalds 		return;
12591da177e4SLinus Torvalds 
12601da177e4SLinus Torvalds 	/* Start Inquiry */
12611da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
12621da177e4SLinus Torvalds 	cp.length  = ir->length;
12631da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
126442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
12651da177e4SLinus Torvalds }
12661da177e4SLinus Torvalds 
12671da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
12681da177e4SLinus Torvalds {
12691da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
12701da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
12711da177e4SLinus Torvalds 	struct hci_dev *hdev;
12721da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
12731da177e4SLinus Torvalds 	long timeo;
12741da177e4SLinus Torvalds 	__u8 *buf;
12751da177e4SLinus Torvalds 
12761da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
12771da177e4SLinus Torvalds 		return -EFAULT;
12781da177e4SLinus Torvalds 
12795a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
12805a08ecceSAndrei Emeltchenko 	if (!hdev)
12811da177e4SLinus Torvalds 		return -ENODEV;
12821da177e4SLinus Torvalds 
12830736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
12840736cfa8SMarcel Holtmann 		err = -EBUSY;
12850736cfa8SMarcel Holtmann 		goto done;
12860736cfa8SMarcel Holtmann 	}
12870736cfa8SMarcel Holtmann 
12884a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
1289fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1290fee746b0SMarcel Holtmann 		goto done;
1291fee746b0SMarcel Holtmann 	}
1292fee746b0SMarcel Holtmann 
12935b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
12945b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
12955b69bef5SMarcel Holtmann 		goto done;
12965b69bef5SMarcel Holtmann 	}
12975b69bef5SMarcel Holtmann 
129856f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
129956f87901SJohan Hedberg 		err = -EOPNOTSUPP;
130056f87901SJohan Hedberg 		goto done;
130156f87901SJohan Hedberg 	}
130256f87901SJohan Hedberg 
130309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13041da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
1305a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
13061f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
13071da177e4SLinus Torvalds 		do_inquiry = 1;
13081da177e4SLinus Torvalds 	}
130909fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13101da177e4SLinus Torvalds 
131104837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
131270f23020SAndrei Emeltchenko 
131370f23020SAndrei Emeltchenko 	if (do_inquiry) {
131401178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
131501178cd4SJohan Hedberg 				   timeo);
131670f23020SAndrei Emeltchenko 		if (err < 0)
13171da177e4SLinus Torvalds 			goto done;
13183e13fa1eSAndre Guedes 
13193e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
13203e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
13213e13fa1eSAndre Guedes 		 */
132274316201SNeilBrown 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY,
13233e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
13243e13fa1eSAndre Guedes 			return -EINTR;
132570f23020SAndrei Emeltchenko 	}
13261da177e4SLinus Torvalds 
13278fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
13288fc9ced3SGustavo Padovan 	 * 255 entries
13298fc9ced3SGustavo Padovan 	 */
13301da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
13311da177e4SLinus Torvalds 
13321da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
13331da177e4SLinus Torvalds 	 * copy it to the user space.
13341da177e4SLinus Torvalds 	 */
133570f23020SAndrei Emeltchenko 	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
133670f23020SAndrei Emeltchenko 	if (!buf) {
13371da177e4SLinus Torvalds 		err = -ENOMEM;
13381da177e4SLinus Torvalds 		goto done;
13391da177e4SLinus Torvalds 	}
13401da177e4SLinus Torvalds 
134109fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
13421da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
134309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
13441da177e4SLinus Torvalds 
13451da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
13461da177e4SLinus Torvalds 
13471da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
13481da177e4SLinus Torvalds 		ptr += sizeof(ir);
13491da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
13501da177e4SLinus Torvalds 				 ir.num_rsp))
13511da177e4SLinus Torvalds 			err = -EFAULT;
13521da177e4SLinus Torvalds 	} else
13531da177e4SLinus Torvalds 		err = -EFAULT;
13541da177e4SLinus Torvalds 
13551da177e4SLinus Torvalds 	kfree(buf);
13561da177e4SLinus Torvalds 
13571da177e4SLinus Torvalds done:
13581da177e4SLinus Torvalds 	hci_dev_put(hdev);
13591da177e4SLinus Torvalds 	return err;
13601da177e4SLinus Torvalds }
13611da177e4SLinus Torvalds 
1362cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev)
13631da177e4SLinus Torvalds {
13641da177e4SLinus Torvalds 	int ret = 0;
13651da177e4SLinus Torvalds 
13661da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
13671da177e4SLinus Torvalds 
13681da177e4SLinus Torvalds 	hci_req_lock(hdev);
13691da177e4SLinus Torvalds 
137094324962SJohan Hovold 	if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
137194324962SJohan Hovold 		ret = -ENODEV;
137294324962SJohan Hovold 		goto done;
137394324962SJohan Hovold 	}
137494324962SJohan Hovold 
1375d603b76bSMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
1376d603b76bSMarcel Holtmann 	    !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
1377a5c8f270SMarcel Holtmann 		/* Check for rfkill but allow the HCI setup stage to
1378a5c8f270SMarcel Holtmann 		 * proceed (which in itself doesn't cause any RF activity).
1379bf543036SJohan Hedberg 		 */
1380a5c8f270SMarcel Holtmann 		if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
1381611b30f7SMarcel Holtmann 			ret = -ERFKILL;
1382611b30f7SMarcel Holtmann 			goto done;
1383611b30f7SMarcel Holtmann 		}
1384611b30f7SMarcel Holtmann 
1385a5c8f270SMarcel Holtmann 		/* Check for valid public address or a configured static
1386a5c8f270SMarcel Holtmann 		 * random adddress, but let the HCI setup proceed to
1387a5c8f270SMarcel Holtmann 		 * be able to determine if there is a public address
1388a5c8f270SMarcel Holtmann 		 * or not.
1389a5c8f270SMarcel Holtmann 		 *
1390c6beca0eSMarcel Holtmann 		 * In case of user channel usage, it is not important
1391c6beca0eSMarcel Holtmann 		 * if a public address or static random address is
1392c6beca0eSMarcel Holtmann 		 * available.
1393c6beca0eSMarcel Holtmann 		 *
1394a5c8f270SMarcel Holtmann 		 * This check is only valid for BR/EDR controllers
1395a5c8f270SMarcel Holtmann 		 * since AMP controllers do not have an address.
1396a5c8f270SMarcel Holtmann 		 */
1397c6beca0eSMarcel Holtmann 		if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
1398c6beca0eSMarcel Holtmann 		    hdev->dev_type == HCI_BREDR &&
1399a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
1400a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->static_addr, BDADDR_ANY)) {
1401a5c8f270SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
1402a5c8f270SMarcel Holtmann 			goto done;
1403a5c8f270SMarcel Holtmann 		}
1404a5c8f270SMarcel Holtmann 	}
1405a5c8f270SMarcel Holtmann 
14061da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
14071da177e4SLinus Torvalds 		ret = -EALREADY;
14081da177e4SLinus Torvalds 		goto done;
14091da177e4SLinus Torvalds 	}
14101da177e4SLinus Torvalds 
14111da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
14121da177e4SLinus Torvalds 		ret = -EIO;
14131da177e4SLinus Torvalds 		goto done;
14141da177e4SLinus Torvalds 	}
14151da177e4SLinus Torvalds 
14161da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
14171da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
1418f41c70c4SMarcel Holtmann 
1419af202f84SMarcel Holtmann 	if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
1420af202f84SMarcel Holtmann 		if (hdev->setup)
1421f41c70c4SMarcel Holtmann 			ret = hdev->setup(hdev);
1422f41c70c4SMarcel Holtmann 
1423af202f84SMarcel Holtmann 		/* The transport driver can set these quirks before
1424af202f84SMarcel Holtmann 		 * creating the HCI device or in its setup callback.
1425af202f84SMarcel Holtmann 		 *
1426af202f84SMarcel Holtmann 		 * In case any of them is set, the controller has to
1427af202f84SMarcel Holtmann 		 * start up as unconfigured.
1428af202f84SMarcel Holtmann 		 */
1429eb1904f4SMarcel Holtmann 		if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
1430eb1904f4SMarcel Holtmann 		    test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks))
143189bc22d2SMarcel Holtmann 			set_bit(HCI_UNCONFIGURED, &hdev->dev_flags);
1432f41c70c4SMarcel Holtmann 
14330ebca7d6SMarcel Holtmann 		/* For an unconfigured controller it is required to
14340ebca7d6SMarcel Holtmann 		 * read at least the version information provided by
14350ebca7d6SMarcel Holtmann 		 * the Read Local Version Information command.
14360ebca7d6SMarcel Holtmann 		 *
14370ebca7d6SMarcel Holtmann 		 * If the set_bdaddr driver callback is provided, then
14380ebca7d6SMarcel Holtmann 		 * also the original Bluetooth public device address
14390ebca7d6SMarcel Holtmann 		 * will be read using the Read BD Address command.
14400ebca7d6SMarcel Holtmann 		 */
14410ebca7d6SMarcel Holtmann 		if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
14420ebca7d6SMarcel Holtmann 			ret = __hci_unconf_init(hdev);
144389bc22d2SMarcel Holtmann 	}
144489bc22d2SMarcel Holtmann 
14459713c17bSMarcel Holtmann 	if (test_bit(HCI_CONFIG, &hdev->dev_flags)) {
14469713c17bSMarcel Holtmann 		/* If public address change is configured, ensure that
14479713c17bSMarcel Holtmann 		 * the address gets programmed. If the driver does not
14489713c17bSMarcel Holtmann 		 * support changing the public address, fail the power
14499713c17bSMarcel Holtmann 		 * on procedure.
145024c457e2SMarcel Holtmann 		 */
14519713c17bSMarcel Holtmann 		if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
14529713c17bSMarcel Holtmann 		    hdev->set_bdaddr)
145324c457e2SMarcel Holtmann 			ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
145424c457e2SMarcel Holtmann 		else
145524c457e2SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
145624c457e2SMarcel Holtmann 	}
145724c457e2SMarcel Holtmann 
1458f41c70c4SMarcel Holtmann 	if (!ret) {
14594a964404SMarcel Holtmann 		if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
14600736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
14612177bab5SJohan Hedberg 			ret = __hci_init(hdev);
14621da177e4SLinus Torvalds 	}
14631da177e4SLinus Torvalds 
1464f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
1465f41c70c4SMarcel Holtmann 
14661da177e4SLinus Torvalds 	if (!ret) {
14671da177e4SLinus Torvalds 		hci_dev_hold(hdev);
1468d6bfd59cSJohan Hedberg 		set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
14691da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
14701da177e4SLinus Torvalds 		hci_notify(hdev, HCI_DEV_UP);
1471bb4b2a9aSAndrei Emeltchenko 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
1472d603b76bSMarcel Holtmann 		    !test_bit(HCI_CONFIG, &hdev->dev_flags) &&
14734a964404SMarcel Holtmann 		    !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
14740736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
14751514b892SMarcel Holtmann 		    hdev->dev_type == HCI_BREDR) {
147609fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
1477744cf19eSJohan Hedberg 			mgmt_powered(hdev, 1);
147809fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
147956e5cb86SJohan Hedberg 		}
14801da177e4SLinus Torvalds 	} else {
14811da177e4SLinus Torvalds 		/* Init failed, cleanup */
14823eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
1483c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
1484b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
14851da177e4SLinus Torvalds 
14861da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
14871da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
14881da177e4SLinus Torvalds 
14891da177e4SLinus Torvalds 		if (hdev->flush)
14901da177e4SLinus Torvalds 			hdev->flush(hdev);
14911da177e4SLinus Torvalds 
14921da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
14931da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
14941da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
14951da177e4SLinus Torvalds 		}
14961da177e4SLinus Torvalds 
14971da177e4SLinus Torvalds 		hdev->close(hdev);
1498fee746b0SMarcel Holtmann 		hdev->flags &= BIT(HCI_RAW);
14991da177e4SLinus Torvalds 	}
15001da177e4SLinus Torvalds 
15011da177e4SLinus Torvalds done:
15021da177e4SLinus Torvalds 	hci_req_unlock(hdev);
15031da177e4SLinus Torvalds 	return ret;
15041da177e4SLinus Torvalds }
15051da177e4SLinus Torvalds 
1506cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */
1507cbed0ca1SJohan Hedberg 
1508cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev)
1509cbed0ca1SJohan Hedberg {
1510cbed0ca1SJohan Hedberg 	struct hci_dev *hdev;
1511cbed0ca1SJohan Hedberg 	int err;
1512cbed0ca1SJohan Hedberg 
1513cbed0ca1SJohan Hedberg 	hdev = hci_dev_get(dev);
1514cbed0ca1SJohan Hedberg 	if (!hdev)
1515cbed0ca1SJohan Hedberg 		return -ENODEV;
1516cbed0ca1SJohan Hedberg 
15174a964404SMarcel Holtmann 	/* Devices that are marked as unconfigured can only be powered
1518fee746b0SMarcel Holtmann 	 * up as user channel. Trying to bring them up as normal devices
1519fee746b0SMarcel Holtmann 	 * will result into a failure. Only user channel operation is
1520fee746b0SMarcel Holtmann 	 * possible.
1521fee746b0SMarcel Holtmann 	 *
1522fee746b0SMarcel Holtmann 	 * When this function is called for a user channel, the flag
1523fee746b0SMarcel Holtmann 	 * HCI_USER_CHANNEL will be set first before attempting to
1524fee746b0SMarcel Holtmann 	 * open the device.
1525fee746b0SMarcel Holtmann 	 */
15264a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
1527fee746b0SMarcel Holtmann 	    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
1528fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1529fee746b0SMarcel Holtmann 		goto done;
1530fee746b0SMarcel Holtmann 	}
1531fee746b0SMarcel Holtmann 
1532e1d08f40SJohan Hedberg 	/* We need to ensure that no other power on/off work is pending
1533e1d08f40SJohan Hedberg 	 * before proceeding to call hci_dev_do_open. This is
1534e1d08f40SJohan Hedberg 	 * particularly important if the setup procedure has not yet
1535e1d08f40SJohan Hedberg 	 * completed.
1536e1d08f40SJohan Hedberg 	 */
1537e1d08f40SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
1538e1d08f40SJohan Hedberg 		cancel_delayed_work(&hdev->power_off);
1539e1d08f40SJohan Hedberg 
1540a5c8f270SMarcel Holtmann 	/* After this call it is guaranteed that the setup procedure
1541a5c8f270SMarcel Holtmann 	 * has finished. This means that error conditions like RFKILL
1542a5c8f270SMarcel Holtmann 	 * or no valid public or static random address apply.
1543a5c8f270SMarcel Holtmann 	 */
1544e1d08f40SJohan Hedberg 	flush_workqueue(hdev->req_workqueue);
1545e1d08f40SJohan Hedberg 
154612aa4f0aSMarcel Holtmann 	/* For controllers not using the management interface and that
1547b6ae8457SJohan Hedberg 	 * are brought up using legacy ioctl, set the HCI_BONDABLE bit
154812aa4f0aSMarcel Holtmann 	 * so that pairing works for them. Once the management interface
154912aa4f0aSMarcel Holtmann 	 * is in use this bit will be cleared again and userspace has
155012aa4f0aSMarcel Holtmann 	 * to explicitly enable it.
155112aa4f0aSMarcel Holtmann 	 */
155212aa4f0aSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
155312aa4f0aSMarcel Holtmann 	    !test_bit(HCI_MGMT, &hdev->dev_flags))
1554b6ae8457SJohan Hedberg 		set_bit(HCI_BONDABLE, &hdev->dev_flags);
155512aa4f0aSMarcel Holtmann 
1556cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
1557cbed0ca1SJohan Hedberg 
1558fee746b0SMarcel Holtmann done:
1559cbed0ca1SJohan Hedberg 	hci_dev_put(hdev);
1560cbed0ca1SJohan Hedberg 	return err;
1561cbed0ca1SJohan Hedberg }
1562cbed0ca1SJohan Hedberg 
1563d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */
1564d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev)
1565d7347f3cSJohan Hedberg {
1566d7347f3cSJohan Hedberg 	struct hci_conn_params *p;
1567d7347f3cSJohan Hedberg 
1568f161dd41SJohan Hedberg 	list_for_each_entry(p, &hdev->le_conn_params, list) {
1569f161dd41SJohan Hedberg 		if (p->conn) {
1570f161dd41SJohan Hedberg 			hci_conn_drop(p->conn);
1571f8aaf9b6SJohan Hedberg 			hci_conn_put(p->conn);
1572f161dd41SJohan Hedberg 			p->conn = NULL;
1573f161dd41SJohan Hedberg 		}
1574d7347f3cSJohan Hedberg 		list_del_init(&p->action);
1575f161dd41SJohan Hedberg 	}
1576d7347f3cSJohan Hedberg 
1577d7347f3cSJohan Hedberg 	BT_DBG("All LE pending actions cleared");
1578d7347f3cSJohan Hedberg }
1579d7347f3cSJohan Hedberg 
15801da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev)
15811da177e4SLinus Torvalds {
15821da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
15831da177e4SLinus Torvalds 
158478c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
158578c04c0bSVinicius Costa Gomes 
15861da177e4SLinus Torvalds 	hci_req_cancel(hdev, ENODEV);
15871da177e4SLinus Torvalds 	hci_req_lock(hdev);
15881da177e4SLinus Torvalds 
15891da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
159065cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
15911da177e4SLinus Torvalds 		hci_req_unlock(hdev);
15921da177e4SLinus Torvalds 		return 0;
15931da177e4SLinus Torvalds 	}
15941da177e4SLinus Torvalds 
15953eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
15963eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
1597b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
15981da177e4SLinus Torvalds 
159916ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
1600e0f9309fSJohan Hedberg 		cancel_delayed_work(&hdev->discov_off);
160116ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
16025e5282bbSJohan Hedberg 		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
1603310a3d48SMarcel Holtmann 		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
160416ab91abSJohan Hedberg 	}
160516ab91abSJohan Hedberg 
1606a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
16077d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
16087d78525dSJohan Hedberg 
16097ba8b4beSAndre Guedes 	cancel_delayed_work_sync(&hdev->le_scan_disable);
16104518bb0fSJohan Hedberg 
16114518bb0fSJohan Hedberg 	if (test_bit(HCI_MGMT, &hdev->dev_flags))
1612d6bfd59cSJohan Hedberg 		cancel_delayed_work_sync(&hdev->rpa_expired);
16137ba8b4beSAndre Guedes 
161476727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
161576727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
161676727c02SJohan Hedberg 	 */
161776727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
161876727c02SJohan Hedberg 
161909fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
16201aeb9c65SJohan Hedberg 
16211aeb9c65SJohan Hedberg 	if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
16221aeb9c65SJohan Hedberg 		if (hdev->dev_type == HCI_BREDR)
16231aeb9c65SJohan Hedberg 			mgmt_powered(hdev, 0);
16241aeb9c65SJohan Hedberg 	}
16251aeb9c65SJohan Hedberg 
16261f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
1627d7347f3cSJohan Hedberg 	hci_pend_le_actions_clear(hdev);
1628f161dd41SJohan Hedberg 	hci_conn_hash_flush(hdev);
162909fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
16301da177e4SLinus Torvalds 
16311da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_DOWN);
16321da177e4SLinus Torvalds 
16331da177e4SLinus Torvalds 	if (hdev->flush)
16341da177e4SLinus Torvalds 		hdev->flush(hdev);
16351da177e4SLinus Torvalds 
16361da177e4SLinus Torvalds 	/* Reset device */
16371da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
16381da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
16394a964404SMarcel Holtmann 	if (!test_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
16404a964404SMarcel Holtmann 	    !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
1641a6c511c6SSzymon Janc 	    test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
16421da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
164301178cd4SJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
16441da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
16451da177e4SLinus Torvalds 	}
16461da177e4SLinus Torvalds 
1647c347b765SGustavo F. Padovan 	/* flush cmd  work */
1648c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
16491da177e4SLinus Torvalds 
16501da177e4SLinus Torvalds 	/* Drop queues */
16511da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
16521da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
16531da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
16541da177e4SLinus Torvalds 
16551da177e4SLinus Torvalds 	/* Drop last sent command */
16561da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
165765cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
16581da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
16591da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
16601da177e4SLinus Torvalds 	}
16611da177e4SLinus Torvalds 
1662b6ddb638SJohan Hedberg 	kfree_skb(hdev->recv_evt);
1663b6ddb638SJohan Hedberg 	hdev->recv_evt = NULL;
1664b6ddb638SJohan Hedberg 
16651da177e4SLinus Torvalds 	/* After this point our queues are empty
16661da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
16671da177e4SLinus Torvalds 	hdev->close(hdev);
16681da177e4SLinus Torvalds 
166935b973c9SJohan Hedberg 	/* Clear flags */
1670fee746b0SMarcel Holtmann 	hdev->flags &= BIT(HCI_RAW);
167135b973c9SJohan Hedberg 	hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
167235b973c9SJohan Hedberg 
1673ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
1674536619e8SMarcel Holtmann 	hdev->amp_status = AMP_STATUS_POWERED_DOWN;
1675ced5c338SAndrei Emeltchenko 
1676e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
167709b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
16787a4cd51dSMarcel Holtmann 	bacpy(&hdev->random_addr, BDADDR_ANY);
1679e59fda8dSJohan Hedberg 
16801da177e4SLinus Torvalds 	hci_req_unlock(hdev);
16811da177e4SLinus Torvalds 
16821da177e4SLinus Torvalds 	hci_dev_put(hdev);
16831da177e4SLinus Torvalds 	return 0;
16841da177e4SLinus Torvalds }
16851da177e4SLinus Torvalds 
16861da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
16871da177e4SLinus Torvalds {
16881da177e4SLinus Torvalds 	struct hci_dev *hdev;
16891da177e4SLinus Torvalds 	int err;
16901da177e4SLinus Torvalds 
169170f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
169270f23020SAndrei Emeltchenko 	if (!hdev)
16931da177e4SLinus Torvalds 		return -ENODEV;
16948ee56540SMarcel Holtmann 
16950736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
16960736cfa8SMarcel Holtmann 		err = -EBUSY;
16970736cfa8SMarcel Holtmann 		goto done;
16980736cfa8SMarcel Holtmann 	}
16990736cfa8SMarcel Holtmann 
17008ee56540SMarcel Holtmann 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
17018ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
17028ee56540SMarcel Holtmann 
17031da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
17048ee56540SMarcel Holtmann 
17050736cfa8SMarcel Holtmann done:
17061da177e4SLinus Torvalds 	hci_dev_put(hdev);
17071da177e4SLinus Torvalds 	return err;
17081da177e4SLinus Torvalds }
17091da177e4SLinus Torvalds 
17101da177e4SLinus Torvalds int hci_dev_reset(__u16 dev)
17111da177e4SLinus Torvalds {
17121da177e4SLinus Torvalds 	struct hci_dev *hdev;
17131da177e4SLinus Torvalds 	int ret = 0;
17141da177e4SLinus Torvalds 
171570f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
171670f23020SAndrei Emeltchenko 	if (!hdev)
17171da177e4SLinus Torvalds 		return -ENODEV;
17181da177e4SLinus Torvalds 
17191da177e4SLinus Torvalds 	hci_req_lock(hdev);
17201da177e4SLinus Torvalds 
1721808a049eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
1722808a049eSMarcel Holtmann 		ret = -ENETDOWN;
17231da177e4SLinus Torvalds 		goto done;
1724808a049eSMarcel Holtmann 	}
17251da177e4SLinus Torvalds 
17260736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
17270736cfa8SMarcel Holtmann 		ret = -EBUSY;
17280736cfa8SMarcel Holtmann 		goto done;
17290736cfa8SMarcel Holtmann 	}
17300736cfa8SMarcel Holtmann 
17314a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
1732fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
1733fee746b0SMarcel Holtmann 		goto done;
1734fee746b0SMarcel Holtmann 	}
1735fee746b0SMarcel Holtmann 
17361da177e4SLinus Torvalds 	/* Drop queues */
17371da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
17381da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
17391da177e4SLinus Torvalds 
174076727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
174176727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
174276727c02SJohan Hedberg 	 */
174376727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
174476727c02SJohan Hedberg 
174509fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
17461f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
17471da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
174809fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
17491da177e4SLinus Torvalds 
17501da177e4SLinus Torvalds 	if (hdev->flush)
17511da177e4SLinus Torvalds 		hdev->flush(hdev);
17521da177e4SLinus Torvalds 
17531da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
17546ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
17551da177e4SLinus Torvalds 
175601178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
17571da177e4SLinus Torvalds 
17581da177e4SLinus Torvalds done:
17591da177e4SLinus Torvalds 	hci_req_unlock(hdev);
17601da177e4SLinus Torvalds 	hci_dev_put(hdev);
17611da177e4SLinus Torvalds 	return ret;
17621da177e4SLinus Torvalds }
17631da177e4SLinus Torvalds 
17641da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
17651da177e4SLinus Torvalds {
17661da177e4SLinus Torvalds 	struct hci_dev *hdev;
17671da177e4SLinus Torvalds 	int ret = 0;
17681da177e4SLinus Torvalds 
176970f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
177070f23020SAndrei Emeltchenko 	if (!hdev)
17711da177e4SLinus Torvalds 		return -ENODEV;
17721da177e4SLinus Torvalds 
17730736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
17740736cfa8SMarcel Holtmann 		ret = -EBUSY;
17750736cfa8SMarcel Holtmann 		goto done;
17760736cfa8SMarcel Holtmann 	}
17770736cfa8SMarcel Holtmann 
17784a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
1779fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
1780fee746b0SMarcel Holtmann 		goto done;
1781fee746b0SMarcel Holtmann 	}
1782fee746b0SMarcel Holtmann 
17831da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
17841da177e4SLinus Torvalds 
17850736cfa8SMarcel Holtmann done:
17861da177e4SLinus Torvalds 	hci_dev_put(hdev);
17871da177e4SLinus Torvalds 	return ret;
17881da177e4SLinus Torvalds }
17891da177e4SLinus Torvalds 
1790123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
1791123abc08SJohan Hedberg {
1792bc6d2d04SJohan Hedberg 	bool conn_changed, discov_changed;
1793123abc08SJohan Hedberg 
1794123abc08SJohan Hedberg 	BT_DBG("%s scan 0x%02x", hdev->name, scan);
1795123abc08SJohan Hedberg 
1796123abc08SJohan Hedberg 	if ((scan & SCAN_PAGE))
1797123abc08SJohan Hedberg 		conn_changed = !test_and_set_bit(HCI_CONNECTABLE,
1798123abc08SJohan Hedberg 						 &hdev->dev_flags);
1799123abc08SJohan Hedberg 	else
1800123abc08SJohan Hedberg 		conn_changed = test_and_clear_bit(HCI_CONNECTABLE,
1801123abc08SJohan Hedberg 						  &hdev->dev_flags);
1802123abc08SJohan Hedberg 
1803bc6d2d04SJohan Hedberg 	if ((scan & SCAN_INQUIRY)) {
1804bc6d2d04SJohan Hedberg 		discov_changed = !test_and_set_bit(HCI_DISCOVERABLE,
1805bc6d2d04SJohan Hedberg 						   &hdev->dev_flags);
1806bc6d2d04SJohan Hedberg 	} else {
1807bc6d2d04SJohan Hedberg 		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
1808bc6d2d04SJohan Hedberg 		discov_changed = test_and_clear_bit(HCI_DISCOVERABLE,
1809bc6d2d04SJohan Hedberg 						    &hdev->dev_flags);
1810bc6d2d04SJohan Hedberg 	}
1811bc6d2d04SJohan Hedberg 
1812123abc08SJohan Hedberg 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
1813123abc08SJohan Hedberg 		return;
1814123abc08SJohan Hedberg 
1815bc6d2d04SJohan Hedberg 	if (conn_changed || discov_changed) {
1816bc6d2d04SJohan Hedberg 		/* In case this was disabled through mgmt */
1817bc6d2d04SJohan Hedberg 		set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
1818bc6d2d04SJohan Hedberg 
1819bc6d2d04SJohan Hedberg 		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
1820bc6d2d04SJohan Hedberg 			mgmt_update_adv_data(hdev);
1821bc6d2d04SJohan Hedberg 
1822123abc08SJohan Hedberg 		mgmt_new_settings(hdev);
1823123abc08SJohan Hedberg 	}
1824bc6d2d04SJohan Hedberg }
1825123abc08SJohan Hedberg 
18261da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
18271da177e4SLinus Torvalds {
18281da177e4SLinus Torvalds 	struct hci_dev *hdev;
18291da177e4SLinus Torvalds 	struct hci_dev_req dr;
18301da177e4SLinus Torvalds 	int err = 0;
18311da177e4SLinus Torvalds 
18321da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
18331da177e4SLinus Torvalds 		return -EFAULT;
18341da177e4SLinus Torvalds 
183570f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
183670f23020SAndrei Emeltchenko 	if (!hdev)
18371da177e4SLinus Torvalds 		return -ENODEV;
18381da177e4SLinus Torvalds 
18390736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
18400736cfa8SMarcel Holtmann 		err = -EBUSY;
18410736cfa8SMarcel Holtmann 		goto done;
18420736cfa8SMarcel Holtmann 	}
18430736cfa8SMarcel Holtmann 
18444a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
1845fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
1846fee746b0SMarcel Holtmann 		goto done;
1847fee746b0SMarcel Holtmann 	}
1848fee746b0SMarcel Holtmann 
18495b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
18505b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
18515b69bef5SMarcel Holtmann 		goto done;
18525b69bef5SMarcel Holtmann 	}
18535b69bef5SMarcel Holtmann 
185456f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
185556f87901SJohan Hedberg 		err = -EOPNOTSUPP;
185656f87901SJohan Hedberg 		goto done;
185756f87901SJohan Hedberg 	}
185856f87901SJohan Hedberg 
18591da177e4SLinus Torvalds 	switch (cmd) {
18601da177e4SLinus Torvalds 	case HCISETAUTH:
186101178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
18625f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
18631da177e4SLinus Torvalds 		break;
18641da177e4SLinus Torvalds 
18651da177e4SLinus Torvalds 	case HCISETENCRYPT:
18661da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
18671da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
18681da177e4SLinus Torvalds 			break;
18691da177e4SLinus Torvalds 		}
18701da177e4SLinus Torvalds 
18711da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
18721da177e4SLinus Torvalds 			/* Auth must be enabled first */
187301178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
18745f246e89SAndrei Emeltchenko 					   HCI_INIT_TIMEOUT);
18751da177e4SLinus Torvalds 			if (err)
18761da177e4SLinus Torvalds 				break;
18771da177e4SLinus Torvalds 		}
18781da177e4SLinus Torvalds 
187901178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
18805f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
18811da177e4SLinus Torvalds 		break;
18821da177e4SLinus Torvalds 
18831da177e4SLinus Torvalds 	case HCISETSCAN:
188401178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
18855f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
188691a668b0SJohan Hedberg 
1887bc6d2d04SJohan Hedberg 		/* Ensure that the connectable and discoverable states
1888bc6d2d04SJohan Hedberg 		 * get correctly modified as this was a non-mgmt change.
188991a668b0SJohan Hedberg 		 */
1890123abc08SJohan Hedberg 		if (!err)
1891123abc08SJohan Hedberg 			hci_update_scan_state(hdev, dr.dev_opt);
18921da177e4SLinus Torvalds 		break;
18931da177e4SLinus Torvalds 
18941da177e4SLinus Torvalds 	case HCISETLINKPOL:
189501178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
18965f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
18971da177e4SLinus Torvalds 		break;
18981da177e4SLinus Torvalds 
18991da177e4SLinus Torvalds 	case HCISETLINKMODE:
1900e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
1901e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
1902e4e8e37cSMarcel Holtmann 		break;
1903e4e8e37cSMarcel Holtmann 
1904e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
1905e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
19061da177e4SLinus Torvalds 		break;
19071da177e4SLinus Torvalds 
19081da177e4SLinus Torvalds 	case HCISETACLMTU:
19091da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
19101da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
19111da177e4SLinus Torvalds 		break;
19121da177e4SLinus Torvalds 
19131da177e4SLinus Torvalds 	case HCISETSCOMTU:
19141da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
19151da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
19161da177e4SLinus Torvalds 		break;
19171da177e4SLinus Torvalds 
19181da177e4SLinus Torvalds 	default:
19191da177e4SLinus Torvalds 		err = -EINVAL;
19201da177e4SLinus Torvalds 		break;
19211da177e4SLinus Torvalds 	}
1922e4e8e37cSMarcel Holtmann 
19230736cfa8SMarcel Holtmann done:
19241da177e4SLinus Torvalds 	hci_dev_put(hdev);
19251da177e4SLinus Torvalds 	return err;
19261da177e4SLinus Torvalds }
19271da177e4SLinus Torvalds 
19281da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
19291da177e4SLinus Torvalds {
19308035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
19311da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
19321da177e4SLinus Torvalds 	struct hci_dev_req *dr;
19331da177e4SLinus Torvalds 	int n = 0, size, err;
19341da177e4SLinus Torvalds 	__u16 dev_num;
19351da177e4SLinus Torvalds 
19361da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
19371da177e4SLinus Torvalds 		return -EFAULT;
19381da177e4SLinus Torvalds 
19391da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
19401da177e4SLinus Torvalds 		return -EINVAL;
19411da177e4SLinus Torvalds 
19421da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
19431da177e4SLinus Torvalds 
194470f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
194570f23020SAndrei Emeltchenko 	if (!dl)
19461da177e4SLinus Torvalds 		return -ENOMEM;
19471da177e4SLinus Torvalds 
19481da177e4SLinus Torvalds 	dr = dl->dev_req;
19491da177e4SLinus Torvalds 
1950f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
19518035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
19522e84d8dbSMarcel Holtmann 		unsigned long flags = hdev->flags;
1953c542a06cSJohan Hedberg 
19542e84d8dbSMarcel Holtmann 		/* When the auto-off is configured it means the transport
19552e84d8dbSMarcel Holtmann 		 * is running, but in that case still indicate that the
19562e84d8dbSMarcel Holtmann 		 * device is actually down.
19572e84d8dbSMarcel Holtmann 		 */
19582e84d8dbSMarcel Holtmann 		if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
19592e84d8dbSMarcel Holtmann 			flags &= ~BIT(HCI_UP);
1960c542a06cSJohan Hedberg 
19611da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
19622e84d8dbSMarcel Holtmann 		(dr + n)->dev_opt = flags;
1963c542a06cSJohan Hedberg 
19641da177e4SLinus Torvalds 		if (++n >= dev_num)
19651da177e4SLinus Torvalds 			break;
19661da177e4SLinus Torvalds 	}
1967f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
19681da177e4SLinus Torvalds 
19691da177e4SLinus Torvalds 	dl->dev_num = n;
19701da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
19711da177e4SLinus Torvalds 
19721da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
19731da177e4SLinus Torvalds 	kfree(dl);
19741da177e4SLinus Torvalds 
19751da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
19761da177e4SLinus Torvalds }
19771da177e4SLinus Torvalds 
19781da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
19791da177e4SLinus Torvalds {
19801da177e4SLinus Torvalds 	struct hci_dev *hdev;
19811da177e4SLinus Torvalds 	struct hci_dev_info di;
19822e84d8dbSMarcel Holtmann 	unsigned long flags;
19831da177e4SLinus Torvalds 	int err = 0;
19841da177e4SLinus Torvalds 
19851da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
19861da177e4SLinus Torvalds 		return -EFAULT;
19871da177e4SLinus Torvalds 
198870f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
198970f23020SAndrei Emeltchenko 	if (!hdev)
19901da177e4SLinus Torvalds 		return -ENODEV;
19911da177e4SLinus Torvalds 
19922e84d8dbSMarcel Holtmann 	/* When the auto-off is configured it means the transport
19932e84d8dbSMarcel Holtmann 	 * is running, but in that case still indicate that the
19942e84d8dbSMarcel Holtmann 	 * device is actually down.
19952e84d8dbSMarcel Holtmann 	 */
19962e84d8dbSMarcel Holtmann 	if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
19972e84d8dbSMarcel Holtmann 		flags = hdev->flags & ~BIT(HCI_UP);
19982e84d8dbSMarcel Holtmann 	else
19992e84d8dbSMarcel Holtmann 		flags = hdev->flags;
2000c542a06cSJohan Hedberg 
20011da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
20021da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
200360f2a3edSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
20042e84d8dbSMarcel Holtmann 	di.flags    = flags;
20051da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
2006572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
20071da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
20081da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
20091da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
20101da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
2011572c7f84SJohan Hedberg 	} else {
2012572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
2013572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
2014572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
2015572c7f84SJohan Hedberg 		di.sco_pkts = 0;
2016572c7f84SJohan Hedberg 	}
20171da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
20181da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
20191da177e4SLinus Torvalds 
20201da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
20211da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
20221da177e4SLinus Torvalds 
20231da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
20241da177e4SLinus Torvalds 		err = -EFAULT;
20251da177e4SLinus Torvalds 
20261da177e4SLinus Torvalds 	hci_dev_put(hdev);
20271da177e4SLinus Torvalds 
20281da177e4SLinus Torvalds 	return err;
20291da177e4SLinus Torvalds }
20301da177e4SLinus Torvalds 
20311da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
20321da177e4SLinus Torvalds 
2033611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
2034611b30f7SMarcel Holtmann {
2035611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
2036611b30f7SMarcel Holtmann 
2037611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
2038611b30f7SMarcel Holtmann 
20390736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
20400736cfa8SMarcel Holtmann 		return -EBUSY;
20410736cfa8SMarcel Holtmann 
20425e130367SJohan Hedberg 	if (blocked) {
20435e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
2044d603b76bSMarcel Holtmann 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2045d603b76bSMarcel Holtmann 		    !test_bit(HCI_CONFIG, &hdev->dev_flags))
2046611b30f7SMarcel Holtmann 			hci_dev_do_close(hdev);
20475e130367SJohan Hedberg 	} else {
20485e130367SJohan Hedberg 		clear_bit(HCI_RFKILLED, &hdev->dev_flags);
20495e130367SJohan Hedberg 	}
2050611b30f7SMarcel Holtmann 
2051611b30f7SMarcel Holtmann 	return 0;
2052611b30f7SMarcel Holtmann }
2053611b30f7SMarcel Holtmann 
2054611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
2055611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
2056611b30f7SMarcel Holtmann };
2057611b30f7SMarcel Holtmann 
2058ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
2059ab81cbf9SJohan Hedberg {
2060ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
206196570ffcSJohan Hedberg 	int err;
2062ab81cbf9SJohan Hedberg 
2063ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2064ab81cbf9SJohan Hedberg 
2065cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
206696570ffcSJohan Hedberg 	if (err < 0) {
20673ad67582SJaganath Kanakkassery 		hci_dev_lock(hdev);
206896570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
20693ad67582SJaganath Kanakkassery 		hci_dev_unlock(hdev);
2070ab81cbf9SJohan Hedberg 		return;
207196570ffcSJohan Hedberg 	}
2072ab81cbf9SJohan Hedberg 
2073a5c8f270SMarcel Holtmann 	/* During the HCI setup phase, a few error conditions are
2074a5c8f270SMarcel Holtmann 	 * ignored and they need to be checked now. If they are still
2075a5c8f270SMarcel Holtmann 	 * valid, it is important to turn the device back off.
2076a5c8f270SMarcel Holtmann 	 */
2077a5c8f270SMarcel Holtmann 	if (test_bit(HCI_RFKILLED, &hdev->dev_flags) ||
20784a964404SMarcel Holtmann 	    test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) ||
2079a5c8f270SMarcel Holtmann 	    (hdev->dev_type == HCI_BREDR &&
2080a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2081a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->static_addr, BDADDR_ANY))) {
2082bf543036SJohan Hedberg 		clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
2083bf543036SJohan Hedberg 		hci_dev_do_close(hdev);
2084bf543036SJohan Hedberg 	} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
208519202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
208619202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
2087bf543036SJohan Hedberg 	}
2088ab81cbf9SJohan Hedberg 
2089fee746b0SMarcel Holtmann 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags)) {
20904a964404SMarcel Holtmann 		/* For unconfigured devices, set the HCI_RAW flag
20914a964404SMarcel Holtmann 		 * so that userspace can easily identify them.
20924a964404SMarcel Holtmann 		 */
20934a964404SMarcel Holtmann 		if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
20944a964404SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
20950602a8adSMarcel Holtmann 
20960602a8adSMarcel Holtmann 		/* For fully configured devices, this will send
20970602a8adSMarcel Holtmann 		 * the Index Added event. For unconfigured devices,
20980602a8adSMarcel Holtmann 		 * it will send Unconfigued Index Added event.
20990602a8adSMarcel Holtmann 		 *
21000602a8adSMarcel Holtmann 		 * Devices with HCI_QUIRK_RAW_DEVICE are ignored
21010602a8adSMarcel Holtmann 		 * and no event will be send.
21020602a8adSMarcel Holtmann 		 */
2103744cf19eSJohan Hedberg 		mgmt_index_added(hdev);
2104d603b76bSMarcel Holtmann 	} else if (test_and_clear_bit(HCI_CONFIG, &hdev->dev_flags)) {
21055ea234d3SMarcel Holtmann 		/* When the controller is now configured, then it
21065ea234d3SMarcel Holtmann 		 * is important to clear the HCI_RAW flag.
21075ea234d3SMarcel Holtmann 		 */
21085ea234d3SMarcel Holtmann 		if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
21095ea234d3SMarcel Holtmann 			clear_bit(HCI_RAW, &hdev->flags);
21105ea234d3SMarcel Holtmann 
2111d603b76bSMarcel Holtmann 		/* Powering on the controller with HCI_CONFIG set only
2112d603b76bSMarcel Holtmann 		 * happens with the transition from unconfigured to
2113d603b76bSMarcel Holtmann 		 * configured. This will send the Index Added event.
2114d603b76bSMarcel Holtmann 		 */
2115d603b76bSMarcel Holtmann 		mgmt_index_added(hdev);
2116ab81cbf9SJohan Hedberg 	}
2117ab81cbf9SJohan Hedberg }
2118ab81cbf9SJohan Hedberg 
2119ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
2120ab81cbf9SJohan Hedberg {
21213243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
21223243553fSJohan Hedberg 					    power_off.work);
2123ab81cbf9SJohan Hedberg 
2124ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
2125ab81cbf9SJohan Hedberg 
21268ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
2127ab81cbf9SJohan Hedberg }
2128ab81cbf9SJohan Hedberg 
212916ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work)
213016ab91abSJohan Hedberg {
213116ab91abSJohan Hedberg 	struct hci_dev *hdev;
213216ab91abSJohan Hedberg 
213316ab91abSJohan Hedberg 	hdev = container_of(work, struct hci_dev, discov_off.work);
213416ab91abSJohan Hedberg 
213516ab91abSJohan Hedberg 	BT_DBG("%s", hdev->name);
213616ab91abSJohan Hedberg 
2137d1967ff8SMarcel Holtmann 	mgmt_discoverable_timeout(hdev);
213816ab91abSJohan Hedberg }
213916ab91abSJohan Hedberg 
214035f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev)
21412aeb9a1aSJohan Hedberg {
21424821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
21432aeb9a1aSJohan Hedberg 
21444821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
21454821002cSJohan Hedberg 		list_del(&uuid->list);
21462aeb9a1aSJohan Hedberg 		kfree(uuid);
21472aeb9a1aSJohan Hedberg 	}
21482aeb9a1aSJohan Hedberg }
21492aeb9a1aSJohan Hedberg 
215035f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev)
215155ed8ca1SJohan Hedberg {
215255ed8ca1SJohan Hedberg 	struct link_key *key;
215355ed8ca1SJohan Hedberg 
21540378b597SJohan Hedberg 	list_for_each_entry_rcu(key, &hdev->link_keys, list) {
21550378b597SJohan Hedberg 		list_del_rcu(&key->list);
21560378b597SJohan Hedberg 		kfree_rcu(key, rcu);
215755ed8ca1SJohan Hedberg 	}
215855ed8ca1SJohan Hedberg }
215955ed8ca1SJohan Hedberg 
216035f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev)
2161b899efafSVinicius Costa Gomes {
2162970d0f1bSJohan Hedberg 	struct smp_ltk *k;
2163b899efafSVinicius Costa Gomes 
2164970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
2165970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
2166970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
2167b899efafSVinicius Costa Gomes 	}
2168b899efafSVinicius Costa Gomes }
2169b899efafSVinicius Costa Gomes 
2170970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev)
2171970c4e46SJohan Hedberg {
2172adae20cbSJohan Hedberg 	struct smp_irk *k;
2173970c4e46SJohan Hedberg 
2174adae20cbSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
2175adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
2176adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
2177970c4e46SJohan Hedberg 	}
2178970c4e46SJohan Hedberg }
2179970c4e46SJohan Hedberg 
218055ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
218155ed8ca1SJohan Hedberg {
218255ed8ca1SJohan Hedberg 	struct link_key *k;
218355ed8ca1SJohan Hedberg 
21840378b597SJohan Hedberg 	rcu_read_lock();
21850378b597SJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->link_keys, list) {
21860378b597SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0) {
21870378b597SJohan Hedberg 			rcu_read_unlock();
218855ed8ca1SJohan Hedberg 			return k;
21890378b597SJohan Hedberg 		}
21900378b597SJohan Hedberg 	}
21910378b597SJohan Hedberg 	rcu_read_unlock();
219255ed8ca1SJohan Hedberg 
219355ed8ca1SJohan Hedberg 	return NULL;
219455ed8ca1SJohan Hedberg }
219555ed8ca1SJohan Hedberg 
2196745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
2197d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
2198d25e28abSJohan Hedberg {
2199d25e28abSJohan Hedberg 	/* Legacy key */
2200d25e28abSJohan Hedberg 	if (key_type < 0x03)
2201745c0ce3SVishal Agarwal 		return true;
2202d25e28abSJohan Hedberg 
2203d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
2204d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
2205745c0ce3SVishal Agarwal 		return false;
2206d25e28abSJohan Hedberg 
2207d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
2208d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
2209745c0ce3SVishal Agarwal 		return false;
2210d25e28abSJohan Hedberg 
2211d25e28abSJohan Hedberg 	/* Security mode 3 case */
2212d25e28abSJohan Hedberg 	if (!conn)
2213745c0ce3SVishal Agarwal 		return true;
2214d25e28abSJohan Hedberg 
2215e3befab9SJohan Hedberg 	/* BR/EDR key derived using SC from an LE link */
2216e3befab9SJohan Hedberg 	if (conn->type == LE_LINK)
2217e3befab9SJohan Hedberg 		return true;
2218e3befab9SJohan Hedberg 
2219d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
2220d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
2221745c0ce3SVishal Agarwal 		return true;
2222d25e28abSJohan Hedberg 
2223d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
2224d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
2225745c0ce3SVishal Agarwal 		return true;
2226d25e28abSJohan Hedberg 
2227d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
2228d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
2229745c0ce3SVishal Agarwal 		return true;
2230d25e28abSJohan Hedberg 
2231d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
2232d25e28abSJohan Hedberg 	 * persistently */
2233745c0ce3SVishal Agarwal 	return false;
2234d25e28abSJohan Hedberg }
2235d25e28abSJohan Hedberg 
2236e804d25dSJohan Hedberg static u8 ltk_role(u8 type)
223798a0b845SJohan Hedberg {
2238e804d25dSJohan Hedberg 	if (type == SMP_LTK)
2239e804d25dSJohan Hedberg 		return HCI_ROLE_MASTER;
224098a0b845SJohan Hedberg 
2241e804d25dSJohan Hedberg 	return HCI_ROLE_SLAVE;
224298a0b845SJohan Hedberg }
224398a0b845SJohan Hedberg 
2244f3a73d97SJohan Hedberg struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
2245e804d25dSJohan Hedberg 			     u8 addr_type, u8 role)
224675d262c2SVinicius Costa Gomes {
2247c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
224875d262c2SVinicius Costa Gomes 
2249970d0f1bSJohan Hedberg 	rcu_read_lock();
2250970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
22515378bc56SJohan Hedberg 		if (addr_type != k->bdaddr_type || bacmp(bdaddr, &k->bdaddr))
22525378bc56SJohan Hedberg 			continue;
22535378bc56SJohan Hedberg 
2254923e2414SJohan Hedberg 		if (smp_ltk_is_sc(k) || ltk_role(k->type) == role) {
2255970d0f1bSJohan Hedberg 			rcu_read_unlock();
225675d262c2SVinicius Costa Gomes 			return k;
2257970d0f1bSJohan Hedberg 		}
2258970d0f1bSJohan Hedberg 	}
2259970d0f1bSJohan Hedberg 	rcu_read_unlock();
226075d262c2SVinicius Costa Gomes 
226175d262c2SVinicius Costa Gomes 	return NULL;
226275d262c2SVinicius Costa Gomes }
226375d262c2SVinicius Costa Gomes 
2264970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa)
2265970c4e46SJohan Hedberg {
2266970c4e46SJohan Hedberg 	struct smp_irk *irk;
2267970c4e46SJohan Hedberg 
2268adae20cbSJohan Hedberg 	rcu_read_lock();
2269adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2270adae20cbSJohan Hedberg 		if (!bacmp(&irk->rpa, rpa)) {
2271adae20cbSJohan Hedberg 			rcu_read_unlock();
2272970c4e46SJohan Hedberg 			return irk;
2273970c4e46SJohan Hedberg 		}
2274adae20cbSJohan Hedberg 	}
2275970c4e46SJohan Hedberg 
2276adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2277defce9e8SJohan Hedberg 		if (smp_irk_matches(hdev, irk->val, rpa)) {
2278970c4e46SJohan Hedberg 			bacpy(&irk->rpa, rpa);
2279adae20cbSJohan Hedberg 			rcu_read_unlock();
2280970c4e46SJohan Hedberg 			return irk;
2281970c4e46SJohan Hedberg 		}
2282970c4e46SJohan Hedberg 	}
2283adae20cbSJohan Hedberg 	rcu_read_unlock();
2284970c4e46SJohan Hedberg 
2285970c4e46SJohan Hedberg 	return NULL;
2286970c4e46SJohan Hedberg }
2287970c4e46SJohan Hedberg 
2288970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
2289970c4e46SJohan Hedberg 				     u8 addr_type)
2290970c4e46SJohan Hedberg {
2291970c4e46SJohan Hedberg 	struct smp_irk *irk;
2292970c4e46SJohan Hedberg 
22936cfc9988SJohan Hedberg 	/* Identity Address must be public or static random */
22946cfc9988SJohan Hedberg 	if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
22956cfc9988SJohan Hedberg 		return NULL;
22966cfc9988SJohan Hedberg 
2297adae20cbSJohan Hedberg 	rcu_read_lock();
2298adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
2299970c4e46SJohan Hedberg 		if (addr_type == irk->addr_type &&
2300adae20cbSJohan Hedberg 		    bacmp(bdaddr, &irk->bdaddr) == 0) {
2301adae20cbSJohan Hedberg 			rcu_read_unlock();
2302970c4e46SJohan Hedberg 			return irk;
2303970c4e46SJohan Hedberg 		}
2304adae20cbSJohan Hedberg 	}
2305adae20cbSJohan Hedberg 	rcu_read_unlock();
2306970c4e46SJohan Hedberg 
2307970c4e46SJohan Hedberg 	return NULL;
2308970c4e46SJohan Hedberg }
2309970c4e46SJohan Hedberg 
2310567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn,
23117652ff6aSJohan Hedberg 				  bdaddr_t *bdaddr, u8 *val, u8 type,
23127652ff6aSJohan Hedberg 				  u8 pin_len, bool *persistent)
231355ed8ca1SJohan Hedberg {
231455ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
2315745c0ce3SVishal Agarwal 	u8 old_key_type;
231655ed8ca1SJohan Hedberg 
231755ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
231855ed8ca1SJohan Hedberg 	if (old_key) {
231955ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
232055ed8ca1SJohan Hedberg 		key = old_key;
232155ed8ca1SJohan Hedberg 	} else {
232212adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
23230a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
232455ed8ca1SJohan Hedberg 		if (!key)
2325567fa2aaSJohan Hedberg 			return NULL;
23260378b597SJohan Hedberg 		list_add_rcu(&key->list, &hdev->link_keys);
232755ed8ca1SJohan Hedberg 	}
232855ed8ca1SJohan Hedberg 
23296ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
233055ed8ca1SJohan Hedberg 
2331d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
2332d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
2333d25e28abSJohan Hedberg 	 * previous key */
2334d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
2335a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
2336d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
2337655fe6ecSJohan Hedberg 		if (conn)
2338655fe6ecSJohan Hedberg 			conn->key_type = type;
2339655fe6ecSJohan Hedberg 	}
2340d25e28abSJohan Hedberg 
234155ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
23429b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
234355ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
234455ed8ca1SJohan Hedberg 
2345b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
234655ed8ca1SJohan Hedberg 		key->type = old_key_type;
23474748fed2SJohan Hedberg 	else
23484748fed2SJohan Hedberg 		key->type = type;
23494748fed2SJohan Hedberg 
23507652ff6aSJohan Hedberg 	if (persistent)
23517652ff6aSJohan Hedberg 		*persistent = hci_persistent_key(hdev, conn, type,
23527652ff6aSJohan Hedberg 						 old_key_type);
23534df378a1SJohan Hedberg 
2354567fa2aaSJohan Hedberg 	return key;
235555ed8ca1SJohan Hedberg }
235655ed8ca1SJohan Hedberg 
2357ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
235835d70271SJohan Hedberg 			    u8 addr_type, u8 type, u8 authenticated,
2359fe39c7b2SMarcel Holtmann 			    u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand)
236075d262c2SVinicius Costa Gomes {
2361c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
2362e804d25dSJohan Hedberg 	u8 role = ltk_role(type);
236375d262c2SVinicius Costa Gomes 
2364f3a73d97SJohan Hedberg 	old_key = hci_find_ltk(hdev, bdaddr, addr_type, role);
2365c9839a11SVinicius Costa Gomes 	if (old_key)
236675d262c2SVinicius Costa Gomes 		key = old_key;
2367c9839a11SVinicius Costa Gomes 	else {
23680a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
236975d262c2SVinicius Costa Gomes 		if (!key)
2370ca9142b8SJohan Hedberg 			return NULL;
2371970d0f1bSJohan Hedberg 		list_add_rcu(&key->list, &hdev->long_term_keys);
237275d262c2SVinicius Costa Gomes 	}
237375d262c2SVinicius Costa Gomes 
237475d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
2375c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
2376c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
2377c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
2378c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
2379fe39c7b2SMarcel Holtmann 	key->rand = rand;
2380c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
2381c9839a11SVinicius Costa Gomes 	key->type = type;
238275d262c2SVinicius Costa Gomes 
2383ca9142b8SJohan Hedberg 	return key;
238475d262c2SVinicius Costa Gomes }
238575d262c2SVinicius Costa Gomes 
2386ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
2387ca9142b8SJohan Hedberg 			    u8 addr_type, u8 val[16], bdaddr_t *rpa)
2388970c4e46SJohan Hedberg {
2389970c4e46SJohan Hedberg 	struct smp_irk *irk;
2390970c4e46SJohan Hedberg 
2391970c4e46SJohan Hedberg 	irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
2392970c4e46SJohan Hedberg 	if (!irk) {
2393970c4e46SJohan Hedberg 		irk = kzalloc(sizeof(*irk), GFP_KERNEL);
2394970c4e46SJohan Hedberg 		if (!irk)
2395ca9142b8SJohan Hedberg 			return NULL;
2396970c4e46SJohan Hedberg 
2397970c4e46SJohan Hedberg 		bacpy(&irk->bdaddr, bdaddr);
2398970c4e46SJohan Hedberg 		irk->addr_type = addr_type;
2399970c4e46SJohan Hedberg 
2400adae20cbSJohan Hedberg 		list_add_rcu(&irk->list, &hdev->identity_resolving_keys);
2401970c4e46SJohan Hedberg 	}
2402970c4e46SJohan Hedberg 
2403970c4e46SJohan Hedberg 	memcpy(irk->val, val, 16);
2404970c4e46SJohan Hedberg 	bacpy(&irk->rpa, rpa);
2405970c4e46SJohan Hedberg 
2406ca9142b8SJohan Hedberg 	return irk;
2407970c4e46SJohan Hedberg }
2408970c4e46SJohan Hedberg 
240955ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
241055ed8ca1SJohan Hedberg {
241155ed8ca1SJohan Hedberg 	struct link_key *key;
241255ed8ca1SJohan Hedberg 
241355ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
241455ed8ca1SJohan Hedberg 	if (!key)
241555ed8ca1SJohan Hedberg 		return -ENOENT;
241655ed8ca1SJohan Hedberg 
24176ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
241855ed8ca1SJohan Hedberg 
24190378b597SJohan Hedberg 	list_del_rcu(&key->list);
24200378b597SJohan Hedberg 	kfree_rcu(key, rcu);
242155ed8ca1SJohan Hedberg 
242255ed8ca1SJohan Hedberg 	return 0;
242355ed8ca1SJohan Hedberg }
242455ed8ca1SJohan Hedberg 
2425e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
2426b899efafSVinicius Costa Gomes {
2427970d0f1bSJohan Hedberg 	struct smp_ltk *k;
2428c51ffa0bSJohan Hedberg 	int removed = 0;
2429b899efafSVinicius Costa Gomes 
2430970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
2431e0b2b27eSJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
2432b899efafSVinicius Costa Gomes 			continue;
2433b899efafSVinicius Costa Gomes 
24346ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
2435b899efafSVinicius Costa Gomes 
2436970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
2437970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
2438c51ffa0bSJohan Hedberg 		removed++;
2439b899efafSVinicius Costa Gomes 	}
2440b899efafSVinicius Costa Gomes 
2441c51ffa0bSJohan Hedberg 	return removed ? 0 : -ENOENT;
2442b899efafSVinicius Costa Gomes }
2443b899efafSVinicius Costa Gomes 
2444a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
2445a7ec7338SJohan Hedberg {
2446adae20cbSJohan Hedberg 	struct smp_irk *k;
2447a7ec7338SJohan Hedberg 
2448adae20cbSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
2449a7ec7338SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
2450a7ec7338SJohan Hedberg 			continue;
2451a7ec7338SJohan Hedberg 
2452a7ec7338SJohan Hedberg 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
2453a7ec7338SJohan Hedberg 
2454adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
2455adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
2456a7ec7338SJohan Hedberg 	}
2457a7ec7338SJohan Hedberg }
2458a7ec7338SJohan Hedberg 
24596bd32326SVille Tervo /* HCI command timer function */
246065cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work)
24616bd32326SVille Tervo {
246265cc2b49SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev,
246365cc2b49SMarcel Holtmann 					    cmd_timer.work);
24646bd32326SVille Tervo 
2465bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
2466bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
2467bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
2468bda4f23aSAndrei Emeltchenko 
2469bda4f23aSAndrei Emeltchenko 		BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
2470bda4f23aSAndrei Emeltchenko 	} else {
24716bd32326SVille Tervo 		BT_ERR("%s command tx timeout", hdev->name);
2472bda4f23aSAndrei Emeltchenko 	}
2473bda4f23aSAndrei Emeltchenko 
24746bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
2475c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
24766bd32326SVille Tervo }
24776bd32326SVille Tervo 
24782763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
24796928a924SJohan Hedberg 					  bdaddr_t *bdaddr, u8 bdaddr_type)
24802763eda6SSzymon Janc {
24812763eda6SSzymon Janc 	struct oob_data *data;
24822763eda6SSzymon Janc 
24836928a924SJohan Hedberg 	list_for_each_entry(data, &hdev->remote_oob_data, list) {
24846928a924SJohan Hedberg 		if (bacmp(bdaddr, &data->bdaddr) != 0)
24856928a924SJohan Hedberg 			continue;
24866928a924SJohan Hedberg 		if (data->bdaddr_type != bdaddr_type)
24876928a924SJohan Hedberg 			continue;
24882763eda6SSzymon Janc 		return data;
24896928a924SJohan Hedberg 	}
24902763eda6SSzymon Janc 
24912763eda6SSzymon Janc 	return NULL;
24922763eda6SSzymon Janc }
24932763eda6SSzymon Janc 
24946928a924SJohan Hedberg int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
24956928a924SJohan Hedberg 			       u8 bdaddr_type)
24962763eda6SSzymon Janc {
24972763eda6SSzymon Janc 	struct oob_data *data;
24982763eda6SSzymon Janc 
24996928a924SJohan Hedberg 	data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type);
25002763eda6SSzymon Janc 	if (!data)
25012763eda6SSzymon Janc 		return -ENOENT;
25022763eda6SSzymon Janc 
25036928a924SJohan Hedberg 	BT_DBG("%s removing %pMR (%u)", hdev->name, bdaddr, bdaddr_type);
25042763eda6SSzymon Janc 
25052763eda6SSzymon Janc 	list_del(&data->list);
25062763eda6SSzymon Janc 	kfree(data);
25072763eda6SSzymon Janc 
25082763eda6SSzymon Janc 	return 0;
25092763eda6SSzymon Janc }
25102763eda6SSzymon Janc 
251135f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev)
25122763eda6SSzymon Janc {
25132763eda6SSzymon Janc 	struct oob_data *data, *n;
25142763eda6SSzymon Janc 
25152763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
25162763eda6SSzymon Janc 		list_del(&data->list);
25172763eda6SSzymon Janc 		kfree(data);
25182763eda6SSzymon Janc 	}
25192763eda6SSzymon Janc }
25202763eda6SSzymon Janc 
25210798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
25226928a924SJohan Hedberg 			    u8 bdaddr_type, u8 *hash192, u8 *rand192,
252338da1703SJohan Hedberg 			    u8 *hash256, u8 *rand256)
25240798872eSMarcel Holtmann {
25250798872eSMarcel Holtmann 	struct oob_data *data;
25260798872eSMarcel Holtmann 
25276928a924SJohan Hedberg 	data = hci_find_remote_oob_data(hdev, bdaddr, bdaddr_type);
25280798872eSMarcel Holtmann 	if (!data) {
25290a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
25300798872eSMarcel Holtmann 		if (!data)
25310798872eSMarcel Holtmann 			return -ENOMEM;
25320798872eSMarcel Holtmann 
25330798872eSMarcel Holtmann 		bacpy(&data->bdaddr, bdaddr);
25346928a924SJohan Hedberg 		data->bdaddr_type = bdaddr_type;
25350798872eSMarcel Holtmann 		list_add(&data->list, &hdev->remote_oob_data);
25360798872eSMarcel Holtmann 	}
25370798872eSMarcel Holtmann 
253881328d5cSJohan Hedberg 	if (hash192 && rand192) {
25390798872eSMarcel Holtmann 		memcpy(data->hash192, hash192, sizeof(data->hash192));
254038da1703SJohan Hedberg 		memcpy(data->rand192, rand192, sizeof(data->rand192));
254181328d5cSJohan Hedberg 	} else {
254281328d5cSJohan Hedberg 		memset(data->hash192, 0, sizeof(data->hash192));
254381328d5cSJohan Hedberg 		memset(data->rand192, 0, sizeof(data->rand192));
254481328d5cSJohan Hedberg 	}
25450798872eSMarcel Holtmann 
254681328d5cSJohan Hedberg 	if (hash256 && rand256) {
25470798872eSMarcel Holtmann 		memcpy(data->hash256, hash256, sizeof(data->hash256));
254838da1703SJohan Hedberg 		memcpy(data->rand256, rand256, sizeof(data->rand256));
254981328d5cSJohan Hedberg 	} else {
255081328d5cSJohan Hedberg 		memset(data->hash256, 0, sizeof(data->hash256));
255181328d5cSJohan Hedberg 		memset(data->rand256, 0, sizeof(data->rand256));
255281328d5cSJohan Hedberg 	}
25530798872eSMarcel Holtmann 
25546ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
25552763eda6SSzymon Janc 
25562763eda6SSzymon Janc 	return 0;
25572763eda6SSzymon Janc }
25582763eda6SSzymon Janc 
2559dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list,
2560b9ee0a78SMarcel Holtmann 					 bdaddr_t *bdaddr, u8 type)
2561b2a66aadSAntti Julku {
2562b2a66aadSAntti Julku 	struct bdaddr_list *b;
2563b2a66aadSAntti Julku 
2564dcc36c16SJohan Hedberg 	list_for_each_entry(b, bdaddr_list, list) {
2565b9ee0a78SMarcel Holtmann 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
2566b2a66aadSAntti Julku 			return b;
2567b9ee0a78SMarcel Holtmann 	}
2568b2a66aadSAntti Julku 
2569b2a66aadSAntti Julku 	return NULL;
2570b2a66aadSAntti Julku }
2571b2a66aadSAntti Julku 
2572dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list)
2573b2a66aadSAntti Julku {
2574b2a66aadSAntti Julku 	struct list_head *p, *n;
2575b2a66aadSAntti Julku 
2576dcc36c16SJohan Hedberg 	list_for_each_safe(p, n, bdaddr_list) {
2577b9ee0a78SMarcel Holtmann 		struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
2578b2a66aadSAntti Julku 
2579b2a66aadSAntti Julku 		list_del(p);
2580b2a66aadSAntti Julku 		kfree(b);
2581b2a66aadSAntti Julku 	}
2582b2a66aadSAntti Julku }
2583b2a66aadSAntti Julku 
2584dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type)
2585b2a66aadSAntti Julku {
2586b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2587b2a66aadSAntti Julku 
2588b9ee0a78SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
2589b2a66aadSAntti Julku 		return -EBADF;
2590b2a66aadSAntti Julku 
2591dcc36c16SJohan Hedberg 	if (hci_bdaddr_list_lookup(list, bdaddr, type))
25925e762444SAntti Julku 		return -EEXIST;
2593b2a66aadSAntti Julku 
259427f70f3eSJohan Hedberg 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
25955e762444SAntti Julku 	if (!entry)
25965e762444SAntti Julku 		return -ENOMEM;
2597b2a66aadSAntti Julku 
2598b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
2599b9ee0a78SMarcel Holtmann 	entry->bdaddr_type = type;
2600b2a66aadSAntti Julku 
2601dcc36c16SJohan Hedberg 	list_add(&entry->list, list);
2602b2a66aadSAntti Julku 
26032a8357f2SJohan Hedberg 	return 0;
2604b2a66aadSAntti Julku }
2605b2a66aadSAntti Julku 
2606dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type)
2607b2a66aadSAntti Julku {
2608b2a66aadSAntti Julku 	struct bdaddr_list *entry;
2609b2a66aadSAntti Julku 
261035f7498aSJohan Hedberg 	if (!bacmp(bdaddr, BDADDR_ANY)) {
2611dcc36c16SJohan Hedberg 		hci_bdaddr_list_clear(list);
261235f7498aSJohan Hedberg 		return 0;
261335f7498aSJohan Hedberg 	}
2614b2a66aadSAntti Julku 
2615dcc36c16SJohan Hedberg 	entry = hci_bdaddr_list_lookup(list, bdaddr, type);
2616d2ab0ac1SMarcel Holtmann 	if (!entry)
2617d2ab0ac1SMarcel Holtmann 		return -ENOENT;
2618d2ab0ac1SMarcel Holtmann 
2619d2ab0ac1SMarcel Holtmann 	list_del(&entry->list);
2620d2ab0ac1SMarcel Holtmann 	kfree(entry);
2621d2ab0ac1SMarcel Holtmann 
2622d2ab0ac1SMarcel Holtmann 	return 0;
2623d2ab0ac1SMarcel Holtmann }
2624d2ab0ac1SMarcel Holtmann 
262515819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
262615819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
262715819a70SAndre Guedes 					       bdaddr_t *addr, u8 addr_type)
262815819a70SAndre Guedes {
262915819a70SAndre Guedes 	struct hci_conn_params *params;
263015819a70SAndre Guedes 
2631738f6185SJohan Hedberg 	/* The conn params list only contains identity addresses */
2632738f6185SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
2633738f6185SJohan Hedberg 		return NULL;
2634738f6185SJohan Hedberg 
263515819a70SAndre Guedes 	list_for_each_entry(params, &hdev->le_conn_params, list) {
263615819a70SAndre Guedes 		if (bacmp(&params->addr, addr) == 0 &&
263715819a70SAndre Guedes 		    params->addr_type == addr_type) {
263815819a70SAndre Guedes 			return params;
263915819a70SAndre Guedes 		}
264015819a70SAndre Guedes 	}
264115819a70SAndre Guedes 
264215819a70SAndre Guedes 	return NULL;
264315819a70SAndre Guedes }
264415819a70SAndre Guedes 
264515819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
2646501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
26474b10966fSMarcel Holtmann 						  bdaddr_t *addr, u8 addr_type)
264815819a70SAndre Guedes {
2649912b42efSJohan Hedberg 	struct hci_conn_params *param;
265015819a70SAndre Guedes 
2651738f6185SJohan Hedberg 	/* The list only contains identity addresses */
2652738f6185SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
2653738f6185SJohan Hedberg 		return NULL;
265415819a70SAndre Guedes 
2655501f8827SJohan Hedberg 	list_for_each_entry(param, list, action) {
2656912b42efSJohan Hedberg 		if (bacmp(&param->addr, addr) == 0 &&
2657912b42efSJohan Hedberg 		    param->addr_type == addr_type)
2658912b42efSJohan Hedberg 			return param;
26594b10966fSMarcel Holtmann 	}
26604b10966fSMarcel Holtmann 
26614b10966fSMarcel Holtmann 	return NULL;
266215819a70SAndre Guedes }
266315819a70SAndre Guedes 
266415819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
266551d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
266651d167c0SMarcel Holtmann 					    bdaddr_t *addr, u8 addr_type)
266715819a70SAndre Guedes {
266815819a70SAndre Guedes 	struct hci_conn_params *params;
266915819a70SAndre Guedes 
2670c46245b3SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
267151d167c0SMarcel Holtmann 		return NULL;
2672a9b0a04cSAndre Guedes 
267315819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
2674cef952ceSAndre Guedes 	if (params)
267551d167c0SMarcel Holtmann 		return params;
267615819a70SAndre Guedes 
267715819a70SAndre Guedes 	params = kzalloc(sizeof(*params), GFP_KERNEL);
267815819a70SAndre Guedes 	if (!params) {
267915819a70SAndre Guedes 		BT_ERR("Out of memory");
268051d167c0SMarcel Holtmann 		return NULL;
268115819a70SAndre Guedes 	}
268215819a70SAndre Guedes 
268315819a70SAndre Guedes 	bacpy(&params->addr, addr);
268415819a70SAndre Guedes 	params->addr_type = addr_type;
2685cef952ceSAndre Guedes 
2686cef952ceSAndre Guedes 	list_add(&params->list, &hdev->le_conn_params);
268793450c75SJohan Hedberg 	INIT_LIST_HEAD(&params->action);
2688cef952ceSAndre Guedes 
2689bf5b3c8bSMarcel Holtmann 	params->conn_min_interval = hdev->le_conn_min_interval;
2690bf5b3c8bSMarcel Holtmann 	params->conn_max_interval = hdev->le_conn_max_interval;
2691bf5b3c8bSMarcel Holtmann 	params->conn_latency = hdev->le_conn_latency;
2692bf5b3c8bSMarcel Holtmann 	params->supervision_timeout = hdev->le_supv_timeout;
2693bf5b3c8bSMarcel Holtmann 	params->auto_connect = HCI_AUTO_CONN_DISABLED;
2694bf5b3c8bSMarcel Holtmann 
2695bf5b3c8bSMarcel Holtmann 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
2696bf5b3c8bSMarcel Holtmann 
269751d167c0SMarcel Holtmann 	return params;
2698bf5b3c8bSMarcel Holtmann }
2699bf5b3c8bSMarcel Holtmann 
2700f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params)
2701f6c63249SJohan Hedberg {
2702f6c63249SJohan Hedberg 	if (params->conn) {
2703f6c63249SJohan Hedberg 		hci_conn_drop(params->conn);
2704f6c63249SJohan Hedberg 		hci_conn_put(params->conn);
2705f6c63249SJohan Hedberg 	}
2706f6c63249SJohan Hedberg 
2707f6c63249SJohan Hedberg 	list_del(&params->action);
2708f6c63249SJohan Hedberg 	list_del(&params->list);
2709f6c63249SJohan Hedberg 	kfree(params);
2710f6c63249SJohan Hedberg }
2711f6c63249SJohan Hedberg 
271215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
271315819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
271415819a70SAndre Guedes {
271515819a70SAndre Guedes 	struct hci_conn_params *params;
271615819a70SAndre Guedes 
271715819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
271815819a70SAndre Guedes 	if (!params)
271915819a70SAndre Guedes 		return;
272015819a70SAndre Guedes 
2721f6c63249SJohan Hedberg 	hci_conn_params_free(params);
272215819a70SAndre Guedes 
272395305baaSJohan Hedberg 	hci_update_background_scan(hdev);
272495305baaSJohan Hedberg 
272515819a70SAndre Guedes 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
272615819a70SAndre Guedes }
272715819a70SAndre Guedes 
272815819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
272955af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev)
273015819a70SAndre Guedes {
273115819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
273215819a70SAndre Guedes 
273315819a70SAndre Guedes 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
273455af49a8SJohan Hedberg 		if (params->auto_connect != HCI_AUTO_CONN_DISABLED)
273555af49a8SJohan Hedberg 			continue;
273615819a70SAndre Guedes 		list_del(&params->list);
273715819a70SAndre Guedes 		kfree(params);
273815819a70SAndre Guedes 	}
273915819a70SAndre Guedes 
274055af49a8SJohan Hedberg 	BT_DBG("All LE disabled connection parameters were removed");
274155af49a8SJohan Hedberg }
274255af49a8SJohan Hedberg 
274355af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */
2744373110c5SJohan Hedberg void hci_conn_params_clear_all(struct hci_dev *hdev)
274515819a70SAndre Guedes {
274615819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
274715819a70SAndre Guedes 
2748f6c63249SJohan Hedberg 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list)
2749f6c63249SJohan Hedberg 		hci_conn_params_free(params);
275015819a70SAndre Guedes 
2751a2f41a8fSJohan Hedberg 	hci_update_background_scan(hdev);
27521089b67dSMarcel Holtmann 
275315819a70SAndre Guedes 	BT_DBG("All LE connection parameters were removed");
275415819a70SAndre Guedes }
275515819a70SAndre Guedes 
27564c87eaabSAndre Guedes static void inquiry_complete(struct hci_dev *hdev, u8 status)
27577ba8b4beSAndre Guedes {
27584c87eaabSAndre Guedes 	if (status) {
27594c87eaabSAndre Guedes 		BT_ERR("Failed to start inquiry: status %d", status);
27607ba8b4beSAndre Guedes 
27614c87eaabSAndre Guedes 		hci_dev_lock(hdev);
27624c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
27634c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
27644c87eaabSAndre Guedes 		return;
27654c87eaabSAndre Guedes 	}
27667ba8b4beSAndre Guedes }
27677ba8b4beSAndre Guedes 
27684c87eaabSAndre Guedes static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
27697ba8b4beSAndre Guedes {
27704c87eaabSAndre Guedes 	/* General inquiry access code (GIAC) */
27714c87eaabSAndre Guedes 	u8 lap[3] = { 0x33, 0x8b, 0x9e };
27724c87eaabSAndre Guedes 	struct hci_request req;
27734c87eaabSAndre Guedes 	struct hci_cp_inquiry cp;
27747ba8b4beSAndre Guedes 	int err;
27757ba8b4beSAndre Guedes 
27764c87eaabSAndre Guedes 	if (status) {
27774c87eaabSAndre Guedes 		BT_ERR("Failed to disable LE scanning: status %d", status);
27784c87eaabSAndre Guedes 		return;
27797ba8b4beSAndre Guedes 	}
27807ba8b4beSAndre Guedes 
27814c87eaabSAndre Guedes 	switch (hdev->discovery.type) {
27824c87eaabSAndre Guedes 	case DISCOV_TYPE_LE:
27834c87eaabSAndre Guedes 		hci_dev_lock(hdev);
27844c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
27854c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
27864c87eaabSAndre Guedes 		break;
27877dbfac1dSAndre Guedes 
27884c87eaabSAndre Guedes 	case DISCOV_TYPE_INTERLEAVED:
27894c87eaabSAndre Guedes 		hci_req_init(&req, hdev);
27907dbfac1dSAndre Guedes 
27917dbfac1dSAndre Guedes 		memset(&cp, 0, sizeof(cp));
27924c87eaabSAndre Guedes 		memcpy(&cp.lap, lap, sizeof(cp.lap));
27934c87eaabSAndre Guedes 		cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
27944c87eaabSAndre Guedes 		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
27954c87eaabSAndre Guedes 
27964c87eaabSAndre Guedes 		hci_dev_lock(hdev);
27974c87eaabSAndre Guedes 
27984c87eaabSAndre Guedes 		hci_inquiry_cache_flush(hdev);
27994c87eaabSAndre Guedes 
28004c87eaabSAndre Guedes 		err = hci_req_run(&req, inquiry_complete);
28014c87eaabSAndre Guedes 		if (err) {
28024c87eaabSAndre Guedes 			BT_ERR("Inquiry request failed: err %d", err);
28034c87eaabSAndre Guedes 			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
28047dbfac1dSAndre Guedes 		}
28057dbfac1dSAndre Guedes 
28064c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
28074c87eaabSAndre Guedes 		break;
28084c87eaabSAndre Guedes 	}
28097dbfac1dSAndre Guedes }
28107dbfac1dSAndre Guedes 
28117ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work)
28127ba8b4beSAndre Guedes {
28137ba8b4beSAndre Guedes 	struct hci_dev *hdev = container_of(work, struct hci_dev,
28147ba8b4beSAndre Guedes 					    le_scan_disable.work);
28154c87eaabSAndre Guedes 	struct hci_request req;
28164c87eaabSAndre Guedes 	int err;
28177ba8b4beSAndre Guedes 
28187ba8b4beSAndre Guedes 	BT_DBG("%s", hdev->name);
28197ba8b4beSAndre Guedes 
28204c87eaabSAndre Guedes 	hci_req_init(&req, hdev);
28217ba8b4beSAndre Guedes 
2822b1efcc28SAndre Guedes 	hci_req_add_le_scan_disable(&req);
28237ba8b4beSAndre Guedes 
28244c87eaabSAndre Guedes 	err = hci_req_run(&req, le_scan_disable_work_complete);
28254c87eaabSAndre Guedes 	if (err)
28264c87eaabSAndre Guedes 		BT_ERR("Disable LE scanning request failed: err %d", err);
282728b75a89SAndre Guedes }
282828b75a89SAndre Guedes 
2829a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller.
2830a1f4c318SJohan Hedberg  *
2831a1f4c318SJohan Hedberg  * If the controller has a public BD_ADDR, then by default use that one.
2832a1f4c318SJohan Hedberg  * If this is a LE only controller without a public address, default to
2833a1f4c318SJohan Hedberg  * the static random address.
2834a1f4c318SJohan Hedberg  *
2835a1f4c318SJohan Hedberg  * For debugging purposes it is possible to force controllers with a
2836a1f4c318SJohan Hedberg  * public address to use the static random address instead.
283750b5b952SMarcel Holtmann  *
283850b5b952SMarcel Holtmann  * In case BR/EDR has been disabled on a dual-mode controller and
283950b5b952SMarcel Holtmann  * userspace has configured a static address, then that address
284050b5b952SMarcel Holtmann  * becomes the identity address instead of the public BR/EDR address.
2841a1f4c318SJohan Hedberg  */
2842a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
2843a1f4c318SJohan Hedberg 			       u8 *bdaddr_type)
2844a1f4c318SJohan Hedberg {
2845111902f7SMarcel Holtmann 	if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
284650b5b952SMarcel Holtmann 	    !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
284750b5b952SMarcel Holtmann 	    (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
284850b5b952SMarcel Holtmann 	     bacmp(&hdev->static_addr, BDADDR_ANY))) {
2849a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->static_addr);
2850a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_RANDOM;
2851a1f4c318SJohan Hedberg 	} else {
2852a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->bdaddr);
2853a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_PUBLIC;
2854a1f4c318SJohan Hedberg 	}
2855a1f4c318SJohan Hedberg }
2856a1f4c318SJohan Hedberg 
28579be0dab7SDavid Herrmann /* Alloc HCI device */
28589be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
28599be0dab7SDavid Herrmann {
28609be0dab7SDavid Herrmann 	struct hci_dev *hdev;
28619be0dab7SDavid Herrmann 
286227f70f3eSJohan Hedberg 	hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
28639be0dab7SDavid Herrmann 	if (!hdev)
28649be0dab7SDavid Herrmann 		return NULL;
28659be0dab7SDavid Herrmann 
2866b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
2867b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
2868b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
2869b4cb9fb2SMarcel Holtmann 	hdev->num_iac = 0x01;		/* One IAC support is mandatory */
2870b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03;	/* No Input No Output */
287196c2103aSMarcel Holtmann 	hdev->manufacturer = 0xffff;	/* Default to internal use */
2872bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
2873bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
2874b1b813d4SDavid Herrmann 
2875b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
2876b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
2877b1b813d4SDavid Herrmann 
28783f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = 0x07;
2879628531c9SGeorg Lukas 	hdev->le_adv_min_interval = 0x0800;
2880628531c9SGeorg Lukas 	hdev->le_adv_max_interval = 0x0800;
2881bef64738SMarcel Holtmann 	hdev->le_scan_interval = 0x0060;
2882bef64738SMarcel Holtmann 	hdev->le_scan_window = 0x0030;
28834e70c7e7SMarcel Holtmann 	hdev->le_conn_min_interval = 0x0028;
28844e70c7e7SMarcel Holtmann 	hdev->le_conn_max_interval = 0x0038;
288504fb7d90SMarcel Holtmann 	hdev->le_conn_latency = 0x0000;
288604fb7d90SMarcel Holtmann 	hdev->le_supv_timeout = 0x002a;
2887a8e1bfaaSMarcel Holtmann 	hdev->le_def_tx_len = 0x001b;
2888a8e1bfaaSMarcel Holtmann 	hdev->le_def_tx_time = 0x0148;
2889a8e1bfaaSMarcel Holtmann 	hdev->le_max_tx_len = 0x001b;
2890a8e1bfaaSMarcel Holtmann 	hdev->le_max_tx_time = 0x0148;
2891a8e1bfaaSMarcel Holtmann 	hdev->le_max_rx_len = 0x001b;
2892a8e1bfaaSMarcel Holtmann 	hdev->le_max_rx_time = 0x0148;
2893bef64738SMarcel Holtmann 
2894d6bfd59cSJohan Hedberg 	hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
2895b9a7a61eSLukasz Rymanowski 	hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;
289631ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE;
289731ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE;
2898d6bfd59cSJohan Hedberg 
2899b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
2900b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
2901b1b813d4SDavid Herrmann 
2902b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
2903b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
29046659358eSJohan Hedberg 	INIT_LIST_HEAD(&hdev->whitelist);
2905b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
2906b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
2907b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
2908970c4e46SJohan Hedberg 	INIT_LIST_HEAD(&hdev->identity_resolving_keys);
2909b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
2910d2ab0ac1SMarcel Holtmann 	INIT_LIST_HEAD(&hdev->le_white_list);
291115819a70SAndre Guedes 	INIT_LIST_HEAD(&hdev->le_conn_params);
291277a77a30SAndre Guedes 	INIT_LIST_HEAD(&hdev->pend_le_conns);
291366f8455aSJohan Hedberg 	INIT_LIST_HEAD(&hdev->pend_le_reports);
29146b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
2915b1b813d4SDavid Herrmann 
2916b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
2917b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
2918b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
2919b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
2920b1b813d4SDavid Herrmann 
2921b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
2922b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
2923b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
2924b1b813d4SDavid Herrmann 
2925b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
2926b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
2927b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
2928b1b813d4SDavid Herrmann 
2929b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
2930b1b813d4SDavid Herrmann 
293165cc2b49SMarcel Holtmann 	INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout);
2932b1b813d4SDavid Herrmann 
2933b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
2934b1b813d4SDavid Herrmann 	discovery_init(hdev);
29359be0dab7SDavid Herrmann 
29369be0dab7SDavid Herrmann 	return hdev;
29379be0dab7SDavid Herrmann }
29389be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
29399be0dab7SDavid Herrmann 
29409be0dab7SDavid Herrmann /* Free HCI device */
29419be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
29429be0dab7SDavid Herrmann {
29439be0dab7SDavid Herrmann 	/* will free via device release */
29449be0dab7SDavid Herrmann 	put_device(&hdev->dev);
29459be0dab7SDavid Herrmann }
29469be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
29479be0dab7SDavid Herrmann 
29481da177e4SLinus Torvalds /* Register HCI device */
29491da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
29501da177e4SLinus Torvalds {
2951b1b813d4SDavid Herrmann 	int id, error;
29521da177e4SLinus Torvalds 
295374292d5aSMarcel Holtmann 	if (!hdev->open || !hdev->close || !hdev->send)
29541da177e4SLinus Torvalds 		return -EINVAL;
29551da177e4SLinus Torvalds 
295608add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
295708add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
295808add513SMat Martineau 	 */
29593df92b31SSasha Levin 	switch (hdev->dev_type) {
29603df92b31SSasha Levin 	case HCI_BREDR:
29613df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
29621da177e4SLinus Torvalds 		break;
29633df92b31SSasha Levin 	case HCI_AMP:
29643df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
29653df92b31SSasha Levin 		break;
29663df92b31SSasha Levin 	default:
29673df92b31SSasha Levin 		return -EINVAL;
29681da177e4SLinus Torvalds 	}
29691da177e4SLinus Torvalds 
29703df92b31SSasha Levin 	if (id < 0)
29713df92b31SSasha Levin 		return id;
29723df92b31SSasha Levin 
29731da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
29741da177e4SLinus Torvalds 	hdev->id = id;
29752d8b3a11SAndrei Emeltchenko 
29762d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
29772d8b3a11SAndrei Emeltchenko 
2978d8537548SKees Cook 	hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2979d8537548SKees Cook 					  WQ_MEM_RECLAIM, 1, hdev->name);
298033ca954dSDavid Herrmann 	if (!hdev->workqueue) {
298133ca954dSDavid Herrmann 		error = -ENOMEM;
298233ca954dSDavid Herrmann 		goto err;
298333ca954dSDavid Herrmann 	}
2984f48fd9c8SMarcel Holtmann 
2985d8537548SKees Cook 	hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
2986d8537548SKees Cook 					      WQ_MEM_RECLAIM, 1, hdev->name);
29876ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
29886ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
29896ead1bbcSJohan Hedberg 		error = -ENOMEM;
29906ead1bbcSJohan Hedberg 		goto err;
29916ead1bbcSJohan Hedberg 	}
29926ead1bbcSJohan Hedberg 
29930153e2ecSMarcel Holtmann 	if (!IS_ERR_OR_NULL(bt_debugfs))
29940153e2ecSMarcel Holtmann 		hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
29950153e2ecSMarcel Holtmann 
2996bdc3e0f1SMarcel Holtmann 	dev_set_name(&hdev->dev, "%s", hdev->name);
2997bdc3e0f1SMarcel Holtmann 
2998bdc3e0f1SMarcel Holtmann 	error = device_add(&hdev->dev);
299933ca954dSDavid Herrmann 	if (error < 0)
300054506918SJohan Hedberg 		goto err_wqueue;
30011da177e4SLinus Torvalds 
3002611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
3003a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
3004a8c5fb1aSGustavo Padovan 				    hdev);
3005611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3006611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
3007611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
3008611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
3009611b30f7SMarcel Holtmann 		}
3010611b30f7SMarcel Holtmann 	}
3011611b30f7SMarcel Holtmann 
30125e130367SJohan Hedberg 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
30135e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
30145e130367SJohan Hedberg 
3015a8b2d5c2SJohan Hedberg 	set_bit(HCI_SETUP, &hdev->dev_flags);
3016004b0258SMarcel Holtmann 	set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
3017ce2be9acSAndrei Emeltchenko 
301801cd3404SMarcel Holtmann 	if (hdev->dev_type == HCI_BREDR) {
301956f87901SJohan Hedberg 		/* Assume BR/EDR support until proven otherwise (such as
302056f87901SJohan Hedberg 		 * through reading supported features during init.
302156f87901SJohan Hedberg 		 */
302256f87901SJohan Hedberg 		set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
302356f87901SJohan Hedberg 	}
3024ce2be9acSAndrei Emeltchenko 
3025fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
3026fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
3027fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
3028fcee3377SGustavo Padovan 
30294a964404SMarcel Holtmann 	/* Devices that are marked for raw-only usage are unconfigured
30304a964404SMarcel Holtmann 	 * and should not be included in normal operation.
3031fee746b0SMarcel Holtmann 	 */
3032fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
30334a964404SMarcel Holtmann 		set_bit(HCI_UNCONFIGURED, &hdev->dev_flags);
3034fee746b0SMarcel Holtmann 
30351da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_REG);
3036dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
30371da177e4SLinus Torvalds 
303819202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
3039fbe96d6fSMarcel Holtmann 
30401da177e4SLinus Torvalds 	return id;
3041f48fd9c8SMarcel Holtmann 
304233ca954dSDavid Herrmann err_wqueue:
304333ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
30446ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
304533ca954dSDavid Herrmann err:
30463df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
3047f48fd9c8SMarcel Holtmann 
304833ca954dSDavid Herrmann 	return error;
30491da177e4SLinus Torvalds }
30501da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
30511da177e4SLinus Torvalds 
30521da177e4SLinus Torvalds /* Unregister HCI device */
305359735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
30541da177e4SLinus Torvalds {
30553df92b31SSasha Levin 	int i, id;
3056ef222013SMarcel Holtmann 
3057c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
30581da177e4SLinus Torvalds 
305994324962SJohan Hovold 	set_bit(HCI_UNREGISTER, &hdev->dev_flags);
306094324962SJohan Hovold 
30613df92b31SSasha Levin 	id = hdev->id;
30623df92b31SSasha Levin 
3063f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
30641da177e4SLinus Torvalds 	list_del(&hdev->list);
3065f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
30661da177e4SLinus Torvalds 
30671da177e4SLinus Torvalds 	hci_dev_do_close(hdev);
30681da177e4SLinus Torvalds 
3069cd4c5391SSuraj Sumangala 	for (i = 0; i < NUM_REASSEMBLY; i++)
3070ef222013SMarcel Holtmann 		kfree_skb(hdev->reassembly[i]);
3071ef222013SMarcel Holtmann 
3072b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
3073b9b5ef18SGustavo Padovan 
3074ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
3075d603b76bSMarcel Holtmann 	    !test_bit(HCI_SETUP, &hdev->dev_flags) &&
3076d603b76bSMarcel Holtmann 	    !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
307709fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
3078744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
307909fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
308056e5cb86SJohan Hedberg 	}
3081ab81cbf9SJohan Hedberg 
30822e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
30832e58ef3eSJohan Hedberg 	 * pending list */
30842e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
30852e58ef3eSJohan Hedberg 
30861da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_UNREG);
30871da177e4SLinus Torvalds 
3088611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
3089611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
3090611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
3091611b30f7SMarcel Holtmann 	}
3092611b30f7SMarcel Holtmann 
3093711eafe3SJohan Hedberg 	smp_unregister(hdev);
309499780a7bSJohan Hedberg 
3095bdc3e0f1SMarcel Holtmann 	device_del(&hdev->dev);
3096147e2d59SDave Young 
30970153e2ecSMarcel Holtmann 	debugfs_remove_recursive(hdev->debugfs);
30980153e2ecSMarcel Holtmann 
3099f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
31006ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
3101f48fd9c8SMarcel Holtmann 
310209fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
3103dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->blacklist);
31046659358eSJohan Hedberg 	hci_bdaddr_list_clear(&hdev->whitelist);
31052aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
310655ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
3107b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
3108970c4e46SJohan Hedberg 	hci_smp_irks_clear(hdev);
31092763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
3110dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->le_white_list);
3111373110c5SJohan Hedberg 	hci_conn_params_clear_all(hdev);
311222078800SMarcel Holtmann 	hci_discovery_filter_clear(hdev);
311309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
3114e2e0cacbSJohan Hedberg 
3115dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
31163df92b31SSasha Levin 
31173df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
31181da177e4SLinus Torvalds }
31191da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
31201da177e4SLinus Torvalds 
31211da177e4SLinus Torvalds /* Suspend HCI device */
31221da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
31231da177e4SLinus Torvalds {
31241da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_SUSPEND);
31251da177e4SLinus Torvalds 	return 0;
31261da177e4SLinus Torvalds }
31271da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
31281da177e4SLinus Torvalds 
31291da177e4SLinus Torvalds /* Resume HCI device */
31301da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
31311da177e4SLinus Torvalds {
31321da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_RESUME);
31331da177e4SLinus Torvalds 	return 0;
31341da177e4SLinus Torvalds }
31351da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
31361da177e4SLinus Torvalds 
313775e0569fSMarcel Holtmann /* Reset HCI device */
313875e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev)
313975e0569fSMarcel Holtmann {
314075e0569fSMarcel Holtmann 	const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 };
314175e0569fSMarcel Holtmann 	struct sk_buff *skb;
314275e0569fSMarcel Holtmann 
314375e0569fSMarcel Holtmann 	skb = bt_skb_alloc(3, GFP_ATOMIC);
314475e0569fSMarcel Holtmann 	if (!skb)
314575e0569fSMarcel Holtmann 		return -ENOMEM;
314675e0569fSMarcel Holtmann 
314775e0569fSMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
314875e0569fSMarcel Holtmann 	memcpy(skb_put(skb, 3), hw_err, 3);
314975e0569fSMarcel Holtmann 
315075e0569fSMarcel Holtmann 	/* Send Hardware Error to upper stack */
315175e0569fSMarcel Holtmann 	return hci_recv_frame(hdev, skb);
315275e0569fSMarcel Holtmann }
315375e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev);
315475e0569fSMarcel Holtmann 
315576bca880SMarcel Holtmann /* Receive frame from HCI drivers */
3156e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
315776bca880SMarcel Holtmann {
315876bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
315976bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
316076bca880SMarcel Holtmann 		kfree_skb(skb);
316176bca880SMarcel Holtmann 		return -ENXIO;
316276bca880SMarcel Holtmann 	}
316376bca880SMarcel Holtmann 
3164d82603c6SJorrit Schippers 	/* Incoming skb */
316576bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
316676bca880SMarcel Holtmann 
316776bca880SMarcel Holtmann 	/* Time stamp */
316876bca880SMarcel Holtmann 	__net_timestamp(skb);
316976bca880SMarcel Holtmann 
317076bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
3171b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
3172c78ae283SMarcel Holtmann 
317376bca880SMarcel Holtmann 	return 0;
317476bca880SMarcel Holtmann }
317576bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
317676bca880SMarcel Holtmann 
317733e882a5SSuraj Sumangala static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
31781e429f38SGustavo F. Padovan 			  int count, __u8 index)
317933e882a5SSuraj Sumangala {
318033e882a5SSuraj Sumangala 	int len = 0;
318133e882a5SSuraj Sumangala 	int hlen = 0;
318233e882a5SSuraj Sumangala 	int remain = count;
318333e882a5SSuraj Sumangala 	struct sk_buff *skb;
318433e882a5SSuraj Sumangala 	struct bt_skb_cb *scb;
318533e882a5SSuraj Sumangala 
318633e882a5SSuraj Sumangala 	if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
318733e882a5SSuraj Sumangala 	    index >= NUM_REASSEMBLY)
318833e882a5SSuraj Sumangala 		return -EILSEQ;
318933e882a5SSuraj Sumangala 
319033e882a5SSuraj Sumangala 	skb = hdev->reassembly[index];
319133e882a5SSuraj Sumangala 
319233e882a5SSuraj Sumangala 	if (!skb) {
319333e882a5SSuraj Sumangala 		switch (type) {
319433e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
319533e882a5SSuraj Sumangala 			len = HCI_MAX_FRAME_SIZE;
319633e882a5SSuraj Sumangala 			hlen = HCI_ACL_HDR_SIZE;
319733e882a5SSuraj Sumangala 			break;
319833e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
319933e882a5SSuraj Sumangala 			len = HCI_MAX_EVENT_SIZE;
320033e882a5SSuraj Sumangala 			hlen = HCI_EVENT_HDR_SIZE;
320133e882a5SSuraj Sumangala 			break;
320233e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
320333e882a5SSuraj Sumangala 			len = HCI_MAX_SCO_SIZE;
320433e882a5SSuraj Sumangala 			hlen = HCI_SCO_HDR_SIZE;
320533e882a5SSuraj Sumangala 			break;
320633e882a5SSuraj Sumangala 		}
320733e882a5SSuraj Sumangala 
32081e429f38SGustavo F. Padovan 		skb = bt_skb_alloc(len, GFP_ATOMIC);
320933e882a5SSuraj Sumangala 		if (!skb)
321033e882a5SSuraj Sumangala 			return -ENOMEM;
321133e882a5SSuraj Sumangala 
321233e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
321333e882a5SSuraj Sumangala 		scb->expect = hlen;
321433e882a5SSuraj Sumangala 		scb->pkt_type = type;
321533e882a5SSuraj Sumangala 
321633e882a5SSuraj Sumangala 		hdev->reassembly[index] = skb;
321733e882a5SSuraj Sumangala 	}
321833e882a5SSuraj Sumangala 
321933e882a5SSuraj Sumangala 	while (count) {
322033e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
322189bb46d0SDan Carpenter 		len = min_t(uint, scb->expect, count);
322233e882a5SSuraj Sumangala 
322333e882a5SSuraj Sumangala 		memcpy(skb_put(skb, len), data, len);
322433e882a5SSuraj Sumangala 
322533e882a5SSuraj Sumangala 		count -= len;
322633e882a5SSuraj Sumangala 		data += len;
322733e882a5SSuraj Sumangala 		scb->expect -= len;
322833e882a5SSuraj Sumangala 		remain = count;
322933e882a5SSuraj Sumangala 
323033e882a5SSuraj Sumangala 		switch (type) {
323133e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
323233e882a5SSuraj Sumangala 			if (skb->len == HCI_EVENT_HDR_SIZE) {
323333e882a5SSuraj Sumangala 				struct hci_event_hdr *h = hci_event_hdr(skb);
323433e882a5SSuraj Sumangala 				scb->expect = h->plen;
323533e882a5SSuraj Sumangala 
323633e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
323733e882a5SSuraj Sumangala 					kfree_skb(skb);
323833e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
323933e882a5SSuraj Sumangala 					return -ENOMEM;
324033e882a5SSuraj Sumangala 				}
324133e882a5SSuraj Sumangala 			}
324233e882a5SSuraj Sumangala 			break;
324333e882a5SSuraj Sumangala 
324433e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
324533e882a5SSuraj Sumangala 			if (skb->len  == HCI_ACL_HDR_SIZE) {
324633e882a5SSuraj Sumangala 				struct hci_acl_hdr *h = hci_acl_hdr(skb);
324733e882a5SSuraj Sumangala 				scb->expect = __le16_to_cpu(h->dlen);
324833e882a5SSuraj Sumangala 
324933e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
325033e882a5SSuraj Sumangala 					kfree_skb(skb);
325133e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
325233e882a5SSuraj Sumangala 					return -ENOMEM;
325333e882a5SSuraj Sumangala 				}
325433e882a5SSuraj Sumangala 			}
325533e882a5SSuraj Sumangala 			break;
325633e882a5SSuraj Sumangala 
325733e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
325833e882a5SSuraj Sumangala 			if (skb->len == HCI_SCO_HDR_SIZE) {
325933e882a5SSuraj Sumangala 				struct hci_sco_hdr *h = hci_sco_hdr(skb);
326033e882a5SSuraj Sumangala 				scb->expect = h->dlen;
326133e882a5SSuraj Sumangala 
326233e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
326333e882a5SSuraj Sumangala 					kfree_skb(skb);
326433e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
326533e882a5SSuraj Sumangala 					return -ENOMEM;
326633e882a5SSuraj Sumangala 				}
326733e882a5SSuraj Sumangala 			}
326833e882a5SSuraj Sumangala 			break;
326933e882a5SSuraj Sumangala 		}
327033e882a5SSuraj Sumangala 
327133e882a5SSuraj Sumangala 		if (scb->expect == 0) {
327233e882a5SSuraj Sumangala 			/* Complete frame */
327333e882a5SSuraj Sumangala 
327433e882a5SSuraj Sumangala 			bt_cb(skb)->pkt_type = type;
3275e1a26170SMarcel Holtmann 			hci_recv_frame(hdev, skb);
327633e882a5SSuraj Sumangala 
327733e882a5SSuraj Sumangala 			hdev->reassembly[index] = NULL;
327833e882a5SSuraj Sumangala 			return remain;
327933e882a5SSuraj Sumangala 		}
328033e882a5SSuraj Sumangala 	}
328133e882a5SSuraj Sumangala 
328233e882a5SSuraj Sumangala 	return remain;
328333e882a5SSuraj Sumangala }
328433e882a5SSuraj Sumangala 
328599811510SSuraj Sumangala #define STREAM_REASSEMBLY 0
328699811510SSuraj Sumangala 
328799811510SSuraj Sumangala int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
328899811510SSuraj Sumangala {
328999811510SSuraj Sumangala 	int type;
329099811510SSuraj Sumangala 	int rem = 0;
329199811510SSuraj Sumangala 
3292da5f6c37SGustavo F. Padovan 	while (count) {
329399811510SSuraj Sumangala 		struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
329499811510SSuraj Sumangala 
329599811510SSuraj Sumangala 		if (!skb) {
329699811510SSuraj Sumangala 			struct { char type; } *pkt;
329799811510SSuraj Sumangala 
329899811510SSuraj Sumangala 			/* Start of the frame */
329999811510SSuraj Sumangala 			pkt = data;
330099811510SSuraj Sumangala 			type = pkt->type;
330199811510SSuraj Sumangala 
330299811510SSuraj Sumangala 			data++;
330399811510SSuraj Sumangala 			count--;
330499811510SSuraj Sumangala 		} else
330599811510SSuraj Sumangala 			type = bt_cb(skb)->pkt_type;
330699811510SSuraj Sumangala 
33071e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count,
33081e429f38SGustavo F. Padovan 				     STREAM_REASSEMBLY);
330999811510SSuraj Sumangala 		if (rem < 0)
331099811510SSuraj Sumangala 			return rem;
331199811510SSuraj Sumangala 
331299811510SSuraj Sumangala 		data += (count - rem);
331399811510SSuraj Sumangala 		count = rem;
3314f81c6224SJoe Perches 	}
331599811510SSuraj Sumangala 
331699811510SSuraj Sumangala 	return rem;
331799811510SSuraj Sumangala }
331899811510SSuraj Sumangala EXPORT_SYMBOL(hci_recv_stream_fragment);
331999811510SSuraj Sumangala 
33201da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
33211da177e4SLinus Torvalds 
33221da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
33231da177e4SLinus Torvalds {
33241da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
33251da177e4SLinus Torvalds 
3326f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
33271da177e4SLinus Torvalds 	list_add(&cb->list, &hci_cb_list);
3328f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
33291da177e4SLinus Torvalds 
33301da177e4SLinus Torvalds 	return 0;
33311da177e4SLinus Torvalds }
33321da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
33331da177e4SLinus Torvalds 
33341da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
33351da177e4SLinus Torvalds {
33361da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
33371da177e4SLinus Torvalds 
3338f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
33391da177e4SLinus Torvalds 	list_del(&cb->list);
3340f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
33411da177e4SLinus Torvalds 
33421da177e4SLinus Torvalds 	return 0;
33431da177e4SLinus Torvalds }
33441da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
33451da177e4SLinus Torvalds 
334651086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
33471da177e4SLinus Torvalds {
3348cdc52faaSMarcel Holtmann 	int err;
3349cdc52faaSMarcel Holtmann 
33500d48d939SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
33511da177e4SLinus Torvalds 
33521da177e4SLinus Torvalds 	/* Time stamp */
3353a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
33541da177e4SLinus Torvalds 
3355cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
3356cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
3357cd82e61cSMarcel Holtmann 
3358cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
3359cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
3360470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
33611da177e4SLinus Torvalds 	}
33621da177e4SLinus Torvalds 
33631da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
33641da177e4SLinus Torvalds 	skb_orphan(skb);
33651da177e4SLinus Torvalds 
3366cdc52faaSMarcel Holtmann 	err = hdev->send(hdev, skb);
3367cdc52faaSMarcel Holtmann 	if (err < 0) {
3368cdc52faaSMarcel Holtmann 		BT_ERR("%s sending frame failed (%d)", hdev->name, err);
3369cdc52faaSMarcel Holtmann 		kfree_skb(skb);
3370cdc52faaSMarcel Holtmann 	}
33711da177e4SLinus Torvalds }
33721da177e4SLinus Torvalds 
3373899de765SMarcel Holtmann bool hci_req_pending(struct hci_dev *hdev)
3374899de765SMarcel Holtmann {
3375899de765SMarcel Holtmann 	return (hdev->req_status == HCI_REQ_PEND);
3376899de765SMarcel Holtmann }
3377899de765SMarcel Holtmann 
33781ca3a9d0SJohan Hedberg /* Send HCI command */
337907dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
338007dc93ddSJohan Hedberg 		 const void *param)
33811ca3a9d0SJohan Hedberg {
33821ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
33831ca3a9d0SJohan Hedberg 
33841ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
33851ca3a9d0SJohan Hedberg 
33861ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
33871ca3a9d0SJohan Hedberg 	if (!skb) {
33881ca3a9d0SJohan Hedberg 		BT_ERR("%s no memory for command", hdev->name);
33891ca3a9d0SJohan Hedberg 		return -ENOMEM;
33901ca3a9d0SJohan Hedberg 	}
33911ca3a9d0SJohan Hedberg 
339249c922bbSStephen Hemminger 	/* Stand-alone HCI commands must be flagged as
339311714b3dSJohan Hedberg 	 * single-command requests.
339411714b3dSJohan Hedberg 	 */
339511714b3dSJohan Hedberg 	bt_cb(skb)->req.start = true;
339611714b3dSJohan Hedberg 
33971da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
3398c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
33991da177e4SLinus Torvalds 
34001da177e4SLinus Torvalds 	return 0;
34011da177e4SLinus Torvalds }
34021da177e4SLinus Torvalds 
34031da177e4SLinus Torvalds /* Get data from the previously sent command */
3404a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
34051da177e4SLinus Torvalds {
34061da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
34071da177e4SLinus Torvalds 
34081da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
34091da177e4SLinus Torvalds 		return NULL;
34101da177e4SLinus Torvalds 
34111da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
34121da177e4SLinus Torvalds 
3413a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
34141da177e4SLinus Torvalds 		return NULL;
34151da177e4SLinus Torvalds 
3416f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
34171da177e4SLinus Torvalds 
34181da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
34191da177e4SLinus Torvalds }
34201da177e4SLinus Torvalds 
34211da177e4SLinus Torvalds /* Send ACL data */
34221da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
34231da177e4SLinus Torvalds {
34241da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
34251da177e4SLinus Torvalds 	int len = skb->len;
34261da177e4SLinus Torvalds 
3427badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
3428badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
34299c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
3430aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
3431aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
34321da177e4SLinus Torvalds }
34331da177e4SLinus Torvalds 
3434ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
343573d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
34361da177e4SLinus Torvalds {
3437ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
34381da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
34391da177e4SLinus Torvalds 	struct sk_buff *list;
34401da177e4SLinus Torvalds 
3441087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
3442087bfd99SGustavo Padovan 	skb->data_len = 0;
3443087bfd99SGustavo Padovan 
3444087bfd99SGustavo Padovan 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
3445204a6e54SAndrei Emeltchenko 
3446204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
3447204a6e54SAndrei Emeltchenko 	case HCI_BREDR:
3448087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
3449204a6e54SAndrei Emeltchenko 		break;
3450204a6e54SAndrei Emeltchenko 	case HCI_AMP:
3451204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
3452204a6e54SAndrei Emeltchenko 		break;
3453204a6e54SAndrei Emeltchenko 	default:
3454204a6e54SAndrei Emeltchenko 		BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3455204a6e54SAndrei Emeltchenko 		return;
3456204a6e54SAndrei Emeltchenko 	}
3457087bfd99SGustavo Padovan 
345870f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
345970f23020SAndrei Emeltchenko 	if (!list) {
34601da177e4SLinus Torvalds 		/* Non fragmented */
34611da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
34621da177e4SLinus Torvalds 
346373d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
34641da177e4SLinus Torvalds 	} else {
34651da177e4SLinus Torvalds 		/* Fragmented */
34661da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
34671da177e4SLinus Torvalds 
34681da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
34691da177e4SLinus Torvalds 
34709cfd5a23SJukka Rissanen 		/* Queue all fragments atomically. We need to use spin_lock_bh
34719cfd5a23SJukka Rissanen 		 * here because of 6LoWPAN links, as there this function is
34729cfd5a23SJukka Rissanen 		 * called from softirq and using normal spin lock could cause
34739cfd5a23SJukka Rissanen 		 * deadlocks.
34749cfd5a23SJukka Rissanen 		 */
34759cfd5a23SJukka Rissanen 		spin_lock_bh(&queue->lock);
34761da177e4SLinus Torvalds 
347773d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
3478e702112fSAndrei Emeltchenko 
3479e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
3480e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
34811da177e4SLinus Torvalds 		do {
34821da177e4SLinus Torvalds 			skb = list; list = list->next;
34831da177e4SLinus Torvalds 
34840d48d939SMarcel Holtmann 			bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
3485e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
34861da177e4SLinus Torvalds 
34871da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
34881da177e4SLinus Torvalds 
348973d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
34901da177e4SLinus Torvalds 		} while (list);
34911da177e4SLinus Torvalds 
34929cfd5a23SJukka Rissanen 		spin_unlock_bh(&queue->lock);
34931da177e4SLinus Torvalds 	}
349473d80debSLuiz Augusto von Dentz }
349573d80debSLuiz Augusto von Dentz 
349673d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
349773d80debSLuiz Augusto von Dentz {
3498ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
349973d80debSLuiz Augusto von Dentz 
3500f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
350173d80debSLuiz Augusto von Dentz 
3502ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
35031da177e4SLinus Torvalds 
35043eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
35051da177e4SLinus Torvalds }
35061da177e4SLinus Torvalds 
35071da177e4SLinus Torvalds /* Send SCO data */
35080d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
35091da177e4SLinus Torvalds {
35101da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
35111da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
35121da177e4SLinus Torvalds 
35131da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
35141da177e4SLinus Torvalds 
3515aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
35161da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
35171da177e4SLinus Torvalds 
3518badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
3519badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
35209c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
35211da177e4SLinus Torvalds 
35220d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
3523c78ae283SMarcel Holtmann 
35241da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
35253eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
35261da177e4SLinus Torvalds }
35271da177e4SLinus Torvalds 
35281da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
35291da177e4SLinus Torvalds 
35301da177e4SLinus Torvalds /* HCI Connection scheduler */
35316039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
3532a8c5fb1aSGustavo Padovan 				     int *quote)
35331da177e4SLinus Torvalds {
35341da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
35358035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
3536abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
35371da177e4SLinus Torvalds 
35381da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
35391da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
3540bf4c6325SGustavo F. Padovan 
3541bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3542bf4c6325SGustavo F. Padovan 
3543bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
3544769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
35451da177e4SLinus Torvalds 			continue;
3546769be974SMarcel Holtmann 
3547769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
3548769be974SMarcel Holtmann 			continue;
3549769be974SMarcel Holtmann 
35501da177e4SLinus Torvalds 		num++;
35511da177e4SLinus Torvalds 
35521da177e4SLinus Torvalds 		if (c->sent < min) {
35531da177e4SLinus Torvalds 			min  = c->sent;
35541da177e4SLinus Torvalds 			conn = c;
35551da177e4SLinus Torvalds 		}
355652087a79SLuiz Augusto von Dentz 
355752087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
355852087a79SLuiz Augusto von Dentz 			break;
35591da177e4SLinus Torvalds 	}
35601da177e4SLinus Torvalds 
3561bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3562bf4c6325SGustavo F. Padovan 
35631da177e4SLinus Torvalds 	if (conn) {
35646ed58ec5SVille Tervo 		int cnt, q;
35656ed58ec5SVille Tervo 
35666ed58ec5SVille Tervo 		switch (conn->type) {
35676ed58ec5SVille Tervo 		case ACL_LINK:
35686ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
35696ed58ec5SVille Tervo 			break;
35706ed58ec5SVille Tervo 		case SCO_LINK:
35716ed58ec5SVille Tervo 		case ESCO_LINK:
35726ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
35736ed58ec5SVille Tervo 			break;
35746ed58ec5SVille Tervo 		case LE_LINK:
35756ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
35766ed58ec5SVille Tervo 			break;
35776ed58ec5SVille Tervo 		default:
35786ed58ec5SVille Tervo 			cnt = 0;
35796ed58ec5SVille Tervo 			BT_ERR("Unknown link type");
35806ed58ec5SVille Tervo 		}
35816ed58ec5SVille Tervo 
35826ed58ec5SVille Tervo 		q = cnt / num;
35831da177e4SLinus Torvalds 		*quote = q ? q : 1;
35841da177e4SLinus Torvalds 	} else
35851da177e4SLinus Torvalds 		*quote = 0;
35861da177e4SLinus Torvalds 
35871da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
35881da177e4SLinus Torvalds 	return conn;
35891da177e4SLinus Torvalds }
35901da177e4SLinus Torvalds 
35916039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
35921da177e4SLinus Torvalds {
35931da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
35941da177e4SLinus Torvalds 	struct hci_conn *c;
35951da177e4SLinus Torvalds 
3596bae1f5d9SVille Tervo 	BT_ERR("%s link tx timeout", hdev->name);
35971da177e4SLinus Torvalds 
3598bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3599bf4c6325SGustavo F. Padovan 
36001da177e4SLinus Torvalds 	/* Kill stalled connections */
3601bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
3602bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
36036ed93dc6SAndrei Emeltchenko 			BT_ERR("%s killing stalled connection %pMR",
36046ed93dc6SAndrei Emeltchenko 			       hdev->name, &c->dst);
3605bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
36061da177e4SLinus Torvalds 		}
36071da177e4SLinus Torvalds 	}
3608bf4c6325SGustavo F. Padovan 
3609bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
36101da177e4SLinus Torvalds }
36111da177e4SLinus Torvalds 
36126039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
361373d80debSLuiz Augusto von Dentz 				      int *quote)
361473d80debSLuiz Augusto von Dentz {
361573d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
361673d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
3617abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
361873d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
361973d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
362073d80debSLuiz Augusto von Dentz 
362173d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
362273d80debSLuiz Augusto von Dentz 
3623bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3624bf4c6325SGustavo F. Padovan 
3625bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
362673d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
362773d80debSLuiz Augusto von Dentz 
362873d80debSLuiz Augusto von Dentz 		if (conn->type != type)
362973d80debSLuiz Augusto von Dentz 			continue;
363073d80debSLuiz Augusto von Dentz 
363173d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
363273d80debSLuiz Augusto von Dentz 			continue;
363373d80debSLuiz Augusto von Dentz 
363473d80debSLuiz Augusto von Dentz 		conn_num++;
363573d80debSLuiz Augusto von Dentz 
36368192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
363773d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
363873d80debSLuiz Augusto von Dentz 
363973d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
364073d80debSLuiz Augusto von Dentz 				continue;
364173d80debSLuiz Augusto von Dentz 
364273d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
364373d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
364473d80debSLuiz Augusto von Dentz 				continue;
364573d80debSLuiz Augusto von Dentz 
364673d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
364773d80debSLuiz Augusto von Dentz 				num = 0;
364873d80debSLuiz Augusto von Dentz 				min = ~0;
364973d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
365073d80debSLuiz Augusto von Dentz 			}
365173d80debSLuiz Augusto von Dentz 
365273d80debSLuiz Augusto von Dentz 			num++;
365373d80debSLuiz Augusto von Dentz 
365473d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
365573d80debSLuiz Augusto von Dentz 				min  = conn->sent;
365673d80debSLuiz Augusto von Dentz 				chan = tmp;
365773d80debSLuiz Augusto von Dentz 			}
365873d80debSLuiz Augusto von Dentz 		}
365973d80debSLuiz Augusto von Dentz 
366073d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
366173d80debSLuiz Augusto von Dentz 			break;
366273d80debSLuiz Augusto von Dentz 	}
366373d80debSLuiz Augusto von Dentz 
3664bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3665bf4c6325SGustavo F. Padovan 
366673d80debSLuiz Augusto von Dentz 	if (!chan)
366773d80debSLuiz Augusto von Dentz 		return NULL;
366873d80debSLuiz Augusto von Dentz 
366973d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
367073d80debSLuiz Augusto von Dentz 	case ACL_LINK:
367173d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
367273d80debSLuiz Augusto von Dentz 		break;
3673bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
3674bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
3675bd1eb66bSAndrei Emeltchenko 		break;
367673d80debSLuiz Augusto von Dentz 	case SCO_LINK:
367773d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
367873d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
367973d80debSLuiz Augusto von Dentz 		break;
368073d80debSLuiz Augusto von Dentz 	case LE_LINK:
368173d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
368273d80debSLuiz Augusto von Dentz 		break;
368373d80debSLuiz Augusto von Dentz 	default:
368473d80debSLuiz Augusto von Dentz 		cnt = 0;
368573d80debSLuiz Augusto von Dentz 		BT_ERR("Unknown link type");
368673d80debSLuiz Augusto von Dentz 	}
368773d80debSLuiz Augusto von Dentz 
368873d80debSLuiz Augusto von Dentz 	q = cnt / num;
368973d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
369073d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
369173d80debSLuiz Augusto von Dentz 	return chan;
369273d80debSLuiz Augusto von Dentz }
369373d80debSLuiz Augusto von Dentz 
369402b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
369502b20f0bSLuiz Augusto von Dentz {
369602b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
369702b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
369802b20f0bSLuiz Augusto von Dentz 	int num = 0;
369902b20f0bSLuiz Augusto von Dentz 
370002b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
370102b20f0bSLuiz Augusto von Dentz 
3702bf4c6325SGustavo F. Padovan 	rcu_read_lock();
3703bf4c6325SGustavo F. Padovan 
3704bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
370502b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
370602b20f0bSLuiz Augusto von Dentz 
370702b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
370802b20f0bSLuiz Augusto von Dentz 			continue;
370902b20f0bSLuiz Augusto von Dentz 
371002b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
371102b20f0bSLuiz Augusto von Dentz 			continue;
371202b20f0bSLuiz Augusto von Dentz 
371302b20f0bSLuiz Augusto von Dentz 		num++;
371402b20f0bSLuiz Augusto von Dentz 
37158192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
371602b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
371702b20f0bSLuiz Augusto von Dentz 
371802b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
371902b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
372002b20f0bSLuiz Augusto von Dentz 				continue;
372102b20f0bSLuiz Augusto von Dentz 			}
372202b20f0bSLuiz Augusto von Dentz 
372302b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
372402b20f0bSLuiz Augusto von Dentz 				continue;
372502b20f0bSLuiz Augusto von Dentz 
372602b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
372702b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
372802b20f0bSLuiz Augusto von Dentz 				continue;
372902b20f0bSLuiz Augusto von Dentz 
373002b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
373102b20f0bSLuiz Augusto von Dentz 
373202b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
373302b20f0bSLuiz Augusto von Dentz 			       skb->priority);
373402b20f0bSLuiz Augusto von Dentz 		}
373502b20f0bSLuiz Augusto von Dentz 
373602b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
373702b20f0bSLuiz Augusto von Dentz 			break;
373802b20f0bSLuiz Augusto von Dentz 	}
3739bf4c6325SGustavo F. Padovan 
3740bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
3741bf4c6325SGustavo F. Padovan 
374202b20f0bSLuiz Augusto von Dentz }
374302b20f0bSLuiz Augusto von Dentz 
3744b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
3745b71d385aSAndrei Emeltchenko {
3746b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
3747b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
3748b71d385aSAndrei Emeltchenko }
3749b71d385aSAndrei Emeltchenko 
37506039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
37511da177e4SLinus Torvalds {
37524a964404SMarcel Holtmann 	if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
37531da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
37541da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
375563d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
37565f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
3757bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
37581da177e4SLinus Torvalds 	}
375963d2bc1bSAndrei Emeltchenko }
37601da177e4SLinus Torvalds 
37616039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
376263d2bc1bSAndrei Emeltchenko {
376363d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
376463d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
376563d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
376663d2bc1bSAndrei Emeltchenko 	int quote;
376763d2bc1bSAndrei Emeltchenko 
376863d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
376904837f64SMarcel Holtmann 
377073d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
377173d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
3772ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3773ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
377473d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
377573d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
377673d80debSLuiz Augusto von Dentz 
3777ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3778ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3779ec1cce24SLuiz Augusto von Dentz 				break;
3780ec1cce24SLuiz Augusto von Dentz 
3781ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3782ec1cce24SLuiz Augusto von Dentz 
378373d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
378473d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
378504837f64SMarcel Holtmann 
378657d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
37871da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
37881da177e4SLinus Torvalds 
37891da177e4SLinus Torvalds 			hdev->acl_cnt--;
379073d80debSLuiz Augusto von Dentz 			chan->sent++;
379173d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
37921da177e4SLinus Torvalds 		}
37931da177e4SLinus Torvalds 	}
379402b20f0bSLuiz Augusto von Dentz 
379502b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
379602b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
37971da177e4SLinus Torvalds }
37981da177e4SLinus Torvalds 
37996039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
3800b71d385aSAndrei Emeltchenko {
380163d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
3802b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
3803b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
3804b71d385aSAndrei Emeltchenko 	int quote;
3805bd1eb66bSAndrei Emeltchenko 	u8 type;
3806b71d385aSAndrei Emeltchenko 
380763d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
3808b71d385aSAndrei Emeltchenko 
3809bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3810bd1eb66bSAndrei Emeltchenko 
3811bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
3812bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
3813bd1eb66bSAndrei Emeltchenko 	else
3814bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
3815bd1eb66bSAndrei Emeltchenko 
3816b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
3817bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
3818b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
3819b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
3820b71d385aSAndrei Emeltchenko 			int blocks;
3821b71d385aSAndrei Emeltchenko 
3822b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
3823b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
3824b71d385aSAndrei Emeltchenko 
3825b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
3826b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
3827b71d385aSAndrei Emeltchenko 				break;
3828b71d385aSAndrei Emeltchenko 
3829b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
3830b71d385aSAndrei Emeltchenko 
3831b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
3832b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
3833b71d385aSAndrei Emeltchenko 				return;
3834b71d385aSAndrei Emeltchenko 
3835b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
3836b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
3837b71d385aSAndrei Emeltchenko 
383857d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
3839b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
3840b71d385aSAndrei Emeltchenko 
3841b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
3842b71d385aSAndrei Emeltchenko 			quote -= blocks;
3843b71d385aSAndrei Emeltchenko 
3844b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
3845b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
3846b71d385aSAndrei Emeltchenko 		}
3847b71d385aSAndrei Emeltchenko 	}
3848b71d385aSAndrei Emeltchenko 
3849b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
3850bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
3851b71d385aSAndrei Emeltchenko }
3852b71d385aSAndrei Emeltchenko 
38536039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
3854b71d385aSAndrei Emeltchenko {
3855b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
3856b71d385aSAndrei Emeltchenko 
3857bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
3858bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
3859bd1eb66bSAndrei Emeltchenko 		return;
3860bd1eb66bSAndrei Emeltchenko 
3861bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
3862bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
3863b71d385aSAndrei Emeltchenko 		return;
3864b71d385aSAndrei Emeltchenko 
3865b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
3866b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
3867b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
3868b71d385aSAndrei Emeltchenko 		break;
3869b71d385aSAndrei Emeltchenko 
3870b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
3871b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
3872b71d385aSAndrei Emeltchenko 		break;
3873b71d385aSAndrei Emeltchenko 	}
3874b71d385aSAndrei Emeltchenko }
3875b71d385aSAndrei Emeltchenko 
38761da177e4SLinus Torvalds /* Schedule SCO */
38776039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev)
38781da177e4SLinus Torvalds {
38791da177e4SLinus Torvalds 	struct hci_conn *conn;
38801da177e4SLinus Torvalds 	struct sk_buff *skb;
38811da177e4SLinus Torvalds 	int quote;
38821da177e4SLinus Torvalds 
38831da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
38841da177e4SLinus Torvalds 
388552087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, SCO_LINK))
388652087a79SLuiz Augusto von Dentz 		return;
388752087a79SLuiz Augusto von Dentz 
38881da177e4SLinus Torvalds 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
38891da177e4SLinus Torvalds 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
38901da177e4SLinus Torvalds 			BT_DBG("skb %p len %d", skb, skb->len);
389157d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
38921da177e4SLinus Torvalds 
38931da177e4SLinus Torvalds 			conn->sent++;
38941da177e4SLinus Torvalds 			if (conn->sent == ~0)
38951da177e4SLinus Torvalds 				conn->sent = 0;
38961da177e4SLinus Torvalds 		}
38971da177e4SLinus Torvalds 	}
38981da177e4SLinus Torvalds }
38991da177e4SLinus Torvalds 
39006039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev)
3901b6a0dc82SMarcel Holtmann {
3902b6a0dc82SMarcel Holtmann 	struct hci_conn *conn;
3903b6a0dc82SMarcel Holtmann 	struct sk_buff *skb;
3904b6a0dc82SMarcel Holtmann 	int quote;
3905b6a0dc82SMarcel Holtmann 
3906b6a0dc82SMarcel Holtmann 	BT_DBG("%s", hdev->name);
3907b6a0dc82SMarcel Holtmann 
390852087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, ESCO_LINK))
390952087a79SLuiz Augusto von Dentz 		return;
391052087a79SLuiz Augusto von Dentz 
39118fc9ced3SGustavo Padovan 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
39128fc9ced3SGustavo Padovan 						     &quote))) {
3913b6a0dc82SMarcel Holtmann 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
3914b6a0dc82SMarcel Holtmann 			BT_DBG("skb %p len %d", skb, skb->len);
391557d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
3916b6a0dc82SMarcel Holtmann 
3917b6a0dc82SMarcel Holtmann 			conn->sent++;
3918b6a0dc82SMarcel Holtmann 			if (conn->sent == ~0)
3919b6a0dc82SMarcel Holtmann 				conn->sent = 0;
3920b6a0dc82SMarcel Holtmann 		}
3921b6a0dc82SMarcel Holtmann 	}
3922b6a0dc82SMarcel Holtmann }
3923b6a0dc82SMarcel Holtmann 
39246039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
39256ed58ec5SVille Tervo {
392673d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
39276ed58ec5SVille Tervo 	struct sk_buff *skb;
392802b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
39296ed58ec5SVille Tervo 
39306ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
39316ed58ec5SVille Tervo 
393252087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
393352087a79SLuiz Augusto von Dentz 		return;
393452087a79SLuiz Augusto von Dentz 
39354a964404SMarcel Holtmann 	if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
39366ed58ec5SVille Tervo 		/* LE tx timeout must be longer than maximum
39376ed58ec5SVille Tervo 		 * link supervision timeout (40.9 seconds) */
3938bae1f5d9SVille Tervo 		if (!hdev->le_cnt && hdev->le_pkts &&
39396ed58ec5SVille Tervo 		    time_after(jiffies, hdev->le_last_tx + HZ * 45))
3940bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, LE_LINK);
39416ed58ec5SVille Tervo 	}
39426ed58ec5SVille Tervo 
39436ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
394402b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
394573d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
3946ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
3947ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
394873d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
394973d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
39506ed58ec5SVille Tervo 
3951ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
3952ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
3953ec1cce24SLuiz Augusto von Dentz 				break;
3954ec1cce24SLuiz Augusto von Dentz 
3955ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
3956ec1cce24SLuiz Augusto von Dentz 
395757d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
39586ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
39596ed58ec5SVille Tervo 
39606ed58ec5SVille Tervo 			cnt--;
396173d80debSLuiz Augusto von Dentz 			chan->sent++;
396273d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
39636ed58ec5SVille Tervo 		}
39646ed58ec5SVille Tervo 	}
396573d80debSLuiz Augusto von Dentz 
39666ed58ec5SVille Tervo 	if (hdev->le_pkts)
39676ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
39686ed58ec5SVille Tervo 	else
39696ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
397002b20f0bSLuiz Augusto von Dentz 
397102b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
397202b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
39736ed58ec5SVille Tervo }
39746ed58ec5SVille Tervo 
39753eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
39761da177e4SLinus Torvalds {
39773eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
39781da177e4SLinus Torvalds 	struct sk_buff *skb;
39791da177e4SLinus Torvalds 
39806ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
39816ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
39821da177e4SLinus Torvalds 
398352de599eSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
39841da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
39851da177e4SLinus Torvalds 		hci_sched_acl(hdev);
39861da177e4SLinus Torvalds 		hci_sched_sco(hdev);
3987b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
39886ed58ec5SVille Tervo 		hci_sched_le(hdev);
398952de599eSMarcel Holtmann 	}
39906ed58ec5SVille Tervo 
39911da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
39921da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
399357d17d70SMarcel Holtmann 		hci_send_frame(hdev, skb);
39941da177e4SLinus Torvalds }
39951da177e4SLinus Torvalds 
399625985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
39971da177e4SLinus Torvalds 
39981da177e4SLinus Torvalds /* ACL data packet */
39996039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
40001da177e4SLinus Torvalds {
40011da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
40021da177e4SLinus Torvalds 	struct hci_conn *conn;
40031da177e4SLinus Torvalds 	__u16 handle, flags;
40041da177e4SLinus Torvalds 
40051da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
40061da177e4SLinus Torvalds 
40071da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
40081da177e4SLinus Torvalds 	flags  = hci_flags(handle);
40091da177e4SLinus Torvalds 	handle = hci_handle(handle);
40101da177e4SLinus Torvalds 
4011f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
4012a8c5fb1aSGustavo Padovan 	       handle, flags);
40131da177e4SLinus Torvalds 
40141da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
40151da177e4SLinus Torvalds 
40161da177e4SLinus Torvalds 	hci_dev_lock(hdev);
40171da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
40181da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
40191da177e4SLinus Torvalds 
40201da177e4SLinus Torvalds 	if (conn) {
402165983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
402204837f64SMarcel Holtmann 
40231da177e4SLinus Torvalds 		/* Send to upper protocol */
4024686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
40251da177e4SLinus Torvalds 		return;
40261da177e4SLinus Torvalds 	} else {
40271da177e4SLinus Torvalds 		BT_ERR("%s ACL packet for unknown connection handle %d",
40281da177e4SLinus Torvalds 		       hdev->name, handle);
40291da177e4SLinus Torvalds 	}
40301da177e4SLinus Torvalds 
40311da177e4SLinus Torvalds 	kfree_skb(skb);
40321da177e4SLinus Torvalds }
40331da177e4SLinus Torvalds 
40341da177e4SLinus Torvalds /* SCO data packet */
40356039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
40361da177e4SLinus Torvalds {
40371da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
40381da177e4SLinus Torvalds 	struct hci_conn *conn;
40391da177e4SLinus Torvalds 	__u16 handle;
40401da177e4SLinus Torvalds 
40411da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
40421da177e4SLinus Torvalds 
40431da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
40441da177e4SLinus Torvalds 
4045f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
40461da177e4SLinus Torvalds 
40471da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
40481da177e4SLinus Torvalds 
40491da177e4SLinus Torvalds 	hci_dev_lock(hdev);
40501da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
40511da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
40521da177e4SLinus Torvalds 
40531da177e4SLinus Torvalds 	if (conn) {
40541da177e4SLinus Torvalds 		/* Send to upper protocol */
4055686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
40561da177e4SLinus Torvalds 		return;
40571da177e4SLinus Torvalds 	} else {
40581da177e4SLinus Torvalds 		BT_ERR("%s SCO packet for unknown connection handle %d",
40591da177e4SLinus Torvalds 		       hdev->name, handle);
40601da177e4SLinus Torvalds 	}
40611da177e4SLinus Torvalds 
40621da177e4SLinus Torvalds 	kfree_skb(skb);
40631da177e4SLinus Torvalds }
40641da177e4SLinus Torvalds 
40659238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
40669238f36aSJohan Hedberg {
40679238f36aSJohan Hedberg 	struct sk_buff *skb;
40689238f36aSJohan Hedberg 
40699238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
40709238f36aSJohan Hedberg 	if (!skb)
40719238f36aSJohan Hedberg 		return true;
40729238f36aSJohan Hedberg 
40739238f36aSJohan Hedberg 	return bt_cb(skb)->req.start;
40749238f36aSJohan Hedberg }
40759238f36aSJohan Hedberg 
407642c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
407742c6b129SJohan Hedberg {
407842c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
407942c6b129SJohan Hedberg 	struct sk_buff *skb;
408042c6b129SJohan Hedberg 	u16 opcode;
408142c6b129SJohan Hedberg 
408242c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
408342c6b129SJohan Hedberg 		return;
408442c6b129SJohan Hedberg 
408542c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
408642c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
408742c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
408842c6b129SJohan Hedberg 		return;
408942c6b129SJohan Hedberg 
409042c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
409142c6b129SJohan Hedberg 	if (!skb)
409242c6b129SJohan Hedberg 		return;
409342c6b129SJohan Hedberg 
409442c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
409542c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
409642c6b129SJohan Hedberg }
409742c6b129SJohan Hedberg 
40989238f36aSJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
40999238f36aSJohan Hedberg {
41009238f36aSJohan Hedberg 	hci_req_complete_t req_complete = NULL;
41019238f36aSJohan Hedberg 	struct sk_buff *skb;
41029238f36aSJohan Hedberg 	unsigned long flags;
41039238f36aSJohan Hedberg 
41049238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
41059238f36aSJohan Hedberg 
410642c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
410742c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
41089238f36aSJohan Hedberg 	 */
410942c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
411042c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
411142c6b129SJohan Hedberg 		 * reset complete event during init and any pending
411242c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
411342c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
411442c6b129SJohan Hedberg 		 * command.
411542c6b129SJohan Hedberg 		 */
411642c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
411742c6b129SJohan Hedberg 			hci_resend_last(hdev);
411842c6b129SJohan Hedberg 
41199238f36aSJohan Hedberg 		return;
412042c6b129SJohan Hedberg 	}
41219238f36aSJohan Hedberg 
41229238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
41239238f36aSJohan Hedberg 	 * this request the request is not yet complete.
41249238f36aSJohan Hedberg 	 */
41259238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
41269238f36aSJohan Hedberg 		return;
41279238f36aSJohan Hedberg 
41289238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
41299238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
41309238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
41319238f36aSJohan Hedberg 	 */
41329238f36aSJohan Hedberg 	if (hdev->sent_cmd) {
41339238f36aSJohan Hedberg 		req_complete = bt_cb(hdev->sent_cmd)->req.complete;
413453e21fbcSJohan Hedberg 
413553e21fbcSJohan Hedberg 		if (req_complete) {
413653e21fbcSJohan Hedberg 			/* We must set the complete callback to NULL to
413753e21fbcSJohan Hedberg 			 * avoid calling the callback more than once if
413853e21fbcSJohan Hedberg 			 * this function gets called again.
413953e21fbcSJohan Hedberg 			 */
414053e21fbcSJohan Hedberg 			bt_cb(hdev->sent_cmd)->req.complete = NULL;
414153e21fbcSJohan Hedberg 
41429238f36aSJohan Hedberg 			goto call_complete;
41439238f36aSJohan Hedberg 		}
414453e21fbcSJohan Hedberg 	}
41459238f36aSJohan Hedberg 
41469238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
41479238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
41489238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
41499238f36aSJohan Hedberg 		if (bt_cb(skb)->req.start) {
41509238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
41519238f36aSJohan Hedberg 			break;
41529238f36aSJohan Hedberg 		}
41539238f36aSJohan Hedberg 
41549238f36aSJohan Hedberg 		req_complete = bt_cb(skb)->req.complete;
41559238f36aSJohan Hedberg 		kfree_skb(skb);
41569238f36aSJohan Hedberg 	}
41579238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
41589238f36aSJohan Hedberg 
41599238f36aSJohan Hedberg call_complete:
41609238f36aSJohan Hedberg 	if (req_complete)
41619238f36aSJohan Hedberg 		req_complete(hdev, status);
41629238f36aSJohan Hedberg }
41639238f36aSJohan Hedberg 
4164b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
41651da177e4SLinus Torvalds {
4166b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
41671da177e4SLinus Torvalds 	struct sk_buff *skb;
41681da177e4SLinus Torvalds 
41691da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
41701da177e4SLinus Torvalds 
41711da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
4172cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
4173cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
4174cd82e61cSMarcel Holtmann 
41751da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
41761da177e4SLinus Torvalds 			/* Send copy to the sockets */
4177470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
41781da177e4SLinus Torvalds 		}
41791da177e4SLinus Torvalds 
4180fee746b0SMarcel Holtmann 		if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
41811da177e4SLinus Torvalds 			kfree_skb(skb);
41821da177e4SLinus Torvalds 			continue;
41831da177e4SLinus Torvalds 		}
41841da177e4SLinus Torvalds 
41851da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
41861da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
41870d48d939SMarcel Holtmann 			switch (bt_cb(skb)->pkt_type) {
41881da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
41891da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
41901da177e4SLinus Torvalds 				kfree_skb(skb);
41911da177e4SLinus Torvalds 				continue;
41923ff50b79SStephen Hemminger 			}
41931da177e4SLinus Torvalds 		}
41941da177e4SLinus Torvalds 
41951da177e4SLinus Torvalds 		/* Process frame */
41960d48d939SMarcel Holtmann 		switch (bt_cb(skb)->pkt_type) {
41971da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
4198b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
41991da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
42001da177e4SLinus Torvalds 			break;
42011da177e4SLinus Torvalds 
42021da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
42031da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
42041da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
42051da177e4SLinus Torvalds 			break;
42061da177e4SLinus Torvalds 
42071da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
42081da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
42091da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
42101da177e4SLinus Torvalds 			break;
42111da177e4SLinus Torvalds 
42121da177e4SLinus Torvalds 		default:
42131da177e4SLinus Torvalds 			kfree_skb(skb);
42141da177e4SLinus Torvalds 			break;
42151da177e4SLinus Torvalds 		}
42161da177e4SLinus Torvalds 	}
42171da177e4SLinus Torvalds }
42181da177e4SLinus Torvalds 
4219c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
42201da177e4SLinus Torvalds {
4221c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
42221da177e4SLinus Torvalds 	struct sk_buff *skb;
42231da177e4SLinus Torvalds 
42242104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
42252104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
42261da177e4SLinus Torvalds 
42271da177e4SLinus Torvalds 	/* Send queued commands */
42285a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
42295a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
42305a08ecceSAndrei Emeltchenko 		if (!skb)
42315a08ecceSAndrei Emeltchenko 			return;
42325a08ecceSAndrei Emeltchenko 
42331da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
42341da177e4SLinus Torvalds 
4235a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
423670f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
42371da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
423857d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
42397bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
424065cc2b49SMarcel Holtmann 				cancel_delayed_work(&hdev->cmd_timer);
42417bdb8a5cSSzymon Janc 			else
424265cc2b49SMarcel Holtmann 				schedule_delayed_work(&hdev->cmd_timer,
424365cc2b49SMarcel Holtmann 						      HCI_CMD_TIMEOUT);
42441da177e4SLinus Torvalds 		} else {
42451da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
4246c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
42471da177e4SLinus Torvalds 		}
42481da177e4SLinus Torvalds 	}
42491da177e4SLinus Torvalds }
4250