xref: /openbmc/linux/net/bluetooth/hci_core.c (revision 0378b597)
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 
40970c4e46SJohan Hedberg #include "smp.h"
41970c4e46SJohan Hedberg 
42b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work);
43c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work);
443eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work);
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds /* HCI device list */
471da177e4SLinus Torvalds LIST_HEAD(hci_dev_list);
481da177e4SLinus Torvalds DEFINE_RWLOCK(hci_dev_list_lock);
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds /* HCI callback list */
511da177e4SLinus Torvalds LIST_HEAD(hci_cb_list);
521da177e4SLinus Torvalds DEFINE_RWLOCK(hci_cb_list_lock);
531da177e4SLinus Torvalds 
543df92b31SSasha Levin /* HCI ID Numbering */
553df92b31SSasha Levin static DEFINE_IDA(hci_index_ida);
563df92b31SSasha Levin 
57899de765SMarcel Holtmann /* ----- HCI requests ----- */
58899de765SMarcel Holtmann 
59899de765SMarcel Holtmann #define HCI_REQ_DONE	  0
60899de765SMarcel Holtmann #define HCI_REQ_PEND	  1
61899de765SMarcel Holtmann #define HCI_REQ_CANCELED  2
62899de765SMarcel Holtmann 
63899de765SMarcel Holtmann #define hci_req_lock(d)		mutex_lock(&d->req_lock)
64899de765SMarcel Holtmann #define hci_req_unlock(d)	mutex_unlock(&d->req_lock)
65899de765SMarcel Holtmann 
661da177e4SLinus Torvalds /* ---- HCI notifications ---- */
671da177e4SLinus Torvalds 
686516455dSMarcel Holtmann static void hci_notify(struct hci_dev *hdev, int event)
691da177e4SLinus Torvalds {
70040030efSMarcel Holtmann 	hci_sock_dev_event(hdev, event);
711da177e4SLinus Torvalds }
721da177e4SLinus Torvalds 
73baf27f6eSMarcel Holtmann /* ---- HCI debugfs entries ---- */
74baf27f6eSMarcel Holtmann 
754b4148e9SMarcel Holtmann static ssize_t dut_mode_read(struct file *file, char __user *user_buf,
764b4148e9SMarcel Holtmann 			     size_t count, loff_t *ppos)
774b4148e9SMarcel Holtmann {
784b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
794b4148e9SMarcel Holtmann 	char buf[3];
804b4148e9SMarcel Holtmann 
81111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_DUT_MODE, &hdev->dbg_flags) ? 'Y': 'N';
824b4148e9SMarcel Holtmann 	buf[1] = '\n';
834b4148e9SMarcel Holtmann 	buf[2] = '\0';
844b4148e9SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
854b4148e9SMarcel Holtmann }
864b4148e9SMarcel Holtmann 
874b4148e9SMarcel Holtmann static ssize_t dut_mode_write(struct file *file, const char __user *user_buf,
884b4148e9SMarcel Holtmann 			      size_t count, loff_t *ppos)
894b4148e9SMarcel Holtmann {
904b4148e9SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
914b4148e9SMarcel Holtmann 	struct sk_buff *skb;
924b4148e9SMarcel Holtmann 	char buf[32];
934b4148e9SMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
944b4148e9SMarcel Holtmann 	bool enable;
954b4148e9SMarcel Holtmann 	int err;
964b4148e9SMarcel Holtmann 
974b4148e9SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
984b4148e9SMarcel Holtmann 		return -ENETDOWN;
994b4148e9SMarcel Holtmann 
1004b4148e9SMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
1014b4148e9SMarcel Holtmann 		return -EFAULT;
1024b4148e9SMarcel Holtmann 
1034b4148e9SMarcel Holtmann 	buf[buf_size] = '\0';
1044b4148e9SMarcel Holtmann 	if (strtobool(buf, &enable))
1054b4148e9SMarcel Holtmann 		return -EINVAL;
1064b4148e9SMarcel Holtmann 
107111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_DUT_MODE, &hdev->dbg_flags))
1084b4148e9SMarcel Holtmann 		return -EALREADY;
1094b4148e9SMarcel Holtmann 
1104b4148e9SMarcel Holtmann 	hci_req_lock(hdev);
1114b4148e9SMarcel Holtmann 	if (enable)
1124b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL,
1134b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1144b4148e9SMarcel Holtmann 	else
1154b4148e9SMarcel Holtmann 		skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
1164b4148e9SMarcel Holtmann 				     HCI_CMD_TIMEOUT);
1174b4148e9SMarcel Holtmann 	hci_req_unlock(hdev);
1184b4148e9SMarcel Holtmann 
1194b4148e9SMarcel Holtmann 	if (IS_ERR(skb))
1204b4148e9SMarcel Holtmann 		return PTR_ERR(skb);
1214b4148e9SMarcel Holtmann 
1224b4148e9SMarcel Holtmann 	err = -bt_to_errno(skb->data[0]);
1234b4148e9SMarcel Holtmann 	kfree_skb(skb);
1244b4148e9SMarcel Holtmann 
1254b4148e9SMarcel Holtmann 	if (err < 0)
1264b4148e9SMarcel Holtmann 		return err;
1274b4148e9SMarcel Holtmann 
128111902f7SMarcel Holtmann 	change_bit(HCI_DUT_MODE, &hdev->dbg_flags);
1294b4148e9SMarcel Holtmann 
1304b4148e9SMarcel Holtmann 	return count;
1314b4148e9SMarcel Holtmann }
1324b4148e9SMarcel Holtmann 
1334b4148e9SMarcel Holtmann static const struct file_operations dut_mode_fops = {
1344b4148e9SMarcel Holtmann 	.open		= simple_open,
1354b4148e9SMarcel Holtmann 	.read		= dut_mode_read,
1364b4148e9SMarcel Holtmann 	.write		= dut_mode_write,
1374b4148e9SMarcel Holtmann 	.llseek		= default_llseek,
1384b4148e9SMarcel Holtmann };
1394b4148e9SMarcel Holtmann 
140dfb826a8SMarcel Holtmann static int features_show(struct seq_file *f, void *ptr)
141dfb826a8SMarcel Holtmann {
142dfb826a8SMarcel Holtmann 	struct hci_dev *hdev = f->private;
143dfb826a8SMarcel Holtmann 	u8 p;
144dfb826a8SMarcel Holtmann 
145dfb826a8SMarcel Holtmann 	hci_dev_lock(hdev);
146dfb826a8SMarcel Holtmann 	for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
147cfbb2b5bSMarcel Holtmann 		seq_printf(f, "%2u: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
148dfb826a8SMarcel Holtmann 			   "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", p,
149dfb826a8SMarcel Holtmann 			   hdev->features[p][0], hdev->features[p][1],
150dfb826a8SMarcel Holtmann 			   hdev->features[p][2], hdev->features[p][3],
151dfb826a8SMarcel Holtmann 			   hdev->features[p][4], hdev->features[p][5],
152dfb826a8SMarcel Holtmann 			   hdev->features[p][6], hdev->features[p][7]);
153dfb826a8SMarcel Holtmann 	}
154cfbb2b5bSMarcel Holtmann 	if (lmp_le_capable(hdev))
155cfbb2b5bSMarcel Holtmann 		seq_printf(f, "LE: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
156cfbb2b5bSMarcel Holtmann 			   "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n",
157cfbb2b5bSMarcel Holtmann 			   hdev->le_features[0], hdev->le_features[1],
158cfbb2b5bSMarcel Holtmann 			   hdev->le_features[2], hdev->le_features[3],
159cfbb2b5bSMarcel Holtmann 			   hdev->le_features[4], hdev->le_features[5],
160cfbb2b5bSMarcel Holtmann 			   hdev->le_features[6], hdev->le_features[7]);
161dfb826a8SMarcel Holtmann 	hci_dev_unlock(hdev);
162dfb826a8SMarcel Holtmann 
163dfb826a8SMarcel Holtmann 	return 0;
164dfb826a8SMarcel Holtmann }
165dfb826a8SMarcel Holtmann 
166dfb826a8SMarcel Holtmann static int features_open(struct inode *inode, struct file *file)
167dfb826a8SMarcel Holtmann {
168dfb826a8SMarcel Holtmann 	return single_open(file, features_show, inode->i_private);
169dfb826a8SMarcel Holtmann }
170dfb826a8SMarcel Holtmann 
171dfb826a8SMarcel Holtmann static const struct file_operations features_fops = {
172dfb826a8SMarcel Holtmann 	.open		= features_open,
173dfb826a8SMarcel Holtmann 	.read		= seq_read,
174dfb826a8SMarcel Holtmann 	.llseek		= seq_lseek,
175dfb826a8SMarcel Holtmann 	.release	= single_release,
176dfb826a8SMarcel Holtmann };
177dfb826a8SMarcel Holtmann 
17870afe0b8SMarcel Holtmann static int blacklist_show(struct seq_file *f, void *p)
17970afe0b8SMarcel Holtmann {
18070afe0b8SMarcel Holtmann 	struct hci_dev *hdev = f->private;
18170afe0b8SMarcel Holtmann 	struct bdaddr_list *b;
18270afe0b8SMarcel Holtmann 
18370afe0b8SMarcel Holtmann 	hci_dev_lock(hdev);
18470afe0b8SMarcel Holtmann 	list_for_each_entry(b, &hdev->blacklist, list)
185b25f0785SMarcel Holtmann 		seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
18670afe0b8SMarcel Holtmann 	hci_dev_unlock(hdev);
18770afe0b8SMarcel Holtmann 
18870afe0b8SMarcel Holtmann 	return 0;
18970afe0b8SMarcel Holtmann }
19070afe0b8SMarcel Holtmann 
19170afe0b8SMarcel Holtmann static int blacklist_open(struct inode *inode, struct file *file)
19270afe0b8SMarcel Holtmann {
19370afe0b8SMarcel Holtmann 	return single_open(file, blacklist_show, inode->i_private);
19470afe0b8SMarcel Holtmann }
19570afe0b8SMarcel Holtmann 
19670afe0b8SMarcel Holtmann static const struct file_operations blacklist_fops = {
19770afe0b8SMarcel Holtmann 	.open		= blacklist_open,
19870afe0b8SMarcel Holtmann 	.read		= seq_read,
19970afe0b8SMarcel Holtmann 	.llseek		= seq_lseek,
20070afe0b8SMarcel Holtmann 	.release	= single_release,
20170afe0b8SMarcel Holtmann };
20270afe0b8SMarcel Holtmann 
20347219839SMarcel Holtmann static int uuids_show(struct seq_file *f, void *p)
20447219839SMarcel Holtmann {
20547219839SMarcel Holtmann 	struct hci_dev *hdev = f->private;
20647219839SMarcel Holtmann 	struct bt_uuid *uuid;
20747219839SMarcel Holtmann 
20847219839SMarcel Holtmann 	hci_dev_lock(hdev);
20947219839SMarcel Holtmann 	list_for_each_entry(uuid, &hdev->uuids, list) {
21058f01aa9SMarcel Holtmann 		u8 i, val[16];
21147219839SMarcel Holtmann 
21258f01aa9SMarcel Holtmann 		/* The Bluetooth UUID values are stored in big endian,
21358f01aa9SMarcel Holtmann 		 * but with reversed byte order. So convert them into
21458f01aa9SMarcel Holtmann 		 * the right order for the %pUb modifier.
21558f01aa9SMarcel Holtmann 		 */
21658f01aa9SMarcel Holtmann 		for (i = 0; i < 16; i++)
21758f01aa9SMarcel Holtmann 			val[i] = uuid->uuid[15 - i];
21847219839SMarcel Holtmann 
21958f01aa9SMarcel Holtmann 		seq_printf(f, "%pUb\n", val);
22047219839SMarcel Holtmann 	}
22147219839SMarcel Holtmann 	hci_dev_unlock(hdev);
22247219839SMarcel Holtmann 
22347219839SMarcel Holtmann 	return 0;
22447219839SMarcel Holtmann }
22547219839SMarcel Holtmann 
22647219839SMarcel Holtmann static int uuids_open(struct inode *inode, struct file *file)
22747219839SMarcel Holtmann {
22847219839SMarcel Holtmann 	return single_open(file, uuids_show, inode->i_private);
22947219839SMarcel Holtmann }
23047219839SMarcel Holtmann 
23147219839SMarcel Holtmann static const struct file_operations uuids_fops = {
23247219839SMarcel Holtmann 	.open		= uuids_open,
23347219839SMarcel Holtmann 	.read		= seq_read,
23447219839SMarcel Holtmann 	.llseek		= seq_lseek,
23547219839SMarcel Holtmann 	.release	= single_release,
23647219839SMarcel Holtmann };
23747219839SMarcel Holtmann 
238baf27f6eSMarcel Holtmann static int inquiry_cache_show(struct seq_file *f, void *p)
239baf27f6eSMarcel Holtmann {
240baf27f6eSMarcel Holtmann 	struct hci_dev *hdev = f->private;
241baf27f6eSMarcel Holtmann 	struct discovery_state *cache = &hdev->discovery;
242baf27f6eSMarcel Holtmann 	struct inquiry_entry *e;
243baf27f6eSMarcel Holtmann 
244baf27f6eSMarcel Holtmann 	hci_dev_lock(hdev);
245baf27f6eSMarcel Holtmann 
246baf27f6eSMarcel Holtmann 	list_for_each_entry(e, &cache->all, all) {
247baf27f6eSMarcel Holtmann 		struct inquiry_data *data = &e->data;
248baf27f6eSMarcel Holtmann 		seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
249baf27f6eSMarcel Holtmann 			   &data->bdaddr,
250baf27f6eSMarcel Holtmann 			   data->pscan_rep_mode, data->pscan_period_mode,
251baf27f6eSMarcel Holtmann 			   data->pscan_mode, data->dev_class[2],
252baf27f6eSMarcel Holtmann 			   data->dev_class[1], data->dev_class[0],
253baf27f6eSMarcel Holtmann 			   __le16_to_cpu(data->clock_offset),
254baf27f6eSMarcel Holtmann 			   data->rssi, data->ssp_mode, e->timestamp);
255baf27f6eSMarcel Holtmann 	}
256baf27f6eSMarcel Holtmann 
257baf27f6eSMarcel Holtmann 	hci_dev_unlock(hdev);
258baf27f6eSMarcel Holtmann 
259baf27f6eSMarcel Holtmann 	return 0;
260baf27f6eSMarcel Holtmann }
261baf27f6eSMarcel Holtmann 
262baf27f6eSMarcel Holtmann static int inquiry_cache_open(struct inode *inode, struct file *file)
263baf27f6eSMarcel Holtmann {
264baf27f6eSMarcel Holtmann 	return single_open(file, inquiry_cache_show, inode->i_private);
265baf27f6eSMarcel Holtmann }
266baf27f6eSMarcel Holtmann 
267baf27f6eSMarcel Holtmann static const struct file_operations inquiry_cache_fops = {
268baf27f6eSMarcel Holtmann 	.open		= inquiry_cache_open,
269baf27f6eSMarcel Holtmann 	.read		= seq_read,
270baf27f6eSMarcel Holtmann 	.llseek		= seq_lseek,
271baf27f6eSMarcel Holtmann 	.release	= single_release,
272baf27f6eSMarcel Holtmann };
273baf27f6eSMarcel Holtmann 
27402d08d15SMarcel Holtmann static int link_keys_show(struct seq_file *f, void *ptr)
27502d08d15SMarcel Holtmann {
27602d08d15SMarcel Holtmann 	struct hci_dev *hdev = f->private;
277*0378b597SJohan Hedberg 	struct link_key *key;
27802d08d15SMarcel Holtmann 
279*0378b597SJohan Hedberg 	rcu_read_lock();
280*0378b597SJohan Hedberg 	list_for_each_entry_rcu(key, &hdev->link_keys, list)
28102d08d15SMarcel Holtmann 		seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
28202d08d15SMarcel Holtmann 			   HCI_LINK_KEY_SIZE, key->val, key->pin_len);
283*0378b597SJohan Hedberg 	rcu_read_unlock();
28402d08d15SMarcel Holtmann 
28502d08d15SMarcel Holtmann 	return 0;
28602d08d15SMarcel Holtmann }
28702d08d15SMarcel Holtmann 
28802d08d15SMarcel Holtmann static int link_keys_open(struct inode *inode, struct file *file)
28902d08d15SMarcel Holtmann {
29002d08d15SMarcel Holtmann 	return single_open(file, link_keys_show, inode->i_private);
29102d08d15SMarcel Holtmann }
29202d08d15SMarcel Holtmann 
29302d08d15SMarcel Holtmann static const struct file_operations link_keys_fops = {
29402d08d15SMarcel Holtmann 	.open		= link_keys_open,
29502d08d15SMarcel Holtmann 	.read		= seq_read,
29602d08d15SMarcel Holtmann 	.llseek		= seq_lseek,
29702d08d15SMarcel Holtmann 	.release	= single_release,
29802d08d15SMarcel Holtmann };
29902d08d15SMarcel Holtmann 
300babdbb3cSMarcel Holtmann static int dev_class_show(struct seq_file *f, void *ptr)
301babdbb3cSMarcel Holtmann {
302babdbb3cSMarcel Holtmann 	struct hci_dev *hdev = f->private;
303babdbb3cSMarcel Holtmann 
304babdbb3cSMarcel Holtmann 	hci_dev_lock(hdev);
305babdbb3cSMarcel Holtmann 	seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
306babdbb3cSMarcel Holtmann 		   hdev->dev_class[1], hdev->dev_class[0]);
307babdbb3cSMarcel Holtmann 	hci_dev_unlock(hdev);
308babdbb3cSMarcel Holtmann 
309babdbb3cSMarcel Holtmann 	return 0;
310babdbb3cSMarcel Holtmann }
311babdbb3cSMarcel Holtmann 
312babdbb3cSMarcel Holtmann static int dev_class_open(struct inode *inode, struct file *file)
313babdbb3cSMarcel Holtmann {
314babdbb3cSMarcel Holtmann 	return single_open(file, dev_class_show, inode->i_private);
315babdbb3cSMarcel Holtmann }
316babdbb3cSMarcel Holtmann 
317babdbb3cSMarcel Holtmann static const struct file_operations dev_class_fops = {
318babdbb3cSMarcel Holtmann 	.open		= dev_class_open,
319babdbb3cSMarcel Holtmann 	.read		= seq_read,
320babdbb3cSMarcel Holtmann 	.llseek		= seq_lseek,
321babdbb3cSMarcel Holtmann 	.release	= single_release,
322babdbb3cSMarcel Holtmann };
323babdbb3cSMarcel Holtmann 
324041000b9SMarcel Holtmann static int voice_setting_get(void *data, u64 *val)
325041000b9SMarcel Holtmann {
326041000b9SMarcel Holtmann 	struct hci_dev *hdev = data;
327041000b9SMarcel Holtmann 
328041000b9SMarcel Holtmann 	hci_dev_lock(hdev);
329041000b9SMarcel Holtmann 	*val = hdev->voice_setting;
330041000b9SMarcel Holtmann 	hci_dev_unlock(hdev);
331041000b9SMarcel Holtmann 
332041000b9SMarcel Holtmann 	return 0;
333041000b9SMarcel Holtmann }
334041000b9SMarcel Holtmann 
335041000b9SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
336041000b9SMarcel Holtmann 			NULL, "0x%4.4llx\n");
337041000b9SMarcel Holtmann 
338ebd1e33bSMarcel Holtmann static int auto_accept_delay_set(void *data, u64 val)
339ebd1e33bSMarcel Holtmann {
340ebd1e33bSMarcel Holtmann 	struct hci_dev *hdev = data;
341ebd1e33bSMarcel Holtmann 
342ebd1e33bSMarcel Holtmann 	hci_dev_lock(hdev);
343ebd1e33bSMarcel Holtmann 	hdev->auto_accept_delay = val;
344ebd1e33bSMarcel Holtmann 	hci_dev_unlock(hdev);
345ebd1e33bSMarcel Holtmann 
346ebd1e33bSMarcel Holtmann 	return 0;
347ebd1e33bSMarcel Holtmann }
348ebd1e33bSMarcel Holtmann 
349ebd1e33bSMarcel Holtmann static int auto_accept_delay_get(void *data, u64 *val)
350ebd1e33bSMarcel Holtmann {
351ebd1e33bSMarcel Holtmann 	struct hci_dev *hdev = data;
352ebd1e33bSMarcel Holtmann 
353ebd1e33bSMarcel Holtmann 	hci_dev_lock(hdev);
354ebd1e33bSMarcel Holtmann 	*val = hdev->auto_accept_delay;
355ebd1e33bSMarcel Holtmann 	hci_dev_unlock(hdev);
356ebd1e33bSMarcel Holtmann 
357ebd1e33bSMarcel Holtmann 	return 0;
358ebd1e33bSMarcel Holtmann }
359ebd1e33bSMarcel Holtmann 
360ebd1e33bSMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
361ebd1e33bSMarcel Holtmann 			auto_accept_delay_set, "%llu\n");
362ebd1e33bSMarcel Holtmann 
3635afeac14SMarcel Holtmann static ssize_t force_sc_support_read(struct file *file, char __user *user_buf,
3645afeac14SMarcel Holtmann 				     size_t count, loff_t *ppos)
3655afeac14SMarcel Holtmann {
3665afeac14SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
3675afeac14SMarcel Holtmann 	char buf[3];
3685afeac14SMarcel Holtmann 
369111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_FORCE_SC, &hdev->dbg_flags) ? 'Y': 'N';
3705afeac14SMarcel Holtmann 	buf[1] = '\n';
3715afeac14SMarcel Holtmann 	buf[2] = '\0';
3725afeac14SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3735afeac14SMarcel Holtmann }
3745afeac14SMarcel Holtmann 
3755afeac14SMarcel Holtmann static ssize_t force_sc_support_write(struct file *file,
3765afeac14SMarcel Holtmann 				      const char __user *user_buf,
3775afeac14SMarcel Holtmann 				      size_t count, loff_t *ppos)
3785afeac14SMarcel Holtmann {
3795afeac14SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
3805afeac14SMarcel Holtmann 	char buf[32];
3815afeac14SMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
3825afeac14SMarcel Holtmann 	bool enable;
3835afeac14SMarcel Holtmann 
3845afeac14SMarcel Holtmann 	if (test_bit(HCI_UP, &hdev->flags))
3855afeac14SMarcel Holtmann 		return -EBUSY;
3865afeac14SMarcel Holtmann 
3875afeac14SMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
3885afeac14SMarcel Holtmann 		return -EFAULT;
3895afeac14SMarcel Holtmann 
3905afeac14SMarcel Holtmann 	buf[buf_size] = '\0';
3915afeac14SMarcel Holtmann 	if (strtobool(buf, &enable))
3925afeac14SMarcel Holtmann 		return -EINVAL;
3935afeac14SMarcel Holtmann 
394111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_FORCE_SC, &hdev->dbg_flags))
3955afeac14SMarcel Holtmann 		return -EALREADY;
3965afeac14SMarcel Holtmann 
397111902f7SMarcel Holtmann 	change_bit(HCI_FORCE_SC, &hdev->dbg_flags);
3985afeac14SMarcel Holtmann 
3995afeac14SMarcel Holtmann 	return count;
4005afeac14SMarcel Holtmann }
4015afeac14SMarcel Holtmann 
4025afeac14SMarcel Holtmann static const struct file_operations force_sc_support_fops = {
4035afeac14SMarcel Holtmann 	.open		= simple_open,
4045afeac14SMarcel Holtmann 	.read		= force_sc_support_read,
4055afeac14SMarcel Holtmann 	.write		= force_sc_support_write,
4065afeac14SMarcel Holtmann 	.llseek		= default_llseek,
4075afeac14SMarcel Holtmann };
4085afeac14SMarcel Holtmann 
409134c2a89SMarcel Holtmann static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
410134c2a89SMarcel Holtmann 				 size_t count, loff_t *ppos)
411134c2a89SMarcel Holtmann {
412134c2a89SMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
413134c2a89SMarcel Holtmann 	char buf[3];
414134c2a89SMarcel Holtmann 
415134c2a89SMarcel Holtmann 	buf[0] = test_bit(HCI_SC_ONLY, &hdev->dev_flags) ? 'Y': 'N';
416134c2a89SMarcel Holtmann 	buf[1] = '\n';
417134c2a89SMarcel Holtmann 	buf[2] = '\0';
418134c2a89SMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
419134c2a89SMarcel Holtmann }
420134c2a89SMarcel Holtmann 
421134c2a89SMarcel Holtmann static const struct file_operations sc_only_mode_fops = {
422134c2a89SMarcel Holtmann 	.open		= simple_open,
423134c2a89SMarcel Holtmann 	.read		= sc_only_mode_read,
424134c2a89SMarcel Holtmann 	.llseek		= default_llseek,
425134c2a89SMarcel Holtmann };
426134c2a89SMarcel Holtmann 
4272bfa3531SMarcel Holtmann static int idle_timeout_set(void *data, u64 val)
4282bfa3531SMarcel Holtmann {
4292bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4302bfa3531SMarcel Holtmann 
4312bfa3531SMarcel Holtmann 	if (val != 0 && (val < 500 || val > 3600000))
4322bfa3531SMarcel Holtmann 		return -EINVAL;
4332bfa3531SMarcel Holtmann 
4342bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4352bfa3531SMarcel Holtmann 	hdev->idle_timeout = val;
4362bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4372bfa3531SMarcel Holtmann 
4382bfa3531SMarcel Holtmann 	return 0;
4392bfa3531SMarcel Holtmann }
4402bfa3531SMarcel Holtmann 
4412bfa3531SMarcel Holtmann static int idle_timeout_get(void *data, u64 *val)
4422bfa3531SMarcel Holtmann {
4432bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4442bfa3531SMarcel Holtmann 
4452bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4462bfa3531SMarcel Holtmann 	*val = hdev->idle_timeout;
4472bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4482bfa3531SMarcel Holtmann 
4492bfa3531SMarcel Holtmann 	return 0;
4502bfa3531SMarcel Holtmann }
4512bfa3531SMarcel Holtmann 
4522bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
4532bfa3531SMarcel Holtmann 			idle_timeout_set, "%llu\n");
4542bfa3531SMarcel Holtmann 
455c982b2eaSJohan Hedberg static int rpa_timeout_set(void *data, u64 val)
456c982b2eaSJohan Hedberg {
457c982b2eaSJohan Hedberg 	struct hci_dev *hdev = data;
458c982b2eaSJohan Hedberg 
459c982b2eaSJohan Hedberg 	/* Require the RPA timeout to be at least 30 seconds and at most
460c982b2eaSJohan Hedberg 	 * 24 hours.
461c982b2eaSJohan Hedberg 	 */
462c982b2eaSJohan Hedberg 	if (val < 30 || val > (60 * 60 * 24))
463c982b2eaSJohan Hedberg 		return -EINVAL;
464c982b2eaSJohan Hedberg 
465c982b2eaSJohan Hedberg 	hci_dev_lock(hdev);
466c982b2eaSJohan Hedberg 	hdev->rpa_timeout = val;
467c982b2eaSJohan Hedberg 	hci_dev_unlock(hdev);
468c982b2eaSJohan Hedberg 
469c982b2eaSJohan Hedberg 	return 0;
470c982b2eaSJohan Hedberg }
471c982b2eaSJohan Hedberg 
472c982b2eaSJohan Hedberg static int rpa_timeout_get(void *data, u64 *val)
473c982b2eaSJohan Hedberg {
474c982b2eaSJohan Hedberg 	struct hci_dev *hdev = data;
475c982b2eaSJohan Hedberg 
476c982b2eaSJohan Hedberg 	hci_dev_lock(hdev);
477c982b2eaSJohan Hedberg 	*val = hdev->rpa_timeout;
478c982b2eaSJohan Hedberg 	hci_dev_unlock(hdev);
479c982b2eaSJohan Hedberg 
480c982b2eaSJohan Hedberg 	return 0;
481c982b2eaSJohan Hedberg }
482c982b2eaSJohan Hedberg 
483c982b2eaSJohan Hedberg DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
484c982b2eaSJohan Hedberg 			rpa_timeout_set, "%llu\n");
485c982b2eaSJohan Hedberg 
4862bfa3531SMarcel Holtmann static int sniff_min_interval_set(void *data, u64 val)
4872bfa3531SMarcel Holtmann {
4882bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
4892bfa3531SMarcel Holtmann 
4902bfa3531SMarcel Holtmann 	if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
4912bfa3531SMarcel Holtmann 		return -EINVAL;
4922bfa3531SMarcel Holtmann 
4932bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
4942bfa3531SMarcel Holtmann 	hdev->sniff_min_interval = val;
4952bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
4962bfa3531SMarcel Holtmann 
4972bfa3531SMarcel Holtmann 	return 0;
4982bfa3531SMarcel Holtmann }
4992bfa3531SMarcel Holtmann 
5002bfa3531SMarcel Holtmann static int sniff_min_interval_get(void *data, u64 *val)
5012bfa3531SMarcel Holtmann {
5022bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
5032bfa3531SMarcel Holtmann 
5042bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
5052bfa3531SMarcel Holtmann 	*val = hdev->sniff_min_interval;
5062bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
5072bfa3531SMarcel Holtmann 
5082bfa3531SMarcel Holtmann 	return 0;
5092bfa3531SMarcel Holtmann }
5102bfa3531SMarcel Holtmann 
5112bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
5122bfa3531SMarcel Holtmann 			sniff_min_interval_set, "%llu\n");
5132bfa3531SMarcel Holtmann 
5142bfa3531SMarcel Holtmann static int sniff_max_interval_set(void *data, u64 val)
5152bfa3531SMarcel Holtmann {
5162bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
5172bfa3531SMarcel Holtmann 
5182bfa3531SMarcel Holtmann 	if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
5192bfa3531SMarcel Holtmann 		return -EINVAL;
5202bfa3531SMarcel Holtmann 
5212bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
5222bfa3531SMarcel Holtmann 	hdev->sniff_max_interval = val;
5232bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
5242bfa3531SMarcel Holtmann 
5252bfa3531SMarcel Holtmann 	return 0;
5262bfa3531SMarcel Holtmann }
5272bfa3531SMarcel Holtmann 
5282bfa3531SMarcel Holtmann static int sniff_max_interval_get(void *data, u64 *val)
5292bfa3531SMarcel Holtmann {
5302bfa3531SMarcel Holtmann 	struct hci_dev *hdev = data;
5312bfa3531SMarcel Holtmann 
5322bfa3531SMarcel Holtmann 	hci_dev_lock(hdev);
5332bfa3531SMarcel Holtmann 	*val = hdev->sniff_max_interval;
5342bfa3531SMarcel Holtmann 	hci_dev_unlock(hdev);
5352bfa3531SMarcel Holtmann 
5362bfa3531SMarcel Holtmann 	return 0;
5372bfa3531SMarcel Holtmann }
5382bfa3531SMarcel Holtmann 
5392bfa3531SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
5402bfa3531SMarcel Holtmann 			sniff_max_interval_set, "%llu\n");
5412bfa3531SMarcel Holtmann 
54231ad1691SAndrzej Kaczmarek static int conn_info_min_age_set(void *data, u64 val)
54331ad1691SAndrzej Kaczmarek {
54431ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
54531ad1691SAndrzej Kaczmarek 
54631ad1691SAndrzej Kaczmarek 	if (val == 0 || val > hdev->conn_info_max_age)
54731ad1691SAndrzej Kaczmarek 		return -EINVAL;
54831ad1691SAndrzej Kaczmarek 
54931ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
55031ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = val;
55131ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
55231ad1691SAndrzej Kaczmarek 
55331ad1691SAndrzej Kaczmarek 	return 0;
55431ad1691SAndrzej Kaczmarek }
55531ad1691SAndrzej Kaczmarek 
55631ad1691SAndrzej Kaczmarek static int conn_info_min_age_get(void *data, u64 *val)
55731ad1691SAndrzej Kaczmarek {
55831ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
55931ad1691SAndrzej Kaczmarek 
56031ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
56131ad1691SAndrzej Kaczmarek 	*val = hdev->conn_info_min_age;
56231ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
56331ad1691SAndrzej Kaczmarek 
56431ad1691SAndrzej Kaczmarek 	return 0;
56531ad1691SAndrzej Kaczmarek }
56631ad1691SAndrzej Kaczmarek 
56731ad1691SAndrzej Kaczmarek DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
56831ad1691SAndrzej Kaczmarek 			conn_info_min_age_set, "%llu\n");
56931ad1691SAndrzej Kaczmarek 
57031ad1691SAndrzej Kaczmarek static int conn_info_max_age_set(void *data, u64 val)
57131ad1691SAndrzej Kaczmarek {
57231ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
57331ad1691SAndrzej Kaczmarek 
57431ad1691SAndrzej Kaczmarek 	if (val == 0 || val < hdev->conn_info_min_age)
57531ad1691SAndrzej Kaczmarek 		return -EINVAL;
57631ad1691SAndrzej Kaczmarek 
57731ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
57831ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = val;
57931ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
58031ad1691SAndrzej Kaczmarek 
58131ad1691SAndrzej Kaczmarek 	return 0;
58231ad1691SAndrzej Kaczmarek }
58331ad1691SAndrzej Kaczmarek 
58431ad1691SAndrzej Kaczmarek static int conn_info_max_age_get(void *data, u64 *val)
58531ad1691SAndrzej Kaczmarek {
58631ad1691SAndrzej Kaczmarek 	struct hci_dev *hdev = data;
58731ad1691SAndrzej Kaczmarek 
58831ad1691SAndrzej Kaczmarek 	hci_dev_lock(hdev);
58931ad1691SAndrzej Kaczmarek 	*val = hdev->conn_info_max_age;
59031ad1691SAndrzej Kaczmarek 	hci_dev_unlock(hdev);
59131ad1691SAndrzej Kaczmarek 
59231ad1691SAndrzej Kaczmarek 	return 0;
59331ad1691SAndrzej Kaczmarek }
59431ad1691SAndrzej Kaczmarek 
59531ad1691SAndrzej Kaczmarek DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
59631ad1691SAndrzej Kaczmarek 			conn_info_max_age_set, "%llu\n");
59731ad1691SAndrzej Kaczmarek 
598ac345813SMarcel Holtmann static int identity_show(struct seq_file *f, void *p)
599ac345813SMarcel Holtmann {
600ac345813SMarcel Holtmann 	struct hci_dev *hdev = f->private;
601a1f4c318SJohan Hedberg 	bdaddr_t addr;
602ac345813SMarcel Holtmann 	u8 addr_type;
603ac345813SMarcel Holtmann 
604ac345813SMarcel Holtmann 	hci_dev_lock(hdev);
605ac345813SMarcel Holtmann 
606a1f4c318SJohan Hedberg 	hci_copy_identity_address(hdev, &addr, &addr_type);
607ac345813SMarcel Holtmann 
608a1f4c318SJohan Hedberg 	seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
609473deef2SMarcel Holtmann 		   16, hdev->irk, &hdev->rpa);
610ac345813SMarcel Holtmann 
611ac345813SMarcel Holtmann 	hci_dev_unlock(hdev);
612ac345813SMarcel Holtmann 
613ac345813SMarcel Holtmann 	return 0;
614ac345813SMarcel Holtmann }
615ac345813SMarcel Holtmann 
616ac345813SMarcel Holtmann static int identity_open(struct inode *inode, struct file *file)
617ac345813SMarcel Holtmann {
618ac345813SMarcel Holtmann 	return single_open(file, identity_show, inode->i_private);
619ac345813SMarcel Holtmann }
620ac345813SMarcel Holtmann 
621ac345813SMarcel Holtmann static const struct file_operations identity_fops = {
622ac345813SMarcel Holtmann 	.open		= identity_open,
623ac345813SMarcel Holtmann 	.read		= seq_read,
624ac345813SMarcel Holtmann 	.llseek		= seq_lseek,
625ac345813SMarcel Holtmann 	.release	= single_release,
626ac345813SMarcel Holtmann };
627ac345813SMarcel Holtmann 
6287a4cd51dSMarcel Holtmann static int random_address_show(struct seq_file *f, void *p)
6297a4cd51dSMarcel Holtmann {
6307a4cd51dSMarcel Holtmann 	struct hci_dev *hdev = f->private;
6317a4cd51dSMarcel Holtmann 
6327a4cd51dSMarcel Holtmann 	hci_dev_lock(hdev);
6337a4cd51dSMarcel Holtmann 	seq_printf(f, "%pMR\n", &hdev->random_addr);
6347a4cd51dSMarcel Holtmann 	hci_dev_unlock(hdev);
6357a4cd51dSMarcel Holtmann 
6367a4cd51dSMarcel Holtmann 	return 0;
6377a4cd51dSMarcel Holtmann }
6387a4cd51dSMarcel Holtmann 
6397a4cd51dSMarcel Holtmann static int random_address_open(struct inode *inode, struct file *file)
6407a4cd51dSMarcel Holtmann {
6417a4cd51dSMarcel Holtmann 	return single_open(file, random_address_show, inode->i_private);
6427a4cd51dSMarcel Holtmann }
6437a4cd51dSMarcel Holtmann 
6447a4cd51dSMarcel Holtmann static const struct file_operations random_address_fops = {
6457a4cd51dSMarcel Holtmann 	.open		= random_address_open,
6467a4cd51dSMarcel Holtmann 	.read		= seq_read,
6477a4cd51dSMarcel Holtmann 	.llseek		= seq_lseek,
6487a4cd51dSMarcel Holtmann 	.release	= single_release,
6497a4cd51dSMarcel Holtmann };
6507a4cd51dSMarcel Holtmann 
651e7b8fc92SMarcel Holtmann static int static_address_show(struct seq_file *f, void *p)
652e7b8fc92SMarcel Holtmann {
653e7b8fc92SMarcel Holtmann 	struct hci_dev *hdev = f->private;
654e7b8fc92SMarcel Holtmann 
655e7b8fc92SMarcel Holtmann 	hci_dev_lock(hdev);
656e7b8fc92SMarcel Holtmann 	seq_printf(f, "%pMR\n", &hdev->static_addr);
657e7b8fc92SMarcel Holtmann 	hci_dev_unlock(hdev);
658e7b8fc92SMarcel Holtmann 
659e7b8fc92SMarcel Holtmann 	return 0;
660e7b8fc92SMarcel Holtmann }
661e7b8fc92SMarcel Holtmann 
662e7b8fc92SMarcel Holtmann static int static_address_open(struct inode *inode, struct file *file)
663e7b8fc92SMarcel Holtmann {
664e7b8fc92SMarcel Holtmann 	return single_open(file, static_address_show, inode->i_private);
665e7b8fc92SMarcel Holtmann }
666e7b8fc92SMarcel Holtmann 
667e7b8fc92SMarcel Holtmann static const struct file_operations static_address_fops = {
668e7b8fc92SMarcel Holtmann 	.open		= static_address_open,
669e7b8fc92SMarcel Holtmann 	.read		= seq_read,
670e7b8fc92SMarcel Holtmann 	.llseek		= seq_lseek,
671e7b8fc92SMarcel Holtmann 	.release	= single_release,
672e7b8fc92SMarcel Holtmann };
673e7b8fc92SMarcel Holtmann 
674b32bba6cSMarcel Holtmann static ssize_t force_static_address_read(struct file *file,
675b32bba6cSMarcel Holtmann 					 char __user *user_buf,
676b32bba6cSMarcel Holtmann 					 size_t count, loff_t *ppos)
67792202185SMarcel Holtmann {
678b32bba6cSMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
679b32bba6cSMarcel Holtmann 	char buf[3];
68092202185SMarcel Holtmann 
681111902f7SMarcel Holtmann 	buf[0] = test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ? 'Y': 'N';
682b32bba6cSMarcel Holtmann 	buf[1] = '\n';
683b32bba6cSMarcel Holtmann 	buf[2] = '\0';
684b32bba6cSMarcel Holtmann 	return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
685b32bba6cSMarcel Holtmann }
686b32bba6cSMarcel Holtmann 
687b32bba6cSMarcel Holtmann static ssize_t force_static_address_write(struct file *file,
688b32bba6cSMarcel Holtmann 					  const char __user *user_buf,
689b32bba6cSMarcel Holtmann 					  size_t count, loff_t *ppos)
690b32bba6cSMarcel Holtmann {
691b32bba6cSMarcel Holtmann 	struct hci_dev *hdev = file->private_data;
692b32bba6cSMarcel Holtmann 	char buf[32];
693b32bba6cSMarcel Holtmann 	size_t buf_size = min(count, (sizeof(buf)-1));
694b32bba6cSMarcel Holtmann 	bool enable;
695b32bba6cSMarcel Holtmann 
696b32bba6cSMarcel Holtmann 	if (test_bit(HCI_UP, &hdev->flags))
697b32bba6cSMarcel Holtmann 		return -EBUSY;
698b32bba6cSMarcel Holtmann 
699b32bba6cSMarcel Holtmann 	if (copy_from_user(buf, user_buf, buf_size))
700b32bba6cSMarcel Holtmann 		return -EFAULT;
701b32bba6cSMarcel Holtmann 
702b32bba6cSMarcel Holtmann 	buf[buf_size] = '\0';
703b32bba6cSMarcel Holtmann 	if (strtobool(buf, &enable))
70492202185SMarcel Holtmann 		return -EINVAL;
70592202185SMarcel Holtmann 
706111902f7SMarcel Holtmann 	if (enable == test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags))
707b32bba6cSMarcel Holtmann 		return -EALREADY;
70892202185SMarcel Holtmann 
709111902f7SMarcel Holtmann 	change_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags);
710b32bba6cSMarcel Holtmann 
711b32bba6cSMarcel Holtmann 	return count;
71292202185SMarcel Holtmann }
71392202185SMarcel Holtmann 
714b32bba6cSMarcel Holtmann static const struct file_operations force_static_address_fops = {
715b32bba6cSMarcel Holtmann 	.open		= simple_open,
716b32bba6cSMarcel Holtmann 	.read		= force_static_address_read,
717b32bba6cSMarcel Holtmann 	.write		= force_static_address_write,
718b32bba6cSMarcel Holtmann 	.llseek		= default_llseek,
719b32bba6cSMarcel Holtmann };
72092202185SMarcel Holtmann 
721d2ab0ac1SMarcel Holtmann static int white_list_show(struct seq_file *f, void *ptr)
722d2ab0ac1SMarcel Holtmann {
723d2ab0ac1SMarcel Holtmann 	struct hci_dev *hdev = f->private;
724d2ab0ac1SMarcel Holtmann 	struct bdaddr_list *b;
725d2ab0ac1SMarcel Holtmann 
726d2ab0ac1SMarcel Holtmann 	hci_dev_lock(hdev);
727d2ab0ac1SMarcel Holtmann 	list_for_each_entry(b, &hdev->le_white_list, list)
728d2ab0ac1SMarcel Holtmann 		seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
729d2ab0ac1SMarcel Holtmann 	hci_dev_unlock(hdev);
730d2ab0ac1SMarcel Holtmann 
731d2ab0ac1SMarcel Holtmann 	return 0;
732d2ab0ac1SMarcel Holtmann }
733d2ab0ac1SMarcel Holtmann 
734d2ab0ac1SMarcel Holtmann static int white_list_open(struct inode *inode, struct file *file)
735d2ab0ac1SMarcel Holtmann {
736d2ab0ac1SMarcel Holtmann 	return single_open(file, white_list_show, inode->i_private);
737d2ab0ac1SMarcel Holtmann }
738d2ab0ac1SMarcel Holtmann 
739d2ab0ac1SMarcel Holtmann static const struct file_operations white_list_fops = {
740d2ab0ac1SMarcel Holtmann 	.open		= white_list_open,
741d2ab0ac1SMarcel Holtmann 	.read		= seq_read,
742d2ab0ac1SMarcel Holtmann 	.llseek		= seq_lseek,
743d2ab0ac1SMarcel Holtmann 	.release	= single_release,
744d2ab0ac1SMarcel Holtmann };
745d2ab0ac1SMarcel Holtmann 
7463698d704SMarcel Holtmann static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
7473698d704SMarcel Holtmann {
7483698d704SMarcel Holtmann 	struct hci_dev *hdev = f->private;
749adae20cbSJohan Hedberg 	struct smp_irk *irk;
7503698d704SMarcel Holtmann 
751adae20cbSJohan Hedberg 	rcu_read_lock();
752adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
7533698d704SMarcel Holtmann 		seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
7543698d704SMarcel Holtmann 			   &irk->bdaddr, irk->addr_type,
7553698d704SMarcel Holtmann 			   16, irk->val, &irk->rpa);
7563698d704SMarcel Holtmann 	}
757adae20cbSJohan Hedberg 	rcu_read_unlock();
7583698d704SMarcel Holtmann 
7593698d704SMarcel Holtmann 	return 0;
7603698d704SMarcel Holtmann }
7613698d704SMarcel Holtmann 
7623698d704SMarcel Holtmann static int identity_resolving_keys_open(struct inode *inode, struct file *file)
7633698d704SMarcel Holtmann {
7643698d704SMarcel Holtmann 	return single_open(file, identity_resolving_keys_show,
7653698d704SMarcel Holtmann 			   inode->i_private);
7663698d704SMarcel Holtmann }
7673698d704SMarcel Holtmann 
7683698d704SMarcel Holtmann static const struct file_operations identity_resolving_keys_fops = {
7693698d704SMarcel Holtmann 	.open		= identity_resolving_keys_open,
7703698d704SMarcel Holtmann 	.read		= seq_read,
7713698d704SMarcel Holtmann 	.llseek		= seq_lseek,
7723698d704SMarcel Holtmann 	.release	= single_release,
7733698d704SMarcel Holtmann };
7743698d704SMarcel Holtmann 
7758f8625cdSMarcel Holtmann static int long_term_keys_show(struct seq_file *f, void *ptr)
7768f8625cdSMarcel Holtmann {
7778f8625cdSMarcel Holtmann 	struct hci_dev *hdev = f->private;
778970d0f1bSJohan Hedberg 	struct smp_ltk *ltk;
7798f8625cdSMarcel Holtmann 
780970d0f1bSJohan Hedberg 	rcu_read_lock();
781970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(ltk, &hdev->long_term_keys, list)
782fe39c7b2SMarcel Holtmann 		seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
7838f8625cdSMarcel Holtmann 			   &ltk->bdaddr, ltk->bdaddr_type, ltk->authenticated,
7848f8625cdSMarcel Holtmann 			   ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
785fe39c7b2SMarcel Holtmann 			   __le64_to_cpu(ltk->rand), 16, ltk->val);
786970d0f1bSJohan Hedberg 	rcu_read_unlock();
7878f8625cdSMarcel Holtmann 
7888f8625cdSMarcel Holtmann 	return 0;
7898f8625cdSMarcel Holtmann }
7908f8625cdSMarcel Holtmann 
7918f8625cdSMarcel Holtmann static int long_term_keys_open(struct inode *inode, struct file *file)
7928f8625cdSMarcel Holtmann {
7938f8625cdSMarcel Holtmann 	return single_open(file, long_term_keys_show, inode->i_private);
7948f8625cdSMarcel Holtmann }
7958f8625cdSMarcel Holtmann 
7968f8625cdSMarcel Holtmann static const struct file_operations long_term_keys_fops = {
7978f8625cdSMarcel Holtmann 	.open		= long_term_keys_open,
7988f8625cdSMarcel Holtmann 	.read		= seq_read,
7998f8625cdSMarcel Holtmann 	.llseek		= seq_lseek,
8008f8625cdSMarcel Holtmann 	.release	= single_release,
8018f8625cdSMarcel Holtmann };
8028f8625cdSMarcel Holtmann 
8034e70c7e7SMarcel Holtmann static int conn_min_interval_set(void *data, u64 val)
8044e70c7e7SMarcel Holtmann {
8054e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8064e70c7e7SMarcel Holtmann 
8074e70c7e7SMarcel Holtmann 	if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
8084e70c7e7SMarcel Holtmann 		return -EINVAL;
8094e70c7e7SMarcel Holtmann 
8104e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8114e70c7e7SMarcel Holtmann 	hdev->le_conn_min_interval = val;
8124e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8134e70c7e7SMarcel Holtmann 
8144e70c7e7SMarcel Holtmann 	return 0;
8154e70c7e7SMarcel Holtmann }
8164e70c7e7SMarcel Holtmann 
8174e70c7e7SMarcel Holtmann static int conn_min_interval_get(void *data, u64 *val)
8184e70c7e7SMarcel Holtmann {
8194e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8204e70c7e7SMarcel Holtmann 
8214e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8224e70c7e7SMarcel Holtmann 	*val = hdev->le_conn_min_interval;
8234e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8244e70c7e7SMarcel Holtmann 
8254e70c7e7SMarcel Holtmann 	return 0;
8264e70c7e7SMarcel Holtmann }
8274e70c7e7SMarcel Holtmann 
8284e70c7e7SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
8294e70c7e7SMarcel Holtmann 			conn_min_interval_set, "%llu\n");
8304e70c7e7SMarcel Holtmann 
8314e70c7e7SMarcel Holtmann static int conn_max_interval_set(void *data, u64 val)
8324e70c7e7SMarcel Holtmann {
8334e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8344e70c7e7SMarcel Holtmann 
8354e70c7e7SMarcel Holtmann 	if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
8364e70c7e7SMarcel Holtmann 		return -EINVAL;
8374e70c7e7SMarcel Holtmann 
8384e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8394e70c7e7SMarcel Holtmann 	hdev->le_conn_max_interval = val;
8404e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8414e70c7e7SMarcel Holtmann 
8424e70c7e7SMarcel Holtmann 	return 0;
8434e70c7e7SMarcel Holtmann }
8444e70c7e7SMarcel Holtmann 
8454e70c7e7SMarcel Holtmann static int conn_max_interval_get(void *data, u64 *val)
8464e70c7e7SMarcel Holtmann {
8474e70c7e7SMarcel Holtmann 	struct hci_dev *hdev = data;
8484e70c7e7SMarcel Holtmann 
8494e70c7e7SMarcel Holtmann 	hci_dev_lock(hdev);
8504e70c7e7SMarcel Holtmann 	*val = hdev->le_conn_max_interval;
8514e70c7e7SMarcel Holtmann 	hci_dev_unlock(hdev);
8524e70c7e7SMarcel Holtmann 
8534e70c7e7SMarcel Holtmann 	return 0;
8544e70c7e7SMarcel Holtmann }
8554e70c7e7SMarcel Holtmann 
8564e70c7e7SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
8574e70c7e7SMarcel Holtmann 			conn_max_interval_set, "%llu\n");
8584e70c7e7SMarcel Holtmann 
859816a93d1SMarcel Holtmann static int conn_latency_set(void *data, u64 val)
860816a93d1SMarcel Holtmann {
861816a93d1SMarcel Holtmann 	struct hci_dev *hdev = data;
862816a93d1SMarcel Holtmann 
863816a93d1SMarcel Holtmann 	if (val > 0x01f3)
864816a93d1SMarcel Holtmann 		return -EINVAL;
865816a93d1SMarcel Holtmann 
866816a93d1SMarcel Holtmann 	hci_dev_lock(hdev);
867816a93d1SMarcel Holtmann 	hdev->le_conn_latency = val;
868816a93d1SMarcel Holtmann 	hci_dev_unlock(hdev);
869816a93d1SMarcel Holtmann 
870816a93d1SMarcel Holtmann 	return 0;
871816a93d1SMarcel Holtmann }
872816a93d1SMarcel Holtmann 
873816a93d1SMarcel Holtmann static int conn_latency_get(void *data, u64 *val)
874816a93d1SMarcel Holtmann {
875816a93d1SMarcel Holtmann 	struct hci_dev *hdev = data;
876816a93d1SMarcel Holtmann 
877816a93d1SMarcel Holtmann 	hci_dev_lock(hdev);
878816a93d1SMarcel Holtmann 	*val = hdev->le_conn_latency;
879816a93d1SMarcel Holtmann 	hci_dev_unlock(hdev);
880816a93d1SMarcel Holtmann 
881816a93d1SMarcel Holtmann 	return 0;
882816a93d1SMarcel Holtmann }
883816a93d1SMarcel Holtmann 
884816a93d1SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops, conn_latency_get,
885816a93d1SMarcel Holtmann 			conn_latency_set, "%llu\n");
886816a93d1SMarcel Holtmann 
887f1649577SMarcel Holtmann static int supervision_timeout_set(void *data, u64 val)
888f1649577SMarcel Holtmann {
889f1649577SMarcel Holtmann 	struct hci_dev *hdev = data;
890f1649577SMarcel Holtmann 
891f1649577SMarcel Holtmann 	if (val < 0x000a || val > 0x0c80)
892f1649577SMarcel Holtmann 		return -EINVAL;
893f1649577SMarcel Holtmann 
894f1649577SMarcel Holtmann 	hci_dev_lock(hdev);
895f1649577SMarcel Holtmann 	hdev->le_supv_timeout = val;
896f1649577SMarcel Holtmann 	hci_dev_unlock(hdev);
897f1649577SMarcel Holtmann 
898f1649577SMarcel Holtmann 	return 0;
899f1649577SMarcel Holtmann }
900f1649577SMarcel Holtmann 
901f1649577SMarcel Holtmann static int supervision_timeout_get(void *data, u64 *val)
902f1649577SMarcel Holtmann {
903f1649577SMarcel Holtmann 	struct hci_dev *hdev = data;
904f1649577SMarcel Holtmann 
905f1649577SMarcel Holtmann 	hci_dev_lock(hdev);
906f1649577SMarcel Holtmann 	*val = hdev->le_supv_timeout;
907f1649577SMarcel Holtmann 	hci_dev_unlock(hdev);
908f1649577SMarcel Holtmann 
909f1649577SMarcel Holtmann 	return 0;
910f1649577SMarcel Holtmann }
911f1649577SMarcel Holtmann 
912f1649577SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
913f1649577SMarcel Holtmann 			supervision_timeout_set, "%llu\n");
914f1649577SMarcel Holtmann 
9153f959d46SMarcel Holtmann static int adv_channel_map_set(void *data, u64 val)
9163f959d46SMarcel Holtmann {
9173f959d46SMarcel Holtmann 	struct hci_dev *hdev = data;
9183f959d46SMarcel Holtmann 
9193f959d46SMarcel Holtmann 	if (val < 0x01 || val > 0x07)
9203f959d46SMarcel Holtmann 		return -EINVAL;
9213f959d46SMarcel Holtmann 
9223f959d46SMarcel Holtmann 	hci_dev_lock(hdev);
9233f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = val;
9243f959d46SMarcel Holtmann 	hci_dev_unlock(hdev);
9253f959d46SMarcel Holtmann 
9263f959d46SMarcel Holtmann 	return 0;
9273f959d46SMarcel Holtmann }
9283f959d46SMarcel Holtmann 
9293f959d46SMarcel Holtmann static int adv_channel_map_get(void *data, u64 *val)
9303f959d46SMarcel Holtmann {
9313f959d46SMarcel Holtmann 	struct hci_dev *hdev = data;
9323f959d46SMarcel Holtmann 
9333f959d46SMarcel Holtmann 	hci_dev_lock(hdev);
9343f959d46SMarcel Holtmann 	*val = hdev->le_adv_channel_map;
9353f959d46SMarcel Holtmann 	hci_dev_unlock(hdev);
9363f959d46SMarcel Holtmann 
9373f959d46SMarcel Holtmann 	return 0;
9383f959d46SMarcel Holtmann }
9393f959d46SMarcel Holtmann 
9403f959d46SMarcel Holtmann DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
9413f959d46SMarcel Holtmann 			adv_channel_map_set, "%llu\n");
9423f959d46SMarcel Holtmann 
943729a1051SGeorg Lukas static int adv_min_interval_set(void *data, u64 val)
94489863109SJukka Rissanen {
945729a1051SGeorg Lukas 	struct hci_dev *hdev = data;
94689863109SJukka Rissanen 
947729a1051SGeorg Lukas 	if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
94889863109SJukka Rissanen 		return -EINVAL;
94989863109SJukka Rissanen 
9507d474e06SAndre Guedes 	hci_dev_lock(hdev);
951729a1051SGeorg Lukas 	hdev->le_adv_min_interval = val;
9527d474e06SAndre Guedes 	hci_dev_unlock(hdev);
9537d474e06SAndre Guedes 
9547d474e06SAndre Guedes 	return 0;
9557d474e06SAndre Guedes }
9567d474e06SAndre Guedes 
957729a1051SGeorg Lukas static int adv_min_interval_get(void *data, u64 *val)
9587d474e06SAndre Guedes {
959729a1051SGeorg Lukas 	struct hci_dev *hdev = data;
960729a1051SGeorg Lukas 
961729a1051SGeorg Lukas 	hci_dev_lock(hdev);
962729a1051SGeorg Lukas 	*val = hdev->le_adv_min_interval;
963729a1051SGeorg Lukas 	hci_dev_unlock(hdev);
964729a1051SGeorg Lukas 
965729a1051SGeorg Lukas 	return 0;
9667d474e06SAndre Guedes }
9677d474e06SAndre Guedes 
968729a1051SGeorg Lukas DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
969729a1051SGeorg Lukas 			adv_min_interval_set, "%llu\n");
9707d474e06SAndre Guedes 
971729a1051SGeorg Lukas static int adv_max_interval_set(void *data, u64 val)
972729a1051SGeorg Lukas {
973729a1051SGeorg Lukas 	struct hci_dev *hdev = data;
974729a1051SGeorg Lukas 
975729a1051SGeorg Lukas 	if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
9767d474e06SAndre Guedes 		return -EINVAL;
9777d474e06SAndre Guedes 
9787d474e06SAndre Guedes 	hci_dev_lock(hdev);
979729a1051SGeorg Lukas 	hdev->le_adv_max_interval = val;
9807d474e06SAndre Guedes 	hci_dev_unlock(hdev);
9817d474e06SAndre Guedes 
982729a1051SGeorg Lukas 	return 0;
9837d474e06SAndre Guedes }
9847d474e06SAndre Guedes 
985729a1051SGeorg Lukas static int adv_max_interval_get(void *data, u64 *val)
986729a1051SGeorg Lukas {
987729a1051SGeorg Lukas 	struct hci_dev *hdev = data;
988729a1051SGeorg Lukas 
9897d474e06SAndre Guedes 	hci_dev_lock(hdev);
990729a1051SGeorg Lukas 	*val = hdev->le_adv_max_interval;
9917d474e06SAndre Guedes 	hci_dev_unlock(hdev);
992729a1051SGeorg Lukas 
993729a1051SGeorg Lukas 	return 0;
994729a1051SGeorg Lukas }
995729a1051SGeorg Lukas 
996729a1051SGeorg Lukas DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
997729a1051SGeorg Lukas 			adv_max_interval_set, "%llu\n");
998729a1051SGeorg Lukas 
9990b3c7d37SMarcel Holtmann static int device_list_show(struct seq_file *f, void *ptr)
10007d474e06SAndre Guedes {
10010b3c7d37SMarcel Holtmann 	struct hci_dev *hdev = f->private;
10027d474e06SAndre Guedes 	struct hci_conn_params *p;
100340f4938aSMarcel Holtmann 	struct bdaddr_list *b;
10047d474e06SAndre Guedes 
10057d474e06SAndre Guedes 	hci_dev_lock(hdev);
100640f4938aSMarcel Holtmann 	list_for_each_entry(b, &hdev->whitelist, list)
100740f4938aSMarcel Holtmann 		seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
10087d474e06SAndre Guedes 	list_for_each_entry(p, &hdev->le_conn_params, list) {
100940f4938aSMarcel Holtmann 		seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type,
10107d474e06SAndre Guedes 			   p->auto_connect);
10117d474e06SAndre Guedes 	}
10127d474e06SAndre Guedes 	hci_dev_unlock(hdev);
10137d474e06SAndre Guedes 
10147d474e06SAndre Guedes 	return 0;
10157d474e06SAndre Guedes }
10167d474e06SAndre Guedes 
10170b3c7d37SMarcel Holtmann static int device_list_open(struct inode *inode, struct file *file)
10187d474e06SAndre Guedes {
10190b3c7d37SMarcel Holtmann 	return single_open(file, device_list_show, inode->i_private);
10207d474e06SAndre Guedes }
10217d474e06SAndre Guedes 
10220b3c7d37SMarcel Holtmann static const struct file_operations device_list_fops = {
10230b3c7d37SMarcel Holtmann 	.open		= device_list_open,
10247d474e06SAndre Guedes 	.read		= seq_read,
10257d474e06SAndre Guedes 	.llseek		= seq_lseek,
10267d474e06SAndre Guedes 	.release	= single_release,
10277d474e06SAndre Guedes };
10287d474e06SAndre Guedes 
10291da177e4SLinus Torvalds /* ---- HCI requests ---- */
10301da177e4SLinus Torvalds 
103142c6b129SJohan Hedberg static void hci_req_sync_complete(struct hci_dev *hdev, u8 result)
10321da177e4SLinus Torvalds {
103342c6b129SJohan Hedberg 	BT_DBG("%s result 0x%2.2x", hdev->name, result);
103475fb0e32SJohan Hedberg 
10351da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
10361da177e4SLinus Torvalds 		hdev->req_result = result;
10371da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_DONE;
10381da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
10391da177e4SLinus Torvalds 	}
10401da177e4SLinus Torvalds }
10411da177e4SLinus Torvalds 
10421da177e4SLinus Torvalds static void hci_req_cancel(struct hci_dev *hdev, int err)
10431da177e4SLinus Torvalds {
10441da177e4SLinus Torvalds 	BT_DBG("%s err 0x%2.2x", hdev->name, err);
10451da177e4SLinus Torvalds 
10461da177e4SLinus Torvalds 	if (hdev->req_status == HCI_REQ_PEND) {
10471da177e4SLinus Torvalds 		hdev->req_result = err;
10481da177e4SLinus Torvalds 		hdev->req_status = HCI_REQ_CANCELED;
10491da177e4SLinus Torvalds 		wake_up_interruptible(&hdev->req_wait_q);
10501da177e4SLinus Torvalds 	}
10511da177e4SLinus Torvalds }
10521da177e4SLinus Torvalds 
105377a63e0aSFengguang Wu static struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
105477a63e0aSFengguang Wu 					    u8 event)
105575e84b7cSJohan Hedberg {
105675e84b7cSJohan Hedberg 	struct hci_ev_cmd_complete *ev;
105775e84b7cSJohan Hedberg 	struct hci_event_hdr *hdr;
105875e84b7cSJohan Hedberg 	struct sk_buff *skb;
105975e84b7cSJohan Hedberg 
106075e84b7cSJohan Hedberg 	hci_dev_lock(hdev);
106175e84b7cSJohan Hedberg 
106275e84b7cSJohan Hedberg 	skb = hdev->recv_evt;
106375e84b7cSJohan Hedberg 	hdev->recv_evt = NULL;
106475e84b7cSJohan Hedberg 
106575e84b7cSJohan Hedberg 	hci_dev_unlock(hdev);
106675e84b7cSJohan Hedberg 
106775e84b7cSJohan Hedberg 	if (!skb)
106875e84b7cSJohan Hedberg 		return ERR_PTR(-ENODATA);
106975e84b7cSJohan Hedberg 
107075e84b7cSJohan Hedberg 	if (skb->len < sizeof(*hdr)) {
107175e84b7cSJohan Hedberg 		BT_ERR("Too short HCI event");
107275e84b7cSJohan Hedberg 		goto failed;
107375e84b7cSJohan Hedberg 	}
107475e84b7cSJohan Hedberg 
107575e84b7cSJohan Hedberg 	hdr = (void *) skb->data;
107675e84b7cSJohan Hedberg 	skb_pull(skb, HCI_EVENT_HDR_SIZE);
107775e84b7cSJohan Hedberg 
10787b1abbbeSJohan Hedberg 	if (event) {
10797b1abbbeSJohan Hedberg 		if (hdr->evt != event)
10807b1abbbeSJohan Hedberg 			goto failed;
10817b1abbbeSJohan Hedberg 		return skb;
10827b1abbbeSJohan Hedberg 	}
10837b1abbbeSJohan Hedberg 
108475e84b7cSJohan Hedberg 	if (hdr->evt != HCI_EV_CMD_COMPLETE) {
108575e84b7cSJohan Hedberg 		BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
108675e84b7cSJohan Hedberg 		goto failed;
108775e84b7cSJohan Hedberg 	}
108875e84b7cSJohan Hedberg 
108975e84b7cSJohan Hedberg 	if (skb->len < sizeof(*ev)) {
109075e84b7cSJohan Hedberg 		BT_ERR("Too short cmd_complete event");
109175e84b7cSJohan Hedberg 		goto failed;
109275e84b7cSJohan Hedberg 	}
109375e84b7cSJohan Hedberg 
109475e84b7cSJohan Hedberg 	ev = (void *) skb->data;
109575e84b7cSJohan Hedberg 	skb_pull(skb, sizeof(*ev));
109675e84b7cSJohan Hedberg 
109775e84b7cSJohan Hedberg 	if (opcode == __le16_to_cpu(ev->opcode))
109875e84b7cSJohan Hedberg 		return skb;
109975e84b7cSJohan Hedberg 
110075e84b7cSJohan Hedberg 	BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
110175e84b7cSJohan Hedberg 	       __le16_to_cpu(ev->opcode));
110275e84b7cSJohan Hedberg 
110375e84b7cSJohan Hedberg failed:
110475e84b7cSJohan Hedberg 	kfree_skb(skb);
110575e84b7cSJohan Hedberg 	return ERR_PTR(-ENODATA);
110675e84b7cSJohan Hedberg }
110775e84b7cSJohan Hedberg 
11087b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
110907dc93ddSJohan Hedberg 				  const void *param, u8 event, u32 timeout)
111075e84b7cSJohan Hedberg {
111175e84b7cSJohan Hedberg 	DECLARE_WAITQUEUE(wait, current);
111275e84b7cSJohan Hedberg 	struct hci_request req;
111375e84b7cSJohan Hedberg 	int err = 0;
111475e84b7cSJohan Hedberg 
111575e84b7cSJohan Hedberg 	BT_DBG("%s", hdev->name);
111675e84b7cSJohan Hedberg 
111775e84b7cSJohan Hedberg 	hci_req_init(&req, hdev);
111875e84b7cSJohan Hedberg 
11197b1abbbeSJohan Hedberg 	hci_req_add_ev(&req, opcode, plen, param, event);
112075e84b7cSJohan Hedberg 
112175e84b7cSJohan Hedberg 	hdev->req_status = HCI_REQ_PEND;
112275e84b7cSJohan Hedberg 
112375e84b7cSJohan Hedberg 	add_wait_queue(&hdev->req_wait_q, &wait);
112475e84b7cSJohan Hedberg 	set_current_state(TASK_INTERRUPTIBLE);
112575e84b7cSJohan Hedberg 
1126039fada5SChan-yeol Park 	err = hci_req_run(&req, hci_req_sync_complete);
1127039fada5SChan-yeol Park 	if (err < 0) {
1128039fada5SChan-yeol Park 		remove_wait_queue(&hdev->req_wait_q, &wait);
112922a3ceabSJohan Hedberg 		set_current_state(TASK_RUNNING);
1130039fada5SChan-yeol Park 		return ERR_PTR(err);
1131039fada5SChan-yeol Park 	}
1132039fada5SChan-yeol Park 
113375e84b7cSJohan Hedberg 	schedule_timeout(timeout);
113475e84b7cSJohan Hedberg 
113575e84b7cSJohan Hedberg 	remove_wait_queue(&hdev->req_wait_q, &wait);
113675e84b7cSJohan Hedberg 
113775e84b7cSJohan Hedberg 	if (signal_pending(current))
113875e84b7cSJohan Hedberg 		return ERR_PTR(-EINTR);
113975e84b7cSJohan Hedberg 
114075e84b7cSJohan Hedberg 	switch (hdev->req_status) {
114175e84b7cSJohan Hedberg 	case HCI_REQ_DONE:
114275e84b7cSJohan Hedberg 		err = -bt_to_errno(hdev->req_result);
114375e84b7cSJohan Hedberg 		break;
114475e84b7cSJohan Hedberg 
114575e84b7cSJohan Hedberg 	case HCI_REQ_CANCELED:
114675e84b7cSJohan Hedberg 		err = -hdev->req_result;
114775e84b7cSJohan Hedberg 		break;
114875e84b7cSJohan Hedberg 
114975e84b7cSJohan Hedberg 	default:
115075e84b7cSJohan Hedberg 		err = -ETIMEDOUT;
115175e84b7cSJohan Hedberg 		break;
115275e84b7cSJohan Hedberg 	}
115375e84b7cSJohan Hedberg 
115475e84b7cSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
115575e84b7cSJohan Hedberg 
115675e84b7cSJohan Hedberg 	BT_DBG("%s end: err %d", hdev->name, err);
115775e84b7cSJohan Hedberg 
115875e84b7cSJohan Hedberg 	if (err < 0)
115975e84b7cSJohan Hedberg 		return ERR_PTR(err);
116075e84b7cSJohan Hedberg 
11617b1abbbeSJohan Hedberg 	return hci_get_cmd_complete(hdev, opcode, event);
11627b1abbbeSJohan Hedberg }
11637b1abbbeSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync_ev);
11647b1abbbeSJohan Hedberg 
11657b1abbbeSJohan Hedberg struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
116607dc93ddSJohan Hedberg 			       const void *param, u32 timeout)
11677b1abbbeSJohan Hedberg {
11687b1abbbeSJohan Hedberg 	return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
116975e84b7cSJohan Hedberg }
117075e84b7cSJohan Hedberg EXPORT_SYMBOL(__hci_cmd_sync);
117175e84b7cSJohan Hedberg 
11721da177e4SLinus Torvalds /* Execute request and wait for completion. */
117301178cd4SJohan Hedberg static int __hci_req_sync(struct hci_dev *hdev,
117442c6b129SJohan Hedberg 			  void (*func)(struct hci_request *req,
117542c6b129SJohan Hedberg 				      unsigned long opt),
11761da177e4SLinus Torvalds 			  unsigned long opt, __u32 timeout)
11771da177e4SLinus Torvalds {
117842c6b129SJohan Hedberg 	struct hci_request req;
11791da177e4SLinus Torvalds 	DECLARE_WAITQUEUE(wait, current);
11801da177e4SLinus Torvalds 	int err = 0;
11811da177e4SLinus Torvalds 
11821da177e4SLinus Torvalds 	BT_DBG("%s start", hdev->name);
11831da177e4SLinus Torvalds 
118442c6b129SJohan Hedberg 	hci_req_init(&req, hdev);
118542c6b129SJohan Hedberg 
11861da177e4SLinus Torvalds 	hdev->req_status = HCI_REQ_PEND;
11871da177e4SLinus Torvalds 
118842c6b129SJohan Hedberg 	func(&req, opt);
118953cce22dSJohan Hedberg 
1190039fada5SChan-yeol Park 	add_wait_queue(&hdev->req_wait_q, &wait);
1191039fada5SChan-yeol Park 	set_current_state(TASK_INTERRUPTIBLE);
1192039fada5SChan-yeol Park 
119342c6b129SJohan Hedberg 	err = hci_req_run(&req, hci_req_sync_complete);
119442c6b129SJohan Hedberg 	if (err < 0) {
119553cce22dSJohan Hedberg 		hdev->req_status = 0;
1196920c8300SAndre Guedes 
1197039fada5SChan-yeol Park 		remove_wait_queue(&hdev->req_wait_q, &wait);
119822a3ceabSJohan Hedberg 		set_current_state(TASK_RUNNING);
1199039fada5SChan-yeol Park 
1200920c8300SAndre Guedes 		/* ENODATA means the HCI request command queue is empty.
1201920c8300SAndre Guedes 		 * This can happen when a request with conditionals doesn't
1202920c8300SAndre Guedes 		 * trigger any commands to be sent. This is normal behavior
1203920c8300SAndre Guedes 		 * and should not trigger an error return.
120442c6b129SJohan Hedberg 		 */
1205920c8300SAndre Guedes 		if (err == -ENODATA)
120642c6b129SJohan Hedberg 			return 0;
1207920c8300SAndre Guedes 
1208920c8300SAndre Guedes 		return err;
120953cce22dSJohan Hedberg 	}
121053cce22dSJohan Hedberg 
12111da177e4SLinus Torvalds 	schedule_timeout(timeout);
12121da177e4SLinus Torvalds 
12131da177e4SLinus Torvalds 	remove_wait_queue(&hdev->req_wait_q, &wait);
12141da177e4SLinus Torvalds 
12151da177e4SLinus Torvalds 	if (signal_pending(current))
12161da177e4SLinus Torvalds 		return -EINTR;
12171da177e4SLinus Torvalds 
12181da177e4SLinus Torvalds 	switch (hdev->req_status) {
12191da177e4SLinus Torvalds 	case HCI_REQ_DONE:
1220e175072fSJoe Perches 		err = -bt_to_errno(hdev->req_result);
12211da177e4SLinus Torvalds 		break;
12221da177e4SLinus Torvalds 
12231da177e4SLinus Torvalds 	case HCI_REQ_CANCELED:
12241da177e4SLinus Torvalds 		err = -hdev->req_result;
12251da177e4SLinus Torvalds 		break;
12261da177e4SLinus Torvalds 
12271da177e4SLinus Torvalds 	default:
12281da177e4SLinus Torvalds 		err = -ETIMEDOUT;
12291da177e4SLinus Torvalds 		break;
12303ff50b79SStephen Hemminger 	}
12311da177e4SLinus Torvalds 
1232a5040efaSJohan Hedberg 	hdev->req_status = hdev->req_result = 0;
12331da177e4SLinus Torvalds 
12341da177e4SLinus Torvalds 	BT_DBG("%s end: err %d", hdev->name, err);
12351da177e4SLinus Torvalds 
12361da177e4SLinus Torvalds 	return err;
12371da177e4SLinus Torvalds }
12381da177e4SLinus Torvalds 
123901178cd4SJohan Hedberg static int hci_req_sync(struct hci_dev *hdev,
124042c6b129SJohan Hedberg 			void (*req)(struct hci_request *req,
124142c6b129SJohan Hedberg 				    unsigned long opt),
12421da177e4SLinus Torvalds 			unsigned long opt, __u32 timeout)
12431da177e4SLinus Torvalds {
12441da177e4SLinus Torvalds 	int ret;
12451da177e4SLinus Torvalds 
12467c6a329eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags))
12477c6a329eSMarcel Holtmann 		return -ENETDOWN;
12487c6a329eSMarcel Holtmann 
12491da177e4SLinus Torvalds 	/* Serialize all requests */
12501da177e4SLinus Torvalds 	hci_req_lock(hdev);
125101178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, req, opt, timeout);
12521da177e4SLinus Torvalds 	hci_req_unlock(hdev);
12531da177e4SLinus Torvalds 
12541da177e4SLinus Torvalds 	return ret;
12551da177e4SLinus Torvalds }
12561da177e4SLinus Torvalds 
125742c6b129SJohan Hedberg static void hci_reset_req(struct hci_request *req, unsigned long opt)
12581da177e4SLinus Torvalds {
125942c6b129SJohan Hedberg 	BT_DBG("%s %ld", req->hdev->name, opt);
12601da177e4SLinus Torvalds 
12611da177e4SLinus Torvalds 	/* Reset device */
126242c6b129SJohan Hedberg 	set_bit(HCI_RESET, &req->hdev->flags);
126342c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_RESET, 0, NULL);
12641da177e4SLinus Torvalds }
12651da177e4SLinus Torvalds 
126642c6b129SJohan Hedberg static void bredr_init(struct hci_request *req)
12671da177e4SLinus Torvalds {
126842c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
12692455a3eaSAndrei Emeltchenko 
12701da177e4SLinus Torvalds 	/* Read Local Supported Features */
127142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
12721da177e4SLinus Torvalds 
12731143e5a6SMarcel Holtmann 	/* Read Local Version */
127442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
12752177bab5SJohan Hedberg 
12762177bab5SJohan Hedberg 	/* Read BD Address */
127742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
12781da177e4SLinus Torvalds }
12791da177e4SLinus Torvalds 
128042c6b129SJohan Hedberg static void amp_init(struct hci_request *req)
1281e61ef499SAndrei Emeltchenko {
128242c6b129SJohan Hedberg 	req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
12832455a3eaSAndrei Emeltchenko 
1284e61ef499SAndrei Emeltchenko 	/* Read Local Version */
128542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
12866bcbc489SAndrei Emeltchenko 
1287f6996cfeSMarcel Holtmann 	/* Read Local Supported Commands */
1288f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
1289f6996cfeSMarcel Holtmann 
1290f6996cfeSMarcel Holtmann 	/* Read Local Supported Features */
1291f6996cfeSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
1292f6996cfeSMarcel Holtmann 
12936bcbc489SAndrei Emeltchenko 	/* Read Local AMP Info */
129442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
1295e71dfabaSAndrei Emeltchenko 
1296e71dfabaSAndrei Emeltchenko 	/* Read Data Blk size */
129742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
12987528ca1cSMarcel Holtmann 
1299f38ba941SMarcel Holtmann 	/* Read Flow Control Mode */
1300f38ba941SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL);
1301f38ba941SMarcel Holtmann 
13027528ca1cSMarcel Holtmann 	/* Read Location Data */
13037528ca1cSMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL);
1304e61ef499SAndrei Emeltchenko }
1305e61ef499SAndrei Emeltchenko 
130642c6b129SJohan Hedberg static void hci_init1_req(struct hci_request *req, unsigned long opt)
1307e61ef499SAndrei Emeltchenko {
130842c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1309e61ef499SAndrei Emeltchenko 
1310e61ef499SAndrei Emeltchenko 	BT_DBG("%s %ld", hdev->name, opt);
1311e61ef499SAndrei Emeltchenko 
131211778716SAndrei Emeltchenko 	/* Reset */
131311778716SAndrei Emeltchenko 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
131442c6b129SJohan Hedberg 		hci_reset_req(req, 0);
131511778716SAndrei Emeltchenko 
1316e61ef499SAndrei Emeltchenko 	switch (hdev->dev_type) {
1317e61ef499SAndrei Emeltchenko 	case HCI_BREDR:
131842c6b129SJohan Hedberg 		bredr_init(req);
1319e61ef499SAndrei Emeltchenko 		break;
1320e61ef499SAndrei Emeltchenko 
1321e61ef499SAndrei Emeltchenko 	case HCI_AMP:
132242c6b129SJohan Hedberg 		amp_init(req);
1323e61ef499SAndrei Emeltchenko 		break;
1324e61ef499SAndrei Emeltchenko 
1325e61ef499SAndrei Emeltchenko 	default:
1326e61ef499SAndrei Emeltchenko 		BT_ERR("Unknown device type %d", hdev->dev_type);
1327e61ef499SAndrei Emeltchenko 		break;
1328e61ef499SAndrei Emeltchenko 	}
1329e61ef499SAndrei Emeltchenko }
1330e61ef499SAndrei Emeltchenko 
133142c6b129SJohan Hedberg static void bredr_setup(struct hci_request *req)
13322177bab5SJohan Hedberg {
13334ca048e3SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
13344ca048e3SMarcel Holtmann 
13352177bab5SJohan Hedberg 	__le16 param;
13362177bab5SJohan Hedberg 	__u8 flt_type;
13372177bab5SJohan Hedberg 
13382177bab5SJohan Hedberg 	/* Read Buffer Size (ACL mtu, max pkt, etc.) */
133942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
13402177bab5SJohan Hedberg 
13412177bab5SJohan Hedberg 	/* Read Class of Device */
134242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
13432177bab5SJohan Hedberg 
13442177bab5SJohan Hedberg 	/* Read Local Name */
134542c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
13462177bab5SJohan Hedberg 
13472177bab5SJohan Hedberg 	/* Read Voice Setting */
134842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
13492177bab5SJohan Hedberg 
1350b4cb9fb2SMarcel Holtmann 	/* Read Number of Supported IAC */
1351b4cb9fb2SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL);
1352b4cb9fb2SMarcel Holtmann 
13534b836f39SMarcel Holtmann 	/* Read Current IAC LAP */
13544b836f39SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL);
13554b836f39SMarcel Holtmann 
13562177bab5SJohan Hedberg 	/* Clear Event Filters */
13572177bab5SJohan Hedberg 	flt_type = HCI_FLT_CLEAR_ALL;
135842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
13592177bab5SJohan Hedberg 
13602177bab5SJohan Hedberg 	/* Connection accept timeout ~20 secs */
1361dcf4adbfSJoe Perches 	param = cpu_to_le16(0x7d00);
136242c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
13632177bab5SJohan Hedberg 
13644ca048e3SMarcel Holtmann 	/* AVM Berlin (31), aka "BlueFRITZ!", reports version 1.2,
13654ca048e3SMarcel Holtmann 	 * but it does not support page scan related HCI commands.
13664ca048e3SMarcel Holtmann 	 */
13674ca048e3SMarcel Holtmann 	if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1) {
1368f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
1369f332ec66SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
1370f332ec66SJohan Hedberg 	}
13712177bab5SJohan Hedberg }
13722177bab5SJohan Hedberg 
137342c6b129SJohan Hedberg static void le_setup(struct hci_request *req)
13742177bab5SJohan Hedberg {
1375c73eee91SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1376c73eee91SJohan Hedberg 
13772177bab5SJohan Hedberg 	/* Read LE Buffer Size */
137842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
13792177bab5SJohan Hedberg 
13802177bab5SJohan Hedberg 	/* Read LE Local Supported Features */
138142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
13822177bab5SJohan Hedberg 
1383747d3f03SMarcel Holtmann 	/* Read LE Supported States */
1384747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
1385747d3f03SMarcel Holtmann 
13862177bab5SJohan Hedberg 	/* Read LE White List Size */
138742c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
13882177bab5SJohan Hedberg 
1389747d3f03SMarcel Holtmann 	/* Clear LE White List */
1390747d3f03SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
1391c73eee91SJohan Hedberg 
1392c73eee91SJohan Hedberg 	/* LE-only controllers have LE implicitly enabled */
1393c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
1394c73eee91SJohan Hedberg 		set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
13952177bab5SJohan Hedberg }
13962177bab5SJohan Hedberg 
13972177bab5SJohan Hedberg static u8 hci_get_inquiry_mode(struct hci_dev *hdev)
13982177bab5SJohan Hedberg {
13992177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
14002177bab5SJohan Hedberg 		return 0x02;
14012177bab5SJohan Hedberg 
14022177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
14032177bab5SJohan Hedberg 		return 0x01;
14042177bab5SJohan Hedberg 
14052177bab5SJohan Hedberg 	if (hdev->manufacturer == 11 && hdev->hci_rev == 0x00 &&
14062177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x0757)
14072177bab5SJohan Hedberg 		return 0x01;
14082177bab5SJohan Hedberg 
14092177bab5SJohan Hedberg 	if (hdev->manufacturer == 15) {
14102177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x03 && hdev->lmp_subver == 0x6963)
14112177bab5SJohan Hedberg 			return 0x01;
14122177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x09 && hdev->lmp_subver == 0x6963)
14132177bab5SJohan Hedberg 			return 0x01;
14142177bab5SJohan Hedberg 		if (hdev->hci_rev == 0x00 && hdev->lmp_subver == 0x6965)
14152177bab5SJohan Hedberg 			return 0x01;
14162177bab5SJohan Hedberg 	}
14172177bab5SJohan Hedberg 
14182177bab5SJohan Hedberg 	if (hdev->manufacturer == 31 && hdev->hci_rev == 0x2005 &&
14192177bab5SJohan Hedberg 	    hdev->lmp_subver == 0x1805)
14202177bab5SJohan Hedberg 		return 0x01;
14212177bab5SJohan Hedberg 
14222177bab5SJohan Hedberg 	return 0x00;
14232177bab5SJohan Hedberg }
14242177bab5SJohan Hedberg 
142542c6b129SJohan Hedberg static void hci_setup_inquiry_mode(struct hci_request *req)
14262177bab5SJohan Hedberg {
14272177bab5SJohan Hedberg 	u8 mode;
14282177bab5SJohan Hedberg 
142942c6b129SJohan Hedberg 	mode = hci_get_inquiry_mode(req->hdev);
14302177bab5SJohan Hedberg 
143142c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
14322177bab5SJohan Hedberg }
14332177bab5SJohan Hedberg 
143442c6b129SJohan Hedberg static void hci_setup_event_mask(struct hci_request *req)
14352177bab5SJohan Hedberg {
143642c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
143742c6b129SJohan Hedberg 
14382177bab5SJohan Hedberg 	/* The second byte is 0xff instead of 0x9f (two reserved bits
14392177bab5SJohan Hedberg 	 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
14402177bab5SJohan Hedberg 	 * command otherwise.
14412177bab5SJohan Hedberg 	 */
14422177bab5SJohan Hedberg 	u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
14432177bab5SJohan Hedberg 
14442177bab5SJohan Hedberg 	/* CSR 1.1 dongles does not accept any bitfield so don't try to set
14452177bab5SJohan Hedberg 	 * any event mask for pre 1.2 devices.
14462177bab5SJohan Hedberg 	 */
14472177bab5SJohan Hedberg 	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
14482177bab5SJohan Hedberg 		return;
14492177bab5SJohan Hedberg 
14502177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
14512177bab5SJohan Hedberg 		events[4] |= 0x01; /* Flow Specification Complete */
14522177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
14532177bab5SJohan Hedberg 		events[4] |= 0x04; /* Read Remote Extended Features Complete */
14542177bab5SJohan Hedberg 		events[5] |= 0x08; /* Synchronous Connection Complete */
14552177bab5SJohan Hedberg 		events[5] |= 0x10; /* Synchronous Connection Changed */
1456c7882cbdSMarcel Holtmann 	} else {
1457c7882cbdSMarcel Holtmann 		/* Use a different default for LE-only devices */
1458c7882cbdSMarcel Holtmann 		memset(events, 0, sizeof(events));
1459c7882cbdSMarcel Holtmann 		events[0] |= 0x10; /* Disconnection Complete */
1460c7882cbdSMarcel Holtmann 		events[1] |= 0x08; /* Read Remote Version Information Complete */
1461c7882cbdSMarcel Holtmann 		events[1] |= 0x20; /* Command Complete */
1462c7882cbdSMarcel Holtmann 		events[1] |= 0x40; /* Command Status */
1463c7882cbdSMarcel Holtmann 		events[1] |= 0x80; /* Hardware Error */
1464c7882cbdSMarcel Holtmann 		events[2] |= 0x04; /* Number of Completed Packets */
1465c7882cbdSMarcel Holtmann 		events[3] |= 0x02; /* Data Buffer Overflow */
14660da71f1bSMarcel Holtmann 
14670da71f1bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION) {
14680da71f1bSMarcel Holtmann 			events[0] |= 0x80; /* Encryption Change */
1469c7882cbdSMarcel Holtmann 			events[5] |= 0x80; /* Encryption Key Refresh Complete */
14702177bab5SJohan Hedberg 		}
14710da71f1bSMarcel Holtmann 	}
14722177bab5SJohan Hedberg 
14732177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
14742177bab5SJohan Hedberg 		events[4] |= 0x02; /* Inquiry Result with RSSI */
14752177bab5SJohan Hedberg 
14762177bab5SJohan Hedberg 	if (lmp_sniffsubr_capable(hdev))
14772177bab5SJohan Hedberg 		events[5] |= 0x20; /* Sniff Subrating */
14782177bab5SJohan Hedberg 
14792177bab5SJohan Hedberg 	if (lmp_pause_enc_capable(hdev))
14802177bab5SJohan Hedberg 		events[5] |= 0x80; /* Encryption Key Refresh Complete */
14812177bab5SJohan Hedberg 
14822177bab5SJohan Hedberg 	if (lmp_ext_inq_capable(hdev))
14832177bab5SJohan Hedberg 		events[5] |= 0x40; /* Extended Inquiry Result */
14842177bab5SJohan Hedberg 
14852177bab5SJohan Hedberg 	if (lmp_no_flush_capable(hdev))
14862177bab5SJohan Hedberg 		events[7] |= 0x01; /* Enhanced Flush Complete */
14872177bab5SJohan Hedberg 
14882177bab5SJohan Hedberg 	if (lmp_lsto_capable(hdev))
14892177bab5SJohan Hedberg 		events[6] |= 0x80; /* Link Supervision Timeout Changed */
14902177bab5SJohan Hedberg 
14912177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
14922177bab5SJohan Hedberg 		events[6] |= 0x01;	/* IO Capability Request */
14932177bab5SJohan Hedberg 		events[6] |= 0x02;	/* IO Capability Response */
14942177bab5SJohan Hedberg 		events[6] |= 0x04;	/* User Confirmation Request */
14952177bab5SJohan Hedberg 		events[6] |= 0x08;	/* User Passkey Request */
14962177bab5SJohan Hedberg 		events[6] |= 0x10;	/* Remote OOB Data Request */
14972177bab5SJohan Hedberg 		events[6] |= 0x20;	/* Simple Pairing Complete */
14982177bab5SJohan Hedberg 		events[7] |= 0x04;	/* User Passkey Notification */
14992177bab5SJohan Hedberg 		events[7] |= 0x08;	/* Keypress Notification */
15002177bab5SJohan Hedberg 		events[7] |= 0x10;	/* Remote Host Supported
15012177bab5SJohan Hedberg 					 * Features Notification
15022177bab5SJohan Hedberg 					 */
15032177bab5SJohan Hedberg 	}
15042177bab5SJohan Hedberg 
15052177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
15062177bab5SJohan Hedberg 		events[7] |= 0x20;	/* LE Meta-Event */
15072177bab5SJohan Hedberg 
150842c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
15092177bab5SJohan Hedberg }
15102177bab5SJohan Hedberg 
151142c6b129SJohan Hedberg static void hci_init2_req(struct hci_request *req, unsigned long opt)
15122177bab5SJohan Hedberg {
151342c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
151442c6b129SJohan Hedberg 
15152177bab5SJohan Hedberg 	if (lmp_bredr_capable(hdev))
151642c6b129SJohan Hedberg 		bredr_setup(req);
151756f87901SJohan Hedberg 	else
151856f87901SJohan Hedberg 		clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
15192177bab5SJohan Hedberg 
15202177bab5SJohan Hedberg 	if (lmp_le_capable(hdev))
152142c6b129SJohan Hedberg 		le_setup(req);
15222177bab5SJohan Hedberg 
15233f8e2d75SJohan Hedberg 	/* AVM Berlin (31), aka "BlueFRITZ!", doesn't support the read
15243f8e2d75SJohan Hedberg 	 * local supported commands HCI command.
15253f8e2d75SJohan Hedberg 	 */
15263f8e2d75SJohan Hedberg 	if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1)
152742c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
15282177bab5SJohan Hedberg 
15292177bab5SJohan Hedberg 	if (lmp_ssp_capable(hdev)) {
153057af75a8SMarcel Holtmann 		/* When SSP is available, then the host features page
153157af75a8SMarcel Holtmann 		 * should also be available as well. However some
153257af75a8SMarcel Holtmann 		 * controllers list the max_page as 0 as long as SSP
153357af75a8SMarcel Holtmann 		 * has not been enabled. To achieve proper debugging
153457af75a8SMarcel Holtmann 		 * output, force the minimum max_page to 1 at least.
153557af75a8SMarcel Holtmann 		 */
153657af75a8SMarcel Holtmann 		hdev->max_page = 0x01;
153757af75a8SMarcel Holtmann 
15382177bab5SJohan Hedberg 		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
15392177bab5SJohan Hedberg 			u8 mode = 0x01;
154042c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
15412177bab5SJohan Hedberg 				    sizeof(mode), &mode);
15422177bab5SJohan Hedberg 		} else {
15432177bab5SJohan Hedberg 			struct hci_cp_write_eir cp;
15442177bab5SJohan Hedberg 
15452177bab5SJohan Hedberg 			memset(hdev->eir, 0, sizeof(hdev->eir));
15462177bab5SJohan Hedberg 			memset(&cp, 0, sizeof(cp));
15472177bab5SJohan Hedberg 
154842c6b129SJohan Hedberg 			hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
15492177bab5SJohan Hedberg 		}
15502177bab5SJohan Hedberg 	}
15512177bab5SJohan Hedberg 
15522177bab5SJohan Hedberg 	if (lmp_inq_rssi_capable(hdev))
155342c6b129SJohan Hedberg 		hci_setup_inquiry_mode(req);
15542177bab5SJohan Hedberg 
15552177bab5SJohan Hedberg 	if (lmp_inq_tx_pwr_capable(hdev))
155642c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
15572177bab5SJohan Hedberg 
15582177bab5SJohan Hedberg 	if (lmp_ext_feat_capable(hdev)) {
15592177bab5SJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
15602177bab5SJohan Hedberg 
15612177bab5SJohan Hedberg 		cp.page = 0x01;
156242c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
156342c6b129SJohan Hedberg 			    sizeof(cp), &cp);
15642177bab5SJohan Hedberg 	}
15652177bab5SJohan Hedberg 
15662177bab5SJohan Hedberg 	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags)) {
15672177bab5SJohan Hedberg 		u8 enable = 1;
156842c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
15692177bab5SJohan Hedberg 			    &enable);
15702177bab5SJohan Hedberg 	}
15712177bab5SJohan Hedberg }
15722177bab5SJohan Hedberg 
157342c6b129SJohan Hedberg static void hci_setup_link_policy(struct hci_request *req)
15742177bab5SJohan Hedberg {
157542c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
15762177bab5SJohan Hedberg 	struct hci_cp_write_def_link_policy cp;
15772177bab5SJohan Hedberg 	u16 link_policy = 0;
15782177bab5SJohan Hedberg 
15792177bab5SJohan Hedberg 	if (lmp_rswitch_capable(hdev))
15802177bab5SJohan Hedberg 		link_policy |= HCI_LP_RSWITCH;
15812177bab5SJohan Hedberg 	if (lmp_hold_capable(hdev))
15822177bab5SJohan Hedberg 		link_policy |= HCI_LP_HOLD;
15832177bab5SJohan Hedberg 	if (lmp_sniff_capable(hdev))
15842177bab5SJohan Hedberg 		link_policy |= HCI_LP_SNIFF;
15852177bab5SJohan Hedberg 	if (lmp_park_capable(hdev))
15862177bab5SJohan Hedberg 		link_policy |= HCI_LP_PARK;
15872177bab5SJohan Hedberg 
15882177bab5SJohan Hedberg 	cp.policy = cpu_to_le16(link_policy);
158942c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
15902177bab5SJohan Hedberg }
15912177bab5SJohan Hedberg 
159242c6b129SJohan Hedberg static void hci_set_le_support(struct hci_request *req)
15932177bab5SJohan Hedberg {
159442c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
15952177bab5SJohan Hedberg 	struct hci_cp_write_le_host_supported cp;
15962177bab5SJohan Hedberg 
1597c73eee91SJohan Hedberg 	/* LE-only devices do not support explicit enablement */
1598c73eee91SJohan Hedberg 	if (!lmp_bredr_capable(hdev))
1599c73eee91SJohan Hedberg 		return;
1600c73eee91SJohan Hedberg 
16012177bab5SJohan Hedberg 	memset(&cp, 0, sizeof(cp));
16022177bab5SJohan Hedberg 
16032177bab5SJohan Hedberg 	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
16042177bab5SJohan Hedberg 		cp.le = 0x01;
160532226e4fSMarcel Holtmann 		cp.simul = 0x00;
16062177bab5SJohan Hedberg 	}
16072177bab5SJohan Hedberg 
16082177bab5SJohan Hedberg 	if (cp.le != lmp_host_le_capable(hdev))
160942c6b129SJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
16102177bab5SJohan Hedberg 			    &cp);
16112177bab5SJohan Hedberg }
16122177bab5SJohan Hedberg 
1613d62e6d67SJohan Hedberg static void hci_set_event_mask_page_2(struct hci_request *req)
1614d62e6d67SJohan Hedberg {
1615d62e6d67SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1616d62e6d67SJohan Hedberg 	u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1617d62e6d67SJohan Hedberg 
1618d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast master role is supported
1619d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
1620d62e6d67SJohan Hedberg 	 */
162153b834d2SMarcel Holtmann 	if (lmp_csb_master_capable(hdev)) {
1622d62e6d67SJohan Hedberg 		events[1] |= 0x40;	/* Triggered Clock Capture */
1623d62e6d67SJohan Hedberg 		events[1] |= 0x80;	/* Synchronization Train Complete */
1624d62e6d67SJohan Hedberg 		events[2] |= 0x10;	/* Slave Page Response Timeout */
1625d62e6d67SJohan Hedberg 		events[2] |= 0x20;	/* CSB Channel Map Change */
1626d62e6d67SJohan Hedberg 	}
1627d62e6d67SJohan Hedberg 
1628d62e6d67SJohan Hedberg 	/* If Connectionless Slave Broadcast slave role is supported
1629d62e6d67SJohan Hedberg 	 * enable all necessary events for it.
1630d62e6d67SJohan Hedberg 	 */
163153b834d2SMarcel Holtmann 	if (lmp_csb_slave_capable(hdev)) {
1632d62e6d67SJohan Hedberg 		events[2] |= 0x01;	/* Synchronization Train Received */
1633d62e6d67SJohan Hedberg 		events[2] |= 0x02;	/* CSB Receive */
1634d62e6d67SJohan Hedberg 		events[2] |= 0x04;	/* CSB Timeout */
1635d62e6d67SJohan Hedberg 		events[2] |= 0x08;	/* Truncated Page Complete */
1636d62e6d67SJohan Hedberg 	}
1637d62e6d67SJohan Hedberg 
163840c59fcbSMarcel Holtmann 	/* Enable Authenticated Payload Timeout Expired event if supported */
1639cd7ca0ecSMarcel Holtmann 	if (lmp_ping_capable(hdev) || hdev->le_features[0] & HCI_LE_PING)
164040c59fcbSMarcel Holtmann 		events[2] |= 0x80;
164140c59fcbSMarcel Holtmann 
1642d62e6d67SJohan Hedberg 	hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events);
1643d62e6d67SJohan Hedberg }
1644d62e6d67SJohan Hedberg 
164542c6b129SJohan Hedberg static void hci_init3_req(struct hci_request *req, unsigned long opt)
16462177bab5SJohan Hedberg {
164742c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
1648d2c5d77fSJohan Hedberg 	u8 p;
164942c6b129SJohan Hedberg 
16500da71f1bSMarcel Holtmann 	hci_setup_event_mask(req);
16510da71f1bSMarcel Holtmann 
1652b8f4e068SGustavo Padovan 	/* Some Broadcom based Bluetooth controllers do not support the
1653b8f4e068SGustavo Padovan 	 * Delete Stored Link Key command. They are clearly indicating its
1654b8f4e068SGustavo Padovan 	 * absence in the bit mask of supported commands.
1655b8f4e068SGustavo Padovan 	 *
1656b8f4e068SGustavo Padovan 	 * Check the supported commands and only if the the command is marked
1657b8f4e068SGustavo Padovan 	 * as supported send it. If not supported assume that the controller
1658b8f4e068SGustavo Padovan 	 * does not have actual support for stored link keys which makes this
1659b8f4e068SGustavo Padovan 	 * command redundant anyway.
1660f9f462faSMarcel Holtmann 	 *
1661f9f462faSMarcel Holtmann 	 * Some controllers indicate that they support handling deleting
1662f9f462faSMarcel Holtmann 	 * stored link keys, but they don't. The quirk lets a driver
1663f9f462faSMarcel Holtmann 	 * just disable this command.
1664b8f4e068SGustavo Padovan 	 */
1665f9f462faSMarcel Holtmann 	if (hdev->commands[6] & 0x80 &&
1666f9f462faSMarcel Holtmann 	    !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
166759f45d57SJohan Hedberg 		struct hci_cp_delete_stored_link_key cp;
166859f45d57SJohan Hedberg 
166959f45d57SJohan Hedberg 		bacpy(&cp.bdaddr, BDADDR_ANY);
167059f45d57SJohan Hedberg 		cp.delete_all = 0x01;
167159f45d57SJohan Hedberg 		hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
167259f45d57SJohan Hedberg 			    sizeof(cp), &cp);
167359f45d57SJohan Hedberg 	}
167459f45d57SJohan Hedberg 
16752177bab5SJohan Hedberg 	if (hdev->commands[5] & 0x10)
167642c6b129SJohan Hedberg 		hci_setup_link_policy(req);
16772177bab5SJohan Hedberg 
16789193c6e8SAndre Guedes 	if (lmp_le_capable(hdev)) {
16799193c6e8SAndre Guedes 		u8 events[8];
16809193c6e8SAndre Guedes 
16819193c6e8SAndre Guedes 		memset(events, 0, sizeof(events));
16824d6c705bSMarcel Holtmann 		events[0] = 0x0f;
16834d6c705bSMarcel Holtmann 
16844d6c705bSMarcel Holtmann 		if (hdev->le_features[0] & HCI_LE_ENCRYPTION)
16854d6c705bSMarcel Holtmann 			events[0] |= 0x10;	/* LE Long Term Key Request */
1686662bc2e6SAndre Guedes 
1687662bc2e6SAndre Guedes 		/* If controller supports the Connection Parameters Request
1688662bc2e6SAndre Guedes 		 * Link Layer Procedure, enable the corresponding event.
1689662bc2e6SAndre Guedes 		 */
1690662bc2e6SAndre Guedes 		if (hdev->le_features[0] & HCI_LE_CONN_PARAM_REQ_PROC)
1691662bc2e6SAndre Guedes 			events[0] |= 0x20;	/* LE Remote Connection
1692662bc2e6SAndre Guedes 						 * Parameter Request
1693662bc2e6SAndre Guedes 						 */
1694662bc2e6SAndre Guedes 
16959193c6e8SAndre Guedes 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
16969193c6e8SAndre Guedes 			    events);
16979193c6e8SAndre Guedes 
169815a49ccaSMarcel Holtmann 		if (hdev->commands[25] & 0x40) {
169915a49ccaSMarcel Holtmann 			/* Read LE Advertising Channel TX Power */
170015a49ccaSMarcel Holtmann 			hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
170115a49ccaSMarcel Holtmann 		}
170215a49ccaSMarcel Holtmann 
170342c6b129SJohan Hedberg 		hci_set_le_support(req);
17049193c6e8SAndre Guedes 	}
1705d2c5d77fSJohan Hedberg 
1706d2c5d77fSJohan Hedberg 	/* Read features beyond page 1 if available */
1707d2c5d77fSJohan Hedberg 	for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
1708d2c5d77fSJohan Hedberg 		struct hci_cp_read_local_ext_features cp;
1709d2c5d77fSJohan Hedberg 
1710d2c5d77fSJohan Hedberg 		cp.page = p;
1711d2c5d77fSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
1712d2c5d77fSJohan Hedberg 			    sizeof(cp), &cp);
1713d2c5d77fSJohan Hedberg 	}
17142177bab5SJohan Hedberg }
17152177bab5SJohan Hedberg 
17165d4e7e8dSJohan Hedberg static void hci_init4_req(struct hci_request *req, unsigned long opt)
17175d4e7e8dSJohan Hedberg {
17185d4e7e8dSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
17195d4e7e8dSJohan Hedberg 
1720d62e6d67SJohan Hedberg 	/* Set event mask page 2 if the HCI command for it is supported */
1721d62e6d67SJohan Hedberg 	if (hdev->commands[22] & 0x04)
1722d62e6d67SJohan Hedberg 		hci_set_event_mask_page_2(req);
1723d62e6d67SJohan Hedberg 
1724109e3191SMarcel Holtmann 	/* Read local codec list if the HCI command is supported */
1725109e3191SMarcel Holtmann 	if (hdev->commands[29] & 0x20)
1726109e3191SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL);
1727109e3191SMarcel Holtmann 
1728f4fe73edSMarcel Holtmann 	/* Get MWS transport configuration if the HCI command is supported */
1729f4fe73edSMarcel Holtmann 	if (hdev->commands[30] & 0x08)
1730f4fe73edSMarcel Holtmann 		hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL);
1731f4fe73edSMarcel Holtmann 
17325d4e7e8dSJohan Hedberg 	/* Check for Synchronization Train support */
173353b834d2SMarcel Holtmann 	if (lmp_sync_train_capable(hdev))
17345d4e7e8dSJohan Hedberg 		hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
1735a6d0d690SMarcel Holtmann 
1736a6d0d690SMarcel Holtmann 	/* Enable Secure Connections if supported and configured */
17375afeac14SMarcel Holtmann 	if ((lmp_sc_capable(hdev) ||
1738111902f7SMarcel Holtmann 	     test_bit(HCI_FORCE_SC, &hdev->dbg_flags)) &&
1739a6d0d690SMarcel Holtmann 	    test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
1740a6d0d690SMarcel Holtmann 		u8 support = 0x01;
1741a6d0d690SMarcel Holtmann 		hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT,
1742a6d0d690SMarcel Holtmann 			    sizeof(support), &support);
1743a6d0d690SMarcel Holtmann 	}
17445d4e7e8dSJohan Hedberg }
17455d4e7e8dSJohan Hedberg 
17462177bab5SJohan Hedberg static int __hci_init(struct hci_dev *hdev)
17472177bab5SJohan Hedberg {
17482177bab5SJohan Hedberg 	int err;
17492177bab5SJohan Hedberg 
17502177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
17512177bab5SJohan Hedberg 	if (err < 0)
17522177bab5SJohan Hedberg 		return err;
17532177bab5SJohan Hedberg 
17544b4148e9SMarcel Holtmann 	/* The Device Under Test (DUT) mode is special and available for
17554b4148e9SMarcel Holtmann 	 * all controller types. So just create it early on.
17564b4148e9SMarcel Holtmann 	 */
17574b4148e9SMarcel Holtmann 	if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
17584b4148e9SMarcel Holtmann 		debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev,
17594b4148e9SMarcel Holtmann 				    &dut_mode_fops);
17604b4148e9SMarcel Holtmann 	}
17614b4148e9SMarcel Holtmann 
17622177bab5SJohan Hedberg 	/* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
17632177bab5SJohan Hedberg 	 * BR/EDR/LE type controllers. AMP controllers only need the
17642177bab5SJohan Hedberg 	 * first stage init.
17652177bab5SJohan Hedberg 	 */
17662177bab5SJohan Hedberg 	if (hdev->dev_type != HCI_BREDR)
17672177bab5SJohan Hedberg 		return 0;
17682177bab5SJohan Hedberg 
17692177bab5SJohan Hedberg 	err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
17702177bab5SJohan Hedberg 	if (err < 0)
17712177bab5SJohan Hedberg 		return err;
17722177bab5SJohan Hedberg 
17735d4e7e8dSJohan Hedberg 	err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
17745d4e7e8dSJohan Hedberg 	if (err < 0)
17755d4e7e8dSJohan Hedberg 		return err;
17765d4e7e8dSJohan Hedberg 
1777baf27f6eSMarcel Holtmann 	err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
1778baf27f6eSMarcel Holtmann 	if (err < 0)
1779baf27f6eSMarcel Holtmann 		return err;
1780baf27f6eSMarcel Holtmann 
1781baf27f6eSMarcel Holtmann 	/* Only create debugfs entries during the initial setup
1782baf27f6eSMarcel Holtmann 	 * phase and not every time the controller gets powered on.
1783baf27f6eSMarcel Holtmann 	 */
1784baf27f6eSMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags))
1785baf27f6eSMarcel Holtmann 		return 0;
1786baf27f6eSMarcel Holtmann 
1787dfb826a8SMarcel Holtmann 	debugfs_create_file("features", 0444, hdev->debugfs, hdev,
1788dfb826a8SMarcel Holtmann 			    &features_fops);
1789ceeb3bc0SMarcel Holtmann 	debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
1790ceeb3bc0SMarcel Holtmann 			   &hdev->manufacturer);
1791ceeb3bc0SMarcel Holtmann 	debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
1792ceeb3bc0SMarcel Holtmann 	debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
179340f4938aSMarcel Holtmann 	debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
179440f4938aSMarcel Holtmann 			    &device_list_fops);
179570afe0b8SMarcel Holtmann 	debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
179670afe0b8SMarcel Holtmann 			    &blacklist_fops);
179747219839SMarcel Holtmann 	debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
179847219839SMarcel Holtmann 
179931ad1691SAndrzej Kaczmarek 	debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
180031ad1691SAndrzej Kaczmarek 			    &conn_info_min_age_fops);
180131ad1691SAndrzej Kaczmarek 	debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
180231ad1691SAndrzej Kaczmarek 			    &conn_info_max_age_fops);
180331ad1691SAndrzej Kaczmarek 
1804baf27f6eSMarcel Holtmann 	if (lmp_bredr_capable(hdev)) {
1805baf27f6eSMarcel Holtmann 		debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
1806baf27f6eSMarcel Holtmann 				    hdev, &inquiry_cache_fops);
180702d08d15SMarcel Holtmann 		debugfs_create_file("link_keys", 0400, hdev->debugfs,
180802d08d15SMarcel Holtmann 				    hdev, &link_keys_fops);
1809babdbb3cSMarcel Holtmann 		debugfs_create_file("dev_class", 0444, hdev->debugfs,
1810babdbb3cSMarcel Holtmann 				    hdev, &dev_class_fops);
1811041000b9SMarcel Holtmann 		debugfs_create_file("voice_setting", 0444, hdev->debugfs,
1812041000b9SMarcel Holtmann 				    hdev, &voice_setting_fops);
1813baf27f6eSMarcel Holtmann 	}
1814baf27f6eSMarcel Holtmann 
181506f5b778SMarcel Holtmann 	if (lmp_ssp_capable(hdev)) {
1816ebd1e33bSMarcel Holtmann 		debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
1817ebd1e33bSMarcel Holtmann 				    hdev, &auto_accept_delay_fops);
18185afeac14SMarcel Holtmann 		debugfs_create_file("force_sc_support", 0644, hdev->debugfs,
18195afeac14SMarcel Holtmann 				    hdev, &force_sc_support_fops);
1820134c2a89SMarcel Holtmann 		debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
1821134c2a89SMarcel Holtmann 				    hdev, &sc_only_mode_fops);
182206f5b778SMarcel Holtmann 	}
1823ebd1e33bSMarcel Holtmann 
18242bfa3531SMarcel Holtmann 	if (lmp_sniff_capable(hdev)) {
18252bfa3531SMarcel Holtmann 		debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
18262bfa3531SMarcel Holtmann 				    hdev, &idle_timeout_fops);
18272bfa3531SMarcel Holtmann 		debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
18282bfa3531SMarcel Holtmann 				    hdev, &sniff_min_interval_fops);
18292bfa3531SMarcel Holtmann 		debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
18302bfa3531SMarcel Holtmann 				    hdev, &sniff_max_interval_fops);
18312bfa3531SMarcel Holtmann 	}
18322bfa3531SMarcel Holtmann 
1833d0f729b8SMarcel Holtmann 	if (lmp_le_capable(hdev)) {
1834ac345813SMarcel Holtmann 		debugfs_create_file("identity", 0400, hdev->debugfs,
1835ac345813SMarcel Holtmann 				    hdev, &identity_fops);
1836ac345813SMarcel Holtmann 		debugfs_create_file("rpa_timeout", 0644, hdev->debugfs,
1837ac345813SMarcel Holtmann 				    hdev, &rpa_timeout_fops);
18387a4cd51dSMarcel Holtmann 		debugfs_create_file("random_address", 0444, hdev->debugfs,
18397a4cd51dSMarcel Holtmann 				    hdev, &random_address_fops);
1840e7b8fc92SMarcel Holtmann 		debugfs_create_file("static_address", 0444, hdev->debugfs,
1841e7b8fc92SMarcel Holtmann 				    hdev, &static_address_fops);
1842b32bba6cSMarcel Holtmann 
1843b32bba6cSMarcel Holtmann 		/* For controllers with a public address, provide a debug
1844b32bba6cSMarcel Holtmann 		 * option to force the usage of the configured static
1845b32bba6cSMarcel Holtmann 		 * address. By default the public address is used.
1846b32bba6cSMarcel Holtmann 		 */
1847b32bba6cSMarcel Holtmann 		if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1848b32bba6cSMarcel Holtmann 			debugfs_create_file("force_static_address", 0644,
1849b32bba6cSMarcel Holtmann 					    hdev->debugfs, hdev,
1850b32bba6cSMarcel Holtmann 					    &force_static_address_fops);
1851b32bba6cSMarcel Holtmann 
1852b32bba6cSMarcel Holtmann 		debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
1853b32bba6cSMarcel Holtmann 				  &hdev->le_white_list_size);
1854d2ab0ac1SMarcel Holtmann 		debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
1855d2ab0ac1SMarcel Holtmann 				    &white_list_fops);
18563698d704SMarcel Holtmann 		debugfs_create_file("identity_resolving_keys", 0400,
18573698d704SMarcel Holtmann 				    hdev->debugfs, hdev,
18583698d704SMarcel Holtmann 				    &identity_resolving_keys_fops);
18598f8625cdSMarcel Holtmann 		debugfs_create_file("long_term_keys", 0400, hdev->debugfs,
18608f8625cdSMarcel Holtmann 				    hdev, &long_term_keys_fops);
18614e70c7e7SMarcel Holtmann 		debugfs_create_file("conn_min_interval", 0644, hdev->debugfs,
18624e70c7e7SMarcel Holtmann 				    hdev, &conn_min_interval_fops);
18634e70c7e7SMarcel Holtmann 		debugfs_create_file("conn_max_interval", 0644, hdev->debugfs,
18644e70c7e7SMarcel Holtmann 				    hdev, &conn_max_interval_fops);
1865816a93d1SMarcel Holtmann 		debugfs_create_file("conn_latency", 0644, hdev->debugfs,
1866816a93d1SMarcel Holtmann 				    hdev, &conn_latency_fops);
1867f1649577SMarcel Holtmann 		debugfs_create_file("supervision_timeout", 0644, hdev->debugfs,
1868f1649577SMarcel Holtmann 				    hdev, &supervision_timeout_fops);
18693f959d46SMarcel Holtmann 		debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
18703f959d46SMarcel Holtmann 				    hdev, &adv_channel_map_fops);
1871729a1051SGeorg Lukas 		debugfs_create_file("adv_min_interval", 0644, hdev->debugfs,
1872729a1051SGeorg Lukas 				    hdev, &adv_min_interval_fops);
1873729a1051SGeorg Lukas 		debugfs_create_file("adv_max_interval", 0644, hdev->debugfs,
1874729a1051SGeorg Lukas 				    hdev, &adv_max_interval_fops);
1875b9a7a61eSLukasz Rymanowski 		debugfs_create_u16("discov_interleaved_timeout", 0644,
1876b9a7a61eSLukasz Rymanowski 				   hdev->debugfs,
1877b9a7a61eSLukasz Rymanowski 				   &hdev->discov_interleaved_timeout);
187854506918SJohan Hedberg 
1879711eafe3SJohan Hedberg 		smp_register(hdev);
1880d0f729b8SMarcel Holtmann 	}
1881e7b8fc92SMarcel Holtmann 
1882baf27f6eSMarcel Holtmann 	return 0;
18832177bab5SJohan Hedberg }
18842177bab5SJohan Hedberg 
18850ebca7d6SMarcel Holtmann static void hci_init0_req(struct hci_request *req, unsigned long opt)
18860ebca7d6SMarcel Holtmann {
18870ebca7d6SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
18880ebca7d6SMarcel Holtmann 
18890ebca7d6SMarcel Holtmann 	BT_DBG("%s %ld", hdev->name, opt);
18900ebca7d6SMarcel Holtmann 
18910ebca7d6SMarcel Holtmann 	/* Reset */
18920ebca7d6SMarcel Holtmann 	if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
18930ebca7d6SMarcel Holtmann 		hci_reset_req(req, 0);
18940ebca7d6SMarcel Holtmann 
18950ebca7d6SMarcel Holtmann 	/* Read Local Version */
18960ebca7d6SMarcel Holtmann 	hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
18970ebca7d6SMarcel Holtmann 
18980ebca7d6SMarcel Holtmann 	/* Read BD Address */
18990ebca7d6SMarcel Holtmann 	if (hdev->set_bdaddr)
19000ebca7d6SMarcel Holtmann 		hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
19010ebca7d6SMarcel Holtmann }
19020ebca7d6SMarcel Holtmann 
19030ebca7d6SMarcel Holtmann static int __hci_unconf_init(struct hci_dev *hdev)
19040ebca7d6SMarcel Holtmann {
19050ebca7d6SMarcel Holtmann 	int err;
19060ebca7d6SMarcel Holtmann 
1907cc78b44bSMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
1908cc78b44bSMarcel Holtmann 		return 0;
1909cc78b44bSMarcel Holtmann 
19100ebca7d6SMarcel Holtmann 	err = __hci_req_sync(hdev, hci_init0_req, 0, HCI_INIT_TIMEOUT);
19110ebca7d6SMarcel Holtmann 	if (err < 0)
19120ebca7d6SMarcel Holtmann 		return err;
19130ebca7d6SMarcel Holtmann 
19140ebca7d6SMarcel Holtmann 	return 0;
19150ebca7d6SMarcel Holtmann }
19160ebca7d6SMarcel Holtmann 
191742c6b129SJohan Hedberg static void hci_scan_req(struct hci_request *req, unsigned long opt)
19181da177e4SLinus Torvalds {
19191da177e4SLinus Torvalds 	__u8 scan = opt;
19201da177e4SLinus Torvalds 
192142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, scan);
19221da177e4SLinus Torvalds 
19231da177e4SLinus Torvalds 	/* Inquiry and Page scans */
192442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
19251da177e4SLinus Torvalds }
19261da177e4SLinus Torvalds 
192742c6b129SJohan Hedberg static void hci_auth_req(struct hci_request *req, unsigned long opt)
19281da177e4SLinus Torvalds {
19291da177e4SLinus Torvalds 	__u8 auth = opt;
19301da177e4SLinus Torvalds 
193142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, auth);
19321da177e4SLinus Torvalds 
19331da177e4SLinus Torvalds 	/* Authentication */
193442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
19351da177e4SLinus Torvalds }
19361da177e4SLinus Torvalds 
193742c6b129SJohan Hedberg static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
19381da177e4SLinus Torvalds {
19391da177e4SLinus Torvalds 	__u8 encrypt = opt;
19401da177e4SLinus Torvalds 
194142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, encrypt);
19421da177e4SLinus Torvalds 
1943e4e8e37cSMarcel Holtmann 	/* Encryption */
194442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
19451da177e4SLinus Torvalds }
19461da177e4SLinus Torvalds 
194742c6b129SJohan Hedberg static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
1948e4e8e37cSMarcel Holtmann {
1949e4e8e37cSMarcel Holtmann 	__le16 policy = cpu_to_le16(opt);
1950e4e8e37cSMarcel Holtmann 
195142c6b129SJohan Hedberg 	BT_DBG("%s %x", req->hdev->name, policy);
1952e4e8e37cSMarcel Holtmann 
1953e4e8e37cSMarcel Holtmann 	/* Default link policy */
195442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
1955e4e8e37cSMarcel Holtmann }
1956e4e8e37cSMarcel Holtmann 
19571da177e4SLinus Torvalds /* Get HCI device by index.
19581da177e4SLinus Torvalds  * Device is held on return. */
19591da177e4SLinus Torvalds struct hci_dev *hci_dev_get(int index)
19601da177e4SLinus Torvalds {
19618035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev = NULL, *d;
19621da177e4SLinus Torvalds 
19631da177e4SLinus Torvalds 	BT_DBG("%d", index);
19641da177e4SLinus Torvalds 
19651da177e4SLinus Torvalds 	if (index < 0)
19661da177e4SLinus Torvalds 		return NULL;
19671da177e4SLinus Torvalds 
19681da177e4SLinus Torvalds 	read_lock(&hci_dev_list_lock);
19698035ded4SLuiz Augusto von Dentz 	list_for_each_entry(d, &hci_dev_list, list) {
19701da177e4SLinus Torvalds 		if (d->id == index) {
19711da177e4SLinus Torvalds 			hdev = hci_dev_hold(d);
19721da177e4SLinus Torvalds 			break;
19731da177e4SLinus Torvalds 		}
19741da177e4SLinus Torvalds 	}
19751da177e4SLinus Torvalds 	read_unlock(&hci_dev_list_lock);
19761da177e4SLinus Torvalds 	return hdev;
19771da177e4SLinus Torvalds }
19781da177e4SLinus Torvalds 
19791da177e4SLinus Torvalds /* ---- Inquiry support ---- */
1980ff9ef578SJohan Hedberg 
198130dc78e1SJohan Hedberg bool hci_discovery_active(struct hci_dev *hdev)
198230dc78e1SJohan Hedberg {
198330dc78e1SJohan Hedberg 	struct discovery_state *discov = &hdev->discovery;
198430dc78e1SJohan Hedberg 
19856fbe195dSAndre Guedes 	switch (discov->state) {
1986343f935bSAndre Guedes 	case DISCOVERY_FINDING:
19876fbe195dSAndre Guedes 	case DISCOVERY_RESOLVING:
198830dc78e1SJohan Hedberg 		return true;
198930dc78e1SJohan Hedberg 
19906fbe195dSAndre Guedes 	default:
199130dc78e1SJohan Hedberg 		return false;
199230dc78e1SJohan Hedberg 	}
19936fbe195dSAndre Guedes }
199430dc78e1SJohan Hedberg 
1995ff9ef578SJohan Hedberg void hci_discovery_set_state(struct hci_dev *hdev, int state)
1996ff9ef578SJohan Hedberg {
1997bb3e0a33SJohan Hedberg 	int old_state = hdev->discovery.state;
1998bb3e0a33SJohan Hedberg 
1999ff9ef578SJohan Hedberg 	BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
2000ff9ef578SJohan Hedberg 
2001bb3e0a33SJohan Hedberg 	if (old_state == state)
2002ff9ef578SJohan Hedberg 		return;
2003ff9ef578SJohan Hedberg 
2004bb3e0a33SJohan Hedberg 	hdev->discovery.state = state;
2005bb3e0a33SJohan Hedberg 
2006ff9ef578SJohan Hedberg 	switch (state) {
2007ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPED:
2008c54c3860SAndre Guedes 		hci_update_background_scan(hdev);
2009c54c3860SAndre Guedes 
2010bb3e0a33SJohan Hedberg 		if (old_state != DISCOVERY_STARTING)
2011ff9ef578SJohan Hedberg 			mgmt_discovering(hdev, 0);
2012ff9ef578SJohan Hedberg 		break;
2013ff9ef578SJohan Hedberg 	case DISCOVERY_STARTING:
2014ff9ef578SJohan Hedberg 		break;
2015343f935bSAndre Guedes 	case DISCOVERY_FINDING:
2016ff9ef578SJohan Hedberg 		mgmt_discovering(hdev, 1);
2017ff9ef578SJohan Hedberg 		break;
201830dc78e1SJohan Hedberg 	case DISCOVERY_RESOLVING:
201930dc78e1SJohan Hedberg 		break;
2020ff9ef578SJohan Hedberg 	case DISCOVERY_STOPPING:
2021ff9ef578SJohan Hedberg 		break;
2022ff9ef578SJohan Hedberg 	}
2023ff9ef578SJohan Hedberg }
2024ff9ef578SJohan Hedberg 
20251f9b9a5dSAndre Guedes void hci_inquiry_cache_flush(struct hci_dev *hdev)
20261da177e4SLinus Torvalds {
202730883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
2028b57c1a56SJohan Hedberg 	struct inquiry_entry *p, *n;
20291da177e4SLinus Torvalds 
2030561aafbcSJohan Hedberg 	list_for_each_entry_safe(p, n, &cache->all, all) {
2031561aafbcSJohan Hedberg 		list_del(&p->all);
2032b57c1a56SJohan Hedberg 		kfree(p);
20331da177e4SLinus Torvalds 	}
2034561aafbcSJohan Hedberg 
2035561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->unknown);
2036561aafbcSJohan Hedberg 	INIT_LIST_HEAD(&cache->resolve);
20371da177e4SLinus Torvalds }
20381da177e4SLinus Torvalds 
2039a8c5fb1aSGustavo Padovan struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
2040a8c5fb1aSGustavo Padovan 					       bdaddr_t *bdaddr)
20411da177e4SLinus Torvalds {
204230883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
20431da177e4SLinus Torvalds 	struct inquiry_entry *e;
20441da177e4SLinus Torvalds 
20456ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
20461da177e4SLinus Torvalds 
2047561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
20481da177e4SLinus Torvalds 		if (!bacmp(&e->data.bdaddr, bdaddr))
20491da177e4SLinus Torvalds 			return e;
20501da177e4SLinus Torvalds 	}
20511da177e4SLinus Torvalds 
2052b57c1a56SJohan Hedberg 	return NULL;
2053b57c1a56SJohan Hedberg }
2054b57c1a56SJohan Hedberg 
2055561aafbcSJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
2056561aafbcSJohan Hedberg 						       bdaddr_t *bdaddr)
2057561aafbcSJohan Hedberg {
205830883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
2059561aafbcSJohan Hedberg 	struct inquiry_entry *e;
2060561aafbcSJohan Hedberg 
20616ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, bdaddr);
2062561aafbcSJohan Hedberg 
2063561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->unknown, list) {
2064561aafbcSJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
2065561aafbcSJohan Hedberg 			return e;
2066561aafbcSJohan Hedberg 	}
2067561aafbcSJohan Hedberg 
2068561aafbcSJohan Hedberg 	return NULL;
2069561aafbcSJohan Hedberg }
2070561aafbcSJohan Hedberg 
207130dc78e1SJohan Hedberg struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
207230dc78e1SJohan Hedberg 						       bdaddr_t *bdaddr,
207330dc78e1SJohan Hedberg 						       int state)
207430dc78e1SJohan Hedberg {
207530dc78e1SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
207630dc78e1SJohan Hedberg 	struct inquiry_entry *e;
207730dc78e1SJohan Hedberg 
20786ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
207930dc78e1SJohan Hedberg 
208030dc78e1SJohan Hedberg 	list_for_each_entry(e, &cache->resolve, list) {
208130dc78e1SJohan Hedberg 		if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
208230dc78e1SJohan Hedberg 			return e;
208330dc78e1SJohan Hedberg 		if (!bacmp(&e->data.bdaddr, bdaddr))
208430dc78e1SJohan Hedberg 			return e;
208530dc78e1SJohan Hedberg 	}
208630dc78e1SJohan Hedberg 
208730dc78e1SJohan Hedberg 	return NULL;
208830dc78e1SJohan Hedberg }
208930dc78e1SJohan Hedberg 
2090a3d4e20aSJohan Hedberg void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
2091a3d4e20aSJohan Hedberg 				      struct inquiry_entry *ie)
2092a3d4e20aSJohan Hedberg {
2093a3d4e20aSJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
2094a3d4e20aSJohan Hedberg 	struct list_head *pos = &cache->resolve;
2095a3d4e20aSJohan Hedberg 	struct inquiry_entry *p;
2096a3d4e20aSJohan Hedberg 
2097a3d4e20aSJohan Hedberg 	list_del(&ie->list);
2098a3d4e20aSJohan Hedberg 
2099a3d4e20aSJohan Hedberg 	list_for_each_entry(p, &cache->resolve, list) {
2100a3d4e20aSJohan Hedberg 		if (p->name_state != NAME_PENDING &&
2101a3d4e20aSJohan Hedberg 		    abs(p->data.rssi) >= abs(ie->data.rssi))
2102a3d4e20aSJohan Hedberg 			break;
2103a3d4e20aSJohan Hedberg 		pos = &p->list;
2104a3d4e20aSJohan Hedberg 	}
2105a3d4e20aSJohan Hedberg 
2106a3d4e20aSJohan Hedberg 	list_add(&ie->list, pos);
2107a3d4e20aSJohan Hedberg }
2108a3d4e20aSJohan Hedberg 
2109af58925cSMarcel Holtmann u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
2110af58925cSMarcel Holtmann 			     bool name_known)
21111da177e4SLinus Torvalds {
211230883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
211370f23020SAndrei Emeltchenko 	struct inquiry_entry *ie;
2114af58925cSMarcel Holtmann 	u32 flags = 0;
21151da177e4SLinus Torvalds 
21166ed93dc6SAndrei Emeltchenko 	BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
21171da177e4SLinus Torvalds 
21182b2fec4dSSzymon Janc 	hci_remove_remote_oob_data(hdev, &data->bdaddr);
21192b2fec4dSSzymon Janc 
2120af58925cSMarcel Holtmann 	if (!data->ssp_mode)
2121af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
2122388fc8faSJohan Hedberg 
212370f23020SAndrei Emeltchenko 	ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
2124a3d4e20aSJohan Hedberg 	if (ie) {
2125af58925cSMarcel Holtmann 		if (!ie->data.ssp_mode)
2126af58925cSMarcel Holtmann 			flags |= MGMT_DEV_FOUND_LEGACY_PAIRING;
2127388fc8faSJohan Hedberg 
2128a3d4e20aSJohan Hedberg 		if (ie->name_state == NAME_NEEDED &&
2129a3d4e20aSJohan Hedberg 		    data->rssi != ie->data.rssi) {
2130a3d4e20aSJohan Hedberg 			ie->data.rssi = data->rssi;
2131a3d4e20aSJohan Hedberg 			hci_inquiry_cache_update_resolve(hdev, ie);
2132a3d4e20aSJohan Hedberg 		}
2133a3d4e20aSJohan Hedberg 
2134561aafbcSJohan Hedberg 		goto update;
2135a3d4e20aSJohan Hedberg 	}
2136561aafbcSJohan Hedberg 
21371da177e4SLinus Torvalds 	/* Entry not in the cache. Add new one. */
213827f70f3eSJohan Hedberg 	ie = kzalloc(sizeof(*ie), GFP_KERNEL);
2139af58925cSMarcel Holtmann 	if (!ie) {
2140af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
2141af58925cSMarcel Holtmann 		goto done;
2142af58925cSMarcel Holtmann 	}
214370f23020SAndrei Emeltchenko 
2144561aafbcSJohan Hedberg 	list_add(&ie->all, &cache->all);
2145561aafbcSJohan Hedberg 
2146561aafbcSJohan Hedberg 	if (name_known) {
2147561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
2148561aafbcSJohan Hedberg 	} else {
2149561aafbcSJohan Hedberg 		ie->name_state = NAME_NOT_KNOWN;
2150561aafbcSJohan Hedberg 		list_add(&ie->list, &cache->unknown);
2151561aafbcSJohan Hedberg 	}
2152561aafbcSJohan Hedberg 
2153561aafbcSJohan Hedberg update:
2154561aafbcSJohan Hedberg 	if (name_known && ie->name_state != NAME_KNOWN &&
2155561aafbcSJohan Hedberg 	    ie->name_state != NAME_PENDING) {
2156561aafbcSJohan Hedberg 		ie->name_state = NAME_KNOWN;
2157561aafbcSJohan Hedberg 		list_del(&ie->list);
21581da177e4SLinus Torvalds 	}
21591da177e4SLinus Torvalds 
216070f23020SAndrei Emeltchenko 	memcpy(&ie->data, data, sizeof(*data));
216170f23020SAndrei Emeltchenko 	ie->timestamp = jiffies;
21621da177e4SLinus Torvalds 	cache->timestamp = jiffies;
21633175405bSJohan Hedberg 
21643175405bSJohan Hedberg 	if (ie->name_state == NAME_NOT_KNOWN)
2165af58925cSMarcel Holtmann 		flags |= MGMT_DEV_FOUND_CONFIRM_NAME;
21663175405bSJohan Hedberg 
2167af58925cSMarcel Holtmann done:
2168af58925cSMarcel Holtmann 	return flags;
21691da177e4SLinus Torvalds }
21701da177e4SLinus Torvalds 
21711da177e4SLinus Torvalds static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
21721da177e4SLinus Torvalds {
217330883512SJohan Hedberg 	struct discovery_state *cache = &hdev->discovery;
21741da177e4SLinus Torvalds 	struct inquiry_info *info = (struct inquiry_info *) buf;
21751da177e4SLinus Torvalds 	struct inquiry_entry *e;
21761da177e4SLinus Torvalds 	int copied = 0;
21771da177e4SLinus Torvalds 
2178561aafbcSJohan Hedberg 	list_for_each_entry(e, &cache->all, all) {
21791da177e4SLinus Torvalds 		struct inquiry_data *data = &e->data;
2180b57c1a56SJohan Hedberg 
2181b57c1a56SJohan Hedberg 		if (copied >= num)
2182b57c1a56SJohan Hedberg 			break;
2183b57c1a56SJohan Hedberg 
21841da177e4SLinus Torvalds 		bacpy(&info->bdaddr, &data->bdaddr);
21851da177e4SLinus Torvalds 		info->pscan_rep_mode	= data->pscan_rep_mode;
21861da177e4SLinus Torvalds 		info->pscan_period_mode	= data->pscan_period_mode;
21871da177e4SLinus Torvalds 		info->pscan_mode	= data->pscan_mode;
21881da177e4SLinus Torvalds 		memcpy(info->dev_class, data->dev_class, 3);
21891da177e4SLinus Torvalds 		info->clock_offset	= data->clock_offset;
2190b57c1a56SJohan Hedberg 
21911da177e4SLinus Torvalds 		info++;
2192b57c1a56SJohan Hedberg 		copied++;
21931da177e4SLinus Torvalds 	}
21941da177e4SLinus Torvalds 
21951da177e4SLinus Torvalds 	BT_DBG("cache %p, copied %d", cache, copied);
21961da177e4SLinus Torvalds 	return copied;
21971da177e4SLinus Torvalds }
21981da177e4SLinus Torvalds 
219942c6b129SJohan Hedberg static void hci_inq_req(struct hci_request *req, unsigned long opt)
22001da177e4SLinus Torvalds {
22011da177e4SLinus Torvalds 	struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
220242c6b129SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
22031da177e4SLinus Torvalds 	struct hci_cp_inquiry cp;
22041da177e4SLinus Torvalds 
22051da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
22061da177e4SLinus Torvalds 
22071da177e4SLinus Torvalds 	if (test_bit(HCI_INQUIRY, &hdev->flags))
22081da177e4SLinus Torvalds 		return;
22091da177e4SLinus Torvalds 
22101da177e4SLinus Torvalds 	/* Start Inquiry */
22111da177e4SLinus Torvalds 	memcpy(&cp.lap, &ir->lap, 3);
22121da177e4SLinus Torvalds 	cp.length  = ir->length;
22131da177e4SLinus Torvalds 	cp.num_rsp = ir->num_rsp;
221442c6b129SJohan Hedberg 	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
22151da177e4SLinus Torvalds }
22161da177e4SLinus Torvalds 
22171da177e4SLinus Torvalds int hci_inquiry(void __user *arg)
22181da177e4SLinus Torvalds {
22191da177e4SLinus Torvalds 	__u8 __user *ptr = arg;
22201da177e4SLinus Torvalds 	struct hci_inquiry_req ir;
22211da177e4SLinus Torvalds 	struct hci_dev *hdev;
22221da177e4SLinus Torvalds 	int err = 0, do_inquiry = 0, max_rsp;
22231da177e4SLinus Torvalds 	long timeo;
22241da177e4SLinus Torvalds 	__u8 *buf;
22251da177e4SLinus Torvalds 
22261da177e4SLinus Torvalds 	if (copy_from_user(&ir, ptr, sizeof(ir)))
22271da177e4SLinus Torvalds 		return -EFAULT;
22281da177e4SLinus Torvalds 
22295a08ecceSAndrei Emeltchenko 	hdev = hci_dev_get(ir.dev_id);
22305a08ecceSAndrei Emeltchenko 	if (!hdev)
22311da177e4SLinus Torvalds 		return -ENODEV;
22321da177e4SLinus Torvalds 
22330736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
22340736cfa8SMarcel Holtmann 		err = -EBUSY;
22350736cfa8SMarcel Holtmann 		goto done;
22360736cfa8SMarcel Holtmann 	}
22370736cfa8SMarcel Holtmann 
22384a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
2239fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2240fee746b0SMarcel Holtmann 		goto done;
2241fee746b0SMarcel Holtmann 	}
2242fee746b0SMarcel Holtmann 
22435b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
22445b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
22455b69bef5SMarcel Holtmann 		goto done;
22465b69bef5SMarcel Holtmann 	}
22475b69bef5SMarcel Holtmann 
224856f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
224956f87901SJohan Hedberg 		err = -EOPNOTSUPP;
225056f87901SJohan Hedberg 		goto done;
225156f87901SJohan Hedberg 	}
225256f87901SJohan Hedberg 
225309fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
22541da177e4SLinus Torvalds 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
2255a8c5fb1aSGustavo Padovan 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
22561f9b9a5dSAndre Guedes 		hci_inquiry_cache_flush(hdev);
22571da177e4SLinus Torvalds 		do_inquiry = 1;
22581da177e4SLinus Torvalds 	}
225909fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
22601da177e4SLinus Torvalds 
226104837f64SMarcel Holtmann 	timeo = ir.length * msecs_to_jiffies(2000);
226270f23020SAndrei Emeltchenko 
226370f23020SAndrei Emeltchenko 	if (do_inquiry) {
226401178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
226501178cd4SJohan Hedberg 				   timeo);
226670f23020SAndrei Emeltchenko 		if (err < 0)
22671da177e4SLinus Torvalds 			goto done;
22683e13fa1eSAndre Guedes 
22693e13fa1eSAndre Guedes 		/* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
22703e13fa1eSAndre Guedes 		 * cleared). If it is interrupted by a signal, return -EINTR.
22713e13fa1eSAndre Guedes 		 */
227274316201SNeilBrown 		if (wait_on_bit(&hdev->flags, HCI_INQUIRY,
22733e13fa1eSAndre Guedes 				TASK_INTERRUPTIBLE))
22743e13fa1eSAndre Guedes 			return -EINTR;
227570f23020SAndrei Emeltchenko 	}
22761da177e4SLinus Torvalds 
22778fc9ced3SGustavo Padovan 	/* for unlimited number of responses we will use buffer with
22788fc9ced3SGustavo Padovan 	 * 255 entries
22798fc9ced3SGustavo Padovan 	 */
22801da177e4SLinus Torvalds 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
22811da177e4SLinus Torvalds 
22821da177e4SLinus Torvalds 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
22831da177e4SLinus Torvalds 	 * copy it to the user space.
22841da177e4SLinus Torvalds 	 */
228570f23020SAndrei Emeltchenko 	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
228670f23020SAndrei Emeltchenko 	if (!buf) {
22871da177e4SLinus Torvalds 		err = -ENOMEM;
22881da177e4SLinus Torvalds 		goto done;
22891da177e4SLinus Torvalds 	}
22901da177e4SLinus Torvalds 
229109fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
22921da177e4SLinus Torvalds 	ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
229309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
22941da177e4SLinus Torvalds 
22951da177e4SLinus Torvalds 	BT_DBG("num_rsp %d", ir.num_rsp);
22961da177e4SLinus Torvalds 
22971da177e4SLinus Torvalds 	if (!copy_to_user(ptr, &ir, sizeof(ir))) {
22981da177e4SLinus Torvalds 		ptr += sizeof(ir);
22991da177e4SLinus Torvalds 		if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
23001da177e4SLinus Torvalds 				 ir.num_rsp))
23011da177e4SLinus Torvalds 			err = -EFAULT;
23021da177e4SLinus Torvalds 	} else
23031da177e4SLinus Torvalds 		err = -EFAULT;
23041da177e4SLinus Torvalds 
23051da177e4SLinus Torvalds 	kfree(buf);
23061da177e4SLinus Torvalds 
23071da177e4SLinus Torvalds done:
23081da177e4SLinus Torvalds 	hci_dev_put(hdev);
23091da177e4SLinus Torvalds 	return err;
23101da177e4SLinus Torvalds }
23111da177e4SLinus Torvalds 
2312cbed0ca1SJohan Hedberg static int hci_dev_do_open(struct hci_dev *hdev)
23131da177e4SLinus Torvalds {
23141da177e4SLinus Torvalds 	int ret = 0;
23151da177e4SLinus Torvalds 
23161da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
23171da177e4SLinus Torvalds 
23181da177e4SLinus Torvalds 	hci_req_lock(hdev);
23191da177e4SLinus Torvalds 
232094324962SJohan Hovold 	if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
232194324962SJohan Hovold 		ret = -ENODEV;
232294324962SJohan Hovold 		goto done;
232394324962SJohan Hovold 	}
232494324962SJohan Hovold 
2325d603b76bSMarcel Holtmann 	if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2326d603b76bSMarcel Holtmann 	    !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
2327a5c8f270SMarcel Holtmann 		/* Check for rfkill but allow the HCI setup stage to
2328a5c8f270SMarcel Holtmann 		 * proceed (which in itself doesn't cause any RF activity).
2329bf543036SJohan Hedberg 		 */
2330a5c8f270SMarcel Holtmann 		if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
2331611b30f7SMarcel Holtmann 			ret = -ERFKILL;
2332611b30f7SMarcel Holtmann 			goto done;
2333611b30f7SMarcel Holtmann 		}
2334611b30f7SMarcel Holtmann 
2335a5c8f270SMarcel Holtmann 		/* Check for valid public address or a configured static
2336a5c8f270SMarcel Holtmann 		 * random adddress, but let the HCI setup proceed to
2337a5c8f270SMarcel Holtmann 		 * be able to determine if there is a public address
2338a5c8f270SMarcel Holtmann 		 * or not.
2339a5c8f270SMarcel Holtmann 		 *
2340c6beca0eSMarcel Holtmann 		 * In case of user channel usage, it is not important
2341c6beca0eSMarcel Holtmann 		 * if a public address or static random address is
2342c6beca0eSMarcel Holtmann 		 * available.
2343c6beca0eSMarcel Holtmann 		 *
2344a5c8f270SMarcel Holtmann 		 * This check is only valid for BR/EDR controllers
2345a5c8f270SMarcel Holtmann 		 * since AMP controllers do not have an address.
2346a5c8f270SMarcel Holtmann 		 */
2347c6beca0eSMarcel Holtmann 		if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
2348c6beca0eSMarcel Holtmann 		    hdev->dev_type == HCI_BREDR &&
2349a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2350a5c8f270SMarcel Holtmann 		    !bacmp(&hdev->static_addr, BDADDR_ANY)) {
2351a5c8f270SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
2352a5c8f270SMarcel Holtmann 			goto done;
2353a5c8f270SMarcel Holtmann 		}
2354a5c8f270SMarcel Holtmann 	}
2355a5c8f270SMarcel Holtmann 
23561da177e4SLinus Torvalds 	if (test_bit(HCI_UP, &hdev->flags)) {
23571da177e4SLinus Torvalds 		ret = -EALREADY;
23581da177e4SLinus Torvalds 		goto done;
23591da177e4SLinus Torvalds 	}
23601da177e4SLinus Torvalds 
23611da177e4SLinus Torvalds 	if (hdev->open(hdev)) {
23621da177e4SLinus Torvalds 		ret = -EIO;
23631da177e4SLinus Torvalds 		goto done;
23641da177e4SLinus Torvalds 	}
23651da177e4SLinus Torvalds 
23661da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
23671da177e4SLinus Torvalds 	set_bit(HCI_INIT, &hdev->flags);
2368f41c70c4SMarcel Holtmann 
2369af202f84SMarcel Holtmann 	if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
2370af202f84SMarcel Holtmann 		if (hdev->setup)
2371f41c70c4SMarcel Holtmann 			ret = hdev->setup(hdev);
2372f41c70c4SMarcel Holtmann 
2373af202f84SMarcel Holtmann 		/* The transport driver can set these quirks before
2374af202f84SMarcel Holtmann 		 * creating the HCI device or in its setup callback.
2375af202f84SMarcel Holtmann 		 *
2376af202f84SMarcel Holtmann 		 * In case any of them is set, the controller has to
2377af202f84SMarcel Holtmann 		 * start up as unconfigured.
2378af202f84SMarcel Holtmann 		 */
2379eb1904f4SMarcel Holtmann 		if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
2380eb1904f4SMarcel Holtmann 		    test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks))
238189bc22d2SMarcel Holtmann 			set_bit(HCI_UNCONFIGURED, &hdev->dev_flags);
2382f41c70c4SMarcel Holtmann 
23830ebca7d6SMarcel Holtmann 		/* For an unconfigured controller it is required to
23840ebca7d6SMarcel Holtmann 		 * read at least the version information provided by
23850ebca7d6SMarcel Holtmann 		 * the Read Local Version Information command.
23860ebca7d6SMarcel Holtmann 		 *
23870ebca7d6SMarcel Holtmann 		 * If the set_bdaddr driver callback is provided, then
23880ebca7d6SMarcel Holtmann 		 * also the original Bluetooth public device address
23890ebca7d6SMarcel Holtmann 		 * will be read using the Read BD Address command.
23900ebca7d6SMarcel Holtmann 		 */
23910ebca7d6SMarcel Holtmann 		if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
23920ebca7d6SMarcel Holtmann 			ret = __hci_unconf_init(hdev);
239389bc22d2SMarcel Holtmann 	}
239489bc22d2SMarcel Holtmann 
23959713c17bSMarcel Holtmann 	if (test_bit(HCI_CONFIG, &hdev->dev_flags)) {
23969713c17bSMarcel Holtmann 		/* If public address change is configured, ensure that
23979713c17bSMarcel Holtmann 		 * the address gets programmed. If the driver does not
23989713c17bSMarcel Holtmann 		 * support changing the public address, fail the power
23999713c17bSMarcel Holtmann 		 * on procedure.
240024c457e2SMarcel Holtmann 		 */
24019713c17bSMarcel Holtmann 		if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
24029713c17bSMarcel Holtmann 		    hdev->set_bdaddr)
240324c457e2SMarcel Holtmann 			ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
240424c457e2SMarcel Holtmann 		else
240524c457e2SMarcel Holtmann 			ret = -EADDRNOTAVAIL;
240624c457e2SMarcel Holtmann 	}
240724c457e2SMarcel Holtmann 
2408f41c70c4SMarcel Holtmann 	if (!ret) {
24094a964404SMarcel Holtmann 		if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
24100736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
24112177bab5SJohan Hedberg 			ret = __hci_init(hdev);
24121da177e4SLinus Torvalds 	}
24131da177e4SLinus Torvalds 
2414f41c70c4SMarcel Holtmann 	clear_bit(HCI_INIT, &hdev->flags);
2415f41c70c4SMarcel Holtmann 
24161da177e4SLinus Torvalds 	if (!ret) {
24171da177e4SLinus Torvalds 		hci_dev_hold(hdev);
2418d6bfd59cSJohan Hedberg 		set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
24191da177e4SLinus Torvalds 		set_bit(HCI_UP, &hdev->flags);
24201da177e4SLinus Torvalds 		hci_notify(hdev, HCI_DEV_UP);
2421bb4b2a9aSAndrei Emeltchenko 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2422d603b76bSMarcel Holtmann 		    !test_bit(HCI_CONFIG, &hdev->dev_flags) &&
24234a964404SMarcel Holtmann 		    !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
24240736cfa8SMarcel Holtmann 		    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
24251514b892SMarcel Holtmann 		    hdev->dev_type == HCI_BREDR) {
242609fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
2427744cf19eSJohan Hedberg 			mgmt_powered(hdev, 1);
242809fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
242956e5cb86SJohan Hedberg 		}
24301da177e4SLinus Torvalds 	} else {
24311da177e4SLinus Torvalds 		/* Init failed, cleanup */
24323eff45eaSGustavo F. Padovan 		flush_work(&hdev->tx_work);
2433c347b765SGustavo F. Padovan 		flush_work(&hdev->cmd_work);
2434b78752ccSMarcel Holtmann 		flush_work(&hdev->rx_work);
24351da177e4SLinus Torvalds 
24361da177e4SLinus Torvalds 		skb_queue_purge(&hdev->cmd_q);
24371da177e4SLinus Torvalds 		skb_queue_purge(&hdev->rx_q);
24381da177e4SLinus Torvalds 
24391da177e4SLinus Torvalds 		if (hdev->flush)
24401da177e4SLinus Torvalds 			hdev->flush(hdev);
24411da177e4SLinus Torvalds 
24421da177e4SLinus Torvalds 		if (hdev->sent_cmd) {
24431da177e4SLinus Torvalds 			kfree_skb(hdev->sent_cmd);
24441da177e4SLinus Torvalds 			hdev->sent_cmd = NULL;
24451da177e4SLinus Torvalds 		}
24461da177e4SLinus Torvalds 
24471da177e4SLinus Torvalds 		hdev->close(hdev);
2448fee746b0SMarcel Holtmann 		hdev->flags &= BIT(HCI_RAW);
24491da177e4SLinus Torvalds 	}
24501da177e4SLinus Torvalds 
24511da177e4SLinus Torvalds done:
24521da177e4SLinus Torvalds 	hci_req_unlock(hdev);
24531da177e4SLinus Torvalds 	return ret;
24541da177e4SLinus Torvalds }
24551da177e4SLinus Torvalds 
2456cbed0ca1SJohan Hedberg /* ---- HCI ioctl helpers ---- */
2457cbed0ca1SJohan Hedberg 
2458cbed0ca1SJohan Hedberg int hci_dev_open(__u16 dev)
2459cbed0ca1SJohan Hedberg {
2460cbed0ca1SJohan Hedberg 	struct hci_dev *hdev;
2461cbed0ca1SJohan Hedberg 	int err;
2462cbed0ca1SJohan Hedberg 
2463cbed0ca1SJohan Hedberg 	hdev = hci_dev_get(dev);
2464cbed0ca1SJohan Hedberg 	if (!hdev)
2465cbed0ca1SJohan Hedberg 		return -ENODEV;
2466cbed0ca1SJohan Hedberg 
24674a964404SMarcel Holtmann 	/* Devices that are marked as unconfigured can only be powered
2468fee746b0SMarcel Holtmann 	 * up as user channel. Trying to bring them up as normal devices
2469fee746b0SMarcel Holtmann 	 * will result into a failure. Only user channel operation is
2470fee746b0SMarcel Holtmann 	 * possible.
2471fee746b0SMarcel Holtmann 	 *
2472fee746b0SMarcel Holtmann 	 * When this function is called for a user channel, the flag
2473fee746b0SMarcel Holtmann 	 * HCI_USER_CHANNEL will be set first before attempting to
2474fee746b0SMarcel Holtmann 	 * open the device.
2475fee746b0SMarcel Holtmann 	 */
24764a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
2477fee746b0SMarcel Holtmann 	    !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2478fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2479fee746b0SMarcel Holtmann 		goto done;
2480fee746b0SMarcel Holtmann 	}
2481fee746b0SMarcel Holtmann 
2482e1d08f40SJohan Hedberg 	/* We need to ensure that no other power on/off work is pending
2483e1d08f40SJohan Hedberg 	 * before proceeding to call hci_dev_do_open. This is
2484e1d08f40SJohan Hedberg 	 * particularly important if the setup procedure has not yet
2485e1d08f40SJohan Hedberg 	 * completed.
2486e1d08f40SJohan Hedberg 	 */
2487e1d08f40SJohan Hedberg 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
2488e1d08f40SJohan Hedberg 		cancel_delayed_work(&hdev->power_off);
2489e1d08f40SJohan Hedberg 
2490a5c8f270SMarcel Holtmann 	/* After this call it is guaranteed that the setup procedure
2491a5c8f270SMarcel Holtmann 	 * has finished. This means that error conditions like RFKILL
2492a5c8f270SMarcel Holtmann 	 * or no valid public or static random address apply.
2493a5c8f270SMarcel Holtmann 	 */
2494e1d08f40SJohan Hedberg 	flush_workqueue(hdev->req_workqueue);
2495e1d08f40SJohan Hedberg 
249612aa4f0aSMarcel Holtmann 	/* For controllers not using the management interface and that
2497b6ae8457SJohan Hedberg 	 * are brought up using legacy ioctl, set the HCI_BONDABLE bit
249812aa4f0aSMarcel Holtmann 	 * so that pairing works for them. Once the management interface
249912aa4f0aSMarcel Holtmann 	 * is in use this bit will be cleared again and userspace has
250012aa4f0aSMarcel Holtmann 	 * to explicitly enable it.
250112aa4f0aSMarcel Holtmann 	 */
250212aa4f0aSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
250312aa4f0aSMarcel Holtmann 	    !test_bit(HCI_MGMT, &hdev->dev_flags))
2504b6ae8457SJohan Hedberg 		set_bit(HCI_BONDABLE, &hdev->dev_flags);
250512aa4f0aSMarcel Holtmann 
2506cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
2507cbed0ca1SJohan Hedberg 
2508fee746b0SMarcel Holtmann done:
2509cbed0ca1SJohan Hedberg 	hci_dev_put(hdev);
2510cbed0ca1SJohan Hedberg 	return err;
2511cbed0ca1SJohan Hedberg }
2512cbed0ca1SJohan Hedberg 
2513d7347f3cSJohan Hedberg /* This function requires the caller holds hdev->lock */
2514d7347f3cSJohan Hedberg static void hci_pend_le_actions_clear(struct hci_dev *hdev)
2515d7347f3cSJohan Hedberg {
2516d7347f3cSJohan Hedberg 	struct hci_conn_params *p;
2517d7347f3cSJohan Hedberg 
2518f161dd41SJohan Hedberg 	list_for_each_entry(p, &hdev->le_conn_params, list) {
2519f161dd41SJohan Hedberg 		if (p->conn) {
2520f161dd41SJohan Hedberg 			hci_conn_drop(p->conn);
2521f8aaf9b6SJohan Hedberg 			hci_conn_put(p->conn);
2522f161dd41SJohan Hedberg 			p->conn = NULL;
2523f161dd41SJohan Hedberg 		}
2524d7347f3cSJohan Hedberg 		list_del_init(&p->action);
2525f161dd41SJohan Hedberg 	}
2526d7347f3cSJohan Hedberg 
2527d7347f3cSJohan Hedberg 	BT_DBG("All LE pending actions cleared");
2528d7347f3cSJohan Hedberg }
2529d7347f3cSJohan Hedberg 
25301da177e4SLinus Torvalds static int hci_dev_do_close(struct hci_dev *hdev)
25311da177e4SLinus Torvalds {
25321da177e4SLinus Torvalds 	BT_DBG("%s %p", hdev->name, hdev);
25331da177e4SLinus Torvalds 
253478c04c0bSVinicius Costa Gomes 	cancel_delayed_work(&hdev->power_off);
253578c04c0bSVinicius Costa Gomes 
25361da177e4SLinus Torvalds 	hci_req_cancel(hdev, ENODEV);
25371da177e4SLinus Torvalds 	hci_req_lock(hdev);
25381da177e4SLinus Torvalds 
25391da177e4SLinus Torvalds 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
254065cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
25411da177e4SLinus Torvalds 		hci_req_unlock(hdev);
25421da177e4SLinus Torvalds 		return 0;
25431da177e4SLinus Torvalds 	}
25441da177e4SLinus Torvalds 
25453eff45eaSGustavo F. Padovan 	/* Flush RX and TX works */
25463eff45eaSGustavo F. Padovan 	flush_work(&hdev->tx_work);
2547b78752ccSMarcel Holtmann 	flush_work(&hdev->rx_work);
25481da177e4SLinus Torvalds 
254916ab91abSJohan Hedberg 	if (hdev->discov_timeout > 0) {
2550e0f9309fSJohan Hedberg 		cancel_delayed_work(&hdev->discov_off);
255116ab91abSJohan Hedberg 		hdev->discov_timeout = 0;
25525e5282bbSJohan Hedberg 		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
2553310a3d48SMarcel Holtmann 		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
255416ab91abSJohan Hedberg 	}
255516ab91abSJohan Hedberg 
2556a8b2d5c2SJohan Hedberg 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
25577d78525dSJohan Hedberg 		cancel_delayed_work(&hdev->service_cache);
25587d78525dSJohan Hedberg 
25597ba8b4beSAndre Guedes 	cancel_delayed_work_sync(&hdev->le_scan_disable);
25604518bb0fSJohan Hedberg 
25614518bb0fSJohan Hedberg 	if (test_bit(HCI_MGMT, &hdev->dev_flags))
2562d6bfd59cSJohan Hedberg 		cancel_delayed_work_sync(&hdev->rpa_expired);
25637ba8b4beSAndre Guedes 
256476727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
256576727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
256676727c02SJohan Hedberg 	 */
256776727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
256876727c02SJohan Hedberg 
256909fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
25701f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
2571d7347f3cSJohan Hedberg 	hci_pend_le_actions_clear(hdev);
2572f161dd41SJohan Hedberg 	hci_conn_hash_flush(hdev);
257309fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
25741da177e4SLinus Torvalds 
25751da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_DOWN);
25761da177e4SLinus Torvalds 
25771da177e4SLinus Torvalds 	if (hdev->flush)
25781da177e4SLinus Torvalds 		hdev->flush(hdev);
25791da177e4SLinus Torvalds 
25801da177e4SLinus Torvalds 	/* Reset device */
25811da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
25821da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
25834a964404SMarcel Holtmann 	if (!test_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
25844a964404SMarcel Holtmann 	    !test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) &&
2585a6c511c6SSzymon Janc 	    test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
25861da177e4SLinus Torvalds 		set_bit(HCI_INIT, &hdev->flags);
258701178cd4SJohan Hedberg 		__hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
25881da177e4SLinus Torvalds 		clear_bit(HCI_INIT, &hdev->flags);
25891da177e4SLinus Torvalds 	}
25901da177e4SLinus Torvalds 
2591c347b765SGustavo F. Padovan 	/* flush cmd  work */
2592c347b765SGustavo F. Padovan 	flush_work(&hdev->cmd_work);
25931da177e4SLinus Torvalds 
25941da177e4SLinus Torvalds 	/* Drop queues */
25951da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
25961da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
25971da177e4SLinus Torvalds 	skb_queue_purge(&hdev->raw_q);
25981da177e4SLinus Torvalds 
25991da177e4SLinus Torvalds 	/* Drop last sent command */
26001da177e4SLinus Torvalds 	if (hdev->sent_cmd) {
260165cc2b49SMarcel Holtmann 		cancel_delayed_work_sync(&hdev->cmd_timer);
26021da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
26031da177e4SLinus Torvalds 		hdev->sent_cmd = NULL;
26041da177e4SLinus Torvalds 	}
26051da177e4SLinus Torvalds 
2606b6ddb638SJohan Hedberg 	kfree_skb(hdev->recv_evt);
2607b6ddb638SJohan Hedberg 	hdev->recv_evt = NULL;
2608b6ddb638SJohan Hedberg 
26091da177e4SLinus Torvalds 	/* After this point our queues are empty
26101da177e4SLinus Torvalds 	 * and no tasks are scheduled. */
26111da177e4SLinus Torvalds 	hdev->close(hdev);
26121da177e4SLinus Torvalds 
261335b973c9SJohan Hedberg 	/* Clear flags */
2614fee746b0SMarcel Holtmann 	hdev->flags &= BIT(HCI_RAW);
261535b973c9SJohan Hedberg 	hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
261635b973c9SJohan Hedberg 
261793c311a0SMarcel Holtmann 	if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
261893c311a0SMarcel Holtmann 		if (hdev->dev_type == HCI_BREDR) {
261909fd0de5SGustavo F. Padovan 			hci_dev_lock(hdev);
2620744cf19eSJohan Hedberg 			mgmt_powered(hdev, 0);
262109fd0de5SGustavo F. Padovan 			hci_dev_unlock(hdev);
26228ee56540SMarcel Holtmann 		}
262393c311a0SMarcel Holtmann 	}
26245add6af8SJohan Hedberg 
2625ced5c338SAndrei Emeltchenko 	/* Controller radio is available but is currently powered down */
2626536619e8SMarcel Holtmann 	hdev->amp_status = AMP_STATUS_POWERED_DOWN;
2627ced5c338SAndrei Emeltchenko 
2628e59fda8dSJohan Hedberg 	memset(hdev->eir, 0, sizeof(hdev->eir));
262909b3c3fbSJohan Hedberg 	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
26307a4cd51dSMarcel Holtmann 	bacpy(&hdev->random_addr, BDADDR_ANY);
2631e59fda8dSJohan Hedberg 
26321da177e4SLinus Torvalds 	hci_req_unlock(hdev);
26331da177e4SLinus Torvalds 
26341da177e4SLinus Torvalds 	hci_dev_put(hdev);
26351da177e4SLinus Torvalds 	return 0;
26361da177e4SLinus Torvalds }
26371da177e4SLinus Torvalds 
26381da177e4SLinus Torvalds int hci_dev_close(__u16 dev)
26391da177e4SLinus Torvalds {
26401da177e4SLinus Torvalds 	struct hci_dev *hdev;
26411da177e4SLinus Torvalds 	int err;
26421da177e4SLinus Torvalds 
264370f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
264470f23020SAndrei Emeltchenko 	if (!hdev)
26451da177e4SLinus Torvalds 		return -ENODEV;
26468ee56540SMarcel Holtmann 
26470736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
26480736cfa8SMarcel Holtmann 		err = -EBUSY;
26490736cfa8SMarcel Holtmann 		goto done;
26500736cfa8SMarcel Holtmann 	}
26510736cfa8SMarcel Holtmann 
26528ee56540SMarcel Holtmann 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
26538ee56540SMarcel Holtmann 		cancel_delayed_work(&hdev->power_off);
26548ee56540SMarcel Holtmann 
26551da177e4SLinus Torvalds 	err = hci_dev_do_close(hdev);
26568ee56540SMarcel Holtmann 
26570736cfa8SMarcel Holtmann done:
26581da177e4SLinus Torvalds 	hci_dev_put(hdev);
26591da177e4SLinus Torvalds 	return err;
26601da177e4SLinus Torvalds }
26611da177e4SLinus Torvalds 
26621da177e4SLinus Torvalds int hci_dev_reset(__u16 dev)
26631da177e4SLinus Torvalds {
26641da177e4SLinus Torvalds 	struct hci_dev *hdev;
26651da177e4SLinus Torvalds 	int ret = 0;
26661da177e4SLinus Torvalds 
266770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
266870f23020SAndrei Emeltchenko 	if (!hdev)
26691da177e4SLinus Torvalds 		return -ENODEV;
26701da177e4SLinus Torvalds 
26711da177e4SLinus Torvalds 	hci_req_lock(hdev);
26721da177e4SLinus Torvalds 
2673808a049eSMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags)) {
2674808a049eSMarcel Holtmann 		ret = -ENETDOWN;
26751da177e4SLinus Torvalds 		goto done;
2676808a049eSMarcel Holtmann 	}
26771da177e4SLinus Torvalds 
26780736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
26790736cfa8SMarcel Holtmann 		ret = -EBUSY;
26800736cfa8SMarcel Holtmann 		goto done;
26810736cfa8SMarcel Holtmann 	}
26820736cfa8SMarcel Holtmann 
26834a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
2684fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
2685fee746b0SMarcel Holtmann 		goto done;
2686fee746b0SMarcel Holtmann 	}
2687fee746b0SMarcel Holtmann 
26881da177e4SLinus Torvalds 	/* Drop queues */
26891da177e4SLinus Torvalds 	skb_queue_purge(&hdev->rx_q);
26901da177e4SLinus Torvalds 	skb_queue_purge(&hdev->cmd_q);
26911da177e4SLinus Torvalds 
269276727c02SJohan Hedberg 	/* Avoid potential lockdep warnings from the *_flush() calls by
269376727c02SJohan Hedberg 	 * ensuring the workqueue is empty up front.
269476727c02SJohan Hedberg 	 */
269576727c02SJohan Hedberg 	drain_workqueue(hdev->workqueue);
269676727c02SJohan Hedberg 
269709fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
26981f9b9a5dSAndre Guedes 	hci_inquiry_cache_flush(hdev);
26991da177e4SLinus Torvalds 	hci_conn_hash_flush(hdev);
270009fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
27011da177e4SLinus Torvalds 
27021da177e4SLinus Torvalds 	if (hdev->flush)
27031da177e4SLinus Torvalds 		hdev->flush(hdev);
27041da177e4SLinus Torvalds 
27051da177e4SLinus Torvalds 	atomic_set(&hdev->cmd_cnt, 1);
27066ed58ec5SVille Tervo 	hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
27071da177e4SLinus Torvalds 
270801178cd4SJohan Hedberg 	ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
27091da177e4SLinus Torvalds 
27101da177e4SLinus Torvalds done:
27111da177e4SLinus Torvalds 	hci_req_unlock(hdev);
27121da177e4SLinus Torvalds 	hci_dev_put(hdev);
27131da177e4SLinus Torvalds 	return ret;
27141da177e4SLinus Torvalds }
27151da177e4SLinus Torvalds 
27161da177e4SLinus Torvalds int hci_dev_reset_stat(__u16 dev)
27171da177e4SLinus Torvalds {
27181da177e4SLinus Torvalds 	struct hci_dev *hdev;
27191da177e4SLinus Torvalds 	int ret = 0;
27201da177e4SLinus Torvalds 
272170f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dev);
272270f23020SAndrei Emeltchenko 	if (!hdev)
27231da177e4SLinus Torvalds 		return -ENODEV;
27241da177e4SLinus Torvalds 
27250736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
27260736cfa8SMarcel Holtmann 		ret = -EBUSY;
27270736cfa8SMarcel Holtmann 		goto done;
27280736cfa8SMarcel Holtmann 	}
27290736cfa8SMarcel Holtmann 
27304a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
2731fee746b0SMarcel Holtmann 		ret = -EOPNOTSUPP;
2732fee746b0SMarcel Holtmann 		goto done;
2733fee746b0SMarcel Holtmann 	}
2734fee746b0SMarcel Holtmann 
27351da177e4SLinus Torvalds 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
27361da177e4SLinus Torvalds 
27370736cfa8SMarcel Holtmann done:
27381da177e4SLinus Torvalds 	hci_dev_put(hdev);
27391da177e4SLinus Torvalds 	return ret;
27401da177e4SLinus Torvalds }
27411da177e4SLinus Torvalds 
2742123abc08SJohan Hedberg static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
2743123abc08SJohan Hedberg {
2744bc6d2d04SJohan Hedberg 	bool conn_changed, discov_changed;
2745123abc08SJohan Hedberg 
2746123abc08SJohan Hedberg 	BT_DBG("%s scan 0x%02x", hdev->name, scan);
2747123abc08SJohan Hedberg 
2748123abc08SJohan Hedberg 	if ((scan & SCAN_PAGE))
2749123abc08SJohan Hedberg 		conn_changed = !test_and_set_bit(HCI_CONNECTABLE,
2750123abc08SJohan Hedberg 						 &hdev->dev_flags);
2751123abc08SJohan Hedberg 	else
2752123abc08SJohan Hedberg 		conn_changed = test_and_clear_bit(HCI_CONNECTABLE,
2753123abc08SJohan Hedberg 						  &hdev->dev_flags);
2754123abc08SJohan Hedberg 
2755bc6d2d04SJohan Hedberg 	if ((scan & SCAN_INQUIRY)) {
2756bc6d2d04SJohan Hedberg 		discov_changed = !test_and_set_bit(HCI_DISCOVERABLE,
2757bc6d2d04SJohan Hedberg 						   &hdev->dev_flags);
2758bc6d2d04SJohan Hedberg 	} else {
2759bc6d2d04SJohan Hedberg 		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
2760bc6d2d04SJohan Hedberg 		discov_changed = test_and_clear_bit(HCI_DISCOVERABLE,
2761bc6d2d04SJohan Hedberg 						    &hdev->dev_flags);
2762bc6d2d04SJohan Hedberg 	}
2763bc6d2d04SJohan Hedberg 
2764123abc08SJohan Hedberg 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2765123abc08SJohan Hedberg 		return;
2766123abc08SJohan Hedberg 
2767bc6d2d04SJohan Hedberg 	if (conn_changed || discov_changed) {
2768bc6d2d04SJohan Hedberg 		/* In case this was disabled through mgmt */
2769bc6d2d04SJohan Hedberg 		set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
2770bc6d2d04SJohan Hedberg 
2771bc6d2d04SJohan Hedberg 		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
2772bc6d2d04SJohan Hedberg 			mgmt_update_adv_data(hdev);
2773bc6d2d04SJohan Hedberg 
2774123abc08SJohan Hedberg 		mgmt_new_settings(hdev);
2775123abc08SJohan Hedberg 	}
2776bc6d2d04SJohan Hedberg }
2777123abc08SJohan Hedberg 
27781da177e4SLinus Torvalds int hci_dev_cmd(unsigned int cmd, void __user *arg)
27791da177e4SLinus Torvalds {
27801da177e4SLinus Torvalds 	struct hci_dev *hdev;
27811da177e4SLinus Torvalds 	struct hci_dev_req dr;
27821da177e4SLinus Torvalds 	int err = 0;
27831da177e4SLinus Torvalds 
27841da177e4SLinus Torvalds 	if (copy_from_user(&dr, arg, sizeof(dr)))
27851da177e4SLinus Torvalds 		return -EFAULT;
27861da177e4SLinus Torvalds 
278770f23020SAndrei Emeltchenko 	hdev = hci_dev_get(dr.dev_id);
278870f23020SAndrei Emeltchenko 	if (!hdev)
27891da177e4SLinus Torvalds 		return -ENODEV;
27901da177e4SLinus Torvalds 
27910736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
27920736cfa8SMarcel Holtmann 		err = -EBUSY;
27930736cfa8SMarcel Holtmann 		goto done;
27940736cfa8SMarcel Holtmann 	}
27950736cfa8SMarcel Holtmann 
27964a964404SMarcel Holtmann 	if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
2797fee746b0SMarcel Holtmann 		err = -EOPNOTSUPP;
2798fee746b0SMarcel Holtmann 		goto done;
2799fee746b0SMarcel Holtmann 	}
2800fee746b0SMarcel Holtmann 
28015b69bef5SMarcel Holtmann 	if (hdev->dev_type != HCI_BREDR) {
28025b69bef5SMarcel Holtmann 		err = -EOPNOTSUPP;
28035b69bef5SMarcel Holtmann 		goto done;
28045b69bef5SMarcel Holtmann 	}
28055b69bef5SMarcel Holtmann 
280656f87901SJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
280756f87901SJohan Hedberg 		err = -EOPNOTSUPP;
280856f87901SJohan Hedberg 		goto done;
280956f87901SJohan Hedberg 	}
281056f87901SJohan Hedberg 
28111da177e4SLinus Torvalds 	switch (cmd) {
28121da177e4SLinus Torvalds 	case HCISETAUTH:
281301178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
28145f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
28151da177e4SLinus Torvalds 		break;
28161da177e4SLinus Torvalds 
28171da177e4SLinus Torvalds 	case HCISETENCRYPT:
28181da177e4SLinus Torvalds 		if (!lmp_encrypt_capable(hdev)) {
28191da177e4SLinus Torvalds 			err = -EOPNOTSUPP;
28201da177e4SLinus Torvalds 			break;
28211da177e4SLinus Torvalds 		}
28221da177e4SLinus Torvalds 
28231da177e4SLinus Torvalds 		if (!test_bit(HCI_AUTH, &hdev->flags)) {
28241da177e4SLinus Torvalds 			/* Auth must be enabled first */
282501178cd4SJohan Hedberg 			err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
28265f246e89SAndrei Emeltchenko 					   HCI_INIT_TIMEOUT);
28271da177e4SLinus Torvalds 			if (err)
28281da177e4SLinus Torvalds 				break;
28291da177e4SLinus Torvalds 		}
28301da177e4SLinus Torvalds 
283101178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
28325f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
28331da177e4SLinus Torvalds 		break;
28341da177e4SLinus Torvalds 
28351da177e4SLinus Torvalds 	case HCISETSCAN:
283601178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
28375f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
283891a668b0SJohan Hedberg 
2839bc6d2d04SJohan Hedberg 		/* Ensure that the connectable and discoverable states
2840bc6d2d04SJohan Hedberg 		 * get correctly modified as this was a non-mgmt change.
284191a668b0SJohan Hedberg 		 */
2842123abc08SJohan Hedberg 		if (!err)
2843123abc08SJohan Hedberg 			hci_update_scan_state(hdev, dr.dev_opt);
28441da177e4SLinus Torvalds 		break;
28451da177e4SLinus Torvalds 
28461da177e4SLinus Torvalds 	case HCISETLINKPOL:
284701178cd4SJohan Hedberg 		err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
28485f246e89SAndrei Emeltchenko 				   HCI_INIT_TIMEOUT);
28491da177e4SLinus Torvalds 		break;
28501da177e4SLinus Torvalds 
28511da177e4SLinus Torvalds 	case HCISETLINKMODE:
2852e4e8e37cSMarcel Holtmann 		hdev->link_mode = ((__u16) dr.dev_opt) &
2853e4e8e37cSMarcel Holtmann 					(HCI_LM_MASTER | HCI_LM_ACCEPT);
2854e4e8e37cSMarcel Holtmann 		break;
2855e4e8e37cSMarcel Holtmann 
2856e4e8e37cSMarcel Holtmann 	case HCISETPTYPE:
2857e4e8e37cSMarcel Holtmann 		hdev->pkt_type = (__u16) dr.dev_opt;
28581da177e4SLinus Torvalds 		break;
28591da177e4SLinus Torvalds 
28601da177e4SLinus Torvalds 	case HCISETACLMTU:
28611da177e4SLinus Torvalds 		hdev->acl_mtu  = *((__u16 *) &dr.dev_opt + 1);
28621da177e4SLinus Torvalds 		hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
28631da177e4SLinus Torvalds 		break;
28641da177e4SLinus Torvalds 
28651da177e4SLinus Torvalds 	case HCISETSCOMTU:
28661da177e4SLinus Torvalds 		hdev->sco_mtu  = *((__u16 *) &dr.dev_opt + 1);
28671da177e4SLinus Torvalds 		hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
28681da177e4SLinus Torvalds 		break;
28691da177e4SLinus Torvalds 
28701da177e4SLinus Torvalds 	default:
28711da177e4SLinus Torvalds 		err = -EINVAL;
28721da177e4SLinus Torvalds 		break;
28731da177e4SLinus Torvalds 	}
2874e4e8e37cSMarcel Holtmann 
28750736cfa8SMarcel Holtmann done:
28761da177e4SLinus Torvalds 	hci_dev_put(hdev);
28771da177e4SLinus Torvalds 	return err;
28781da177e4SLinus Torvalds }
28791da177e4SLinus Torvalds 
28801da177e4SLinus Torvalds int hci_get_dev_list(void __user *arg)
28811da177e4SLinus Torvalds {
28828035ded4SLuiz Augusto von Dentz 	struct hci_dev *hdev;
28831da177e4SLinus Torvalds 	struct hci_dev_list_req *dl;
28841da177e4SLinus Torvalds 	struct hci_dev_req *dr;
28851da177e4SLinus Torvalds 	int n = 0, size, err;
28861da177e4SLinus Torvalds 	__u16 dev_num;
28871da177e4SLinus Torvalds 
28881da177e4SLinus Torvalds 	if (get_user(dev_num, (__u16 __user *) arg))
28891da177e4SLinus Torvalds 		return -EFAULT;
28901da177e4SLinus Torvalds 
28911da177e4SLinus Torvalds 	if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
28921da177e4SLinus Torvalds 		return -EINVAL;
28931da177e4SLinus Torvalds 
28941da177e4SLinus Torvalds 	size = sizeof(*dl) + dev_num * sizeof(*dr);
28951da177e4SLinus Torvalds 
289670f23020SAndrei Emeltchenko 	dl = kzalloc(size, GFP_KERNEL);
289770f23020SAndrei Emeltchenko 	if (!dl)
28981da177e4SLinus Torvalds 		return -ENOMEM;
28991da177e4SLinus Torvalds 
29001da177e4SLinus Torvalds 	dr = dl->dev_req;
29011da177e4SLinus Torvalds 
2902f20d09d5SGustavo F. Padovan 	read_lock(&hci_dev_list_lock);
29038035ded4SLuiz Augusto von Dentz 	list_for_each_entry(hdev, &hci_dev_list, list) {
29042e84d8dbSMarcel Holtmann 		unsigned long flags = hdev->flags;
2905c542a06cSJohan Hedberg 
29062e84d8dbSMarcel Holtmann 		/* When the auto-off is configured it means the transport
29072e84d8dbSMarcel Holtmann 		 * is running, but in that case still indicate that the
29082e84d8dbSMarcel Holtmann 		 * device is actually down.
29092e84d8dbSMarcel Holtmann 		 */
29102e84d8dbSMarcel Holtmann 		if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
29112e84d8dbSMarcel Holtmann 			flags &= ~BIT(HCI_UP);
2912c542a06cSJohan Hedberg 
29131da177e4SLinus Torvalds 		(dr + n)->dev_id  = hdev->id;
29142e84d8dbSMarcel Holtmann 		(dr + n)->dev_opt = flags;
2915c542a06cSJohan Hedberg 
29161da177e4SLinus Torvalds 		if (++n >= dev_num)
29171da177e4SLinus Torvalds 			break;
29181da177e4SLinus Torvalds 	}
2919f20d09d5SGustavo F. Padovan 	read_unlock(&hci_dev_list_lock);
29201da177e4SLinus Torvalds 
29211da177e4SLinus Torvalds 	dl->dev_num = n;
29221da177e4SLinus Torvalds 	size = sizeof(*dl) + n * sizeof(*dr);
29231da177e4SLinus Torvalds 
29241da177e4SLinus Torvalds 	err = copy_to_user(arg, dl, size);
29251da177e4SLinus Torvalds 	kfree(dl);
29261da177e4SLinus Torvalds 
29271da177e4SLinus Torvalds 	return err ? -EFAULT : 0;
29281da177e4SLinus Torvalds }
29291da177e4SLinus Torvalds 
29301da177e4SLinus Torvalds int hci_get_dev_info(void __user *arg)
29311da177e4SLinus Torvalds {
29321da177e4SLinus Torvalds 	struct hci_dev *hdev;
29331da177e4SLinus Torvalds 	struct hci_dev_info di;
29342e84d8dbSMarcel Holtmann 	unsigned long flags;
29351da177e4SLinus Torvalds 	int err = 0;
29361da177e4SLinus Torvalds 
29371da177e4SLinus Torvalds 	if (copy_from_user(&di, arg, sizeof(di)))
29381da177e4SLinus Torvalds 		return -EFAULT;
29391da177e4SLinus Torvalds 
294070f23020SAndrei Emeltchenko 	hdev = hci_dev_get(di.dev_id);
294170f23020SAndrei Emeltchenko 	if (!hdev)
29421da177e4SLinus Torvalds 		return -ENODEV;
29431da177e4SLinus Torvalds 
29442e84d8dbSMarcel Holtmann 	/* When the auto-off is configured it means the transport
29452e84d8dbSMarcel Holtmann 	 * is running, but in that case still indicate that the
29462e84d8dbSMarcel Holtmann 	 * device is actually down.
29472e84d8dbSMarcel Holtmann 	 */
29482e84d8dbSMarcel Holtmann 	if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
29492e84d8dbSMarcel Holtmann 		flags = hdev->flags & ~BIT(HCI_UP);
29502e84d8dbSMarcel Holtmann 	else
29512e84d8dbSMarcel Holtmann 		flags = hdev->flags;
2952c542a06cSJohan Hedberg 
29531da177e4SLinus Torvalds 	strcpy(di.name, hdev->name);
29541da177e4SLinus Torvalds 	di.bdaddr   = hdev->bdaddr;
295560f2a3edSMarcel Holtmann 	di.type     = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
29562e84d8dbSMarcel Holtmann 	di.flags    = flags;
29571da177e4SLinus Torvalds 	di.pkt_type = hdev->pkt_type;
2958572c7f84SJohan Hedberg 	if (lmp_bredr_capable(hdev)) {
29591da177e4SLinus Torvalds 		di.acl_mtu  = hdev->acl_mtu;
29601da177e4SLinus Torvalds 		di.acl_pkts = hdev->acl_pkts;
29611da177e4SLinus Torvalds 		di.sco_mtu  = hdev->sco_mtu;
29621da177e4SLinus Torvalds 		di.sco_pkts = hdev->sco_pkts;
2963572c7f84SJohan Hedberg 	} else {
2964572c7f84SJohan Hedberg 		di.acl_mtu  = hdev->le_mtu;
2965572c7f84SJohan Hedberg 		di.acl_pkts = hdev->le_pkts;
2966572c7f84SJohan Hedberg 		di.sco_mtu  = 0;
2967572c7f84SJohan Hedberg 		di.sco_pkts = 0;
2968572c7f84SJohan Hedberg 	}
29691da177e4SLinus Torvalds 	di.link_policy = hdev->link_policy;
29701da177e4SLinus Torvalds 	di.link_mode   = hdev->link_mode;
29711da177e4SLinus Torvalds 
29721da177e4SLinus Torvalds 	memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
29731da177e4SLinus Torvalds 	memcpy(&di.features, &hdev->features, sizeof(di.features));
29741da177e4SLinus Torvalds 
29751da177e4SLinus Torvalds 	if (copy_to_user(arg, &di, sizeof(di)))
29761da177e4SLinus Torvalds 		err = -EFAULT;
29771da177e4SLinus Torvalds 
29781da177e4SLinus Torvalds 	hci_dev_put(hdev);
29791da177e4SLinus Torvalds 
29801da177e4SLinus Torvalds 	return err;
29811da177e4SLinus Torvalds }
29821da177e4SLinus Torvalds 
29831da177e4SLinus Torvalds /* ---- Interface to HCI drivers ---- */
29841da177e4SLinus Torvalds 
2985611b30f7SMarcel Holtmann static int hci_rfkill_set_block(void *data, bool blocked)
2986611b30f7SMarcel Holtmann {
2987611b30f7SMarcel Holtmann 	struct hci_dev *hdev = data;
2988611b30f7SMarcel Holtmann 
2989611b30f7SMarcel Holtmann 	BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
2990611b30f7SMarcel Holtmann 
29910736cfa8SMarcel Holtmann 	if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
29920736cfa8SMarcel Holtmann 		return -EBUSY;
29930736cfa8SMarcel Holtmann 
29945e130367SJohan Hedberg 	if (blocked) {
29955e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
2996d603b76bSMarcel Holtmann 		if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
2997d603b76bSMarcel Holtmann 		    !test_bit(HCI_CONFIG, &hdev->dev_flags))
2998611b30f7SMarcel Holtmann 			hci_dev_do_close(hdev);
29995e130367SJohan Hedberg 	} else {
30005e130367SJohan Hedberg 		clear_bit(HCI_RFKILLED, &hdev->dev_flags);
30015e130367SJohan Hedberg 	}
3002611b30f7SMarcel Holtmann 
3003611b30f7SMarcel Holtmann 	return 0;
3004611b30f7SMarcel Holtmann }
3005611b30f7SMarcel Holtmann 
3006611b30f7SMarcel Holtmann static const struct rfkill_ops hci_rfkill_ops = {
3007611b30f7SMarcel Holtmann 	.set_block = hci_rfkill_set_block,
3008611b30f7SMarcel Holtmann };
3009611b30f7SMarcel Holtmann 
3010ab81cbf9SJohan Hedberg static void hci_power_on(struct work_struct *work)
3011ab81cbf9SJohan Hedberg {
3012ab81cbf9SJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
301396570ffcSJohan Hedberg 	int err;
3014ab81cbf9SJohan Hedberg 
3015ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
3016ab81cbf9SJohan Hedberg 
3017cbed0ca1SJohan Hedberg 	err = hci_dev_do_open(hdev);
301896570ffcSJohan Hedberg 	if (err < 0) {
301996570ffcSJohan Hedberg 		mgmt_set_powered_failed(hdev, err);
3020ab81cbf9SJohan Hedberg 		return;
302196570ffcSJohan Hedberg 	}
3022ab81cbf9SJohan Hedberg 
3023a5c8f270SMarcel Holtmann 	/* During the HCI setup phase, a few error conditions are
3024a5c8f270SMarcel Holtmann 	 * ignored and they need to be checked now. If they are still
3025a5c8f270SMarcel Holtmann 	 * valid, it is important to turn the device back off.
3026a5c8f270SMarcel Holtmann 	 */
3027a5c8f270SMarcel Holtmann 	if (test_bit(HCI_RFKILLED, &hdev->dev_flags) ||
30284a964404SMarcel Holtmann 	    test_bit(HCI_UNCONFIGURED, &hdev->dev_flags) ||
3029a5c8f270SMarcel Holtmann 	    (hdev->dev_type == HCI_BREDR &&
3030a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
3031a5c8f270SMarcel Holtmann 	     !bacmp(&hdev->static_addr, BDADDR_ANY))) {
3032bf543036SJohan Hedberg 		clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
3033bf543036SJohan Hedberg 		hci_dev_do_close(hdev);
3034bf543036SJohan Hedberg 	} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
303519202573SJohan Hedberg 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
303619202573SJohan Hedberg 				   HCI_AUTO_OFF_TIMEOUT);
3037bf543036SJohan Hedberg 	}
3038ab81cbf9SJohan Hedberg 
3039fee746b0SMarcel Holtmann 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags)) {
30404a964404SMarcel Holtmann 		/* For unconfigured devices, set the HCI_RAW flag
30414a964404SMarcel Holtmann 		 * so that userspace can easily identify them.
30424a964404SMarcel Holtmann 		 */
30434a964404SMarcel Holtmann 		if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
30444a964404SMarcel Holtmann 			set_bit(HCI_RAW, &hdev->flags);
30450602a8adSMarcel Holtmann 
30460602a8adSMarcel Holtmann 		/* For fully configured devices, this will send
30470602a8adSMarcel Holtmann 		 * the Index Added event. For unconfigured devices,
30480602a8adSMarcel Holtmann 		 * it will send Unconfigued Index Added event.
30490602a8adSMarcel Holtmann 		 *
30500602a8adSMarcel Holtmann 		 * Devices with HCI_QUIRK_RAW_DEVICE are ignored
30510602a8adSMarcel Holtmann 		 * and no event will be send.
30520602a8adSMarcel Holtmann 		 */
3053744cf19eSJohan Hedberg 		mgmt_index_added(hdev);
3054d603b76bSMarcel Holtmann 	} else if (test_and_clear_bit(HCI_CONFIG, &hdev->dev_flags)) {
30555ea234d3SMarcel Holtmann 		/* When the controller is now configured, then it
30565ea234d3SMarcel Holtmann 		 * is important to clear the HCI_RAW flag.
30575ea234d3SMarcel Holtmann 		 */
30585ea234d3SMarcel Holtmann 		if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
30595ea234d3SMarcel Holtmann 			clear_bit(HCI_RAW, &hdev->flags);
30605ea234d3SMarcel Holtmann 
3061d603b76bSMarcel Holtmann 		/* Powering on the controller with HCI_CONFIG set only
3062d603b76bSMarcel Holtmann 		 * happens with the transition from unconfigured to
3063d603b76bSMarcel Holtmann 		 * configured. This will send the Index Added event.
3064d603b76bSMarcel Holtmann 		 */
3065d603b76bSMarcel Holtmann 		mgmt_index_added(hdev);
3066ab81cbf9SJohan Hedberg 	}
3067ab81cbf9SJohan Hedberg }
3068ab81cbf9SJohan Hedberg 
3069ab81cbf9SJohan Hedberg static void hci_power_off(struct work_struct *work)
3070ab81cbf9SJohan Hedberg {
30713243553fSJohan Hedberg 	struct hci_dev *hdev = container_of(work, struct hci_dev,
30723243553fSJohan Hedberg 					    power_off.work);
3073ab81cbf9SJohan Hedberg 
3074ab81cbf9SJohan Hedberg 	BT_DBG("%s", hdev->name);
3075ab81cbf9SJohan Hedberg 
30768ee56540SMarcel Holtmann 	hci_dev_do_close(hdev);
3077ab81cbf9SJohan Hedberg }
3078ab81cbf9SJohan Hedberg 
307916ab91abSJohan Hedberg static void hci_discov_off(struct work_struct *work)
308016ab91abSJohan Hedberg {
308116ab91abSJohan Hedberg 	struct hci_dev *hdev;
308216ab91abSJohan Hedberg 
308316ab91abSJohan Hedberg 	hdev = container_of(work, struct hci_dev, discov_off.work);
308416ab91abSJohan Hedberg 
308516ab91abSJohan Hedberg 	BT_DBG("%s", hdev->name);
308616ab91abSJohan Hedberg 
3087d1967ff8SMarcel Holtmann 	mgmt_discoverable_timeout(hdev);
308816ab91abSJohan Hedberg }
308916ab91abSJohan Hedberg 
309035f7498aSJohan Hedberg void hci_uuids_clear(struct hci_dev *hdev)
30912aeb9a1aSJohan Hedberg {
30924821002cSJohan Hedberg 	struct bt_uuid *uuid, *tmp;
30932aeb9a1aSJohan Hedberg 
30944821002cSJohan Hedberg 	list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
30954821002cSJohan Hedberg 		list_del(&uuid->list);
30962aeb9a1aSJohan Hedberg 		kfree(uuid);
30972aeb9a1aSJohan Hedberg 	}
30982aeb9a1aSJohan Hedberg }
30992aeb9a1aSJohan Hedberg 
310035f7498aSJohan Hedberg void hci_link_keys_clear(struct hci_dev *hdev)
310155ed8ca1SJohan Hedberg {
310255ed8ca1SJohan Hedberg 	struct link_key *key;
310355ed8ca1SJohan Hedberg 
3104*0378b597SJohan Hedberg 	list_for_each_entry_rcu(key, &hdev->link_keys, list) {
3105*0378b597SJohan Hedberg 		list_del_rcu(&key->list);
3106*0378b597SJohan Hedberg 		kfree_rcu(key, rcu);
310755ed8ca1SJohan Hedberg 	}
310855ed8ca1SJohan Hedberg }
310955ed8ca1SJohan Hedberg 
311035f7498aSJohan Hedberg void hci_smp_ltks_clear(struct hci_dev *hdev)
3111b899efafSVinicius Costa Gomes {
3112970d0f1bSJohan Hedberg 	struct smp_ltk *k;
3113b899efafSVinicius Costa Gomes 
3114970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
3115970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
3116970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
3117b899efafSVinicius Costa Gomes 	}
3118b899efafSVinicius Costa Gomes }
3119b899efafSVinicius Costa Gomes 
3120970c4e46SJohan Hedberg void hci_smp_irks_clear(struct hci_dev *hdev)
3121970c4e46SJohan Hedberg {
3122adae20cbSJohan Hedberg 	struct smp_irk *k;
3123970c4e46SJohan Hedberg 
3124adae20cbSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
3125adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
3126adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
3127970c4e46SJohan Hedberg 	}
3128970c4e46SJohan Hedberg }
3129970c4e46SJohan Hedberg 
313055ed8ca1SJohan Hedberg struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
313155ed8ca1SJohan Hedberg {
313255ed8ca1SJohan Hedberg 	struct link_key *k;
313355ed8ca1SJohan Hedberg 
3134*0378b597SJohan Hedberg 	rcu_read_lock();
3135*0378b597SJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->link_keys, list) {
3136*0378b597SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) == 0) {
3137*0378b597SJohan Hedberg 			rcu_read_unlock();
313855ed8ca1SJohan Hedberg 			return k;
3139*0378b597SJohan Hedberg 		}
3140*0378b597SJohan Hedberg 	}
3141*0378b597SJohan Hedberg 	rcu_read_unlock();
314255ed8ca1SJohan Hedberg 
314355ed8ca1SJohan Hedberg 	return NULL;
314455ed8ca1SJohan Hedberg }
314555ed8ca1SJohan Hedberg 
3146745c0ce3SVishal Agarwal static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
3147d25e28abSJohan Hedberg 			       u8 key_type, u8 old_key_type)
3148d25e28abSJohan Hedberg {
3149d25e28abSJohan Hedberg 	/* Legacy key */
3150d25e28abSJohan Hedberg 	if (key_type < 0x03)
3151745c0ce3SVishal Agarwal 		return true;
3152d25e28abSJohan Hedberg 
3153d25e28abSJohan Hedberg 	/* Debug keys are insecure so don't store them persistently */
3154d25e28abSJohan Hedberg 	if (key_type == HCI_LK_DEBUG_COMBINATION)
3155745c0ce3SVishal Agarwal 		return false;
3156d25e28abSJohan Hedberg 
3157d25e28abSJohan Hedberg 	/* Changed combination key and there's no previous one */
3158d25e28abSJohan Hedberg 	if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
3159745c0ce3SVishal Agarwal 		return false;
3160d25e28abSJohan Hedberg 
3161d25e28abSJohan Hedberg 	/* Security mode 3 case */
3162d25e28abSJohan Hedberg 	if (!conn)
3163745c0ce3SVishal Agarwal 		return true;
3164d25e28abSJohan Hedberg 
3165d25e28abSJohan Hedberg 	/* Neither local nor remote side had no-bonding as requirement */
3166d25e28abSJohan Hedberg 	if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
3167745c0ce3SVishal Agarwal 		return true;
3168d25e28abSJohan Hedberg 
3169d25e28abSJohan Hedberg 	/* Local side had dedicated bonding as requirement */
3170d25e28abSJohan Hedberg 	if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
3171745c0ce3SVishal Agarwal 		return true;
3172d25e28abSJohan Hedberg 
3173d25e28abSJohan Hedberg 	/* Remote side had dedicated bonding as requirement */
3174d25e28abSJohan Hedberg 	if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
3175745c0ce3SVishal Agarwal 		return true;
3176d25e28abSJohan Hedberg 
3177d25e28abSJohan Hedberg 	/* If none of the above criteria match, then don't store the key
3178d25e28abSJohan Hedberg 	 * persistently */
3179745c0ce3SVishal Agarwal 	return false;
3180d25e28abSJohan Hedberg }
3181d25e28abSJohan Hedberg 
3182e804d25dSJohan Hedberg static u8 ltk_role(u8 type)
318398a0b845SJohan Hedberg {
3184e804d25dSJohan Hedberg 	if (type == SMP_LTK)
3185e804d25dSJohan Hedberg 		return HCI_ROLE_MASTER;
318698a0b845SJohan Hedberg 
3187e804d25dSJohan Hedberg 	return HCI_ROLE_SLAVE;
318898a0b845SJohan Hedberg }
318998a0b845SJohan Hedberg 
3190fe39c7b2SMarcel Holtmann struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, __le64 rand,
3191e804d25dSJohan Hedberg 			     u8 role)
319275d262c2SVinicius Costa Gomes {
3193c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
319475d262c2SVinicius Costa Gomes 
3195970d0f1bSJohan Hedberg 	rcu_read_lock();
3196970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
3197fe39c7b2SMarcel Holtmann 		if (k->ediv != ediv || k->rand != rand)
319875d262c2SVinicius Costa Gomes 			continue;
319975d262c2SVinicius Costa Gomes 
3200e804d25dSJohan Hedberg 		if (ltk_role(k->type) != role)
320198a0b845SJohan Hedberg 			continue;
320298a0b845SJohan Hedberg 
3203970d0f1bSJohan Hedberg 		rcu_read_unlock();
320475d262c2SVinicius Costa Gomes 		return k;
320575d262c2SVinicius Costa Gomes 	}
3206970d0f1bSJohan Hedberg 	rcu_read_unlock();
320775d262c2SVinicius Costa Gomes 
320875d262c2SVinicius Costa Gomes 	return NULL;
320975d262c2SVinicius Costa Gomes }
321075d262c2SVinicius Costa Gomes 
3211c9839a11SVinicius Costa Gomes struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
3212e804d25dSJohan Hedberg 				     u8 addr_type, u8 role)
321375d262c2SVinicius Costa Gomes {
3214c9839a11SVinicius Costa Gomes 	struct smp_ltk *k;
321575d262c2SVinicius Costa Gomes 
3216970d0f1bSJohan Hedberg 	rcu_read_lock();
3217970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
3218c9839a11SVinicius Costa Gomes 		if (addr_type == k->bdaddr_type &&
321998a0b845SJohan Hedberg 		    bacmp(bdaddr, &k->bdaddr) == 0 &&
3220970d0f1bSJohan Hedberg 		    ltk_role(k->type) == role) {
3221970d0f1bSJohan Hedberg 			rcu_read_unlock();
322275d262c2SVinicius Costa Gomes 			return k;
3223970d0f1bSJohan Hedberg 		}
3224970d0f1bSJohan Hedberg 	}
3225970d0f1bSJohan Hedberg 	rcu_read_unlock();
322675d262c2SVinicius Costa Gomes 
322775d262c2SVinicius Costa Gomes 	return NULL;
322875d262c2SVinicius Costa Gomes }
322975d262c2SVinicius Costa Gomes 
3230970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa)
3231970c4e46SJohan Hedberg {
3232970c4e46SJohan Hedberg 	struct smp_irk *irk;
3233970c4e46SJohan Hedberg 
3234adae20cbSJohan Hedberg 	rcu_read_lock();
3235adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
3236adae20cbSJohan Hedberg 		if (!bacmp(&irk->rpa, rpa)) {
3237adae20cbSJohan Hedberg 			rcu_read_unlock();
3238970c4e46SJohan Hedberg 			return irk;
3239970c4e46SJohan Hedberg 		}
3240adae20cbSJohan Hedberg 	}
3241970c4e46SJohan Hedberg 
3242adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
3243defce9e8SJohan Hedberg 		if (smp_irk_matches(hdev, irk->val, rpa)) {
3244970c4e46SJohan Hedberg 			bacpy(&irk->rpa, rpa);
3245adae20cbSJohan Hedberg 			rcu_read_unlock();
3246970c4e46SJohan Hedberg 			return irk;
3247970c4e46SJohan Hedberg 		}
3248970c4e46SJohan Hedberg 	}
3249adae20cbSJohan Hedberg 	rcu_read_unlock();
3250970c4e46SJohan Hedberg 
3251970c4e46SJohan Hedberg 	return NULL;
3252970c4e46SJohan Hedberg }
3253970c4e46SJohan Hedberg 
3254970c4e46SJohan Hedberg struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
3255970c4e46SJohan Hedberg 				     u8 addr_type)
3256970c4e46SJohan Hedberg {
3257970c4e46SJohan Hedberg 	struct smp_irk *irk;
3258970c4e46SJohan Hedberg 
32596cfc9988SJohan Hedberg 	/* Identity Address must be public or static random */
32606cfc9988SJohan Hedberg 	if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
32616cfc9988SJohan Hedberg 		return NULL;
32626cfc9988SJohan Hedberg 
3263adae20cbSJohan Hedberg 	rcu_read_lock();
3264adae20cbSJohan Hedberg 	list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
3265970c4e46SJohan Hedberg 		if (addr_type == irk->addr_type &&
3266adae20cbSJohan Hedberg 		    bacmp(bdaddr, &irk->bdaddr) == 0) {
3267adae20cbSJohan Hedberg 			rcu_read_unlock();
3268970c4e46SJohan Hedberg 			return irk;
3269970c4e46SJohan Hedberg 		}
3270adae20cbSJohan Hedberg 	}
3271adae20cbSJohan Hedberg 	rcu_read_unlock();
3272970c4e46SJohan Hedberg 
3273970c4e46SJohan Hedberg 	return NULL;
3274970c4e46SJohan Hedberg }
3275970c4e46SJohan Hedberg 
3276567fa2aaSJohan Hedberg struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn,
32777652ff6aSJohan Hedberg 				  bdaddr_t *bdaddr, u8 *val, u8 type,
32787652ff6aSJohan Hedberg 				  u8 pin_len, bool *persistent)
327955ed8ca1SJohan Hedberg {
328055ed8ca1SJohan Hedberg 	struct link_key *key, *old_key;
3281745c0ce3SVishal Agarwal 	u8 old_key_type;
328255ed8ca1SJohan Hedberg 
328355ed8ca1SJohan Hedberg 	old_key = hci_find_link_key(hdev, bdaddr);
328455ed8ca1SJohan Hedberg 	if (old_key) {
328555ed8ca1SJohan Hedberg 		old_key_type = old_key->type;
328655ed8ca1SJohan Hedberg 		key = old_key;
328755ed8ca1SJohan Hedberg 	} else {
328812adcf3aSJohan Hedberg 		old_key_type = conn ? conn->key_type : 0xff;
32890a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
329055ed8ca1SJohan Hedberg 		if (!key)
3291567fa2aaSJohan Hedberg 			return NULL;
3292*0378b597SJohan Hedberg 		list_add_rcu(&key->list, &hdev->link_keys);
329355ed8ca1SJohan Hedberg 	}
329455ed8ca1SJohan Hedberg 
32956ed93dc6SAndrei Emeltchenko 	BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
329655ed8ca1SJohan Hedberg 
3297d25e28abSJohan Hedberg 	/* Some buggy controller combinations generate a changed
3298d25e28abSJohan Hedberg 	 * combination key for legacy pairing even when there's no
3299d25e28abSJohan Hedberg 	 * previous key */
3300d25e28abSJohan Hedberg 	if (type == HCI_LK_CHANGED_COMBINATION &&
3301a8c5fb1aSGustavo Padovan 	    (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
3302d25e28abSJohan Hedberg 		type = HCI_LK_COMBINATION;
3303655fe6ecSJohan Hedberg 		if (conn)
3304655fe6ecSJohan Hedberg 			conn->key_type = type;
3305655fe6ecSJohan Hedberg 	}
3306d25e28abSJohan Hedberg 
330755ed8ca1SJohan Hedberg 	bacpy(&key->bdaddr, bdaddr);
33089b3b4460SAndrei Emeltchenko 	memcpy(key->val, val, HCI_LINK_KEY_SIZE);
330955ed8ca1SJohan Hedberg 	key->pin_len = pin_len;
331055ed8ca1SJohan Hedberg 
3311b6020ba0SWaldemar Rymarkiewicz 	if (type == HCI_LK_CHANGED_COMBINATION)
331255ed8ca1SJohan Hedberg 		key->type = old_key_type;
33134748fed2SJohan Hedberg 	else
33144748fed2SJohan Hedberg 		key->type = type;
33154748fed2SJohan Hedberg 
33167652ff6aSJohan Hedberg 	if (persistent)
33177652ff6aSJohan Hedberg 		*persistent = hci_persistent_key(hdev, conn, type,
33187652ff6aSJohan Hedberg 						 old_key_type);
33194df378a1SJohan Hedberg 
3320567fa2aaSJohan Hedberg 	return key;
332155ed8ca1SJohan Hedberg }
332255ed8ca1SJohan Hedberg 
3323ca9142b8SJohan Hedberg struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
332435d70271SJohan Hedberg 			    u8 addr_type, u8 type, u8 authenticated,
3325fe39c7b2SMarcel Holtmann 			    u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand)
332675d262c2SVinicius Costa Gomes {
3327c9839a11SVinicius Costa Gomes 	struct smp_ltk *key, *old_key;
3328e804d25dSJohan Hedberg 	u8 role = ltk_role(type);
332975d262c2SVinicius Costa Gomes 
3330e804d25dSJohan Hedberg 	old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type, role);
3331c9839a11SVinicius Costa Gomes 	if (old_key)
333275d262c2SVinicius Costa Gomes 		key = old_key;
3333c9839a11SVinicius Costa Gomes 	else {
33340a14ab41SJohan Hedberg 		key = kzalloc(sizeof(*key), GFP_KERNEL);
333575d262c2SVinicius Costa Gomes 		if (!key)
3336ca9142b8SJohan Hedberg 			return NULL;
3337970d0f1bSJohan Hedberg 		list_add_rcu(&key->list, &hdev->long_term_keys);
333875d262c2SVinicius Costa Gomes 	}
333975d262c2SVinicius Costa Gomes 
334075d262c2SVinicius Costa Gomes 	bacpy(&key->bdaddr, bdaddr);
3341c9839a11SVinicius Costa Gomes 	key->bdaddr_type = addr_type;
3342c9839a11SVinicius Costa Gomes 	memcpy(key->val, tk, sizeof(key->val));
3343c9839a11SVinicius Costa Gomes 	key->authenticated = authenticated;
3344c9839a11SVinicius Costa Gomes 	key->ediv = ediv;
3345fe39c7b2SMarcel Holtmann 	key->rand = rand;
3346c9839a11SVinicius Costa Gomes 	key->enc_size = enc_size;
3347c9839a11SVinicius Costa Gomes 	key->type = type;
334875d262c2SVinicius Costa Gomes 
3349ca9142b8SJohan Hedberg 	return key;
335075d262c2SVinicius Costa Gomes }
335175d262c2SVinicius Costa Gomes 
3352ca9142b8SJohan Hedberg struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
3353ca9142b8SJohan Hedberg 			    u8 addr_type, u8 val[16], bdaddr_t *rpa)
3354970c4e46SJohan Hedberg {
3355970c4e46SJohan Hedberg 	struct smp_irk *irk;
3356970c4e46SJohan Hedberg 
3357970c4e46SJohan Hedberg 	irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
3358970c4e46SJohan Hedberg 	if (!irk) {
3359970c4e46SJohan Hedberg 		irk = kzalloc(sizeof(*irk), GFP_KERNEL);
3360970c4e46SJohan Hedberg 		if (!irk)
3361ca9142b8SJohan Hedberg 			return NULL;
3362970c4e46SJohan Hedberg 
3363970c4e46SJohan Hedberg 		bacpy(&irk->bdaddr, bdaddr);
3364970c4e46SJohan Hedberg 		irk->addr_type = addr_type;
3365970c4e46SJohan Hedberg 
3366adae20cbSJohan Hedberg 		list_add_rcu(&irk->list, &hdev->identity_resolving_keys);
3367970c4e46SJohan Hedberg 	}
3368970c4e46SJohan Hedberg 
3369970c4e46SJohan Hedberg 	memcpy(irk->val, val, 16);
3370970c4e46SJohan Hedberg 	bacpy(&irk->rpa, rpa);
3371970c4e46SJohan Hedberg 
3372ca9142b8SJohan Hedberg 	return irk;
3373970c4e46SJohan Hedberg }
3374970c4e46SJohan Hedberg 
337555ed8ca1SJohan Hedberg int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
337655ed8ca1SJohan Hedberg {
337755ed8ca1SJohan Hedberg 	struct link_key *key;
337855ed8ca1SJohan Hedberg 
337955ed8ca1SJohan Hedberg 	key = hci_find_link_key(hdev, bdaddr);
338055ed8ca1SJohan Hedberg 	if (!key)
338155ed8ca1SJohan Hedberg 		return -ENOENT;
338255ed8ca1SJohan Hedberg 
33836ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
338455ed8ca1SJohan Hedberg 
3385*0378b597SJohan Hedberg 	list_del_rcu(&key->list);
3386*0378b597SJohan Hedberg 	kfree_rcu(key, rcu);
338755ed8ca1SJohan Hedberg 
338855ed8ca1SJohan Hedberg 	return 0;
338955ed8ca1SJohan Hedberg }
339055ed8ca1SJohan Hedberg 
3391e0b2b27eSJohan Hedberg int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
3392b899efafSVinicius Costa Gomes {
3393970d0f1bSJohan Hedberg 	struct smp_ltk *k;
3394c51ffa0bSJohan Hedberg 	int removed = 0;
3395b899efafSVinicius Costa Gomes 
3396970d0f1bSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
3397e0b2b27eSJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
3398b899efafSVinicius Costa Gomes 			continue;
3399b899efafSVinicius Costa Gomes 
34006ed93dc6SAndrei Emeltchenko 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
3401b899efafSVinicius Costa Gomes 
3402970d0f1bSJohan Hedberg 		list_del_rcu(&k->list);
3403970d0f1bSJohan Hedberg 		kfree_rcu(k, rcu);
3404c51ffa0bSJohan Hedberg 		removed++;
3405b899efafSVinicius Costa Gomes 	}
3406b899efafSVinicius Costa Gomes 
3407c51ffa0bSJohan Hedberg 	return removed ? 0 : -ENOENT;
3408b899efafSVinicius Costa Gomes }
3409b899efafSVinicius Costa Gomes 
3410a7ec7338SJohan Hedberg void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
3411a7ec7338SJohan Hedberg {
3412adae20cbSJohan Hedberg 	struct smp_irk *k;
3413a7ec7338SJohan Hedberg 
3414adae20cbSJohan Hedberg 	list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
3415a7ec7338SJohan Hedberg 		if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
3416a7ec7338SJohan Hedberg 			continue;
3417a7ec7338SJohan Hedberg 
3418a7ec7338SJohan Hedberg 		BT_DBG("%s removing %pMR", hdev->name, bdaddr);
3419a7ec7338SJohan Hedberg 
3420adae20cbSJohan Hedberg 		list_del_rcu(&k->list);
3421adae20cbSJohan Hedberg 		kfree_rcu(k, rcu);
3422a7ec7338SJohan Hedberg 	}
3423a7ec7338SJohan Hedberg }
3424a7ec7338SJohan Hedberg 
34256bd32326SVille Tervo /* HCI command timer function */
342665cc2b49SMarcel Holtmann static void hci_cmd_timeout(struct work_struct *work)
34276bd32326SVille Tervo {
342865cc2b49SMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev,
342965cc2b49SMarcel Holtmann 					    cmd_timer.work);
34306bd32326SVille Tervo 
3431bda4f23aSAndrei Emeltchenko 	if (hdev->sent_cmd) {
3432bda4f23aSAndrei Emeltchenko 		struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
3433bda4f23aSAndrei Emeltchenko 		u16 opcode = __le16_to_cpu(sent->opcode);
3434bda4f23aSAndrei Emeltchenko 
3435bda4f23aSAndrei Emeltchenko 		BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
3436bda4f23aSAndrei Emeltchenko 	} else {
34376bd32326SVille Tervo 		BT_ERR("%s command tx timeout", hdev->name);
3438bda4f23aSAndrei Emeltchenko 	}
3439bda4f23aSAndrei Emeltchenko 
34406bd32326SVille Tervo 	atomic_set(&hdev->cmd_cnt, 1);
3441c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
34426bd32326SVille Tervo }
34436bd32326SVille Tervo 
34442763eda6SSzymon Janc struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
34452763eda6SSzymon Janc 					  bdaddr_t *bdaddr)
34462763eda6SSzymon Janc {
34472763eda6SSzymon Janc 	struct oob_data *data;
34482763eda6SSzymon Janc 
34492763eda6SSzymon Janc 	list_for_each_entry(data, &hdev->remote_oob_data, list)
34502763eda6SSzymon Janc 		if (bacmp(bdaddr, &data->bdaddr) == 0)
34512763eda6SSzymon Janc 			return data;
34522763eda6SSzymon Janc 
34532763eda6SSzymon Janc 	return NULL;
34542763eda6SSzymon Janc }
34552763eda6SSzymon Janc 
34562763eda6SSzymon Janc int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
34572763eda6SSzymon Janc {
34582763eda6SSzymon Janc 	struct oob_data *data;
34592763eda6SSzymon Janc 
34602763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
34612763eda6SSzymon Janc 	if (!data)
34622763eda6SSzymon Janc 		return -ENOENT;
34632763eda6SSzymon Janc 
34646ed93dc6SAndrei Emeltchenko 	BT_DBG("%s removing %pMR", hdev->name, bdaddr);
34652763eda6SSzymon Janc 
34662763eda6SSzymon Janc 	list_del(&data->list);
34672763eda6SSzymon Janc 	kfree(data);
34682763eda6SSzymon Janc 
34692763eda6SSzymon Janc 	return 0;
34702763eda6SSzymon Janc }
34712763eda6SSzymon Janc 
347235f7498aSJohan Hedberg void hci_remote_oob_data_clear(struct hci_dev *hdev)
34732763eda6SSzymon Janc {
34742763eda6SSzymon Janc 	struct oob_data *data, *n;
34752763eda6SSzymon Janc 
34762763eda6SSzymon Janc 	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
34772763eda6SSzymon Janc 		list_del(&data->list);
34782763eda6SSzymon Janc 		kfree(data);
34792763eda6SSzymon Janc 	}
34802763eda6SSzymon Janc }
34812763eda6SSzymon Janc 
34820798872eSMarcel Holtmann int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
348338da1703SJohan Hedberg 			    u8 *hash, u8 *rand)
34842763eda6SSzymon Janc {
34852763eda6SSzymon Janc 	struct oob_data *data;
34862763eda6SSzymon Janc 
34872763eda6SSzymon Janc 	data = hci_find_remote_oob_data(hdev, bdaddr);
34882763eda6SSzymon Janc 	if (!data) {
34890a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
34902763eda6SSzymon Janc 		if (!data)
34912763eda6SSzymon Janc 			return -ENOMEM;
34922763eda6SSzymon Janc 
34932763eda6SSzymon Janc 		bacpy(&data->bdaddr, bdaddr);
34942763eda6SSzymon Janc 		list_add(&data->list, &hdev->remote_oob_data);
34952763eda6SSzymon Janc 	}
34962763eda6SSzymon Janc 
3497519ca9d0SMarcel Holtmann 	memcpy(data->hash192, hash, sizeof(data->hash192));
349838da1703SJohan Hedberg 	memcpy(data->rand192, rand, sizeof(data->rand192));
34992763eda6SSzymon Janc 
35000798872eSMarcel Holtmann 	memset(data->hash256, 0, sizeof(data->hash256));
350138da1703SJohan Hedberg 	memset(data->rand256, 0, sizeof(data->rand256));
35020798872eSMarcel Holtmann 
35030798872eSMarcel Holtmann 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
35040798872eSMarcel Holtmann 
35050798872eSMarcel Holtmann 	return 0;
35060798872eSMarcel Holtmann }
35070798872eSMarcel Holtmann 
35080798872eSMarcel Holtmann int hci_add_remote_oob_ext_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
350938da1703SJohan Hedberg 				u8 *hash192, u8 *rand192,
351038da1703SJohan Hedberg 				u8 *hash256, u8 *rand256)
35110798872eSMarcel Holtmann {
35120798872eSMarcel Holtmann 	struct oob_data *data;
35130798872eSMarcel Holtmann 
35140798872eSMarcel Holtmann 	data = hci_find_remote_oob_data(hdev, bdaddr);
35150798872eSMarcel Holtmann 	if (!data) {
35160a14ab41SJohan Hedberg 		data = kmalloc(sizeof(*data), GFP_KERNEL);
35170798872eSMarcel Holtmann 		if (!data)
35180798872eSMarcel Holtmann 			return -ENOMEM;
35190798872eSMarcel Holtmann 
35200798872eSMarcel Holtmann 		bacpy(&data->bdaddr, bdaddr);
35210798872eSMarcel Holtmann 		list_add(&data->list, &hdev->remote_oob_data);
35220798872eSMarcel Holtmann 	}
35230798872eSMarcel Holtmann 
35240798872eSMarcel Holtmann 	memcpy(data->hash192, hash192, sizeof(data->hash192));
352538da1703SJohan Hedberg 	memcpy(data->rand192, rand192, sizeof(data->rand192));
35260798872eSMarcel Holtmann 
35270798872eSMarcel Holtmann 	memcpy(data->hash256, hash256, sizeof(data->hash256));
352838da1703SJohan Hedberg 	memcpy(data->rand256, rand256, sizeof(data->rand256));
35290798872eSMarcel Holtmann 
35306ed93dc6SAndrei Emeltchenko 	BT_DBG("%s for %pMR", hdev->name, bdaddr);
35312763eda6SSzymon Janc 
35322763eda6SSzymon Janc 	return 0;
35332763eda6SSzymon Janc }
35342763eda6SSzymon Janc 
3535dcc36c16SJohan Hedberg struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *bdaddr_list,
3536b9ee0a78SMarcel Holtmann 					 bdaddr_t *bdaddr, u8 type)
3537b2a66aadSAntti Julku {
3538b2a66aadSAntti Julku 	struct bdaddr_list *b;
3539b2a66aadSAntti Julku 
3540dcc36c16SJohan Hedberg 	list_for_each_entry(b, bdaddr_list, list) {
3541b9ee0a78SMarcel Holtmann 		if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3542b2a66aadSAntti Julku 			return b;
3543b9ee0a78SMarcel Holtmann 	}
3544b2a66aadSAntti Julku 
3545b2a66aadSAntti Julku 	return NULL;
3546b2a66aadSAntti Julku }
3547b2a66aadSAntti Julku 
3548dcc36c16SJohan Hedberg void hci_bdaddr_list_clear(struct list_head *bdaddr_list)
3549b2a66aadSAntti Julku {
3550b2a66aadSAntti Julku 	struct list_head *p, *n;
3551b2a66aadSAntti Julku 
3552dcc36c16SJohan Hedberg 	list_for_each_safe(p, n, bdaddr_list) {
3553b9ee0a78SMarcel Holtmann 		struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
3554b2a66aadSAntti Julku 
3555b2a66aadSAntti Julku 		list_del(p);
3556b2a66aadSAntti Julku 		kfree(b);
3557b2a66aadSAntti Julku 	}
3558b2a66aadSAntti Julku }
3559b2a66aadSAntti Julku 
3560dcc36c16SJohan Hedberg int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type)
3561b2a66aadSAntti Julku {
3562b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3563b2a66aadSAntti Julku 
3564b9ee0a78SMarcel Holtmann 	if (!bacmp(bdaddr, BDADDR_ANY))
3565b2a66aadSAntti Julku 		return -EBADF;
3566b2a66aadSAntti Julku 
3567dcc36c16SJohan Hedberg 	if (hci_bdaddr_list_lookup(list, bdaddr, type))
35685e762444SAntti Julku 		return -EEXIST;
3569b2a66aadSAntti Julku 
357027f70f3eSJohan Hedberg 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
35715e762444SAntti Julku 	if (!entry)
35725e762444SAntti Julku 		return -ENOMEM;
3573b2a66aadSAntti Julku 
3574b2a66aadSAntti Julku 	bacpy(&entry->bdaddr, bdaddr);
3575b9ee0a78SMarcel Holtmann 	entry->bdaddr_type = type;
3576b2a66aadSAntti Julku 
3577dcc36c16SJohan Hedberg 	list_add(&entry->list, list);
3578b2a66aadSAntti Julku 
35792a8357f2SJohan Hedberg 	return 0;
3580b2a66aadSAntti Julku }
3581b2a66aadSAntti Julku 
3582dcc36c16SJohan Hedberg int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type)
3583b2a66aadSAntti Julku {
3584b2a66aadSAntti Julku 	struct bdaddr_list *entry;
3585b2a66aadSAntti Julku 
358635f7498aSJohan Hedberg 	if (!bacmp(bdaddr, BDADDR_ANY)) {
3587dcc36c16SJohan Hedberg 		hci_bdaddr_list_clear(list);
358835f7498aSJohan Hedberg 		return 0;
358935f7498aSJohan Hedberg 	}
3590b2a66aadSAntti Julku 
3591dcc36c16SJohan Hedberg 	entry = hci_bdaddr_list_lookup(list, bdaddr, type);
3592d2ab0ac1SMarcel Holtmann 	if (!entry)
3593d2ab0ac1SMarcel Holtmann 		return -ENOENT;
3594d2ab0ac1SMarcel Holtmann 
3595d2ab0ac1SMarcel Holtmann 	list_del(&entry->list);
3596d2ab0ac1SMarcel Holtmann 	kfree(entry);
3597d2ab0ac1SMarcel Holtmann 
3598d2ab0ac1SMarcel Holtmann 	return 0;
3599d2ab0ac1SMarcel Holtmann }
3600d2ab0ac1SMarcel Holtmann 
360115819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
360215819a70SAndre Guedes struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
360315819a70SAndre Guedes 					       bdaddr_t *addr, u8 addr_type)
360415819a70SAndre Guedes {
360515819a70SAndre Guedes 	struct hci_conn_params *params;
360615819a70SAndre Guedes 
3607738f6185SJohan Hedberg 	/* The conn params list only contains identity addresses */
3608738f6185SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
3609738f6185SJohan Hedberg 		return NULL;
3610738f6185SJohan Hedberg 
361115819a70SAndre Guedes 	list_for_each_entry(params, &hdev->le_conn_params, list) {
361215819a70SAndre Guedes 		if (bacmp(&params->addr, addr) == 0 &&
361315819a70SAndre Guedes 		    params->addr_type == addr_type) {
361415819a70SAndre Guedes 			return params;
361515819a70SAndre Guedes 		}
361615819a70SAndre Guedes 	}
361715819a70SAndre Guedes 
361815819a70SAndre Guedes 	return NULL;
361915819a70SAndre Guedes }
362015819a70SAndre Guedes 
3621cef952ceSAndre Guedes static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
3622cef952ceSAndre Guedes {
3623cef952ceSAndre Guedes 	struct hci_conn *conn;
3624cef952ceSAndre Guedes 
3625cef952ceSAndre Guedes 	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
3626cef952ceSAndre Guedes 	if (!conn)
3627cef952ceSAndre Guedes 		return false;
3628cef952ceSAndre Guedes 
3629cef952ceSAndre Guedes 	if (conn->dst_type != type)
3630cef952ceSAndre Guedes 		return false;
3631cef952ceSAndre Guedes 
3632cef952ceSAndre Guedes 	if (conn->state != BT_CONNECTED)
3633cef952ceSAndre Guedes 		return false;
3634cef952ceSAndre Guedes 
3635cef952ceSAndre Guedes 	return true;
3636cef952ceSAndre Guedes }
3637cef952ceSAndre Guedes 
363815819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
3639501f8827SJohan Hedberg struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
36404b10966fSMarcel Holtmann 						  bdaddr_t *addr, u8 addr_type)
364115819a70SAndre Guedes {
3642912b42efSJohan Hedberg 	struct hci_conn_params *param;
364315819a70SAndre Guedes 
3644738f6185SJohan Hedberg 	/* The list only contains identity addresses */
3645738f6185SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
3646738f6185SJohan Hedberg 		return NULL;
364715819a70SAndre Guedes 
3648501f8827SJohan Hedberg 	list_for_each_entry(param, list, action) {
3649912b42efSJohan Hedberg 		if (bacmp(&param->addr, addr) == 0 &&
3650912b42efSJohan Hedberg 		    param->addr_type == addr_type)
3651912b42efSJohan Hedberg 			return param;
36524b10966fSMarcel Holtmann 	}
36534b10966fSMarcel Holtmann 
36544b10966fSMarcel Holtmann 	return NULL;
365515819a70SAndre Guedes }
365615819a70SAndre Guedes 
365715819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
365851d167c0SMarcel Holtmann struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
365951d167c0SMarcel Holtmann 					    bdaddr_t *addr, u8 addr_type)
366015819a70SAndre Guedes {
366115819a70SAndre Guedes 	struct hci_conn_params *params;
366215819a70SAndre Guedes 
3663c46245b3SJohan Hedberg 	if (!hci_is_identity_address(addr, addr_type))
366451d167c0SMarcel Holtmann 		return NULL;
3665a9b0a04cSAndre Guedes 
366615819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
3667cef952ceSAndre Guedes 	if (params)
366851d167c0SMarcel Holtmann 		return params;
366915819a70SAndre Guedes 
367015819a70SAndre Guedes 	params = kzalloc(sizeof(*params), GFP_KERNEL);
367115819a70SAndre Guedes 	if (!params) {
367215819a70SAndre Guedes 		BT_ERR("Out of memory");
367351d167c0SMarcel Holtmann 		return NULL;
367415819a70SAndre Guedes 	}
367515819a70SAndre Guedes 
367615819a70SAndre Guedes 	bacpy(&params->addr, addr);
367715819a70SAndre Guedes 	params->addr_type = addr_type;
3678cef952ceSAndre Guedes 
3679cef952ceSAndre Guedes 	list_add(&params->list, &hdev->le_conn_params);
368093450c75SJohan Hedberg 	INIT_LIST_HEAD(&params->action);
3681cef952ceSAndre Guedes 
3682bf5b3c8bSMarcel Holtmann 	params->conn_min_interval = hdev->le_conn_min_interval;
3683bf5b3c8bSMarcel Holtmann 	params->conn_max_interval = hdev->le_conn_max_interval;
3684bf5b3c8bSMarcel Holtmann 	params->conn_latency = hdev->le_conn_latency;
3685bf5b3c8bSMarcel Holtmann 	params->supervision_timeout = hdev->le_supv_timeout;
3686bf5b3c8bSMarcel Holtmann 	params->auto_connect = HCI_AUTO_CONN_DISABLED;
3687bf5b3c8bSMarcel Holtmann 
3688bf5b3c8bSMarcel Holtmann 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
3689bf5b3c8bSMarcel Holtmann 
369051d167c0SMarcel Holtmann 	return params;
3691bf5b3c8bSMarcel Holtmann }
3692bf5b3c8bSMarcel Holtmann 
3693bf5b3c8bSMarcel Holtmann /* This function requires the caller holds hdev->lock */
3694bf5b3c8bSMarcel Holtmann int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
3695d06b50ceSMarcel Holtmann 			u8 auto_connect)
369615819a70SAndre Guedes {
369715819a70SAndre Guedes 	struct hci_conn_params *params;
369815819a70SAndre Guedes 
36998c87aae1SMarcel Holtmann 	params = hci_conn_params_add(hdev, addr, addr_type);
37008c87aae1SMarcel Holtmann 	if (!params)
37018c87aae1SMarcel Holtmann 		return -EIO;
370215819a70SAndre Guedes 
370342ce26deSJohan Hedberg 	if (params->auto_connect == auto_connect)
370442ce26deSJohan Hedberg 		return 0;
370542ce26deSJohan Hedberg 
370666f8455aSJohan Hedberg 	list_del_init(&params->action);
370715819a70SAndre Guedes 
3708cef952ceSAndre Guedes 	switch (auto_connect) {
3709cef952ceSAndre Guedes 	case HCI_AUTO_CONN_DISABLED:
3710cef952ceSAndre Guedes 	case HCI_AUTO_CONN_LINK_LOSS:
371195305baaSJohan Hedberg 		hci_update_background_scan(hdev);
3712cef952ceSAndre Guedes 		break;
3713851efca8SJohan Hedberg 	case HCI_AUTO_CONN_REPORT:
371495305baaSJohan Hedberg 		list_add(&params->action, &hdev->pend_le_reports);
371595305baaSJohan Hedberg 		hci_update_background_scan(hdev);
3716851efca8SJohan Hedberg 		break;
37174b9e7e75SMarcel Holtmann 	case HCI_AUTO_CONN_DIRECT:
3718cef952ceSAndre Guedes 	case HCI_AUTO_CONN_ALWAYS:
371995305baaSJohan Hedberg 		if (!is_connected(hdev, addr, addr_type)) {
372095305baaSJohan Hedberg 			list_add(&params->action, &hdev->pend_le_conns);
372195305baaSJohan Hedberg 			hci_update_background_scan(hdev);
372295305baaSJohan Hedberg 		}
3723cef952ceSAndre Guedes 		break;
3724cef952ceSAndre Guedes 	}
372515819a70SAndre Guedes 
3726851efca8SJohan Hedberg 	params->auto_connect = auto_connect;
3727851efca8SJohan Hedberg 
3728d06b50ceSMarcel Holtmann 	BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
3729d06b50ceSMarcel Holtmann 	       auto_connect);
3730a9b0a04cSAndre Guedes 
3731a9b0a04cSAndre Guedes 	return 0;
373215819a70SAndre Guedes }
373315819a70SAndre Guedes 
3734f6c63249SJohan Hedberg static void hci_conn_params_free(struct hci_conn_params *params)
3735f6c63249SJohan Hedberg {
3736f6c63249SJohan Hedberg 	if (params->conn) {
3737f6c63249SJohan Hedberg 		hci_conn_drop(params->conn);
3738f6c63249SJohan Hedberg 		hci_conn_put(params->conn);
3739f6c63249SJohan Hedberg 	}
3740f6c63249SJohan Hedberg 
3741f6c63249SJohan Hedberg 	list_del(&params->action);
3742f6c63249SJohan Hedberg 	list_del(&params->list);
3743f6c63249SJohan Hedberg 	kfree(params);
3744f6c63249SJohan Hedberg }
3745f6c63249SJohan Hedberg 
374615819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
374715819a70SAndre Guedes void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
374815819a70SAndre Guedes {
374915819a70SAndre Guedes 	struct hci_conn_params *params;
375015819a70SAndre Guedes 
375115819a70SAndre Guedes 	params = hci_conn_params_lookup(hdev, addr, addr_type);
375215819a70SAndre Guedes 	if (!params)
375315819a70SAndre Guedes 		return;
375415819a70SAndre Guedes 
3755f6c63249SJohan Hedberg 	hci_conn_params_free(params);
375615819a70SAndre Guedes 
375795305baaSJohan Hedberg 	hci_update_background_scan(hdev);
375895305baaSJohan Hedberg 
375915819a70SAndre Guedes 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
376015819a70SAndre Guedes }
376115819a70SAndre Guedes 
376215819a70SAndre Guedes /* This function requires the caller holds hdev->lock */
376355af49a8SJohan Hedberg void hci_conn_params_clear_disabled(struct hci_dev *hdev)
376415819a70SAndre Guedes {
376515819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
376615819a70SAndre Guedes 
376715819a70SAndre Guedes 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
376855af49a8SJohan Hedberg 		if (params->auto_connect != HCI_AUTO_CONN_DISABLED)
376955af49a8SJohan Hedberg 			continue;
377015819a70SAndre Guedes 		list_del(&params->list);
377115819a70SAndre Guedes 		kfree(params);
377215819a70SAndre Guedes 	}
377315819a70SAndre Guedes 
377455af49a8SJohan Hedberg 	BT_DBG("All LE disabled connection parameters were removed");
377555af49a8SJohan Hedberg }
377655af49a8SJohan Hedberg 
377755af49a8SJohan Hedberg /* This function requires the caller holds hdev->lock */
3778373110c5SJohan Hedberg void hci_conn_params_clear_all(struct hci_dev *hdev)
377915819a70SAndre Guedes {
378015819a70SAndre Guedes 	struct hci_conn_params *params, *tmp;
378115819a70SAndre Guedes 
3782f6c63249SJohan Hedberg 	list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list)
3783f6c63249SJohan Hedberg 		hci_conn_params_free(params);
378415819a70SAndre Guedes 
3785a2f41a8fSJohan Hedberg 	hci_update_background_scan(hdev);
37861089b67dSMarcel Holtmann 
378715819a70SAndre Guedes 	BT_DBG("All LE connection parameters were removed");
378815819a70SAndre Guedes }
378915819a70SAndre Guedes 
37904c87eaabSAndre Guedes static void inquiry_complete(struct hci_dev *hdev, u8 status)
37917ba8b4beSAndre Guedes {
37924c87eaabSAndre Guedes 	if (status) {
37934c87eaabSAndre Guedes 		BT_ERR("Failed to start inquiry: status %d", status);
37947ba8b4beSAndre Guedes 
37954c87eaabSAndre Guedes 		hci_dev_lock(hdev);
37964c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
37974c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
37984c87eaabSAndre Guedes 		return;
37994c87eaabSAndre Guedes 	}
38007ba8b4beSAndre Guedes }
38017ba8b4beSAndre Guedes 
38024c87eaabSAndre Guedes static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
38037ba8b4beSAndre Guedes {
38044c87eaabSAndre Guedes 	/* General inquiry access code (GIAC) */
38054c87eaabSAndre Guedes 	u8 lap[3] = { 0x33, 0x8b, 0x9e };
38064c87eaabSAndre Guedes 	struct hci_request req;
38074c87eaabSAndre Guedes 	struct hci_cp_inquiry cp;
38087ba8b4beSAndre Guedes 	int err;
38097ba8b4beSAndre Guedes 
38104c87eaabSAndre Guedes 	if (status) {
38114c87eaabSAndre Guedes 		BT_ERR("Failed to disable LE scanning: status %d", status);
38124c87eaabSAndre Guedes 		return;
38137ba8b4beSAndre Guedes 	}
38147ba8b4beSAndre Guedes 
38154c87eaabSAndre Guedes 	switch (hdev->discovery.type) {
38164c87eaabSAndre Guedes 	case DISCOV_TYPE_LE:
38174c87eaabSAndre Guedes 		hci_dev_lock(hdev);
38184c87eaabSAndre Guedes 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
38194c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
38204c87eaabSAndre Guedes 		break;
38217dbfac1dSAndre Guedes 
38224c87eaabSAndre Guedes 	case DISCOV_TYPE_INTERLEAVED:
38234c87eaabSAndre Guedes 		hci_req_init(&req, hdev);
38247dbfac1dSAndre Guedes 
38257dbfac1dSAndre Guedes 		memset(&cp, 0, sizeof(cp));
38264c87eaabSAndre Guedes 		memcpy(&cp.lap, lap, sizeof(cp.lap));
38274c87eaabSAndre Guedes 		cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
38284c87eaabSAndre Guedes 		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
38294c87eaabSAndre Guedes 
38304c87eaabSAndre Guedes 		hci_dev_lock(hdev);
38314c87eaabSAndre Guedes 
38324c87eaabSAndre Guedes 		hci_inquiry_cache_flush(hdev);
38334c87eaabSAndre Guedes 
38344c87eaabSAndre Guedes 		err = hci_req_run(&req, inquiry_complete);
38354c87eaabSAndre Guedes 		if (err) {
38364c87eaabSAndre Guedes 			BT_ERR("Inquiry request failed: err %d", err);
38374c87eaabSAndre Guedes 			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
38387dbfac1dSAndre Guedes 		}
38397dbfac1dSAndre Guedes 
38404c87eaabSAndre Guedes 		hci_dev_unlock(hdev);
38414c87eaabSAndre Guedes 		break;
38424c87eaabSAndre Guedes 	}
38437dbfac1dSAndre Guedes }
38447dbfac1dSAndre Guedes 
38457ba8b4beSAndre Guedes static void le_scan_disable_work(struct work_struct *work)
38467ba8b4beSAndre Guedes {
38477ba8b4beSAndre Guedes 	struct hci_dev *hdev = container_of(work, struct hci_dev,
38487ba8b4beSAndre Guedes 					    le_scan_disable.work);
38494c87eaabSAndre Guedes 	struct hci_request req;
38504c87eaabSAndre Guedes 	int err;
38517ba8b4beSAndre Guedes 
38527ba8b4beSAndre Guedes 	BT_DBG("%s", hdev->name);
38537ba8b4beSAndre Guedes 
38544c87eaabSAndre Guedes 	hci_req_init(&req, hdev);
38557ba8b4beSAndre Guedes 
3856b1efcc28SAndre Guedes 	hci_req_add_le_scan_disable(&req);
38577ba8b4beSAndre Guedes 
38584c87eaabSAndre Guedes 	err = hci_req_run(&req, le_scan_disable_work_complete);
38594c87eaabSAndre Guedes 	if (err)
38604c87eaabSAndre Guedes 		BT_ERR("Disable LE scanning request failed: err %d", err);
386128b75a89SAndre Guedes }
386228b75a89SAndre Guedes 
38638d97250eSJohan Hedberg static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
38648d97250eSJohan Hedberg {
38658d97250eSJohan Hedberg 	struct hci_dev *hdev = req->hdev;
38668d97250eSJohan Hedberg 
38678d97250eSJohan Hedberg 	/* If we're advertising or initiating an LE connection we can't
38688d97250eSJohan Hedberg 	 * go ahead and change the random address at this time. This is
38698d97250eSJohan Hedberg 	 * because the eventual initiator address used for the
38708d97250eSJohan Hedberg 	 * subsequently created connection will be undefined (some
38718d97250eSJohan Hedberg 	 * controllers use the new address and others the one we had
38728d97250eSJohan Hedberg 	 * when the operation started).
38738d97250eSJohan Hedberg 	 *
38748d97250eSJohan Hedberg 	 * In this kind of scenario skip the update and let the random
38758d97250eSJohan Hedberg 	 * address be updated at the next cycle.
38768d97250eSJohan Hedberg 	 */
38775ce194c4SJohan Hedberg 	if (test_bit(HCI_LE_ADV, &hdev->dev_flags) ||
38788d97250eSJohan Hedberg 	    hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
38798d97250eSJohan Hedberg 		BT_DBG("Deferring random address update");
38809a783a13SJohan Hedberg 		set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
38818d97250eSJohan Hedberg 		return;
38828d97250eSJohan Hedberg 	}
38838d97250eSJohan Hedberg 
38848d97250eSJohan Hedberg 	hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, rpa);
38858d97250eSJohan Hedberg }
38868d97250eSJohan Hedberg 
388794b1fc92SMarcel Holtmann int hci_update_random_address(struct hci_request *req, bool require_privacy,
388894b1fc92SMarcel Holtmann 			      u8 *own_addr_type)
3889ebd3a747SJohan Hedberg {
3890ebd3a747SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
3891ebd3a747SJohan Hedberg 	int err;
3892ebd3a747SJohan Hedberg 
3893ebd3a747SJohan Hedberg 	/* If privacy is enabled use a resolvable private address. If
38942b5224dcSMarcel Holtmann 	 * current RPA has expired or there is something else than
38952b5224dcSMarcel Holtmann 	 * the current RPA in use, then generate a new one.
3896ebd3a747SJohan Hedberg 	 */
3897ebd3a747SJohan Hedberg 	if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
3898ebd3a747SJohan Hedberg 		int to;
3899ebd3a747SJohan Hedberg 
3900ebd3a747SJohan Hedberg 		*own_addr_type = ADDR_LE_DEV_RANDOM;
3901ebd3a747SJohan Hedberg 
3902ebd3a747SJohan Hedberg 		if (!test_and_clear_bit(HCI_RPA_EXPIRED, &hdev->dev_flags) &&
39032b5224dcSMarcel Holtmann 		    !bacmp(&hdev->random_addr, &hdev->rpa))
3904ebd3a747SJohan Hedberg 			return 0;
3905ebd3a747SJohan Hedberg 
3906defce9e8SJohan Hedberg 		err = smp_generate_rpa(hdev, hdev->irk, &hdev->rpa);
3907ebd3a747SJohan Hedberg 		if (err < 0) {
3908ebd3a747SJohan Hedberg 			BT_ERR("%s failed to generate new RPA", hdev->name);
3909ebd3a747SJohan Hedberg 			return err;
3910ebd3a747SJohan Hedberg 		}
3911ebd3a747SJohan Hedberg 
39128d97250eSJohan Hedberg 		set_random_addr(req, &hdev->rpa);
3913ebd3a747SJohan Hedberg 
3914ebd3a747SJohan Hedberg 		to = msecs_to_jiffies(hdev->rpa_timeout * 1000);
3915ebd3a747SJohan Hedberg 		queue_delayed_work(hdev->workqueue, &hdev->rpa_expired, to);
3916ebd3a747SJohan Hedberg 
3917ebd3a747SJohan Hedberg 		return 0;
3918ebd3a747SJohan Hedberg 	}
3919ebd3a747SJohan Hedberg 
392094b1fc92SMarcel Holtmann 	/* In case of required privacy without resolvable private address,
392194b1fc92SMarcel Holtmann 	 * use an unresolvable private address. This is useful for active
392294b1fc92SMarcel Holtmann 	 * scanning and non-connectable advertising.
392394b1fc92SMarcel Holtmann 	 */
392494b1fc92SMarcel Holtmann 	if (require_privacy) {
392594b1fc92SMarcel Holtmann 		bdaddr_t urpa;
392694b1fc92SMarcel Holtmann 
392794b1fc92SMarcel Holtmann 		get_random_bytes(&urpa, 6);
392894b1fc92SMarcel Holtmann 		urpa.b[5] &= 0x3f;	/* Clear two most significant bits */
392994b1fc92SMarcel Holtmann 
393094b1fc92SMarcel Holtmann 		*own_addr_type = ADDR_LE_DEV_RANDOM;
39318d97250eSJohan Hedberg 		set_random_addr(req, &urpa);
393294b1fc92SMarcel Holtmann 		return 0;
393394b1fc92SMarcel Holtmann 	}
393494b1fc92SMarcel Holtmann 
3935ebd3a747SJohan Hedberg 	/* If forcing static address is in use or there is no public
3936ebd3a747SJohan Hedberg 	 * address use the static address as random address (but skip
3937ebd3a747SJohan Hedberg 	 * the HCI command if the current random address is already the
3938ebd3a747SJohan Hedberg 	 * static one.
3939ebd3a747SJohan Hedberg 	 */
3940111902f7SMarcel Holtmann 	if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
3941ebd3a747SJohan Hedberg 	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3942ebd3a747SJohan Hedberg 		*own_addr_type = ADDR_LE_DEV_RANDOM;
3943ebd3a747SJohan Hedberg 		if (bacmp(&hdev->static_addr, &hdev->random_addr))
3944ebd3a747SJohan Hedberg 			hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
3945ebd3a747SJohan Hedberg 				    &hdev->static_addr);
3946ebd3a747SJohan Hedberg 		return 0;
3947ebd3a747SJohan Hedberg 	}
3948ebd3a747SJohan Hedberg 
3949ebd3a747SJohan Hedberg 	/* Neither privacy nor static address is being used so use a
3950ebd3a747SJohan Hedberg 	 * public address.
3951ebd3a747SJohan Hedberg 	 */
3952ebd3a747SJohan Hedberg 	*own_addr_type = ADDR_LE_DEV_PUBLIC;
3953ebd3a747SJohan Hedberg 
3954ebd3a747SJohan Hedberg 	return 0;
3955ebd3a747SJohan Hedberg }
3956ebd3a747SJohan Hedberg 
3957a1f4c318SJohan Hedberg /* Copy the Identity Address of the controller.
3958a1f4c318SJohan Hedberg  *
3959a1f4c318SJohan Hedberg  * If the controller has a public BD_ADDR, then by default use that one.
3960a1f4c318SJohan Hedberg  * If this is a LE only controller without a public address, default to
3961a1f4c318SJohan Hedberg  * the static random address.
3962a1f4c318SJohan Hedberg  *
3963a1f4c318SJohan Hedberg  * For debugging purposes it is possible to force controllers with a
3964a1f4c318SJohan Hedberg  * public address to use the static random address instead.
3965a1f4c318SJohan Hedberg  */
3966a1f4c318SJohan Hedberg void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
3967a1f4c318SJohan Hedberg 			       u8 *bdaddr_type)
3968a1f4c318SJohan Hedberg {
3969111902f7SMarcel Holtmann 	if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
3970a1f4c318SJohan Hedberg 	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3971a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->static_addr);
3972a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_RANDOM;
3973a1f4c318SJohan Hedberg 	} else {
3974a1f4c318SJohan Hedberg 		bacpy(bdaddr, &hdev->bdaddr);
3975a1f4c318SJohan Hedberg 		*bdaddr_type = ADDR_LE_DEV_PUBLIC;
3976a1f4c318SJohan Hedberg 	}
3977a1f4c318SJohan Hedberg }
3978a1f4c318SJohan Hedberg 
39799be0dab7SDavid Herrmann /* Alloc HCI device */
39809be0dab7SDavid Herrmann struct hci_dev *hci_alloc_dev(void)
39819be0dab7SDavid Herrmann {
39829be0dab7SDavid Herrmann 	struct hci_dev *hdev;
39839be0dab7SDavid Herrmann 
398427f70f3eSJohan Hedberg 	hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
39859be0dab7SDavid Herrmann 	if (!hdev)
39869be0dab7SDavid Herrmann 		return NULL;
39879be0dab7SDavid Herrmann 
3988b1b813d4SDavid Herrmann 	hdev->pkt_type  = (HCI_DM1 | HCI_DH1 | HCI_HV1);
3989b1b813d4SDavid Herrmann 	hdev->esco_type = (ESCO_HV1);
3990b1b813d4SDavid Herrmann 	hdev->link_mode = (HCI_LM_ACCEPT);
3991b4cb9fb2SMarcel Holtmann 	hdev->num_iac = 0x01;		/* One IAC support is mandatory */
3992b1b813d4SDavid Herrmann 	hdev->io_capability = 0x03;	/* No Input No Output */
399396c2103aSMarcel Holtmann 	hdev->manufacturer = 0xffff;	/* Default to internal use */
3994bbaf444aSJohan Hedberg 	hdev->inq_tx_power = HCI_TX_POWER_INVALID;
3995bbaf444aSJohan Hedberg 	hdev->adv_tx_power = HCI_TX_POWER_INVALID;
3996b1b813d4SDavid Herrmann 
3997b1b813d4SDavid Herrmann 	hdev->sniff_max_interval = 800;
3998b1b813d4SDavid Herrmann 	hdev->sniff_min_interval = 80;
3999b1b813d4SDavid Herrmann 
40003f959d46SMarcel Holtmann 	hdev->le_adv_channel_map = 0x07;
4001628531c9SGeorg Lukas 	hdev->le_adv_min_interval = 0x0800;
4002628531c9SGeorg Lukas 	hdev->le_adv_max_interval = 0x0800;
4003bef64738SMarcel Holtmann 	hdev->le_scan_interval = 0x0060;
4004bef64738SMarcel Holtmann 	hdev->le_scan_window = 0x0030;
40054e70c7e7SMarcel Holtmann 	hdev->le_conn_min_interval = 0x0028;
40064e70c7e7SMarcel Holtmann 	hdev->le_conn_max_interval = 0x0038;
400704fb7d90SMarcel Holtmann 	hdev->le_conn_latency = 0x0000;
400804fb7d90SMarcel Holtmann 	hdev->le_supv_timeout = 0x002a;
4009bef64738SMarcel Holtmann 
4010d6bfd59cSJohan Hedberg 	hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
4011b9a7a61eSLukasz Rymanowski 	hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;
401231ad1691SAndrzej Kaczmarek 	hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE;
401331ad1691SAndrzej Kaczmarek 	hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE;
4014d6bfd59cSJohan Hedberg 
4015b1b813d4SDavid Herrmann 	mutex_init(&hdev->lock);
4016b1b813d4SDavid Herrmann 	mutex_init(&hdev->req_lock);
4017b1b813d4SDavid Herrmann 
4018b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->mgmt_pending);
4019b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->blacklist);
40206659358eSJohan Hedberg 	INIT_LIST_HEAD(&hdev->whitelist);
4021b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->uuids);
4022b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->link_keys);
4023b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->long_term_keys);
4024970c4e46SJohan Hedberg 	INIT_LIST_HEAD(&hdev->identity_resolving_keys);
4025b1b813d4SDavid Herrmann 	INIT_LIST_HEAD(&hdev->remote_oob_data);
4026d2ab0ac1SMarcel Holtmann 	INIT_LIST_HEAD(&hdev->le_white_list);
402715819a70SAndre Guedes 	INIT_LIST_HEAD(&hdev->le_conn_params);
402877a77a30SAndre Guedes 	INIT_LIST_HEAD(&hdev->pend_le_conns);
402966f8455aSJohan Hedberg 	INIT_LIST_HEAD(&hdev->pend_le_reports);
40306b536b5eSAndrei Emeltchenko 	INIT_LIST_HEAD(&hdev->conn_hash.list);
4031b1b813d4SDavid Herrmann 
4032b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->rx_work, hci_rx_work);
4033b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->cmd_work, hci_cmd_work);
4034b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->tx_work, hci_tx_work);
4035b1b813d4SDavid Herrmann 	INIT_WORK(&hdev->power_on, hci_power_on);
4036b1b813d4SDavid Herrmann 
4037b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
4038b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
4039b1b813d4SDavid Herrmann 	INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
4040b1b813d4SDavid Herrmann 
4041b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->rx_q);
4042b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->cmd_q);
4043b1b813d4SDavid Herrmann 	skb_queue_head_init(&hdev->raw_q);
4044b1b813d4SDavid Herrmann 
4045b1b813d4SDavid Herrmann 	init_waitqueue_head(&hdev->req_wait_q);
4046b1b813d4SDavid Herrmann 
404765cc2b49SMarcel Holtmann 	INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout);
4048b1b813d4SDavid Herrmann 
4049b1b813d4SDavid Herrmann 	hci_init_sysfs(hdev);
4050b1b813d4SDavid Herrmann 	discovery_init(hdev);
40519be0dab7SDavid Herrmann 
40529be0dab7SDavid Herrmann 	return hdev;
40539be0dab7SDavid Herrmann }
40549be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_alloc_dev);
40559be0dab7SDavid Herrmann 
40569be0dab7SDavid Herrmann /* Free HCI device */
40579be0dab7SDavid Herrmann void hci_free_dev(struct hci_dev *hdev)
40589be0dab7SDavid Herrmann {
40599be0dab7SDavid Herrmann 	/* will free via device release */
40609be0dab7SDavid Herrmann 	put_device(&hdev->dev);
40619be0dab7SDavid Herrmann }
40629be0dab7SDavid Herrmann EXPORT_SYMBOL(hci_free_dev);
40639be0dab7SDavid Herrmann 
40641da177e4SLinus Torvalds /* Register HCI device */
40651da177e4SLinus Torvalds int hci_register_dev(struct hci_dev *hdev)
40661da177e4SLinus Torvalds {
4067b1b813d4SDavid Herrmann 	int id, error;
40681da177e4SLinus Torvalds 
406974292d5aSMarcel Holtmann 	if (!hdev->open || !hdev->close || !hdev->send)
40701da177e4SLinus Torvalds 		return -EINVAL;
40711da177e4SLinus Torvalds 
407208add513SMat Martineau 	/* Do not allow HCI_AMP devices to register at index 0,
407308add513SMat Martineau 	 * so the index can be used as the AMP controller ID.
407408add513SMat Martineau 	 */
40753df92b31SSasha Levin 	switch (hdev->dev_type) {
40763df92b31SSasha Levin 	case HCI_BREDR:
40773df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
40781da177e4SLinus Torvalds 		break;
40793df92b31SSasha Levin 	case HCI_AMP:
40803df92b31SSasha Levin 		id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
40813df92b31SSasha Levin 		break;
40823df92b31SSasha Levin 	default:
40833df92b31SSasha Levin 		return -EINVAL;
40841da177e4SLinus Torvalds 	}
40851da177e4SLinus Torvalds 
40863df92b31SSasha Levin 	if (id < 0)
40873df92b31SSasha Levin 		return id;
40883df92b31SSasha Levin 
40891da177e4SLinus Torvalds 	sprintf(hdev->name, "hci%d", id);
40901da177e4SLinus Torvalds 	hdev->id = id;
40912d8b3a11SAndrei Emeltchenko 
40922d8b3a11SAndrei Emeltchenko 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
40932d8b3a11SAndrei Emeltchenko 
4094d8537548SKees Cook 	hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
4095d8537548SKees Cook 					  WQ_MEM_RECLAIM, 1, hdev->name);
409633ca954dSDavid Herrmann 	if (!hdev->workqueue) {
409733ca954dSDavid Herrmann 		error = -ENOMEM;
409833ca954dSDavid Herrmann 		goto err;
409933ca954dSDavid Herrmann 	}
4100f48fd9c8SMarcel Holtmann 
4101d8537548SKees Cook 	hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
4102d8537548SKees Cook 					      WQ_MEM_RECLAIM, 1, hdev->name);
41036ead1bbcSJohan Hedberg 	if (!hdev->req_workqueue) {
41046ead1bbcSJohan Hedberg 		destroy_workqueue(hdev->workqueue);
41056ead1bbcSJohan Hedberg 		error = -ENOMEM;
41066ead1bbcSJohan Hedberg 		goto err;
41076ead1bbcSJohan Hedberg 	}
41086ead1bbcSJohan Hedberg 
41090153e2ecSMarcel Holtmann 	if (!IS_ERR_OR_NULL(bt_debugfs))
41100153e2ecSMarcel Holtmann 		hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
41110153e2ecSMarcel Holtmann 
4112bdc3e0f1SMarcel Holtmann 	dev_set_name(&hdev->dev, "%s", hdev->name);
4113bdc3e0f1SMarcel Holtmann 
4114bdc3e0f1SMarcel Holtmann 	error = device_add(&hdev->dev);
411533ca954dSDavid Herrmann 	if (error < 0)
411654506918SJohan Hedberg 		goto err_wqueue;
41171da177e4SLinus Torvalds 
4118611b30f7SMarcel Holtmann 	hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
4119a8c5fb1aSGustavo Padovan 				    RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
4120a8c5fb1aSGustavo Padovan 				    hdev);
4121611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
4122611b30f7SMarcel Holtmann 		if (rfkill_register(hdev->rfkill) < 0) {
4123611b30f7SMarcel Holtmann 			rfkill_destroy(hdev->rfkill);
4124611b30f7SMarcel Holtmann 			hdev->rfkill = NULL;
4125611b30f7SMarcel Holtmann 		}
4126611b30f7SMarcel Holtmann 	}
4127611b30f7SMarcel Holtmann 
41285e130367SJohan Hedberg 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
41295e130367SJohan Hedberg 		set_bit(HCI_RFKILLED, &hdev->dev_flags);
41305e130367SJohan Hedberg 
4131a8b2d5c2SJohan Hedberg 	set_bit(HCI_SETUP, &hdev->dev_flags);
4132004b0258SMarcel Holtmann 	set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
4133ce2be9acSAndrei Emeltchenko 
413401cd3404SMarcel Holtmann 	if (hdev->dev_type == HCI_BREDR) {
413556f87901SJohan Hedberg 		/* Assume BR/EDR support until proven otherwise (such as
413656f87901SJohan Hedberg 		 * through reading supported features during init.
413756f87901SJohan Hedberg 		 */
413856f87901SJohan Hedberg 		set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
413956f87901SJohan Hedberg 	}
4140ce2be9acSAndrei Emeltchenko 
4141fcee3377SGustavo Padovan 	write_lock(&hci_dev_list_lock);
4142fcee3377SGustavo Padovan 	list_add(&hdev->list, &hci_dev_list);
4143fcee3377SGustavo Padovan 	write_unlock(&hci_dev_list_lock);
4144fcee3377SGustavo Padovan 
41454a964404SMarcel Holtmann 	/* Devices that are marked for raw-only usage are unconfigured
41464a964404SMarcel Holtmann 	 * and should not be included in normal operation.
4147fee746b0SMarcel Holtmann 	 */
4148fee746b0SMarcel Holtmann 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
41494a964404SMarcel Holtmann 		set_bit(HCI_UNCONFIGURED, &hdev->dev_flags);
4150fee746b0SMarcel Holtmann 
41511da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_REG);
4152dc946bd8SDavid Herrmann 	hci_dev_hold(hdev);
41531da177e4SLinus Torvalds 
415419202573SJohan Hedberg 	queue_work(hdev->req_workqueue, &hdev->power_on);
4155fbe96d6fSMarcel Holtmann 
41561da177e4SLinus Torvalds 	return id;
4157f48fd9c8SMarcel Holtmann 
415833ca954dSDavid Herrmann err_wqueue:
415933ca954dSDavid Herrmann 	destroy_workqueue(hdev->workqueue);
41606ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
416133ca954dSDavid Herrmann err:
41623df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, hdev->id);
4163f48fd9c8SMarcel Holtmann 
416433ca954dSDavid Herrmann 	return error;
41651da177e4SLinus Torvalds }
41661da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_dev);
41671da177e4SLinus Torvalds 
41681da177e4SLinus Torvalds /* Unregister HCI device */
416959735631SDavid Herrmann void hci_unregister_dev(struct hci_dev *hdev)
41701da177e4SLinus Torvalds {
41713df92b31SSasha Levin 	int i, id;
4172ef222013SMarcel Holtmann 
4173c13854ceSMarcel Holtmann 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
41741da177e4SLinus Torvalds 
417594324962SJohan Hovold 	set_bit(HCI_UNREGISTER, &hdev->dev_flags);
417694324962SJohan Hovold 
41773df92b31SSasha Levin 	id = hdev->id;
41783df92b31SSasha Levin 
4179f20d09d5SGustavo F. Padovan 	write_lock(&hci_dev_list_lock);
41801da177e4SLinus Torvalds 	list_del(&hdev->list);
4181f20d09d5SGustavo F. Padovan 	write_unlock(&hci_dev_list_lock);
41821da177e4SLinus Torvalds 
41831da177e4SLinus Torvalds 	hci_dev_do_close(hdev);
41841da177e4SLinus Torvalds 
4185cd4c5391SSuraj Sumangala 	for (i = 0; i < NUM_REASSEMBLY; i++)
4186ef222013SMarcel Holtmann 		kfree_skb(hdev->reassembly[i]);
4187ef222013SMarcel Holtmann 
4188b9b5ef18SGustavo Padovan 	cancel_work_sync(&hdev->power_on);
4189b9b5ef18SGustavo Padovan 
4190ab81cbf9SJohan Hedberg 	if (!test_bit(HCI_INIT, &hdev->flags) &&
4191d603b76bSMarcel Holtmann 	    !test_bit(HCI_SETUP, &hdev->dev_flags) &&
4192d603b76bSMarcel Holtmann 	    !test_bit(HCI_CONFIG, &hdev->dev_flags)) {
419309fd0de5SGustavo F. Padovan 		hci_dev_lock(hdev);
4194744cf19eSJohan Hedberg 		mgmt_index_removed(hdev);
419509fd0de5SGustavo F. Padovan 		hci_dev_unlock(hdev);
419656e5cb86SJohan Hedberg 	}
4197ab81cbf9SJohan Hedberg 
41982e58ef3eSJohan Hedberg 	/* mgmt_index_removed should take care of emptying the
41992e58ef3eSJohan Hedberg 	 * pending list */
42002e58ef3eSJohan Hedberg 	BUG_ON(!list_empty(&hdev->mgmt_pending));
42012e58ef3eSJohan Hedberg 
42021da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_UNREG);
42031da177e4SLinus Torvalds 
4204611b30f7SMarcel Holtmann 	if (hdev->rfkill) {
4205611b30f7SMarcel Holtmann 		rfkill_unregister(hdev->rfkill);
4206611b30f7SMarcel Holtmann 		rfkill_destroy(hdev->rfkill);
4207611b30f7SMarcel Holtmann 	}
4208611b30f7SMarcel Holtmann 
4209711eafe3SJohan Hedberg 	smp_unregister(hdev);
421099780a7bSJohan Hedberg 
4211bdc3e0f1SMarcel Holtmann 	device_del(&hdev->dev);
4212147e2d59SDave Young 
42130153e2ecSMarcel Holtmann 	debugfs_remove_recursive(hdev->debugfs);
42140153e2ecSMarcel Holtmann 
4215f48fd9c8SMarcel Holtmann 	destroy_workqueue(hdev->workqueue);
42166ead1bbcSJohan Hedberg 	destroy_workqueue(hdev->req_workqueue);
4217f48fd9c8SMarcel Holtmann 
421809fd0de5SGustavo F. Padovan 	hci_dev_lock(hdev);
4219dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->blacklist);
42206659358eSJohan Hedberg 	hci_bdaddr_list_clear(&hdev->whitelist);
42212aeb9a1aSJohan Hedberg 	hci_uuids_clear(hdev);
422255ed8ca1SJohan Hedberg 	hci_link_keys_clear(hdev);
4223b899efafSVinicius Costa Gomes 	hci_smp_ltks_clear(hdev);
4224970c4e46SJohan Hedberg 	hci_smp_irks_clear(hdev);
42252763eda6SSzymon Janc 	hci_remote_oob_data_clear(hdev);
4226dcc36c16SJohan Hedberg 	hci_bdaddr_list_clear(&hdev->le_white_list);
4227373110c5SJohan Hedberg 	hci_conn_params_clear_all(hdev);
422809fd0de5SGustavo F. Padovan 	hci_dev_unlock(hdev);
4229e2e0cacbSJohan Hedberg 
4230dc946bd8SDavid Herrmann 	hci_dev_put(hdev);
42313df92b31SSasha Levin 
42323df92b31SSasha Levin 	ida_simple_remove(&hci_index_ida, id);
42331da177e4SLinus Torvalds }
42341da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_dev);
42351da177e4SLinus Torvalds 
42361da177e4SLinus Torvalds /* Suspend HCI device */
42371da177e4SLinus Torvalds int hci_suspend_dev(struct hci_dev *hdev)
42381da177e4SLinus Torvalds {
42391da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_SUSPEND);
42401da177e4SLinus Torvalds 	return 0;
42411da177e4SLinus Torvalds }
42421da177e4SLinus Torvalds EXPORT_SYMBOL(hci_suspend_dev);
42431da177e4SLinus Torvalds 
42441da177e4SLinus Torvalds /* Resume HCI device */
42451da177e4SLinus Torvalds int hci_resume_dev(struct hci_dev *hdev)
42461da177e4SLinus Torvalds {
42471da177e4SLinus Torvalds 	hci_notify(hdev, HCI_DEV_RESUME);
42481da177e4SLinus Torvalds 	return 0;
42491da177e4SLinus Torvalds }
42501da177e4SLinus Torvalds EXPORT_SYMBOL(hci_resume_dev);
42511da177e4SLinus Torvalds 
425275e0569fSMarcel Holtmann /* Reset HCI device */
425375e0569fSMarcel Holtmann int hci_reset_dev(struct hci_dev *hdev)
425475e0569fSMarcel Holtmann {
425575e0569fSMarcel Holtmann 	const u8 hw_err[] = { HCI_EV_HARDWARE_ERROR, 0x01, 0x00 };
425675e0569fSMarcel Holtmann 	struct sk_buff *skb;
425775e0569fSMarcel Holtmann 
425875e0569fSMarcel Holtmann 	skb = bt_skb_alloc(3, GFP_ATOMIC);
425975e0569fSMarcel Holtmann 	if (!skb)
426075e0569fSMarcel Holtmann 		return -ENOMEM;
426175e0569fSMarcel Holtmann 
426275e0569fSMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
426375e0569fSMarcel Holtmann 	memcpy(skb_put(skb, 3), hw_err, 3);
426475e0569fSMarcel Holtmann 
426575e0569fSMarcel Holtmann 	/* Send Hardware Error to upper stack */
426675e0569fSMarcel Holtmann 	return hci_recv_frame(hdev, skb);
426775e0569fSMarcel Holtmann }
426875e0569fSMarcel Holtmann EXPORT_SYMBOL(hci_reset_dev);
426975e0569fSMarcel Holtmann 
427076bca880SMarcel Holtmann /* Receive frame from HCI drivers */
4271e1a26170SMarcel Holtmann int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
427276bca880SMarcel Holtmann {
427376bca880SMarcel Holtmann 	if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
427476bca880SMarcel Holtmann 		      && !test_bit(HCI_INIT, &hdev->flags))) {
427576bca880SMarcel Holtmann 		kfree_skb(skb);
427676bca880SMarcel Holtmann 		return -ENXIO;
427776bca880SMarcel Holtmann 	}
427876bca880SMarcel Holtmann 
4279d82603c6SJorrit Schippers 	/* Incoming skb */
428076bca880SMarcel Holtmann 	bt_cb(skb)->incoming = 1;
428176bca880SMarcel Holtmann 
428276bca880SMarcel Holtmann 	/* Time stamp */
428376bca880SMarcel Holtmann 	__net_timestamp(skb);
428476bca880SMarcel Holtmann 
428576bca880SMarcel Holtmann 	skb_queue_tail(&hdev->rx_q, skb);
4286b78752ccSMarcel Holtmann 	queue_work(hdev->workqueue, &hdev->rx_work);
4287c78ae283SMarcel Holtmann 
428876bca880SMarcel Holtmann 	return 0;
428976bca880SMarcel Holtmann }
429076bca880SMarcel Holtmann EXPORT_SYMBOL(hci_recv_frame);
429176bca880SMarcel Holtmann 
429233e882a5SSuraj Sumangala static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
42931e429f38SGustavo F. Padovan 			  int count, __u8 index)
429433e882a5SSuraj Sumangala {
429533e882a5SSuraj Sumangala 	int len = 0;
429633e882a5SSuraj Sumangala 	int hlen = 0;
429733e882a5SSuraj Sumangala 	int remain = count;
429833e882a5SSuraj Sumangala 	struct sk_buff *skb;
429933e882a5SSuraj Sumangala 	struct bt_skb_cb *scb;
430033e882a5SSuraj Sumangala 
430133e882a5SSuraj Sumangala 	if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
430233e882a5SSuraj Sumangala 	    index >= NUM_REASSEMBLY)
430333e882a5SSuraj Sumangala 		return -EILSEQ;
430433e882a5SSuraj Sumangala 
430533e882a5SSuraj Sumangala 	skb = hdev->reassembly[index];
430633e882a5SSuraj Sumangala 
430733e882a5SSuraj Sumangala 	if (!skb) {
430833e882a5SSuraj Sumangala 		switch (type) {
430933e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
431033e882a5SSuraj Sumangala 			len = HCI_MAX_FRAME_SIZE;
431133e882a5SSuraj Sumangala 			hlen = HCI_ACL_HDR_SIZE;
431233e882a5SSuraj Sumangala 			break;
431333e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
431433e882a5SSuraj Sumangala 			len = HCI_MAX_EVENT_SIZE;
431533e882a5SSuraj Sumangala 			hlen = HCI_EVENT_HDR_SIZE;
431633e882a5SSuraj Sumangala 			break;
431733e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
431833e882a5SSuraj Sumangala 			len = HCI_MAX_SCO_SIZE;
431933e882a5SSuraj Sumangala 			hlen = HCI_SCO_HDR_SIZE;
432033e882a5SSuraj Sumangala 			break;
432133e882a5SSuraj Sumangala 		}
432233e882a5SSuraj Sumangala 
43231e429f38SGustavo F. Padovan 		skb = bt_skb_alloc(len, GFP_ATOMIC);
432433e882a5SSuraj Sumangala 		if (!skb)
432533e882a5SSuraj Sumangala 			return -ENOMEM;
432633e882a5SSuraj Sumangala 
432733e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
432833e882a5SSuraj Sumangala 		scb->expect = hlen;
432933e882a5SSuraj Sumangala 		scb->pkt_type = type;
433033e882a5SSuraj Sumangala 
433133e882a5SSuraj Sumangala 		hdev->reassembly[index] = skb;
433233e882a5SSuraj Sumangala 	}
433333e882a5SSuraj Sumangala 
433433e882a5SSuraj Sumangala 	while (count) {
433533e882a5SSuraj Sumangala 		scb = (void *) skb->cb;
433689bb46d0SDan Carpenter 		len = min_t(uint, scb->expect, count);
433733e882a5SSuraj Sumangala 
433833e882a5SSuraj Sumangala 		memcpy(skb_put(skb, len), data, len);
433933e882a5SSuraj Sumangala 
434033e882a5SSuraj Sumangala 		count -= len;
434133e882a5SSuraj Sumangala 		data += len;
434233e882a5SSuraj Sumangala 		scb->expect -= len;
434333e882a5SSuraj Sumangala 		remain = count;
434433e882a5SSuraj Sumangala 
434533e882a5SSuraj Sumangala 		switch (type) {
434633e882a5SSuraj Sumangala 		case HCI_EVENT_PKT:
434733e882a5SSuraj Sumangala 			if (skb->len == HCI_EVENT_HDR_SIZE) {
434833e882a5SSuraj Sumangala 				struct hci_event_hdr *h = hci_event_hdr(skb);
434933e882a5SSuraj Sumangala 				scb->expect = h->plen;
435033e882a5SSuraj Sumangala 
435133e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
435233e882a5SSuraj Sumangala 					kfree_skb(skb);
435333e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
435433e882a5SSuraj Sumangala 					return -ENOMEM;
435533e882a5SSuraj Sumangala 				}
435633e882a5SSuraj Sumangala 			}
435733e882a5SSuraj Sumangala 			break;
435833e882a5SSuraj Sumangala 
435933e882a5SSuraj Sumangala 		case HCI_ACLDATA_PKT:
436033e882a5SSuraj Sumangala 			if (skb->len  == HCI_ACL_HDR_SIZE) {
436133e882a5SSuraj Sumangala 				struct hci_acl_hdr *h = hci_acl_hdr(skb);
436233e882a5SSuraj Sumangala 				scb->expect = __le16_to_cpu(h->dlen);
436333e882a5SSuraj Sumangala 
436433e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
436533e882a5SSuraj Sumangala 					kfree_skb(skb);
436633e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
436733e882a5SSuraj Sumangala 					return -ENOMEM;
436833e882a5SSuraj Sumangala 				}
436933e882a5SSuraj Sumangala 			}
437033e882a5SSuraj Sumangala 			break;
437133e882a5SSuraj Sumangala 
437233e882a5SSuraj Sumangala 		case HCI_SCODATA_PKT:
437333e882a5SSuraj Sumangala 			if (skb->len == HCI_SCO_HDR_SIZE) {
437433e882a5SSuraj Sumangala 				struct hci_sco_hdr *h = hci_sco_hdr(skb);
437533e882a5SSuraj Sumangala 				scb->expect = h->dlen;
437633e882a5SSuraj Sumangala 
437733e882a5SSuraj Sumangala 				if (skb_tailroom(skb) < scb->expect) {
437833e882a5SSuraj Sumangala 					kfree_skb(skb);
437933e882a5SSuraj Sumangala 					hdev->reassembly[index] = NULL;
438033e882a5SSuraj Sumangala 					return -ENOMEM;
438133e882a5SSuraj Sumangala 				}
438233e882a5SSuraj Sumangala 			}
438333e882a5SSuraj Sumangala 			break;
438433e882a5SSuraj Sumangala 		}
438533e882a5SSuraj Sumangala 
438633e882a5SSuraj Sumangala 		if (scb->expect == 0) {
438733e882a5SSuraj Sumangala 			/* Complete frame */
438833e882a5SSuraj Sumangala 
438933e882a5SSuraj Sumangala 			bt_cb(skb)->pkt_type = type;
4390e1a26170SMarcel Holtmann 			hci_recv_frame(hdev, skb);
439133e882a5SSuraj Sumangala 
439233e882a5SSuraj Sumangala 			hdev->reassembly[index] = NULL;
439333e882a5SSuraj Sumangala 			return remain;
439433e882a5SSuraj Sumangala 		}
439533e882a5SSuraj Sumangala 	}
439633e882a5SSuraj Sumangala 
439733e882a5SSuraj Sumangala 	return remain;
439833e882a5SSuraj Sumangala }
439933e882a5SSuraj Sumangala 
440099811510SSuraj Sumangala #define STREAM_REASSEMBLY 0
440199811510SSuraj Sumangala 
440299811510SSuraj Sumangala int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
440399811510SSuraj Sumangala {
440499811510SSuraj Sumangala 	int type;
440599811510SSuraj Sumangala 	int rem = 0;
440699811510SSuraj Sumangala 
4407da5f6c37SGustavo F. Padovan 	while (count) {
440899811510SSuraj Sumangala 		struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
440999811510SSuraj Sumangala 
441099811510SSuraj Sumangala 		if (!skb) {
441199811510SSuraj Sumangala 			struct { char type; } *pkt;
441299811510SSuraj Sumangala 
441399811510SSuraj Sumangala 			/* Start of the frame */
441499811510SSuraj Sumangala 			pkt = data;
441599811510SSuraj Sumangala 			type = pkt->type;
441699811510SSuraj Sumangala 
441799811510SSuraj Sumangala 			data++;
441899811510SSuraj Sumangala 			count--;
441999811510SSuraj Sumangala 		} else
442099811510SSuraj Sumangala 			type = bt_cb(skb)->pkt_type;
442199811510SSuraj Sumangala 
44221e429f38SGustavo F. Padovan 		rem = hci_reassembly(hdev, type, data, count,
44231e429f38SGustavo F. Padovan 				     STREAM_REASSEMBLY);
442499811510SSuraj Sumangala 		if (rem < 0)
442599811510SSuraj Sumangala 			return rem;
442699811510SSuraj Sumangala 
442799811510SSuraj Sumangala 		data += (count - rem);
442899811510SSuraj Sumangala 		count = rem;
4429f81c6224SJoe Perches 	}
443099811510SSuraj Sumangala 
443199811510SSuraj Sumangala 	return rem;
443299811510SSuraj Sumangala }
443399811510SSuraj Sumangala EXPORT_SYMBOL(hci_recv_stream_fragment);
443499811510SSuraj Sumangala 
44351da177e4SLinus Torvalds /* ---- Interface to upper protocols ---- */
44361da177e4SLinus Torvalds 
44371da177e4SLinus Torvalds int hci_register_cb(struct hci_cb *cb)
44381da177e4SLinus Torvalds {
44391da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
44401da177e4SLinus Torvalds 
4441f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
44421da177e4SLinus Torvalds 	list_add(&cb->list, &hci_cb_list);
4443f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
44441da177e4SLinus Torvalds 
44451da177e4SLinus Torvalds 	return 0;
44461da177e4SLinus Torvalds }
44471da177e4SLinus Torvalds EXPORT_SYMBOL(hci_register_cb);
44481da177e4SLinus Torvalds 
44491da177e4SLinus Torvalds int hci_unregister_cb(struct hci_cb *cb)
44501da177e4SLinus Torvalds {
44511da177e4SLinus Torvalds 	BT_DBG("%p name %s", cb, cb->name);
44521da177e4SLinus Torvalds 
4453f20d09d5SGustavo F. Padovan 	write_lock(&hci_cb_list_lock);
44541da177e4SLinus Torvalds 	list_del(&cb->list);
4455f20d09d5SGustavo F. Padovan 	write_unlock(&hci_cb_list_lock);
44561da177e4SLinus Torvalds 
44571da177e4SLinus Torvalds 	return 0;
44581da177e4SLinus Torvalds }
44591da177e4SLinus Torvalds EXPORT_SYMBOL(hci_unregister_cb);
44601da177e4SLinus Torvalds 
446151086991SMarcel Holtmann static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
44621da177e4SLinus Torvalds {
4463cdc52faaSMarcel Holtmann 	int err;
4464cdc52faaSMarcel Holtmann 
44650d48d939SMarcel Holtmann 	BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
44661da177e4SLinus Torvalds 
44671da177e4SLinus Torvalds 	/* Time stamp */
4468a61bbcf2SPatrick McHardy 	__net_timestamp(skb);
44691da177e4SLinus Torvalds 
4470cd82e61cSMarcel Holtmann 	/* Send copy to monitor */
4471cd82e61cSMarcel Holtmann 	hci_send_to_monitor(hdev, skb);
4472cd82e61cSMarcel Holtmann 
4473cd82e61cSMarcel Holtmann 	if (atomic_read(&hdev->promisc)) {
4474cd82e61cSMarcel Holtmann 		/* Send copy to the sockets */
4475470fe1b5SMarcel Holtmann 		hci_send_to_sock(hdev, skb);
44761da177e4SLinus Torvalds 	}
44771da177e4SLinus Torvalds 
44781da177e4SLinus Torvalds 	/* Get rid of skb owner, prior to sending to the driver. */
44791da177e4SLinus Torvalds 	skb_orphan(skb);
44801da177e4SLinus Torvalds 
4481cdc52faaSMarcel Holtmann 	err = hdev->send(hdev, skb);
4482cdc52faaSMarcel Holtmann 	if (err < 0) {
4483cdc52faaSMarcel Holtmann 		BT_ERR("%s sending frame failed (%d)", hdev->name, err);
4484cdc52faaSMarcel Holtmann 		kfree_skb(skb);
4485cdc52faaSMarcel Holtmann 	}
44861da177e4SLinus Torvalds }
44871da177e4SLinus Torvalds 
44883119ae95SJohan Hedberg void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
44893119ae95SJohan Hedberg {
44903119ae95SJohan Hedberg 	skb_queue_head_init(&req->cmd_q);
44913119ae95SJohan Hedberg 	req->hdev = hdev;
44925d73e034SAndre Guedes 	req->err = 0;
44933119ae95SJohan Hedberg }
44943119ae95SJohan Hedberg 
44953119ae95SJohan Hedberg int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
44963119ae95SJohan Hedberg {
44973119ae95SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
44983119ae95SJohan Hedberg 	struct sk_buff *skb;
44993119ae95SJohan Hedberg 	unsigned long flags;
45003119ae95SJohan Hedberg 
45013119ae95SJohan Hedberg 	BT_DBG("length %u", skb_queue_len(&req->cmd_q));
45023119ae95SJohan Hedberg 
450349c922bbSStephen Hemminger 	/* If an error occurred during request building, remove all HCI
45045d73e034SAndre Guedes 	 * commands queued on the HCI request queue.
45055d73e034SAndre Guedes 	 */
45065d73e034SAndre Guedes 	if (req->err) {
45075d73e034SAndre Guedes 		skb_queue_purge(&req->cmd_q);
45085d73e034SAndre Guedes 		return req->err;
45095d73e034SAndre Guedes 	}
45105d73e034SAndre Guedes 
45113119ae95SJohan Hedberg 	/* Do not allow empty requests */
45123119ae95SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
4513382b0c39SAndre Guedes 		return -ENODATA;
45143119ae95SJohan Hedberg 
45153119ae95SJohan Hedberg 	skb = skb_peek_tail(&req->cmd_q);
45163119ae95SJohan Hedberg 	bt_cb(skb)->req.complete = complete;
45173119ae95SJohan Hedberg 
45183119ae95SJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
45193119ae95SJohan Hedberg 	skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
45203119ae95SJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
45213119ae95SJohan Hedberg 
45223119ae95SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
45233119ae95SJohan Hedberg 
45243119ae95SJohan Hedberg 	return 0;
45253119ae95SJohan Hedberg }
45263119ae95SJohan Hedberg 
4527899de765SMarcel Holtmann bool hci_req_pending(struct hci_dev *hdev)
4528899de765SMarcel Holtmann {
4529899de765SMarcel Holtmann 	return (hdev->req_status == HCI_REQ_PEND);
4530899de765SMarcel Holtmann }
4531899de765SMarcel Holtmann 
45321ca3a9d0SJohan Hedberg static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
453307dc93ddSJohan Hedberg 				       u32 plen, const void *param)
45341da177e4SLinus Torvalds {
45351da177e4SLinus Torvalds 	int len = HCI_COMMAND_HDR_SIZE + plen;
45361da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
45371da177e4SLinus Torvalds 	struct sk_buff *skb;
45381da177e4SLinus Torvalds 
45391da177e4SLinus Torvalds 	skb = bt_skb_alloc(len, GFP_ATOMIC);
45401ca3a9d0SJohan Hedberg 	if (!skb)
45411ca3a9d0SJohan Hedberg 		return NULL;
45421da177e4SLinus Torvalds 
45431da177e4SLinus Torvalds 	hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
4544a9de9248SMarcel Holtmann 	hdr->opcode = cpu_to_le16(opcode);
45451da177e4SLinus Torvalds 	hdr->plen   = plen;
45461da177e4SLinus Torvalds 
45471da177e4SLinus Torvalds 	if (plen)
45481da177e4SLinus Torvalds 		memcpy(skb_put(skb, plen), param, plen);
45491da177e4SLinus Torvalds 
45501da177e4SLinus Torvalds 	BT_DBG("skb len %d", skb->len);
45511da177e4SLinus Torvalds 
45520d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
455343e73e4eSMarcel Holtmann 	bt_cb(skb)->opcode = opcode;
4554c78ae283SMarcel Holtmann 
45551ca3a9d0SJohan Hedberg 	return skb;
45561ca3a9d0SJohan Hedberg }
45571ca3a9d0SJohan Hedberg 
45581ca3a9d0SJohan Hedberg /* Send HCI command */
455907dc93ddSJohan Hedberg int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
456007dc93ddSJohan Hedberg 		 const void *param)
45611ca3a9d0SJohan Hedberg {
45621ca3a9d0SJohan Hedberg 	struct sk_buff *skb;
45631ca3a9d0SJohan Hedberg 
45641ca3a9d0SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
45651ca3a9d0SJohan Hedberg 
45661ca3a9d0SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
45671ca3a9d0SJohan Hedberg 	if (!skb) {
45681ca3a9d0SJohan Hedberg 		BT_ERR("%s no memory for command", hdev->name);
45691ca3a9d0SJohan Hedberg 		return -ENOMEM;
45701ca3a9d0SJohan Hedberg 	}
45711ca3a9d0SJohan Hedberg 
457249c922bbSStephen Hemminger 	/* Stand-alone HCI commands must be flagged as
457311714b3dSJohan Hedberg 	 * single-command requests.
457411714b3dSJohan Hedberg 	 */
457511714b3dSJohan Hedberg 	bt_cb(skb)->req.start = true;
457611714b3dSJohan Hedberg 
45771da177e4SLinus Torvalds 	skb_queue_tail(&hdev->cmd_q, skb);
4578c347b765SGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->cmd_work);
45791da177e4SLinus Torvalds 
45801da177e4SLinus Torvalds 	return 0;
45811da177e4SLinus Torvalds }
45821da177e4SLinus Torvalds 
458371c76a17SJohan Hedberg /* Queue a command to an asynchronous HCI request */
458407dc93ddSJohan Hedberg void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
458507dc93ddSJohan Hedberg 		    const void *param, u8 event)
458671c76a17SJohan Hedberg {
458771c76a17SJohan Hedberg 	struct hci_dev *hdev = req->hdev;
458871c76a17SJohan Hedberg 	struct sk_buff *skb;
458971c76a17SJohan Hedberg 
459071c76a17SJohan Hedberg 	BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
459171c76a17SJohan Hedberg 
459249c922bbSStephen Hemminger 	/* If an error occurred during request building, there is no point in
459334739c1eSAndre Guedes 	 * queueing the HCI command. We can simply return.
459434739c1eSAndre Guedes 	 */
459534739c1eSAndre Guedes 	if (req->err)
459634739c1eSAndre Guedes 		return;
459734739c1eSAndre Guedes 
459871c76a17SJohan Hedberg 	skb = hci_prepare_cmd(hdev, opcode, plen, param);
459971c76a17SJohan Hedberg 	if (!skb) {
46005d73e034SAndre Guedes 		BT_ERR("%s no memory for command (opcode 0x%4.4x)",
46015d73e034SAndre Guedes 		       hdev->name, opcode);
46025d73e034SAndre Guedes 		req->err = -ENOMEM;
4603e348fe6bSAndre Guedes 		return;
460471c76a17SJohan Hedberg 	}
460571c76a17SJohan Hedberg 
460671c76a17SJohan Hedberg 	if (skb_queue_empty(&req->cmd_q))
460771c76a17SJohan Hedberg 		bt_cb(skb)->req.start = true;
460871c76a17SJohan Hedberg 
460902350a72SJohan Hedberg 	bt_cb(skb)->req.event = event;
461002350a72SJohan Hedberg 
461171c76a17SJohan Hedberg 	skb_queue_tail(&req->cmd_q, skb);
461271c76a17SJohan Hedberg }
461371c76a17SJohan Hedberg 
461407dc93ddSJohan Hedberg void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
461507dc93ddSJohan Hedberg 		 const void *param)
461602350a72SJohan Hedberg {
461702350a72SJohan Hedberg 	hci_req_add_ev(req, opcode, plen, param, 0);
461802350a72SJohan Hedberg }
461902350a72SJohan Hedberg 
46201da177e4SLinus Torvalds /* Get data from the previously sent command */
4621a9de9248SMarcel Holtmann void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
46221da177e4SLinus Torvalds {
46231da177e4SLinus Torvalds 	struct hci_command_hdr *hdr;
46241da177e4SLinus Torvalds 
46251da177e4SLinus Torvalds 	if (!hdev->sent_cmd)
46261da177e4SLinus Torvalds 		return NULL;
46271da177e4SLinus Torvalds 
46281da177e4SLinus Torvalds 	hdr = (void *) hdev->sent_cmd->data;
46291da177e4SLinus Torvalds 
4630a9de9248SMarcel Holtmann 	if (hdr->opcode != cpu_to_le16(opcode))
46311da177e4SLinus Torvalds 		return NULL;
46321da177e4SLinus Torvalds 
4633f0e09510SAndrei Emeltchenko 	BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
46341da177e4SLinus Torvalds 
46351da177e4SLinus Torvalds 	return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
46361da177e4SLinus Torvalds }
46371da177e4SLinus Torvalds 
46381da177e4SLinus Torvalds /* Send ACL data */
46391da177e4SLinus Torvalds static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
46401da177e4SLinus Torvalds {
46411da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr;
46421da177e4SLinus Torvalds 	int len = skb->len;
46431da177e4SLinus Torvalds 
4644badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_ACL_HDR_SIZE);
4645badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
46469c70220bSArnaldo Carvalho de Melo 	hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
4647aca3192cSYOSHIFUJI Hideaki 	hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
4648aca3192cSYOSHIFUJI Hideaki 	hdr->dlen   = cpu_to_le16(len);
46491da177e4SLinus Torvalds }
46501da177e4SLinus Torvalds 
4651ee22be7eSAndrei Emeltchenko static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
465273d80debSLuiz Augusto von Dentz 			  struct sk_buff *skb, __u16 flags)
46531da177e4SLinus Torvalds {
4654ee22be7eSAndrei Emeltchenko 	struct hci_conn *conn = chan->conn;
46551da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
46561da177e4SLinus Torvalds 	struct sk_buff *list;
46571da177e4SLinus Torvalds 
4658087bfd99SGustavo Padovan 	skb->len = skb_headlen(skb);
4659087bfd99SGustavo Padovan 	skb->data_len = 0;
4660087bfd99SGustavo Padovan 
4661087bfd99SGustavo Padovan 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
4662204a6e54SAndrei Emeltchenko 
4663204a6e54SAndrei Emeltchenko 	switch (hdev->dev_type) {
4664204a6e54SAndrei Emeltchenko 	case HCI_BREDR:
4665087bfd99SGustavo Padovan 		hci_add_acl_hdr(skb, conn->handle, flags);
4666204a6e54SAndrei Emeltchenko 		break;
4667204a6e54SAndrei Emeltchenko 	case HCI_AMP:
4668204a6e54SAndrei Emeltchenko 		hci_add_acl_hdr(skb, chan->handle, flags);
4669204a6e54SAndrei Emeltchenko 		break;
4670204a6e54SAndrei Emeltchenko 	default:
4671204a6e54SAndrei Emeltchenko 		BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
4672204a6e54SAndrei Emeltchenko 		return;
4673204a6e54SAndrei Emeltchenko 	}
4674087bfd99SGustavo Padovan 
467570f23020SAndrei Emeltchenko 	list = skb_shinfo(skb)->frag_list;
467670f23020SAndrei Emeltchenko 	if (!list) {
46771da177e4SLinus Torvalds 		/* Non fragmented */
46781da177e4SLinus Torvalds 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
46791da177e4SLinus Torvalds 
468073d80debSLuiz Augusto von Dentz 		skb_queue_tail(queue, skb);
46811da177e4SLinus Torvalds 	} else {
46821da177e4SLinus Torvalds 		/* Fragmented */
46831da177e4SLinus Torvalds 		BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
46841da177e4SLinus Torvalds 
46851da177e4SLinus Torvalds 		skb_shinfo(skb)->frag_list = NULL;
46861da177e4SLinus Torvalds 
46879cfd5a23SJukka Rissanen 		/* Queue all fragments atomically. We need to use spin_lock_bh
46889cfd5a23SJukka Rissanen 		 * here because of 6LoWPAN links, as there this function is
46899cfd5a23SJukka Rissanen 		 * called from softirq and using normal spin lock could cause
46909cfd5a23SJukka Rissanen 		 * deadlocks.
46919cfd5a23SJukka Rissanen 		 */
46929cfd5a23SJukka Rissanen 		spin_lock_bh(&queue->lock);
46931da177e4SLinus Torvalds 
469473d80debSLuiz Augusto von Dentz 		__skb_queue_tail(queue, skb);
4695e702112fSAndrei Emeltchenko 
4696e702112fSAndrei Emeltchenko 		flags &= ~ACL_START;
4697e702112fSAndrei Emeltchenko 		flags |= ACL_CONT;
46981da177e4SLinus Torvalds 		do {
46991da177e4SLinus Torvalds 			skb = list; list = list->next;
47001da177e4SLinus Torvalds 
47010d48d939SMarcel Holtmann 			bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
4702e702112fSAndrei Emeltchenko 			hci_add_acl_hdr(skb, conn->handle, flags);
47031da177e4SLinus Torvalds 
47041da177e4SLinus Torvalds 			BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
47051da177e4SLinus Torvalds 
470673d80debSLuiz Augusto von Dentz 			__skb_queue_tail(queue, skb);
47071da177e4SLinus Torvalds 		} while (list);
47081da177e4SLinus Torvalds 
47099cfd5a23SJukka Rissanen 		spin_unlock_bh(&queue->lock);
47101da177e4SLinus Torvalds 	}
471173d80debSLuiz Augusto von Dentz }
471273d80debSLuiz Augusto von Dentz 
471373d80debSLuiz Augusto von Dentz void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
471473d80debSLuiz Augusto von Dentz {
4715ee22be7eSAndrei Emeltchenko 	struct hci_dev *hdev = chan->conn->hdev;
471673d80debSLuiz Augusto von Dentz 
4717f0e09510SAndrei Emeltchenko 	BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
471873d80debSLuiz Augusto von Dentz 
4719ee22be7eSAndrei Emeltchenko 	hci_queue_acl(chan, &chan->data_q, skb, flags);
47201da177e4SLinus Torvalds 
47213eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
47221da177e4SLinus Torvalds }
47231da177e4SLinus Torvalds 
47241da177e4SLinus Torvalds /* Send SCO data */
47250d861d8bSGustavo F. Padovan void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
47261da177e4SLinus Torvalds {
47271da177e4SLinus Torvalds 	struct hci_dev *hdev = conn->hdev;
47281da177e4SLinus Torvalds 	struct hci_sco_hdr hdr;
47291da177e4SLinus Torvalds 
47301da177e4SLinus Torvalds 	BT_DBG("%s len %d", hdev->name, skb->len);
47311da177e4SLinus Torvalds 
4732aca3192cSYOSHIFUJI Hideaki 	hdr.handle = cpu_to_le16(conn->handle);
47331da177e4SLinus Torvalds 	hdr.dlen   = skb->len;
47341da177e4SLinus Torvalds 
4735badff6d0SArnaldo Carvalho de Melo 	skb_push(skb, HCI_SCO_HDR_SIZE);
4736badff6d0SArnaldo Carvalho de Melo 	skb_reset_transport_header(skb);
47379c70220bSArnaldo Carvalho de Melo 	memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
47381da177e4SLinus Torvalds 
47390d48d939SMarcel Holtmann 	bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
4740c78ae283SMarcel Holtmann 
47411da177e4SLinus Torvalds 	skb_queue_tail(&conn->data_q, skb);
47423eff45eaSGustavo F. Padovan 	queue_work(hdev->workqueue, &hdev->tx_work);
47431da177e4SLinus Torvalds }
47441da177e4SLinus Torvalds 
47451da177e4SLinus Torvalds /* ---- HCI TX task (outgoing data) ---- */
47461da177e4SLinus Torvalds 
47471da177e4SLinus Torvalds /* HCI Connection scheduler */
47486039aa73SGustavo Padovan static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
4749a8c5fb1aSGustavo Padovan 				     int *quote)
47501da177e4SLinus Torvalds {
47511da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
47528035ded4SLuiz Augusto von Dentz 	struct hci_conn *conn = NULL, *c;
4753abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0;
47541da177e4SLinus Torvalds 
47551da177e4SLinus Torvalds 	/* We don't have to lock device here. Connections are always
47561da177e4SLinus Torvalds 	 * added and removed with TX task disabled. */
4757bf4c6325SGustavo F. Padovan 
4758bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4759bf4c6325SGustavo F. Padovan 
4760bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4761769be974SMarcel Holtmann 		if (c->type != type || skb_queue_empty(&c->data_q))
47621da177e4SLinus Torvalds 			continue;
4763769be974SMarcel Holtmann 
4764769be974SMarcel Holtmann 		if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
4765769be974SMarcel Holtmann 			continue;
4766769be974SMarcel Holtmann 
47671da177e4SLinus Torvalds 		num++;
47681da177e4SLinus Torvalds 
47691da177e4SLinus Torvalds 		if (c->sent < min) {
47701da177e4SLinus Torvalds 			min  = c->sent;
47711da177e4SLinus Torvalds 			conn = c;
47721da177e4SLinus Torvalds 		}
477352087a79SLuiz Augusto von Dentz 
477452087a79SLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
477552087a79SLuiz Augusto von Dentz 			break;
47761da177e4SLinus Torvalds 	}
47771da177e4SLinus Torvalds 
4778bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4779bf4c6325SGustavo F. Padovan 
47801da177e4SLinus Torvalds 	if (conn) {
47816ed58ec5SVille Tervo 		int cnt, q;
47826ed58ec5SVille Tervo 
47836ed58ec5SVille Tervo 		switch (conn->type) {
47846ed58ec5SVille Tervo 		case ACL_LINK:
47856ed58ec5SVille Tervo 			cnt = hdev->acl_cnt;
47866ed58ec5SVille Tervo 			break;
47876ed58ec5SVille Tervo 		case SCO_LINK:
47886ed58ec5SVille Tervo 		case ESCO_LINK:
47896ed58ec5SVille Tervo 			cnt = hdev->sco_cnt;
47906ed58ec5SVille Tervo 			break;
47916ed58ec5SVille Tervo 		case LE_LINK:
47926ed58ec5SVille Tervo 			cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
47936ed58ec5SVille Tervo 			break;
47946ed58ec5SVille Tervo 		default:
47956ed58ec5SVille Tervo 			cnt = 0;
47966ed58ec5SVille Tervo 			BT_ERR("Unknown link type");
47976ed58ec5SVille Tervo 		}
47986ed58ec5SVille Tervo 
47996ed58ec5SVille Tervo 		q = cnt / num;
48001da177e4SLinus Torvalds 		*quote = q ? q : 1;
48011da177e4SLinus Torvalds 	} else
48021da177e4SLinus Torvalds 		*quote = 0;
48031da177e4SLinus Torvalds 
48041da177e4SLinus Torvalds 	BT_DBG("conn %p quote %d", conn, *quote);
48051da177e4SLinus Torvalds 	return conn;
48061da177e4SLinus Torvalds }
48071da177e4SLinus Torvalds 
48086039aa73SGustavo Padovan static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
48091da177e4SLinus Torvalds {
48101da177e4SLinus Torvalds 	struct hci_conn_hash *h = &hdev->conn_hash;
48111da177e4SLinus Torvalds 	struct hci_conn *c;
48121da177e4SLinus Torvalds 
4813bae1f5d9SVille Tervo 	BT_ERR("%s link tx timeout", hdev->name);
48141da177e4SLinus Torvalds 
4815bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4816bf4c6325SGustavo F. Padovan 
48171da177e4SLinus Torvalds 	/* Kill stalled connections */
4818bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(c, &h->list, list) {
4819bae1f5d9SVille Tervo 		if (c->type == type && c->sent) {
48206ed93dc6SAndrei Emeltchenko 			BT_ERR("%s killing stalled connection %pMR",
48216ed93dc6SAndrei Emeltchenko 			       hdev->name, &c->dst);
4822bed71748SAndre Guedes 			hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
48231da177e4SLinus Torvalds 		}
48241da177e4SLinus Torvalds 	}
4825bf4c6325SGustavo F. Padovan 
4826bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
48271da177e4SLinus Torvalds }
48281da177e4SLinus Torvalds 
48296039aa73SGustavo Padovan static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
483073d80debSLuiz Augusto von Dentz 				      int *quote)
483173d80debSLuiz Augusto von Dentz {
483273d80debSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
483373d80debSLuiz Augusto von Dentz 	struct hci_chan *chan = NULL;
4834abc5de8fSMikel Astiz 	unsigned int num = 0, min = ~0, cur_prio = 0;
483573d80debSLuiz Augusto von Dentz 	struct hci_conn *conn;
483673d80debSLuiz Augusto von Dentz 	int cnt, q, conn_num = 0;
483773d80debSLuiz Augusto von Dentz 
483873d80debSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
483973d80debSLuiz Augusto von Dentz 
4840bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4841bf4c6325SGustavo F. Padovan 
4842bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
484373d80debSLuiz Augusto von Dentz 		struct hci_chan *tmp;
484473d80debSLuiz Augusto von Dentz 
484573d80debSLuiz Augusto von Dentz 		if (conn->type != type)
484673d80debSLuiz Augusto von Dentz 			continue;
484773d80debSLuiz Augusto von Dentz 
484873d80debSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
484973d80debSLuiz Augusto von Dentz 			continue;
485073d80debSLuiz Augusto von Dentz 
485173d80debSLuiz Augusto von Dentz 		conn_num++;
485273d80debSLuiz Augusto von Dentz 
48538192edefSGustavo F. Padovan 		list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
485473d80debSLuiz Augusto von Dentz 			struct sk_buff *skb;
485573d80debSLuiz Augusto von Dentz 
485673d80debSLuiz Augusto von Dentz 			if (skb_queue_empty(&tmp->data_q))
485773d80debSLuiz Augusto von Dentz 				continue;
485873d80debSLuiz Augusto von Dentz 
485973d80debSLuiz Augusto von Dentz 			skb = skb_peek(&tmp->data_q);
486073d80debSLuiz Augusto von Dentz 			if (skb->priority < cur_prio)
486173d80debSLuiz Augusto von Dentz 				continue;
486273d80debSLuiz Augusto von Dentz 
486373d80debSLuiz Augusto von Dentz 			if (skb->priority > cur_prio) {
486473d80debSLuiz Augusto von Dentz 				num = 0;
486573d80debSLuiz Augusto von Dentz 				min = ~0;
486673d80debSLuiz Augusto von Dentz 				cur_prio = skb->priority;
486773d80debSLuiz Augusto von Dentz 			}
486873d80debSLuiz Augusto von Dentz 
486973d80debSLuiz Augusto von Dentz 			num++;
487073d80debSLuiz Augusto von Dentz 
487173d80debSLuiz Augusto von Dentz 			if (conn->sent < min) {
487273d80debSLuiz Augusto von Dentz 				min  = conn->sent;
487373d80debSLuiz Augusto von Dentz 				chan = tmp;
487473d80debSLuiz Augusto von Dentz 			}
487573d80debSLuiz Augusto von Dentz 		}
487673d80debSLuiz Augusto von Dentz 
487773d80debSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == conn_num)
487873d80debSLuiz Augusto von Dentz 			break;
487973d80debSLuiz Augusto von Dentz 	}
488073d80debSLuiz Augusto von Dentz 
4881bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4882bf4c6325SGustavo F. Padovan 
488373d80debSLuiz Augusto von Dentz 	if (!chan)
488473d80debSLuiz Augusto von Dentz 		return NULL;
488573d80debSLuiz Augusto von Dentz 
488673d80debSLuiz Augusto von Dentz 	switch (chan->conn->type) {
488773d80debSLuiz Augusto von Dentz 	case ACL_LINK:
488873d80debSLuiz Augusto von Dentz 		cnt = hdev->acl_cnt;
488973d80debSLuiz Augusto von Dentz 		break;
4890bd1eb66bSAndrei Emeltchenko 	case AMP_LINK:
4891bd1eb66bSAndrei Emeltchenko 		cnt = hdev->block_cnt;
4892bd1eb66bSAndrei Emeltchenko 		break;
489373d80debSLuiz Augusto von Dentz 	case SCO_LINK:
489473d80debSLuiz Augusto von Dentz 	case ESCO_LINK:
489573d80debSLuiz Augusto von Dentz 		cnt = hdev->sco_cnt;
489673d80debSLuiz Augusto von Dentz 		break;
489773d80debSLuiz Augusto von Dentz 	case LE_LINK:
489873d80debSLuiz Augusto von Dentz 		cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
489973d80debSLuiz Augusto von Dentz 		break;
490073d80debSLuiz Augusto von Dentz 	default:
490173d80debSLuiz Augusto von Dentz 		cnt = 0;
490273d80debSLuiz Augusto von Dentz 		BT_ERR("Unknown link type");
490373d80debSLuiz Augusto von Dentz 	}
490473d80debSLuiz Augusto von Dentz 
490573d80debSLuiz Augusto von Dentz 	q = cnt / num;
490673d80debSLuiz Augusto von Dentz 	*quote = q ? q : 1;
490773d80debSLuiz Augusto von Dentz 	BT_DBG("chan %p quote %d", chan, *quote);
490873d80debSLuiz Augusto von Dentz 	return chan;
490973d80debSLuiz Augusto von Dentz }
491073d80debSLuiz Augusto von Dentz 
491102b20f0bSLuiz Augusto von Dentz static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
491202b20f0bSLuiz Augusto von Dentz {
491302b20f0bSLuiz Augusto von Dentz 	struct hci_conn_hash *h = &hdev->conn_hash;
491402b20f0bSLuiz Augusto von Dentz 	struct hci_conn *conn;
491502b20f0bSLuiz Augusto von Dentz 	int num = 0;
491602b20f0bSLuiz Augusto von Dentz 
491702b20f0bSLuiz Augusto von Dentz 	BT_DBG("%s", hdev->name);
491802b20f0bSLuiz Augusto von Dentz 
4919bf4c6325SGustavo F. Padovan 	rcu_read_lock();
4920bf4c6325SGustavo F. Padovan 
4921bf4c6325SGustavo F. Padovan 	list_for_each_entry_rcu(conn, &h->list, list) {
492202b20f0bSLuiz Augusto von Dentz 		struct hci_chan *chan;
492302b20f0bSLuiz Augusto von Dentz 
492402b20f0bSLuiz Augusto von Dentz 		if (conn->type != type)
492502b20f0bSLuiz Augusto von Dentz 			continue;
492602b20f0bSLuiz Augusto von Dentz 
492702b20f0bSLuiz Augusto von Dentz 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
492802b20f0bSLuiz Augusto von Dentz 			continue;
492902b20f0bSLuiz Augusto von Dentz 
493002b20f0bSLuiz Augusto von Dentz 		num++;
493102b20f0bSLuiz Augusto von Dentz 
49328192edefSGustavo F. Padovan 		list_for_each_entry_rcu(chan, &conn->chan_list, list) {
493302b20f0bSLuiz Augusto von Dentz 			struct sk_buff *skb;
493402b20f0bSLuiz Augusto von Dentz 
493502b20f0bSLuiz Augusto von Dentz 			if (chan->sent) {
493602b20f0bSLuiz Augusto von Dentz 				chan->sent = 0;
493702b20f0bSLuiz Augusto von Dentz 				continue;
493802b20f0bSLuiz Augusto von Dentz 			}
493902b20f0bSLuiz Augusto von Dentz 
494002b20f0bSLuiz Augusto von Dentz 			if (skb_queue_empty(&chan->data_q))
494102b20f0bSLuiz Augusto von Dentz 				continue;
494202b20f0bSLuiz Augusto von Dentz 
494302b20f0bSLuiz Augusto von Dentz 			skb = skb_peek(&chan->data_q);
494402b20f0bSLuiz Augusto von Dentz 			if (skb->priority >= HCI_PRIO_MAX - 1)
494502b20f0bSLuiz Augusto von Dentz 				continue;
494602b20f0bSLuiz Augusto von Dentz 
494702b20f0bSLuiz Augusto von Dentz 			skb->priority = HCI_PRIO_MAX - 1;
494802b20f0bSLuiz Augusto von Dentz 
494902b20f0bSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p promoted to %d", chan, skb,
495002b20f0bSLuiz Augusto von Dentz 			       skb->priority);
495102b20f0bSLuiz Augusto von Dentz 		}
495202b20f0bSLuiz Augusto von Dentz 
495302b20f0bSLuiz Augusto von Dentz 		if (hci_conn_num(hdev, type) == num)
495402b20f0bSLuiz Augusto von Dentz 			break;
495502b20f0bSLuiz Augusto von Dentz 	}
4956bf4c6325SGustavo F. Padovan 
4957bf4c6325SGustavo F. Padovan 	rcu_read_unlock();
4958bf4c6325SGustavo F. Padovan 
495902b20f0bSLuiz Augusto von Dentz }
496002b20f0bSLuiz Augusto von Dentz 
4961b71d385aSAndrei Emeltchenko static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
4962b71d385aSAndrei Emeltchenko {
4963b71d385aSAndrei Emeltchenko 	/* Calculate count of blocks used by this packet */
4964b71d385aSAndrei Emeltchenko 	return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
4965b71d385aSAndrei Emeltchenko }
4966b71d385aSAndrei Emeltchenko 
49676039aa73SGustavo Padovan static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
49681da177e4SLinus Torvalds {
49694a964404SMarcel Holtmann 	if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
49701da177e4SLinus Torvalds 		/* ACL tx timeout must be longer than maximum
49711da177e4SLinus Torvalds 		 * link supervision timeout (40.9 seconds) */
497263d2bc1bSAndrei Emeltchenko 		if (!cnt && time_after(jiffies, hdev->acl_last_tx +
49735f246e89SAndrei Emeltchenko 				       HCI_ACL_TX_TIMEOUT))
4974bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, ACL_LINK);
49751da177e4SLinus Torvalds 	}
497663d2bc1bSAndrei Emeltchenko }
49771da177e4SLinus Torvalds 
49786039aa73SGustavo Padovan static void hci_sched_acl_pkt(struct hci_dev *hdev)
497963d2bc1bSAndrei Emeltchenko {
498063d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->acl_cnt;
498163d2bc1bSAndrei Emeltchenko 	struct hci_chan *chan;
498263d2bc1bSAndrei Emeltchenko 	struct sk_buff *skb;
498363d2bc1bSAndrei Emeltchenko 	int quote;
498463d2bc1bSAndrei Emeltchenko 
498563d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
498604837f64SMarcel Holtmann 
498773d80debSLuiz Augusto von Dentz 	while (hdev->acl_cnt &&
498873d80debSLuiz Augusto von Dentz 	       (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
4989ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
4990ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
499173d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
499273d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
499373d80debSLuiz Augusto von Dentz 
4994ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
4995ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
4996ec1cce24SLuiz Augusto von Dentz 				break;
4997ec1cce24SLuiz Augusto von Dentz 
4998ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
4999ec1cce24SLuiz Augusto von Dentz 
500073d80debSLuiz Augusto von Dentz 			hci_conn_enter_active_mode(chan->conn,
500173d80debSLuiz Augusto von Dentz 						   bt_cb(skb)->force_active);
500204837f64SMarcel Holtmann 
500357d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
50041da177e4SLinus Torvalds 			hdev->acl_last_tx = jiffies;
50051da177e4SLinus Torvalds 
50061da177e4SLinus Torvalds 			hdev->acl_cnt--;
500773d80debSLuiz Augusto von Dentz 			chan->sent++;
500873d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
50091da177e4SLinus Torvalds 		}
50101da177e4SLinus Torvalds 	}
501102b20f0bSLuiz Augusto von Dentz 
501202b20f0bSLuiz Augusto von Dentz 	if (cnt != hdev->acl_cnt)
501302b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, ACL_LINK);
50141da177e4SLinus Torvalds }
50151da177e4SLinus Torvalds 
50166039aa73SGustavo Padovan static void hci_sched_acl_blk(struct hci_dev *hdev)
5017b71d385aSAndrei Emeltchenko {
501863d2bc1bSAndrei Emeltchenko 	unsigned int cnt = hdev->block_cnt;
5019b71d385aSAndrei Emeltchenko 	struct hci_chan *chan;
5020b71d385aSAndrei Emeltchenko 	struct sk_buff *skb;
5021b71d385aSAndrei Emeltchenko 	int quote;
5022bd1eb66bSAndrei Emeltchenko 	u8 type;
5023b71d385aSAndrei Emeltchenko 
502463d2bc1bSAndrei Emeltchenko 	__check_timeout(hdev, cnt);
5025b71d385aSAndrei Emeltchenko 
5026bd1eb66bSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
5027bd1eb66bSAndrei Emeltchenko 
5028bd1eb66bSAndrei Emeltchenko 	if (hdev->dev_type == HCI_AMP)
5029bd1eb66bSAndrei Emeltchenko 		type = AMP_LINK;
5030bd1eb66bSAndrei Emeltchenko 	else
5031bd1eb66bSAndrei Emeltchenko 		type = ACL_LINK;
5032bd1eb66bSAndrei Emeltchenko 
5033b71d385aSAndrei Emeltchenko 	while (hdev->block_cnt > 0 &&
5034bd1eb66bSAndrei Emeltchenko 	       (chan = hci_chan_sent(hdev, type, &quote))) {
5035b71d385aSAndrei Emeltchenko 		u32 priority = (skb_peek(&chan->data_q))->priority;
5036b71d385aSAndrei Emeltchenko 		while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
5037b71d385aSAndrei Emeltchenko 			int blocks;
5038b71d385aSAndrei Emeltchenko 
5039b71d385aSAndrei Emeltchenko 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
5040b71d385aSAndrei Emeltchenko 			       skb->len, skb->priority);
5041b71d385aSAndrei Emeltchenko 
5042b71d385aSAndrei Emeltchenko 			/* Stop if priority has changed */
5043b71d385aSAndrei Emeltchenko 			if (skb->priority < priority)
5044b71d385aSAndrei Emeltchenko 				break;
5045b71d385aSAndrei Emeltchenko 
5046b71d385aSAndrei Emeltchenko 			skb = skb_dequeue(&chan->data_q);
5047b71d385aSAndrei Emeltchenko 
5048b71d385aSAndrei Emeltchenko 			blocks = __get_blocks(hdev, skb);
5049b71d385aSAndrei Emeltchenko 			if (blocks > hdev->block_cnt)
5050b71d385aSAndrei Emeltchenko 				return;
5051b71d385aSAndrei Emeltchenko 
5052b71d385aSAndrei Emeltchenko 			hci_conn_enter_active_mode(chan->conn,
5053b71d385aSAndrei Emeltchenko 						   bt_cb(skb)->force_active);
5054b71d385aSAndrei Emeltchenko 
505557d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
5056b71d385aSAndrei Emeltchenko 			hdev->acl_last_tx = jiffies;
5057b71d385aSAndrei Emeltchenko 
5058b71d385aSAndrei Emeltchenko 			hdev->block_cnt -= blocks;
5059b71d385aSAndrei Emeltchenko 			quote -= blocks;
5060b71d385aSAndrei Emeltchenko 
5061b71d385aSAndrei Emeltchenko 			chan->sent += blocks;
5062b71d385aSAndrei Emeltchenko 			chan->conn->sent += blocks;
5063b71d385aSAndrei Emeltchenko 		}
5064b71d385aSAndrei Emeltchenko 	}
5065b71d385aSAndrei Emeltchenko 
5066b71d385aSAndrei Emeltchenko 	if (cnt != hdev->block_cnt)
5067bd1eb66bSAndrei Emeltchenko 		hci_prio_recalculate(hdev, type);
5068b71d385aSAndrei Emeltchenko }
5069b71d385aSAndrei Emeltchenko 
50706039aa73SGustavo Padovan static void hci_sched_acl(struct hci_dev *hdev)
5071b71d385aSAndrei Emeltchenko {
5072b71d385aSAndrei Emeltchenko 	BT_DBG("%s", hdev->name);
5073b71d385aSAndrei Emeltchenko 
5074bd1eb66bSAndrei Emeltchenko 	/* No ACL link over BR/EDR controller */
5075bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
5076bd1eb66bSAndrei Emeltchenko 		return;
5077bd1eb66bSAndrei Emeltchenko 
5078bd1eb66bSAndrei Emeltchenko 	/* No AMP link over AMP controller */
5079bd1eb66bSAndrei Emeltchenko 	if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
5080b71d385aSAndrei Emeltchenko 		return;
5081b71d385aSAndrei Emeltchenko 
5082b71d385aSAndrei Emeltchenko 	switch (hdev->flow_ctl_mode) {
5083b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_PACKET_BASED:
5084b71d385aSAndrei Emeltchenko 		hci_sched_acl_pkt(hdev);
5085b71d385aSAndrei Emeltchenko 		break;
5086b71d385aSAndrei Emeltchenko 
5087b71d385aSAndrei Emeltchenko 	case HCI_FLOW_CTL_MODE_BLOCK_BASED:
5088b71d385aSAndrei Emeltchenko 		hci_sched_acl_blk(hdev);
5089b71d385aSAndrei Emeltchenko 		break;
5090b71d385aSAndrei Emeltchenko 	}
5091b71d385aSAndrei Emeltchenko }
5092b71d385aSAndrei Emeltchenko 
50931da177e4SLinus Torvalds /* Schedule SCO */
50946039aa73SGustavo Padovan static void hci_sched_sco(struct hci_dev *hdev)
50951da177e4SLinus Torvalds {
50961da177e4SLinus Torvalds 	struct hci_conn *conn;
50971da177e4SLinus Torvalds 	struct sk_buff *skb;
50981da177e4SLinus Torvalds 	int quote;
50991da177e4SLinus Torvalds 
51001da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
51011da177e4SLinus Torvalds 
510252087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, SCO_LINK))
510352087a79SLuiz Augusto von Dentz 		return;
510452087a79SLuiz Augusto von Dentz 
51051da177e4SLinus Torvalds 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
51061da177e4SLinus Torvalds 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
51071da177e4SLinus Torvalds 			BT_DBG("skb %p len %d", skb, skb->len);
510857d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
51091da177e4SLinus Torvalds 
51101da177e4SLinus Torvalds 			conn->sent++;
51111da177e4SLinus Torvalds 			if (conn->sent == ~0)
51121da177e4SLinus Torvalds 				conn->sent = 0;
51131da177e4SLinus Torvalds 		}
51141da177e4SLinus Torvalds 	}
51151da177e4SLinus Torvalds }
51161da177e4SLinus Torvalds 
51176039aa73SGustavo Padovan static void hci_sched_esco(struct hci_dev *hdev)
5118b6a0dc82SMarcel Holtmann {
5119b6a0dc82SMarcel Holtmann 	struct hci_conn *conn;
5120b6a0dc82SMarcel Holtmann 	struct sk_buff *skb;
5121b6a0dc82SMarcel Holtmann 	int quote;
5122b6a0dc82SMarcel Holtmann 
5123b6a0dc82SMarcel Holtmann 	BT_DBG("%s", hdev->name);
5124b6a0dc82SMarcel Holtmann 
512552087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, ESCO_LINK))
512652087a79SLuiz Augusto von Dentz 		return;
512752087a79SLuiz Augusto von Dentz 
51288fc9ced3SGustavo Padovan 	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
51298fc9ced3SGustavo Padovan 						     &quote))) {
5130b6a0dc82SMarcel Holtmann 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
5131b6a0dc82SMarcel Holtmann 			BT_DBG("skb %p len %d", skb, skb->len);
513257d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
5133b6a0dc82SMarcel Holtmann 
5134b6a0dc82SMarcel Holtmann 			conn->sent++;
5135b6a0dc82SMarcel Holtmann 			if (conn->sent == ~0)
5136b6a0dc82SMarcel Holtmann 				conn->sent = 0;
5137b6a0dc82SMarcel Holtmann 		}
5138b6a0dc82SMarcel Holtmann 	}
5139b6a0dc82SMarcel Holtmann }
5140b6a0dc82SMarcel Holtmann 
51416039aa73SGustavo Padovan static void hci_sched_le(struct hci_dev *hdev)
51426ed58ec5SVille Tervo {
514373d80debSLuiz Augusto von Dentz 	struct hci_chan *chan;
51446ed58ec5SVille Tervo 	struct sk_buff *skb;
514502b20f0bSLuiz Augusto von Dentz 	int quote, cnt, tmp;
51466ed58ec5SVille Tervo 
51476ed58ec5SVille Tervo 	BT_DBG("%s", hdev->name);
51486ed58ec5SVille Tervo 
514952087a79SLuiz Augusto von Dentz 	if (!hci_conn_num(hdev, LE_LINK))
515052087a79SLuiz Augusto von Dentz 		return;
515152087a79SLuiz Augusto von Dentz 
51524a964404SMarcel Holtmann 	if (!test_bit(HCI_UNCONFIGURED, &hdev->dev_flags)) {
51536ed58ec5SVille Tervo 		/* LE tx timeout must be longer than maximum
51546ed58ec5SVille Tervo 		 * link supervision timeout (40.9 seconds) */
5155bae1f5d9SVille Tervo 		if (!hdev->le_cnt && hdev->le_pkts &&
51566ed58ec5SVille Tervo 		    time_after(jiffies, hdev->le_last_tx + HZ * 45))
5157bae1f5d9SVille Tervo 			hci_link_tx_to(hdev, LE_LINK);
51586ed58ec5SVille Tervo 	}
51596ed58ec5SVille Tervo 
51606ed58ec5SVille Tervo 	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
516102b20f0bSLuiz Augusto von Dentz 	tmp = cnt;
516273d80debSLuiz Augusto von Dentz 	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
5163ec1cce24SLuiz Augusto von Dentz 		u32 priority = (skb_peek(&chan->data_q))->priority;
5164ec1cce24SLuiz Augusto von Dentz 		while (quote-- && (skb = skb_peek(&chan->data_q))) {
516573d80debSLuiz Augusto von Dentz 			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
516673d80debSLuiz Augusto von Dentz 			       skb->len, skb->priority);
51676ed58ec5SVille Tervo 
5168ec1cce24SLuiz Augusto von Dentz 			/* Stop if priority has changed */
5169ec1cce24SLuiz Augusto von Dentz 			if (skb->priority < priority)
5170ec1cce24SLuiz Augusto von Dentz 				break;
5171ec1cce24SLuiz Augusto von Dentz 
5172ec1cce24SLuiz Augusto von Dentz 			skb = skb_dequeue(&chan->data_q);
5173ec1cce24SLuiz Augusto von Dentz 
517457d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
51756ed58ec5SVille Tervo 			hdev->le_last_tx = jiffies;
51766ed58ec5SVille Tervo 
51776ed58ec5SVille Tervo 			cnt--;
517873d80debSLuiz Augusto von Dentz 			chan->sent++;
517973d80debSLuiz Augusto von Dentz 			chan->conn->sent++;
51806ed58ec5SVille Tervo 		}
51816ed58ec5SVille Tervo 	}
518273d80debSLuiz Augusto von Dentz 
51836ed58ec5SVille Tervo 	if (hdev->le_pkts)
51846ed58ec5SVille Tervo 		hdev->le_cnt = cnt;
51856ed58ec5SVille Tervo 	else
51866ed58ec5SVille Tervo 		hdev->acl_cnt = cnt;
518702b20f0bSLuiz Augusto von Dentz 
518802b20f0bSLuiz Augusto von Dentz 	if (cnt != tmp)
518902b20f0bSLuiz Augusto von Dentz 		hci_prio_recalculate(hdev, LE_LINK);
51906ed58ec5SVille Tervo }
51916ed58ec5SVille Tervo 
51923eff45eaSGustavo F. Padovan static void hci_tx_work(struct work_struct *work)
51931da177e4SLinus Torvalds {
51943eff45eaSGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
51951da177e4SLinus Torvalds 	struct sk_buff *skb;
51961da177e4SLinus Torvalds 
51976ed58ec5SVille Tervo 	BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
51986ed58ec5SVille Tervo 	       hdev->sco_cnt, hdev->le_cnt);
51991da177e4SLinus Torvalds 
520052de599eSMarcel Holtmann 	if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
52011da177e4SLinus Torvalds 		/* Schedule queues and send stuff to HCI driver */
52021da177e4SLinus Torvalds 		hci_sched_acl(hdev);
52031da177e4SLinus Torvalds 		hci_sched_sco(hdev);
5204b6a0dc82SMarcel Holtmann 		hci_sched_esco(hdev);
52056ed58ec5SVille Tervo 		hci_sched_le(hdev);
520652de599eSMarcel Holtmann 	}
52076ed58ec5SVille Tervo 
52081da177e4SLinus Torvalds 	/* Send next queued raw (unknown type) packet */
52091da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->raw_q)))
521057d17d70SMarcel Holtmann 		hci_send_frame(hdev, skb);
52111da177e4SLinus Torvalds }
52121da177e4SLinus Torvalds 
521325985edcSLucas De Marchi /* ----- HCI RX task (incoming data processing) ----- */
52141da177e4SLinus Torvalds 
52151da177e4SLinus Torvalds /* ACL data packet */
52166039aa73SGustavo Padovan static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
52171da177e4SLinus Torvalds {
52181da177e4SLinus Torvalds 	struct hci_acl_hdr *hdr = (void *) skb->data;
52191da177e4SLinus Torvalds 	struct hci_conn *conn;
52201da177e4SLinus Torvalds 	__u16 handle, flags;
52211da177e4SLinus Torvalds 
52221da177e4SLinus Torvalds 	skb_pull(skb, HCI_ACL_HDR_SIZE);
52231da177e4SLinus Torvalds 
52241da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
52251da177e4SLinus Torvalds 	flags  = hci_flags(handle);
52261da177e4SLinus Torvalds 	handle = hci_handle(handle);
52271da177e4SLinus Torvalds 
5228f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
5229a8c5fb1aSGustavo Padovan 	       handle, flags);
52301da177e4SLinus Torvalds 
52311da177e4SLinus Torvalds 	hdev->stat.acl_rx++;
52321da177e4SLinus Torvalds 
52331da177e4SLinus Torvalds 	hci_dev_lock(hdev);
52341da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
52351da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
52361da177e4SLinus Torvalds 
52371da177e4SLinus Torvalds 	if (conn) {
523865983fc7SMat Martineau 		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
523904837f64SMarcel Holtmann 
52401da177e4SLinus Torvalds 		/* Send to upper protocol */
5241686ebf28SUlisses Furquim 		l2cap_recv_acldata(conn, skb, flags);
52421da177e4SLinus Torvalds 		return;
52431da177e4SLinus Torvalds 	} else {
52441da177e4SLinus Torvalds 		BT_ERR("%s ACL packet for unknown connection handle %d",
52451da177e4SLinus Torvalds 		       hdev->name, handle);
52461da177e4SLinus Torvalds 	}
52471da177e4SLinus Torvalds 
52481da177e4SLinus Torvalds 	kfree_skb(skb);
52491da177e4SLinus Torvalds }
52501da177e4SLinus Torvalds 
52511da177e4SLinus Torvalds /* SCO data packet */
52526039aa73SGustavo Padovan static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
52531da177e4SLinus Torvalds {
52541da177e4SLinus Torvalds 	struct hci_sco_hdr *hdr = (void *) skb->data;
52551da177e4SLinus Torvalds 	struct hci_conn *conn;
52561da177e4SLinus Torvalds 	__u16 handle;
52571da177e4SLinus Torvalds 
52581da177e4SLinus Torvalds 	skb_pull(skb, HCI_SCO_HDR_SIZE);
52591da177e4SLinus Torvalds 
52601da177e4SLinus Torvalds 	handle = __le16_to_cpu(hdr->handle);
52611da177e4SLinus Torvalds 
5262f0e09510SAndrei Emeltchenko 	BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
52631da177e4SLinus Torvalds 
52641da177e4SLinus Torvalds 	hdev->stat.sco_rx++;
52651da177e4SLinus Torvalds 
52661da177e4SLinus Torvalds 	hci_dev_lock(hdev);
52671da177e4SLinus Torvalds 	conn = hci_conn_hash_lookup_handle(hdev, handle);
52681da177e4SLinus Torvalds 	hci_dev_unlock(hdev);
52691da177e4SLinus Torvalds 
52701da177e4SLinus Torvalds 	if (conn) {
52711da177e4SLinus Torvalds 		/* Send to upper protocol */
5272686ebf28SUlisses Furquim 		sco_recv_scodata(conn, skb);
52731da177e4SLinus Torvalds 		return;
52741da177e4SLinus Torvalds 	} else {
52751da177e4SLinus Torvalds 		BT_ERR("%s SCO packet for unknown connection handle %d",
52761da177e4SLinus Torvalds 		       hdev->name, handle);
52771da177e4SLinus Torvalds 	}
52781da177e4SLinus Torvalds 
52791da177e4SLinus Torvalds 	kfree_skb(skb);
52801da177e4SLinus Torvalds }
52811da177e4SLinus Torvalds 
52829238f36aSJohan Hedberg static bool hci_req_is_complete(struct hci_dev *hdev)
52839238f36aSJohan Hedberg {
52849238f36aSJohan Hedberg 	struct sk_buff *skb;
52859238f36aSJohan Hedberg 
52869238f36aSJohan Hedberg 	skb = skb_peek(&hdev->cmd_q);
52879238f36aSJohan Hedberg 	if (!skb)
52889238f36aSJohan Hedberg 		return true;
52899238f36aSJohan Hedberg 
52909238f36aSJohan Hedberg 	return bt_cb(skb)->req.start;
52919238f36aSJohan Hedberg }
52929238f36aSJohan Hedberg 
529342c6b129SJohan Hedberg static void hci_resend_last(struct hci_dev *hdev)
529442c6b129SJohan Hedberg {
529542c6b129SJohan Hedberg 	struct hci_command_hdr *sent;
529642c6b129SJohan Hedberg 	struct sk_buff *skb;
529742c6b129SJohan Hedberg 	u16 opcode;
529842c6b129SJohan Hedberg 
529942c6b129SJohan Hedberg 	if (!hdev->sent_cmd)
530042c6b129SJohan Hedberg 		return;
530142c6b129SJohan Hedberg 
530242c6b129SJohan Hedberg 	sent = (void *) hdev->sent_cmd->data;
530342c6b129SJohan Hedberg 	opcode = __le16_to_cpu(sent->opcode);
530442c6b129SJohan Hedberg 	if (opcode == HCI_OP_RESET)
530542c6b129SJohan Hedberg 		return;
530642c6b129SJohan Hedberg 
530742c6b129SJohan Hedberg 	skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
530842c6b129SJohan Hedberg 	if (!skb)
530942c6b129SJohan Hedberg 		return;
531042c6b129SJohan Hedberg 
531142c6b129SJohan Hedberg 	skb_queue_head(&hdev->cmd_q, skb);
531242c6b129SJohan Hedberg 	queue_work(hdev->workqueue, &hdev->cmd_work);
531342c6b129SJohan Hedberg }
531442c6b129SJohan Hedberg 
53159238f36aSJohan Hedberg void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
53169238f36aSJohan Hedberg {
53179238f36aSJohan Hedberg 	hci_req_complete_t req_complete = NULL;
53189238f36aSJohan Hedberg 	struct sk_buff *skb;
53199238f36aSJohan Hedberg 	unsigned long flags;
53209238f36aSJohan Hedberg 
53219238f36aSJohan Hedberg 	BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
53229238f36aSJohan Hedberg 
532342c6b129SJohan Hedberg 	/* If the completed command doesn't match the last one that was
532442c6b129SJohan Hedberg 	 * sent we need to do special handling of it.
53259238f36aSJohan Hedberg 	 */
532642c6b129SJohan Hedberg 	if (!hci_sent_cmd_data(hdev, opcode)) {
532742c6b129SJohan Hedberg 		/* Some CSR based controllers generate a spontaneous
532842c6b129SJohan Hedberg 		 * reset complete event during init and any pending
532942c6b129SJohan Hedberg 		 * command will never be completed. In such a case we
533042c6b129SJohan Hedberg 		 * need to resend whatever was the last sent
533142c6b129SJohan Hedberg 		 * command.
533242c6b129SJohan Hedberg 		 */
533342c6b129SJohan Hedberg 		if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
533442c6b129SJohan Hedberg 			hci_resend_last(hdev);
533542c6b129SJohan Hedberg 
53369238f36aSJohan Hedberg 		return;
533742c6b129SJohan Hedberg 	}
53389238f36aSJohan Hedberg 
53399238f36aSJohan Hedberg 	/* If the command succeeded and there's still more commands in
53409238f36aSJohan Hedberg 	 * this request the request is not yet complete.
53419238f36aSJohan Hedberg 	 */
53429238f36aSJohan Hedberg 	if (!status && !hci_req_is_complete(hdev))
53439238f36aSJohan Hedberg 		return;
53449238f36aSJohan Hedberg 
53459238f36aSJohan Hedberg 	/* If this was the last command in a request the complete
53469238f36aSJohan Hedberg 	 * callback would be found in hdev->sent_cmd instead of the
53479238f36aSJohan Hedberg 	 * command queue (hdev->cmd_q).
53489238f36aSJohan Hedberg 	 */
53499238f36aSJohan Hedberg 	if (hdev->sent_cmd) {
53509238f36aSJohan Hedberg 		req_complete = bt_cb(hdev->sent_cmd)->req.complete;
535153e21fbcSJohan Hedberg 
535253e21fbcSJohan Hedberg 		if (req_complete) {
535353e21fbcSJohan Hedberg 			/* We must set the complete callback to NULL to
535453e21fbcSJohan Hedberg 			 * avoid calling the callback more than once if
535553e21fbcSJohan Hedberg 			 * this function gets called again.
535653e21fbcSJohan Hedberg 			 */
535753e21fbcSJohan Hedberg 			bt_cb(hdev->sent_cmd)->req.complete = NULL;
535853e21fbcSJohan Hedberg 
53599238f36aSJohan Hedberg 			goto call_complete;
53609238f36aSJohan Hedberg 		}
536153e21fbcSJohan Hedberg 	}
53629238f36aSJohan Hedberg 
53639238f36aSJohan Hedberg 	/* Remove all pending commands belonging to this request */
53649238f36aSJohan Hedberg 	spin_lock_irqsave(&hdev->cmd_q.lock, flags);
53659238f36aSJohan Hedberg 	while ((skb = __skb_dequeue(&hdev->cmd_q))) {
53669238f36aSJohan Hedberg 		if (bt_cb(skb)->req.start) {
53679238f36aSJohan Hedberg 			__skb_queue_head(&hdev->cmd_q, skb);
53689238f36aSJohan Hedberg 			break;
53699238f36aSJohan Hedberg 		}
53709238f36aSJohan Hedberg 
53719238f36aSJohan Hedberg 		req_complete = bt_cb(skb)->req.complete;
53729238f36aSJohan Hedberg 		kfree_skb(skb);
53739238f36aSJohan Hedberg 	}
53749238f36aSJohan Hedberg 	spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
53759238f36aSJohan Hedberg 
53769238f36aSJohan Hedberg call_complete:
53779238f36aSJohan Hedberg 	if (req_complete)
53789238f36aSJohan Hedberg 		req_complete(hdev, status);
53799238f36aSJohan Hedberg }
53809238f36aSJohan Hedberg 
5381b78752ccSMarcel Holtmann static void hci_rx_work(struct work_struct *work)
53821da177e4SLinus Torvalds {
5383b78752ccSMarcel Holtmann 	struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
53841da177e4SLinus Torvalds 	struct sk_buff *skb;
53851da177e4SLinus Torvalds 
53861da177e4SLinus Torvalds 	BT_DBG("%s", hdev->name);
53871da177e4SLinus Torvalds 
53881da177e4SLinus Torvalds 	while ((skb = skb_dequeue(&hdev->rx_q))) {
5389cd82e61cSMarcel Holtmann 		/* Send copy to monitor */
5390cd82e61cSMarcel Holtmann 		hci_send_to_monitor(hdev, skb);
5391cd82e61cSMarcel Holtmann 
53921da177e4SLinus Torvalds 		if (atomic_read(&hdev->promisc)) {
53931da177e4SLinus Torvalds 			/* Send copy to the sockets */
5394470fe1b5SMarcel Holtmann 			hci_send_to_sock(hdev, skb);
53951da177e4SLinus Torvalds 		}
53961da177e4SLinus Torvalds 
5397fee746b0SMarcel Holtmann 		if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
53981da177e4SLinus Torvalds 			kfree_skb(skb);
53991da177e4SLinus Torvalds 			continue;
54001da177e4SLinus Torvalds 		}
54011da177e4SLinus Torvalds 
54021da177e4SLinus Torvalds 		if (test_bit(HCI_INIT, &hdev->flags)) {
54031da177e4SLinus Torvalds 			/* Don't process data packets in this states. */
54040d48d939SMarcel Holtmann 			switch (bt_cb(skb)->pkt_type) {
54051da177e4SLinus Torvalds 			case HCI_ACLDATA_PKT:
54061da177e4SLinus Torvalds 			case HCI_SCODATA_PKT:
54071da177e4SLinus Torvalds 				kfree_skb(skb);
54081da177e4SLinus Torvalds 				continue;
54093ff50b79SStephen Hemminger 			}
54101da177e4SLinus Torvalds 		}
54111da177e4SLinus Torvalds 
54121da177e4SLinus Torvalds 		/* Process frame */
54130d48d939SMarcel Holtmann 		switch (bt_cb(skb)->pkt_type) {
54141da177e4SLinus Torvalds 		case HCI_EVENT_PKT:
5415b78752ccSMarcel Holtmann 			BT_DBG("%s Event packet", hdev->name);
54161da177e4SLinus Torvalds 			hci_event_packet(hdev, skb);
54171da177e4SLinus Torvalds 			break;
54181da177e4SLinus Torvalds 
54191da177e4SLinus Torvalds 		case HCI_ACLDATA_PKT:
54201da177e4SLinus Torvalds 			BT_DBG("%s ACL data packet", hdev->name);
54211da177e4SLinus Torvalds 			hci_acldata_packet(hdev, skb);
54221da177e4SLinus Torvalds 			break;
54231da177e4SLinus Torvalds 
54241da177e4SLinus Torvalds 		case HCI_SCODATA_PKT:
54251da177e4SLinus Torvalds 			BT_DBG("%s SCO data packet", hdev->name);
54261da177e4SLinus Torvalds 			hci_scodata_packet(hdev, skb);
54271da177e4SLinus Torvalds 			break;
54281da177e4SLinus Torvalds 
54291da177e4SLinus Torvalds 		default:
54301da177e4SLinus Torvalds 			kfree_skb(skb);
54311da177e4SLinus Torvalds 			break;
54321da177e4SLinus Torvalds 		}
54331da177e4SLinus Torvalds 	}
54341da177e4SLinus Torvalds }
54351da177e4SLinus Torvalds 
5436c347b765SGustavo F. Padovan static void hci_cmd_work(struct work_struct *work)
54371da177e4SLinus Torvalds {
5438c347b765SGustavo F. Padovan 	struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
54391da177e4SLinus Torvalds 	struct sk_buff *skb;
54401da177e4SLinus Torvalds 
54412104786bSAndrei Emeltchenko 	BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
54422104786bSAndrei Emeltchenko 	       atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
54431da177e4SLinus Torvalds 
54441da177e4SLinus Torvalds 	/* Send queued commands */
54455a08ecceSAndrei Emeltchenko 	if (atomic_read(&hdev->cmd_cnt)) {
54465a08ecceSAndrei Emeltchenko 		skb = skb_dequeue(&hdev->cmd_q);
54475a08ecceSAndrei Emeltchenko 		if (!skb)
54485a08ecceSAndrei Emeltchenko 			return;
54495a08ecceSAndrei Emeltchenko 
54501da177e4SLinus Torvalds 		kfree_skb(hdev->sent_cmd);
54511da177e4SLinus Torvalds 
5452a675d7f1SMarcel Holtmann 		hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
545370f23020SAndrei Emeltchenko 		if (hdev->sent_cmd) {
54541da177e4SLinus Torvalds 			atomic_dec(&hdev->cmd_cnt);
545557d17d70SMarcel Holtmann 			hci_send_frame(hdev, skb);
54567bdb8a5cSSzymon Janc 			if (test_bit(HCI_RESET, &hdev->flags))
545765cc2b49SMarcel Holtmann 				cancel_delayed_work(&hdev->cmd_timer);
54587bdb8a5cSSzymon Janc 			else
545965cc2b49SMarcel Holtmann 				schedule_delayed_work(&hdev->cmd_timer,
546065cc2b49SMarcel Holtmann 						      HCI_CMD_TIMEOUT);
54611da177e4SLinus Torvalds 		} else {
54621da177e4SLinus Torvalds 			skb_queue_head(&hdev->cmd_q, skb);
5463c347b765SGustavo F. Padovan 			queue_work(hdev->workqueue, &hdev->cmd_work);
54641da177e4SLinus Torvalds 		}
54651da177e4SLinus Torvalds 	}
54661da177e4SLinus Torvalds }
5467b1efcc28SAndre Guedes 
5468b1efcc28SAndre Guedes void hci_req_add_le_scan_disable(struct hci_request *req)
5469b1efcc28SAndre Guedes {
5470b1efcc28SAndre Guedes 	struct hci_cp_le_set_scan_enable cp;
5471b1efcc28SAndre Guedes 
5472b1efcc28SAndre Guedes 	memset(&cp, 0, sizeof(cp));
5473b1efcc28SAndre Guedes 	cp.enable = LE_SCAN_DISABLE;
5474b1efcc28SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
5475b1efcc28SAndre Guedes }
5476a4790dbdSAndre Guedes 
54778540f6c0SMarcel Holtmann static void add_to_white_list(struct hci_request *req,
54788540f6c0SMarcel Holtmann 			      struct hci_conn_params *params)
54798540f6c0SMarcel Holtmann {
54808540f6c0SMarcel Holtmann 	struct hci_cp_le_add_to_white_list cp;
54818540f6c0SMarcel Holtmann 
54828540f6c0SMarcel Holtmann 	cp.bdaddr_type = params->addr_type;
54838540f6c0SMarcel Holtmann 	bacpy(&cp.bdaddr, &params->addr);
54848540f6c0SMarcel Holtmann 
54858540f6c0SMarcel Holtmann 	hci_req_add(req, HCI_OP_LE_ADD_TO_WHITE_LIST, sizeof(cp), &cp);
54868540f6c0SMarcel Holtmann }
54878540f6c0SMarcel Holtmann 
54888540f6c0SMarcel Holtmann static u8 update_white_list(struct hci_request *req)
54898540f6c0SMarcel Holtmann {
54908540f6c0SMarcel Holtmann 	struct hci_dev *hdev = req->hdev;
54918540f6c0SMarcel Holtmann 	struct hci_conn_params *params;
54928540f6c0SMarcel Holtmann 	struct bdaddr_list *b;
54938540f6c0SMarcel Holtmann 	uint8_t white_list_entries = 0;
54948540f6c0SMarcel Holtmann 
54958540f6c0SMarcel Holtmann 	/* Go through the current white list programmed into the
54968540f6c0SMarcel Holtmann 	 * controller one by one and check if that address is still
54978540f6c0SMarcel Holtmann 	 * in the list of pending connections or list of devices to
54988540f6c0SMarcel Holtmann 	 * report. If not present in either list, then queue the
54998540f6c0SMarcel Holtmann 	 * command to remove it from the controller.
55008540f6c0SMarcel Holtmann 	 */
55018540f6c0SMarcel Holtmann 	list_for_each_entry(b, &hdev->le_white_list, list) {
55028540f6c0SMarcel Holtmann 		struct hci_cp_le_del_from_white_list cp;
55038540f6c0SMarcel Holtmann 
55048540f6c0SMarcel Holtmann 		if (hci_pend_le_action_lookup(&hdev->pend_le_conns,
55058540f6c0SMarcel Holtmann 					      &b->bdaddr, b->bdaddr_type) ||
55068540f6c0SMarcel Holtmann 		    hci_pend_le_action_lookup(&hdev->pend_le_reports,
55078540f6c0SMarcel Holtmann 					      &b->bdaddr, b->bdaddr_type)) {
55088540f6c0SMarcel Holtmann 			white_list_entries++;
55098540f6c0SMarcel Holtmann 			continue;
55108540f6c0SMarcel Holtmann 		}
55118540f6c0SMarcel Holtmann 
55128540f6c0SMarcel Holtmann 		cp.bdaddr_type = b->bdaddr_type;
55138540f6c0SMarcel Holtmann 		bacpy(&cp.bdaddr, &b->bdaddr);
55148540f6c0SMarcel Holtmann 
55158540f6c0SMarcel Holtmann 		hci_req_add(req, HCI_OP_LE_DEL_FROM_WHITE_LIST,
55168540f6c0SMarcel Holtmann 			    sizeof(cp), &cp);
55178540f6c0SMarcel Holtmann 	}
55188540f6c0SMarcel Holtmann 
55198540f6c0SMarcel Holtmann 	/* Since all no longer valid white list entries have been
55208540f6c0SMarcel Holtmann 	 * removed, walk through the list of pending connections
55218540f6c0SMarcel Holtmann 	 * and ensure that any new device gets programmed into
55228540f6c0SMarcel Holtmann 	 * the controller.
55238540f6c0SMarcel Holtmann 	 *
55248540f6c0SMarcel Holtmann 	 * If the list of the devices is larger than the list of
55258540f6c0SMarcel Holtmann 	 * available white list entries in the controller, then
55268540f6c0SMarcel Holtmann 	 * just abort and return filer policy value to not use the
55278540f6c0SMarcel Holtmann 	 * white list.
55288540f6c0SMarcel Holtmann 	 */
55298540f6c0SMarcel Holtmann 	list_for_each_entry(params, &hdev->pend_le_conns, action) {
55308540f6c0SMarcel Holtmann 		if (hci_bdaddr_list_lookup(&hdev->le_white_list,
55318540f6c0SMarcel Holtmann 					   &params->addr, params->addr_type))
55328540f6c0SMarcel Holtmann 			continue;
55338540f6c0SMarcel Holtmann 
55348540f6c0SMarcel Holtmann 		if (white_list_entries >= hdev->le_white_list_size) {
55358540f6c0SMarcel Holtmann 			/* Select filter policy to accept all advertising */
55368540f6c0SMarcel Holtmann 			return 0x00;
55378540f6c0SMarcel Holtmann 		}
55388540f6c0SMarcel Holtmann 
553966d8e837SMarcel Holtmann 		if (hci_find_irk_by_addr(hdev, &params->addr,
554066d8e837SMarcel Holtmann 					 params->addr_type)) {
554166d8e837SMarcel Holtmann 			/* White list can not be used with RPAs */
554266d8e837SMarcel Holtmann 			return 0x00;
554366d8e837SMarcel Holtmann 		}
554466d8e837SMarcel Holtmann 
55458540f6c0SMarcel Holtmann 		white_list_entries++;
55468540f6c0SMarcel Holtmann 		add_to_white_list(req, params);
55478540f6c0SMarcel Holtmann 	}
55488540f6c0SMarcel Holtmann 
55498540f6c0SMarcel Holtmann 	/* After adding all new pending connections, walk through
55508540f6c0SMarcel Holtmann 	 * the list of pending reports and also add these to the
55518540f6c0SMarcel Holtmann 	 * white list if there is still space.
55528540f6c0SMarcel Holtmann 	 */
55538540f6c0SMarcel Holtmann 	list_for_each_entry(params, &hdev->pend_le_reports, action) {
55548540f6c0SMarcel Holtmann 		if (hci_bdaddr_list_lookup(&hdev->le_white_list,
55558540f6c0SMarcel Holtmann 					   &params->addr, params->addr_type))
55568540f6c0SMarcel Holtmann 			continue;
55578540f6c0SMarcel Holtmann 
55588540f6c0SMarcel Holtmann 		if (white_list_entries >= hdev->le_white_list_size) {
55598540f6c0SMarcel Holtmann 			/* Select filter policy to accept all advertising */
55608540f6c0SMarcel Holtmann 			return 0x00;
55618540f6c0SMarcel Holtmann 		}
55628540f6c0SMarcel Holtmann 
556366d8e837SMarcel Holtmann 		if (hci_find_irk_by_addr(hdev, &params->addr,
556466d8e837SMarcel Holtmann 					 params->addr_type)) {
556566d8e837SMarcel Holtmann 			/* White list can not be used with RPAs */
556666d8e837SMarcel Holtmann 			return 0x00;
556766d8e837SMarcel Holtmann 		}
556866d8e837SMarcel Holtmann 
55698540f6c0SMarcel Holtmann 		white_list_entries++;
55708540f6c0SMarcel Holtmann 		add_to_white_list(req, params);
55718540f6c0SMarcel Holtmann 	}
55728540f6c0SMarcel Holtmann 
55738540f6c0SMarcel Holtmann 	/* Select filter policy to use white list */
55748540f6c0SMarcel Holtmann 	return 0x01;
55758540f6c0SMarcel Holtmann }
55768540f6c0SMarcel Holtmann 
55778ef30fd3SAndre Guedes void hci_req_add_le_passive_scan(struct hci_request *req)
55788ef30fd3SAndre Guedes {
55798ef30fd3SAndre Guedes 	struct hci_cp_le_set_scan_param param_cp;
55808ef30fd3SAndre Guedes 	struct hci_cp_le_set_scan_enable enable_cp;
55818ef30fd3SAndre Guedes 	struct hci_dev *hdev = req->hdev;
55828ef30fd3SAndre Guedes 	u8 own_addr_type;
55838540f6c0SMarcel Holtmann 	u8 filter_policy;
55848ef30fd3SAndre Guedes 
55856ab535a7SMarcel Holtmann 	/* Set require_privacy to false since no SCAN_REQ are send
55866ab535a7SMarcel Holtmann 	 * during passive scanning. Not using an unresolvable address
55876ab535a7SMarcel Holtmann 	 * here is important so that peer devices using direct
55886ab535a7SMarcel Holtmann 	 * advertising with our address will be correctly reported
55896ab535a7SMarcel Holtmann 	 * by the controller.
55908ef30fd3SAndre Guedes 	 */
55916ab535a7SMarcel Holtmann 	if (hci_update_random_address(req, false, &own_addr_type))
55928ef30fd3SAndre Guedes 		return;
55938ef30fd3SAndre Guedes 
55948540f6c0SMarcel Holtmann 	/* Adding or removing entries from the white list must
55958540f6c0SMarcel Holtmann 	 * happen before enabling scanning. The controller does
55968540f6c0SMarcel Holtmann 	 * not allow white list modification while scanning.
55978540f6c0SMarcel Holtmann 	 */
55988540f6c0SMarcel Holtmann 	filter_policy = update_white_list(req);
55998540f6c0SMarcel Holtmann 
56008ef30fd3SAndre Guedes 	memset(&param_cp, 0, sizeof(param_cp));
56018ef30fd3SAndre Guedes 	param_cp.type = LE_SCAN_PASSIVE;
56028ef30fd3SAndre Guedes 	param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
56038ef30fd3SAndre Guedes 	param_cp.window = cpu_to_le16(hdev->le_scan_window);
56048ef30fd3SAndre Guedes 	param_cp.own_address_type = own_addr_type;
56058540f6c0SMarcel Holtmann 	param_cp.filter_policy = filter_policy;
56068ef30fd3SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
56078ef30fd3SAndre Guedes 		    &param_cp);
56088ef30fd3SAndre Guedes 
56098ef30fd3SAndre Guedes 	memset(&enable_cp, 0, sizeof(enable_cp));
56108ef30fd3SAndre Guedes 	enable_cp.enable = LE_SCAN_ENABLE;
56114340a124SAndre Guedes 	enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
56128ef30fd3SAndre Guedes 	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
56138ef30fd3SAndre Guedes 		    &enable_cp);
56148ef30fd3SAndre Guedes }
56158ef30fd3SAndre Guedes 
5616a4790dbdSAndre Guedes static void update_background_scan_complete(struct hci_dev *hdev, u8 status)
5617a4790dbdSAndre Guedes {
5618a4790dbdSAndre Guedes 	if (status)
5619a4790dbdSAndre Guedes 		BT_DBG("HCI request failed to update background scanning: "
5620a4790dbdSAndre Guedes 		       "status 0x%2.2x", status);
5621a4790dbdSAndre Guedes }
5622a4790dbdSAndre Guedes 
5623a4790dbdSAndre Guedes /* This function controls the background scanning based on hdev->pend_le_conns
5624a4790dbdSAndre Guedes  * list. If there are pending LE connection we start the background scanning,
5625a4790dbdSAndre Guedes  * otherwise we stop it.
5626a4790dbdSAndre Guedes  *
5627a4790dbdSAndre Guedes  * This function requires the caller holds hdev->lock.
5628a4790dbdSAndre Guedes  */
5629a4790dbdSAndre Guedes void hci_update_background_scan(struct hci_dev *hdev)
5630a4790dbdSAndre Guedes {
5631a4790dbdSAndre Guedes 	struct hci_request req;
5632a4790dbdSAndre Guedes 	struct hci_conn *conn;
5633a4790dbdSAndre Guedes 	int err;
5634a4790dbdSAndre Guedes 
5635c20c02d5SMarcel Holtmann 	if (!test_bit(HCI_UP, &hdev->flags) ||
5636c20c02d5SMarcel Holtmann 	    test_bit(HCI_INIT, &hdev->flags) ||
5637c20c02d5SMarcel Holtmann 	    test_bit(HCI_SETUP, &hdev->dev_flags) ||
5638d603b76bSMarcel Holtmann 	    test_bit(HCI_CONFIG, &hdev->dev_flags) ||
5639b8221770SMarcel Holtmann 	    test_bit(HCI_AUTO_OFF, &hdev->dev_flags) ||
5640c20c02d5SMarcel Holtmann 	    test_bit(HCI_UNREGISTER, &hdev->dev_flags))
56411c1697c0SMarcel Holtmann 		return;
56421c1697c0SMarcel Holtmann 
5643a70f4b5fSJohan Hedberg 	/* No point in doing scanning if LE support hasn't been enabled */
5644a70f4b5fSJohan Hedberg 	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
5645a70f4b5fSJohan Hedberg 		return;
5646a70f4b5fSJohan Hedberg 
5647ae23ada4SJohan Hedberg 	/* If discovery is active don't interfere with it */
5648ae23ada4SJohan Hedberg 	if (hdev->discovery.state != DISCOVERY_STOPPED)
5649ae23ada4SJohan Hedberg 		return;
5650ae23ada4SJohan Hedberg 
5651a4790dbdSAndre Guedes 	hci_req_init(&req, hdev);
5652a4790dbdSAndre Guedes 
5653d1d588c1SJohan Hedberg 	if (list_empty(&hdev->pend_le_conns) &&
565466f8455aSJohan Hedberg 	    list_empty(&hdev->pend_le_reports)) {
56550d2bf134SJohan Hedberg 		/* If there is no pending LE connections or devices
56560d2bf134SJohan Hedberg 		 * to be scanned for, we should stop the background
56570d2bf134SJohan Hedberg 		 * scanning.
5658a4790dbdSAndre Guedes 		 */
5659a4790dbdSAndre Guedes 
5660a4790dbdSAndre Guedes 		/* If controller is not scanning we are done. */
5661a4790dbdSAndre Guedes 		if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags))
5662a4790dbdSAndre Guedes 			return;
5663a4790dbdSAndre Guedes 
5664a4790dbdSAndre Guedes 		hci_req_add_le_scan_disable(&req);
5665a4790dbdSAndre Guedes 
5666a4790dbdSAndre Guedes 		BT_DBG("%s stopping background scanning", hdev->name);
5667a4790dbdSAndre Guedes 	} else {
5668a4790dbdSAndre Guedes 		/* If there is at least one pending LE connection, we should
5669a4790dbdSAndre Guedes 		 * keep the background scan running.
5670a4790dbdSAndre Guedes 		 */
5671a4790dbdSAndre Guedes 
5672a4790dbdSAndre Guedes 		/* If controller is connecting, we should not start scanning
5673a4790dbdSAndre Guedes 		 * since some controllers are not able to scan and connect at
5674a4790dbdSAndre Guedes 		 * the same time.
5675a4790dbdSAndre Guedes 		 */
5676a4790dbdSAndre Guedes 		conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
5677a4790dbdSAndre Guedes 		if (conn)
5678a4790dbdSAndre Guedes 			return;
5679a4790dbdSAndre Guedes 
56804340a124SAndre Guedes 		/* If controller is currently scanning, we stop it to ensure we
56814340a124SAndre Guedes 		 * don't miss any advertising (due to duplicates filter).
56824340a124SAndre Guedes 		 */
56834340a124SAndre Guedes 		if (test_bit(HCI_LE_SCAN, &hdev->dev_flags))
56844340a124SAndre Guedes 			hci_req_add_le_scan_disable(&req);
56854340a124SAndre Guedes 
56868ef30fd3SAndre Guedes 		hci_req_add_le_passive_scan(&req);
5687a4790dbdSAndre Guedes 
5688a4790dbdSAndre Guedes 		BT_DBG("%s starting background scanning", hdev->name);
5689a4790dbdSAndre Guedes 	}
5690a4790dbdSAndre Guedes 
5691a4790dbdSAndre Guedes 	err = hci_req_run(&req, update_background_scan_complete);
5692a4790dbdSAndre Guedes 	if (err)
5693a4790dbdSAndre Guedes 		BT_ERR("Failed to run HCI request: err %d", err);
5694a4790dbdSAndre Guedes }
5695432df05eSJohan Hedberg 
569622f433dcSJohan Hedberg static bool disconnected_whitelist_entries(struct hci_dev *hdev)
569722f433dcSJohan Hedberg {
569822f433dcSJohan Hedberg 	struct bdaddr_list *b;
569922f433dcSJohan Hedberg 
570022f433dcSJohan Hedberg 	list_for_each_entry(b, &hdev->whitelist, list) {
570122f433dcSJohan Hedberg 		struct hci_conn *conn;
570222f433dcSJohan Hedberg 
570322f433dcSJohan Hedberg 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &b->bdaddr);
570422f433dcSJohan Hedberg 		if (!conn)
570522f433dcSJohan Hedberg 			return true;
570622f433dcSJohan Hedberg 
570722f433dcSJohan Hedberg 		if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
570822f433dcSJohan Hedberg 			return true;
570922f433dcSJohan Hedberg 	}
571022f433dcSJohan Hedberg 
571122f433dcSJohan Hedberg 	return false;
571222f433dcSJohan Hedberg }
571322f433dcSJohan Hedberg 
5714432df05eSJohan Hedberg void hci_update_page_scan(struct hci_dev *hdev, struct hci_request *req)
5715432df05eSJohan Hedberg {
5716432df05eSJohan Hedberg 	u8 scan;
5717432df05eSJohan Hedberg 
5718432df05eSJohan Hedberg 	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
5719432df05eSJohan Hedberg 		return;
5720432df05eSJohan Hedberg 
5721432df05eSJohan Hedberg 	if (!hdev_is_powered(hdev))
5722432df05eSJohan Hedberg 		return;
5723432df05eSJohan Hedberg 
5724432df05eSJohan Hedberg 	if (mgmt_powering_down(hdev))
5725432df05eSJohan Hedberg 		return;
5726432df05eSJohan Hedberg 
5727432df05eSJohan Hedberg 	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags) ||
572822f433dcSJohan Hedberg 	    disconnected_whitelist_entries(hdev))
5729432df05eSJohan Hedberg 		scan = SCAN_PAGE;
5730432df05eSJohan Hedberg 	else
5731432df05eSJohan Hedberg 		scan = SCAN_DISABLED;
5732432df05eSJohan Hedberg 
5733432df05eSJohan Hedberg 	if (test_bit(HCI_PSCAN, &hdev->flags) == !!(scan & SCAN_PAGE))
5734432df05eSJohan Hedberg 		return;
5735432df05eSJohan Hedberg 
5736432df05eSJohan Hedberg 	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
5737432df05eSJohan Hedberg 		scan |= SCAN_INQUIRY;
5738432df05eSJohan Hedberg 
5739432df05eSJohan Hedberg 	if (req)
5740432df05eSJohan Hedberg 		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
5741432df05eSJohan Hedberg 	else
5742432df05eSJohan Hedberg 		hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
5743432df05eSJohan Hedberg }
5744